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:
@@ -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
|
||||
|
||||
@@ -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)",
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../tooling/db
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-- 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)
|
||||
|
||||
PRAGMA journal_mode=WAL;
|
||||
|
||||
@@ -27,8 +27,8 @@ PROJECT_ROOT = (SCRIPT_DIR / ".." / "..").resolve()
|
||||
|
||||
REMINDER = """---
|
||||
Reminder: Keep ticket status up to date after finishing work.
|
||||
db/connectors/ticket status <id> in_progress (when starting)
|
||||
db/connectors/ticket status <id> done (when finished)"""
|
||||
tooling/db/ticket status <id> in_progress (when starting)
|
||||
tooling/db/ticket status <id> done (when finished)"""
|
||||
|
||||
|
||||
def load_config():
|
||||
@@ -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)",
|
||||
|
||||
@@ -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 <file-path>
|
||||
tooling/db/qdrant-index <file-path>
|
||||
```
|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 <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
|
||||
@@ -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 <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).
|
||||
|
||||
## Tips
|
||||
|
||||
@@ -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 <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
|
||||
|
||||
@@ -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 <ticket_id> <sprint_id>
|
||||
tooling/db/ticket sprint assign <ticket_id> <sprint_id>
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ Each team gets one briefing file at `docs/sprints/sprint-N/<team>.md`.
|
||||
|---|-------|------------|
|
||||
| #ID | Title | #dependency or — |
|
||||
|
||||
Use `db/connectors/ticket show <id>` for full details.
|
||||
Use `tooling/db/ticket show <id>` for full details.
|
||||
|
||||
## 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.
|
||||
|
||||
- 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=<start_date> --until=<end_date>
|
||||
|
||||
**Ticket outcomes:**
|
||||
```bash
|
||||
db/connectors/ticket list --sprint N
|
||||
tooling/db/ticket list --sprint N
|
||||
```
|
||||
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:
|
||||
|
||||
```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 <id>
|
||||
tooling/db/ticket show <id>
|
||||
```
|
||||
|
||||
### 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 <id>` for full ticket specs.",
|
||||
Use `tooling/db/ticket show <id>` for full ticket specs.",
|
||||
description: "Sprint {N} {team}: {name}",
|
||||
run_in_background: true
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 <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`
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ==="
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user