Files
msd-core/commands/gsd/capture.md
Joe e12a2abfd8 feat(#441): add /gsd-capture --list-seeds for seed listing and audit (#722)
* feat(#441): add /gsd-capture --list-seeds for seed listing and audit

Seeds (.planning/seeds/SEED-NNN-slug.md) could only be created (--seed),
enriched (--enrich), or auto-surfaced at /gsd-new-milestone. There was no way
to browse or audit parked seeds on demand. This adds a read-only listing,
following the established --list → workflow pattern (per the approved scope on

- gsd-tools `list-seeds [status]` (cmdListSeeds in src/commands.cts): scans the
  seeds dir, returns { count, seeds[], summary } JSON with each seed's id,
  slug, status, scope, trigger_when, planted, title. Optional case-insensitive
  status filter. User-controlled content is sanitized (sanitizeForDisplay) and
  every path validated (requireSafePath); read-only. Independent of
  audit.scanSeeds, which only returns unimplemented seeds for the milestone surface.
- /gsd-capture --list-seeds routes to a new read-only list-seeds workflow that
  renders the seed table.

Closes #441

* chore(#441): point changeset fragment at PR #722

* test(#441): allowlist list-seeds test in prompt-injection scan

The test asserts that list-seeds neutralizes injection payloads
(<system>, [INST]) embedded in seed content, so the fixtures legitimately
contain those patterns — same as the sibling security tests already on the
allowlist.

* fix(#441): use canonical /gsd:capture colon form in list-seeds workflow

Claude-facing source (commands/, agents/, gsd-core/workflows/, ...) must use
the /gsd:<cmd> colon form per ADR/CONTEXT.md; the hyphen /gsd-<cmd> form is
retired there (enforced by bug-2543-gsd-slash-namespace.test.cjs). The new
list-seeds workflow used the hyphen form.

* docs(#441): sync help full.md + INVENTORY for --list-seeds

Adds the --list-seeds entry to the help reference (help/modes/full.md, per
bug-2954 argument-hint↔help parity) and registers the new list-seeds workflow
in docs/INVENTORY.md (88→89) and the generated INVENTORY-MANIFEST.json.

* docs(#441): add --list-seeds how-to + drop phantom statuses

Addresses CHANGES_REQUESTED on PR #722 (two documentation blockers):

- USER-GUIDE.md Seeds section (how-to): extend the task to cover
  auditing parked seeds on demand via --list-seeds, including the
  status filter — kept task-oriented per Diataxis how-to mode.
- CLI-TOOLS.md (reference): drop phantom statuses implemented|rejected
  from the list-seeds filter vocabulary; the system only produces
  dormant|active|triggered (src/audit.cts scanSeeds). Reference must
  be factually accurate and complete.

* fix(#441): guard non-scalar status frontmatter in cmdListSeeds

A seed with a bare `status:` line (extractFrontmatter yields {}) or a
`status: [a, b]` value (yields an array) crashed the whole audit list:
`(fm.status || 'dormant').toLowerCase()` throws a TypeError on a non-string.
Coerce every frontmatter read through a `fmStr` helper (mirrors the existing
`typeof fm.id === 'string'` guard), so a non-scalar status falls back to
dormant and non-scalar scope/trigger_when/title can no longer leak a raw
array/object into the JSON contract. Title is now capped symmetrically.

Adds regression coverage for empty and array `status:` and non-scalar fields.

Refs #441

* docs(#441): align list-seeds workflow status vocabulary

The load_seeds step listed `implemented` as an example status filter, but the
real seed vocabulary is dormant|active|triggered (src/audit.cts scanSeeds);
`implemented` has no producer. Matches the earlier CLI-TOOLS.md correction.

Refs #441

* refactor(#441): extract pure deriveSeedIdentity; match raw status in list-seeds

Pull the seed_id/slug derivation out of cmdListSeeds into a pure, exported
deriveSeedIdentity(stem, rawFmId) so the parsing contract can be property-tested
in-process (review minor #1). No behavior change.

Filter comparison now matches the raw lowercased status (both sides already
normalized) instead of sanitizeForDisplay(status); sanitization is for output,
not matching (review nit #3).

* test(#441): add fast-check property coverage and count=1 boundary for list-seeds

Adds tests/list-seeds.property.test.cjs with four fast-check properties over
deriveSeedIdentity (never-throws, string-only contract, canonical id->seed_id/slug
invariant, filename-prefix fallback) per RULESET.TESTS.property-based-testing
(review minor #1).

Adds an N==1 status-filter boundary case to list-seeds.test.cjs (review minor #2).

* chore(#441): sync runtime launcher snippet into list-seeds workflow

Propagate the current _runtime-launcher.snippet.sh (with non-Claude
runtime home probes) into the new list-seeds.md workflow via
scripts/sync-runtime-launcher.cjs, satisfying bug-891 (E) propagation.

* test(#441): record list-seeds.md in workflow size baseline (#1074)

---------

Co-authored-by: Tom Boucher <trekkie@nomorestars.com>
2026-06-22 00:59:41 -04:00

2.5 KiB

name, description, argument-hint, allowed-tools
name description argument-hint allowed-tools
gsd:capture Capture ideas, tasks, notes, and seeds to their destination [--note | --backlog | --seed | --list | --list-seeds] [text]
Read
Write
Edit
Bash
Glob
Grep
AskUserQuestion
Capture ideas, tasks, notes, and seeds to their appropriate destination in the GSD system.

Mode routing:

  • default (no flag): Capture as a structured todo for later work → add-todo workflow
  • --note: Zero-friction idea capture (append/list/promote) → note workflow
  • --backlog: Add an idea to the backlog parking lot (999.x numbering) → add-backlog workflow
  • --seed: Capture a forward-looking idea with trigger conditions → plant-seed workflow
  • --list: List pending todos and select one to work on → check-todos workflow
  • --list-seeds: List/audit captured seeds (optional status filter) → list-seeds workflow
Flag Destination Workflow
(none) Structured todo in .planning/todos/ add-todo
--note Timestamped note file, list, or promote note
--backlog ROADMAP.md backlog section (999.x) add-backlog
--seed .planning/seeds/SEED-NNN-slug.md plant-seed
--list Interactive todo browser + action router check-todos
--list-seeds Read-only seed list/audit (optional status filter) list-seeds

<execution_context> @/.claude/gsd-core/workflows/add-todo.md @/.claude/gsd-core/workflows/note.md @/.claude/gsd-core/workflows/add-backlog.md @/.claude/gsd-core/workflows/plant-seed.md @/.claude/gsd-core/workflows/check-todos.md @/.claude/gsd-core/workflows/list-seeds.md @~/.claude/gsd-core/references/ui-brand.md </execution_context>

Arguments: $ARGUMENTS

Parse the first token of $ARGUMENTS:

  • If it is --note: strip the flag, pass remainder to note workflow
  • If it is --backlog: strip the flag, pass remainder to add-backlog workflow
  • If it is --seed: strip the flag, pass remainder to plant-seed workflow
  • If it is --list-seeds: strip the flag, pass remainder (optional status filter) to list-seeds workflow
  • If it is --list: pass remainder (optional area filter) to check-todos workflow
  • Otherwise: pass all of $ARGUMENTS to add-todo workflow
1. Parse the leading flag (if any) from $ARGUMENTS. 2. Load and execute the appropriate workflow end-to-end based on the routing table above. 3. Preserve all workflow gates from the target workflow (directory structure, duplicate detection, commits, etc.).