fix: /gsd-run uses hardcoded ~/.pi/ path instead of GSD_WORKFLOW_PATH (#38)

* feat: /gsd migrate — .planning to .gsd migration tool

Add `/gsd migrate [path]` command that reads old get-shit-done .planning
directories and writes complete .gsd directory trees for GSD-2.

Pipeline: validate → parse → transform → preview → confirm → write → review

Parser (S01):
- 7 per-file parsers: roadmap, plan, summary, requirements, project, state, config
- Handles flat, milestone-sectioned, and <details>-block roadmap formats
- Bold phase entries, "Phase N:" format, decimal numbering, duplicate phase numbers
- Bullet-format requirements (- [x] **ID**: Description)
- Graceful null returns for missing files, severity-classified validation

Transformer (S02):
- Phases → slices, plans → tasks, milestones → milestones
- Float-sorted decimal phases renumbered sequentially (S01, S02, ...)
- Completion state preserved (roadmap [x] → slice done, summary → task done)
- Research consolidated with fixed file-type ordering
- Requirements classified with complete/done/shipped → validated normalization
- Vision derived from PROJECT.md with three-level fallback
- Duplicate phase numbers disambiguated by title similarity

Writer (S03):
- Format functions for all GSD-2 file types with round-trip verification
- writeGSDDirectory produces tree that deriveState() reads correctly
- generatePreview computes milestone/slice/task counts + completion %
- Null research and empty requirements silently skipped

Command (S04):
- Default to cwd when no args given; ~/path expansion
- Validation gating (fatal issues block pipeline)
- Preview with showNextAction confirmation
- Post-write agent review via prompts/review-migration.md template
- Wired into commands.ts with tab completion

Also:
- .gitignore: replace granular .gsd/* entries with .gsd/ catch-all
- README: add /gsd migrate to commands table + "Migrating from v1" section
- files.ts: widen parseRequirementCounts regex for non-R prefixed IDs

478 assertions across 6 test suites, all passing.
UAT against blade/bladeai (28 phases, 8 milestones) and aire (10 phases, 2 milestones).

* fix: persist skipped API keys so wizard doesn't repeat on every launch

When users skip optional API keys (Brave, Context7, Jina) by pressing
Enter, the wizard stores nothing. On next launch, authStorage.has()
returns false for those providers, so the wizard prompts again.

Fix: store an empty-key sentinel for skipped providers. Also guard
loadStoredEnvKeys against injecting empty strings into process.env.

* fix: respect GSD_WORKFLOW_PATH in /gsd-run command

---------

Co-authored-by: Jonathan Costin <jonathan.costin@outlook.com>
Co-authored-by: vp275 <vedantp42@gmail.com>
This commit is contained in:
Marcel Reschke 2026-03-11 15:11:54 +01:00 committed by GitHub
parent a5fcc3964a
commit 8e1ddd51f2

View file

@ -6,7 +6,7 @@ export default function gsdRun(pi: ExtensionAPI) {
pi.registerCommand("gsd-run", {
description: "Read GSD-WORKFLOW.md and execute — lightweight protocol-driven GSD",
async handler(args: string, ctx: ExtensionCommandContext) {
const workflowPath = join(process.env.HOME ?? "~", ".pi", "GSD-WORKFLOW.md");
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(process.env.HOME ?? "~", ".pi", "GSD-WORKFLOW.md");
let workflow: string;
try {