diff --git a/.claude/rules/project-structure.md b/.claude/rules/project-structure.md index 63523ee71..54144e24b 100644 --- a/.claude/rules/project-structure.md +++ b/.claude/rules/project-structure.md @@ -17,7 +17,6 @@ docs/ workshops/ # Workshop briefs and outputs db/ schema.sql # Database schema - connectors/ # Symlink → tooling/db/ (backwards compat, remove after Sprint 22) tooling/ db/ # Connector scripts for SQLite, Qdrant, and audio config.json # Endpoint configuration diff --git a/.claude/settings.json b/.claude/settings.json index 7163418b8..aed9bc3ad 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -42,23 +42,6 @@ "Bash(tooling/db/audio-post *)", "Bash(tooling/db/audio-batch *)", - "Bash(db/connectors/ticket *)", - "Bash(db/connectors/sprint *)", - "Bash(db/connectors/sqlite-query *)", - "Bash(db/connectors/sqlite-exec *)", - "Bash(db/connectors/qdrant-search *)", - "Bash(db/connectors/qdrant-index *)", - "Bash(db/connectors/qdrant-health)", - "Bash(db/connectors/qdrant-count)", - "Bash(db/connectors/sqlite-init)", - "Bash(db/connectors/decisions-sync)", - "Bash(db/connectors/decision *)", - - "Bash(db/connectors/audio-generate *)", - "Bash(db/connectors/audio-health)", - "Bash(db/connectors/audio-post *)", - "Bash(db/connectors/audio-batch *)", - "Bash(make *)", "Bash(make)", diff --git a/client/tests/test_anti_tedium.gd b/client/tests/test_anti_tedium.gd index 0f7791add..f143c22e3 100644 --- a/client/tests/test_anti_tedium.gd +++ b/client/tests/test_anti_tedium.gd @@ -250,7 +250,7 @@ func test_gauntlet_ui_stays_hidden_after_multiple_snapshots() -> void: # -- GauntletHUD Feature Tests (#496) ---------------------------------------- # Timer lifecycle, personal bests, room change, visibility. -# Spec: sprint-9/client.md #496. Ticket: db/connectors/ticket show 496. +# Spec: sprint-9/client.md #496. Ticket: tooling/db/ticket show 496. func test_format_time_zero() -> void: # Static utility: 0 seconds → "00:00" @@ -476,7 +476,7 @@ func test_gauntlet_snapshot_roundtrip_via_apply() -> void: # -- BugReportDialog Feature Tests (#495) ------------------------------------ # Pause/unpause lifecycle, wire guard, text render, state machine. -# Spec: sprint-9/client.md #495. Ticket: db/connectors/ticket show 495. +# Spec: sprint-9/client.md #495. Ticket: tooling/db/ticket show 495. func test_bug_report_sends_pause_on_open() -> void: # start_capture() must send Pause to the server. diff --git a/db/connectors b/db/connectors deleted file mode 120000 index d424fdf7f..000000000 --- a/db/connectors +++ /dev/null @@ -1 +0,0 @@ -../tooling/db \ No newline at end of file diff --git a/whatsinagame/skill/SKILL.md b/whatsinagame/skill/SKILL.md index 900f9e8ff..6f6c58d72 100644 --- a/whatsinagame/skill/SKILL.md +++ b/whatsinagame/skill/SKILL.md @@ -84,9 +84,9 @@ If the user chooses a theme, rename each agent file and adapt the personality to Copy static infrastructure files from the kit's `static/` directory: -1. **Database**: Copy `static/db/schema.sql` and `static/db/connectors/` to the project's `db/` directory. -2. **Config**: Write `db/connectors/config.json` with the user's service URLs (or sensible defaults). -3. **Initialize DB**: Run `python3 db/connectors/sqlite_connector.py init` (or equivalent) to create the SQLite database. +1. **Database**: Copy `static/db/schema.sql` and `static/tooling/db/` to the project's `db/` directory. +2. **Config**: Write `tooling/db/config.json` with the user's service URLs (or sensible defaults). +3. **Initialize DB**: Run `python3 tooling/db/sqlite_connector.py init` (or equivalent) to create the SQLite database. 4. **Git hooks** (standard/full): Read the hook templates from `templates/.config/hooks/` and adapt for the project. 5. **Makefile**: If no Makefile exists, write one with standard targets (build, test, lint, format, clean, help). Adapt targets to the detected tech stack. @@ -135,7 +135,7 @@ After deploying all files: 1. **File check**: Use Glob to verify all expected files were created. List any missing files. 2. **DB check**: Run a simple query against the SQLite database to confirm it's working. -3. **CLI check**: Run `db/connectors/ticket --help` and `db/connectors/sprint --help` (standard+) to verify CLIs are functional. +3. **CLI check**: Run `tooling/db/ticket --help` and `tooling/db/sprint --help` (standard+) to verify CLIs are functional. 4. **Decisions check**: Verify decision files have correct structure with domain index entries. 5. **Agent check**: Verify all agent files have valid YAML frontmatter. diff --git a/whatsinagame/skill/references/customization-examples.md b/whatsinagame/skill/references/customization-examples.md index afc9addf3..b629cb222 100644 --- a/whatsinagame/skill/references/customization-examples.md +++ b/whatsinagame/skill/references/customization-examples.md @@ -70,13 +70,13 @@ The project uses local Qdrant (vector database) and Ollama (embedding model) for ```bash # Search across all project documents -db/connectors/qdrant-search "asymmetric information design" +tooling/db/qdrant-search "asymmetric information design" # Index a new document -db/connectors/qdrant-index docs/briefings/tyre.md +tooling/db/qdrant-index docs/briefings/tyre.md # Health check -db/connectors/qdrant-health +tooling/db/qdrant-health ``` Configuration: diff --git a/whatsinagame/skill/references/profile-manifests.md b/whatsinagame/skill/references/profile-manifests.md index f8ac273f3..52d8230a5 100644 --- a/whatsinagame/skill/references/profile-manifests.md +++ b/whatsinagame/skill/references/profile-manifests.md @@ -87,13 +87,13 @@ decisions/process.md # Process decisions .config/hooks/pre-commit # Pre-commit hook .config/hooks/commit-msg # Commit message validation db/schema.sql # Ticketing database schema -db/connectors/config.json # Service endpoint config -db/connectors/ticket # Ticket CLI -db/connectors/sprint # Sprint CLI -db/connectors/sqlite_connector.py # SQLite wrapper -db/connectors/sqlite-query # SQL query helper -db/connectors/sqlite-exec # SQL exec helper -db/connectors/sqlite-init # DB initializer +tooling/db/config.json # Service endpoint config +tooling/db/ticket # Ticket CLI +tooling/db/sprint # Sprint CLI +tooling/db/sqlite_connector.py # SQLite wrapper +tooling/db/sqlite-query # SQL query helper +tooling/db/sqlite-exec # SQL exec helper +tooling/db/sqlite-init # DB initializer ``` --- @@ -172,9 +172,9 @@ docs/workshops/ # Workshop directory scaffolding .claude/skills/dep-audit/SKILL.md # Dependency audit skill .claude/skills/team-onboard/SKILL.md # Onboarding skill .claude/skills/debt-scan/SKILL.md # Debt scan skill -db/connectors/qdrant_connector.py # Qdrant + Ollama connector -db/connectors/qdrant-search # Semantic search CLI -db/connectors/qdrant-index # Document indexer CLI -db/connectors/qdrant-health # Qdrant health check -db/connectors/qdrant-count # Collection document count +tooling/db/qdrant_connector.py # Qdrant + Ollama connector +tooling/db/qdrant-search # Semantic search CLI +tooling/db/qdrant-index # Document indexer CLI +tooling/db/qdrant-health # Qdrant health check +tooling/db/qdrant-count # Collection document count ``` diff --git a/whatsinagame/static/db/schema.sql b/whatsinagame/static/db/schema.sql index 8db49c7f9..4f3adbbd2 100644 --- a/whatsinagame/static/db/schema.sql +++ b/whatsinagame/static/db/schema.sql @@ -1,5 +1,5 @@ -- Project Ticketing Database Schema --- Access via: python3 db/connectors/sqlite_connector.py +-- Access via: python3 tooling/db/sqlite_connector.py -- DO NOT use sqlite3 CLI (crashes in Claude Code due to std::bad_alloc bug) PRAGMA journal_mode=WAL; diff --git a/whatsinagame/static/db/connectors/config.json b/whatsinagame/static/tooling/db/config.json similarity index 100% rename from whatsinagame/static/db/connectors/config.json rename to whatsinagame/static/tooling/db/config.json diff --git a/whatsinagame/static/db/connectors/decisions-sync b/whatsinagame/static/tooling/db/decisions-sync similarity index 100% rename from whatsinagame/static/db/connectors/decisions-sync rename to whatsinagame/static/tooling/db/decisions-sync diff --git a/whatsinagame/static/db/connectors/decisions_sync.py b/whatsinagame/static/tooling/db/decisions_sync.py similarity index 100% rename from whatsinagame/static/db/connectors/decisions_sync.py rename to whatsinagame/static/tooling/db/decisions_sync.py diff --git a/whatsinagame/static/db/connectors/qdrant-count b/whatsinagame/static/tooling/db/qdrant-count similarity index 100% rename from whatsinagame/static/db/connectors/qdrant-count rename to whatsinagame/static/tooling/db/qdrant-count diff --git a/whatsinagame/static/db/connectors/qdrant-health b/whatsinagame/static/tooling/db/qdrant-health similarity index 100% rename from whatsinagame/static/db/connectors/qdrant-health rename to whatsinagame/static/tooling/db/qdrant-health diff --git a/whatsinagame/static/db/connectors/qdrant-index b/whatsinagame/static/tooling/db/qdrant-index similarity index 100% rename from whatsinagame/static/db/connectors/qdrant-index rename to whatsinagame/static/tooling/db/qdrant-index diff --git a/whatsinagame/static/db/connectors/qdrant-search b/whatsinagame/static/tooling/db/qdrant-search similarity index 100% rename from whatsinagame/static/db/connectors/qdrant-search rename to whatsinagame/static/tooling/db/qdrant-search diff --git a/whatsinagame/static/db/connectors/qdrant_connector.py b/whatsinagame/static/tooling/db/qdrant_connector.py similarity index 100% rename from whatsinagame/static/db/connectors/qdrant_connector.py rename to whatsinagame/static/tooling/db/qdrant_connector.py diff --git a/whatsinagame/static/db/connectors/sprint b/whatsinagame/static/tooling/db/sprint similarity index 99% rename from whatsinagame/static/db/connectors/sprint rename to whatsinagame/static/tooling/db/sprint index cbbf55ede..3c7548914 100755 --- a/whatsinagame/static/db/connectors/sprint +++ b/whatsinagame/static/tooling/db/sprint @@ -27,8 +27,8 @@ PROJECT_ROOT = (SCRIPT_DIR / ".." / "..").resolve() REMINDER = """--- Reminder: Keep ticket status up to date after finishing work. - db/connectors/ticket status in_progress (when starting) - db/connectors/ticket status done (when finished)""" + tooling/db/ticket status in_progress (when starting) + tooling/db/ticket status done (when finished)""" def load_config(): diff --git a/whatsinagame/static/db/connectors/sqlite-exec b/whatsinagame/static/tooling/db/sqlite-exec similarity index 100% rename from whatsinagame/static/db/connectors/sqlite-exec rename to whatsinagame/static/tooling/db/sqlite-exec diff --git a/whatsinagame/static/db/connectors/sqlite-init b/whatsinagame/static/tooling/db/sqlite-init similarity index 100% rename from whatsinagame/static/db/connectors/sqlite-init rename to whatsinagame/static/tooling/db/sqlite-init diff --git a/whatsinagame/static/db/connectors/sqlite-query b/whatsinagame/static/tooling/db/sqlite-query similarity index 100% rename from whatsinagame/static/db/connectors/sqlite-query rename to whatsinagame/static/tooling/db/sqlite-query diff --git a/whatsinagame/static/db/connectors/sqlite_connector.py b/whatsinagame/static/tooling/db/sqlite_connector.py similarity index 100% rename from whatsinagame/static/db/connectors/sqlite_connector.py rename to whatsinagame/static/tooling/db/sqlite_connector.py diff --git a/whatsinagame/static/db/connectors/ticket b/whatsinagame/static/tooling/db/ticket similarity index 100% rename from whatsinagame/static/db/connectors/ticket rename to whatsinagame/static/tooling/db/ticket diff --git a/whatsinagame/templates/.claude/settings.json b/whatsinagame/templates/.claude/settings.json index df896e89c..bc7ee5b16 100644 --- a/whatsinagame/templates/.claude/settings.json +++ b/whatsinagame/templates/.claude/settings.json @@ -24,16 +24,16 @@ "Bash(git rm *)", "Bash(git rev-parse --show-toplevel)", - "Bash(db/connectors/ticket *)", - "Bash(db/connectors/sprint *)", - "Bash(db/connectors/sqlite-query *)", - "Bash(db/connectors/sqlite-exec *)", - "Bash(db/connectors/qdrant-search *)", - "Bash(db/connectors/qdrant-index *)", - "Bash(db/connectors/qdrant-health)", - "Bash(db/connectors/qdrant-count)", - "Bash(db/connectors/sqlite-init)", - "Bash(db/connectors/decisions-sync)", + "Bash(tooling/db/ticket *)", + "Bash(tooling/db/sprint *)", + "Bash(tooling/db/sqlite-query *)", + "Bash(tooling/db/sqlite-exec *)", + "Bash(tooling/db/qdrant-search *)", + "Bash(tooling/db/qdrant-index *)", + "Bash(tooling/db/qdrant-health)", + "Bash(tooling/db/qdrant-count)", + "Bash(tooling/db/sqlite-init)", + "Bash(tooling/db/decisions-sync)", "Bash(make *)", "Bash(make)", diff --git a/whatsinagame/templates/.claude/skills/docs-search/SKILL.md b/whatsinagame/templates/.claude/skills/docs-search/SKILL.md index b52ef2e18..1669bffca 100644 --- a/whatsinagame/templates/.claude/skills/docs-search/SKILL.md +++ b/whatsinagame/templates/.claude/skills/docs-search/SKILL.md @@ -18,36 +18,36 @@ in CLAUDE.md. This skill covers advanced operations and workflows. ### Search ```bash -db/connectors/qdrant-search "search query" +tooling/db/qdrant-search "search query" ``` ### Index a file ```bash -db/connectors/qdrant-index +tooling/db/qdrant-index ``` ### Index a single chunk For precise indexing of specific content: ```bash -python3 db/connectors/qdrant_connector.py index "unique-id" "Text content to index" --metadata source=manual heading="Custom heading" +python3 tooling/db/qdrant_connector.py index "unique-id" "Text content to index" --metadata source=manual heading="Custom heading" ``` ### Create collection Initialize the Qdrant collection (run once during setup): ```bash -python3 db/connectors/qdrant_connector.py create-collection +python3 tooling/db/qdrant_connector.py create-collection ``` ### Health check ```bash -db/connectors/qdrant-health +tooling/db/qdrant-health ``` ### Count documents ```bash -db/connectors/qdrant-count +tooling/db/qdrant-count ``` ## Bulk Indexing @@ -55,7 +55,7 @@ db/connectors/qdrant-count Index all project documents at once: ```bash for f in decisions/*.md docs/discussions/*.md docs/briefings/*.md docs/*.md; do - db/connectors/qdrant-index "$f" + tooling/db/qdrant-index "$f" done ``` diff --git a/whatsinagame/templates/.claude/skills/health-check/SKILL.md b/whatsinagame/templates/.claude/skills/health-check/SKILL.md index ee32b5024..542d58c81 100644 --- a/whatsinagame/templates/.claude/skills/health-check/SKILL.md +++ b/whatsinagame/templates/.claude/skills/health-check/SKILL.md @@ -19,7 +19,7 @@ Generate a team health metrics dashboard covering sprint velocity, cycle time, P Calculate velocity and throughput trends: ```bash -db/connectors/sqlite-query "SELECT s.name, COUNT(CASE WHEN t.status='done' THEN 1 END) as done, COUNT(t.id) as total FROM sprints s LEFT JOIN tickets t ON t.sprint_id = s.id GROUP BY s.id ORDER BY s.id DESC LIMIT 5" +tooling/db/sqlite-query "SELECT s.name, COUNT(CASE WHEN t.status='done' THEN 1 END) as done, COUNT(t.id) as total FROM sprints s LEFT JOIN tickets t ON t.sprint_id = s.id GROUP BY s.id ORDER BY s.id DESC LIMIT 5" ``` Compute: diff --git a/whatsinagame/templates/.claude/skills/kit-update/SKILL.md b/whatsinagame/templates/.claude/skills/kit-update/SKILL.md index 84e94ad00..05266923c 100644 --- a/whatsinagame/templates/.claude/skills/kit-update/SKILL.md +++ b/whatsinagame/templates/.claude/skills/kit-update/SKILL.md @@ -53,12 +53,12 @@ Scan the project for kit-managed files: **Static files** (deployed as-is, safe to update): - `db/schema.sql` -- `db/connectors/sqlite_connector.py` -- `db/connectors/ticket` -- `db/connectors/sprint` -- `db/connectors/decisions_sync.py` -- `db/connectors/qdrant_connector.py` -- All shell wrappers in `db/connectors/` +- `tooling/db/sqlite_connector.py` +- `tooling/db/ticket` +- `tooling/db/sprint` +- `tooling/db/decisions_sync.py` +- `tooling/db/qdrant_connector.py` +- All shell wrappers in `tooling/db/` **Adapted files** (customized during init, update with care): - `.claude/skills/*/SKILL.md` — skill definitions @@ -73,7 +73,7 @@ For each category, compare the installed version against the source: **Static files**: Direct diff against `static/` in the source repo. ```bash -diff -u db/connectors/ticket /static/db/connectors/ticket +diff -u tooling/db/ticket /static/tooling/db/ticket ``` **Skills**: Compare the installed skill's SKILL.md against the source @@ -117,8 +117,8 @@ Installed: {installed_version} ### Safe Updates (auto-apply recommended) | File | Change | Source Date | |------|--------|-------------| -| db/connectors/ticket | Bug fix: handle empty sprint list | 2026-03-01 | -| db/connectors/sprint | New command: sprint archive | 2026-03-01 | +| tooling/db/ticket | Bug fix: handle empty sprint list | 2026-03-01 | +| tooling/db/sprint | New command: sprint archive | 2026-03-01 | ### Skill Improvements (review diff) | Skill | Change | @@ -169,10 +169,10 @@ When `db/schema.sql` has changed in the source, the update must be additive: Compare schemas: ```bash diff <(sqlite3 "" ".read /static/db/schema.sql" ".schema") \ - <(db/connectors/sqlite-query "SELECT sql FROM sqlite_master ORDER BY name") + <(tooling/db/sqlite-query "SELECT sql FROM sqlite_master ORDER BY name") ``` -If new tables or indexes are detected, offer to run `db/connectors/sqlite-init` +If new tables or indexes are detected, offer to run `tooling/db/sqlite-init` to apply them (it uses IF NOT EXISTS, so it's safe to re-run). ## Tips diff --git a/whatsinagame/templates/.claude/skills/sprint-plan/SKILL.md b/whatsinagame/templates/.claude/skills/sprint-plan/SKILL.md index f0d44f7a0..90ec0add2 100644 --- a/whatsinagame/templates/.claude/skills/sprint-plan/SKILL.md +++ b/whatsinagame/templates/.claude/skills/sprint-plan/SKILL.md @@ -58,7 +58,7 @@ file so the team knows who to spawn. Get carry-overs, backlog candidates, and decision gaps in one shot: ```bash -db/connectors/sprint prepare +tooling/db/sprint prepare ``` This auto-detects the next sprint number (max ID + 1), creates the sprint @@ -73,10 +73,10 @@ record in `planning` status if needed, and outputs: For critical epics, check their children for granular candidates: ```bash -db/connectors/ticket children +tooling/db/ticket children ``` -Use `db/connectors/ticket show --brief [...]` to quickly scan multiple tickets. +Use `tooling/db/ticket show --brief [...]` to quickly scan multiple tickets. ### 3. Read existing code state @@ -136,14 +136,14 @@ Update it with the theme and goal, then assign tickets: ```bash # Update the sprint with theme and goal -db/connectors/sqlite-exec "UPDATE sprints SET name='Sprint N: Theme', goal='goal' WHERE id=N" +tooling/db/sqlite-exec "UPDATE sprints SET name='Sprint N: Theme', goal='goal' WHERE id=N" # Assign tickets -db/connectors/ticket sprint assign +tooling/db/ticket sprint assign ``` The sprint stays in `planning` status until explicitly activated via -`db/connectors/sprint start`. This prevents starting an unplanned sprint. +`tooling/db/sprint start`. This prevents starting an unplanned sprint. ### 8. Present summary diff --git a/whatsinagame/templates/.claude/skills/sprint-plan/references/briefing-template.md b/whatsinagame/templates/.claude/skills/sprint-plan/references/briefing-template.md index 27cb0fc0f..259d35876 100644 --- a/whatsinagame/templates/.claude/skills/sprint-plan/references/briefing-template.md +++ b/whatsinagame/templates/.claude/skills/sprint-plan/references/briefing-template.md @@ -26,7 +26,7 @@ Each team gets one briefing file at `docs/sprints/sprint-N/.md`. |---|-------|------------| | #ID | Title | #dependency or — | -Use `db/connectors/ticket show ` for full details. +Use `tooling/db/ticket show ` for full details. ## Key Decisions diff --git a/whatsinagame/templates/.claude/skills/sprint-retro/SKILL.md b/whatsinagame/templates/.claude/skills/sprint-retro/SKILL.md index f5a985f25..91c125d8c 100644 --- a/whatsinagame/templates/.claude/skills/sprint-retro/SKILL.md +++ b/whatsinagame/templates/.claude/skills/sprint-retro/SKILL.md @@ -18,8 +18,8 @@ Run a structured sprint retrospective by gathering data from git history, ticket Find the most recently completed sprint, or accept `--sprint N` as argument. -- Read sprint record from DB: `db/connectors/sprint status` -- If a sprint number is provided, use: `db/connectors/ticket list --sprint N` +- Read sprint record from DB: `tooling/db/sprint status` +- If a sprint number is provided, use: `tooling/db/ticket list --sprint N` - Extract sprint start and end dates from the sprint record. ### 2. Gather Data @@ -33,7 +33,7 @@ git log --oneline --since= --until= **Ticket outcomes:** ```bash -db/connectors/ticket list --sprint N +tooling/db/ticket list --sprint N ``` Categorize tickets into: done, carry-over, cancelled. diff --git a/whatsinagame/templates/.claude/skills/sprint-start/SKILL.md b/whatsinagame/templates/.claude/skills/sprint-start/SKILL.md index 5a9adb40a..67d978ecd 100644 --- a/whatsinagame/templates/.claude/skills/sprint-start/SKILL.md +++ b/whatsinagame/templates/.claude/skills/sprint-start/SKILL.md @@ -39,7 +39,7 @@ If the merge has conflicts, report them and stop — do not force-resolve. Run the sprint CLI to get the full context dump in one shot: ```bash -db/connectors/sprint start-work +tooling/db/sprint start-work ``` This auto-detects the active sprint and current team from the branch. @@ -59,7 +59,7 @@ If no matching briefing exists for the team, suggest running For tickets that need more detail than the `start-work` summary provides: ```bash -db/connectors/ticket show +tooling/db/ticket show ``` ### 6. Read key decisions @@ -141,7 +141,7 @@ Task( 5. When done, mark the task completed and check TaskList for the next available task. - Use `db/connectors/ticket show ` for full ticket specs.", + Use `tooling/db/ticket show ` for full ticket specs.", description: "Sprint {N} {team}: {name}", run_in_background: true ) diff --git a/whatsinagame/templates/.claude/skills/team-onboard/SKILL.md b/whatsinagame/templates/.claude/skills/team-onboard/SKILL.md index 389a26322..71fd112a8 100644 --- a/whatsinagame/templates/.claude/skills/team-onboard/SKILL.md +++ b/whatsinagame/templates/.claude/skills/team-onboard/SKILL.md @@ -67,19 +67,19 @@ Provide a snapshot of current project state: **Current sprint:** ```bash -db/connectors/sprint status +tooling/db/sprint status ``` **In-flight work:** ```bash -db/connectors/ticket list --status in_progress +tooling/db/ticket list --status in_progress ``` **Recent decisions:** Last 5 decisions by date from `decisions/` files. **Open questions:** ```bash -db/connectors/sqlite-query "SELECT id, title FROM decisions WHERE type='question' AND status='open'" +tooling/db/sqlite-query "SELECT id, title FROM decisions WHERE type='question' AND status='open'" ``` ### 4. First Task Suggestions diff --git a/whatsinagame/templates/.claude/skills/team-standup/SKILL.md b/whatsinagame/templates/.claude/skills/team-standup/SKILL.md index e2a8c820e..8d52dbf36 100644 --- a/whatsinagame/templates/.claude/skills/team-standup/SKILL.md +++ b/whatsinagame/templates/.claude/skills/team-standup/SKILL.md @@ -29,12 +29,12 @@ git log --oneline --since="24 hours ago" --all **Ticket status changes:** ```bash -db/connectors/sqlite-query "SELECT * FROM ticket_history WHERE changed_at > datetime('now', '-1 day') ORDER BY changed_at DESC" +tooling/db/sqlite-query "SELECT * FROM ticket_history WHERE changed_at > datetime('now', '-1 day') ORDER BY changed_at DESC" ``` **Active work:** ```bash -db/connectors/ticket list --status in_progress +tooling/db/ticket list --status in_progress ``` ### 3. Identify Blockers diff --git a/whatsinagame/templates/.claude/skills/ticket/SKILL.md b/whatsinagame/templates/.claude/skills/ticket/SKILL.md index e8c72b2f7..d133412fd 100644 --- a/whatsinagame/templates/.claude/skills/ticket/SKILL.md +++ b/whatsinagame/templates/.claude/skills/ticket/SKILL.md @@ -18,60 +18,60 @@ This skill covers the full command reference. ### List tickets (full flags) ```bash -db/connectors/ticket list [--status S] [--priority P] [--epic N] [--sprint N] [--assigned A] [--team T] +tooling/db/ticket list [--status S] [--priority P] [--epic N] [--sprint N] [--assigned A] [--team T] ``` ### Create ticket ```bash -db/connectors/ticket create [--parent N] [--priority P] [--decision D] [--team T] +tooling/db/ticket create <type> <title> [--parent N] [--priority P] [--decision D] [--team T] ``` Types: `initiative`, `epic`, `story`, `task`, `bug` Priorities: `critical`, `high`, `medium`, `low` ### Update status ```bash -db/connectors/ticket status <id> <new_status> -db/connectors/ticket done <id> [<id> ...] +tooling/db/ticket status <id> <new_status> +tooling/db/ticket done <id> [<id> ...] ``` Statuses: `backlog`, `ready`, `in_progress`, `review`, `done`, `cancelled` ### Assignment ```bash -db/connectors/ticket assign <id> <agent> -db/connectors/ticket unassign <id> +tooling/db/ticket assign <id> <agent> +tooling/db/ticket unassign <id> ``` ### Team assignment ```bash -db/connectors/ticket team <id> <teams> +tooling/db/ticket team <id> <teams> ``` Teams are comma-separated, e.g. `backend`, `frontend`, `backend,frontend`. ### Sprint management ```bash -db/connectors/ticket sprint [--active] -db/connectors/ticket sprint assign <id> <sprint_id> +tooling/db/ticket sprint [--active] +tooling/db/ticket sprint assign <id> <sprint_id> ``` For sprint-scoped operations (status overview, context dumps, lifecycle), -use the dedicated sprint CLI instead: `db/connectors/sprint --help` +use the dedicated sprint CLI instead: `tooling/db/sprint --help` ### Dependencies ```bash -db/connectors/ticket deps <id> +tooling/db/ticket deps <id> ``` ### Search and browse ```bash -db/connectors/ticket search <keyword> -db/connectors/ticket epics [--status S] -db/connectors/ticket children <id> -db/connectors/ticket count [--status S] +tooling/db/ticket search <keyword> +tooling/db/ticket epics [--status S] +tooling/db/ticket children <id> +tooling/db/ticket count [--status S] ``` ### Batch show ```bash -db/connectors/ticket show --brief <id> [<id>...] +tooling/db/ticket show --brief <id> [<id>...] ``` ## Workflow diff --git a/whatsinagame/templates/CLAUDE.md b/whatsinagame/templates/CLAUDE.md index a21234bc7..cc70bb0bf 100644 --- a/whatsinagame/templates/CLAUDE.md +++ b/whatsinagame/templates/CLAUDE.md @@ -18,7 +18,8 @@ docs/ workshops/ # Workshop briefs and outputs db/ schema.sql # Database schema - connectors/ # Connector scripts for SQLite and Qdrant +tooling/ + db/ # Connector scripts for SQLite and Qdrant config.json # Endpoint configuration ticket # Ticket CLI (list, show, create, assign, sprint, etc.) sqlite_connector.py # SQLite mini MCP @@ -64,15 +65,15 @@ All work happens on feature branches from `main`. All file paths are relative to The ticketing database (`{db_name}`) lives {in the parent directory shared across worktrees | in the repository root}. Access via CLI wrappers — never use the `sqlite3` CLI directly (it crashes in Claude Code due to std::bad_alloc): ```bash -db/connectors/ticket list --sprint N --team {team} -db/connectors/ticket show N -db/connectors/sprint status +tooling/db/ticket list --sprint N --team {team} +tooling/db/ticket show N +tooling/db/sprint status ``` ### Before starting work 1. Read your sprint briefing at `docs/sprints/sprint-N/{team}.md` for current tasks -2. Use `db/connectors/ticket show <id>` for full ticket details +2. Use `tooling/db/ticket show <id>` for full ticket details 3. Read the relevant `decisions/*.md` domain file(s) referenced in the briefing 4. Background context: `docs/briefings/{your-name}.md`, `docs/discussions/` @@ -81,16 +82,16 @@ db/connectors/sprint status **Prefer the ticket CLI over raw SQL.** The CLI handles column names, joins, and output formatting correctly: ```bash -db/connectors/ticket list [--status S] [--sprint N] [--team T] -db/connectors/ticket show <id> -db/connectors/ticket sprint --active +tooling/db/ticket list [--status S] [--sprint N] [--team T] +tooling/db/ticket show <id> +tooling/db/ticket sprint --active ``` Only fall back to raw SQL for queries the CLI doesn't support. **Never use the `sqlite3` CLI** — use the wrapper scripts instead: ```bash -db/connectors/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'" -db/connectors/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" +tooling/db/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'" +tooling/db/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" ``` ### Sprint CLI @@ -98,12 +99,12 @@ db/connectors/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" **Use the sprint CLI for sprint-scoped operations.** It batches ticket queries and formats output for agent consumption: ```bash -db/connectors/sprint status # Current sprint progress -db/connectors/sprint status --team {team} # Team-scoped view -db/connectors/sprint start-work [--team T] # Full context dump for starting work -db/connectors/sprint prepare # Prepare next sprint (candidates + gaps) -db/connectors/sprint start # Activate a planned sprint -db/connectors/sprint stop # Complete an active sprint +tooling/db/sprint status # Current sprint progress +tooling/db/sprint status --team {team} # Team-scoped view +tooling/db/sprint start-work [--team T] # Full context dump for starting work +tooling/db/sprint prepare # Prepare next sprint (candidates + gaps) +tooling/db/sprint start # Activate a planned sprint +tooling/db/sprint stop # Complete an active sprint ``` Team is auto-detected from the current git branch (if not `main`). Sprint is auto-detected from DB state. @@ -113,10 +114,10 @@ Team is auto-detected from the current git branch (if not `main`). Sprint is aut If Qdrant + Ollama are configured for semantic search: ```bash -db/connectors/qdrant-search "query text" -db/connectors/qdrant-index docs/briefings/agent.md -db/connectors/qdrant-health -db/connectors/qdrant-count +tooling/db/qdrant-search "query text" +tooling/db/qdrant-index docs/briefings/agent.md +tooling/db/qdrant-health +tooling/db/qdrant-count ``` ### Git host access @@ -157,7 +158,7 @@ Key rules: - Decision IDs: `D-NNN` (confirmed), `Q-NNN` (open questions), `R-NNN` (rejected) - Discussion rounds: numbered sequentially, archived to `docs/discussions/` when complete - Briefings: one per agent, updated after decision-producing rounds -- Tickets: managed via `db/connectors/ticket` CLI +- Tickets: managed via `tooling/db/ticket` CLI ### Commit conventions diff --git a/whatsinagame/templates/DEVOPS.md b/whatsinagame/templates/DEVOPS.md index e36bdb827..77c167883 100644 --- a/whatsinagame/templates/DEVOPS.md +++ b/whatsinagame/templates/DEVOPS.md @@ -16,14 +16,14 @@ The project uses SQLite for ticketing and decision tracking. ### Initialize ```bash -db/connectors/sqlite-init +tooling/db/sqlite-init ``` ### Query ```bash -db/connectors/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'" -db/connectors/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" +tooling/db/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'" +tooling/db/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" ``` **Never use the `sqlite3` CLI** — it crashes in Claude Code (std::bad_alloc). Use the wrapper scripts. @@ -31,21 +31,21 @@ db/connectors/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" ### Ticket CLI ```bash -db/connectors/ticket list [--status S] [--sprint N] [--team T] -db/connectors/ticket show <id> -db/connectors/ticket create --title "Title" --team T --priority P -db/connectors/ticket assign <id> --agent name +tooling/db/ticket list [--status S] [--sprint N] [--team T] +tooling/db/ticket show <id> +tooling/db/ticket create --title "Title" --team T --priority P +tooling/db/ticket assign <id> --agent name ``` ### Sprint CLI ```bash -db/connectors/sprint status # Current sprint progress -db/connectors/sprint status --team T # Team-scoped view -db/connectors/sprint start-work [--team T] # Full context dump for starting work -db/connectors/sprint prepare # Prepare next sprint -db/connectors/sprint start # Activate a planned sprint -db/connectors/sprint stop # Complete an active sprint +tooling/db/sprint status # Current sprint progress +tooling/db/sprint status --team T # Team-scoped view +tooling/db/sprint start-work [--team T] # Full context dump for starting work +tooling/db/sprint prepare # Prepare next sprint +tooling/db/sprint start # Activate a planned sprint +tooling/db/sprint stop # Complete an active sprint ``` ## Decision Tracking @@ -64,10 +64,10 @@ make decisions-orphan # Decisions without associated tickets If Qdrant + Ollama are configured for semantic search: ```bash -db/connectors/qdrant-health # Check service status -db/connectors/qdrant-search "query text" # Semantic search -db/connectors/qdrant-index path/to/doc.md # Index a document -db/connectors/qdrant-count # Collection stats +tooling/db/qdrant-health # Check service status +tooling/db/qdrant-search "query text" # Semantic search +tooling/db/qdrant-index path/to/doc.md # Index a document +tooling/db/qdrant-count # Collection stats ``` ## Git Hooks diff --git a/whatsinagame/templates/Makefile b/whatsinagame/templates/Makefile index a6868315b..c25395c80 100644 --- a/whatsinagame/templates/Makefile +++ b/whatsinagame/templates/Makefile @@ -21,16 +21,16 @@ setup-hooks: @echo "Git hooks path set to .config/hooks" decisions-sync: - @db/connectors/decisions-sync + @tooling/db/decisions-sync decisions-coverage: - @db/connectors/sqlite-query "SELECT d.domain, COUNT(DISTINCT d.id) as decisions, COUNT(DISTINCT t.decision_ref) as with_tickets FROM decisions d LEFT JOIN tickets t ON d.id = t.decision_ref WHERE d.status='active' AND d.type='confirmed' GROUP BY d.domain" + @tooling/db/sqlite-query "SELECT d.domain, COUNT(DISTINCT d.id) as decisions, COUNT(DISTINCT t.decision_ref) as with_tickets FROM decisions d LEFT JOIN tickets t ON d.id = t.decision_ref WHERE d.status='active' AND d.type='confirmed' GROUP BY d.domain" decisions-active: - @db/connectors/sqlite-query "SELECT id, domain, title FROM decisions WHERE status='active' AND type='confirmed' ORDER BY domain, id" + @tooling/db/sqlite-query "SELECT id, domain, title FROM decisions WHERE status='active' AND type='confirmed' ORDER BY domain, id" decisions-orphan: - @db/connectors/sqlite-query "SELECT id, title FROM decisions WHERE type='confirmed' AND status='active' AND id NOT IN (SELECT DISTINCT decision_ref FROM tickets WHERE decision_ref IS NOT NULL)" + @tooling/db/sqlite-query "SELECT id, title FROM decisions WHERE type='confirmed' AND status='active' AND id NOT IN (SELECT DISTINCT decision_ref FROM tickets WHERE decision_ref IS NOT NULL)" pre-pr: decisions-sync @echo "=== PRE-PR: CHECKS PASSED ===" diff --git a/whatsinagame/templates/decisions/README.md b/whatsinagame/templates/decisions/README.md index 14279eb0e..c3a9f72b9 100644 --- a/whatsinagame/templates/decisions/README.md +++ b/whatsinagame/templates/decisions/README.md @@ -54,25 +54,25 @@ make decisions-coverage ```bash # All active decisions -db/connectors/sqlite-query "SELECT id, domain, title FROM decisions WHERE status='active' AND type='confirmed' ORDER BY domain, id" +tooling/db/sqlite-query "SELECT id, domain, title FROM decisions WHERE status='active' AND type='confirmed' ORDER BY domain, id" # Decisions in a specific domain -db/connectors/sqlite-query "SELECT id, title FROM decisions WHERE domain='architecture' AND status='active'" +tooling/db/sqlite-query "SELECT id, title FROM decisions WHERE domain='architecture' AND status='active'" # Search by keyword -db/connectors/sqlite-query "SELECT id, domain, title FROM decisions WHERE title LIKE '%keyword%' OR decision LIKE '%keyword%'" +tooling/db/sqlite-query "SELECT id, domain, title FROM decisions WHERE title LIKE '%keyword%' OR decision LIKE '%keyword%'" # Decisions linked to a specific ticket -db/connectors/sqlite-query "SELECT d.id, d.title FROM decisions d JOIN tickets t ON d.id = t.decision_ref WHERE t.id = 42" +tooling/db/sqlite-query "SELECT d.id, d.title FROM decisions d JOIN tickets t ON d.id = t.decision_ref WHERE t.id = 42" # Open questions -db/connectors/sqlite-query "SELECT id, title FROM decisions WHERE type='question' AND status='active'" +tooling/db/sqlite-query "SELECT id, title FROM decisions WHERE type='question' AND status='active'" ``` ### Via Qdrant (semantic search) ```bash -db/connectors/qdrant-search "asymmetric information design" +tooling/db/qdrant-search "asymmetric information design" ``` ## Superseding a Decision diff --git a/whatsinagame/tests/test-completeness.sh b/whatsinagame/tests/test-completeness.sh index 8246a9736..f41fb5cc3 100755 --- a/whatsinagame/tests/test-completeness.sh +++ b/whatsinagame/tests/test-completeness.sh @@ -40,10 +40,10 @@ EXPECTED_FILES=( "skill/references/git-host-patterns.md" "skill/references/customization-examples.md" "static/db/schema.sql" - "static/db/connectors/config.json" - "static/db/connectors/sqlite_connector.py" - "static/db/connectors/ticket" - "static/db/connectors/sprint" + "static/tooling/db/config.json" + "static/tooling/db/sqlite_connector.py" + "static/tooling/db/ticket" + "static/tooling/db/sprint" "tests/test-install.sh" "tests/test-completeness.sh" ) @@ -215,7 +215,7 @@ EXPECTED_DIRS=( "skill/references" "static" "static/db" - "static/db/connectors" + "static/tooling/db" "templates" "templates/.claude" "templates/.claude/agents" diff --git a/whatsinagame/tests/test-install.sh b/whatsinagame/tests/test-install.sh index b97f97367..4f26cced3 100755 --- a/whatsinagame/tests/test-install.sh +++ b/whatsinagame/tests/test-install.sh @@ -119,7 +119,7 @@ STANDARD_FILES=( "decisions/scope.md" "decisions/process.md" "db/schema.sql" - "db/connectors/config.json" + "tooling/db/config.json" ) # Create the expected structure @@ -133,7 +133,7 @@ mkdir -p "$TMPDIR_STANDARD/.claude/skills/worktree-update" mkdir -p "$TMPDIR_STANDARD/.claude/skills/sprint-retro" mkdir -p "$TMPDIR_STANDARD/.claude/skills/release-notes" mkdir -p "$TMPDIR_STANDARD/decisions" -mkdir -p "$TMPDIR_STANDARD/db/connectors" +mkdir -p "$TMPDIR_STANDARD/tooling/db" for f in "${STANDARD_FILES[@]}"; do mkdir -p "$TMPDIR_STANDARD/$(dirname "$f")" touch "$TMPDIR_STANDARD/$f" @@ -175,7 +175,7 @@ FULL_FILES=( ".claude/skills/debt-scan/SKILL.md" "decisions/README.md" "db/schema.sql" - "db/connectors/config.json" + "tooling/db/config.json" ) # Create the expected structure @@ -206,8 +206,8 @@ else fi # Test that sqlite_connector.py exists and is parseable -if [[ -f "$KIT_DIR/static/db/connectors/sqlite_connector.py" ]]; then - if python3 -c "import ast; ast.parse(open('$KIT_DIR/static/db/connectors/sqlite_connector.py').read())" 2>/dev/null; then +if [[ -f "$KIT_DIR/static/tooling/db/sqlite_connector.py" ]]; then + if python3 -c "import ast; ast.parse(open('$KIT_DIR/static/tooling/db/sqlite_connector.py').read())" 2>/dev/null; then pass "sqlite_connector.py is valid Python" else fail "sqlite_connector.py has syntax errors" @@ -221,12 +221,12 @@ echo "" # --- Test 5: CLI tools --- echo "--- Test 5: CLI tools respond to --help ---" -if [[ -f "$KIT_DIR/static/db/connectors/ticket" ]]; then - if "$KIT_DIR/static/db/connectors/ticket" --help >/dev/null 2>&1; then +if [[ -f "$KIT_DIR/static/tooling/db/ticket" ]]; then + if "$KIT_DIR/static/tooling/db/ticket" --help >/dev/null 2>&1; then pass "ticket --help succeeds" else # Some CLIs exit non-zero on --help but still work - if "$KIT_DIR/static/db/connectors/ticket" --help 2>&1 | head -1 | grep -qi "usage\|ticket\|help"; then + if "$KIT_DIR/static/tooling/db/ticket" --help 2>&1 | head -1 | grep -qi "usage\|ticket\|help"; then pass "ticket --help produces output" else fail "ticket --help failed" @@ -236,11 +236,11 @@ else fail "ticket CLI missing" fi -if [[ -f "$KIT_DIR/static/db/connectors/sprint" ]]; then - if "$KIT_DIR/static/db/connectors/sprint" --help >/dev/null 2>&1; then +if [[ -f "$KIT_DIR/static/tooling/db/sprint" ]]; then + if "$KIT_DIR/static/tooling/db/sprint" --help >/dev/null 2>&1; then pass "sprint --help succeeds" else - if "$KIT_DIR/static/db/connectors/sprint" --help 2>&1 | head -1 | grep -qi "usage\|sprint\|help"; then + if "$KIT_DIR/static/tooling/db/sprint" --help 2>&1 | head -1 | grep -qi "usage\|sprint\|help"; then pass "sprint --help produces output" else fail "sprint --help failed"