diff --git a/agents/gsd-debugger.md b/agents/gsd-debugger.md index 2635ee7d7..84fd893c1 100644 --- a/agents/gsd-debugger.md +++ b/agents/gsd-debugger.md @@ -1027,7 +1027,7 @@ mv .planning/debug/{slug}.md .planning/debug/resolved/ **Check planning config using state load (commit_docs is available from the output):** ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs state load) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load) # commit_docs is in the JSON output ``` @@ -1044,7 +1044,7 @@ Root cause: {root_cause}" Then commit planning docs via CLI (respects `commit_docs` config automatically): ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: resolve debug {slug}" --files .planning/debug/resolved/{slug}.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: resolve debug {slug}" --files .planning/debug/resolved/{slug}.md ``` Report completion and offer next steps. diff --git a/agents/gsd-executor.md b/agents/gsd-executor.md index 7d95f2623..93fee0f45 100644 --- a/agents/gsd-executor.md +++ b/agents/gsd-executor.md @@ -21,7 +21,7 @@ Before executing, discover project context: **Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions. -**Project skills:** Check `.agents/skills/` directory if it exists: +**Project skills:** Check `.claude/skills/` or `.agents/skills/` directory if either exists: 1. List available skills (subdirectories) 2. Read `SKILL.md` for each skill (lightweight index ~130 lines) 3. Load specific `rules/*.md` files as needed during implementation @@ -37,7 +37,7 @@ This ensures project-specific patterns, conventions, and best practices are appl Load execution context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init execute-phase "${PHASE}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "${PHASE}") ``` Extract from init JSON: `executor_model`, `commit_docs`, `phase_dir`, `plans`, `incomplete_plans`. @@ -190,7 +190,7 @@ Track auto-fix attempts per task. After 3 auto-fix attempts on a single task: Check if auto mode is active at executor start: ```bash -AUTO_CFG=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-get workflow.auto_advance 2>/dev/null || echo "false") +AUTO_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow.auto_advance 2>/dev/null || echo "false") ``` Store the result for checkpoint handling below. @@ -379,34 +379,34 @@ After SUMMARY.md, update STATE.md using gsd-tools: ```bash # Advance plan counter (handles edge cases automatically) -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state advance-plan +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state advance-plan # Recalculate progress bar from disk state -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state update-progress +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state update-progress # Record execution metrics -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state record-metric \ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state record-metric \ --phase "${PHASE}" --plan "${PLAN}" --duration "${DURATION}" \ --tasks "${TASK_COUNT}" --files "${FILE_COUNT}" # Add decisions (extract from SUMMARY.md key-decisions) for decision in "${DECISIONS[@]}"; do - node ~/.claude/get-shit-done/bin/gsd-tools.cjs state add-decision \ + node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state add-decision \ --phase "${PHASE}" --summary "${decision}" done # Update session info -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state record-session \ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state record-session \ --stopped-at "Completed ${PHASE}-${PLAN}-PLAN.md" ``` ```bash # Update ROADMAP.md progress for this phase (plan counts, status) -node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap update-plan-progress "${PHASE_NUMBER}" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap update-plan-progress "${PHASE_NUMBER}" # Mark completed requirements from PLAN.md frontmatter # Extract the `requirements` array from the plan's frontmatter, then mark each complete -node ~/.claude/get-shit-done/bin/gsd-tools.cjs requirements mark-complete ${REQ_IDS} +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" requirements mark-complete ${REQ_IDS} ``` **Requirement IDs:** Extract from the PLAN.md frontmatter `requirements:` field (e.g., `requirements: [AUTH-01, AUTH-02]`). Pass all IDs to `requirements mark-complete`. If the plan has no requirements field, skip this step. @@ -424,13 +424,13 @@ node ~/.claude/get-shit-done/bin/gsd-tools.cjs requirements mark-complete ${REQ_ **For blockers found during execution:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state add-blocker "Blocker description" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state add-blocker "Blocker description" ``` ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md .planning/REQUIREMENTS.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md .planning/REQUIREMENTS.md ``` Separate from per-task commits — captures execution results only. diff --git a/agents/gsd-phase-researcher.md b/agents/gsd-phase-researcher.md index 461bc3482..981489dfb 100644 --- a/agents/gsd-phase-researcher.md +++ b/agents/gsd-phase-researcher.md @@ -26,7 +26,7 @@ Before researching, discover project context: **Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions. -**Project skills:** Check `.agents/skills/` directory if it exists: +**Project skills:** Check `.claude/skills/` or `.agents/skills/` directory if either exists: 1. List available skills (subdirectories) 2. Read `SKILL.md` for each skill (lightweight index ~130 lines) 3. Load specific `rules/*.md` files as needed during research @@ -120,7 +120,7 @@ When researching "best library for X": find what the ecosystem actually uses, do Check `brave_search` from init context. If `true`, use Brave Search for higher quality results: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs websearch "your query" --limit 10 +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" websearch "your query" --limit 10 ``` **Options:** @@ -359,7 +359,7 @@ Orchestrator provides: phase number/name, description/goal, requirements, constr Load phase context using init command: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${PHASE}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE}") ``` Extract from init JSON: `phase_dir`, `padded_phase`, `phase_number`, `commit_docs`. @@ -461,7 +461,7 @@ Write to: `$PHASE_DIR/$PADDED_PHASE-RESEARCH.md` ## Step 7: Commit Research (optional) ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs($PHASE): research phase domain" --files "$PHASE_DIR/$PADDED_PHASE-RESEARCH.md" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs($PHASE): research phase domain" --files "$PHASE_DIR/$PADDED_PHASE-RESEARCH.md" ``` ## Step 8: Return Structured Result diff --git a/agents/gsd-plan-checker.md b/agents/gsd-plan-checker.md index 3ef73ea36..28b0f5aa8 100644 --- a/agents/gsd-plan-checker.md +++ b/agents/gsd-plan-checker.md @@ -31,7 +31,7 @@ Before verifying, discover project context: **Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions. -**Project skills:** Check `.agents/skills/` directory if it exists: +**Project skills:** Check `.claude/skills/` or `.agents/skills/` directory if either exists: 1. List available skills (subdirectories) 2. Read `SKILL.md` for each skill (lightweight index ~130 lines) 3. Load specific `rules/*.md` files as needed during verification @@ -365,7 +365,7 @@ If FAIL: return to planner with specific fixes. Same revision loop as other dime Load phase operation context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${PHASE_ARG}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}") ``` Extract from init JSON: `phase_dir`, `phase_number`, `has_plans`, `plan_count`. @@ -376,7 +376,7 @@ Orchestrator provides CONTEXT.md content in the verification prompt. If provided ls "$phase_dir"/*-PLAN.md 2>/dev/null # Read research for Nyquist validation data cat "$phase_dir"/*-RESEARCH.md 2>/dev/null -node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "$phase_number" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "$phase_number" ls "$phase_dir"/*-BRIEF.md 2>/dev/null ``` @@ -389,7 +389,7 @@ Use gsd-tools to validate plan structure: ```bash for plan in "$PHASE_DIR"/*-PLAN.md; do echo "=== $plan ===" - PLAN_STRUCTURE=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify plan-structure "$plan") + PLAN_STRUCTURE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify plan-structure "$plan") echo "$PLAN_STRUCTURE" done ``` @@ -407,7 +407,7 @@ Map errors/warnings to verification dimensions: Extract must_haves from each plan using gsd-tools: ```bash -MUST_HAVES=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs frontmatter get "$PLAN_PATH" --field must_haves) +MUST_HAVES=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" frontmatter get "$PLAN_PATH" --field must_haves) ``` Returns JSON: `{ truths: [...], artifacts: [...], key_links: [...] }` @@ -450,7 +450,7 @@ For each requirement: find covering task(s), verify action is specific, flag gap Use gsd-tools plan-structure verification (already run in Step 2): ```bash -PLAN_STRUCTURE=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify plan-structure "$PLAN_PATH") +PLAN_STRUCTURE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify plan-structure "$PLAN_PATH") ``` The `tasks` array in the result shows each task's completeness: diff --git a/agents/gsd-planner.md b/agents/gsd-planner.md index ffa1723f8..3d8389068 100644 --- a/agents/gsd-planner.md +++ b/agents/gsd-planner.md @@ -33,7 +33,7 @@ Before planning, discover project context: **Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions. -**Project skills:** Check `.agents/skills/` directory if it exists: +**Project skills:** Check `.claude/skills/` or `.agents/skills/` directory if either exists: 1. List available skills (subdirectories) 2. Read `SKILL.md` for each skill (lightweight index ~130 lines) 3. Load specific `rules/*.md` files as needed during planning @@ -900,7 +900,7 @@ Group by plan, dimension, severity. ### Step 6: Commit ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md ``` ### Step 7: Return Revision Summary @@ -939,7 +939,7 @@ node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "fix($PHASE): revise plans Load planning context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init plan-phase "${PHASE}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init plan-phase "${PHASE}") ``` Extract from init JSON: `planner_model`, `researcher_model`, `checker_model`, `commit_docs`, `research_enabled`, `phase_dir`, `phase_number`, `has_research`, `has_context`. @@ -995,7 +995,7 @@ Apply discovery level protocol (see discovery_levels section). **Step 1 — Generate digest index:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs history-digest +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" history-digest ``` **Step 2 — Select relevant phases (typically 2-4):** @@ -1123,7 +1123,7 @@ Include all frontmatter fields. Validate each created PLAN.md using gsd-tools: ```bash -VALID=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs frontmatter validate "$PLAN_PATH" --schema plan) +VALID=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" frontmatter validate "$PLAN_PATH" --schema plan) ``` Returns JSON: `{ valid, missing, present, schema }` @@ -1136,7 +1136,7 @@ Required plan frontmatter fields: Also validate plan structure: ```bash -STRUCTURE=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify plan-structure "$PLAN_PATH") +STRUCTURE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify plan-structure "$PLAN_PATH") ``` Returns JSON: `{ valid, errors, warnings, task_count, tasks }` @@ -1173,7 +1173,7 @@ Plans: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs($PHASE): create phase plan" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md .planning/ROADMAP.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs($PHASE): create phase plan" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md .planning/ROADMAP.md ``` diff --git a/agents/gsd-project-researcher.md b/agents/gsd-project-researcher.md index cbf5554bc..4bd9fe71b 100644 --- a/agents/gsd-project-researcher.md +++ b/agents/gsd-project-researcher.md @@ -99,7 +99,7 @@ Always include current year. Use multiple query variations. Mark WebSearch-only Check `brave_search` from orchestrator context. If `true`, use Brave Search for higher quality results: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs websearch "your query" --limit 10 +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" websearch "your query" --limit 10 ``` **Options:** diff --git a/agents/gsd-research-synthesizer.md b/agents/gsd-research-synthesizer.md index b016557ad..3bf216dc0 100644 --- a/agents/gsd-research-synthesizer.md +++ b/agents/gsd-research-synthesizer.md @@ -131,7 +131,7 @@ Write to `.planning/research/SUMMARY.md` The 4 parallel researcher agents write files but do NOT commit. You commit everything together. ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: complete project research" --files .planning/research/ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: complete project research" --files .planning/research/ ``` ## Step 8: Return Summary diff --git a/agents/gsd-verifier.md b/agents/gsd-verifier.md index b2b5ed03e..dba967774 100644 --- a/agents/gsd-verifier.md +++ b/agents/gsd-verifier.md @@ -21,7 +21,7 @@ Before verifying, discover project context: **Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions. -**Project skills:** Check `.agents/skills/` directory if it exists: +**Project skills:** Check `.claude/skills/` or `.agents/skills/` directory if either exists: 1. List available skills (subdirectories) 2. Read `SKILL.md` for each skill (lightweight index ~130 lines) 3. Load specific `rules/*.md` files as needed during verification @@ -72,7 +72,7 @@ Set `is_re_verification = false`, proceed with Step 1. ```bash ls "$PHASE_DIR"/*-PLAN.md 2>/dev/null ls "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null -node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "$PHASE_NUM" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "$PHASE_NUM" grep -E "^| $PHASE_NUM" .planning/REQUIREMENTS.md 2>/dev/null ``` @@ -109,7 +109,7 @@ must_haves: If no must_haves in frontmatter, check for Success Criteria: ```bash -PHASE_DATA=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "$PHASE_NUM" --raw) +PHASE_DATA=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "$PHASE_NUM" --raw) ``` Parse the `success_criteria` array from the JSON output. If non-empty: @@ -152,7 +152,7 @@ For each truth: Use gsd-tools for artifact verification against must_haves in PLAN frontmatter: ```bash -ARTIFACT_RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify artifacts "$PLAN_PATH") +ARTIFACT_RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify artifacts "$PLAN_PATH") ``` Parse JSON result: `{ all_passed, passed, total, artifacts: [{path, exists, issues, passed}] }` @@ -201,7 +201,7 @@ Key links are critical connections. If broken, the goal fails even with all arti Use gsd-tools for key link verification against must_haves in PLAN frontmatter: ```bash -LINKS_RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify key-links "$PLAN_PATH") +LINKS_RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify key-links "$PLAN_PATH") ``` Parse JSON result: `{ all_verified, verified, total, links: [{from, to, via, verified, detail}] }` @@ -283,12 +283,12 @@ Identify files modified in this phase from SUMMARY.md key-files section, or extr ```bash # Option 1: Extract from SUMMARY frontmatter -SUMMARY_FILES=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs summary-extract "$PHASE_DIR"/*-SUMMARY.md --fields key-files) +SUMMARY_FILES=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" summary-extract "$PHASE_DIR"/*-SUMMARY.md --fields key-files) # Option 2: Verify commits exist (if commit hashes documented) COMMIT_HASHES=$(grep -oE "[a-f0-9]{7,40}" "$PHASE_DIR"/*-SUMMARY.md | head -10) if [ -n "$COMMIT_HASHES" ]; then - COMMITS_VALID=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify commits $COMMIT_HASHES) + COMMITS_VALID=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify commits $COMMIT_HASHES) fi # Fallback: grep for files diff --git a/bin/install.js b/bin/install.js index 116998231..8a135958d 100755 --- a/bin/install.js +++ b/bin/install.js @@ -951,16 +951,16 @@ function cleanupOrphanedHooks(settings) { console.log(` ${green}✓${reset} Removed orphaned hook registrations`); } - // Fix #330: Update statusLine if it points to old statusline.js path + // Fix #330: Update statusLine if it points to old GSD statusline.js path + // Only match the specific old GSD path pattern (hooks/statusline.js), + // not third-party statusline scripts that happen to contain 'statusline.js' if (settings.statusLine && settings.statusLine.command && - settings.statusLine.command.includes('statusline.js') && - !settings.statusLine.command.includes('gsd-statusline.js')) { - // Replace old path with new path + /hooks[\/\\]statusline\.js/.test(settings.statusLine.command)) { settings.statusLine.command = settings.statusLine.command.replace( - /statusline\.js/, - 'gsd-statusline.js' + /hooks([\/\\])statusline\.js/, + 'hooks$1gsd-statusline.js' ); - console.log(` ${green}✓${reset} Updated statusline path (statusline.js → gsd-statusline.js)`); + console.log(` ${green}✓${reset} Updated statusline path (hooks/statusline.js → hooks/gsd-statusline.js)`); } return settings; diff --git a/commands/gsd/debug.md b/commands/gsd/debug.md index 1fd437e0e..4dc1bde79 100644 --- a/commands/gsd/debug.md +++ b/commands/gsd/debug.md @@ -31,12 +31,12 @@ ls .planning/debug/*.md 2>/dev/null | grep -v resolved | head -5 ## 0. Initialize Context ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs state load) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load) ``` Extract `commit_docs` from init JSON. Resolve debugger model: ```bash -DEBUGGER_MODEL=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs resolve-model gsd-debugger --raw) +debugger_model=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" resolve-model gsd-debugger --raw) ``` ## 1. Check Active Sessions diff --git a/commands/gsd/research-phase.md b/commands/gsd/research-phase.md index ad022bf00..be3d9a0eb 100644 --- a/commands/gsd/research-phase.md +++ b/commands/gsd/research-phase.md @@ -34,20 +34,20 @@ Normalize phase input in step 1 before any directory lookups. ## 0. Initialize Context ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "$ARGUMENTS") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "$ARGUMENTS") ``` Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`, `phase_found`, `commit_docs`, `has_research`, `state_path`, `requirements_path`, `context_path`, `research_path`. Resolve researcher model: ```bash -RESEARCHER_MODEL=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs resolve-model gsd-phase-researcher --raw) +RESEARCHER_MODEL=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" resolve-model gsd-phase-researcher --raw) ``` ## 1. Validate Phase ```bash -PHASE_INFO=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "${phase_number}") +PHASE_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${phase_number}") ``` **If `found` is false:** Error and exit. **If `found` is true:** Extract `phase_number`, `phase_name`, `goal` from JSON. diff --git a/get-shit-done/bin/lib/core.cjs b/get-shit-done/bin/lib/core.cjs index 20aab2803..0a346ba73 100644 --- a/get-shit-done/bin/lib/core.cjs +++ b/get-shit-done/bin/lib/core.cjs @@ -69,6 +69,7 @@ function loadConfig(cwd) { research: true, plan_checker: true, verifier: true, + nyquist_validation: false, parallelization: true, brave_search: false, }; @@ -102,6 +103,7 @@ function loadConfig(cwd) { research: get('research', { section: 'workflow', field: 'research' }) ?? defaults.research, plan_checker: get('plan_checker', { section: 'workflow', field: 'plan_check' }) ?? defaults.plan_checker, verifier: get('verifier', { section: 'workflow', field: 'verifier' }) ?? defaults.verifier, + nyquist_validation: get('nyquist_validation', { section: 'workflow', field: 'nyquist_validation' }) ?? defaults.nyquist_validation, parallelization, brave_search: get('brave_search') ?? defaults.brave_search, model_overrides: parsed.model_overrides || null, diff --git a/get-shit-done/bin/lib/phase.cjs b/get-shit-done/bin/lib/phase.cjs index 05023fdeb..4e4cbff60 100644 --- a/get-shit-done/bin/lib/phase.cjs +++ b/get-shit-done/bin/lib/phase.cjs @@ -193,6 +193,11 @@ function cmdFindPhase(cwd, phase, raw) { } } +function extractObjective(content) { + const m = content.match(/\s*\n?\s*(.+)/); + return m ? m[1].trim() : null; +} + function cmdPhasePlanIndex(cwd, phase, raw) { if (!phase) { error('phase required for phase-plan-index'); @@ -242,9 +247,10 @@ function cmdPhasePlanIndex(cwd, phase, raw) { const content = fs.readFileSync(planPath, 'utf-8'); const fm = extractFrontmatter(content); - // Count tasks (## Task N patterns) - const taskMatches = content.match(/##\s*Task\s*\d+/gi) || []; - const taskCount = taskMatches.length; + // Count tasks: XML tags (canonical) or ## Task N markdown (legacy) + const xmlTasks = content.match(/]/gi) || []; + const mdTasks = content.match(/##\s*Task\s*\d+/gi) || []; + const taskCount = xmlTasks.length || mdTasks.length; // Parse wave as integer const wave = parseInt(fm.wave, 10) || 1; @@ -259,10 +265,11 @@ function cmdPhasePlanIndex(cwd, phase, raw) { hasCheckpoints = true; } - // Parse files-modified + // Parse files_modified (underscore is canonical; also accept hyphenated for compat) let filesModified = []; - if (fm['files-modified']) { - filesModified = Array.isArray(fm['files-modified']) ? fm['files-modified'] : [fm['files-modified']]; + const fmFiles = fm['files_modified'] || fm['files-modified']; + if (fmFiles) { + filesModified = Array.isArray(fmFiles) ? fmFiles : [fmFiles]; } const hasSummary = completedPlanIds.has(planId); @@ -274,7 +281,7 @@ function cmdPhasePlanIndex(cwd, phase, raw) { id: planId, wave, autonomous, - objective: fm.objective || null, + objective: extractObjective(content) || fm.objective || null, files_modified: filesModified, task_count: taskCount, has_summary: hasSummary, diff --git a/get-shit-done/bin/lib/state.cjs b/get-shit-done/bin/lib/state.cjs index 2916af9d5..915f51c45 100644 --- a/get-shit-done/bin/lib/state.cjs +++ b/get-shit-done/bin/lib/state.cjs @@ -151,7 +151,8 @@ function cmdStateUpdate(cwd, field, value) { // ─── State Progression Engine ──────────────────────────────────────────────── function stateExtractField(content, fieldName) { - const pattern = new RegExp(`\\*\\*${fieldName}:\\*\\*\\s*(.+)`, 'i'); + const escaped = fieldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const pattern = new RegExp(`\\*\\*${escaped}:\\*\\*\\s*(.+)`, 'i'); const match = content.match(pattern); return match ? match[1].trim() : null; } diff --git a/get-shit-done/references/decimal-phase-calculation.md b/get-shit-done/references/decimal-phase-calculation.md index 8597d7e30..b8da32114 100644 --- a/get-shit-done/references/decimal-phase-calculation.md +++ b/get-shit-done/references/decimal-phase-calculation.md @@ -6,7 +6,7 @@ Calculate the next decimal phase number for urgent insertions. ```bash # Get next decimal phase after phase 6 -node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase next-decimal 6 +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase next-decimal 6 ``` Output: @@ -32,14 +32,14 @@ With existing decimals: ## Extract Values ```bash -DECIMAL_INFO=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase next-decimal "${AFTER_PHASE}") +DECIMAL_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase next-decimal "${AFTER_PHASE}") DECIMAL_PHASE=$(echo "$DECIMAL_INFO" | jq -r '.next') BASE_PHASE=$(echo "$DECIMAL_INFO" | jq -r '.base_phase') ``` Or with --raw flag: ```bash -DECIMAL_PHASE=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase next-decimal "${AFTER_PHASE}" --raw) +DECIMAL_PHASE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase next-decimal "${AFTER_PHASE}" --raw) # Returns just: 06.1 ``` @@ -57,7 +57,7 @@ DECIMAL_PHASE=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase next-decima Decimal phase directories use the full decimal number: ```bash -SLUG=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs generate-slug "$DESCRIPTION" --raw) +SLUG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" generate-slug "$DESCRIPTION" --raw) PHASE_DIR=".planning/phases/${DECIMAL_PHASE}-${SLUG}" mkdir -p "$PHASE_DIR" ``` diff --git a/get-shit-done/references/git-integration.md b/get-shit-done/references/git-integration.md index df086b9c1..1e0a9d1b4 100644 --- a/get-shit-done/references/git-integration.md +++ b/get-shit-done/references/git-integration.md @@ -51,7 +51,7 @@ Phases: What to commit: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: initialize [project-name] ([N] phases)" --files .planning/ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: initialize [project-name] ([N] phases)" --files .planning/ ``` @@ -129,7 +129,7 @@ SUMMARY: .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md What to commit: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-PLAN.md .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-PLAN.md .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md ``` **Note:** Code files NOT included - already committed per-task. @@ -149,7 +149,7 @@ Current: [task name] What to commit: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "wip: [phase-name] paused at task [X]/[Y]" --files .planning/ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "wip: [phase-name] paused at task [X]/[Y]" --files .planning/ ``` diff --git a/get-shit-done/references/git-planning-commit.md b/get-shit-done/references/git-planning-commit.md index aad427440..56e00d5cb 100644 --- a/get-shit-done/references/git-planning-commit.md +++ b/get-shit-done/references/git-planning-commit.md @@ -7,7 +7,7 @@ Commit planning artifacts using the gsd-tools CLI, which automatically checks `c Always use `gsd-tools.cjs commit` for `.planning/` files — it handles `commit_docs` and gitignore checks automatically: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs({scope}): {description}" --files .planning/STATE.md .planning/ROADMAP.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs({scope}): {description}" --files .planning/STATE.md .planning/ROADMAP.md ``` The CLI will return `skipped` (with reason) if `commit_docs` is `false` or `.planning/` is gitignored. No manual conditional checks needed. @@ -17,7 +17,7 @@ The CLI will return `skipped` (with reason) if `commit_docs` is `false` or `.pla To fold `.planning/` file changes into the previous commit: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "" --files .planning/codebase/*.md --amend +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "" --files .planning/codebase/*.md --amend ``` ## Commit Message Patterns diff --git a/get-shit-done/references/phase-argument-parsing.md b/get-shit-done/references/phase-argument-parsing.md index 85f90651b..6ae9c508a 100644 --- a/get-shit-done/references/phase-argument-parsing.md +++ b/get-shit-done/references/phase-argument-parsing.md @@ -14,7 +14,7 @@ From `$ARGUMENTS`: The `find-phase` command handles normalization and validation in one step: ```bash -PHASE_INFO=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs find-phase "${PHASE}") +PHASE_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase "${PHASE}") ``` Returns JSON with: @@ -45,7 +45,7 @@ fi Use `roadmap get-phase` to validate phase exists: ```bash -PHASE_CHECK=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "${PHASE}") +PHASE_CHECK=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${PHASE}") if [ "$(echo "$PHASE_CHECK" | jq -r '.found')" = "false" ]; then echo "ERROR: Phase ${PHASE} not found in roadmap" exit 1 @@ -57,5 +57,5 @@ fi Use `find-phase` for directory lookup: ```bash -PHASE_DIR=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs find-phase "${PHASE}" --raw) +PHASE_DIR=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase "${PHASE}" --raw) ``` diff --git a/get-shit-done/references/planning-config.md b/get-shit-done/references/planning-config.md index a7a1c451a..946f5aaea 100644 --- a/get-shit-done/references/planning-config.md +++ b/get-shit-done/references/planning-config.md @@ -40,14 +40,14 @@ Configuration options for `.planning/` directory behavior. ```bash # Commit with automatic commit_docs + gitignore checks: -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: update state" --files .planning/STATE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: update state" --files .planning/STATE.md # Load config via state load (returns JSON): -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs state load) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load) # commit_docs is available in the JSON output # Or use init commands which include commit_docs: -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init execute-phase "1") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1") # commit_docs is included in all init command outputs ``` @@ -56,7 +56,7 @@ INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init execute-phase "1") **Commit via CLI (handles checks automatically):** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: update state" --files .planning/STATE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: update state" --files .planning/STATE.md ``` The CLI checks `commit_docs` config and gitignore status internally — no manual conditionals needed. @@ -144,13 +144,13 @@ To use uncommitted mode: Use `init execute-phase` which returns all config as JSON: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init execute-phase "1") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1") # JSON output includes: branching_strategy, phase_branch_template, milestone_branch_template ``` Or use `state load` for the config values: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs state load) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load) # Parse branching_strategy, phase_branch_template, milestone_branch_template from JSON ``` diff --git a/get-shit-done/workflows/add-phase.md b/get-shit-done/workflows/add-phase.md index c64727b2e..56eb41868 100644 --- a/get-shit-done/workflows/add-phase.md +++ b/get-shit-done/workflows/add-phase.md @@ -29,7 +29,7 @@ Exit. Load phase operation context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "0") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "0") ``` Check `roadmap_exists` from init JSON. If false: @@ -44,7 +44,7 @@ Exit. **Delegate the phase addition to gsd-tools:** ```bash -RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase add "${description}") +RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase add "${description}") ``` The CLI handles: diff --git a/get-shit-done/workflows/add-tests.md b/get-shit-done/workflows/add-tests.md index e8cc8eac4..6dfc03bd6 100644 --- a/get-shit-done/workflows/add-tests.md +++ b/get-shit-done/workflows/add-tests.md @@ -33,7 +33,7 @@ Exit. Load phase operation context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${PHASE_ARG}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}") ``` Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`. @@ -296,7 +296,7 @@ Create a test coverage report and present to user: Record test generation in project state: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state-snapshot +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state-snapshot ``` If there are passing tests to commit: diff --git a/get-shit-done/workflows/add-todo.md b/get-shit-done/workflows/add-todo.md index e8834a21f..cd15cc8a9 100644 --- a/get-shit-done/workflows/add-todo.md +++ b/get-shit-done/workflows/add-todo.md @@ -12,7 +12,7 @@ Read all files referenced by the invoking prompt's execution_context before star Load todo context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init todos) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init todos) ``` Extract from init JSON: `commit_docs`, `date`, `timestamp`, `todo_count`, `todos`, `pending_dir`, `todos_dir_exists`. @@ -83,7 +83,7 @@ Use values from init context: `timestamp` and `date` are already available. Generate slug for the title: ```bash -slug=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs generate-slug "$title" --raw) +slug=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" generate-slug "$title" --raw) ``` Write to `.planning/todos/pending/${date}-${slug}.md`: @@ -118,7 +118,7 @@ If `.planning/STATE.md` exists: Commit the todo and any updated state: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: capture todo - [title]" --files .planning/todos/pending/[filename] .planning/STATE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: capture todo - [title]" --files .planning/todos/pending/[filename] .planning/STATE.md ``` Tool respects `commit_docs` config and gitignore automatically. diff --git a/get-shit-done/workflows/audit-milestone.md b/get-shit-done/workflows/audit-milestone.md index 36b22671a..7eee93975 100644 --- a/get-shit-done/workflows/audit-milestone.md +++ b/get-shit-done/workflows/audit-milestone.md @@ -11,21 +11,21 @@ Read all files referenced by the invoking prompt's execution_context before star ## 0. Initialize Milestone Context ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init milestone-op) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init milestone-op) ``` Extract from init JSON: `milestone_version`, `milestone_name`, `phase_count`, `completed_phases`, `commit_docs`. Resolve integration checker model: ```bash -CHECKER_MODEL=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs resolve-model gsd-integration-checker --raw) +integration_checker_model=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" resolve-model gsd-integration-checker --raw) ``` ## 1. Determine Milestone Scope ```bash # Get phases in milestone (sorted numerically, handles decimals) -node ~/.claude/get-shit-done/bin/gsd-tools.cjs phases list +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phases list ``` - Parse version from arguments or detect current from ROADMAP.md @@ -39,7 +39,7 @@ For each phase directory, read the VERIFICATION.md: ```bash # For each phase, use find-phase to resolve the directory (handles archived phases) -PHASE_INFO=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs find-phase 01 --raw) +PHASE_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase 01 --raw) # Extract directory from JSON, then read VERIFICATION.md from that directory # Repeat for each phase number from ROADMAP.md ``` @@ -104,7 +104,7 @@ For each phase's VERIFICATION.md, extract the expanded requirements table: For each phase's SUMMARY.md, extract `requirements-completed` from YAML frontmatter: ```bash for summary in .planning/phases/*-*/*-SUMMARY.md; do - node ~/.claude/get-shit-done/bin/gsd-tools.cjs summary-extract "$summary" --fields requirements_completed | jq -r '.requirements_completed' + node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" summary-extract "$summary" --fields requirements_completed | jq -r '.requirements_completed' done ``` diff --git a/get-shit-done/workflows/check-todos.md b/get-shit-done/workflows/check-todos.md index ce6d3eee4..43598fc71 100644 --- a/get-shit-done/workflows/check-todos.md +++ b/get-shit-done/workflows/check-todos.md @@ -12,7 +12,7 @@ Read all files referenced by the invoking prompt's execution_context before star Load todo context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init todos) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init todos) ``` Extract from init JSON: `todo_count`, `todos`, `pending_dir`. @@ -154,7 +154,7 @@ If todo was moved to done/, commit the change: ```bash git rm --cached .planning/todos/pending/[filename] 2>/dev/null || true -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: start work on todo - [title]" --files .planning/todos/done/[filename] .planning/STATE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: start work on todo - [title]" --files .planning/todos/done/[filename] .planning/STATE.md ``` Tool respects `commit_docs` config and gitignore automatically. diff --git a/get-shit-done/workflows/cleanup.md b/get-shit-done/workflows/cleanup.md index 670fb93f4..c1f772e77 100644 --- a/get-shit-done/workflows/cleanup.md +++ b/get-shit-done/workflows/cleanup.md @@ -122,7 +122,7 @@ Repeat for all milestones in the cleanup set. Commit the changes: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "chore: archive phase directories from completed milestones" --files .planning/milestones/ .planning/phases/ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "chore: archive phase directories from completed milestones" --files .planning/milestones/ .planning/phases/ ``` diff --git a/get-shit-done/workflows/complete-milestone.md b/get-shit-done/workflows/complete-milestone.md index 63bcf6519..d1a77b6c5 100644 --- a/get-shit-done/workflows/complete-milestone.md +++ b/get-shit-done/workflows/complete-milestone.md @@ -40,7 +40,7 @@ When a milestone completes: **Use `roadmap analyze` for comprehensive readiness check:** ```bash -ROADMAP=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap analyze) +ROADMAP=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap analyze) ``` This returns all phases with plan/summary counts and disk status. Use this to verify: @@ -154,7 +154,7 @@ Extract one-liners from SUMMARY.md files using summary-extract: ```bash # For each phase in milestone, extract one-liner for summary in .planning/phases/*-*/*-SUMMARY.md; do - node ~/.claude/get-shit-done/bin/gsd-tools.cjs summary-extract "$summary" --fields one_liner | jq -r '.one_liner' + node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" summary-extract "$summary" --fields one_liner | jq -r '.one_liner' done ``` @@ -367,7 +367,7 @@ Update `.planning/ROADMAP.md` — group completed milestone phases: **Delegate archival to gsd-tools:** ```bash -ARCHIVE=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs milestone complete "v[X.Y]" --name "[Milestone Name]") +ARCHIVE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" milestone complete "v[X.Y]" --name "[Milestone Name]") ``` The CLI handles: @@ -494,7 +494,7 @@ If the "## Cross-Milestone Trends" section exists, update the tables with new da **Commit:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: update retrospective for v${VERSION}" --files .planning/RETROSPECTIVE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: update retrospective for v${VERSION}" --files .planning/RETROSPECTIVE.md ``` @@ -528,7 +528,7 @@ Check branching strategy and offer merge options. Use `init milestone-op` for context, or load config directly: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init execute-phase "1") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1") ``` Extract `branching_strategy`, `phase_branch_template`, `milestone_branch_template`, and `commit_docs` from init JSON. @@ -676,7 +676,7 @@ git push origin v[X.Y] Commit milestone completion. ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "chore: complete v[X.Y] milestone" --files .planning/milestones/v[X.Y]-ROADMAP.md .planning/milestones/v[X.Y]-REQUIREMENTS.md .planning/milestones/v[X.Y]-MILESTONE-AUDIT.md .planning/MILESTONES.md .planning/PROJECT.md .planning/STATE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "chore: complete v[X.Y] milestone" --files .planning/milestones/v[X.Y]-ROADMAP.md .planning/milestones/v[X.Y]-REQUIREMENTS.md .planning/milestones/v[X.Y]-MILESTONE-AUDIT.md .planning/MILESTONES.md .planning/PROJECT.md .planning/STATE.md ``` ``` diff --git a/get-shit-done/workflows/diagnose-issues.md b/get-shit-done/workflows/diagnose-issues.md index 27e40a5b7..274b50c57 100644 --- a/get-shit-done/workflows/diagnose-issues.md +++ b/get-shit-done/workflows/diagnose-issues.md @@ -158,7 +158,7 @@ Update status in frontmatter to "diagnosed". Commit the updated UAT.md: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs({phase_num}): add root causes from diagnosis" --files ".planning/phases/XX-name/{phase_num}-UAT.md" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs({phase_num}): add root causes from diagnosis" --files ".planning/phases/XX-name/{phase_num}-UAT.md" ``` diff --git a/get-shit-done/workflows/discuss-phase.md b/get-shit-done/workflows/discuss-phase.md index 1b9596dac..fe6b0561a 100644 --- a/get-shit-done/workflows/discuss-phase.md +++ b/get-shit-done/workflows/discuss-phase.md @@ -113,7 +113,7 @@ Phase: "API documentation" Phase number from argument (required). ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${PHASE}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE}") ``` Parse JSON for: `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `has_research`, `has_context`, `has_plans`, `has_verification`, `plan_count`, `roadmap_exists`, `planning_exists`. @@ -415,7 +415,7 @@ Created: .planning/phases/${PADDED_PHASE}-${SLUG}/${PADDED_PHASE}-CONTEXT.md Commit phase context (uses `commit_docs` from init internally): ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs(${padded_phase}): capture phase context" --files "${phase_dir}/${padded_phase}-CONTEXT.md" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(${padded_phase}): capture phase context" --files "${phase_dir}/${padded_phase}-CONTEXT.md" ``` Confirm: "Committed: docs(${padded_phase}): capture phase context" @@ -425,7 +425,7 @@ Confirm: "Committed: docs(${padded_phase}): capture phase context" Update STATE.md with session info: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state record-session \ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state record-session \ --stopped-at "Phase ${PHASE} context gathered" \ --resume-file "${phase_dir}/${padded_phase}-CONTEXT.md" ``` @@ -433,7 +433,7 @@ node ~/.claude/get-shit-done/bin/gsd-tools.cjs state record-session \ Commit STATE.md: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs(state): record phase ${PHASE} context session" --files .planning/STATE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(state): record phase ${PHASE} context session" --files .planning/STATE.md ``` @@ -443,12 +443,12 @@ Check for auto-advance trigger: 1. Parse `--auto` flag from $ARGUMENTS 2. Read `workflow.auto_advance` from config: ```bash - AUTO_CFG=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-get workflow.auto_advance 2>/dev/null || echo "false") + AUTO_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow.auto_advance 2>/dev/null || echo "false") ``` **If `--auto` flag present AND `AUTO_CFG` is not true:** Persist auto-advance to config (handles direct `--auto` usage without new-project): ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-set workflow.auto_advance true +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-set workflow.auto_advance true ``` **If `--auto` flag present OR `AUTO_CFG` is true:** diff --git a/get-shit-done/workflows/execute-phase.md b/get-shit-done/workflows/execute-phase.md index dbe309c29..5149594ce 100644 --- a/get-shit-done/workflows/execute-phase.md +++ b/get-shit-done/workflows/execute-phase.md @@ -16,7 +16,7 @@ Read STATE.md before any operation to load project context. Load all context in one call: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init execute-phase "${PHASE_ARG}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "${PHASE_ARG}") ``` Parse JSON for: `executor_model`, `verifier_model`, `commit_docs`, `parallelization`, `branching_strategy`, `branch_name`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `plans`, `incomplete_plans`, `plan_count`, `incomplete_count`, `state_exists`, `roadmap_exists`, `phase_req_ids`. @@ -51,7 +51,7 @@ Report: "Found {plan_count} plans in {phase_dir} ({incomplete_count} incomplete) Load plan inventory with wave grouping in one call: ```bash -PLAN_INDEX=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase-plan-index "${PHASE_NUMBER}") +PLAN_INDEX=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase-plan-index "${PHASE_NUMBER}") ``` Parse JSON for: `phase`, `plans[]` (each with `id`, `wave`, `autonomous`, `objective`, `files_modified`, `task_count`, `has_summary`), `waves` (map of wave number → plan IDs), `incomplete`, `has_checkpoints`. @@ -122,7 +122,7 @@ Execute each wave in sequence. Within a wave: parallel if `PARALLELIZATION=true` - .planning/STATE.md (State) - .planning/config.json (Config, if exists) - ./CLAUDE.md (Project instructions, if exists — follow project-specific guidelines and coding conventions) - - .agents/skills/ (Project skills, if exists — list skills, read SKILL.md for each, follow relevant rules during implementation) + - .claude/skills/ or .agents/skills/ (Project skills, if either exists — list skills, read SKILL.md for each, follow relevant rules during implementation) @@ -181,7 +181,7 @@ Plans with `autonomous: false` require user interaction. Read auto-advance config: ```bash -AUTO_CFG=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-get workflow.auto_advance 2>/dev/null || echo "false") +AUTO_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow.auto_advance 2>/dev/null || echo "false") ``` When executor returns a checkpoint AND `AUTO_CFG` is `"true"`: @@ -256,7 +256,7 @@ fi **2. Find parent UAT file:** ```bash -PARENT_INFO=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs find-phase "${PARENT_PHASE}" --raw) +PARENT_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" find-phase "${PARENT_PHASE}" --raw) # Extract directory from PARENT_INFO JSON, then find UAT file in that directory ``` @@ -287,7 +287,7 @@ mv .planning/debug/{slug}.md .planning/debug/resolved/ **6. Commit updated artifacts:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs(phase-${PARENT_PHASE}): resolve UAT gaps and debug sessions after ${PHASE_NUMBER} gap closure" --files .planning/phases/*${PARENT_PHASE}*/*-UAT.md .planning/debug/resolved/*.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(phase-${PARENT_PHASE}): resolve UAT gaps and debug sessions after ${PHASE_NUMBER} gap closure" --files .planning/phases/*${PARENT_PHASE}*/*-UAT.md .planning/debug/resolved/*.md ``` @@ -358,7 +358,7 @@ Gap closure cycle: `/gsd:plan-phase {X} --gaps` reads VERIFICATION.md → create **Mark phase complete and update all tracking files:** ```bash -COMPLETION=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase complete "${PHASE_NUMBER}") +COMPLETION=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase complete "${PHASE_NUMBER}") ``` The CLI handles: @@ -371,7 +371,7 @@ The CLI handles: Extract from result: `next_phase`, `next_phase_name`, `is_last_phase`. ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs(phase-{X}): complete phase execution" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md {phase_dir}/*-VERIFICATION.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(phase-{X}): complete phase execution" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md {phase_dir}/*-VERIFICATION.md ``` @@ -407,7 +407,7 @@ STOP. Do not proceed to auto-advance or transition. 1. Parse `--auto` flag from $ARGUMENTS 2. Read `workflow.auto_advance` from config: ```bash - AUTO_CFG=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-get workflow.auto_advance 2>/dev/null || echo "false") + AUTO_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow.auto_advance 2>/dev/null || echo "false") ``` **If `--auto` flag present OR `AUTO_CFG` is true (AND verification passed with no gaps):** diff --git a/get-shit-done/workflows/execute-plan.md b/get-shit-done/workflows/execute-plan.md index a838b0c73..180dfcc29 100644 --- a/get-shit-done/workflows/execute-plan.md +++ b/get-shit-done/workflows/execute-plan.md @@ -15,7 +15,7 @@ Read config.json for planning behavior settings. Load execution context (paths only to minimize orchestrator context): ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init execute-phase "${PHASE}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "${PHASE}") ``` Extract from init JSON: `executor_model`, `commit_docs`, `phase_dir`, `phase_number`, `plans`, `summaries`, `incomplete_plans`, `state_path`, `config_path`. @@ -124,7 +124,7 @@ This IS the execution instructions. Follow exactly. If plan references CONTEXT.m ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs phases list --type summaries --raw +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phases list --type summaries --raw # Extract the second-to-last summary from the JSON result ``` If previous SUMMARY has unresolved "Issues Encountered" or "Next Phase Readiness" blockers: AskUserQuestion(header="Previous Issues", options: "Proceed anyway" | "Address first" | "Review previous"). @@ -334,13 +334,13 @@ Update STATE.md using gsd-tools: ```bash # Advance plan counter (handles last-plan edge case) -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state advance-plan +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state advance-plan # Recalculate progress bar from disk state -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state update-progress +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state update-progress # Record execution metrics -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state record-metric \ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state record-metric \ --phase "${PHASE}" --plan "${PLAN}" --duration "${DURATION}" \ --tasks "${TASK_COUNT}" --files "${FILE_COUNT}" ``` @@ -352,11 +352,11 @@ From SUMMARY: Extract decisions and add to STATE.md: ```bash # Add each decision from SUMMARY key-decisions # Prefer file inputs for shell-safe text (preserves `$`, `*`, etc. exactly) -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state add-decision \ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state add-decision \ --phase "${PHASE}" --summary-file "${DECISION_TEXT_FILE}" --rationale-file "${RATIONALE_FILE}" # Add blockers if any found -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state add-blocker --text-file "${BLOCKER_TEXT_FILE}" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state add-blocker --text-file "${BLOCKER_TEXT_FILE}" ``` @@ -364,7 +364,7 @@ node ~/.claude/get-shit-done/bin/gsd-tools.cjs state add-blocker --text-file "${ Update session info using gsd-tools: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs state record-session \ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state record-session \ --stopped-at "Completed ${PHASE}-${PLAN}-PLAN.md" \ --resume-file "None" ``` @@ -378,7 +378,7 @@ If SUMMARY "Issues Encountered" ≠ "None": yolo → log and continue. Interacti ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap update-plan-progress "${PHASE}" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap update-plan-progress "${PHASE}" ``` Counts PLAN vs SUMMARY files on disk. Updates progress table row with correct count and status (`In Progress` or `Complete` with date). @@ -387,7 +387,7 @@ Counts PLAN vs SUMMARY files on disk. Updates progress table row with correct co Mark completed requirements from the PLAN.md frontmatter `requirements:` field: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs requirements mark-complete ${REQ_IDS} +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" requirements mark-complete ${REQ_IDS} ``` Extract requirement IDs from the plan's frontmatter (e.g., `requirements: [AUTH-01, AUTH-02]`). If no requirements field, skip. @@ -397,7 +397,7 @@ Extract requirement IDs from the plan's frontmatter (e.g., `requirements: [AUTH- Task code already committed per-task. Commit plan metadata: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md .planning/REQUIREMENTS.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md .planning/REQUIREMENTS.md ``` @@ -412,7 +412,7 @@ git diff --name-only ${FIRST_TASK}^..HEAD 2>/dev/null Update only structural changes: new src/ dir → STRUCTURE.md | deps → STACK.md | file pattern → CONVENTIONS.md | API client → INTEGRATIONS.md | config → STACK.md | renamed → update paths. Skip code-only/bugfix/content changes. ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "" --files .planning/codebase/*.md --amend +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "" --files .planning/codebase/*.md --amend ``` diff --git a/get-shit-done/workflows/health.md b/get-shit-done/workflows/health.md index 377d69673..3dec273b6 100644 --- a/get-shit-done/workflows/health.md +++ b/get-shit-done/workflows/health.md @@ -25,7 +25,7 @@ fi **Run health validation:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs validate health $REPAIR_FLAG +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" validate health $REPAIR_FLAG ``` Parse JSON output: @@ -112,7 +112,7 @@ If yes, re-run with --repair flag and display results. Re-run health check without --repair to confirm issues are resolved: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs validate health +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" validate health ``` Report final status. diff --git a/get-shit-done/workflows/insert-phase.md b/get-shit-done/workflows/insert-phase.md index 9d411b537..8f2569c46 100644 --- a/get-shit-done/workflows/insert-phase.md +++ b/get-shit-done/workflows/insert-phase.md @@ -34,7 +34,7 @@ Validate first argument is an integer. Load phase operation context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${after_phase}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${after_phase}") ``` Check `roadmap_exists` from init JSON. If false: @@ -48,7 +48,7 @@ Exit. **Delegate the phase insertion to gsd-tools:** ```bash -RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase insert "${after_phase}" "${description}") +RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase insert "${after_phase}" "${description}") ``` The CLI handles: diff --git a/get-shit-done/workflows/map-codebase.md b/get-shit-done/workflows/map-codebase.md index 605c1b481..c44babc86 100644 --- a/get-shit-done/workflows/map-codebase.md +++ b/get-shit-done/workflows/map-codebase.md @@ -26,7 +26,7 @@ Documents are reference material for Claude when planning/executing. Always incl Load codebase mapping context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init map-codebase) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init map-codebase) ``` Extract from init JSON: `mapper_model`, `commit_docs`, `codebase_dir`, `existing_maps`, `has_maps`, `codebase_dir_exists`. @@ -250,7 +250,7 @@ Continue to commit_codebase_map. Commit the codebase map: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: map existing codebase" --files .planning/codebase/*.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: map existing codebase" --files .planning/codebase/*.md ``` Continue to offer_next. diff --git a/get-shit-done/workflows/new-milestone.md b/get-shit-done/workflows/new-milestone.md index 3b4c11bd1..252694ae4 100644 --- a/get-shit-done/workflows/new-milestone.md +++ b/get-shit-done/workflows/new-milestone.md @@ -71,13 +71,13 @@ Keep Accumulated Context section from previous milestone. Delete MILESTONE-CONTEXT.md if exists (consumed). ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: start milestone v[X.Y] [Name]" --files .planning/PROJECT.md .planning/STATE.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: start milestone v[X.Y] [Name]" --files .planning/PROJECT.md .planning/STATE.md ``` ## 7. Load Context and Resolve Models ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init new-milestone) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init new-milestone) ``` Extract from init JSON: `researcher_model`, `synthesizer_model`, `roadmapper_model`, `commit_docs`, `research_enabled`, `current_milestone`, `project_exists`, `roadmap_exists`. @@ -92,10 +92,10 @@ AskUserQuestion: "Research the domain ecosystem for new features before defining ```bash # If "Research first": persist true -node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-set workflow.research true +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-set workflow.research true # If "Skip research": persist false -node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-set workflow.research false +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-set workflow.research false ``` **If "Research first":** @@ -253,7 +253,7 @@ If "adjust": Return to scoping. **Commit requirements:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: define milestone v[X.Y] requirements" --files .planning/REQUIREMENTS.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: define milestone v[X.Y] requirements" --files .planning/REQUIREMENTS.md ``` ## 10. Create Roadmap @@ -330,7 +330,7 @@ Success criteria: **Commit roadmap** (after approval): ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: create milestone v[X.Y] roadmap ([N] phases)" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: create milestone v[X.Y] roadmap ([N] phases)" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md ``` ## 11. Done diff --git a/get-shit-done/workflows/new-project.md b/get-shit-done/workflows/new-project.md index b925dbbdc..e7c56a4a9 100644 --- a/get-shit-done/workflows/new-project.md +++ b/get-shit-done/workflows/new-project.md @@ -46,7 +46,7 @@ The document should describe what you want to build. **MANDATORY FIRST STEP — Execute these checks before ANY user interaction:** ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init new-project) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init new-project) ``` Parse JSON for: `researcher_model`, `synthesizer_model`, `roadmapper_model`, `commit_docs`, `project_exists`, `has_codebase_map`, `planning_exists`, `has_existing_code`, `has_package_file`, `is_brownfield`, `needs_codebase_map`, `has_git`, `project_path`. @@ -188,13 +188,13 @@ Create `.planning/config.json` with mode set to "yolo": ```bash mkdir -p .planning -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "chore: add project config" --files .planning/config.json +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "chore: add project config" --files .planning/config.json ``` **Persist auto-advance to config (survives context compaction):** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-set workflow.auto_advance true +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-set workflow.auto_advance true ``` Proceed to Step 4 (skip Steps 3 and 5). @@ -338,7 +338,7 @@ Do not compress. Capture everything gathered. ```bash mkdir -p .planning -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: initialize project" --files .planning/PROJECT.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: initialize project" --files .planning/PROJECT.md ``` ## 5. Workflow Preferences @@ -490,7 +490,7 @@ Create `.planning/config.json` with all settings: **Commit config.json:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "chore: add project config" --files .planning/config.json +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "chore: add project config" --files .planning/config.json ``` **Note:** Run `/gsd:settings` anytime to update these preferences. @@ -887,7 +887,7 @@ If "adjust": Return to scoping. **Commit requirements:** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: define v1 requirements" --files .planning/REQUIREMENTS.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: define v1 requirements" --files .planning/REQUIREMENTS.md ``` ## 8. Create Roadmap @@ -1017,7 +1017,7 @@ Use AskUserQuestion: **Commit roadmap (after approval or auto mode):** ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs: create roadmap ([N] phases)" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: create roadmap ([N] phases)" --files .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md ``` ## 9. Done diff --git a/get-shit-done/workflows/pause-work.md b/get-shit-done/workflows/pause-work.md index dde5b1a76..f723ef81a 100644 --- a/get-shit-done/workflows/pause-work.md +++ b/get-shit-done/workflows/pause-work.md @@ -86,13 +86,13 @@ Be specific enough for a fresh Claude to understand immediately. Use `current-timestamp` for last_updated field. You can use init todos (which provides timestamps) or call directly: ```bash -timestamp=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs current-timestamp full --raw) +timestamp=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" current-timestamp full --raw) ``` ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "wip: [phase-name] paused at task [X]/[Y]" --files .planning/phases/*/.continue-here.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "wip: [phase-name] paused at task [X]/[Y]" --files .planning/phases/*/.continue-here.md ``` diff --git a/get-shit-done/workflows/plan-milestone-gaps.md b/get-shit-done/workflows/plan-milestone-gaps.md index 73945bca0..373147bd2 100644 --- a/get-shit-done/workflows/plan-milestone-gaps.md +++ b/get-shit-done/workflows/plan-milestone-gaps.md @@ -65,7 +65,7 @@ Gap: Flow "View dashboard" broken at data fetch Find highest existing phase: ```bash # Get sorted phase list, extract last one -PHASES=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phases list) +PHASES=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phases list) HIGHEST=$(echo "$PHASES" | jq -r '.directories[-1]') ``` @@ -147,7 +147,7 @@ mkdir -p ".planning/phases/{NN}-{name}" ## 9. Commit Roadmap and Requirements Update ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs(roadmap): add gap closure phases {N}-{M}" --files .planning/ROADMAP.md .planning/REQUIREMENTS.md +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(roadmap): add gap closure phases {N}-{M}" --files .planning/ROADMAP.md .planning/REQUIREMENTS.md ``` ## 10. Offer Next Steps diff --git a/get-shit-done/workflows/plan-phase.md b/get-shit-done/workflows/plan-phase.md index 91a788719..7bf31efba 100644 --- a/get-shit-done/workflows/plan-phase.md +++ b/get-shit-done/workflows/plan-phase.md @@ -15,7 +15,7 @@ Read all files referenced by the invoking prompt's execution_context before star Load all context in one call (paths only to minimize orchestrator context): ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init plan-phase "$PHASE") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init plan-phase "$PHASE") ``` Parse JSON for: `researcher_model`, `planner_model`, `checker_model`, `research_enabled`, `plan_checker_enabled`, `nyquist_validation_enabled`, `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `has_research`, `has_context`, `has_plans`, `plan_count`, `planning_exists`, `roadmap_exists`, `phase_req_ids`. @@ -42,7 +42,7 @@ mkdir -p ".planning/phases/${padded_phase}-${phase_slug}" ## 3. Validate Phase ```bash -PHASE_INFO=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "${PHASE}") +PHASE_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${PHASE}") ``` **If `found` is false:** Error with available phases. **If `found` is true:** Extract `phase_number`, `phase_name`, `goal` from JSON. @@ -128,7 +128,7 @@ Generating CONTEXT.md from requirements... 5. Commit: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs(${padded_phase}): generate context from PRD" --files "${phase_dir}/${padded_phase}-CONTEXT.md" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(${padded_phase}): generate context from PRD" --files "${phase_dir}/${padded_phase}-CONTEXT.md" ``` 6. Set `context_content` to the generated CONTEXT.md content and continue to step 5 (Handle Research). @@ -175,7 +175,7 @@ Display banner: ### Spawn gsd-phase-researcher ```bash -PHASE_DESC=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "${PHASE}" | jq -r '.section') +PHASE_DESC=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${PHASE}" | jq -r '.section') ``` Research prompt: @@ -197,7 +197,7 @@ Answer: "What do I need to know to PLAN this phase well?" **Phase requirement IDs (MUST address):** {phase_req_ids} **Project instructions:** Read ./CLAUDE.md if exists — follow project-specific guidelines -**Project skills:** Check .agents/skills/ directory (if exists) — read SKILL.md files, research should account for project skill patterns +**Project skills:** Check .claude/skills/ or .agents/skills/ directory (if either exists) — read SKILL.md files, research should account for project skill patterns @@ -235,7 +235,7 @@ grep -l "## Validation Architecture" "${PHASE_DIR}"/*-RESEARCH.md 2>/dev/null 3. Fill frontmatter: replace `{N}` with phase number, `{phase-slug}` with phase slug, `{date}` with current date 4. If `commit_docs` is true: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit-docs "docs(phase-${PHASE}): add validation strategy" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit-docs "docs(phase-${PHASE}): add validation strategy" ``` **If not found (and nyquist enabled):** Display warning: @@ -297,7 +297,7 @@ Planner prompt: **Phase requirement IDs (every ID MUST appear in a plan's `requirements` field):** {phase_req_ids} **Project instructions:** Read ./CLAUDE.md if exists — follow project-specific guidelines -**Project skills:** Check .agents/skills/ directory (if exists) — read SKILL.md files, plans should account for project skill rules +**Project skills:** Check .claude/skills/ or .agents/skills/ directory (if either exists) — read SKILL.md files, plans should account for project skill rules @@ -362,7 +362,7 @@ Checker prompt: **Phase requirement IDs (MUST ALL be covered):** {phase_req_ids} **Project instructions:** Read ./CLAUDE.md if exists — verify plans honor project guidelines -**Project skills:** Check .agents/skills/ directory (if exists) — verify plans account for project skill rules +**Project skills:** Check .claude/skills/ or .agents/skills/ directory (if either exists) — verify plans account for project skill rules @@ -443,7 +443,7 @@ Check for auto-advance trigger: 1. Parse `--auto` flag from $ARGUMENTS 2. Read `workflow.auto_advance` from config: ```bash - AUTO_CFG=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-get workflow.auto_advance 2>/dev/null || echo "false") + AUTO_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow.auto_advance 2>/dev/null || echo "false") ``` **If `--auto` flag present OR `AUTO_CFG` is true:** diff --git a/get-shit-done/workflows/progress.md b/get-shit-done/workflows/progress.md index ea124fb08..e1dcc2eb1 100644 --- a/get-shit-done/workflows/progress.md +++ b/get-shit-done/workflows/progress.md @@ -12,7 +12,7 @@ Read all files referenced by the invoking prompt's execution_context before star **Load progress context (paths only):** ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init progress) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init progress) ``` Extract from init JSON: `project_exists`, `roadmap_exists`, `state_exists`, `phases`, `current_phase`, `next_phase`, `milestone_version`, `completed_count`, `phase_count`, `paused_at`, `state_path`, `roadmap_path`, `project_path`, `config_path`. @@ -40,8 +40,8 @@ If missing both ROADMAP.md and PROJECT.md: suggest `/gsd:new-project`. **Use structured extraction from gsd-tools:** Instead of reading full files, use targeted tools to get only the data needed for the report: -- `ROADMAP=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap analyze)` -- `STATE=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs state-snapshot)` +- `ROADMAP=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap analyze)` +- `STATE=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state-snapshot)` This minimizes orchestrator context usage. @@ -50,7 +50,7 @@ This minimizes orchestrator context usage. **Get comprehensive roadmap analysis (replaces manual parsing):** ```bash -ROADMAP=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap analyze) +ROADMAP=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap analyze) ``` This returns structured JSON with: @@ -69,7 +69,7 @@ Use this instead of manually reading/parsing ROADMAP.md. - Find the 2-3 most recent SUMMARY.md files - Use `summary-extract` for efficient parsing: ```bash - node ~/.claude/get-shit-done/bin/gsd-tools.cjs summary-extract --fields one_liner + node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" summary-extract --fields one_liner ``` - This shows "what we've been working on" @@ -88,7 +88,7 @@ Use this instead of manually reading/parsing ROADMAP.md. ```bash # Get formatted progress bar -PROGRESS_BAR=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs progress bar --raw) +PROGRESS_BAR=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" progress bar --raw) ``` Present: diff --git a/get-shit-done/workflows/quick.md b/get-shit-done/workflows/quick.md index ba306eaac..e68f14043 100644 --- a/get-shit-done/workflows/quick.md +++ b/get-shit-done/workflows/quick.md @@ -43,7 +43,7 @@ If `$FULL_MODE`: **Step 2: Initialize** ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init quick "$DESCRIPTION") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init quick "$DESCRIPTION") ``` Parse JSON for: `planner_model`, `executor_model`, `checker_model`, `verifier_model`, `commit_docs`, `next_num`, `slug`, `date`, `timestamp`, `quick_dir`, `task_dir`, `roadmap_exists`, `planning_exists`. @@ -101,7 +101,7 @@ Task( - ./CLAUDE.md (if exists — follow project-specific guidelines) -**Project skills:** Check .agents/skills/ directory (if exists) — read SKILL.md files, plans should account for project skill rules +**Project skills:** Check .claude/skills/ or .agents/skills/ directory (if either exists) — read SKILL.md files, plans should account for project skill rules @@ -252,7 +252,7 @@ Execute quick task ${next_num}. - ${QUICK_DIR}/${next_num}-PLAN.md (Plan) - .planning/STATE.md (Project state) - ./CLAUDE.md (Project instructions, if exists) -- .agents/skills/ (Project skills, if exists — list skills, read SKILL.md for each, follow relevant rules during implementation) +- .claude/skills/ or .agents/skills/ (Project skills, if either exists — list skills, read SKILL.md for each, follow relevant rules during implementation) @@ -392,7 +392,7 @@ Build file list: - If `$FULL_MODE` and verification file exists: `${QUICK_DIR}/${next_num}-VERIFICATION.md` ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "docs(quick-${next_num}): ${DESCRIPTION}" --files ${file_list} +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs(quick-${next_num}): ${DESCRIPTION}" --files ${file_list} ``` Get final commit hash: diff --git a/get-shit-done/workflows/remove-phase.md b/get-shit-done/workflows/remove-phase.md index 0b15f9cfd..cd168cd2a 100644 --- a/get-shit-done/workflows/remove-phase.md +++ b/get-shit-done/workflows/remove-phase.md @@ -29,7 +29,7 @@ Exit. Load phase operation context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${target}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${target}") ``` Extract: `phase_found`, `phase_dir`, `phase_number`, `commit_docs`, `roadmap_exists`. @@ -79,13 +79,13 @@ Wait for confirmation. **Delegate the entire removal operation to gsd-tools:** ```bash -RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase remove "${target}") +RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase remove "${target}") ``` If the phase has executed plans (SUMMARY.md files), gsd-tools will error. Use `--force` only if the user confirms: ```bash -RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase remove "${target}" --force) +RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase remove "${target}" --force) ``` The CLI handles: @@ -102,7 +102,7 @@ Extract from result: `removed`, `directory_deleted`, `renamed_directories`, `ren Stage and commit the removal: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "chore: remove phase {target} ({original-phase-name})" --files .planning/ +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "chore: remove phase {target} ({original-phase-name})" --files .planning/ ``` The commit message preserves the historical record of what was removed. diff --git a/get-shit-done/workflows/research-phase.md b/get-shit-done/workflows/research-phase.md index d4ead4536..f527e8f84 100644 --- a/get-shit-done/workflows/research-phase.md +++ b/get-shit-done/workflows/research-phase.md @@ -18,7 +18,7 @@ Resolve model for: @~/.claude/get-shit-done/references/phase-argument-parsing.md ```bash -PHASE_INFO=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "${PHASE}") +PHASE_INFO=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${PHASE}") ``` If `found` is false: Error and exit. @@ -34,7 +34,7 @@ If exists: Offer update/view/skip options. ## Step 3: Gather Phase Context ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${PHASE}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE}") # Extract: phase_dir, padded_phase, phase_number, state_path, requirements_path, context_path ``` diff --git a/get-shit-done/workflows/resume-project.md b/get-shit-done/workflows/resume-project.md index b3de0fc39..f71cadbfa 100644 --- a/get-shit-done/workflows/resume-project.md +++ b/get-shit-done/workflows/resume-project.md @@ -20,7 +20,7 @@ Instantly restore full project context so "Where were we?" has an immediate, com Load all context in one call: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init resume) +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init resume) ``` Parse JSON for: `state_exists`, `roadmap_exists`, `project_exists`, `planning_exists`, `has_interrupted_agent`, `interrupted_agent_id`, `commit_docs`. diff --git a/get-shit-done/workflows/set-profile.md b/get-shit-done/workflows/set-profile.md index a0457075c..00c2f5d3f 100644 --- a/get-shit-done/workflows/set-profile.md +++ b/get-shit-done/workflows/set-profile.md @@ -23,8 +23,8 @@ if $ARGUMENTS.profile not in ["quality", "balanced", "budget"]: Ensure config exists and load current state: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-ensure-section -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs state load) +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-ensure-section +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load) ``` This creates `.planning/config.json` with defaults if missing and loads current config. diff --git a/get-shit-done/workflows/settings.md b/get-shit-done/workflows/settings.md index ba1d62cb3..9677001db 100644 --- a/get-shit-done/workflows/settings.md +++ b/get-shit-done/workflows/settings.md @@ -12,8 +12,8 @@ Read all files referenced by the invoking prompt's execution_context before star Ensure config exists and load current state: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-ensure-section -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs state load) +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-ensure-section +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load) ``` Creates `.planning/config.json` with defaults if missing and loads current config values. diff --git a/get-shit-done/workflows/transition.md b/get-shit-done/workflows/transition.md index c0e4bb431..553fc193b 100644 --- a/get-shit-done/workflows/transition.md +++ b/get-shit-done/workflows/transition.md @@ -123,7 +123,7 @@ If found, delete them — phase is complete, handoffs are stale. **Delegate ROADMAP.md and STATE.md updates to gsd-tools:** ```bash -TRANSITION=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs phase complete "${current_phase}") +TRANSITION=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" phase complete "${current_phase}") ``` The CLI handles: @@ -238,7 +238,7 @@ After (Phase 2 shipped JWT auth, discovered rate limiting needed): Verify the updates are correct by reading STATE.md. If the progress bar needs updating, use: ```bash -PROGRESS=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs progress bar --raw) +PROGRESS=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" progress bar --raw) ``` Update the progress bar line in STATE.md with the result. @@ -347,7 +347,7 @@ The `next_phase` and `next_phase_name` fields give you the next phase details. If you need additional context, use: ```bash -ROADMAP=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap analyze) +ROADMAP=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap analyze) ``` This returns all phases with goals, disk status, and completion info. @@ -453,7 +453,7 @@ Exit skill and invoke SlashCommand("/gsd:discuss-phase [X+1] --auto") **Clear auto-advance** — milestone boundary is the natural stopping point: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs config-set workflow.auto_advance false +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-set workflow.auto_advance false ``` diff --git a/get-shit-done/workflows/update.md b/get-shit-done/workflows/update.md index 001eb4013..3a184500c 100644 --- a/get-shit-done/workflows/update.md +++ b/get-shit-done/workflows/update.md @@ -164,16 +164,12 @@ Capture output. If install fails, show error and exit. Clear the update cache so statusline indicator disappears: -**If LOCAL install:** ```bash rm -f ./.claude/cache/gsd-update-check.json -``` - -**If GLOBAL install:** -```bash rm -f ~/.claude/cache/gsd-update-check.json ``` -(Paths are templated at install time for runtime compatibility) + +The SessionStart hook (`gsd-check-update.js`) always writes to `~/.claude/cache/` via `os.homedir()` regardless of install type, so both paths must be cleared to prevent stale update indicators. diff --git a/get-shit-done/workflows/verify-phase.md b/get-shit-done/workflows/verify-phase.md index dc126500c..33efb834c 100644 --- a/get-shit-done/workflows/verify-phase.md +++ b/get-shit-done/workflows/verify-phase.md @@ -28,14 +28,14 @@ Then verify each level against the actual codebase. Load phase operation context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init phase-op "${PHASE_ARG}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}") ``` Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`, `has_plans`, `plan_count`. Then load phase details and list plans/summaries: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "${phase_number}" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${phase_number}" grep -E "^| ${phase_number}" .planning/REQUIREMENTS.md 2>/dev/null ls "$phase_dir"/*-SUMMARY.md "$phase_dir"/*-PLAN.md 2>/dev/null ``` @@ -50,7 +50,7 @@ Use gsd-tools to extract must_haves from each PLAN: ```bash for plan in "$PHASE_DIR"/*-PLAN.md; do - MUST_HAVES=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs frontmatter get "$plan" --field must_haves) + MUST_HAVES=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" frontmatter get "$plan" --field must_haves) echo "=== $plan ===" && echo "$MUST_HAVES" done ``` @@ -64,7 +64,7 @@ Aggregate all must_haves across plans for phase-level verification. If no must_haves in frontmatter (MUST_HAVES returns error or empty), check for Success Criteria: ```bash -PHASE_DATA=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs roadmap get-phase "${phase_number}" --raw) +PHASE_DATA=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap get-phase "${phase_number}" --raw) ``` Parse the `success_criteria` array from the JSON output. If non-empty: @@ -100,7 +100,7 @@ Use gsd-tools for artifact verification against must_haves in each PLAN: ```bash for plan in "$PHASE_DIR"/*-PLAN.md; do - ARTIFACT_RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify artifacts "$plan") + ARTIFACT_RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify artifacts "$plan") echo "=== $plan ===" && echo "$ARTIFACT_RESULT" done ``` @@ -132,7 +132,7 @@ Use gsd-tools for key link verification against must_haves in each PLAN: ```bash for plan in "$PHASE_DIR"/*-PLAN.md; do - LINKS_RESULT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs verify key-links "$plan") + LINKS_RESULT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" verify key-links "$plan") echo "=== $plan ===" && echo "$LINKS_RESULT" done ``` diff --git a/get-shit-done/workflows/verify-work.md b/get-shit-done/workflows/verify-work.md index 47e286c83..466a80c4f 100644 --- a/get-shit-done/workflows/verify-work.md +++ b/get-shit-done/workflows/verify-work.md @@ -24,7 +24,7 @@ No Pass/Fail buttons. No severity questions. Just: "Here's what should happen. D If $ARGUMENTS contains a phase number, load context: ```bash -INIT=$(node ~/.claude/get-shit-done/bin/gsd-tools.cjs init verify-work "${PHASE_ARG}") +INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init verify-work "${PHASE_ARG}") ``` Parse JSON for: `planner_model`, `checker_model`, `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `has_verification`. @@ -292,7 +292,7 @@ Clear Current Test section: Commit the UAT file: ```bash -node ~/.claude/get-shit-done/bin/gsd-tools.cjs commit "test({phase_num}): complete UAT - {passed} passed, {issues} issues" --files ".planning/phases/XX-name/{phase_num}-UAT.md" +node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "test({phase_num}): complete UAT - {passed} passed, {issues} issues" --files ".planning/phases/XX-name/{phase_num}-UAT.md" ``` Present summary: diff --git a/tests/phase.test.cjs b/tests/phase.test.cjs index 21d6d2951..f1888eb3c 100644 --- a/tests/phase.test.cjs +++ b/tests/phase.test.cjs @@ -358,6 +358,228 @@ objective: Manual review needed }); }); + +// ───────────────────────────────────────────────────────────────────────────── +// phase-plan-index — canonical XML format (template-aligned) +// ───────────────────────────────────────────────────────────────────────────── + +describe('phase-plan-index canonical format', () => { + let tmpDir; + + beforeEach(() => { + tmpDir = createTempProject(); + }); + + afterEach(() => { + cleanup(tmpDir); + }); + + test('files_modified: underscore key is parsed correctly', () => { + const phaseDir = path.join(tmpDir, '.planning', 'phases', '04-ui'); + fs.mkdirSync(phaseDir, { recursive: true }); + + fs.writeFileSync( + path.join(phaseDir, '04-01-PLAN.md'), + `--- +wave: 1 +autonomous: true +files_modified: [src/App.tsx, src/index.ts] +--- + + +Build main application shell + +Purpose: Entry point +Output: App component + + + + + Task 1: Create App component + src/App.tsx + Create component + npm run build + Component renders + + +` + ); + + const result = runGsdTools('phase-plan-index 04', tmpDir); + assert.ok(result.success, `Command failed: ${result.error}`); + + const output = JSON.parse(result.output); + assert.deepStrictEqual( + output.plans[0].files_modified, + ['src/App.tsx', 'src/index.ts'], + 'files_modified with underscore should be parsed' + ); + }); + + test('objective: extracted from XML tag, not frontmatter', () => { + const phaseDir = path.join(tmpDir, '.planning', 'phases', '04-ui'); + fs.mkdirSync(phaseDir, { recursive: true }); + + fs.writeFileSync( + path.join(phaseDir, '04-01-PLAN.md'), + `--- +wave: 1 +autonomous: true +files_modified: [] +--- + + +Build main application shell + +Purpose: Entry point for the SPA +Output: App.tsx with routing + + + + + Task 1: Scaffold + src/App.tsx + Create shell + build passes + App renders + + +` + ); + + const result = runGsdTools('phase-plan-index 04', tmpDir); + assert.ok(result.success, `Command failed: ${result.error}`); + + const output = JSON.parse(result.output); + assert.strictEqual( + output.plans[0].objective, + 'Build main application shell', + 'objective should come from XML tag first line' + ); + }); + + test('task_count: counts XML tags', () => { + const phaseDir = path.join(tmpDir, '.planning', 'phases', '04-ui'); + fs.mkdirSync(phaseDir, { recursive: true }); + + fs.writeFileSync( + path.join(phaseDir, '04-01-PLAN.md'), + `--- +wave: 1 +autonomous: true +files_modified: [] +--- + + +Create UI components + + + + + Task 1: Header + src/Header.tsx + Create header + build + Header renders + + + + Task 2: Footer + src/Footer.tsx + Create footer + build + Footer renders + + + + UI components + Visit localhost:3000 + Type approved + + +` + ); + + const result = runGsdTools('phase-plan-index 04', tmpDir); + assert.ok(result.success, `Command failed: ${result.error}`); + + const output = JSON.parse(result.output); + assert.strictEqual( + output.plans[0].task_count, + 3, + 'should count all 3 XML tags' + ); + }); + + test('all three fields work together in canonical plan format', () => { + const phaseDir = path.join(tmpDir, '.planning', 'phases', '04-ui'); + fs.mkdirSync(phaseDir, { recursive: true }); + + fs.writeFileSync( + path.join(phaseDir, '04-01-PLAN.md'), + `--- +phase: 04-ui +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: [src/components/Chat.tsx, src/app/api/chat/route.ts] +autonomous: true +requirements: [R1, R2] +--- + + +Implement complete Chat feature as vertical slice. + +Purpose: Self-contained chat that can run parallel to other features. +Output: Chat component, API endpoints. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md + + + + + Task 1: Create Chat component + src/components/Chat.tsx + Build chat UI with message list and input + npm run build + Chat component renders messages + + + + Task 2: Create Chat API + src/app/api/chat/route.ts + GET /api/chat and POST /api/chat endpoints + curl tests pass + CRUD operations work + + + + +- [ ] npm run build succeeds +- [ ] API endpoints respond correctly + +` + ); + + const result = runGsdTools('phase-plan-index 04', tmpDir); + assert.ok(result.success, `Command failed: ${result.error}`); + + const output = JSON.parse(result.output); + const plan = output.plans[0]; + assert.strictEqual(plan.objective, 'Implement complete Chat feature as vertical slice.', 'objective from XML tag'); + assert.deepStrictEqual(plan.files_modified, ['src/components/Chat.tsx', 'src/app/api/chat/route.ts'], 'files_modified with underscore'); + assert.strictEqual(plan.task_count, 2, 'task_count from XML tags'); + }); +}); + // ───────────────────────────────────────────────────────────────────────────── // state-snapshot command // ─────────────────────────────────────────────────────────────────────────────