Files
msd-core/sdk/src/query/QUERY-HANDLERS.md
Rezolv d3a79917fa feat: Phase 2 caller migration — gsd-sdk query in workflows, agents, commands (#2179)
* feat: Phase 2 caller migration — gsd-sdk query in workflows (#2122)

Cherry-picked orchestration rewrites from feat/sdk-foundation (#2008, 4018fee) onto current main, resolving conflicts to keep upstream worktree guards and post-merge test gate. SDK stub registry omitted (out of Phase 2 scope per #2122).

Refs: #2122 #2008
Made-with: Cursor

* docs: add gsd-sdk query migration blurb

Made-with: Cursor

* docs(workflows): extend Phase 2 gsd-sdk query caller migration

- Swap node gsd-tools.cjs for gsd-sdk query in review, plan-phase, execute-plan,
  ship, extract_learnings, ai-integration-phase, eval-review, next, thread
- Document graphify CJS-only in gsd-planner; dual-path in CLI-TOOLS and ARCHITECTURE
- Update tests: workstreams gsd-sdk path, thread frontmatter.get, workspace init.*,
  CRLF-safe autonomous frontmatter parse
- CHANGELOG: Phase 2 caller migration scope

Made-with: Cursor

* docs(phase2): USER-GUIDE + remaining gsd-sdk query call sites

- USER-GUIDE: dual-path CLI section; state validate/sync use full CJS path
- Commands: debug (config-get+tdd), quick (security note), intel Task prompt
- Agent: gsd-debug-session-manager resolve-model via jq
- Workflows: milestone-summary, forensics, next, complete-milestone/verify-work
  (audit-open CJS notes), discuss-phase, progress, verify-phase, add/insert/remove
  phase, transition, manager, quick workflow; remove-phase commit without --files
- Test: quick-session-management accepts frontmatter.get
- CHANGELOG: Phase 2 follow-up bullet

Made-with: Cursor

* docs(phase2): align gsd-sdk query examples in commands and agents

- init.* query names; frontmatter.get uses positional field name
- state.* handlers use positional args; commit uses positional paths
- CJS-only notes for from-gsd2 and graphify; learnings.query wording
- CHANGELOG: Phase 2 orchestration doc pass

Made-with: Cursor

* docs(phase2): normalize gsd-sdk query commit to positional file paths

- Strip --files from commit examples in workflows, references, commands
- Keep commit-to-subrepo ... --files (separate handler)
- git-planning-commit.md: document positional args
- Tests: new-project commit line, state.record-session, gates CRLF, roadmap.analyze
- CHANGELOG [Unreleased]

Made-with: Cursor

* feat(sdk): gsd-sdk query parity with gsd-tools and PR 2179 registry fixes

- Route query via longest-prefix match and dotted single-token expansion; fall back
  to runGsdToolsQuery (same argv as node gsd-tools.cjs) for full CLI coverage.
- Parse gsd-sdk query permissively so gsd-tools flags (--json, --verify, etc.) are
  not rejected by strict parseArgs.
- resolveGsdToolsPath: honor GSD_TOOLS_PATH; prefer bundled get-shit-done copy
  over project .claude installs; export runGsdToolsQuery from the SDK.
- Fix gsd-tools audit-open (core.output; pass object for --json JSON).
- Register summary-extract as alias of summary.extract; fix audit-fix workflow to
  call audit-uat instead of invalid init.audit-uat (PR review).

Updates QUERY-HANDLERS.md and CHANGELOG [Unreleased].

Made-with: Cursor

* fix(sdk): Phase 2 scope — Trek-e review (#2179, #2122)

- Remove gsd-sdk query passthrough to gsd-tools.cjs; drop GSD_TOOLS_PATH
- Consolidate argv routing in resolveQueryArgv(); update USAGE and QUERY-HANDLERS
- Surface @file: read failures in GSDTools.parseOutput
- execute-plan: defer Task Commit Protocol to gsd-executor
- stale-colon-refs: skip .planning/ and root CLAUDE.md (gitignored overlays)
- CHANGELOG [Unreleased]: maintainer review and routing notes

Made-with: Cursor
2026-04-15 22:46:31 -04:00

2.6 KiB

Query handler conventions (sdk/src/query/)

This document records contracts for the typed query layer consumed by gsd-sdk query and programmatic createRegistry() callers.

gsd-sdk query routing

  • Longest-prefix match on argv (resolveQueryArgv in registry.ts): tries joined keys a.b.c then a b c for each prefix length, longest first. Example: state update status X → handler state.update with args [status, X].
  • Dotted single token: one token like init.new-project matches the registry; if the first pass finds no handler, a single dotted token is split and matching runs again (same helper as above).
  • No CJS passthrough: if nothing matches a registered handler, the CLI exits with an error. Operations not ported to the query registry (e.g. audit-open, graphify, from-gsd2, state validate) must use node …/gsd-tools.cjs directly — see docs/CLI-TOOLS.md.
  • Output: JSON written to stdout for successful handler results.

Error handling

  • Validation and programmer errors: Handlers throw GSDError with an ErrorClassification (e.g. missing required args, invalid phase). The CLI maps these to exit codes via exitCodeFor().
  • Expected domain failures: Handlers return { data: { error: string, ... } } for cases that are not exceptional in normal use (file not found, intel disabled, todo missing, etc.). Callers must check data.error when present.
  • Do not mix both styles for the same failure mode in new code: prefer throw for "caller must fix input"; prefer data.error for "operation could not complete in this project state."

Mutation commands and events

  • QUERY_MUTATION_COMMANDS in index.ts lists every command name (including space-delimited aliases) that performs durable writes. It drives optional GSDEventStream wrapping so mutations emit structured events.
  • Init composition handlers (init.*) are not included: they return JSON for workflows; agents perform filesystem work.

Session correlation (sessionId)

  • Mutation events include sessionId: '' until a future phase threads session identifiers through the query dispatch path. Consumers should not rely on sessionId for correlation today.

Lockfiles (state-mutation.ts)

  • STATE.md (and ROADMAP) locks use a sibling .lock file with the holder's PID. Stale locks are cleared when the PID no longer exists (process.kill(pid, 0) fails) or when the lock file is older than the existing time-based threshold.
  • searchJsonEntries in intel.ts caps recursion depth (MAX_JSON_SEARCH_DEPTH) to avoid stack overflow on pathological nested JSON.