{"owner":"clidey","repo":"whodb","hasSkills":true,"totalSkillsCount":86,"totalTokensCount":41113,"categories":["anthropic-skill","codex-rule","claude-rule","project-spec","root-instruction","plugin-manifest","subagent-persona"],"hasMcp":false,"mcpConfig":null,"found":["cli/skills/schema-designer/SKILL.md","cli/skills/query-builder/SKILL.md","cli/external-plugin/whodb/skills/schema-designer/SKILL.md","cli/external-plugin/whodb/skills/whodb/SKILL.md","cli/skills/whodb/SKILL.md",".agents/skills/impeccable/SKILL.md","cli/external-plugin/openai-skills/whodb/SKILL.md",".codex/hooks.json","cli/external-plugin/whodb/skills/query-builder/SKILL.md","CLAUDE.md","DESIGN.md","AGENTS.md","cli/plugin.json",".agents/rules/ci-cd.md",".agents/rules/desktop.md",".agents/rules/e2e-tests.md",".agents/rules/go-backend.md",".agents/rules/graphql.md",".agents/rules/localization.md",".agents/rules/react-frontend.md","cli/agents/database-analyst.md","cli/agents/query-optimizer.md","cli/agents/report-generator.md",".agents/skills/impeccable/scripts/command-metadata.json",".agents/skills/impeccable/reference/adapt.md",".agents/skills/impeccable/reference/adapt.native.md",".agents/skills/impeccable/reference/android.md",".agents/skills/impeccable/reference/animate.md",".agents/skills/impeccable/reference/audit.md",".agents/skills/impeccable/reference/audit.native.md",".agents/skills/impeccable/reference/bolder.md",".agents/skills/impeccable/reference/clarify.md",".agents/skills/impeccable/reference/colorize.md",".agents/skills/impeccable/reference/craft.md",".agents/skills/impeccable/reference/craft-floor.md",".agents/skills/impeccable/reference/critique.md",".agents/skills/impeccable/reference/delight.md",".agents/skills/impeccable/reference/distill.md",".agents/skills/impeccable/reference/doctor.md",".agents/skills/impeccable/reference/document.md",".agents/skills/impeccable/reference/extract.md",".agents/skills/impeccable/reference/harden.md",".agents/skills/impeccable/reference/hooks.md",".agents/skills/impeccable/reference/init.md",".agents/skills/impeccable/reference/ios.md",".agents/skills/impeccable/reference/layout.md",".agents/skills/impeccable/reference/live.md",".agents/skills/impeccable/reference/live-setup.md",".agents/skills/impeccable/reference/new-work.md",".agents/skills/impeccable/reference/onboard.md",".agents/skills/impeccable/reference/operate.md",".agents/skills/impeccable/reference/optimize.md",".agents/skills/impeccable/reference/overdrive.md",".agents/skills/impeccable/reference/polish.md",".agents/skills/impeccable/reference/quieter.md",".agents/skills/impeccable/reference/routing.md",".agents/skills/impeccable/reference/shape.md",".agents/skills/impeccable/reference/typeset.md",".agents/skills/impeccable/reference/visualize.md",".agents/skills/impeccable/agents/openai.yaml","cli/external-plugin/whodb/.claude-plugin/plugin.json","cli/external-plugin/whodb/agents/database-analyst.md","cli/external-plugin/whodb/agents/query-optimizer.md","cli/external-plugin/whodb/agents/report-generator.md","cli/npm-package/packages/whodb-cli-win32-x64/package.json","cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli-win32-arm64/package.json","cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli-linux-x64/package.json","cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli-linux-arm64/package.json","cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli-linux-arm/package.json","cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli-darwin-x64/package.json","cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli-darwin-arm64/package.json","cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli/package.json","cli/npm-package/packages/whodb-cli/pnpm-lock.yaml","cli/npm-package/packages/whodb-cli/README.md",".agents/skills/impeccable/reference/degraded/asset-producer.md",".agents/skills/impeccable/reference/degraded/documenter.md",".agents/skills/impeccable/reference/degraded/finish-reviewer.md",".agents/skills/impeccable/reference/degraded/manual-edit-applier.md","cli/external-plugin/openai-skills/whodb/agents/openai.yaml"],"skills":{"cli/skills/schema-designer/SKILL.md":"---\nname: schema-designer\ndescription: Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.\n---\n\n# Schema Designer\n\nHelp users design database schemas, create tables, and model data relationships.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks:\n- \"Create a table for storing orders\"\n- \"Design a schema for a blog\"\n- \"Add a column to track user preferences\"\n- \"How should I model this relationship?\"\n\n## Workflow\n\n### 1. Understand Requirements\nAsk clarifying questions:\n- What data needs to be stored?\n- What are the relationships between entities?\n- What queries will be common?\n- What's the expected data volume?\n\n### 2. Check Existing Schema\n```\nwhodb_tables(include_columns=true) → See all tables and their columns in one call\n```\n\n### 3. Design the Schema\nFollow database design principles:\n- Normalize to reduce redundancy\n- Use appropriate data types\n- Define primary keys\n- Establish foreign key relationships\n- Add indexes for common queries\n\n### 4. Generate DDL\nProvide CREATE TABLE statements with explanations.\n\n## Data Type Guidelines\n\n### Identifiers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Auto-increment ID | `SERIAL` / `BIGSERIAL` | `INT AUTO_INCREMENT` | `INTEGER PRIMARY KEY` |\n| UUID | `UUID` | `CHAR(36)` | `TEXT` |\n\n### Text\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Short text (<255) | `VARCHAR(n)` | `VARCHAR(n)` | `TEXT` |\n| Long text | `TEXT` | `TEXT` | `TEXT` |\n| Fixed length | `CHAR(n)` | `CHAR(n)` | `TEXT` |\n\n### Numbers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Integer | `INTEGER` | `INT` | `INTEGER` |\n| Big integer | `BIGINT` | `BIGINT` | `INTEGER` |\n| Decimal (money) | `NUMERIC(10,2)` | `DECIMAL(10,2)` | `REAL` |\n| Float | `REAL` | `FLOAT` | `REAL` |\n\n### Dates\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Date only | `DATE` | `DATE` | `TEXT` |\n| Timestamp | `TIMESTAMP` | `DATETIME` | `TEXT` |\n| With timezone | `TIMESTAMPTZ` | `TIMESTAMP` | `TEXT` |\n\n### Boolean\n| PostgreSQL | MySQL | SQLite |\n|------------|-------|--------|\n| `BOOLEAN` | `TINYINT(1)` | `INTEGER` |\n\n## Common Patterns\n\n### Users Table\n```sql\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    email VARCHAR(255) NOT NULL UNIQUE,\n    password_hash VARCHAR(255) NOT NULL,\n    name VARCHAR(100),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_users_email ON users(email);\n```\n\n### One-to-Many (Orders → Order Items)\n```sql\nCREATE TABLE orders (\n    id SERIAL PRIMARY KEY,\n    user_id INTEGER NOT NULL REFERENCES users(id),\n    status VARCHAR(20) DEFAULT 'pending',\n    total NUMERIC(10,2),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE order_items (\n    id SERIAL PRIMARY KEY,\n    order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,\n    product_id INTEGER NOT NULL REFERENCES products(id),\n    quantity INTEGER NOT NULL DEFAULT 1,\n    unit_price NUMERIC(10,2) NOT NULL\n);\n\nCREATE INDEX idx_order_items_order ON order_items(order_id);\n```\n\n### Many-to-Many (Users ↔ Roles)\n```sql\nCREATE TABLE roles (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(50) NOT NULL UNIQUE\n);\n\nCREATE TABLE user_roles (\n    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n    role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,\n    PRIMARY KEY (user_id, role_id)\n);\n```\n\n### Soft Delete Pattern\n```sql\nCREATE TABLE posts (\n    id SERIAL PRIMARY KEY,\n    title VARCHAR(255) NOT NULL,\n    content TEXT,\n    deleted_at TIMESTAMP NULL,  -- NULL = not deleted\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Query active posts\nSELECT * FROM posts WHERE deleted_at IS NULL;\n```\n\n### Audit Trail Pattern\n```sql\nCREATE TABLE audit_log (\n    id SERIAL PRIMARY KEY,\n    table_name VARCHAR(50) NOT NULL,\n    record_id INTEGER NOT NULL,\n    action VARCHAR(10) NOT NULL,  -- INSERT, UPDATE, DELETE\n    old_values JSONB,\n    new_values JSONB,\n    user_id INTEGER REFERENCES users(id),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_audit_table_record ON audit_log(table_name, record_id);\n```\n\n## Best Practices\n\n1. **Always define PRIMARY KEY** - Every table needs one\n2. **Use foreign keys** - Enforce referential integrity\n3. **Add NOT NULL** - Unless the column is truly optional\n4. **Create indexes** - On foreign keys and frequently queried columns\n5. **Use appropriate types** - Don't store numbers as strings\n6. **Add timestamps** - `created_at` and `updated_at` are almost always useful\n7. **Name consistently** - `user_id` not `userId` or `UserID`\n8. **Avoid reserved words** - Don't name columns `order`, `user`, `group`\n\n## Migration Safety\n\nWhen modifying existing tables:\n\n```sql\n-- Safe: Adding nullable column\nALTER TABLE users ADD COLUMN phone VARCHAR(20);\n\n-- Safe: Adding column with default\nALTER TABLE users ADD COLUMN active BOOLEAN DEFAULT true;\n\n-- Caution: Adding NOT NULL (requires default or backfill)\nALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';\n\n-- Caution: Dropping column (data loss)\nALTER TABLE users DROP COLUMN old_column;\n\n-- Caution: Changing type (may fail on existing data)\nALTER TABLE users ALTER COLUMN age TYPE INTEGER;\n```\n","cli/skills/query-builder/SKILL.md":"---\nname: query-builder\ndescription: Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\".\n---\n\n# Query Builder\n\nConvert natural language questions into SQL queries using the database schema.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks questions like:\n- \"Show me all users who signed up last month\"\n- \"Find orders greater than $100\"\n- \"Which products have low inventory?\"\n- \"Get the top 10 customers by total spend\"\n\n## Workflow\n\n### 1. Understand the Schema\nBefore generating SQL, get tables and columns in one call:\n\n```\nwhodb_tables(connection=\"...\", include_columns=true) → Get all tables AND their column names, types, and keys\n```\n\n### 2. Identify Intent\nParse the natural language request:\n- **Subject**: What entity? (users, orders, products)\n- **Filter**: What conditions? (last month, > $100, active)\n- **Aggregation**: Count, sum, average, max, min?\n- **Grouping**: By what dimension?\n- **Ordering**: Sort by what? Ascending/descending?\n- **Limit**: How many results?\n\n### 3. Map to Schema\n- Match entities to table names\n- Match attributes to column names\n- Identify foreign key joins needed\n\n### 4. Generate SQL\nBuild the query following SQL best practices:\n\n```sql\nSELECT columns\nFROM table\n[JOIN other_table ON condition]\nWHERE filters\n[GROUP BY columns]\n[HAVING aggregate_condition]\nORDER BY column [ASC|DESC]\nLIMIT n;\n```\n\n### 5. Execute and Present\n```\nwhodb_query(query=\"generated SQL\")\n```\n\n## Translation Patterns\n\n| Natural Language | SQL Pattern |\n|------------------|-------------|\n| \"last week/month/year\" | `WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK)` |\n| \"more than X\" / \"greater than X\" | `WHERE col > X` |\n| \"top N\" | `ORDER BY col DESC LIMIT N` |\n| \"how many\" | `SELECT COUNT(*)` |\n| \"total\" / \"sum of\" | `SELECT SUM(col)` |\n| \"average\" | `SELECT AVG(col)` |\n| \"for each\" / \"by\" | `GROUP BY col` |\n| \"between X and Y\" | `WHERE col BETWEEN X AND Y` |\n| \"contains\" / \"like\" | `WHERE col LIKE '%term%'` |\n| \"starts with\" | `WHERE col LIKE 'term%'` |\n| \"is empty\" / \"is null\" | `WHERE col IS NULL` |\n| \"is not empty\" | `WHERE col IS NOT NULL` |\n\n## Date Handling by Database\n\n### PostgreSQL\n```sql\nWHERE created_at >= NOW() - INTERVAL '7 days'\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\n```\n\n### MySQL\n```sql\nWHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)\nWHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')\n```\n\n### SQLite\n```sql\nWHERE created_at >= DATE('now', '-7 days')\nWHERE created_at >= DATE('now', 'start of month')\n```\n\n## Examples\n\n### \"Show me users who signed up this month\"\n```sql\nSELECT * FROM users\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\nORDER BY created_at DESC;\n```\n\n### \"Find the top 5 products by sales\"\n```sql\nSELECT p.name, SUM(oi.quantity) as total_sold\nFROM products p\nJOIN order_items oi ON p.id = oi.product_id\nGROUP BY p.id, p.name\nORDER BY total_sold DESC\nLIMIT 5;\n```\n\n### \"How many orders per customer?\"\n```sql\nSELECT customer_id, COUNT(*) as order_count\nFROM orders\nGROUP BY customer_id\nORDER BY order_count DESC;\n```\n\n## Safety Rules\n\n- Always use LIMIT for exploratory queries (default: 100)\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Warn if query might return large result sets\n- Use table aliases for readability in JOINs\n","cli/external-plugin/whodb/skills/schema-designer/SKILL.md":"---\nname: schema-designer\ndescription: Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.\n---\n\n# Schema Designer\n\nHelp users design database schemas, create tables, and model data relationships.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks:\n- \"Create a table for storing orders\"\n- \"Design a schema for a blog\"\n- \"Add a column to track user preferences\"\n- \"How should I model this relationship?\"\n\n## Workflow\n\n### 1. Understand Requirements\nAsk clarifying questions:\n- What data needs to be stored?\n- What are the relationships between entities?\n- What queries will be common?\n- What's the expected data volume?\n\n### 2. Check Existing Schema\n```\nwhodb_tables() → See what already exists\nwhodb_columns(table=\"related_table\") → Understand existing structure\n```\n\n### 3. Design the Schema\nFollow database design principles:\n- Normalize to reduce redundancy\n- Use appropriate data types\n- Define primary keys\n- Establish foreign key relationships\n- Add indexes for common queries\n\n### 4. Generate DDL\nProvide CREATE TABLE statements with explanations.\n\n## Data Type Guidelines\n\n### Identifiers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Auto-increment ID | `SERIAL` / `BIGSERIAL` | `INT AUTO_INCREMENT` | `INTEGER PRIMARY KEY` |\n| UUID | `UUID` | `CHAR(36)` | `TEXT` |\n\n### Text\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Short text (<255) | `VARCHAR(n)` | `VARCHAR(n)` | `TEXT` |\n| Long text | `TEXT` | `TEXT` | `TEXT` |\n| Fixed length | `CHAR(n)` | `CHAR(n)` | `TEXT` |\n\n### Numbers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Integer | `INTEGER` | `INT` | `INTEGER` |\n| Big integer | `BIGINT` | `BIGINT` | `INTEGER` |\n| Decimal (money) | `NUMERIC(10,2)` | `DECIMAL(10,2)` | `REAL` |\n| Float | `REAL` | `FLOAT` | `REAL` |\n\n### Dates\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Date only | `DATE` | `DATE` | `TEXT` |\n| Timestamp | `TIMESTAMP` | `DATETIME` | `TEXT` |\n| With timezone | `TIMESTAMPTZ` | `TIMESTAMP` | `TEXT` |\n\n### Boolean\n| PostgreSQL | MySQL | SQLite |\n|------------|-------|--------|\n| `BOOLEAN` | `TINYINT(1)` | `INTEGER` |\n\n## Common Patterns\n\n### Users Table\n```sql\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    email VARCHAR(255) NOT NULL UNIQUE,\n    password_hash VARCHAR(255) NOT NULL,\n    name VARCHAR(100),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_users_email ON users(email);\n```\n\n### One-to-Many (Orders → Order Items)\n```sql\nCREATE TABLE orders (\n    id SERIAL PRIMARY KEY,\n    user_id INTEGER NOT NULL REFERENCES users(id),\n    status VARCHAR(20) DEFAULT 'pending',\n    total NUMERIC(10,2),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE order_items (\n    id SERIAL PRIMARY KEY,\n    order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,\n    product_id INTEGER NOT NULL REFERENCES products(id),\n    quantity INTEGER NOT NULL DEFAULT 1,\n    unit_price NUMERIC(10,2) NOT NULL\n);\n\nCREATE INDEX idx_order_items_order ON order_items(order_id);\n```\n\n### Many-to-Many (Users ↔ Roles)\n```sql\nCREATE TABLE roles (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(50) NOT NULL UNIQUE\n);\n\nCREATE TABLE user_roles (\n    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n    role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,\n    PRIMARY KEY (user_id, role_id)\n);\n```\n\n### Soft Delete Pattern\n```sql\nCREATE TABLE posts (\n    id SERIAL PRIMARY KEY,\n    title VARCHAR(255) NOT NULL,\n    content TEXT,\n    deleted_at TIMESTAMP NULL,  -- NULL = not deleted\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Query active posts\nSELECT * FROM posts WHERE deleted_at IS NULL;\n```\n\n### Audit Trail Pattern\n```sql\nCREATE TABLE audit_log (\n    id SERIAL PRIMARY KEY,\n    table_name VARCHAR(50) NOT NULL,\n    record_id INTEGER NOT NULL,\n    action VARCHAR(10) NOT NULL,  -- INSERT, UPDATE, DELETE\n    old_values JSONB,\n    new_values JSONB,\n    user_id INTEGER REFERENCES users(id),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_audit_table_record ON audit_log(table_name, record_id);\n```\n\n## Best Practices\n\n1. **Always define PRIMARY KEY** - Every table needs one\n2. **Use foreign keys** - Enforce referential integrity\n3. **Add NOT NULL** - Unless the column is truly optional\n4. **Create indexes** - On foreign keys and frequently queried columns\n5. **Use appropriate types** - Don't store numbers as strings\n6. **Add timestamps** - `created_at` and `updated_at` are almost always useful\n7. **Name consistently** - `user_id` not `userId` or `UserID`\n8. **Avoid reserved words** - Don't name columns `order`, `user`, `group`\n\n## Migration Safety\n\nWhen modifying existing tables:\n\n```sql\n-- Safe: Adding nullable column\nALTER TABLE users ADD COLUMN phone VARCHAR(20);\n\n-- Safe: Adding column with default\nALTER TABLE users ADD COLUMN active BOOLEAN DEFAULT true;\n\n-- Caution: Adding NOT NULL (requires default or backfill)\nALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';\n\n-- Caution: Dropping column (data loss)\nALTER TABLE users DROP COLUMN old_column;\n\n-- Caution: Changing type (may fail on existing data)\nALTER TABLE users ALTER COLUMN age TYPE INTEGER;\n```\n","cli/external-plugin/whodb/skills/whodb/SKILL.md":"---\nname: whodb\ndescription: Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured.\n---\n\n# WhoDB Database Assistant\n\nYou have access to WhoDB for database operations. Use these tools and commands to help users with database tasks.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n### Database tools\n\nWhen database-only MCP is configured, use these tools directly:\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: List of connection names with type and source (env/saved).\n```\n\n### whodb_query\nExecute SQL queries against a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- query: SQL query to execute\n\nExample: whodb_query(connection=\"mydb\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### whodb_schemas\nList all schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n\nExample: whodb_schemas(connection=\"mydb\")\n```\n\n### whodb_tables\nList all tables in a schema.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- schema: Schema name (optional, uses default if not specified)\n\nExample: whodb_tables(connection=\"mydb\", schema=\"public\")\n```\n\n### whodb_columns\nDescribe columns in a table.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- table: Table name (required)\n- schema: Schema name (optional)\n\nExample: whodb_columns(connection=\"mydb\", table=\"users\")\n```\n\n## CLI Commands (Fallback)\n\nIf MCP tools are unavailable, use the CLI directly via Bash:\n\n### Query Execution\n```bash\nwhodb query \"SELECT * FROM users LIMIT 10\" --connection mydb --format json\n```\n\n### Schema Discovery\n```bash\n# List schemas\nwhodb schemas --connection mydb --format json\n\n# List tables\nwhodb tables --connection mydb --schema public --format json\n\n# Describe columns\nwhodb columns --connection mydb --table users --format json\n```\n\n### Connection Management\n```bash\n# List connections\nwhodb connections list --format json\n\n# Test connection\nwhodb connections test mydb\n\n# Add new connection (interactive)\nwhodb connections add --name mydb --type Postgres --host localhost --database mydb\n```\n\n### Data Export\n```bash\n# Export to CSV\nwhodb export --connection mydb --table users --output users.csv\n\n# Export query results\nwhodb export --connection mydb --query \"SELECT * FROM orders\" --output orders.xlsx\n```\n\n## Workflow Examples\n\n### Explore a New Database\n1. List connections: `whodb_connections`\n2. List schemas: `whodb_schemas(connection=\"name\")`\n3. List tables: `whodb_tables(connection=\"name\", schema=\"public\")`\n4. Describe table: `whodb_columns(connection=\"name\", table=\"users\")`\n5. Sample data: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\n### Answer Data Questions\n1. Understand the schema first - check table structure\n2. Write targeted queries with appropriate filters\n3. Always use LIMIT for exploratory queries\n4. Present results in a clear, readable format\n\n## Best Practices\n\n- **Always explore schema first** before writing queries\n- **Use LIMIT** for exploratory queries to avoid overwhelming output\n- **Prefer specific columns** over SELECT * for clarity\n- **Check foreign keys** via whodb_columns to understand relationships\n- **Use JSON format** (--format json) when parsing output programmatically\n- **Never expose credentials** - use connection names, not connection strings\n","cli/skills/whodb/SKILL.md":"---\nname: whodb\ndescription: Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured.\n---\n\n# WhoDB Database Assistant\n\nYou have access to WhoDB for database operations. Use these tools and commands to help users with database tasks.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n### Database tools\n\nWhen database-only MCP is configured, use these tools directly:\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: List of connection names with type and source (env/saved).\n```\n\n### whodb_query\nExecute SQL queries against a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- query: SQL query to execute\n\nExample: whodb_query(connection=\"mydb\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### whodb_schemas\nList all schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- include_tables: Set true to also return tables within each schema (optional)\n\nExample: whodb_schemas(connection=\"mydb\")\nExample: whodb_schemas(connection=\"mydb\", include_tables=true)\n```\n\n### whodb_tables\nList all tables in a schema.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- schema: Schema name (optional, uses default if not specified)\n- include_columns: Set true to also return column details for every table (optional)\n\nExample: whodb_tables(connection=\"mydb\", schema=\"public\")\nExample: whodb_tables(connection=\"mydb\", schema=\"public\", include_columns=true)\n```\n\n### whodb_columns\nDescribe columns in a table.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- table: Table name (required)\n- schema: Schema name (optional)\n\nExample: whodb_columns(connection=\"mydb\", table=\"users\")\n```\n\n## CLI Commands (Fallback)\n\nIf MCP tools are unavailable, use the CLI directly via Bash:\n\n### Query Execution\n```bash\nwhodb query \"SELECT * FROM users LIMIT 10\" --connection mydb --format json\n```\n\n### Schema Discovery\n```bash\n# List schemas\nwhodb schemas --connection mydb --format json\n\n# List tables\nwhodb tables --connection mydb --schema public --format json\n\n# Describe columns\nwhodb columns --connection mydb --table users --format json\n```\n\n### Connection Management\n```bash\n# List connections\nwhodb connections list --format json\n\n# Test connection\nwhodb connections test mydb\n\n# Add new connection (interactive)\nwhodb connections add --name mydb --type Postgres --host localhost --database mydb\n```\n\n### Data Export\n```bash\n# Export to CSV\nwhodb export --connection mydb --table users --output users.csv\n\n# Export query results\nwhodb export --connection mydb --query \"SELECT * FROM orders\" --output orders.xlsx\n```\n\n## Workflow Examples\n\n### Explore a New Database (Efficient)\n1. List connections: `whodb_connections`\n2. Get tables with columns in one call: `whodb_tables(connection=\"name\", include_columns=true)`\n3. Sample data: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\nQuery results include `column_types` alongside column names, so you know the data types without a separate call.\n\n### Explore a New Database (Multi-Schema)\n1. List connections: `whodb_connections`\n2. Get all schemas with tables: `whodb_schemas(connection=\"name\", include_tables=true)`\n3. Get columns for the schema you care about: `whodb_tables(connection=\"name\", schema=\"public\", include_columns=true)`\n4. Query: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\n### Answer Data Questions\n1. Understand the schema first - check table structure\n2. Write targeted queries with appropriate filters\n3. Always use LIMIT for exploratory queries\n4. Present results in a clear, readable format\n\n## Best Practices\n\n- **Always explore schema first** before writing queries\n- **Use LIMIT** for exploratory queries to avoid overwhelming output\n- **Prefer specific columns** over SELECT * for clarity\n- **Check foreign keys** via whodb_columns to understand relationships\n- **Use JSON format** (--format json) when parsing output programmatically\n- **Never expose credentials** - use connection names, not connection strings\n",".agents/skills/impeccable/SKILL.md":"---\nname: impeccable\ndescription: \"Use when the user wants to design, redesign, shape, critique, audit, polish, simplify, harden, animate, or otherwise improve a frontend interface: websites, landing pages, dashboards, product UI, components, forms, settings, onboarding, empty states, and native iOS or Android screens. Handles UX review, hierarchy, layout, typography, color, motion, UX copy, accessibility, responsive behavior, edge cases, and capturing or documenting design systems (DESIGN.md, tokens). Also for making bland UI bolder, loud UI quieter, or ambitious visual effects. Not for backend-only or non-UI tasks.\"\nmetadata:\n  version: 4.7.0\n---\n\nThis skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft.\n\nCore principles:\n- Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide.\n- Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, and patterns the visitor already knows earn their place.\n- Verify by looking at the rendered result at the sizes it ships at, and batch the checks: fix what one look shows before looking again, rather than screenshotting after every tweak.\n\n## Setup\n\n1. Run `<skill-base-dir>/scripts/impeccable context` once per session, where `<skill-base-dir>` is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. That base directory resolves every `.agents/skills/impeccable/scripts/impeccable <verb>` command in this skill and its references, and `.agents/skills/impeccable/scripts` is the fallback only when the runtime reports no base directory. On a Windows shell without `sh`, call `.agents/skills/impeccable/scripts/impeccable.cmd` instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as `--target <path>`. It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.\n2. Load the request's playbook: its Commands-table reference for an explicit/implied sub-command, or [reference/new-work.md](reference/new-work.md) for a new surface or replacement visual world. Inspect target and incumbent visual truth before editing. When the app cannot run, start with committed visual-regression goldens or screenshot fixtures; verify target and freshness against current tokens, CSS, components, or assets, resolve conflicts, and compare theme/variant captures.\n3. After resolving analysis and direction, read [reference/craft-floor.md](reference/craft-floor.md) immediately before any UI edit, including small refinements. It carries the quality floor, the absolute bans, and the reflexes no detector catches. Do not load it for planning-only work.\n\n**Launcher unavailable:** On refusal or failure, send a separate message **before the next tool call**: “Context loading did not run; I’ll read the existing project context directly.” Then read existing PRODUCT.md and DESIGN.md without inventing missing context, follow applicable steps 2–3, and continue through permitted tools. This applies to planning and editing; launcher failure alone does not block either.\n\n## How to design\n\n- **The brief wins.** Honor pinned aesthetics, eras, materials, fonts, and palettes even when they conflict with a saturated-pattern warning. Redirecting a clear brief toward your taste is failure.\n- **Refinement preserves; redesign replaces.** Refinement keeps the incumbent identity, behavior, copy, and everything outside scope. Ask before replacing factual copy or adding claims. Redesign keeps product truth, content, function, native affordances, and constraints, but treats the old look as evidence and anti-reference; choose a replacement world in new-work and replace DESIGN.md. Never split the difference into polish on the discarded look.\n- **Loaded symbols stay out of the decoration.** A subject's world does not license emblems tied to militarism, supremacy, or hate movements as motifs, badges, or ornament, such as the Rising Sun flag's rays, the Confederate battle flag, or Nazi-era insignia and their stylised variants; reach for that world's neutral forms instead. Content that documents such a symbol as fact stays as it is.\n- **Visual authority is evidence, not a filename.** Missing DESIGN.md alone does not make a project greenfield; new-work decides whether to preserve, expand, or replace the incumbent world.\n\n## Modes\n\nThe mode names what the visitor's success looks like on this surface.\n\n- **Persuade:** the visitor decides and acts; design is the product. Landing pages, marketing, campaigns, pricing. Earn attention and action. Ship real imagery when the brief needs it; follow the committed world, not category habit.\n- **Operate:** the visitor completes a task. App UI, dashboards, editors, admin, settings, tools. Scanability, consistency, native expectations, and the real usage scene outrank expression. Brand lives in precise details.\n- **Read:** the visitor understands something. Docs, articles, guides, help, changelogs. Structure for comprehension, then make the reading experience worth staying in.\n- **Experience:** the visitor is inside the work itself. Portfolios, galleries, showcases. Let the artifact lead from the first viewport; the interface recedes.\n\nChoose the mode from the requested surface, not the product, and persist it only in that surface brief. A tool's landing page is still Persuade; a fashion house's documentation is still Read; a docs index is Read, not Persuade. See [new-work.md](reference/new-work.md) for new surfaces and [operate.md](reference/operate.md) for deeper Operate/Read guidance.\n\n## Commands\n\n| Command | Category | Description | Reference |\n|---|---|---|---|\n| `craft [feature]` | Build | Deprecated alias for an ordinary new-work request | [reference/craft.md](reference/craft.md) |\n| `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) |\n| `init` | Build | Capture durable product context in PRODUCT.md | [reference/init.md](reference/init.md) |\n| `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) |\n| `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) |\n| `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) |\n| `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) · native: [reference/audit.native.md](reference/audit.native.md) |\n| `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) |\n| `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) |\n| `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) |\n| `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) |\n| `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) |\n| `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) |\n| `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) |\n| `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) |\n| `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) |\n| `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) |\n| `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) |\n| `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) |\n| `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) |\n| `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) · native: [reference/adapt.native.md](reference/adapt.native.md) |\n| `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) |\n| `live` | Iterate | Visual variant mode: pick elements in the browser, iterate on alternatives | [reference/live.md](reference/live.md) |\n| `generate [n] [action] [element]` | Iterate | Variants, versions, or alternatives of a named element to choose from in the live browser; no manual picking | [reference/generate.md](reference/generate.md) |\n\nRouting:\n\n- **No argument:** read [routing.md](reference/routing.md) and present its context-aware menu; never auto-run a command.\n- **Explicit or clearly implied request to run a command:** load its reference (native variant on native platforms) and follow it. Ask once if two commands fit.\n- **Workflow or command-selection question:** read [Workflow questions](reference/routing.md#workflow-questions).\n- **Otherwise:** treat the request as general design work. Missing PRODUCT.md routes a new surface or replacement world through init, then new-work; a narrow refinement of existing code proceeds on the incumbent implementation as `impeccable context` directs, offering init afterward rather than blocking on it.\n- `teach` aliases `init`. `craft` is a deprecated alias for ordinary new-work and adds nothing. `shape` owns task discovery, then enters new-work only for visual-world and surface-concept decisions.\n\nAfter init writes PRODUCT.md, resume without rerunning `impeccable context`; init loads the native platform reference itself when the platform it recorded is `ios`, `android`, or `adaptive`.\n\n**Pin / Unpin:** `.agents/skills/impeccable/scripts/impeccable pin <pin|unpin> <command>` creates or removes a standalone `$<command>` shortcut. Report the script's result concisely; relay stderr verbatim on error.\n\n**Hooks:** `$impeccable hooks <on|off|status|ignore-rule|ignore-file|ignore-value|reset>` manages the design detector hook for this project (auto-runs the detector after UI file edits and surfaces findings). Load [reference/hooks.md](reference/hooks.md) when the user invokes it with any argument.\n\n**Doctor:** `$impeccable doctor` reports and repairs drift between this project's Impeccable artifacts (PRODUCT.md, DESIGN.md and its sidecar, config, surface briefs, the hook) and what this version reads. Load [reference/doctor.md](reference/doctor.md) when the user invokes it, or when they ask what is out of date, stale, or needs refreshing. A `CONTEXT_STALE` directive in Setup's output is the cheap subset of the same report; act on it there per its own instructions rather than running doctor unasked.\n\n**Never repair drift as a side effect of a design task.** A `CONTEXT_STALE` finding is reported, not acted on, unless the user asks. The one exception is a finding marked `auto`, which the next write to that file performs anyway.","cli/external-plugin/openai-skills/whodb/SKILL.md":"---\nname: whodb\ndescription: \"Work with WhoDB platform hosts and project resources via MCP, including multiple environments, or query databases directly in database-only MCP mode.\"\nlicense: Apache-2.0\nmetadata:\n  author: clidey\n  version: \"0.106.0\"\ncompatibility: \"Requires Node.js (npx) or the whodb binary installed.\"\n---\n\n# WhoDB\n\nQuery databases, explore schemas, analyze data quality, and get optimization recommendations through the WhoDB MCP server.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n## Database-only MCP setup\n\nIf the WhoDB MCP server is not connected, set it up:\n\n1. Add the MCP server (npx, no install needed):\n   ```bash\n   codex mcp add whodb -- npx -y whodb mcp serve\n   ```\n\n2. Or if `whodb` is installed locally:\n   ```bash\n   codex mcp add whodb -- whodb mcp serve\n   ```\n\n3. Configure database connections via environment variables:\n   ```bash\n   export WHODB_POSTGRES='[{\"alias\":\"prod\",\"host\":\"localhost\",\"user\":\"user\",\"password\":\"pass\",\"database\":\"mydb\",\"port\":\"5432\"}]'\n   export WHODB_MYSQL_1='{\"alias\":\"dev\",\"host\":\"localhost\",\"user\":\"user\",\"password\":\"pass\",\"database\":\"devdb\",\"port\":\"3306\"}'\n   ```\n\nAfter adding the MCP server, restart Codex.\n\n## Available MCP Tools\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: connection names with type and source (env/saved).\n```\n\n### whodb_schemas\nList schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one exists)\n```\n\n### whodb_tables\nList tables in a schema.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional, uses default)\n```\n\n### whodb_columns\nDescribe table columns and types.\n```\nParameters:\n- connection: Connection name (optional)\n- table: Table name (required)\n- schema: Schema name (optional)\n```\n\n### whodb_query\nExecute SQL queries with security validation.\n```\nParameters:\n- connection: Connection name (optional)\n- query: SQL query to execute\n```\n\n### whodb_explain\nRun EXPLAIN for a SQL query.\n```\nParameters:\n- connection: Connection name (optional)\n- query: SQL query to analyze\n```\n\n### whodb_erd\nLoad graph/relationship metadata for ER diagrams.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional)\n```\n\n### whodb_diff\nCompare schema metadata between two connections.\n```\nParameters:\n- source: Source connection name (required)\n- target: Target connection name (required)\n```\n\n### whodb_audit\nRun data quality audits on a table.\n```\nParameters:\n- connection: Connection name (optional)\n- table: Table name (required)\n- schema: Schema name (optional)\n```\n\n### whodb_suggestions\nLoad backend-generated query suggestions for a connection.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional)\n```\n\n### whodb_confirm\nConfirm a pending write operation (only available in confirm-writes mode, which is the default).\n```\nParameters:\n- token: Confirmation token from a pending write\n```\n\n### whodb_pending\nList pending confirmation tokens.\n```\nNo parameters required.\n```\n\n## Standard Workflow\n\n### Step 1: Discover connections\n```\nwhodb_connections → list available databases\n```\n\n### Step 2: Explore schema\n```\nwhodb_schemas(connection=\"name\") → list schemas\nwhodb_tables(connection=\"name\", schema=\"public\") → list tables\nwhodb_columns(connection=\"name\", table=\"users\") → column details\n```\n\n### Step 3: Query data\n```\nwhodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### Step 4: Analyze (as needed)\n```\nwhodb_explain(connection=\"name\", query=\"SELECT ...\") → query plan\nwhodb_erd(connection=\"name\") → table relationships\nwhodb_audit(connection=\"name\", table=\"users\") → data quality\nwhodb_diff(source=\"prod\", target=\"staging\") → schema comparison\n```\n\n## Query Building\n\nWhen converting natural language to SQL:\n\n1. Always check schema first with `whodb_tables` and `whodb_columns`\n2. Match entities to table names, attributes to column names\n3. Identify foreign key joins from column metadata\n4. Use LIMIT for exploratory queries (default: 100)\n\n### Date handling varies by database\n\n| Intent | PostgreSQL | MySQL | SQLite |\n|--------|-----------|-------|--------|\n| Last 7 days | `>= NOW() - INTERVAL '7 days'` | `>= DATE_SUB(NOW(), INTERVAL 7 DAY)` | `>= DATE('now', '-7 days')` |\n| Start of month | `>= DATE_TRUNC('month', CURRENT_DATE)` | `>= DATE_FORMAT(NOW(), '%Y-%m-01')` | `>= DATE('now', 'start of month')` |\n\n## Security Modes\n\nThe MCP server defaults to confirm-writes mode (writes require confirmation via `whodb_confirm`).\n\n- `--read-only`: blocks all write operations\n- `--safe-mode`: read-only + strict security validation\n- `--allow-write`: full write access without confirmation\n\n## Safety Rules\n\n- Always explore schema before writing queries\n- Use LIMIT for exploratory queries\n- Prefer specific columns over SELECT *\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Never expose or log credentials\n- Use connection names, not connection strings\n",".codex/hooks.json":"{\n  \"hooks\": {\n    \"SessionStart\": [\n      {\n        \"matcher\": \"startup|resume\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/session-context.sh\\\"\",\n            \"statusMessage\": \"Loading session context\",\n            \"timeout\": 30\n          }\n        ]\n      }\n    ],\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"^apply_patch$|Edit|Write\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-format-go.sh\\\"\",\n            \"statusMessage\": \"Formatting Go files\",\n            \"timeout\": 60\n          },\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-lint-ts.sh\\\"\",\n            \"statusMessage\": \"Linting TypeScript files\",\n            \"timeout\": 120\n          },\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-graphql-codegen.sh\\\"\",\n            \"statusMessage\": \"Regenerating GraphQL types\",\n            \"timeout\": 300\n          }\n        ]\n      },\n      {\n        \"matcher\": \"Edit|Write|apply_patch\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"[ ! -f \\\".agents/skills/impeccable/scripts/impeccable\\\" ] || \\\".agents/skills/impeccable/scripts/impeccable\\\" hook\",\n            \"commandWindows\": \"cmd /c if exist \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" hook\",\n            \"timeout\": 5,\n            \"statusMessage\": \"Checking UI changes\"\n          }\n        ]\n      }\n    ],\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/verify-build.sh\\\"\",\n            \"statusMessage\": \"Verifying build / type-check\",\n            \"timeout\": 600\n          }\n        ]\n      },\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"[ ! -f \\\".agents/skills/impeccable/scripts/impeccable\\\" ] || \\\".agents/skills/impeccable/scripts/impeccable\\\" hook\",\n            \"commandWindows\": \"cmd /c if exist \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" hook\",\n            \"timeout\": 30,\n            \"statusMessage\": \"Design deep pass\"\n          }\n        ]\n      }\n    ]\n  }\n}\n","cli/external-plugin/whodb/skills/query-builder/SKILL.md":"---\nname: query-builder\ndescription: Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\".\n---\n\n# Query Builder\n\nConvert natural language questions into SQL queries using the database schema.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks questions like:\n- \"Show me all users who signed up last month\"\n- \"Find orders greater than $100\"\n- \"Which products have low inventory?\"\n- \"Get the top 10 customers by total spend\"\n\n## Workflow\n\n### 1. Understand the Schema\nBefore generating SQL, always check the table structure:\n\n```\nwhodb_tables(connection=\"...\") → Get available tables\nwhodb_columns(table=\"relevant_table\") → Get column names and types\n```\n\n### 2. Identify Intent\nParse the natural language request:\n- **Subject**: What entity? (users, orders, products)\n- **Filter**: What conditions? (last month, > $100, active)\n- **Aggregation**: Count, sum, average, max, min?\n- **Grouping**: By what dimension?\n- **Ordering**: Sort by what? Ascending/descending?\n- **Limit**: How many results?\n\n### 3. Map to Schema\n- Match entities to table names\n- Match attributes to column names\n- Identify foreign key joins needed\n\n### 4. Generate SQL\nBuild the query following SQL best practices:\n\n```sql\nSELECT columns\nFROM table\n[JOIN other_table ON condition]\nWHERE filters\n[GROUP BY columns]\n[HAVING aggregate_condition]\nORDER BY column [ASC|DESC]\nLIMIT n;\n```\n\n### 5. Execute and Present\n```\nwhodb_query(query=\"generated SQL\")\n```\n\n## Translation Patterns\n\n| Natural Language | SQL Pattern |\n|------------------|-------------|\n| \"last week/month/year\" | `WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK)` |\n| \"more than X\" / \"greater than X\" | `WHERE col > X` |\n| \"top N\" | `ORDER BY col DESC LIMIT N` |\n| \"how many\" | `SELECT COUNT(*)` |\n| \"total\" / \"sum of\" | `SELECT SUM(col)` |\n| \"average\" | `SELECT AVG(col)` |\n| \"for each\" / \"by\" | `GROUP BY col` |\n| \"between X and Y\" | `WHERE col BETWEEN X AND Y` |\n| \"contains\" / \"like\" | `WHERE col LIKE '%term%'` |\n| \"starts with\" | `WHERE col LIKE 'term%'` |\n| \"is empty\" / \"is null\" | `WHERE col IS NULL` |\n| \"is not empty\" | `WHERE col IS NOT NULL` |\n\n## Date Handling by Database\n\n### PostgreSQL\n```sql\nWHERE created_at >= NOW() - INTERVAL '7 days'\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\n```\n\n### MySQL\n```sql\nWHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)\nWHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')\n```\n\n### SQLite\n```sql\nWHERE created_at >= DATE('now', '-7 days')\nWHERE created_at >= DATE('now', 'start of month')\n```\n\n## Examples\n\n### \"Show me users who signed up this month\"\n```sql\nSELECT * FROM users\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\nORDER BY created_at DESC;\n```\n\n### \"Find the top 5 products by sales\"\n```sql\nSELECT p.name, SUM(oi.quantity) as total_sold\nFROM products p\nJOIN order_items oi ON p.id = oi.product_id\nGROUP BY p.id, p.name\nORDER BY total_sold DESC\nLIMIT 5;\n```\n\n### \"How many orders per customer?\"\n```sql\nSELECT customer_id, COUNT(*) as order_count\nFROM orders\nGROUP BY customer_id\nORDER BY order_count DESC;\n```\n\n## Safety Rules\n\n- Always use LIMIT for exploratory queries (default: 100)\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Warn if query might return large result sets\n- Use table aliases for readability in JOINs\n","CLAUDE.md":"@AGENTS.md\n\n## Claude Code\n\n- Use plan mode for multi-file, risky, architectural, or ambiguous changes.\n- Use subagents only for bounded sidecar work: exploration, review, test triage, or documentation lookup.\n- Prefer separate worktrees for parallel implementation sessions.\n- When a task touches `ee/`, follow `ee/AGENTS.md`; if running Claude Code inside `ee/`, `ee/CLAUDE.md` imports that overlay.\n","DESIGN.md":"---\nname: WhoDB\ndescription: Lightweight, fast database management with quiet confidence\ncolors:\n  background-light: \"#FAF5EC\"\n  background-dark: \"#0E2240\"\n  foreground-light: \"#0E2240\"\n  foreground-dark: \"#FAF5EC\"\n  card-light: \"#FFFFFF\"\n  card-dark: \"#162B4A\"\n  popover-light: \"#FFFFFF\"\n  popover-dark: \"#1D3151\"\n  muted-foreground-light: \"#5C6778\"\n  muted-foreground-dark: \"#9BA5B3\"\n  primary-light: \"#2C6BD4\"\n  primary-dark: \"#5091FD\"\n  accent-light: \"#EAF0FB\"\n  accent-dark: \"#233E69\"\n  border-light: \"#D9D4CB\"\n  border-dark: \"#314667\"\n  brand-orange: \"#F4781C\"\n  highlight-yellow: \"#FFC233\"\n  destructive-light: \"#E30117\"\n  destructive-dark: \"#FF6668\"\ntypography:\n  body:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1rem\"\n    fontWeight: 400\n    lineHeight: 1.5\n  label:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"0.875rem\"\n    fontWeight: 500\n    lineHeight: 1.4\n  title:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.25rem\"\n    fontWeight: 600\n    lineHeight: 1.3\n  headline:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.5rem\"\n    fontWeight: 600\n    lineHeight: 1.25\n  mono:\n    fontFamily: \"JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\"\n    fontSize: \"0.875rem\"\n    fontWeight: 400\nrounded:\n  sm: \"0.375rem\"\n  md: \"0.5rem\"\n  lg: \"0.625rem\"\n  xl: \"0.75rem\"\nspacing:\n  xs: \"0.5rem\"\n  sm: \"0.75rem\"\n  md: \"1rem\"\n  lg: \"1.5rem\"\n  xl: \"2rem\"\ncomponents:\n  button-primary:\n    backgroundColor: \"{colors.primary-light}\"\n    textColor: \"#FFFFFF\"\n    rounded: \"{rounded.md}\"\n    padding: \"0.5rem 1rem\"\n  button-ghost:\n    backgroundColor: \"transparent\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.md}\"\n  card:\n    backgroundColor: \"{colors.card-light}\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.lg}\"\n    padding: \"1rem\"\n---\n\n# Design System: WhoDB\n\n## Overview\n\n**Creative North Star: \"Quiet Confidence\"**\n\nWhoDB is a database management tool for people who already know what they're doing. The interface doesn't perform competence — it assumes it. Every surface exists to frame data, never to decorate it. All tokens flow from `@clidey/ux`'s Clidey brand kit (imported directly via `@import '@clidey/ux/brand.css'`): Paper/Ink dual-mode, Signal Blue as the product accent, Beacon Yellow as the single sanctioned highlight, Clidey Orange reserved for company-branded moments rather than general product UI.\n\nThe system explicitly rejects:\n- The cluttered, dated aesthetic of legacy database tools (phpMyAdmin, pgAdmin)\n- Corporate-gray enterprise bloat and wizard-driven flows\n- Mixed-hue decoration — more than one accent color competing on the same surface\n\n**Key Characteristics:**\n- Flat surfaces by default; depth comes from a lightness step between surfaces, not shadow or blur\n- Dual theme: Paper (light) and Ink (dark), both first-class\n- Hanken Grotesk carries the UI; Bricolage Grotesque is self-hosted and available (`brand-fonts.css`) but not currently applied anywhere in the product UI — treat it as reserved for a future display-heading use, not an active token\n- A user-facing density system (Settings) swaps font-size, radius, and spacing scales between small/medium/large and none/small/medium/large tiers respectively — the values below are the medium/default tier, not the only valid values\n- Token-driven styling via CSS custom properties from `@clidey/ux` — extend, don't override component internals with `!important`\n\n## Colors\n\nThe palette is Clidey's brand kit: Paper and Ink as the two surface worlds, Signal Blue as the product accent (lifts one lightness step in dark mode), Beacon Yellow as the single highlight, Clidey Orange reserved for company-branded emphasis.\n\n### Primary\n- **Signal Blue** (`#2C6BD4` light / `#5091FD` dark): Interactive affordances — buttons, links, focus rings, active states.\n\n### Secondary\n- **Clidey Orange** (`#F4781C`): Company-branded emphasis only, not general product UI. One accent per surface — don't mix with Signal Blue on the same card or banner.\n\n### Surfaces\n- **Background** (`#FAF5EC` Paper / `#0E2240` Ink): Page canvas, flat at rest.\n- **Card** (`#FFFFFF` light / `#162B4A` dark): One lightness step up from background.\n- **Popover** (`#FFFFFF` light / `#1D3151` dark): Menus, dropdowns, tooltips.\n\n### Borders\n- **Light mode:** `#D9D4CB`\n- **Dark mode:** `#314667`\n\n### Text\n- **Foreground** (`#0E2240` light / `#FAF5EC` dark): Primary body text.\n- **Muted Foreground** (`#5C6778` light / `#9BA5B3` dark): Secondary text, labels, descriptions. Always verify contrast against the actual surface the text sits on (`--card`, not just `--background`) — the dark-mode value was raised earlier after measuring under WCAG AA against `--card`.\n\n### Named Rules\n**The One-Accent Rule.** A single surface uses exactly one accent hue at a time. Blue leads product UI; orange leads company-branded moments. They do not mix on the same card or banner.\n\n## Typography\n\n**Primary Font:** Hanken Grotesk (with Inter, then system sans-serif fallback)\n**Mono Font:** JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\n\n**Character:** Single active UI typeface. Bricolage Grotesque is self-hosted alongside Hanken Grotesk but not wired into any component today — don't assume it renders anywhere until it's actually applied to an element.\n\n### Hierarchy (medium density tier — the default)\n- **3xl** (600, 1.875rem/30px): Rare hero text.\n- **2xl** (600, 1.5rem/24px): Headline.\n- **xl** (600, 1.25rem/20px): Title/section headers.\n- **lg** (500, 1.125rem/18px): Card titles, dialog headers.\n- **base** (400, 1rem/16px): Primary body text.\n- **sm** (400, 0.875rem/14px): Secondary text, labels.\n- **xs** (400, 0.75rem/12px): Metadata, captions.\n\n### Named Rules\n**The Density-Tier Rule.** Font sizes, radius, and spacing are all user-adjustable via Settings (small/medium/large tiers). Don't hardcode a pixel value where a `var(--font-size-*)`/`var(--radius-*)`/`var(--spacing-*)` token exists — hardcoding breaks the density switch for that element.\n\n## Layout\n\nSpacing follows a `--spacing-{xs,sm,md,lg,xl,2xl,3xl}` scale, adjustable via the same density system (compact/comfortable/spacious tiers; comfortable is the default: 8/12/16/24/32/40/48px).\n\n## Elevation & Depth\n\nFlat by default — no shadow at rest. Depth is a lightness step between `--background` → `--card` → `--popover`, not an elevation effect.\n\n## Shapes\n\nRadius follows a `--radius-{sm,md,lg,xl}` scale derived from a single `--radius` primitive (`calc()`-based: sm = radius−4px, md = radius−2px, lg = radius, xl = radius+4px), also swappable via the density system. Medium/default: `--radius: 0.625rem` (10px), giving sm 6px / md 8px / lg 10px / xl 14px.\n\n## Components\n\nInteractive components are sourced from `@clidey/ux`. The app extends them through CSS custom properties in `frontend/src/index.css` and the density-mapping variables in `theme-customization.ts` — never by overriding component internals with `!important`.\n\n### Buttons\n- **Shape:** `{rounded.md}`\n- **Primary:** Signal Blue background, contrast-checked text.\n- **Ghost:** Transparent background, foreground text.\n\n### Cards\n- **Corner Style:** `{rounded.lg}`\n- **Background:** `var(--card)`, flat, no shadow at rest.\n\n### Icon tiles\n- **Pairing rule:** an icon tile's background token and its icon/text color token must be from different roles (e.g. `bg-icon` + `text-icon-foreground`, not `bg-icon` + `text-primary`) — a prior bug painted blue icon glyphs on a blue tile background because both referenced the same hue family. Always check the foreground/background pairing when introducing a new tinted tile.\n\n## Do's and Don'ts\n\n### Do:\n- **Do** use flat, token-driven backgrounds for all static surfaces.\n- **Do** use `var(--font-size-*)`, `var(--radius-*)`, and `var(--spacing-*)` tokens rather than hardcoded values, so the density-customization system keeps working.\n- **Do** respect both themes equally — verify contrast against the actual surface text sits on.\n- **Do** extend `@clidey/ux` via CSS custom properties, never by overriding component styles with `!important`.\n\n### Don't:\n- **Don't** mix Signal Blue and Clidey Orange on the same surface.\n- **Don't** add drop shadows to cards or containers at rest.\n- **Don't** assume Bricolage Grotesque renders anywhere — it's self-hosted but unused; Hanken Grotesk is the only active UI typeface.\n- **Don't** pair a tinted tile's background and foreground from the same color role (see the icon-tile bug above).\n- **Don't** use hardcoded color values (`bg-white`, `dark:bg-gray-800`). Use semantic tokens.\n","AGENTS.md":"# WhoDB Development Guide\n\nWhoDB is a source-first data management tool. The public GraphQL API and frontend\ncontract are built around `SourceType`, `SourceContract`, `SourceObject`,\n`SourceObjectRef`, and `SourceSessionMetadata`. The current execution layer is\nstill powered mainly by database plugins under `core/src/plugins/`.\n\n`AGENTS.md` is the canonical agent instruction file for this repository. Tool-\nspecific files such as `CLAUDE.md` should import or point to this file instead\nof duplicating these instructions.\n\nIf the `ee/` directory is present, read `ee/AGENTS.md` for additional context. Do not add any code, comments, or references to `ee/` in the CE codebase.\n\n## Git Commits — Hard Rule\n\n**Never commit to `main` (or any branch) without the user explicitly saying \"please commit this for me\" (or unambiguously equivalent wording) in that turn.** This applies regardless of task framing — \"merge it into main locally\" or \"just write the code changes in main\" means apply the file changes on that branch, not create a commit. If committing seems necessary to accomplish what was asked (e.g. to merge a branch), stop and ask first instead of assuming consent.\n\n## Terminology\n\n- **\"EE agent\" / \"ee agent\"** means the in-app WhoDB EE browser AI agent feature (under `ee/`), NOT the coding-agent (Claude/Codex) configuration or any MCP server. When in doubt, ask which is meant before acting.\n\n## Non-Negotiable Rules\n\n1. **GraphQL-first** - All new API functionality via GraphQL. Never add HTTP resolvers unless explicitly needed (e.g., file downloads)\n2. **No SQL injection** - Never use `fmt.Sprintf` with user input for SQL. Use parameterized queries or GORM builders. See `.agents/docs/sql-security.md`\n3. **Plugin architecture** - Never use `switch dbType` or `if dbType ==` in shared code. All database-specific logic goes in plugins. See `.agents/docs/plugin-architecture.md`\n4. **Documentation requirements** - All exported Go functions/types need doc comments. All exported TypeScript functions/components need JSDoc. See `.agents/docs/documentation.md`\n5. **Localization requirements** - All user-facing strings must use `t()` with YAML keys. No fallback strings. No hardcoded UI text. When adding or updating keys, edit `en_US` only unless the user explicitly asks for other languages. See `.agents/docs/localization.md`\n6. **Verify before completing** - For non-trivial tasks, define success criteria before editing. After finishing, verify: (1) type checks pass (`pnpm run build:ce` for frontend, `go build ./cmd/whodb` for backend), (2) no linting errors, (3) all added code is actually used (no dead code). See `.agents/docs/verification.md`\n7. **Show proof** - When making a claim about how something outside of our codebase works, for example a 3rd party library or function, always provide official documentation or the actual code to back that up. Check online if you have to.\n\n## Behavioral Guidelines\n\nThese guidelines reduce common LLM coding mistakes. They bias toward caution over speed — for trivial tasks, use judgment.\n\n### 1. Think Before Coding\n\n**Don't assume. Don't hide confusion. Surface tradeoffs.**\n\nBefore implementing:\n- State your assumptions explicitly. If uncertain, ask.\n- If multiple interpretations exist, present them — don't pick silently.\n- If a simpler approach exists, say so. Push back when warranted.\n- If something is unclear, stop. Name what's confusing. Ask.\n\n### 2. Simplicity First\n\n**Minimum code that solves the problem. Nothing speculative.**\n\n- No features beyond what was asked.\n- No abstractions for single-use code.\n- No \"flexibility\" or \"configurability\" that wasn't requested.\n- No error handling for impossible scenarios.\n- No fallback logic unless explicitly asked — if you think it's needed, ask first.\n- No defensive programming — if an edge case needs handling, ask first.\n- If you write 200 lines and it could be 50, rewrite it.\n- Right-size architecture. Start with the simplest surgical fix. Do not propose heavyweight patterns (Temporal workflows, outbox, saga, new infra) unless the simple fix is shown to be insufficient — and explain why before building it.\n\nAsk yourself: \"Would a senior engineer say this is overcomplicated?\" If yes, simplify.\n\n### 3. Surgical Changes\n\n**Touch only what you must. Clean up only your own mess.**\n\nWhen editing existing code:\n- Don't \"improve\" adjacent code, comments, or formatting.\n- Don't refactor things that aren't broken.\n- Match existing style, even if you'd do it differently.\n- If you notice unrelated dead code, mention it — don't delete it.\n\nWhen your changes create orphans:\n- Remove imports/variables/functions that YOUR changes made unused.\n- Don't remove pre-existing dead code unless asked.\n\nThe test: Every changed line should trace directly to the user's request.\n\n### 4. Goal-Driven Execution\n\n**Define success criteria. Loop until verified.**\n\nTransform tasks into verifiable goals:\n- \"Add validation\" → \"Write tests for invalid inputs, then make them pass\"\n- \"Fix the bug\" → \"Write a test that reproduces it, then make it pass\"\n- \"Refactor X\" → \"Ensure tests pass before and after\"\n\nFor debugging, confirm the root cause with evidence (a log, trace, or minimal repro) before changing code. Don't fix-and-see; if the first fix doesn't hold, re-diagnose rather than trying another speculative fix.\n\nFor multi-step tasks, state a brief plan:\n```\n1. [Step] → verify: [check]\n2. [Step] → verify: [check]\n3. [Step] → verify: [check]\n```\n\nStrong success criteria let you loop independently. Weak criteria (\"make it work\") require constant clarification.\n\n### 5. CSS and Styling Changes\n\n**Diagnose before editing. One targeted change at a time.**\n\n- For a styling fix, state the specific approach (which selector/property/value and why) before editing.\n- Make one targeted change at a time; don't broadly rewrite styles speculatively.\n- If a styling fix fails twice, stop and ask for guidance (or a reference screenshot / exact value) rather than continuing to guess.\n\n## Execution Workflow\n\nFor non-trivial tasks, use a short goal-driven loop:\n\n1. Identify the expected behavior or failure path.\n2. Choose the smallest change that satisfies the request.\n3. Add or update focused tests when the behavior is testable and the risk justifies it.\n4. Run the relevant verification commands and inspect the diff before finishing.\n\n## Agent Operating Model\n\n- Treat `AGENTS.md` as the shared source of truth for Codex, Claude Code via import, opencode, Pi, and other compatible coding agents.\n- Use `.agents/README.md` as the index for deeper agent guidance, and read only the relevant linked file before editing.\n- Keep always-loaded instructions concise. Move detailed workflows, checklists, and runbooks into linked docs rather than duplicating them in tool-specific files.\n- Use planning mode for multi-file, risky, architectural, or ambiguous changes. Skip formal plans for obvious single-purpose edits.\n- Use separate agents only for bounded sidecar work such as codebase exploration, review, test triage, or documentation lookup. Do not delegate blocking implementation work when the main session is waiting on it.\n- Do not run parallel implementation sessions against the same files. Use separate worktrees or explicitly disjoint file ownership for parallel work.\n- Ask review-oriented agents to find correctness, regression, security, and missing-test issues first; summaries are secondary.\n\n## Project Structure\n\n```\ncore/                   # Backend (Go)\n  cmd/whodb/main.go     # Entry point — imports plugins and creates GraphQL schema\n  src/app/app.go        # AppConfig + Run() — shared server logic\n  src/src.go            # Engine initialization (collects from global plugin registry)\n  src/engine/registry.go # Global plugin registry (plugins self-register via init())\n  src/engine/plugin.go  # PluginFunctions interface\n  src/source/           # Source-first public contract + connector/session interfaces\n  src/sourcecatalog/    # Public source catalog exposed to GraphQL/frontend\n  src/dbcatalog/        # Internal connectable-database catalog adapted into sourcecatalog\n  src/env/              # Environment variable declarations (pure, no log dependency)\n  src/envconfig/        # Config-loading functions that need both env and log\n  src/plugins/          # Database connectors (each has init() calling engine.RegisterPlugin)\n                        # Includes: postgres, mysql, sqlite3, mongodb, redis, elasticsearch,\n                        #           clickhouse, duckdb, memcached (+ mariadb via mysql)\n  graph/schema.graphqls # GraphQL schema\n  graph/*.resolvers.go  # GraphQL resolvers\n\nfrontend/               # React/TypeScript (uses @clidey/ux component library)\n  src/index.tsx        # Entry point\n  src/store/           # Redux Toolkit state\n  src/generated/       # GraphQL codegen output (@graphql alias)\n\ncli/                    # Interactive TUI CLI (Bubble Tea)\nsdk/                    # Platform SDKs (npm @clidey/whodb-sdk, PyPI whodb) — own pnpm\n                        # project; wire cores generated from sdk/spec/ (see sdk/README.md)\ndesktop-ce/             # Desktop app (Wails)\ndesktop-common/         # Shared desktop code\n\n.github/workflows/      # CI/CD pipelines (release, build, deploy)\n```\n\nAdditional agent docs: `.agents/docs/build-and-run.md` (CE setup and generation), `.agents/docs/data-sources.md` (adding data sources), `.agents/docs/cli.md` (CLI), `.agents/docs/desktop.md` (desktop), `.agents/docs/ci-cd.md` (GitHub Actions), `.agents/docs/testing.md` (testing), `.agents/docs/analytics.md` (PostHog analytics contract). EE-specific source additions are in `ee/.agents/docs/data-sources.md`.\n\n## Testing\n\nSee `.agents/docs/testing.md` for comprehensive testing documentation including:\n- Frontend Playwright E2E tests\n- Docker container setup for test databases\n- Go backend unit and integration tests\n- CLI tests\n\nQuick reference:\n```bash\n# Frontend Playwright E2E\ncd frontend && pnpm e2e:ce:headless         # Headless (all databases)\ncd frontend && pnpm e2e:ce                  # Interactive (headed)\n\n# Backend Go tests\nbash dev/run-backend-tests.sh all           # Unit + integration\n\n# CLI tests\nbash dev/run-cli-tests.sh                   # All CLI tests\n```\n\n## Domain-Specific Guidelines\n\nFor language-specific or domain-specific guidelines, refer to the shared rules in `.agents/rules/`:\n- Go Backend (`core/`, `cli/`): `.agents/rules/go-backend.md`\n- React Frontend (`frontend/`): `.agents/rules/react-frontend.md`\n- GraphQL (`**/graph/`, `**/*.graphqls`): `.agents/rules/graphql.md`\n- Localization (`**/locales/`): `.agents/rules/localization.md`\n- E2E Tests (`frontend/e2e/`): `.agents/rules/e2e-tests.md`\n- Desktop (`desktop-ce/`, `desktop-common/`): `.agents/rules/desktop.md`\n- CI/CD (`.github/`): `.agents/rules/ci-cd.md`\n\n## Procedures\n\nFor multi-step tasks, follow the step-by-step workflows in `.agents/workflows/`. Read the relevant file before starting:\n\n| Task | Guide |\n|------|-------|\n| Add a new database plugin | `.agents/workflows/new-plugin.md` |\n| Add a GraphQL query/mutation end-to-end | `.agents/workflows/new-graphql-field.md` |\n| Add a new frontend page | `.agents/workflows/new-frontend-page.md` |\n| Add or update translation keys | `.agents/workflows/add-translation.md` |\n| Add a CLI command or TUI view | `.agents/workflows/cli-feature.md` |\n| Add or modify desktop app functionality | `.agents/workflows/desktop-feature.md` |\n| Add a platform-constrained HTTP handler | `.agents/workflows/platform-constrained-handler.md` |\n| Prepare or consume a handoff | `.agents/workflows/task-handoff.md` |\n| Prove claims about external behavior | `.agents/workflows/research-proof.md` |\n| Pre-commit verification | `.agents/workflows/review-checklist.md` |\n\n## When Updating Dependencies\n\nUse `core/go.mod` as the reference point for dependency versions.\n\n## Commands Quick Reference\n\nSee `.agents/docs/commands.md` for full reference.\n\n```bash\n# Backend: cd core && go run ./cmd/whodb\n# Frontend: cd frontend && pnpm start\n# CLI: cd cli && go run .\n```\n\n## Architecture\n\n- **Plugin self-registration** — each plugin has `init() { engine.RegisterPlugin(...) }`. The entry point's blank imports control which plugins are registered\n- **Source-first public API** — new public GraphQL/frontend work should use `SourceTypes`, `SourceProfiles`, `SourceFieldOptions`, `SourceSessionMetadata`, `SourceObjects`, `SourceRows`, `RunSourceQuery`, and `SourceGraph`. Do not add new public `Database*` queries or capability surfaces\n- **AppConfig DI** — `core/src/app/app.go` defines `AppConfig` (schema, HTTP handlers). The entry point calls `app.Run(config, staticFiles)`\n- **HTTP route extensions** — CE-owned HTTP routes live in `core/graph/SetupHTTPServer`. Edition or platform add-ons register their own non-GraphQL routes with `graph.RegisterHTTPRoutes`; do not add add-on route names or unsupported stubs to CE.\n- **Frontend registries** — components (`registerComponent`), source types (`registerSourceTypeOverrides`), icons (`registerIcons`), and source utilities (`registerSourceUtilities`) can be registered at boot. The frontend renders from registries — if something isn't registered, it's not shown\n- **Import cycle note** — `src` → `router` → `graph` → `src` cycle exists. `Run()` lives in `src/app/` (not `src/`) to avoid it. Never add router/graph imports to `src/`\n\n## Development Principles\n\n- Clean, readable code over clever code\n- Prefer existing style and local helper APIs over new abstractions\n- Only comment edge cases and complex logic, not obvious code\n- Maintain professional, neutral tone without excessive enthusiasm\n","cli/plugin.json":"# cli Plugin Manifest\n\nPath: `cli/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/plugin.json)",".agents/rules/ci-cd.md":"# Rules Skill\n\nPath: `.agents/rules/ci-cd.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/ci-cd.md)",".agents/rules/desktop.md":"# Rules Skill\n\nPath: `.agents/rules/desktop.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/desktop.md)",".agents/rules/e2e-tests.md":"# Rules Skill\n\nPath: `.agents/rules/e2e-tests.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/e2e-tests.md)",".agents/rules/go-backend.md":"# Rules Skill\n\nPath: `.agents/rules/go-backend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/go-backend.md)",".agents/rules/graphql.md":"# Rules Skill\n\nPath: `.agents/rules/graphql.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/graphql.md)",".agents/rules/localization.md":"# Rules Skill\n\nPath: `.agents/rules/localization.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/localization.md)",".agents/rules/react-frontend.md":"# Rules Skill\n\nPath: `.agents/rules/react-frontend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/react-frontend.md)","cli/agents/database-analyst.md":"# Subagent: database-analyst\n\nPath: `cli/agents/database-analyst.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/database-analyst.md)","cli/agents/query-optimizer.md":"# Subagent: query-optimizer\n\nPath: `cli/agents/query-optimizer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/query-optimizer.md)","cli/agents/report-generator.md":"# Subagent: report-generator\n\nPath: `cli/agents/report-generator.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/report-generator.md)",".agents/skills/impeccable/scripts/command-metadata.json":"# Scripts Skill\n\nPath: `.agents/skills/impeccable/scripts/command-metadata.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/scripts/command-metadata.json)",".agents/skills/impeccable/reference/adapt.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.md)",".agents/skills/impeccable/reference/adapt.native.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.native.md)",".agents/skills/impeccable/reference/android.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/android.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/android.md)",".agents/skills/impeccable/reference/animate.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/animate.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/animate.md)",".agents/skills/impeccable/reference/audit.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.md)",".agents/skills/impeccable/reference/audit.native.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.native.md)",".agents/skills/impeccable/reference/bolder.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/bolder.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/bolder.md)",".agents/skills/impeccable/reference/clarify.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/clarify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/clarify.md)",".agents/skills/impeccable/reference/colorize.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/colorize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/colorize.md)",".agents/skills/impeccable/reference/craft.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft.md)",".agents/skills/impeccable/reference/craft-floor.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft-floor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft-floor.md)",".agents/skills/impeccable/reference/critique.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/critique.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/critique.md)",".agents/skills/impeccable/reference/delight.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/delight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/delight.md)",".agents/skills/impeccable/reference/distill.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/distill.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/distill.md)",".agents/skills/impeccable/reference/doctor.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/doctor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/doctor.md)",".agents/skills/impeccable/reference/document.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/document.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/document.md)",".agents/skills/impeccable/reference/extract.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/extract.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/extract.md)",".agents/skills/impeccable/reference/harden.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/harden.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/harden.md)",".agents/skills/impeccable/reference/hooks.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/hooks.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/hooks.md)",".agents/skills/impeccable/reference/init.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/init.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/init.md)",".agents/skills/impeccable/reference/ios.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/ios.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/ios.md)",".agents/skills/impeccable/reference/layout.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/layout.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/layout.md)",".agents/skills/impeccable/reference/live.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/live.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live.md)",".agents/skills/impeccable/reference/live-setup.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/live-setup.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live-setup.md)",".agents/skills/impeccable/reference/new-work.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/new-work.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/new-work.md)",".agents/skills/impeccable/reference/onboard.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/onboard.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/onboard.md)",".agents/skills/impeccable/reference/operate.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/operate.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/operate.md)",".agents/skills/impeccable/reference/optimize.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/optimize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/optimize.md)",".agents/skills/impeccable/reference/overdrive.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/overdrive.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/overdrive.md)",".agents/skills/impeccable/reference/polish.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/polish.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/polish.md)",".agents/skills/impeccable/reference/quieter.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/quieter.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/quieter.md)",".agents/skills/impeccable/reference/routing.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/routing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/routing.md)",".agents/skills/impeccable/reference/shape.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/shape.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/shape.md)",".agents/skills/impeccable/reference/typeset.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/typeset.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/typeset.md)",".agents/skills/impeccable/reference/visualize.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/visualize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/visualize.md)",".agents/skills/impeccable/agents/openai.yaml":"# Agents Skill\n\nPath: `.agents/skills/impeccable/agents/openai.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/agents/openai.yaml)","cli/external-plugin/whodb/.claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `cli/external-plugin/whodb/.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/.claude-plugin/plugin.json)","cli/external-plugin/whodb/agents/database-analyst.md":"# Subagent: database-analyst\n\nPath: `cli/external-plugin/whodb/agents/database-analyst.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/database-analyst.md)","cli/external-plugin/whodb/agents/query-optimizer.md":"# Subagent: query-optimizer\n\nPath: `cli/external-plugin/whodb/agents/query-optimizer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/query-optimizer.md)","cli/external-plugin/whodb/agents/report-generator.md":"# Subagent: report-generator\n\nPath: `cli/external-plugin/whodb/agents/report-generator.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/report-generator.md)","cli/npm-package/packages/whodb-cli-win32-x64/package.json":"# Whodb-cli-win32-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/package.json)","cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml":"# Whodb-cli-win32-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-win32-arm64/package.json":"# Whodb-cli-win32-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/package.json)","cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml":"# Whodb-cli-win32-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-linux-x64/package.json":"# Whodb-cli-linux-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/package.json)","cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml":"# Whodb-cli-linux-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-linux-arm64/package.json":"# Whodb-cli-linux-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/package.json)","cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml":"# Whodb-cli-linux-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-linux-arm/package.json":"# Whodb-cli-linux-arm Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/package.json)","cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml":"# Whodb-cli-linux-arm Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-darwin-x64/package.json":"# Whodb-cli-darwin-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/package.json)","cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml":"# Whodb-cli-darwin-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-darwin-arm64/package.json":"# Whodb-cli-darwin-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/package.json)","cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml":"# Whodb-cli-darwin-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli/package.json":"# Whodb-cli Skill\n\nPath: `cli/npm-package/packages/whodb-cli/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/package.json)","cli/npm-package/packages/whodb-cli/pnpm-lock.yaml":"# Whodb-cli Skill\n\nPath: `cli/npm-package/packages/whodb-cli/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli/README.md":"# whodb-cli Documentation\n\nPath: `cli/npm-package/packages/whodb-cli/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/README.md)",".agents/skills/impeccable/reference/degraded/asset-producer.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/asset-producer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/asset-producer.md)",".agents/skills/impeccable/reference/degraded/documenter.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/documenter.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/documenter.md)",".agents/skills/impeccable/reference/degraded/finish-reviewer.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/finish-reviewer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/finish-reviewer.md)",".agents/skills/impeccable/reference/degraded/manual-edit-applier.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/manual-edit-applier.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/manual-edit-applier.md)","cli/external-plugin/openai-skills/whodb/agents/openai.yaml":"# Agents Skill\n\nPath: `cli/external-plugin/openai-skills/whodb/agents/openai.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/openai-skills/whodb/agents/openai.yaml)"},"files":{"cli/skills/schema-designer/SKILL.md":"---\nname: schema-designer\ndescription: Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.\n---\n\n# Schema Designer\n\nHelp users design database schemas, create tables, and model data relationships.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks:\n- \"Create a table for storing orders\"\n- \"Design a schema for a blog\"\n- \"Add a column to track user preferences\"\n- \"How should I model this relationship?\"\n\n## Workflow\n\n### 1. Understand Requirements\nAsk clarifying questions:\n- What data needs to be stored?\n- What are the relationships between entities?\n- What queries will be common?\n- What's the expected data volume?\n\n### 2. Check Existing Schema\n```\nwhodb_tables(include_columns=true) → See all tables and their columns in one call\n```\n\n### 3. Design the Schema\nFollow database design principles:\n- Normalize to reduce redundancy\n- Use appropriate data types\n- Define primary keys\n- Establish foreign key relationships\n- Add indexes for common queries\n\n### 4. Generate DDL\nProvide CREATE TABLE statements with explanations.\n\n## Data Type Guidelines\n\n### Identifiers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Auto-increment ID | `SERIAL` / `BIGSERIAL` | `INT AUTO_INCREMENT` | `INTEGER PRIMARY KEY` |\n| UUID | `UUID` | `CHAR(36)` | `TEXT` |\n\n### Text\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Short text (<255) | `VARCHAR(n)` | `VARCHAR(n)` | `TEXT` |\n| Long text | `TEXT` | `TEXT` | `TEXT` |\n| Fixed length | `CHAR(n)` | `CHAR(n)` | `TEXT` |\n\n### Numbers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Integer | `INTEGER` | `INT` | `INTEGER` |\n| Big integer | `BIGINT` | `BIGINT` | `INTEGER` |\n| Decimal (money) | `NUMERIC(10,2)` | `DECIMAL(10,2)` | `REAL` |\n| Float | `REAL` | `FLOAT` | `REAL` |\n\n### Dates\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Date only | `DATE` | `DATE` | `TEXT` |\n| Timestamp | `TIMESTAMP` | `DATETIME` | `TEXT` |\n| With timezone | `TIMESTAMPTZ` | `TIMESTAMP` | `TEXT` |\n\n### Boolean\n| PostgreSQL | MySQL | SQLite |\n|------------|-------|--------|\n| `BOOLEAN` | `TINYINT(1)` | `INTEGER` |\n\n## Common Patterns\n\n### Users Table\n```sql\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    email VARCHAR(255) NOT NULL UNIQUE,\n    password_hash VARCHAR(255) NOT NULL,\n    name VARCHAR(100),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_users_email ON users(email);\n```\n\n### One-to-Many (Orders → Order Items)\n```sql\nCREATE TABLE orders (\n    id SERIAL PRIMARY KEY,\n    user_id INTEGER NOT NULL REFERENCES users(id),\n    status VARCHAR(20) DEFAULT 'pending',\n    total NUMERIC(10,2),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE order_items (\n    id SERIAL PRIMARY KEY,\n    order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,\n    product_id INTEGER NOT NULL REFERENCES products(id),\n    quantity INTEGER NOT NULL DEFAULT 1,\n    unit_price NUMERIC(10,2) NOT NULL\n);\n\nCREATE INDEX idx_order_items_order ON order_items(order_id);\n```\n\n### Many-to-Many (Users ↔ Roles)\n```sql\nCREATE TABLE roles (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(50) NOT NULL UNIQUE\n);\n\nCREATE TABLE user_roles (\n    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n    role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,\n    PRIMARY KEY (user_id, role_id)\n);\n```\n\n### Soft Delete Pattern\n```sql\nCREATE TABLE posts (\n    id SERIAL PRIMARY KEY,\n    title VARCHAR(255) NOT NULL,\n    content TEXT,\n    deleted_at TIMESTAMP NULL,  -- NULL = not deleted\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Query active posts\nSELECT * FROM posts WHERE deleted_at IS NULL;\n```\n\n### Audit Trail Pattern\n```sql\nCREATE TABLE audit_log (\n    id SERIAL PRIMARY KEY,\n    table_name VARCHAR(50) NOT NULL,\n    record_id INTEGER NOT NULL,\n    action VARCHAR(10) NOT NULL,  -- INSERT, UPDATE, DELETE\n    old_values JSONB,\n    new_values JSONB,\n    user_id INTEGER REFERENCES users(id),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_audit_table_record ON audit_log(table_name, record_id);\n```\n\n## Best Practices\n\n1. **Always define PRIMARY KEY** - Every table needs one\n2. **Use foreign keys** - Enforce referential integrity\n3. **Add NOT NULL** - Unless the column is truly optional\n4. **Create indexes** - On foreign keys and frequently queried columns\n5. **Use appropriate types** - Don't store numbers as strings\n6. **Add timestamps** - `created_at` and `updated_at` are almost always useful\n7. **Name consistently** - `user_id` not `userId` or `UserID`\n8. **Avoid reserved words** - Don't name columns `order`, `user`, `group`\n\n## Migration Safety\n\nWhen modifying existing tables:\n\n```sql\n-- Safe: Adding nullable column\nALTER TABLE users ADD COLUMN phone VARCHAR(20);\n\n-- Safe: Adding column with default\nALTER TABLE users ADD COLUMN active BOOLEAN DEFAULT true;\n\n-- Caution: Adding NOT NULL (requires default or backfill)\nALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';\n\n-- Caution: Dropping column (data loss)\nALTER TABLE users DROP COLUMN old_column;\n\n-- Caution: Changing type (may fail on existing data)\nALTER TABLE users ALTER COLUMN age TYPE INTEGER;\n```\n","cli/skills/query-builder/SKILL.md":"---\nname: query-builder\ndescription: Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\".\n---\n\n# Query Builder\n\nConvert natural language questions into SQL queries using the database schema.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks questions like:\n- \"Show me all users who signed up last month\"\n- \"Find orders greater than $100\"\n- \"Which products have low inventory?\"\n- \"Get the top 10 customers by total spend\"\n\n## Workflow\n\n### 1. Understand the Schema\nBefore generating SQL, get tables and columns in one call:\n\n```\nwhodb_tables(connection=\"...\", include_columns=true) → Get all tables AND their column names, types, and keys\n```\n\n### 2. Identify Intent\nParse the natural language request:\n- **Subject**: What entity? (users, orders, products)\n- **Filter**: What conditions? (last month, > $100, active)\n- **Aggregation**: Count, sum, average, max, min?\n- **Grouping**: By what dimension?\n- **Ordering**: Sort by what? Ascending/descending?\n- **Limit**: How many results?\n\n### 3. Map to Schema\n- Match entities to table names\n- Match attributes to column names\n- Identify foreign key joins needed\n\n### 4. Generate SQL\nBuild the query following SQL best practices:\n\n```sql\nSELECT columns\nFROM table\n[JOIN other_table ON condition]\nWHERE filters\n[GROUP BY columns]\n[HAVING aggregate_condition]\nORDER BY column [ASC|DESC]\nLIMIT n;\n```\n\n### 5. Execute and Present\n```\nwhodb_query(query=\"generated SQL\")\n```\n\n## Translation Patterns\n\n| Natural Language | SQL Pattern |\n|------------------|-------------|\n| \"last week/month/year\" | `WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK)` |\n| \"more than X\" / \"greater than X\" | `WHERE col > X` |\n| \"top N\" | `ORDER BY col DESC LIMIT N` |\n| \"how many\" | `SELECT COUNT(*)` |\n| \"total\" / \"sum of\" | `SELECT SUM(col)` |\n| \"average\" | `SELECT AVG(col)` |\n| \"for each\" / \"by\" | `GROUP BY col` |\n| \"between X and Y\" | `WHERE col BETWEEN X AND Y` |\n| \"contains\" / \"like\" | `WHERE col LIKE '%term%'` |\n| \"starts with\" | `WHERE col LIKE 'term%'` |\n| \"is empty\" / \"is null\" | `WHERE col IS NULL` |\n| \"is not empty\" | `WHERE col IS NOT NULL` |\n\n## Date Handling by Database\n\n### PostgreSQL\n```sql\nWHERE created_at >= NOW() - INTERVAL '7 days'\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\n```\n\n### MySQL\n```sql\nWHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)\nWHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')\n```\n\n### SQLite\n```sql\nWHERE created_at >= DATE('now', '-7 days')\nWHERE created_at >= DATE('now', 'start of month')\n```\n\n## Examples\n\n### \"Show me users who signed up this month\"\n```sql\nSELECT * FROM users\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\nORDER BY created_at DESC;\n```\n\n### \"Find the top 5 products by sales\"\n```sql\nSELECT p.name, SUM(oi.quantity) as total_sold\nFROM products p\nJOIN order_items oi ON p.id = oi.product_id\nGROUP BY p.id, p.name\nORDER BY total_sold DESC\nLIMIT 5;\n```\n\n### \"How many orders per customer?\"\n```sql\nSELECT customer_id, COUNT(*) as order_count\nFROM orders\nGROUP BY customer_id\nORDER BY order_count DESC;\n```\n\n## Safety Rules\n\n- Always use LIMIT for exploratory queries (default: 100)\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Warn if query might return large result sets\n- Use table aliases for readability in JOINs\n","cli/external-plugin/whodb/skills/schema-designer/SKILL.md":"---\nname: schema-designer\ndescription: Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.\n---\n\n# Schema Designer\n\nHelp users design database schemas, create tables, and model data relationships.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks:\n- \"Create a table for storing orders\"\n- \"Design a schema for a blog\"\n- \"Add a column to track user preferences\"\n- \"How should I model this relationship?\"\n\n## Workflow\n\n### 1. Understand Requirements\nAsk clarifying questions:\n- What data needs to be stored?\n- What are the relationships between entities?\n- What queries will be common?\n- What's the expected data volume?\n\n### 2. Check Existing Schema\n```\nwhodb_tables() → See what already exists\nwhodb_columns(table=\"related_table\") → Understand existing structure\n```\n\n### 3. Design the Schema\nFollow database design principles:\n- Normalize to reduce redundancy\n- Use appropriate data types\n- Define primary keys\n- Establish foreign key relationships\n- Add indexes for common queries\n\n### 4. Generate DDL\nProvide CREATE TABLE statements with explanations.\n\n## Data Type Guidelines\n\n### Identifiers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Auto-increment ID | `SERIAL` / `BIGSERIAL` | `INT AUTO_INCREMENT` | `INTEGER PRIMARY KEY` |\n| UUID | `UUID` | `CHAR(36)` | `TEXT` |\n\n### Text\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Short text (<255) | `VARCHAR(n)` | `VARCHAR(n)` | `TEXT` |\n| Long text | `TEXT` | `TEXT` | `TEXT` |\n| Fixed length | `CHAR(n)` | `CHAR(n)` | `TEXT` |\n\n### Numbers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Integer | `INTEGER` | `INT` | `INTEGER` |\n| Big integer | `BIGINT` | `BIGINT` | `INTEGER` |\n| Decimal (money) | `NUMERIC(10,2)` | `DECIMAL(10,2)` | `REAL` |\n| Float | `REAL` | `FLOAT` | `REAL` |\n\n### Dates\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Date only | `DATE` | `DATE` | `TEXT` |\n| Timestamp | `TIMESTAMP` | `DATETIME` | `TEXT` |\n| With timezone | `TIMESTAMPTZ` | `TIMESTAMP` | `TEXT` |\n\n### Boolean\n| PostgreSQL | MySQL | SQLite |\n|------------|-------|--------|\n| `BOOLEAN` | `TINYINT(1)` | `INTEGER` |\n\n## Common Patterns\n\n### Users Table\n```sql\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    email VARCHAR(255) NOT NULL UNIQUE,\n    password_hash VARCHAR(255) NOT NULL,\n    name VARCHAR(100),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_users_email ON users(email);\n```\n\n### One-to-Many (Orders → Order Items)\n```sql\nCREATE TABLE orders (\n    id SERIAL PRIMARY KEY,\n    user_id INTEGER NOT NULL REFERENCES users(id),\n    status VARCHAR(20) DEFAULT 'pending',\n    total NUMERIC(10,2),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE order_items (\n    id SERIAL PRIMARY KEY,\n    order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,\n    product_id INTEGER NOT NULL REFERENCES products(id),\n    quantity INTEGER NOT NULL DEFAULT 1,\n    unit_price NUMERIC(10,2) NOT NULL\n);\n\nCREATE INDEX idx_order_items_order ON order_items(order_id);\n```\n\n### Many-to-Many (Users ↔ Roles)\n```sql\nCREATE TABLE roles (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(50) NOT NULL UNIQUE\n);\n\nCREATE TABLE user_roles (\n    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n    role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,\n    PRIMARY KEY (user_id, role_id)\n);\n```\n\n### Soft Delete Pattern\n```sql\nCREATE TABLE posts (\n    id SERIAL PRIMARY KEY,\n    title VARCHAR(255) NOT NULL,\n    content TEXT,\n    deleted_at TIMESTAMP NULL,  -- NULL = not deleted\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Query active posts\nSELECT * FROM posts WHERE deleted_at IS NULL;\n```\n\n### Audit Trail Pattern\n```sql\nCREATE TABLE audit_log (\n    id SERIAL PRIMARY KEY,\n    table_name VARCHAR(50) NOT NULL,\n    record_id INTEGER NOT NULL,\n    action VARCHAR(10) NOT NULL,  -- INSERT, UPDATE, DELETE\n    old_values JSONB,\n    new_values JSONB,\n    user_id INTEGER REFERENCES users(id),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_audit_table_record ON audit_log(table_name, record_id);\n```\n\n## Best Practices\n\n1. **Always define PRIMARY KEY** - Every table needs one\n2. **Use foreign keys** - Enforce referential integrity\n3. **Add NOT NULL** - Unless the column is truly optional\n4. **Create indexes** - On foreign keys and frequently queried columns\n5. **Use appropriate types** - Don't store numbers as strings\n6. **Add timestamps** - `created_at` and `updated_at` are almost always useful\n7. **Name consistently** - `user_id` not `userId` or `UserID`\n8. **Avoid reserved words** - Don't name columns `order`, `user`, `group`\n\n## Migration Safety\n\nWhen modifying existing tables:\n\n```sql\n-- Safe: Adding nullable column\nALTER TABLE users ADD COLUMN phone VARCHAR(20);\n\n-- Safe: Adding column with default\nALTER TABLE users ADD COLUMN active BOOLEAN DEFAULT true;\n\n-- Caution: Adding NOT NULL (requires default or backfill)\nALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';\n\n-- Caution: Dropping column (data loss)\nALTER TABLE users DROP COLUMN old_column;\n\n-- Caution: Changing type (may fail on existing data)\nALTER TABLE users ALTER COLUMN age TYPE INTEGER;\n```\n","cli/external-plugin/whodb/skills/whodb/SKILL.md":"---\nname: whodb\ndescription: Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured.\n---\n\n# WhoDB Database Assistant\n\nYou have access to WhoDB for database operations. Use these tools and commands to help users with database tasks.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n### Database tools\n\nWhen database-only MCP is configured, use these tools directly:\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: List of connection names with type and source (env/saved).\n```\n\n### whodb_query\nExecute SQL queries against a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- query: SQL query to execute\n\nExample: whodb_query(connection=\"mydb\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### whodb_schemas\nList all schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n\nExample: whodb_schemas(connection=\"mydb\")\n```\n\n### whodb_tables\nList all tables in a schema.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- schema: Schema name (optional, uses default if not specified)\n\nExample: whodb_tables(connection=\"mydb\", schema=\"public\")\n```\n\n### whodb_columns\nDescribe columns in a table.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- table: Table name (required)\n- schema: Schema name (optional)\n\nExample: whodb_columns(connection=\"mydb\", table=\"users\")\n```\n\n## CLI Commands (Fallback)\n\nIf MCP tools are unavailable, use the CLI directly via Bash:\n\n### Query Execution\n```bash\nwhodb query \"SELECT * FROM users LIMIT 10\" --connection mydb --format json\n```\n\n### Schema Discovery\n```bash\n# List schemas\nwhodb schemas --connection mydb --format json\n\n# List tables\nwhodb tables --connection mydb --schema public --format json\n\n# Describe columns\nwhodb columns --connection mydb --table users --format json\n```\n\n### Connection Management\n```bash\n# List connections\nwhodb connections list --format json\n\n# Test connection\nwhodb connections test mydb\n\n# Add new connection (interactive)\nwhodb connections add --name mydb --type Postgres --host localhost --database mydb\n```\n\n### Data Export\n```bash\n# Export to CSV\nwhodb export --connection mydb --table users --output users.csv\n\n# Export query results\nwhodb export --connection mydb --query \"SELECT * FROM orders\" --output orders.xlsx\n```\n\n## Workflow Examples\n\n### Explore a New Database\n1. List connections: `whodb_connections`\n2. List schemas: `whodb_schemas(connection=\"name\")`\n3. List tables: `whodb_tables(connection=\"name\", schema=\"public\")`\n4. Describe table: `whodb_columns(connection=\"name\", table=\"users\")`\n5. Sample data: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\n### Answer Data Questions\n1. Understand the schema first - check table structure\n2. Write targeted queries with appropriate filters\n3. Always use LIMIT for exploratory queries\n4. Present results in a clear, readable format\n\n## Best Practices\n\n- **Always explore schema first** before writing queries\n- **Use LIMIT** for exploratory queries to avoid overwhelming output\n- **Prefer specific columns** over SELECT * for clarity\n- **Check foreign keys** via whodb_columns to understand relationships\n- **Use JSON format** (--format json) when parsing output programmatically\n- **Never expose credentials** - use connection names, not connection strings\n","cli/skills/whodb/SKILL.md":"---\nname: whodb\ndescription: Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured.\n---\n\n# WhoDB Database Assistant\n\nYou have access to WhoDB for database operations. Use these tools and commands to help users with database tasks.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n### Database tools\n\nWhen database-only MCP is configured, use these tools directly:\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: List of connection names with type and source (env/saved).\n```\n\n### whodb_query\nExecute SQL queries against a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- query: SQL query to execute\n\nExample: whodb_query(connection=\"mydb\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### whodb_schemas\nList all schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- include_tables: Set true to also return tables within each schema (optional)\n\nExample: whodb_schemas(connection=\"mydb\")\nExample: whodb_schemas(connection=\"mydb\", include_tables=true)\n```\n\n### whodb_tables\nList all tables in a schema.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- schema: Schema name (optional, uses default if not specified)\n- include_columns: Set true to also return column details for every table (optional)\n\nExample: whodb_tables(connection=\"mydb\", schema=\"public\")\nExample: whodb_tables(connection=\"mydb\", schema=\"public\", include_columns=true)\n```\n\n### whodb_columns\nDescribe columns in a table.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- table: Table name (required)\n- schema: Schema name (optional)\n\nExample: whodb_columns(connection=\"mydb\", table=\"users\")\n```\n\n## CLI Commands (Fallback)\n\nIf MCP tools are unavailable, use the CLI directly via Bash:\n\n### Query Execution\n```bash\nwhodb query \"SELECT * FROM users LIMIT 10\" --connection mydb --format json\n```\n\n### Schema Discovery\n```bash\n# List schemas\nwhodb schemas --connection mydb --format json\n\n# List tables\nwhodb tables --connection mydb --schema public --format json\n\n# Describe columns\nwhodb columns --connection mydb --table users --format json\n```\n\n### Connection Management\n```bash\n# List connections\nwhodb connections list --format json\n\n# Test connection\nwhodb connections test mydb\n\n# Add new connection (interactive)\nwhodb connections add --name mydb --type Postgres --host localhost --database mydb\n```\n\n### Data Export\n```bash\n# Export to CSV\nwhodb export --connection mydb --table users --output users.csv\n\n# Export query results\nwhodb export --connection mydb --query \"SELECT * FROM orders\" --output orders.xlsx\n```\n\n## Workflow Examples\n\n### Explore a New Database (Efficient)\n1. List connections: `whodb_connections`\n2. Get tables with columns in one call: `whodb_tables(connection=\"name\", include_columns=true)`\n3. Sample data: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\nQuery results include `column_types` alongside column names, so you know the data types without a separate call.\n\n### Explore a New Database (Multi-Schema)\n1. List connections: `whodb_connections`\n2. Get all schemas with tables: `whodb_schemas(connection=\"name\", include_tables=true)`\n3. Get columns for the schema you care about: `whodb_tables(connection=\"name\", schema=\"public\", include_columns=true)`\n4. Query: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\n### Answer Data Questions\n1. Understand the schema first - check table structure\n2. Write targeted queries with appropriate filters\n3. Always use LIMIT for exploratory queries\n4. Present results in a clear, readable format\n\n## Best Practices\n\n- **Always explore schema first** before writing queries\n- **Use LIMIT** for exploratory queries to avoid overwhelming output\n- **Prefer specific columns** over SELECT * for clarity\n- **Check foreign keys** via whodb_columns to understand relationships\n- **Use JSON format** (--format json) when parsing output programmatically\n- **Never expose credentials** - use connection names, not connection strings\n",".agents/skills/impeccable/SKILL.md":"---\nname: impeccable\ndescription: \"Use when the user wants to design, redesign, shape, critique, audit, polish, simplify, harden, animate, or otherwise improve a frontend interface: websites, landing pages, dashboards, product UI, components, forms, settings, onboarding, empty states, and native iOS or Android screens. Handles UX review, hierarchy, layout, typography, color, motion, UX copy, accessibility, responsive behavior, edge cases, and capturing or documenting design systems (DESIGN.md, tokens). Also for making bland UI bolder, loud UI quieter, or ambitious visual effects. Not for backend-only or non-UI tasks.\"\nmetadata:\n  version: 4.7.0\n---\n\nThis skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft.\n\nCore principles:\n- Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide.\n- Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, and patterns the visitor already knows earn their place.\n- Verify by looking at the rendered result at the sizes it ships at, and batch the checks: fix what one look shows before looking again, rather than screenshotting after every tweak.\n\n## Setup\n\n1. Run `<skill-base-dir>/scripts/impeccable context` once per session, where `<skill-base-dir>` is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. That base directory resolves every `.agents/skills/impeccable/scripts/impeccable <verb>` command in this skill and its references, and `.agents/skills/impeccable/scripts` is the fallback only when the runtime reports no base directory. On a Windows shell without `sh`, call `.agents/skills/impeccable/scripts/impeccable.cmd` instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as `--target <path>`. It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.\n2. Load the request's playbook: its Commands-table reference for an explicit/implied sub-command, or [reference/new-work.md](reference/new-work.md) for a new surface or replacement visual world. Inspect target and incumbent visual truth before editing. When the app cannot run, start with committed visual-regression goldens or screenshot fixtures; verify target and freshness against current tokens, CSS, components, or assets, resolve conflicts, and compare theme/variant captures.\n3. After resolving analysis and direction, read [reference/craft-floor.md](reference/craft-floor.md) immediately before any UI edit, including small refinements. It carries the quality floor, the absolute bans, and the reflexes no detector catches. Do not load it for planning-only work.\n\n**Launcher unavailable:** On refusal or failure, send a separate message **before the next tool call**: “Context loading did not run; I’ll read the existing project context directly.” Then read existing PRODUCT.md and DESIGN.md without inventing missing context, follow applicable steps 2–3, and continue through permitted tools. This applies to planning and editing; launcher failure alone does not block either.\n\n## How to design\n\n- **The brief wins.** Honor pinned aesthetics, eras, materials, fonts, and palettes even when they conflict with a saturated-pattern warning. Redirecting a clear brief toward your taste is failure.\n- **Refinement preserves; redesign replaces.** Refinement keeps the incumbent identity, behavior, copy, and everything outside scope. Ask before replacing factual copy or adding claims. Redesign keeps product truth, content, function, native affordances, and constraints, but treats the old look as evidence and anti-reference; choose a replacement world in new-work and replace DESIGN.md. Never split the difference into polish on the discarded look.\n- **Loaded symbols stay out of the decoration.** A subject's world does not license emblems tied to militarism, supremacy, or hate movements as motifs, badges, or ornament, such as the Rising Sun flag's rays, the Confederate battle flag, or Nazi-era insignia and their stylised variants; reach for that world's neutral forms instead. Content that documents such a symbol as fact stays as it is.\n- **Visual authority is evidence, not a filename.** Missing DESIGN.md alone does not make a project greenfield; new-work decides whether to preserve, expand, or replace the incumbent world.\n\n## Modes\n\nThe mode names what the visitor's success looks like on this surface.\n\n- **Persuade:** the visitor decides and acts; design is the product. Landing pages, marketing, campaigns, pricing. Earn attention and action. Ship real imagery when the brief needs it; follow the committed world, not category habit.\n- **Operate:** the visitor completes a task. App UI, dashboards, editors, admin, settings, tools. Scanability, consistency, native expectations, and the real usage scene outrank expression. Brand lives in precise details.\n- **Read:** the visitor understands something. Docs, articles, guides, help, changelogs. Structure for comprehension, then make the reading experience worth staying in.\n- **Experience:** the visitor is inside the work itself. Portfolios, galleries, showcases. Let the artifact lead from the first viewport; the interface recedes.\n\nChoose the mode from the requested surface, not the product, and persist it only in that surface brief. A tool's landing page is still Persuade; a fashion house's documentation is still Read; a docs index is Read, not Persuade. See [new-work.md](reference/new-work.md) for new surfaces and [operate.md](reference/operate.md) for deeper Operate/Read guidance.\n\n## Commands\n\n| Command | Category | Description | Reference |\n|---|---|---|---|\n| `craft [feature]` | Build | Deprecated alias for an ordinary new-work request | [reference/craft.md](reference/craft.md) |\n| `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) |\n| `init` | Build | Capture durable product context in PRODUCT.md | [reference/init.md](reference/init.md) |\n| `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) |\n| `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) |\n| `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) |\n| `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) · native: [reference/audit.native.md](reference/audit.native.md) |\n| `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) |\n| `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) |\n| `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) |\n| `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) |\n| `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) |\n| `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) |\n| `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) |\n| `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) |\n| `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) |\n| `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) |\n| `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) |\n| `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) |\n| `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) |\n| `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) · native: [reference/adapt.native.md](reference/adapt.native.md) |\n| `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) |\n| `live` | Iterate | Visual variant mode: pick elements in the browser, iterate on alternatives | [reference/live.md](reference/live.md) |\n| `generate [n] [action] [element]` | Iterate | Variants, versions, or alternatives of a named element to choose from in the live browser; no manual picking | [reference/generate.md](reference/generate.md) |\n\nRouting:\n\n- **No argument:** read [routing.md](reference/routing.md) and present its context-aware menu; never auto-run a command.\n- **Explicit or clearly implied request to run a command:** load its reference (native variant on native platforms) and follow it. Ask once if two commands fit.\n- **Workflow or command-selection question:** read [Workflow questions](reference/routing.md#workflow-questions).\n- **Otherwise:** treat the request as general design work. Missing PRODUCT.md routes a new surface or replacement world through init, then new-work; a narrow refinement of existing code proceeds on the incumbent implementation as `impeccable context` directs, offering init afterward rather than blocking on it.\n- `teach` aliases `init`. `craft` is a deprecated alias for ordinary new-work and adds nothing. `shape` owns task discovery, then enters new-work only for visual-world and surface-concept decisions.\n\nAfter init writes PRODUCT.md, resume without rerunning `impeccable context`; init loads the native platform reference itself when the platform it recorded is `ios`, `android`, or `adaptive`.\n\n**Pin / Unpin:** `.agents/skills/impeccable/scripts/impeccable pin <pin|unpin> <command>` creates or removes a standalone `$<command>` shortcut. Report the script's result concisely; relay stderr verbatim on error.\n\n**Hooks:** `$impeccable hooks <on|off|status|ignore-rule|ignore-file|ignore-value|reset>` manages the design detector hook for this project (auto-runs the detector after UI file edits and surfaces findings). Load [reference/hooks.md](reference/hooks.md) when the user invokes it with any argument.\n\n**Doctor:** `$impeccable doctor` reports and repairs drift between this project's Impeccable artifacts (PRODUCT.md, DESIGN.md and its sidecar, config, surface briefs, the hook) and what this version reads. Load [reference/doctor.md](reference/doctor.md) when the user invokes it, or when they ask what is out of date, stale, or needs refreshing. A `CONTEXT_STALE` directive in Setup's output is the cheap subset of the same report; act on it there per its own instructions rather than running doctor unasked.\n\n**Never repair drift as a side effect of a design task.** A `CONTEXT_STALE` finding is reported, not acted on, unless the user asks. The one exception is a finding marked `auto`, which the next write to that file performs anyway.","cli/external-plugin/openai-skills/whodb/SKILL.md":"---\nname: whodb\ndescription: \"Work with WhoDB platform hosts and project resources via MCP, including multiple environments, or query databases directly in database-only MCP mode.\"\nlicense: Apache-2.0\nmetadata:\n  author: clidey\n  version: \"0.106.0\"\ncompatibility: \"Requires Node.js (npx) or the whodb binary installed.\"\n---\n\n# WhoDB\n\nQuery databases, explore schemas, analyze data quality, and get optimization recommendations through the WhoDB MCP server.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n## Database-only MCP setup\n\nIf the WhoDB MCP server is not connected, set it up:\n\n1. Add the MCP server (npx, no install needed):\n   ```bash\n   codex mcp add whodb -- npx -y whodb mcp serve\n   ```\n\n2. Or if `whodb` is installed locally:\n   ```bash\n   codex mcp add whodb -- whodb mcp serve\n   ```\n\n3. Configure database connections via environment variables:\n   ```bash\n   export WHODB_POSTGRES='[{\"alias\":\"prod\",\"host\":\"localhost\",\"user\":\"user\",\"password\":\"pass\",\"database\":\"mydb\",\"port\":\"5432\"}]'\n   export WHODB_MYSQL_1='{\"alias\":\"dev\",\"host\":\"localhost\",\"user\":\"user\",\"password\":\"pass\",\"database\":\"devdb\",\"port\":\"3306\"}'\n   ```\n\nAfter adding the MCP server, restart Codex.\n\n## Available MCP Tools\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: connection names with type and source (env/saved).\n```\n\n### whodb_schemas\nList schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one exists)\n```\n\n### whodb_tables\nList tables in a schema.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional, uses default)\n```\n\n### whodb_columns\nDescribe table columns and types.\n```\nParameters:\n- connection: Connection name (optional)\n- table: Table name (required)\n- schema: Schema name (optional)\n```\n\n### whodb_query\nExecute SQL queries with security validation.\n```\nParameters:\n- connection: Connection name (optional)\n- query: SQL query to execute\n```\n\n### whodb_explain\nRun EXPLAIN for a SQL query.\n```\nParameters:\n- connection: Connection name (optional)\n- query: SQL query to analyze\n```\n\n### whodb_erd\nLoad graph/relationship metadata for ER diagrams.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional)\n```\n\n### whodb_diff\nCompare schema metadata between two connections.\n```\nParameters:\n- source: Source connection name (required)\n- target: Target connection name (required)\n```\n\n### whodb_audit\nRun data quality audits on a table.\n```\nParameters:\n- connection: Connection name (optional)\n- table: Table name (required)\n- schema: Schema name (optional)\n```\n\n### whodb_suggestions\nLoad backend-generated query suggestions for a connection.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional)\n```\n\n### whodb_confirm\nConfirm a pending write operation (only available in confirm-writes mode, which is the default).\n```\nParameters:\n- token: Confirmation token from a pending write\n```\n\n### whodb_pending\nList pending confirmation tokens.\n```\nNo parameters required.\n```\n\n## Standard Workflow\n\n### Step 1: Discover connections\n```\nwhodb_connections → list available databases\n```\n\n### Step 2: Explore schema\n```\nwhodb_schemas(connection=\"name\") → list schemas\nwhodb_tables(connection=\"name\", schema=\"public\") → list tables\nwhodb_columns(connection=\"name\", table=\"users\") → column details\n```\n\n### Step 3: Query data\n```\nwhodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### Step 4: Analyze (as needed)\n```\nwhodb_explain(connection=\"name\", query=\"SELECT ...\") → query plan\nwhodb_erd(connection=\"name\") → table relationships\nwhodb_audit(connection=\"name\", table=\"users\") → data quality\nwhodb_diff(source=\"prod\", target=\"staging\") → schema comparison\n```\n\n## Query Building\n\nWhen converting natural language to SQL:\n\n1. Always check schema first with `whodb_tables` and `whodb_columns`\n2. Match entities to table names, attributes to column names\n3. Identify foreign key joins from column metadata\n4. Use LIMIT for exploratory queries (default: 100)\n\n### Date handling varies by database\n\n| Intent | PostgreSQL | MySQL | SQLite |\n|--------|-----------|-------|--------|\n| Last 7 days | `>= NOW() - INTERVAL '7 days'` | `>= DATE_SUB(NOW(), INTERVAL 7 DAY)` | `>= DATE('now', '-7 days')` |\n| Start of month | `>= DATE_TRUNC('month', CURRENT_DATE)` | `>= DATE_FORMAT(NOW(), '%Y-%m-01')` | `>= DATE('now', 'start of month')` |\n\n## Security Modes\n\nThe MCP server defaults to confirm-writes mode (writes require confirmation via `whodb_confirm`).\n\n- `--read-only`: blocks all write operations\n- `--safe-mode`: read-only + strict security validation\n- `--allow-write`: full write access without confirmation\n\n## Safety Rules\n\n- Always explore schema before writing queries\n- Use LIMIT for exploratory queries\n- Prefer specific columns over SELECT *\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Never expose or log credentials\n- Use connection names, not connection strings\n",".codex/hooks.json":"{\n  \"hooks\": {\n    \"SessionStart\": [\n      {\n        \"matcher\": \"startup|resume\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/session-context.sh\\\"\",\n            \"statusMessage\": \"Loading session context\",\n            \"timeout\": 30\n          }\n        ]\n      }\n    ],\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"^apply_patch$|Edit|Write\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-format-go.sh\\\"\",\n            \"statusMessage\": \"Formatting Go files\",\n            \"timeout\": 60\n          },\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-lint-ts.sh\\\"\",\n            \"statusMessage\": \"Linting TypeScript files\",\n            \"timeout\": 120\n          },\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-graphql-codegen.sh\\\"\",\n            \"statusMessage\": \"Regenerating GraphQL types\",\n            \"timeout\": 300\n          }\n        ]\n      },\n      {\n        \"matcher\": \"Edit|Write|apply_patch\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"[ ! -f \\\".agents/skills/impeccable/scripts/impeccable\\\" ] || \\\".agents/skills/impeccable/scripts/impeccable\\\" hook\",\n            \"commandWindows\": \"cmd /c if exist \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" hook\",\n            \"timeout\": 5,\n            \"statusMessage\": \"Checking UI changes\"\n          }\n        ]\n      }\n    ],\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/verify-build.sh\\\"\",\n            \"statusMessage\": \"Verifying build / type-check\",\n            \"timeout\": 600\n          }\n        ]\n      },\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"[ ! -f \\\".agents/skills/impeccable/scripts/impeccable\\\" ] || \\\".agents/skills/impeccable/scripts/impeccable\\\" hook\",\n            \"commandWindows\": \"cmd /c if exist \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" hook\",\n            \"timeout\": 30,\n            \"statusMessage\": \"Design deep pass\"\n          }\n        ]\n      }\n    ]\n  }\n}\n","cli/external-plugin/whodb/skills/query-builder/SKILL.md":"---\nname: query-builder\ndescription: Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\".\n---\n\n# Query Builder\n\nConvert natural language questions into SQL queries using the database schema.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks questions like:\n- \"Show me all users who signed up last month\"\n- \"Find orders greater than $100\"\n- \"Which products have low inventory?\"\n- \"Get the top 10 customers by total spend\"\n\n## Workflow\n\n### 1. Understand the Schema\nBefore generating SQL, always check the table structure:\n\n```\nwhodb_tables(connection=\"...\") → Get available tables\nwhodb_columns(table=\"relevant_table\") → Get column names and types\n```\n\n### 2. Identify Intent\nParse the natural language request:\n- **Subject**: What entity? (users, orders, products)\n- **Filter**: What conditions? (last month, > $100, active)\n- **Aggregation**: Count, sum, average, max, min?\n- **Grouping**: By what dimension?\n- **Ordering**: Sort by what? Ascending/descending?\n- **Limit**: How many results?\n\n### 3. Map to Schema\n- Match entities to table names\n- Match attributes to column names\n- Identify foreign key joins needed\n\n### 4. Generate SQL\nBuild the query following SQL best practices:\n\n```sql\nSELECT columns\nFROM table\n[JOIN other_table ON condition]\nWHERE filters\n[GROUP BY columns]\n[HAVING aggregate_condition]\nORDER BY column [ASC|DESC]\nLIMIT n;\n```\n\n### 5. Execute and Present\n```\nwhodb_query(query=\"generated SQL\")\n```\n\n## Translation Patterns\n\n| Natural Language | SQL Pattern |\n|------------------|-------------|\n| \"last week/month/year\" | `WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK)` |\n| \"more than X\" / \"greater than X\" | `WHERE col > X` |\n| \"top N\" | `ORDER BY col DESC LIMIT N` |\n| \"how many\" | `SELECT COUNT(*)` |\n| \"total\" / \"sum of\" | `SELECT SUM(col)` |\n| \"average\" | `SELECT AVG(col)` |\n| \"for each\" / \"by\" | `GROUP BY col` |\n| \"between X and Y\" | `WHERE col BETWEEN X AND Y` |\n| \"contains\" / \"like\" | `WHERE col LIKE '%term%'` |\n| \"starts with\" | `WHERE col LIKE 'term%'` |\n| \"is empty\" / \"is null\" | `WHERE col IS NULL` |\n| \"is not empty\" | `WHERE col IS NOT NULL` |\n\n## Date Handling by Database\n\n### PostgreSQL\n```sql\nWHERE created_at >= NOW() - INTERVAL '7 days'\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\n```\n\n### MySQL\n```sql\nWHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)\nWHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')\n```\n\n### SQLite\n```sql\nWHERE created_at >= DATE('now', '-7 days')\nWHERE created_at >= DATE('now', 'start of month')\n```\n\n## Examples\n\n### \"Show me users who signed up this month\"\n```sql\nSELECT * FROM users\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\nORDER BY created_at DESC;\n```\n\n### \"Find the top 5 products by sales\"\n```sql\nSELECT p.name, SUM(oi.quantity) as total_sold\nFROM products p\nJOIN order_items oi ON p.id = oi.product_id\nGROUP BY p.id, p.name\nORDER BY total_sold DESC\nLIMIT 5;\n```\n\n### \"How many orders per customer?\"\n```sql\nSELECT customer_id, COUNT(*) as order_count\nFROM orders\nGROUP BY customer_id\nORDER BY order_count DESC;\n```\n\n## Safety Rules\n\n- Always use LIMIT for exploratory queries (default: 100)\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Warn if query might return large result sets\n- Use table aliases for readability in JOINs\n","CLAUDE.md":"@AGENTS.md\n\n## Claude Code\n\n- Use plan mode for multi-file, risky, architectural, or ambiguous changes.\n- Use subagents only for bounded sidecar work: exploration, review, test triage, or documentation lookup.\n- Prefer separate worktrees for parallel implementation sessions.\n- When a task touches `ee/`, follow `ee/AGENTS.md`; if running Claude Code inside `ee/`, `ee/CLAUDE.md` imports that overlay.\n","DESIGN.md":"---\nname: WhoDB\ndescription: Lightweight, fast database management with quiet confidence\ncolors:\n  background-light: \"#FAF5EC\"\n  background-dark: \"#0E2240\"\n  foreground-light: \"#0E2240\"\n  foreground-dark: \"#FAF5EC\"\n  card-light: \"#FFFFFF\"\n  card-dark: \"#162B4A\"\n  popover-light: \"#FFFFFF\"\n  popover-dark: \"#1D3151\"\n  muted-foreground-light: \"#5C6778\"\n  muted-foreground-dark: \"#9BA5B3\"\n  primary-light: \"#2C6BD4\"\n  primary-dark: \"#5091FD\"\n  accent-light: \"#EAF0FB\"\n  accent-dark: \"#233E69\"\n  border-light: \"#D9D4CB\"\n  border-dark: \"#314667\"\n  brand-orange: \"#F4781C\"\n  highlight-yellow: \"#FFC233\"\n  destructive-light: \"#E30117\"\n  destructive-dark: \"#FF6668\"\ntypography:\n  body:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1rem\"\n    fontWeight: 400\n    lineHeight: 1.5\n  label:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"0.875rem\"\n    fontWeight: 500\n    lineHeight: 1.4\n  title:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.25rem\"\n    fontWeight: 600\n    lineHeight: 1.3\n  headline:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.5rem\"\n    fontWeight: 600\n    lineHeight: 1.25\n  mono:\n    fontFamily: \"JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\"\n    fontSize: \"0.875rem\"\n    fontWeight: 400\nrounded:\n  sm: \"0.375rem\"\n  md: \"0.5rem\"\n  lg: \"0.625rem\"\n  xl: \"0.75rem\"\nspacing:\n  xs: \"0.5rem\"\n  sm: \"0.75rem\"\n  md: \"1rem\"\n  lg: \"1.5rem\"\n  xl: \"2rem\"\ncomponents:\n  button-primary:\n    backgroundColor: \"{colors.primary-light}\"\n    textColor: \"#FFFFFF\"\n    rounded: \"{rounded.md}\"\n    padding: \"0.5rem 1rem\"\n  button-ghost:\n    backgroundColor: \"transparent\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.md}\"\n  card:\n    backgroundColor: \"{colors.card-light}\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.lg}\"\n    padding: \"1rem\"\n---\n\n# Design System: WhoDB\n\n## Overview\n\n**Creative North Star: \"Quiet Confidence\"**\n\nWhoDB is a database management tool for people who already know what they're doing. The interface doesn't perform competence — it assumes it. Every surface exists to frame data, never to decorate it. All tokens flow from `@clidey/ux`'s Clidey brand kit (imported directly via `@import '@clidey/ux/brand.css'`): Paper/Ink dual-mode, Signal Blue as the product accent, Beacon Yellow as the single sanctioned highlight, Clidey Orange reserved for company-branded moments rather than general product UI.\n\nThe system explicitly rejects:\n- The cluttered, dated aesthetic of legacy database tools (phpMyAdmin, pgAdmin)\n- Corporate-gray enterprise bloat and wizard-driven flows\n- Mixed-hue decoration — more than one accent color competing on the same surface\n\n**Key Characteristics:**\n- Flat surfaces by default; depth comes from a lightness step between surfaces, not shadow or blur\n- Dual theme: Paper (light) and Ink (dark), both first-class\n- Hanken Grotesk carries the UI; Bricolage Grotesque is self-hosted and available (`brand-fonts.css`) but not currently applied anywhere in the product UI — treat it as reserved for a future display-heading use, not an active token\n- A user-facing density system (Settings) swaps font-size, radius, and spacing scales between small/medium/large and none/small/medium/large tiers respectively — the values below are the medium/default tier, not the only valid values\n- Token-driven styling via CSS custom properties from `@clidey/ux` — extend, don't override component internals with `!important`\n\n## Colors\n\nThe palette is Clidey's brand kit: Paper and Ink as the two surface worlds, Signal Blue as the product accent (lifts one lightness step in dark mode), Beacon Yellow as the single highlight, Clidey Orange reserved for company-branded emphasis.\n\n### Primary\n- **Signal Blue** (`#2C6BD4` light / `#5091FD` dark): Interactive affordances — buttons, links, focus rings, active states.\n\n### Secondary\n- **Clidey Orange** (`#F4781C`): Company-branded emphasis only, not general product UI. One accent per surface — don't mix with Signal Blue on the same card or banner.\n\n### Surfaces\n- **Background** (`#FAF5EC` Paper / `#0E2240` Ink): Page canvas, flat at rest.\n- **Card** (`#FFFFFF` light / `#162B4A` dark): One lightness step up from background.\n- **Popover** (`#FFFFFF` light / `#1D3151` dark): Menus, dropdowns, tooltips.\n\n### Borders\n- **Light mode:** `#D9D4CB`\n- **Dark mode:** `#314667`\n\n### Text\n- **Foreground** (`#0E2240` light / `#FAF5EC` dark): Primary body text.\n- **Muted Foreground** (`#5C6778` light / `#9BA5B3` dark): Secondary text, labels, descriptions. Always verify contrast against the actual surface the text sits on (`--card`, not just `--background`) — the dark-mode value was raised earlier after measuring under WCAG AA against `--card`.\n\n### Named Rules\n**The One-Accent Rule.** A single surface uses exactly one accent hue at a time. Blue leads product UI; orange leads company-branded moments. They do not mix on the same card or banner.\n\n## Typography\n\n**Primary Font:** Hanken Grotesk (with Inter, then system sans-serif fallback)\n**Mono Font:** JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\n\n**Character:** Single active UI typeface. Bricolage Grotesque is self-hosted alongside Hanken Grotesk but not wired into any component today — don't assume it renders anywhere until it's actually applied to an element.\n\n### Hierarchy (medium density tier — the default)\n- **3xl** (600, 1.875rem/30px): Rare hero text.\n- **2xl** (600, 1.5rem/24px): Headline.\n- **xl** (600, 1.25rem/20px): Title/section headers.\n- **lg** (500, 1.125rem/18px): Card titles, dialog headers.\n- **base** (400, 1rem/16px): Primary body text.\n- **sm** (400, 0.875rem/14px): Secondary text, labels.\n- **xs** (400, 0.75rem/12px): Metadata, captions.\n\n### Named Rules\n**The Density-Tier Rule.** Font sizes, radius, and spacing are all user-adjustable via Settings (small/medium/large tiers). Don't hardcode a pixel value where a `var(--font-size-*)`/`var(--radius-*)`/`var(--spacing-*)` token exists — hardcoding breaks the density switch for that element.\n\n## Layout\n\nSpacing follows a `--spacing-{xs,sm,md,lg,xl,2xl,3xl}` scale, adjustable via the same density system (compact/comfortable/spacious tiers; comfortable is the default: 8/12/16/24/32/40/48px).\n\n## Elevation & Depth\n\nFlat by default — no shadow at rest. Depth is a lightness step between `--background` → `--card` → `--popover`, not an elevation effect.\n\n## Shapes\n\nRadius follows a `--radius-{sm,md,lg,xl}` scale derived from a single `--radius` primitive (`calc()`-based: sm = radius−4px, md = radius−2px, lg = radius, xl = radius+4px), also swappable via the density system. Medium/default: `--radius: 0.625rem` (10px), giving sm 6px / md 8px / lg 10px / xl 14px.\n\n## Components\n\nInteractive components are sourced from `@clidey/ux`. The app extends them through CSS custom properties in `frontend/src/index.css` and the density-mapping variables in `theme-customization.ts` — never by overriding component internals with `!important`.\n\n### Buttons\n- **Shape:** `{rounded.md}`\n- **Primary:** Signal Blue background, contrast-checked text.\n- **Ghost:** Transparent background, foreground text.\n\n### Cards\n- **Corner Style:** `{rounded.lg}`\n- **Background:** `var(--card)`, flat, no shadow at rest.\n\n### Icon tiles\n- **Pairing rule:** an icon tile's background token and its icon/text color token must be from different roles (e.g. `bg-icon` + `text-icon-foreground`, not `bg-icon` + `text-primary`) — a prior bug painted blue icon glyphs on a blue tile background because both referenced the same hue family. Always check the foreground/background pairing when introducing a new tinted tile.\n\n## Do's and Don'ts\n\n### Do:\n- **Do** use flat, token-driven backgrounds for all static surfaces.\n- **Do** use `var(--font-size-*)`, `var(--radius-*)`, and `var(--spacing-*)` tokens rather than hardcoded values, so the density-customization system keeps working.\n- **Do** respect both themes equally — verify contrast against the actual surface text sits on.\n- **Do** extend `@clidey/ux` via CSS custom properties, never by overriding component styles with `!important`.\n\n### Don't:\n- **Don't** mix Signal Blue and Clidey Orange on the same surface.\n- **Don't** add drop shadows to cards or containers at rest.\n- **Don't** assume Bricolage Grotesque renders anywhere — it's self-hosted but unused; Hanken Grotesk is the only active UI typeface.\n- **Don't** pair a tinted tile's background and foreground from the same color role (see the icon-tile bug above).\n- **Don't** use hardcoded color values (`bg-white`, `dark:bg-gray-800`). Use semantic tokens.\n","AGENTS.md":"# WhoDB Development Guide\n\nWhoDB is a source-first data management tool. The public GraphQL API and frontend\ncontract are built around `SourceType`, `SourceContract`, `SourceObject`,\n`SourceObjectRef`, and `SourceSessionMetadata`. The current execution layer is\nstill powered mainly by database plugins under `core/src/plugins/`.\n\n`AGENTS.md` is the canonical agent instruction file for this repository. Tool-\nspecific files such as `CLAUDE.md` should import or point to this file instead\nof duplicating these instructions.\n\nIf the `ee/` directory is present, read `ee/AGENTS.md` for additional context. Do not add any code, comments, or references to `ee/` in the CE codebase.\n\n## Git Commits — Hard Rule\n\n**Never commit to `main` (or any branch) without the user explicitly saying \"please commit this for me\" (or unambiguously equivalent wording) in that turn.** This applies regardless of task framing — \"merge it into main locally\" or \"just write the code changes in main\" means apply the file changes on that branch, not create a commit. If committing seems necessary to accomplish what was asked (e.g. to merge a branch), stop and ask first instead of assuming consent.\n\n## Terminology\n\n- **\"EE agent\" / \"ee agent\"** means the in-app WhoDB EE browser AI agent feature (under `ee/`), NOT the coding-agent (Claude/Codex) configuration or any MCP server. When in doubt, ask which is meant before acting.\n\n## Non-Negotiable Rules\n\n1. **GraphQL-first** - All new API functionality via GraphQL. Never add HTTP resolvers unless explicitly needed (e.g., file downloads)\n2. **No SQL injection** - Never use `fmt.Sprintf` with user input for SQL. Use parameterized queries or GORM builders. See `.agents/docs/sql-security.md`\n3. **Plugin architecture** - Never use `switch dbType` or `if dbType ==` in shared code. All database-specific logic goes in plugins. See `.agents/docs/plugin-architecture.md`\n4. **Documentation requirements** - All exported Go functions/types need doc comments. All exported TypeScript functions/components need JSDoc. See `.agents/docs/documentation.md`\n5. **Localization requirements** - All user-facing strings must use `t()` with YAML keys. No fallback strings. No hardcoded UI text. When adding or updating keys, edit `en_US` only unless the user explicitly asks for other languages. See `.agents/docs/localization.md`\n6. **Verify before completing** - For non-trivial tasks, define success criteria before editing. After finishing, verify: (1) type checks pass (`pnpm run build:ce` for frontend, `go build ./cmd/whodb` for backend), (2) no linting errors, (3) all added code is actually used (no dead code). See `.agents/docs/verification.md`\n7. **Show proof** - When making a claim about how something outside of our codebase works, for example a 3rd party library or function, always provide official documentation or the actual code to back that up. Check online if you have to.\n\n## Behavioral Guidelines\n\nThese guidelines reduce common LLM coding mistakes. They bias toward caution over speed — for trivial tasks, use judgment.\n\n### 1. Think Before Coding\n\n**Don't assume. Don't hide confusion. Surface tradeoffs.**\n\nBefore implementing:\n- State your assumptions explicitly. If uncertain, ask.\n- If multiple interpretations exist, present them — don't pick silently.\n- If a simpler approach exists, say so. Push back when warranted.\n- If something is unclear, stop. Name what's confusing. Ask.\n\n### 2. Simplicity First\n\n**Minimum code that solves the problem. Nothing speculative.**\n\n- No features beyond what was asked.\n- No abstractions for single-use code.\n- No \"flexibility\" or \"configurability\" that wasn't requested.\n- No error handling for impossible scenarios.\n- No fallback logic unless explicitly asked — if you think it's needed, ask first.\n- No defensive programming — if an edge case needs handling, ask first.\n- If you write 200 lines and it could be 50, rewrite it.\n- Right-size architecture. Start with the simplest surgical fix. Do not propose heavyweight patterns (Temporal workflows, outbox, saga, new infra) unless the simple fix is shown to be insufficient — and explain why before building it.\n\nAsk yourself: \"Would a senior engineer say this is overcomplicated?\" If yes, simplify.\n\n### 3. Surgical Changes\n\n**Touch only what you must. Clean up only your own mess.**\n\nWhen editing existing code:\n- Don't \"improve\" adjacent code, comments, or formatting.\n- Don't refactor things that aren't broken.\n- Match existing style, even if you'd do it differently.\n- If you notice unrelated dead code, mention it — don't delete it.\n\nWhen your changes create orphans:\n- Remove imports/variables/functions that YOUR changes made unused.\n- Don't remove pre-existing dead code unless asked.\n\nThe test: Every changed line should trace directly to the user's request.\n\n### 4. Goal-Driven Execution\n\n**Define success criteria. Loop until verified.**\n\nTransform tasks into verifiable goals:\n- \"Add validation\" → \"Write tests for invalid inputs, then make them pass\"\n- \"Fix the bug\" → \"Write a test that reproduces it, then make it pass\"\n- \"Refactor X\" → \"Ensure tests pass before and after\"\n\nFor debugging, confirm the root cause with evidence (a log, trace, or minimal repro) before changing code. Don't fix-and-see; if the first fix doesn't hold, re-diagnose rather than trying another speculative fix.\n\nFor multi-step tasks, state a brief plan:\n```\n1. [Step] → verify: [check]\n2. [Step] → verify: [check]\n3. [Step] → verify: [check]\n```\n\nStrong success criteria let you loop independently. Weak criteria (\"make it work\") require constant clarification.\n\n### 5. CSS and Styling Changes\n\n**Diagnose before editing. One targeted change at a time.**\n\n- For a styling fix, state the specific approach (which selector/property/value and why) before editing.\n- Make one targeted change at a time; don't broadly rewrite styles speculatively.\n- If a styling fix fails twice, stop and ask for guidance (or a reference screenshot / exact value) rather than continuing to guess.\n\n## Execution Workflow\n\nFor non-trivial tasks, use a short goal-driven loop:\n\n1. Identify the expected behavior or failure path.\n2. Choose the smallest change that satisfies the request.\n3. Add or update focused tests when the behavior is testable and the risk justifies it.\n4. Run the relevant verification commands and inspect the diff before finishing.\n\n## Agent Operating Model\n\n- Treat `AGENTS.md` as the shared source of truth for Codex, Claude Code via import, opencode, Pi, and other compatible coding agents.\n- Use `.agents/README.md` as the index for deeper agent guidance, and read only the relevant linked file before editing.\n- Keep always-loaded instructions concise. Move detailed workflows, checklists, and runbooks into linked docs rather than duplicating them in tool-specific files.\n- Use planning mode for multi-file, risky, architectural, or ambiguous changes. Skip formal plans for obvious single-purpose edits.\n- Use separate agents only for bounded sidecar work such as codebase exploration, review, test triage, or documentation lookup. Do not delegate blocking implementation work when the main session is waiting on it.\n- Do not run parallel implementation sessions against the same files. Use separate worktrees or explicitly disjoint file ownership for parallel work.\n- Ask review-oriented agents to find correctness, regression, security, and missing-test issues first; summaries are secondary.\n\n## Project Structure\n\n```\ncore/                   # Backend (Go)\n  cmd/whodb/main.go     # Entry point — imports plugins and creates GraphQL schema\n  src/app/app.go        # AppConfig + Run() — shared server logic\n  src/src.go            # Engine initialization (collects from global plugin registry)\n  src/engine/registry.go # Global plugin registry (plugins self-register via init())\n  src/engine/plugin.go  # PluginFunctions interface\n  src/source/           # Source-first public contract + connector/session interfaces\n  src/sourcecatalog/    # Public source catalog exposed to GraphQL/frontend\n  src/dbcatalog/        # Internal connectable-database catalog adapted into sourcecatalog\n  src/env/              # Environment variable declarations (pure, no log dependency)\n  src/envconfig/        # Config-loading functions that need both env and log\n  src/plugins/          # Database connectors (each has init() calling engine.RegisterPlugin)\n                        # Includes: postgres, mysql, sqlite3, mongodb, redis, elasticsearch,\n                        #           clickhouse, duckdb, memcached (+ mariadb via mysql)\n  graph/schema.graphqls # GraphQL schema\n  graph/*.resolvers.go  # GraphQL resolvers\n\nfrontend/               # React/TypeScript (uses @clidey/ux component library)\n  src/index.tsx        # Entry point\n  src/store/           # Redux Toolkit state\n  src/generated/       # GraphQL codegen output (@graphql alias)\n\ncli/                    # Interactive TUI CLI (Bubble Tea)\nsdk/                    # Platform SDKs (npm @clidey/whodb-sdk, PyPI whodb) — own pnpm\n                        # project; wire cores generated from sdk/spec/ (see sdk/README.md)\ndesktop-ce/             # Desktop app (Wails)\ndesktop-common/         # Shared desktop code\n\n.github/workflows/      # CI/CD pipelines (release, build, deploy)\n```\n\nAdditional agent docs: `.agents/docs/build-and-run.md` (CE setup and generation), `.agents/docs/data-sources.md` (adding data sources), `.agents/docs/cli.md` (CLI), `.agents/docs/desktop.md` (desktop), `.agents/docs/ci-cd.md` (GitHub Actions), `.agents/docs/testing.md` (testing), `.agents/docs/analytics.md` (PostHog analytics contract). EE-specific source additions are in `ee/.agents/docs/data-sources.md`.\n\n## Testing\n\nSee `.agents/docs/testing.md` for comprehensive testing documentation including:\n- Frontend Playwright E2E tests\n- Docker container setup for test databases\n- Go backend unit and integration tests\n- CLI tests\n\nQuick reference:\n```bash\n# Frontend Playwright E2E\ncd frontend && pnpm e2e:ce:headless         # Headless (all databases)\ncd frontend && pnpm e2e:ce                  # Interactive (headed)\n\n# Backend Go tests\nbash dev/run-backend-tests.sh all           # Unit + integration\n\n# CLI tests\nbash dev/run-cli-tests.sh                   # All CLI tests\n```\n\n## Domain-Specific Guidelines\n\nFor language-specific or domain-specific guidelines, refer to the shared rules in `.agents/rules/`:\n- Go Backend (`core/`, `cli/`): `.agents/rules/go-backend.md`\n- React Frontend (`frontend/`): `.agents/rules/react-frontend.md`\n- GraphQL (`**/graph/`, `**/*.graphqls`): `.agents/rules/graphql.md`\n- Localization (`**/locales/`): `.agents/rules/localization.md`\n- E2E Tests (`frontend/e2e/`): `.agents/rules/e2e-tests.md`\n- Desktop (`desktop-ce/`, `desktop-common/`): `.agents/rules/desktop.md`\n- CI/CD (`.github/`): `.agents/rules/ci-cd.md`\n\n## Procedures\n\nFor multi-step tasks, follow the step-by-step workflows in `.agents/workflows/`. Read the relevant file before starting:\n\n| Task | Guide |\n|------|-------|\n| Add a new database plugin | `.agents/workflows/new-plugin.md` |\n| Add a GraphQL query/mutation end-to-end | `.agents/workflows/new-graphql-field.md` |\n| Add a new frontend page | `.agents/workflows/new-frontend-page.md` |\n| Add or update translation keys | `.agents/workflows/add-translation.md` |\n| Add a CLI command or TUI view | `.agents/workflows/cli-feature.md` |\n| Add or modify desktop app functionality | `.agents/workflows/desktop-feature.md` |\n| Add a platform-constrained HTTP handler | `.agents/workflows/platform-constrained-handler.md` |\n| Prepare or consume a handoff | `.agents/workflows/task-handoff.md` |\n| Prove claims about external behavior | `.agents/workflows/research-proof.md` |\n| Pre-commit verification | `.agents/workflows/review-checklist.md` |\n\n## When Updating Dependencies\n\nUse `core/go.mod` as the reference point for dependency versions.\n\n## Commands Quick Reference\n\nSee `.agents/docs/commands.md` for full reference.\n\n```bash\n# Backend: cd core && go run ./cmd/whodb\n# Frontend: cd frontend && pnpm start\n# CLI: cd cli && go run .\n```\n\n## Architecture\n\n- **Plugin self-registration** — each plugin has `init() { engine.RegisterPlugin(...) }`. The entry point's blank imports control which plugins are registered\n- **Source-first public API** — new public GraphQL/frontend work should use `SourceTypes`, `SourceProfiles`, `SourceFieldOptions`, `SourceSessionMetadata`, `SourceObjects`, `SourceRows`, `RunSourceQuery`, and `SourceGraph`. Do not add new public `Database*` queries or capability surfaces\n- **AppConfig DI** — `core/src/app/app.go` defines `AppConfig` (schema, HTTP handlers). The entry point calls `app.Run(config, staticFiles)`\n- **HTTP route extensions** — CE-owned HTTP routes live in `core/graph/SetupHTTPServer`. Edition or platform add-ons register their own non-GraphQL routes with `graph.RegisterHTTPRoutes`; do not add add-on route names or unsupported stubs to CE.\n- **Frontend registries** — components (`registerComponent`), source types (`registerSourceTypeOverrides`), icons (`registerIcons`), and source utilities (`registerSourceUtilities`) can be registered at boot. The frontend renders from registries — if something isn't registered, it's not shown\n- **Import cycle note** — `src` → `router` → `graph` → `src` cycle exists. `Run()` lives in `src/app/` (not `src/`) to avoid it. Never add router/graph imports to `src/`\n\n## Development Principles\n\n- Clean, readable code over clever code\n- Prefer existing style and local helper APIs over new abstractions\n- Only comment edge cases and complex logic, not obvious code\n- Maintain professional, neutral tone without excessive enthusiasm\n","cli/plugin.json":"# cli Plugin Manifest\n\nPath: `cli/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/plugin.json)",".agents/rules/ci-cd.md":"# Rules Skill\n\nPath: `.agents/rules/ci-cd.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/ci-cd.md)",".agents/rules/desktop.md":"# Rules Skill\n\nPath: `.agents/rules/desktop.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/desktop.md)",".agents/rules/e2e-tests.md":"# Rules Skill\n\nPath: `.agents/rules/e2e-tests.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/e2e-tests.md)",".agents/rules/go-backend.md":"# Rules Skill\n\nPath: `.agents/rules/go-backend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/go-backend.md)",".agents/rules/graphql.md":"# Rules Skill\n\nPath: `.agents/rules/graphql.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/graphql.md)",".agents/rules/localization.md":"# Rules Skill\n\nPath: `.agents/rules/localization.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/localization.md)",".agents/rules/react-frontend.md":"# Rules Skill\n\nPath: `.agents/rules/react-frontend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/react-frontend.md)","cli/agents/database-analyst.md":"# Subagent: database-analyst\n\nPath: `cli/agents/database-analyst.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/database-analyst.md)","cli/agents/query-optimizer.md":"# Subagent: query-optimizer\n\nPath: `cli/agents/query-optimizer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/query-optimizer.md)","cli/agents/report-generator.md":"# Subagent: report-generator\n\nPath: `cli/agents/report-generator.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/report-generator.md)",".agents/skills/impeccable/scripts/command-metadata.json":"# Scripts Skill\n\nPath: `.agents/skills/impeccable/scripts/command-metadata.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/scripts/command-metadata.json)",".agents/skills/impeccable/reference/adapt.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.md)",".agents/skills/impeccable/reference/adapt.native.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.native.md)",".agents/skills/impeccable/reference/android.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/android.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/android.md)",".agents/skills/impeccable/reference/animate.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/animate.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/animate.md)",".agents/skills/impeccable/reference/audit.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.md)",".agents/skills/impeccable/reference/audit.native.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.native.md)",".agents/skills/impeccable/reference/bolder.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/bolder.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/bolder.md)",".agents/skills/impeccable/reference/clarify.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/clarify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/clarify.md)",".agents/skills/impeccable/reference/colorize.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/colorize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/colorize.md)",".agents/skills/impeccable/reference/craft.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft.md)",".agents/skills/impeccable/reference/craft-floor.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft-floor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft-floor.md)",".agents/skills/impeccable/reference/critique.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/critique.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/critique.md)",".agents/skills/impeccable/reference/delight.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/delight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/delight.md)",".agents/skills/impeccable/reference/distill.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/distill.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/distill.md)",".agents/skills/impeccable/reference/doctor.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/doctor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/doctor.md)",".agents/skills/impeccable/reference/document.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/document.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/document.md)",".agents/skills/impeccable/reference/extract.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/extract.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/extract.md)",".agents/skills/impeccable/reference/harden.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/harden.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/harden.md)",".agents/skills/impeccable/reference/hooks.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/hooks.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/hooks.md)",".agents/skills/impeccable/reference/init.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/init.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/init.md)",".agents/skills/impeccable/reference/ios.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/ios.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/ios.md)",".agents/skills/impeccable/reference/layout.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/layout.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/layout.md)",".agents/skills/impeccable/reference/live.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/live.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live.md)",".agents/skills/impeccable/reference/live-setup.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/live-setup.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live-setup.md)",".agents/skills/impeccable/reference/new-work.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/new-work.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/new-work.md)",".agents/skills/impeccable/reference/onboard.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/onboard.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/onboard.md)",".agents/skills/impeccable/reference/operate.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/operate.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/operate.md)",".agents/skills/impeccable/reference/optimize.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/optimize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/optimize.md)",".agents/skills/impeccable/reference/overdrive.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/overdrive.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/overdrive.md)",".agents/skills/impeccable/reference/polish.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/polish.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/polish.md)",".agents/skills/impeccable/reference/quieter.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/quieter.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/quieter.md)",".agents/skills/impeccable/reference/routing.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/routing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/routing.md)",".agents/skills/impeccable/reference/shape.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/shape.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/shape.md)",".agents/skills/impeccable/reference/typeset.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/typeset.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/typeset.md)",".agents/skills/impeccable/reference/visualize.md":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/visualize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/visualize.md)",".agents/skills/impeccable/agents/openai.yaml":"# Agents Skill\n\nPath: `.agents/skills/impeccable/agents/openai.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/agents/openai.yaml)","cli/external-plugin/whodb/.claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `cli/external-plugin/whodb/.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/.claude-plugin/plugin.json)","cli/external-plugin/whodb/agents/database-analyst.md":"# Subagent: database-analyst\n\nPath: `cli/external-plugin/whodb/agents/database-analyst.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/database-analyst.md)","cli/external-plugin/whodb/agents/query-optimizer.md":"# Subagent: query-optimizer\n\nPath: `cli/external-plugin/whodb/agents/query-optimizer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/query-optimizer.md)","cli/external-plugin/whodb/agents/report-generator.md":"# Subagent: report-generator\n\nPath: `cli/external-plugin/whodb/agents/report-generator.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/report-generator.md)","cli/npm-package/packages/whodb-cli-win32-x64/package.json":"# Whodb-cli-win32-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/package.json)","cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml":"# Whodb-cli-win32-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-win32-arm64/package.json":"# Whodb-cli-win32-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/package.json)","cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml":"# Whodb-cli-win32-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-linux-x64/package.json":"# Whodb-cli-linux-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/package.json)","cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml":"# Whodb-cli-linux-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-linux-arm64/package.json":"# Whodb-cli-linux-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/package.json)","cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml":"# Whodb-cli-linux-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-linux-arm/package.json":"# Whodb-cli-linux-arm Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/package.json)","cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml":"# Whodb-cli-linux-arm Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-darwin-x64/package.json":"# Whodb-cli-darwin-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/package.json)","cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml":"# Whodb-cli-darwin-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli-darwin-arm64/package.json":"# Whodb-cli-darwin-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/package.json)","cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml":"# Whodb-cli-darwin-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli/package.json":"# Whodb-cli Skill\n\nPath: `cli/npm-package/packages/whodb-cli/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/package.json)","cli/npm-package/packages/whodb-cli/pnpm-lock.yaml":"# Whodb-cli Skill\n\nPath: `cli/npm-package/packages/whodb-cli/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/pnpm-lock.yaml)","cli/npm-package/packages/whodb-cli/README.md":"# whodb-cli Documentation\n\nPath: `cli/npm-package/packages/whodb-cli/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/README.md)",".agents/skills/impeccable/reference/degraded/asset-producer.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/asset-producer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/asset-producer.md)",".agents/skills/impeccable/reference/degraded/documenter.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/documenter.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/documenter.md)",".agents/skills/impeccable/reference/degraded/finish-reviewer.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/finish-reviewer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/finish-reviewer.md)",".agents/skills/impeccable/reference/degraded/manual-edit-applier.md":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/manual-edit-applier.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/manual-edit-applier.md)","cli/external-plugin/openai-skills/whodb/agents/openai.yaml":"# Agents Skill\n\nPath: `cli/external-plugin/openai-skills/whodb/agents/openai.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/openai-skills/whodb/agents/openai.yaml)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# WhoDB Development Guide\n\nWhoDB is a source-first data management tool. The public GraphQL API and frontend\ncontract are built around `SourceType`, `SourceContract`, `SourceObject`,\n`SourceObjectRef`, and `SourceSessionMetadata`. The current execution layer is\nstill powered mainly by database plugins under `core/src/plugins/`.\n\n`AGENTS.md` is the canonical agent instruction file for this repository. Tool-\nspecific files such as `CLAUDE.md` should import or point to this file instead\nof duplicating these instructions.\n\nIf the `ee/` directory is present, read `ee/AGENTS.md` for additional context. Do not add any code, comments, or references to `ee/` in the CE codebase.\n\n## Git Commits — Hard Rule\n\n**Never commit to `main` (or any branch) without the user explicitly saying \"please commit this for me\" (or unambiguously equivalent wording) in that turn.** This applies regardless of task framing — \"merge it into main locally\" or \"just write the code changes in main\" means apply the file changes on that branch, not create a commit. If committing seems necessary to accomplish what was asked (e.g. to merge a branch), stop and ask first instead of assuming consent.\n\n## Terminology\n\n- **\"EE agent\" / \"ee agent\"** means the in-app WhoDB EE browser AI agent feature (under `ee/`), NOT the coding-agent (Claude/Codex) configuration or any MCP server. When in doubt, ask which is meant before acting.\n\n## Non-Negotiable Rules\n\n1. **GraphQL-first** - All new API functionality via GraphQL. Never add HTTP resolvers unless explicitly needed (e.g., file downloads)\n2. **No SQL injection** - Never use `fmt.Sprintf` with user input for SQL. Use parameterized queries or GORM builders. See `.agents/docs/sql-security.md`\n3. **Plugin architecture** - Never use `switch dbType` or `if dbType ==` in shared code. All database-specific logic goes in plugins. See `.agents/docs/plugin-architecture.md`\n4. **Documentation requirements** - All exported Go functions/types need doc comments. All exported TypeScript functions/components need JSDoc. See `.agents/docs/documentation.md`\n5. **Localization requirements** - All user-facing strings must use `t()` with YAML keys. No fallback strings. No hardcoded UI text. When adding or updating keys, edit `en_US` only unless the user explicitly asks for other languages. See `.agents/docs/localization.md`\n6. **Verify before completing** - For non-trivial tasks, define success criteria before editing. After finishing, verify: (1) type checks pass (`pnpm run build:ce` for frontend, `go build ./cmd/whodb` for backend), (2) no linting errors, (3) all added code is actually used (no dead code). See `.agents/docs/verification.md`\n7. **Show proof** - When making a claim about how something outside of our codebase works, for example a 3rd party library or function, always provide official documentation or the actual code to back that up. Check online if you have to.\n\n## Behavioral Guidelines\n\nThese guidelines reduce common LLM coding mistakes. They bias toward caution over speed — for trivial tasks, use judgment.\n\n### 1. Think Before Coding\n\n**Don't assume. Don't hide confusion. Surface tradeoffs.**\n\nBefore implementing:\n- State your assumptions explicitly. If uncertain, ask.\n- If multiple interpretations exist, present them — don't pick silently.\n- If a simpler approach exists, say so. Push back when warranted.\n- If something is unclear, stop. Name what's confusing. Ask.\n\n### 2. Simplicity First\n\n**Minimum code that solves the problem. Nothing speculative.**\n\n- No features beyond what was asked.\n- No abstractions for single-use code.\n- No \"flexibility\" or \"configurability\" that wasn't requested.\n- No error handling for impossible scenarios.\n- No fallback logic unless explicitly asked — if you think it's needed, ask first.\n- No defensive programming — if an edge case needs handling, ask first.\n- If you write 200 lines and it could be 50, rewrite it.\n- Right-size architecture. Start with the simplest surgical fix. Do not propose heavyweight patterns (Temporal workflows, outbox, saga, new infra) unless the simple fix is shown to be insufficient — and explain why before building it.\n\nAsk yourself: \"Would a senior engineer say this is overcomplicated?\" If yes, simplify.\n\n### 3. Surgical Changes\n\n**Touch only what you must. Clean up only your own mess.**\n\nWhen editing existing code:\n- Don't \"improve\" adjacent code, comments, or formatting.\n- Don't refactor things that aren't broken.\n- Match existing style, even if you'd do it differently.\n- If you notice unrelated dead code, mention it — don't delete it.\n\nWhen your changes create orphans:\n- Remove imports/variables/functions that YOUR changes made unused.\n- Don't remove pre-existing dead code unless asked.\n\nThe test: Every changed line should trace directly to the user's request.\n\n### 4. Goal-Driven Execution\n\n**Define success criteria. Loop until verified.**\n\nTransform tasks into verifiable goals:\n- \"Add validation\" → \"Write tests for invalid inputs, then make them pass\"\n- \"Fix the bug\" → \"Write a test that reproduces it, then make it pass\"\n- \"Refactor X\" → \"Ensure tests pass before and after\"\n\nFor debugging, confirm the root cause with evidence (a log, trace, or minimal repro) before changing code. Don't fix-and-see; if the first fix doesn't hold, re-diagnose rather than trying another speculative fix.\n\nFor multi-step tasks, state a brief plan:\n```\n1. [Step] → verify: [check]\n2. [Step] → verify: [check]\n3. [Step] → verify: [check]\n```\n\nStrong success criteria let you loop independently. Weak criteria (\"make it work\") require constant clarification.\n\n### 5. CSS and Styling Changes\n\n**Diagnose before editing. One targeted change at a time.**\n\n- For a styling fix, state the specific approach (which selector/property/value and why) before editing.\n- Make one targeted change at a time; don't broadly rewrite styles speculatively.\n- If a styling fix fails twice, stop and ask for guidance (or a reference screenshot / exact value) rather than continuing to guess.\n\n## Execution Workflow\n\nFor non-trivial tasks, use a short goal-driven loop:\n\n1. Identify the expected behavior or failure path.\n2. Choose the smallest change that satisfies the request.\n3. Add or update focused tests when the behavior is testable and the risk justifies it.\n4. Run the relevant verification commands and inspect the diff before finishing.\n\n## Agent Operating Model\n\n- Treat `AGENTS.md` as the shared source of truth for Codex, Claude Code via import, opencode, Pi, and other compatible coding agents.\n- Use `.agents/README.md` as the index for deeper agent guidance, and read only the relevant linked file before editing.\n- Keep always-loaded instructions concise. Move detailed workflows, checklists, and runbooks into linked docs rather than duplicating them in tool-specific files.\n- Use planning mode for multi-file, risky, architectural, or ambiguous changes. Skip formal plans for obvious single-purpose edits.\n- Use separate agents only for bounded sidecar work such as codebase exploration, review, test triage, or documentation lookup. Do not delegate blocking implementation work when the main session is waiting on it.\n- Do not run parallel implementation sessions against the same files. Use separate worktrees or explicitly disjoint file ownership for parallel work.\n- Ask review-oriented agents to find correctness, regression, security, and missing-test issues first; summaries are secondary.\n\n## Project Structure\n\n```\ncore/                   # Backend (Go)\n  cmd/whodb/main.go     # Entry point — imports plugins and creates GraphQL schema\n  src/app/app.go        # AppConfig + Run() — shared server logic\n  src/src.go            # Engine initialization (collects from global plugin registry)\n  src/engine/registry.go # Global plugin registry (plugins self-register via init())\n  src/engine/plugin.go  # PluginFunctions interface\n  src/source/           # Source-first public contract + connector/session interfaces\n  src/sourcecatalog/    # Public source catalog exposed to GraphQL/frontend\n  src/dbcatalog/        # Internal connectable-database catalog adapted into sourcecatalog\n  src/env/              # Environment variable declarations (pure, no log dependency)\n  src/envconfig/        # Config-loading functions that need both env and log\n  src/plugins/          # Database connectors (each has init() calling engine.RegisterPlugin)\n                        # Includes: postgres, mysql, sqlite3, mongodb, redis, elasticsearch,\n                        #           clickhouse, duckdb, memcached (+ mariadb via mysql)\n  graph/schema.graphqls # GraphQL schema\n  graph/*.resolvers.go  # GraphQL resolvers\n\nfrontend/               # React/TypeScript (uses @clidey/ux component library)\n  src/index.tsx        # Entry point\n  src/store/           # Redux Toolkit state\n  src/generated/       # GraphQL codegen output (@graphql alias)\n\ncli/                    # Interactive TUI CLI (Bubble Tea)\nsdk/                    # Platform SDKs (npm @clidey/whodb-sdk, PyPI whodb) — own pnpm\n                        # project; wire cores generated from sdk/spec/ (see sdk/README.md)\ndesktop-ce/             # Desktop app (Wails)\ndesktop-common/         # Shared desktop code\n\n.github/workflows/      # CI/CD pipelines (release, build, deploy)\n```\n\nAdditional agent docs: `.agents/docs/build-and-run.md` (CE setup and generation), `.agents/docs/data-sources.md` (adding data sources), `.agents/docs/cli.md` (CLI), `.agents/docs/desktop.md` (desktop), `.agents/docs/ci-cd.md` (GitHub Actions), `.agents/docs/testing.md` (testing), `.agents/docs/analytics.md` (PostHog analytics contract). EE-specific source additions are in `ee/.agents/docs/data-sources.md`.\n\n## Testing\n\nSee `.agents/docs/testing.md` for comprehensive testing documentation including:\n- Frontend Playwright E2E tests\n- Docker container setup for test databases\n- Go backend unit and integration tests\n- CLI tests\n\nQuick reference:\n```bash\n# Frontend Playwright E2E\ncd frontend && pnpm e2e:ce:headless         # Headless (all databases)\ncd frontend && pnpm e2e:ce                  # Interactive (headed)\n\n# Backend Go tests\nbash dev/run-backend-tests.sh all           # Unit + integration\n\n# CLI tests\nbash dev/run-cli-tests.sh                   # All CLI tests\n```\n\n## Domain-Specific Guidelines\n\nFor language-specific or domain-specific guidelines, refer to the shared rules in `.agents/rules/`:\n- Go Backend (`core/`, `cli/`): `.agents/rules/go-backend.md`\n- React Frontend (`frontend/`): `.agents/rules/react-frontend.md`\n- GraphQL (`**/graph/`, `**/*.graphqls`): `.agents/rules/graphql.md`\n- Localization (`**/locales/`): `.agents/rules/localization.md`\n- E2E Tests (`frontend/e2e/`): `.agents/rules/e2e-tests.md`\n- Desktop (`desktop-ce/`, `desktop-common/`): `.agents/rules/desktop.md`\n- CI/CD (`.github/`): `.agents/rules/ci-cd.md`\n\n## Procedures\n\nFor multi-step tasks, follow the step-by-step workflows in `.agents/workflows/`. Read the relevant file before starting:\n\n| Task | Guide |\n|------|-------|\n| Add a new database plugin | `.agents/workflows/new-plugin.md` |\n| Add a GraphQL query/mutation end-to-end | `.agents/workflows/new-graphql-field.md` |\n| Add a new frontend page | `.agents/workflows/new-frontend-page.md` |\n| Add or update translation keys | `.agents/workflows/add-translation.md` |\n| Add a CLI command or TUI view | `.agents/workflows/cli-feature.md` |\n| Add or modify desktop app functionality | `.agents/workflows/desktop-feature.md` |\n| Add a platform-constrained HTTP handler | `.agents/workflows/platform-constrained-handler.md` |\n| Prepare or consume a handoff | `.agents/workflows/task-handoff.md` |\n| Prove claims about external behavior | `.agents/workflows/research-proof.md` |\n| Pre-commit verification | `.agents/workflows/review-checklist.md` |\n\n## When Updating Dependencies\n\nUse `core/go.mod` as the reference point for dependency versions.\n\n## Commands Quick Reference\n\nSee `.agents/docs/commands.md` for full reference.\n\n```bash\n# Backend: cd core && go run ./cmd/whodb\n# Frontend: cd frontend && pnpm start\n# CLI: cd cli && go run .\n```\n\n## Architecture\n\n- **Plugin self-registration** — each plugin has `init() { engine.RegisterPlugin(...) }`. The entry point's blank imports control which plugins are registered\n- **Source-first public API** — new public GraphQL/frontend work should use `SourceTypes`, `SourceProfiles`, `SourceFieldOptions`, `SourceSessionMetadata`, `SourceObjects`, `SourceRows`, `RunSourceQuery`, and `SourceGraph`. Do not add new public `Database*` queries or capability surfaces\n- **AppConfig DI** — `core/src/app/app.go` defines `AppConfig` (schema, HTTP handlers). The entry point calls `app.Run(config, staticFiles)`\n- **HTTP route extensions** — CE-owned HTTP routes live in `core/graph/SetupHTTPServer`. Edition or platform add-ons register their own non-GraphQL routes with `graph.RegisterHTTPRoutes`; do not add add-on route names or unsupported stubs to CE.\n- **Frontend registries** — components (`registerComponent`), source types (`registerSourceTypeOverrides`), icons (`registerIcons`), and source utilities (`registerSourceUtilities`) can be registered at boot. The frontend renders from registries — if something isn't registered, it's not shown\n- **Import cycle note** — `src` → `router` → `graph` → `src` cycle exists. `Run()` lives in `src/app/` (not `src/`) to avoid it. Never add router/graph imports to `src/`\n\n## Development Principles\n\n- Clean, readable code over clever code\n- Prefer existing style and local helper APIs over new abstractions\n- Only comment edge cases and complex logic, not obvious code\n- Maintain professional, neutral tone without excessive enthusiasm\n","isInternal":false,"tokens":3090,"sizeBytes":13716},{"name":"DESIGN.md","path":"DESIGN.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/DESIGN.md","title":"WhoDB","category":"project-spec","format":"markdown","content":"---\nname: WhoDB\ndescription: Lightweight, fast database management with quiet confidence\ncolors:\n  background-light: \"#FAF5EC\"\n  background-dark: \"#0E2240\"\n  foreground-light: \"#0E2240\"\n  foreground-dark: \"#FAF5EC\"\n  card-light: \"#FFFFFF\"\n  card-dark: \"#162B4A\"\n  popover-light: \"#FFFFFF\"\n  popover-dark: \"#1D3151\"\n  muted-foreground-light: \"#5C6778\"\n  muted-foreground-dark: \"#9BA5B3\"\n  primary-light: \"#2C6BD4\"\n  primary-dark: \"#5091FD\"\n  accent-light: \"#EAF0FB\"\n  accent-dark: \"#233E69\"\n  border-light: \"#D9D4CB\"\n  border-dark: \"#314667\"\n  brand-orange: \"#F4781C\"\n  highlight-yellow: \"#FFC233\"\n  destructive-light: \"#E30117\"\n  destructive-dark: \"#FF6668\"\ntypography:\n  body:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1rem\"\n    fontWeight: 400\n    lineHeight: 1.5\n  label:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"0.875rem\"\n    fontWeight: 500\n    lineHeight: 1.4\n  title:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.25rem\"\n    fontWeight: 600\n    lineHeight: 1.3\n  headline:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.5rem\"\n    fontWeight: 600\n    lineHeight: 1.25\n  mono:\n    fontFamily: \"JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\"\n    fontSize: \"0.875rem\"\n    fontWeight: 400\nrounded:\n  sm: \"0.375rem\"\n  md: \"0.5rem\"\n  lg: \"0.625rem\"\n  xl: \"0.75rem\"\nspacing:\n  xs: \"0.5rem\"\n  sm: \"0.75rem\"\n  md: \"1rem\"\n  lg: \"1.5rem\"\n  xl: \"2rem\"\ncomponents:\n  button-primary:\n    backgroundColor: \"{colors.primary-light}\"\n    textColor: \"#FFFFFF\"\n    rounded: \"{rounded.md}\"\n    padding: \"0.5rem 1rem\"\n  button-ghost:\n    backgroundColor: \"transparent\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.md}\"\n  card:\n    backgroundColor: \"{colors.card-light}\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.lg}\"\n    padding: \"1rem\"\n---\n\n# Design System: WhoDB\n\n## Overview\n\n**Creative North Star: \"Quiet Confidence\"**\n\nWhoDB is a database management tool for people who already know what they're doing. The interface doesn't perform competence — it assumes it. Every surface exists to frame data, never to decorate it. All tokens flow from `@clidey/ux`'s Clidey brand kit (imported directly via `@import '@clidey/ux/brand.css'`): Paper/Ink dual-mode, Signal Blue as the product accent, Beacon Yellow as the single sanctioned highlight, Clidey Orange reserved for company-branded moments rather than general product UI.\n\nThe system explicitly rejects:\n- The cluttered, dated aesthetic of legacy database tools (phpMyAdmin, pgAdmin)\n- Corporate-gray enterprise bloat and wizard-driven flows\n- Mixed-hue decoration — more than one accent color competing on the same surface\n\n**Key Characteristics:**\n- Flat surfaces by default; depth comes from a lightness step between surfaces, not shadow or blur\n- Dual theme: Paper (light) and Ink (dark), both first-class\n- Hanken Grotesk carries the UI; Bricolage Grotesque is self-hosted and available (`brand-fonts.css`) but not currently applied anywhere in the product UI — treat it as reserved for a future display-heading use, not an active token\n- A user-facing density system (Settings) swaps font-size, radius, and spacing scales between small/medium/large and none/small/medium/large tiers respectively — the values below are the medium/default tier, not the only valid values\n- Token-driven styling via CSS custom properties from `@clidey/ux` — extend, don't override component internals with `!important`\n\n## Colors\n\nThe palette is Clidey's brand kit: Paper and Ink as the two surface worlds, Signal Blue as the product accent (lifts one lightness step in dark mode), Beacon Yellow as the single highlight, Clidey Orange reserved for company-branded emphasis.\n\n### Primary\n- **Signal Blue** (`#2C6BD4` light / `#5091FD` dark): Interactive affordances — buttons, links, focus rings, active states.\n\n### Secondary\n- **Clidey Orange** (`#F4781C`): Company-branded emphasis only, not general product UI. One accent per surface — don't mix with Signal Blue on the same card or banner.\n\n### Surfaces\n- **Background** (`#FAF5EC` Paper / `#0E2240` Ink): Page canvas, flat at rest.\n- **Card** (`#FFFFFF` light / `#162B4A` dark): One lightness step up from background.\n- **Popover** (`#FFFFFF` light / `#1D3151` dark): Menus, dropdowns, tooltips.\n\n### Borders\n- **Light mode:** `#D9D4CB`\n- **Dark mode:** `#314667`\n\n### Text\n- **Foreground** (`#0E2240` light / `#FAF5EC` dark): Primary body text.\n- **Muted Foreground** (`#5C6778` light / `#9BA5B3` dark): Secondary text, labels, descriptions. Always verify contrast against the actual surface the text sits on (`--card`, not just `--background`) — the dark-mode value was raised earlier after measuring under WCAG AA against `--card`.\n\n### Named Rules\n**The One-Accent Rule.** A single surface uses exactly one accent hue at a time. Blue leads product UI; orange leads company-branded moments. They do not mix on the same card or banner.\n\n## Typography\n\n**Primary Font:** Hanken Grotesk (with Inter, then system sans-serif fallback)\n**Mono Font:** JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\n\n**Character:** Single active UI typeface. Bricolage Grotesque is self-hosted alongside Hanken Grotesk but not wired into any component today — don't assume it renders anywhere until it's actually applied to an element.\n\n### Hierarchy (medium density tier — the default)\n- **3xl** (600, 1.875rem/30px): Rare hero text.\n- **2xl** (600, 1.5rem/24px): Headline.\n- **xl** (600, 1.25rem/20px): Title/section headers.\n- **lg** (500, 1.125rem/18px): Card titles, dialog headers.\n- **base** (400, 1rem/16px): Primary body text.\n- **sm** (400, 0.875rem/14px): Secondary text, labels.\n- **xs** (400, 0.75rem/12px): Metadata, captions.\n\n### Named Rules\n**The Density-Tier Rule.** Font sizes, radius, and spacing are all user-adjustable via Settings (small/medium/large tiers). Don't hardcode a pixel value where a `var(--font-size-*)`/`var(--radius-*)`/`var(--spacing-*)` token exists — hardcoding breaks the density switch for that element.\n\n## Layout\n\nSpacing follows a `--spacing-{xs,sm,md,lg,xl,2xl,3xl}` scale, adjustable via the same density system (compact/comfortable/spacious tiers; comfortable is the default: 8/12/16/24/32/40/48px).\n\n## Elevation & Depth\n\nFlat by default — no shadow at rest. Depth is a lightness step between `--background` → `--card` → `--popover`, not an elevation effect.\n\n## Shapes\n\nRadius follows a `--radius-{sm,md,lg,xl}` scale derived from a single `--radius` primitive (`calc()`-based: sm = radius−4px, md = radius−2px, lg = radius, xl = radius+4px), also swappable via the density system. Medium/default: `--radius: 0.625rem` (10px), giving sm 6px / md 8px / lg 10px / xl 14px.\n\n## Components\n\nInteractive components are sourced from `@clidey/ux`. The app extends them through CSS custom properties in `frontend/src/index.css` and the density-mapping variables in `theme-customization.ts` — never by overriding component internals with `!important`.\n\n### Buttons\n- **Shape:** `{rounded.md}`\n- **Primary:** Signal Blue background, contrast-checked text.\n- **Ghost:** Transparent background, foreground text.\n\n### Cards\n- **Corner Style:** `{rounded.lg}`\n- **Background:** `var(--card)`, flat, no shadow at rest.\n\n### Icon tiles\n- **Pairing rule:** an icon tile's background token and its icon/text color token must be from different roles (e.g. `bg-icon` + `text-icon-foreground`, not `bg-icon` + `text-primary`) — a prior bug painted blue icon glyphs on a blue tile background because both referenced the same hue family. Always check the foreground/background pairing when introducing a new tinted tile.\n\n## Do's and Don'ts\n\n### Do:\n- **Do** use flat, token-driven backgrounds for all static surfaces.\n- **Do** use `var(--font-size-*)`, `var(--radius-*)`, and `var(--spacing-*)` tokens rather than hardcoded values, so the density-customization system keeps working.\n- **Do** respect both themes equally — verify contrast against the actual surface text sits on.\n- **Do** extend `@clidey/ux` via CSS custom properties, never by overriding component styles with `!important`.\n\n### Don't:\n- **Don't** mix Signal Blue and Clidey Orange on the same surface.\n- **Don't** add drop shadows to cards or containers at rest.\n- **Don't** assume Bricolage Grotesque renders anywhere — it's self-hosted but unused; Hanken Grotesk is the only active UI typeface.\n- **Don't** pair a tinted tile's background and foreground from the same color role (see the icon-tile bug above).\n- **Don't** use hardcoded color values (`bg-white`, `dark:bg-gray-800`). Use semantic tokens.\n","frontmatter":{"name":"WhoDB","description":"Lightweight, fast database management with quiet confidence","colors":{"background-light":"#FAF5EC","background-dark":"#0E2240","foreground-light":"#0E2240","foreground-dark":"#FAF5EC","card-light":"#FFFFFF","card-dark":"#162B4A","popover-light":"#FFFFFF","popover-dark":"#1D3151","muted-foreground-light":"#5C6778","muted-foreground-dark":"#9BA5B3","primary-light":"#2C6BD4","primary-dark":"#5091FD","accent-light":"#EAF0FB","accent-dark":"#233E69","border-light":"#D9D4CB","border-dark":"#314667","brand-orange":"#F4781C","highlight-yellow":"#FFC233","destructive-light":"#E30117","destructive-dark":"#FF6668"},"typography":{"body":{"fontFamily":"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif","fontSize":"1rem","fontWeight":400,"lineHeight":1.5},"label":{"fontFamily":"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif","fontSize":"0.875rem","fontWeight":500,"lineHeight":1.4},"title":{"fontFamily":"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif","fontSize":"1.25rem","fontWeight":600,"lineHeight":1.3},"headline":{"fontFamily":"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif","fontSize":"1.5rem","fontWeight":600,"lineHeight":1.25},"mono":{"fontFamily":"JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace","fontSize":"0.875rem","fontWeight":400}},"rounded":{"sm":"0.375rem","md":"0.5rem","lg":"0.625rem","xl":"0.75rem"},"spacing":{"xs":"0.5rem","sm":"0.75rem","md":"1rem","lg":"1.5rem","xl":"2rem"},"components":{"button-primary":{"backgroundColor":"{colors.primary-light}","textColor":"#FFFFFF","rounded":"{rounded.md}","padding":"0.5rem 1rem"},"button-ghost":{"backgroundColor":"transparent","textColor":"{colors.foreground-light}","rounded":"{rounded.md}"},"card":{"backgroundColor":"{colors.card-light}","textColor":"{colors.foreground-light}","rounded":"{rounded.lg}","padding":"1rem"}}},"isInternal":false,"tokens":2382,"sizeBytes":8764},{"name":"ci-cd.md","path":".agents/rules/ci-cd.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/ci-cd.md","title":"Rules Skill","category":"anthropic-skill","format":"markdown","content":"# Rules Skill\n\nPath: `.agents/rules/ci-cd.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/ci-cd.md)","tokens":300,"sizeBytes":151},{"name":"desktop.md","path":".agents/rules/desktop.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/desktop.md","title":"Rules Skill","category":"anthropic-skill","format":"markdown","content":"# Rules Skill\n\nPath: `.agents/rules/desktop.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/desktop.md)","tokens":300,"sizeBytes":155},{"name":"e2e-tests.md","path":".agents/rules/e2e-tests.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/e2e-tests.md","title":"Rules Skill","category":"anthropic-skill","format":"markdown","content":"# Rules Skill\n\nPath: `.agents/rules/e2e-tests.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/e2e-tests.md)","tokens":300,"sizeBytes":159},{"name":"go-backend.md","path":".agents/rules/go-backend.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/go-backend.md","title":"Rules Skill","category":"anthropic-skill","format":"markdown","content":"# Rules Skill\n\nPath: `.agents/rules/go-backend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/go-backend.md)","tokens":300,"sizeBytes":161},{"name":"graphql.md","path":".agents/rules/graphql.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/graphql.md","title":"Rules Skill","category":"anthropic-skill","format":"markdown","content":"# Rules Skill\n\nPath: `.agents/rules/graphql.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/graphql.md)","tokens":300,"sizeBytes":155},{"name":"localization.md","path":".agents/rules/localization.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/localization.md","title":"Rules Skill","category":"anthropic-skill","format":"markdown","content":"# Rules Skill\n\nPath: `.agents/rules/localization.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/localization.md)","tokens":300,"sizeBytes":165},{"name":"react-frontend.md","path":".agents/rules/react-frontend.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/react-frontend.md","title":"Rules Skill","category":"anthropic-skill","format":"markdown","content":"# Rules Skill\n\nPath: `.agents/rules/react-frontend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/react-frontend.md)","tokens":300,"sizeBytes":169},{"name":"openai.yaml","path":".agents/skills/impeccable/agents/openai.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/agents/openai.yaml","title":"Agents Skill","category":"anthropic-skill","format":"yaml","content":"# Agents Skill\n\nPath: `.agents/skills/impeccable/agents/openai.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/agents/openai.yaml)","tokens":300,"sizeBytes":196},{"name":"adapt.md","path":".agents/skills/impeccable/reference/adapt.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.md)","tokens":300,"sizeBytes":199},{"name":"adapt.native.md","path":".agents/skills/impeccable/reference/adapt.native.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.native.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.native.md)","tokens":300,"sizeBytes":213},{"name":"android.md","path":".agents/skills/impeccable/reference/android.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/android.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/android.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/android.md)","tokens":300,"sizeBytes":203},{"name":"animate.md","path":".agents/skills/impeccable/reference/animate.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/animate.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/animate.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/animate.md)","tokens":300,"sizeBytes":203},{"name":"audit.md","path":".agents/skills/impeccable/reference/audit.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.md)","tokens":300,"sizeBytes":199},{"name":"audit.native.md","path":".agents/skills/impeccable/reference/audit.native.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.native.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.native.md)","tokens":300,"sizeBytes":213},{"name":"bolder.md","path":".agents/skills/impeccable/reference/bolder.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/bolder.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/bolder.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/bolder.md)","tokens":300,"sizeBytes":201},{"name":"clarify.md","path":".agents/skills/impeccable/reference/clarify.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/clarify.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/clarify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/clarify.md)","tokens":300,"sizeBytes":203},{"name":"colorize.md","path":".agents/skills/impeccable/reference/colorize.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/colorize.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/colorize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/colorize.md)","tokens":300,"sizeBytes":205},{"name":"craft-floor.md","path":".agents/skills/impeccable/reference/craft-floor.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft-floor.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft-floor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft-floor.md)","tokens":300,"sizeBytes":211},{"name":"craft.md","path":".agents/skills/impeccable/reference/craft.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft.md)","tokens":300,"sizeBytes":199},{"name":"critique.md","path":".agents/skills/impeccable/reference/critique.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/critique.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/critique.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/critique.md)","tokens":300,"sizeBytes":205},{"name":"asset-producer.md","path":".agents/skills/impeccable/reference/degraded/asset-producer.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/asset-producer.md","title":"Degraded Skill","category":"anthropic-skill","format":"markdown","content":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/asset-producer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/asset-producer.md)","tokens":300,"sizeBytes":234},{"name":"documenter.md","path":".agents/skills/impeccable/reference/degraded/documenter.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/documenter.md","title":"Degraded Skill","category":"anthropic-skill","format":"markdown","content":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/documenter.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/documenter.md)","tokens":300,"sizeBytes":226},{"name":"finish-reviewer.md","path":".agents/skills/impeccable/reference/degraded/finish-reviewer.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/finish-reviewer.md","title":"Degraded Skill","category":"anthropic-skill","format":"markdown","content":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/finish-reviewer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/finish-reviewer.md)","tokens":300,"sizeBytes":236},{"name":"manual-edit-applier.md","path":".agents/skills/impeccable/reference/degraded/manual-edit-applier.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/manual-edit-applier.md","title":"Degraded Skill","category":"anthropic-skill","format":"markdown","content":"# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/manual-edit-applier.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/manual-edit-applier.md)","tokens":300,"sizeBytes":244},{"name":"delight.md","path":".agents/skills/impeccable/reference/delight.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/delight.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/delight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/delight.md)","tokens":300,"sizeBytes":203},{"name":"distill.md","path":".agents/skills/impeccable/reference/distill.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/distill.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/distill.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/distill.md)","tokens":300,"sizeBytes":203},{"name":"doctor.md","path":".agents/skills/impeccable/reference/doctor.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/doctor.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/doctor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/doctor.md)","tokens":300,"sizeBytes":201},{"name":"document.md","path":".agents/skills/impeccable/reference/document.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/document.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/document.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/document.md)","tokens":300,"sizeBytes":205},{"name":"extract.md","path":".agents/skills/impeccable/reference/extract.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/extract.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/extract.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/extract.md)","tokens":300,"sizeBytes":203},{"name":"harden.md","path":".agents/skills/impeccable/reference/harden.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/harden.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/harden.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/harden.md)","tokens":300,"sizeBytes":201},{"name":"hooks.md","path":".agents/skills/impeccable/reference/hooks.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/hooks.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/hooks.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/hooks.md)","tokens":300,"sizeBytes":199},{"name":"init.md","path":".agents/skills/impeccable/reference/init.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/init.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/init.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/init.md)","tokens":300,"sizeBytes":197},{"name":"ios.md","path":".agents/skills/impeccable/reference/ios.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/ios.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/ios.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/ios.md)","tokens":300,"sizeBytes":195},{"name":"layout.md","path":".agents/skills/impeccable/reference/layout.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/layout.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/layout.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/layout.md)","tokens":300,"sizeBytes":201},{"name":"live-setup.md","path":".agents/skills/impeccable/reference/live-setup.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live-setup.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/live-setup.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live-setup.md)","tokens":300,"sizeBytes":209},{"name":"live.md","path":".agents/skills/impeccable/reference/live.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/live.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/live.md)","tokens":300,"sizeBytes":197},{"name":"new-work.md","path":".agents/skills/impeccable/reference/new-work.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/new-work.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/new-work.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/new-work.md)","tokens":300,"sizeBytes":205},{"name":"onboard.md","path":".agents/skills/impeccable/reference/onboard.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/onboard.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/onboard.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/onboard.md)","tokens":300,"sizeBytes":203},{"name":"operate.md","path":".agents/skills/impeccable/reference/operate.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/operate.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/operate.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/operate.md)","tokens":300,"sizeBytes":203},{"name":"optimize.md","path":".agents/skills/impeccable/reference/optimize.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/optimize.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/optimize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/optimize.md)","tokens":300,"sizeBytes":205},{"name":"overdrive.md","path":".agents/skills/impeccable/reference/overdrive.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/overdrive.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/overdrive.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/overdrive.md)","tokens":300,"sizeBytes":207},{"name":"polish.md","path":".agents/skills/impeccable/reference/polish.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/polish.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/polish.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/polish.md)","tokens":300,"sizeBytes":201},{"name":"quieter.md","path":".agents/skills/impeccable/reference/quieter.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/quieter.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/quieter.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/quieter.md)","tokens":300,"sizeBytes":203},{"name":"routing.md","path":".agents/skills/impeccable/reference/routing.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/routing.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/routing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/routing.md)","tokens":300,"sizeBytes":203},{"name":"shape.md","path":".agents/skills/impeccable/reference/shape.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/shape.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/shape.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/shape.md)","tokens":300,"sizeBytes":199},{"name":"typeset.md","path":".agents/skills/impeccable/reference/typeset.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/typeset.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/typeset.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/typeset.md)","tokens":300,"sizeBytes":203},{"name":"visualize.md","path":".agents/skills/impeccable/reference/visualize.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/visualize.md","title":"Reference Skill","category":"anthropic-skill","format":"markdown","content":"# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/visualize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/visualize.md)","tokens":300,"sizeBytes":207},{"name":"command-metadata.json","path":".agents/skills/impeccable/scripts/command-metadata.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/scripts/command-metadata.json","title":"Scripts Skill","category":"anthropic-skill","format":"json","content":"# Scripts Skill\n\nPath: `.agents/skills/impeccable/scripts/command-metadata.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/scripts/command-metadata.json)","tokens":300,"sizeBytes":219},{"name":"SKILL.md","path":".agents/skills/impeccable/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/SKILL.md","title":"impeccable","category":"anthropic-skill","format":"markdown","content":"---\nname: impeccable\ndescription: \"Use when the user wants to design, redesign, shape, critique, audit, polish, simplify, harden, animate, or otherwise improve a frontend interface: websites, landing pages, dashboards, product UI, components, forms, settings, onboarding, empty states, and native iOS or Android screens. Handles UX review, hierarchy, layout, typography, color, motion, UX copy, accessibility, responsive behavior, edge cases, and capturing or documenting design systems (DESIGN.md, tokens). Also for making bland UI bolder, loud UI quieter, or ambitious visual effects. Not for backend-only or non-UI tasks.\"\nmetadata:\n  version: 4.7.0\n---\n\nThis skill gives you the tools and permission to make design that earns the name out-of-distribution craft. Work as an award-winning design director would: production-grade code, a clear POV, a deep grasp of what the client and its users need, and exceptional craft.\n\nCore principles:\n- Finish the job. No hedging, no shortcuts: the deliverable is complete, except assets the user must provide.\n- Scale ambition to the surface's mode (see Modes). Persuade and Experience get full commitment: bold, distinct work with a point of view. On Operate and Read, ambition shows as precision and restraint, and patterns the visitor already knows earn their place.\n- Verify by looking at the rendered result at the sizes it ships at, and batch the checks: fix what one look shows before looking again, rather than screenshotting after every tweak.\n\n## Setup\n\n1. Run `<skill-base-dir>/scripts/impeccable context` once per session, where `<skill-base-dir>` is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. That base directory resolves every `.agents/skills/impeccable/scripts/impeccable <verb>` command in this skill and its references, and `.agents/skills/impeccable/scripts` is the fallback only when the runtime reports no base directory. On a Windows shell without `sh`, call `.agents/skills/impeccable/scripts/impeccable.cmd` instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as `--target <path>`. It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.\n2. Load the request's playbook: its Commands-table reference for an explicit/implied sub-command, or [reference/new-work.md](reference/new-work.md) for a new surface or replacement visual world. Inspect target and incumbent visual truth before editing. When the app cannot run, start with committed visual-regression goldens or screenshot fixtures; verify target and freshness against current tokens, CSS, components, or assets, resolve conflicts, and compare theme/variant captures.\n3. After resolving analysis and direction, read [reference/craft-floor.md](reference/craft-floor.md) immediately before any UI edit, including small refinements. It carries the quality floor, the absolute bans, and the reflexes no detector catches. Do not load it for planning-only work.\n\n**Launcher unavailable:** On refusal or failure, send a separate message **before the next tool call**: “Context loading did not run; I’ll read the existing project context directly.” Then read existing PRODUCT.md and DESIGN.md without inventing missing context, follow applicable steps 2–3, and continue through permitted tools. This applies to planning and editing; launcher failure alone does not block either.\n\n## How to design\n\n- **The brief wins.** Honor pinned aesthetics, eras, materials, fonts, and palettes even when they conflict with a saturated-pattern warning. Redirecting a clear brief toward your taste is failure.\n- **Refinement preserves; redesign replaces.** Refinement keeps the incumbent identity, behavior, copy, and everything outside scope. Ask before replacing factual copy or adding claims. Redesign keeps product truth, content, function, native affordances, and constraints, but treats the old look as evidence and anti-reference; choose a replacement world in new-work and replace DESIGN.md. Never split the difference into polish on the discarded look.\n- **Loaded symbols stay out of the decoration.** A subject's world does not license emblems tied to militarism, supremacy, or hate movements as motifs, badges, or ornament, such as the Rising Sun flag's rays, the Confederate battle flag, or Nazi-era insignia and their stylised variants; reach for that world's neutral forms instead. Content that documents such a symbol as fact stays as it is.\n- **Visual authority is evidence, not a filename.** Missing DESIGN.md alone does not make a project greenfield; new-work decides whether to preserve, expand, or replace the incumbent world.\n\n## Modes\n\nThe mode names what the visitor's success looks like on this surface.\n\n- **Persuade:** the visitor decides and acts; design is the product. Landing pages, marketing, campaigns, pricing. Earn attention and action. Ship real imagery when the brief needs it; follow the committed world, not category habit.\n- **Operate:** the visitor completes a task. App UI, dashboards, editors, admin, settings, tools. Scanability, consistency, native expectations, and the real usage scene outrank expression. Brand lives in precise details.\n- **Read:** the visitor understands something. Docs, articles, guides, help, changelogs. Structure for comprehension, then make the reading experience worth staying in.\n- **Experience:** the visitor is inside the work itself. Portfolios, galleries, showcases. Let the artifact lead from the first viewport; the interface recedes.\n\nChoose the mode from the requested surface, not the product, and persist it only in that surface brief. A tool's landing page is still Persuade; a fashion house's documentation is still Read; a docs index is Read, not Persuade. See [new-work.md](reference/new-work.md) for new surfaces and [operate.md](reference/operate.md) for deeper Operate/Read guidance.\n\n## Commands\n\n| Command | Category | Description | Reference |\n|---|---|---|---|\n| `craft [feature]` | Build | Deprecated alias for an ordinary new-work request | [reference/craft.md](reference/craft.md) |\n| `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) |\n| `init` | Build | Capture durable product context in PRODUCT.md | [reference/init.md](reference/init.md) |\n| `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) |\n| `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) |\n| `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) |\n| `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) · native: [reference/audit.native.md](reference/audit.native.md) |\n| `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) |\n| `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) |\n| `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) |\n| `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) |\n| `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) |\n| `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) |\n| `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) |\n| `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) |\n| `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) |\n| `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) |\n| `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) |\n| `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) |\n| `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) |\n| `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) · native: [reference/adapt.native.md](reference/adapt.native.md) |\n| `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) |\n| `live` | Iterate | Visual variant mode: pick elements in the browser, iterate on alternatives | [reference/live.md](reference/live.md) |\n| `generate [n] [action] [element]` | Iterate | Variants, versions, or alternatives of a named element to choose from in the live browser; no manual picking | [reference/generate.md](reference/generate.md) |\n\nRouting:\n\n- **No argument:** read [routing.md](reference/routing.md) and present its context-aware menu; never auto-run a command.\n- **Explicit or clearly implied request to run a command:** load its reference (native variant on native platforms) and follow it. Ask once if two commands fit.\n- **Workflow or command-selection question:** read [Workflow questions](reference/routing.md#workflow-questions).\n- **Otherwise:** treat the request as general design work. Missing PRODUCT.md routes a new surface or replacement world through init, then new-work; a narrow refinement of existing code proceeds on the incumbent implementation as `impeccable context` directs, offering init afterward rather than blocking on it.\n- `teach` aliases `init`. `craft` is a deprecated alias for ordinary new-work and adds nothing. `shape` owns task discovery, then enters new-work only for visual-world and surface-concept decisions.\n\nAfter init writes PRODUCT.md, resume without rerunning `impeccable context`; init loads the native platform reference itself when the platform it recorded is `ios`, `android`, or `adaptive`.\n\n**Pin / Unpin:** `.agents/skills/impeccable/scripts/impeccable pin <pin|unpin> <command>` creates or removes a standalone `$<command>` shortcut. Report the script's result concisely; relay stderr verbatim on error.\n\n**Hooks:** `$impeccable hooks <on|off|status|ignore-rule|ignore-file|ignore-value|reset>` manages the design detector hook for this project (auto-runs the detector after UI file edits and surfaces findings). Load [reference/hooks.md](reference/hooks.md) when the user invokes it with any argument.\n\n**Doctor:** `$impeccable doctor` reports and repairs drift between this project's Impeccable artifacts (PRODUCT.md, DESIGN.md and its sidecar, config, surface briefs, the hook) and what this version reads. Load [reference/doctor.md](reference/doctor.md) when the user invokes it, or when they ask what is out of date, stale, or needs refreshing. A `CONTEXT_STALE` directive in Setup's output is the cheap subset of the same report; act on it there per its own instructions rather than running doctor unasked.\n\n**Never repair drift as a side effect of a design task.** A `CONTEXT_STALE` finding is reported, not acted on, unless the user asks. The one exception is a finding marked `auto`, which the next write to that file performs anyway.","frontmatter":{"name":"impeccable","description":"Use when the user wants to design, redesign, shape, critique, audit, polish, simplify, harden, animate, or otherwise improve a frontend interface: websites, landing pages, dashboards, product UI, components, forms, settings, onboarding, empty states, and native iOS or Android screens. Handles UX review, hierarchy, layout, typography, color, motion, UX copy, accessibility, responsive behavior, edge cases, and capturing or documenting design systems (DESIGN.md, tokens). Also for making bland UI bolder, loud UI quieter, or ambitious visual effects. Not for backend-only or non-UI tasks.","metadata":{"version":"4.7.0"}},"isInternal":false,"tokens":2629,"sizeBytes":11659},{"name":"openai.yaml","path":"cli/external-plugin/openai-skills/whodb/agents/openai.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/openai-skills/whodb/agents/openai.yaml","title":"Agents Skill","category":"anthropic-skill","format":"yaml","content":"# Agents Skill\n\nPath: `cli/external-plugin/openai-skills/whodb/agents/openai.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/openai-skills/whodb/agents/openai.yaml)","tokens":300,"sizeBytes":224},{"name":"SKILL.md","path":"cli/external-plugin/openai-skills/whodb/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/openai-skills/whodb/SKILL.md","title":"whodb","category":"anthropic-skill","format":"markdown","content":"---\nname: whodb\ndescription: \"Work with WhoDB platform hosts and project resources via MCP, including multiple environments, or query databases directly in database-only MCP mode.\"\nlicense: Apache-2.0\nmetadata:\n  author: clidey\n  version: \"0.106.0\"\ncompatibility: \"Requires Node.js (npx) or the whodb binary installed.\"\n---\n\n# WhoDB\n\nQuery databases, explore schemas, analyze data quality, and get optimization recommendations through the WhoDB MCP server.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n## Database-only MCP setup\n\nIf the WhoDB MCP server is not connected, set it up:\n\n1. Add the MCP server (npx, no install needed):\n   ```bash\n   codex mcp add whodb -- npx -y whodb mcp serve\n   ```\n\n2. Or if `whodb` is installed locally:\n   ```bash\n   codex mcp add whodb -- whodb mcp serve\n   ```\n\n3. Configure database connections via environment variables:\n   ```bash\n   export WHODB_POSTGRES='[{\"alias\":\"prod\",\"host\":\"localhost\",\"user\":\"user\",\"password\":\"pass\",\"database\":\"mydb\",\"port\":\"5432\"}]'\n   export WHODB_MYSQL_1='{\"alias\":\"dev\",\"host\":\"localhost\",\"user\":\"user\",\"password\":\"pass\",\"database\":\"devdb\",\"port\":\"3306\"}'\n   ```\n\nAfter adding the MCP server, restart Codex.\n\n## Available MCP Tools\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: connection names with type and source (env/saved).\n```\n\n### whodb_schemas\nList schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one exists)\n```\n\n### whodb_tables\nList tables in a schema.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional, uses default)\n```\n\n### whodb_columns\nDescribe table columns and types.\n```\nParameters:\n- connection: Connection name (optional)\n- table: Table name (required)\n- schema: Schema name (optional)\n```\n\n### whodb_query\nExecute SQL queries with security validation.\n```\nParameters:\n- connection: Connection name (optional)\n- query: SQL query to execute\n```\n\n### whodb_explain\nRun EXPLAIN for a SQL query.\n```\nParameters:\n- connection: Connection name (optional)\n- query: SQL query to analyze\n```\n\n### whodb_erd\nLoad graph/relationship metadata for ER diagrams.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional)\n```\n\n### whodb_diff\nCompare schema metadata between two connections.\n```\nParameters:\n- source: Source connection name (required)\n- target: Target connection name (required)\n```\n\n### whodb_audit\nRun data quality audits on a table.\n```\nParameters:\n- connection: Connection name (optional)\n- table: Table name (required)\n- schema: Schema name (optional)\n```\n\n### whodb_suggestions\nLoad backend-generated query suggestions for a connection.\n```\nParameters:\n- connection: Connection name (optional)\n- schema: Schema name (optional)\n```\n\n### whodb_confirm\nConfirm a pending write operation (only available in confirm-writes mode, which is the default).\n```\nParameters:\n- token: Confirmation token from a pending write\n```\n\n### whodb_pending\nList pending confirmation tokens.\n```\nNo parameters required.\n```\n\n## Standard Workflow\n\n### Step 1: Discover connections\n```\nwhodb_connections → list available databases\n```\n\n### Step 2: Explore schema\n```\nwhodb_schemas(connection=\"name\") → list schemas\nwhodb_tables(connection=\"name\", schema=\"public\") → list tables\nwhodb_columns(connection=\"name\", table=\"users\") → column details\n```\n\n### Step 3: Query data\n```\nwhodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### Step 4: Analyze (as needed)\n```\nwhodb_explain(connection=\"name\", query=\"SELECT ...\") → query plan\nwhodb_erd(connection=\"name\") → table relationships\nwhodb_audit(connection=\"name\", table=\"users\") → data quality\nwhodb_diff(source=\"prod\", target=\"staging\") → schema comparison\n```\n\n## Query Building\n\nWhen converting natural language to SQL:\n\n1. Always check schema first with `whodb_tables` and `whodb_columns`\n2. Match entities to table names, attributes to column names\n3. Identify foreign key joins from column metadata\n4. Use LIMIT for exploratory queries (default: 100)\n\n### Date handling varies by database\n\n| Intent | PostgreSQL | MySQL | SQLite |\n|--------|-----------|-------|--------|\n| Last 7 days | `>= NOW() - INTERVAL '7 days'` | `>= DATE_SUB(NOW(), INTERVAL 7 DAY)` | `>= DATE('now', '-7 days')` |\n| Start of month | `>= DATE_TRUNC('month', CURRENT_DATE)` | `>= DATE_FORMAT(NOW(), '%Y-%m-01')` | `>= DATE('now', 'start of month')` |\n\n## Security Modes\n\nThe MCP server defaults to confirm-writes mode (writes require confirmation via `whodb_confirm`).\n\n- `--read-only`: blocks all write operations\n- `--safe-mode`: read-only + strict security validation\n- `--allow-write`: full write access without confirmation\n\n## Safety Rules\n\n- Always explore schema before writing queries\n- Use LIMIT for exploratory queries\n- Prefer specific columns over SELECT *\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Never expose or log credentials\n- Use connection names, not connection strings\n","frontmatter":{"name":"whodb","description":"Work with WhoDB platform hosts and project resources via MCP, including multiple environments, or query databases directly in database-only MCP mode.","license":"Apache-2.0","metadata":{"author":"clidey","version":"0.106.0"},"compatibility":"Requires Node.js (npx) or the whodb binary installed."},"isInternal":false,"tokens":2058,"sizeBytes":8760},{"name":"SKILL.md","path":"cli/external-plugin/whodb/skills/query-builder/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/skills/query-builder/SKILL.md","title":"query-builder","category":"anthropic-skill","format":"markdown","content":"---\nname: query-builder\ndescription: Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\".\n---\n\n# Query Builder\n\nConvert natural language questions into SQL queries using the database schema.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks questions like:\n- \"Show me all users who signed up last month\"\n- \"Find orders greater than $100\"\n- \"Which products have low inventory?\"\n- \"Get the top 10 customers by total spend\"\n\n## Workflow\n\n### 1. Understand the Schema\nBefore generating SQL, always check the table structure:\n\n```\nwhodb_tables(connection=\"...\") → Get available tables\nwhodb_columns(table=\"relevant_table\") → Get column names and types\n```\n\n### 2. Identify Intent\nParse the natural language request:\n- **Subject**: What entity? (users, orders, products)\n- **Filter**: What conditions? (last month, > $100, active)\n- **Aggregation**: Count, sum, average, max, min?\n- **Grouping**: By what dimension?\n- **Ordering**: Sort by what? Ascending/descending?\n- **Limit**: How many results?\n\n### 3. Map to Schema\n- Match entities to table names\n- Match attributes to column names\n- Identify foreign key joins needed\n\n### 4. Generate SQL\nBuild the query following SQL best practices:\n\n```sql\nSELECT columns\nFROM table\n[JOIN other_table ON condition]\nWHERE filters\n[GROUP BY columns]\n[HAVING aggregate_condition]\nORDER BY column [ASC|DESC]\nLIMIT n;\n```\n\n### 5. Execute and Present\n```\nwhodb_query(query=\"generated SQL\")\n```\n\n## Translation Patterns\n\n| Natural Language | SQL Pattern |\n|------------------|-------------|\n| \"last week/month/year\" | `WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK)` |\n| \"more than X\" / \"greater than X\" | `WHERE col > X` |\n| \"top N\" | `ORDER BY col DESC LIMIT N` |\n| \"how many\" | `SELECT COUNT(*)` |\n| \"total\" / \"sum of\" | `SELECT SUM(col)` |\n| \"average\" | `SELECT AVG(col)` |\n| \"for each\" / \"by\" | `GROUP BY col` |\n| \"between X and Y\" | `WHERE col BETWEEN X AND Y` |\n| \"contains\" / \"like\" | `WHERE col LIKE '%term%'` |\n| \"starts with\" | `WHERE col LIKE 'term%'` |\n| \"is empty\" / \"is null\" | `WHERE col IS NULL` |\n| \"is not empty\" | `WHERE col IS NOT NULL` |\n\n## Date Handling by Database\n\n### PostgreSQL\n```sql\nWHERE created_at >= NOW() - INTERVAL '7 days'\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\n```\n\n### MySQL\n```sql\nWHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)\nWHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')\n```\n\n### SQLite\n```sql\nWHERE created_at >= DATE('now', '-7 days')\nWHERE created_at >= DATE('now', 'start of month')\n```\n\n## Examples\n\n### \"Show me users who signed up this month\"\n```sql\nSELECT * FROM users\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\nORDER BY created_at DESC;\n```\n\n### \"Find the top 5 products by sales\"\n```sql\nSELECT p.name, SUM(oi.quantity) as total_sold\nFROM products p\nJOIN order_items oi ON p.id = oi.product_id\nGROUP BY p.id, p.name\nORDER BY total_sold DESC\nLIMIT 5;\n```\n\n### \"How many orders per customer?\"\n```sql\nSELECT customer_id, COUNT(*) as order_count\nFROM orders\nGROUP BY customer_id\nORDER BY order_count DESC;\n```\n\n## Safety Rules\n\n- Always use LIMIT for exploratory queries (default: 100)\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Warn if query might return large result sets\n- Use table aliases for readability in JOINs\n","frontmatter":{"name":"query-builder","description":"Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\"."},"isInternal":false,"tokens":930,"sizeBytes":3622},{"name":"SKILL.md","path":"cli/external-plugin/whodb/skills/schema-designer/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/skills/schema-designer/SKILL.md","title":"schema-designer","category":"anthropic-skill","format":"markdown","content":"---\nname: schema-designer\ndescription: Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.\n---\n\n# Schema Designer\n\nHelp users design database schemas, create tables, and model data relationships.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks:\n- \"Create a table for storing orders\"\n- \"Design a schema for a blog\"\n- \"Add a column to track user preferences\"\n- \"How should I model this relationship?\"\n\n## Workflow\n\n### 1. Understand Requirements\nAsk clarifying questions:\n- What data needs to be stored?\n- What are the relationships between entities?\n- What queries will be common?\n- What's the expected data volume?\n\n### 2. Check Existing Schema\n```\nwhodb_tables() → See what already exists\nwhodb_columns(table=\"related_table\") → Understand existing structure\n```\n\n### 3. Design the Schema\nFollow database design principles:\n- Normalize to reduce redundancy\n- Use appropriate data types\n- Define primary keys\n- Establish foreign key relationships\n- Add indexes for common queries\n\n### 4. Generate DDL\nProvide CREATE TABLE statements with explanations.\n\n## Data Type Guidelines\n\n### Identifiers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Auto-increment ID | `SERIAL` / `BIGSERIAL` | `INT AUTO_INCREMENT` | `INTEGER PRIMARY KEY` |\n| UUID | `UUID` | `CHAR(36)` | `TEXT` |\n\n### Text\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Short text (<255) | `VARCHAR(n)` | `VARCHAR(n)` | `TEXT` |\n| Long text | `TEXT` | `TEXT` | `TEXT` |\n| Fixed length | `CHAR(n)` | `CHAR(n)` | `TEXT` |\n\n### Numbers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Integer | `INTEGER` | `INT` | `INTEGER` |\n| Big integer | `BIGINT` | `BIGINT` | `INTEGER` |\n| Decimal (money) | `NUMERIC(10,2)` | `DECIMAL(10,2)` | `REAL` |\n| Float | `REAL` | `FLOAT` | `REAL` |\n\n### Dates\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Date only | `DATE` | `DATE` | `TEXT` |\n| Timestamp | `TIMESTAMP` | `DATETIME` | `TEXT` |\n| With timezone | `TIMESTAMPTZ` | `TIMESTAMP` | `TEXT` |\n\n### Boolean\n| PostgreSQL | MySQL | SQLite |\n|------------|-------|--------|\n| `BOOLEAN` | `TINYINT(1)` | `INTEGER` |\n\n## Common Patterns\n\n### Users Table\n```sql\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    email VARCHAR(255) NOT NULL UNIQUE,\n    password_hash VARCHAR(255) NOT NULL,\n    name VARCHAR(100),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_users_email ON users(email);\n```\n\n### One-to-Many (Orders → Order Items)\n```sql\nCREATE TABLE orders (\n    id SERIAL PRIMARY KEY,\n    user_id INTEGER NOT NULL REFERENCES users(id),\n    status VARCHAR(20) DEFAULT 'pending',\n    total NUMERIC(10,2),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE order_items (\n    id SERIAL PRIMARY KEY,\n    order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,\n    product_id INTEGER NOT NULL REFERENCES products(id),\n    quantity INTEGER NOT NULL DEFAULT 1,\n    unit_price NUMERIC(10,2) NOT NULL\n);\n\nCREATE INDEX idx_order_items_order ON order_items(order_id);\n```\n\n### Many-to-Many (Users ↔ Roles)\n```sql\nCREATE TABLE roles (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(50) NOT NULL UNIQUE\n);\n\nCREATE TABLE user_roles (\n    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n    role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,\n    PRIMARY KEY (user_id, role_id)\n);\n```\n\n### Soft Delete Pattern\n```sql\nCREATE TABLE posts (\n    id SERIAL PRIMARY KEY,\n    title VARCHAR(255) NOT NULL,\n    content TEXT,\n    deleted_at TIMESTAMP NULL,  -- NULL = not deleted\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Query active posts\nSELECT * FROM posts WHERE deleted_at IS NULL;\n```\n\n### Audit Trail Pattern\n```sql\nCREATE TABLE audit_log (\n    id SERIAL PRIMARY KEY,\n    table_name VARCHAR(50) NOT NULL,\n    record_id INTEGER NOT NULL,\n    action VARCHAR(10) NOT NULL,  -- INSERT, UPDATE, DELETE\n    old_values JSONB,\n    new_values JSONB,\n    user_id INTEGER REFERENCES users(id),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_audit_table_record ON audit_log(table_name, record_id);\n```\n\n## Best Practices\n\n1. **Always define PRIMARY KEY** - Every table needs one\n2. **Use foreign keys** - Enforce referential integrity\n3. **Add NOT NULL** - Unless the column is truly optional\n4. **Create indexes** - On foreign keys and frequently queried columns\n5. **Use appropriate types** - Don't store numbers as strings\n6. **Add timestamps** - `created_at` and `updated_at` are almost always useful\n7. **Name consistently** - `user_id` not `userId` or `UserID`\n8. **Avoid reserved words** - Don't name columns `order`, `user`, `group`\n\n## Migration Safety\n\nWhen modifying existing tables:\n\n```sql\n-- Safe: Adding nullable column\nALTER TABLE users ADD COLUMN phone VARCHAR(20);\n\n-- Safe: Adding column with default\nALTER TABLE users ADD COLUMN active BOOLEAN DEFAULT true;\n\n-- Caution: Adding NOT NULL (requires default or backfill)\nALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';\n\n-- Caution: Dropping column (data loss)\nALTER TABLE users DROP COLUMN old_column;\n\n-- Caution: Changing type (may fail on existing data)\nALTER TABLE users ALTER COLUMN age TYPE INTEGER;\n```\n","frontmatter":{"name":"schema-designer","description":"Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships."},"isInternal":false,"tokens":1368,"sizeBytes":5691},{"name":"SKILL.md","path":"cli/external-plugin/whodb/skills/whodb/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/skills/whodb/SKILL.md","title":"whodb","category":"anthropic-skill","format":"markdown","content":"---\nname: whodb\ndescription: Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured.\n---\n\n# WhoDB Database Assistant\n\nYou have access to WhoDB for database operations. Use these tools and commands to help users with database tasks.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n### Database tools\n\nWhen database-only MCP is configured, use these tools directly:\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: List of connection names with type and source (env/saved).\n```\n\n### whodb_query\nExecute SQL queries against a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- query: SQL query to execute\n\nExample: whodb_query(connection=\"mydb\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### whodb_schemas\nList all schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n\nExample: whodb_schemas(connection=\"mydb\")\n```\n\n### whodb_tables\nList all tables in a schema.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- schema: Schema name (optional, uses default if not specified)\n\nExample: whodb_tables(connection=\"mydb\", schema=\"public\")\n```\n\n### whodb_columns\nDescribe columns in a table.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- table: Table name (required)\n- schema: Schema name (optional)\n\nExample: whodb_columns(connection=\"mydb\", table=\"users\")\n```\n\n## CLI Commands (Fallback)\n\nIf MCP tools are unavailable, use the CLI directly via Bash:\n\n### Query Execution\n```bash\nwhodb query \"SELECT * FROM users LIMIT 10\" --connection mydb --format json\n```\n\n### Schema Discovery\n```bash\n# List schemas\nwhodb schemas --connection mydb --format json\n\n# List tables\nwhodb tables --connection mydb --schema public --format json\n\n# Describe columns\nwhodb columns --connection mydb --table users --format json\n```\n\n### Connection Management\n```bash\n# List connections\nwhodb connections list --format json\n\n# Test connection\nwhodb connections test mydb\n\n# Add new connection (interactive)\nwhodb connections add --name mydb --type Postgres --host localhost --database mydb\n```\n\n### Data Export\n```bash\n# Export to CSV\nwhodb export --connection mydb --table users --output users.csv\n\n# Export query results\nwhodb export --connection mydb --query \"SELECT * FROM orders\" --output orders.xlsx\n```\n\n## Workflow Examples\n\n### Explore a New Database\n1. List connections: `whodb_connections`\n2. List schemas: `whodb_schemas(connection=\"name\")`\n3. List tables: `whodb_tables(connection=\"name\", schema=\"public\")`\n4. Describe table: `whodb_columns(connection=\"name\", table=\"users\")`\n5. Sample data: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\n### Answer Data Questions\n1. Understand the schema first - check table structure\n2. Write targeted queries with appropriate filters\n3. Always use LIMIT for exploratory queries\n4. Present results in a clear, readable format\n\n## Best Practices\n\n- **Always explore schema first** before writing queries\n- **Use LIMIT** for exploratory queries to avoid overwhelming output\n- **Prefer specific columns** over SELECT * for clarity\n- **Check foreign keys** via whodb_columns to understand relationships\n- **Use JSON format** (--format json) when parsing output programmatically\n- **Never expose credentials** - use connection names, not connection strings\n","frontmatter":{"name":"whodb","description":"Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured."},"isInternal":false,"tokens":1642,"sizeBytes":7261},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli-darwin-arm64/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/package.json","title":"Whodb-cli-darwin-arm64 Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli-darwin-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/package.json)","tokens":300,"sizeBytes":244},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml","title":"Whodb-cli-darwin-arm64 Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli-darwin-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-arm64/pnpm-lock.yaml)","tokens":300,"sizeBytes":248},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli-darwin-x64/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/package.json","title":"Whodb-cli-darwin-x64 Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli-darwin-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/package.json)","tokens":300,"sizeBytes":238},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml","title":"Whodb-cli-darwin-x64 Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli-darwin-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-darwin-x64/pnpm-lock.yaml)","tokens":300,"sizeBytes":242},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli-linux-arm/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/package.json","title":"Whodb-cli-linux-arm Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli-linux-arm Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/package.json)","tokens":300,"sizeBytes":235},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml","title":"Whodb-cli-linux-arm Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli-linux-arm Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm/pnpm-lock.yaml)","tokens":300,"sizeBytes":239},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli-linux-arm64/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/package.json","title":"Whodb-cli-linux-arm64 Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli-linux-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/package.json)","tokens":300,"sizeBytes":241},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml","title":"Whodb-cli-linux-arm64 Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli-linux-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-arm64/pnpm-lock.yaml)","tokens":300,"sizeBytes":245},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli-linux-x64/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/package.json","title":"Whodb-cli-linux-x64 Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli-linux-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/package.json)","tokens":300,"sizeBytes":235},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml","title":"Whodb-cli-linux-x64 Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli-linux-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-linux-x64/pnpm-lock.yaml)","tokens":300,"sizeBytes":239},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli-win32-arm64/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/package.json","title":"Whodb-cli-win32-arm64 Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli-win32-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-arm64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/package.json)","tokens":300,"sizeBytes":241},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml","title":"Whodb-cli-win32-arm64 Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli-win32-arm64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-arm64/pnpm-lock.yaml)","tokens":300,"sizeBytes":245},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli-win32-x64/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/package.json","title":"Whodb-cli-win32-x64 Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli-win32-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-x64/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/package.json)","tokens":300,"sizeBytes":235},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml","title":"Whodb-cli-win32-x64 Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli-win32-x64 Skill\n\nPath: `cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli-win32-x64/pnpm-lock.yaml)","tokens":300,"sizeBytes":239},{"name":"package.json","path":"cli/npm-package/packages/whodb-cli/package.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/package.json","title":"Whodb-cli Skill","category":"anthropic-skill","format":"json","content":"# Whodb-cli Skill\n\nPath: `cli/npm-package/packages/whodb-cli/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/package.json)","tokens":300,"sizeBytes":205},{"name":"pnpm-lock.yaml","path":"cli/npm-package/packages/whodb-cli/pnpm-lock.yaml","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/pnpm-lock.yaml","title":"Whodb-cli Skill","category":"anthropic-skill","format":"yaml","content":"# Whodb-cli Skill\n\nPath: `cli/npm-package/packages/whodb-cli/pnpm-lock.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/pnpm-lock.yaml)","tokens":300,"sizeBytes":209},{"name":"SKILL.md","path":"cli/skills/query-builder/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/skills/query-builder/SKILL.md","title":"query-builder","category":"anthropic-skill","format":"markdown","content":"---\nname: query-builder\ndescription: Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\".\n---\n\n# Query Builder\n\nConvert natural language questions into SQL queries using the database schema.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks questions like:\n- \"Show me all users who signed up last month\"\n- \"Find orders greater than $100\"\n- \"Which products have low inventory?\"\n- \"Get the top 10 customers by total spend\"\n\n## Workflow\n\n### 1. Understand the Schema\nBefore generating SQL, get tables and columns in one call:\n\n```\nwhodb_tables(connection=\"...\", include_columns=true) → Get all tables AND their column names, types, and keys\n```\n\n### 2. Identify Intent\nParse the natural language request:\n- **Subject**: What entity? (users, orders, products)\n- **Filter**: What conditions? (last month, > $100, active)\n- **Aggregation**: Count, sum, average, max, min?\n- **Grouping**: By what dimension?\n- **Ordering**: Sort by what? Ascending/descending?\n- **Limit**: How many results?\n\n### 3. Map to Schema\n- Match entities to table names\n- Match attributes to column names\n- Identify foreign key joins needed\n\n### 4. Generate SQL\nBuild the query following SQL best practices:\n\n```sql\nSELECT columns\nFROM table\n[JOIN other_table ON condition]\nWHERE filters\n[GROUP BY columns]\n[HAVING aggregate_condition]\nORDER BY column [ASC|DESC]\nLIMIT n;\n```\n\n### 5. Execute and Present\n```\nwhodb_query(query=\"generated SQL\")\n```\n\n## Translation Patterns\n\n| Natural Language | SQL Pattern |\n|------------------|-------------|\n| \"last week/month/year\" | `WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK)` |\n| \"more than X\" / \"greater than X\" | `WHERE col > X` |\n| \"top N\" | `ORDER BY col DESC LIMIT N` |\n| \"how many\" | `SELECT COUNT(*)` |\n| \"total\" / \"sum of\" | `SELECT SUM(col)` |\n| \"average\" | `SELECT AVG(col)` |\n| \"for each\" / \"by\" | `GROUP BY col` |\n| \"between X and Y\" | `WHERE col BETWEEN X AND Y` |\n| \"contains\" / \"like\" | `WHERE col LIKE '%term%'` |\n| \"starts with\" | `WHERE col LIKE 'term%'` |\n| \"is empty\" / \"is null\" | `WHERE col IS NULL` |\n| \"is not empty\" | `WHERE col IS NOT NULL` |\n\n## Date Handling by Database\n\n### PostgreSQL\n```sql\nWHERE created_at >= NOW() - INTERVAL '7 days'\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\n```\n\n### MySQL\n```sql\nWHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)\nWHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')\n```\n\n### SQLite\n```sql\nWHERE created_at >= DATE('now', '-7 days')\nWHERE created_at >= DATE('now', 'start of month')\n```\n\n## Examples\n\n### \"Show me users who signed up this month\"\n```sql\nSELECT * FROM users\nWHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)\nORDER BY created_at DESC;\n```\n\n### \"Find the top 5 products by sales\"\n```sql\nSELECT p.name, SUM(oi.quantity) as total_sold\nFROM products p\nJOIN order_items oi ON p.id = oi.product_id\nGROUP BY p.id, p.name\nORDER BY total_sold DESC\nLIMIT 5;\n```\n\n### \"How many orders per customer?\"\n```sql\nSELECT customer_id, COUNT(*) as order_count\nFROM orders\nGROUP BY customer_id\nORDER BY order_count DESC;\n```\n\n## Safety Rules\n\n- Always use LIMIT for exploratory queries (default: 100)\n- Never generate DELETE, UPDATE, or DROP unless explicitly requested\n- Warn if query might return large result sets\n- Use table aliases for readability in JOINs\n","frontmatter":{"name":"query-builder","description":"Convert natural language questions into SQL queries. Activates when users ask data questions in plain English like \"show me users who signed up last week\" or \"find orders over $100\"."},"isInternal":false,"tokens":929,"sizeBytes":3611},{"name":"SKILL.md","path":"cli/skills/schema-designer/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/skills/schema-designer/SKILL.md","title":"schema-designer","category":"anthropic-skill","format":"markdown","content":"---\nname: schema-designer\ndescription: Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.\n---\n\n# Schema Designer\n\nHelp users design database schemas, create tables, and model data relationships.\n\nThese database-only MCP tools require the database module enabled through `whodb setup`. Keep the MCP command at `whodb mcp serve`. For platform resources, use the WhoDB skill and discover available `whodb_platform_*` tools instead.\n\n## When to Use\n\nActivate when user asks:\n- \"Create a table for storing orders\"\n- \"Design a schema for a blog\"\n- \"Add a column to track user preferences\"\n- \"How should I model this relationship?\"\n\n## Workflow\n\n### 1. Understand Requirements\nAsk clarifying questions:\n- What data needs to be stored?\n- What are the relationships between entities?\n- What queries will be common?\n- What's the expected data volume?\n\n### 2. Check Existing Schema\n```\nwhodb_tables(include_columns=true) → See all tables and their columns in one call\n```\n\n### 3. Design the Schema\nFollow database design principles:\n- Normalize to reduce redundancy\n- Use appropriate data types\n- Define primary keys\n- Establish foreign key relationships\n- Add indexes for common queries\n\n### 4. Generate DDL\nProvide CREATE TABLE statements with explanations.\n\n## Data Type Guidelines\n\n### Identifiers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Auto-increment ID | `SERIAL` / `BIGSERIAL` | `INT AUTO_INCREMENT` | `INTEGER PRIMARY KEY` |\n| UUID | `UUID` | `CHAR(36)` | `TEXT` |\n\n### Text\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Short text (<255) | `VARCHAR(n)` | `VARCHAR(n)` | `TEXT` |\n| Long text | `TEXT` | `TEXT` | `TEXT` |\n| Fixed length | `CHAR(n)` | `CHAR(n)` | `TEXT` |\n\n### Numbers\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Integer | `INTEGER` | `INT` | `INTEGER` |\n| Big integer | `BIGINT` | `BIGINT` | `INTEGER` |\n| Decimal (money) | `NUMERIC(10,2)` | `DECIMAL(10,2)` | `REAL` |\n| Float | `REAL` | `FLOAT` | `REAL` |\n\n### Dates\n| Use Case | PostgreSQL | MySQL | SQLite |\n|----------|------------|-------|--------|\n| Date only | `DATE` | `DATE` | `TEXT` |\n| Timestamp | `TIMESTAMP` | `DATETIME` | `TEXT` |\n| With timezone | `TIMESTAMPTZ` | `TIMESTAMP` | `TEXT` |\n\n### Boolean\n| PostgreSQL | MySQL | SQLite |\n|------------|-------|--------|\n| `BOOLEAN` | `TINYINT(1)` | `INTEGER` |\n\n## Common Patterns\n\n### Users Table\n```sql\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    email VARCHAR(255) NOT NULL UNIQUE,\n    password_hash VARCHAR(255) NOT NULL,\n    name VARCHAR(100),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_users_email ON users(email);\n```\n\n### One-to-Many (Orders → Order Items)\n```sql\nCREATE TABLE orders (\n    id SERIAL PRIMARY KEY,\n    user_id INTEGER NOT NULL REFERENCES users(id),\n    status VARCHAR(20) DEFAULT 'pending',\n    total NUMERIC(10,2),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE order_items (\n    id SERIAL PRIMARY KEY,\n    order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,\n    product_id INTEGER NOT NULL REFERENCES products(id),\n    quantity INTEGER NOT NULL DEFAULT 1,\n    unit_price NUMERIC(10,2) NOT NULL\n);\n\nCREATE INDEX idx_order_items_order ON order_items(order_id);\n```\n\n### Many-to-Many (Users ↔ Roles)\n```sql\nCREATE TABLE roles (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(50) NOT NULL UNIQUE\n);\n\nCREATE TABLE user_roles (\n    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n    role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,\n    PRIMARY KEY (user_id, role_id)\n);\n```\n\n### Soft Delete Pattern\n```sql\nCREATE TABLE posts (\n    id SERIAL PRIMARY KEY,\n    title VARCHAR(255) NOT NULL,\n    content TEXT,\n    deleted_at TIMESTAMP NULL,  -- NULL = not deleted\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Query active posts\nSELECT * FROM posts WHERE deleted_at IS NULL;\n```\n\n### Audit Trail Pattern\n```sql\nCREATE TABLE audit_log (\n    id SERIAL PRIMARY KEY,\n    table_name VARCHAR(50) NOT NULL,\n    record_id INTEGER NOT NULL,\n    action VARCHAR(10) NOT NULL,  -- INSERT, UPDATE, DELETE\n    old_values JSONB,\n    new_values JSONB,\n    user_id INTEGER REFERENCES users(id),\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX idx_audit_table_record ON audit_log(table_name, record_id);\n```\n\n## Best Practices\n\n1. **Always define PRIMARY KEY** - Every table needs one\n2. **Use foreign keys** - Enforce referential integrity\n3. **Add NOT NULL** - Unless the column is truly optional\n4. **Create indexes** - On foreign keys and frequently queried columns\n5. **Use appropriate types** - Don't store numbers as strings\n6. **Add timestamps** - `created_at` and `updated_at` are almost always useful\n7. **Name consistently** - `user_id` not `userId` or `UserID`\n8. **Avoid reserved words** - Don't name columns `order`, `user`, `group`\n\n## Migration Safety\n\nWhen modifying existing tables:\n\n```sql\n-- Safe: Adding nullable column\nALTER TABLE users ADD COLUMN phone VARCHAR(20);\n\n-- Safe: Adding column with default\nALTER TABLE users ADD COLUMN active BOOLEAN DEFAULT true;\n\n-- Caution: Adding NOT NULL (requires default or backfill)\nALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';\n\n-- Caution: Dropping column (data loss)\nALTER TABLE users DROP COLUMN old_column;\n\n-- Caution: Changing type (may fail on existing data)\nALTER TABLE users ALTER COLUMN age TYPE INTEGER;\n```\n","frontmatter":{"name":"schema-designer","description":"Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships."},"isInternal":false,"tokens":1363,"sizeBytes":5661},{"name":"SKILL.md","path":"cli/skills/whodb/SKILL.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/skills/whodb/SKILL.md","title":"whodb","category":"anthropic-skill","format":"markdown","content":"---\nname: whodb\ndescription: Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured.\n---\n\n# WhoDB Database Assistant\n\nYou have access to WhoDB for database operations. Use these tools and commands to help users with database tasks.\n\n## Platform MCP (default)\n\n`whodb mcp serve` exposes hosted platform tools. Sign in to each required host with\n`whodb login --host <url>`. Start with `whodb_platform_hosts` to discover saved\nhosts and accounts, then `whodb_platform_orgs` with `workspace: {host}` and\n`whodb_platform_projects` with `workspace: {host, org}`.\n\nWhen the user wants the whole conversation on one host (for example UAT or\nproduction), call `whodb_platform_session_use` once with\n`workspace: {host, org, project}`. It verifies the login, resolves canonical IDs,\nand becomes the default for later calls in this MCP session only. It is never\nsaved to disk, so other chats and terminals keep their own defaults. Confirm\nwith `whodb_platform_status`, which reports `session_scope`. Use\n`whodb_platform_session_clear` to drop it.\n\nFor one-off calls to another host or project, pass an explicit\n`workspace: {host, org, project}` on that call. Resolve it first with\n`whodb_platform_workspace_resolve` if unsure. Per-call targets, including\nparallel calls, never change the session default or saved defaults. Check the\nreturned `scope`. Resolution order for an omitted `workspace`: session default,\nthen process overrides, then saved defaults. Do not run `whodb use` to switch\nhosts for one chat; it rewrites the saved default for every session. Read\n`whodb://platform/schema` for operations and payloads.\n\nTo answer a question about ontology data, call `whodb_platform_ontology_describe`\nfirst to learn entity and property names, then `whodb_platform_ontology_aggregate`\nfor exact counts, sums and group-bys, or `whodb_platform_ontology_query` for\nfiltered rows, search and joins (bounded scan, max 5000 rows). Drill into rows\nwith `whodb_platform_ontology_rows`. For bulk inserts use\n`whodb_platform_add_ontology_records` with an `idempotency_key`. Preview behavior\nactions with `whodb_platform_ontology_action_preview` before executing them.\n\nWrites return a preview bound to its host, account, organization, and project.\nConfirm only after approval of that exact preview. Changing defaults does not\nredirect a pending confirmation. Ask for `whodb login --host <url>` when a host\nneeds authentication; no separate login is needed per project.\n\n## Guided setup\n\nThis skill is optional. WhoDB MCP supplies its own instructions, tool schemas,\nand setup guidance. Prefer live MCP discovery if this skill differs from it.\nKeep one entry: command `whodb`, args `[\"mcp\", \"serve\"]`.\n\nUse `whodb_mcp_setup` with `action: \"inspect\"` to discover settings, targets,\nchoices, and the settings schema. Ask the user what they want, then use\n`action: \"preview\"` with a `patch`. Show the proposed settings and obtain approval\nbefore `action: \"apply\"` with the returned `confirmation_token` and `approved: true`.\nDo not send a patch with apply. Tokens expire after five minutes; only the latest\npreview is valid. Restart MCP after changed settings, then use `action: \"verify\"`.\nVerification checks active settings. Omitted patch fields are preserved.\n\nNo shell access is required for this flow. Browser sign-in and credential entry\nremain user actions; never request credentials in chat. If setup tools are\nfiltered out, ask the user to run `whodb setup`. CLI agents can alternatively use\n`whodb setup inspect`, `validate`, `apply --yes`, and `verify`.\nInspect `whodb://mcp/configuration` for active modules and restrictions.\nPlatform calls target `workspace`; database calls target `connection`.\n\n## Database-only MCP\n\nEnable the database module through `whodb setup`; both modules can run in the same `whodb mcp serve` connection. `--database` remains an advanced process override.\nThis connects directly to databases without a WhoDB platform server; databases\ncan be remote. The terminal UI is available with `whodb --tui`.\n\n### Database tools\n\nWhen database-only MCP is configured, use these tools directly:\n\n### whodb_connections\nList all available database connections.\n```\nNo parameters required.\nReturns: List of connection names with type and source (env/saved).\n```\n\n### whodb_query\nExecute SQL queries against a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- query: SQL query to execute\n\nExample: whodb_query(connection=\"mydb\", query=\"SELECT * FROM users LIMIT 10\")\n```\n\n### whodb_schemas\nList all schemas in a database.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- include_tables: Set true to also return tables within each schema (optional)\n\nExample: whodb_schemas(connection=\"mydb\")\nExample: whodb_schemas(connection=\"mydb\", include_tables=true)\n```\n\n### whodb_tables\nList all tables in a schema.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- schema: Schema name (optional, uses default if not specified)\n- include_columns: Set true to also return column details for every table (optional)\n\nExample: whodb_tables(connection=\"mydb\", schema=\"public\")\nExample: whodb_tables(connection=\"mydb\", schema=\"public\", include_columns=true)\n```\n\n### whodb_columns\nDescribe columns in a table.\n```\nParameters:\n- connection: Connection name (optional if only one connection exists)\n- table: Table name (required)\n- schema: Schema name (optional)\n\nExample: whodb_columns(connection=\"mydb\", table=\"users\")\n```\n\n## CLI Commands (Fallback)\n\nIf MCP tools are unavailable, use the CLI directly via Bash:\n\n### Query Execution\n```bash\nwhodb query \"SELECT * FROM users LIMIT 10\" --connection mydb --format json\n```\n\n### Schema Discovery\n```bash\n# List schemas\nwhodb schemas --connection mydb --format json\n\n# List tables\nwhodb tables --connection mydb --schema public --format json\n\n# Describe columns\nwhodb columns --connection mydb --table users --format json\n```\n\n### Connection Management\n```bash\n# List connections\nwhodb connections list --format json\n\n# Test connection\nwhodb connections test mydb\n\n# Add new connection (interactive)\nwhodb connections add --name mydb --type Postgres --host localhost --database mydb\n```\n\n### Data Export\n```bash\n# Export to CSV\nwhodb export --connection mydb --table users --output users.csv\n\n# Export query results\nwhodb export --connection mydb --query \"SELECT * FROM orders\" --output orders.xlsx\n```\n\n## Workflow Examples\n\n### Explore a New Database (Efficient)\n1. List connections: `whodb_connections`\n2. Get tables with columns in one call: `whodb_tables(connection=\"name\", include_columns=true)`\n3. Sample data: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\nQuery results include `column_types` alongside column names, so you know the data types without a separate call.\n\n### Explore a New Database (Multi-Schema)\n1. List connections: `whodb_connections`\n2. Get all schemas with tables: `whodb_schemas(connection=\"name\", include_tables=true)`\n3. Get columns for the schema you care about: `whodb_tables(connection=\"name\", schema=\"public\", include_columns=true)`\n4. Query: `whodb_query(connection=\"name\", query=\"SELECT * FROM users LIMIT 5\")`\n\n### Answer Data Questions\n1. Understand the schema first - check table structure\n2. Write targeted queries with appropriate filters\n3. Always use LIMIT for exploratory queries\n4. Present results in a clear, readable format\n\n## Best Practices\n\n- **Always explore schema first** before writing queries\n- **Use LIMIT** for exploratory queries to avoid overwhelming output\n- **Prefer specific columns** over SELECT * for clarity\n- **Check foreign keys** via whodb_columns to understand relationships\n- **Use JSON format** (--format json) when parsing output programmatically\n- **Never expose credentials** - use connection names, not connection strings\n","frontmatter":{"name":"whodb","description":"Work with WhoDB platform hosts, organizations, projects, and resources through MCP, or use database-only MCP tools when database mode is configured."},"isInternal":false,"tokens":1795,"sizeBytes":7973},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"@AGENTS.md\n\n## Claude Code\n\n- Use plan mode for multi-file, risky, architectural, or ambiguous changes.\n- Use subagents only for bounded sidecar work: exploration, review, test triage, or documentation lookup.\n- Prefer separate worktrees for parallel implementation sessions.\n- When a task touches `ee/`, follow `ee/AGENTS.md`; if running Claude Code inside `ee/`, `ee/CLAUDE.md` imports that overlay.\n","isInternal":false,"tokens":96,"sizeBytes":402},{"name":"plugin.json","path":"cli/external-plugin/whodb/.claude-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/.claude-plugin/plugin.json","title":"claude-plugin Plugin Manifest","category":"plugin-manifest","format":"json","content":"# claude-plugin Plugin Manifest\n\nPath: `cli/external-plugin/whodb/.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/.claude-plugin/plugin.json)","tokens":300,"sizeBytes":229},{"name":"README.md","path":"cli/npm-package/packages/whodb-cli/README.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/README.md","title":"whodb-cli Documentation","category":"plugin-manifest","format":"markdown","content":"# whodb-cli Documentation\n\nPath: `cli/npm-package/packages/whodb-cli/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/npm-package/packages/whodb-cli/README.md)","tokens":300,"sizeBytes":207},{"name":"plugin.json","path":"cli/plugin.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/plugin.json","title":"cli Plugin Manifest","category":"plugin-manifest","format":"json","content":"# cli Plugin Manifest\n\nPath: `cli/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/plugin.json)","tokens":300,"sizeBytes":145},{"name":"hooks.json","path":".codex/hooks.json","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/.codex/hooks.json","title":"Codex Directive: hooks.json","category":"codex-rule","format":"markdown","content":"{\n  \"hooks\": {\n    \"SessionStart\": [\n      {\n        \"matcher\": \"startup|resume\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/session-context.sh\\\"\",\n            \"statusMessage\": \"Loading session context\",\n            \"timeout\": 30\n          }\n        ]\n      }\n    ],\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"^apply_patch$|Edit|Write\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-format-go.sh\\\"\",\n            \"statusMessage\": \"Formatting Go files\",\n            \"timeout\": 60\n          },\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-lint-ts.sh\\\"\",\n            \"statusMessage\": \"Linting TypeScript files\",\n            \"timeout\": 120\n          },\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/auto-graphql-codegen.sh\\\"\",\n            \"statusMessage\": \"Regenerating GraphQL types\",\n            \"timeout\": 300\n          }\n        ]\n      },\n      {\n        \"matcher\": \"Edit|Write|apply_patch\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"[ ! -f \\\".agents/skills/impeccable/scripts/impeccable\\\" ] || \\\".agents/skills/impeccable/scripts/impeccable\\\" hook\",\n            \"commandWindows\": \"cmd /c if exist \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" hook\",\n            \"timeout\": 5,\n            \"statusMessage\": \"Checking UI changes\"\n          }\n        ]\n      }\n    ],\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"bash \\\"$(git rev-parse --show-toplevel)/.agents/hooks/verify-build.sh\\\"\",\n            \"statusMessage\": \"Verifying build / type-check\",\n            \"timeout\": 600\n          }\n        ]\n      },\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"[ ! -f \\\".agents/skills/impeccable/scripts/impeccable\\\" ] || \\\".agents/skills/impeccable/scripts/impeccable\\\" hook\",\n            \"commandWindows\": \"cmd /c if exist \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" \\\".agents\\\\skills\\\\impeccable\\\\scripts\\\\impeccable.cmd\\\" hook\",\n            \"timeout\": 30,\n            \"statusMessage\": \"Design deep pass\"\n          }\n        ]\n      }\n    ]\n  }\n}\n","frontmatter":{"hooks":{"SessionStart":[{"matcher":"startup|resume","hooks":[{"type":"command","command":"bash \"$(git rev-parse --show-toplevel)/.agents/hooks/session-context.sh\"","statusMessage":"Loading session context","timeout":30}]}],"PostToolUse":[{"matcher":"^apply_patch$|Edit|Write","hooks":[{"type":"command","command":"bash \"$(git rev-parse --show-toplevel)/.agents/hooks/auto-format-go.sh\"","statusMessage":"Formatting Go files","timeout":60},{"type":"command","command":"bash \"$(git rev-parse --show-toplevel)/.agents/hooks/auto-lint-ts.sh\"","statusMessage":"Linting TypeScript files","timeout":120},{"type":"command","command":"bash \"$(git rev-parse --show-toplevel)/.agents/hooks/auto-graphql-codegen.sh\"","statusMessage":"Regenerating GraphQL types","timeout":300}]},{"matcher":"Edit|Write|apply_patch","hooks":[{"type":"command","command":"[ ! -f \".agents/skills/impeccable/scripts/impeccable\" ] || \".agents/skills/impeccable/scripts/impeccable\" hook","commandWindows":"cmd /c if exist \".agents\\skills\\impeccable\\scripts\\impeccable.cmd\" \".agents\\skills\\impeccable\\scripts\\impeccable.cmd\" hook","timeout":5,"statusMessage":"Checking UI changes"}]}],"Stop":[{"hooks":[{"type":"command","command":"bash \"$(git rev-parse --show-toplevel)/.agents/hooks/verify-build.sh\"","statusMessage":"Verifying build / type-check","timeout":600}]},{"hooks":[{"type":"command","command":"[ ! -f \".agents/skills/impeccable/scripts/impeccable\" ] || \".agents/skills/impeccable/scripts/impeccable\" hook","commandWindows":"cmd /c if exist \".agents\\skills\\impeccable\\scripts\\impeccable.cmd\" \".agents\\skills\\impeccable\\scripts\\impeccable.cmd\" hook","timeout":30,"statusMessage":"Design deep pass"}]}]}},"isInternal":false,"tokens":631,"sizeBytes":2532},{"name":"database-analyst.md","path":"cli/agents/database-analyst.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/database-analyst.md","title":"Subagent: database-analyst","category":"subagent-persona","format":"markdown","content":"# Subagent: database-analyst\n\nPath: `cli/agents/database-analyst.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/database-analyst.md)","tokens":300,"sizeBytes":182},{"name":"query-optimizer.md","path":"cli/agents/query-optimizer.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/query-optimizer.md","title":"Subagent: query-optimizer","category":"subagent-persona","format":"markdown","content":"# Subagent: query-optimizer\n\nPath: `cli/agents/query-optimizer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/query-optimizer.md)","tokens":300,"sizeBytes":179},{"name":"report-generator.md","path":"cli/agents/report-generator.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/report-generator.md","title":"Subagent: report-generator","category":"subagent-persona","format":"markdown","content":"# Subagent: report-generator\n\nPath: `cli/agents/report-generator.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/agents/report-generator.md)","tokens":300,"sizeBytes":182},{"name":"database-analyst.md","path":"cli/external-plugin/whodb/agents/database-analyst.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/database-analyst.md","title":"Subagent: database-analyst","category":"subagent-persona","format":"markdown","content":"# Subagent: database-analyst\n\nPath: `cli/external-plugin/whodb/agents/database-analyst.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/database-analyst.md)","tokens":300,"sizeBytes":226},{"name":"query-optimizer.md","path":"cli/external-plugin/whodb/agents/query-optimizer.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/query-optimizer.md","title":"Subagent: query-optimizer","category":"subagent-persona","format":"markdown","content":"# Subagent: query-optimizer\n\nPath: `cli/external-plugin/whodb/agents/query-optimizer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/query-optimizer.md)","tokens":300,"sizeBytes":223},{"name":"report-generator.md","path":"cli/external-plugin/whodb/agents/report-generator.md","rawUrl":"https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/report-generator.md","title":"Subagent: report-generator","category":"subagent-persona","format":"markdown","content":"# Subagent: report-generator\n\nPath: `cli/external-plugin/whodb/agents/report-generator.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/cli/external-plugin/whodb/agents/report-generator.md)","tokens":300,"sizeBytes":226}],"systemPromptSnippet":"<yakaai_skills repo=\"clidey/whodb\">\n<!-- File: AGENTS.md (Tokens: ~3090 | Category: root-instruction) -->\n# WhoDB Development Guide\n\nWhoDB is a source-first data management tool. The public GraphQL API and frontend\ncontract are built around `SourceType`, `SourceContract`, `SourceObject`,\n`SourceObjectRef`, and `SourceSessionMetadata`. The current execution layer is\nstill powered mainly by database plugins under `core/src/plugins/`.\n\n`AGENTS.md` is the canonical agent instruction file for this repository. Tool-\nspecific files such as `CLAUDE.md` should import or point to this file instead\nof duplicating these instructions.\n\nIf the `ee/` directory is present, read `ee/AGENTS.md` for additional context. Do not add any code, comments, or references to `ee/` in the CE codebase.\n\n## Git Commits — Hard Rule\n\n**Never commit to `main` (or any branch) without the user explicitly saying \"please commit this for me\" (or unambiguously equivalent wording) in that turn.** This applies regardless of task framing — \"merge it into main locally\" or \"just write the code changes in main\" means apply the file changes on that branch, not create a commit. If committing seems necessary to accomplish what was asked (e.g. to merge a branch), stop and ask first instead of assuming consent.\n\n## Terminology\n\n- **\"EE agent\" / \"ee agent\"** means the in-app WhoDB EE browser AI agent feature (under `ee/`), NOT the coding-agent (Claude/Codex) configuration or any MCP server. When in doubt, ask which is meant before acting.\n\n## Non-Negotiable Rules\n\n1. **GraphQL-first** - All new API functionality via GraphQL. Never add HTTP resolvers unless explicitly needed (e.g., file downloads)\n2. **No SQL injection** - Never use `fmt.Sprintf` with user input for SQL. Use parameterized queries or GORM builders. See `.agents/docs/sql-security.md`\n3. **Plugin architecture** - Never use `switch dbType` or `if dbType ==` in shared code. All database-specific logic goes in plugins. See `.agents/docs/plugin-architecture.md`\n4. **Documentation requirements** - All exported Go functions/types need doc comments. All exported TypeScript functions/components need JSDoc. See `.agents/docs/documentation.md`\n5. **Localization requirements** - All user-facing strings must use `t()` with YAML keys. No fallback strings. No hardcoded UI text. When adding or updating keys, edit `en_US` only unless the user explicitly asks for other languages. See `.agents/docs/localization.md`\n6. **Verify before completing** - For non-trivial tasks, define success criteria before editing. After finishing, verify: (1) type checks pass (`pnpm run build:ce` for frontend, `go build ./cmd/whodb` for backend), (2) no linting errors, (3) all added code is actually used (no dead code). See `.agents/docs/verification.md`\n7. **Show proof** - When making a claim about how something outside of our codebase works, for example a 3rd party library or function, always provide official documentation or the actual code to back that up. Check online if you have to.\n\n## Behavioral Guidelines\n\nThese guidelines reduce common LLM coding mistakes. They bias toward caution over speed — for trivial tasks, use judgment.\n\n### 1. Think Before Coding\n\n**Don't assume. Don't hide confusion. Surface tradeoffs.**\n\nBefore implementing:\n- State your assumptions explicitly. If uncertain, ask.\n- If multiple interpretations exist, present them — don't pick silently.\n- If a simpler approach exists, say so. Push back when warranted.\n- If something is unclear, stop. Name what's confusing. Ask.\n\n### 2. Simplicity First\n\n**Minimum code that solves the problem. Nothing speculative.**\n\n- No features beyond what was asked.\n- No abstractions for single-use code.\n- No \"flexibility\" or \"configurability\" that wasn't requested.\n- No error handling for impossible scenarios.\n- No fallback logic unless explicitly asked — if you think it's needed, ask first.\n- No defensive programming — if an edge case needs handling, ask first.\n- If you write 200 lines and it could be 50, rewrite it.\n- Right-size architecture. Start with the simplest surgical fix. Do not propose heavyweight patterns (Temporal workflows, outbox, saga, new infra) unless the simple fix is shown to be insufficient — and explain why before building it.\n\nAsk yourself: \"Would a senior engineer say this is overcomplicated?\" If yes, simplify.\n\n### 3. Surgical Changes\n\n**Touch only what you must. Clean up only your own mess.**\n\nWhen editing existing code:\n- Don't \"improve\" adjacent code, comments, or formatting.\n- Don't refactor things that aren't broken.\n- Match existing style, even if you'd do it differently.\n- If you notice unrelated dead code, mention it — don't delete it.\n\nWhen your changes create orphans:\n- Remove imports/variables/functions that YOUR changes made unused.\n- Don't remove pre-existing dead code unless asked.\n\nThe test: Every changed line should trace directly to the user's request.\n\n### 4. Goal-Driven Execution\n\n**Define success criteria. Loop until verified.**\n\nTransform tasks into verifiable goals:\n- \"Add validation\" → \"Write tests for invalid inputs, then make them pass\"\n- \"Fix the bug\" → \"Write a test that reproduces it, then make it pass\"\n- \"Refactor X\" → \"Ensure tests pass before and after\"\n\nFor debugging, confirm the root cause with evidence (a log, trace, or minimal repro) before changing code. Don't fix-and-see; if the first fix doesn't hold, re-diagnose rather than trying another speculative fix.\n\nFor multi-step tasks, state a brief plan:\n```\n1. [Step] → verify: [check]\n2. [Step] → verify: [check]\n3. [Step] → verify: [check]\n```\n\nStrong success criteria let you loop independently. Weak criteria (\"make it work\") require constant clarification.\n\n### 5. CSS and Styling Changes\n\n**Diagnose before editing. One targeted change at a time.**\n\n- For a styling fix, state the specific approach (which selector/property/value and why) before editing.\n- Make one targeted change at a time; don't broadly rewrite styles speculatively.\n- If a styling fix fails twice, stop and ask for guidance (or a reference screenshot / exact value) rather than continuing to guess.\n\n## Execution Workflow\n\nFor non-trivial tasks, use a short goal-driven loop:\n\n1. Identify the expected behavior or failure path.\n2. Choose the smallest change that satisfies the request.\n3. Add or update focused tests when the behavior is testable and the risk justifies it.\n4. Run the relevant verification commands and inspect the diff before finishing.\n\n## Agent Operating Model\n\n- Treat `AGENTS.md` as the shared source of truth for Codex, Claude Code via import, opencode, Pi, and other compatible coding agents.\n- Use `.agents/README.md` as the index for deeper agent guidance, and read only the relevant linked file before editing.\n- Keep always-loaded instructions concise. Move detailed workflows, checklists, and runbooks into linked docs rather than duplicating them in tool-specific files.\n- Use planning mode for multi-file, risky, architectural, or ambiguous changes. Skip formal plans for obvious single-purpose edits.\n- Use separate agents only for bounded sidecar work such as codebase exploration, review, test triage, or documentation lookup. Do not delegate blocking implementation work when the main session is waiting on it.\n- Do not run parallel implementation sessions against the same files. Use separate worktrees or explicitly disjoint file ownership for parallel work.\n- Ask review-oriented agents to find correctness, regression, security, and missing-test issues first; summaries are secondary.\n\n## Project Structure\n\n```\ncore/                   # Backend (Go)\n  cmd/whodb/main.go     # Entry point — imports plugins and creates GraphQL schema\n  src/app/app.go        # AppConfig + Run() — shared server logic\n  src/src.go            # Engine initialization (collects from global plugin registry)\n  src/engine/registry.go # Global plugin registry (plugins self-register via init())\n  src/engine/plugin.go  # PluginFunctions interface\n  src/source/           # Source-first public contract + connector/session interfaces\n  src/sourcecatalog/    # Public source catalog exposed to GraphQL/frontend\n  src/dbcatalog/        # Internal connectable-database catalog adapted into sourcecatalog\n  src/env/              # Environment variable declarations (pure, no log dependency)\n  src/envconfig/        # Config-loading functions that need both env and log\n  src/plugins/          # Database connectors (each has init() calling engine.RegisterPlugin)\n                        # Includes: postgres, mysql, sqlite3, mongodb, redis, elasticsearch,\n                        #           clickhouse, duckdb, memcached (+ mariadb via mysql)\n  graph/schema.graphqls # GraphQL schema\n  graph/*.resolvers.go  # GraphQL resolvers\n\nfrontend/               # React/TypeScript (uses @clidey/ux component library)\n  src/index.tsx        # Entry point\n  src/store/           # Redux Toolkit state\n  src/generated/       # GraphQL codegen output (@graphql alias)\n\ncli/                    # Interactive TUI CLI (Bubble Tea)\nsdk/                    # Platform SDKs (npm @clidey/whodb-sdk, PyPI whodb) — own pnpm\n                        # project; wire cores generated from sdk/spec/ (see sdk/README.md)\ndesktop-ce/             # Desktop app (Wails)\ndesktop-common/         # Shared desktop code\n\n.github/workflows/      # CI/CD pipelines (release, build, deploy)\n```\n\nAdditional agent docs: `.agents/docs/build-and-run.md` (CE setup and generation), `.agents/docs/data-sources.md` (adding data sources), `.agents/docs/cli.md` (CLI), `.agents/docs/desktop.md` (desktop), `.agents/docs/ci-cd.md` (GitHub Actions), `.agents/docs/testing.md` (testing), `.agents/docs/analytics.md` (PostHog analytics contract). EE-specific source additions are in `ee/.agents/docs/data-sources.md`.\n\n## Testing\n\nSee `.agents/docs/testing.md` for comprehensive testing documentation including:\n- Frontend Playwright E2E tests\n- Docker container setup for test databases\n- Go backend unit and integration tests\n- CLI tests\n\nQuick reference:\n```bash\n# Frontend Playwright E2E\ncd frontend && pnpm e2e:ce:headless         # Headless (all databases)\ncd frontend && pnpm e2e:ce                  # Interactive (headed)\n\n# Backend Go tests\nbash dev/run-backend-tests.sh all           # Unit + integration\n\n# CLI tests\nbash dev/run-cli-tests.sh                   # All CLI tests\n```\n\n## Domain-Specific Guidelines\n\nFor language-specific or domain-specific guidelines, refer to the shared rules in `.agents/rules/`:\n- Go Backend (`core/`, `cli/`): `.agents/rules/go-backend.md`\n- React Frontend (`frontend/`): `.agents/rules/react-frontend.md`\n- GraphQL (`**/graph/`, `**/*.graphqls`): `.agents/rules/graphql.md`\n- Localization (`**/locales/`): `.agents/rules/localization.md`\n- E2E Tests (`frontend/e2e/`): `.agents/rules/e2e-tests.md`\n- Desktop (`desktop-ce/`, `desktop-common/`): `.agents/rules/desktop.md`\n- CI/CD (`.github/`): `.agents/rules/ci-cd.md`\n\n## Procedures\n\nFor multi-step tasks, follow the step-by-step workflows in `.agents/workflows/`. Read the relevant file before starting:\n\n| Task | Guide |\n|------|-------|\n| Add a new database plugin | `.agents/workflows/new-plugin.md` |\n| Add a GraphQL query/mutation end-to-end | `.agents/workflows/new-graphql-field.md` |\n| Add a new frontend page | `.agents/workflows/new-frontend-page.md` |\n| Add or update translation keys | `.agents/workflows/add-translation.md` |\n| Add a CLI command or TUI view | `.agents/workflows/cli-feature.md` |\n| Add or modify desktop app functionality | `.agents/workflows/desktop-feature.md` |\n| Add a platform-constrained HTTP handler | `.agents/workflows/platform-constrained-handler.md` |\n| Prepare or consume a handoff | `.agents/workflows/task-handoff.md` |\n| Prove claims about external behavior | `.agents/workflows/research-proof.md` |\n| Pre-commit verification | `.agents/workflows/review-checklist.md` |\n\n## When Updating Dependencies\n\nUse `core/go.mod` as the reference point for dependency versions.\n\n## Commands Quick Reference\n\nSee `.agents/docs/commands.md` for full reference.\n\n```bash\n# Backend: cd core && go run ./cmd/whodb\n# Frontend: cd frontend && pnpm start\n# CLI: cd cli && go run .\n```\n\n## Architecture\n\n- **Plugin self-registration** — each plugin has `init() { engine.RegisterPlugin(...) }`. The entry point's blank imports control which plugins are registered\n- **Source-first public API** — new public GraphQL/frontend work should use `SourceTypes`, `SourceProfiles`, `SourceFieldOptions`, `SourceSessionMetadata`, `SourceObjects`, `SourceRows`, `RunSourceQuery`, and `SourceGraph`. Do not add new public `Database*` queries or capability surfaces\n- **AppConfig DI** — `core/src/app/app.go` defines `AppConfig` (schema, HTTP handlers). The entry point calls `app.Run(config, staticFiles)`\n- **HTTP route extensions** — CE-owned HTTP routes live in `core/graph/SetupHTTPServer`. Edition or platform add-ons register their own non-GraphQL routes with `graph.RegisterHTTPRoutes`; do not add add-on route names or unsupported stubs to CE.\n- **Frontend registries** — components (`registerComponent`), source types (`registerSourceTypeOverrides`), icons (`registerIcons`), and source utilities (`registerSourceUtilities`) can be registered at boot. The frontend renders from registries — if something isn't registered, it's not shown\n- **Import cycle note** — `src` → `router` → `graph` → `src` cycle exists. `Run()` lives in `src/app/` (not `src/`) to avoid it. Never add router/graph imports to `src/`\n\n## Development Principles\n\n- Clean, readable code over clever code\n- Prefer existing style and local helper APIs over new abstractions\n- Only comment edge cases and complex logic, not obvious code\n- Maintain professional, neutral tone without excessive enthusiasm\n\n<!-- File: DESIGN.md (Tokens: ~2382 | Category: project-spec) -->\n---\nname: WhoDB\ndescription: Lightweight, fast database management with quiet confidence\ncolors:\n  background-light: \"#FAF5EC\"\n  background-dark: \"#0E2240\"\n  foreground-light: \"#0E2240\"\n  foreground-dark: \"#FAF5EC\"\n  card-light: \"#FFFFFF\"\n  card-dark: \"#162B4A\"\n  popover-light: \"#FFFFFF\"\n  popover-dark: \"#1D3151\"\n  muted-foreground-light: \"#5C6778\"\n  muted-foreground-dark: \"#9BA5B3\"\n  primary-light: \"#2C6BD4\"\n  primary-dark: \"#5091FD\"\n  accent-light: \"#EAF0FB\"\n  accent-dark: \"#233E69\"\n  border-light: \"#D9D4CB\"\n  border-dark: \"#314667\"\n  brand-orange: \"#F4781C\"\n  highlight-yellow: \"#FFC233\"\n  destructive-light: \"#E30117\"\n  destructive-dark: \"#FF6668\"\ntypography:\n  body:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1rem\"\n    fontWeight: 400\n    lineHeight: 1.5\n  label:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"0.875rem\"\n    fontWeight: 500\n    lineHeight: 1.4\n  title:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.25rem\"\n    fontWeight: 600\n    lineHeight: 1.3\n  headline:\n    fontFamily: \"Hanken Grotesk, Inter, ui-sans-serif, system-ui, sans-serif\"\n    fontSize: \"1.5rem\"\n    fontWeight: 600\n    lineHeight: 1.25\n  mono:\n    fontFamily: \"JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\"\n    fontSize: \"0.875rem\"\n    fontWeight: 400\nrounded:\n  sm: \"0.375rem\"\n  md: \"0.5rem\"\n  lg: \"0.625rem\"\n  xl: \"0.75rem\"\nspacing:\n  xs: \"0.5rem\"\n  sm: \"0.75rem\"\n  md: \"1rem\"\n  lg: \"1.5rem\"\n  xl: \"2rem\"\ncomponents:\n  button-primary:\n    backgroundColor: \"{colors.primary-light}\"\n    textColor: \"#FFFFFF\"\n    rounded: \"{rounded.md}\"\n    padding: \"0.5rem 1rem\"\n  button-ghost:\n    backgroundColor: \"transparent\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.md}\"\n  card:\n    backgroundColor: \"{colors.card-light}\"\n    textColor: \"{colors.foreground-light}\"\n    rounded: \"{rounded.lg}\"\n    padding: \"1rem\"\n---\n\n# Design System: WhoDB\n\n## Overview\n\n**Creative North Star: \"Quiet Confidence\"**\n\nWhoDB is a database management tool for people who already know what they're doing. The interface doesn't perform competence — it assumes it. Every surface exists to frame data, never to decorate it. All tokens flow from `@clidey/ux`'s Clidey brand kit (imported directly via `@import '@clidey/ux/brand.css'`): Paper/Ink dual-mode, Signal Blue as the product accent, Beacon Yellow as the single sanctioned highlight, Clidey Orange reserved for company-branded moments rather than general product UI.\n\nThe system explicitly rejects:\n- The cluttered, dated aesthetic of legacy database tools (phpMyAdmin, pgAdmin)\n- Corporate-gray enterprise bloat and wizard-driven flows\n- Mixed-hue decoration — more than one accent color competing on the same surface\n\n**Key Characteristics:**\n- Flat surfaces by default; depth comes from a lightness step between surfaces, not shadow or blur\n- Dual theme: Paper (light) and Ink (dark), both first-class\n- Hanken Grotesk carries the UI; Bricolage Grotesque is self-hosted and available (`brand-fonts.css`) but not currently applied anywhere in the product UI — treat it as reserved for a future display-heading use, not an active token\n- A user-facing density system (Settings) swaps font-size, radius, and spacing scales between small/medium/large and none/small/medium/large tiers respectively — the values below are the medium/default tier, not the only valid values\n- Token-driven styling via CSS custom properties from `@clidey/ux` — extend, don't override component internals with `!important`\n\n## Colors\n\nThe palette is Clidey's brand kit: Paper and Ink as the two surface worlds, Signal Blue as the product accent (lifts one lightness step in dark mode), Beacon Yellow as the single highlight, Clidey Orange reserved for company-branded emphasis.\n\n### Primary\n- **Signal Blue** (`#2C6BD4` light / `#5091FD` dark): Interactive affordances — buttons, links, focus rings, active states.\n\n### Secondary\n- **Clidey Orange** (`#F4781C`): Company-branded emphasis only, not general product UI. One accent per surface — don't mix with Signal Blue on the same card or banner.\n\n### Surfaces\n- **Background** (`#FAF5EC` Paper / `#0E2240` Ink): Page canvas, flat at rest.\n- **Card** (`#FFFFFF` light / `#162B4A` dark): One lightness step up from background.\n- **Popover** (`#FFFFFF` light / `#1D3151` dark): Menus, dropdowns, tooltips.\n\n### Borders\n- **Light mode:** `#D9D4CB`\n- **Dark mode:** `#314667`\n\n### Text\n- **Foreground** (`#0E2240` light / `#FAF5EC` dark): Primary body text.\n- **Muted Foreground** (`#5C6778` light / `#9BA5B3` dark): Secondary text, labels, descriptions. Always verify contrast against the actual surface the text sits on (`--card`, not just `--background`) — the dark-mode value was raised earlier after measuring under WCAG AA against `--card`.\n\n### Named Rules\n**The One-Accent Rule.** A single surface uses exactly one accent hue at a time. Blue leads product UI; orange leads company-branded moments. They do not mix on the same card or banner.\n\n## Typography\n\n**Primary Font:** Hanken Grotesk (with Inter, then system sans-serif fallback)\n**Mono Font:** JetBrains Mono, ui-monospace, SF Mono, Menlo, monospace\n\n**Character:** Single active UI typeface. Bricolage Grotesque is self-hosted alongside Hanken Grotesk but not wired into any component today — don't assume it renders anywhere until it's actually applied to an element.\n\n### Hierarchy (medium density tier — the default)\n- **3xl** (600, 1.875rem/30px): Rare hero text.\n- **2xl** (600, 1.5rem/24px): Headline.\n- **xl** (600, 1.25rem/20px): Title/section headers.\n- **lg** (500, 1.125rem/18px): Card titles, dialog headers.\n- **base** (400, 1rem/16px): Primary body text.\n- **sm** (400, 0.875rem/14px): Secondary text, labels.\n- **xs** (400, 0.75rem/12px): Metadata, captions.\n\n### Named Rules\n**The Density-Tier Rule.** Font sizes, radius, and spacing are all user-adjustable via Settings (small/medium/large tiers). Don't hardcode a pixel value where a `var(--font-size-*)`/`var(--radius-*)`/`var(--spacing-*)` token exists — hardcoding breaks the density switch for that element.\n\n## Layout\n\nSpacing follows a `--spacing-{xs,sm,md,lg,xl,2xl,3xl}` scale, adjustable via the same density system (compact/comfortable/spacious tiers; comfortable is the default: 8/12/16/24/32/40/48px).\n\n## Elevation & Depth\n\nFlat by default — no shadow at rest. Depth is a lightness step between `--background` → `--card` → `--popover`, not an elevation effect.\n\n## Shapes\n\nRadius follows a `--radius-{sm,md,lg,xl}` scale derived from a single `--radius` primitive (`calc()`-based: sm = radius−4px, md = radius−2px, lg = radius, xl = radius+4px), also swappable via the density system. Medium/default: `--radius: 0.625rem` (10px), giving sm 6px / md 8px / lg 10px / xl 14px.\n\n## Components\n\nInteractive components are sourced from `@clidey/ux`. The app extends them through CSS custom properties in `frontend/src/index.css` and the density-mapping variables in `theme-customization.ts` — never by overriding component internals with `!important`.\n\n### Buttons\n- **Shape:** `{rounded.md}`\n- **Primary:** Signal Blue background, contrast-checked text.\n- **Ghost:** Transparent background, foreground text.\n\n### Cards\n- **Corner Style:** `{rounded.lg}`\n- **Background:** `var(--card)`, flat, no shadow at rest.\n\n### Icon tiles\n- **Pairing rule:** an icon tile's background token and its icon/text color token must be from different roles (e.g. `bg-icon` + `text-icon-foreground`, not `bg-icon` + `text-primary`) — a prior bug painted blue icon glyphs on a blue tile background because both referenced the same hue family. Always check the foreground/background pairing when introducing a new tinted tile.\n\n## Do's and Don'ts\n\n### Do:\n- **Do** use flat, token-driven backgrounds for all static surfaces.\n- **Do** use `var(--font-size-*)`, `var(--radius-*)`, and `var(--spacing-*)` tokens rather than hardcoded values, so the density-customization system keeps working.\n- **Do** respect both themes equally — verify contrast against the actual surface text sits on.\n- **Do** extend `@clidey/ux` via CSS custom properties, never by overriding component styles with `!important`.\n\n### Don't:\n- **Don't** mix Signal Blue and Clidey Orange on the same surface.\n- **Don't** add drop shadows to cards or containers at rest.\n- **Don't** assume Bricolage Grotesque renders anywhere — it's self-hosted but unused; Hanken Grotesk is the only active UI typeface.\n- **Don't** pair a tinted tile's background and foreground from the same color role (see the icon-tile bug above).\n- **Don't** use hardcoded color values (`bg-white`, `dark:bg-gray-800`). Use semantic tokens.\n\n<!-- File: .agents/rules/ci-cd.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Rules Skill\n\nPath: `.agents/rules/ci-cd.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/ci-cd.md)\n\n<!-- File: .agents/rules/desktop.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Rules Skill\n\nPath: `.agents/rules/desktop.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/desktop.md)\n\n<!-- File: .agents/rules/e2e-tests.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Rules Skill\n\nPath: `.agents/rules/e2e-tests.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/e2e-tests.md)\n\n<!-- File: .agents/rules/go-backend.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Rules Skill\n\nPath: `.agents/rules/go-backend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/go-backend.md)\n\n<!-- File: .agents/rules/graphql.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Rules Skill\n\nPath: `.agents/rules/graphql.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/graphql.md)\n\n<!-- File: .agents/rules/localization.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Rules Skill\n\nPath: `.agents/rules/localization.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/localization.md)\n\n<!-- File: .agents/rules/react-frontend.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Rules Skill\n\nPath: `.agents/rules/react-frontend.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/rules/react-frontend.md)\n\n<!-- File: .agents/skills/impeccable/agents/openai.yaml (Tokens: ~300 | Category: anthropic-skill) -->\n# Agents Skill\n\nPath: `.agents/skills/impeccable/agents/openai.yaml`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/agents/openai.yaml)\n\n<!-- File: .agents/skills/impeccable/reference/adapt.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.md)\n\n<!-- File: .agents/skills/impeccable/reference/adapt.native.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/adapt.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/adapt.native.md)\n\n<!-- File: .agents/skills/impeccable/reference/android.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/android.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/android.md)\n\n<!-- File: .agents/skills/impeccable/reference/animate.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/animate.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/animate.md)\n\n<!-- File: .agents/skills/impeccable/reference/audit.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.md)\n\n<!-- File: .agents/skills/impeccable/reference/audit.native.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/audit.native.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/audit.native.md)\n\n<!-- File: .agents/skills/impeccable/reference/bolder.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/bolder.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/bolder.md)\n\n<!-- File: .agents/skills/impeccable/reference/clarify.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/clarify.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/clarify.md)\n\n<!-- File: .agents/skills/impeccable/reference/colorize.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/colorize.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/colorize.md)\n\n<!-- File: .agents/skills/impeccable/reference/craft-floor.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft-floor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft-floor.md)\n\n<!-- File: .agents/skills/impeccable/reference/craft.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/craft.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/craft.md)\n\n<!-- File: .agents/skills/impeccable/reference/critique.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/critique.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/critique.md)\n\n<!-- File: .agents/skills/impeccable/reference/degraded/asset-producer.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/asset-producer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/asset-producer.md)\n\n<!-- File: .agents/skills/impeccable/reference/degraded/documenter.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/documenter.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/documenter.md)\n\n<!-- File: .agents/skills/impeccable/reference/degraded/finish-reviewer.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/finish-reviewer.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/finish-reviewer.md)\n\n<!-- File: .agents/skills/impeccable/reference/degraded/manual-edit-applier.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Degraded Skill\n\nPath: `.agents/skills/impeccable/reference/degraded/manual-edit-applier.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/degraded/manual-edit-applier.md)\n\n<!-- File: .agents/skills/impeccable/reference/delight.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/delight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/delight.md)\n\n<!-- File: .agents/skills/impeccable/reference/distill.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/distill.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/distill.md)\n\n<!-- File: .agents/skills/impeccable/reference/doctor.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/doctor.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/doctor.md)\n\n<!-- File: .agents/skills/impeccable/reference/document.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Reference Skill\n\nPath: `.agents/skills/impeccable/reference/document.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/clidey/whodb/HEAD/.agents/skills/impeccable/reference/document.md)\n\n<!-- ... +56 more modular skills available via /api/skills/clidey/whodb?path={path} -->\n</yakaai_skills>"}