pi-gsd 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +374 -0
  3. package/dist/gsd-tools.js +380 -0
  4. package/package.json +72 -0
  5. package/scripts/postinstall.js +272 -0
  6. package/skills/gsd-add-backlog/SKILL.md +78 -0
  7. package/skills/gsd-add-phase/SKILL.md +39 -0
  8. package/skills/gsd-add-tests/SKILL.md +28 -0
  9. package/skills/gsd-add-todo/SKILL.md +42 -0
  10. package/skills/gsd-audit-milestone/SKILL.md +29 -0
  11. package/skills/gsd-audit-uat/SKILL.md +20 -0
  12. package/skills/gsd-autonomous/SKILL.md +34 -0
  13. package/skills/gsd-check-todos/SKILL.md +40 -0
  14. package/skills/gsd-cleanup/SKILL.md +19 -0
  15. package/skills/gsd-complete-milestone/SKILL.md +122 -0
  16. package/skills/gsd-debug/SKILL.md +178 -0
  17. package/skills/gsd-discuss-phase/SKILL.md +55 -0
  18. package/skills/gsd-do/SKILL.md +26 -0
  19. package/skills/gsd-execute-phase/SKILL.md +53 -0
  20. package/skills/gsd-fast/SKILL.md +22 -0
  21. package/skills/gsd-forensics/SKILL.md +51 -0
  22. package/skills/gsd-health/SKILL.md +17 -0
  23. package/skills/gsd-help/SKILL.md +24 -0
  24. package/skills/gsd-insert-phase/SKILL.md +28 -0
  25. package/skills/gsd-join-discord/SKILL.md +19 -0
  26. package/skills/gsd-list-phase-assumptions/SKILL.md +41 -0
  27. package/skills/gsd-list-workspaces/SKILL.md +17 -0
  28. package/skills/gsd-manager/SKILL.md +33 -0
  29. package/skills/gsd-map-codebase/SKILL.md +64 -0
  30. package/skills/gsd-milestone-summary/SKILL.md +45 -0
  31. package/skills/gsd-new-milestone/SKILL.md +39 -0
  32. package/skills/gsd-new-project/SKILL.md +37 -0
  33. package/skills/gsd-new-workspace/SKILL.md +41 -0
  34. package/skills/gsd-next/SKILL.md +19 -0
  35. package/skills/gsd-note/SKILL.md +30 -0
  36. package/skills/gsd-pause-work/SKILL.md +35 -0
  37. package/skills/gsd-plan-milestone-gaps/SKILL.md +28 -0
  38. package/skills/gsd-plan-phase/SKILL.md +38 -0
  39. package/skills/gsd-plant-seed/SKILL.md +21 -0
  40. package/skills/gsd-pr-branch/SKILL.md +20 -0
  41. package/skills/gsd-profile-user/SKILL.md +38 -0
  42. package/skills/gsd-progress/SKILL.md +19 -0
  43. package/skills/gsd-quick/SKILL.md +38 -0
  44. package/skills/gsd-reapply-patches/SKILL.md +126 -0
  45. package/skills/gsd-remove-phase/SKILL.md +26 -0
  46. package/skills/gsd-remove-workspace/SKILL.md +22 -0
  47. package/skills/gsd-research-phase/SKILL.md +200 -0
  48. package/skills/gsd-resume-work/SKILL.md +35 -0
  49. package/skills/gsd-review/SKILL.md +31 -0
  50. package/skills/gsd-review-backlog/SKILL.md +62 -0
  51. package/skills/gsd-session-report/SKILL.md +16 -0
  52. package/skills/gsd-set-profile/SKILL.md +9 -0
  53. package/skills/gsd-settings/SKILL.md +32 -0
  54. package/skills/gsd-ship/SKILL.md +16 -0
  55. package/skills/gsd-stats/SKILL.md +16 -0
  56. package/skills/gsd-thread/SKILL.md +133 -0
  57. package/skills/gsd-ui-phase/SKILL.md +24 -0
  58. package/skills/gsd-ui-review/SKILL.md +24 -0
  59. package/skills/gsd-update/SKILL.md +35 -0
  60. package/skills/gsd-validate-phase/SKILL.md +26 -0
  61. package/skills/gsd-verify-work/SKILL.md +30 -0
  62. package/skills/gsd-workstreams/SKILL.md +72 -0
@@ -0,0 +1,380 @@
1
+ #!/usr/bin/env node
2
+ "use strict";var In=Object.create;var Ct=Object.defineProperty;var En=Object.getOwnPropertyDescriptor;var Mn=Object.getOwnPropertyNames;var wn=Object.getPrototypeOf,Fn=Object.prototype.hasOwnProperty;var le=(n,e)=>()=>(n&&(e=n(n=0)),e);var ue=(n,e)=>{for(var s in e)Ct(n,s,{get:e[s],enumerable:!0})},Dn=(n,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of Mn(e))!Fn.call(n,t)&&t!==s&&Ct(n,t,{get:()=>e[t],enumerable:!(i=En(e,t))||i.enumerable});return n};var N=(n,e,s)=>(s=n!=null?In(wn(n)):{},Dn(e||!n||!n.__esModule?Ct(s,"default",{value:n,enumerable:!0}):s,n));var en={};ue(en,{HARNESS_CONFIG:()=>It,MODEL_PROFILES:()=>Pe,VALID_PROFILES:()=>Je,formatAgentToModelMapAsTable:()=>Mt,generateModelProfilesMd:()=>Tn,getAgentToModelMapForProfile:()=>Et});function Et(n){let e={};for(let[s,i]of Object.entries(Pe))e[s]=i[n];return e}function Mt(n){let e=Math.max(5,...Object.keys(n).map(o=>o.length)),s=Math.max(5,...Object.values(n).map(o=>o.length)),i="\u2500".repeat(e+2)+"\u253C"+"\u2500".repeat(s+2),r=" "+"Agent".padEnd(e)+" \u2502 "+"Model".padEnd(s)+`
3
+ `+i+`
4
+ `;for(let[o,a]of Object.entries(n))r+=" "+o.padEnd(e)+" \u2502 "+a.padEnd(s)+`
5
+ `;return r}function Tn(n="agent"){let e=It[n]??It.agent,{runtimeName:s,cmdPrefix:i,providerHeader:t,providerIntro:r,rationaleAlias:o,nonRuntimeHeading:a,nonRuntimeIntro:l}=e,c=Je,d=Object.keys(Pe),u=["Agent",...c.map(b=>"`"+b+"`"),"`inherit`"],m="| "+u.join(" | ")+" |",p="|"+u.map(b=>"-".repeat(b.length+2)).join("|")+"|",h=d.map(b=>{let x=c.map(P=>Pe[b][P]);return"| "+[b,...x,"inherit"].join(" | ")+" |"}),y=[m,p,...h].join(`
6
+ `),g=`${i}settings`,_=`${i}set-profile <profile>`;return`<!-- AUTO-GENERATED - do not edit by hand.
7
+ Source of truth: src/lib/model-profiles.ts
8
+ Regenerate with: node dist/gsd-tools.js generate-model-profiles-md --harness ${n}
9
+ -->
10
+ # Model Profiles
11
+
12
+ Model profiles control which ${s} model each GSD agent uses. This allows balancing quality vs token spend, or inheriting the currently selected session model.
13
+
14
+ ## Profile Definitions
15
+
16
+ ${y}
17
+
18
+ ## Profile Philosophy
19
+
20
+ **quality** - Maximum reasoning power
21
+ - Opus for all decision-making agents
22
+ - Sonnet for read-only verification
23
+ - Use when: quota available, critical architecture work
24
+
25
+ **balanced** (default) - Smart allocation
26
+ - Opus only for planning (where architecture decisions happen)
27
+ - Sonnet for execution and research (follows explicit instructions)
28
+ - Sonnet for verification (needs reasoning, not just pattern matching)
29
+ - Use when: normal development, good balance of quality and cost
30
+
31
+ **budget** - Minimal Opus usage
32
+ - Sonnet for anything that writes code
33
+ - Haiku for research and verification
34
+ - Use when: conserving quota, high-volume work, less critical phases
35
+
36
+ **inherit** - Follow the current session model
37
+ - All agents resolve to \`inherit\`
38
+ - Best when you switch models interactively (for example OpenCode \`/model\`)
39
+ - **Required when using non-Anthropic providers** (OpenRouter, local models, etc.) - otherwise GSD may call Anthropic models directly, incurring unexpected costs
40
+ - Use when: you want GSD to follow your currently selected runtime model
41
+
42
+ ## ${a}
43
+
44
+ ${l}
45
+
46
+ To assign different models to different agents, add \`model_overrides\` with model IDs your runtime recognizes:
47
+
48
+ \`\`\`json
49
+ {
50
+ "resolve_model_ids": "omit",
51
+ "model_overrides": {
52
+ "gsd-planner": "o3",
53
+ "gsd-executor": "o4-mini",
54
+ "gsd-debugger": "o3",
55
+ "gsd-codebase-mapper": "o4-mini"
56
+ }
57
+ }
58
+ \`\`\`
59
+
60
+ The same tiering logic applies: stronger models for planning and debugging, cheaper models for execution and mapping.
61
+
62
+ ## ${t}
63
+
64
+ ${r}
65
+
66
+ \`\`\`bash
67
+ # Via settings command
68
+ ${g}
69
+ # \u2192 Select "Inherit" for model profile
70
+
71
+ # Or manually in .planning/config.json
72
+ {
73
+ "model_profile": "inherit"
74
+ }
75
+ \`\`\`
76
+
77
+ Without \`inherit\`, GSD's default \`balanced\` profile spawns specific Anthropic models (\`opus\`, \`sonnet\`, \`haiku\`) for each agent type, which can result in additional API costs through your non-Anthropic provider.
78
+
79
+ ## Resolution Logic
80
+
81
+ Orchestrators resolve model before spawning:
82
+
83
+ \`\`\`
84
+ 1. Read .planning/config.json
85
+ 2. Check model_overrides for agent-specific override
86
+ 3. If no override, look up agent in profile table
87
+ 4. Pass model parameter to Task call
88
+ \`\`\`
89
+
90
+ ## Per-Agent Overrides
91
+
92
+ Override specific agents without changing the entire profile:
93
+
94
+ \`\`\`json
95
+ {
96
+ "model_profile": "balanced",
97
+ "model_overrides": {
98
+ "gsd-executor": "opus",
99
+ "gsd-planner": "haiku"
100
+ }
101
+ }
102
+ \`\`\`
103
+
104
+ Overrides take precedence over the profile. Valid values: \`opus\`, \`sonnet\`, \`haiku\`, \`inherit\`, or any fully-qualified model ID (e.g., \`"o3"\`, \`"openai/o3"\`, \`"google/gemini-2.5-pro"\`).
105
+
106
+ ## Switching Profiles
107
+
108
+ Runtime: \`${_}\`
109
+
110
+ Per-project default: Set in \`.planning/config.json\`:
111
+ \`\`\`json
112
+ {
113
+ "model_profile": "balanced"
114
+ }
115
+ \`\`\`
116
+
117
+ ## Design Rationale
118
+
119
+ **Why Opus for gsd-planner?**
120
+ Planning involves architecture decisions, goal decomposition, and task design. This is where model quality has the highest impact.
121
+
122
+ **Why Sonnet for gsd-executor?**
123
+ Executors follow explicit PLAN.md instructions. The plan already contains the reasoning; execution is implementation.
124
+
125
+ **Why Sonnet (not Haiku) for verifiers in balanced?**
126
+ Verification requires goal-backward reasoning - checking if code *delivers* what the phase promised, not just pattern matching. Sonnet handles this well; Haiku may miss subtle gaps.
127
+
128
+ **Why Haiku for gsd-codebase-mapper?**
129
+ Read-only exploration and pattern extraction. No reasoning required, just structured output from file contents.
130
+
131
+ **Why \`inherit\` instead of passing \`opus\` directly?**
132
+ ${o}'s \`"opus"\` alias maps to a specific model version. Organizations may block older opus versions while allowing newer ones. GSD returns \`"inherit"\` for opus-tier agents, causing them to use whatever opus version the user has configured in their session. This avoids version conflicts and silent fallbacks to Sonnet.
133
+
134
+ **Why \`inherit\` profile?**
135
+ Some runtimes (including OpenCode) let users switch models at runtime (\`/model\`). The \`inherit\` profile keeps all GSD subagents aligned to that live selection.
136
+ `}var Pe,Je,It,it=le(()=>{"use strict";Pe={"gsd-planner":{quality:"opus",balanced:"opus",budget:"sonnet"},"gsd-roadmapper":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-executor":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-phase-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-project-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-research-synthesizer":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-debugger":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-codebase-mapper":{quality:"sonnet",balanced:"haiku",budget:"haiku"},"gsd-verifier":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-plan-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-integration-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-nyquist-auditor":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-ui-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-ui-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-ui-auditor":{quality:"sonnet",balanced:"sonnet",budget:"haiku"}},Je=Object.keys(Pe["gsd-planner"]),It={claude:{runtimeName:"Claude",cmdPrefix:"/gsd:",providerHeader:"Using Claude Code with Non-Anthropic Providers (OpenRouter, Local)",providerIntro:"If you're using Claude Code with OpenRouter, a local model, or any non-Anthropic provider, set the `inherit` profile to prevent GSD from calling Anthropic models for subagents:",rationaleAlias:"Claude Code",nonRuntimeHeading:"Using Non-Claude Runtimes (Codex, OpenCode, Gemini CLI)",nonRuntimeIntro:'When installed for a non-Claude runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'},gemini:{runtimeName:"Gemini CLI",cmdPrefix:"/gsd:",providerHeader:"Using Gemini CLI with Non-Google Providers (OpenRouter, Local)",providerIntro:"If you're using Gemini CLI with OpenRouter, a local model, or any non-Google provider, set the `inherit` profile to prevent GSD from calling Google models for subagents:",rationaleAlias:"Gemini CLI",nonRuntimeHeading:"Using Non-Gemini-CLI Runtimes (Codex, OpenCode, Claude Code)",nonRuntimeIntro:'When installed for a non-Gemini-CLI runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'},cursor:{runtimeName:"Claude",cmdPrefix:"/gsd-",providerHeader:"Using Cursor with Non-Anthropic Providers (OpenRouter, Local)",providerIntro:"If you're using Cursor with OpenRouter, a local model, or any non-Anthropic provider, set the `inherit` profile to prevent GSD from calling Anthropic models for subagents:",rationaleAlias:"Cursor",nonRuntimeHeading:"Using Non-Claude Runtimes (Codex, OpenCode, Gemini CLI)",nonRuntimeIntro:'When installed for a non-Claude runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'},windsurf:{runtimeName:"Claude",cmdPrefix:"/gsd-",providerHeader:"Using Windsurf with Non-Anthropic Providers (OpenRouter, Local)",providerIntro:"If you're using Windsurf with OpenRouter, a local model, or any non-Anthropic provider, set the `inherit` profile to prevent GSD from calling Anthropic models for subagents:",rationaleAlias:"Windsurf",nonRuntimeHeading:"Using Non-Claude Runtimes (Codex, OpenCode, Gemini CLI)",nonRuntimeIntro:'When installed for a non-Claude runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'},agent:{runtimeName:"Claude",cmdPrefix:"/gsd-",providerHeader:"Using Claude Code with Non-Anthropic Providers (OpenRouter, Local)",providerIntro:"If you're using Claude Code with OpenRouter, a local model, or any non-Anthropic provider, set the `inherit` profile to prevent GSD from calling Anthropic models for subagents:",rationaleAlias:"Claude Code",nonRuntimeHeading:"Using Non-Claude Runtimes (Codex, OpenCode, Gemini CLI)",nonRuntimeIntro:'When installed for a non-Claude runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'},github:{runtimeName:"Claude",cmdPrefix:"/gsd-",providerHeader:"Using Claude Code with Non-Anthropic Providers (OpenRouter, Local)",providerIntro:"If you're using Claude Code with OpenRouter, a local model, or any non-Anthropic provider, set the `inherit` profile to prevent GSD from calling Anthropic models for subagents:",rationaleAlias:"Claude Code",nonRuntimeHeading:"Using Non-Claude Runtimes (Codex, OpenCode, Gemini CLI)",nonRuntimeIntro:'When installed for a non-Claude runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'},opencode:{runtimeName:"Claude",cmdPrefix:"/gsd-",providerHeader:"Using Claude Code with Non-Anthropic Providers (OpenRouter, Local)",providerIntro:"If you're using Claude Code with OpenRouter, a local model, or any non-Anthropic provider, set the `inherit` profile to prevent GSD from calling Anthropic models for subagents:",rationaleAlias:"Claude Code",nonRuntimeHeading:"Using Non-Claude Runtimes (Codex, OpenCode, Gemini CLI)",nonRuntimeIntro:'When installed for a non-Claude runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'},codex:{runtimeName:"Claude",cmdPrefix:"$gsd-",providerHeader:"Using Claude Code with Non-Anthropic Providers (OpenRouter, Local)",providerIntro:"If you're using Claude Code with OpenRouter, a local model, or any non-Anthropic provider, set the `inherit` profile to prevent GSD from calling Anthropic models for subagents:",rationaleAlias:"Claude Code",nonRuntimeHeading:"Using Non-Claude Runtimes (Codex, OpenCode, Gemini CLI)",nonRuntimeIntro:'When installed for a non-Claude runtime, the GSD installer sets `resolve_model_ids: "omit"` in `~/.gsd/defaults.json`. This returns an empty model parameter for all agents, so each agent uses the runtime\'s default model. No manual setup is needed.'}}});function G(n){return n.split(C.default.sep).join("/")}function tn(n){let e=[];try{let s=D.default.readdirSync(n,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()||i.name.startsWith(".")||i.name==="node_modules")continue;let t=C.default.join(n,i.name,".git");try{D.default.existsSync(t)&&e.push(i.name)}catch{}}}catch{}return e.sort()}function sn(n){let e=C.default.resolve(n),s=C.default.parse(e).root,i=ft.default.homedir(),t=C.default.join(e,".planning");if(D.default.existsSync(t)&&D.default.statSync(t).isDirectory())return n;function r(a){let l=e;for(;l!==s;){if(D.default.existsSync(C.default.join(l,".git")))return!0;if(l===a)break;l=C.default.dirname(l)}return!1}let o=e;for(;o!==s;){let a=C.default.dirname(o);if(a===o||a===i)break;let l=C.default.join(a,".planning");if(D.default.existsSync(l)&&D.default.statSync(l).isDirectory()){let c=C.default.join(l,"config.json");try{let d=JSON.parse(D.default.readFileSync(c,"utf-8")),u=d.sub_repos||d.planning?.sub_repos||[];if(Array.isArray(u)&&u.length>0){let p=C.default.relative(a,e).split(C.default.sep)[0];if(u.includes(p))return a}if(d.multiRepo===!0&&r(a))return a}catch{}if(r(a))return a}o=a}return n}function Nn(n="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:s=!1}={}){try{let i=ft.default.tmpdir(),t=Date.now();for(let r of D.default.readdirSync(i)){if(!r.startsWith(n))continue;let o=C.default.join(i,r);try{let a=D.default.statSync(o);t-a.mtimeMs>e&&(a.isDirectory()?D.default.rmSync(o,{recursive:!0,force:!0}):s||D.default.unlinkSync(o))}catch{}}}catch{}}function f(n,e=!1,s){let i;if(e&&s!==void 0)i=String(s);else{let t=JSON.stringify(n,null,2);if(t.length>5e4){Nn();let r=C.default.join(ft.default.tmpdir(),`gsd-${Date.now()}.json`);D.default.writeFileSync(r,t,"utf-8"),i="@file:"+r}else i=t}D.default.writeSync(1,i)}function S(n){D.default.writeSync(2,"Error: "+n+`
137
+ `),process.exit(1)}function Ce(n){try{return D.default.readFileSync(n,"utf-8")}catch{return null}}function B(n){let e=C.default.join(n,".planning","config.json"),s={model_profile:"balanced",commit_docs:!0,search_gitignored:!1,branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null,research:!0,plan_checker:!0,verifier:!0,nyquist_validation:!0,parallelization:!0,brave_search:!1,firecrawl:!1,exa_search:!1,text_mode:!1,sub_repos:[],resolve_model_ids:!1,context_window:2e5,phase_naming:"sequential",model_overrides:null,agent_skills:{}};try{let l=function(d,u){if(r[d]!==void 0)return r[d];if(u&&r[u.section]?.[u.field]!==void 0)return r[u.section][u.field]};var i=l;let t=D.default.readFileSync(e,"utf-8"),r=JSON.parse(t);if("depth"in r&&!("granularity"in r)){let d={quick:"coarse",standard:"standard",comprehensive:"fine"};r.granularity=d[r.depth]||r.depth,delete r.depth;try{D.default.writeFileSync(e,JSON.stringify(r,null,2),"utf-8")}catch{}}let o=!1;if(r.multiRepo===!0&&!r.sub_repos&&!r.planning?.sub_repos){let d=tn(n);d.length>0&&(r.sub_repos=d,r.planning||(r.planning={}),r.planning.commit_docs=!1,delete r.multiRepo,o=!0)}let a=r.sub_repos||r.planning?.sub_repos||[];if(Array.isArray(a)&&a.length>0){let d=tn(n);if(d.length>0){let u=[...a].sort();JSON.stringify(u)!==JSON.stringify(d)&&(r.sub_repos=d,o=!0)}}if(o)try{D.default.writeFileSync(e,JSON.stringify(r,null,2),"utf-8")}catch{}let c=(()=>{let d=l("parallelization");return typeof d=="boolean"?d:typeof d=="object"&&d!==null&&"enabled"in d?!!d.enabled:s.parallelization})();return{model_profile:l("model_profile")??s.model_profile,commit_docs:(()=>{let d=l("commit_docs",{section:"planning",field:"commit_docs"});return d!==void 0?!!d:wt(n,".planning/")?!1:s.commit_docs})(),search_gitignored:l("search_gitignored",{section:"planning",field:"search_gitignored"})??s.search_gitignored,branching_strategy:l("branching_strategy",{section:"git",field:"branching_strategy"})??s.branching_strategy,phase_branch_template:l("phase_branch_template",{section:"git",field:"phase_branch_template"})??s.phase_branch_template,milestone_branch_template:l("milestone_branch_template",{section:"git",field:"milestone_branch_template"})??s.milestone_branch_template,quick_branch_template:l("quick_branch_template",{section:"git",field:"quick_branch_template"})??s.quick_branch_template,research:l("research",{section:"workflow",field:"research"})??s.research,plan_checker:l("plan_checker",{section:"workflow",field:"plan_check"})??s.plan_checker,verifier:l("verifier",{section:"workflow",field:"verifier"})??s.verifier,nyquist_validation:l("nyquist_validation",{section:"workflow",field:"nyquist_validation"})??s.nyquist_validation,parallelization:c,brave_search:l("brave_search")??s.brave_search,firecrawl:l("firecrawl")??s.firecrawl,exa_search:l("exa_search")??s.exa_search,text_mode:l("text_mode",{section:"workflow",field:"text_mode"})??s.text_mode,sub_repos:l("sub_repos",{section:"planning",field:"sub_repos"})??s.sub_repos,resolve_model_ids:l("resolve_model_ids")??s.resolve_model_ids,context_window:l("context_window")??s.context_window,phase_naming:l("phase_naming")??s.phase_naming,model_overrides:r.model_overrides||null,agent_skills:r.agent_skills||{}}}catch{return s}}function wt(n,e){try{return(0,pt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:n,stdio:"pipe"}),!0}catch{return!1}}function ie(n,e){let s=(0,pt.spawnSync)("git",e,{cwd:n,stdio:"pipe",encoding:"utf-8"});return{exitCode:s.status??1,stdout:(s.stdout??"").toString().trim(),stderr:(s.stderr??"").toString().trim()}}function $e(n){if(!n||typeof n!="string")return n;let e=n.replace(/\r\n/g,`
138
+ `),s=e.split(`
139
+ `),i=[];for(let t=0;t<s.length;t++){let r=s[t],o=t>0?s[t-1]:"",a=o.trimEnd(),l=r.trimEnd();if(/^#{1,6}\s/.test(l)&&t>0&&a!==""&&a!=="---"&&i.push(""),/^```/.test(l)&&t>0&&a!==""&&!qn(s,t)&&i.push(""),/^(\s*[-*+]\s|\s*\d+\.\s)/.test(r)&&t>0&&a!==""&&!/^(\s*[-*+]\s|\s*\d+\.\s)/.test(o)&&a!=="---"&&i.push(""),i.push(r),/^#{1,6}\s/.test(l)&&t<s.length-1&&s[t+1]?.trimEnd()!==""&&i.push(""),/^```\s*$/.test(l)&&Wn(s,t)&&t<s.length-1&&s[t+1]?.trimEnd()!==""&&i.push(""),/^(\s*[-*+]\s|\s*\d+\.\s)/.test(r)&&t<s.length-1){let c=s[t+1];c!==void 0&&c.trimEnd()!==""&&!/^(\s*[-*+]\s|\s*\d+\.\s)/.test(c)&&!/^\s/.test(c)&&i.push("")}}return e=i.join(`
140
+ `),e=e.replace(/\n{3,}/g,`
141
+
142
+ `),e=e.replace(/\n*$/,`
143
+ `),e}function qn(n,e){let s=0;for(let i=0;i<e;i++)/^```/.test(n[i].trimEnd())&&s++;return s%2===1}function Wn(n,e){let s=0;for(let i=0;i<=e;i++)/^```/.test(n[i].trimEnd())&&s++;return s%2===0}function rn(n){if(D.default.existsSync(C.default.join(n,".planning")))return n;let e=ie(n,["rev-parse","--git-dir"]),s=ie(n,["rev-parse","--git-common-dir"]);if(e.exitCode!==0||s.exitCode!==0)return n;let i=C.default.resolve(n,e.stdout),t=C.default.resolve(n,s.stdout);return i!==t?C.default.dirname(t):n}function w(n,e){let s=e??process.env.GSD_WORKSTREAM??null;return s?C.default.join(n,".planning","workstreams",s):C.default.join(n,".planning")}function J(n){return C.default.join(n,".planning")}function R(n,e){let s=w(n,e),i=C.default.join(n,".planning");return{planning:s,state:C.default.join(s,"STATE.md"),roadmap:C.default.join(s,"ROADMAP.md"),project:C.default.join(i,"PROJECT.md"),config:C.default.join(i,"config.json"),phases:C.default.join(s,"phases"),requirements:C.default.join(s,"REQUIREMENTS.md")}}function He(n){let e=C.default.join(J(n),"active-workstream");try{let s=D.default.readFileSync(e,"utf-8").trim();return!s||!/^[a-zA-Z0-9_-]+$/.test(s)||!D.default.existsSync(C.default.join(J(n),"workstreams",s))?null:s}catch{return null}}function Ye(n,e){let s=C.default.join(J(n),"active-workstream");if(!e){try{D.default.unlinkSync(s)}catch{}return}if(!/^[a-zA-Z0-9_-]+$/.test(e))throw new Error("Invalid workstream name");D.default.writeFileSync(s,e+`
144
+ `,"utf-8")}function K(n){return String(n).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function oe(n){let e=String(n),s=e.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);return s?s[1].padStart(2,"0")+(s[2]?s[2].toUpperCase():"")+(s[3]||""):e}function xe(n,e){let s=String(n).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i),i=String(e).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);if(!s||!i)return String(n).localeCompare(String(e));let t=parseInt(s[1],10)-parseInt(i[1],10);if(t!==0)return t;let r=(s[2]||"").toUpperCase(),o=(i[2]||"").toUpperCase();if(r!==o)return r?o&&r<o?-1:1:-1;let a=s[3]?s[3].slice(1).split(".").map(c=>parseInt(c,10)):[],l=i[3]?i[3].slice(1).split(".").map(c=>parseInt(c,10)):[];if(a.length===0&&l.length>0)return-1;if(l.length===0&&a.length>0)return 1;for(let c=0;c<Math.max(a.length,l.length);c++){let d=Number.isFinite(a[c])?a[c]:0,u=Number.isFinite(l[c])?l[c]:0;if(d!==u)return d-u}return 0}function nn(n,e,s){try{let t=De(n,!0).find(x=>x.startsWith(s)||x.toUpperCase().startsWith(s.toUpperCase()));if(!t)return null;let r=t.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)||t.match(/^([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*)-(.+)/i)||[null,t,null],o=r?.[1]??s,a=r?.[2]||null,l=C.default.join(n,t),{plans:c,summaries:d,hasResearch:u,hasContext:m,hasVerification:p,hasReviews:h}=Un(l),y=c.sort(),g=d.sort(),_=new Set(g.map(x=>x.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),b=y.filter(x=>!_.has(x.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:G(C.default.join(e,t)),phase_number:o,phase_name:a,phase_slug:a?a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:y,summaries:g,incomplete_plans:b,has_research:u,has_context:m,has_verification:p,has_reviews:h}}catch{return null}}function ce(n,e){if(!e)return null;let s=C.default.join(w(n),"phases"),i=oe(e),t=G(C.default.relative(n,s)),r=nn(s,t,i);if(r)return r;let o=C.default.join(n,".planning","milestones");if(!D.default.existsSync(o))return null;try{let a=D.default.readdirSync(o,{withFileTypes:!0}).filter(l=>l.isDirectory()&&/^v[\d.]+-phases$/.test(l.name)).map(l=>l.name).sort().reverse();for(let l of a){let c=l.match(/^(v[\d.]+)-phases$/)[1],d=C.default.join(o,l),u=".planning/milestones/"+l,m=nn(d,u,i);if(m)return m.archived=c,m}}catch{}return null}function ht(n){let e=C.default.join(n,".planning","milestones"),s=[];if(!D.default.existsSync(e))return s;try{let i=D.default.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()&&/^v[\d.]+-phases$/.test(t.name)).map(t=>t.name).sort().reverse();for(let t of i){let r=t.match(/^(v[\d.]+)-phases$/)[1],o=C.default.join(e,t);for(let a of De(o,!0))s.push({name:a,milestone:r,basePath:C.default.join(".planning","milestones",t),fullPath:C.default.join(o,a)})}}catch{}return s}function mt(n){return n.replace(/<details>[\s\S]*?<\/details>/gi,"")}function Se(n,e){if(!e)return mt(n);let s=null;try{let u=C.default.join(w(e),"STATE.md");if(D.default.existsSync(u)){let p=D.default.readFileSync(u,"utf-8").match(/^milestone:\s*(.+)/m);p&&(s=p[1].trim())}}catch{}if(!s){let u=n.match(/🚧\s*\*\*v(\d+\.\d+)\s/);u&&(s="v"+u[1])}if(!s)return mt(n);let i=new RegExp(`(^#{1,3}\\s+.*${K(s)}[^\\n]*)`,"mi"),t=n.match(i);if(!t)return mt(n);let r=t.index,o=t[1].match(/^(#{1,3})\s/)[1].length,l=n.slice(r+t[0].length).match(new RegExp(`^#{1,${o}}\\s+(?:.*v\\d+\\.\\d+|\u2705|\u{1F4CB}|\u{1F6A7})`,"mi")),c=l?r+t[0].length+l.index:n.length;return n.slice(0,r).replace(/<details>[\s\S]*?<\/details>/gi,"")+n.slice(r,c)}function Ke(n,e,s){let i=n.lastIndexOf("</details>");if(i===-1)return n.replace(e,s);let t=i+10,r=n.slice(0,t),o=n.slice(t);return r+o.replace(e,s)}function Ze(n,e){if(!e)return null;let s=C.default.join(w(n),"ROADMAP.md");if(!D.default.existsSync(s))return null;try{let i=Se(D.default.readFileSync(s,"utf-8"),n),t=new RegExp(`#{2,4}\\s*Phase\\s+${K(e)}:\\s*([^\\n]+)`,"i"),r=i.match(t);if(!r)return null;let o=r[1].trim(),a=r.index,c=i.slice(a).match(/\n#{2,4}\s+Phase\s+[\w]/i),d=c?a+c.index:i.length,u=i.slice(a,d).trim(),m=u.match(/\*\*Goal(?:\*\*:|\*?\*?:\*\*)\s*([^\n]+)/i);return{found:!0,phase_number:e.toString(),phase_name:o,goal:m?m[1].trim():null,section:u}}catch{return null}}function Ln(){return C.default.join(__dirname,"..","..","agents")}function rt(){let n=Ln(),e=Object.keys(Pe),s=[],i=[];if(!D.default.existsSync(n))return{agents_installed:!1,missing_agents:e,installed_agents:[],agents_dir:n};for(let t of e)D.default.existsSync(C.default.join(n,`${t}.md`))?s.push(t):i.push(t);return{agents_installed:s.length>0&&i.length===0,missing_agents:i,installed_agents:s,agents_dir:n}}function Z(n,e){let s=B(n),i=s.model_overrides?.[e];if(i)return i;if(s.resolve_model_ids==="omit")return"";let t=String(s.model_profile||"balanced").toLowerCase(),r=Pe[e];if(!r)return"sonnet";if(t==="inherit")return"inherit";let o=r[t]||r.balanced||"sonnet";return s.resolve_model_ids&&On[o]||o}function gt(n){if(!n)return null;let s=n.replace(/^---\n[\s\S]*?\n---\n*/,"").match(/^#[^\n]*\n+\*\*([^*]+)\*\*/m);return s?s[1].trim():null}function Fe(n){return n?n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function te(n){try{let e=D.default.readFileSync(C.default.join(w(n),"ROADMAP.md"),"utf-8"),s=e.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);if(s)return{version:"v"+s[1],name:s[2].trim()};let i=mt(e),t=i.match(/## .*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);if(t)return{version:"v"+t[1],name:t[2].trim()};let r=i.match(/v(\d+(?:\.\d+)+)/);return{version:r?r[0]:"v1.0",name:"milestone"}}catch{return{version:"v1.0",name:"milestone"}}}function ve(n){let e=new Set;try{let t=Se(D.default.readFileSync(C.default.join(w(n),"ROADMAP.md"),"utf-8"),n),r=/#{2,4}\s*Phase\s+([\w][\w.-]*)\s*:/gi,o;for(;(o=r.exec(t))!==null;)e.add(o[1])}catch{}if(e.size===0){let t=r=>!0;return t.phaseCount=0,t}let s=new Set([...e].map(t=>(t.replace(/^0+/,"")||"0").toLowerCase()));function i(t){let r=t.match(/^0*(\d+[A-Za-z]?(?:\.\d+)*)/);if(r&&s.has(r[1].toLowerCase()))return!0;let o=t.match(/^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*)/);return!!(o&&s.has(o[1].toLowerCase()))}return i.phaseCount=e.size,i}function ot(n){return n.filter(e=>e.endsWith("-PLAN.md")||e==="PLAN.md")}function at(n){return n.filter(e=>e.endsWith("-SUMMARY.md")||e==="SUMMARY.md")}function Un(n){let e=D.default.readdirSync(n);return{plans:ot(e),summaries:at(e),hasResearch:e.some(s=>s.endsWith("-RESEARCH.md")||s==="RESEARCH.md"),hasContext:e.some(s=>s.endsWith("-CONTEXT.md")||s==="CONTEXT.md"),hasVerification:e.some(s=>s.endsWith("-VERIFICATION.md")||s==="VERIFICATION.md"),hasReviews:e.some(s=>s.endsWith("-REVIEWS.md")||s==="REVIEWS.md")}}function De(n,e=!1){try{let i=D.default.readdirSync(n,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>t.name);return e?i.sort((t,r)=>xe(t,r)):i}catch{return[]}}var pt,D,ft,C,On,me=le(()=>{"use strict";pt=require("child_process"),D=N(require("fs")),ft=N(require("os")),C=N(require("path"));it();On={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var ln={};ue(ln,{FRONTMATTER_SCHEMAS:()=>Ft,cmdFrontmatterGet:()=>Gn,cmdFrontmatterMerge:()=>zn,cmdFrontmatterSet:()=>Vn,cmdFrontmatterValidate:()=>Bn,extractFrontmatter:()=>ne,parseMustHavesBlock:()=>yt,reconstructFrontmatter:()=>Qe,spliceFrontmatter:()=>Dt});function ne(n){let e={},s=[...n.matchAll(/(?:^|\n)\s*---\r?\n([\s\S]+?)\r?\n---/g)],i=s.length>0?s[s.length-1]:null;if(!i)return e;let r=i[1].split(/\r?\n/),o=[{obj:e,key:null,indent:-1}];for(let a of r){if(a.trim()==="")continue;let l=a.match(/^(\s*)/),c=l?l[1].length:0;for(;o.length>1&&c<=o[o.length-1].indent;)o.pop();let d=o[o.length-1],u=a.match(/^(\s*)([a-zA-Z0-9_-]+):\s*(.*)/);if(u){let m=u[2],p=u[3].trim();p===""||p==="["?(d.obj[m]=p==="["?[]:{},d.key=null,o.push({obj:d.obj[m],key:null,indent:c})):p.startsWith("[")&&p.endsWith("]")?(d.obj[m]=p.slice(1,-1).split(",").map(h=>h.trim().replace(/^["']|["']$/g,"")).filter(Boolean),d.key=null):(d.obj[m]=p.replace(/^["']|["']$/g,""),d.key=null)}else if(a.trim().startsWith("- ")){let m=a.trim().slice(2).replace(/^["']|["']$/g,"");if(typeof d.obj=="object"&&!Array.isArray(d.obj)&&Object.keys(d.obj).length===0){let p=o.length>1?o[o.length-2]:null;if(p){for(let h of Object.keys(p.obj))if(p.obj[h]===d.obj){p.obj[h]=[m],d.obj=p.obj[h];break}}}else Array.isArray(d.obj)&&d.obj.push(m)}}return e}function Qe(n){let e=[];for(let[s,i]of Object.entries(n))if(i!=null)if(Array.isArray(i))if(i.length===0)e.push(`${s}: []`);else if(i.every(t=>typeof t=="string")&&i.length<=3&&i.join(", ").length<60)e.push(`${s}: [${i.join(", ")}]`);else{e.push(`${s}:`);for(let t of i){let r=String(t);e.push(` - ${typeof t=="string"&&(r.includes(":")||r.includes("#"))?`"${r}"`:r}`)}}else if(typeof i=="object"){e.push(`${s}:`);for(let[t,r]of Object.entries(i))if(r!=null)if(Array.isArray(r))if(r.length===0)e.push(` ${t}: []`);else if(r.every(o=>typeof o=="string")&&r.length<=3&&r.join(", ").length<60)e.push(` ${t}: [${r.join(", ")}]`);else{e.push(` ${t}:`);for(let o of r)e.push(` - ${o}`)}else if(typeof r=="object"){e.push(` ${t}:`);for(let[o,a]of Object.entries(r))if(a!=null)if(Array.isArray(a))if(a.length===0)e.push(` ${o}: []`);else{e.push(` ${o}:`);for(let l of a)e.push(` - ${l}`)}else e.push(` ${o}: ${a}`)}else{let o=String(r);e.push(` ${t}: ${o.includes(":")||o.includes("#")?`"${o}"`:o}`)}}else{let t=String(i);t.includes(":")||t.includes("#")||t.startsWith("[")||t.startsWith("{")?e.push(`${s}: "${t}"`):e.push(`${s}: ${t}`)}return e.join(`
145
+ `)}function Dt(n,e){let s=Qe(e),i=n.match(/^---\r?\n[\s\S]+?\r?\n---/);return i?`---
146
+ ${s}
147
+ ---`+n.slice(i[0].length):`---
148
+ ${s}
149
+ ---
150
+
151
+ `+n}function yt(n,e){let s=n.match(/^---\r?\n([\s\S]+?)\r?\n---/);if(!s)return[];let i=s[1],t=i.match(/^(\s*)must_haves:\s*$/m);if(!t)return[];let r=t[1].length,o=new RegExp(`^(\\s+)${e}:\\s*$`,"m"),a=i.match(o);if(!a)return[];let l=a[1].length;if(l<=r)return[];let c=i.indexOf(a[0]);if(c===-1)return[];let u=i.slice(c).split(/\r?\n/).slice(1),m=[],p=null,h=-1;for(let y of u){if(y.trim()==="")continue;let g=y.match(/^(\s*)/)?.[1].length??0;if(g<=l&&y.trim()!=="")break;let _=y.trim();if(_.startsWith("- ")&&(h===-1&&(h=g),g===h)){p&&m.push(p),p={};let b=_.slice(2);if(!b.includes(":"))p=b.replace(/^["']|["']$/g,"");else{let x=b.match(/^(\w+):\s*"?([^"]*)"?\s*$/);x&&(p={},p[x[1]]=x[2])}continue}if(p&&typeof p=="object"&&g>h)if(_.startsWith("- ")){let b=_.slice(2).replace(/^["']|["']$/g,""),x=Object.keys(p),P=x[x.length-1];P&&!Array.isArray(p[P])&&(p[P]=p[P]?[p[P]]:[]),P&&p[P].push(b)}else{let b=_.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(b){let x=b[2];p[b[1]]=/^\d+$/.test(x)?parseInt(x,10):x}}}return p&&m.push(p),m}function Gn(n,e,s,i){e||S("file path required"),e.includes("\0")&&S("file path contains null bytes");let t=qe.default.isAbsolute(e)?e:qe.default.join(n,e),r=Ce(t);if(!r){f({error:"File not found",path:e},i);return}let o=ne(r);if(s){let a=o[s];if(a===void 0){f({error:"Field not found",field:s},i);return}f({[s]:a},i,JSON.stringify(a))}else f(o,i)}function Vn(n,e,s,i,t){(!e||!s||i===void 0)&&S("file, field, and value required"),e.includes("\0")&&S("file path contains null bytes");let r=qe.default.isAbsolute(e)?e:qe.default.join(n,e);if(!Ve.default.existsSync(r)){f({error:"File not found",path:e},t);return}let o=Ve.default.readFileSync(r,"utf-8"),a=ne(o),l;try{l=JSON.parse(i)}catch{l=i}a[s]=l;let c=Dt(o,a);Ve.default.writeFileSync(r,$e(c),"utf-8"),f({updated:!0,field:s,value:l},t,"true")}function zn(n,e,s,i){(!e||!s)&&S("file and data required");let t=qe.default.isAbsolute(e)?e:qe.default.join(n,e);if(!Ve.default.existsSync(t)){f({error:"File not found",path:e},i);return}let r=Ve.default.readFileSync(t,"utf-8"),o=ne(r),a;try{a=JSON.parse(s)}catch{S("Invalid JSON for --data");return}Object.assign(o,a);let l=Dt(r,o);Ve.default.writeFileSync(t,$e(l),"utf-8"),f({merged:!0,fields:Object.keys(a)},i,"true")}function Bn(n,e,s,i){(!e||!s)&&S("file and schema required");let t=Ft[s];if(!t){S(`Unknown schema: ${s}. Available: ${Object.keys(Ft).join(", ")}`);return}let r=qe.default.isAbsolute(e)?e:qe.default.join(n,e),o=Ce(r);if(!o){f({error:"File not found",path:e},i);return}let a=ne(o),l=t.required.filter(d=>a[d]===void 0),c=t.required.filter(d=>a[d]!==void 0);f({valid:l.length===0,missing:l,present:c,schema:s},i,l.length===0?"valid":"invalid")}var Ve,qe,Ft,We=le(()=>{"use strict";Ve=N(require("fs")),qe=N(require("path"));me();Ft={plan:{required:["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"]},summary:{required:["phase","plan","subsystem","tags","duration","completed"]},verification:{required:["phase","verified","status","score"]}}});var dn={};ue(dn,{requireSafePath:()=>Ot,safeJsonParse:()=>Yn,sanitizeForDisplay:()=>bt,sanitizeForPrompt:()=>Tt,scanForInjection:()=>Hn,validateFieldName:()=>xt,validatePath:()=>_t});function Hn(n){let e=[];for(let s of Jn)s.test(n)&&e.push(s.source);return e}function Tt(n){if(!n)return n;let e=n.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>cn&&(e=e.slice(0,cn)+"... [truncated]"),e}function Yn(n,e={}){try{return{ok:!0,value:JSON.parse(n)}}catch(s){return{ok:!1,error:`Invalid ${e.label??"JSON"}: ${s.message}`}}}function _t(n,e,s={}){if(n.includes("\0"))return{safe:!1,resolved:n,error:"Path contains null bytes"};let i=St.default.isAbsolute(n)?n:St.default.resolve(e,n),t=process.env.HOME??"/";return!i.startsWith(t)&&!i.startsWith(e)?{safe:!1,resolved:i,error:"Path traversal rejected"}:!s.allowAbsolute&&St.default.isAbsolute(n)?{safe:!1,resolved:i,error:"Absolute paths not allowed"}:{safe:!0,resolved:i}}function Ot(n,e,s,i={}){let t=_t(n,e,i);if(!t.safe)throw new Error(`${s||"Path"} validation failed: ${t.error}`);return t.resolved}function bt(n){if(!n||typeof n!="string")return n;let e=n.replace(/[\u200B-\u200F\u2028-\u202F\uFEFF\u00AD]/g,"");return e=e.replace(/<(\/?)(?:system|assistant|human)>/gi,(s,i)=>`\uFF1C${i||""}system-text\uFF1E`),e=e.replace(/\[(SYSTEM|INST)\]/gi,"[$1-TEXT]"),e=e.replace(/<<\s*SYS\s*>>/gi,"\xABSYS-TEXT\xBB"),e}function xt(n){return!n||typeof n!="string"?{valid:!1,error:"Field name must be a non-empty string"}:/^[a-zA-Z][a-zA-Z0-9 _-]*$/.test(n)?{valid:!0}:{valid:!1,error:`Field name "${n}" contains invalid characters. Only letters, digits, spaces, hyphens, and underscores are allowed.`}}var St,Jn,cn,lt=le(()=>{"use strict";St=N(require("path")),Jn=[/ignore\s+(?:all\s+)?previous\s+instructions?/i,/forget\s+(?:all\s+)?previous/i,/\bsystem\s+prompt\b/i,/\bdisregard\s+(?:all\s+)?previous\b/i,/\byou\s+are\s+now\b/i,/\bact\s+as\s+(?:a\s+)?(?:new\s+)?(?:AI|assistant|gpt|claude|llm)\b/i,/\bpretend\s+(?:you\s+are|to\s+be)\b/i,/\boverride\s+(?:all\s+)?(?:previous\s+)?(?:instructions?|directives?|rules?|constraints?)\b/i,/\bdo\s+not\s+follow\s+(?:the\s+)?(?:previous\s+)?instructions?\b/i,/\bnew\s+instructions?:\s/i,/\bignore\s+(?:all\s+)?(?:previous\s+)?(?:context|history|instructions?)\b/i,/\bdeveloper\s+mode\b/i,/\bDAN\s+mode\b/i],cn=1e4});var Wt={};ue(Wt,{cmdSignalResume:()=>ps,cmdSignalWaiting:()=>ms,cmdStateAddBlocker:()=>os,cmdStateAddDecision:()=>rs,cmdStateAdvancePlan:()=>ns,cmdStateBeginPhase:()=>us,cmdStateGet:()=>Xn,cmdStateJson:()=>ds,cmdStateLoad:()=>Qn,cmdStatePatch:()=>es,cmdStateRecordMetric:()=>ss,cmdStateRecordSession:()=>ls,cmdStateResolveBlocker:()=>as,cmdStateSnapshot:()=>cs,cmdStateUpdate:()=>ts,cmdStateUpdateProgress:()=>is,stateExtractField:()=>V,stateReplaceField:()=>ge,stateReplaceFieldWithFallback:()=>pe,stripFrontmatter:()=>qt,writeStateMd:()=>Q});function Kn(n){return R(n).state}function V(n,e){let s=K(e),i=n.match(new RegExp(`\\*\\*${s}:\\*\\*\\s*(.+)`,"i"));if(i)return i[1].trim();let t=n.match(new RegExp(`^${s}:\\s*(.+)`,"im"));return t?t[1].trim():null}function ge(n,e,s){let i=K(e),t=new RegExp(`(\\*\\*${i}:\\*\\*\\s*)(.*)`,"i");if(t.test(n))return n.replace(t,(o,a)=>`${a}${s}`);let r=new RegExp(`(^${i}:\\s*)(.*)`,"im");return r.test(n)?n.replace(r,(o,a)=>`${a}${s}`):null}function pe(n,e,s,i){let t=ge(n,e,i);if(t)return t;if(s){let r=ge(n,s,i);if(r)return r}return n}function un(n,e){let s=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,i=n.match(s);if(!i)return n;let t=i[2];return e.status&&/^Status:/m.test(t)&&(t=t.replace(/^Status:.*$/m,`Status: ${e.status}`)),e.lastActivity&&/^Last activity:/im.test(t)&&(t=t.replace(/^Last activity:.*$/im,`Last activity: ${e.lastActivity}`)),e.plan&&/^Plan:/m.test(t)&&(t=t.replace(/^Plan:.*$/m,`Plan: ${e.plan}`)),n.replace(s,`${i[1]}${t}`)}function Nt(n,e,s,i){if(!s)return e??"";let t=_t(s,n,{allowAbsolute:!0});if(!t.safe)throw new Error(`${i} path rejected: ${t.error}`);try{return j.default.readFileSync(t.resolved,"utf-8").trimEnd()}catch{throw new Error(`${i} file not found: ${s}`)}}function qt(n){let e=n;for(;;){let s=e.replace(/^\s*---\r?\n[\s\S]*?\r?\n---\s*/,"");if(s===e)break;e=s}return e}function mn(n,e){let s=V(n,"Current Phase"),i=V(n,"Current Phase Name"),t=V(n,"Current Plan"),r=V(n,"Total Phases"),o=V(n,"Total Plans in Phase"),a=V(n,"Status"),l=V(n,"Progress"),c=V(n,"Last Activity"),d=V(n,"Stopped At")||V(n,"Stopped at"),u=V(n,"Paused At"),m=null,p=null;if(e)try{let F=te(e);m=F.version,p=F.name}catch{}let h=r?parseInt(r,10):null,y=null,g=o?parseInt(o,10):null,_=null;if(e)try{let F=R(e).phases;if(j.default.existsSync(F)){let A=ve(e),T=j.default.readdirSync(F,{withFileTypes:!0}).filter(ae=>ae.isDirectory()).map(ae=>ae.name).filter(A),O=0,W=0,X=0;for(let ae of T){let be=j.default.readdirSync(Ie.default.join(F,ae)),ee=be.filter(we=>we.match(/-PLAN\.md$/i)).length,de=be.filter(we=>we.match(/-SUMMARY\.md$/i)).length;O+=ee,W+=de,ee>0&&de>=ee&&X++}h=A.phaseCount>0?Math.max(T.length,A.phaseCount):T.length,y=X,g=O,_=W}}catch{}let b=null;if(l){let F=l.match(/(\d+)%/);F&&(b=parseInt(F[1],10))}let x=a??"unknown",P=(a??"").toLowerCase();P.includes("paused")||P.includes("stopped")||u?x="paused":P.includes("executing")||P.includes("in progress")?x="executing":P.includes("planning")||P.includes("ready to plan")?x="planning":P.includes("discussing")?x="discussing":P.includes("verif")?x="verifying":P.includes("complete")||P.includes("done")?x="completed":P.includes("ready to execute")&&(x="executing");let v={gsd_state_version:"1.0"};m&&(v.milestone=m),p&&(v.milestone_name=p),s&&(v.current_phase=s),i&&(v.current_phase_name=i),t&&(v.current_plan=t),v.status=x,d&&(v.stopped_at=d),u&&(v.paused_at=u),v.last_updated=new Date().toISOString(),c&&(v.last_activity=c);let k={};return h!==null&&(k.total_phases=h),y!==null&&(k.completed_phases=y),g!==null&&(k.total_plans=g),_!==null&&(k.completed_plans=_),b!==null&&(k.percent=b),Object.keys(k).length>0&&(v.progress=k),v}function Zn(n,e){let s=ne(n),i=qt(n),t=mn(i,e);return t.status==="unknown"&&s.status&&s.status!=="unknown"&&(t.status=s.status),`---
152
+ ${Qe(t)}
153
+ ---
154
+
155
+ ${i}`}function Q(n,e,s){let i=Zn(e,s),t=n+".lock",r=10,o=200;for(let a=0;a<r;a++)try{let l=j.default.openSync(t,j.default.constants.O_CREAT|j.default.constants.O_EXCL|j.default.constants.O_WRONLY);j.default.writeSync(l,String(process.pid)),j.default.closeSync(l);break}catch(l){if(l.code==="EEXIST"){try{let u=j.default.statSync(t);if(Date.now()-u.mtimeMs>1e4){j.default.unlinkSync(t);continue}}catch{continue}if(a===r-1){try{j.default.unlinkSync(t)}catch{}break}let c=Date.now(),d=Math.floor(Math.random()*50);for(;Date.now()-c<o+d;);continue}break}try{j.default.writeFileSync(n,$e(i),"utf-8")}finally{try{j.default.unlinkSync(t)}catch{}}}function Qn(n,e){let s=B(n),i=R(n).planning,t="";try{t=j.default.readFileSync(Ie.default.join(i,"STATE.md"),"utf-8")}catch{}let r=j.default.existsSync(Ie.default.join(i,"config.json")),o=j.default.existsSync(Ie.default.join(i,"ROADMAP.md")),a=t.length>0;if(e){let l=s,c=[`model_profile=${l.model_profile}`,`commit_docs=${l.commit_docs}`,`branching_strategy=${l.branching_strategy}`,`phase_branch_template=${l.phase_branch_template}`,`milestone_branch_template=${l.milestone_branch_template}`,`parallelization=${l.parallelization}`,`research=${l.research}`,`plan_checker=${l.plan_checker}`,`verifier=${l.verifier}`,`config_exists=${r}`,`roadmap_exists=${o}`,`state_exists=${a}`];process.stdout.write(c.join(`
156
+ `)),process.exit(0)}f({config:s,state_raw:t,state_exists:a,roadmap_exists:o,config_exists:r})}function Xn(n,e,s){let i=R(n).state;try{let t=j.default.readFileSync(i,"utf-8");if(!e){f({content:t},s,t);return}let r=K(e),o=t.match(new RegExp(`\\*\\*${r}:\\*\\*\\s*(.*)`,"i"));if(o){f({[e]:o[1].trim()},s,o[1].trim());return}let a=t.match(new RegExp(`^${r}:\\s*(.*)`,"im"));if(a){f({[e]:a[1].trim()},s,a[1].trim());return}let l=t.match(new RegExp(`##\\s*${r}\\s*
157
+ ([\\s\\S]*?)(?=\\n##|$)`,"i"));if(l){f({[e]:l[1].trim()},s,l[1].trim());return}f({error:`Section or field "${e}" not found`},s,"")}catch{S("STATE.md not found")}}function es(n,e,s){for(let t of Object.keys(e)){let r=xt(t);r.valid||S(`state patch: ${r.error}`)}let i=R(n).state;try{let t=j.default.readFileSync(i,"utf-8"),r={updated:[],failed:[]};for(let[o,a]of Object.entries(e)){let l=K(o),c=new RegExp(`(\\*\\*${l}:\\*\\*\\s*)(.*)`,"i"),d=new RegExp(`(^${l}:\\s*)(.*)`,"im");c.test(t)?(t=t.replace(c,(u,m)=>`${m}${a}`),r.updated.push(o)):d.test(t)?(t=t.replace(d,(u,m)=>`${m}${a}`),r.updated.push(o)):r.failed.push(o)}r.updated.length>0&&Q(i,t,n),f(r,s,r.updated.length>0?"true":"false")}catch{S("STATE.md not found")}}function ts(n,e,s){(!e||s===void 0)&&S("field and value required for state update");let i=xt(e);i.valid||S(`state update: ${i.error}`);let t=R(n).state;try{let r=j.default.readFileSync(t,"utf-8"),o=K(e),a=new RegExp(`(\\*\\*${o}:\\*\\*\\s*)(.*)`,"i"),l=new RegExp(`(^${o}:\\s*)(.*)`,"im");a.test(r)?(r=r.replace(a,(c,d)=>`${d}${s}`),Q(t,r,n),f({updated:!0})):l.test(r)?(r=r.replace(l,(c,d)=>`${d}${s}`),Q(t,r,n),f({updated:!0})):f({updated:!1,reason:`Field "${e}" not found in STATE.md`})}catch{f({updated:!1,reason:"STATE.md not found"})}}function ns(n,e){let s=R(n).state;if(!j.default.existsSync(s)){f({error:"STATE.md not found"},e);return}let i=j.default.readFileSync(s,"utf-8"),t=new Date().toISOString().split("T")[0],r=V(i,"Current Plan"),o=V(i,"Total Plans in Phase"),a=V(i,"Plan"),l,c,d=!1;if(r&&o)l=parseInt(r,10),c=parseInt(o,10);else if(a){l=parseInt(a,10);let u=a.match(/of\s+(\d+)/);c=u?parseInt(u[1],10):NaN,d=!0}else{f({error:"Cannot parse plan fields from STATE.md"},e);return}if(isNaN(l)||isNaN(c)){f({error:"Cannot parse Current Plan or Total Plans in Phase from STATE.md"},e);return}if(l>=c)i=pe(i,"Status",null,"Phase complete - ready for verification"),i=pe(i,"Last Activity","Last activity",t),i=un(i,{status:"Phase complete - ready for verification",lastActivity:t}),Q(s,i,n),f({advanced:!1,reason:"last_plan",current_plan:l,total_plans:c,status:"ready_for_verification"},e,"false");else{let u=l+1,m;d&&a?(m=a.replace(/^\d+/,String(u)),i=ge(i,"Plan",m)??i):(m=`${u} of ${c}`,i=ge(i,"Current Plan",String(u))??i),i=pe(i,"Status",null,"Ready to execute"),i=pe(i,"Last Activity","Last activity",t),i=un(i,{status:"Ready to execute",lastActivity:t,plan:m}),Q(s,i,n),f({advanced:!0,previous_plan:l,current_plan:u,total_plans:c},e,"true")}}function ss(n,e,s){let i=R(n).state;if(!j.default.existsSync(i)){f({error:"STATE.md not found"},s);return}let{phase:t,plan:r,duration:o,tasks:a,files:l}=e;if(!t||!r||!o){f({error:"phase, plan, and duration required"},s);return}let c=j.default.readFileSync(i,"utf-8"),d=/(##\s*Performance Metrics[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n)([\s\S]*?)(?=\n##|\n$|$)/i,u=c.match(d);if(u){let m=u[2].trimEnd(),p=`| Phase ${t} P${r} | ${o} | ${a??"-"} tasks | ${l??"-"} files |`;m=!m.trim()||m.includes("None yet")?p:m+`
158
+ `+p,c=c.replace(d,(h,y)=>`${y}${m}
159
+ `),Q(i,c,n),f({recorded:!0,phase:t,plan:r,duration:o},s,"true")}else f({recorded:!1,reason:"Performance Metrics section not found in STATE.md"},s,"false")}function is(n,e){let s=R(n).state;if(!j.default.existsSync(s)){f({error:"STATE.md not found"},e);return}let i=j.default.readFileSync(s,"utf-8"),t=R(n).phases,r=0,o=0;if(j.default.existsSync(t)){let h=ve(n),y=j.default.readdirSync(t,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).filter(h);for(let g of y){let _=j.default.readdirSync(Ie.default.join(t,g));r+=_.filter(b=>b.match(/-PLAN\.md$/i)).length,o+=_.filter(b=>b.match(/-SUMMARY\.md$/i)).length}}let a=r>0?Math.min(100,Math.round(o/r*100)):0,l=10,c=Math.round(a/100*l),u=`[${"\u2588".repeat(c)+"\u2591".repeat(l-c)}] ${a}%`,m=/(\*\*Progress:\*\*\s*).*/i,p=/^(Progress:\s*).*/im;m.test(i)?(i=i.replace(m,(h,y)=>`${y}${u}`),Q(s,i,n),f({updated:!0,percent:a,completed:o,total:r,bar:u},e,u)):p.test(i)?(i=i.replace(p,(h,y)=>`${y}${u}`),Q(s,i,n),f({updated:!0,percent:a,completed:o,total:r,bar:u},e,u)):f({updated:!1,reason:"Progress field not found in STATE.md"},e,"false")}function rs(n,e,s){let i=R(n).state;if(!j.default.existsSync(i)){f({error:"STATE.md not found"},s);return}let{phase:t,summary:r,summary_file:o,rationale:a,rationale_file:l}=e,c=null,d="";try{c=Nt(n,r??null,o??null,"summary"),d=Nt(n,a??"",l??null,"rationale")}catch(y){f({added:!1,reason:y.message},s,"false");return}if(!c){f({error:"summary required"},s);return}let u=j.default.readFileSync(i,"utf-8"),m=`- [Phase ${t??"?"}]: ${c}${d?` - ${d}`:""}`,p=/(###?\s*(?:Decisions|Decisions Made|Accumulated.*Decisions)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,h=u.match(p);if(h){let y=h[2].replace(/None yet\.?\s*\n?/gi,"").replace(/No decisions yet\.?\s*\n?/gi,"");y=y.trimEnd()+`
160
+ `+m+`
161
+ `,u=u.replace(p,(g,_)=>`${_}${y}`),Q(i,u,n),f({added:!0,decision:m},s,"true")}else f({added:!1,reason:"Decisions section not found in STATE.md"},s,"false")}function os(n,e,s){let i=R(n).state;if(!j.default.existsSync(i)){f({error:"STATE.md not found"},s);return}let t=typeof e=="object"&&e!==null?e:{text:e},r=null;try{r=Nt(n,t.text??null,t.text_file??null,"blocker")}catch(d){f({added:!1,reason:d.message},s,"false");return}if(!r){f({error:"text required"},s);return}let o=j.default.readFileSync(i,"utf-8"),a=`- ${r}`,l=/(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,c=o.match(l);if(c){let d=c[2].replace(/None\.?\s*\n?/gi,"").replace(/None yet\.?\s*\n?/gi,"");d=d.trimEnd()+`
162
+ `+a+`
163
+ `,o=o.replace(l,(u,m)=>`${m}${d}`),Q(i,o,n),f({added:!0,blocker:r},s,"true")}else f({added:!1,reason:"Blockers section not found in STATE.md"},s,"false")}function as(n,e,s){let i=R(n).state;if(!j.default.existsSync(i)){f({error:"STATE.md not found"},s);return}if(!e){f({error:"text required"},s);return}let t=j.default.readFileSync(i,"utf-8"),r=/(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,o=t.match(r);if(o){let c=o[2].split(`
164
+ `).filter(d=>!d.startsWith("- ")||!d.toLowerCase().includes(e.toLowerCase())).join(`
165
+ `);(!c.trim()||!c.includes("- "))&&(c=`None
166
+ `),t=t.replace(r,(d,u)=>`${u}${c}`),Q(i,t,n),f({resolved:!0,blocker:e},s,"true")}else f({resolved:!1,reason:"Blockers section not found in STATE.md"},s,"false")}function ls(n,e,s){let i=R(n).state;if(!j.default.existsSync(i)){f({error:"STATE.md not found"},s);return}let t=j.default.readFileSync(i,"utf-8"),r=new Date().toISOString(),o=[],a=d=>{let u=ge(t,d,r);u&&(t=u,o.push(d))};if(a("Last session"),a("Last Date"),e.stopped_at){let d=ge(t,"Stopped At",e.stopped_at)??ge(t,"Stopped at",e.stopped_at);d&&(t=d,o.push("Stopped At"))}let l=e.resume_file??"None",c=ge(t,"Resume File",l)??ge(t,"Resume file",l);c&&(t=c,o.push("Resume File")),o.length>0?(Q(i,t,n),f({recorded:!0,updated:o},s,"true")):f({recorded:!1,reason:"No session fields found in STATE.md"},s,"false")}function cs(n,e){let s=Kn(n);if(!j.default.existsSync(s)){f({error:"STATE.md not found"},e);return}let i=j.default.readFileSync(s,"utf-8"),t=u=>V(i,u),r=[],o=i.match(/##\s*Decisions Made[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n([\s\S]*?)(?=\n##|\n$|$)/i);if(o)for(let u of o[1].trim().split(`
167
+ `).filter(m=>m.includes("|"))){let m=u.split("|").map(p=>p.trim()).filter(Boolean);m.length>=3&&r.push({phase:m[0],summary:m[1],rationale:m[2]})}let a=[],l=i.match(/##\s*Blockers\s*\n([\s\S]*?)(?=\n##|$)/i);if(l)for(let u of l[1].match(/^-\s+(.+)$/gm)??[])a.push(u.replace(/^-\s+/,"").trim());let c={last_date:null,stopped_at:null,resume_file:null},d=i.match(/##\s*Session\s*\n([\s\S]*?)(?=\n##|$)/i);if(d){let u=d[1];c.last_date=(u.match(/\*\*Last Date:\*\*\s*(.+)/i)??u.match(/^Last Date:\s*(.+)/im))?.[1]?.trim()??null,c.stopped_at=(u.match(/\*\*Stopped At:\*\*\s*(.+)/i)??u.match(/^Stopped At:\s*(.+)/im))?.[1]?.trim()??null,c.resume_file=(u.match(/\*\*Resume File:\*\*\s*(.+)/i)??u.match(/^Resume File:\s*(.+)/im))?.[1]?.trim()??null}f({current_phase:t("Current Phase"),current_phase_name:t("Current Phase Name"),total_phases:t("Total Phases")?parseInt(t("Total Phases"),10):null,current_plan:t("Current Plan"),total_plans_in_phase:t("Total Plans in Phase")?parseInt(t("Total Plans in Phase"),10):null,status:t("Status"),progress_percent:t("Progress")?parseInt(t("Progress").replace("%",""),10):null,last_activity:t("Last Activity"),last_activity_desc:t("Last Activity Description"),decisions:r,blockers:a,paused_at:t("Paused At"),session:c},e)}function ds(n,e){let s=R(n).state;if(!j.default.existsSync(s)){f({error:"STATE.md not found"},e,"STATE.md not found");return}let i=j.default.readFileSync(s,"utf-8"),t=ne(i);if(!t||Object.keys(t).length===0){let r=qt(i),o=mn(r,n);f(o,e,JSON.stringify(o,null,2));return}f(t,e,JSON.stringify(t,null,2))}function us(n,e,s,i,t){let r=R(n).state;if(!j.default.existsSync(r)){f({error:"STATE.md not found"},t);return}let o=j.default.readFileSync(r,"utf-8"),a=new Date().toISOString().split("T")[0],l=[],c=(h,y)=>{let g=ge(o,h,y);g&&(o=g,l.push(h))};c("Status",`Executing Phase ${e}`),c("Last Activity",a),c("Last Activity Description",`Phase ${e} execution started`),c("Current Phase",String(e)),s&&c("Current Phase Name",s),c("Current Plan","1"),i&&c("Total Plans in Phase",String(i));let d=s?`Phase ${e} - ${s}`:`Phase ${e}`,u=/(\*\*Current focus:\*\*\s*).*/i;u.test(o)&&(o=o.replace(u,(h,y)=>`${y}${d}`),l.push("Current focus"));let m=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,p=o.match(m);if(p){let h=p[1],y=p[2],g=`Phase: ${e}${s?` (${s})`:""} - EXECUTING`;y=/^Phase:/m.test(y)?y.replace(/^Phase:.*$/m,g):g+`
168
+ `+y;let _=`Plan: 1 of ${i??"?"}`;y=/^Plan:/m.test(y)?y.replace(/^Plan:.*$/m,_):y.replace(/^(Phase:.*$)/m,`$1
169
+ ${_}`),/^Status:/m.test(y)&&(y=y.replace(/^Status:.*$/m,`Status: Executing Phase ${e}`)),/^Last activity:/im.test(y)&&(y=y.replace(/^Last activity:.*$/im,`Last activity: ${a} -- Phase ${e} execution started`)),o=o.replace(m,`${h}${y}`),l.push("Current Position")}l.length>0&&Q(r,o,n),f({updated:l,phase:e,phase_name:s??null,plan_count:i??null},t,l.length>0?"true":"false")}function ms(n,e,s,i,t,r){let o=j.default.existsSync(Ie.default.join(n,".gsd"))?Ie.default.join(n,".gsd"):w(n),a=Ie.default.join(o,"WAITING.json"),l={status:"waiting",type:e??"decision_point",question:s??null,options:i?i.split("|").map(c=>c.trim()):[],since:new Date().toISOString(),phase:t??null};try{j.default.mkdirSync(o,{recursive:!0}),j.default.writeFileSync(a,JSON.stringify(l,null,2),"utf-8"),f({signaled:!0,path:a},r,"true")}catch(c){f({signaled:!1,error:c.message},r,"false")}}function ps(n,e){let s=[Ie.default.join(n,".gsd","WAITING.json"),Ie.default.join(w(n),"WAITING.json")],i=!1;for(let t of s)if(j.default.existsSync(t))try{j.default.unlinkSync(t),i=!0}catch{}f({resumed:!0,removed:i},e,i?"true":"false")}var j,Ie,ze=le(()=>{"use strict";j=N(require("fs")),Ie=N(require("path"));me();We();lt()});var fe={};ue(fe,{cmdCommit:()=>bs,cmdCommitToSubrepo:()=>xs,cmdCurrentTimestamp:()=>hs,cmdGenerateSlug:()=>fs,cmdHistoryDigest:()=>Ss,cmdListTodos:()=>gs,cmdProgressRender:()=>Ps,cmdResolveModel:()=>_s,cmdScaffold:()=>Rs,cmdStats:()=>js,cmdSummaryExtract:()=>vs,cmdTodoComplete:()=>$s,cmdTodoMatchPhase:()=>As,cmdVerifyPathExists:()=>ys,cmdWebsearch:()=>ks});function fs(n,e){n||S("text required for slug generation");let s=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");f({slug:s},e,s)}function hs(n,e){let s=new Date,i;n==="date"?i=s.toISOString().split("T")[0]:n==="filename"?i=s.toISOString().replace(/:/g,"-").replace(/\..+/,""):i=s.toISOString(),f({timestamp:i},e,i)}function gs(n,e,s){let i=z.default.join(w(n),"todos","pending"),t=0,r=[];try{let o=q.default.readdirSync(i).filter(a=>a.endsWith(".md"));for(let a of o)try{let l=q.default.readFileSync(z.default.join(i,a),"utf-8"),c=l.match(/^created:\s*(.+)$/m),d=l.match(/^title:\s*(.+)$/m),u=l.match(/^area:\s*(.+)$/m),m=u?u[1].trim():"general";if(e&&m!==e)continue;t++,r.push({file:a,created:c?c[1].trim():"unknown",title:d?d[1].trim():"Untitled",area:m,path:G(z.default.relative(n,z.default.join(i,a)))})}catch{}}catch{}f({count:t,todos:r},s,t.toString())}function ys(n,e,s){e||S("path required for verification"),e.includes("\0")&&S("path contains null bytes");let i=z.default.isAbsolute(e)?e:z.default.join(n,e);try{let t=q.default.statSync(i);f({exists:!0,type:t.isDirectory()?"directory":t.isFile()?"file":"other"},s,"true")}catch{f({exists:!1,type:null},s,"false")}}function Ss(n,e){let s=R(n).phases,i={phases:{},decisions:[],tech_stack:new Set},t=[];for(let r of ht(n))t.push({name:r.name,fullPath:r.fullPath,milestone:r.milestone});if(q.default.existsSync(s))try{for(let r of q.default.readdirSync(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())t.push({name:r,fullPath:z.default.join(s,r),milestone:null})}catch{}if(t.length===0){i.tech_stack=[],f(i,e);return}try{for(let{name:r,fullPath:o}of t){let a=q.default.readdirSync(o).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of a)try{let c=q.default.readFileSync(z.default.join(o,l),"utf-8"),d=ne(c),u=d.phase||r.split("-")[0];i.phases[u]||(i.phases[u]={name:d.name||r.split("-").slice(1).join(" ")||"Unknown",provides:new Set,affects:new Set,patterns:new Set}),d["dependency-graph"]?.provides?d["dependency-graph"].provides.forEach(m=>i.phases[u].provides.add(m)):d.provides&&d.provides.forEach(m=>i.phases[u].provides.add(m)),d["dependency-graph"]?.affects&&d["dependency-graph"].affects.forEach(m=>i.phases[u].affects.add(m)),d["patterns-established"]&&d["patterns-established"].forEach(m=>i.phases[u].patterns.add(m)),d["key-decisions"]&&d["key-decisions"].forEach(m=>i.decisions.push({phase:u,decision:m})),d["tech-stack"]?.added&&d["tech-stack"].added.forEach(m=>i.tech_stack.add(typeof m=="string"?m:m.name))}catch{}}Object.keys(i.phases).forEach(r=>{i.phases[r].provides=[...i.phases[r].provides],i.phases[r].affects=[...i.phases[r].affects],i.phases[r].patterns=[...i.phases[r].patterns]}),i.tech_stack=[...i.tech_stack],f(i,e)}catch(r){S("Failed to generate history digest: "+r.message)}}function _s(n,e,s){e||S("agent-type required");let i=B(n),t=Z(n,e),r=Pe[e];f(r?{model:t,profile:i.model_profile}:{model:t,profile:i.model_profile,unknown_agent:!0},s,t)}function bs(n,e,s,i,t=!1,r=!1){!e&&!t&&S("commit message required");let o=e;o&&(o=Tt(o));let a=B(n);if(!a.commit_docs){f({committed:!1,hash:null,reason:"skipped_commit_docs_false"},i,"skipped");return}if(wt(n,".planning")){f({committed:!1,hash:null,reason:"skipped_gitignored"},i,"skipped");return}if(a.branching_strategy&&a.branching_strategy!=="none"){let p=null;if(a.branching_strategy==="phase"){let h=(s||[]).join(" ").match(/(\d+)-/);if(h){let y=ce(n,h[1]);y&&(p=a.phase_branch_template.replace("{phase}",y.phase_number).replace("{slug}",y.phase_slug||"phase"))}}else if(a.branching_strategy==="milestone"){let h=te(n);h?.version&&(p=a.milestone_branch_template.replace("{milestone}",h.version).replace("{slug}",Fe(h.name)||"milestone"))}if(p){let h=ie(n,["rev-parse","--abbrev-ref","HEAD"]);h.exitCode===0&&h.stdout.trim()!==p&&ie(n,["checkout","-b",p]).exitCode!==0&&ie(n,["checkout",p])}}let l=s&&s.length>0?s:[".planning/"];for(let p of l){let h=z.default.join(n,p);q.default.existsSync(h)?ie(n,["add",p]):ie(n,["rm","--cached","--ignore-unmatch",p])}let c=t?["commit","--amend","--no-edit"]:["commit","-m",o];r&&c.push("--no-verify");let d=ie(n,c);if(d.exitCode!==0){if(d.stdout.includes("nothing to commit")||d.stderr.includes("nothing to commit")){f({committed:!1,hash:null,reason:"nothing_to_commit"},i,"nothing");return}f({committed:!1,hash:null,reason:"nothing_to_commit",error:d.stderr},i,"nothing");return}let u=ie(n,["rev-parse","--short","HEAD"]),m=u.exitCode===0?u.stdout:null;f({committed:!0,hash:m,reason:"committed"},i,m||"committed")}function xs(n,e,s,i){e||S("commit message required");let r=B(n).sub_repos;(!r||r.length===0)&&S("no sub_repos configured in .planning/config.json"),(!s||s.length===0)&&S("--files required for commit-to-subrepo");let o={},a=[];for(let c of s){let d=r.find(u=>c.startsWith(u+"/"));d?(o[d]||(o[d]=[]),o[d].push(c)):a.push(c)}a.length>0&&process.stderr.write(`Warning: ${a.length} file(s) did not match any sub-repo prefix: ${a.join(", ")}
170
+ `);let l={};for(let[c,d]of Object.entries(o)){let u=z.default.join(n,c);for(let h of d)ie(u,["add",h.slice(c.length+1)]);let m=ie(u,["commit","-m",e]);if(m.exitCode!==0){l[c]={committed:!1,hash:null,files:d,reason:m.stdout.includes("nothing to commit")?"nothing_to_commit":"error",error:m.stderr};continue}let p=ie(u,["rev-parse","--short","HEAD"]);l[c]={committed:!0,hash:p.exitCode===0?p.stdout:null,files:d}}f({committed:Object.values(l).some(c=>c.committed),repos:l,unmatched:a.length>0?a:void 0},i,Object.entries(l).map(([c,d])=>`${c}:${d.hash||"skip"}`).join(" "))}function vs(n,e,s,i){e||S("summary-path required for summary-extract");let t=z.default.join(n,e);if(!q.default.existsSync(t)){f({error:"File not found",path:e},i);return}let r=q.default.readFileSync(t,"utf-8"),o=ne(r),a=c=>(c||[]).map(d=>{let u=d.indexOf(":");return u>0?{summary:d.substring(0,u).trim(),rationale:d.substring(u+1).trim()}:{summary:d,rationale:null}}),l={path:e,one_liner:o["one-liner"]||gt(r)||null,key_files:o["key-files"]||[],tech_added:o["tech-stack"]?.added||[],patterns:o["patterns-established"]||[],decisions:a(o["key-decisions"]),requirements_completed:o["requirements-completed"]||[]};if(s&&s.length>0){let c={path:e};for(let d of s)l[d]!==void 0&&(c[d]=l[d]);f(c,i);return}f(l,i)}async function ks(n,e,s){let i=process.env.BRAVE_API_KEY;if(!i){f({available:!1,reason:"BRAVE_API_KEY not set"},s,"");return}if(!n){f({available:!1,error:"Query required"},s,"");return}let t=new URLSearchParams({q:n,count:String(e.limit||10),country:"us",search_lang:"en",text_decorations:"false"});e.freshness&&t.set("freshness",e.freshness);try{let r=await fetch(`https://api.search.brave.com/res/v1/web/search?${t}`,{headers:{Accept:"application/json","X-Subscription-Token":i}});if(!r.ok){f({available:!1,error:`API error: ${r.status}`},s,"");return}let a=((await r.json()).web?.results||[]).map(l=>({title:l.title,url:l.url,description:l.description,age:l.age||null}));f({available:!0,query:n,count:a.length,results:a},s,a.map(l=>`${l.title}
171
+ ${l.url}
172
+ ${l.description}`).join(`
173
+
174
+ `))}catch(r){f({available:!1,error:r.message},s,"")}}function Ps(n,e,s){let i=R(n).phases,t=R(n).roadmap,r=te(n),o=[],a=0,l=0;try{let d=q.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).sort((u,m)=>xe(u,m));for(let u of d){let m=u.match(/^(\d+(?:\.\d+)*)-?(.*)/),p=m?m[1]:u,h=m&&m[2]?m[2].replace(/-/g," "):"",y=q.default.readdirSync(z.default.join(i,u)),g=y.filter(x=>x.endsWith("-PLAN.md")||x==="PLAN.md").length,_=y.filter(x=>x.endsWith("-SUMMARY.md")||x==="SUMMARY.md").length;a+=g,l+=_;let b;g===0?b="Pending":_>=g?b="Complete":_>0?b="In Progress":b="Planned",o.push({number:p,name:h,plans:g,summaries:_,status:b})}}catch{}let c=a>0?Math.min(100,Math.round(l/a*100)):0;if(e==="table"){let u=Math.round(c/100*10),m="\u2588".repeat(u)+"\u2591".repeat(10-u),p=`# ${r.version} ${r.name}
175
+
176
+ **Progress:** [${m}] ${l}/${a} plans (${c}%)
177
+
178
+ | Phase | Name | Plans | Status |
179
+ |-------|------|-------|--------|
180
+ `;for(let h of o)p+=`| ${h.number} | ${h.name} | ${h.summaries}/${h.plans} | ${h.status} |
181
+ `;f({rendered:p},s,p)}else if(e==="bar"){let u=Math.round(c/100*20),p=`[${"\u2588".repeat(u)+"\u2591".repeat(20-u)}] ${l}/${a} plans (${c}%)`;f({bar:p,percent:c,completed:l,total:a},s,p)}else f({milestone_version:r.version,milestone_name:r.name,phases:o,total_plans:a,total_summaries:l,percent:c},s)}function $s(n,e,s){e||S("filename required for todo complete");let i=z.default.join(w(n),"todos","pending"),t=z.default.join(w(n),"todos","completed"),r=z.default.join(i,e);q.default.existsSync(r)||S(`Todo not found: ${e}`),q.default.mkdirSync(t,{recursive:!0});let o=q.default.readFileSync(r,"utf-8"),a=new Date().toISOString().split("T")[0];o=`completed: ${a}
182
+ `+o,q.default.writeFileSync(z.default.join(t,e),o,"utf-8"),q.default.unlinkSync(r),f({completed:!0,file:e,date:a},s,"completed")}function As(n,e,s){e||S("phase required for todo match-phase");let i=z.default.join(w(n),"todos","pending"),t=[];try{for(let m of q.default.readdirSync(i).filter(p=>p.endsWith(".md")))try{let p=q.default.readFileSync(z.default.join(i,m),"utf-8"),h=p.match(/^title:\s*(.+)$/m),y=p.match(/^area:\s*(.+)$/m),g=p.match(/^files:\s*(.+)$/m),_=p.replace(/^(title|area|files|created|priority):.*$/gm,"").trim();t.push({file:m,title:h?h[1].trim():"Untitled",area:y?y[1].trim():"general",files:g?g[1].trim().split(/[,\s]+/).filter(Boolean):[],body:_.slice(0,200)})}catch{}}catch{}if(t.length===0){f({phase:e,matches:[],todo_count:0},s);return}let r=Ze(n,e),o=`${r?.phase_name??""} ${r?.goal??""} ${r?.section??""}`.toLowerCase(),a=new Set(["the","and","for","with","from","that","this","will","are","was","has","have","been","not","but","all","can","into","each","when","any","use","new"]),l=new Set(o.split(/[\s\-_/.,;:()[\]{}|]+/).map(m=>m.replace(/[^a-z0-9]/g,"")).filter(m=>m.length>2&&!a.has(m))),c=ce(n,e),d=[];if(c?.found)try{let m=z.default.join(n,c.directory);for(let p of q.default.readdirSync(m).filter(h=>h.endsWith("-PLAN.md")))try{let y=q.default.readFileSync(z.default.join(m,p),"utf-8").match(/files_modified:\s*\[([^\]]*)\]/);y&&d.push(...y[1].split(",").map(g=>g.trim().replace(/['"]/g,"")).filter(Boolean))}catch{}}catch{}let u=[];for(let m of t){let p=0,h=[],g=`${m.title} ${m.body}`.toLowerCase().split(/[\s\-_/.,;:()[\]{}|]+/).map(_=>_.replace(/[^a-z0-9]/g,"")).filter(_=>_.length>2&&!a.has(_)).filter(_=>l.has(_));if(g.length>0&&(p+=Math.min(g.length*.2,.6),h.push(`keywords: ${[...new Set(g)].slice(0,5).join(", ")}`)),m.area!=="general"&&o.includes(m.area.toLowerCase())&&(p+=.3,h.push(`area: ${m.area}`)),m.files.length>0&&d.length>0){let _=m.files.filter(b=>d.some(x=>x.includes(b)||b.includes(x)));_.length>0&&(p+=.4,h.push(`files: ${_.slice(0,3).join(", ")}`))}p>0&&u.push({file:m.file,title:m.title,area:m.area,score:Math.round(p*100)/100,reasons:h})}u.sort((m,p)=>p.score-m.score),f({phase:e,matches:u,todo_count:t.length},s)}function Rs(n,e,s,i){let{phase:t,name:r}=s,o=t?oe(t):"00",a=new Date().toISOString().split("T")[0],l=t?ce(n,t):null,c=l?z.default.join(n,l.directory):null;t&&!c&&e!=="phase-dir"&&S(`Phase ${t} directory not found`);let d,u;switch(e){case"context":d=z.default.join(c,`${o}-CONTEXT.md`),u=`---
183
+ phase: "${o}"
184
+ name: "${r||l?.phase_name||"Unnamed"}"
185
+ created: ${a}
186
+ ---
187
+
188
+ # Phase ${t}: ${r||l?.phase_name||"Unnamed"} - Context
189
+
190
+ ## Decisions
191
+
192
+ _Decisions will be captured during /gsd-discuss-phase ${t}_
193
+
194
+ ## Discretion Areas
195
+
196
+ _Areas where the executor can use judgment_
197
+
198
+ ## Deferred Ideas
199
+
200
+ _Ideas to consider later_
201
+ `;break;case"uat":d=z.default.join(c,`${o}-UAT.md`),u=`---
202
+ phase: "${o}"
203
+ name: "${r||l?.phase_name||"Unnamed"}"
204
+ created: ${a}
205
+ status: pending
206
+ ---
207
+
208
+ # Phase ${t}: ${r||l?.phase_name||"Unnamed"} - User Acceptance Testing
209
+
210
+ ## Test Results
211
+
212
+ | # | Test | Status | Notes |
213
+ |---|------|--------|-------|
214
+
215
+ ## Summary
216
+
217
+ _Pending UAT_
218
+ `;break;case"verification":d=z.default.join(c,`${o}-VERIFICATION.md`),u=`---
219
+ phase: "${o}"
220
+ name: "${r||l?.phase_name||"Unnamed"}"
221
+ created: ${a}
222
+ status: pending
223
+ ---
224
+
225
+ # Phase ${t}: ${r||l?.phase_name||"Unnamed"} - Verification
226
+
227
+ ## Goal-Backward Verification
228
+
229
+ **Phase Goal:** [From ROADMAP.md]
230
+
231
+ ## Checks
232
+
233
+ | # | Requirement | Status | Evidence |
234
+ |---|------------|--------|----------|
235
+
236
+ ## Result
237
+
238
+ _Pending verification_
239
+ `;break;case"phase-dir":{(!t||!r)&&S("phase and name required for phase-dir scaffold");let p=Fe(r),h=`${o}-${p}`,y=R(n).phases;q.default.mkdirSync(y,{recursive:!0});let g=z.default.join(y,h);q.default.mkdirSync(g,{recursive:!0}),f({created:!0,directory:G(z.default.relative(n,g)),path:g},i,g);return}default:S(`Unknown scaffold type: ${e}. Available: context, uat, verification, phase-dir`);return}if(q.default.existsSync(d)){f({created:!1,reason:"already_exists",path:d},i,"exists");return}q.default.writeFileSync(d,u,"utf-8");let m=G(z.default.relative(n,d));f({created:!0,path:m},i,m)}function js(n,e,s){let i=R(n).phases,t=R(n).roadmap,r=R(n).requirements,o=R(n).state,a=te(n),l=ve(n),c=new Map,d=0,u=0;try{let A=Se(q.default.readFileSync(t,"utf-8"),n),T=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,O;for(;(O=T.exec(A))!==null;)c.set(O[1],{number:O[1],name:O[2].replace(/\(INSERTED\)/i,"").trim(),plans:0,summaries:0,status:"Not Started"})}catch{}try{let A=q.default.readdirSync(i,{withFileTypes:!0}).filter(T=>T.isDirectory()).map(T=>T.name).filter(l).sort((T,O)=>xe(T,O));for(let T of A){let O=T.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),W=O?O[1]:T,X=O&&O[2]?O[2].replace(/-/g," "):"",ae=q.default.readdirSync(z.default.join(i,T)),be=ae.filter(Ne=>Ne.endsWith("-PLAN.md")||Ne==="PLAN.md").length,ee=ae.filter(Ne=>Ne.endsWith("-SUMMARY.md")||Ne==="SUMMARY.md").length;d+=be,u+=ee;let de;be===0?de="Not Started":ee>=be?de="Complete":ee>0?de="In Progress":de="Planned";let we=c.get(W);c.set(W,{number:W,name:we?.name||X,plans:be,summaries:ee,status:de})}}catch{}let m=[...c.values()].sort((A,T)=>xe(A.number,T.number)),p=m.filter(A=>A.status==="Complete").length,h=d>0?Math.min(100,Math.round(u/d*100)):0,y=m.length>0?Math.min(100,Math.round(p/m.length*100)):0,g=0,_=0;try{if(q.default.existsSync(r)){let A=q.default.readFileSync(r,"utf-8");_=(A.match(/^- \[x\] \*\*/gm)||[]).length,g=_+(A.match(/^- \[ \] \*\*/gm)||[]).length}}catch{}let b=null;try{if(q.default.existsSync(o)){let A=q.default.readFileSync(o,"utf-8");b=(A.match(/^last_activity:\s*(.+)$/im)??A.match(/\*\*Last Activity:\*\*\s*(.+)/i)??A.match(/^Last Activity:\s*(.+)$/im))?.[1]?.trim()??null}}catch{}let x=0,P=null,v=ie(n,["rev-list","--count","HEAD"]);v.exitCode===0&&(x=parseInt(v.stdout,10)||0);let k=ie(n,["rev-list","--max-parents=0","HEAD"]);if(k.exitCode===0&&k.stdout){let A=ie(n,["show","-s","--format=%as",k.stdout.split(`
240
+ `)[0].trim()]);A.exitCode===0&&(P=A.stdout||null)}let F={milestone_version:a.version,milestone_name:a.name,phases:m,phases_completed:p,phases_total:m.length,total_plans:d,total_summaries:u,percent:y,plan_percent:h,requirements_total:g,requirements_complete:_,git_commits:x,git_first_commit_date:P,last_activity:b};if(e==="table"){let T=Math.round(y/100*10),O="\u2588".repeat(T)+"\u2591".repeat(10-T),W=`# ${a.version} ${a.name} \u2014 Statistics
241
+
242
+ **Progress:** [${O}] ${p}/${m.length} phases (${y}%)
243
+ `;d>0&&(W+=`**Plans:** ${u}/${d} complete (${h}%)
244
+ `),W+=`**Phases:** ${p}/${m.length} complete
245
+ `,g>0&&(W+=`**Requirements:** ${_}/${g} complete
246
+ `),W+=`
247
+ | Phase | Name | Plans | Completed | Status |
248
+ |-------|------|-------|-----------|--------|
249
+ `;for(let X of m)W+=`| ${X.number} | ${X.name} | ${X.plans} | ${X.summaries} | ${X.status} |
250
+ `;x>0&&(W+=`
251
+ **Git:** ${x} commits`,P&&(W+=` (since ${P})`),W+=`
252
+ `),b&&(W+=`**Last activity:** ${b}
253
+ `),f({rendered:W},s,W)}else f(F,s)}var q,z,he=le(()=>{"use strict";q=N(require("fs")),z=N(require("path"));me();We();it();lt()});var ct={};ue(ct,{cmdFindPhase:()=>Es,cmdPhaseAdd:()=>ws,cmdPhaseComplete:()=>qs,cmdPhaseInsert:()=>Fs,cmdPhaseNextDecimal:()=>Is,cmdPhasePlanIndex:()=>Ms,cmdPhaseRemove:()=>Ns,cmdPhasesList:()=>Cs});function Cs(n,e,s){let i=M.default.join(w(n),"phases"),{type:t,phase:r,includeArchived:o}=e;if(!$.default.existsSync(i)){f(t?{files:[],count:0}:{directories:[],count:0},s,"");return}try{let a=$.default.readdirSync(i,{withFileTypes:!0}).filter(l=>l.isDirectory()).map(l=>l.name);if(o){let l=ht(n);for(let c of l)a.push(`${c.name} [${c.milestone}]`)}if(a.sort((l,c)=>xe(l,c)),r){let l=oe(r),c=a.find(d=>d.startsWith(l));if(!c){f({files:[],count:0,phase_dir:null,error:"Phase not found"},s,"");return}a=[c]}if(t){let l=[];for(let c of a){let d=M.default.join(i,c),u=$.default.readdirSync(d),m;t==="plans"?m=u.filter(p=>p.endsWith("-PLAN.md")||p==="PLAN.md"):t==="summaries"?m=u.filter(p=>p.endsWith("-SUMMARY.md")||p==="SUMMARY.md"):m=u,l.push(...m.sort())}f({files:l,count:l.length,phase_dir:r?a[0]?.replace(/^\d+(?:\.\d+)*-?/,""):null},s,l.join(`
254
+ `));return}f({directories:a,count:a.length},s,a.join(`
255
+ `))}catch(a){S("Failed to list phases: "+a.message)}}function Is(n,e,s){let i=M.default.join(w(n),"phases"),t=oe(e??"");if(!$.default.existsSync(i)){f({found:!1,base_phase:t,next:`${t}.1`,existing:[]},s,`${t}.1`);return}try{let r=$.default.readdirSync(i,{withFileTypes:!0}).filter(d=>d.isDirectory()).map(d=>d.name),o=r.some(d=>d.startsWith(t+"-")||d===t),a=new RegExp(`^${t}\\.(\\d+)`),l=r.map(d=>{let u=d.match(a);return u?`${t}.${u[1]}`:null}).filter(Boolean);l.sort((d,u)=>xe(d,u));let c=l.length===0?`${t}.1`:`${t}.${parseInt(l[l.length-1].split(".")[1],10)+1}`;f({found:o,base_phase:t,next:c,existing:l},s,c)}catch(r){S("Failed to calculate next decimal phase: "+r.message)}}function Es(n,e,s){e||S("phase identifier required");let i=M.default.join(w(n),"phases"),t=oe(e),r={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=$.default.readdirSync(i,{withFileTypes:!0}).filter(y=>y.isDirectory()).map(y=>y.name).sort((y,g)=>xe(y,g)).find(y=>y.startsWith(t));if(!a){f(r,s,"");return}let l=a.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),c=l?l[1]:t,d=l&&l[2]?l[2]:null,u=M.default.join(i,a),m=$.default.readdirSync(u),p=m.filter(y=>y.endsWith("-PLAN.md")||y==="PLAN.md").sort(),h=m.filter(y=>y.endsWith("-SUMMARY.md")||y==="SUMMARY.md").sort();f({found:!0,directory:G(M.default.join(M.default.relative(n,w(n)),"phases",a)),phase_number:c,phase_name:d,plans:p,summaries:h},s,G(M.default.join(M.default.relative(n,w(n)),"phases",a)))}catch{f(r,s,"")}}function Ms(n,e,s){e||S("phase required for phase-plan-index");let i=M.default.join(w(n),"phases"),t=oe(e),r=null;try{let y=$.default.readdirSync(i,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,_)=>xe(g,_)).find(g=>g.startsWith(t));y&&(r=M.default.join(i,y))}catch{}if(!r){f({phase:t,error:"Phase not found",plans:[],waves:{},incomplete:[],has_checkpoints:!1},s);return}let o=$.default.readdirSync(r),a=o.filter(h=>h.endsWith("-PLAN.md")||h==="PLAN.md").sort(),l=o.filter(h=>h.endsWith("-SUMMARY.md")||h==="SUMMARY.md"),c=new Set(l.map(h=>h.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),d=[],u={},m=[],p=!1;for(let h of a){let y=h.replace("-PLAN.md","").replace("PLAN.md",""),g=$.default.readFileSync(M.default.join(r,h),"utf-8"),_=ne(g),b=g.match(/<task[\s>]/gi)||[],x=g.match(/##\s*Task\s*\d+/gi)||[],P=b.length||x.length,v=parseInt(String(_.wave),10)||1,k=!0;_.autonomous!==void 0&&(k=_.autonomous==="true"||_.autonomous===!0),k||(p=!0);let F=[],A=_.files_modified||_["files-modified"];A&&(F=Array.isArray(A)?A:[A]);let T=c.has(y);T||m.push(y),d.push({id:y,wave:v,autonomous:k,objective:g.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()||_.objective||null,files_modified:F,task_count:P,has_summary:T});let O=String(v);u[O]||(u[O]=[]),u[O].push(y)}f({phase:t,plans:d,waves:u,incomplete:m,has_checkpoints:p},s)}function ws(n,e,s,i){e||S("description required for phase add");let t=B(n),r=M.default.join(w(n),"ROADMAP.md");$.default.existsSync(r)||S("ROADMAP.md not found");let o=$.default.readFileSync(r,"utf-8"),a=Se(o,n),l=Fe(e),c,d;if(i||t.phase_naming==="custom")c=i||l.toUpperCase().replace(/-/g,"-"),c||S('--id required when phase_naming is "custom"'),d=`${c}-${l}`;else{let g=/#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi,_=0,b;for(;(b=g.exec(a))!==null;){let P=parseInt(b[1],10);P>_&&(_=P)}c=_+1,d=`${String(c).padStart(2,"0")}-${l}`}let u=M.default.join(w(n),"phases",d);$.default.mkdirSync(u,{recursive:!0}),$.default.writeFileSync(M.default.join(u,".gitkeep"),"");let m=t.phase_naming==="custom"?"":`
256
+ **Depends on:** Phase ${typeof c=="number"?c-1:"TBD"}`,p=`
257
+ ### Phase ${c}: ${e}
258
+
259
+ **Goal:** [To be planned]
260
+ **Requirements**: TBD${m}
261
+ **Plans:** 0 plans
262
+
263
+ Plans:
264
+ - [ ] TBD (run /gsd-plan-phase ${c} to break down)
265
+ `,h=o.lastIndexOf(`
266
+ ---`),y=h>0?o.slice(0,h)+p+o.slice(h):o+p;$.default.writeFileSync(r,y,"utf-8"),f({phase_number:typeof c=="number"?c:String(c),padded:typeof c=="number"?String(c).padStart(2,"0"):String(c),name:e,slug:l,directory:G(M.default.join(M.default.relative(n,w(n)),"phases",d)),naming_mode:t.phase_naming},s,typeof c=="number"?String(c).padStart(2,"0"):String(c))}function Fs(n,e,s,i){(!e||!s)&&S("after-phase and description required for phase insert");let t=M.default.join(w(n),"ROADMAP.md");$.default.existsSync(t)||S("ROADMAP.md not found");let r=$.default.readFileSync(t,"utf-8"),o=Se(r,n),a=Fe(s),d=oe(e).replace(/^0+/,"").replace(/\./g,"\\.");new RegExp(`#{2,4}\\s*Phase\\s+0*${d}:`,"i").test(o)||S(`Phase ${e} not found in ROADMAP.md`);let m=M.default.join(w(n),"phases"),p=oe(e),h=[];try{let O=$.default.readdirSync(m,{withFileTypes:!0}).filter(X=>X.isDirectory()).map(X=>X.name),W=new RegExp(`^${p}\\.(\\d+)`);for(let X of O){let ae=X.match(W);ae&&h.push(parseInt(ae[1],10))}}catch{}let y=h.length===0?1:Math.max(...h)+1,g=`${p}.${y}`,_=`${g}-${a}`,b=M.default.join(w(n),"phases",_);$.default.mkdirSync(b,{recursive:!0}),$.default.writeFileSync(M.default.join(b,".gitkeep"),"");let x=`
267
+ ### Phase ${g}: ${s} (INSERTED)
268
+
269
+ **Goal:** [Urgent work - to be planned]
270
+ **Requirements**: TBD
271
+ **Depends on:** Phase ${e}
272
+ **Plans:** 0 plans
273
+
274
+ Plans:
275
+ - [ ] TBD (run /gsd-plan-phase ${g} to break down)
276
+ `,P=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),v=r.match(P);v||S(`Could not find Phase ${e} header`);let k=r.indexOf(v[0]),A=r.slice(k+v[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),T=A?k+v[0].length+A.index:r.length;$.default.writeFileSync(t,r.slice(0,T)+x+r.slice(T),"utf-8"),f({phase_number:g,after_phase:e,name:s,slug:a,directory:G(M.default.join(M.default.relative(n,w(n)),"phases",_))},i,g)}function Ds(n,e,s){let i=[],t=[],r=new RegExp(`^${e}\\.(\\d+)-(.+)$`),o=De(n,!0).map(a=>{let l=a.match(r);return l?{dir:a,oldDecimal:parseInt(l[1],10),slug:l[2]}:null}).filter(a=>a!==null&&a.oldDecimal>s).sort((a,l)=>l.oldDecimal-a.oldDecimal);for(let a of o){let l=a.oldDecimal-1,c=`${e}.${a.oldDecimal}`,d=`${e}.${l}`,u=`${e}.${l}-${a.slug}`;$.default.renameSync(M.default.join(n,a.dir),M.default.join(n,u)),i.push({from:a.dir,to:u});for(let m of $.default.readdirSync(M.default.join(n,u)))if(m.includes(c)){let p=m.replace(c,d);$.default.renameSync(M.default.join(n,u,m),M.default.join(n,u,p)),t.push({from:m,to:p})}}return{renamedDirs:i,renamedFiles:t}}function Ts(n,e){let s=[],i=[],t=De(n,!0).map(r=>{let o=r.match(/^(\d+)([A-Z])?(?:\.(\d+))?-(.+)$/i);if(!o)return null;let a=parseInt(o[1],10);return a>e?{dir:r,oldInt:a,letter:o[2]?o[2].toUpperCase():"",decimal:o[3]?parseInt(o[3],10):null,slug:o[4]}:null}).filter(r=>r!==null).sort((r,o)=>r.oldInt!==o.oldInt?o.oldInt-r.oldInt:(o.decimal||0)-(r.decimal||0));for(let r of t){let o=r.oldInt-1,a=String(o).padStart(2,"0"),l=String(r.oldInt).padStart(2,"0"),c=r.letter||"",d=r.decimal!==null?`.${r.decimal}`:"",u=`${l}${c}${d}`,m=`${a}${c}${d}`,p=`${m}-${r.slug}`;$.default.renameSync(M.default.join(n,r.dir),M.default.join(n,p)),s.push({from:r.dir,to:p});for(let h of $.default.readdirSync(M.default.join(n,p)))if(h.startsWith(u)){let y=m+h.slice(u.length);$.default.renameSync(M.default.join(n,p,h),M.default.join(n,p,y)),i.push({from:h,to:y})}}return{renamedDirs:s,renamedFiles:i}}function Os(n,e,s,i){let t=$.default.readFileSync(n,"utf-8"),r=K(e);if(t=t.replace(new RegExp(`\\n?#{2,4}\\s*Phase\\s+${r}\\s*:[\\s\\S]*?(?=\\n#{2,4}\\s+Phase\\s+\\d|$)`,"i"),""),t=t.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${r}[:\\s][^\\n]*`,"gi"),""),t=t.replace(new RegExp(`\\n?\\|\\s*${r}\\.?\\s[^|]*\\|[^\\n]*`,"gi"),""),!s)for(let o=99;o>i;o--){let a=o-1,l=String(o),c=String(a),d=l.padStart(2,"0"),u=c.padStart(2,"0");t=t.replace(new RegExp(`(#{2,4}\\s*Phase\\s+)${l}(\\s*:)`,"gi"),`$1${c}$2`),t=t.replace(new RegExp(`(Phase\\s+)${l}([:\\s])`,"g"),`$1${c}$2`),t=t.replace(new RegExp(`${d}-(\\d{2})`,"g"),`${u}-$1`),t=t.replace(new RegExp(`(\\|\\s*)${l}\\.\\s`,"g"),`$1${c}. `),t=t.replace(new RegExp(`(Depends on:\\*\\*\\s*Phase\\s+)${l}\\b`,"gi"),`$1${c}`)}$.default.writeFileSync(n,t,"utf-8")}function Ns(n,e,s,i){e||S("phase number required for phase remove");let t=M.default.join(w(n),"ROADMAP.md"),r=M.default.join(w(n),"phases");$.default.existsSync(t)||S("ROADMAP.md not found");let o=oe(e),a=e.includes("."),l=s.force||!1,c=De(r,!0).find(p=>p.startsWith(o+"-")||p===o)||null;if(c&&!l){let p=$.default.readdirSync(M.default.join(r,c)).filter(h=>h.endsWith("-SUMMARY.md")||h==="SUMMARY.md");p.length>0&&S(`Phase ${e} has ${p.length} executed plan(s). Use --force to remove anyway.`)}c&&$.default.rmSync(M.default.join(r,c),{recursive:!0,force:!0});let d=[],u=[];try{let p=a?Ds(r,o.split(".")[0],parseInt(o.split(".")[1],10)):Ts(r,parseInt(o,10));d=p.renamedDirs,u=p.renamedFiles}catch{}Os(t,e,a,parseInt(o,10));let m=M.default.join(w(n),"STATE.md");if($.default.existsSync(m)){let p=$.default.readFileSync(m,"utf-8"),h=V(p,"Total Phases");h&&(p=ge(p,"Total Phases",String(parseInt(h,10)-1))??p);let y=p.match(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i);y&&(p=p.replace(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i,`$1${parseInt(y[2],10)-1}$3`)),Q(m,p,n)}f({removed:e,directory_deleted:c,renamed_directories:d,renamed_files:u,roadmap_updated:!0,state_updated:$.default.existsSync(m)},i)}function qs(n,e,s){e||S("phase number required for phase complete");let i=M.default.join(w(n),"ROADMAP.md"),t=M.default.join(w(n),"STATE.md"),r=M.default.join(w(n),"phases"),o=oe(e),a=new Date().toISOString().split("T")[0],l=ce(n,e);l||S(`Phase ${e} not found`);let c=l.plans.length,d=l.summaries.length,u=!1,m=[];try{let g=M.default.join(n,l.directory),_=$.default.readdirSync(g);for(let b of _.filter(x=>x.includes("-UAT")&&x.endsWith(".md"))){let x=$.default.readFileSync(M.default.join(g,b),"utf-8");/result: pending/.test(x)&&m.push(`${b}: has pending tests`),/result: blocked/.test(x)&&m.push(`${b}: has blocked tests`),/status: partial/.test(x)&&m.push(`${b}: testing incomplete (partial)`),/status: diagnosed/.test(x)&&m.push(`${b}: has diagnosed gaps`)}for(let b of _.filter(x=>x.includes("-VERIFICATION")&&x.endsWith(".md"))){let x=$.default.readFileSync(M.default.join(g,b),"utf-8");/status: human_needed/.test(x)&&m.push(`${b}: needs human verification`),/status: gaps_found/.test(x)&&m.push(`${b}: has unresolved gaps`)}}catch{}if($.default.existsSync(i)){let g=$.default.readFileSync(i,"utf-8"),_=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${K(e)}[:\\s][^\\n]*)`,"i");g=Ke(g,_,`$1x$2 (completed ${a})`);let b=K(e);g=g.replace(new RegExp(`^(\\|\\s*${b}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),P=>{let v=P.split("|").slice(1,-1);return v.length===5?(v[3]=" Complete ",v[4]=` ${a} `):v.length===4&&(v[2]=" Complete ",v[3]=` ${a} `),"|"+v.join("|")+"|"}),g=Ke(g,new RegExp(`(#{2,4}\\s*Phase\\s+${b}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${c} plans complete`),$.default.writeFileSync(i,g,"utf-8");let x=M.default.join(w(n),"REQUIREMENTS.md");if($.default.existsSync(x)){let v=Se(g,n).match(new RegExp(`(#{2,4}\\s*Phase\\s+${K(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),F=(v?v[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(F){let A=F[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(O=>O.trim()).filter(Boolean),T=$.default.readFileSync(x,"utf-8");for(let O of A){let W=K(O);T=T.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${W}\\*\\*)`,"gi"),"$1x$2"),T=T.replace(new RegExp(`(\\|\\s*${W}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}$.default.writeFileSync(x,T,"utf-8"),u=!0}}}let p=null,h=null,y=!0;try{let g=ve(n),_=$.default.readdirSync(r,{withFileTypes:!0}).filter(b=>b.isDirectory()).map(b=>b.name).filter(g).sort((b,x)=>xe(b,x));for(let b of _){let x=b.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(x&&xe(x[1],e)>0){p=x[1],h=x[2]||null,y=!1;break}}}catch{}if(y&&$.default.existsSync(i))try{let g=Se($.default.readFileSync(i,"utf-8"),n),_=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,b;for(;(b=_.exec(g))!==null;)if(xe(b[1],e)>0){p=b[1],h=b[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),y=!1;break}}catch{}if($.default.existsSync(t)){let g=$.default.readFileSync(t,"utf-8"),_=p||e,b=V(g,"Current Phase")||V(g,"Phase"),x=String(_);if(b){let v=b.match(/of\s+(\d+)/),k=b.match(/\(([^)]+)\)/);if(v){let F=h?` (${h.replace(/-/g," ")})`:k?` (${k[1]})`:"";x=`${_} of ${v[1]}${F}`}}g=pe(g,"Current Phase","Phase",x),h&&(g=pe(g,"Current Phase Name",null,h.replace(/-/g," "))),g=pe(g,"Status",null,y?"Milestone complete":"Ready to plan"),g=pe(g,"Current Plan","Plan","Not started"),g=pe(g,"Last Activity","Last activity",a),g=pe(g,"Last Activity Description",null,`Phase ${e} complete${p?`, transitioned to Phase ${p}`:""}`);let P=V(g,"Completed Phases");if(P){let v=parseInt(P,10)+1;g=ge(g,"Completed Phases",String(v))??g;let k=V(g,"Total Phases");if(k){let F=parseInt(k,10);if(F>0){let A=Math.round(v/F*100);g=ge(g,"Progress",`${A}%`)??g,g=g.replace(/(percent:\s*)\d+/,`$1${A}`)}}}Q(t,g,n)}f({completed_phase:e,phase_name:l.phase_name,plans_executed:`${d}/${c}`,next_phase:p,next_phase_name:h,is_last_phase:y,date:a,roadmap_updated:$.default.existsSync(i),state_updated:$.default.existsSync(t),requirements_updated:u,warnings:m,has_warnings:m.length>0},s)}var $,M,dt=le(()=>{"use strict";$=N(require("fs")),M=N(require("path"));me();We();ze()});var vt={};ue(vt,{cmdValidateAgents:()=>Ys,cmdValidateConsistency:()=>Js,cmdValidateHealth:()=>Hs,cmdVerifyArtifacts:()=>zs,cmdVerifyCommits:()=>Vs,cmdVerifyKeyLinks:()=>Bs,cmdVerifyPhaseCompleteness:()=>Us,cmdVerifyPlanStructure:()=>Ls,cmdVerifyReferences:()=>Gs,cmdVerifySummary:()=>Ws});function Ws(n,e,s,i){e||S("summary-path required");let t=H.default.join(n,e),r=s||2;if(!Y.default.existsSync(t)){f({passed:!1,checks:{summary_exists:!1,files_created:{checked:0,found:0,missing:[]},commits_exist:!1,self_check:"not_found"},errors:["SUMMARY.md not found"]},i,"failed");return}let o=Y.default.readFileSync(t,"utf-8"),a=[],l=new Set;for(let y of[/`([^`]+\.[a-zA-Z]+)`/g,/(?:Created|Modified|Added|Updated|Edited):\s*`?([^\s`]+\.[a-zA-Z]+)`?/gi]){let g;for(;(g=y.exec(o))!==null;)g[1]&&!g[1].startsWith("http")&&g[1].includes("/")&&l.add(g[1])}let c=Array.from(l).slice(0,r),d=c.filter(y=>!Y.default.existsSync(H.default.join(n,y))),u=o.match(/\b[0-9a-f]{7,40}\b/g)||[],m=!1;for(let y of u.slice(0,3))if(ie(n,["cat-file","-t",y]).stdout==="commit"){m=!0;break}let p="not_found";if(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i.test(o)){let y=o.slice(o.search(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i));/(?:fail|✗|❌|incomplete|blocked)/i.test(y)?p="failed":/(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i.test(y)&&(p="passed")}d.length>0&&a.push("Missing files: "+d.join(", ")),!m&&u.length>0&&a.push("Referenced commit hashes not found in git history"),p==="failed"&&a.push("Self-check section indicates failure");let h=d.length===0&&p!=="failed";f({passed:h,checks:{summary_exists:!0,files_created:{checked:c.length,found:c.length-d.length,missing:d},commits_exist:m,self_check:p},errors:a},i,h?"passed":"failed")}function Ls(n,e,s){e||S("file path required");let i=H.default.isAbsolute(e)?e:H.default.join(n,e),t=Ce(i);if(!t){f({error:"File not found",path:e},s);return}let r=ne(t),o=[],a=[];for(let m of["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"])r[m]===void 0&&o.push(`Missing required frontmatter field: ${m}`);let l=/<task[^>]*>([\s\S]*?)<\/task>/g,c=[],d;for(;(d=l.exec(t))!==null;){let m=d[1],p=m.match(/<name>([\s\S]*?)<\/name>/),h=p?p[1].trim():"unnamed",y=/<files>/.test(m),g=/<action>/.test(m),_=/<verify>/.test(m),b=/<done>/.test(m);p||o.push("Task missing <name> element"),g||o.push(`Task '${h}' missing <action>`),_||a.push(`Task '${h}' missing <verify>`),b||a.push(`Task '${h}' missing <done>`),y||a.push(`Task '${h}' missing <files>`),c.push({name:h,hasFiles:y,hasAction:g,hasVerify:_,hasDone:b})}c.length===0&&a.push("No <task> elements found"),r.wave&&parseInt(String(r.wave))>1&&(!r.depends_on||Array.isArray(r.depends_on)&&r.depends_on.length===0)&&a.push("Wave > 1 but depends_on is empty"),/<task\s+type=["']?checkpoint/.test(t)&&r.autonomous!=="false"&&r.autonomous!==!1&&o.push("Has checkpoint tasks but autonomous is not false"),f({valid:o.length===0,errors:o,warnings:a,task_count:c.length,tasks:c,frontmatter_fields:Object.keys(r)},s,o.length===0?"valid":"invalid")}function Us(n,e,s){e||S("phase required");let i=ce(n,e);if(!i?.found){f({error:"Phase not found",phase:e},s);return}let t=H.default.join(n,i.directory),r=[],o=[],a;try{a=Y.default.readdirSync(t)}catch{f({error:"Cannot read phase directory"},s);return}let l=a.filter(h=>h.match(/-PLAN\.md$/i)),c=a.filter(h=>h.match(/-SUMMARY\.md$/i)),d=new Set(l.map(h=>h.replace(/-PLAN\.md$/i,""))),u=new Set(c.map(h=>h.replace(/-SUMMARY\.md$/i,""))),m=[...d].filter(h=>!u.has(h)),p=[...u].filter(h=>!d.has(h));m.length>0&&r.push(`Plans without summaries: ${m.join(", ")}`),p.length>0&&o.push(`Summaries without plans: ${p.join(", ")}`),f({complete:r.length===0,phase:i.phase_number,plan_count:l.length,summary_count:c.length,incomplete_plans:m,orphan_summaries:p,errors:r,warnings:o},s,r.length===0?"complete":"incomplete")}function Gs(n,e,s){e||S("file path required");let i=H.default.isAbsolute(e)?e:H.default.join(n,e),t=Ce(i);if(!t){f({error:"File not found",path:e},s);return}let r=[],o=[];for(let a of t.match(/@([^\s\n,)]+\/[^\s\n,)]+)/g)||[]){let l=a.slice(1),c=l.startsWith("~/")?H.default.join(process.env.HOME??"",l.slice(2)):H.default.join(n,l);(Y.default.existsSync(c)?r:o).push(l)}for(let a of t.match(/`([^`]+\/[^`]+\.[a-zA-Z]{1,10})`/g)||[]){let l=a.slice(1,-1);l.startsWith("http")||l.includes("${")||l.includes("{{")||r.includes(l)||o.includes(l)||(Y.default.existsSync(H.default.join(n,l))?r:o).push(l)}f({valid:o.length===0,found:r.length,missing:o,total:r.length+o.length},s,o.length===0?"valid":"invalid")}function Vs(n,e,s){(!e||e.length===0)&&S("At least one commit hash required");let i=[],t=[];for(let r of e)(ie(n,["cat-file","-t",r]).stdout.trim()==="commit"?i:t).push(r);f({all_valid:t.length===0,valid:i,invalid:t,total:e.length},s,t.length===0?"valid":"invalid")}function zs(n,e,s){e||S("plan file path required");let i=H.default.isAbsolute(e)?e:H.default.join(n,e),t=Ce(i);if(!t){f({error:"File not found",path:e},s);return}let r=yt(t,"artifacts");if(r.length===0){f({error:"No must_haves.artifacts found in frontmatter",path:e},s);return}let o=[];for(let l of r){if(typeof l=="string")continue;let c=l;if(!c.path)continue;let d=H.default.join(n,c.path),u=Y.default.existsSync(d),m={path:c.path,exists:u,issues:[],passed:!1};if(u){let p=Ce(d)??"",h=p.split(`
277
+ `).length;if(c.min_lines&&h<c.min_lines&&m.issues.push(`Only ${h} lines, need ${c.min_lines}`),c.contains&&!p.includes(c.contains)&&m.issues.push(`Missing pattern: ${c.contains}`),c.exports){let y=Array.isArray(c.exports)?c.exports:[c.exports];for(let g of y)p.includes(g)||m.issues.push(`Missing export: ${g}`)}m.passed=m.issues.length===0}else m.issues.push("File not found");o.push(m)}let a=o.filter(l=>l.passed).length;f({all_passed:a===o.length,passed:a,total:o.length,artifacts:o},s,a===o.length?"valid":"invalid")}function Bs(n,e,s){e||S("plan file path required");let i=H.default.isAbsolute(e)?e:H.default.join(n,e),t=Ce(i);if(!t){f({error:"File not found",path:e},s);return}let r=yt(t,"key_links");if(r.length===0){f({error:"No must_haves.key_links found in frontmatter",path:e},s);return}let o=[];for(let l of r){if(typeof l=="string")continue;let c=l,d={from:c.from,to:c.to,via:c.via||"",verified:!1,detail:""},u=Ce(H.default.join(n,c.from||""));if(!u)d.detail="Source file not found";else if(c.pattern)try{let m=new RegExp(c.pattern);if(m.test(u))d.verified=!0,d.detail="Pattern found in source";else{let p=Ce(H.default.join(n,c.to||""));p&&m.test(p)?(d.verified=!0,d.detail="Pattern found in target"):d.detail=`Pattern "${c.pattern}" not found in source or target`}}catch{d.detail=`Invalid regex pattern: ${c.pattern}`}else u.includes(c.to||"")?(d.verified=!0,d.detail="Target referenced in source"):d.detail="Target not referenced in source";o.push(d)}let a=o.filter(l=>l.verified).length;f({all_verified:a===o.length,verified:a,total:o.length,links:o},s,a===o.length?"valid":"invalid")}function Js(n,e){let s=H.default.join(w(n),"ROADMAP.md"),i=H.default.join(w(n),"phases"),t=[],r=[];if(!Y.default.existsSync(s)){t.push("ROADMAP.md not found"),f({passed:!1,errors:t,warnings:r},e,"failed");return}let o=Se(Y.default.readFileSync(s,"utf-8"),n),a=new Set,l=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi,c;for(;(c=l.exec(o))!==null;)a.add(c[1]);let d=new Set;try{Y.default.readdirSync(i,{withFileTypes:!0}).filter(p=>p.isDirectory()).map(p=>p.name).forEach(p=>{let h=p.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);h&&d.add(h[1])})}catch{}for(let p of a)!d.has(p)&&!d.has(oe(p))&&r.push(`Phase ${p} in ROADMAP.md but no directory on disk`);for(let p of d){let h=String(parseInt(p,10));!a.has(p)&&!a.has(h)&&r.push(`Phase ${p} exists on disk but not in ROADMAP.md`)}if(B(n).phase_naming!=="custom"){let p=[...d].filter(h=>!h.includes(".")).map(h=>parseInt(h,10)).sort((h,y)=>h-y);for(let h=1;h<p.length;h++)p[h]!==p[h-1]+1&&r.push(`Gap in phase numbering: ${p[h-1]} \u2192 ${p[h]}`)}let m=t.length===0;f({passed:m,errors:t,warnings:r,warning_count:r.length},e,m?"passed":"failed")}function Hs(n,e,s){let i=H.default.resolve(n);if(i===pn.default.homedir()){f({status:"error",errors:[{code:"E010",message:"CWD is home directory - health check would read the wrong .planning/ directory.",fix:"cd into your project directory and retry"}],warnings:[],info:[{code:"I010",message:`Resolved CWD: ${i}`}],repairable_count:0},s);return}let t=w(n),r=J(n),o=H.default.join(r,"PROJECT.md"),a=H.default.join(t,"ROADMAP.md"),l=H.default.join(t,"STATE.md"),c=H.default.join(r,"config.json"),d=H.default.join(t,"phases"),u=[],m=[],p=[],h=[],y=(b,x,P,v,k=!1)=>{let F={code:x,message:P,fix:v,repairable:k};b==="error"?u.push(F):b==="warning"?m.push(F):p.push(F)};if(!Y.default.existsSync(t)){y("error","E001",".planning/ directory not found","Run /gsd-new-project to initialize"),f({status:"broken",errors:u,warnings:m,info:p,repairable_count:0},s);return}if(!Y.default.existsSync(o))y("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let b=Y.default.readFileSync(o,"utf-8");for(let x of["## What This Is","## Core Value","## Requirements"])b.includes(x)||y("warning","W001",`PROJECT.md missing section: ${x}`,"Add section manually")}if(Y.default.existsSync(a)||y("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),Y.default.existsSync(l)||(y("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),h.push("regenerateState")),!Y.default.existsSync(c))y("warning","W003","config.json not found","Run /gsd-health --repair to create with defaults",!0),h.push("createConfig");else try{let b=JSON.parse(Y.default.readFileSync(c,"utf-8"));b.model_profile&&!["quality","balanced","budget","inherit"].includes(b.model_profile)&&y("warning","W004",`config.json: invalid model_profile "${b.model_profile}"`,"Valid values: quality, balanced, budget, inherit"),b.workflow&&b.workflow.nyquist_validation===void 0&&(y("warning","W008","config.json: workflow.nyquist_validation absent","Run /gsd-health --repair to add key",!0),h.includes("addNyquistKey")||h.push("addNyquistKey"))}catch(b){y("error","E005",`config.json: JSON parse error - ${b.message}`,"Run /gsd-health --repair to reset to defaults",!0),h.push("resetConfig")}try{let b=rt();b.agents_installed||y("warning","W010",b.installed_agents.length===0?`No GSD agents found in ${b.agents_dir}`:`Missing ${b.missing_agents.length} GSD agents: ${b.missing_agents.join(", ")}`,"Run the GSD installer: npx get-shit-done-cc@latest")}catch{}let g=[];if(e.repair&&h.length>0)for(let b of h)try{if(b==="createConfig"||b==="resetConfig")Y.default.writeFileSync(c,JSON.stringify({model_profile:"balanced",commit_docs:!0,search_gitignored:!1,branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null,workflow:{research:!0,plan_check:!0,verifier:!0,nyquist_validation:!0},parallelization:!0,brave_search:!1},null,2),"utf-8"),g.push({action:b,success:!0,path:"config.json"});else if(b==="regenerateState"){if(Y.default.existsSync(l)){let P=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),v=`${l}.bak-${P}`;Y.default.copyFileSync(l,v),g.push({action:"backupState",success:!0,path:v})}let x=te(n);Q(l,`# Session State
278
+
279
+ ## Project Reference
280
+
281
+ See: .planning/PROJECT.md
282
+
283
+ ## Position
284
+
285
+ **Milestone:** ${x.version} ${x.name}
286
+ **Current phase:** (determining...)
287
+ **Status:** Resuming
288
+
289
+ ## Session Log
290
+
291
+ - ${new Date().toISOString().split("T")[0]}: STATE.md regenerated by /gsd-health --repair
292
+ `,n),g.push({action:b,success:!0,path:"STATE.md"})}else if(b==="addNyquistKey"&&Y.default.existsSync(c)){let x=JSON.parse(Y.default.readFileSync(c,"utf-8"));x.workflow||(x.workflow={}),x.workflow.nyquist_validation===void 0&&(x.workflow.nyquist_validation=!0,Y.default.writeFileSync(c,JSON.stringify(x,null,2),"utf-8")),g.push({action:b,success:!0,path:"config.json"})}}catch(x){g.push({action:b,success:!1,error:x.message})}let _=u.length>0?"broken":m.length>0?"degraded":"healthy";f({status:_,errors:u,warnings:m,info:p,repairable_count:u.filter(b=>b.repairable).length+m.filter(b=>b.repairable).length,repairs_performed:g.length>0?g:void 0},s)}function Ys(n,e){let s=rt();f({agents_dir:s.agents_dir,agents_found:s.agents_installed,installed:s.installed_agents,missing:s.missing_agents,expected:Object.keys(Pe)},e)}var Y,pn,H,kt=le(()=>{"use strict";Y=N(require("fs")),pn=N(require("os")),H=N(require("path"));me();We();ze()});var fn={};ue(fn,{cmdTemplateFill:()=>Zs,cmdTemplateSelect:()=>Ks});function Ks(n,e,s){e||S("plan-path required");try{let i=ut.default.join(n,e),t=Pt.default.readFileSync(i,"utf-8"),r=(t.match(/###\s*Task\s*\d+/g)||[]).length,o=(t.match(/decision/gi)||[]).length>0,a=new Set,l=/`([^`]+\.[a-zA-Z]+)`/g,c;for(;(c=l.exec(t))!==null;)c[1].includes("/")&&!c[1].startsWith("http")&&a.add(c[1]);let d=a.size,u="templates/summary-standard.md",m="standard";r<=2&&d<=3&&!o?(u="templates/summary-minimal.md",m="minimal"):(o||d>6||r>5)&&(u="templates/summary-complex.md",m="complex"),f({template:u,type:m,taskCount:r,fileCount:d,hasDecisions:o},s,u)}catch(i){f({template:"templates/summary-standard.md",type:"standard",error:i.message},s,"templates/summary-standard.md")}}function Zs(n,e,s,i){e||S("template type required: summary, plan, or verification"),s.phase||S("--phase required");let t=ce(n,s.phase);if(!t||!t.found){f({error:"Phase not found",phase:s.phase},i);return}let r=oe(s.phase),o=new Date().toISOString().split("T")[0],a=s.name||t.phase_name||"Unnamed",l=t.phase_slug||Fe(a),c=`${r}-${l}`,d=(s.plan||"01").padStart(2,"0"),u=s.fields||{},m,p,h;switch(e){case"summary":m={phase:c,plan:d,subsystem:"[primary category]",tags:[],provides:[],affects:[],"tech-stack":{added:[],patterns:[]},"key-files":{created:[],modified:[]},"key-decisions":[],"patterns-established":[],duration:"[X]min",completed:o,...u},p=[`# Phase ${s.phase}: ${a} Summary`,"","**[Substantive one-liner describing outcome]**","","## Performance","- **Duration:** [time]","- **Tasks:** [count completed]","- **Files modified:** [count]","","## Accomplishments","- [Key outcome 1]","- [Key outcome 2]","","## Task Commits","1. **Task 1: [task name]** - `hash`","","## Files Created/Modified","- `path/to/file.ts` - What it does","","## Decisions & Deviations",'[Key decisions or "None - followed plan as specified"]',"","## Next Phase Readiness","[What's ready for next phase]"].join(`
293
+ `),h=`${r}-${d}-SUMMARY.md`;break;case"plan":m={phase:c,plan:d,type:s.type||"execute",wave:parseInt(s.wave||"1"),depends_on:[],files_modified:[],autonomous:!0,user_setup:[],must_haves:{truths:[],artifacts:[],key_links:[]},...u},p=[`# Phase ${s.phase} Plan ${d}: [Title]`,"","## Objective","- **What:** [What this plan builds]","- **Why:** [Why it matters for the phase goal]","- **Output:** [Concrete deliverable]","","## Context","@.planning/PROJECT.md","@.planning/ROADMAP.md","@.planning/STATE.md","","## Tasks","",'<task type="code">'," <name>[Task name]</name>"," <files>[file paths]</files>"," <action>[What to do]</action>"," <verify>[How to verify]</verify>"," <done>[Definition of done]</done>","</task>","","## Verification","[How to verify this plan achieved its objective]","","## Success Criteria","- [ ] [Criterion 1]","- [ ] [Criterion 2]"].join(`
294
+ `),h=`${r}-${d}-PLAN.md`;break;case"verification":m={phase:c,verified:new Date().toISOString(),status:"pending",score:"0/0 must-haves verified",...u},p=[`# Phase ${s.phase}: ${a} - Verification`,"","## Observable Truths","| # | Truth | Status | Evidence |","|---|-------|--------|----------|","| 1 | [Truth] | pending | |","","## Required Artifacts","| Artifact | Expected | Status | Details |","|----------|----------|--------|---------|","| [path] | [what] | pending | |","","## Key Link Verification","| From | To | Via | Status | Details |","|------|----|----|--------|---------|","| [source] | [target] | [connection] | pending | |","","## Requirements Coverage","| Requirement | Status | Blocking Issue |","|-------------|--------|----------------|","| [req] | pending | |","","## Result","[Pending verification]"].join(`
295
+ `),h=`${r}-VERIFICATION.md`;break;default:S(`Unknown template type: ${e}. Available: summary, plan, verification`);return}let y=`---
296
+ ${Qe(m)}
297
+ ---
298
+
299
+ ${p}
300
+ `,g=ut.default.join(n,t.directory,h);if(Pt.default.existsSync(g)){f({error:"File already exists",path:G(ut.default.relative(n,g))},i);return}Pt.default.writeFileSync(g,$e(y),"utf-8");let _=G(ut.default.relative(n,g));f({created:!0,path:_,template:e},i,_)}var Pt,ut,hn=le(()=>{"use strict";Pt=N(require("fs")),ut=N(require("path"));me();We()});var Xe={};ue(Xe,{cmdConfigEnsureSection:()=>ni,cmdConfigGet:()=>ii,cmdConfigNewProject:()=>ti,cmdConfigSet:()=>si,cmdConfigSetModelProfile:()=>ri,ensureConfigFile:()=>Lt,setConfigValue:()=>Ut});function Xs(n){return!!(yn.has(n)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(n))}function ei(n){let e=Qs[n];e&&S(`Unknown config key: ${n}. Did you mean ${e}?`)}function Sn(n){let e=n||{},s=gn.default.homedir(),i=Le.default.join(s,".gsd","brave_api_key"),t=!!(process.env.BRAVE_API_KEY||se.default.existsSync(i)),r=Le.default.join(s,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||se.default.existsSync(r)),a=Le.default.join(s,".gsd","exa_api_key"),l=!!(process.env.EXA_API_KEY||se.default.existsSync(a)),c=Le.default.join(s,".gsd","defaults.json"),d={};try{if(se.default.existsSync(c)&&(d=JSON.parse(se.default.readFileSync(c,"utf-8")),"depth"in d&&!("granularity"in d))){let m={quick:"coarse",standard:"standard",comprehensive:"fine"};d.granularity=m[d.depth]||d.depth,delete d.depth;try{se.default.writeFileSync(c,JSON.stringify(d,null,2),"utf-8")}catch{}}}catch{}let u={model_profile:"balanced",commit_docs:!0,parallelization:!0,search_gitignored:!1,brave_search:t,firecrawl:o,exa_search:l,git:{branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null},workflow:{research:!0,plan_check:!0,verifier:!0,nyquist_validation:!0,auto_advance:!1,node_repair:!0,node_repair_budget:2,ui_phase:!0,ui_safety_gate:!0,text_mode:!1,research_before_questions:!1,discuss_mode:"discuss",skip_discuss:!1},hooks:{context_warnings:!0},agent_skills:{}};return{...u,...d,...e,git:{...u.git,...d.git||{},...e.git||{}},workflow:{...u.workflow,...d.workflow||{},...e.workflow||{}},hooks:{...u.hooks,...d.hooks||{},...e.hooks||{}},agent_skills:{...u.agent_skills,...d.agent_skills||{},...e.agent_skills||{}}}}function Lt(n){let e=J(n),s=Le.default.join(e,"config.json");try{se.default.existsSync(e)||se.default.mkdirSync(e,{recursive:!0})}catch(t){S("Failed to create .planning directory: "+t.message)}if(se.default.existsSync(s))return{created:!1,reason:"already_exists"};let i=Sn({});try{return se.default.writeFileSync(s,JSON.stringify(i,null,2),"utf-8"),{created:!0,path:".planning/config.json"}}catch(t){S("Failed to create config.json: "+t.message)}}function Ut(n,e,s){let i=Le.default.join(J(n),"config.json"),t={};try{se.default.existsSync(i)&&(t=JSON.parse(se.default.readFileSync(i,"utf-8")))}catch(l){S("Failed to read config.json: "+l.message)}let r=e.split("."),o=t;for(let l=0;l<r.length-1;l++){let c=r[l];(o[c]===void 0||typeof o[c]!="object")&&(o[c]={}),o=o[c]}let a=o[r[r.length-1]];o[r[r.length-1]]=s;try{return se.default.writeFileSync(i,JSON.stringify(t,null,2),"utf-8"),{updated:!0,key:e,value:s,previousValue:a}}catch(l){S("Failed to write config.json: "+l.message)}}function ti(n,e,s){let i=J(n),t=Le.default.join(i,"config.json");if(se.default.existsSync(t)){f({created:!1,reason:"already_exists"},s,"exists");return}let r={};if(e&&e.trim())try{r=JSON.parse(e)}catch(a){S("Invalid JSON for config-new-project: "+a.message)}try{se.default.existsSync(i)||se.default.mkdirSync(i,{recursive:!0})}catch(a){S("Failed to create .planning directory: "+a.message)}let o=Sn(r);try{se.default.writeFileSync(t,JSON.stringify(o,null,2),"utf-8"),f({created:!0,path:".planning/config.json"},s,"created")}catch(a){S("Failed to write config.json: "+a.message)}}function ni(n,e){let s=Lt(n);f(s,e,s?.created?"created":"exists")}function si(n,e,s,i){e||S("Usage: config-set <key.path> <value>"),ei(e),Xs(e)||S(`Unknown config key: "${e}". Valid keys: ${[...yn].sort().join(", ")}, agent_skills.<agent-type>`);let t=s;if(s==="true")t=!0;else if(s==="false")t=!1;else if(s!==void 0&&!isNaN(Number(s))&&s!=="")t=Number(s);else if(typeof s=="string"&&(s.startsWith("[")||s.startsWith("{")))try{t=JSON.parse(s)}catch{}let r=Ut(n,e,t);f(r,i,`${e}=${t}`)}function ii(n,e,s){e||S("Usage: config-get <key.path>");let i=Le.default.join(J(n),"config.json"),t={};try{se.default.existsSync(i)?t=JSON.parse(se.default.readFileSync(i,"utf-8")):S("No config.json found at "+i)}catch(a){if(a.message.startsWith("Error:"))throw a;S("Failed to read config.json: "+a.message)}let r=e.split("."),o=t;for(let a of r)(o==null||typeof o!="object")&&S(`Key not found: ${e}`),o=o[a];o===void 0&&S(`Key not found: ${e}`),f(o,s,String(o))}function ri(n,e,s){e||S(`Usage: config-set-model-profile <${Je.join("|")}>`);let i=e.toLowerCase().trim();Je.includes(i)||S(`Invalid profile '${e}'. Valid profiles: ${Je.join(", ")}`),Lt(n);let r=Ut(n,"model_profile",i)?.previousValue||"balanced",o=Et(i),a=Mt(o),c=r!==i?`\u2713 Model profile set to: ${i} (was: ${r})
301
+
302
+ Agents will now use:
303
+
304
+ ${a}
305
+ Next spawned agents will use the new profile.`:`\u2713 Model profile is already set to: ${i}
306
+
307
+ Agents are using:
308
+
309
+ ${a}`;f({updated:!0,profile:i,previousProfile:r,agentToModelMap:o},s,c)}var se,gn,Le,yn,Qs,et=le(()=>{"use strict";se=N(require("fs")),gn=N(require("os")),Le=N(require("path"));me();it();yn=new Set(["mode","granularity","parallelization","commit_docs","model_profile","search_gitignored","brave_search","firecrawl","exa_search","workflow.research","workflow.plan_check","workflow.verifier","workflow.nyquist_validation","workflow.ui_phase","workflow.ui_safety_gate","workflow.auto_advance","workflow.node_repair","workflow.node_repair_budget","workflow.text_mode","workflow.research_before_questions","workflow.discuss_mode","workflow.skip_discuss","workflow._auto_chain_active","git.branching_strategy","git.phase_branch_template","git.milestone_branch_template","git.quick_branch_template","planning.commit_docs","planning.search_gitignored","hooks.context_warnings"]),Qs={"workflow.nyquist_validation_enabled":"workflow.nyquist_validation","agents.nyquist_validation_enabled":"workflow.nyquist_validation","nyquist.validation_enabled":"workflow.nyquist_validation","hooks.research_questions":"workflow.research_before_questions","workflow.research_questions":"workflow.research_before_questions"}});var Gt={};ue(Gt,{cmdAgentSkills:()=>vi,cmdInitExecutePhase:()=>oi,cmdInitListWorkspaces:()=>bi,cmdInitManager:()=>Si,cmdInitMapCodebase:()=>gi,cmdInitMilestoneOp:()=>hi,cmdInitNewMilestone:()=>ci,cmdInitNewProject:()=>li,cmdInitNewWorkspace:()=>_i,cmdInitPhaseOp:()=>pi,cmdInitPlanPhase:()=>ai,cmdInitProgress:()=>yi,cmdInitQuick:()=>di,cmdInitRemoveWorkspace:()=>xi,cmdInitResume:()=>ui,cmdInitTodos:()=>fi,cmdInitVerifyWork:()=>mi});function _n(n){let e=ke.default.join(J(n),"MILESTONES.md");if(!L.default.existsSync(e))return null;try{let i=L.default.readFileSync(e,"utf-8").match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);return i?{version:i[1],name:i[2].trim()}:null}catch{return null}}function re(n,e){e.project_root=n,e.gsd_bin="dist/gsd-tools.js",e.gsd_root=".",e.gsd_harness_dir=".";let s=rt();return e.agents_installed=s.agents_installed,e.missing_agents=s.missing_agents,e}function oi(n,e,s){e||S("phase required for init execute-phase");let i=B(n),t=ce(n,e),r=te(n),o=Ze(n,e);if(!t&&o?.found){let d=o.phase_name;t={found:!0,directory:null,phase_number:o.phase_number,phase_name:d,phase_slug:d?d.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:[],summaries:[],incomplete_plans:[],has_research:!1,has_context:!1,has_verification:!1,has_reviews:!1}}let a=o?.section?.match(/^\*\*Requirements\*\*:[^\S\n]*([^\n]*)$/m),l=a?a[1].replace(/[[\]]/g,"").split(",").map(d=>d.trim()).filter(Boolean).join(", "):null,c=re(n,{executor_model:Z(n,"gsd-executor"),verifier_model:Z(n,"gsd-verifier"),commit_docs:i.commit_docs,sub_repos:i.sub_repos,parallelization:i.parallelization,context_window:i.context_window,branching_strategy:i.branching_strategy,phase_branch_template:i.phase_branch_template,milestone_branch_template:i.milestone_branch_template,verifier_enabled:i.verifier,phase_found:!!t,phase_dir:t?.directory??null,phase_number:t?.phase_number??null,phase_name:t?.phase_name??null,phase_slug:t?.phase_slug??null,phase_req_ids:l&&l!=="TBD"?l:null,plans:t?.plans??[],summaries:t?.summaries??[],incomplete_plans:t?.incomplete_plans??[],has_research:t?.has_research??!1,has_context:t?.has_context??!1,has_verification:t?.has_verification??!1,has_reviews:t?.has_reviews??!1,roadmap_goal:o?.goal??null,roadmap_section:o?.section??null,milestone_version:r.version,milestone_name:r.name});f(c,s)}function ai(n,e,s){e||S("phase required for init plan-phase");let i=B(n),t=ce(n,e),r=Ze(n,e),o=te(n),a=re(n,{planner_model:Z(n,"gsd-planner"),researcher_model:Z(n,"gsd-phase-researcher"),synthesizer_model:Z(n,"gsd-research-synthesizer"),commit_docs:i.commit_docs,research_enabled:i.research,plan_checker_enabled:i.plan_checker,context_window:i.context_window,phase_found:!!t,phase_dir:t?.directory??null,phase_number:t?.phase_number??null,phase_name:t?.phase_name??null,roadmap_goal:r?.goal??null,roadmap_section:r?.section??null,milestone_version:o.version,milestone_name:o.name});f(a,s)}function li(n,e){let s=B(n),i=J(n),t=re(n,{planner_model:Z(n,"gsd-planner"),roadmapper_model:Z(n,"gsd-roadmapper"),commit_docs:s.commit_docs,context_window:s.context_window,planning_exists:L.default.existsSync(i),project_exists:L.default.existsSync(ke.default.join(i,"PROJECT.md")),config_exists:L.default.existsSync(ke.default.join(i,"config.json")),roadmap_exists:L.default.existsSync(ke.default.join(i,"ROADMAP.md")),state_exists:L.default.existsSync(ke.default.join(i,"STATE.md"))});f(t,e)}function ci(n,e){let s=B(n),i=te(n),t=_n(n),r=re(n,{roadmapper_model:Z(n,"gsd-roadmapper"),commit_docs:s.commit_docs,context_window:s.context_window,current_milestone:i,last_completed_milestone:t,roadmap_exists:L.default.existsSync(R(n).roadmap)});f(r,e)}function di(n,e,s){let i=B(n),t=te(n),r=re(n,{executor_model:Z(n,"gsd-executor"),commit_docs:i.commit_docs,context_window:i.context_window,branching_strategy:i.branching_strategy,quick_branch_template:i.quick_branch_template,description:e||null,milestone_version:t.version,milestone_name:t.name,state_exists:L.default.existsSync(R(n).state)});f(r,s)}function ui(n,e){let s=B(n),i=te(n),t=L.default.existsSync(R(n).state),r="";if(t)try{r=L.default.readFileSync(R(n).state,"utf-8")}catch{}let o=re(n,{executor_model:Z(n,"gsd-executor"),commit_docs:s.commit_docs,context_window:s.context_window,state_exists:t,state_raw:r,roadmap_exists:L.default.existsSync(R(n).roadmap),config_exists:L.default.existsSync(R(n).config),milestone_version:i.version,milestone_name:i.name});f(o,e)}function mi(n,e,s){e||S("phase required for init verify-work");let i=B(n),t=ce(n,e),r=Ze(n,e),o=re(n,{verifier_model:Z(n,"gsd-verifier"),nyquist_model:Z(n,"gsd-nyquist-auditor"),commit_docs:i.commit_docs,nyquist_validation:i.nyquist_validation,context_window:i.context_window,phase_found:!!t,phase_dir:t?.directory??null,phase_number:t?.phase_number??null,phase_name:t?.phase_name??null,plans:t?.plans??[],summaries:t?.summaries??[],roadmap_goal:r?.goal??null});f(o,s)}function pi(n,e,s){let i=B(n),t=e?ce(n,e):null,r=te(n),o=re(n,{planner_model:Z(n,"gsd-planner"),commit_docs:i.commit_docs,context_window:i.context_window,phase_found:!!t,phase_dir:t?.directory??null,phase_number:t?.phase_number??null,phase_name:t?.phase_name??null,milestone_version:r.version,milestone_name:r.name});f(o,s)}function fi(n,e,s){let i=B(n),t=ke.default.join(w(n),"todos","pending"),r=[];if(L.default.existsSync(t))try{for(let a of L.default.readdirSync(t).filter(l=>l.endsWith(".md")))try{let l=L.default.readFileSync(ke.default.join(t,a),"utf-8"),c=l.match(/^title:\s*(.+)$/m),d=l.match(/^area:\s*(.+)$/m),u=d?d[1].trim():"general";if(e&&u!==e)continue;r.push({file:a,title:c?c[1].trim():"Untitled",area:u})}catch{}}catch{}let o=re(n,{executor_model:Z(n,"gsd-executor"),commit_docs:i.commit_docs,todos:r,todo_count:r.length,area:e??null});f(o,s)}function hi(n,e){let s=B(n),i=te(n),t=_n(n),r=re(n,{planner_model:Z(n,"gsd-planner"),commit_docs:s.commit_docs,context_window:s.context_window,milestone_version:i.version,milestone_name:i.name,last_completed_milestone:t,roadmap_exists:L.default.existsSync(R(n).roadmap),state_exists:L.default.existsSync(R(n).state)});f(r,e)}function gi(n,e){let s=B(n),i=re(n,{mapper_model:Z(n,"gsd-codebase-mapper"),commit_docs:s.commit_docs,search_gitignored:s.search_gitignored,context_window:s.context_window,project_exists:L.default.existsSync(ke.default.join(J(n),"PROJECT.md"))});f(i,e)}function yi(n,e){let s=B(n),i=te(n),t=ve(n),r=R(n).phases,o=0,a=0,l=0;if(L.default.existsSync(r))try{let d=L.default.readdirSync(r,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).filter(t);l=d.length;for(let u of d){let m=L.default.readdirSync(ke.default.join(r,u));o+=m.filter(p=>p.match(/-PLAN\.md$/i)).length,a+=m.filter(p=>p.match(/-SUMMARY\.md$/i)).length}}catch{}let c=re(n,{commit_docs:s.commit_docs,context_window:s.context_window,milestone_version:i.version,milestone_name:i.name,phase_count:l,total_plans:o,total_summaries:a,percent:o>0?Math.min(100,Math.round(a/o*100)):0});f(c,e)}function Si(n,e){let s=B(n),i=te(n),t=re(n,{planner_model:Z(n,"gsd-planner"),roadmapper_model:Z(n,"gsd-roadmapper"),commit_docs:s.commit_docs,context_window:s.context_window,milestone_version:i.version,milestone_name:i.name,state_exists:L.default.existsSync(R(n).state),roadmap_exists:L.default.existsSync(R(n).roadmap)});f(t,e)}function _i(n,e){let s=B(n),i=ke.default.join(J(n),"workstreams"),t=re(n,{commit_docs:s.commit_docs,context_window:s.context_window,workstream_mode:L.default.existsSync(i),workstreams:L.default.existsSync(i)?L.default.readdirSync(i,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>r.name):[]});f(t,e)}function bi(n,e){let s=ke.default.join(J(n),"workstreams");if(!L.default.existsSync(s)){f(re(n,{mode:"flat",workstreams:[],count:0}),e);return}let i=L.default.readdirSync(s,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>t.name);f(re(n,{mode:"workstream",workstreams:i,count:i.length}),e)}function xi(n,e,s){e||S("workstream name required for init remove-workspace");let i=ke.default.join(J(n),"workstreams",e);if(!L.default.existsSync(i)){f(re(n,{removed:!1,reason:"not_found",workstream:e}),s);return}try{L.default.rmSync(i,{recursive:!0,force:!0})}catch(t){f(re(n,{removed:!1,reason:t.message,workstream:e}),s);return}f(re(n,{removed:!0,workstream:e}),s)}function vi(n,e,s){e||S("agent-type required");let t=B(n).agent_skills[e]??{};f({agent:e,skills:t},s,JSON.stringify(t))}var L,ke,Vt=le(()=>{"use strict";L=N(require("fs")),ke=N(require("path"));me()});var xn={};ue(xn,{cmdRoadmapAnalyze:()=>Pi,cmdRoadmapGetPhase:()=>ki,cmdRoadmapUpdatePlanProgress:()=>$i});function ki(n,e,s){let i=R(n).roadmap;if(!Te.default.existsSync(i)){f({found:!1,error:"ROADMAP.md not found"},s,"");return}try{let t=Se(Te.default.readFileSync(i,"utf-8"),n),r=K(e??""),o=new RegExp(`#{2,4}\\s*Phase\\s+${r}:\\s*([^\\n]+)`,"i"),a=t.match(o);if(!a){let _=new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${r}:\\s*([^*]+)\\*\\*`,"i"),b=t.match(_);if(b){f({found:!1,phase_number:e,phase_name:b[1].trim(),error:"malformed_roadmap",message:`Phase ${e} exists in summary list but missing detail section.`},s,"");return}f({found:!1,phase_number:e},s,"");return}let l=a[1].trim(),c=a.index,u=t.slice(c).match(/\n#{2,4}\s+Phase\s+\d/i),m=u?c+u.index:t.length,p=t.slice(c,m).trim(),h=p.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),y=p.match(/\*\*Success Criteria\*\*[^\n]*:\s*\n((?:\s*\d+\.\s*[^\n]+\n?)+)/i),g=y?y[1].trim().split(`
310
+ `).map(_=>_.replace(/^\s*\d+\.\s*/,"").trim()).filter(Boolean):[];f({found:!0,phase_number:e,phase_name:l,goal:h?h[1].trim():null,success_criteria:g,section:p},s,p)}catch(t){S("Failed to read ROADMAP.md: "+t.message)}}function Pi(n,e){let s=R(n).roadmap;if(!Te.default.existsSync(s)){f({error:"ROADMAP.md not found",milestones:[],phases:[],current_phase:null},e);return}let i=Te.default.readFileSync(s,"utf-8"),t=Se(i,n),r=R(n).phases,o=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,a=[],l;for(;(l=o.exec(t))!==null;){let k=l[1],F=l[2].replace(/\(INSERTED\)/i,"").trim(),A=l.index,T=t.slice(A).match(/\n#{2,4}\s+Phase\s+\d/i),O=T?A+T.index:t.length,W=t.slice(A,O),X=W.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),ae=W.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),be=oe(k),ee="no_directory",de=0,we=0,Ne=!1,jt=!1;try{let Xt=Te.default.readdirSync(r,{withFileTypes:!0}).filter(Re=>Re.isDirectory()).map(Re=>Re.name).find(Re=>Re.startsWith(be+"-")||Re===be);if(Xt){let Re=Te.default.readdirSync(bn.default.join(r,Xt));de=Re.filter(je=>je.endsWith("-PLAN.md")||je==="PLAN.md").length,we=Re.filter(je=>je.endsWith("-SUMMARY.md")||je==="SUMMARY.md").length,Ne=Re.some(je=>je.endsWith("-CONTEXT.md")||je==="CONTEXT.md"),jt=Re.some(je=>je.endsWith("-RESEARCH.md")||je==="RESEARCH.md"),we>=de&&de>0?ee="complete":we>0?ee="partial":de>0?ee="planned":jt?ee="researched":Ne?ee="discussed":ee="empty"}}catch{}let Cn=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${K(k)}[:\\s]`,"i"),Zt=t.match(Cn),Qt=Zt?Zt[1]==="x":!1;Qt&&ee!=="complete"&&(ee="complete"),a.push({number:k,name:F,goal:X?X[1].trim():null,depends_on:ae?ae[1].trim():null,plan_count:de,summary_count:we,has_context:Ne,has_research:jt,disk_status:ee,roadmap_complete:Qt})}let c=[],d=/##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi,u;for(;(u=d.exec(t))!==null;)c.push({heading:u[1].trim(),version:"v"+u[2]});let m=a.find(k=>k.disk_status==="planned"||k.disk_status==="partial")??null,p=a.find(k=>["empty","no_directory","discussed","researched"].includes(k.disk_status))??null,h=a.reduce((k,F)=>k+F.plan_count,0),y=a.reduce((k,F)=>k+F.summary_count,0),g=a.filter(k=>k.disk_status==="complete").length,_=/-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi,b=new Set,x;for(;(x=_.exec(t))!==null;)b.add(x[1]);let P=new Set(a.map(k=>k.number)),v=[...b].filter(k=>!P.has(k));f({milestones:c,phases:a,phase_count:a.length,completed_phases:g,total_plans:h,total_summaries:y,progress_percent:h>0?Math.min(100,Math.round(y/h*100)):0,current_phase:m?m.number:null,next_phase:p?p.number:null,missing_phase_details:v.length>0?v:null},e)}function $i(n,e,s){e||S("phase number required for roadmap update-plan-progress");let i=R(n).roadmap,t=ce(n,e);t||S(`Phase ${e} not found`);let r=t.plans.length,o=t.summaries.length;if(r===0){f({updated:!1,reason:"No plans found",plan_count:0,summary_count:0},s,"no plans");return}let a=o>=r,l=a?"Complete":o>0?"In Progress":"Planned",c=new Date().toISOString().split("T")[0];if(!Te.default.existsSync(i)){f({updated:!1,reason:"ROADMAP.md not found",plan_count:r,summary_count:o},s,"no roadmap");return}let d=Te.default.readFileSync(i,"utf-8"),u=K(e),m=new RegExp(`^(\\|\\s*${u}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),p=a?` ${c} `:" ";d=d.replace(m,y=>{let g=y.split("|").slice(1,-1);return g.length===5?(g[2]=` ${o}/${r} `,g[3]=` ${l.padEnd(11)}`,g[4]=p):g.length===4&&(g[1]=` ${o}/${r} `,g[2]=` ${l.padEnd(11)}`,g[3]=p),"|"+g.join("|")+"|"});let h=new RegExp(`(#{2,4}\\s*Phase\\s+${u}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i");if(d=Ke(d,h,`$1${a?`${o}/${r} plans complete`:`${o}/${r} plans executed`}`),a){let y=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${u}[:\\s][^\\n]*)`,"i");d=Ke(d,y,`$1x$2 (completed ${c})`)}for(let y of t.summaries){let g=y.replace("-SUMMARY.md","").replace("SUMMARY.md","");g&&(d=d.replace(new RegExp(`(-\\s*\\[) (\\]\\s*${K(g)})`,"i"),"$1x$2"))}Te.default.writeFileSync(i,d,"utf-8"),f({updated:!0,phase:e,plan_count:r,summary_count:o,status:l,complete:a},s,`${o}/${r} ${l}`)}var Te,bn,vn=le(()=>{"use strict";Te=N(require("fs")),bn=N(require("path"));me()});var zt={};ue(zt,{cmdMilestoneComplete:()=>Ri,cmdRequirementsMarkComplete:()=>Ai});function Ai(n,e,s){(!e||e.length===0)&&S("requirement IDs required.");let i=e.join(" ").replace(/[[\]]/g,"").split(/[,\s]+/).map(c=>c.trim()).filter(Boolean);i.length===0&&S("no valid requirement IDs found");let t=R(n).requirements;if(!U.default.existsSync(t)){f({updated:!1,reason:"REQUIREMENTS.md not found",ids:i},s,"no requirements file");return}let r=U.default.readFileSync(t,"utf-8"),o=[],a=[],l=[];for(let c of i){let d=!1,u=K(c);new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${u}\\*\\*)`,"gi").test(r)&&(r=r.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${u}\\*\\*)`,"gi"),"$1x$2"),d=!0),new RegExp(`(\\|\\s*${u}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi").test(r)&&(r=r.replace(new RegExp(`(\\|\\s*${u}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi"),"$1 Complete $2"),d=!0),d?o.push(c):new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${u}\\*\\*`,"gi").test(r)||new RegExp(`\\|\\s*${u}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`,"gi").test(r)?a.push(c):l.push(c)}o.length>0&&U.default.writeFileSync(t,r,"utf-8"),f({updated:o.length>0,marked_complete:o,already_complete:a,not_found:l,total:i.length},s,`${o.length}/${i.length} requirements marked complete`)}function Ri(n,e,s,i){e||S("version required for milestone complete (e.g., v1.0)");let t=R(n).roadmap,r=R(n).requirements,o=R(n).state,a=ye.default.join(n,".planning","MILESTONES.md"),l=ye.default.join(n,".planning","milestones"),c=R(n).phases,d=new Date().toISOString().split("T")[0],u=s.name||e;U.default.mkdirSync(l,{recursive:!0});let m=ve(n),p=0,h=0,y=0,g=[];try{let v=U.default.readdirSync(c,{withFileTypes:!0}).filter(k=>k.isDirectory()).map(k=>k.name).sort();for(let k of v){if(!m(k))continue;p++;let F=U.default.readdirSync(ye.default.join(c,k)),A=F.filter(O=>O.endsWith("-PLAN.md")||O==="PLAN.md"),T=F.filter(O=>O.endsWith("-SUMMARY.md")||O==="SUMMARY.md");h+=A.length;for(let O of T)try{let W=U.default.readFileSync(ye.default.join(c,k,O),"utf-8"),ae=ne(W)["one-liner"]||gt(W);ae&&g.push(ae);let be=W.match(/\*\*Tasks:\*\*\s*(\d+)/);if(be)y+=parseInt(be[1],10);else{let ee=W.match(/<task[\s>]/gi)||[],de=W.match(/##\s*Task\s*\d+/gi)||[];y+=ee.length||de.length}}catch{}}}catch{}U.default.existsSync(t)&&U.default.writeFileSync(ye.default.join(l,`${e}-ROADMAP.md`),U.default.readFileSync(t,"utf-8"),"utf-8"),U.default.existsSync(r)&&U.default.writeFileSync(ye.default.join(l,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
311
+
312
+ **Archived:** ${d}
313
+ **Status:** SHIPPED
314
+
315
+ ---
316
+
317
+ `+U.default.readFileSync(r,"utf-8"),"utf-8");let _=ye.default.join(n,".planning",`${e}-MILESTONE-AUDIT.md`);U.default.existsSync(_)&&U.default.renameSync(_,ye.default.join(l,`${e}-MILESTONE-AUDIT.md`));let b=g.map(v=>`- ${v}`).join(`
318
+ `),x=`## ${e} ${u} (Shipped: ${d})
319
+
320
+ **Phases completed:** ${p} phases, ${h} plans, ${y} tasks
321
+
322
+ **Key accomplishments:**
323
+ ${b||"- (none recorded)"}
324
+
325
+ ---
326
+
327
+ `;if(U.default.existsSync(a)){let v=U.default.readFileSync(a,"utf-8");if(!v.trim())U.default.writeFileSync(a,$e(`# Milestones
328
+
329
+ ${x}`),"utf-8");else{let k=v.match(/^(#{1,3}\s+[^\n]*\n\n?)/);k?U.default.writeFileSync(a,$e(k[1]+x+v.slice(k[1].length)),"utf-8"):U.default.writeFileSync(a,$e(x+v),"utf-8")}}else U.default.writeFileSync(a,$e(`# Milestones
330
+
331
+ ${x}`),"utf-8");if(U.default.existsSync(o)){let v=U.default.readFileSync(o,"utf-8");v=pe(v,"Status",null,`${e} milestone complete`),v=pe(v,"Last Activity","Last activity",d),v=pe(v,"Last Activity Description",null,`${e} milestone completed and archived`),Q(o,v,n)}let P=!1;if(s.archivePhases)try{let v=ye.default.join(l,`${e}-phases`);U.default.mkdirSync(v,{recursive:!0});let k=U.default.readdirSync(c,{withFileTypes:!0}).filter(A=>A.isDirectory()).map(A=>A.name),F=0;for(let A of k)m(A)&&(U.default.renameSync(ye.default.join(c,A),ye.default.join(v,A)),F++);P=F>0}catch{}f({version:e,name:u,date:d,phases:p,plans:h,tasks:y,accomplishments:g,archived:{roadmap:U.default.existsSync(ye.default.join(l,`${e}-ROADMAP.md`)),requirements:U.default.existsSync(ye.default.join(l,`${e}-REQUIREMENTS.md`)),audit:U.default.existsSync(ye.default.join(l,`${e}-MILESTONE-AUDIT.md`)),phases:P},milestones_updated:!0,state_updated:U.default.existsSync(o)},i)}var U,ye,Bt=le(()=>{"use strict";U=N(require("fs")),ye=N(require("path"));me();We();ze()});var Jt={};ue(Jt,{buildCheckpoint:()=>Pn,cmdAuditUat:()=>ji,cmdRenderCheckpoint:()=>Ci,parseCurrentTest:()=>kn});function ji(n,e){let s=Oe.default.join(w(n),"phases");Ge.default.existsSync(s)||S("No phases directory found in planning directory");let i=ve(n),t=[],r=Ge.default.readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).filter(i).sort();for(let a of r){let l=a.match(/^(\d+[A-Z]?(?:\.\d+)*)/i),c=l?l[1]:a,d=Oe.default.join(s,a),u=Ge.default.readdirSync(d);for(let m of u.filter(p=>p.includes("-UAT")&&p.endsWith(".md"))){let p=Ge.default.readFileSync(Oe.default.join(d,m),"utf-8"),h=Ii(p);h.length>0&&t.push({phase:c,phase_dir:a,file:m,file_path:G(Oe.default.relative(n,Oe.default.join(d,m))),type:"uat",status:ne(p).status||"unknown",items:h})}for(let m of u.filter(p=>p.includes("-VERIFICATION")&&p.endsWith(".md"))){let p=Ge.default.readFileSync(Oe.default.join(d,m),"utf-8"),h=ne(p).status||"unknown";if(h==="human_needed"||h==="gaps_found"){let y=Ei(p,h);y.length>0&&t.push({phase:c,phase_dir:a,file:m,file_path:G(Oe.default.relative(n,Oe.default.join(d,m))),type:"verification",status:h,items:y})}}}let o={total_files:t.length,total_items:t.reduce((a,l)=>a+l.items.length,0),by_category:{},by_phase:{}};for(let a of t){o.by_phase[a.phase]||(o.by_phase[a.phase]=0);for(let l of a.items)o.by_phase[a.phase]++,o.by_category[l.category]=(o.by_category[l.category]||0)+1}f({results:t,summary:o},e)}function Ci(n,e,s){let i=e.file;i||S("UAT file required: use uat render-checkpoint --file <path>");let t=Ot(i,n,"UAT file",{allowAbsolute:!0});Ge.default.existsSync(t)||S(`UAT file not found: ${i}`);let r=Ge.default.readFileSync(t,"utf-8"),o=kn(r);o.complete&&S("UAT session is already complete; no pending checkpoint to render");let a=Pn(o);f({file_path:G(Oe.default.relative(n,t)),test_number:o.number,test_name:o.name,checkpoint:a},s,a)}function kn(n){let e=n.match(/##\s*Current Test\s*(?:\n<!--[\s\S]*?-->)?\n([\s\S]*?)(?=\n##\s|$)/i);e||S("UAT file is missing a Current Test section");let s=e[1].trimEnd();if(s.trim()||S("Current Test section is empty"),/\[testing complete\]/i.test(s))return{complete:!0};let i=s.match(/^number:\s*(\d+)\s*$/m),t=s.match(/^name:\s*(.+)\s*$/m),r=s.match(/^expected:\s*\|\n([\s\S]*?)(?=^\w[\w-]*:\s)/m)||s.match(/^expected:\s*\|\n([\s\S]+)/m),o=s.match(/^expected:\s*(.+)\s*$/m);(!i||!t||!r&&!o)&&S("Current Test section is malformed");let a;return r?a=r[1].split(`
332
+ `).map(l=>l.replace(/^ {2}/,"")).join(`
333
+ `).trim():a=o[1].trim(),{complete:!1,number:parseInt(i[1],10),name:bt(t[1].trim()),expected:bt(a)}}function Pn(n){return["\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557","\u2551 CHECKPOINT: Verification Required \u2551","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D","",`**Test ${n.number}: ${n.name}**`,"",n.expected,"","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","Type `pass` or describe what's wrong.","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"].join(`
334
+ `)}function Ii(n){let e=[],s=/###\s*(\d+)\.\s*([^\n]+)\nexpected:\s*([^\n]+)\nresult:\s*(\w+)(?:\n(?:reported|reason|blocked_by):\s*[^\n]*)?/g,i;for(;(i=s.exec(n))!==null;){let[,t,r,o,a]=i;if(a==="pending"||a==="skipped"||a==="blocked"){let l=n.slice(i.index),c=l.indexOf(`
335
+ ###`,1),d=c>0?l.slice(0,c):l,u=d.match(/reason:\s*(.+)/),m=d.match(/blocked_by:\s*(.+)/),p={test:parseInt(t,10),name:r.trim(),expected:o.trim(),result:a,category:Mi(a,u?.[1],m?.[1])};u&&(p.reason=u[1].trim()),m&&(p.blocked_by=m[1].trim()),e.push(p)}}return e}function Ei(n,e){let s=[];if(e==="human_needed"){let i=n.match(/##\s*Human Verification.*?\n([\s\S]*?)(?=\n##\s|\n---\s|$)/i);if(i)for(let t of i[1].split(`
336
+ `)){let r=t.match(/\|\s*(\d+)\s*\|\s*([^|]+)/),o=t.match(/^[-*]\s+(.+)/),a=t.match(/^(\d+)\.\s+(.+)/);r?s.push({test:parseInt(r[1],10),name:r[2].trim(),result:"human_needed",category:"human_uat"}):a?s.push({test:parseInt(a[1],10),name:a[2].trim(),result:"human_needed",category:"human_uat"}):o&&o[1].length>10&&s.push({name:o[1].trim(),result:"human_needed",category:"human_uat"})}}return s}function Mi(n,e,s){if(n==="blocked"||s){if(s){if(/server/i.test(s))return"server_blocked";if(/device|physical/i.test(s))return"device_needed";if(/build|release|preview/i.test(s))return"build_needed";if(/third.party|twilio|stripe/i.test(s))return"third_party"}return"blocked"}return n==="skipped"&&e?/server|not running|not available/i.test(e)?"server_blocked":/simulator|physical|device/i.test(e)?"device_needed":/build|release|preview/i.test(e)?"build_needed":"skipped_unresolved":n==="pending"?"pending":n==="human_needed"?"human_uat":"unknown"}var Ge,Oe,Ht=le(()=>{"use strict";Ge=N(require("fs")),Oe=N(require("path"));me();We();lt()});var $t={};ue($t,{cmdExtractMessages:()=>Fi,cmdProfileSample:()=>Di,cmdScanSessions:()=>wi});function Yt(n){if(n)return n;let e=process.env.HOME??"",s=Be.join(e,".agent","projects");return Ee.existsSync(s)?s:Be.join(e,".claude","projects")}async function wi(n,e,s){let i=Yt(n);if(!Ee.existsSync(i)){f({available:!1,reason:`Sessions directory not found: ${i}`,projects:[],count:0},s);return}let t=[];try{let r=Ee.readdirSync(i,{withFileTypes:!0}).filter(o=>o.isDirectory());for(let o of r){let a=Be.join(i,o.name),l=Ee.readdirSync(a).filter(c=>c.endsWith(".jsonl")||c.endsWith(".json"));t.push({name:o.name,sessions:l.length,path:a})}}catch(r){f({available:!1,reason:r.message,projects:[],count:0},s);return}f({available:!0,base_path:i,projects:t,count:t.length},s)}async function Fi(n,e,s,i){let t=Yt(i),r=Be.join(t,n);if(!Ee.existsSync(r)){f({error:`Project not found: ${n}`,available_projects:[]},s);return}let o=[],a=Ee.readdirSync(r).filter(c=>c.endsWith(".jsonl")),l=e.limit??null;for(let c of a)if(!(e.sessionId&&!c.includes(e.sessionId))){try{let d=Ee.readFileSync(Be.join(r,c),"utf-8").split(`
337
+ `).filter(Boolean);for(let u of d)try{let m=JSON.parse(u);if(o.push(m),l&&o.length>=l)break}catch{}}catch{}if(l&&o.length>=l)break}f({project:n,messages:o,count:o.length},s)}async function Di(n,e,s){let i=Yt(n),t=e.limit??150,r=e.maxChars??500;if(!Ee.existsSync(i)){f({available:!1,reason:`Sessions directory not found: ${i}`,samples:[],count:0},s);return}let o=[];try{let a=Ee.readdirSync(i,{withFileTypes:!0}).filter(l=>l.isDirectory());e:for(let l of a){let c=Be.join(i,l.name),d=Ee.readdirSync(c).filter(m=>m.endsWith(".jsonl")),u=0;for(let m of d)try{let p=Ee.readFileSync(Be.join(c,m),"utf-8").split(`
338
+ `).filter(Boolean);for(let h of p)try{let y=JSON.parse(h);if(y.role==="human"||y.type==="human"){let g=(y.content||y.message||"").slice(0,r);if(g.length>20){if(o.push({project:l.name,text:g}),u++,e.maxPerProject&&u>=e.maxPerProject)break;if(o.length>=t)break e}}}catch{}}catch{}}}catch{}f({available:!0,samples:o,count:o.length},s)}var Ee,Be,At=le(()=>{"use strict";me();Ee=require("fs"),Be=require("path")});var tt={};ue(tt,{cmdGenerateClaudeMd:()=>Li,cmdGenerateClaudeProfile:()=>Wi,cmdGenerateDevPreferences:()=>qi,cmdProfileQuestionnaire:()=>Ni,cmdWriteProfile:()=>Oi});function Rt(n,e,s="CLAUDE.md"){return e?Ae.default.resolve(e):Ae.default.join(n,s)}function Kt(n,e){if(!n)return null;let s=Ae.default.isAbsolute(n)?n:Ae.default.join(e,n);if(!Ue.default.existsSync(s))return null;try{return JSON.parse(Ue.default.readFileSync(s,"utf-8"))}catch{return null}}function Ti(n){return n.map(e=>`## ${e.heading}
339
+
340
+ ${e.body}`).join(`
341
+
342
+ `)+`
343
+ `}function Oi(n,e,s){e.input||S("--input <analysis-json-path> is required");let i=Kt(e.input,n);if(!i){f({error:"Could not load analysis file",input:e.input},s);return}let t=Rt(n,e.output),r=[];i.preferences&&r.push({heading:"Development Preferences",body:i.preferences}),i.patterns&&r.push({heading:"Patterns Observed",body:i.patterns}),i.style&&r.push({heading:"Code Style",body:i.style});let o=r.length>0?Ti(r):JSON.stringify(i,null,2)+`
344
+ `;Ue.default.writeFileSync(t,o,"utf-8"),f({written:!0,path:G(Ae.default.relative(n,t))},s,t)}function Ni(n,e){let s=[{id:"style",question:"Preferred code style (functional/OOP/mixed)?",default:"mixed"},{id:"testing",question:"Testing framework preference?",default:"vitest/jest"},{id:"comments",question:"Comment verbosity (minimal/moderate/verbose)?",default:"moderate"},{id:"error_handling",question:"Error handling preference (try/catch/result-type)?",default:"try/catch"}];if(n.answers)try{let i=JSON.parse(n.answers);f({questionnaire:s,answers:i,complete:!0},e)}catch{f({questionnaire:s,answers:null,complete:!1},e)}else f({questionnaire:s,instructions:`Re-run with --answers '{"style":"...","testing":"..."}' to record preferences`},e)}function qi(n,e,s){let i=Kt(e.analysis,n),t=Rt(n,e.output,".dev-preferences.md"),r=e.stack?`
345
+
346
+ ## Stack
347
+
348
+ ${e.stack}`:"",o=i?`# Developer Preferences
349
+
350
+ *Generated from session analysis*${r}
351
+
352
+ ${JSON.stringify(i,null,2)}
353
+ `:`# Developer Preferences
354
+
355
+ *No analysis provided \u2014 edit manually.*${r}
356
+ `;Ue.default.writeFileSync(t,o,"utf-8"),f({written:!0,path:G(Ae.default.relative(n,t))},s,t)}function Wi(n,e,s){let i=Kt(e.analysis,n),t=e.global?Ae.default.join(process.env.HOME??"",".claude","CLAUDE.md"):Rt(n,e.output,"CLAUDE.md");Ue.default.mkdirSync(Ae.default.dirname(t),{recursive:!0});let r=i?`# Claude Profile
357
+
358
+ *Generated from session analysis*
359
+
360
+ ${JSON.stringify(i,null,2)}
361
+ `:`# Claude Profile
362
+
363
+ *No analysis provided \u2014 edit manually.*
364
+ `;Ue.default.writeFileSync(t,r,"utf-8"),f({written:!0,path:e.global?t:G(Ae.default.relative(n,t))},s,t)}function Li(n,e,s){let i=Rt(n,e.output,"CLAUDE.md");if(Ue.default.existsSync(i)&&!e.force&&!e.auto){f({written:!1,reason:"File already exists. Use --force to overwrite.",path:G(Ae.default.relative(n,i))},s,"exists");return}Ue.default.writeFileSync(i,`# CLAUDE.md
365
+
366
+ *Agent profile for this project.*
367
+
368
+ ## Quick Start
369
+
370
+ See \`.planning/PROJECT.md\` for project overview.
371
+
372
+ ## GSD Integration
373
+
374
+ This project uses GSD (Get Shit Done) for structured development. Run \`/gsd-help\` to see available commands.
375
+ `,"utf-8"),f({written:!0,path:G(Ae.default.relative(n,i))},s,i)}var Ue,Ae,nt=le(()=>{"use strict";Ue=N(require("fs")),Ae=N(require("path"));me()});var $n={};ue($n,{cmdWorkstreamComplete:()=>Bi,cmdWorkstreamCreate:()=>Gi,cmdWorkstreamGet:()=>Hi,cmdWorkstreamList:()=>Vi,cmdWorkstreamProgress:()=>Yi,cmdWorkstreamSet:()=>Ji,cmdWorkstreamStatus:()=>zi});function Ui(n,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let s=J(n),i=E.default.join(s,"workstreams",e);if(I.default.existsSync(E.default.join(s,"workstreams")))throw new Error("Already in workstream mode - .planning/workstreams/ exists");let t=[{name:"ROADMAP.md",type:"file"},{name:"STATE.md",type:"file"},{name:"REQUIREMENTS.md",type:"file"},{name:"phases",type:"dir"}];I.default.mkdirSync(i,{recursive:!0});let r=[];try{for(let o of t){let a=E.default.join(s,o.name);I.default.existsSync(a)&&(I.default.renameSync(a,E.default.join(i,o.name)),r.push(o.name))}}catch(o){for(let a of r)try{I.default.renameSync(E.default.join(i,a),E.default.join(s,a))}catch{}try{I.default.rmSync(i,{recursive:!0})}catch{}try{I.default.rmdirSync(E.default.join(s,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:r}}function Gi(n,e,s,i){e||S("workstream name required. Usage: workstream create <name>");let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");t||S("Invalid workstream name - must contain at least one alphanumeric character");let r=J(n);I.default.existsSync(r)||S(".planning/ directory not found - run /gsd-new-project first");let o=E.default.join(r,"workstreams"),a=E.default.join(o,t);if(I.default.existsSync(a)&&I.default.existsSync(E.default.join(a,"STATE.md"))){f({created:!1,error:"already_exists",workstream:t,path:G(E.default.relative(n,a))},i);return}let l=!I.default.existsSync(o),c=null;if(l&&s.migrate!==!1)if(I.default.existsSync(E.default.join(r,"ROADMAP.md"))||I.default.existsSync(E.default.join(r,"STATE.md"))||I.default.existsSync(E.default.join(r,"phases"))){let y=s.migrateName??null,g;if(y)g=y;else try{let _=te(n);g=Fe(_.name)||"default"}catch{g="default"}try{c=Ui(n,g)}catch(_){f({created:!1,error:"migration_failed",message:_.message},i);return}}else I.default.mkdirSync(o,{recursive:!0});I.default.mkdirSync(a,{recursive:!0}),I.default.mkdirSync(E.default.join(a,"phases"),{recursive:!0});let d=new Date().toISOString().split("T")[0],u=["---",`workstream: ${t}`,`created: ${d}`,"---","","# Project State","","## Current Position","**Status:** Not started","**Current Phase:** None",`**Last Activity:** ${d}`,"**Last Activity Description:** Workstream created","","## Progress","**Phases Complete:** 0","**Current Plan:** N/A","","## Session Continuity","**Stopped At:** N/A","**Resume File:** None",""].join(`
376
+ `),m=E.default.join(a,"STATE.md");I.default.existsSync(m)||I.default.writeFileSync(m,u,"utf-8"),Ye(n,t);let p=G(E.default.relative(n,a));f({created:!0,workstream:t,path:p,state_path:p+"/STATE.md",phases_path:p+"/phases",migration:c??null,active:!0},i)}function Vi(n,e){let s=E.default.join(J(n),"workstreams");if(!I.default.existsSync(s)){f({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let i=[];for(let t of I.default.readdirSync(s,{withFileTypes:!0}).filter(r=>r.isDirectory())){let r=E.default.join(s,t.name),o=E.default.join(r,"phases"),a=De(o),l=0;for(let u of a)try{let m=I.default.readdirSync(E.default.join(o,u)),p=ot(m),h=at(m);p.length>0&&h.length>=p.length&&l++}catch{}let c="unknown",d=null;try{let u=I.default.readFileSync(E.default.join(r,"STATE.md"),"utf-8");c=V(u,"Status")||"unknown",d=V(u,"Current Phase")}catch{}i.push({name:t.name,path:G(E.default.relative(n,r)),has_roadmap:I.default.existsSync(E.default.join(r,"ROADMAP.md")),has_state:I.default.existsSync(E.default.join(r,"STATE.md")),status:c,current_phase:d,phase_count:a.length,completed_phases:l})}f({mode:"workstream",workstreams:i,count:i.length},e)}function zi(n,e,s){e||S("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&S("Invalid workstream name");let i=E.default.join(J(n),"workstreams",e);if(!I.default.existsSync(i)){f({found:!1,workstream:e},s);return}let t=R(n,e),r={roadmap:I.default.existsSync(t.roadmap),state:I.default.existsSync(t.state),requirements:I.default.existsSync(t.requirements)},o=[];for(let l of De(t.phases).sort())try{let c=I.default.readdirSync(E.default.join(t.phases,l)),d=ot(c),u=at(c);o.push({directory:l,status:u.length>=d.length&&d.length>0?"complete":d.length>0?"in_progress":"pending",plan_count:d.length,summary_count:u.length})}catch{}let a={};try{let l=I.default.readFileSync(t.state,"utf-8");a={status:V(l,"Status")||"unknown",current_phase:V(l,"Current Phase"),last_activity:V(l,"Last Activity")}}catch{}f({found:!0,workstream:e,path:G(E.default.relative(n,i)),files:r,phases:o,phase_count:o.length,completed_phases:o.filter(l=>l.status==="complete").length,...a},s)}function Bi(n,e,s,i){e||S("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&S("Invalid workstream name");let t=J(n),r=E.default.join(t,"workstreams"),o=E.default.join(r,e);if(!I.default.existsSync(o)){f({completed:!1,error:"not_found",workstream:e},i);return}let a=He(n);a===e&&Ye(n,null);let l=E.default.join(t,"milestones"),c=new Date().toISOString().split("T")[0],d=E.default.join(l,`ws-${e}-${c}`),u=1;for(;I.default.existsSync(d);)d=E.default.join(l,`ws-${e}-${c}-${u++}`);I.default.mkdirSync(d,{recursive:!0});let m=[];try{for(let h of I.default.readdirSync(o,{withFileTypes:!0}))I.default.renameSync(E.default.join(o,h.name),E.default.join(d,h.name)),m.push(h.name)}catch(h){for(let y of m)try{I.default.renameSync(E.default.join(d,y),E.default.join(o,y))}catch{}try{I.default.rmSync(d,{recursive:!0})}catch{}a===e&&Ye(n,e),f({completed:!1,error:"archive_failed",message:h.message,workstream:e},i);return}try{I.default.rmdirSync(o)}catch{}let p=0;try{p=I.default.readdirSync(r,{withFileTypes:!0}).filter(h=>h.isDirectory()).length,p===0&&I.default.rmdirSync(r)}catch{}f({completed:!0,workstream:e,archived_to:G(E.default.relative(n,d)),remaining_workstreams:p,reverted_to_flat:p===0},i)}function Ji(n,e,s){if(!e){Ye(n,null),f({active:null,cleared:!0},s);return}if(!/^[a-zA-Z0-9_-]+$/.test(e)){f({active:null,error:"invalid_name",message:"Workstream name must be alphanumeric, hyphens, and underscores only"},s);return}let i=E.default.join(J(n),"workstreams",e);if(!I.default.existsSync(i)){f({active:null,error:"not_found",workstream:e},s);return}Ye(n,e),f({active:e,set:!0},s,e)}function Hi(n,e){let s=He(n),i=E.default.join(J(n),"workstreams");f({active:s,mode:I.default.existsSync(i)?"workstream":"flat"},e,s||"none")}function Yi(n,e){let s=J(n),i=E.default.join(s,"workstreams");if(!I.default.existsSync(i)){f({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let t=He(n),r=[];for(let o of I.default.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=E.default.join(i,o.name),l=E.default.join(a,"phases"),c=De(l),d=0,u=0,m=0;for(let g of c)try{let _=I.default.readdirSync(E.default.join(l,g)),b=ot(_),x=at(_);u+=b.length,m+=Math.min(x.length,b.length),b.length>0&&x.length>=b.length&&d++}catch{}let p=c.length;try{let _=I.default.readFileSync(E.default.join(a,"ROADMAP.md"),"utf-8").match(/^###?\s+Phase\s+\d/gm);_&&(p=_.length)}catch{}let h="unknown",y=null;try{let g=I.default.readFileSync(E.default.join(a,"STATE.md"),"utf-8");h=V(g,"Status")||"unknown",y=V(g,"Current Phase")}catch{}r.push({name:o.name,active:o.name===t,status:h,current_phase:y,phases:`${d}/${p}`,plans:`${m}/${u}`,progress_percent:p>0?Math.round(d/p*100):0})}f({mode:"workstream",active:t,workstreams:r,count:r.length},e)}var I,E,An=le(()=>{"use strict";I=N(require("fs")),E=N(require("path"));me();ze()});var Me=N(require("fs")),st=N(require("path"));me();var on=require("jsonpath-plus");function an(n,e,s){let i=n;if(s&&(i=(0,on.JSONPath)({path:s,json:n,wrap:!1})),e==="toon"){let{encode:t}=require("@toon-format/toon");return t(i)}return JSON.stringify(i,null,2)}function _e(n,e=[],s=[]){let i={};for(let t of e){let r=n.indexOf(`--${t}`);i[t]=r!==-1&&n[r+1]!==void 0&&!n[r+1].startsWith("--")?n[r+1]:null}for(let t of s)i[t]=n.includes(`--${t}`);return i}function Rn(n,e){let s=n.indexOf(`--${e}`);if(s===-1)return null;let i=[];for(let t=s+1;t<n.length&&!n[t].startsWith("--");t++)i.push(n[t]);return i.length>0?i.join(" "):null}function Ki(n,e){let s=e.split("."),i=n;for(let t of s){if(i==null)return;let r=t.match(/^(.+?)\[(-?\d+)]$/);if(r){let o=r[1],a=parseInt(r[2],10);if(i=i[o],!Array.isArray(i))return;i=a<0?i[i.length+a]:i[a]}else i=i[t]}return i}async function Zi(){let n=process.argv.slice(2),e=process.cwd(),s=n.find(_=>_.startsWith("--cwd=")),i=n.indexOf("--cwd");if(s){let _=s.slice(6).trim();_||S("Missing value for --cwd"),n.splice(n.indexOf(s),1),e=st.default.resolve(_)}else if(i!==-1){let _=n[i+1];(!_||_.startsWith("--"))&&S("Missing value for --cwd"),n.splice(i,2),e=st.default.resolve(_)}if((!Me.default.existsSync(e)||!Me.default.statSync(e).isDirectory())&&S(`Invalid --cwd: ${e}`),!Me.default.existsSync(st.default.join(e,".planning"))){let _=rn(e);_!==e&&(e=_)}let t=n.find(_=>_.startsWith("--ws=")),r=n.indexOf("--ws"),o=null;t?(o=t.slice(5).trim(),o||S("Missing value for --ws"),n.splice(n.indexOf(t),1)):r!==-1?(o=n[r+1],(!o||o.startsWith("--"))&&S("Missing value for --ws"),n.splice(r,2)):process.env.GSD_WORKSTREAM?o=process.env.GSD_WORKSTREAM.trim():o=He(e),o&&!/^[a-zA-Z0-9_-]+$/.test(o)&&S("Invalid workstream name"),o&&(process.env.GSD_WORKSTREAM=o);let a=n.indexOf("--raw"),l=a!==-1;a!==-1&&n.splice(a,1);let c="json",d=n.findIndex(_=>_==="--output"||_==="-o");if(d!==-1){let _=n[d+1];(!_||_.startsWith("--"))&&S("Missing value for --output"),_!=="json"&&_!=="toon"&&S('--output must be "json" or "toon"'),c=_,n.splice(d,2)}let u=null,m=n.findIndex(_=>_==="--pick"||_==="-p");m!==-1&&(u=n[m+1],(!u||u.startsWith("--"))&&S("Missing value for --pick"),n.splice(m,2));let p=n.indexOf("--pick"),h=null;p!==-1&&(h=n[p+1],(!h||h.startsWith("--"))&&S("Missing value for --pick"),n.splice(p,2));let y=n[0];if(y||S(`Usage: gsd-tools <command> [args] [--raw] [--output json|toon] [--pick <path>] [--cwd <path>] [--ws <name>]
377
+ Commands: state, resolve-model, find-phase, commit, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, init, workstream, phase, roadmap, milestone, scaffold, progress, audit-uat, uat, validate, stats, todo, frontmatter, verify-summary`),new Set(["generate-slug","current-timestamp","verify-path-exists","verify-summary","template","frontmatter","generate-model-profiles-md"]).has(y)||(e=sn(e)),h||u||c!=="json"){let _=Me.default.writeSync.bind(Me.default),b=[];Me.default.writeSync=(P,v,...k)=>P===1?(b.push(String(v)),String(v).length):_(P,v,...k);let x=()=>{Me.default.writeSync=_;let P=b.join(""),v=P;v.startsWith("@file:")&&(v=Me.default.readFileSync(v.slice(6),"utf-8"));try{let k=JSON.parse(v),F=k;h&&(F=Ki(k,h)??"");let A=an(F,c,u??void 0);_(1,A)}catch{_(1,P)}};try{await jn(y,n,e,l),x()}catch(P){throw Me.default.writeSync=_,P}return}await jn(y,n,e,l)}async function jn(n,e,s,i){switch(n){case"state":{let t=await Promise.resolve().then(()=>(ze(),Wt)),r=e[1];if(r==="json")t.cmdStateJson(s,i);else if(r==="update")t.cmdStateUpdate(s,e[2],e[3]);else if(r==="get")t.cmdStateGet(s,e[2],i);else if(r==="patch"){let o={};for(let a=2;a<e.length;a+=2){let l=e[a].replace(/^--/,"");l&&e[a+1]!==void 0&&(o[l]=e[a+1])}t.cmdStatePatch(s,o,i)}else if(r==="advance-plan")t.cmdStateAdvancePlan(s,i);else if(r==="record-metric"){let{phase:o,plan:a,duration:l,tasks:c,files:d}=_e(e,["phase","plan","duration","tasks","files"]);t.cmdStateRecordMetric(s,{phase:o,plan:a,duration:l,tasks:c,files:d},i)}else if(r==="update-progress")t.cmdStateUpdateProgress(s,i);else if(r==="add-decision"){let{phase:o,summary:a,"summary-file":l,rationale:c,"rationale-file":d}=_e(e,["phase","summary","summary-file","rationale","rationale-file"]);t.cmdStateAddDecision(s,{phase:o,summary:a,summary_file:l,rationale:c||"",rationale_file:d},i)}else if(r==="add-blocker"){let{text:o,"text-file":a}=_e(e,["text","text-file"]);t.cmdStateAddBlocker(s,{text:o,text_file:a},i)}else if(r==="resolve-blocker")t.cmdStateResolveBlocker(s,_e(e,["text"]).text,i);else if(r==="record-session"){let{"stopped-at":o,"resume-file":a}=_e(e,["stopped-at","resume-file"]);t.cmdStateRecordSession(s,{stopped_at:o,resume_file:a||"None"},i)}else if(r==="begin-phase"){let{phase:o,name:a,plans:l}=_e(e,["phase","name","plans"]);t.cmdStateBeginPhase(s,o,a,l!==null?parseInt(l,10):null,i)}else if(r==="signal-waiting"){let{type:o,question:a,options:l,phase:c}=_e(e,["type","question","options","phase"]);t.cmdSignalWaiting(s,o,a,l,c,i)}else r==="signal-resume"?t.cmdSignalResume(s,i):t.cmdStateLoad(s,i);break}case"resolve-model":{let{cmdResolveModel:t}=await Promise.resolve().then(()=>(he(),fe));t(s,e[1],i);break}case"find-phase":{let{cmdFindPhase:t}=await Promise.resolve().then(()=>(dt(),ct));t(s,e[1],i);break}case"commit":{let{cmdCommit:t}=await Promise.resolve().then(()=>(he(),fe)),r=e.includes("--amend"),o=e.includes("--no-verify"),a=e.indexOf("--files"),l=a!==-1?a:e.length,d=e.slice(1,l).filter(m=>!m.startsWith("--")).join(" ")||void 0,u=a!==-1?e.slice(a+1).filter(m=>!m.startsWith("--")):[];t(s,d,u,i,r,o);break}case"commit-to-subrepo":{let{cmdCommitToSubrepo:t}=await Promise.resolve().then(()=>(he(),fe)),r=e.indexOf("--files"),o=r!==-1?e.slice(r+1).filter(a=>!a.startsWith("--")):[];t(s,e[1],o,i);break}case"verify-summary":{let{cmdVerifySummary:t}=await Promise.resolve().then(()=>(kt(),vt)),r=e.indexOf("--check-count"),o=r!==-1?parseInt(e[r+1],10):2;t(s,e[1],o,i);break}case"template":{let{cmdTemplateSelect:t,cmdTemplateFill:r}=await Promise.resolve().then(()=>(hn(),fn)),o=e[1];if(o==="select")t(s,e[2],i);else if(o==="fill"){let a=e[2],{phase:l,plan:c,name:d,type:u,wave:m,fields:p}=_e(e,["phase","plan","name","type","wave","fields"]),h={};if(p){let{safeJsonParse:y}=await Promise.resolve().then(()=>(lt(),dn)),g=y(p,{label:"--fields"});g.ok||S(g.error),h=g.value}r(s,a,{phase:l,plan:c,name:d,fields:h,type:u||"execute",wave:m||"1"},i)}else S("Unknown template subcommand. Available: select, fill");break}case"frontmatter":{let t=await Promise.resolve().then(()=>(We(),ln)),r=e[1],o=e[2];if(r==="get")t.cmdFrontmatterGet(s,o,_e(e,["field"]).field,i);else if(r==="set"){let{field:a,value:l}=_e(e,["field","value"]);t.cmdFrontmatterSet(s,o,a??void 0,l??void 0,i)}else r==="merge"?t.cmdFrontmatterMerge(s,o,_e(e,["data"]).data??void 0,i):r==="validate"?t.cmdFrontmatterValidate(s,o,_e(e,["schema"]).schema??void 0,i):S("Unknown frontmatter subcommand. Available: get, set, merge, validate");break}case"verify":{let t=await Promise.resolve().then(()=>(kt(),vt)),r=e[1];r==="plan-structure"?t.cmdVerifyPlanStructure(s,e[2],i):r==="phase-completeness"?t.cmdVerifyPhaseCompleteness(s,e[2],i):r==="references"?t.cmdVerifyReferences(s,e[2],i):r==="commits"?t.cmdVerifyCommits(s,e.slice(2),i):r==="artifacts"?t.cmdVerifyArtifacts(s,e[2],i):r==="key-links"?t.cmdVerifyKeyLinks(s,e[2],i):S("Unknown verify subcommand. Available: plan-structure, phase-completeness, references, commits, artifacts, key-links");break}case"generate-slug":{let{cmdGenerateSlug:t}=await Promise.resolve().then(()=>(he(),fe));t(e[1],i);break}case"current-timestamp":{let{cmdCurrentTimestamp:t}=await Promise.resolve().then(()=>(he(),fe));t(e[1]||"full",i);break}case"list-todos":{let{cmdListTodos:t}=await Promise.resolve().then(()=>(he(),fe));t(s,e[1],i);break}case"verify-path-exists":{let{cmdVerifyPathExists:t}=await Promise.resolve().then(()=>(he(),fe));t(s,e[1],i);break}case"config-ensure-section":{let{cmdConfigEnsureSection:t}=await Promise.resolve().then(()=>(et(),Xe));t(s,i);break}case"config-set":{let{cmdConfigSet:t}=await Promise.resolve().then(()=>(et(),Xe));t(s,e[1],e[2],i);break}case"config-set-model-profile":{let{cmdConfigSetModelProfile:t}=await Promise.resolve().then(()=>(et(),Xe));t(s,e[1],i);break}case"config-get":{let{cmdConfigGet:t}=await Promise.resolve().then(()=>(et(),Xe));t(s,e[1],i);break}case"config-new-project":{let{cmdConfigNewProject:t}=await Promise.resolve().then(()=>(et(),Xe));t(s,e[1],i);break}case"agent-skills":{let{cmdAgentSkills:t}=await Promise.resolve().then(()=>(Vt(),Gt));t(s,e[1],i);break}case"history-digest":{let{cmdHistoryDigest:t}=await Promise.resolve().then(()=>(he(),fe));t(s,i);break}case"phases":{let{cmdPhasesList:t}=await Promise.resolve().then(()=>(dt(),ct));if(e[1]==="list"){let o=e.indexOf("--type"),a=e.indexOf("--phase");t(s,{type:o!==-1?e[o+1]:null,phase:a!==-1?e[a+1]:null,includeArchived:e.includes("--include-archived")},i)}else S("Unknown phases subcommand. Available: list");break}case"roadmap":{let t=await Promise.resolve().then(()=>(vn(),xn)),r=e[1];r==="get-phase"?t.cmdRoadmapGetPhase(s,e[2],i):r==="analyze"?t.cmdRoadmapAnalyze(s,i):r==="update-plan-progress"?t.cmdRoadmapUpdatePlanProgress(s,e[2],i):S("Unknown roadmap subcommand. Available: get-phase, analyze, update-plan-progress");break}case"requirements":{let{cmdRequirementsMarkComplete:t}=await Promise.resolve().then(()=>(Bt(),zt));e[1]==="mark-complete"?t(s,e.slice(2),i):S("Unknown requirements subcommand. Available: mark-complete");break}case"phase":{let t=await Promise.resolve().then(()=>(dt(),ct)),r=e[1];if(r==="next-decimal")t.cmdPhaseNextDecimal(s,e[2],i);else if(r==="add"){let o=e.indexOf("--id"),a=null,l=[];for(let c=2;c<e.length;c++)e[c]==="--id"&&c+1<e.length?(a=e[c+1],c++):l.push(e[c]);t.cmdPhaseAdd(s,l.join(" "),i,a)}else r==="insert"?t.cmdPhaseInsert(s,e[2],e.slice(3).join(" "),i):r==="remove"?t.cmdPhaseRemove(s,e[2],{force:e.includes("--force")},i):r==="complete"?t.cmdPhaseComplete(s,e[2],i):S("Unknown phase subcommand. Available: next-decimal, add, insert, remove, complete");break}case"milestone":{let{cmdMilestoneComplete:t}=await Promise.resolve().then(()=>(Bt(),zt));if(e[1]==="complete"){let r=Rn(e,"name");t(s,e[2],{name:r,archivePhases:e.includes("--archive-phases")},i)}else S("Unknown milestone subcommand. Available: complete");break}case"validate":{let t=await Promise.resolve().then(()=>(kt(),vt)),r=e[1];r==="consistency"?t.cmdValidateConsistency(s,i):r==="health"?t.cmdValidateHealth(s,{repair:e.includes("--repair")},i):r==="agents"?t.cmdValidateAgents(s,i):S("Unknown validate subcommand. Available: consistency, health, agents");break}case"progress":{let{cmdProgressRender:t}=await Promise.resolve().then(()=>(he(),fe));t(s,e[1]||"json",i);break}case"audit-uat":{let{cmdAuditUat:t}=await Promise.resolve().then(()=>(Ht(),Jt));t(s,i);break}case"uat":{let t=await Promise.resolve().then(()=>(Ht(),Jt));e[1]==="render-checkpoint"?t.cmdRenderCheckpoint(s,_e(e,["file"]),i):S("Unknown uat subcommand. Available: render-checkpoint");break}case"stats":{let{cmdStats:t}=await Promise.resolve().then(()=>(he(),fe));t(s,e[1]||"json",i);break}case"todo":{let t=e[1];if(t==="complete"){let{cmdTodoComplete:r}=await Promise.resolve().then(()=>(he(),fe));r(s,e[2],i)}else if(t==="match-phase"){let{cmdTodoMatchPhase:r}=await Promise.resolve().then(()=>(he(),fe));r(s,e[2],i)}else S("Unknown todo subcommand. Available: complete, match-phase");break}case"scaffold":{let{cmdScaffold:t}=await Promise.resolve().then(()=>(he(),fe));t(s,e[1],{phase:_e(e,["phase"]).phase,name:Rn(e,"name")},i);break}case"init":{let t=await Promise.resolve().then(()=>(Vt(),Gt)),r=e[1];switch(r){case"execute-phase":t.cmdInitExecutePhase(s,e[2],i);break;case"plan-phase":t.cmdInitPlanPhase(s,e[2],i);break;case"new-project":t.cmdInitNewProject(s,i);break;case"new-milestone":t.cmdInitNewMilestone(s,i);break;case"quick":t.cmdInitQuick(s,e.slice(2).join(" "),i);break;case"resume":t.cmdInitResume(s,i);break;case"verify-work":t.cmdInitVerifyWork(s,e[2],i);break;case"phase-op":t.cmdInitPhaseOp(s,e[2],i);break;case"todos":t.cmdInitTodos(s,e[2],i);break;case"milestone-op":t.cmdInitMilestoneOp(s,i);break;case"map-codebase":t.cmdInitMapCodebase(s,i);break;case"progress":t.cmdInitProgress(s,i);break;case"manager":t.cmdInitManager(s,i);break;case"new-workspace":t.cmdInitNewWorkspace(s,i);break;case"list-workspaces":t.cmdInitListWorkspaces(s,i);break;case"remove-workspace":t.cmdInitRemoveWorkspace(s,e[2],i);break;default:S(`Unknown init workflow: ${r}
378
+ Available: execute-phase, plan-phase, new-project, new-milestone, quick, resume, verify-work, phase-op, todos, milestone-op, map-codebase, progress, manager, new-workspace, list-workspaces, remove-workspace`)}break}case"phase-plan-index":{let{cmdPhasePlanIndex:t}=await Promise.resolve().then(()=>(dt(),ct));t(s,e[1],i);break}case"state-snapshot":{let{cmdStateSnapshot:t}=await Promise.resolve().then(()=>(ze(),Wt));t(s,i);break}case"summary-extract":{let{cmdSummaryExtract:t}=await Promise.resolve().then(()=>(he(),fe)),r=e.indexOf("--fields"),o=r!==-1?e[r+1].split(","):null;t(s,e[1],o,i);break}case"websearch":{let{cmdWebsearch:t}=await Promise.resolve().then(()=>(he(),fe)),r=e.indexOf("--limit"),o=e.indexOf("--freshness");await t(e[1],{limit:r!==-1?parseInt(e[r+1],10):10,freshness:o!==-1?e[o+1]:null},i);break}case"scan-sessions":{let{cmdScanSessions:t}=await Promise.resolve().then(()=>(At(),$t)),r=e.indexOf("--path");await t(r!==-1?e[r+1]:null,{verbose:e.includes("--verbose"),json:e.includes("--json")},i);break}case"extract-messages":{let{cmdExtractMessages:t}=await Promise.resolve().then(()=>(At(),$t)),r=e.indexOf("--session"),o=e.indexOf("--limit"),a=e.indexOf("--path");(!e[1]||e[1].startsWith("--"))&&S("Usage: gsd-tools extract-messages <project> [--session <id>] [--limit N] [--path <dir>]"),await t(e[1],{sessionId:r!==-1?e[r+1]:null,limit:o!==-1?parseInt(e[o+1],10):null},i,a!==-1?e[a+1]:null);break}case"profile-sample":{let{cmdProfileSample:t}=await Promise.resolve().then(()=>(At(),$t)),r=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),l=e.indexOf("--max-chars");await t(r!==-1?e[r+1]:null,{limit:o!==-1?parseInt(e[o+1],10):150,maxPerProject:a!==-1?parseInt(e[a+1],10):null,maxChars:l!==-1?parseInt(e[l+1],10):500},i);break}case"write-profile":{let{cmdWriteProfile:t}=await Promise.resolve().then(()=>(nt(),tt)),r=e.indexOf("--input"),o=e.indexOf("--output");r===-1&&S("--input <analysis-json-path> is required"),t(s,{input:e[r+1],output:o!==-1?e[o+1]:null},i);break}case"profile-questionnaire":{let{cmdProfileQuestionnaire:t}=await Promise.resolve().then(()=>(nt(),tt)),r=e.indexOf("--answers");t({answers:r!==-1?e[r+1]:null},i);break}case"generate-dev-preferences":{let{cmdGenerateDevPreferences:t}=await Promise.resolve().then(()=>(nt(),tt)),r=e.indexOf("--analysis"),o=e.indexOf("--output"),a=e.indexOf("--stack");t(s,{analysis:r!==-1?e[r+1]:null,output:o!==-1?e[o+1]:null,stack:a!==-1?e[a+1]:null},i);break}case"generate-claude-profile":{let{cmdGenerateClaudeProfile:t}=await Promise.resolve().then(()=>(nt(),tt)),r=e.indexOf("--analysis"),o=e.indexOf("--output");t(s,{analysis:r!==-1?e[r+1]:null,output:o!==-1?e[o+1]:null,global:e.includes("--global")},i);break}case"generate-claude-md":{let{cmdGenerateClaudeMd:t}=await Promise.resolve().then(()=>(nt(),tt)),r=e.indexOf("--output");t(s,{output:r!==-1?e[r+1]:null,auto:e.includes("--auto"),force:e.includes("--force")},i);break}case"workstream":{let t=await Promise.resolve().then(()=>(An(),$n)),r=e[1];if(r==="create"){let o=e.indexOf("--migrate-name");t.cmdWorkstreamCreate(s,e[2],{migrate:!e.includes("--no-migrate"),migrateName:o!==-1?e[o+1]:null},i)}else r==="list"?t.cmdWorkstreamList(s,i):r==="status"?t.cmdWorkstreamStatus(s,e[2],i):r==="complete"?t.cmdWorkstreamComplete(s,e[2],{},i):r==="set"?t.cmdWorkstreamSet(s,e[2],i):r==="get"?t.cmdWorkstreamGet(s,i):r==="progress"?t.cmdWorkstreamProgress(s,i):S("Unknown workstream subcommand. Available: create, list, status, complete, set, get, progress");break}case"generate-model-profiles-md":{let{generateModelProfilesMd:t,HARNESS_CONFIG:r}=await Promise.resolve().then(()=>(it(),en)),o=e.indexOf("--harness"),a=e.indexOf("--output"),l=e.includes("--stdout"),c=o!==-1?e[o+1]:null,d=a!==-1?e[a+1]:null;if(!c){let h=__dirname.match(/\.([a-z]+)\/get-shit-done\/bin/);c=h?h[1]:"agent"}r[c]||S(`Unknown harness: "${c}". Valid values: ${Object.keys(r).join(", ")}`);let u=t(c);if(l){process.stdout.write(u);break}let m=d?st.default.resolve(d):st.default.resolve(__dirname,"..","references","model-profiles.md");import("fs").then(({writeFileSync:p})=>p(m,u,"utf-8")),Me.default.writeFileSync(m,u,"utf-8"),i?process.stdout.write(m):process.stdout.write(`Wrote ${m}
379
+ `);break}default:S(`Unknown command: ${n}`)}}Zi().catch(n=>{process.stderr.write("Fatal: "+n.message+`
380
+ `),process.exit(1)});