chore(db): remove db/connectors backwards-compat symlink (#568)

Remove the db/connectors → tooling/db/ symlink added in Sprint 21
(#274) and migrate all references to use tooling/db/ directly.

- Delete tracked symlink from db/connectors
- Remove duplicate db/connectors/* permission patterns from settings
- Update project-structure.md to reflect removal
- Move whatsinagame/static/db/connectors/ to whatsinagame/static/tooling/db/
- Update 20 whatsinagame template, skill, and test files
- Update comment references in client/tests/test_anti_tedium.gd
- Historical docs (old sprint briefings, changelog, discussions) left as-is

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-28 22:13:26 +01:00
co-authored by Claude Opus 4.6
parent 073c5a317c
commit b025fe8152
39 changed files with 152 additions and 170 deletions
-1
View File
@@ -17,7 +17,6 @@ docs/
workshops/ # Workshop briefs and outputs workshops/ # Workshop briefs and outputs
db/ db/
schema.sql # Database schema schema.sql # Database schema
connectors/ # Symlink → tooling/db/ (backwards compat, remove after Sprint 22)
tooling/ tooling/
db/ # Connector scripts for SQLite, Qdrant, and audio db/ # Connector scripts for SQLite, Qdrant, and audio
config.json # Endpoint configuration config.json # Endpoint configuration
-17
View File
@@ -42,23 +42,6 @@
"Bash(tooling/db/audio-post *)", "Bash(tooling/db/audio-post *)",
"Bash(tooling/db/audio-batch *)", "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 *)",
"Bash(make)", "Bash(make)",
+2 -2
View File
@@ -250,7 +250,7 @@ func test_gauntlet_ui_stays_hidden_after_multiple_snapshots() -> void:
# -- GauntletHUD Feature Tests (#496) ---------------------------------------- # -- GauntletHUD Feature Tests (#496) ----------------------------------------
# Timer lifecycle, personal bests, room change, visibility. # 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: func test_format_time_zero() -> void:
# Static utility: 0 seconds → "00:00" # Static utility: 0 seconds → "00:00"
@@ -476,7 +476,7 @@ func test_gauntlet_snapshot_roundtrip_via_apply() -> void:
# -- BugReportDialog Feature Tests (#495) ------------------------------------ # -- BugReportDialog Feature Tests (#495) ------------------------------------
# Pause/unpause lifecycle, wire guard, text render, state machine. # 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: func test_bug_report_sends_pause_on_open() -> void:
# start_capture() must send Pause to the server. # start_capture() must send Pause to the server.
-1
View File
@@ -1 +0,0 @@
../tooling/db
+4 -4
View File
@@ -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: 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. 1. **Database**: Copy `static/db/schema.sql` and `static/tooling/db/` to the project's `db/` directory.
2. **Config**: Write `db/connectors/config.json` with the user's service URLs (or sensible defaults). 2. **Config**: Write `tooling/db/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. 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. 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. 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. 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. 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. 4. **Decisions check**: Verify decision files have correct structure with domain index entries.
5. **Agent check**: Verify all agent files have valid YAML frontmatter. 5. **Agent check**: Verify all agent files have valid YAML frontmatter.
@@ -70,13 +70,13 @@ The project uses local Qdrant (vector database) and Ollama (embedding model) for
```bash ```bash
# Search across all project documents # Search across all project documents
db/connectors/qdrant-search "asymmetric information design" tooling/db/qdrant-search "asymmetric information design"
# Index a new document # Index a new document
db/connectors/qdrant-index docs/briefings/tyre.md tooling/db/qdrant-index docs/briefings/tyre.md
# Health check # Health check
db/connectors/qdrant-health tooling/db/qdrant-health
``` ```
Configuration: Configuration:
@@ -87,13 +87,13 @@ decisions/process.md # Process decisions
.config/hooks/pre-commit # Pre-commit hook .config/hooks/pre-commit # Pre-commit hook
.config/hooks/commit-msg # Commit message validation .config/hooks/commit-msg # Commit message validation
db/schema.sql # Ticketing database schema db/schema.sql # Ticketing database schema
db/connectors/config.json # Service endpoint config tooling/db/config.json # Service endpoint config
db/connectors/ticket # Ticket CLI tooling/db/ticket # Ticket CLI
db/connectors/sprint # Sprint CLI tooling/db/sprint # Sprint CLI
db/connectors/sqlite_connector.py # SQLite wrapper tooling/db/sqlite_connector.py # SQLite wrapper
db/connectors/sqlite-query # SQL query helper tooling/db/sqlite-query # SQL query helper
db/connectors/sqlite-exec # SQL exec helper tooling/db/sqlite-exec # SQL exec helper
db/connectors/sqlite-init # DB initializer 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/dep-audit/SKILL.md # Dependency audit skill
.claude/skills/team-onboard/SKILL.md # Onboarding skill .claude/skills/team-onboard/SKILL.md # Onboarding skill
.claude/skills/debt-scan/SKILL.md # Debt scan skill .claude/skills/debt-scan/SKILL.md # Debt scan skill
db/connectors/qdrant_connector.py # Qdrant + Ollama connector tooling/db/qdrant_connector.py # Qdrant + Ollama connector
db/connectors/qdrant-search # Semantic search CLI tooling/db/qdrant-search # Semantic search CLI
db/connectors/qdrant-index # Document indexer CLI tooling/db/qdrant-index # Document indexer CLI
db/connectors/qdrant-health # Qdrant health check tooling/db/qdrant-health # Qdrant health check
db/connectors/qdrant-count # Collection document count tooling/db/qdrant-count # Collection document count
``` ```
+1 -1
View File
@@ -1,5 +1,5 @@
-- Project Ticketing Database Schema -- Project Ticketing Database Schema
-- Access via: python3 db/connectors/sqlite_connector.py <command> -- Access via: python3 tooling/db/sqlite_connector.py <command>
-- DO NOT use sqlite3 CLI (crashes in Claude Code due to std::bad_alloc bug) -- DO NOT use sqlite3 CLI (crashes in Claude Code due to std::bad_alloc bug)
PRAGMA journal_mode=WAL; PRAGMA journal_mode=WAL;
@@ -27,8 +27,8 @@ PROJECT_ROOT = (SCRIPT_DIR / ".." / "..").resolve()
REMINDER = """--- REMINDER = """---
Reminder: Keep ticket status up to date after finishing work. Reminder: Keep ticket status up to date after finishing work.
db/connectors/ticket status <id> in_progress (when starting) tooling/db/ticket status <id> in_progress (when starting)
db/connectors/ticket status <id> done (when finished)""" tooling/db/ticket status <id> done (when finished)"""
def load_config(): def load_config():
+10 -10
View File
@@ -24,16 +24,16 @@
"Bash(git rm *)", "Bash(git rm *)",
"Bash(git rev-parse --show-toplevel)", "Bash(git rev-parse --show-toplevel)",
"Bash(db/connectors/ticket *)", "Bash(tooling/db/ticket *)",
"Bash(db/connectors/sprint *)", "Bash(tooling/db/sprint *)",
"Bash(db/connectors/sqlite-query *)", "Bash(tooling/db/sqlite-query *)",
"Bash(db/connectors/sqlite-exec *)", "Bash(tooling/db/sqlite-exec *)",
"Bash(db/connectors/qdrant-search *)", "Bash(tooling/db/qdrant-search *)",
"Bash(db/connectors/qdrant-index *)", "Bash(tooling/db/qdrant-index *)",
"Bash(db/connectors/qdrant-health)", "Bash(tooling/db/qdrant-health)",
"Bash(db/connectors/qdrant-count)", "Bash(tooling/db/qdrant-count)",
"Bash(db/connectors/sqlite-init)", "Bash(tooling/db/sqlite-init)",
"Bash(db/connectors/decisions-sync)", "Bash(tooling/db/decisions-sync)",
"Bash(make *)", "Bash(make *)",
"Bash(make)", "Bash(make)",
@@ -18,36 +18,36 @@ in CLAUDE.md. This skill covers advanced operations and workflows.
### Search ### Search
```bash ```bash
db/connectors/qdrant-search "search query" tooling/db/qdrant-search "search query"
``` ```
### Index a file ### Index a file
```bash ```bash
db/connectors/qdrant-index <file-path> tooling/db/qdrant-index <file-path>
``` ```
### Index a single chunk ### Index a single chunk
For precise indexing of specific content: For precise indexing of specific content:
```bash ```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 ### Create collection
Initialize the Qdrant collection (run once during setup): Initialize the Qdrant collection (run once during setup):
```bash ```bash
python3 db/connectors/qdrant_connector.py create-collection python3 tooling/db/qdrant_connector.py create-collection
``` ```
### Health check ### Health check
```bash ```bash
db/connectors/qdrant-health tooling/db/qdrant-health
``` ```
### Count documents ### Count documents
```bash ```bash
db/connectors/qdrant-count tooling/db/qdrant-count
``` ```
## Bulk Indexing ## Bulk Indexing
@@ -55,7 +55,7 @@ db/connectors/qdrant-count
Index all project documents at once: Index all project documents at once:
```bash ```bash
for f in decisions/*.md docs/discussions/*.md docs/briefings/*.md docs/*.md; do 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 done
``` ```
@@ -19,7 +19,7 @@ Generate a team health metrics dashboard covering sprint velocity, cycle time, P
Calculate velocity and throughput trends: Calculate velocity and throughput trends:
```bash ```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: Compute:
@@ -53,12 +53,12 @@ Scan the project for kit-managed files:
**Static files** (deployed as-is, safe to update): **Static files** (deployed as-is, safe to update):
- `db/schema.sql` - `db/schema.sql`
- `db/connectors/sqlite_connector.py` - `tooling/db/sqlite_connector.py`
- `db/connectors/ticket` - `tooling/db/ticket`
- `db/connectors/sprint` - `tooling/db/sprint`
- `db/connectors/decisions_sync.py` - `tooling/db/decisions_sync.py`
- `db/connectors/qdrant_connector.py` - `tooling/db/qdrant_connector.py`
- All shell wrappers in `db/connectors/` - All shell wrappers in `tooling/db/`
**Adapted files** (customized during init, update with care): **Adapted files** (customized during init, update with care):
- `.claude/skills/*/SKILL.md` — skill definitions - `.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. **Static files**: Direct diff against `static/` in the source repo.
```bash ```bash
diff -u db/connectors/ticket <source_path>/static/db/connectors/ticket diff -u tooling/db/ticket <source_path>/static/tooling/db/ticket
``` ```
**Skills**: Compare the installed skill's SKILL.md against the source **Skills**: Compare the installed skill's SKILL.md against the source
@@ -117,8 +117,8 @@ Installed: {installed_version}
### Safe Updates (auto-apply recommended) ### Safe Updates (auto-apply recommended)
| File | Change | Source Date | | File | Change | Source Date |
|------|--------|-------------| |------|--------|-------------|
| db/connectors/ticket | Bug fix: handle empty sprint list | 2026-03-01 | | tooling/db/ticket | Bug fix: handle empty sprint list | 2026-03-01 |
| db/connectors/sprint | New command: sprint archive | 2026-03-01 | | tooling/db/sprint | New command: sprint archive | 2026-03-01 |
### Skill Improvements (review diff) ### Skill Improvements (review diff)
| Skill | Change | | Skill | Change |
@@ -169,10 +169,10 @@ When `db/schema.sql` has changed in the source, the update must be additive:
Compare schemas: Compare schemas:
```bash ```bash
diff <(sqlite3 "" ".read <source>/static/db/schema.sql" ".schema") \ diff <(sqlite3 "" ".read <source>/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). to apply them (it uses IF NOT EXISTS, so it's safe to re-run).
## Tips ## Tips
@@ -58,7 +58,7 @@ file so the team knows who to spawn.
Get carry-overs, backlog candidates, and decision gaps in one shot: Get carry-overs, backlog candidates, and decision gaps in one shot:
```bash ```bash
db/connectors/sprint prepare tooling/db/sprint prepare
``` ```
This auto-detects the next sprint number (max ID + 1), creates the sprint 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: For critical epics, check their children for granular candidates:
```bash ```bash
db/connectors/ticket children <epic_id> tooling/db/ticket children <epic_id>
``` ```
Use `db/connectors/ticket show --brief <id> [<id>...]` to quickly scan multiple tickets. Use `tooling/db/ticket show --brief <id> [<id>...]` to quickly scan multiple tickets.
### 3. Read existing code state ### 3. Read existing code state
@@ -136,14 +136,14 @@ Update it with the theme and goal, then assign tickets:
```bash ```bash
# Update the sprint with theme and goal # 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 # Assign tickets
db/connectors/ticket sprint assign <ticket_id> <sprint_id> tooling/db/ticket sprint assign <ticket_id> <sprint_id>
``` ```
The sprint stays in `planning` status until explicitly activated via 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 ### 8. Present summary
@@ -26,7 +26,7 @@ Each team gets one briefing file at `docs/sprints/sprint-N/<team>.md`.
|---|-------|------------| |---|-------|------------|
| #ID | Title | #dependency or — | | #ID | Title | #dependency or — |
Use `db/connectors/ticket show <id>` for full details. Use `tooling/db/ticket show <id>` for full details.
## Key Decisions ## Key Decisions
@@ -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. Find the most recently completed sprint, or accept `--sprint N` as argument.
- Read sprint record from DB: `db/connectors/sprint status` - Read sprint record from DB: `tooling/db/sprint status`
- If a sprint number is provided, use: `db/connectors/ticket list --sprint N` - If a sprint number is provided, use: `tooling/db/ticket list --sprint N`
- Extract sprint start and end dates from the sprint record. - Extract sprint start and end dates from the sprint record.
### 2. Gather Data ### 2. Gather Data
@@ -33,7 +33,7 @@ git log --oneline --since=<start_date> --until=<end_date>
**Ticket outcomes:** **Ticket outcomes:**
```bash ```bash
db/connectors/ticket list --sprint N tooling/db/ticket list --sprint N
``` ```
Categorize tickets into: done, carry-over, cancelled. Categorize tickets into: done, carry-over, cancelled.
@@ -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: Run the sprint CLI to get the full context dump in one shot:
```bash ```bash
db/connectors/sprint start-work tooling/db/sprint start-work
``` ```
This auto-detects the active sprint and current team from the branch. 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: For tickets that need more detail than the `start-work` summary provides:
```bash ```bash
db/connectors/ticket show <id> tooling/db/ticket show <id>
``` ```
### 6. Read key decisions ### 6. Read key decisions
@@ -141,7 +141,7 @@ Task(
5. When done, mark the task completed and check TaskList for 5. When done, mark the task completed and check TaskList for
the next available task. the next available task.
Use `db/connectors/ticket show <id>` for full ticket specs.", Use `tooling/db/ticket show <id>` for full ticket specs.",
description: "Sprint {N} {team}: {name}", description: "Sprint {N} {team}: {name}",
run_in_background: true run_in_background: true
) )
@@ -67,19 +67,19 @@ Provide a snapshot of current project state:
**Current sprint:** **Current sprint:**
```bash ```bash
db/connectors/sprint status tooling/db/sprint status
``` ```
**In-flight work:** **In-flight work:**
```bash ```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. **Recent decisions:** Last 5 decisions by date from `decisions/` files.
**Open questions:** **Open questions:**
```bash ```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 ### 4. First Task Suggestions
@@ -29,12 +29,12 @@ git log --oneline --since="24 hours ago" --all
**Ticket status changes:** **Ticket status changes:**
```bash ```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:** **Active work:**
```bash ```bash
db/connectors/ticket list --status in_progress tooling/db/ticket list --status in_progress
``` ```
### 3. Identify Blockers ### 3. Identify Blockers
@@ -18,60 +18,60 @@ This skill covers the full command reference.
### List tickets (full flags) ### List tickets (full flags)
```bash ```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 ### Create ticket
```bash ```bash
db/connectors/ticket create <type> <title> [--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` Types: `initiative`, `epic`, `story`, `task`, `bug`
Priorities: `critical`, `high`, `medium`, `low` Priorities: `critical`, `high`, `medium`, `low`
### Update status ### Update status
```bash ```bash
db/connectors/ticket status <id> <new_status> tooling/db/ticket status <id> <new_status>
db/connectors/ticket done <id> [<id> ...] tooling/db/ticket done <id> [<id> ...]
``` ```
Statuses: `backlog`, `ready`, `in_progress`, `review`, `done`, `cancelled` Statuses: `backlog`, `ready`, `in_progress`, `review`, `done`, `cancelled`
### Assignment ### Assignment
```bash ```bash
db/connectors/ticket assign <id> <agent> tooling/db/ticket assign <id> <agent>
db/connectors/ticket unassign <id> tooling/db/ticket unassign <id>
``` ```
### Team assignment ### Team assignment
```bash ```bash
db/connectors/ticket team <id> <teams> tooling/db/ticket team <id> <teams>
``` ```
Teams are comma-separated, e.g. `backend`, `frontend`, `backend,frontend`. Teams are comma-separated, e.g. `backend`, `frontend`, `backend,frontend`.
### Sprint management ### Sprint management
```bash ```bash
db/connectors/ticket sprint [--active] tooling/db/ticket sprint [--active]
db/connectors/ticket sprint assign <id> <sprint_id> tooling/db/ticket sprint assign <id> <sprint_id>
``` ```
For sprint-scoped operations (status overview, context dumps, lifecycle), 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 ### Dependencies
```bash ```bash
db/connectors/ticket deps <id> tooling/db/ticket deps <id>
``` ```
### Search and browse ### Search and browse
```bash ```bash
db/connectors/ticket search <keyword> tooling/db/ticket search <keyword>
db/connectors/ticket epics [--status S] tooling/db/ticket epics [--status S]
db/connectors/ticket children <id> tooling/db/ticket children <id>
db/connectors/ticket count [--status S] tooling/db/ticket count [--status S]
``` ```
### Batch show ### Batch show
```bash ```bash
db/connectors/ticket show --brief <id> [<id>...] tooling/db/ticket show --brief <id> [<id>...]
``` ```
## Workflow ## Workflow
+22 -21
View File
@@ -18,7 +18,8 @@ docs/
workshops/ # Workshop briefs and outputs workshops/ # Workshop briefs and outputs
db/ db/
schema.sql # Database schema schema.sql # Database schema
connectors/ # Connector scripts for SQLite and Qdrant tooling/
db/ # Connector scripts for SQLite and Qdrant
config.json # Endpoint configuration config.json # Endpoint configuration
ticket # Ticket CLI (list, show, create, assign, sprint, etc.) ticket # Ticket CLI (list, show, create, assign, sprint, etc.)
sqlite_connector.py # SQLite mini MCP 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): 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 ```bash
db/connectors/ticket list --sprint N --team {team} tooling/db/ticket list --sprint N --team {team}
db/connectors/ticket show N tooling/db/ticket show N
db/connectors/sprint status tooling/db/sprint status
``` ```
### Before starting work ### Before starting work
1. Read your sprint briefing at `docs/sprints/sprint-N/{team}.md` for current tasks 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 3. Read the relevant `decisions/*.md` domain file(s) referenced in the briefing
4. Background context: `docs/briefings/{your-name}.md`, `docs/discussions/` 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: **Prefer the ticket CLI over raw SQL.** The CLI handles column names, joins, and output formatting correctly:
```bash ```bash
db/connectors/ticket list [--status S] [--sprint N] [--team T] tooling/db/ticket list [--status S] [--sprint N] [--team T]
db/connectors/ticket show <id> tooling/db/ticket show <id>
db/connectors/ticket sprint --active 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: Only fall back to raw SQL for queries the CLI doesn't support. **Never use the `sqlite3` CLI** — use the wrapper scripts instead:
```bash ```bash
db/connectors/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'" tooling/db/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'"
db/connectors/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" tooling/db/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1"
``` ```
### Sprint CLI ### 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: **Use the sprint CLI for sprint-scoped operations.** It batches ticket queries and formats output for agent consumption:
```bash ```bash
db/connectors/sprint status # Current sprint progress tooling/db/sprint status # Current sprint progress
db/connectors/sprint status --team {team} # Team-scoped view tooling/db/sprint status --team {team} # Team-scoped view
db/connectors/sprint start-work [--team T] # Full context dump for starting work tooling/db/sprint start-work [--team T] # Full context dump for starting work
db/connectors/sprint prepare # Prepare next sprint (candidates + gaps) tooling/db/sprint prepare # Prepare next sprint (candidates + gaps)
db/connectors/sprint start # Activate a planned sprint tooling/db/sprint start # Activate a planned sprint
db/connectors/sprint stop # Complete an active 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. 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: If Qdrant + Ollama are configured for semantic search:
```bash ```bash
db/connectors/qdrant-search "query text" tooling/db/qdrant-search "query text"
db/connectors/qdrant-index docs/briefings/agent.md tooling/db/qdrant-index docs/briefings/agent.md
db/connectors/qdrant-health tooling/db/qdrant-health
db/connectors/qdrant-count tooling/db/qdrant-count
``` ```
### Git host access ### Git host access
@@ -157,7 +158,7 @@ Key rules:
- Decision IDs: `D-NNN` (confirmed), `Q-NNN` (open questions), `R-NNN` (rejected) - Decision IDs: `D-NNN` (confirmed), `Q-NNN` (open questions), `R-NNN` (rejected)
- Discussion rounds: numbered sequentially, archived to `docs/discussions/` when complete - Discussion rounds: numbered sequentially, archived to `docs/discussions/` when complete
- Briefings: one per agent, updated after decision-producing rounds - 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 ### Commit conventions
+17 -17
View File
@@ -16,14 +16,14 @@ The project uses SQLite for ticketing and decision tracking.
### Initialize ### Initialize
```bash ```bash
db/connectors/sqlite-init tooling/db/sqlite-init
``` ```
### Query ### Query
```bash ```bash
db/connectors/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'" tooling/db/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'"
db/connectors/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1" 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. **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 ### Ticket CLI
```bash ```bash
db/connectors/ticket list [--status S] [--sprint N] [--team T] tooling/db/ticket list [--status S] [--sprint N] [--team T]
db/connectors/ticket show <id> tooling/db/ticket show <id>
db/connectors/ticket create --title "Title" --team T --priority P tooling/db/ticket create --title "Title" --team T --priority P
db/connectors/ticket assign <id> --agent name tooling/db/ticket assign <id> --agent name
``` ```
### Sprint CLI ### Sprint CLI
```bash ```bash
db/connectors/sprint status # Current sprint progress tooling/db/sprint status # Current sprint progress
db/connectors/sprint status --team T # Team-scoped view tooling/db/sprint status --team T # Team-scoped view
db/connectors/sprint start-work [--team T] # Full context dump for starting work tooling/db/sprint start-work [--team T] # Full context dump for starting work
db/connectors/sprint prepare # Prepare next sprint tooling/db/sprint prepare # Prepare next sprint
db/connectors/sprint start # Activate a planned sprint tooling/db/sprint start # Activate a planned sprint
db/connectors/sprint stop # Complete an active sprint tooling/db/sprint stop # Complete an active sprint
``` ```
## Decision Tracking ## Decision Tracking
@@ -64,10 +64,10 @@ make decisions-orphan # Decisions without associated tickets
If Qdrant + Ollama are configured for semantic search: If Qdrant + Ollama are configured for semantic search:
```bash ```bash
db/connectors/qdrant-health # Check service status tooling/db/qdrant-health # Check service status
db/connectors/qdrant-search "query text" # Semantic search tooling/db/qdrant-search "query text" # Semantic search
db/connectors/qdrant-index path/to/doc.md # Index a document tooling/db/qdrant-index path/to/doc.md # Index a document
db/connectors/qdrant-count # Collection stats tooling/db/qdrant-count # Collection stats
``` ```
## Git Hooks ## Git Hooks
+4 -4
View File
@@ -21,16 +21,16 @@ setup-hooks:
@echo "Git hooks path set to .config/hooks" @echo "Git hooks path set to .config/hooks"
decisions-sync: decisions-sync:
@db/connectors/decisions-sync @tooling/db/decisions-sync
decisions-coverage: 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: 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: 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 pre-pr: decisions-sync
@echo "=== PRE-PR: CHECKS PASSED ===" @echo "=== PRE-PR: CHECKS PASSED ==="
+6 -6
View File
@@ -54,25 +54,25 @@ make decisions-coverage
```bash ```bash
# All active decisions # 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 # 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 # 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 # 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 # 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) ### Via Qdrant (semantic search)
```bash ```bash
db/connectors/qdrant-search "asymmetric information design" tooling/db/qdrant-search "asymmetric information design"
``` ```
## Superseding a Decision ## Superseding a Decision
+5 -5
View File
@@ -40,10 +40,10 @@ EXPECTED_FILES=(
"skill/references/git-host-patterns.md" "skill/references/git-host-patterns.md"
"skill/references/customization-examples.md" "skill/references/customization-examples.md"
"static/db/schema.sql" "static/db/schema.sql"
"static/db/connectors/config.json" "static/tooling/db/config.json"
"static/db/connectors/sqlite_connector.py" "static/tooling/db/sqlite_connector.py"
"static/db/connectors/ticket" "static/tooling/db/ticket"
"static/db/connectors/sprint" "static/tooling/db/sprint"
"tests/test-install.sh" "tests/test-install.sh"
"tests/test-completeness.sh" "tests/test-completeness.sh"
) )
@@ -215,7 +215,7 @@ EXPECTED_DIRS=(
"skill/references" "skill/references"
"static" "static"
"static/db" "static/db"
"static/db/connectors" "static/tooling/db"
"templates" "templates"
"templates/.claude" "templates/.claude"
"templates/.claude/agents" "templates/.claude/agents"
+11 -11
View File
@@ -119,7 +119,7 @@ STANDARD_FILES=(
"decisions/scope.md" "decisions/scope.md"
"decisions/process.md" "decisions/process.md"
"db/schema.sql" "db/schema.sql"
"db/connectors/config.json" "tooling/db/config.json"
) )
# Create the expected structure # 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/sprint-retro"
mkdir -p "$TMPDIR_STANDARD/.claude/skills/release-notes" mkdir -p "$TMPDIR_STANDARD/.claude/skills/release-notes"
mkdir -p "$TMPDIR_STANDARD/decisions" mkdir -p "$TMPDIR_STANDARD/decisions"
mkdir -p "$TMPDIR_STANDARD/db/connectors" mkdir -p "$TMPDIR_STANDARD/tooling/db"
for f in "${STANDARD_FILES[@]}"; do for f in "${STANDARD_FILES[@]}"; do
mkdir -p "$TMPDIR_STANDARD/$(dirname "$f")" mkdir -p "$TMPDIR_STANDARD/$(dirname "$f")"
touch "$TMPDIR_STANDARD/$f" touch "$TMPDIR_STANDARD/$f"
@@ -175,7 +175,7 @@ FULL_FILES=(
".claude/skills/debt-scan/SKILL.md" ".claude/skills/debt-scan/SKILL.md"
"decisions/README.md" "decisions/README.md"
"db/schema.sql" "db/schema.sql"
"db/connectors/config.json" "tooling/db/config.json"
) )
# Create the expected structure # Create the expected structure
@@ -206,8 +206,8 @@ else
fi fi
# Test that sqlite_connector.py exists and is parseable # Test that sqlite_connector.py exists and is parseable
if [[ -f "$KIT_DIR/static/db/connectors/sqlite_connector.py" ]]; then if [[ -f "$KIT_DIR/static/tooling/db/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 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" pass "sqlite_connector.py is valid Python"
else else
fail "sqlite_connector.py has syntax errors" fail "sqlite_connector.py has syntax errors"
@@ -221,12 +221,12 @@ echo ""
# --- Test 5: CLI tools --- # --- Test 5: CLI tools ---
echo "--- Test 5: CLI tools respond to --help ---" echo "--- Test 5: CLI tools respond to --help ---"
if [[ -f "$KIT_DIR/static/db/connectors/ticket" ]]; then if [[ -f "$KIT_DIR/static/tooling/db/ticket" ]]; then
if "$KIT_DIR/static/db/connectors/ticket" --help >/dev/null 2>&1; then if "$KIT_DIR/static/tooling/db/ticket" --help >/dev/null 2>&1; then
pass "ticket --help succeeds" pass "ticket --help succeeds"
else else
# Some CLIs exit non-zero on --help but still work # 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" pass "ticket --help produces output"
else else
fail "ticket --help failed" fail "ticket --help failed"
@@ -236,11 +236,11 @@ else
fail "ticket CLI missing" fail "ticket CLI missing"
fi fi
if [[ -f "$KIT_DIR/static/db/connectors/sprint" ]]; then if [[ -f "$KIT_DIR/static/tooling/db/sprint" ]]; then
if "$KIT_DIR/static/db/connectors/sprint" --help >/dev/null 2>&1; then if "$KIT_DIR/static/tooling/db/sprint" --help >/dev/null 2>&1; then
pass "sprint --help succeeds" pass "sprint --help succeeds"
else 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" pass "sprint --help produces output"
else else
fail "sprint --help failed" fail "sprint --help failed"