Tom Boucher
54b06e653e
docs(sdk): document runtime bridge seam, strict mode, and fallback policy
2026-05-05 19:29:59 -04:00
Tom Boucher
9c92c32f6e
refactor(query): deepen runtime context/native adapter/output seams ( #3076 )
...
* refactor(query): deepen runtime context, native adapter, and cli output seams
* chore(changeset): add fragment for query seam deepening continuation
* refactor(query): converge internal command-resolution imports on canonical seam
* refactor(query): remove dead seam wrappers and converge on canonical modules
* docs(architecture): update context and adr for query seam completion
* fix(query): preserve gsd-tools stderr in cli output and clarify static ws test scope
* test(query): cover whitespace stderr and null exitCode fallback
2026-05-03 16:31:48 -04:00
Tom Boucher
f104dab332
refactor(query): deepen dispatch policy seam with structured result contract ( #3066 )
...
* refactor(query): deepen dispatch policy seam with structured result contract
Closes #3065 .
- unify query dispatch outcome as typed success/failure union
- include error kind/details + final exit_code in failure path
- align native and fallback paths under one dispatch policy seam
- make CLI query path consume seam result (thin adapter)
- add ADR + context term for Dispatch Policy Module
* refactor(query): strengthen dispatch seam with shared error mapper and typed details
- add query-dispatch-error-mapper module shared by native/fallback paths
- remove ad-hoc inline mapping in dispatch/fallback executors
- lock error-details schema in mapper + dispatch tests
- document structured dispatch contract in QUERY-HANDLERS.md
* fix(query): return structured fallback failure when path resolution throws
- guard resolveGsdToolsPath in cjs dispatch path
- map thrown resolution errors to fallback_failure result
- add regression test for structured failure contract
2026-05-03 14:30:27 -04:00
Tom Boucher
444db1714b
refactor(query): manifest-backed routing seam + family adapters ( #2908 )
...
Merging validated command-seam foundation.
2026-04-30 14:04:50 -04:00
Tom Boucher
303fd26b45
fix( #2662 ): add state.add-roadmap-evolution SDK handler; insert-phase uses it ( #2683 )
...
/gsd-insert-phase step 4 instructed the agent to directly Edit/Write
.planning/STATE.md to append a Roadmap Evolution entry. Projects that
ship a protect-files.sh PreToolUse hook (a recommended hardening
pattern) blocked the raw write, silently leaving STATE.md out of sync
with ROADMAP.md.
Adds a dedicated SDK handler state.add-roadmap-evolution (plus space
alias) that:
- Reads STATE.md through the shared readModifyWriteStateMd lockfile
path (matches sibling mutation handlers — atomic against
concurrent writers).
- Locates ### Roadmap Evolution under ## Accumulated Context, or
creates both sections as needed.
- Dedupes on exact-line match so idempotent retries are no-ops
({ added: false, reason: "duplicate" }).
- Validates --phase / --action presence and action membership,
throwing GSDError(Validation) for bad input (no silent
{ ok: false } swallow).
Workflow change (insert-phase.md step 4):
- Replaces the raw Edit/Write instructions for STATE.md with
gsd-sdk query state.patch (for the next-phase pointer) and
gsd-sdk query state.add-roadmap-evolution (for the evolution
log).
- Updates success criteria to check handler responses.
- Drops "Write" from commands/gsd/insert-phase.md allowed-tools
(no step in the workflow needs it any more).
Tests (vitest, sdk/src/query/state-mutation.test.ts): subsection
creation when missing; append-preserving-order when present;
duplicate -> reason=duplicate; idempotence over two calls; three
validation cases covering missing --phase, missing --action, and
invalid action.
This is the first SDK handler dedicated to STATE.md Roadmap
Evolution mutations. Other workflows with similar raw STATE.md
edits (/gsd-pause-work, /gsd-resume-work, /gsd-new-project,
/gsd-complete-milestone, /gsd-add-phase) remain on raw Edit/Write
and will need follow-up issues to migrate — out of scope for this
fix.
Closes #2662
2026-04-24 20:20:02 -04:00
Rezolv
c5b1445529
feat(sdk): golden parity harness and query handler CJS alignment ( #2302 Track A) ( #2341 )
...
* feat(sdk): golden parity harness and query handler CJS alignment (#2302 Track A)
Golden/read-only parity tests and registry alignment, query handler fixes
(check-completion, state-mutation, commit, validate, summary, etc.), and
WAITING.json dual-write for .gsd/.planning readers.
Refs gsd-build/get-shit-done#2341
* fix(sdk): getMilestoneInfo matches GSD ROADMAP (🟡 , last bold, STATE fallback)
- Recognize in-flight 🟡 milestone bullets like 🚧 .
- Derive from last **vX.Y Title** before ## Phases when emoji absent.
- Fall back to STATE.md milestone when ROADMAP is missing; use last bare vX.Y
in cleaned text instead of first (avoids v1.0 from shipped list).
- Fixes init.execute-phase milestone_version and buildStateFrontmatter after
state.begin-phase (syncStateFrontmatter).
* feat(sdk): phase list, plan task structure, requirements extract handlers
- Register phase.list-plans, phase.list-artifacts, plan.task-structure,
requirements.extract-from-plans (SDK-only; golden-policy exceptions).
- Add unit tests; document in QUERY-HANDLERS.md.
- writeProfile: honor --output, render dimensions, return profile_path and dimensions_scored.
* feat(sdk): centralize getGsdAgentsDir in query helpers
Extract agent directory resolution to helpers (GSD_AGENTS_DIR, primary
~/.claude/agents, legacy path). Use from init and docs-init init bundles.
docs(15): add 15-CONTEXT for autonomous phase-15 run.
* feat(sdk): query CLI CJS fallback and session correlation
- createRegistry(eventStream, sessionId) threads correlation into mutation events
- gsd-sdk query falls back to gsd-tools.cjs when no native handler matches
(disable with GSD_QUERY_FALLBACK=off); stderr bridge warnings
- Export createRegistry from @gsd-build/sdk; add sdk/README.md
- Update QUERY-HANDLERS.md and registry module docs for fallback + sessionId
- Agents: prefer node dist/cli.js query over cat/grep for STATE and plans
* fix(sdk): init phase_found parity, docs-init agents path, state field extract
- Normalize findPhase not-found to null before roadmap fallback (matches findPhaseInternal)
- docs-init: use detectRuntime + resolveAgentsDir for checkAgentsInstalled
- state.cjs stateExtractField: horizontal whitespace only after colon (YAML progress guard)
- Tests: commit_docs default true; config-get golden uses temp config; golden integration green
Refs: #2302
* refactor(sdk): share SessionJsonlRecord in profile-extract-messages
CodeRabbit nit: dedupe JSONL record shape for isGenuineUserMessage and streamExtractMessages.
* fix(sdk): address CodeRabbit major threads (paths, gates, audit, verify)
- Resolve @file: and CLI JSON indirection relative to projectDir; guard empty normalized query command
- plan.task-structure + intel extract/patch-meta: resolvePathUnderProject containment
- check.config-gates: safe string booleans; plan_checker alias precedence over plan_check default
- state.validate/sync: phaseTokenMatches + comparePhaseNum ordering
- verify.schema-drift: token match phase dirs; files_modified from parsed frontmatter
- audit-open: has_scan_errors, unreadable rows, human report when scans fail
- requirements PLANNED key PLAN for root PLAN.md; gsd-tools timeout note
- ingest-docs: repo-root path containment; classifier output slug-hash
Golden parity test strips has_scan_errors until CJS adds field.
* fix: Resolve CodeRabbit security and quality findings
- Secure intel.ts and cli.ts against path traversal
- Catch and validate git add status in commit.ts
- Expand roadmap milestone marker extraction
- Fix parsing array-of-objects in frontmatter YAML
- Fix unhandled config evaluations
- Improve coverage test parity mapping
* test: raise planner character extraction limit to 48K
* fix(sdk): resolve TS build error in docs-init passing config
2026-04-20 18:09:02 -04:00
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
Rezolv
6f79b1dd5e
feat(sdk): Phase 1 typed query foundation (gsd-sdk query) ( #2118 )
...
* feat(sdk): add typed query foundation and gsd-sdk query (Phase 1)
Add sdk/src/query registry and handlers with tests, GSDQueryError, CLI query wiring, and supporting type/tool-scoping hooks. Update CHANGELOG. Vitest 4 constructor mock fixes in milestone-runner tests.
Made-with: Cursor
* chore: gitignore .cursor for local-only Cursor assets
Made-with: Cursor
* fix(sdk): harden query layer for PR review (paths, locks, CLI, ReDoS)
- resolvePathUnderProject: realpath + relative containment for frontmatter and key_links
- commitToSubrepo: path checks + sanitizeCommitMessage
- statePlannedPhase: readModifyWriteStateMd (lock); MUTATION_COMMANDS + events
- key_links: regexForKeyLinkPattern length/ReDoS guard; phase dirs: reject .. and separators
- gsd-sdk: strip --pick before parseArgs; strict parser; QueryRegistry.commands()
- progress: static GSDError import; tests updated
Made-with: Cursor
* feat(sdk): query follow-up — tests, QUERY-HANDLERS, registry, locks, intel depth
Made-with: Cursor
* docs(sdk): use ASCII punctuation in QUERY-HANDLERS.md
Made-with: Cursor
2026-04-12 18:15:04 -04:00