pi-gsd 1.12.3 → 2.0.0

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 (120) hide show
  1. package/.gsd/extensions/pi-gsd-hooks.ts +330 -150
  2. package/.gsd/harnesses/pi/get-shit-done/workflows/add-phase.md +66 -11
  3. package/.gsd/harnesses/pi/get-shit-done/workflows/add-tests.md +69 -4
  4. package/.gsd/harnesses/pi/get-shit-done/workflows/add-todo.md +30 -4
  5. package/.gsd/harnesses/pi/get-shit-done/workflows/audit-milestone.md +75 -17
  6. package/.gsd/harnesses/pi/get-shit-done/workflows/audit-uat.md +38 -0
  7. package/.gsd/harnesses/pi/get-shit-done/workflows/autonomous.md +95 -286
  8. package/.gsd/harnesses/pi/get-shit-done/workflows/check-todos.md +67 -4
  9. package/.gsd/harnesses/pi/get-shit-done/workflows/cleanup.md +25 -0
  10. package/.gsd/harnesses/pi/get-shit-done/workflows/complete-milestone.md +51 -529
  11. package/.gsd/harnesses/pi/get-shit-done/workflows/diagnose-issues.md +39 -0
  12. package/.gsd/harnesses/pi/get-shit-done/workflows/discovery-phase.md +2 -0
  13. package/.gsd/harnesses/pi/get-shit-done/workflows/discuss-phase-assumptions.md +80 -5
  14. package/.gsd/harnesses/pi/get-shit-done/workflows/discuss-phase.md +43 -5
  15. package/.gsd/harnesses/pi/get-shit-done/workflows/discuss-phase.md.bak +1049 -0
  16. package/.gsd/harnesses/pi/get-shit-done/workflows/do.md +30 -3
  17. package/.gsd/harnesses/pi/get-shit-done/workflows/execute-milestone.md +64 -0
  18. package/.gsd/harnesses/pi/get-shit-done/workflows/execute-phase.md +78 -20
  19. package/.gsd/harnesses/pi/get-shit-done/workflows/execute-phase.md.bak +846 -0
  20. package/.gsd/harnesses/pi/get-shit-done/workflows/execute-plan.md +56 -19
  21. package/.gsd/harnesses/pi/get-shit-done/workflows/fast.md +2 -0
  22. package/.gsd/harnesses/pi/get-shit-done/workflows/forensics.md +40 -0
  23. package/.gsd/harnesses/pi/get-shit-done/workflows/health.md +25 -0
  24. package/.gsd/harnesses/pi/get-shit-done/workflows/help.md +2 -0
  25. package/.gsd/harnesses/pi/get-shit-done/workflows/insert-phase.md +69 -11
  26. package/.gsd/harnesses/pi/get-shit-done/workflows/list-phase-assumptions.md +2 -0
  27. package/.gsd/harnesses/pi/get-shit-done/workflows/list-workspaces.md +51 -4
  28. package/.gsd/harnesses/pi/get-shit-done/workflows/manager.md +81 -8
  29. package/.gsd/harnesses/pi/get-shit-done/workflows/map-codebase.md +40 -5
  30. package/.gsd/harnesses/pi/get-shit-done/workflows/milestone-summary.md +66 -48
  31. package/.gsd/harnesses/pi/get-shit-done/workflows/new-milestone.md +41 -13
  32. package/.gsd/harnesses/pi/get-shit-done/workflows/new-milestone.md.bak +486 -0
  33. package/.gsd/harnesses/pi/get-shit-done/workflows/new-project.md +43 -7
  34. package/.gsd/harnesses/pi/get-shit-done/workflows/new-project.md.bak +1250 -0
  35. package/.gsd/harnesses/pi/get-shit-done/workflows/new-workspace.md +55 -4
  36. package/.gsd/harnesses/pi/get-shit-done/workflows/next.md +39 -0
  37. package/.gsd/harnesses/pi/get-shit-done/workflows/node-repair.md +2 -0
  38. package/.gsd/harnesses/pi/get-shit-done/workflows/note.md +2 -0
  39. package/.gsd/harnesses/pi/get-shit-done/workflows/pause-work.md +46 -0
  40. package/.gsd/harnesses/pi/get-shit-done/workflows/plan-milestone-gaps.md +39 -0
  41. package/.gsd/harnesses/pi/get-shit-done/workflows/plan-milestone.md +40 -0
  42. package/.gsd/harnesses/pi/get-shit-done/workflows/plan-phase.md +57 -7
  43. package/.gsd/harnesses/pi/get-shit-done/workflows/plan-phase.md.bak +859 -0
  44. package/.gsd/harnesses/pi/get-shit-done/workflows/plant-seed.md +28 -0
  45. package/.gsd/harnesses/pi/get-shit-done/workflows/pr-branch.md +2 -0
  46. package/.gsd/harnesses/pi/get-shit-done/workflows/profile-user.md +51 -0
  47. package/.gsd/harnesses/pi/get-shit-done/workflows/progress.md +52 -4
  48. package/.gsd/harnesses/pi/get-shit-done/workflows/quick.md +99 -32
  49. package/.gsd/harnesses/pi/get-shit-done/workflows/remove-phase.md +66 -4
  50. package/.gsd/harnesses/pi/get-shit-done/workflows/remove-workspace.md +55 -4
  51. package/.gsd/harnesses/pi/get-shit-done/workflows/research-phase.md +79 -22
  52. package/.gsd/harnesses/pi/get-shit-done/workflows/resume-project.md +66 -4
  53. package/.gsd/harnesses/pi/get-shit-done/workflows/review.md +66 -36
  54. package/.gsd/harnesses/pi/get-shit-done/workflows/session-report.md +2 -0
  55. package/.gsd/harnesses/pi/get-shit-done/workflows/settings.md +27 -5
  56. package/.gsd/harnesses/pi/get-shit-done/workflows/ship.md +41 -4
  57. package/.gsd/harnesses/pi/get-shit-done/workflows/stats.md +24 -0
  58. package/.gsd/harnesses/pi/get-shit-done/workflows/transition.md +54 -0
  59. package/.gsd/harnesses/pi/get-shit-done/workflows/ui-phase.md +91 -6
  60. package/.gsd/harnesses/pi/get-shit-done/workflows/ui-review.md +80 -5
  61. package/.gsd/harnesses/pi/get-shit-done/workflows/update.md +2 -0
  62. package/.gsd/harnesses/pi/get-shit-done/workflows/validate-phase.md +90 -17
  63. package/.gsd/harnesses/pi/get-shit-done/workflows/verify-phase.md +79 -4
  64. package/.gsd/harnesses/pi/get-shit-done/workflows/verify-work.md +87 -31
  65. package/README.md +146 -112
  66. package/dist/pi-gsd-tools.js +166 -163
  67. package/package.json +13 -5
  68. package/prompts/gsd-add-backlog.md +2 -3
  69. package/prompts/gsd-add-phase.md +3 -2
  70. package/prompts/gsd-add-tests.md +3 -2
  71. package/prompts/gsd-add-todo.md +3 -2
  72. package/prompts/gsd-audit-milestone.md +3 -2
  73. package/prompts/gsd-audit-uat.md +3 -2
  74. package/prompts/gsd-autonomous.md +3 -2
  75. package/prompts/gsd-check-todos.md +3 -2
  76. package/prompts/gsd-cleanup.md +3 -2
  77. package/prompts/gsd-complete-milestone.md +2 -3
  78. package/prompts/gsd-debug.md +2 -3
  79. package/prompts/gsd-discuss-phase.md +4 -3
  80. package/prompts/gsd-do.md +3 -2
  81. package/prompts/gsd-execute-milestone.md +3 -2
  82. package/prompts/gsd-execute-phase.md +3 -2
  83. package/prompts/gsd-fast.md +2 -1
  84. package/prompts/gsd-forensics.md +3 -2
  85. package/prompts/gsd-insert-phase.md +3 -2
  86. package/prompts/gsd-join-discord.md +2 -3
  87. package/prompts/gsd-list-phase-assumptions.md +2 -1
  88. package/prompts/gsd-list-workspaces.md +3 -2
  89. package/prompts/gsd-manager.md +3 -2
  90. package/prompts/gsd-map-codebase.md +3 -2
  91. package/prompts/gsd-milestone-summary.md +3 -2
  92. package/prompts/gsd-new-milestone.md +3 -2
  93. package/prompts/gsd-new-project.md +3 -2
  94. package/prompts/gsd-new-workspace.md +3 -2
  95. package/prompts/gsd-note.md +2 -1
  96. package/prompts/gsd-pause-work.md +3 -2
  97. package/prompts/gsd-plan-milestone-gaps.md +3 -2
  98. package/prompts/gsd-plan-milestone.md +3 -2
  99. package/prompts/gsd-plan-phase.md +3 -2
  100. package/prompts/gsd-plant-seed.md +3 -2
  101. package/prompts/gsd-pr-branch.md +2 -1
  102. package/prompts/gsd-profile-user.md +3 -2
  103. package/prompts/gsd-quick.md +3 -2
  104. package/prompts/gsd-reapply-patches.md +2 -3
  105. package/prompts/gsd-remove-phase.md +3 -2
  106. package/prompts/gsd-remove-workspace.md +3 -2
  107. package/prompts/gsd-research-phase.md +2 -3
  108. package/prompts/gsd-resume-work.md +3 -2
  109. package/prompts/gsd-review-backlog.md +2 -3
  110. package/prompts/gsd-review.md +3 -2
  111. package/prompts/gsd-session-report.md +2 -1
  112. package/prompts/gsd-set-profile.md +2 -3
  113. package/prompts/gsd-settings.md +3 -2
  114. package/prompts/gsd-ship.md +3 -2
  115. package/prompts/gsd-thread.md +2 -3
  116. package/prompts/gsd-ui-phase.md +3 -2
  117. package/prompts/gsd-ui-review.md +3 -2
  118. package/prompts/gsd-validate-phase.md +3 -2
  119. package/prompts/gsd-verify-work.md +3 -2
  120. package/prompts/gsd-workstreams.md +2 -3
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Tn=Object.create;var Mt=Object.defineProperty;var Dn=Object.getOwnPropertyDescriptor;var On=Object.getOwnPropertyNames;var Nn=Object.getPrototypeOf,qn=Object.prototype.hasOwnProperty;var le=(n,e)=>()=>(n&&(e=n(n=0)),e);var fe=(n,e)=>{for(var s in e)Mt(n,s,{get:e[s],enumerable:!0})},Wn=(n,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of On(e))!qn.call(n,t)&&t!==s&&Mt(n,t,{get:()=>e[t],enumerable:!(i=Dn(e,t))||i.enumerable});return n};var q=(n,e,s)=>(s=n!=null?Tn(Nn(n)):{},Wn(e||!n||!n.__esModule?Mt(s,"default",{value:n,enumerable:!0}):s,n));var sn={};fe(sn,{MODEL_PROFILES:()=>je,VALID_PROFILES:()=>He,formatAgentToModelMapAsTable:()=>It,generateModelProfilesMd:()=>zn,getAgentToModelMapForProfile:()=>Ft});function Ft(n){let e={};for(let[s,i]of Object.entries(je))e[s]=i[n];return e}function It(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 zn(){let n=Ln,e=Un,s=He,i=Object.keys(je),t=["Agent",...s.map(d=>"`"+d+"`"),"`inherit`"],r="| "+t.join(" | ")+" |",o="|"+t.map(d=>"-".repeat(d.length+2)).join("|")+"|",a=i.map(d=>{let f=s.map(m=>je[d][m]);return"| "+[d,...f,"inherit"].join(" | ")+" |"}),l=[r,o,...a].join(`
6
- `),c=`${e}settings`,u=`${e}set-profile <profile>`;return`<!-- AUTO-GENERATED - do not edit by hand.
2
+ "use strict";var xi=Object.create;var $s=Object.defineProperty;var Si=Object.getOwnPropertyDescriptor;var bi=Object.getOwnPropertyNames;var vi=Object.getPrototypeOf,_i=Object.prototype.hasOwnProperty;var N=(t,e)=>()=>(t&&(e=t(t=0)),e);var he=(t,e)=>{for(var n in e)$s(t,n,{get:e[n],enumerable:!0})},wi=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of bi(e))!_i.call(t,s)&&s!==n&&$s(t,s,{get:()=>e[s],enumerable:!(r=Si(e,s))||r.enumerable});return t};var W=(t,e,n)=>(n=t!=null?xi(vi(t)):{},wi(e||!t||!t.__esModule?$s(n,"default",{value:t,enumerable:!0}):n,t));var cr={};he(cr,{MODEL_PROFILES:()=>Re,VALID_PROFILES:()=>vt,formatAgentToModelMapAsTable:()=>js,generateModelProfilesMd:()=>Ci,getAgentToModelMapForProfile:()=>As});function As(t){let e={};for(let[n,r]of Object.entries(Re))e[n]=r[t];return e}function js(t){let e=Math.max(5,...Object.keys(t).map(o=>o.length)),n=Math.max(5,...Object.values(t).map(o=>o.length)),r="\u2500".repeat(e+2)+"\u253C"+"\u2500".repeat(n+2),i=" "+"Agent".padEnd(e)+" \u2502 "+"Model".padEnd(n)+`
3
+ `+r+`
4
+ `;for(let[o,a]of Object.entries(t))i+=" "+o.padEnd(e)+" \u2502 "+a.padEnd(n)+`
5
+ `;return i}function Ci(){let t=Pi,e=ki,n=vt,r=Object.keys(Re),s=["Agent",...n.map(u=>"`"+u+"`"),"`inherit`"],i="| "+s.join(" | ")+" |",o="|"+s.map(u=>"-".repeat(u.length+2)).join("|")+"|",a=r.map(u=>{let m=n.map(p=>Re[u][p]);return"| "+[u,...m,"inherit"].join(" | ")+" |"}),c=[i,o,...a].join(`
6
+ `),l=`${e}settings`,d=`${e}set-profile <profile>`;return`<!-- AUTO-GENERATED - do not edit by hand.
7
7
  Source of truth: src/lib/model-profiles.ts
8
8
  Regenerate with: pi-gsd-tools generate-model-profiles-md
9
9
  -->
10
10
  # Model Profiles
11
11
 
12
- Model profiles control which ${n} model each GSD agent uses. This allows balancing quality vs token spend, or inheriting the currently selected session model.
12
+ Model profiles control which ${t} model each GSD agent uses. This allows balancing quality vs token spend, or inheriting the currently selected session model.
13
13
 
14
14
  ## Profile Definitions
15
15
 
16
- ${l}
16
+ ${c}
17
17
 
18
18
  ## Profile Philosophy
19
19
 
@@ -65,7 +65,7 @@ If you're using pi with OpenRouter or a local model, set the \`inherit\` profile
65
65
 
66
66
  \`\`\`bash
67
67
  # Via settings command
68
- ${c}
68
+ ${l}
69
69
  # \u2192 Select "Inherit" for model profile
70
70
 
71
71
  # Or manually in .planning/config.json
@@ -105,7 +105,7 @@ Overrides take precedence over the profile. Valid values: \`opus\`, \`sonnet\`,
105
105
 
106
106
  ## Switching Profiles
107
107
 
108
- Runtime: \`${u}\`
108
+ Runtime: \`${d}\`
109
109
 
110
110
  Per-project default: Set in \`.planning/config.json\`:
111
111
  \`\`\`json
@@ -133,63 +133,139 @@ pi's \`"opus"\` alias maps to a specific model version. Organizations may block
133
133
 
134
134
  **Why \`inherit\` profile?**
135
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 je,He,Un,Ln,rt=le(()=>{"use strict";je={"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"}},He=Object.keys(je["gsd-planner"]),Un="/gsd-",Ln="pi"});function V(n){return n.split(w.default.sep).join("/")}function rn(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=w.default.join(n,i.name,".git");try{D.default.existsSync(t)&&e.push(i.name)}catch{}}}catch{}return e.sort()}function an(n){let e=w.default.resolve(n),s=w.default.parse(e).root,i=ht.default.homedir(),t=w.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(w.default.join(l,".git")))return!0;if(l===a)break;l=w.default.dirname(l)}return!1}let o=e;for(;o!==s;){let a=w.default.dirname(o);if(a===o||a===i)break;let l=w.default.join(a,".planning");if(D.default.existsSync(l)&&D.default.statSync(l).isDirectory()){let c=w.default.join(l,"config.json");try{let u=JSON.parse(D.default.readFileSync(c,"utf-8")),d=u.sub_repos||u.planning?.sub_repos||[];if(Array.isArray(d)&&d.length>0){let m=w.default.relative(a,e).split(w.default.sep)[0];if(d.includes(m))return a}if(u.multiRepo===!0&&r(a))return a}catch{}if(r(a))return a}o=a}return n}function Bn(n="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:s=!1}={}){try{let i=ht.default.tmpdir(),t=Date.now();for(let r of D.default.readdirSync(i)){if(!r.startsWith(n))continue;let o=w.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 h(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){Bn();let r=w.default.join(ht.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 Fe(n){try{return D.default.readFileSync(n,"utf-8")}catch{return null}}function J(n){let e=w.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(u,d){if(r[u]!==void 0)return r[u];let f=r[d?.section??""];if(d&&f?.[d.field]!==void 0)return f[d.field]};var i=l;let t=D.default.readFileSync(e,"utf-8"),r=JSON.parse(t);if("depth"in r&&!("granularity"in r)){let u={quick:"coarse",standard:"standard",comprehensive:"fine"};r.granularity=u[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 u=rn(n);u.length>0&&(r.sub_repos=u,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 u=rn(n);if(u.length>0){let d=[...a].sort();JSON.stringify(d)!==JSON.stringify(u)&&(r.sub_repos=u,o=!0)}}if(o)try{D.default.writeFileSync(e,JSON.stringify(r,null,2),"utf-8")}catch{}let c=(()=>{let u=l("parallelization");return typeof u=="boolean"?u:typeof u=="object"&&u!==null&&"enabled"in u?!!u.enabled:s.parallelization})();return{model_profile:l("model_profile")??s.model_profile,commit_docs:(()=>{let u=l("commit_docs",{section:"planning",field:"commit_docs"});return u!==void 0?!!u:Ct(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 Ct(n,e){try{return(0,pt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:n,stdio:"pipe"}),!0}catch{return!1}}function oe(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 Re(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!==""&&!Gn(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)&&Jn(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(`
136
+ `}var Re,vt,ki,Pi,Dt=N(()=>{"use strict";Re={"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"}},vt=Object.keys(Re["gsd-planner"]),ki="/gsd-",Pi="pi"});var pr={};he(pr,{MODEL_ALIAS_MAP:()=>lr,MODEL_PROFILES:()=>Re,checkAgentsInstalled:()=>_t,comparePhaseNum:()=>Pe,detectSubRepos:()=>Rs,escapeRegex:()=>ne,execGit:()=>ae,extractCurrentMilestone:()=>ve,extractOneLinerFromBody:()=>Ut,filterPlanFiles:()=>wt,filterSummaryFiles:()=>kt,findPhaseInternal:()=>fe,findProjectRoot:()=>Wt,generateSlugInternal:()=>qe,getActiveWorkstream:()=>He,getAgentsDir:()=>ur,getArchivedPhaseDirs:()=>Lt,getMilestoneInfo:()=>re,getMilestonePhaseFilter:()=>Ce,getPhaseFileStats:()=>mr,getRoadmapPhaseInternal:()=>dt,gsdError:()=>b,isGitIgnored:()=>rn,loadConfig:()=>X,normalizeMd:()=>Ee,normalizePhaseName:()=>de,output:()=>y,pathExistsInternal:()=>Ri,planningDir:()=>T,planningPaths:()=>j,planningRoot:()=>Z,readSubdirectories:()=>Le,reapStaleTempFiles:()=>dr,replaceInCurrentMilestone:()=>lt,resolveModelInternal:()=>se,resolveWorktreeRoot:()=>qt,safeReadFile:()=>Oe,searchPhaseInDir:()=>Es,setActiveWorkstream:()=>ct,stripShippedMilestones:()=>Ot,toPosixPath:()=>B,withPlanningLock:()=>ji});function B(t){return t.split(A.default.sep).join("/")}function Rs(t){let e=[];try{let n=I.default.readdirSync(t,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(".")||r.name==="node_modules")continue;let s=A.default.join(t,r.name,".git");try{I.default.existsSync(s)&&e.push(r.name)}catch{}}}catch{}return e.sort()}function Wt(t){let e=A.default.resolve(t),n=A.default.parse(e).root,r=sn.default.homedir(),s=A.default.join(e,".planning");if(I.default.existsSync(s)&&I.default.statSync(s).isDirectory())return t;function i(a){let c=e;for(;c!==n;){if(I.default.existsSync(A.default.join(c,".git")))return!0;if(c===a)break;c=A.default.dirname(c)}return!1}let o=e;for(;o!==n;){let a=A.default.dirname(o);if(a===o||a===r)break;let c=A.default.join(a,".planning");if(I.default.existsSync(c)&&I.default.statSync(c).isDirectory()){let l=A.default.join(c,"config.json");try{let d=JSON.parse(I.default.readFileSync(l,"utf-8")),u=d.sub_repos||d.planning?.sub_repos||[];if(Array.isArray(u)&&u.length>0){let p=A.default.relative(a,e).split(A.default.sep)[0];if(u.includes(p))return a}if(d.multiRepo===!0&&i(a))return a}catch{}if(i(a))return a}o=a}return t}function dr(t="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:n=!1}={}){try{let r=sn.default.tmpdir(),s=Date.now();for(let i of I.default.readdirSync(r)){if(!i.startsWith(t))continue;let o=A.default.join(r,i);try{let a=I.default.statSync(o);s-a.mtimeMs>e&&(a.isDirectory()?I.default.rmSync(o,{recursive:!0,force:!0}):n||I.default.unlinkSync(o))}catch{}}}catch{}}function y(t,e=!1,n){let r;if(e&&n!==void 0)r=String(n);else{let s=JSON.stringify(t,null,2);if(s.length>5e4){dr();let i=A.default.join(sn.default.tmpdir(),`gsd-${Date.now()}.json`);I.default.writeFileSync(i,s,"utf-8"),r="@file:"+i}else r=s}I.default.writeSync(1,r)}function b(t){I.default.writeSync(2,"Error: "+t+`
137
+ `),process.exit(1)}function Oe(t){try{return I.default.readFileSync(t,"utf-8")}catch{return null}}function X(t){let e=A.default.join(t,".planning","config.json"),n={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 c=function(d,u){if(i[d]!==void 0)return i[d];let m=i[u?.section??""];if(u&&m?.[u.field]!==void 0)return m[u.field]};var r=c;let s=I.default.readFileSync(e,"utf-8"),i=JSON.parse(s);if("depth"in i&&!("granularity"in i)){let d={quick:"coarse",standard:"standard",comprehensive:"fine"};i.granularity=d[i.depth]||i.depth,delete i.depth;try{I.default.writeFileSync(e,JSON.stringify(i,null,2),"utf-8")}catch{}}let o=!1;if(i.multiRepo===!0&&!i.sub_repos&&!i.planning?.sub_repos){let d=Rs(t);d.length>0&&(i.sub_repos=d,i.planning||(i.planning={}),i.planning.commit_docs=!1,delete i.multiRepo,o=!0)}let a=i.sub_repos||i.planning?.sub_repos||[];if(Array.isArray(a)&&a.length>0){let d=Rs(t);if(d.length>0){let u=[...a].sort();JSON.stringify(u)!==JSON.stringify(d)&&(i.sub_repos=d,o=!0)}}if(o)try{I.default.writeFileSync(e,JSON.stringify(i,null,2),"utf-8")}catch{}let l=(()=>{let d=c("parallelization");return typeof d=="boolean"?d:typeof d=="object"&&d!==null&&"enabled"in d?!!d.enabled:n.parallelization})();return{model_profile:c("model_profile")??n.model_profile,commit_docs:(()=>{let d=c("commit_docs",{section:"planning",field:"commit_docs"});return d!==void 0?!!d:rn(t,".planning/")?!1:n.commit_docs})(),search_gitignored:c("search_gitignored",{section:"planning",field:"search_gitignored"})??n.search_gitignored,branching_strategy:c("branching_strategy",{section:"git",field:"branching_strategy"})??n.branching_strategy,phase_branch_template:c("phase_branch_template",{section:"git",field:"phase_branch_template"})??n.phase_branch_template,milestone_branch_template:c("milestone_branch_template",{section:"git",field:"milestone_branch_template"})??n.milestone_branch_template,quick_branch_template:c("quick_branch_template",{section:"git",field:"quick_branch_template"})??n.quick_branch_template,research:c("research",{section:"workflow",field:"research"})??n.research,plan_checker:c("plan_checker",{section:"workflow",field:"plan_check"})??n.plan_checker,verifier:c("verifier",{section:"workflow",field:"verifier"})??n.verifier,nyquist_validation:c("nyquist_validation",{section:"workflow",field:"nyquist_validation"})??n.nyquist_validation,parallelization:l,brave_search:c("brave_search")??n.brave_search,firecrawl:c("firecrawl")??n.firecrawl,exa_search:c("exa_search")??n.exa_search,text_mode:c("text_mode",{section:"workflow",field:"text_mode"})??n.text_mode,sub_repos:c("sub_repos",{section:"planning",field:"sub_repos"})??n.sub_repos,resolve_model_ids:c("resolve_model_ids")??n.resolve_model_ids,context_window:c("context_window")??n.context_window,phase_naming:c("phase_naming")??n.phase_naming,model_overrides:i.model_overrides??null,agent_skills:i.agent_skills||{}}}catch{return n}}function rn(t,e){try{return(0,Nt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:t,stdio:"pipe"}),!0}catch{return!1}}function ae(t,e){let n=(0,Nt.spawnSync)("git",e,{cwd:t,stdio:"pipe",encoding:"utf-8"});return{exitCode:n.status??1,stdout:(n.stdout??"").toString().trim(),stderr:(n.stderr??"").toString().trim()}}function Ee(t){if(!t||typeof t!="string")return t;let e=t.replace(/\r\n/g,`
138
+ `),n=e.split(`
139
+ `),r=[];for(let s=0;s<n.length;s++){let i=n[s],o=s>0?n[s-1]:"",a=o.trimEnd(),c=i.trimEnd();if(/^#{1,6}\s/.test(c)&&s>0&&a!==""&&a!=="---"&&r.push(""),/^```/.test(c)&&s>0&&a!==""&&!$i(n,s)&&r.push(""),/^(\s*[-*+]\s|\s*\d+\.\s)/.test(i)&&s>0&&a!==""&&!/^(\s*[-*+]\s|\s*\d+\.\s)/.test(o)&&a!=="---"&&r.push(""),r.push(i),/^#{1,6}\s/.test(c)&&s<n.length-1&&n[s+1]?.trimEnd()!==""&&r.push(""),/^```\s*$/.test(c)&&Ai(n,s)&&s<n.length-1&&n[s+1]?.trimEnd()!==""&&r.push(""),/^(\s*[-*+]\s|\s*\d+\.\s)/.test(i)&&s<n.length-1){let l=n[s+1];l!==void 0&&l.trimEnd()!==""&&!/^(\s*[-*+]\s|\s*\d+\.\s)/.test(l)&&!/^\s/.test(l)&&r.push("")}}return e=r.join(`
140
140
  `),e=e.replace(/\n{3,}/g,`
141
141
 
142
142
  `),e=e.replace(/\n*$/,`
143
- `),e}function Gn(n,e){let s=0;for(let i=0;i<e;i++)/^```/.test(n[i].trimEnd())&&s++;return s%2===1}function Jn(n,e){let s=0;for(let i=0;i<=e;i++)/^```/.test(n[i].trimEnd())&&s++;return s%2===0}function ln(n){if(D.default.existsSync(w.default.join(n,".planning")))return n;let e=oe(n,["rev-parse","--git-dir"]),s=oe(n,["rev-parse","--git-common-dir"]);if(e.exitCode!==0||s.exitCode!==0)return n;let i=w.default.resolve(n,e.stdout),t=w.default.resolve(n,s.stdout);return i!==t?w.default.dirname(t):n}function C(n,e){let s=e??process.env.GSD_WORKSTREAM??null;return s?w.default.join(n,".planning","workstreams",s):w.default.join(n,".planning")}function H(n){return w.default.join(n,".planning")}function R(n,e){let s=C(n,e),i=w.default.join(n,".planning");return{planning:s,state:w.default.join(s,"STATE.md"),roadmap:w.default.join(s,"ROADMAP.md"),project:w.default.join(i,"PROJECT.md"),config:w.default.join(i,"config.json"),phases:w.default.join(s,"phases"),requirements:w.default.join(s,"REQUIREMENTS.md")}}function Ye(n){let e=w.default.join(H(n),"active-workstream");try{let s=D.default.readFileSync(e,"utf-8").trim();return!s||!/^[a-zA-Z0-9_-]+$/.test(s)||!D.default.existsSync(w.default.join(H(n),"workstreams",s))?null:s}catch{return null}}function Ke(n,e){let s=w.default.join(H(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 Q(n){return String(n).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ce(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 ke(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 u=Number.isFinite(a[c])?a[c]:0,d=Number.isFinite(l[c])?l[c]:0;if(u!==d)return u-d}return 0}function on(n,e,s){try{let t=Oe(n,!0).find(v=>v.startsWith(s)||v.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=w.default.join(n,t),{plans:c,summaries:u,hasResearch:d,hasContext:f,hasVerification:m,hasReviews:p}=Yn(l),y=c.sort(),g=u.sort(),_=new Set(g.map(v=>v.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),x=y.filter(v=>!_.has(v.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:V(w.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:x,has_research:d,has_context:f,has_verification:m,has_reviews:p}}catch{return null}}function de(n,e){if(!e)return null;let s=w.default.join(C(n),"phases"),i=ce(e),t=V(w.default.relative(n,s)),r=on(s,t,i);if(r)return r;let o=w.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],u=w.default.join(o,l),d=".planning/milestones/"+l,f=on(u,d,i);if(f)return f.archived=c,f}}catch{}return null}function gt(n){let e=w.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=w.default.join(e,t);for(let a of Oe(o,!0))s.push({name:a,milestone:r,basePath:w.default.join(".planning","milestones",t),fullPath:w.default.join(o,a)})}}catch{}return s}function ft(n){return n.replace(/<details>[\s\S]*?<\/details>/gi,"")}function be(n,e){if(!e)return ft(n);let s=null;try{let d=w.default.join(C(e),"STATE.md");if(D.default.existsSync(d)){let m=D.default.readFileSync(d,"utf-8").match(/^milestone:\s*(.+)/m);m&&(s=m[1].trim())}}catch{}if(!s){let d=n.match(/🚧\s*\*\*v(\d+\.\d+)\s/);d&&(s="v"+d[1])}if(!s)return ft(n);let i=new RegExp(`(^#{1,3}\\s+.*${Q(s)}[^\\n]*)`,"mi"),t=n.match(i);if(!t)return ft(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 Ze(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 Qe(n,e){if(!e)return null;let s=w.default.join(C(n),"ROADMAP.md");if(!D.default.existsSync(s))return null;try{let i=be(D.default.readFileSync(s,"utf-8"),n),t=new RegExp(`#{2,4}\\s*Phase\\s+${Q(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),u=c?a+c.index:i.length,d=i.slice(a,u).trim(),f=d.match(/\*\*Goal(?:\*\*:|\*?\*?:\*\*)\s*([^\n]+)/i);return{found:!0,phase_number:e.toString(),phase_name:o,goal:f?f[1].trim():null,section:d}}catch{return null}}function Hn(){return w.default.join(__dirname,"..","..","agents")}function ot(){let n=Hn(),e=Object.keys(je),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(w.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 X(n,e){let s=J(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=je[e];if(!r)return"sonnet";if(t==="inherit")return"inherit";let o=r[t]||r.balanced||"sonnet";return s.resolve_model_ids&&Vn[o]||o}function yt(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 De(n){return n?n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function ie(n){try{let e=D.default.readFileSync(w.default.join(C(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=ft(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 Pe(n){let e=new Set;try{let t=be(D.default.readFileSync(w.default.join(C(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 at(n){return n.filter(e=>e.endsWith("-PLAN.md")||e==="PLAN.md")}function lt(n){return n.filter(e=>e.endsWith("-SUMMARY.md")||e==="SUMMARY.md")}function Yn(n){let e=D.default.readdirSync(n);return{plans:at(e),summaries:lt(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 Oe(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)=>ke(t,r)):i}catch{return[]}}var pt,D,ht,w,Vn,pe=le(()=>{"use strict";pt=require("child_process"),D=q(require("fs")),ht=q(require("os")),w=q(require("path"));rt();Vn={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var dn={};fe(dn,{FRONTMATTER_SCHEMAS:()=>Tt,cmdFrontmatterGet:()=>Kn,cmdFrontmatterMerge:()=>Qn,cmdFrontmatterSet:()=>Zn,cmdFrontmatterValidate:()=>Xn,extractFrontmatter:()=>ee,parseMustHavesBlock:()=>St,reconstructFrontmatter:()=>Xe,spliceFrontmatter:()=>Dt});function ee(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 u=o[o.length-1],d=a.match(/^(\s*)([a-zA-Z0-9_-]+):\s*(.*)/);if(d){let f=d[2],m=d[3].trim();m===""||m==="["?(u.obj[f]=m==="["?[]:{},u.key=null,o.push({obj:u.obj[f],key:null,indent:c})):m.startsWith("[")&&m.endsWith("]")?(u.obj[f]=m.slice(1,-1).split(",").map(p=>p.trim().replace(/^["']|["']$/g,"")).filter(Boolean),u.key=null):(u.obj[f]=m.replace(/^["']|["']$/g,""),u.key=null)}else if(a.trim().startsWith("- ")){let f=a.trim().slice(2).replace(/^["']|["']$/g,"");if(typeof u.obj=="object"&&!Array.isArray(u.obj)&&Object.keys(u.obj).length===0){let m=o.length>1?o[o.length-2]:null;if(m){for(let p of Object.keys(m.obj))if(m.obj[p]===u.obj){m.obj[p]=[f],u.obj=m.obj[p];break}}}else Array.isArray(u.obj)&&u.obj.push(f)}}return e}function Xe(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=Xe(e),i=n.match(/^---\r?\n[\s\S]+?\r?\n---/);return i?`---
146
- ${s}
147
- ---`+n.slice(i[0].length):`---
148
- ${s}
143
+ `),e}function $i(t,e){let n=0;for(let r=0;r<e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===1}function Ai(t,e){let n=0;for(let r=0;r<=e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===0}function qt(t){if(I.default.existsSync(A.default.join(t,".planning")))return t;let e=ae(t,["rev-parse","--git-dir"]),n=ae(t,["rev-parse","--git-common-dir"]);if(e.exitCode!==0||n.exitCode!==0)return t;let r=A.default.resolve(t,e.stdout),s=A.default.resolve(t,n.stdout);return r!==s?A.default.dirname(s):t}function ji(t,e){let n=A.default.join(T(t),".lock"),r=1e4,s=100,i=Date.now();try{I.default.mkdirSync(T(t),{recursive:!0})}catch{}for(;Date.now()-i<r;)try{I.default.writeFileSync(n,JSON.stringify({pid:process.pid,cwd:t,acquired:new Date().toISOString()}),{flag:"wx"});try{return e()}finally{try{I.default.unlinkSync(n)}catch{}}}catch(o){if(o.code==="EEXIST"){try{let a=I.default.statSync(n);if(Date.now()-a.mtimeMs>3e4){I.default.unlinkSync(n);continue}}catch{continue}(0,Nt.spawnSync)("sleep",["0.1"],{stdio:"ignore"});continue}throw o}try{I.default.unlinkSync(n)}catch{}return e()}function T(t,e){let n=e??process.env.GSD_WORKSTREAM??null;return n?A.default.join(t,".planning","workstreams",n):A.default.join(t,".planning")}function Z(t){return A.default.join(t,".planning")}function j(t,e){let n=T(t,e),r=A.default.join(t,".planning");return{planning:n,state:A.default.join(n,"STATE.md"),roadmap:A.default.join(n,"ROADMAP.md"),project:A.default.join(r,"PROJECT.md"),config:A.default.join(r,"config.json"),phases:A.default.join(n,"phases"),requirements:A.default.join(n,"REQUIREMENTS.md")}}function He(t){let e=A.default.join(Z(t),"active-workstream");try{let n=I.default.readFileSync(e,"utf-8").trim();return!n||!/^[a-zA-Z0-9_-]+$/.test(n)||!I.default.existsSync(A.default.join(Z(t),"workstreams",n))?null:n}catch{return null}}function ct(t,e){let n=A.default.join(Z(t),"active-workstream");if(!e){try{I.default.unlinkSync(n)}catch{}return}if(!/^[a-zA-Z0-9_-]+$/.test(e))throw new Error("Invalid workstream name");I.default.writeFileSync(n,e+`
144
+ `,"utf-8")}function ne(t){return String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function de(t){let e=String(t),n=e.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);return n?n[1].padStart(2,"0")+(n[2]?n[2].toUpperCase():"")+(n[3]||""):e}function Pe(t,e){let n=String(t).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i),r=String(e).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);if(!n||!r)return String(t).localeCompare(String(e));let s=parseInt(n[1],10)-parseInt(r[1],10);if(s!==0)return s;let i=(n[2]||"").toUpperCase(),o=(r[2]||"").toUpperCase();if(i!==o)return i?o&&i<o?-1:1:-1;let a=n[3]?n[3].slice(1).split(".").map(l=>parseInt(l,10)):[],c=r[3]?r[3].slice(1).split(".").map(l=>parseInt(l,10)):[];if(a.length===0&&c.length>0)return-1;if(c.length===0&&a.length>0)return 1;for(let l=0;l<Math.max(a.length,c.length);l++){let d=Number.isFinite(a[l])?a[l]:0,u=Number.isFinite(c[l])?c[l]:0;if(d!==u)return d-u}return 0}function Es(t,e,n){try{let s=Le(t,!0).find(_=>_.startsWith(n)||_.toUpperCase().startsWith(n.toUpperCase()));if(!s)return null;let i=s.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)||s.match(/^([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*)-(.+)/i)||[null,s,null],o=i?.[1]??n,a=i?.[2]||null,c=A.default.join(t,s),{plans:l,summaries:d,hasResearch:u,hasContext:m,hasVerification:p,hasReviews:f}=mr(c),g=l.sort(),h=d.sort(),x=new Set(h.map(_=>_.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),S=g.filter(_=>!x.has(_.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:B(A.default.join(e,s)),phase_number:o,phase_name:a,phase_slug:a?a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:g,summaries:h,incomplete_plans:S,has_research:u,has_context:m,has_verification:p,has_reviews:f}}catch{return null}}function fe(t,e){if(!e)return null;let n=A.default.join(T(t),"phases"),r=de(e),s=B(A.default.relative(t,n)),i=Es(n,s,r);if(i)return i;let o=A.default.join(t,".planning","milestones");if(!I.default.existsSync(o))return null;try{let a=I.default.readdirSync(o,{withFileTypes:!0}).filter(c=>c.isDirectory()&&/^v[\d.]+-phases$/.test(c.name)).map(c=>c.name).sort().reverse();for(let c of a){let l=c.match(/^(v[\d.]+)-phases$/)[1],d=A.default.join(o,c),u=".planning/milestones/"+c,m=Es(d,u,r);if(m)return m.archived=l,m}}catch{}return null}function Lt(t){let e=A.default.join(t,".planning","milestones"),n=[];if(!I.default.existsSync(e))return n;try{let r=I.default.readdirSync(e,{withFileTypes:!0}).filter(s=>s.isDirectory()&&/^v[\d.]+-phases$/.test(s.name)).map(s=>s.name).sort().reverse();for(let s of r){let i=s.match(/^(v[\d.]+)-phases$/)[1],o=A.default.join(e,s);for(let a of Le(o,!0))n.push({name:a,milestone:i,basePath:A.default.join(".planning","milestones",s),fullPath:A.default.join(o,a)})}}catch{}return n}function Ot(t){return t.replace(/<details>[\s\S]*?<\/details>/gi,"")}function ve(t,e){if(!e)return Ot(t);let n=null;try{let u=A.default.join(T(e),"STATE.md");if(I.default.existsSync(u)){let p=I.default.readFileSync(u,"utf-8").match(/^milestone:\s*(.+)/m);p&&(n=p[1].trim())}}catch{}if(!n){let u=t.match(/🚧\s*\*\*v(\d+\.\d+)\s/);u&&(n="v"+u[1])}if(!n)return Ot(t);let r=new RegExp(`(^#{1,3}\\s+.*${ne(n)}[^\\n]*)`,"mi"),s=t.match(r);if(!s)return Ot(t);let i=s.index,o=s[1].match(/^(#{1,3})\s/)[1].length,c=t.slice(i+s[0].length).match(new RegExp(`^#{1,${o}}\\s+(?:.*v\\d+\\.\\d+|\u2705|\u{1F4CB}|\u{1F6A7})`,"mi")),l=c?i+s[0].length+c.index:t.length;return t.slice(0,i).replace(/<details>[\s\S]*?<\/details>/gi,"")+t.slice(i,l)}function lt(t,e,n){let r=t.lastIndexOf("</details>");if(r===-1)return t.replace(e,n);let s=r+10,i=t.slice(0,s),o=t.slice(s);return i+o.replace(e,n)}function dt(t,e){if(!e)return null;let n=A.default.join(T(t),"ROADMAP.md");if(!I.default.existsSync(n))return null;try{let r=ve(I.default.readFileSync(n,"utf-8"),t),s=new RegExp(`#{2,4}\\s*Phase\\s+${ne(e)}:\\s*([^\\n]+)`,"i"),i=r.match(s);if(!i)return null;let o=i[1].trim(),a=i.index,l=r.slice(a).match(/\n#{2,4}\s+Phase\s+[\w]/i),d=l?a+l.index:r.length,u=r.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 ur(){return A.default.join(__dirname,"..","..","agents")}function _t(){let t=ur(),e=Object.keys(Re),n=[],r=[];if(!I.default.existsSync(t))return{agents_installed:!1,missing_agents:e,installed_agents:[],agents_dir:t};for(let s of e)I.default.existsSync(A.default.join(t,`${s}.md`))?n.push(s):r.push(s);return{agents_installed:n.length>0&&r.length===0,missing_agents:r,installed_agents:n,agents_dir:t}}function se(t,e){let n=X(t),r=n.model_overrides?.[e];if(r)return r;if(n.resolve_model_ids==="omit")return"";let s=String(n.model_profile||"balanced").toLowerCase(),i=Re[e];if(!i)return"sonnet";if(s==="inherit")return"inherit";let o=i[s]||i.balanced||"sonnet";return n.resolve_model_ids&&lr[o]||o}function Ut(t){if(!t)return null;let n=t.replace(/^---\n[\s\S]*?\n---\n*/,"").match(/^#[^\n]*\n+\*\*([^*]+)\*\*/m);return n?n[1].trim():null}function Ri(t,e){let n=A.default.isAbsolute(e)?e:A.default.join(t,e);try{return I.default.statSync(n),!0}catch{return!1}}function qe(t){return t?t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function re(t){try{let e=I.default.readFileSync(A.default.join(T(t),"ROADMAP.md"),"utf-8"),n=e.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);if(n)return{version:"v"+n[1],name:n[2].trim()};let r=Ot(e),s=r.match(/## .*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);if(s)return{version:"v"+s[1],name:s[2].trim()};let i=r.match(/v(\d+(?:\.\d+)+)/);return{version:i?i[0]:"v1.0",name:"milestone"}}catch{return{version:"v1.0",name:"milestone"}}}function Ce(t){let e=new Set;try{let s=ve(I.default.readFileSync(A.default.join(T(t),"ROADMAP.md"),"utf-8"),t),i=/#{2,4}\s*Phase\s+([\w][\w.-]*)\s*:/gi,o;for(;(o=i.exec(s))!==null;)e.add(o[1])}catch{}if(e.size===0){let s=i=>!0;return s.phaseCount=0,s}let n=new Set([...e].map(s=>(s.replace(/^0+/,"")||"0").toLowerCase()));function r(s){let i=s.match(/^0*(\d+[A-Za-z]?(?:\.\d+)*)/);if(i&&n.has(i[1].toLowerCase()))return!0;let o=s.match(/^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*)/);return!!(o&&n.has(o[1].toLowerCase()))}return r.phaseCount=e.size,r}function wt(t){return t.filter(e=>e.endsWith("-PLAN.md")||e==="PLAN.md")}function kt(t){return t.filter(e=>e.endsWith("-SUMMARY.md")||e==="SUMMARY.md")}function mr(t){let e=I.default.readdirSync(t);return{plans:wt(e),summaries:kt(e),hasResearch:e.some(n=>n.endsWith("-RESEARCH.md")||n==="RESEARCH.md"),hasContext:e.some(n=>n.endsWith("-CONTEXT.md")||n==="CONTEXT.md"),hasVerification:e.some(n=>n.endsWith("-VERIFICATION.md")||n==="VERIFICATION.md"),hasReviews:e.some(n=>n.endsWith("-REVIEWS.md")||n==="REVIEWS.md")}}function Le(t,e=!1){try{let r=I.default.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);return e?r.sort((s,i)=>Pe(s,i)):r}catch{return[]}}var Nt,I,sn,A,lr,ge=N(()=>{"use strict";Nt=require("child_process"),I=W(require("fs")),sn=W(require("os")),A=W(require("path"));Dt();lr={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var st,Ms,on,w,$e=N(()=>{"use strict";st=require("@oclif/core"),Ms=W(require("path")),on=W(require("fs"));ge();w=class extends st.Command{static enableJsonFlag=!1;static baseFlags={cwd:st.Flags.string({description:"Working directory",default:""}),ws:st.Flags.string({description:"Workstream override",default:""}),raw:st.Flags.boolean({description:"Raw JSON output",default:!1}),output:st.Flags.string({description:"Output format",options:["json","toon"],default:"json"}),pick:st.Flags.string({description:"JSONPath pick expression",default:""})};resolveContext(e){let n=e.cwd?Ms.default.resolve(e.cwd):process.cwd();if((!on.default.existsSync(n)||!on.default.statSync(n).isDirectory())&&b(`Invalid --cwd: ${n}`),!on.default.existsSync(Ms.default.join(n,".planning"))){let s=qt(n);s!==n&&(n=s)}let r=null;return e.ws?r=e.ws:process.env.GSD_WORKSTREAM?r=process.env.GSD_WORKSTREAM.trim():r=He(n),r&&!/^[a-zA-Z0-9_-]+$/.test(r)&&b("Invalid workstream name"),r&&(process.env.GSD_WORKSTREAM=r),n=Wt(n),{cwd:n,ws:r,raw:e.raw??!1}}}});var cn={};he(cn,{FRONTMATTER_SCHEMAS:()=>Is,asArr:()=>_e,asObj:()=>Pt,asStr:()=>ue,cmdFrontmatterGet:()=>Ei,cmdFrontmatterMerge:()=>Mi,cmdFrontmatterSet:()=>Fi,cmdFrontmatterValidate:()=>Ii,extractFrontmatter:()=>ie,parseMustHavesBlock:()=>an,reconstructFrontmatter:()=>Ct,spliceFrontmatter:()=>Ts});function ue(t){return typeof t=="string"?t:void 0}function _e(t){return Array.isArray(t)?t:void 0}function Pt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ie(t){let e={},n=[...t.matchAll(/(?:^|\n)\s*---\r?\n([\s\S]+?)\r?\n---/g)],r=n.length>0?n[n.length-1]:null;if(!r)return e;let i=r[1].split(/\r?\n/),o=[{obj:e,key:null,indent:-1}];for(let a of i){if(a.trim()==="")continue;let c=a.match(/^(\s*)/),l=c?c[1].length:0;for(;o.length>1&&l<=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();if(p===""||p==="["){d.obj[m]=p==="["?[]:{},d.key=null;let f=d.obj[m];f!==null&&typeof f=="object"&&o.push({obj:f,key:null,indent:l})}else p.startsWith("[")&&p.endsWith("]")?(d.obj[m]=p.slice(1,-1).split(",").map(f=>f.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 f of Object.keys(p.obj))if(p.obj[f]===d.obj){p.obj[f]=[m],d.obj=p.obj[f];break}}}else Array.isArray(d.obj)&&d.obj.push(m)}}return e}function Ct(t){let e=[];for(let[n,r]of Object.entries(t))if(r!=null)if(Array.isArray(r))if(r.length===0)e.push(`${n}: []`);else if(r.every(s=>typeof s=="string")&&r.length<=3&&r.join(", ").length<60)e.push(`${n}: [${r.join(", ")}]`);else{e.push(`${n}:`);for(let s of r){let i=String(s);e.push(` - ${typeof s=="string"&&(i.includes(":")||i.includes("#"))?`"${i}"`:i}`)}}else if(typeof r=="object"){e.push(`${n}:`);for(let[s,i]of Object.entries(r))if(i!=null)if(Array.isArray(i))if(i.length===0)e.push(` ${s}: []`);else if(i.every(o=>typeof o=="string")&&i.length<=3&&i.join(", ").length<60)e.push(` ${s}: [${i.join(", ")}]`);else{e.push(` ${s}:`);for(let o of i)e.push(` - ${o}`)}else if(typeof i=="object"){e.push(` ${s}:`);for(let[o,a]of Object.entries(i))if(a!=null)if(Array.isArray(a))if(a.length===0)e.push(` ${o}: []`);else{e.push(` ${o}:`);for(let c of a)e.push(` - ${c}`)}else e.push(` ${o}: ${a}`)}else{let o=String(i);e.push(` ${s}: ${o.includes(":")||o.includes("#")?`"${o}"`:o}`)}}else{let s=String(r);s.includes(":")||s.includes("#")||s.startsWith("[")||s.startsWith("{")?e.push(`${n}: "${s}"`):e.push(`${n}: ${s}`)}return e.join(`
145
+ `)}function Ts(t,e){let n=Ct(e),r=t.match(/^---\r?\n[\s\S]+?\r?\n---/);return r?`---
146
+ ${n}
147
+ ---`+t.slice(r[0].length):`---
148
+ ${n}
149
149
  ---
150
150
 
151
- `+n}function St(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 d=i.slice(c).split(/\r?\n/).slice(1),f=[],m=null,p=-1;for(let y of d){if(y.trim()==="")continue;let g=y.match(/^(\s*)/)?.[1].length??0;if(g<=l&&y.trim()!=="")break;let _=y.trim();if(_.startsWith("- ")&&(p===-1&&(p=g),g===p)){m&&f.push(m),m={};let x=_.slice(2);if(!x.includes(":"))m=x.replace(/^["']|["']$/g,"");else{let v=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);v&&(m={},m[v[1]]=v[2])}continue}if(m&&typeof m=="object"&&g>p)if(_.startsWith("- ")){let x=_.slice(2).replace(/^["']|["']$/g,""),v=Object.keys(m),$=v[v.length-1];$&&!Array.isArray(m[$])&&(m[$]=m[$]?[m[$]]:[]),$&&m[$].push(x)}else{let x=_.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(x){let v=x[2];m[x[1]]=/^\d+$/.test(v)?parseInt(v,10):v}}}return m&&f.push(m),f}function Kn(n,e,s,i){e||S("file path required"),e.includes("\0")&&S("file path contains null bytes");let t=Ue.default.isAbsolute(e)?e:Ue.default.join(n,e),r=Fe(t);if(!r){h({error:"File not found",path:e},i);return}let o=ee(r);if(s){let a=o[s];if(a===void 0){h({error:"Field not found",field:s},i);return}h({[s]:a},i,JSON.stringify(a))}else h(o,i)}function Zn(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=Ue.default.isAbsolute(e)?e:Ue.default.join(n,e);if(!Ge.default.existsSync(r)){h({error:"File not found",path:e},t);return}let o=Ge.default.readFileSync(r,"utf-8"),a=ee(o),l;try{l=JSON.parse(i)}catch{l=i}a[s]=l;let c=Dt(o,a);Ge.default.writeFileSync(r,Re(c),"utf-8"),h({updated:!0,field:s,value:l},t,"true")}function Qn(n,e,s,i){(!e||!s)&&S("file and data required");let t=Ue.default.isAbsolute(e)?e:Ue.default.join(n,e);if(!Ge.default.existsSync(t)){h({error:"File not found",path:e},i);return}let r=Ge.default.readFileSync(t,"utf-8"),o=ee(r),a;try{a=JSON.parse(s)}catch{S("Invalid JSON for --data");return}Object.assign(o,a);let l=Dt(r,o);Ge.default.writeFileSync(t,Re(l),"utf-8"),h({merged:!0,fields:Object.keys(a)},i,"true")}function Xn(n,e,s,i){(!e||!s)&&S("file and schema required");let t=Tt[s];if(!t){S(`Unknown schema: ${s}. Available: ${Object.keys(Tt).join(", ")}`);return}let r=Ue.default.isAbsolute(e)?e:Ue.default.join(n,e),o=Fe(r);if(!o){h({error:"File not found",path:e},i);return}let a=ee(o),l=t.required.filter(u=>a[u]===void 0),c=t.required.filter(u=>a[u]!==void 0);h({valid:l.length===0,missing:l,present:c,schema:s},i,l.length===0?"valid":"invalid")}var Ge,Ue,Tt,Le=le(()=>{"use strict";Ge=q(require("fs")),Ue=q(require("path"));pe();Tt={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 fn={};fe(fn,{requireSafePath:()=>Nt,safeJsonParse:()=>ns,sanitizeForDisplay:()=>xt,sanitizeForPrompt:()=>Ot,scanForInjection:()=>ts,validateFieldName:()=>vt,validatePath:()=>bt});function ts(n){let e=[];for(let s of es)s.test(n)&&e.push(s.source);return e}function Ot(n){if(!n)return n;let e=n.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>mn&&(e=e.slice(0,mn)+"... [truncated]"),e}function ns(n,e={}){try{return{ok:!0,value:JSON.parse(n)}}catch(s){return{ok:!1,error:`Invalid ${e.label??"JSON"}: ${s.message}`}}}function bt(n,e,s={}){if(n.includes("\0"))return{safe:!1,resolved:n,error:"Path contains null bytes"};let i=_t.default.isAbsolute(n)?n:_t.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&&_t.default.isAbsolute(n)?{safe:!1,resolved:i,error:"Absolute paths not allowed"}:{safe:!0,resolved:i}}function Nt(n,e,s,i={}){let t=bt(n,e,i);if(!t.safe)throw new Error(`${s||"Path"} validation failed: ${t.error}`);return t.resolved}function xt(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 vt(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 _t,es,mn,ct=le(()=>{"use strict";_t=q(require("path")),es=[/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],mn=1e4});var Ut={};fe(Ut,{cmdSignalResume:()=>bs,cmdSignalWaiting:()=>_s,cmdStateAddBlocker:()=>fs,cmdStateAddDecision:()=>ms,cmdStateAdvancePlan:()=>cs,cmdStateBeginPhase:()=>Ss,cmdStateGet:()=>os,cmdStateJson:()=>ys,cmdStateLoad:()=>rs,cmdStatePatch:()=>as,cmdStateRecordMetric:()=>us,cmdStateRecordSession:()=>hs,cmdStateResolveBlocker:()=>ps,cmdStateSnapshot:()=>gs,cmdStateUpdate:()=>ls,cmdStateUpdateProgress:()=>ds,stateExtractField:()=>B,stateReplaceField:()=>Se,stateReplaceFieldWithFallback:()=>he,stripFrontmatter:()=>Wt,writeStateMd:()=>te});function ss(n){return R(n).state}function B(n,e){let s=Q(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 Se(n,e,s){let i=Q(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 he(n,e,s,i){let t=Se(n,e,i);if(t)return t;if(s){let r=Se(n,s,i);if(r)return r}return n}function pn(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 qt(n,e,s,i){if(!s)return e??"";let t=bt(s,n,{allowAbsolute:!0});if(!t.safe)throw new Error(`${i} path rejected: ${t.error}`);try{return E.default.readFileSync(t.resolved,"utf-8").trimEnd()}catch{throw new Error(`${i} file not found: ${s}`)}}function Wt(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 hn(n,e){let s=B(n,"Current Phase"),i=B(n,"Current Phase Name"),t=B(n,"Current Plan"),r=B(n,"Total Phases"),o=B(n,"Total Plans in Phase"),a=B(n,"Status"),l=B(n,"Progress"),c=B(n,"Last Activity"),u=B(n,"Stopped At")||B(n,"Stopped at"),d=B(n,"Paused At"),f=null,m=null;if(e)try{let T=ie(e);f=T.version,m=T.name}catch{}let p=r?parseInt(r,10):null,y=null,g=o?parseInt(o,10):null,_=null;if(e)try{let T=R(e).phases;if(E.default.existsSync(T)){let A=Pe(e),O=E.default.readdirSync(T,{withFileTypes:!0}).filter(ue=>ue.isDirectory()).map(ue=>ue.name).filter(A),N=0,U=0,ne=0;for(let ue of O){let ve=E.default.readdirSync(Ie.default.join(T,ue)),se=ve.filter(Te=>Te.match(/-PLAN\.md$/i)).length,me=ve.filter(Te=>Te.match(/-SUMMARY\.md$/i)).length;N+=se,U+=me,se>0&&me>=se&&ne++}p=A.phaseCount>0?Math.max(O.length,A.phaseCount):O.length,y=ne,g=N,_=U}}catch{}let x=null;if(l){let T=l.match(/(\d+)%/);T&&(x=parseInt(T[1],10))}let v=a??"unknown",$=(a??"").toLowerCase();$.includes("paused")||$.includes("stopped")||d?v="paused":$.includes("executing")||$.includes("in progress")?v="executing":$.includes("planning")||$.includes("ready to plan")?v="planning":$.includes("discussing")?v="discussing":$.includes("verif")?v="verifying":$.includes("complete")||$.includes("done")?v="completed":$.includes("ready to execute")&&(v="executing");let k={gsd_state_version:"1.0"};f&&(k.milestone=f),m&&(k.milestone_name=m),s&&(k.current_phase=s),i&&(k.current_phase_name=i),t&&(k.current_plan=t),k.status=v,u&&(k.stopped_at=u),d&&(k.paused_at=d),k.last_updated=new Date().toISOString(),c&&(k.last_activity=c);let P={};return p!==null&&(P.total_phases=p),y!==null&&(P.completed_phases=y),g!==null&&(P.total_plans=g),_!==null&&(P.completed_plans=_),x!==null&&(P.percent=x),Object.keys(P).length>0&&(k.progress=P),k}function is(n,e){let s=ee(n),i=Wt(n),t=hn(i,e);return t.status==="unknown"&&s.status&&s.status!=="unknown"&&(t.status=s.status),`---
152
- ${Xe(t)}
151
+ `+t}function an(t,e){let n=t.match(/^---\r?\n([\s\S]+?)\r?\n---/);if(!n)return[];let r=n[1],s=r.match(/^(\s*)must_haves:\s*$/m);if(!s)return[];let i=s[1].length,o=new RegExp(`^(\\s+)${e}:\\s*$`,"m"),a=r.match(o);if(!a)return[];let c=a[1].length;if(c<=i)return[];let l=r.indexOf(a[0]);if(l===-1)return[];let u=r.slice(l).split(/\r?\n/).slice(1),m=[],p=null,f=-1;for(let g of u){if(g.trim()==="")continue;let h=g.match(/^(\s*)/)?.[1].length??0;if(h<=c&&g.trim()!=="")break;let x=g.trim();if(x.startsWith("- ")&&(f===-1&&(f=h),h===f)){p&&m.push(p),p={};let S=x.slice(2);if(!S.includes(":"))p=S.replace(/^["']|["']$/g,"");else{let _=S.match(/^(\w+):\s*"?([^"]*)"?\s*$/);_&&(p={},p[_[1]]=_[2])}continue}if(p&&typeof p=="object"&&h>f)if(x.startsWith("- ")){let S=x.slice(2).replace(/^["']|["']$/g,""),_=Object.keys(p),P=_[_.length-1];P&&!Array.isArray(p[P])&&(p[P]=p[P]?[p[P]]:[]);let k=p[P];P&&Array.isArray(k)&&k.push(S)}else{let S=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(S){let _=S[2];p[S[1]]=/^\d+$/.test(_)?parseInt(_,10):_}}}return p&&m.push(p),m}function Ei(t,e,n,r){e||b("file path required"),e.includes("\0")&&b("file path contains null bytes");let s=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e),i=Oe(s);if(!i){y({error:"File not found",path:e},r);return}let o=ie(i);if(n){let a=o[n];if(a===void 0){y({error:"Field not found",field:n},r);return}y({[n]:a},r,JSON.stringify(a))}else y(o,r)}function Fi(t,e,n,r,s){(!e||!n||r===void 0)&&b("file, field, and value required"),e.includes("\0")&&b("file path contains null bytes");let i=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e);if(!ut.default.existsSync(i)){y({error:"File not found",path:e},s);return}let o=ut.default.readFileSync(i,"utf-8"),a=ie(o),c;try{c=JSON.parse(r)}catch{c=r}a[n]=c;let l=Ts(o,a);ut.default.writeFileSync(i,Ee(l),"utf-8"),y({updated:!0,field:n,value:c},s,"true")}function Mi(t,e,n,r){(!e||!n)&&b("file and data required");let s=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e);if(!ut.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=ut.default.readFileSync(s,"utf-8"),o=ie(i),a;try{a=JSON.parse(n)}catch{b("Invalid JSON for --data");return}Object.assign(o,a);let c=Ts(i,o);ut.default.writeFileSync(s,Ee(c),"utf-8"),y({merged:!0,fields:Object.keys(a)},r,"true")}function Ii(t,e,n,r){(!e||!n)&&b("file and schema required");let s=Is[n];if(!s){b(`Unknown schema: ${n}. Available: ${Object.keys(Is).join(", ")}`);return}let i=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e),o=Oe(i);if(!o){y({error:"File not found",path:e},r);return}let a=ie(o),c=s.required.filter(d=>a[d]===void 0),l=s.required.filter(d=>a[d]!==void 0);y({valid:c.length===0,missing:c,present:l,schema:n},r,c.length===0?"valid":"invalid")}var ut,Xe,Is,Ue=N(()=>{"use strict";ut=W(require("fs")),Xe=W(require("path"));ge();Is={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"]}}});function hr(t){if(!t)return t;let e=t.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>gr&&(e=e.slice(0,gr)+"... [truncated]"),e}function Ds(t,e,n={}){if(t.includes("\0"))return{safe:!1,resolved:t,error:"Path contains null bytes"};let r=ln.default.isAbsolute(t)?t:ln.default.resolve(e,t),s=process.env.HOME??"/";return!r.startsWith(s)&&!r.startsWith(e)?{safe:!1,resolved:r,error:"Path traversal rejected"}:!n.allowAbsolute&&ln.default.isAbsolute(t)?{safe:!1,resolved:r,error:"Absolute paths not allowed"}:{safe:!0,resolved:r}}function yr(t,e,n,r={}){let s=Ds(t,e,r);if(!s.safe)throw new Error(`${n||"Path"} validation failed: ${s.error}`);return s.resolved}function Os(t){if(!t||typeof t!="string")return t;let e=t.replace(/[\u200B-\u200F\u2028-\u202F\uFEFF\u00AD]/g,"");return e=e.replace(/<(\/?)(?:system|assistant|human)>/gi,(n,r)=>`\uFF1C${r||""}system-text\uFF1E`),e=e.replace(/\[(SYSTEM|INST)\]/gi,"[$1-TEXT]"),e=e.replace(/<<\s*SYS\s*>>/gi,"\xABSYS-TEXT\xBB"),e}function Ns(t){return!t||typeof t!="string"?{valid:!1,error:"Field name must be a non-empty string"}:/^[a-zA-Z][a-zA-Z0-9 _-]*$/.test(t)?{valid:!0}:{valid:!1,error:`Field name "${t}" contains invalid characters. Only letters, digits, spaces, hyphens, and underscores are allowed.`}}var ln,gr,dn=N(()=>{"use strict";ln=W(require("path")),gr=1e4});var Ze={};he(Ze,{cmdSignalResume:()=>Ki,cmdSignalWaiting:()=>Zi,cmdStateAddBlocker:()=>Bi,cmdStateAddDecision:()=>zi,cmdStateAdvancePlan:()=>Li,cmdStateBeginPhase:()=>Xi,cmdStateGet:()=>Ni,cmdStateJson:()=>Hi,cmdStateLoad:()=>Oi,cmdStatePatch:()=>Wi,cmdStateRecordMetric:()=>Ui,cmdStateRecordSession:()=>Ji,cmdStateResolveBlocker:()=>Gi,cmdStateSnapshot:()=>Yi,cmdStateUpdate:()=>qi,cmdStateUpdateProgress:()=>Vi,stateExtractField:()=>J,stateReplaceField:()=>we,stateReplaceFieldWithFallback:()=>ye,stripFrontmatter:()=>qs,writeStateMd:()=>oe});function Ti(t){return j(t).state}function J(t,e){let n=ne(e),r=t.match(new RegExp(`\\*\\*${n}:\\*\\*\\s*(.+)`,"i"));if(r)return r[1].trim();let s=t.match(new RegExp(`^${n}:\\s*(.+)`,"im"));return s?s[1].trim():null}function we(t,e,n){let r=ne(e),s=new RegExp(`(\\*\\*${r}:\\*\\*\\s*)(.*)`,"i");if(s.test(t))return t.replace(s,(o,a)=>`${a}${n}`);let i=new RegExp(`(^${r}:\\s*)(.*)`,"im");return i.test(t)?t.replace(i,(o,a)=>`${a}${n}`):null}function ye(t,e,n,r){let s=we(t,e,r);if(s)return s;if(n){let i=we(t,n,r);if(i)return i}return t}function xr(t,e){let n=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,r=t.match(n);if(!r)return t;let s=r[2];return e.status&&/^Status:/m.test(s)&&(s=s.replace(/^Status:.*$/m,`Status: ${e.status}`)),e.lastActivity&&/^Last activity:/im.test(s)&&(s=s.replace(/^Last activity:.*$/im,`Last activity: ${e.lastActivity}`)),e.plan&&/^Plan:/m.test(s)&&(s=s.replace(/^Plan:.*$/m,`Plan: ${e.plan}`)),t.replace(n,`${r[1]}${s}`)}function Ws(t,e,n,r){if(!n)return e??"";let s=Ds(n,t,{allowAbsolute:!0});if(!s.safe)throw new Error(`${r} path rejected: ${s.error}`);try{return E.default.readFileSync(s.resolved,"utf-8").trimEnd()}catch{throw new Error(`${r} file not found: ${n}`)}}function qs(t){let e=t;for(;;){let n=e.replace(/^\s*---\r?\n[\s\S]*?\r?\n---\s*/,"");if(n===e)break;e=n}return e}function Sr(t,e){let n=J(t,"Current Phase"),r=J(t,"Current Phase Name"),s=J(t,"Current Plan"),i=J(t,"Total Phases"),o=J(t,"Total Plans in Phase"),a=J(t,"Status"),c=J(t,"Progress"),l=J(t,"Last Activity"),d=J(t,"Stopped At")||J(t,"Stopped at"),u=J(t,"Paused At"),m=null,p=null;if(e)try{let L=re(e);m=L.version,p=L.name}catch{}let f=i?parseInt(i,10):null,g=null,h=o?parseInt(o,10):null,x=null;if(e)try{let L=j(e).phases;if(E.default.existsSync(L)){let $=Ce(e),q=E.default.readdirSync(L,{withFileTypes:!0}).filter(le=>le.isDirectory()).map(le=>le.name).filter($),O=0,U=0,Y=0;for(let le of q){let be=E.default.readdirSync(Ve.default.join(L,le)),te=be.filter(De=>De.match(/-PLAN\.md$/i)).length,pe=be.filter(De=>De.match(/-SUMMARY\.md$/i)).length;O+=te,U+=pe,te>0&&pe>=te&&Y++}f=$.phaseCount>0?Math.max(q.length,$.phaseCount):q.length,g=Y,h=O,x=U}}catch{}let S=null;if(c){let L=c.match(/(\d+)%/);L&&(S=parseInt(L[1],10))}let _=a??"unknown",P=(a??"").toLowerCase();P.includes("paused")||P.includes("stopped")||u?_="paused":P.includes("executing")||P.includes("in progress")?_="executing":P.includes("planning")||P.includes("ready to plan")?_="planning":P.includes("discussing")?_="discussing":P.includes("verif")?_="verifying":P.includes("complete")||P.includes("done")?_="completed":P.includes("ready to execute")&&(_="executing");let k={gsd_state_version:"1.0"};m&&(k.milestone=m),p&&(k.milestone_name=p),n&&(k.current_phase=n),r&&(k.current_phase_name=r),s&&(k.current_plan=s),k.status=_,d&&(k.stopped_at=d),u&&(k.paused_at=u),k.last_updated=new Date().toISOString(),l&&(k.last_activity=l);let C={};return f!==null&&(C.total_phases=f),g!==null&&(C.completed_phases=g),h!==null&&(C.total_plans=h),x!==null&&(C.completed_plans=x),S!==null&&(C.percent=S),Object.keys(C).length>0&&(k.progress=C),k}function Di(t,e){let n=ie(t),r=qs(t),s=Sr(r,e);return s.status==="unknown"&&n.status&&n.status!=="unknown"&&(s.status=n.status),`---
152
+ ${Ct(s)}
153
153
  ---
154
154
 
155
- ${i}`}function te(n,e,s){let i=is(e,s),t=n+".lock",r=10,o=200;for(let a=0;a<r;a++)try{let l=E.default.openSync(t,E.default.constants.O_CREAT|E.default.constants.O_EXCL|E.default.constants.O_WRONLY);E.default.writeSync(l,String(process.pid)),E.default.closeSync(l);break}catch(l){if(l.code==="EEXIST"){try{let d=E.default.statSync(t);if(Date.now()-d.mtimeMs>1e4){E.default.unlinkSync(t);continue}}catch{continue}if(a===r-1){try{E.default.unlinkSync(t)}catch{}break}let c=Date.now(),u=Math.floor(Math.random()*50);for(;Date.now()-c<o+u;);continue}break}try{E.default.writeFileSync(n,Re(i),"utf-8")}finally{try{E.default.unlinkSync(t)}catch{}}}function rs(n,e){let s=J(n),i=R(n).planning,t="";try{t=E.default.readFileSync(Ie.default.join(i,"STATE.md"),"utf-8")}catch{}let r=E.default.existsSync(Ie.default.join(i,"config.json")),o=E.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)}h({config:s,state_raw:t,state_exists:a,roadmap_exists:o,config_exists:r})}function os(n,e,s){let i=R(n).state;try{let t=E.default.readFileSync(i,"utf-8");if(!e){h({content:t},s,t);return}let r=Q(e),o=t.match(new RegExp(`\\*\\*${r}:\\*\\*\\s*(.*)`,"i"));if(o){h({[e]:o[1].trim()},s,o[1].trim());return}let a=t.match(new RegExp(`^${r}:\\s*(.*)`,"im"));if(a){h({[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){h({[e]:l[1].trim()},s,l[1].trim());return}h({error:`Section or field "${e}" not found`},s,"")}catch{S("STATE.md not found")}}function as(n,e,s){for(let t of Object.keys(e)){let r=vt(t);r.valid||S(`state patch: ${r.error}`)}let i=R(n).state;try{let t=E.default.readFileSync(i,"utf-8"),r={updated:[],failed:[]};for(let[o,a]of Object.entries(e)){let l=Q(o),c=new RegExp(`(\\*\\*${l}:\\*\\*\\s*)(.*)`,"i"),u=new RegExp(`(^${l}:\\s*)(.*)`,"im");c.test(t)?(t=t.replace(c,(d,f)=>`${f}${a}`),r.updated.push(o)):u.test(t)?(t=t.replace(u,(d,f)=>`${f}${a}`),r.updated.push(o)):r.failed.push(o)}r.updated.length>0&&te(i,t,n),h(r,s,r.updated.length>0?"true":"false")}catch{S("STATE.md not found")}}function ls(n,e,s){(!e||s===void 0)&&S("field and value required for state update");let i=vt(e);i.valid||S(`state update: ${i.error}`);let t=R(n).state;try{let r=E.default.readFileSync(t,"utf-8"),o=Q(e),a=new RegExp(`(\\*\\*${o}:\\*\\*\\s*)(.*)`,"i"),l=new RegExp(`(^${o}:\\s*)(.*)`,"im");a.test(r)?(r=r.replace(a,(c,u)=>`${u}${s}`),te(t,r,n),h({updated:!0})):l.test(r)?(r=r.replace(l,(c,u)=>`${u}${s}`),te(t,r,n),h({updated:!0})):h({updated:!1,reason:`Field "${e}" not found in STATE.md`})}catch{h({updated:!1,reason:"STATE.md not found"})}}function cs(n,e){let s=R(n).state;if(!E.default.existsSync(s)){h({error:"STATE.md not found"},e);return}let i=E.default.readFileSync(s,"utf-8"),t=new Date().toISOString().split("T")[0],r=B(i,"Current Plan"),o=B(i,"Total Plans in Phase"),a=B(i,"Plan"),l,c,u=!1;if(r&&o)l=parseInt(r,10),c=parseInt(o,10);else if(a){l=parseInt(a,10);let d=a.match(/of\s+(\d+)/);c=d?parseInt(d[1],10):NaN,u=!0}else{h({error:"Cannot parse plan fields from STATE.md"},e);return}if(isNaN(l)||isNaN(c)){h({error:"Cannot parse Current Plan or Total Plans in Phase from STATE.md"},e);return}if(l>=c)i=he(i,"Status",null,"Phase complete - ready for verification"),i=he(i,"Last Activity","Last activity",t),i=pn(i,{status:"Phase complete - ready for verification",lastActivity:t}),te(s,i,n),h({advanced:!1,reason:"last_plan",current_plan:l,total_plans:c,status:"ready_for_verification"},e,"false");else{let d=l+1,f;u&&a?(f=a.replace(/^\d+/,String(d)),i=Se(i,"Plan",f)??i):(f=`${d} of ${c}`,i=Se(i,"Current Plan",String(d))??i),i=he(i,"Status",null,"Ready to execute"),i=he(i,"Last Activity","Last activity",t),i=pn(i,{status:"Ready to execute",lastActivity:t,plan:f}),te(s,i,n),h({advanced:!0,previous_plan:l,current_plan:d,total_plans:c},e,"true")}}function us(n,e,s){let i=R(n).state;if(!E.default.existsSync(i)){h({error:"STATE.md not found"},s);return}let{phase:t,plan:r,duration:o,tasks:a,files:l}=e;if(!t||!r||!o){h({error:"phase, plan, and duration required"},s);return}let c=E.default.readFileSync(i,"utf-8"),u=/(##\s*Performance Metrics[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n)([\s\S]*?)(?=\n##|\n$|$)/i,d=c.match(u);if(d){let f=d[2].trimEnd(),m=`| Phase ${t} P${r} | ${o} | ${a??"-"} tasks | ${l??"-"} files |`;f=!f.trim()||f.includes("None yet")?m:f+`
158
- `+m,c=c.replace(u,(p,y)=>`${y}${f}
159
- `),te(i,c,n),h({recorded:!0,phase:t,plan:r,duration:o},s,"true")}else h({recorded:!1,reason:"Performance Metrics section not found in STATE.md"},s,"false")}function ds(n,e){let s=R(n).state;if(!E.default.existsSync(s)){h({error:"STATE.md not found"},e);return}let i=E.default.readFileSync(s,"utf-8"),t=R(n).phases,r=0,o=0;if(E.default.existsSync(t)){let p=Pe(n),y=E.default.readdirSync(t,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).filter(p);for(let g of y){let _=E.default.readdirSync(Ie.default.join(t,g));r+=_.filter(x=>x.match(/-PLAN\.md$/i)).length,o+=_.filter(x=>x.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),d=`[${"\u2588".repeat(c)+"\u2591".repeat(l-c)}] ${a}%`,f=/(\*\*Progress:\*\*\s*).*/i,m=/^(Progress:\s*).*/im;f.test(i)?(i=i.replace(f,(p,y)=>`${y}${d}`),te(s,i,n),h({updated:!0,percent:a,completed:o,total:r,bar:d},e,d)):m.test(i)?(i=i.replace(m,(p,y)=>`${y}${d}`),te(s,i,n),h({updated:!0,percent:a,completed:o,total:r,bar:d},e,d)):h({updated:!1,reason:"Progress field not found in STATE.md"},e,"false")}function ms(n,e,s){let i=R(n).state;if(!E.default.existsSync(i)){h({error:"STATE.md not found"},s);return}let{phase:t,summary:r,summary_file:o,rationale:a,rationale_file:l}=e,c=null,u="";try{c=qt(n,r??null,o??null,"summary"),u=qt(n,a??"",l??null,"rationale")}catch(y){h({added:!1,reason:y.message},s,"false");return}if(!c){h({error:"summary required"},s);return}let d=E.default.readFileSync(i,"utf-8"),f=`- [Phase ${t??"?"}]: ${c}${u?` - ${u}`:""}`,m=/(###?\s*(?:Decisions|Decisions Made|Accumulated.*Decisions)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,p=d.match(m);if(p){let y=p[2].replace(/None yet\.?\s*\n?/gi,"").replace(/No decisions yet\.?\s*\n?/gi,"");y=y.trimEnd()+`
160
- `+f+`
161
- `,d=d.replace(m,(g,_)=>`${_}${y}`),te(i,d,n),h({added:!0,decision:f},s,"true")}else h({added:!1,reason:"Decisions section not found in STATE.md"},s,"false")}function fs(n,e,s){let i=R(n).state;if(!E.default.existsSync(i)){h({error:"STATE.md not found"},s);return}let t=typeof e=="object"&&e!==null?e:{text:e},r=null;try{r=qt(n,t.text??null,t.text_file??null,"blocker")}catch(u){h({added:!1,reason:u.message},s,"false");return}if(!r){h({error:"text required"},s);return}let o=E.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 u=c[2].replace(/None\.?\s*\n?/gi,"").replace(/None yet\.?\s*\n?/gi,"");u=u.trimEnd()+`
155
+ ${r}`}function oe(t,e,n){let r=Di(e,n),s=t+".lock",i=10,o=200;for(let a=0;a<i;a++)try{let c=E.default.openSync(s,E.default.constants.O_CREAT|E.default.constants.O_EXCL|E.default.constants.O_WRONLY);E.default.writeSync(c,String(process.pid)),E.default.closeSync(c);break}catch(c){if(c.code==="EEXIST"){try{let u=E.default.statSync(s);if(Date.now()-u.mtimeMs>1e4){E.default.unlinkSync(s);continue}}catch{continue}if(a===i-1){try{E.default.unlinkSync(s)}catch{}break}let l=Date.now(),d=Math.floor(Math.random()*50);for(;Date.now()-l<o+d;);continue}break}try{E.default.writeFileSync(t,Ee(r),"utf-8")}finally{try{E.default.unlinkSync(s)}catch{}}}function Oi(t,e){let n=X(t),r=j(t).planning,s="";try{s=E.default.readFileSync(Ve.default.join(r,"STATE.md"),"utf-8")}catch{}let i=E.default.existsSync(Ve.default.join(r,"config.json")),o=E.default.existsSync(Ve.default.join(r,"ROADMAP.md")),a=s.length>0;if(e){let c=n,l=[`model_profile=${c.model_profile}`,`commit_docs=${c.commit_docs}`,`branching_strategy=${c.branching_strategy}`,`phase_branch_template=${c.phase_branch_template}`,`milestone_branch_template=${c.milestone_branch_template}`,`parallelization=${c.parallelization}`,`research=${c.research}`,`plan_checker=${c.plan_checker}`,`verifier=${c.verifier}`,`config_exists=${i}`,`roadmap_exists=${o}`,`state_exists=${a}`];process.stdout.write(l.join(`
156
+ `)),process.exit(0)}y({config:n,state_raw:s,state_exists:a,roadmap_exists:o,config_exists:i})}function Ni(t,e,n){let r=j(t).state;try{let s=E.default.readFileSync(r,"utf-8");if(!e){y({content:s},n,s);return}let i=ne(e),o=s.match(new RegExp(`\\*\\*${i}:\\*\\*\\s*(.*)`,"i"));if(o){y({[e]:o[1].trim()},n,o[1].trim());return}let a=s.match(new RegExp(`^${i}:\\s*(.*)`,"im"));if(a){y({[e]:a[1].trim()},n,a[1].trim());return}let c=s.match(new RegExp(`##\\s*${i}\\s*
157
+ ([\\s\\S]*?)(?=\\n##|$)`,"i"));if(c){y({[e]:c[1].trim()},n,c[1].trim());return}y({error:`Section or field "${e}" not found`},n,"")}catch{b("STATE.md not found")}}function Wi(t,e,n){for(let s of Object.keys(e)){let i=Ns(s);i.valid||b(`state patch: ${i.error}`)}let r=j(t).state;try{let s=E.default.readFileSync(r,"utf-8"),i={updated:[],failed:[]};for(let[o,a]of Object.entries(e)){let c=ne(o),l=new RegExp(`(\\*\\*${c}:\\*\\*\\s*)(.*)`,"i"),d=new RegExp(`(^${c}:\\s*)(.*)`,"im");l.test(s)?(s=s.replace(l,(u,m)=>`${m}${a}`),i.updated.push(o)):d.test(s)?(s=s.replace(d,(u,m)=>`${m}${a}`),i.updated.push(o)):i.failed.push(o)}i.updated.length>0&&oe(r,s,t),y(i,n,i.updated.length>0?"true":"false")}catch{b("STATE.md not found")}}function qi(t,e,n){(!e||n===void 0)&&b("field and value required for state update");let r=Ns(e);r.valid||b(`state update: ${r.error}`);let s=j(t).state;try{let i=E.default.readFileSync(s,"utf-8"),o=ne(e),a=new RegExp(`(\\*\\*${o}:\\*\\*\\s*)(.*)`,"i"),c=new RegExp(`(^${o}:\\s*)(.*)`,"im");a.test(i)?(i=i.replace(a,(l,d)=>`${d}${n}`),oe(s,i,t),y({updated:!0})):c.test(i)?(i=i.replace(c,(l,d)=>`${d}${n}`),oe(s,i,t),y({updated:!0})):y({updated:!1,reason:`Field "${e}" not found in STATE.md`})}catch{y({updated:!1,reason:"STATE.md not found"})}}function Li(t,e){let n=j(t).state;if(!E.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=E.default.readFileSync(n,"utf-8"),s=new Date().toISOString().split("T")[0],i=J(r,"Current Plan"),o=J(r,"Total Plans in Phase"),a=J(r,"Plan"),c,l,d=!1;if(i&&o)c=parseInt(i,10),l=parseInt(o,10);else if(a){c=parseInt(a,10);let u=a.match(/of\s+(\d+)/);l=u?parseInt(u[1],10):NaN,d=!0}else{y({error:"Cannot parse plan fields from STATE.md"},e);return}if(isNaN(c)||isNaN(l)){y({error:"Cannot parse Current Plan or Total Plans in Phase from STATE.md"},e);return}if(c>=l)r=ye(r,"Status",null,"Phase complete - ready for verification"),r=ye(r,"Last Activity","Last activity",s),r=xr(r,{status:"Phase complete - ready for verification",lastActivity:s}),oe(n,r,t),y({advanced:!1,reason:"last_plan",current_plan:c,total_plans:l,status:"ready_for_verification"},e,"false");else{let u=c+1,m;d&&a?(m=a.replace(/^\d+/,String(u)),r=we(r,"Plan",m)??r):(m=`${u} of ${l}`,r=we(r,"Current Plan",String(u))??r),r=ye(r,"Status",null,"Ready to execute"),r=ye(r,"Last Activity","Last activity",s),r=xr(r,{status:"Ready to execute",lastActivity:s,plan:m}),oe(n,r,t),y({advanced:!0,previous_plan:c,current_plan:u,total_plans:l},e,"true")}}function Ui(t,e,n){let r=j(t).state;if(!E.default.existsSync(r)){y({error:"STATE.md not found"},n);return}let{phase:s,plan:i,duration:o,tasks:a,files:c}=e;if(!s||!i||!o){y({error:"phase, plan, and duration required"},n);return}let l=E.default.readFileSync(r,"utf-8"),d=/(##\s*Performance Metrics[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n)([\s\S]*?)(?=\n##|\n$|$)/i,u=l.match(d);if(u){let m=u[2].trimEnd(),p=`| Phase ${s} P${i} | ${o} | ${a??"-"} tasks | ${c??"-"} files |`;m=!m.trim()||m.includes("None yet")?p:m+`
158
+ `+p,l=l.replace(d,(f,g)=>`${g}${m}
159
+ `),oe(r,l,t),y({recorded:!0,phase:s,plan:i,duration:o},n,"true")}else y({recorded:!1,reason:"Performance Metrics section not found in STATE.md"},n,"false")}function Vi(t,e){let n=j(t).state;if(!E.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=E.default.readFileSync(n,"utf-8"),s=j(t).phases,i=0,o=0;if(E.default.existsSync(s)){let f=Ce(t),g=E.default.readdirSync(s,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).filter(f);for(let h of g){let x=E.default.readdirSync(Ve.default.join(s,h));i+=x.filter(S=>S.match(/-PLAN\.md$/i)).length,o+=x.filter(S=>S.match(/-SUMMARY\.md$/i)).length}}let a=i>0?Math.min(100,Math.round(o/i*100)):0,c=10,l=Math.round(a/100*c),u=`[${"\u2588".repeat(l)+"\u2591".repeat(c-l)}] ${a}%`,m=/(\*\*Progress:\*\*\s*).*/i,p=/^(Progress:\s*).*/im;m.test(r)?(r=r.replace(m,(f,g)=>`${g}${u}`),oe(n,r,t),y({updated:!0,percent:a,completed:o,total:i,bar:u},e,u)):p.test(r)?(r=r.replace(p,(f,g)=>`${g}${u}`),oe(n,r,t),y({updated:!0,percent:a,completed:o,total:i,bar:u},e,u)):y({updated:!1,reason:"Progress field not found in STATE.md"},e,"false")}function zi(t,e,n){let r=j(t).state;if(!E.default.existsSync(r)){y({error:"STATE.md not found"},n);return}let{phase:s,summary:i,summary_file:o,rationale:a,rationale_file:c}=e,l=null,d="";try{l=Ws(t,i??null,o??null,"summary"),d=Ws(t,a??"",c??null,"rationale")}catch(g){y({added:!1,reason:g.message},n,"false");return}if(!l){y({error:"summary required"},n);return}let u=E.default.readFileSync(r,"utf-8"),m=`- [Phase ${s??"?"}]: ${l}${d?` - ${d}`:""}`,p=/(###?\s*(?:Decisions|Decisions Made|Accumulated.*Decisions)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,f=u.match(p);if(f){let g=f[2].replace(/None yet\.?\s*\n?/gi,"").replace(/No decisions yet\.?\s*\n?/gi,"");g=g.trimEnd()+`
160
+ `+m+`
161
+ `,u=u.replace(p,(h,x)=>`${x}${g}`),oe(r,u,t),y({added:!0,decision:m},n,"true")}else y({added:!1,reason:"Decisions section not found in STATE.md"},n,"false")}function Bi(t,e,n){let r=j(t).state;if(!E.default.existsSync(r)){y({error:"STATE.md not found"},n);return}let s=typeof e=="object"&&e!==null?e:{text:e},i=null;try{i=Ws(t,s.text??null,s.text_file??null,"blocker")}catch(d){y({added:!1,reason:d.message},n,"false");return}if(!i){y({error:"text required"},n);return}let o=E.default.readFileSync(r,"utf-8"),a=`- ${i}`,c=/(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,l=o.match(c);if(l){let d=l[2].replace(/None\.?\s*\n?/gi,"").replace(/None yet\.?\s*\n?/gi,"");d=d.trimEnd()+`
162
162
  `+a+`
163
- `,o=o.replace(l,(d,f)=>`${f}${u}`),te(i,o,n),h({added:!0,blocker:r},s,"true")}else h({added:!1,reason:"Blockers section not found in STATE.md"},s,"false")}function ps(n,e,s){let i=R(n).state;if(!E.default.existsSync(i)){h({error:"STATE.md not found"},s);return}if(!e){h({error:"text required"},s);return}let t=E.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(u=>!u.startsWith("- ")||!u.toLowerCase().includes(e.toLowerCase())).join(`
165
- `);(!c.trim()||!c.includes("- "))&&(c=`None
166
- `),t=t.replace(r,(u,d)=>`${d}${c}`),te(i,t,n),h({resolved:!0,blocker:e},s,"true")}else h({resolved:!1,reason:"Blockers section not found in STATE.md"},s,"false")}function hs(n,e,s){let i=R(n).state;if(!E.default.existsSync(i)){h({error:"STATE.md not found"},s);return}let t=E.default.readFileSync(i,"utf-8"),r=new Date().toISOString(),o=[],a=u=>{let d=Se(t,u,r);d&&(t=d,o.push(u))};if(a("Last session"),a("Last Date"),e.stopped_at){let u=Se(t,"Stopped At",e.stopped_at)??Se(t,"Stopped at",e.stopped_at);u&&(t=u,o.push("Stopped At"))}let l=e.resume_file??"None",c=Se(t,"Resume File",l)??Se(t,"Resume file",l);c&&(t=c,o.push("Resume File")),o.length>0?(te(i,t,n),h({recorded:!0,updated:o},s,"true")):h({recorded:!1,reason:"No session fields found in STATE.md"},s,"false")}function gs(n,e){let s=ss(n);if(!E.default.existsSync(s)){h({error:"STATE.md not found"},e);return}let i=E.default.readFileSync(s,"utf-8"),t=d=>B(i,d),r=[],o=i.match(/##\s*Decisions Made[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n([\s\S]*?)(?=\n##|\n$|$)/i);if(o)for(let d of o[1].trim().split(`
167
- `).filter(f=>f.includes("|"))){let f=d.split("|").map(m=>m.trim()).filter(Boolean);f.length>=3&&r.push({phase:f[0],summary:f[1],rationale:f[2]})}let a=[],l=i.match(/##\s*Blockers\s*\n([\s\S]*?)(?=\n##|$)/i);if(l)for(let d of l[1].match(/^-\s+(.+)$/gm)??[])a.push(d.replace(/^-\s+/,"").trim());let c={last_date:null,stopped_at:null,resume_file:null},u=i.match(/##\s*Session\s*\n([\s\S]*?)(?=\n##|$)/i);if(u){let d=u[1];c.last_date=(d.match(/\*\*Last Date:\*\*\s*(.+)/i)??d.match(/^Last Date:\s*(.+)/im))?.[1]?.trim()??null,c.stopped_at=(d.match(/\*\*Stopped At:\*\*\s*(.+)/i)??d.match(/^Stopped At:\s*(.+)/im))?.[1]?.trim()??null,c.resume_file=(d.match(/\*\*Resume File:\*\*\s*(.+)/i)??d.match(/^Resume File:\s*(.+)/im))?.[1]?.trim()??null}h({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 ys(n,e){let s=R(n).state;if(!E.default.existsSync(s)){h({error:"STATE.md not found"},e,"STATE.md not found");return}let i=E.default.readFileSync(s,"utf-8"),t=ee(i);if(!t||Object.keys(t).length===0){let r=Wt(i),o=hn(r,n);h(o,e,JSON.stringify(o,null,2));return}h(t,e,JSON.stringify(t,null,2))}function Ss(n,e,s,i,t){let r=R(n).state;if(!E.default.existsSync(r)){h({error:"STATE.md not found"},t);return}let o=E.default.readFileSync(r,"utf-8"),a=new Date().toISOString().split("T")[0],l=[],c=(p,y)=>{let g=Se(o,p,y);g&&(o=g,l.push(p))};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 u=s?`Phase ${e} - ${s}`:`Phase ${e}`,d=/(\*\*Current focus:\*\*\s*).*/i;d.test(o)&&(o=o.replace(d,(p,y)=>`${y}${u}`),l.push("Current focus"));let f=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,m=o.match(f);if(m){let p=m[1],y=m[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(f,`${p}${y}`),l.push("Current Position")}l.length>0&&te(r,o,n),h({updated:l,phase:e,phase_name:s??null,plan_count:i??null},t,l.length>0?"true":"false")}function _s(n,e,s,i,t,r){let o=E.default.existsSync(Ie.default.join(n,".gsd"))?Ie.default.join(n,".gsd"):C(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{E.default.mkdirSync(o,{recursive:!0}),E.default.writeFileSync(a,JSON.stringify(l,null,2),"utf-8"),h({signaled:!0,path:a},r,"true")}catch(c){h({signaled:!1,error:c.message},r,"false")}}function bs(n,e){let s=[Ie.default.join(n,".gsd","WAITING.json"),Ie.default.join(C(n),"WAITING.json")],i=!1;for(let t of s)if(E.default.existsSync(t))try{E.default.unlinkSync(t),i=!0}catch{}h({resumed:!0,removed:i},e,i?"true":"false")}var E,Ie,Je=le(()=>{"use strict";E=q(require("fs")),Ie=q(require("path"));pe();Le();ct()});var ge={};fe(ge,{cmdCommit:()=>js,cmdCommitToSubrepo:()=>Rs,cmdCurrentTimestamp:()=>vs,cmdGenerateSlug:()=>xs,cmdHistoryDigest:()=>$s,cmdListTodos:()=>ks,cmdProgressRender:()=>Ms,cmdResolveModel:()=>As,cmdScaffold:()=>Cs,cmdStats:()=>Ts,cmdSummaryExtract:()=>Es,cmdTodoComplete:()=>Fs,cmdTodoMatchPhase:()=>Is,cmdVerifyPathExists:()=>Ps,cmdWebsearch:()=>ws});function xs(n,e){n||S("text required for slug generation");let s=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");h({slug:s},e,s)}function vs(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(),h({timestamp:i},e,i)}function ks(n,e,s){let i=G.default.join(C(n),"todos","pending"),t=0,r=[];try{let o=W.default.readdirSync(i).filter(a=>a.endsWith(".md"));for(let a of o)try{let l=W.default.readFileSync(G.default.join(i,a),"utf-8"),c=l.match(/^created:\s*(.+)$/m),u=l.match(/^title:\s*(.+)$/m),d=l.match(/^area:\s*(.+)$/m),f=d?d[1].trim():"general";if(e&&f!==e)continue;t++,r.push({file:a,created:c?c[1].trim():"unknown",title:u?u[1].trim():"Untitled",area:f,path:V(G.default.relative(n,G.default.join(i,a)))})}catch{}}catch{}h({count:t,todos:r},s,t.toString())}function Ps(n,e,s){e||S("path required for verification"),e.includes("\0")&&S("path contains null bytes");let i=G.default.isAbsolute(e)?e:G.default.join(n,e);try{let t=W.default.statSync(i);h({exists:!0,type:t.isDirectory()?"directory":t.isFile()?"file":"other"},s,"true")}catch{h({exists:!1,type:null},s,"false")}}function $s(n,e){let s=R(n).phases,i={phases:{},decisions:[],tech_stack:new Set},t=[];for(let r of gt(n))t.push({name:r.name,fullPath:r.fullPath,milestone:r.milestone});if(W.default.existsSync(s))try{for(let r of W.default.readdirSync(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())t.push({name:r,fullPath:G.default.join(s,r),milestone:null})}catch{}if(t.length===0){h({phases:{},decisions:[],tech_stack:[]},e);return}try{for(let{name:o,fullPath:a}of t){let l=W.default.readdirSync(a).filter(c=>c.endsWith("-SUMMARY.md")||c==="SUMMARY.md");for(let c of l)try{let u=W.default.readFileSync(G.default.join(a,c),"utf-8"),d=ee(u),f=d.phase||o.split("-")[0];i.phases[f]||(i.phases[f]={name:d.name||o.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[f].provides.add(m)):d.provides&&d.provides.forEach(m=>i.phases[f].provides.add(m)),d["dependency-graph"]?.affects&&d["dependency-graph"].affects.forEach(m=>i.phases[f].affects.add(m)),d["patterns-established"]&&d["patterns-established"].forEach(m=>i.phases[f].patterns.add(m)),d["key-decisions"]&&d["key-decisions"].forEach(m=>i.decisions.push({phase:f,decision:m})),d["tech-stack"]?.added&&d["tech-stack"].added.forEach(m=>i.tech_stack.add(typeof m=="string"?m:m.name))}catch{}}let r={phases:Object.fromEntries(Object.entries(i.phases).map(([o,a])=>[o,{name:a.name,provides:[...a.provides],affects:[...a.affects],patterns:[...a.patterns]}])),decisions:i.decisions,tech_stack:[...i.tech_stack]};h(r,e)}catch(r){S("Failed to generate history digest: "+r.message)}}function As(n,e,s){e||S("agent-type required");let i=J(n),t=X(n,e),r=je[e];h(r?{model:t,profile:i.model_profile}:{model:t,profile:i.model_profile,unknown_agent:!0},s,t)}function js(n,e,s,i,t=!1,r=!1){!e&&!t&&S("commit message required");let o=e;o&&(o=Ot(o));let a=J(n);if(!a.commit_docs){h({committed:!1,hash:null,reason:"skipped_commit_docs_false"},i,"skipped");return}if(Ct(n,".planning")){h({committed:!1,hash:null,reason:"skipped_gitignored"},i,"skipped");return}if(a.branching_strategy&&a.branching_strategy!=="none"){let m=null;if(a.branching_strategy==="phase"){let p=(s||[]).join(" ").match(/(\d+)-/);if(p){let y=de(n,p[1]);y&&(m=a.phase_branch_template.replace("{phase}",y.phase_number).replace("{slug}",y.phase_slug||"phase"))}}else if(a.branching_strategy==="milestone"){let p=ie(n);p?.version&&(m=a.milestone_branch_template.replace("{milestone}",p.version).replace("{slug}",De(p.name)||"milestone"))}if(m){let p=oe(n,["rev-parse","--abbrev-ref","HEAD"]);p.exitCode===0&&p.stdout.trim()!==m&&oe(n,["checkout","-b",m]).exitCode!==0&&oe(n,["checkout",m])}}let l=s&&s.length>0?s:[".planning/"];for(let m of l){let p=G.default.join(n,m);W.default.existsSync(p)?oe(n,["add",m]):oe(n,["rm","--cached","--ignore-unmatch",m])}let c=t?["commit","--amend","--no-edit"]:["commit","-m",o];r&&c.push("--no-verify");let u=oe(n,c);if(u.exitCode!==0){if(u.stdout.includes("nothing to commit")||u.stderr.includes("nothing to commit")){h({committed:!1,hash:null,reason:"nothing_to_commit"},i,"nothing");return}h({committed:!1,hash:null,reason:"nothing_to_commit",error:u.stderr},i,"nothing");return}let d=oe(n,["rev-parse","--short","HEAD"]),f=d.exitCode===0?d.stdout:null;h({committed:!0,hash:f,reason:"committed"},i,f||"committed")}function Rs(n,e,s,i){e||S("commit message required");let r=J(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 u=r.find(d=>c.startsWith(d+"/"));u?(o[u]||(o[u]=[]),o[u].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,u]of Object.entries(o)){let d=G.default.join(n,c);for(let p of u)oe(d,["add",p.slice(c.length+1)]);let f=oe(d,["commit","-m",e]);if(f.exitCode!==0){l[c]={committed:!1,hash:null,files:u,reason:f.stdout.includes("nothing to commit")?"nothing_to_commit":"error",error:f.stderr};continue}let m=oe(d,["rev-parse","--short","HEAD"]);l[c]={committed:!0,hash:m.exitCode===0?m.stdout:null,files:u}}h({committed:Object.values(l).some(c=>c.committed),repos:l,unmatched:a.length>0?a:void 0},i,Object.entries(l).map(([c,u])=>`${c}:${u.hash||"skip"}`).join(" "))}function Es(n,e,s,i){e||S("summary-path required for summary-extract");let t=G.default.join(n,e);if(!W.default.existsSync(t)){h({error:"File not found",path:e},i);return}let r=W.default.readFileSync(t,"utf-8"),o=ee(r),a=c=>(c||[]).map(u=>{let d=u.indexOf(":");return d>0?{summary:u.substring(0,d).trim(),rationale:u.substring(d+1).trim()}:{summary:u,rationale:null}}),l={path:e,one_liner:o["one-liner"]||yt(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 u of s)l[u]!==void 0&&(c[u]=l[u]);h(c,i);return}h(l,i)}async function ws(n,e,s){let i=process.env.BRAVE_API_KEY;if(!i){h({available:!1,reason:"BRAVE_API_KEY not set"},s,"");return}if(!n){h({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){h({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}));h({available:!0,query:n,count:a.length,results:a},s,a.map(l=>`${l.title}
171
- ${l.url}
172
- ${l.description}`).join(`
163
+ `,o=o.replace(c,(u,m)=>`${m}${d}`),oe(r,o,t),y({added:!0,blocker:i},n,"true")}else y({added:!1,reason:"Blockers section not found in STATE.md"},n,"false")}function Gi(t,e,n){let r=j(t).state;if(!E.default.existsSync(r)){y({error:"STATE.md not found"},n);return}if(!e){y({error:"text required"},n);return}let s=E.default.readFileSync(r,"utf-8"),i=/(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,o=s.match(i);if(o){let l=o[2].split(`
164
+ `).filter(d=>!d.startsWith("- ")||!d.toLowerCase().includes(e.toLowerCase())).join(`
165
+ `);(!l.trim()||!l.includes("- "))&&(l=`None
166
+ `),s=s.replace(i,(d,u)=>`${u}${l}`),oe(r,s,t),y({resolved:!0,blocker:e},n,"true")}else y({resolved:!1,reason:"Blockers section not found in STATE.md"},n,"false")}function Ji(t,e,n){let r=j(t).state;if(!E.default.existsSync(r)){y({error:"STATE.md not found"},n);return}let s=E.default.readFileSync(r,"utf-8"),i=new Date().toISOString(),o=[],a=d=>{let u=we(s,d,i);u&&(s=u,o.push(d))};if(a("Last session"),a("Last Date"),e.stopped_at){let d=we(s,"Stopped At",e.stopped_at)??we(s,"Stopped at",e.stopped_at);d&&(s=d,o.push("Stopped At"))}let c=e.resume_file??"None",l=we(s,"Resume File",c)??we(s,"Resume file",c);l&&(s=l,o.push("Resume File")),o.length>0?(oe(r,s,t),y({recorded:!0,updated:o},n,"true")):y({recorded:!1,reason:"No session fields found in STATE.md"},n,"false")}function Yi(t,e){let n=Ti(t);if(!E.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=E.default.readFileSync(n,"utf-8"),s=u=>J(r,u),i=[],o=r.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&&i.push({phase:m[0],summary:m[1],rationale:m[2]})}let a=[],c=r.match(/##\s*Blockers\s*\n([\s\S]*?)(?=\n##|$)/i);if(c)for(let u of c[1].match(/^-\s+(.+)$/gm)??[])a.push(u.replace(/^-\s+/,"").trim());let l={last_date:null,stopped_at:null,resume_file:null},d=r.match(/##\s*Session\s*\n([\s\S]*?)(?=\n##|$)/i);if(d){let u=d[1];l.last_date=(u.match(/\*\*Last Date:\*\*\s*(.+)/i)??u.match(/^Last Date:\s*(.+)/im))?.[1]?.trim()??null,l.stopped_at=(u.match(/\*\*Stopped At:\*\*\s*(.+)/i)??u.match(/^Stopped At:\s*(.+)/im))?.[1]?.trim()??null,l.resume_file=(u.match(/\*\*Resume File:\*\*\s*(.+)/i)??u.match(/^Resume File:\s*(.+)/im))?.[1]?.trim()??null}y({current_phase:s("Current Phase"),current_phase_name:s("Current Phase Name"),total_phases:s("Total Phases")?parseInt(s("Total Phases"),10):null,current_plan:s("Current Plan"),total_plans_in_phase:s("Total Plans in Phase")?parseInt(s("Total Plans in Phase"),10):null,status:s("Status"),progress_percent:s("Progress")?parseInt(s("Progress").replace("%",""),10):null,last_activity:s("Last Activity"),last_activity_desc:s("Last Activity Description"),decisions:i,blockers:a,paused_at:s("Paused At"),session:l},e)}function Hi(t,e){let n=j(t).state;if(!E.default.existsSync(n)){y({error:"STATE.md not found"},e,"STATE.md not found");return}let r=E.default.readFileSync(n,"utf-8"),s=ie(r);if(!s||Object.keys(s).length===0){let i=qs(r),o=Sr(i,t);y(o,e,JSON.stringify(o,null,2));return}y(s,e,JSON.stringify(s,null,2))}function Xi(t,e,n,r,s){let i=j(t).state;if(!E.default.existsSync(i)){y({error:"STATE.md not found"},s);return}let o=E.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0],c=[],l=(f,g)=>{let h=we(o,f,g);h&&(o=h,c.push(f))};l("Status",`Executing Phase ${e}`),l("Last Activity",a),l("Last Activity Description",`Phase ${e} execution started`),l("Current Phase",String(e)),n&&l("Current Phase Name",n),l("Current Plan","1"),r&&l("Total Plans in Phase",String(r));let d=n?`Phase ${e} - ${n}`:`Phase ${e}`,u=/(\*\*Current focus:\*\*\s*).*/i;u.test(o)&&(o=o.replace(u,(f,g)=>`${g}${d}`),c.push("Current focus"));let m=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,p=o.match(m);if(p){let f=p[1],g=p[2],h=`Phase: ${e}${n?` (${n})`:""} - EXECUTING`;g=/^Phase:/m.test(g)?g.replace(/^Phase:.*$/m,h):h+`
168
+ `+g;let x=`Plan: 1 of ${r??"?"}`;g=/^Plan:/m.test(g)?g.replace(/^Plan:.*$/m,x):g.replace(/^(Phase:.*$)/m,`$1
169
+ ${x}`),/^Status:/m.test(g)&&(g=g.replace(/^Status:.*$/m,`Status: Executing Phase ${e}`)),/^Last activity:/im.test(g)&&(g=g.replace(/^Last activity:.*$/im,`Last activity: ${a} -- Phase ${e} execution started`)),o=o.replace(m,`${f}${g}`),c.push("Current Position")}c.length>0&&oe(i,o,t),y({updated:c,phase:e,phase_name:n??null,plan_count:r??null},s,c.length>0?"true":"false")}function Zi(t,e,n,r,s,i){let o=E.default.existsSync(Ve.default.join(t,".gsd"))?Ve.default.join(t,".gsd"):T(t),a=Ve.default.join(o,"WAITING.json"),c={status:"waiting",type:e??"decision_point",question:n??null,options:r?r.split("|").map(l=>l.trim()):[],since:new Date().toISOString(),phase:s??null};try{E.default.mkdirSync(o,{recursive:!0}),E.default.writeFileSync(a,JSON.stringify(c,null,2),"utf-8"),y({signaled:!0,path:a},i,"true")}catch(l){y({signaled:!1,error:l.message},i,"false")}}function Ki(t,e){let n=[Ve.default.join(t,".gsd","WAITING.json"),Ve.default.join(T(t),"WAITING.json")],r=!1;for(let s of n)if(E.default.existsSync(s))try{E.default.unlinkSync(s),r=!0}catch{}y({resumed:!0,removed:r},e,r?"true":"false")}var E,Ve,Fe=N(()=>{"use strict";E=W(require("fs")),Ve=W(require("path"));ge();Ue();dn()});var mt,un,mn,pn,fn,gn,hn,yn,br=N(()=>{"use strict";mt=require("@oclif/core");$e();un=class t extends w{static description="Output GSD state as JSON";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateJson(n,r)}},mn=class t extends w{static description="Get a specific state field";static args={field:mt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateGet(r,n.field,s)}},pn=class t extends w{static description="Update a state field";static args={field:mt.Args.string({required:!0}),value:mt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateUpdate(r,n.field,n.value)}},fn=class t extends w{static description="Patch multiple state fields";static args={pairs:mt.Args.string({required:!1})};static flags={...w.baseFlags,field:mt.Flags.string({multiple:!0,description:"field=value pair"})};async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=await Promise.resolve().then(()=>(Fe(),Ze)),o={},a=n.filter(c=>!c.startsWith("--"));for(let c=0;c<a.length;c+=2){let l=a[c].replace(/^--/,"");l&&a[c+1]!==void 0&&(o[l]=a[c+1])}i.cmdStatePatch(r,o,s)}},gn=class t extends w{static description="Advance to next plan";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateAdvancePlan(n,r)}},hn=class t extends w{static description="Load and display state";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateLoad(n,r)}},yn=class t extends w{static description="Update progress counters";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateUpdateProgress(n,r)}}});var xn={};he(xn,{cmdAgentSkills:()=>ho,cmdInitExecutePhase:()=>Qi,cmdInitListWorkspaces:()=>fo,cmdInitManager:()=>mo,cmdInitMapCodebase:()=>lo,cmdInitMilestoneOp:()=>co,cmdInitNewMilestone:()=>no,cmdInitNewProject:()=>to,cmdInitNewWorkspace:()=>po,cmdInitPhaseOp:()=>oo,cmdInitPlanPhase:()=>eo,cmdInitProgress:()=>uo,cmdInitQuick:()=>so,cmdInitRemoveWorkspace:()=>go,cmdInitResume:()=>ro,cmdInitTodos:()=>ao,cmdInitVerifyWork:()=>io});function vr(t){let e=Me.default.join(Z(t),"MILESTONES.md");if(!z.default.existsSync(e))return null;try{let r=z.default.readFileSync(e,"utf-8").match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);return r?{version:r[1],name:r[2].trim()}:null}catch{return null}}function me(t,e){e.project_root=t,e.gsd_bin="dist/gsd-tools.js",e.gsd_root=".",e.gsd_harness_dir=".";let n=_t();return e.agents_installed=n.agents_installed,e.missing_agents=n.missing_agents,e}function Qi(t,e,n){e||b("phase required for init execute-phase");let r=X(t),s=fe(t,e),i=re(t),o=dt(t,e);if(!s&&o?.found){let d=o.phase_name;s={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),c=a?a[1].replace(/[[\]]/g,"").split(",").map(d=>d.trim()).filter(Boolean).join(", "):null,l=me(t,{executor_model:se(t,"gsd-executor"),verifier_model:se(t,"gsd-verifier"),commit_docs:r.commit_docs,sub_repos:r.sub_repos,parallelization:r.parallelization,context_window:r.context_window,branching_strategy:r.branching_strategy,phase_branch_template:r.phase_branch_template,milestone_branch_template:r.milestone_branch_template,verifier_enabled:r.verifier,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,phase_slug:s?.phase_slug??null,phase_req_ids:c&&c!=="TBD"?c:null,plans:s?.plans??[],summaries:s?.summaries??[],incomplete_plans:s?.incomplete_plans??[],has_research:s?.has_research??!1,has_context:s?.has_context??!1,has_verification:s?.has_verification??!1,has_reviews:s?.has_reviews??!1,roadmap_goal:o?.goal??null,roadmap_section:o?.section??null,milestone_version:i.version,milestone_name:i.name});y(l,n)}function eo(t,e,n){e||b("phase required for init plan-phase");let r=X(t),s=fe(t,e),i=dt(t,e),o=re(t),a=me(t,{planner_model:se(t,"gsd-planner"),researcher_model:se(t,"gsd-phase-researcher"),synthesizer_model:se(t,"gsd-research-synthesizer"),commit_docs:r.commit_docs,research_enabled:r.research,plan_checker_enabled:r.plan_checker,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,roadmap_goal:i?.goal??null,roadmap_section:i?.section??null,milestone_version:o.version,milestone_name:o.name});y(a,n)}function to(t,e){let n=X(t),r=Z(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,planning_exists:z.default.existsSync(r),project_exists:z.default.existsSync(Me.default.join(r,"PROJECT.md")),config_exists:z.default.existsSync(Me.default.join(r,"config.json")),roadmap_exists:z.default.existsSync(Me.default.join(r,"ROADMAP.md")),state_exists:z.default.existsSync(Me.default.join(r,"STATE.md"))});y(s,e)}function no(t,e){let n=X(t),r=re(t),s=vr(t),i=me(t,{roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,current_milestone:r,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap)});y(i,e)}function so(t,e,n){let r=X(t),s=re(t),i=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,context_window:r.context_window,branching_strategy:r.branching_strategy,quick_branch_template:r.quick_branch_template,description:e||null,milestone_version:s.version,milestone_name:s.name,state_exists:z.default.existsSync(j(t).state)});y(i,n)}function ro(t,e){let n=X(t),r=re(t),s=z.default.existsSync(j(t).state),i="";if(s)try{i=z.default.readFileSync(j(t).state,"utf-8")}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:n.commit_docs,context_window:n.context_window,state_exists:s,state_raw:i,roadmap_exists:z.default.existsSync(j(t).roadmap),config_exists:z.default.existsSync(j(t).config),milestone_version:r.version,milestone_name:r.name});y(o,e)}function io(t,e,n){e||b("phase required for init verify-work");let r=X(t),s=fe(t,e),i=dt(t,e),o=me(t,{verifier_model:se(t,"gsd-verifier"),nyquist_model:se(t,"gsd-nyquist-auditor"),commit_docs:r.commit_docs,nyquist_validation:r.nyquist_validation,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,plans:s?.plans??[],summaries:s?.summaries??[],roadmap_goal:i?.goal??null});y(o,n)}function oo(t,e,n){let r=X(t),s=e?fe(t,e):null,i=re(t),o=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:r.commit_docs,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,milestone_version:i.version,milestone_name:i.name});y(o,n)}function ao(t,e,n){let r=X(t),s=Me.default.join(T(t),"todos","pending"),i=[];if(z.default.existsSync(s))try{for(let a of z.default.readdirSync(s).filter(c=>c.endsWith(".md")))try{let c=z.default.readFileSync(Me.default.join(s,a),"utf-8"),l=c.match(/^title:\s*(.+)$/m),d=c.match(/^area:\s*(.+)$/m),u=d?d[1].trim():"general";if(e&&u!==e)continue;i.push({file:a,title:l?l[1].trim():"Untitled",area:u})}catch{}}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,todos:i,todo_count:i.length,area:e??null});y(o,n)}function co(t,e){let n=X(t),r=re(t),s=vr(t),i=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap),state_exists:z.default.existsSync(j(t).state)});y(i,e)}function lo(t,e){let n=X(t),r=me(t,{mapper_model:se(t,"gsd-codebase-mapper"),commit_docs:n.commit_docs,search_gitignored:n.search_gitignored,context_window:n.context_window,project_exists:z.default.existsSync(Me.default.join(Z(t),"PROJECT.md"))});y(r,e)}function uo(t,e){let n=X(t),r=re(t),s=Ce(t),i=j(t).phases,o=0,a=0,c=0;if(z.default.existsSync(i))try{let d=z.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).filter(s);c=d.length;for(let u of d){let m=z.default.readdirSync(Me.default.join(i,u));o+=m.filter(p=>p.match(/-PLAN\.md$/i)).length,a+=m.filter(p=>p.match(/-SUMMARY\.md$/i)).length}}catch{}let l=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,phase_count:c,total_plans:o,total_summaries:a,percent:o>0?Math.min(100,Math.round(a/o*100)):0});y(l,e)}function mo(t,e){let n=X(t),r=re(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,state_exists:z.default.existsSync(j(t).state),roadmap_exists:z.default.existsSync(j(t).roadmap)});y(s,e)}function po(t,e){let n=X(t),r=Me.default.join(Z(t),"workstreams"),s=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,workstream_mode:z.default.existsSync(r),workstreams:z.default.existsSync(r)?z.default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name):[]});y(s,e)}function fo(t,e){let n=Me.default.join(Z(t),"workstreams");if(!z.default.existsSync(n)){y(me(t,{mode:"flat",workstreams:[],count:0}),e);return}let r=z.default.readdirSync(n,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);y(me(t,{mode:"workstream",workstreams:r,count:r.length}),e)}function go(t,e,n){e||b("workstream name required for init remove-workspace");let r=Me.default.join(Z(t),"workstreams",e);if(!z.default.existsSync(r)){y(me(t,{removed:!1,reason:"not_found",workstream:e}),n);return}try{z.default.rmSync(r,{recursive:!0,force:!0})}catch(s){y(me(t,{removed:!1,reason:s.message,workstream:e}),n);return}y(me(t,{removed:!0,workstream:e}),n)}function ho(t,e,n){e||b("agent-type required");let s=X(t).agent_skills[e]??{};y({agent:e,skills:s},n,JSON.stringify(s))}var z,Me,Sn=N(()=>{"use strict";z=W(require("fs")),Me=W(require("path"));ge()});var bn,vn,_r=N(()=>{"use strict";bn=require("@oclif/core");$e();vn=class t extends w{static description="Initialise a GSD workflow context";static args={workflow:bn.Args.string({required:!0}),phase:bn.Args.string({required:!1}),rest:bn.Args.string({required:!1})};static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=n,o=i[0],a=await Promise.resolve().then(()=>(Sn(),xn)),{gsdError:c}=await Promise.resolve().then(()=>(ge(),pr));switch(o){case"execute-phase":return a.cmdInitExecutePhase(r,i[1],s);case"plan-phase":return a.cmdInitPlanPhase(r,i[1],s);case"new-project":return a.cmdInitNewProject(r,s);case"new-milestone":return a.cmdInitNewMilestone(r,s);case"quick":return a.cmdInitQuick(r,i.slice(1).join(" "),s);case"resume":return a.cmdInitResume(r,s);case"verify-work":return a.cmdInitVerifyWork(r,i[1],s);case"phase-op":return a.cmdInitPhaseOp(r,i[1],s);case"todos":return a.cmdInitTodos(r,i[1],s);case"milestone-op":return a.cmdInitMilestoneOp(r,s);case"map-codebase":return a.cmdInitMapCodebase(r,s);case"progress":return a.cmdInitProgress(r,s);case"manager":return a.cmdInitManager(r,s);case"new-workspace":return a.cmdInitNewWorkspace(r,s);case"list-workspaces":return a.cmdInitListWorkspaces(r,s);case"remove-workspace":return a.cmdInitRemoveWorkspace(r,i[1],s);default:c(`Unknown init workflow: ${o}`)}}}});var _n={};he(_n,{cmdRoadmapAnalyze:()=>xo,cmdRoadmapGetPhase:()=>yo,cmdRoadmapUpdatePlanProgress:()=>So});function yo(t,e,n){let r=j(t).roadmap;if(!ze.default.existsSync(r)){y({found:!1,error:"ROADMAP.md not found"},n,"");return}try{let s=ve(ze.default.readFileSync(r,"utf-8"),t),i=ne(e??""),o=new RegExp(`#{2,4}\\s*Phase\\s+${i}:\\s*([^\\n]+)`,"i"),a=s.match(o);if(!a){let x=new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${i}:\\s*([^*]+)\\*\\*`,"i"),S=s.match(x);if(S){y({found:!1,phase_number:e,phase_name:S[1].trim(),error:"malformed_roadmap",message:`Phase ${e} exists in summary list but missing detail section.`},n,"");return}y({found:!1,phase_number:e},n,"");return}let c=a[1].trim(),l=a.index,u=s.slice(l).match(/\n#{2,4}\s+Phase\s+\d/i),m=u?l+u.index:s.length,p=s.slice(l,m).trim(),f=p.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),g=p.match(/\*\*Success Criteria\*\*[^\n]*:\s*\n((?:\s*\d+\.\s*[^\n]+\n?)+)/i),h=g?g[1].trim().split(`
170
+ `).map(x=>x.replace(/^\s*\d+\.\s*/,"").trim()).filter(Boolean):[];y({found:!0,phase_number:e,phase_name:c,goal:f?f[1].trim():null,success_criteria:h,section:p},n,p)}catch(s){b("Failed to read ROADMAP.md: "+s.message)}}function xo(t,e){let n=j(t).roadmap;if(!ze.default.existsSync(n)){y({error:"ROADMAP.md not found",milestones:[],phases:[],current_phase:null},e);return}let r=ze.default.readFileSync(n,"utf-8"),s=ve(r,t),i=j(t).phases,o=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,a=[],c;for(;(c=o.exec(s))!==null;){let C=c[1],L=c[2].replace(/\(INSERTED\)/i,"").trim(),$=c.index,q=s.slice($).match(/\n#{2,4}\s+Phase\s+\d/i),O=q?$+q.index:s.length,U=s.slice($,O),Y=U.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),le=U.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),be=de(C),te="no_directory",pe=0,De=0,We=!1,Tt=!1;try{let nn=ze.default.readdirSync(i,{withFileTypes:!0}).filter(Ae=>Ae.isDirectory()).map(Ae=>Ae.name).find(Ae=>Ae.startsWith(be+"-")||Ae===be);if(nn){let Ae=ze.default.readdirSync(wr.default.join(i,nn));pe=Ae.filter(je=>je.endsWith("-PLAN.md")||je==="PLAN.md").length,De=Ae.filter(je=>je.endsWith("-SUMMARY.md")||je==="SUMMARY.md").length,We=Ae.some(je=>je.endsWith("-CONTEXT.md")||je==="CONTEXT.md"),Tt=Ae.some(je=>je.endsWith("-RESEARCH.md")||je==="RESEARCH.md"),De>=pe&&pe>0?te="complete":De>0?te="partial":pe>0?te="planned":Tt?te="researched":We?te="discussed":te="empty"}}catch{}let Cs=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${ne(C)}[:\\s]`,"i"),en=s.match(Cs),tn=en?en[1]==="x":!1;tn&&te!=="complete"&&(te="complete"),a.push({number:C,name:L,goal:Y?Y[1].trim():null,depends_on:le?le[1].trim():null,plan_count:pe,summary_count:De,has_context:We,has_research:Tt,disk_status:te,roadmap_complete:tn})}let l=[],d=/##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi,u;for(;(u=d.exec(s))!==null;)l.push({heading:u[1].trim(),version:"v"+u[2]});let m=a.find(C=>C.disk_status==="planned"||C.disk_status==="partial")??null,p=a.find(C=>["empty","no_directory","discussed","researched"].includes(C.disk_status))??null,f=a.reduce((C,L)=>C+L.plan_count,0),g=a.reduce((C,L)=>C+L.summary_count,0),h=a.filter(C=>C.disk_status==="complete").length,x=/-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi,S=new Set,_;for(;(_=x.exec(s))!==null;)S.add(_[1]);let P=new Set(a.map(C=>C.number)),k=[...S].filter(C=>!P.has(C));y({milestones:l,phases:a,phase_count:a.length,completed_phases:h,total_plans:f,total_summaries:g,progress_percent:f>0?Math.min(100,Math.round(g/f*100)):0,current_phase:m?m.number:null,next_phase:p?p.number:null,missing_phase_details:k.length>0?k:null},e)}function So(t,e,n){e||b("phase number required for roadmap update-plan-progress");let r=j(t).roadmap,s=fe(t,e);s||b(`Phase ${e} not found`);let i=s.plans.length,o=s.summaries.length;if(i===0){y({updated:!1,reason:"No plans found",plan_count:0,summary_count:0},n,"no plans");return}let a=o>=i,c=a?"Complete":o>0?"In Progress":"Planned",l=new Date().toISOString().split("T")[0];if(!ze.default.existsSync(r)){y({updated:!1,reason:"ROADMAP.md not found",plan_count:i,summary_count:o},n,"no roadmap");return}let d=ze.default.readFileSync(r,"utf-8"),u=ne(e),m=new RegExp(`^(\\|\\s*${u}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),p=a?` ${l} `:" ";d=d.replace(m,g=>{let h=g.split("|").slice(1,-1);return h.length===5?(h[2]=` ${o}/${i} `,h[3]=` ${c.padEnd(11)}`,h[4]=p):h.length===4&&(h[1]=` ${o}/${i} `,h[2]=` ${c.padEnd(11)}`,h[3]=p),"|"+h.join("|")+"|"});let f=new RegExp(`(#{2,4}\\s*Phase\\s+${u}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i");if(d=lt(d,f,`$1${a?`${o}/${i} plans complete`:`${o}/${i} plans executed`}`),a){let g=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${u}[:\\s][^\\n]*)`,"i");d=lt(d,g,`$1x$2 (completed ${l})`)}for(let g of s.summaries){let h=g.replace("-SUMMARY.md","").replace("SUMMARY.md","");h&&(d=d.replace(new RegExp(`(-\\s*\\[) (\\]\\s*${ne(h)})`,"i"),"$1x$2"))}ze.default.writeFileSync(r,d,"utf-8"),y({updated:!0,phase:e,plan_count:i,summary_count:o,status:c,complete:a},n,`${o}/${i} ${c}`)}var ze,wr,wn=N(()=>{"use strict";ze=W(require("fs")),wr=W(require("path"));ge()});var Ls,kn,Pn,Cn,kr=N(()=>{"use strict";Ls=require("@oclif/core");$e();kn=class t extends w{static description="Analyze roadmap phases and status";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapAnalyze(n,r)}},Pn=class t extends w{static description="Get details for a specific phase";static args={phase:Ls.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapGetPhase(r,n.phase,s)}},Cn=class t extends w{static description="Update plan progress in roadmap";static args={phase:Ls.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapUpdatePlanProgress(r,n.phase,s)}}});var $t={};he($t,{cmdConfigEnsureSection:()=>ko,cmdConfigGet:()=>Co,cmdConfigNewProject:()=>wo,cmdConfigSet:()=>Po,cmdConfigSetModelProfile:()=>$o,ensureConfigFile:()=>Us,setConfigValue:()=>Vs});function vo(t){return!!(Cr.has(t)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(t))}function _o(t){let e=bo[t];e&&b(`Unknown config key: ${t}. Did you mean ${e}?`)}function $r(t){let e=t||{},n=Pr.default.homedir(),r=Ke.default.join(n,".gsd","brave_api_key"),s=!!(process.env.BRAVE_API_KEY||ce.default.existsSync(r)),i=Ke.default.join(n,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||ce.default.existsSync(i)),a=Ke.default.join(n,".gsd","exa_api_key"),c=!!(process.env.EXA_API_KEY||ce.default.existsSync(a)),l=Ke.default.join(n,".gsd","defaults.json"),d={};try{if(ce.default.existsSync(l)&&(d=JSON.parse(ce.default.readFileSync(l,"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{ce.default.writeFileSync(l,JSON.stringify(d,null,2),"utf-8")}catch{}}}catch{}let u={model_profile:"balanced",commit_docs:!0,parallelization:!0,search_gitignored:!1,brave_search:s,firecrawl:o,exa_search:c,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 Us(t){let e=Z(t),n=Ke.default.join(e,"config.json");try{ce.default.existsSync(e)||ce.default.mkdirSync(e,{recursive:!0})}catch(s){b("Failed to create .planning directory: "+s.message)}if(ce.default.existsSync(n))return{created:!1,reason:"already_exists"};let r=$r({});try{return ce.default.writeFileSync(n,JSON.stringify(r,null,2),"utf-8"),{created:!0,path:".planning/config.json"}}catch(s){b("Failed to create config.json: "+s.message)}}function Vs(t,e,n){let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)&&(s=JSON.parse(ce.default.readFileSync(r,"utf-8")))}catch(c){b("Failed to read config.json: "+c.message)}let i=e.split("."),o=s;for(let c=0;c<i.length-1;c++){let l=i[c];(o[l]===void 0||typeof o[l]!="object")&&(o[l]={}),o=o[l]}let a=o[i[i.length-1]];o[i[i.length-1]]=n;try{return ce.default.writeFileSync(r,JSON.stringify(s,null,2),"utf-8"),{updated:!0,key:e,value:n,previousValue:a}}catch(c){b("Failed to write config.json: "+c.message)}}function wo(t,e,n){let r=Z(t),s=Ke.default.join(r,"config.json");if(ce.default.existsSync(s)){y({created:!1,reason:"already_exists"},n,"exists");return}let i={};if(e&&e.trim())try{i=JSON.parse(e)}catch(a){b("Invalid JSON for config-new-project: "+a.message)}try{ce.default.existsSync(r)||ce.default.mkdirSync(r,{recursive:!0})}catch(a){b("Failed to create .planning directory: "+a.message)}let o=$r(i);try{ce.default.writeFileSync(s,JSON.stringify(o,null,2),"utf-8"),y({created:!0,path:".planning/config.json"},n,"created")}catch(a){b("Failed to write config.json: "+a.message)}}function ko(t,e){let n=Us(t);y(n,e,n?.created?"created":"exists")}function Po(t,e,n,r){e||b("Usage: config-set <key.path> <value>"),_o(e),vo(e)||b(`Unknown config key: "${e}". Valid keys: ${[...Cr].sort().join(", ")}, agent_skills.<agent-type>`);let s=n;if(n==="true")s=!0;else if(n==="false")s=!1;else if(n!==void 0&&!isNaN(Number(n))&&n!=="")s=Number(n);else if(typeof n=="string"&&(n.startsWith("[")||n.startsWith("{")))try{s=JSON.parse(n)}catch{}let i=Vs(t,e,s);y(i,r,`${e}=${s}`)}function Co(t,e,n){e||b("Usage: config-get <key.path>");let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)?s=JSON.parse(ce.default.readFileSync(r,"utf-8")):b("No config.json found at "+r)}catch(a){if(a.message.startsWith("Error:"))throw a;b("Failed to read config.json: "+a.message)}let i=e.split("."),o=s;for(let a of i)(o==null||typeof o!="object")&&b(`Key not found: ${e}`),o=o[a];o===void 0&&b(`Key not found: ${e}`),y(o,n,String(o))}function $o(t,e,n){e||b(`Usage: config-set-model-profile <${vt.join("|")}>`);let r=e.toLowerCase().trim();vt.includes(r)||b(`Invalid profile '${e}'. Valid profiles: ${vt.join(", ")}`),Us(t);let i=Vs(t,"model_profile",r)?.previousValue||"balanced",o=As(r),a=js(o),l=i!==r?`\u2713 Model profile set to: ${r} (was: ${i})
171
+
172
+ Agents will now use:
173
+
174
+ ${a}
175
+ Next spawned agents will use the new profile.`:`\u2713 Model profile is already set to: ${r}
176
+
177
+ Agents are using:
178
+
179
+ ${a}`;y({updated:!0,profile:r,previousProfile:i,agentToModelMap:o},n,l)}var ce,Pr,Ke,Cr,bo,At=N(()=>{"use strict";ce=W(require("fs")),Pr=W(require("os")),Ke=W(require("path"));ge();Dt();Cr=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"]),bo={"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 pt,$n,An,jn,Rn,En,Ar=N(()=>{"use strict";pt=require("@oclif/core");$e();$n=class t extends w{static description="Get a config value";static args={key:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigGet:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.key,s)}},An=class t extends w{static description="Set a config value";static args={key:pt.Args.string({required:!1}),value:pt.Args.string({required:!1})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSet:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.key,n.value,s)}},jn=class t extends w{static description="Set the active model profile";static args={profile:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSetModelProfile:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.profile,s)}},Rn=class t extends w{static description="Initialise a new project config";static flags={...w.baseFlags,choices:pt.Flags.string({description:"Choices JSON"})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigNewProject:s}=await Promise.resolve().then(()=>(At(),$t));s(n,e.choices,r)}},En=class t extends w{static description="Ensure a config section exists";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigEnsureSection:s}=await Promise.resolve().then(()=>(At(),$t));s(n,r)}}});var Qe={};he(Qe,{cmdFindPhase:()=>Ro,cmdPhaseAdd:()=>Fo,cmdPhaseComplete:()=>No,cmdPhaseInsert:()=>Mo,cmdPhaseNextDecimal:()=>jo,cmdPhasePlanIndex:()=>Eo,cmdPhaseRemove:()=>Oo,cmdPhasesList:()=>Ao});function Ao(t,e,n){let r=D.default.join(T(t),"phases"),{type:s,phase:i,includeArchived:o}=e;if(!R.default.existsSync(r)){y(s?{files:[],count:0}:{directories:[],count:0},n,"");return}try{let a=R.default.readdirSync(r,{withFileTypes:!0}).filter(c=>c.isDirectory()).map(c=>c.name);if(o){let c=Lt(t);for(let l of c)a.push(`${l.name} [${l.milestone}]`)}if(a.sort((c,l)=>Pe(c,l)),i){let c=de(i),l=a.find(d=>d.startsWith(c));if(!l){y({files:[],count:0,phase_dir:null,error:"Phase not found"},n,"");return}a=[l]}if(s){let c=[];for(let l of a){let d=D.default.join(r,l),u=R.default.readdirSync(d),m;s==="plans"?m=u.filter(p=>p.endsWith("-PLAN.md")||p==="PLAN.md"):s==="summaries"?m=u.filter(p=>p.endsWith("-SUMMARY.md")||p==="SUMMARY.md"):m=u,c.push(...m.sort())}y({files:c,count:c.length,phase_dir:i?a[0]?.replace(/^\d+(?:\.\d+)*-?/,""):null},n,c.join(`
180
+ `));return}y({directories:a,count:a.length},n,a.join(`
181
+ `))}catch(a){b("Failed to list phases: "+a.message)}}function jo(t,e,n){let r=D.default.join(T(t),"phases"),s=de(e??"");if(!R.default.existsSync(r)){y({found:!1,base_phase:s,next:`${s}.1`,existing:[]},n,`${s}.1`);return}try{let i=R.default.readdirSync(r,{withFileTypes:!0}).filter(d=>d.isDirectory()).map(d=>d.name),o=i.some(d=>d.startsWith(s+"-")||d===s),a=new RegExp(`^${s}\\.(\\d+)`),c=i.map(d=>{let u=d.match(a);return u?`${s}.${u[1]}`:null}).filter(Boolean);c.sort((d,u)=>Pe(d,u));let l=c.length===0?`${s}.1`:`${s}.${parseInt(c[c.length-1].split(".")[1],10)+1}`;y({found:o,base_phase:s,next:l,existing:c},n,l)}catch(i){b("Failed to calculate next decimal phase: "+i.message)}}function Ro(t,e,n){e||b("phase identifier required");let r=D.default.join(T(t),"phases"),s=de(e),i={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=R.default.readdirSync(r,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,h)=>Pe(g,h)).find(g=>g.startsWith(s));if(!a){y(i,n,"");return}let c=a.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),l=c?c[1]:s,d=c&&c[2]?c[2]:null,u=D.default.join(r,a),m=R.default.readdirSync(u),p=m.filter(g=>g.endsWith("-PLAN.md")||g==="PLAN.md").sort(),f=m.filter(g=>g.endsWith("-SUMMARY.md")||g==="SUMMARY.md").sort();y({found:!0,directory:B(D.default.join(D.default.relative(t,T(t)),"phases",a)),phase_number:l,phase_name:d,plans:p,summaries:f},n,B(D.default.join(D.default.relative(t,T(t)),"phases",a)))}catch{y(i,n,"")}}function Eo(t,e,n){e||b("phase required for phase-plan-index");let r=D.default.join(T(t),"phases"),s=de(e),i=null;try{let g=R.default.readdirSync(r,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).sort((h,x)=>Pe(h,x)).find(h=>h.startsWith(s));g&&(i=D.default.join(r,g))}catch{}if(!i){y({phase:s,error:"Phase not found",plans:[],waves:{},incomplete:[],has_checkpoints:!1},n);return}let o=R.default.readdirSync(i),a=o.filter(f=>f.endsWith("-PLAN.md")||f==="PLAN.md").sort(),c=o.filter(f=>f.endsWith("-SUMMARY.md")||f==="SUMMARY.md"),l=new Set(c.map(f=>f.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),d=[],u={},m=[],p=!1;for(let f of a){let g=f.replace("-PLAN.md","").replace("PLAN.md",""),h=R.default.readFileSync(D.default.join(i,f),"utf-8"),x=ie(h),S=h.match(/<task[\s>]/gi)||[],_=h.match(/##\s*Task\s*\d+/gi)||[],P=S.length||_.length,k=parseInt(String(x.wave),10)||1,C=!0;x.autonomous!==void 0&&(C=x.autonomous==="true"||x.autonomous===!0),C||(p=!0);let L=[],$=x.files_modified??x["files-modified"];if($){let U=_e($);L=U?U.map(Y=>ue(Y)??String(Y)):[ue($)??String($)]}let q=l.has(g);q||m.push(g),d.push({id:g,wave:k,autonomous:C,objective:h.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()??ue(x.objective)??null,files_modified:L,task_count:P,has_summary:q});let O=String(k);u[O]||(u[O]=[]),u[O].push(g)}y({phase:s,plans:d,waves:u,incomplete:m,has_checkpoints:p},n)}function Fo(t,e,n,r){e||b("description required for phase add");let s=X(t),i=D.default.join(T(t),"ROADMAP.md");R.default.existsSync(i)||b("ROADMAP.md not found");let o=R.default.readFileSync(i,"utf-8"),a=ve(o,t),c=qe(e),l,d;if(r||s.phase_naming==="custom")l=r||c.toUpperCase().replace(/-/g,"-"),l||b('--id required when phase_naming is "custom"'),d=`${l}-${c}`;else{let h=/#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi,x=0,S;for(;(S=h.exec(a))!==null;){let P=parseInt(S[1],10);P>x&&(x=P)}l=x+1,d=`${String(l).padStart(2,"0")}-${c}`}let u=D.default.join(T(t),"phases",d);R.default.mkdirSync(u,{recursive:!0}),R.default.writeFileSync(D.default.join(u,".gitkeep"),"");let m=s.phase_naming==="custom"?"":`
182
+ **Depends on:** Phase ${typeof l=="number"?l-1:"TBD"}`,p=`
183
+ ### Phase ${l}: ${e}
184
+
185
+ **Goal:** [To be planned]
186
+ **Requirements**: TBD${m}
187
+ **Plans:** 0 plans
188
+
189
+ Plans:
190
+ - [ ] TBD (run /gsd-plan-phase ${l} to break down)
191
+ `,f=o.lastIndexOf(`
192
+ ---`),g=f>0?o.slice(0,f)+p+o.slice(f):o+p;R.default.writeFileSync(i,g,"utf-8"),y({phase_number:typeof l=="number"?l:String(l),padded:typeof l=="number"?String(l).padStart(2,"0"):String(l),name:e,slug:c,directory:B(D.default.join(D.default.relative(t,T(t)),"phases",d)),naming_mode:s.phase_naming},n,typeof l=="number"?String(l).padStart(2,"0"):String(l))}function Mo(t,e,n,r){(!e||!n)&&b("after-phase and description required for phase insert");let s=D.default.join(T(t),"ROADMAP.md");R.default.existsSync(s)||b("ROADMAP.md not found");let i=R.default.readFileSync(s,"utf-8"),o=ve(i,t),a=qe(n),d=de(e).replace(/^0+/,"").replace(/\./g,"\\.");new RegExp(`#{2,4}\\s*Phase\\s+0*${d}:`,"i").test(o)||b(`Phase ${e} not found in ROADMAP.md`);let m=D.default.join(T(t),"phases"),p=de(e),f=[];try{let O=R.default.readdirSync(m,{withFileTypes:!0}).filter(Y=>Y.isDirectory()).map(Y=>Y.name),U=new RegExp(`^${p}\\.(\\d+)`);for(let Y of O){let le=Y.match(U);le&&f.push(parseInt(le[1],10))}}catch{}let g=f.length===0?1:Math.max(...f)+1,h=`${p}.${g}`,x=`${h}-${a}`,S=D.default.join(T(t),"phases",x);R.default.mkdirSync(S,{recursive:!0}),R.default.writeFileSync(D.default.join(S,".gitkeep"),"");let _=`
193
+ ### Phase ${h}: ${n} (INSERTED)
194
+
195
+ **Goal:** [Urgent work - to be planned]
196
+ **Requirements**: TBD
197
+ **Depends on:** Phase ${e}
198
+ **Plans:** 0 plans
199
+
200
+ Plans:
201
+ - [ ] TBD (run /gsd-plan-phase ${h} to break down)
202
+ `,P=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),k=i.match(P);k||b(`Could not find Phase ${e} header`);let C=i.indexOf(k[0]),$=i.slice(C+k[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),q=$?C+k[0].length+$.index:i.length;R.default.writeFileSync(s,i.slice(0,q)+_+i.slice(q),"utf-8"),y({phase_number:h,after_phase:e,name:n,slug:a,directory:B(D.default.join(D.default.relative(t,T(t)),"phases",x))},r,h)}function Io(t,e,n){let r=[],s=[],i=new RegExp(`^${e}\\.(\\d+)-(.+)$`),o=Le(t,!0).map(a=>{let c=a.match(i);return c?{dir:a,oldDecimal:parseInt(c[1],10),slug:c[2]}:null}).filter(a=>a!==null&&a.oldDecimal>n).sort((a,c)=>c.oldDecimal-a.oldDecimal);for(let a of o){let c=a.oldDecimal-1,l=`${e}.${a.oldDecimal}`,d=`${e}.${c}`,u=`${e}.${c}-${a.slug}`;R.default.renameSync(D.default.join(t,a.dir),D.default.join(t,u)),r.push({from:a.dir,to:u});for(let m of R.default.readdirSync(D.default.join(t,u)))if(m.includes(l)){let p=m.replace(l,d);R.default.renameSync(D.default.join(t,u,m),D.default.join(t,u,p)),s.push({from:m,to:p})}}return{renamedDirs:r,renamedFiles:s}}function To(t,e){let n=[],r=[],s=Le(t,!0).map(i=>{let o=i.match(/^(\d+)([A-Z])?(?:\.(\d+))?-(.+)$/i);if(!o)return null;let a=parseInt(o[1],10);return a>e?{dir:i,oldInt:a,letter:o[2]?o[2].toUpperCase():"",decimal:o[3]?parseInt(o[3],10):null,slug:o[4]}:null}).filter(i=>i!==null).sort((i,o)=>i.oldInt!==o.oldInt?o.oldInt-i.oldInt:(o.decimal||0)-(i.decimal||0));for(let i of s){let o=i.oldInt-1,a=String(o).padStart(2,"0"),c=String(i.oldInt).padStart(2,"0"),l=i.letter||"",d=i.decimal!==null?`.${i.decimal}`:"",u=`${c}${l}${d}`,m=`${a}${l}${d}`,p=`${m}-${i.slug}`;R.default.renameSync(D.default.join(t,i.dir),D.default.join(t,p)),n.push({from:i.dir,to:p});for(let f of R.default.readdirSync(D.default.join(t,p)))if(f.startsWith(u)){let g=m+f.slice(u.length);R.default.renameSync(D.default.join(t,p,f),D.default.join(t,p,g)),r.push({from:f,to:g})}}return{renamedDirs:n,renamedFiles:r}}function Do(t,e,n,r){let s=R.default.readFileSync(t,"utf-8"),i=ne(e);if(s=s.replace(new RegExp(`\\n?#{2,4}\\s*Phase\\s+${i}\\s*:[\\s\\S]*?(?=\\n#{2,4}\\s+Phase\\s+\\d|$)`,"i"),""),s=s.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${i}[:\\s][^\\n]*`,"gi"),""),s=s.replace(new RegExp(`\\n?\\|\\s*${i}\\.?\\s[^|]*\\|[^\\n]*`,"gi"),""),!n)for(let o=99;o>r;o--){let a=o-1,c=String(o),l=String(a),d=c.padStart(2,"0"),u=l.padStart(2,"0");s=s.replace(new RegExp(`(#{2,4}\\s*Phase\\s+)${c}(\\s*:)`,"gi"),`$1${l}$2`),s=s.replace(new RegExp(`(Phase\\s+)${c}([:\\s])`,"g"),`$1${l}$2`),s=s.replace(new RegExp(`${d}-(\\d{2})`,"g"),`${u}-$1`),s=s.replace(new RegExp(`(\\|\\s*)${c}\\.\\s`,"g"),`$1${l}. `),s=s.replace(new RegExp(`(Depends on:\\*\\*\\s*Phase\\s+)${c}\\b`,"gi"),`$1${l}`)}R.default.writeFileSync(t,s,"utf-8")}function Oo(t,e,n,r){e||b("phase number required for phase remove");let s=D.default.join(T(t),"ROADMAP.md"),i=D.default.join(T(t),"phases");R.default.existsSync(s)||b("ROADMAP.md not found");let o=de(e),a=e.includes("."),c=n.force||!1,l=Le(i,!0).find(p=>p.startsWith(o+"-")||p===o)||null;if(l&&!c){let p=R.default.readdirSync(D.default.join(i,l)).filter(f=>f.endsWith("-SUMMARY.md")||f==="SUMMARY.md");p.length>0&&b(`Phase ${e} has ${p.length} executed plan(s). Use --force to remove anyway.`)}l&&R.default.rmSync(D.default.join(i,l),{recursive:!0,force:!0});let d=[],u=[];try{let p=a?Io(i,o.split(".")[0],parseInt(o.split(".")[1],10)):To(i,parseInt(o,10));d=p.renamedDirs,u=p.renamedFiles}catch{}Do(s,e,a,parseInt(o,10));let m=D.default.join(T(t),"STATE.md");if(R.default.existsSync(m)){let p=R.default.readFileSync(m,"utf-8"),f=J(p,"Total Phases");f&&(p=we(p,"Total Phases",String(parseInt(f,10)-1))??p);let g=p.match(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i);g&&(p=p.replace(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i,`$1${parseInt(g[2],10)-1}$3`)),oe(m,p,t)}y({removed:e,directory_deleted:l,renamed_directories:d,renamed_files:u,roadmap_updated:!0,state_updated:R.default.existsSync(m)},r)}function No(t,e,n){e||b("phase number required for phase complete");let r=D.default.join(T(t),"ROADMAP.md"),s=D.default.join(T(t),"STATE.md"),i=D.default.join(T(t),"phases"),o=de(e),a=new Date().toISOString().split("T")[0],c=fe(t,e);c||b(`Phase ${e} not found`);let l=c.plans.length,d=c.summaries.length,u=!1,m=[];try{let h=D.default.join(t,c.directory),x=R.default.readdirSync(h);for(let S of x.filter(_=>_.includes("-UAT")&&_.endsWith(".md"))){let _=R.default.readFileSync(D.default.join(h,S),"utf-8");/result: pending/.test(_)&&m.push(`${S}: has pending tests`),/result: blocked/.test(_)&&m.push(`${S}: has blocked tests`),/status: partial/.test(_)&&m.push(`${S}: testing incomplete (partial)`),/status: diagnosed/.test(_)&&m.push(`${S}: has diagnosed gaps`)}for(let S of x.filter(_=>_.includes("-VERIFICATION")&&_.endsWith(".md"))){let _=R.default.readFileSync(D.default.join(h,S),"utf-8");/status: human_needed/.test(_)&&m.push(`${S}: needs human verification`),/status: gaps_found/.test(_)&&m.push(`${S}: has unresolved gaps`)}}catch{}if(R.default.existsSync(r)){let h=R.default.readFileSync(r,"utf-8"),x=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${ne(e)}[:\\s][^\\n]*)`,"i");h=lt(h,x,`$1x$2 (completed ${a})`);let S=ne(e);h=h.replace(new RegExp(`^(\\|\\s*${S}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),P=>{let k=P.split("|").slice(1,-1);return k.length===5?(k[3]=" Complete ",k[4]=` ${a} `):k.length===4&&(k[2]=" Complete ",k[3]=` ${a} `),"|"+k.join("|")+"|"}),h=lt(h,new RegExp(`(#{2,4}\\s*Phase\\s+${S}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${l} plans complete`),R.default.writeFileSync(r,h,"utf-8");let _=D.default.join(T(t),"REQUIREMENTS.md");if(R.default.existsSync(_)){let k=ve(h,t).match(new RegExp(`(#{2,4}\\s*Phase\\s+${ne(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),L=(k?k[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(L){let $=L[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(O=>O.trim()).filter(Boolean),q=R.default.readFileSync(_,"utf-8");for(let O of $){let U=ne(O);q=q.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${U}\\*\\*)`,"gi"),"$1x$2"),q=q.replace(new RegExp(`(\\|\\s*${U}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}R.default.writeFileSync(_,q,"utf-8"),u=!0}}}let p=null,f=null,g=!0;try{let h=Ce(t),x=R.default.readdirSync(i,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).filter(h).sort((S,_)=>Pe(S,_));for(let S of x){let _=S.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(_&&Pe(_[1],e)>0){p=_[1],f=_[2]||null,g=!1;break}}}catch{}if(g&&R.default.existsSync(r))try{let h=ve(R.default.readFileSync(r,"utf-8"),t),x=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,S;for(;(S=x.exec(h))!==null;)if(Pe(S[1],e)>0){p=S[1],f=S[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),g=!1;break}}catch{}if(R.default.existsSync(s)){let h=R.default.readFileSync(s,"utf-8"),x=p||e,S=J(h,"Current Phase")||J(h,"Phase"),_=String(x);if(S){let k=S.match(/of\s+(\d+)/),C=S.match(/\(([^)]+)\)/);if(k){let L=f?` (${f.replace(/-/g," ")})`:C?` (${C[1]})`:"";_=`${x} of ${k[1]}${L}`}}h=ye(h,"Current Phase","Phase",_),f&&(h=ye(h,"Current Phase Name",null,f.replace(/-/g," "))),h=ye(h,"Status",null,g?"Milestone complete":"Ready to plan"),h=ye(h,"Current Plan","Plan","Not started"),h=ye(h,"Last Activity","Last activity",a),h=ye(h,"Last Activity Description",null,`Phase ${e} complete${p?`, transitioned to Phase ${p}`:""}`);let P=J(h,"Completed Phases");if(P){let k=parseInt(P,10)+1;h=we(h,"Completed Phases",String(k))??h;let C=J(h,"Total Phases");if(C){let L=parseInt(C,10);if(L>0){let $=Math.round(k/L*100);h=we(h,"Progress",`${$}%`)??h,h=h.replace(/(percent:\s*)\d+/,`$1${$}`)}}}oe(s,h,t)}y({completed_phase:e,phase_name:c.phase_name,plans_executed:`${d}/${l}`,next_phase:p,next_phase_name:f,is_last_phase:g,date:a,roadmap_updated:R.default.existsSync(r),state_updated:R.default.existsSync(s),requirements_updated:u,warnings:m,has_warnings:m.length>0},n)}var R,D,et=N(()=>{"use strict";R=W(require("fs")),D=W(require("path"));ge();Ue();Fe()});var Be,Fn,Mn,In,Tn,Dn,On,jr=N(()=>{"use strict";Be=require("@oclif/core");$e();Fn=class t extends w{static description="Get next decimal phase number";static args={phase:Be.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(et(),Qe))).cmdPhaseNextDecimal(r,n.phase,s)}},Mn=class t extends w{static description="Add a new phase";static flags={...w.baseFlags,id:Be.Flags.string({description:"Custom phase ID"})};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=await Promise.resolve().then(()=>(et(),Qe)),o=n.join(" ");i.cmdPhaseAdd(r,o,s,e.id??null)}},In=class t extends w{static description="Insert a phase at position";static args={position:Be.Args.string({required:!0}),description:Be.Args.string({required:!1})};static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=n;(await Promise.resolve().then(()=>(et(),Qe))).cmdPhaseInsert(r,i[0],i.slice(1).join(" "),s)}},Tn=class t extends w{static description="Remove a phase";static args={phase:Be.Args.string({required:!0})};static flags={...w.baseFlags,force:Be.Flags.boolean({description:"Force removal",default:!1})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(et(),Qe))).cmdPhaseRemove(r,n.phase,{force:e.force},s)}},Dn=class t extends w{static description="Mark a phase as complete";static args={phase:Be.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(et(),Qe))).cmdPhaseComplete(r,n.phase,s)}},On=class t extends w{static description="Get phase plan index";static args={phase:Be.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdPhasePlanIndex:i}=await Promise.resolve().then(()=>(et(),Qe));i(r,n.phase,s)}}});var Nn={};he(Nn,{cmdMilestoneComplete:()=>qo,cmdRequirementsMarkComplete:()=>Wo});function Wo(t,e,n){(!e||e.length===0)&&b("requirement IDs required.");let r=e.join(" ").replace(/[[\]]/g,"").split(/[,\s]+/).map(l=>l.trim()).filter(Boolean);r.length===0&&b("no valid requirement IDs found");let s=j(t).requirements;if(!G.default.existsSync(s)){y({updated:!1,reason:"REQUIREMENTS.md not found",ids:r},n,"no requirements file");return}let i=G.default.readFileSync(s,"utf-8"),o=[],a=[],c=[];for(let l of r){let d=!1,u=ne(l);new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${u}\\*\\*)`,"gi").test(i)&&(i=i.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${u}\\*\\*)`,"gi"),"$1x$2"),d=!0),new RegExp(`(\\|\\s*${u}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi").test(i)&&(i=i.replace(new RegExp(`(\\|\\s*${u}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi"),"$1 Complete $2"),d=!0),d?o.push(l):new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${u}\\*\\*`,"gi").test(i)||new RegExp(`\\|\\s*${u}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`,"gi").test(i)?a.push(l):c.push(l)}o.length>0&&G.default.writeFileSync(s,i,"utf-8"),y({updated:o.length>0,marked_complete:o,already_complete:a,not_found:c,total:r.length},n,`${o.length}/${r.length} requirements marked complete`)}function qo(t,e,n,r){e||b("version required for milestone complete (e.g., v1.0)");let s=j(t).roadmap,i=j(t).requirements,o=j(t).state,a=ke.default.join(t,".planning","MILESTONES.md"),c=ke.default.join(t,".planning","milestones"),l=j(t).phases,d=new Date().toISOString().split("T")[0],u=n.name||e;G.default.mkdirSync(c,{recursive:!0});let m=Ce(t),p=0,f=0,g=0,h=[];try{let k=G.default.readdirSync(l,{withFileTypes:!0}).filter(C=>C.isDirectory()).map(C=>C.name).sort();for(let C of k){if(!m(C))continue;p++;let L=G.default.readdirSync(ke.default.join(l,C)),$=L.filter(O=>O.endsWith("-PLAN.md")||O==="PLAN.md"),q=L.filter(O=>O.endsWith("-SUMMARY.md")||O==="SUMMARY.md");f+=$.length;for(let O of q)try{let U=G.default.readFileSync(ke.default.join(l,C,O),"utf-8"),Y=ie(U),le=ue(Y["one-liner"])??Ut(U);le&&h.push(le);let be=U.match(/\*\*Tasks:\*\*\s*(\d+)/);if(be)g+=parseInt(be[1],10);else{let te=U.match(/<task[\s>]/gi)||[],pe=U.match(/##\s*Task\s*\d+/gi)||[];g+=te.length||pe.length}}catch{}}}catch{}G.default.existsSync(s)&&G.default.writeFileSync(ke.default.join(c,`${e}-ROADMAP.md`),G.default.readFileSync(s,"utf-8"),"utf-8"),G.default.existsSync(i)&&G.default.writeFileSync(ke.default.join(c,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
203
+
204
+ **Archived:** ${d}
205
+ **Status:** SHIPPED
206
+
207
+ ---
208
+
209
+ `+G.default.readFileSync(i,"utf-8"),"utf-8");let x=ke.default.join(t,".planning",`${e}-MILESTONE-AUDIT.md`);G.default.existsSync(x)&&G.default.renameSync(x,ke.default.join(c,`${e}-MILESTONE-AUDIT.md`));let S=h.map(k=>`- ${k}`).join(`
210
+ `),_=`## ${e} ${u} (Shipped: ${d})
211
+
212
+ **Phases completed:** ${p} phases, ${f} plans, ${g} tasks
213
+
214
+ **Key accomplishments:**
215
+ ${S||"- (none recorded)"}
216
+
217
+ ---
218
+
219
+ `;if(G.default.existsSync(a)){let k=G.default.readFileSync(a,"utf-8");if(!k.trim())G.default.writeFileSync(a,Ee(`# Milestones
220
+
221
+ ${_}`),"utf-8");else{let C=k.match(/^(#{1,3}\s+[^\n]*\n\n?)/);C?G.default.writeFileSync(a,Ee(C[1]+_+k.slice(C[1].length)),"utf-8"):G.default.writeFileSync(a,Ee(_+k),"utf-8")}}else G.default.writeFileSync(a,Ee(`# Milestones
222
+
223
+ ${_}`),"utf-8");if(G.default.existsSync(o)){let k=G.default.readFileSync(o,"utf-8");k=ye(k,"Status",null,`${e} milestone complete`),k=ye(k,"Last Activity","Last activity",d),k=ye(k,"Last Activity Description",null,`${e} milestone completed and archived`),oe(o,k,t)}let P=!1;if(n.archivePhases)try{let k=ke.default.join(c,`${e}-phases`);G.default.mkdirSync(k,{recursive:!0});let C=G.default.readdirSync(l,{withFileTypes:!0}).filter($=>$.isDirectory()).map($=>$.name),L=0;for(let $ of C)m($)&&(G.default.renameSync(ke.default.join(l,$),ke.default.join(k,$)),L++);P=L>0}catch{}y({version:e,name:u,date:d,phases:p,plans:f,tasks:g,accomplishments:h,archived:{roadmap:G.default.existsSync(ke.default.join(c,`${e}-ROADMAP.md`)),requirements:G.default.existsSync(ke.default.join(c,`${e}-REQUIREMENTS.md`)),audit:G.default.existsSync(ke.default.join(c,`${e}-MILESTONE-AUDIT.md`)),phases:P},milestones_updated:!0,state_updated:G.default.existsSync(o)},r)}var G,ke,Wn=N(()=>{"use strict";G=W(require("fs")),ke=W(require("path"));ge();Ue();Fe()});var Vt,qn,Ln,Rr=N(()=>{"use strict";Vt=require("@oclif/core");$e();qn=class t extends w{static description="Complete the current milestone";static args={version:Vt.Args.string({required:!1})};static flags={...w.baseFlags,name:Vt.Flags.string({description:"Milestone name"}),"archive-phases":Vt.Flags.boolean({description:"Archive phases",default:!1})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdMilestoneComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n.version??"",{name:e.name??null,archivePhases:e["archive-phases"]},s)}},Ln=class t extends w{static description="Mark requirements as complete";static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdRequirementsMarkComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n,s)}}});var v,Er,Jc,Yc,Hc,Xc,Lo,Zc,Uo,Vo,zo,Un,Fr=N(()=>{"use strict";v=require("zod"),Er=v.z.object({milestone:v.z.string().optional(),milestone_name:v.z.string().optional(),current_phase:v.z.string().optional(),current_phase_name:v.z.string().optional(),current_plan:v.z.string().optional(),total_phases:v.z.coerce.number().int().nonnegative().optional(),total_plans_in_phase:v.z.coerce.number().int().nonnegative().optional(),status:v.z.string().optional(),progress:v.z.string().optional(),last_activity:v.z.string().optional(),paused_at:v.z.string().optional(),stopped_at:v.z.string().optional()}).passthrough(),Jc=v.z.object({found:v.z.literal(!0),phase_number:v.z.string(),phase_name:v.z.string(),goal:v.z.string().nullable(),success_criteria:v.z.array(v.z.string()).default([]),section:v.z.string().optional()}).passthrough(),Yc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),plan:v.z.union([v.z.string(),v.z.number()]),type:v.z.string(),wave:v.z.union([v.z.string(),v.z.number()]),depends_on:v.z.union([v.z.string(),v.z.array(v.z.string())]),files_modified:v.z.union([v.z.string(),v.z.array(v.z.string())]),autonomous:v.z.union([v.z.boolean(),v.z.string()]),must_haves:v.z.union([v.z.string(),v.z.array(v.z.string())])}).passthrough(),Hc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),plan:v.z.union([v.z.string(),v.z.number()]),subsystem:v.z.string(),tags:v.z.union([v.z.string(),v.z.array(v.z.string())]),duration:v.z.string(),completed:v.z.string()}).passthrough(),Xc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),verified:v.z.union([v.z.boolean(),v.z.string()]),status:v.z.string(),score:v.z.union([v.z.number(),v.z.string()])}).passthrough(),Lo=v.z.object({test:v.z.number().int().positive().optional(),name:v.z.string(),expected:v.z.string().optional(),result:v.z.string(),category:v.z.string(),reason:v.z.string().optional(),blocked_by:v.z.string().optional()}).passthrough(),Zc=v.z.object({phase:v.z.string(),phase_dir:v.z.string(),file:v.z.string(),file_path:v.z.string(),type:v.z.literal("uat"),status:v.z.string(),items:v.z.array(Lo)}).passthrough(),Uo=v.z.object({branching_strategy:v.z.enum(["none","phase","milestone","workstream"]).default("none"),phase_branch_template:v.z.string().default("gsd/phase-{phase}-{slug}"),milestone_branch_template:v.z.string().default("gsd/{milestone}-{slug}"),quick_branch_template:v.z.string().nullable().default(null)}).passthrough(),Vo=v.z.object({research:v.z.boolean().default(!0),plan_check:v.z.boolean().default(!0),verifier:v.z.boolean().default(!0),nyquist_validation:v.z.boolean().default(!0),auto_advance:v.z.boolean().default(!1),node_repair:v.z.boolean().default(!0),node_repair_budget:v.z.number().int().nonnegative().default(2),auto_retry_audit:v.z.boolean().default(!0),auto_retry_audit_budget:v.z.number().int().nonnegative().default(1),auto_retry_tech_debt:v.z.boolean().default(!0),auto_retry_tech_debt_budget:v.z.number().int().nonnegative().default(1),ui_phase:v.z.boolean().default(!0),ui_safety_gate:v.z.boolean().default(!0),text_mode:v.z.boolean().default(!1),research_before_questions:v.z.boolean().default(!1),discuss_mode:v.z.string().default("discuss"),skip_discuss:v.z.boolean().default(!1),_auto_chain_active:v.z.boolean().default(!1)}).passthrough(),zo=v.z.object({context_warnings:v.z.boolean().default(!0),workflow_guard:v.z.boolean().default(!1)}).passthrough(),Un=v.z.object({model_profile:v.z.enum(["quality","balanced","budget","inherit"]).default("balanced"),commit_docs:v.z.boolean().default(!0),parallelization:v.z.boolean().default(!0),search_gitignored:v.z.boolean().default(!1),brave_search:v.z.boolean().default(!1),firecrawl:v.z.boolean().default(!1),exa_search:v.z.boolean().default(!1),git:Uo.default({}),workflow:Vo.default({}),hooks:zo.default({}),agent_skills:v.z.record(v.z.string(),v.z.unknown()).default({})}).passthrough()});var jt={};he(jt,{cmdValidateAgents:()=>ta,cmdValidateConsistency:()=>Qo,cmdValidateHealth:()=>ea,cmdVerifyArtifacts:()=>Zo,cmdVerifyCommits:()=>Xo,cmdVerifyKeyLinks:()=>Ko,cmdVerifyPhaseCompleteness:()=>Yo,cmdVerifyPlanStructure:()=>Jo,cmdVerifyReferences:()=>Ho,cmdVerifySummary:()=>Go});function Bo(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}function Go(t,e,n,r){e||b("summary-path required");let s=K.default.join(t,e),i=n||2;if(!Q.default.existsSync(s)){y({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"]},r,"failed");return}let o=Q.default.readFileSync(s,"utf-8"),a=[],c=new Set;for(let g of[/`([^`]+\.[a-zA-Z]+)`/g,/(?:Created|Modified|Added|Updated|Edited):\s*`?([^\s`]+\.[a-zA-Z]+)`?/gi]){let h;for(;(h=g.exec(o))!==null;)h[1]&&!h[1].startsWith("http")&&h[1].includes("/")&&c.add(h[1])}let l=Array.from(c).slice(0,i),d=l.filter(g=>!Q.default.existsSync(K.default.join(t,g))),u=o.match(/\b[0-9a-f]{7,40}\b/g)||[],m=!1;for(let g of u.slice(0,3))if(ae(t,["cat-file","-t",g]).stdout==="commit"){m=!0;break}let p="not_found";if(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i.test(o)){let g=o.slice(o.search(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i));/(?:fail|✗|❌|incomplete|blocked)/i.test(g)?p="failed":/(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i.test(g)&&(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 f=d.length===0&&p!=="failed";y({passed:f,checks:{summary_exists:!0,files_created:{checked:l.length,found:l.length-d.length,missing:d},commits_exist:m,self_check:p},errors:a},r,f?"passed":"failed")}function Jo(t,e,n){e||b("file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=ie(s),o=[],a=[];for(let m of["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"])i[m]===void 0&&o.push(`Missing required frontmatter field: ${m}`);let c=/<task[^>]*>([\s\S]*?)<\/task>/g,l=[],d;for(;(d=c.exec(s))!==null;){let m=d[1],p=m.match(/<name>([\s\S]*?)<\/name>/),f=p?p[1].trim():"unnamed",g=/<files>/.test(m),h=/<action>/.test(m),x=/<verify>/.test(m),S=/<done>/.test(m);p||o.push("Task missing <name> element"),h||o.push(`Task '${f}' missing <action>`),x||a.push(`Task '${f}' missing <verify>`),S||a.push(`Task '${f}' missing <done>`),g||a.push(`Task '${f}' missing <files>`),l.push({name:f,hasFiles:g,hasAction:h,hasVerify:x,hasDone:S})}l.length===0&&a.push("No <task> elements found"),i.wave&&parseInt(String(i.wave))>1&&(!i.depends_on||Array.isArray(i.depends_on)&&i.depends_on.length===0)&&a.push("Wave > 1 but depends_on is empty"),/<task\s+type=["']?checkpoint/.test(s)&&i.autonomous!=="false"&&i.autonomous!==!1&&o.push("Has checkpoint tasks but autonomous is not false"),y({valid:o.length===0,errors:o,warnings:a,task_count:l.length,tasks:l,frontmatter_fields:Object.keys(i)},n,o.length===0?"valid":"invalid")}function Yo(t,e,n){e||b("phase required");let r=fe(t,e);if(!r?.found){y({error:"Phase not found",phase:e},n);return}let s=K.default.join(t,r.directory),i=[],o=[],a;try{a=Q.default.readdirSync(s)}catch{y({error:"Cannot read phase directory"},n);return}let c=a.filter(f=>f.match(/-PLAN\.md$/i)),l=a.filter(f=>f.match(/-SUMMARY\.md$/i)),d=new Set(c.map(f=>f.replace(/-PLAN\.md$/i,""))),u=new Set(l.map(f=>f.replace(/-SUMMARY\.md$/i,""))),m=[...d].filter(f=>!u.has(f)),p=[...u].filter(f=>!d.has(f));m.length>0&&i.push(`Plans without summaries: ${m.join(", ")}`),p.length>0&&o.push(`Summaries without plans: ${p.join(", ")}`),y({complete:i.length===0,phase:r.phase_number,plan_count:c.length,summary_count:l.length,incomplete_plans:m,orphan_summaries:p,errors:i,warnings:o},n,i.length===0?"complete":"incomplete")}function Ho(t,e,n){e||b("file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=[],o=[];for(let a of s.match(/@([^\s\n,)]+\/[^\s\n,)]+)/g)||[]){let c=a.slice(1),l=c.startsWith("~/")?K.default.join(process.env.HOME??"",c.slice(2)):K.default.join(t,c);(Q.default.existsSync(l)?i:o).push(c)}for(let a of s.match(/`([^`]+\/[^`]+\.[a-zA-Z]{1,10})`/g)||[]){let c=a.slice(1,-1);c.startsWith("http")||c.includes("${")||c.includes("{{")||i.includes(c)||o.includes(c)||(Q.default.existsSync(K.default.join(t,c))?i:o).push(c)}y({valid:o.length===0,found:i.length,missing:o,total:i.length+o.length},n,o.length===0?"valid":"invalid")}function Xo(t,e,n){(!e||e.length===0)&&b("At least one commit hash required");let r=[],s=[];for(let i of e)(ae(t,["cat-file","-t",i]).stdout.trim()==="commit"?r:s).push(i);y({all_valid:s.length===0,valid:r,invalid:s,total:e.length},n,s.length===0?"valid":"invalid")}function Zo(t,e,n){e||b("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=an(s,"artifacts");if(i.length===0){y({error:"No must_haves.artifacts found in frontmatter",path:e},n);return}let o=[];for(let c of i){if(typeof c=="string")continue;let l=c;if(!l.path)continue;let d=K.default.join(t,l.path),u=Q.default.existsSync(d),m={path:l.path,exists:u,issues:[],passed:!1};if(u){let p=Oe(d)??"",f=p.split(`
224
+ `).length;if(l.min_lines&&f<l.min_lines&&m.issues.push(`Only ${f} lines, need ${l.min_lines}`),l.contains&&!p.includes(l.contains)&&m.issues.push(`Missing pattern: ${l.contains}`),l.exports){let g=Array.isArray(l.exports)?l.exports:[l.exports];for(let h of g)p.includes(h)||m.issues.push(`Missing export: ${h}`)}m.passed=m.issues.length===0}else m.issues.push("File not found");o.push(m)}let a=o.filter(c=>c.passed).length;y({all_passed:a===o.length,passed:a,total:o.length,artifacts:o},n,a===o.length?"valid":"invalid")}function Ko(t,e,n){e||b("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=an(s,"key_links");if(i.length===0){y({error:"No must_haves.key_links found in frontmatter",path:e},n);return}let o=[];for(let c of i){if(typeof c=="string")continue;let l=c,d={from:l.from??"",to:l.to??"",via:l.via||"",verified:!1,detail:""},u=Oe(K.default.join(t,l.from||""));if(!u)d.detail="Source file not found";else if(l.pattern)try{let m=new RegExp(l.pattern);if(m.test(u))d.verified=!0,d.detail="Pattern found in source";else{let p=Oe(K.default.join(t,l.to||""));p&&m.test(p)?(d.verified=!0,d.detail="Pattern found in target"):d.detail=`Pattern "${l.pattern}" not found in source or target`}}catch{d.detail=`Invalid regex pattern: ${l.pattern}`}else u.includes(l.to||"")?(d.verified=!0,d.detail="Target referenced in source"):d.detail="Target not referenced in source";o.push(d)}let a=o.filter(c=>c.verified).length;y({all_verified:a===o.length,verified:a,total:o.length,links:o},n,a===o.length?"valid":"invalid")}function Qo(t,e){let n=K.default.join(T(t),"ROADMAP.md"),r=K.default.join(T(t),"phases"),s=[],i=[];if(!Q.default.existsSync(n)){s.push("ROADMAP.md not found"),y({passed:!1,errors:s,warnings:i},e,"failed");return}let o=ve(Q.default.readFileSync(n,"utf-8"),t),a=new Set,c=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi,l;for(;(l=c.exec(o))!==null;)a.add(l[1]);let d=new Set;try{Q.default.readdirSync(r,{withFileTypes:!0}).filter(p=>p.isDirectory()).map(p=>p.name).forEach(p=>{let f=p.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);f&&d.add(f[1])})}catch{}for(let p of a)!d.has(p)&&!d.has(de(p))&&i.push(`Phase ${p} in ROADMAP.md but no directory on disk`);for(let p of d){let f=String(parseInt(p,10));!a.has(p)&&!a.has(f)&&i.push(`Phase ${p} exists on disk but not in ROADMAP.md`)}if(X(t).phase_naming!=="custom"){let p=[...d].filter(f=>!f.includes(".")).map(f=>parseInt(f,10)).sort((f,g)=>f-g);for(let f=1;f<p.length;f++)p[f]!==p[f-1]+1&&i.push(`Gap in phase numbering: ${p[f-1]} \u2192 ${p[f]}`)}let m=s.length===0;y({passed:m,errors:s,warnings:i,warning_count:i.length},e,m?"passed":"failed")}function ea(t,e,n){let r=K.default.resolve(t);if(r===Mr.default.homedir()){y({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: ${r}`}],repairable_count:0},n);return}let s=T(t),i=Z(t),o=K.default.join(i,"PROJECT.md"),a=K.default.join(s,"ROADMAP.md"),c=K.default.join(s,"STATE.md"),l=K.default.join(i,"config.json"),d=K.default.join(s,"phases"),u=[],m=[],p=[],f=[],g=(S,_,P,k,C=!1,L)=>{let $={code:_,message:P,fix:k,repairable:C,...L};S==="error"?u.push($):S==="warning"?m.push($):p.push($)};if(!Q.default.existsSync(s)){g("error","E001",".planning/ directory not found","Run /gsd-new-project to initialize"),y({status:"broken",errors:u,warnings:m,info:p,repairable_count:0},n);return}if(!Q.default.existsSync(o))g("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let S=Q.default.readFileSync(o,"utf-8");for(let _ of["## What This Is","## Core Value","## Requirements"])S.includes(_)||g("warning","W001",`PROJECT.md missing section: ${_}`,"Add section manually")}if(Q.default.existsSync(a)||g("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!Q.default.existsSync(c))g("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),f.push("regenerateState");else try{let S=Q.default.readFileSync(c,"utf-8"),_=ie(S),P=Er.safeParse(_);if(!P.success){for(let k of P.error.issues){let C=k.path.join(".")||"(root)";g("warning","W011",`STATE.md frontmatter: field "${C}" \u2014 ${k.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}f.includes("regenerateState")||f.push("regenerateState")}}catch{}if(!Q.default.existsSync(l))g("warning","W003","config.json not found","Run /gsd-health --repair to create with defaults",!0),f.push("createConfig");else try{let S=JSON.parse(Q.default.readFileSync(l,"utf-8")),_=Un.safeParse(S);if(!_.success){for(let P of _.error.issues){let k=P.path.join(".")||"(root)",C=Bo(S,P.path);g("warning","W005",`config.json: field "${k}" - ${P.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:k,expected:P.message,actual:C})}f.includes("fixSchemaDefaults")||f.push("fixSchemaDefaults")}}catch(S){g("error","E005",`config.json: JSON parse error - ${S.message}`,"Run pi-gsd-tools validate health --repair to reset to defaults",!0),f.push("resetConfig")}try{let S=_t();S.agents_installed||g("warning","W010",S.installed_agents.length===0?`No GSD agents found in ${S.agents_dir}`:`Missing ${S.missing_agents.length} GSD agents: ${S.missing_agents.join(", ")}`,"Run the GSD installer: pi install npm:pi-gsd")}catch{}let h=[];if(e.repair&&f.length>0)for(let S of f)try{if(S==="createConfig"||S==="resetConfig"){let _=Un.parse({});Q.default.writeFileSync(l,JSON.stringify(_,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="fixSchemaDefaults"&&Q.default.existsSync(l)){let _=JSON.parse(Q.default.readFileSync(l,"utf-8")),P=Un.parse(_);Q.default.writeFileSync(l,JSON.stringify(P,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="regenerateState"){if(Q.default.existsSync(c)){let P=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),k=`${c}.bak-${P}`;Q.default.copyFileSync(c,k),h.push({action:"backupState",success:!0,path:k})}let _=re(t);oe(c,`# Session State
173
225
 
174
- `))}catch(r){h({available:!1,error:r.message},s,"")}}function Ms(n,e,s){let i=R(n).phases,t=R(n).roadmap,r=ie(n),o=[],a=0,l=0;try{let u=W.default.readdirSync(i,{withFileTypes:!0}).filter(d=>d.isDirectory()).map(d=>d.name).sort((d,f)=>ke(d,f));for(let d of u){let f=d.match(/^(\d+(?:\.\d+)*)-?(.*)/),m=f?f[1]:d,p=f&&f[2]?f[2].replace(/-/g," "):"",y=W.default.readdirSync(G.default.join(i,d)),g=y.filter(v=>v.endsWith("-PLAN.md")||v==="PLAN.md").length,_=y.filter(v=>v.endsWith("-SUMMARY.md")||v==="SUMMARY.md").length;a+=g,l+=_;let x;g===0?x="Pending":_>=g?x="Complete":_>0?x="In Progress":x="Planned",o.push({number:m,name:p,plans:g,summaries:_,status:x})}}catch{}let c=a>0?Math.min(100,Math.round(l/a*100)):0;if(e==="table"){let d=Math.round(c/100*10),f="\u2588".repeat(d)+"\u2591".repeat(10-d),m=`# ${r.version} ${r.name}
226
+ ## Project Reference
227
+
228
+ See: .planning/PROJECT.md
229
+
230
+ ## Position
231
+
232
+ **Milestone:** ${_.version} ${_.name}
233
+ **Current phase:** (determining...)
234
+ **Status:** Resuming
235
+
236
+ ## Session Log
237
+
238
+ - ${new Date().toISOString().split("T")[0]}: STATE.md regenerated by /gsd-health --repair
239
+ `,t),h.push({action:S,success:!0,path:"STATE.md"})}}catch(_){h.push({action:S,success:!1,error:_.message})}let x=u.length>0?"broken":m.length>0?"degraded":"healthy";y({status:x,errors:u,warnings:m,info:p,repairable_count:u.filter(S=>S.repairable).length+m.filter(S=>S.repairable).length,repairs_performed:h.length>0?h:void 0},n)}function ta(t,e){let n=_t();y({agents_dir:n.agents_dir,agents_found:n.agents_installed,installed:n.installed_agents,missing:n.missing_agents,expected:Object.keys(Re)},e)}var Q,Mr,K,Rt=N(()=>{"use strict";Q=W(require("fs")),Mr=W(require("os")),K=W(require("path"));ge();Ue();Fr();Fe()});var zs={};he(zs,{buildCheckpoint:()=>Tr,cmdAuditUat:()=>na,cmdRenderCheckpoint:()=>sa,parseCurrentTest:()=>Ir});function na(t,e){let n=Ge.default.join(T(t),"phases");rt.default.existsSync(n)||b("No phases directory found in planning directory");let r=Ce(t),s=[],i=rt.default.readdirSync(n,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).filter(r).sort();for(let a of i){let c=a.match(/^(\d+[A-Z]?(?:\.\d+)*)/i),l=c?c[1]:a,d=Ge.default.join(n,a),u=rt.default.readdirSync(d);for(let m of u.filter(p=>p.includes("-UAT")&&p.endsWith(".md"))){let p=rt.default.readFileSync(Ge.default.join(d,m),"utf-8"),f=ra(p);f.length>0&&s.push({phase:l,phase_dir:a,file:m,file_path:B(Ge.default.relative(t,Ge.default.join(d,m))),type:"uat",status:ie(p).status||"unknown",items:f})}for(let m of u.filter(p=>p.includes("-VERIFICATION")&&p.endsWith(".md"))){let p=rt.default.readFileSync(Ge.default.join(d,m),"utf-8"),f=ie(p).status||"unknown";if(f==="human_needed"||f==="gaps_found"){let g=ia(p,f);g.length>0&&s.push({phase:l,phase_dir:a,file:m,file_path:B(Ge.default.relative(t,Ge.default.join(d,m))),type:"verification",status:f,items:g})}}}let o={total_files:s.length,total_items:s.reduce((a,c)=>a+c.items.length,0),by_category:{},by_phase:{}};for(let a of s){o.by_phase[a.phase]||(o.by_phase[a.phase]=0);for(let c of a.items)o.by_phase[a.phase]++,o.by_category[c.category]=(o.by_category[c.category]||0)+1}y({results:s,summary:o},e)}function sa(t,e,n){let r=e.file;r||b("UAT file required: use uat render-checkpoint --file <path>");let s=yr(r,t,"UAT file",{allowAbsolute:!0});rt.default.existsSync(s)||b(`UAT file not found: ${r}`);let i=rt.default.readFileSync(s,"utf-8"),o=Ir(i);o.complete&&b("UAT session is already complete; no pending checkpoint to render");let a=Tr(o);y({file_path:B(Ge.default.relative(t,s)),test_number:o.number,test_name:o.name,checkpoint:a},n,a)}function Ir(t){let e=t.match(/##\s*Current Test\s*(?:\n<!--[\s\S]*?-->)?\n([\s\S]*?)(?=\n##\s|$)/i);e||b("UAT file is missing a Current Test section");let n=e[1].trimEnd();if(n.trim()||b("Current Test section is empty"),/\[testing complete\]/i.test(n))return{complete:!0};let r=n.match(/^number:\s*(\d+)\s*$/m),s=n.match(/^name:\s*(.+)\s*$/m),i=n.match(/^expected:\s*\|\n([\s\S]*?)(?=^\w[\w-]*:\s)/m)||n.match(/^expected:\s*\|\n([\s\S]+)/m),o=n.match(/^expected:\s*(.+)\s*$/m);(!r||!s||!i&&!o)&&b("Current Test section is malformed");let a;return i?a=i[1].split(`
240
+ `).map(c=>c.replace(/^ {2}/,"")).join(`
241
+ `).trim():a=o[1].trim(),{complete:!1,number:parseInt(r[1],10),name:Os(s[1].trim()),expected:Os(a)}}function Tr(t){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 ${t.number}: ${t.name}**`,"",t.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(`
242
+ `)}function ra(t){let e=[],n=/###\s*(\d+)\.\s*([^\n]+)\nexpected:\s*([^\n]+)\nresult:\s*(\w+)(?:\n(?:reported|reason|blocked_by):\s*[^\n]*)?/g,r;for(;(r=n.exec(t))!==null;){let[,s,i,o,a]=r;if(a==="pending"||a==="skipped"||a==="blocked"){let c=t.slice(r.index),l=c.indexOf(`
243
+ ###`,1),d=l>0?c.slice(0,l):c,u=d.match(/reason:\s*(.+)/),m=d.match(/blocked_by:\s*(.+)/),p={test:parseInt(s,10),name:i.trim(),expected:o.trim(),result:a,category:oa(a,u?.[1],m?.[1])};u&&(p.reason=u[1].trim()),m&&(p.blocked_by=m[1].trim()),e.push(p)}}return e}function ia(t,e){let n=[];if(e==="human_needed"){let r=t.match(/##\s*Human Verification.*?\n([\s\S]*?)(?=\n##\s|\n---\s|$)/i);if(r)for(let s of r[1].split(`
244
+ `)){let i=s.match(/\|\s*(\d+)\s*\|\s*([^|]+)/),o=s.match(/^[-*]\s+(.+)/),a=s.match(/^(\d+)\.\s+(.+)/);i?n.push({test:parseInt(i[1],10),name:i[2].trim(),result:"human_needed",category:"human_uat"}):a?n.push({test:parseInt(a[1],10),name:a[2].trim(),result:"human_needed",category:"human_uat"}):o&&o[1].length>10&&n.push({name:o[1].trim(),result:"human_needed",category:"human_uat"})}}return n}function oa(t,e,n){if(t==="blocked"||n){if(n){if(/server/i.test(n))return"server_blocked";if(/device|physical/i.test(n))return"device_needed";if(/build|release|preview/i.test(n))return"build_needed";if(/third.party|twilio|stripe/i.test(n))return"third_party"}return"blocked"}return t==="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":t==="pending"?"pending":t==="human_needed"?"human_uat":"unknown"}var rt,Ge,Bs=N(()=>{"use strict";rt=W(require("fs")),Ge=W(require("path"));ge();Ue();dn()});var zt,Vn,zn,Bn,Gn,Jn,Dr=N(()=>{"use strict";zt=require("@oclif/core");$e();Vn=class t extends w{static description="Validate planning consistency";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateConsistency(n,r)}},zn=class t extends w{static description="Check .planning/ health";static flags={...w.baseFlags,repair:zt.Flags.boolean({description:"Auto-repair issues",default:!1})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateHealth(n,{repair:e.repair},r)}},Bn=class t extends w{static description="Validate agent configurations";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateAgents(n,r)}},Gn=class t extends w{static description="Run UAT verification";static args={phase:zt.Args.string({required:!1})};static flags={...w.baseFlags,plan:zt.Flags.string({description:"Plan to verify"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateConsistency(r,s)}},Jn=class t extends w{static description="Audit UAT results";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdAuditUat:s}=await Promise.resolve().then(()=>(Bs(),zs));s(n,r)}}});var it={};he(it,{cmdWorkstreamComplete:()=>ua,cmdWorkstreamCreate:()=>ca,cmdWorkstreamGet:()=>pa,cmdWorkstreamList:()=>la,cmdWorkstreamProgress:()=>fa,cmdWorkstreamSet:()=>ma,cmdWorkstreamStatus:()=>da});function aa(t,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let n=Z(t),r=M.default.join(n,"workstreams",e);if(F.default.existsSync(M.default.join(n,"workstreams")))throw new Error("Already in workstream mode - .planning/workstreams/ exists");let s=[{name:"ROADMAP.md",type:"file"},{name:"STATE.md",type:"file"},{name:"REQUIREMENTS.md",type:"file"},{name:"phases",type:"dir"}];F.default.mkdirSync(r,{recursive:!0});let i=[];try{for(let o of s){let a=M.default.join(n,o.name);F.default.existsSync(a)&&(F.default.renameSync(a,M.default.join(r,o.name)),i.push(o.name))}}catch(o){for(let a of i)try{F.default.renameSync(M.default.join(r,a),M.default.join(n,a))}catch{}try{F.default.rmSync(r,{recursive:!0})}catch{}try{F.default.rmdirSync(M.default.join(n,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:i}}function ca(t,e,n,r){e||b("workstream name required. Usage: workstream create <name>");let s=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");s||b("Invalid workstream name - must contain at least one alphanumeric character");let i=Z(t);F.default.existsSync(i)||b(".planning/ directory not found - run /gsd-new-project first");let o=M.default.join(i,"workstreams"),a=M.default.join(o,s);if(F.default.existsSync(a)&&F.default.existsSync(M.default.join(a,"STATE.md"))){y({created:!1,error:"already_exists",workstream:s,path:B(M.default.relative(t,a))},r);return}let c=!F.default.existsSync(o),l=null;if(c&&n.migrate!==!1)if(F.default.existsSync(M.default.join(i,"ROADMAP.md"))||F.default.existsSync(M.default.join(i,"STATE.md"))||F.default.existsSync(M.default.join(i,"phases"))){let g=n.migrateName??null,h;if(g)h=g;else try{let x=re(t);h=qe(x.name)||"default"}catch{h="default"}try{l=aa(t,h)}catch(x){y({created:!1,error:"migration_failed",message:x.message},r);return}}else F.default.mkdirSync(o,{recursive:!0});F.default.mkdirSync(a,{recursive:!0}),F.default.mkdirSync(M.default.join(a,"phases"),{recursive:!0});let d=new Date().toISOString().split("T")[0],u=["---",`workstream: ${s}`,`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(`
245
+ `),m=M.default.join(a,"STATE.md");F.default.existsSync(m)||F.default.writeFileSync(m,u,"utf-8"),ct(t,s);let p=B(M.default.relative(t,a));y({created:!0,workstream:s,path:p,state_path:p+"/STATE.md",phases_path:p+"/phases",migration:l??null,active:!0},r)}function la(t,e){let n=M.default.join(Z(t),"workstreams");if(!F.default.existsSync(n)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let r=[];for(let s of F.default.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory())){let i=M.default.join(n,s.name),o=M.default.join(i,"phases"),a=Le(o),c=0;for(let u of a)try{let m=F.default.readdirSync(M.default.join(o,u)),p=wt(m),f=kt(m);p.length>0&&f.length>=p.length&&c++}catch{}let l="unknown",d=null;try{let u=F.default.readFileSync(M.default.join(i,"STATE.md"),"utf-8");l=J(u,"Status")||"unknown",d=J(u,"Current Phase")}catch{}r.push({name:s.name,path:B(M.default.relative(t,i)),has_roadmap:F.default.existsSync(M.default.join(i,"ROADMAP.md")),has_state:F.default.existsSync(M.default.join(i,"STATE.md")),status:l,current_phase:d,phase_count:a.length,completed_phases:c})}y({mode:"workstream",workstreams:r,count:r.length},e)}function da(t,e,n){e||b("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let r=M.default.join(Z(t),"workstreams",e);if(!F.default.existsSync(r)){y({found:!1,workstream:e},n);return}let s=j(t,e),i={roadmap:F.default.existsSync(s.roadmap),state:F.default.existsSync(s.state),requirements:F.default.existsSync(s.requirements)},o=[];for(let c of Le(s.phases).sort())try{let l=F.default.readdirSync(M.default.join(s.phases,c)),d=wt(l),u=kt(l);o.push({directory:c,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={status:"unknown",current_phase:null,last_activity:null};try{let c=F.default.readFileSync(s.state,"utf-8");a={status:J(c,"Status")||"unknown",current_phase:J(c,"Current Phase"),last_activity:J(c,"Last Activity")}}catch{}y({found:!0,workstream:e,path:B(M.default.relative(t,r)),files:i,phases:o,phase_count:o.length,completed_phases:o.filter(c=>c.status==="complete").length,...a},n)}function ua(t,e,n,r){e||b("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let s=Z(t),i=M.default.join(s,"workstreams"),o=M.default.join(i,e);if(!F.default.existsSync(o)){y({completed:!1,error:"not_found",workstream:e},r);return}let a=He(t);a===e&&ct(t,null);let c=M.default.join(s,"milestones"),l=new Date().toISOString().split("T")[0],d=M.default.join(c,`ws-${e}-${l}`),u=1;for(;F.default.existsSync(d);)d=M.default.join(c,`ws-${e}-${l}-${u++}`);F.default.mkdirSync(d,{recursive:!0});let m=[];try{for(let f of F.default.readdirSync(o,{withFileTypes:!0}))F.default.renameSync(M.default.join(o,f.name),M.default.join(d,f.name)),m.push(f.name)}catch(f){for(let g of m)try{F.default.renameSync(M.default.join(d,g),M.default.join(o,g))}catch{}try{F.default.rmSync(d,{recursive:!0})}catch{}a===e&&ct(t,e),y({completed:!1,error:"archive_failed",message:f.message,workstream:e},r);return}try{F.default.rmdirSync(o)}catch{}let p=0;try{p=F.default.readdirSync(i,{withFileTypes:!0}).filter(f=>f.isDirectory()).length,p===0&&F.default.rmdirSync(i)}catch{}y({completed:!0,workstream:e,archived_to:B(M.default.relative(t,d)),remaining_workstreams:p,reverted_to_flat:p===0},r)}function ma(t,e,n){if(!e){ct(t,null),y({active:null,cleared:!0},n);return}if(!/^[a-zA-Z0-9_-]+$/.test(e)){y({active:null,error:"invalid_name",message:"Workstream name must be alphanumeric, hyphens, and underscores only"},n);return}let r=M.default.join(Z(t),"workstreams",e);if(!F.default.existsSync(r)){y({active:null,error:"not_found",workstream:e},n);return}ct(t,e),y({active:e,set:!0},n,e)}function pa(t,e){let n=He(t),r=M.default.join(Z(t),"workstreams");y({active:n,mode:F.default.existsSync(r)?"workstream":"flat"},e,n||"none")}function fa(t,e){let n=Z(t),r=M.default.join(n,"workstreams");if(!F.default.existsSync(r)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let s=He(t),i=[];for(let o of F.default.readdirSync(r,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=M.default.join(r,o.name),c=M.default.join(a,"phases"),l=Le(c),d=0,u=0,m=0;for(let h of l)try{let x=F.default.readdirSync(M.default.join(c,h)),S=wt(x),_=kt(x);u+=S.length,m+=Math.min(_.length,S.length),S.length>0&&_.length>=S.length&&d++}catch{}let p=l.length;try{let x=F.default.readFileSync(M.default.join(a,"ROADMAP.md"),"utf-8").match(/^###?\s+Phase\s+\d/gm);x&&(p=x.length)}catch{}let f="unknown",g=null;try{let h=F.default.readFileSync(M.default.join(a,"STATE.md"),"utf-8");f=J(h,"Status")||"unknown",g=J(h,"Current Phase")}catch{}i.push({name:o.name,active:o.name===s,status:f,current_phase:g,phases:`${d}/${p}`,plans:`${m}/${u}`,progress_percent:p>0?Math.round(d/p*100):0})}y({mode:"workstream",active:s,workstreams:i,count:i.length},e)}var F,M,ot=N(()=>{"use strict";F=W(require("fs")),M=W(require("path"));ge();Fe()});var at,Yn,Hn,Xn,Zn,Kn,Qn,es,Or=N(()=>{"use strict";at=require("@oclif/core");$e();Yn=class t extends w{static description="Create a new workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags,"no-migrate":at.Flags.boolean({description:"Skip migration",default:!1}),"migrate-name":at.Flags.string({description:"Migration name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamCreate(r,n.name,{migrate:!e["no-migrate"],migrateName:e["migrate-name"]??null},s)}},Hn=class t extends w{static description="List workstreams";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamList(n,r)}},Xn=class t extends w{static description="Show workstream status";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamStatus(r,n.name,s)}},Zn=class t extends w{static description="Complete a workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamComplete(r,n.name,{},s)}},Kn=class t extends w{static description="Set active workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamSet(r,n.name,s)}},Qn=class t extends w{static description="Get active workstream";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamGet(n,r)}},es=class t extends w{static description="Show workstream progress";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamProgress(n,r)}}});var xe={};he(xe,{cmdCommit:()=>va,cmdCommitToSubrepo:()=>_a,cmdCurrentTimestamp:()=>ha,cmdGenerateSlug:()=>ga,cmdHistoryDigest:()=>Sa,cmdListTodos:()=>ya,cmdProgressRender:()=>Pa,cmdResolveModel:()=>ba,cmdScaffold:()=>Aa,cmdStats:()=>ja,cmdSummaryExtract:()=>wa,cmdTodoComplete:()=>Ca,cmdTodoMatchPhase:()=>$a,cmdVerifyPathExists:()=>xa,cmdWebsearch:()=>ka});function ga(t,e){t||b("text required for slug generation");let n=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");y({slug:n},e,n)}function ha(t,e){let n=new Date,r;t==="date"?r=n.toISOString().split("T")[0]:t==="filename"?r=n.toISOString().replace(/:/g,"-").replace(/\..+/,""):r=n.toISOString(),y({timestamp:r},e,r)}function ya(t,e,n){let r=H.default.join(T(t),"todos","pending"),s=0,i=[];try{let o=V.default.readdirSync(r).filter(a=>a.endsWith(".md"));for(let a of o)try{let c=V.default.readFileSync(H.default.join(r,a),"utf-8"),l=c.match(/^created:\s*(.+)$/m),d=c.match(/^title:\s*(.+)$/m),u=c.match(/^area:\s*(.+)$/m),m=u?u[1].trim():"general";if(e&&m!==e)continue;s++,i.push({file:a,created:l?l[1].trim():"unknown",title:d?d[1].trim():"Untitled",area:m,path:B(H.default.relative(t,H.default.join(r,a)))})}catch{}}catch{}y({count:s,todos:i},n,s.toString())}function xa(t,e,n){e||b("path required for verification"),e.includes("\0")&&b("path contains null bytes");let r=H.default.isAbsolute(e)?e:H.default.join(t,e);try{let s=V.default.statSync(r);y({exists:!0,type:s.isDirectory()?"directory":s.isFile()?"file":"other"},n,"true")}catch{y({exists:!1,type:null},n,"false")}}function Sa(t,e){let n=j(t).phases,r={phases:{},decisions:[],tech_stack:new Set},s=[];for(let i of Lt(t))s.push({name:i.name,fullPath:i.fullPath,milestone:i.milestone});if(V.default.existsSync(n))try{for(let i of V.default.readdirSync(n,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())s.push({name:i,fullPath:H.default.join(n,i),milestone:null})}catch{}if(s.length===0){y({phases:{},decisions:[],tech_stack:[]},e);return}try{for(let{name:o,fullPath:a}of s){let c=V.default.readdirSync(a).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of c)try{let d=V.default.readFileSync(H.default.join(a,l),"utf-8"),u=ie(d),m=ue(u.phase)??o.split("-")[0];r.phases[m]||(r.phases[m]={name:ue(u.name)??o.split("-").slice(1).join(" ")??"Unknown",provides:new Set,affects:new Set,patterns:new Set});let p=Pt(u["dependency-graph"]);p?.provides?_e(p.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))):u.provides&&_e(u.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))),p?.affects&&_e(p.affects)?.forEach(g=>r.phases[m].affects.add(ue(g)??String(g))),u["patterns-established"]&&_e(u["patterns-established"])?.forEach(g=>r.phases[m].patterns.add(ue(g)??String(g))),u["key-decisions"]&&_e(u["key-decisions"])?.forEach(g=>r.decisions.push({phase:m,decision:ue(g)??String(g)}));let f=Pt(u["tech-stack"]);f?.added&&_e(f.added)?.forEach(g=>{let h=ue(g);if(h)r.tech_stack.add(h);else{let x=Pt(g);x&&r.tech_stack.add(ue(x.name)??"")}})}catch{}}let i={phases:Object.fromEntries(Object.entries(r.phases).map(([o,a])=>[o,{name:a.name,provides:[...a.provides],affects:[...a.affects],patterns:[...a.patterns]}])),decisions:r.decisions,tech_stack:[...r.tech_stack]};y(i,e)}catch(i){b("Failed to generate history digest: "+i.message)}}function ba(t,e,n){e||b("agent-type required");let r=X(t),s=se(t,e),i=Re[e];y(i?{model:s,profile:r.model_profile}:{model:s,profile:r.model_profile,unknown_agent:!0},n,s)}function va(t,e,n,r,s=!1,i=!1){!e&&!s&&b("commit message required");let o=e;o&&(o=hr(o));let a=X(t);if(!a.commit_docs){y({committed:!1,hash:null,reason:"skipped_commit_docs_false"},r,"skipped");return}if(rn(t,".planning")){y({committed:!1,hash:null,reason:"skipped_gitignored"},r,"skipped");return}if(a.branching_strategy&&a.branching_strategy!=="none"){let p=null;if(a.branching_strategy==="phase"){let f=(n||[]).join(" ").match(/(\d+)-/);if(f){let g=fe(t,f[1]);g&&(p=a.phase_branch_template.replace("{phase}",g.phase_number).replace("{slug}",g.phase_slug||"phase"))}}else if(a.branching_strategy==="milestone"){let f=re(t);f?.version&&(p=a.milestone_branch_template.replace("{milestone}",f.version).replace("{slug}",qe(f.name)||"milestone"))}if(p){let f=ae(t,["rev-parse","--abbrev-ref","HEAD"]);f.exitCode===0&&f.stdout.trim()!==p&&ae(t,["checkout","-b",p]).exitCode!==0&&ae(t,["checkout",p])}}let c=n&&n.length>0?n:[".planning/"];for(let p of c){let f=H.default.join(t,p);V.default.existsSync(f)?ae(t,["add",p]):ae(t,["rm","--cached","--ignore-unmatch",p])}let l=s?["commit","--amend","--no-edit"]:["commit","-m",o];i&&l.push("--no-verify");let d=ae(t,l);if(d.exitCode!==0){if(d.stdout.includes("nothing to commit")||d.stderr.includes("nothing to commit")){y({committed:!1,hash:null,reason:"nothing_to_commit"},r,"nothing");return}y({committed:!1,hash:null,reason:"nothing_to_commit",error:d.stderr},r,"nothing");return}let u=ae(t,["rev-parse","--short","HEAD"]),m=u.exitCode===0?u.stdout:null;y({committed:!0,hash:m,reason:"committed"},r,m||"committed")}function _a(t,e,n,r){e||b("commit message required");let i=X(t).sub_repos;(!i||i.length===0)&&b("no sub_repos configured in .planning/config.json"),(!n||n.length===0)&&b("--files required for commit-to-subrepo");let o={},a=[];for(let l of n){let d=i.find(u=>l.startsWith(u+"/"));d?(o[d]||(o[d]=[]),o[d].push(l)):a.push(l)}a.length>0&&process.stderr.write(`Warning: ${a.length} file(s) did not match any sub-repo prefix: ${a.join(", ")}
246
+ `);let c={};for(let[l,d]of Object.entries(o)){let u=H.default.join(t,l);for(let f of d)ae(u,["add",f.slice(l.length+1)]);let m=ae(u,["commit","-m",e]);if(m.exitCode!==0){c[l]={committed:!1,hash:null,files:d,reason:m.stdout.includes("nothing to commit")?"nothing_to_commit":"error",error:m.stderr};continue}let p=ae(u,["rev-parse","--short","HEAD"]);c[l]={committed:!0,hash:p.exitCode===0?p.stdout:null,files:d}}y({committed:Object.values(c).some(l=>l.committed),repos:c,unmatched:a.length>0?a:void 0},r,Object.entries(c).map(([l,d])=>`${l}:${d.hash||"skip"}`).join(" "))}function wa(t,e,n,r){e||b("summary-path required for summary-extract");let s=H.default.join(t,e);if(!V.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=V.default.readFileSync(s,"utf-8"),o=ie(i),a=l=>(l||[]).map(d=>{let u=ue(d)??String(d),m=u.indexOf(":");return m>0?{summary:u.substring(0,m).trim(),rationale:u.substring(m+1).trim()}:{summary:u,rationale:null}}),c={path:e,one_liner:ue(o["one-liner"])??Ut(i)??null,key_files:_e(o["key-files"])??[],tech_added:_e(Pt(o["tech-stack"])?.added)??[],patterns:_e(o["patterns-established"])??[],decisions:a(_e(o["key-decisions"])),requirements_completed:_e(o["requirements-completed"])??[]};if(n&&n.length>0){let l={path:e};for(let d of n)c[d]!==void 0&&(l[d]=c[d]);y(l,r);return}y(c,r)}async function ka(t,e,n){let r=process.env.BRAVE_API_KEY;if(!r){y({available:!1,reason:"BRAVE_API_KEY not set"},n,"");return}if(!t){y({available:!1,error:"Query required"},n,"");return}let s=new URLSearchParams({q:t,count:String(e.limit||10),country:"us",search_lang:"en",text_decorations:"false"});e.freshness&&s.set("freshness",e.freshness);try{let i=await fetch(`https://api.search.brave.com/res/v1/web/search?${s}`,{headers:{Accept:"application/json","X-Subscription-Token":r}});if(!i.ok){y({available:!1,error:`API error: ${i.status}`},n,"");return}let a=((await i.json()).web?.results||[]).map(c=>({title:c.title,url:c.url,description:c.description,age:c.age||null}));y({available:!0,query:t,count:a.length,results:a},n,a.map(c=>`${c.title}
247
+ ${c.url}
248
+ ${c.description}`).join(`
175
249
 
176
- **Progress:** [${f}] ${l}/${a} plans (${c}%)
250
+ `))}catch(i){y({available:!1,error:i.message},n,"")}}function Pa(t,e,n){let r=j(t).phases,s=j(t).roadmap,i=re(t),o=[],a=0,c=0;try{let d=V.default.readdirSync(r,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).sort((u,m)=>Pe(u,m));for(let u of d){let m=u.match(/^(\d+(?:\.\d+)*)-?(.*)/),p=m?m[1]:u,f=m&&m[2]?m[2].replace(/-/g," "):"",g=V.default.readdirSync(H.default.join(r,u)),h=g.filter(_=>_.endsWith("-PLAN.md")||_==="PLAN.md").length,x=g.filter(_=>_.endsWith("-SUMMARY.md")||_==="SUMMARY.md").length;a+=h,c+=x;let S;h===0?S="Pending":x>=h?S="Complete":x>0?S="In Progress":S="Planned",o.push({number:p,name:f,plans:h,summaries:x,status:S})}}catch{}let l=a>0?Math.min(100,Math.round(c/a*100)):0;if(e==="table"){let u=Math.round(l/100*10),m="\u2588".repeat(u)+"\u2591".repeat(10-u),p=`# ${i.version} ${i.name}
251
+
252
+ **Progress:** [${m}] ${c}/${a} plans (${l}%)
177
253
 
178
254
  | Phase | Name | Plans | Status |
179
255
  |-------|------|-------|--------|
180
- `;for(let p of o)m+=`| ${p.number} | ${p.name} | ${p.summaries}/${p.plans} | ${p.status} |
181
- `;h({rendered:m},s,m)}else if(e==="bar"){let d=Math.round(c/100*20),m=`[${"\u2588".repeat(d)+"\u2591".repeat(20-d)}] ${l}/${a} plans (${c}%)`;h({bar:m,percent:c,completed:l,total:a},s,m)}else h({milestone_version:r.version,milestone_name:r.name,phases:o,total_plans:a,total_summaries:l,percent:c},s)}function Fs(n,e,s){e||S("filename required for todo complete");let i=G.default.join(C(n),"todos","pending"),t=G.default.join(C(n),"todos","completed"),r=G.default.join(i,e);W.default.existsSync(r)||S(`Todo not found: ${e}`),W.default.mkdirSync(t,{recursive:!0});let o=W.default.readFileSync(r,"utf-8"),a=new Date().toISOString().split("T")[0];o=`completed: ${a}
182
- `+o,W.default.writeFileSync(G.default.join(t,e),o,"utf-8"),W.default.unlinkSync(r),h({completed:!0,file:e,date:a},s,"completed")}function Is(n,e,s){e||S("phase required for todo match-phase");let i=G.default.join(C(n),"todos","pending"),t=[];try{for(let f of W.default.readdirSync(i).filter(m=>m.endsWith(".md")))try{let m=W.default.readFileSync(G.default.join(i,f),"utf-8"),p=m.match(/^title:\s*(.+)$/m),y=m.match(/^area:\s*(.+)$/m),g=m.match(/^files:\s*(.+)$/m),_=m.replace(/^(title|area|files|created|priority):.*$/gm,"").trim();t.push({file:f,title:p?p[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){h({phase:e,matches:[],todo_count:0},s);return}let r=Qe(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(f=>f.replace(/[^a-z0-9]/g,"")).filter(f=>f.length>2&&!a.has(f))),c=de(n,e),u=[];if(c?.found)try{let f=G.default.join(n,c.directory);for(let m of W.default.readdirSync(f).filter(p=>p.endsWith("-PLAN.md")))try{let y=W.default.readFileSync(G.default.join(f,m),"utf-8").match(/files_modified:\s*\[([^\]]*)\]/);y&&u.push(...y[1].split(",").map(g=>g.trim().replace(/['"]/g,"")).filter(Boolean))}catch{}}catch{}let d=[];for(let f of t){let m=0,p=[],g=`${f.title} ${f.body}`.toLowerCase().split(/[\s\-_/.,;:()[\]{}|]+/).map(_=>_.replace(/[^a-z0-9]/g,"")).filter(_=>_.length>2&&!a.has(_)).filter(_=>l.has(_));if(g.length>0&&(m+=Math.min(g.length*.2,.6),p.push(`keywords: ${[...new Set(g)].slice(0,5).join(", ")}`)),f.area!=="general"&&o.includes(f.area.toLowerCase())&&(m+=.3,p.push(`area: ${f.area}`)),f.files.length>0&&u.length>0){let _=f.files.filter(x=>u.some(v=>v.includes(x)||x.includes(v)));_.length>0&&(m+=.4,p.push(`files: ${_.slice(0,3).join(", ")}`))}m>0&&d.push({file:f.file,title:f.title,area:f.area,score:Math.round(m*100)/100,reasons:p})}d.sort((f,m)=>m.score-f.score),h({phase:e,matches:d,todo_count:t.length},s)}function Cs(n,e,s,i){let{phase:t,name:r}=s,o=t?ce(t):"00",a=new Date().toISOString().split("T")[0],l=t?de(n,t):null,c=l?G.default.join(n,l.directory):null;t&&!c&&e!=="phase-dir"&&S(`Phase ${t} directory not found`);let u,d;switch(e){case"context":u=G.default.join(c,`${o}-CONTEXT.md`),d=`---
256
+ `;for(let f of o)p+=`| ${f.number} | ${f.name} | ${f.summaries}/${f.plans} | ${f.status} |
257
+ `;y({rendered:p},n,p)}else if(e==="bar"){let u=Math.round(l/100*20),p=`[${"\u2588".repeat(u)+"\u2591".repeat(20-u)}] ${c}/${a} plans (${l}%)`;y({bar:p,percent:l,completed:c,total:a},n,p)}else y({milestone_version:i.version,milestone_name:i.name,phases:o,total_plans:a,total_summaries:c,percent:l},n)}function Ca(t,e,n){e||b("filename required for todo complete");let r=H.default.join(T(t),"todos","pending"),s=H.default.join(T(t),"todos","completed"),i=H.default.join(r,e);V.default.existsSync(i)||b(`Todo not found: ${e}`),V.default.mkdirSync(s,{recursive:!0});let o=V.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0];o=`completed: ${a}
258
+ `+o,V.default.writeFileSync(H.default.join(s,e),o,"utf-8"),V.default.unlinkSync(i),y({completed:!0,file:e,date:a},n,"completed")}function $a(t,e,n){e||b("phase required for todo match-phase");let r=H.default.join(T(t),"todos","pending"),s=[];try{for(let m of V.default.readdirSync(r).filter(p=>p.endsWith(".md")))try{let p=V.default.readFileSync(H.default.join(r,m),"utf-8"),f=p.match(/^title:\s*(.+)$/m),g=p.match(/^area:\s*(.+)$/m),h=p.match(/^files:\s*(.+)$/m),x=p.replace(/^(title|area|files|created|priority):.*$/gm,"").trim();s.push({file:m,title:f?f[1].trim():"Untitled",area:g?g[1].trim():"general",files:h?h[1].trim().split(/[,\s]+/).filter(Boolean):[],body:x.slice(0,200)})}catch{}}catch{}if(s.length===0){y({phase:e,matches:[],todo_count:0},n);return}let i=dt(t,e),o=`${i?.phase_name??""} ${i?.goal??""} ${i?.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"]),c=new Set(o.split(/[\s\-_/.,;:()[\]{}|]+/).map(m=>m.replace(/[^a-z0-9]/g,"")).filter(m=>m.length>2&&!a.has(m))),l=fe(t,e),d=[];if(l?.found)try{let m=H.default.join(t,l.directory);for(let p of V.default.readdirSync(m).filter(f=>f.endsWith("-PLAN.md")))try{let g=V.default.readFileSync(H.default.join(m,p),"utf-8").match(/files_modified:\s*\[([^\]]*)\]/);g&&d.push(...g[1].split(",").map(h=>h.trim().replace(/['"]/g,"")).filter(Boolean))}catch{}}catch{}let u=[];for(let m of s){let p=0,f=[],h=`${m.title} ${m.body}`.toLowerCase().split(/[\s\-_/.,;:()[\]{}|]+/).map(x=>x.replace(/[^a-z0-9]/g,"")).filter(x=>x.length>2&&!a.has(x)).filter(x=>c.has(x));if(h.length>0&&(p+=Math.min(h.length*.2,.6),f.push(`keywords: ${[...new Set(h)].slice(0,5).join(", ")}`)),m.area!=="general"&&o.includes(m.area.toLowerCase())&&(p+=.3,f.push(`area: ${m.area}`)),m.files.length>0&&d.length>0){let x=m.files.filter(S=>d.some(_=>_.includes(S)||S.includes(_)));x.length>0&&(p+=.4,f.push(`files: ${x.slice(0,3).join(", ")}`))}p>0&&u.push({file:m.file,title:m.title,area:m.area,score:Math.round(p*100)/100,reasons:f})}u.sort((m,p)=>p.score-m.score),y({phase:e,matches:u,todo_count:s.length},n)}function Aa(t,e,n,r){let{phase:s,name:i}=n,o=s?de(s):"00",a=new Date().toISOString().split("T")[0],c=s?fe(t,s):null,l=c?H.default.join(t,c.directory):null;s&&!l&&e!=="phase-dir"&&b(`Phase ${s} directory not found`);let d,u;switch(e){case"context":d=H.default.join(l,`${o}-CONTEXT.md`),u=`---
183
259
  phase: "${o}"
184
- name: "${r||l?.phase_name||"Unnamed"}"
260
+ name: "${i||c?.phase_name||"Unnamed"}"
185
261
  created: ${a}
186
262
  ---
187
263
 
188
- # Phase ${t}: ${r||l?.phase_name||"Unnamed"} - Context
264
+ # Phase ${s}: ${i||c?.phase_name||"Unnamed"} - Context
189
265
 
190
266
  ## Decisions
191
267
 
192
- _Decisions will be captured during /gsd-discuss-phase ${t}_
268
+ _Decisions will be captured during /gsd-discuss-phase ${s}_
193
269
 
194
270
  ## Discretion Areas
195
271
 
@@ -198,14 +274,14 @@ _Areas where the executor can use judgment_
198
274
  ## Deferred Ideas
199
275
 
200
276
  _Ideas to consider later_
201
- `;break;case"uat":u=G.default.join(c,`${o}-UAT.md`),d=`---
277
+ `;break;case"uat":d=H.default.join(l,`${o}-UAT.md`),u=`---
202
278
  phase: "${o}"
203
- name: "${r||l?.phase_name||"Unnamed"}"
279
+ name: "${i||c?.phase_name||"Unnamed"}"
204
280
  created: ${a}
205
281
  status: pending
206
282
  ---
207
283
 
208
- # Phase ${t}: ${r||l?.phase_name||"Unnamed"} - User Acceptance Testing
284
+ # Phase ${s}: ${i||c?.phase_name||"Unnamed"} - User Acceptance Testing
209
285
 
210
286
  ## Test Results
211
287
 
@@ -215,14 +291,14 @@ status: pending
215
291
  ## Summary
216
292
 
217
293
  _Pending UAT_
218
- `;break;case"verification":u=G.default.join(c,`${o}-VERIFICATION.md`),d=`---
294
+ `;break;case"verification":d=H.default.join(l,`${o}-VERIFICATION.md`),u=`---
219
295
  phase: "${o}"
220
- name: "${r||l?.phase_name||"Unnamed"}"
296
+ name: "${i||c?.phase_name||"Unnamed"}"
221
297
  created: ${a}
222
298
  status: pending
223
299
  ---
224
300
 
225
- # Phase ${t}: ${r||l?.phase_name||"Unnamed"} - Verification
301
+ # Phase ${s}: ${i||c?.phase_name||"Unnamed"} - Verification
226
302
 
227
303
  ## Goal-Backward Verification
228
304
 
@@ -236,135 +312,63 @@ status: pending
236
312
  ## Result
237
313
 
238
314
  _Pending verification_
239
- `;break;case"phase-dir":{(!t||!r)&&S("phase and name required for phase-dir scaffold");let m=De(r),p=`${o}-${m}`,y=R(n).phases;W.default.mkdirSync(y,{recursive:!0});let g=G.default.join(y,p);W.default.mkdirSync(g,{recursive:!0}),h({created:!0,directory:V(G.default.relative(n,g)),path:g},i,g);return}default:S(`Unknown scaffold type: ${e}. Available: context, uat, verification, phase-dir`);return}if(W.default.existsSync(u)){h({created:!1,reason:"already_exists",path:u},i,"exists");return}W.default.writeFileSync(u,d,"utf-8");let f=V(G.default.relative(n,u));h({created:!0,path:f},i,f)}function Ts(n,e,s){let i=R(n).phases,t=R(n).roadmap,r=R(n).requirements,o=R(n).state,a=ie(n),l=Pe(n),c=new Map,u=0,d=0;try{let A=be(W.default.readFileSync(t,"utf-8"),n),O=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,N;for(;(N=O.exec(A))!==null;)c.set(N[1],{number:N[1],name:N[2].replace(/\(INSERTED\)/i,"").trim(),plans:0,summaries:0,status:"Not Started"})}catch{}try{let A=W.default.readdirSync(i,{withFileTypes:!0}).filter(O=>O.isDirectory()).map(O=>O.name).filter(l).sort((O,N)=>ke(O,N));for(let O of A){let N=O.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),U=N?N[1]:O,ne=N&&N[2]?N[2].replace(/-/g," "):"",ue=W.default.readdirSync(G.default.join(i,O)),ve=ue.filter(We=>We.endsWith("-PLAN.md")||We==="PLAN.md").length,se=ue.filter(We=>We.endsWith("-SUMMARY.md")||We==="SUMMARY.md").length;u+=ve,d+=se;let me;ve===0?me="Not Started":se>=ve?me="Complete":se>0?me="In Progress":me="Planned";let Te=c.get(U);c.set(U,{number:U,name:Te?.name||ne,plans:ve,summaries:se,status:me})}}catch{}let f=[...c.values()].sort((A,O)=>ke(A.number,O.number)),m=f.filter(A=>A.status==="Complete").length,p=u>0?Math.min(100,Math.round(d/u*100)):0,y=f.length>0?Math.min(100,Math.round(m/f.length*100)):0,g=0,_=0;try{if(W.default.existsSync(r)){let A=W.default.readFileSync(r,"utf-8");_=(A.match(/^- \[x\] \*\*/gm)||[]).length,g=_+(A.match(/^- \[ \] \*\*/gm)||[]).length}}catch{}let x=null;try{if(W.default.existsSync(o)){let A=W.default.readFileSync(o,"utf-8");x=(A.match(/^last_activity:\s*(.+)$/im)??A.match(/\*\*Last Activity:\*\*\s*(.+)/i)??A.match(/^Last Activity:\s*(.+)$/im))?.[1]?.trim()??null}}catch{}let v=0,$=null,k=oe(n,["rev-list","--count","HEAD"]);k.exitCode===0&&(v=parseInt(k.stdout,10)||0);let P=oe(n,["rev-list","--max-parents=0","HEAD"]);if(P.exitCode===0&&P.stdout){let A=oe(n,["show","-s","--format=%as",P.stdout.split(`
240
- `)[0].trim()]);A.exitCode===0&&($=A.stdout||null)}let T={milestone_version:a.version,milestone_name:a.name,phases:f,phases_completed:m,phases_total:f.length,total_plans:u,total_summaries:d,percent:y,plan_percent:p,requirements_total:g,requirements_complete:_,git_commits:v,git_first_commit_date:$,last_activity:x};if(e==="table"){let O=Math.round(y/100*10),N="\u2588".repeat(O)+"\u2591".repeat(10-O),U=`# ${a.version} ${a.name} - Statistics
315
+ `;break;case"phase-dir":{(!s||!i)&&b("phase and name required for phase-dir scaffold");let p=qe(i),f=`${o}-${p}`,g=j(t).phases;V.default.mkdirSync(g,{recursive:!0});let h=H.default.join(g,f);V.default.mkdirSync(h,{recursive:!0}),y({created:!0,directory:B(H.default.relative(t,h)),path:h},r,h);return}default:b(`Unknown scaffold type: ${e}. Available: context, uat, verification, phase-dir`);return}if(V.default.existsSync(d)){y({created:!1,reason:"already_exists",path:d},r,"exists");return}V.default.writeFileSync(d,u,"utf-8");let m=B(H.default.relative(t,d));y({created:!0,path:m},r,m)}function ja(t,e,n){let r=j(t).phases,s=j(t).roadmap,i=j(t).requirements,o=j(t).state,a=re(t),c=Ce(t),l=new Map,d=0,u=0;try{let $=ve(V.default.readFileSync(s,"utf-8"),t),q=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,O;for(;(O=q.exec($))!==null;)l.set(O[1],{number:O[1],name:O[2].replace(/\(INSERTED\)/i,"").trim(),plans:0,summaries:0,status:"Not Started"})}catch{}try{let $=V.default.readdirSync(r,{withFileTypes:!0}).filter(q=>q.isDirectory()).map(q=>q.name).filter(c).sort((q,O)=>Pe(q,O));for(let q of $){let O=q.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),U=O?O[1]:q,Y=O&&O[2]?O[2].replace(/-/g," "):"",le=V.default.readdirSync(H.default.join(r,q)),be=le.filter(We=>We.endsWith("-PLAN.md")||We==="PLAN.md").length,te=le.filter(We=>We.endsWith("-SUMMARY.md")||We==="SUMMARY.md").length;d+=be,u+=te;let pe;be===0?pe="Not Started":te>=be?pe="Complete":te>0?pe="In Progress":pe="Planned";let De=l.get(U);l.set(U,{number:U,name:De?.name||Y,plans:be,summaries:te,status:pe})}}catch{}let m=[...l.values()].sort(($,q)=>Pe($.number,q.number)),p=m.filter($=>$.status==="Complete").length,f=d>0?Math.min(100,Math.round(u/d*100)):0,g=m.length>0?Math.min(100,Math.round(p/m.length*100)):0,h=0,x=0;try{if(V.default.existsSync(i)){let $=V.default.readFileSync(i,"utf-8");x=($.match(/^- \[x\] \*\*/gm)||[]).length,h=x+($.match(/^- \[ \] \*\*/gm)||[]).length}}catch{}let S=null;try{if(V.default.existsSync(o)){let $=V.default.readFileSync(o,"utf-8");S=($.match(/^last_activity:\s*(.+)$/im)??$.match(/\*\*Last Activity:\*\*\s*(.+)/i)??$.match(/^Last Activity:\s*(.+)$/im))?.[1]?.trim()??null}}catch{}let _=0,P=null,k=ae(t,["rev-list","--count","HEAD"]);k.exitCode===0&&(_=parseInt(k.stdout,10)||0);let C=ae(t,["rev-list","--max-parents=0","HEAD"]);if(C.exitCode===0&&C.stdout){let $=ae(t,["show","-s","--format=%as",C.stdout.split(`
316
+ `)[0].trim()]);$.exitCode===0&&(P=$.stdout||null)}let L={milestone_version:a.version,milestone_name:a.name,phases:m,phases_completed:p,phases_total:m.length,total_plans:d,total_summaries:u,percent:g,plan_percent:f,requirements_total:h,requirements_complete:x,git_commits:_,git_first_commit_date:P,last_activity:S};if(e==="table"){let q=Math.round(g/100*10),O="\u2588".repeat(q)+"\u2591".repeat(10-q),U=`# ${a.version} ${a.name} - Statistics
241
317
 
242
- **Progress:** [${N}] ${m}/${f.length} phases (${y}%)
243
- `;u>0&&(U+=`**Plans:** ${d}/${u} complete (${p}%)
244
- `),U+=`**Phases:** ${m}/${f.length} complete
245
- `,g>0&&(U+=`**Requirements:** ${_}/${g} complete
318
+ **Progress:** [${O}] ${p}/${m.length} phases (${g}%)
319
+ `;d>0&&(U+=`**Plans:** ${u}/${d} complete (${f}%)
320
+ `),U+=`**Phases:** ${p}/${m.length} complete
321
+ `,h>0&&(U+=`**Requirements:** ${x}/${h} complete
246
322
  `),U+=`
247
323
  | Phase | Name | Plans | Completed | Status |
248
324
  |-------|------|-------|-----------|--------|
249
- `;for(let ne of f)U+=`| ${ne.number} | ${ne.name} | ${ne.plans} | ${ne.summaries} | ${ne.status} |
250
- `;v>0&&(U+=`
251
- **Git:** ${v} commits`,$&&(U+=` (since ${$})`),U+=`
252
- `),x&&(U+=`**Last activity:** ${x}
253
- `),h({rendered:U},s,U)}else h(T,s)}var W,G,ye=le(()=>{"use strict";W=q(require("fs")),G=q(require("path"));pe();Le();rt();ct()});var ut={};fe(ut,{cmdFindPhase:()=>Ns,cmdPhaseAdd:()=>Ws,cmdPhaseComplete:()=>Gs,cmdPhaseInsert:()=>Us,cmdPhaseNextDecimal:()=>Os,cmdPhasePlanIndex:()=>qs,cmdPhaseRemove:()=>Bs,cmdPhasesList:()=>Ds});function Ds(n,e,s){let i=I.default.join(C(n),"phases"),{type:t,phase:r,includeArchived:o}=e;if(!j.default.existsSync(i)){h(t?{files:[],count:0}:{directories:[],count:0},s,"");return}try{let a=j.default.readdirSync(i,{withFileTypes:!0}).filter(l=>l.isDirectory()).map(l=>l.name);if(o){let l=gt(n);for(let c of l)a.push(`${c.name} [${c.milestone}]`)}if(a.sort((l,c)=>ke(l,c)),r){let l=ce(r),c=a.find(u=>u.startsWith(l));if(!c){h({files:[],count:0,phase_dir:null,error:"Phase not found"},s,"");return}a=[c]}if(t){let l=[];for(let c of a){let u=I.default.join(i,c),d=j.default.readdirSync(u),f;t==="plans"?f=d.filter(m=>m.endsWith("-PLAN.md")||m==="PLAN.md"):t==="summaries"?f=d.filter(m=>m.endsWith("-SUMMARY.md")||m==="SUMMARY.md"):f=d,l.push(...f.sort())}h({files:l,count:l.length,phase_dir:r?a[0]?.replace(/^\d+(?:\.\d+)*-?/,""):null},s,l.join(`
254
- `));return}h({directories:a,count:a.length},s,a.join(`
255
- `))}catch(a){S("Failed to list phases: "+a.message)}}function Os(n,e,s){let i=I.default.join(C(n),"phases"),t=ce(e??"");if(!j.default.existsSync(i)){h({found:!1,base_phase:t,next:`${t}.1`,existing:[]},s,`${t}.1`);return}try{let r=j.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name),o=r.some(u=>u.startsWith(t+"-")||u===t),a=new RegExp(`^${t}\\.(\\d+)`),l=r.map(u=>{let d=u.match(a);return d?`${t}.${d[1]}`:null}).filter(Boolean);l.sort((u,d)=>ke(u,d));let c=l.length===0?`${t}.1`:`${t}.${parseInt(l[l.length-1].split(".")[1],10)+1}`;h({found:o,base_phase:t,next:c,existing:l},s,c)}catch(r){S("Failed to calculate next decimal phase: "+r.message)}}function Ns(n,e,s){e||S("phase identifier required");let i=I.default.join(C(n),"phases"),t=ce(e),r={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=j.default.readdirSync(i,{withFileTypes:!0}).filter(y=>y.isDirectory()).map(y=>y.name).sort((y,g)=>ke(y,g)).find(y=>y.startsWith(t));if(!a){h(r,s,"");return}let l=a.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),c=l?l[1]:t,u=l&&l[2]?l[2]:null,d=I.default.join(i,a),f=j.default.readdirSync(d),m=f.filter(y=>y.endsWith("-PLAN.md")||y==="PLAN.md").sort(),p=f.filter(y=>y.endsWith("-SUMMARY.md")||y==="SUMMARY.md").sort();h({found:!0,directory:V(I.default.join(I.default.relative(n,C(n)),"phases",a)),phase_number:c,phase_name:u,plans:m,summaries:p},s,V(I.default.join(I.default.relative(n,C(n)),"phases",a)))}catch{h(r,s,"")}}function qs(n,e,s){e||S("phase required for phase-plan-index");let i=I.default.join(C(n),"phases"),t=ce(e),r=null;try{let y=j.default.readdirSync(i,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,_)=>ke(g,_)).find(g=>g.startsWith(t));y&&(r=I.default.join(i,y))}catch{}if(!r){h({phase:t,error:"Phase not found",plans:[],waves:{},incomplete:[],has_checkpoints:!1},s);return}let o=j.default.readdirSync(r),a=o.filter(p=>p.endsWith("-PLAN.md")||p==="PLAN.md").sort(),l=o.filter(p=>p.endsWith("-SUMMARY.md")||p==="SUMMARY.md"),c=new Set(l.map(p=>p.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),u=[],d={},f=[],m=!1;for(let p of a){let y=p.replace("-PLAN.md","").replace("PLAN.md",""),g=j.default.readFileSync(I.default.join(r,p),"utf-8"),_=ee(g),x=g.match(/<task[\s>]/gi)||[],v=g.match(/##\s*Task\s*\d+/gi)||[],$=x.length||v.length,k=parseInt(String(_.wave),10)||1,P=!0;_.autonomous!==void 0&&(P=_.autonomous==="true"||_.autonomous===!0),P||(m=!0);let T=[],A=_.files_modified||_["files-modified"];A&&(T=Array.isArray(A)?A:[A]);let O=c.has(y);O||f.push(y),u.push({id:y,wave:k,autonomous:P,objective:g.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()||_.objective||null,files_modified:T,task_count:$,has_summary:O});let N=String(k);d[N]||(d[N]=[]),d[N].push(y)}h({phase:t,plans:u,waves:d,incomplete:f,has_checkpoints:m},s)}function Ws(n,e,s,i){e||S("description required for phase add");let t=J(n),r=I.default.join(C(n),"ROADMAP.md");j.default.existsSync(r)||S("ROADMAP.md not found");let o=j.default.readFileSync(r,"utf-8"),a=be(o,n),l=De(e),c,u;if(i||t.phase_naming==="custom")c=i||l.toUpperCase().replace(/-/g,"-"),c||S('--id required when phase_naming is "custom"'),u=`${c}-${l}`;else{let g=/#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi,_=0,x;for(;(x=g.exec(a))!==null;){let $=parseInt(x[1],10);$>_&&(_=$)}c=_+1,u=`${String(c).padStart(2,"0")}-${l}`}let d=I.default.join(C(n),"phases",u);j.default.mkdirSync(d,{recursive:!0}),j.default.writeFileSync(I.default.join(d,".gitkeep"),"");let f=t.phase_naming==="custom"?"":`
256
- **Depends on:** Phase ${typeof c=="number"?c-1:"TBD"}`,m=`
257
- ### Phase ${c}: ${e}
258
-
259
- **Goal:** [To be planned]
260
- **Requirements**: TBD${f}
261
- **Plans:** 0 plans
262
-
263
- Plans:
264
- - [ ] TBD (run /gsd-plan-phase ${c} to break down)
265
- `,p=o.lastIndexOf(`
266
- ---`),y=p>0?o.slice(0,p)+m+o.slice(p):o+m;j.default.writeFileSync(r,y,"utf-8"),h({phase_number:typeof c=="number"?c:String(c),padded:typeof c=="number"?String(c).padStart(2,"0"):String(c),name:e,slug:l,directory:V(I.default.join(I.default.relative(n,C(n)),"phases",u)),naming_mode:t.phase_naming},s,typeof c=="number"?String(c).padStart(2,"0"):String(c))}function Us(n,e,s,i){(!e||!s)&&S("after-phase and description required for phase insert");let t=I.default.join(C(n),"ROADMAP.md");j.default.existsSync(t)||S("ROADMAP.md not found");let r=j.default.readFileSync(t,"utf-8"),o=be(r,n),a=De(s),u=ce(e).replace(/^0+/,"").replace(/\./g,"\\.");new RegExp(`#{2,4}\\s*Phase\\s+0*${u}:`,"i").test(o)||S(`Phase ${e} not found in ROADMAP.md`);let f=I.default.join(C(n),"phases"),m=ce(e),p=[];try{let N=j.default.readdirSync(f,{withFileTypes:!0}).filter(ne=>ne.isDirectory()).map(ne=>ne.name),U=new RegExp(`^${m}\\.(\\d+)`);for(let ne of N){let ue=ne.match(U);ue&&p.push(parseInt(ue[1],10))}}catch{}let y=p.length===0?1:Math.max(...p)+1,g=`${m}.${y}`,_=`${g}-${a}`,x=I.default.join(C(n),"phases",_);j.default.mkdirSync(x,{recursive:!0}),j.default.writeFileSync(I.default.join(x,".gitkeep"),"");let v=`
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
- `,$=new RegExp(`(#{2,4}\\s*Phase\\s+0*${u}:[^\\n]*\\n)`,"i"),k=r.match($);k||S(`Could not find Phase ${e} header`);let P=r.indexOf(k[0]),A=r.slice(P+k[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),O=A?P+k[0].length+A.index:r.length;j.default.writeFileSync(t,r.slice(0,O)+v+r.slice(O),"utf-8"),h({phase_number:g,after_phase:e,name:s,slug:a,directory:V(I.default.join(I.default.relative(n,C(n)),"phases",_))},i,g)}function Ls(n,e,s){let i=[],t=[],r=new RegExp(`^${e}\\.(\\d+)-(.+)$`),o=Oe(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}`,u=`${e}.${l}`,d=`${e}.${l}-${a.slug}`;j.default.renameSync(I.default.join(n,a.dir),I.default.join(n,d)),i.push({from:a.dir,to:d});for(let f of j.default.readdirSync(I.default.join(n,d)))if(f.includes(c)){let m=f.replace(c,u);j.default.renameSync(I.default.join(n,d,f),I.default.join(n,d,m)),t.push({from:f,to:m})}}return{renamedDirs:i,renamedFiles:t}}function zs(n,e){let s=[],i=[],t=Oe(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||"",u=r.decimal!==null?`.${r.decimal}`:"",d=`${l}${c}${u}`,f=`${a}${c}${u}`,m=`${f}-${r.slug}`;j.default.renameSync(I.default.join(n,r.dir),I.default.join(n,m)),s.push({from:r.dir,to:m});for(let p of j.default.readdirSync(I.default.join(n,m)))if(p.startsWith(d)){let y=f+p.slice(d.length);j.default.renameSync(I.default.join(n,m,p),I.default.join(n,m,y)),i.push({from:p,to:y})}}return{renamedDirs:s,renamedFiles:i}}function Vs(n,e,s,i){let t=j.default.readFileSync(n,"utf-8"),r=Q(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),u=l.padStart(2,"0"),d=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(`${u}-(\\d{2})`,"g"),`${d}-$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}`)}j.default.writeFileSync(n,t,"utf-8")}function Bs(n,e,s,i){e||S("phase number required for phase remove");let t=I.default.join(C(n),"ROADMAP.md"),r=I.default.join(C(n),"phases");j.default.existsSync(t)||S("ROADMAP.md not found");let o=ce(e),a=e.includes("."),l=s.force||!1,c=Oe(r,!0).find(m=>m.startsWith(o+"-")||m===o)||null;if(c&&!l){let m=j.default.readdirSync(I.default.join(r,c)).filter(p=>p.endsWith("-SUMMARY.md")||p==="SUMMARY.md");m.length>0&&S(`Phase ${e} has ${m.length} executed plan(s). Use --force to remove anyway.`)}c&&j.default.rmSync(I.default.join(r,c),{recursive:!0,force:!0});let u=[],d=[];try{let m=a?Ls(r,o.split(".")[0],parseInt(o.split(".")[1],10)):zs(r,parseInt(o,10));u=m.renamedDirs,d=m.renamedFiles}catch{}Vs(t,e,a,parseInt(o,10));let f=I.default.join(C(n),"STATE.md");if(j.default.existsSync(f)){let m=j.default.readFileSync(f,"utf-8"),p=B(m,"Total Phases");p&&(m=Se(m,"Total Phases",String(parseInt(p,10)-1))??m);let y=m.match(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i);y&&(m=m.replace(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i,`$1${parseInt(y[2],10)-1}$3`)),te(f,m,n)}h({removed:e,directory_deleted:c,renamed_directories:u,renamed_files:d,roadmap_updated:!0,state_updated:j.default.existsSync(f)},i)}function Gs(n,e,s){e||S("phase number required for phase complete");let i=I.default.join(C(n),"ROADMAP.md"),t=I.default.join(C(n),"STATE.md"),r=I.default.join(C(n),"phases"),o=ce(e),a=new Date().toISOString().split("T")[0],l=de(n,e);l||S(`Phase ${e} not found`);let c=l.plans.length,u=l.summaries.length,d=!1,f=[];try{let g=I.default.join(n,l.directory),_=j.default.readdirSync(g);for(let x of _.filter(v=>v.includes("-UAT")&&v.endsWith(".md"))){let v=j.default.readFileSync(I.default.join(g,x),"utf-8");/result: pending/.test(v)&&f.push(`${x}: has pending tests`),/result: blocked/.test(v)&&f.push(`${x}: has blocked tests`),/status: partial/.test(v)&&f.push(`${x}: testing incomplete (partial)`),/status: diagnosed/.test(v)&&f.push(`${x}: has diagnosed gaps`)}for(let x of _.filter(v=>v.includes("-VERIFICATION")&&v.endsWith(".md"))){let v=j.default.readFileSync(I.default.join(g,x),"utf-8");/status: human_needed/.test(v)&&f.push(`${x}: needs human verification`),/status: gaps_found/.test(v)&&f.push(`${x}: has unresolved gaps`)}}catch{}if(j.default.existsSync(i)){let g=j.default.readFileSync(i,"utf-8"),_=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${Q(e)}[:\\s][^\\n]*)`,"i");g=Ze(g,_,`$1x$2 (completed ${a})`);let x=Q(e);g=g.replace(new RegExp(`^(\\|\\s*${x}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),$=>{let k=$.split("|").slice(1,-1);return k.length===5?(k[3]=" Complete ",k[4]=` ${a} `):k.length===4&&(k[2]=" Complete ",k[3]=` ${a} `),"|"+k.join("|")+"|"}),g=Ze(g,new RegExp(`(#{2,4}\\s*Phase\\s+${x}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${u}/${c} plans complete`),j.default.writeFileSync(i,g,"utf-8");let v=I.default.join(C(n),"REQUIREMENTS.md");if(j.default.existsSync(v)){let k=be(g,n).match(new RegExp(`(#{2,4}\\s*Phase\\s+${Q(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),T=(k?k[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(T){let A=T[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(N=>N.trim()).filter(Boolean),O=j.default.readFileSync(v,"utf-8");for(let N of A){let U=Q(N);O=O.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${U}\\*\\*)`,"gi"),"$1x$2"),O=O.replace(new RegExp(`(\\|\\s*${U}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}j.default.writeFileSync(v,O,"utf-8"),d=!0}}}let m=null,p=null,y=!0;try{let g=Pe(n),_=j.default.readdirSync(r,{withFileTypes:!0}).filter(x=>x.isDirectory()).map(x=>x.name).filter(g).sort((x,v)=>ke(x,v));for(let x of _){let v=x.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(v&&ke(v[1],e)>0){m=v[1],p=v[2]||null,y=!1;break}}}catch{}if(y&&j.default.existsSync(i))try{let g=be(j.default.readFileSync(i,"utf-8"),n),_=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,x;for(;(x=_.exec(g))!==null;)if(ke(x[1],e)>0){m=x[1],p=x[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),y=!1;break}}catch{}if(j.default.existsSync(t)){let g=j.default.readFileSync(t,"utf-8"),_=m||e,x=B(g,"Current Phase")||B(g,"Phase"),v=String(_);if(x){let k=x.match(/of\s+(\d+)/),P=x.match(/\(([^)]+)\)/);if(k){let T=p?` (${p.replace(/-/g," ")})`:P?` (${P[1]})`:"";v=`${_} of ${k[1]}${T}`}}g=he(g,"Current Phase","Phase",v),p&&(g=he(g,"Current Phase Name",null,p.replace(/-/g," "))),g=he(g,"Status",null,y?"Milestone complete":"Ready to plan"),g=he(g,"Current Plan","Plan","Not started"),g=he(g,"Last Activity","Last activity",a),g=he(g,"Last Activity Description",null,`Phase ${e} complete${m?`, transitioned to Phase ${m}`:""}`);let $=B(g,"Completed Phases");if($){let k=parseInt($,10)+1;g=Se(g,"Completed Phases",String(k))??g;let P=B(g,"Total Phases");if(P){let T=parseInt(P,10);if(T>0){let A=Math.round(k/T*100);g=Se(g,"Progress",`${A}%`)??g,g=g.replace(/(percent:\s*)\d+/,`$1${A}`)}}}te(t,g,n)}h({completed_phase:e,phase_name:l.phase_name,plans_executed:`${u}/${c}`,next_phase:m,next_phase_name:p,is_last_phase:y,date:a,roadmap_updated:j.default.existsSync(i),state_updated:j.default.existsSync(t),requirements_updated:d,warnings:f,has_warnings:f.length>0},s)}var j,I,dt=le(()=>{"use strict";j=q(require("fs")),I=q(require("path"));pe();Le();Je()});var b,gn,Mr,Fr,Ir,Cr,Js,Tr,Hs,Ys,Ks,kt,yn=le(()=>{"use strict";b=require("zod"),gn=b.z.object({milestone:b.z.string().optional(),milestone_name:b.z.string().optional(),current_phase:b.z.string().optional(),current_phase_name:b.z.string().optional(),current_plan:b.z.string().optional(),total_phases:b.z.coerce.number().int().nonnegative().optional(),total_plans_in_phase:b.z.coerce.number().int().nonnegative().optional(),status:b.z.string().optional(),progress:b.z.string().optional(),last_activity:b.z.string().optional(),paused_at:b.z.string().optional(),stopped_at:b.z.string().optional()}).passthrough(),Mr=b.z.object({found:b.z.literal(!0),phase_number:b.z.string(),phase_name:b.z.string(),goal:b.z.string().nullable(),success_criteria:b.z.array(b.z.string()).default([]),section:b.z.string().optional()}).passthrough(),Fr=b.z.object({phase:b.z.union([b.z.string(),b.z.number()]),plan:b.z.union([b.z.string(),b.z.number()]),type:b.z.string(),wave:b.z.union([b.z.string(),b.z.number()]),depends_on:b.z.union([b.z.string(),b.z.array(b.z.string())]),files_modified:b.z.union([b.z.string(),b.z.array(b.z.string())]),autonomous:b.z.union([b.z.boolean(),b.z.string()]),must_haves:b.z.union([b.z.string(),b.z.array(b.z.string())])}).passthrough(),Ir=b.z.object({phase:b.z.union([b.z.string(),b.z.number()]),plan:b.z.union([b.z.string(),b.z.number()]),subsystem:b.z.string(),tags:b.z.union([b.z.string(),b.z.array(b.z.string())]),duration:b.z.string(),completed:b.z.string()}).passthrough(),Cr=b.z.object({phase:b.z.union([b.z.string(),b.z.number()]),verified:b.z.union([b.z.boolean(),b.z.string()]),status:b.z.string(),score:b.z.union([b.z.number(),b.z.string()])}).passthrough(),Js=b.z.object({test:b.z.number().int().positive().optional(),name:b.z.string(),expected:b.z.string().optional(),result:b.z.string(),category:b.z.string(),reason:b.z.string().optional(),blocked_by:b.z.string().optional()}).passthrough(),Tr=b.z.object({phase:b.z.string(),phase_dir:b.z.string(),file:b.z.string(),file_path:b.z.string(),type:b.z.literal("uat"),status:b.z.string(),items:b.z.array(Js)}).passthrough(),Hs=b.z.object({branching_strategy:b.z.enum(["none","phase","milestone","workstream"]).default("none"),phase_branch_template:b.z.string().default("gsd/phase-{phase}-{slug}"),milestone_branch_template:b.z.string().default("gsd/{milestone}-{slug}"),quick_branch_template:b.z.string().nullable().default(null)}).passthrough(),Ys=b.z.object({research:b.z.boolean().default(!0),plan_check:b.z.boolean().default(!0),verifier:b.z.boolean().default(!0),nyquist_validation:b.z.boolean().default(!0),auto_advance:b.z.boolean().default(!1),node_repair:b.z.boolean().default(!0),node_repair_budget:b.z.number().int().nonnegative().default(2),auto_retry_audit:b.z.boolean().default(!0),auto_retry_audit_budget:b.z.number().int().nonnegative().default(1),auto_retry_tech_debt:b.z.boolean().default(!0),auto_retry_tech_debt_budget:b.z.number().int().nonnegative().default(1),ui_phase:b.z.boolean().default(!0),ui_safety_gate:b.z.boolean().default(!0),text_mode:b.z.boolean().default(!1),research_before_questions:b.z.boolean().default(!1),discuss_mode:b.z.string().default("discuss"),skip_discuss:b.z.boolean().default(!1),_auto_chain_active:b.z.boolean().default(!1)}).passthrough(),Ks=b.z.object({context_warnings:b.z.boolean().default(!0),workflow_guard:b.z.boolean().default(!1)}).passthrough(),kt=b.z.object({model_profile:b.z.enum(["quality","balanced","budget","inherit"]).default("balanced"),commit_docs:b.z.boolean().default(!0),parallelization:b.z.boolean().default(!0),search_gitignored:b.z.boolean().default(!1),brave_search:b.z.boolean().default(!1),firecrawl:b.z.boolean().default(!1),exa_search:b.z.boolean().default(!1),git:Hs.default({}),workflow:Ys.default({}),hooks:Ks.default({}),agent_skills:b.z.record(b.z.string(),b.z.unknown()).default({})}).passthrough()});var Pt={};fe(Pt,{cmdValidateAgents:()=>ai,cmdValidateConsistency:()=>ri,cmdValidateHealth:()=>oi,cmdVerifyArtifacts:()=>si,cmdVerifyCommits:()=>ni,cmdVerifyKeyLinks:()=>ii,cmdVerifyPhaseCompleteness:()=>ei,cmdVerifyPlanStructure:()=>Xs,cmdVerifyReferences:()=>ti,cmdVerifySummary:()=>Qs});function Zs(n,e){let s=n;for(let i of e){if(s==null||typeof s!="object")return;s=s[i]}return s}function Qs(n,e,s,i){e||S("summary-path required");let t=Y.default.join(n,e),r=s||2;if(!K.default.existsSync(t)){h({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=K.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),u=c.filter(y=>!K.default.existsSync(Y.default.join(n,y))),d=o.match(/\b[0-9a-f]{7,40}\b/g)||[],f=!1;for(let y of d.slice(0,3))if(oe(n,["cat-file","-t",y]).stdout==="commit"){f=!0;break}let m="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)?m="failed":/(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i.test(y)&&(m="passed")}u.length>0&&a.push("Missing files: "+u.join(", ")),!f&&d.length>0&&a.push("Referenced commit hashes not found in git history"),m==="failed"&&a.push("Self-check section indicates failure");let p=u.length===0&&m!=="failed";h({passed:p,checks:{summary_exists:!0,files_created:{checked:c.length,found:c.length-u.length,missing:u},commits_exist:f,self_check:m},errors:a},i,p?"passed":"failed")}function Xs(n,e,s){e||S("file path required");let i=Y.default.isAbsolute(e)?e:Y.default.join(n,e),t=Fe(i);if(!t){h({error:"File not found",path:e},s);return}let r=ee(t),o=[],a=[];for(let f of["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"])r[f]===void 0&&o.push(`Missing required frontmatter field: ${f}`);let l=/<task[^>]*>([\s\S]*?)<\/task>/g,c=[],u;for(;(u=l.exec(t))!==null;){let f=u[1],m=f.match(/<name>([\s\S]*?)<\/name>/),p=m?m[1].trim():"unnamed",y=/<files>/.test(f),g=/<action>/.test(f),_=/<verify>/.test(f),x=/<done>/.test(f);m||o.push("Task missing <name> element"),g||o.push(`Task '${p}' missing <action>`),_||a.push(`Task '${p}' missing <verify>`),x||a.push(`Task '${p}' missing <done>`),y||a.push(`Task '${p}' missing <files>`),c.push({name:p,hasFiles:y,hasAction:g,hasVerify:_,hasDone:x})}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"),h({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 ei(n,e,s){e||S("phase required");let i=de(n,e);if(!i?.found){h({error:"Phase not found",phase:e},s);return}let t=Y.default.join(n,i.directory),r=[],o=[],a;try{a=K.default.readdirSync(t)}catch{h({error:"Cannot read phase directory"},s);return}let l=a.filter(p=>p.match(/-PLAN\.md$/i)),c=a.filter(p=>p.match(/-SUMMARY\.md$/i)),u=new Set(l.map(p=>p.replace(/-PLAN\.md$/i,""))),d=new Set(c.map(p=>p.replace(/-SUMMARY\.md$/i,""))),f=[...u].filter(p=>!d.has(p)),m=[...d].filter(p=>!u.has(p));f.length>0&&r.push(`Plans without summaries: ${f.join(", ")}`),m.length>0&&o.push(`Summaries without plans: ${m.join(", ")}`),h({complete:r.length===0,phase:i.phase_number,plan_count:l.length,summary_count:c.length,incomplete_plans:f,orphan_summaries:m,errors:r,warnings:o},s,r.length===0?"complete":"incomplete")}function ti(n,e,s){e||S("file path required");let i=Y.default.isAbsolute(e)?e:Y.default.join(n,e),t=Fe(i);if(!t){h({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("~/")?Y.default.join(process.env.HOME??"",l.slice(2)):Y.default.join(n,l);(K.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)||(K.default.existsSync(Y.default.join(n,l))?r:o).push(l)}h({valid:o.length===0,found:r.length,missing:o,total:r.length+o.length},s,o.length===0?"valid":"invalid")}function ni(n,e,s){(!e||e.length===0)&&S("At least one commit hash required");let i=[],t=[];for(let r of e)(oe(n,["cat-file","-t",r]).stdout.trim()==="commit"?i:t).push(r);h({all_valid:t.length===0,valid:i,invalid:t,total:e.length},s,t.length===0?"valid":"invalid")}function si(n,e,s){e||S("plan file path required");let i=Y.default.isAbsolute(e)?e:Y.default.join(n,e),t=Fe(i);if(!t){h({error:"File not found",path:e},s);return}let r=St(t,"artifacts");if(r.length===0){h({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 u=Y.default.join(n,c.path),d=K.default.existsSync(u),f={path:c.path,exists:d,issues:[],passed:!1};if(d){let m=Fe(u)??"",p=m.split(`
277
- `).length;if(c.min_lines&&p<c.min_lines&&f.issues.push(`Only ${p} lines, need ${c.min_lines}`),c.contains&&!m.includes(c.contains)&&f.issues.push(`Missing pattern: ${c.contains}`),c.exports){let y=Array.isArray(c.exports)?c.exports:[c.exports];for(let g of y)m.includes(g)||f.issues.push(`Missing export: ${g}`)}f.passed=f.issues.length===0}else f.issues.push("File not found");o.push(f)}let a=o.filter(l=>l.passed).length;h({all_passed:a===o.length,passed:a,total:o.length,artifacts:o},s,a===o.length?"valid":"invalid")}function ii(n,e,s){e||S("plan file path required");let i=Y.default.isAbsolute(e)?e:Y.default.join(n,e),t=Fe(i);if(!t){h({error:"File not found",path:e},s);return}let r=St(t,"key_links");if(r.length===0){h({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,u={from:c.from??"",to:c.to??"",via:c.via||"",verified:!1,detail:""},d=Fe(Y.default.join(n,c.from||""));if(!d)u.detail="Source file not found";else if(c.pattern)try{let f=new RegExp(c.pattern);if(f.test(d))u.verified=!0,u.detail="Pattern found in source";else{let m=Fe(Y.default.join(n,c.to||""));m&&f.test(m)?(u.verified=!0,u.detail="Pattern found in target"):u.detail=`Pattern "${c.pattern}" not found in source or target`}}catch{u.detail=`Invalid regex pattern: ${c.pattern}`}else d.includes(c.to||"")?(u.verified=!0,u.detail="Target referenced in source"):u.detail="Target not referenced in source";o.push(u)}let a=o.filter(l=>l.verified).length;h({all_verified:a===o.length,verified:a,total:o.length,links:o},s,a===o.length?"valid":"invalid")}function ri(n,e){let s=Y.default.join(C(n),"ROADMAP.md"),i=Y.default.join(C(n),"phases"),t=[],r=[];if(!K.default.existsSync(s)){t.push("ROADMAP.md not found"),h({passed:!1,errors:t,warnings:r},e,"failed");return}let o=be(K.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 u=new Set;try{K.default.readdirSync(i,{withFileTypes:!0}).filter(m=>m.isDirectory()).map(m=>m.name).forEach(m=>{let p=m.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);p&&u.add(p[1])})}catch{}for(let m of a)!u.has(m)&&!u.has(ce(m))&&r.push(`Phase ${m} in ROADMAP.md but no directory on disk`);for(let m of u){let p=String(parseInt(m,10));!a.has(m)&&!a.has(p)&&r.push(`Phase ${m} exists on disk but not in ROADMAP.md`)}if(J(n).phase_naming!=="custom"){let m=[...u].filter(p=>!p.includes(".")).map(p=>parseInt(p,10)).sort((p,y)=>p-y);for(let p=1;p<m.length;p++)m[p]!==m[p-1]+1&&r.push(`Gap in phase numbering: ${m[p-1]} \u2192 ${m[p]}`)}let f=t.length===0;h({passed:f,errors:t,warnings:r,warning_count:r.length},e,f?"passed":"failed")}function oi(n,e,s){let i=Y.default.resolve(n);if(i===Sn.default.homedir()){h({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=C(n),r=H(n),o=Y.default.join(r,"PROJECT.md"),a=Y.default.join(t,"ROADMAP.md"),l=Y.default.join(t,"STATE.md"),c=Y.default.join(r,"config.json"),u=Y.default.join(t,"phases"),d=[],f=[],m=[],p=[],y=(x,v,$,k,P=!1,T)=>{let A={code:v,message:$,fix:k,repairable:P,...T};x==="error"?d.push(A):x==="warning"?f.push(A):m.push(A)};if(!K.default.existsSync(t)){y("error","E001",".planning/ directory not found","Run /gsd-new-project to initialize"),h({status:"broken",errors:d,warnings:f,info:m,repairable_count:0},s);return}if(!K.default.existsSync(o))y("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let x=K.default.readFileSync(o,"utf-8");for(let v of["## What This Is","## Core Value","## Requirements"])x.includes(v)||y("warning","W001",`PROJECT.md missing section: ${v}`,"Add section manually")}if(K.default.existsSync(a)||y("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!K.default.existsSync(l))y("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),p.push("regenerateState");else try{let x=K.default.readFileSync(l,"utf-8"),v=ee(x),$=gn.safeParse(v);if(!$.success){for(let k of $.error.issues){let P=k.path.join(".")||"(root)";y("warning","W011",`STATE.md frontmatter: field "${P}" \u2014 ${k.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}p.includes("regenerateState")||p.push("regenerateState")}}catch{}if(!K.default.existsSync(c))y("warning","W003","config.json not found","Run /gsd-health --repair to create with defaults",!0),p.push("createConfig");else try{let x=JSON.parse(K.default.readFileSync(c,"utf-8")),v=kt.safeParse(x);if(!v.success){for(let $ of v.error.issues){let k=$.path.join(".")||"(root)",P=Zs(x,$.path);y("warning","W005",`config.json: field "${k}" - ${$.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:k,expected:$.message,actual:P})}p.includes("fixSchemaDefaults")||p.push("fixSchemaDefaults")}}catch(x){y("error","E005",`config.json: JSON parse error - ${x.message}`,"Run pi-gsd-tools validate health --repair to reset to defaults",!0),p.push("resetConfig")}try{let x=ot();x.agents_installed||y("warning","W010",x.installed_agents.length===0?`No GSD agents found in ${x.agents_dir}`:`Missing ${x.missing_agents.length} GSD agents: ${x.missing_agents.join(", ")}`,"Run the GSD installer: pi install npm:pi-gsd")}catch{}let g=[];if(e.repair&&p.length>0)for(let x of p)try{if(x==="createConfig"||x==="resetConfig"){let v=kt.parse({});K.default.writeFileSync(c,JSON.stringify(v,null,2),"utf-8"),g.push({action:x,success:!0,path:"config.json"})}else if(x==="fixSchemaDefaults"&&K.default.existsSync(c)){let v=JSON.parse(K.default.readFileSync(c,"utf-8")),$=kt.parse(v);K.default.writeFileSync(c,JSON.stringify($,null,2),"utf-8"),g.push({action:x,success:!0,path:"config.json"})}else if(x==="regenerateState"){if(K.default.existsSync(l)){let $=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),k=`${l}.bak-${$}`;K.default.copyFileSync(l,k),g.push({action:"backupState",success:!0,path:k})}let v=ie(n);te(l,`# Session State
278
-
279
- ## Project Reference
280
-
281
- See: .planning/PROJECT.md
282
-
283
- ## Position
284
-
285
- **Milestone:** ${v.version} ${v.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:x,success:!0,path:"STATE.md"})}}catch(v){g.push({action:x,success:!1,error:v.message})}let _=d.length>0?"broken":f.length>0?"degraded":"healthy";h({status:_,errors:d,warnings:f,info:m,repairable_count:d.filter(x=>x.repairable).length+f.filter(x=>x.repairable).length,repairs_performed:g.length>0?g:void 0},s)}function ai(n,e){let s=ot();h({agents_dir:s.agents_dir,agents_found:s.agents_installed,installed:s.installed_agents,missing:s.missing_agents,expected:Object.keys(je)},e)}var K,Sn,Y,$t=le(()=>{"use strict";K=q(require("fs")),Sn=q(require("os")),Y=q(require("path"));pe();Le();yn();Je()});var _n={};fe(_n,{cmdTemplateFill:()=>ci,cmdTemplateSelect:()=>li});function li(n,e,s){e||S("plan-path required");try{let i=mt.default.join(n,e),t=At.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 u=a.size,d="templates/summary-standard.md",f="standard";r<=2&&u<=3&&!o?(d="templates/summary-minimal.md",f="minimal"):(o||u>6||r>5)&&(d="templates/summary-complex.md",f="complex"),h({template:d,type:f,taskCount:r,fileCount:u,hasDecisions:o},s,d)}catch(i){h({template:"templates/summary-standard.md",type:"standard",error:i.message},s,"templates/summary-standard.md")}}function ci(n,e,s,i){e||S("template type required: summary, plan, or verification"),s.phase||S("--phase required");let t=de(n,s.phase);if(!t||!t.found){h({error:"Phase not found",phase:s.phase},i);return}let r=ce(s.phase),o=new Date().toISOString().split("T")[0],a=s.name||t.phase_name||"Unnamed",l=t.phase_slug||De(a),c=`${r}-${l}`,u=(s.plan||"01").padStart(2,"0"),d=s.fields||{},f,m,p;switch(e){case"summary":f={phase:c,plan:u,subsystem:"[primary category]",tags:[],provides:[],affects:[],"tech-stack":{added:[],patterns:[]},"key-files":{created:[],modified:[]},"key-decisions":[],"patterns-established":[],duration:"[X]min",completed:o,...d},m=[`# 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
- `),p=`${r}-${u}-SUMMARY.md`;break;case"plan":f={phase:c,plan:u,type:s.type||"execute",wave:parseInt(s.wave||"1"),depends_on:[],files_modified:[],autonomous:!0,user_setup:[],must_haves:{truths:[],artifacts:[],key_links:[]},...d},m=[`# Phase ${s.phase} Plan ${u}: [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
- `),p=`${r}-${u}-PLAN.md`;break;case"verification":f={phase:c,verified:new Date().toISOString(),status:"pending",score:"0/0 must-haves verified",...d},m=[`# 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
- `),p=`${r}-VERIFICATION.md`;break;default:S(`Unknown template type: ${e}. Available: summary, plan, verification`);return}let y=`---
296
- ${Xe(f)}
325
+ `;for(let Y of m)U+=`| ${Y.number} | ${Y.name} | ${Y.plans} | ${Y.summaries} | ${Y.status} |
326
+ `;_>0&&(U+=`
327
+ **Git:** ${_} commits`,P&&(U+=` (since ${P})`),U+=`
328
+ `),S&&(U+=`**Last activity:** ${S}
329
+ `),y({rendered:U},n,U)}else y(L,n)}var V,H,Se=N(()=>{"use strict";V=W(require("fs")),H=W(require("path"));ge();Ue();Dt();dn()});var Bt,ts,Nr=N(()=>{"use strict";Bt=require("@oclif/core");$e();ts=class t extends w{static description="Scaffold a GSD artefact";static args={type:Bt.Args.string({required:!0})};static flags={...w.baseFlags,phase:Bt.Flags.string({description:"Phase number"}),name:Bt.Flags.string({description:"Artefact name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdScaffold:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.type,{phase:e.phase??null,name:e.name??null},s)}}});var ns,ss,Wr=N(()=>{"use strict";ns=require("@oclif/core");$e();ss=class t extends w{static description="Commit GSD changes to git";static flags={...w.baseFlags,amend:ns.Flags.boolean({description:"Amend last commit",default:!1}),"no-verify":ns.Flags.boolean({description:"Skip git hooks",default:!1}),files:ns.Flags.string({description:"Files to include",multiple:!0})};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdCommit:i}=await Promise.resolve().then(()=>(Se(),xe)),a=n.filter(c=>!c.startsWith("--")).join(" ")||void 0;i(r,a,e.files??[],s,e.amend,e["no-verify"])}}});var tt,rs,is,os,qr=N(()=>{"use strict";tt=require("@oclif/core");$e();rs=class t extends w{static description="Get frontmatter field from a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),cn))).cmdFrontmatterGet(r,n.file,e.field??null,s)}},is=class t extends w{static description="Set frontmatter field in a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"}),value:tt.Flags.string({description:"Field value"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),cn))).cmdFrontmatterSet(r,n.file,e.field,e.value,s)}},os=class t extends w{static description="Merge frontmatter data into a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,data:tt.Flags.string({description:"JSON data to merge"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),cn))).cmdFrontmatterMerge(r,n.file,e.data,s)}}});var Gs={};he(Gs,{cmdTemplateFill:()=>Ea,cmdTemplateSelect:()=>Ra});function Ra(t,e,n){e||b("plan-path required");try{let r=Gt.default.join(t,e),s=as.default.readFileSync(r,"utf-8"),i=(s.match(/###\s*Task\s*\d+/g)||[]).length,o=(s.match(/decision/gi)||[]).length>0,a=new Set,c=/`([^`]+\.[a-zA-Z]+)`/g,l;for(;(l=c.exec(s))!==null;)l[1].includes("/")&&!l[1].startsWith("http")&&a.add(l[1]);let d=a.size,u="templates/summary-standard.md",m="standard";i<=2&&d<=3&&!o?(u="templates/summary-minimal.md",m="minimal"):(o||d>6||i>5)&&(u="templates/summary-complex.md",m="complex"),y({template:u,type:m,taskCount:i,fileCount:d,hasDecisions:o},n,u)}catch(r){y({template:"templates/summary-standard.md",type:"standard",error:r.message},n,"templates/summary-standard.md")}}function Ea(t,e,n,r){e||b("template type required: summary, plan, or verification"),n.phase||b("--phase required");let s=fe(t,n.phase);if(!s||!s.found){y({error:"Phase not found",phase:n.phase},r);return}let i=de(n.phase),o=new Date().toISOString().split("T")[0],a=n.name||s.phase_name||"Unnamed",c=s.phase_slug||qe(a),l=`${i}-${c}`,d=(n.plan||"01").padStart(2,"0"),u=n.fields||{},m,p,f;switch(e){case"summary":m={phase:l,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 ${n.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(`
330
+ `),f=`${i}-${d}-SUMMARY.md`;break;case"plan":m={phase:l,plan:d,type:n.type||"execute",wave:parseInt(n.wave||"1"),depends_on:[],files_modified:[],autonomous:!0,user_setup:[],must_haves:{truths:[],artifacts:[],key_links:[]},...u},p=[`# Phase ${n.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(`
331
+ `),f=`${i}-${d}-PLAN.md`;break;case"verification":m={phase:l,verified:new Date().toISOString(),status:"pending",score:"0/0 must-haves verified",...u},p=[`# Phase ${n.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(`
332
+ `),f=`${i}-VERIFICATION.md`;break;default:b(`Unknown template type: ${e}. Available: summary, plan, verification`);return}let g=`---
333
+ ${Ct(m)}
297
334
  ---
298
335
 
299
- ${m}
300
- `,g=mt.default.join(n,t.directory,p);if(At.default.existsSync(g)){h({error:"File already exists",path:V(mt.default.relative(n,g))},i);return}At.default.writeFileSync(g,Re(y),"utf-8");let _=V(mt.default.relative(n,g));h({created:!0,path:_,template:e},i,_)}var At,mt,bn=le(()=>{"use strict";At=q(require("fs")),mt=q(require("path"));pe();Le()});var et={};fe(et,{cmdConfigEnsureSection:()=>pi,cmdConfigGet:()=>gi,cmdConfigNewProject:()=>fi,cmdConfigSet:()=>hi,cmdConfigSetModelProfile:()=>yi,ensureConfigFile:()=>Lt,setConfigValue:()=>zt});function di(n){return!!(vn.has(n)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(n))}function mi(n){let e=ui[n];e&&S(`Unknown config key: ${n}. Did you mean ${e}?`)}function kn(n){let e=n||{},s=xn.default.homedir(),i=ze.default.join(s,".gsd","brave_api_key"),t=!!(process.env.BRAVE_API_KEY||re.default.existsSync(i)),r=ze.default.join(s,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||re.default.existsSync(r)),a=ze.default.join(s,".gsd","exa_api_key"),l=!!(process.env.EXA_API_KEY||re.default.existsSync(a)),c=ze.default.join(s,".gsd","defaults.json"),u={};try{if(re.default.existsSync(c)&&(u=JSON.parse(re.default.readFileSync(c,"utf-8")),"depth"in u&&!("granularity"in u))){let f={quick:"coarse",standard:"standard",comprehensive:"fine"};u.granularity=f[u.depth]||u.depth,delete u.depth;try{re.default.writeFileSync(c,JSON.stringify(u,null,2),"utf-8")}catch{}}}catch{}let d={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{...d,...u,...e,git:{...d.git,...u.git||{},...e.git||{}},workflow:{...d.workflow,...u.workflow||{},...e.workflow||{}},hooks:{...d.hooks,...u.hooks||{},...e.hooks||{}},agent_skills:{...d.agent_skills,...u.agent_skills||{},...e.agent_skills||{}}}}function Lt(n){let e=H(n),s=ze.default.join(e,"config.json");try{re.default.existsSync(e)||re.default.mkdirSync(e,{recursive:!0})}catch(t){S("Failed to create .planning directory: "+t.message)}if(re.default.existsSync(s))return{created:!1,reason:"already_exists"};let i=kn({});try{return re.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 zt(n,e,s){let i=ze.default.join(H(n),"config.json"),t={};try{re.default.existsSync(i)&&(t=JSON.parse(re.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 re.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 fi(n,e,s){let i=H(n),t=ze.default.join(i,"config.json");if(re.default.existsSync(t)){h({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{re.default.existsSync(i)||re.default.mkdirSync(i,{recursive:!0})}catch(a){S("Failed to create .planning directory: "+a.message)}let o=kn(r);try{re.default.writeFileSync(t,JSON.stringify(o,null,2),"utf-8"),h({created:!0,path:".planning/config.json"},s,"created")}catch(a){S("Failed to write config.json: "+a.message)}}function pi(n,e){let s=Lt(n);h(s,e,s?.created?"created":"exists")}function hi(n,e,s,i){e||S("Usage: config-set <key.path> <value>"),mi(e),di(e)||S(`Unknown config key: "${e}". Valid keys: ${[...vn].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=zt(n,e,t);h(r,i,`${e}=${t}`)}function gi(n,e,s){e||S("Usage: config-get <key.path>");let i=ze.default.join(H(n),"config.json"),t={};try{re.default.existsSync(i)?t=JSON.parse(re.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}`),h(o,s,String(o))}function yi(n,e,s){e||S(`Usage: config-set-model-profile <${He.join("|")}>`);let i=e.toLowerCase().trim();He.includes(i)||S(`Invalid profile '${e}'. Valid profiles: ${He.join(", ")}`),Lt(n);let r=zt(n,"model_profile",i)?.previousValue||"balanced",o=Ft(i),a=It(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}`;h({updated:!0,profile:i,previousProfile:r,agentToModelMap:o},s,c)}var re,xn,ze,vn,ui,tt=le(()=>{"use strict";re=q(require("fs")),xn=q(require("os")),ze=q(require("path"));pe();rt();vn=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"]),ui={"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 Vt={};fe(Vt,{cmdAgentSkills:()=>Ci,cmdInitExecutePhase:()=>Si,cmdInitListWorkspaces:()=>Fi,cmdInitManager:()=>wi,cmdInitMapCodebase:()=>Ri,cmdInitMilestoneOp:()=>ji,cmdInitNewMilestone:()=>xi,cmdInitNewProject:()=>bi,cmdInitNewWorkspace:()=>Mi,cmdInitPhaseOp:()=>$i,cmdInitPlanPhase:()=>_i,cmdInitProgress:()=>Ei,cmdInitQuick:()=>vi,cmdInitRemoveWorkspace:()=>Ii,cmdInitResume:()=>ki,cmdInitTodos:()=>Ai,cmdInitVerifyWork:()=>Pi});function Pn(n){let e=$e.default.join(H(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 ae(n,e){e.project_root=n,e.gsd_bin="dist/gsd-tools.js",e.gsd_root=".",e.gsd_harness_dir=".";let s=ot();return e.agents_installed=s.agents_installed,e.missing_agents=s.missing_agents,e}function Si(n,e,s){e||S("phase required for init execute-phase");let i=J(n),t=de(n,e),r=ie(n),o=Qe(n,e);if(!t&&o?.found){let u=o.phase_name;t={found:!0,directory:null,phase_number:o.phase_number,phase_name:u,phase_slug:u?u.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(u=>u.trim()).filter(Boolean).join(", "):null,c=ae(n,{executor_model:X(n,"gsd-executor"),verifier_model:X(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});h(c,s)}function _i(n,e,s){e||S("phase required for init plan-phase");let i=J(n),t=de(n,e),r=Qe(n,e),o=ie(n),a=ae(n,{planner_model:X(n,"gsd-planner"),researcher_model:X(n,"gsd-phase-researcher"),synthesizer_model:X(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});h(a,s)}function bi(n,e){let s=J(n),i=H(n),t=ae(n,{planner_model:X(n,"gsd-planner"),roadmapper_model:X(n,"gsd-roadmapper"),commit_docs:s.commit_docs,context_window:s.context_window,planning_exists:L.default.existsSync(i),project_exists:L.default.existsSync($e.default.join(i,"PROJECT.md")),config_exists:L.default.existsSync($e.default.join(i,"config.json")),roadmap_exists:L.default.existsSync($e.default.join(i,"ROADMAP.md")),state_exists:L.default.existsSync($e.default.join(i,"STATE.md"))});h(t,e)}function xi(n,e){let s=J(n),i=ie(n),t=Pn(n),r=ae(n,{roadmapper_model:X(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)});h(r,e)}function vi(n,e,s){let i=J(n),t=ie(n),r=ae(n,{executor_model:X(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)});h(r,s)}function ki(n,e){let s=J(n),i=ie(n),t=L.default.existsSync(R(n).state),r="";if(t)try{r=L.default.readFileSync(R(n).state,"utf-8")}catch{}let o=ae(n,{executor_model:X(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});h(o,e)}function Pi(n,e,s){e||S("phase required for init verify-work");let i=J(n),t=de(n,e),r=Qe(n,e),o=ae(n,{verifier_model:X(n,"gsd-verifier"),nyquist_model:X(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});h(o,s)}function $i(n,e,s){let i=J(n),t=e?de(n,e):null,r=ie(n),o=ae(n,{planner_model:X(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});h(o,s)}function Ai(n,e,s){let i=J(n),t=$e.default.join(C(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($e.default.join(t,a),"utf-8"),c=l.match(/^title:\s*(.+)$/m),u=l.match(/^area:\s*(.+)$/m),d=u?u[1].trim():"general";if(e&&d!==e)continue;r.push({file:a,title:c?c[1].trim():"Untitled",area:d})}catch{}}catch{}let o=ae(n,{executor_model:X(n,"gsd-executor"),commit_docs:i.commit_docs,todos:r,todo_count:r.length,area:e??null});h(o,s)}function ji(n,e){let s=J(n),i=ie(n),t=Pn(n),r=ae(n,{planner_model:X(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)});h(r,e)}function Ri(n,e){let s=J(n),i=ae(n,{mapper_model:X(n,"gsd-codebase-mapper"),commit_docs:s.commit_docs,search_gitignored:s.search_gitignored,context_window:s.context_window,project_exists:L.default.existsSync($e.default.join(H(n),"PROJECT.md"))});h(i,e)}function Ei(n,e){let s=J(n),i=ie(n),t=Pe(n),r=R(n).phases,o=0,a=0,l=0;if(L.default.existsSync(r))try{let u=L.default.readdirSync(r,{withFileTypes:!0}).filter(d=>d.isDirectory()).map(d=>d.name).filter(t);l=u.length;for(let d of u){let f=L.default.readdirSync($e.default.join(r,d));o+=f.filter(m=>m.match(/-PLAN\.md$/i)).length,a+=f.filter(m=>m.match(/-SUMMARY\.md$/i)).length}}catch{}let c=ae(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});h(c,e)}function wi(n,e){let s=J(n),i=ie(n),t=ae(n,{planner_model:X(n,"gsd-planner"),roadmapper_model:X(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)});h(t,e)}function Mi(n,e){let s=J(n),i=$e.default.join(H(n),"workstreams"),t=ae(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):[]});h(t,e)}function Fi(n,e){let s=$e.default.join(H(n),"workstreams");if(!L.default.existsSync(s)){h(ae(n,{mode:"flat",workstreams:[],count:0}),e);return}let i=L.default.readdirSync(s,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>t.name);h(ae(n,{mode:"workstream",workstreams:i,count:i.length}),e)}function Ii(n,e,s){e||S("workstream name required for init remove-workspace");let i=$e.default.join(H(n),"workstreams",e);if(!L.default.existsSync(i)){h(ae(n,{removed:!1,reason:"not_found",workstream:e}),s);return}try{L.default.rmSync(i,{recursive:!0,force:!0})}catch(t){h(ae(n,{removed:!1,reason:t.message,workstream:e}),s);return}h(ae(n,{removed:!0,workstream:e}),s)}function Ci(n,e,s){e||S("agent-type required");let t=J(n).agent_skills[e]??{};h({agent:e,skills:t},s,JSON.stringify(t))}var L,$e,Bt=le(()=>{"use strict";L=q(require("fs")),$e=q(require("path"));pe()});var An={};fe(An,{cmdRoadmapAnalyze:()=>Di,cmdRoadmapGetPhase:()=>Ti,cmdRoadmapUpdatePlanProgress:()=>Oi});function Ti(n,e,s){let i=R(n).roadmap;if(!Ne.default.existsSync(i)){h({found:!1,error:"ROADMAP.md not found"},s,"");return}try{let t=be(Ne.default.readFileSync(i,"utf-8"),n),r=Q(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"),x=t.match(_);if(x){h({found:!1,phase_number:e,phase_name:x[1].trim(),error:"malformed_roadmap",message:`Phase ${e} exists in summary list but missing detail section.`},s,"");return}h({found:!1,phase_number:e},s,"");return}let l=a[1].trim(),c=a.index,d=t.slice(c).match(/\n#{2,4}\s+Phase\s+\d/i),f=d?c+d.index:t.length,m=t.slice(c,f).trim(),p=m.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),y=m.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):[];h({found:!0,phase_number:e,phase_name:l,goal:p?p[1].trim():null,success_criteria:g,section:m},s,m)}catch(t){S("Failed to read ROADMAP.md: "+t.message)}}function Di(n,e){let s=R(n).roadmap;if(!Ne.default.existsSync(s)){h({error:"ROADMAP.md not found",milestones:[],phases:[],current_phase:null},e);return}let i=Ne.default.readFileSync(s,"utf-8"),t=be(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 P=l[1],T=l[2].replace(/\(INSERTED\)/i,"").trim(),A=l.index,O=t.slice(A).match(/\n#{2,4}\s+Phase\s+\d/i),N=O?A+O.index:t.length,U=t.slice(A,N),ne=U.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),ue=U.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),ve=ce(P),se="no_directory",me=0,Te=0,We=!1,wt=!1;try{let nn=Ne.default.readdirSync(r,{withFileTypes:!0}).filter(we=>we.isDirectory()).map(we=>we.name).find(we=>we.startsWith(ve+"-")||we===ve);if(nn){let we=Ne.default.readdirSync($n.default.join(r,nn));me=we.filter(Me=>Me.endsWith("-PLAN.md")||Me==="PLAN.md").length,Te=we.filter(Me=>Me.endsWith("-SUMMARY.md")||Me==="SUMMARY.md").length,We=we.some(Me=>Me.endsWith("-CONTEXT.md")||Me==="CONTEXT.md"),wt=we.some(Me=>Me.endsWith("-RESEARCH.md")||Me==="RESEARCH.md"),Te>=me&&me>0?se="complete":Te>0?se="partial":me>0?se="planned":wt?se="researched":We?se="discussed":se="empty"}}catch{}let Cn=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${Q(P)}[:\\s]`,"i"),en=t.match(Cn),tn=en?en[1]==="x":!1;tn&&se!=="complete"&&(se="complete"),a.push({number:P,name:T,goal:ne?ne[1].trim():null,depends_on:ue?ue[1].trim():null,plan_count:me,summary_count:Te,has_context:We,has_research:wt,disk_status:se,roadmap_complete:tn})}let c=[],u=/##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi,d;for(;(d=u.exec(t))!==null;)c.push({heading:d[1].trim(),version:"v"+d[2]});let f=a.find(P=>P.disk_status==="planned"||P.disk_status==="partial")??null,m=a.find(P=>["empty","no_directory","discussed","researched"].includes(P.disk_status))??null,p=a.reduce((P,T)=>P+T.plan_count,0),y=a.reduce((P,T)=>P+T.summary_count,0),g=a.filter(P=>P.disk_status==="complete").length,_=/-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi,x=new Set,v;for(;(v=_.exec(t))!==null;)x.add(v[1]);let $=new Set(a.map(P=>P.number)),k=[...x].filter(P=>!$.has(P));h({milestones:c,phases:a,phase_count:a.length,completed_phases:g,total_plans:p,total_summaries:y,progress_percent:p>0?Math.min(100,Math.round(y/p*100)):0,current_phase:f?f.number:null,next_phase:m?m.number:null,missing_phase_details:k.length>0?k:null},e)}function Oi(n,e,s){e||S("phase number required for roadmap update-plan-progress");let i=R(n).roadmap,t=de(n,e);t||S(`Phase ${e} not found`);let r=t.plans.length,o=t.summaries.length;if(r===0){h({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(!Ne.default.existsSync(i)){h({updated:!1,reason:"ROADMAP.md not found",plan_count:r,summary_count:o},s,"no roadmap");return}let u=Ne.default.readFileSync(i,"utf-8"),d=Q(e),f=new RegExp(`^(\\|\\s*${d}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),m=a?` ${c} `:" ";u=u.replace(f,y=>{let g=y.split("|").slice(1,-1);return g.length===5?(g[2]=` ${o}/${r} `,g[3]=` ${l.padEnd(11)}`,g[4]=m):g.length===4&&(g[1]=` ${o}/${r} `,g[2]=` ${l.padEnd(11)}`,g[3]=m),"|"+g.join("|")+"|"});let p=new RegExp(`(#{2,4}\\s*Phase\\s+${d}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i");if(u=Ze(u,p,`$1${a?`${o}/${r} plans complete`:`${o}/${r} plans executed`}`),a){let y=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${d}[:\\s][^\\n]*)`,"i");u=Ze(u,y,`$1x$2 (completed ${c})`)}for(let y of t.summaries){let g=y.replace("-SUMMARY.md","").replace("SUMMARY.md","");g&&(u=u.replace(new RegExp(`(-\\s*\\[) (\\]\\s*${Q(g)})`,"i"),"$1x$2"))}Ne.default.writeFileSync(i,u,"utf-8"),h({updated:!0,phase:e,plan_count:r,summary_count:o,status:l,complete:a},s,`${o}/${r} ${l}`)}var Ne,$n,jn=le(()=>{"use strict";Ne=q(require("fs")),$n=q(require("path"));pe()});var Gt={};fe(Gt,{cmdMilestoneComplete:()=>qi,cmdRequirementsMarkComplete:()=>Ni});function Ni(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(!z.default.existsSync(t)){h({updated:!1,reason:"REQUIREMENTS.md not found",ids:i},s,"no requirements file");return}let r=z.default.readFileSync(t,"utf-8"),o=[],a=[],l=[];for(let c of i){let u=!1,d=Q(c);new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${d}\\*\\*)`,"gi").test(r)&&(r=r.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${d}\\*\\*)`,"gi"),"$1x$2"),u=!0),new RegExp(`(\\|\\s*${d}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi").test(r)&&(r=r.replace(new RegExp(`(\\|\\s*${d}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi"),"$1 Complete $2"),u=!0),u?o.push(c):new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${d}\\*\\*`,"gi").test(r)||new RegExp(`\\|\\s*${d}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`,"gi").test(r)?a.push(c):l.push(c)}o.length>0&&z.default.writeFileSync(t,r,"utf-8"),h({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 qi(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=_e.default.join(n,".planning","MILESTONES.md"),l=_e.default.join(n,".planning","milestones"),c=R(n).phases,u=new Date().toISOString().split("T")[0],d=s.name||e;z.default.mkdirSync(l,{recursive:!0});let f=Pe(n),m=0,p=0,y=0,g=[];try{let k=z.default.readdirSync(c,{withFileTypes:!0}).filter(P=>P.isDirectory()).map(P=>P.name).sort();for(let P of k){if(!f(P))continue;m++;let T=z.default.readdirSync(_e.default.join(c,P)),A=T.filter(N=>N.endsWith("-PLAN.md")||N==="PLAN.md"),O=T.filter(N=>N.endsWith("-SUMMARY.md")||N==="SUMMARY.md");p+=A.length;for(let N of O)try{let U=z.default.readFileSync(_e.default.join(c,P,N),"utf-8"),ue=ee(U)["one-liner"]||yt(U);ue&&g.push(ue);let ve=U.match(/\*\*Tasks:\*\*\s*(\d+)/);if(ve)y+=parseInt(ve[1],10);else{let se=U.match(/<task[\s>]/gi)||[],me=U.match(/##\s*Task\s*\d+/gi)||[];y+=se.length||me.length}}catch{}}}catch{}z.default.existsSync(t)&&z.default.writeFileSync(_e.default.join(l,`${e}-ROADMAP.md`),z.default.readFileSync(t,"utf-8"),"utf-8"),z.default.existsSync(r)&&z.default.writeFileSync(_e.default.join(l,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${d}
311
-
312
- **Archived:** ${u}
313
- **Status:** SHIPPED
314
-
315
- ---
316
-
317
- `+z.default.readFileSync(r,"utf-8"),"utf-8");let _=_e.default.join(n,".planning",`${e}-MILESTONE-AUDIT.md`);z.default.existsSync(_)&&z.default.renameSync(_,_e.default.join(l,`${e}-MILESTONE-AUDIT.md`));let x=g.map(k=>`- ${k}`).join(`
318
- `),v=`## ${e} ${d} (Shipped: ${u})
319
-
320
- **Phases completed:** ${m} phases, ${p} plans, ${y} tasks
321
-
322
- **Key accomplishments:**
323
- ${x||"- (none recorded)"}
324
-
325
- ---
326
-
327
- `;if(z.default.existsSync(a)){let k=z.default.readFileSync(a,"utf-8");if(!k.trim())z.default.writeFileSync(a,Re(`# Milestones
328
-
329
- ${v}`),"utf-8");else{let P=k.match(/^(#{1,3}\s+[^\n]*\n\n?)/);P?z.default.writeFileSync(a,Re(P[1]+v+k.slice(P[1].length)),"utf-8"):z.default.writeFileSync(a,Re(v+k),"utf-8")}}else z.default.writeFileSync(a,Re(`# Milestones
330
-
331
- ${v}`),"utf-8");if(z.default.existsSync(o)){let k=z.default.readFileSync(o,"utf-8");k=he(k,"Status",null,`${e} milestone complete`),k=he(k,"Last Activity","Last activity",u),k=he(k,"Last Activity Description",null,`${e} milestone completed and archived`),te(o,k,n)}let $=!1;if(s.archivePhases)try{let k=_e.default.join(l,`${e}-phases`);z.default.mkdirSync(k,{recursive:!0});let P=z.default.readdirSync(c,{withFileTypes:!0}).filter(A=>A.isDirectory()).map(A=>A.name),T=0;for(let A of P)f(A)&&(z.default.renameSync(_e.default.join(c,A),_e.default.join(k,A)),T++);$=T>0}catch{}h({version:e,name:d,date:u,phases:m,plans:p,tasks:y,accomplishments:g,archived:{roadmap:z.default.existsSync(_e.default.join(l,`${e}-ROADMAP.md`)),requirements:z.default.existsSync(_e.default.join(l,`${e}-REQUIREMENTS.md`)),audit:z.default.existsSync(_e.default.join(l,`${e}-MILESTONE-AUDIT.md`)),phases:$},milestones_updated:!0,state_updated:z.default.existsSync(o)},i)}var z,_e,Jt=le(()=>{"use strict";z=q(require("fs")),_e=q(require("path"));pe();Le();Je()});var Ht={};fe(Ht,{buildCheckpoint:()=>En,cmdAuditUat:()=>Wi,cmdRenderCheckpoint:()=>Ui,parseCurrentTest:()=>Rn});function Wi(n,e){let s=qe.default.join(C(n),"phases");Be.default.existsSync(s)||S("No phases directory found in planning directory");let i=Pe(n),t=[],r=Be.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,u=qe.default.join(s,a),d=Be.default.readdirSync(u);for(let f of d.filter(m=>m.includes("-UAT")&&m.endsWith(".md"))){let m=Be.default.readFileSync(qe.default.join(u,f),"utf-8"),p=Li(m);p.length>0&&t.push({phase:c,phase_dir:a,file:f,file_path:V(qe.default.relative(n,qe.default.join(u,f))),type:"uat",status:ee(m).status||"unknown",items:p})}for(let f of d.filter(m=>m.includes("-VERIFICATION")&&m.endsWith(".md"))){let m=Be.default.readFileSync(qe.default.join(u,f),"utf-8"),p=ee(m).status||"unknown";if(p==="human_needed"||p==="gaps_found"){let y=zi(m,p);y.length>0&&t.push({phase:c,phase_dir:a,file:f,file_path:V(qe.default.relative(n,qe.default.join(u,f))),type:"verification",status:p,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}h({results:t,summary:o},e)}function Ui(n,e,s){let i=e.file;i||S("UAT file required: use uat render-checkpoint --file <path>");let t=Nt(i,n,"UAT file",{allowAbsolute:!0});Be.default.existsSync(t)||S(`UAT file not found: ${i}`);let r=Be.default.readFileSync(t,"utf-8"),o=Rn(r);o.complete&&S("UAT session is already complete; no pending checkpoint to render");let a=En(o);h({file_path:V(qe.default.relative(n,t)),test_number:o.number,test_name:o.name,checkpoint:a},s,a)}function Rn(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:xt(t[1].trim()),expected:xt(a)}}function En(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 Li(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),u=c>0?l.slice(0,c):l,d=u.match(/reason:\s*(.+)/),f=u.match(/blocked_by:\s*(.+)/),m={test:parseInt(t,10),name:r.trim(),expected:o.trim(),result:a,category:Vi(a,d?.[1],f?.[1])};d&&(m.reason=d[1].trim()),f&&(m.blocked_by=f[1].trim()),e.push(m)}}return e}function zi(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 Vi(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 Be,qe,Yt=le(()=>{"use strict";Be=q(require("fs")),qe=q(require("path"));pe();Le();ct()});var jt={};fe(jt,{cmdExtractMessages:()=>Yi,cmdProfileSample:()=>Ki,cmdScanSessions:()=>Hi});function Kt(n){if(n)return n;let e=process.env.HOME??"",s=Ae.join(e,".agent","projects");return Z.existsSync(s)?s:Ae.join(e,".claude","projects")}function Zt(){let n=process.env.HOME??"";return Ae.join(n,".pi","agent","sessions")}function Qt(n){return n.startsWith("--")&&n.endsWith("--")?"/"+n.slice(2,-2).replace(/-/g,"/"):n}function Bi(n){try{let e=Z.readFileSync(n,"utf-8").split(`
337
- `).find(i=>i.trim().length>0);if(!e)return!1;let s=JSON.parse(e);return s.type==="session"&&"version"in s}catch{return!1}}function Gi(n){return typeof n=="string"?n:Array.isArray(n)?n.filter(e=>e!==null&&typeof e=="object"&&e.type==="text").map(e=>String(e.text??"")).join(" "):""}function Ji(n){try{let e=Z.readFileSync(n,"utf-8").split(`
338
- `).filter(Boolean),s=[];for(let i of e)try{let t=JSON.parse(i);t.type==="message"&&t.message&&s.push(t)}catch{}return s}catch{return[]}}async function Hi(n,e,s){let t=(e.harness??null)==="pi",r=Zt(),o=Z.existsSync(r),a=[];if(o)try{let f=Z.readdirSync(r,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of f){let p=Ae.join(r,m.name),y=Z.readdirSync(p).filter(g=>g.endsWith(".jsonl"));a.push({name:m.name,sessions:y.length,path:p,source:"pi",cwd:Qt(m.name)})}}catch{}let l=Kt(t&&!n?null:n),c=!t||n?Z.existsSync(l):!1,u=[];if(c&&(!t||n))try{let f=Z.readdirSync(l,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of f){let p=Ae.join(l,m.name),y=Z.readdirSync(p).filter(g=>g.endsWith(".jsonl")||g.endsWith(".json"));u.push({name:m.name,sessions:y.length,path:p,source:"claude"})}}catch{}let d=t?[...a,...u]:[...u,...a];if(d.length===0){let f=[];o?f.push(r):f.push(r+" (not found)"),t||f.push(c?l:l+" (not found)"),h({available:!1,reason:`No sessions found. Searched: ${f.join(", ")}`,projects:[],count:0},s);return}h({available:!0,pi_base:o?r:null,claude_base:c?l:null,projects:d,count:d.length},s)}async function Yi(n,e,s,i){let t=Zt(),r=null,o="claude";if(Z.existsSync(t)){let u=Ae.join(t,n);if(Z.existsSync(u))r=u,o="pi";else try{let d=Z.readdirSync(t,{withFileTypes:!0}).filter(f=>f.isDirectory());for(let f of d){let m=Qt(f.name);if(m.endsWith("/"+n)||m===n||f.name===n){r=Ae.join(t,f.name),o="pi";break}}}catch{}}if(!r){let u=Kt(i),d=Ae.join(u,n);Z.existsSync(d)&&(r=d,o="claude")}if(!r){h({error:`Project not found: ${n}`,available_projects:[]},s);return}let a=[],l=Z.readdirSync(r).filter(u=>u.endsWith(".jsonl")),c=e.limit??null;for(let u of l){if(e.sessionId&&!u.includes(e.sessionId))continue;let d=Ae.join(r,u);if(o==="pi"||Bi(d))try{let f=Z.readFileSync(d,"utf-8").split(`
339
- `).filter(Boolean);for(let m of f)try{let p=JSON.parse(m);if(p.type==="message"&&p.message&&(a.push(p.message),c&&a.length>=c))break}catch{}}catch{}else try{let f=Z.readFileSync(d,"utf-8").split(`
340
- `).filter(Boolean);for(let m of f)try{let p=JSON.parse(m);if(a.push(p),c&&a.length>=c)break}catch{}}catch{}if(c&&a.length>=c)break}h({project:n,source:o,messages:a,count:a.length},s)}async function Ki(n,e,s){let t=(e.harness??null)==="pi",r=e.limit??150,o=e.maxChars??500,a=[],l=Zt();if(Z.existsSync(l))try{let u=Z.readdirSync(l,{withFileTypes:!0}).filter(d=>d.isDirectory());e:for(let d of u){let f=Ae.join(l,d.name),m=Z.readdirSync(f).filter(y=>y.endsWith(".jsonl")),p=0;for(let y of m){let g=Ji(Ae.join(f,y));for(let _ of g)if(_.message?.role==="user"){let x=Gi(_.message.content).slice(0,o);if(x.length>20){if(a.push({project:Qt(d.name),text:x,source:"pi"}),p++,e.maxPerProject&&p>=e.maxPerProject)break;if(a.length>=r)break e}}}}}catch{}if(!(t&&!n&&a.length>=r)){let u=Kt(n);if(Z.existsSync(u))try{let d=Z.readdirSync(u,{withFileTypes:!0}).filter(f=>f.isDirectory());e:for(let f of d){let m=Ae.join(u,f.name),p=Z.readdirSync(m).filter(g=>g.endsWith(".jsonl")),y=0;for(let g of p)try{let _=Z.readFileSync(Ae.join(m,g),"utf-8").split(`
341
- `).filter(Boolean);for(let x of _)try{let v=JSON.parse(x);if(v.role==="human"||v.type==="human"){let $=(v.content||v.message||"").slice(0,o);if($.length>20){if(a.push({project:f.name,text:$,source:"claude"}),y++,e.maxPerProject&&y>=e.maxPerProject)break;if(a.length>=r)break e}}}catch{}}catch{}}}catch{}}if(a.length===0){h({available:!1,reason:"No user messages found in any session",samples:[],count:0},s);return}h({available:!0,samples:a,count:a.length},s)}var Z,Ae,Rt=le(()=>{"use strict";pe();Z=require("fs"),Ae=require("path")});var nt={};fe(nt,{cmdGenerateClaudeMd:()=>nr,cmdGenerateClaudeProfile:()=>tr,cmdGenerateDevPreferences:()=>er,cmdProfileQuestionnaire:()=>Xi,cmdWriteProfile:()=>Qi});function Et(n,e,s="CLAUDE.md"){return e?Ee.default.resolve(e):Ee.default.join(n,s)}function Xt(n,e){if(!n)return null;let s=Ee.default.isAbsolute(n)?n:Ee.default.join(e,n);if(!Ve.default.existsSync(s))return null;try{return JSON.parse(Ve.default.readFileSync(s,"utf-8"))}catch{return null}}function Zi(n){return n.map(e=>`## ${e.heading}
336
+ ${p}
337
+ `,h=Gt.default.join(t,s.directory,f);if(as.default.existsSync(h)){y({error:"File already exists",path:B(Gt.default.relative(t,h))},r);return}as.default.writeFileSync(h,Ee(g),"utf-8");let x=B(Gt.default.relative(t,h));y({created:!0,path:x,template:e},r,x)}var as,Gt,Js=N(()=>{"use strict";as=W(require("fs")),Gt=W(require("path"));ge();Ue()});var Je,cs,ls,Lr=N(()=>{"use strict";Je=require("@oclif/core");$e();cs=class t extends w{static description="Select a workflow template";static args={type:Je.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTemplateSelect:i}=await Promise.resolve().then(()=>(Js(),Gs));i(r,n.type,s)}},ls=class t extends w{static description="Fill a template with values";static args={type:Je.Args.string({required:!0})};static flags={...w.baseFlags,phase:Je.Flags.string(),plan:Je.Flags.string(),name:Je.Flags.string(),type:Je.Flags.string({char:"t"}),wave:Je.Flags.string(),fields:Je.Flags.string({description:"JSON fields"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTemplateFill:i}=await Promise.resolve().then(()=>(Js(),Gs)),o={};if(e.fields)try{o=JSON.parse(e.fields)}catch{}i(r,n.type,{phase:e.phase??void 0,plan:e.plan??void 0,name:e.name??void 0,type:e.type??void 0,wave:e.wave??void 0,...o},s)}}});var Et,ds,us,ms,ps,fs,Ur=N(()=>{"use strict";Et=require("@oclif/core");$e();ds=class t extends w{static description="Show project progress";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdProgressRender:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.format,s)}},us=class t extends w{static description="Show project statistics";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdStats:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.format,s)}},ms=class t extends w{static description="Mark a todo as complete";static args={id:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoComplete:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.id,s)}},ps=class t extends w{static description="Match todos to phase";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoMatchPhase:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.phase,s)}},fs=class t extends w{static description="Extract fields from summary files";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags,fields:w.baseFlags.pick};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdSummaryExtract:i}=await Promise.resolve().then(()=>(Se(),xe)),o=e.fields?e.fields.split(","):null;i(r,n.phase,o,s)}}});function ft(t){let e=[],n=/^```[^\n]*\n[\s\S]*?^```/gm,r;for(;(r=n.exec(t))!==null;)e.push([r.index,r.index+r[0].length]);return e}function gt(t,e){return e.some(([n,r])=>t>=n&&t<r)}function Fa(t){let e={},n=/([a-zA-Z0-9_:-]+)(?:=(?:"([^"]*)"|'([^']*)'|([^\s/>]*)))?/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]??r[3]??r[4]??"";e[s]=i}return e}function Vr(t,e){if(t[e]!=="<")return null;let n=/^<([a-zA-Z0-9_:-]+)((?:\s+[a-zA-Z0-9_:-]+(?:=(?:"[^"]*"|'[^']*'|[^\s/>]*))?)*)?\s*(\/??>)/,r=t.slice(e),s=n.exec(r);if(!s)return null;let i=s[1],o=(s[2]??"").trim(),a=s[3],c=Fa(o);if(a==="/>")return{node:{tag:i,attrs:c,children:[],selfClosing:!0},end:e+s[0].length};let l=e+s[0].length,d=[],u=`</${i}>`;for(;l<t.length;){let m=t.indexOf("<",l);if(m===-1)break;if(t.startsWith(u,m))return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:m+u.length};if(t.startsWith("<!--",m)){let f=t.indexOf("-->",m+4);l=f!==-1?f+3:t.length;continue}let p=Vr(t,m);p?(d.push(p.node),l=p.end):l=m+1}return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:l}}function Jt(t){let e=ft(t),n=[],r=/<(gsd-[a-zA-Z0-9_-]+)/g,s;for(;(s=r.exec(t))!==null;){let i=s.index;if(gt(i,e))continue;let o=s[1];if(!Ma.has(o))continue;let a=Vr(t,i);a&&(n.push({node:a.node,start:i,end:a.end}),r.lastIndex=a.end)}return n}function gs(t,e,n,r){return t.slice(0,e)+r+t.slice(n)}var Ma,Ys=N(()=>{"use strict";Ma=new Set(["gsd-execute","gsd-arguments","gsd-paste","gsd-include","gsd-version"])});function zr(){let t=new Map,e=new Map,n=r=>{let s=t.get(r)?.value;if(s!==void 0)return s;let i=r.indexOf(".");if(i===-1)return;let o=r.slice(0,i),a=r.slice(i+1),c=t.get(o)?.value;if(c!==void 0)try{let l=JSON.parse(c);for(let d of a.split(".")){if(l===null||typeof l!="object")return;l=l[d]}return l==null?void 0:String(l)}catch{return}};return{set(r,s,i){let o=t.get(r);o?.owner&&i&&o.owner!==i?(t.delete(r),t.set(`${o.owner}:${r}`,{name:`${o.owner}:${r}`,value:o.value,owner:o.owner}),t.set(`${i}:${r}`,{name:`${i}:${r}`,value:s,owner:i})):t.set(r,{name:r,value:s,owner:i})},get(r){return t.get(r)?.value},resolve(r){return n(r)},setArray(r,s,i){e.set(r,s),t.set(r,{name:r,value:JSON.stringify(s),owner:i})},getArray(r){if(e.has(r))return e.get(r);let s=t.get(r)?.value;if(s)try{let i=JSON.parse(s);if(Array.isArray(i))return i.map(o=>typeof o=="string"?o:JSON.stringify(o))}catch{}},has(r){return t.has(r)||e.has(r)},entries(){return t.entries()},snapshot(){let r={};for(let[s,i]of t)r[s]=i.value;return r}}}var Br=N(()=>{"use strict"});function Gr(t,e,n){let r=t.children.find(g=>g.tag==="settings"),s=r?.children.some(g=>g.tag==="keep-extra-args")??!1,i=r?.children.some(g=>g.tag==="strict-args")??!1,a=r?.children.find(g=>g.tag==="delimiters")?.children.find(g=>g.tag==="delimiter"),c;if(a){let g=a.attrs.value??"",h=g==="\\n"?`
338
+ `:g;c=e.split(h).map(x=>x.trim()).filter(Boolean)}else c=e.trim().split(/\s+/).filter(Boolean);let l=t.children.filter(g=>g.tag==="arg"),d=new Set;for(let g of l.filter(h=>h.attrs.type==="flag")){let h=g.attrs.flag??`--${g.attrs.name}`,x=c.indexOf(h),S=g.attrs.name;S&&(x===-1?n.set(S,"false",void 0):(n.set(S,"true",void 0),d.add(x)))}let u=l.filter(g=>g.attrs.type!=="flag"),m=c.filter((g,h)=>!d.has(h)),p=0;for(let g=0;g<u.length;g++){let h=u[g],x=h.attrs.name,S=h.attrs.type??"string",_=g===u.length-1;if(x){if(p>=m.length){if(!("optional"in h.attrs))throw new ht(`Missing required argument '${x}' (type: ${S})`);n.set(x,"",void 0);continue}if(S==="string"&&_)n.set(x,m.slice(p).join(" "),void 0),p=m.length;else if(S==="number"){let P=m[p++],k=Number(P);if(isNaN(k))throw new ht(`Argument '${x}' expected a number, got '${P}'`);n.set(x,String(k),void 0)}else if(S==="boolean"){let P=m[p++].toLowerCase();if(P!=="true"&&P!=="false")throw new ht(`Argument '${x}' expected true/false, got '${P}'`);n.set(x,P,void 0)}else n.set(x,m[p++]??"",void 0)}}let f=m.slice(p).join(" ");if(f){if(i)throw new ht(`Unexpected extra arguments: '${f}'`);s&&n.set("_extra",f,void 0)}}var ht,Hs=N(()=>{"use strict";ht=class extends Error{constructor(e){super(e),this.name="WxpArgumentsError"}}});function hs(t,e,n){switch(t.position){case"project":return Ye.default.resolve(e,t.path);case"pkg":return Ye.default.resolve(n,t.path);case"absolute":return Ye.default.resolve(t.path)}}function Xs(t,e,n,r){let s=Ye.default.resolve(t),i=`${Ye.default.sep}.planning`;if(s.includes(`${i}${Ye.default.sep}`)||s.endsWith(i))return{ok:!1,reason:".planning/ files are never processed by WXP (hard security invariant)"};for(let o of e.untrustedPaths){let a=hs(o,n,r);if(s.startsWith(a+Ye.default.sep)||s===a)return{ok:!1,reason:`File '${t}' is in an explicitly untrusted path: ${a}`}}for(let o of e.trustedPaths){let a=hs(o,n,r);if(s.startsWith(a+Ye.default.sep)||s===a)return{ok:!0}}return{ok:!1,reason:`File '${t}' is not in a trusted WXP path.`}}function Yr(t,e){let n=Ye.default.basename(t);return e.shellBanlist.includes(n)?{ok:!1,reason:`Command '${n}' is explicitly banned by WXP security config.`}:e.shellAllowlist.includes(n)?{ok:!0}:{ok:!1,reason:`Command '${n}' is not in the WXP shell allowlist. Allowed: ${e.shellAllowlist.join(", ")}`}}var Ye,Jr,Yt=N(()=>{"use strict";Ye=W(require("path")),Jr=["pi-gsd-tools","git","node","cat","ls","echo","find"]});function ys(t,e){if(t.attrs.string!==void 0)return t.attrs.string;if(t.attrs.name!==void 0){let n=e.resolve(t.attrs.name)??"",r=t.attrs.wrap;return r?`${r}${n}${r}`:n}return t.attrs.value!==void 0?t.attrs.value:""}function Xr(t,e,n){let r=t.attrs.command??"",s=Yr(r,n);if(!s.ok)throw new yt(r,"",e.snapshot(),s.reason);let i=t.children.find(u=>u.tag==="args"),o=t.children.find(u=>u.tag==="outs"),a=i?i.children.filter(u=>u.tag==="arg").map(u=>ys(u,e)):[],c=o?o.children.some(u=>u.tag==="suppress-errors"):!1,l=o?o.children.filter(u=>u.tag==="out"&&u.attrs.name).map(u=>u.attrs.name):[],d="";try{d=(0,Hr.execFileSync)(r,a,{encoding:"utf8",timeout:n.shellTimeoutMs,windowsHide:!0}).trim()}catch(u){if(c){for(let f of l)e.set(f,"",void 0);return}let m=u,p=(m.stderr??m.message??String(u)).trim();throw new yt(r,p,e.snapshot(),`Shell '${r} ${a.join(" ")}' failed: ${p}`)}l.length>0&&e.set(l[0],d,void 0)}var Hr,yt,xs=N(()=>{"use strict";Hr=require("child_process");Yt();yt=class extends Error{constructor(n,r,s,i){super(i);this.command=n;this.stderr=r;this.variableSnapshot=s;this.name="WxpShellError"}command;stderr;variableSnapshot}});function Zr(t,e){if(t.attrs.op!=="split")throw new xt('<string-op> only op="split" is supported in v1');let r=t.children.find(m=>m.tag==="args"),s=t.children.find(m=>m.tag==="outs");if(!r||!s)throw new xt("<string-op> requires <args> and <outs>");let i=r.children.filter(m=>m.tag==="arg"),o=s.children.filter(m=>m.tag==="out"),a=i[0],c=i[1];if(!a)throw new xt('<string-op op="split"> requires at least 2 <arg> children');let l=ys(a,e);if(a.attrs.name&&e.get(a.attrs.name)===void 0)throw new xt(`string-op split: source variable '${a.attrs.name}' is not defined`);let d=c?ys(c,e):"",u=l.split(d);o.forEach((m,p)=>{let f=m.attrs.name;f&&e.set(f,u[p+1]??u[p]??"",void 0)})}var xt,Zs=N(()=>{"use strict";xs();xt=class extends Error{constructor(e){super(e),this.name="WxpStringOpError"}}});function Ss(t,e){return t.attrs.name?e.resolve(t.attrs.name)??"":t.attrs.value!==void 0?t.attrs.value:""}function Kr(t){return t.attrs.type==="number"}function Ta(t,e){let n=t.children.find(a=>a.tag==="left"),r=t.children.find(a=>a.tag==="right");if(!n||!r)return!1;if(Kr(n)||Kr(r)){let a=Number(Ss(n,e)),c=Number(Ss(r,e));switch(t.tag){case"equals":return a===c;case"not-equals":return a!==c;case"less-than":return a<c;case"greater-than":return a>c;case"less-than-or-equal":return a<=c;case"greater-than-or-equal":return a>=c;default:return!1}}let i=Ss(n,e),o=Ss(r,e);switch(t.tag){case"equals":return i===o;case"not-equals":return i!==o;case"starts-with":return i.startsWith(o);case"contains":return i.includes(o);case"less-than":return Number(i)<Number(o);case"greater-than":return Number(i)>Number(o);case"less-than-or-equal":return Number(i)<=Number(o);case"greater-than-or-equal":return Number(i)>=Number(o);default:return!1}}function Xt(t,e){return t.tag==="and"?t.children.filter(n=>Ht.has(n.tag)).every(n=>Xt(n,e)):t.tag==="or"?t.children.filter(n=>Ht.has(n.tag)).some(n=>Xt(n,e)):Ta(t,e)}function Qr(t,e){let n=t.children.find(s=>s.tag==="condition");if(!n)return!1;let r=n.children.find(s=>Ht.has(s.tag));return r?Xt(r,e):!1}function ei(t,e){let n=t.children.find(r=>Ht.has(r.tag));return n?Xt(n,e):!0}var Ia,Ht,ti=N(()=>{"use strict";Ia=new Set(["equals","not-equals","starts-with","contains","less-than","greater-than","less-than-or-equal","greater-than-or-equal"]),Ht=new Set([...Ia,"and","or"])});function Da(t,e,n){let r=(t.attrs.msg??"").replace(/\{([^}]+)\}/g,(i,o)=>e.resolve(o)??""),s=t.attrs.level;n.onDisplay(r,s==="warning"||s==="error"?s:"info")}function Oa(t,e){let n=t.attrs.src??"",r=t.attrs.out??"",s=t.attrs.path,i=e.get(n);if(i===void 0)throw new Error(`<json-parse>: source variable '${n}' is not defined`);let o;try{o=JSON.parse(i)}catch{throw new Error(`<json-parse>: '${n}' does not contain valid JSON`)}if(s){let a=s.replace(/^\$\.?/,"").split("."),c=o;for(let l of a){if(c===null||typeof c!="object")throw new Error(`<json-parse>: path '${s}' not found`);c=c[l]}o=c}Array.isArray(o)?e.setArray(r,o.map(a=>typeof a=="string"?a:JSON.stringify(a))):o!==null&&typeof o=="object"?e.set(r,JSON.stringify(o),void 0):e.set(r,o==null?"":String(o),void 0)}function Na(t,e){let n=t.attrs.path??"",r=t.attrs.out??"",s=Zt.default.readFileSync(Kt.default.resolve(n),"utf8");e.set(r,s,void 0)}function Wa(t,e,n){let r=t.attrs.path??"",s=t.attrs.src??"",i=Kt.default.resolve(r);if(Zt.default.existsSync(i))throw new Error(`<write-file>: '${r}' already exists (create-only, never overwrites)`);for(let a of n.config.trustedPaths){let c=hs(a,n.projectRoot,n.pkgRoot);if(i.startsWith(c+Kt.default.sep)||i===c)throw new Error(`<write-file>: cannot write to trusted harness path '${r}'`)}let o=e.get(s)??"";Zt.default.mkdirSync(Kt.default.dirname(i),{recursive:!0}),Zt.default.writeFileSync(i,o,"utf8")}function qa(t,e,n){let r=t.attrs.var??"",s=t.attrs.item??"",i=t.children.find(l=>l.tag==="where"),o=t.children.find(l=>l.tag==="sort-by"),a=t.children.filter(l=>l.tag!=="where"&&l.tag!=="sort-by"),c=e.getArray(r);if(c){if(i&&(c=c.filter(l=>(e.set(s,l,void 0),ei(i,e)))),o){let l=o.attrs.key??"",d=o.attrs.type??"string",u=o.attrs.order??"asc";c=[...c].sort((m,p)=>{e.set(s,m,void 0);let f=e.resolve(`${s}.${l}`)??e.resolve(l)??"";e.set(s,p,void 0);let g=e.resolve(`${s}.${l}`)??e.resolve(l)??"",h=d==="number"?Number(f)-Number(g):f.localeCompare(g);return u==="desc"?-h:h})}for(let l of c){e.set(s,l,void 0);for(let d of a)Ks(d,e,n)}}}function Ks(t,e,n){switch(t.tag){case"shell":Xr(t,e,n.config);break;case"string-op":Zr(t,e);break;case"json-parse":Oa(t,e);break;case"read-file":Na(t,e);break;case"write-file":Wa(t,e,n);break;case"display":Da(t,e,n);break;case"for-each":qa(t,e,n);break;case"if":{let r=Qr(t,e),s=t.children.find(a=>a.tag==="then"),i=t.children.find(a=>a.tag==="else"),o=r?s:i;if(o)for(let a of o.children)Ks(a,e,n);break}case"gsd-execute":Qs(t,e,n);break;default:break}}function Qs(t,e,n){try{for(let r of t.children)Ks(r,e,n)}catch(r){throw r instanceof yt||r instanceof Error?new bs(r,e.snapshot(),`Execution failed: ${r.message}`):r}}var Zt,Kt,bs,er=N(()=>{"use strict";Zt=W(require("fs")),Kt=W(require("path"));xs();Zs();ti();Yt();bs=class extends Error{constructor(n,r,s){super(s);this.cause=n;this.variableSnapshot=r;this.name="WxpExecutionError"}cause;variableSnapshot}});function ni(t,e){let n=ft(t),r=/<gsd-paste\s+name="([^"]+)"\s*\/>/g,s=[],i;for(;(i=r.exec(t))!==null;)gt(i.index,n)||s.push({index:i.index,full:i[0],name:i[1]});for(let a of s)if(e.get(a.name)===void 0)throw new vs(a.name,e.snapshot());let o=t;for(let a=s.length-1;a>=0;a--){let c=s[a],l=e.get(c.name);o=o.slice(0,c.index)+l+o.slice(c.index+c.full.length)}return o}var vs,tr=N(()=>{"use strict";Ys();vs=class extends Error{constructor(n,r){super(`<gsd-paste name="${n}" /> references undefined variable '${n}'`);this.variableName=n;this.variableSnapshot=r;this.name="WxpPasteError"}variableName;variableSnapshot}});function ri(t,e,n,r,s,i="",o=Ua){let a=Xs(e,n,r,s);if(!a.ok)throw new St(e,new Error(a.reason),{},[],[]);return Va(t,e,n,r,s,i,o)}function Va(t,e,n,r,s,i,o){let a=zr(),c=[],l=t,d={config:n,projectRoot:r,pkgRoot:s,onDisplay:o};for(let u=0;u<La;u++){let p=Jt(l).filter(g=>g.node.tag!=="gsd-version");if(p.length===0)break;let f=p.map(g=>g.node.tag);try{let g=!1;for(let x of Jt(l)){if(x.node.tag!=="gsd-include"||gt(x.start,ft(l)))continue;let S=x.node.attrs.path;if(!S)continue;let _=Qt.default.resolve(Qt.default.dirname(e),S),P=Xs(_,n,r,s);if(!P.ok)throw new Error(`Include rejected: ${P.reason}`);let k=si.default.readFileSync(_,"utf8"),C=Qt.default.basename(_,Qt.default.extname(_));for(let $ of x.node.children)if($.tag==="gsd-arguments")for(let q of $.children.filter(O=>O.tag==="arg")){let O=q.attrs.name,U=q.attrs.as;if(O&&U){let Y=a.get(O);Y!==void 0&&a.set(U,Y,C)}}let L="include-arguments"in x.node.attrs?`
339
+ ${i}`:"";l=gs(l,x.start,x.end,k+L),c.push("gsd-include"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-arguments"&&!gt(x.start,ft(l))){Gr(x.node,i,a),l=gs(l,x.start,x.end,""),c.push("gsd-arguments"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-execute"&&!gt(x.start,ft(l))){Qs(x.node,a,d),l=gs(l,x.start,x.end,""),c.push("gsd-execute"),g=!0;break}if(g)continue;let h=ni(l,a);if(h!==l){l=h,c.push("gsd-paste");continue}break}catch(g){if(g instanceof St)throw g;let h=g instanceof Error?g:new Error(String(g));throw new St(e,h,a.snapshot(),f,c)}}return l}var si,Qt,La,Ua,St,ii=N(()=>{"use strict";si=W(require("fs")),Qt=W(require("path"));Ys();Br();Hs();er();tr();Yt();er();xs();tr();Zs();Hs();La=50,Ua=()=>{},St=class extends Error{constructor(n,r,s,i,o){super(["WXP Processing Error",`File: ${n}`,`Error: ${r.message}`,`Variable Namespace: ${JSON.stringify(s,null,2)}`,`Pending Operations: [${i.join(", ")}]`,`Completed Operations: [${o.join(", ")}]`].join(`
340
+ `));this.filePath=n;this.cause=r;this.variableSnapshot=s;this.pendingOperations=i;this.completedOperations=o;this.name="WxpProcessingError"}filePath;cause;variableSnapshot;pendingOperations;completedOperations}});var bt,oi,nr,_s,ai=N(()=>{"use strict";bt=require("@oclif/core"),oi=require("@oclif/core"),nr=W(require("path"));ii();Yt();_s=class t extends oi.Command{static description="Process WXP tags in a workflow file";static args={file:bt.Args.string({description:"File to process",required:!1})};static flags={input:bt.Flags.string({description:"Input content string (alternative to file)"}),arguments:bt.Flags.string({description:"Raw $ARGUMENTS string",default:""}),"project-root":bt.Flags.string({description:"Project root directory",default:process.cwd()}),"pkg-root":bt.Flags.string({description:"Package root directory",default:process.cwd()})};async run(){let{flags:e,args:n}=await this.parse(t),r,s;if(e.input!==void 0)r=e.input,s=nr.default.join(e["project-root"],".pi","gsd","workflows","_inline.md");else if(n.file){let o=await import("fs");s=nr.default.resolve(n.file),r=o.default.readFileSync(s,"utf8")}else{this.error("Provide a file argument or --input string");return}let i={trustedPaths:[{position:"project",path:".pi/gsd"},{position:"pkg",path:".gsd/harnesses/pi/get-shit-done"}],untrustedPaths:[],shellAllowlist:[...Jr],shellBanlist:[],shellTimeoutMs:3e4};try{let o=ri(r,s,i,e["project-root"],e["pkg-root"],e.arguments);process.stdout.write(o)}catch(o){throw o instanceof St&&this.error(o.message,{exit:1}),o}}}});var ci={};he(ci,{AuditUatCommand:()=>Jn,CommitCommand:()=>ss,ConfigEnsureSectionCommand:()=>En,ConfigGetCommand:()=>$n,ConfigNewProjectCommand:()=>Rn,ConfigSetCommand:()=>An,ConfigSetModelProfileCommand:()=>jn,FrontmatterGetCommand:()=>rs,FrontmatterMergeCommand:()=>os,FrontmatterSetCommand:()=>is,InitCommand:()=>vn,MilestoneCompleteCommand:()=>qn,PhaseAddCommand:()=>Mn,PhaseCompleteCommand:()=>Dn,PhaseInsertCommand:()=>In,PhaseNextDecimalCommand:()=>Fn,PhasePlanIndexCommand:()=>On,PhaseRemoveCommand:()=>Tn,ProgressCommand:()=>ds,RequirementsMarkCompleteCommand:()=>Ln,RoadmapAnalyzeCommand:()=>kn,RoadmapGetPhaseCommand:()=>Pn,RoadmapUpdatePlanProgressCommand:()=>Cn,ScaffoldCommand:()=>ts,StateAdvancePlanCommand:()=>gn,StateGetCommand:()=>mn,StateJsonCommand:()=>un,StateLoadCommand:()=>hn,StatePatchCommand:()=>fn,StateUpdateCommand:()=>pn,StateUpdateProgressCommand:()=>yn,StatsCommand:()=>us,SummaryExtractCommand:()=>fs,TemplateFillCommand:()=>ls,TemplateSelectCommand:()=>cs,TodoCompleteCommand:()=>ms,TodoMatchPhaseCommand:()=>ps,ValidateAgentsCommand:()=>Bn,ValidateConsistencyCommand:()=>Vn,ValidateHealthCommand:()=>zn,VerifyCommand:()=>Gn,WorkstreamCompleteCommand:()=>Zn,WorkstreamCreateCommand:()=>Yn,WorkstreamGetCommand:()=>Qn,WorkstreamListCommand:()=>Hn,WorkstreamProgressCommand:()=>es,WorkstreamSetCommand:()=>Kn,WorkstreamStatusCommand:()=>Xn,WxpProcessCommand:()=>_s});var li=N(()=>{"use strict";br();_r();kr();Ar();jr();Rr();Dr();Or();Nr();Wr();qr();Lr();Ur();ai()});var ws={};he(ws,{cmdExtractMessages:()=>Ya,cmdProfileSample:()=>Ha,cmdScanSessions:()=>Ja});function sr(t){if(t)return t;let e=process.env.HOME??"",n=Ie.join(e,".agent","projects");return ee.existsSync(n)?n:Ie.join(e,".claude","projects")}function rr(){let t=process.env.HOME??"";return Ie.join(t,".pi","agent","sessions")}function ir(t){return t.startsWith("--")&&t.endsWith("--")?"/"+t.slice(2,-2).replace(/-/g,"/"):t}function za(t){try{let e=ee.readFileSync(t,"utf-8").split(`
341
+ `).find(r=>r.trim().length>0);if(!e)return!1;let n=JSON.parse(e);return n.type==="session"&&"version"in n}catch{return!1}}function Ba(t){return typeof t=="string"?t:Array.isArray(t)?t.filter(e=>e!==null&&typeof e=="object"&&e.type==="text").map(e=>String(e.text??"")).join(" "):""}function Ga(t){try{let e=ee.readFileSync(t,"utf-8").split(`
342
+ `).filter(Boolean),n=[];for(let r of e)try{let s=JSON.parse(r);s.type==="message"&&s.message&&n.push(s)}catch{}return n}catch{return[]}}async function Ja(t,e,n){let s=(e.harness??null)==="pi",i=rr(),o=ee.existsSync(i),a=[];if(o)try{let m=ee.readdirSync(i,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=Ie.join(i,p.name),g=ee.readdirSync(f).filter(h=>h.endsWith(".jsonl"));a.push({name:p.name,sessions:g.length,path:f,source:"pi",cwd:ir(p.name)})}}catch{}let c=sr(s&&!t?null:t),l=!s||t?ee.existsSync(c):!1,d=[];if(l&&(!s||t))try{let m=ee.readdirSync(c,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=Ie.join(c,p.name),g=ee.readdirSync(f).filter(h=>h.endsWith(".jsonl")||h.endsWith(".json"));d.push({name:p.name,sessions:g.length,path:f,source:"claude"})}}catch{}let u=s?[...a,...d]:[...d,...a];if(u.length===0){let m=[];o?m.push(i):m.push(i+" (not found)"),s||m.push(l?c:c+" (not found)"),y({available:!1,reason:`No sessions found. Searched: ${m.join(", ")}`,projects:[],count:0},n);return}y({available:!0,pi_base:o?i:null,claude_base:l?c:null,projects:u,count:u.length},n)}async function Ya(t,e,n,r){let s=rr(),i=null,o="claude";if(ee.existsSync(s)){let d=Ie.join(s,t);if(ee.existsSync(d))i=d,o="pi";else try{let u=ee.readdirSync(s,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of u){let p=ir(m.name);if(p.endsWith("/"+t)||p===t||m.name===t){i=Ie.join(s,m.name),o="pi";break}}}catch{}}if(!i){let d=sr(r),u=Ie.join(d,t);ee.existsSync(u)&&(i=u,o="claude")}if(!i){y({error:`Project not found: ${t}`,available_projects:[]},n);return}let a=[],c=ee.readdirSync(i).filter(d=>d.endsWith(".jsonl")),l=e.limit??null;for(let d of c){if(e.sessionId&&!d.includes(e.sessionId))continue;let u=Ie.join(i,d);if(o==="pi"||za(u))try{let m=ee.readFileSync(u,"utf-8").split(`
343
+ `).filter(Boolean);for(let p of m)try{let f=JSON.parse(p);if(f.type==="message"&&f.message&&(a.push(f.message),l&&a.length>=l))break}catch{}}catch{}else try{let m=ee.readFileSync(u,"utf-8").split(`
344
+ `).filter(Boolean);for(let p of m)try{let f=JSON.parse(p);if(a.push(f),l&&a.length>=l)break}catch{}}catch{}if(l&&a.length>=l)break}y({project:t,source:o,messages:a,count:a.length},n)}async function Ha(t,e,n){let s=(e.harness??null)==="pi",i=e.limit??150,o=e.maxChars??500,a=[],c=rr();if(ee.existsSync(c))try{let d=ee.readdirSync(c,{withFileTypes:!0}).filter(u=>u.isDirectory());e:for(let u of d){let m=Ie.join(c,u.name),p=ee.readdirSync(m).filter(g=>g.endsWith(".jsonl")),f=0;for(let g of p){let h=Ga(Ie.join(m,g));for(let x of h)if(x.message?.role==="user"){let S=Ba(x.message.content).slice(0,o);if(S.length>20){if(a.push({project:ir(u.name),text:S,source:"pi"}),f++,e.maxPerProject&&f>=e.maxPerProject)break;if(a.length>=i)break e}}}}}catch{}if(!(s&&!t&&a.length>=i)){let d=sr(t);if(ee.existsSync(d))try{let u=ee.readdirSync(d,{withFileTypes:!0}).filter(m=>m.isDirectory());e:for(let m of u){let p=Ie.join(d,m.name),f=ee.readdirSync(p).filter(h=>h.endsWith(".jsonl")),g=0;for(let h of f)try{let x=ee.readFileSync(Ie.join(p,h),"utf-8").split(`
345
+ `).filter(Boolean);for(let S of x)try{let _=JSON.parse(S);if(_.role==="human"||_.type==="human"){let P=(_.content||_.message||"").slice(0,o);if(P.length>20){if(a.push({project:m.name,text:P,source:"claude"}),g++,e.maxPerProject&&g>=e.maxPerProject)break;if(a.length>=i)break e}}}catch{}}catch{}}}catch{}}if(a.length===0){y({available:!1,reason:"No user messages found in any session",samples:[],count:0},n);return}y({available:!0,samples:a,count:a.length},n)}var ee,Ie,ks=N(()=>{"use strict";ge();ee=require("fs"),Ie=require("path")});var Ft={};he(Ft,{cmdGenerateClaudeMd:()=>tc,cmdGenerateClaudeProfile:()=>ec,cmdGenerateDevPreferences:()=>Qa,cmdProfileQuestionnaire:()=>Ka,cmdWriteProfile:()=>Za});function Ps(t,e,n="CLAUDE.md"){return e?Ne.default.resolve(e):Ne.default.join(t,n)}function or(t,e){if(!t)return null;let n=Ne.default.isAbsolute(t)?t:Ne.default.join(e,t);if(!nt.default.existsSync(n))return null;try{return JSON.parse(nt.default.readFileSync(n,"utf-8"))}catch{return null}}function Xa(t){return t.map(e=>`## ${e.heading}
342
346
 
343
347
  ${e.body}`).join(`
344
348
 
345
349
  `)+`
346
- `}function Qi(n,e,s){e.input||S("--input <analysis-json-path> is required");let i=Xt(e.input,n);if(!i){h({error:"Could not load analysis file",input:e.input},s);return}let t=Et(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?Zi(r):JSON.stringify(i,null,2)+`
347
- `;Ve.default.writeFileSync(t,o,"utf-8"),h({written:!0,path:V(Ee.default.relative(n,t))},s,t)}function Xi(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);h({questionnaire:s,answers:i,complete:!0},e)}catch{h({questionnaire:s,answers:null,complete:!1},e)}else h({questionnaire:s,instructions:`Re-run with --answers '{"style":"...","testing":"..."}' to record preferences`},e)}function er(n,e,s){let i=Xt(e.analysis,n),t=Et(n,e.output,".dev-preferences.md"),r=e.stack?`
350
+ `}function Za(t,e,n){e.input||b("--input <analysis-json-path> is required");let r=or(e.input,t);if(!r){y({error:"Could not load analysis file",input:e.input},n);return}let s=Ps(t,e.output),i=[];r.preferences&&i.push({heading:"Development Preferences",body:r.preferences}),r.patterns&&i.push({heading:"Patterns Observed",body:r.patterns}),r.style&&i.push({heading:"Code Style",body:r.style});let o=i.length>0?Xa(i):JSON.stringify(r,null,2)+`
351
+ `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:B(Ne.default.relative(t,s))},n,s)}function Ka(t,e){let n=[{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(t.answers)try{let r=JSON.parse(t.answers);y({questionnaire:n,answers:r,complete:!0},e)}catch{y({questionnaire:n,answers:null,complete:!1},e)}else y({questionnaire:n,instructions:`Re-run with --answers '{"style":"...","testing":"..."}' to record preferences`},e)}function Qa(t,e,n){let r=or(e.analysis,t),s=Ps(t,e.output,".dev-preferences.md"),i=e.stack?`
348
352
 
349
353
  ## Stack
350
354
 
351
- ${e.stack}`:"",o=i?`# Developer Preferences
355
+ ${e.stack}`:"",o=r?`# Developer Preferences
352
356
 
353
- *Generated from session analysis*${r}
357
+ *Generated from session analysis*${i}
354
358
 
355
- ${JSON.stringify(i,null,2)}
359
+ ${JSON.stringify(r,null,2)}
356
360
  `:`# Developer Preferences
357
361
 
358
- *No analysis provided - edit manually.*${r}
359
- `;Ve.default.writeFileSync(t,o,"utf-8"),h({written:!0,path:V(Ee.default.relative(n,t))},s,t)}function tr(n,e,s){let i=Xt(e.analysis,n),t=e.global?Ee.default.join(process.env.HOME??"",".claude","CLAUDE.md"):Et(n,e.output,"CLAUDE.md");Ve.default.mkdirSync(Ee.default.dirname(t),{recursive:!0});let r=i?`# Claude Profile
362
+ *No analysis provided - edit manually.*${i}
363
+ `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:B(Ne.default.relative(t,s))},n,s)}function ec(t,e,n){let r=or(e.analysis,t),s=e.global?Ne.default.join(process.env.HOME??"",".claude","CLAUDE.md"):Ps(t,e.output,"CLAUDE.md");nt.default.mkdirSync(Ne.default.dirname(s),{recursive:!0});let i=r?`# Claude Profile
360
364
 
361
365
  *Generated from session analysis*
362
366
 
363
- ${JSON.stringify(i,null,2)}
367
+ ${JSON.stringify(r,null,2)}
364
368
  `:`# Claude Profile
365
369
 
366
370
  *No analysis provided - edit manually.*
367
- `;Ve.default.writeFileSync(t,r,"utf-8"),h({written:!0,path:e.global?t:V(Ee.default.relative(n,t))},s,t)}function nr(n,e,s){let i=e.harness==="pi"?"AGENTS.md":"CLAUDE.md",t=Et(n,e.output,i);if(Ve.default.existsSync(t)&&!e.force&&!e.auto){h({written:!1,reason:"File already exists. Use --force to overwrite.",path:V(Ee.default.relative(n,t))},s,"exists");return}let o=`# ${e.harness==="pi"?"AGENTS.md":"CLAUDE.md"}
371
+ `;nt.default.writeFileSync(s,i,"utf-8"),y({written:!0,path:e.global?s:B(Ne.default.relative(t,s))},n,s)}function tc(t,e,n){let r=e.harness==="pi"?"AGENTS.md":"CLAUDE.md",s=Ps(t,e.output,r);if(nt.default.existsSync(s)&&!e.force&&!e.auto){y({written:!1,reason:"File already exists. Use --force to overwrite.",path:B(Ne.default.relative(t,s))},n,"exists");return}let o=`# ${e.harness==="pi"?"AGENTS.md":"CLAUDE.md"}
368
372
 
369
373
  *Agent profile for this project.*
370
374
 
@@ -375,9 +379,8 @@ See \`.planning/PROJECT.md\` for project overview.
375
379
  ## GSD Integration
376
380
 
377
381
  This project uses GSD (Get Shit Done) for structured development. Run \`/gsd-help\` to see available commands.
378
- `;Ve.default.writeFileSync(t,o,"utf-8"),h({written:!0,path:V(Ee.default.relative(n,t))},s,t)}var Ve,Ee,st=le(()=>{"use strict";Ve=q(require("fs")),Ee=q(require("path"));pe()});var wn={};fe(wn,{cmdWorkstreamComplete:()=>ar,cmdWorkstreamCreate:()=>ir,cmdWorkstreamGet:()=>cr,cmdWorkstreamList:()=>rr,cmdWorkstreamProgress:()=>ur,cmdWorkstreamSet:()=>lr,cmdWorkstreamStatus:()=>or});function sr(n,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let s=H(n),i=F.default.join(s,"workstreams",e);if(M.default.existsSync(F.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"}];M.default.mkdirSync(i,{recursive:!0});let r=[];try{for(let o of t){let a=F.default.join(s,o.name);M.default.existsSync(a)&&(M.default.renameSync(a,F.default.join(i,o.name)),r.push(o.name))}}catch(o){for(let a of r)try{M.default.renameSync(F.default.join(i,a),F.default.join(s,a))}catch{}try{M.default.rmSync(i,{recursive:!0})}catch{}try{M.default.rmdirSync(F.default.join(s,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:r}}function ir(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=H(n);M.default.existsSync(r)||S(".planning/ directory not found - run /gsd-new-project first");let o=F.default.join(r,"workstreams"),a=F.default.join(o,t);if(M.default.existsSync(a)&&M.default.existsSync(F.default.join(a,"STATE.md"))){h({created:!1,error:"already_exists",workstream:t,path:V(F.default.relative(n,a))},i);return}let l=!M.default.existsSync(o),c=null;if(l&&s.migrate!==!1)if(M.default.existsSync(F.default.join(r,"ROADMAP.md"))||M.default.existsSync(F.default.join(r,"STATE.md"))||M.default.existsSync(F.default.join(r,"phases"))){let y=s.migrateName??null,g;if(y)g=y;else try{let _=ie(n);g=De(_.name)||"default"}catch{g="default"}try{c=sr(n,g)}catch(_){h({created:!1,error:"migration_failed",message:_.message},i);return}}else M.default.mkdirSync(o,{recursive:!0});M.default.mkdirSync(a,{recursive:!0}),M.default.mkdirSync(F.default.join(a,"phases"),{recursive:!0});let u=new Date().toISOString().split("T")[0],d=["---",`workstream: ${t}`,`created: ${u}`,"---","","# Project State","","## Current Position","**Status:** Not started","**Current Phase:** None",`**Last Activity:** ${u}`,"**Last Activity Description:** Workstream created","","## Progress","**Phases Complete:** 0","**Current Plan:** N/A","","## Session Continuity","**Stopped At:** N/A","**Resume File:** None",""].join(`
379
- `),f=F.default.join(a,"STATE.md");M.default.existsSync(f)||M.default.writeFileSync(f,d,"utf-8"),Ke(n,t);let m=V(F.default.relative(n,a));h({created:!0,workstream:t,path:m,state_path:m+"/STATE.md",phases_path:m+"/phases",migration:c??null,active:!0},i)}function rr(n,e){let s=F.default.join(H(n),"workstreams");if(!M.default.existsSync(s)){h({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let i=[];for(let t of M.default.readdirSync(s,{withFileTypes:!0}).filter(r=>r.isDirectory())){let r=F.default.join(s,t.name),o=F.default.join(r,"phases"),a=Oe(o),l=0;for(let d of a)try{let f=M.default.readdirSync(F.default.join(o,d)),m=at(f),p=lt(f);m.length>0&&p.length>=m.length&&l++}catch{}let c="unknown",u=null;try{let d=M.default.readFileSync(F.default.join(r,"STATE.md"),"utf-8");c=B(d,"Status")||"unknown",u=B(d,"Current Phase")}catch{}i.push({name:t.name,path:V(F.default.relative(n,r)),has_roadmap:M.default.existsSync(F.default.join(r,"ROADMAP.md")),has_state:M.default.existsSync(F.default.join(r,"STATE.md")),status:c,current_phase:u,phase_count:a.length,completed_phases:l})}h({mode:"workstream",workstreams:i,count:i.length},e)}function or(n,e,s){e||S("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&S("Invalid workstream name");let i=F.default.join(H(n),"workstreams",e);if(!M.default.existsSync(i)){h({found:!1,workstream:e},s);return}let t=R(n,e),r={roadmap:M.default.existsSync(t.roadmap),state:M.default.existsSync(t.state),requirements:M.default.existsSync(t.requirements)},o=[];for(let l of Oe(t.phases).sort())try{let c=M.default.readdirSync(F.default.join(t.phases,l)),u=at(c),d=lt(c);o.push({directory:l,status:d.length>=u.length&&u.length>0?"complete":u.length>0?"in_progress":"pending",plan_count:u.length,summary_count:d.length})}catch{}let a={status:"unknown",current_phase:null,last_activity:null};try{let l=M.default.readFileSync(t.state,"utf-8");a={status:B(l,"Status")||"unknown",current_phase:B(l,"Current Phase"),last_activity:B(l,"Last Activity")}}catch{}h({found:!0,workstream:e,path:V(F.default.relative(n,i)),files:r,phases:o,phase_count:o.length,completed_phases:o.filter(l=>l.status==="complete").length,...a},s)}function ar(n,e,s,i){e||S("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&S("Invalid workstream name");let t=H(n),r=F.default.join(t,"workstreams"),o=F.default.join(r,e);if(!M.default.existsSync(o)){h({completed:!1,error:"not_found",workstream:e},i);return}let a=Ye(n);a===e&&Ke(n,null);let l=F.default.join(t,"milestones"),c=new Date().toISOString().split("T")[0],u=F.default.join(l,`ws-${e}-${c}`),d=1;for(;M.default.existsSync(u);)u=F.default.join(l,`ws-${e}-${c}-${d++}`);M.default.mkdirSync(u,{recursive:!0});let f=[];try{for(let p of M.default.readdirSync(o,{withFileTypes:!0}))M.default.renameSync(F.default.join(o,p.name),F.default.join(u,p.name)),f.push(p.name)}catch(p){for(let y of f)try{M.default.renameSync(F.default.join(u,y),F.default.join(o,y))}catch{}try{M.default.rmSync(u,{recursive:!0})}catch{}a===e&&Ke(n,e),h({completed:!1,error:"archive_failed",message:p.message,workstream:e},i);return}try{M.default.rmdirSync(o)}catch{}let m=0;try{m=M.default.readdirSync(r,{withFileTypes:!0}).filter(p=>p.isDirectory()).length,m===0&&M.default.rmdirSync(r)}catch{}h({completed:!0,workstream:e,archived_to:V(F.default.relative(n,u)),remaining_workstreams:m,reverted_to_flat:m===0},i)}function lr(n,e,s){if(!e){Ke(n,null),h({active:null,cleared:!0},s);return}if(!/^[a-zA-Z0-9_-]+$/.test(e)){h({active:null,error:"invalid_name",message:"Workstream name must be alphanumeric, hyphens, and underscores only"},s);return}let i=F.default.join(H(n),"workstreams",e);if(!M.default.existsSync(i)){h({active:null,error:"not_found",workstream:e},s);return}Ke(n,e),h({active:e,set:!0},s,e)}function cr(n,e){let s=Ye(n),i=F.default.join(H(n),"workstreams");h({active:s,mode:M.default.existsSync(i)?"workstream":"flat"},e,s||"none")}function ur(n,e){let s=H(n),i=F.default.join(s,"workstreams");if(!M.default.existsSync(i)){h({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let t=Ye(n),r=[];for(let o of M.default.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=F.default.join(i,o.name),l=F.default.join(a,"phases"),c=Oe(l),u=0,d=0,f=0;for(let g of c)try{let _=M.default.readdirSync(F.default.join(l,g)),x=at(_),v=lt(_);d+=x.length,f+=Math.min(v.length,x.length),x.length>0&&v.length>=x.length&&u++}catch{}let m=c.length;try{let _=M.default.readFileSync(F.default.join(a,"ROADMAP.md"),"utf-8").match(/^###?\s+Phase\s+\d/gm);_&&(m=_.length)}catch{}let p="unknown",y=null;try{let g=M.default.readFileSync(F.default.join(a,"STATE.md"),"utf-8");p=B(g,"Status")||"unknown",y=B(g,"Current Phase")}catch{}r.push({name:o.name,active:o.name===t,status:p,current_phase:y,phases:`${u}/${m}`,plans:`${f}/${d}`,progress_percent:m>0?Math.round(u/m*100):0})}h({mode:"workstream",active:t,workstreams:r,count:r.length},e)}var M,F,Mn=le(()=>{"use strict";M=q(require("fs")),F=q(require("path"));pe();Je()});var Ce=q(require("fs")),it=q(require("path"));pe();var cn=require("jsonpath-plus");function un(n,e,s){let i=n;if(s&&(i=(0,cn.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 xe(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 Fn(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 dr(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 mr(){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=it.default.resolve(_)}else if(i!==-1){let _=n[i+1];(!_||_.startsWith("--"))&&S("Missing value for --cwd"),n.splice(i,2),e=it.default.resolve(_)}if((!Ce.default.existsSync(e)||!Ce.default.statSync(e).isDirectory())&&S(`Invalid --cwd: ${e}`),!Ce.default.existsSync(it.default.join(e,".planning"))){let _=ln(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=Ye(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",u=n.findIndex(_=>_==="--output"||_==="-o");if(u!==-1){let _=n[u+1];(!_||_.startsWith("--"))&&S("Missing value for --output"),_!=="json"&&_!=="toon"&&S('--output must be "json" or "toon"'),c=_,n.splice(u,2)}let d=null,f=n.findIndex(_=>_==="--pick"||_==="-p");f!==-1&&(d=n[f+1],(!d||d.startsWith("--"))&&S("Missing value for --pick"),n.splice(f,2));let m=n.indexOf("--pick"),p=null;m!==-1&&(p=n[m+1],(!p||p.startsWith("--"))&&S("Missing value for --pick"),n.splice(m,2));let y=n[0];if(y||S(`Usage: pi-gsd-tools <command> [args] [--raw] [--output json|toon] [--pick <path>] [--cwd <path>] [--ws <name>]
380
- 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=an(e)),p||d||c!=="json"){let _=Ce.default.writeSync.bind(Ce.default),x=[];Ce.default.writeSync=($,k,...P)=>$===1?(x.push(String(k)),String(k).length):_($,k,...P);let v=()=>{Ce.default.writeSync=_;let $=x.join(""),k=$;k.startsWith("@file:")&&(k=Ce.default.readFileSync(k.slice(6),"utf-8"));try{let P=JSON.parse(k),T=P;p&&(T=dr(P,p)??"");let A=un(T,c,d??void 0);_(1,A)}catch{_(1,$)}};try{await In(y,n,e,l),v()}catch($){throw Ce.default.writeSync=_,$}return}await In(y,n,e,l)}async function In(n,e,s,i){switch(n){case"state":{let t=await Promise.resolve().then(()=>(Je(),Ut)),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:u}=xe(e,["phase","plan","duration","tasks","files"]);t.cmdStateRecordMetric(s,{phase:o,plan:a,duration:l,tasks:c,files:u},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":u}=xe(e,["phase","summary","summary-file","rationale","rationale-file"]);t.cmdStateAddDecision(s,{phase:o,summary:a,summary_file:l,rationale:c||"",rationale_file:u},i)}else if(r==="add-blocker"){let{text:o,"text-file":a}=xe(e,["text","text-file"]);t.cmdStateAddBlocker(s,{text:o,text_file:a},i)}else if(r==="resolve-blocker")t.cmdStateResolveBlocker(s,xe(e,["text"]).text,i);else if(r==="record-session"){let{"stopped-at":o,"resume-file":a}=xe(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}=xe(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}=xe(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(()=>(ye(),ge));t(s,e[1],i);break}case"find-phase":{let{cmdFindPhase:t}=await Promise.resolve().then(()=>(dt(),ut));t(s,e[1],i);break}case"commit":{let{cmdCommit:t}=await Promise.resolve().then(()=>(ye(),ge)),r=e.includes("--amend"),o=e.includes("--no-verify"),a=e.indexOf("--files"),l=a!==-1?a:e.length,u=e.slice(1,l).filter(f=>!f.startsWith("--")).join(" ")||void 0,d=a!==-1?e.slice(a+1).filter(f=>!f.startsWith("--")):[];t(s,u,d,i,r,o);break}case"commit-to-subrepo":{let{cmdCommitToSubrepo:t}=await Promise.resolve().then(()=>(ye(),ge)),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(()=>($t(),Pt)),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(()=>(bn(),_n)),o=e[1];if(o==="select")t(s,e[2],i);else if(o==="fill"){let a=e[2],{phase:l,plan:c,name:u,type:d,wave:f,fields:m}=xe(e,["phase","plan","name","type","wave","fields"]),p={};if(m){let{safeJsonParse:y}=await Promise.resolve().then(()=>(ct(),fn)),g=y(m,{label:"--fields"});g.ok||S(g.error),p=g.value}r(s,a,{phase:l,plan:c,name:u,fields:p,type:d||"execute",wave:f||"1"},i)}else S("Unknown template subcommand. Available: select, fill");break}case"frontmatter":{let t=await Promise.resolve().then(()=>(Le(),dn)),r=e[1],o=e[2];if(r==="get")t.cmdFrontmatterGet(s,o,xe(e,["field"]).field,i);else if(r==="set"){let{field:a,value:l}=xe(e,["field","value"]);t.cmdFrontmatterSet(s,o,a??void 0,l??void 0,i)}else r==="merge"?t.cmdFrontmatterMerge(s,o,xe(e,["data"]).data??void 0,i):r==="validate"?t.cmdFrontmatterValidate(s,o,xe(e,["schema"]).schema??void 0,i):S("Unknown frontmatter subcommand. Available: get, set, merge, validate");break}case"verify":{let t=await Promise.resolve().then(()=>($t(),Pt)),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(()=>(ye(),ge));t(e[1],i);break}case"current-timestamp":{let{cmdCurrentTimestamp:t}=await Promise.resolve().then(()=>(ye(),ge));t(e[1]||"full",i);break}case"list-todos":{let{cmdListTodos:t}=await Promise.resolve().then(()=>(ye(),ge));t(s,e[1],i);break}case"verify-path-exists":{let{cmdVerifyPathExists:t}=await Promise.resolve().then(()=>(ye(),ge));t(s,e[1],i);break}case"config-ensure-section":{let{cmdConfigEnsureSection:t}=await Promise.resolve().then(()=>(tt(),et));t(s,i);break}case"config-set":{let{cmdConfigSet:t}=await Promise.resolve().then(()=>(tt(),et));t(s,e[1],e[2],i);break}case"config-set-model-profile":{let{cmdConfigSetModelProfile:t}=await Promise.resolve().then(()=>(tt(),et));t(s,e[1],i);break}case"config-get":{let{cmdConfigGet:t}=await Promise.resolve().then(()=>(tt(),et));t(s,e[1],i);break}case"config-new-project":{let{cmdConfigNewProject:t}=await Promise.resolve().then(()=>(tt(),et));t(s,e[1],i);break}case"agent-skills":{let{cmdAgentSkills:t}=await Promise.resolve().then(()=>(Bt(),Vt));t(s,e[1],i);break}case"history-digest":{let{cmdHistoryDigest:t}=await Promise.resolve().then(()=>(ye(),ge));t(s,i);break}case"phases":{let{cmdPhasesList:t}=await Promise.resolve().then(()=>(dt(),ut));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(()=>(jn(),An)),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(()=>(Jt(),Gt));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(),ut)),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(()=>(Jt(),Gt));if(e[1]==="complete"){let r=Fn(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(()=>($t(),Pt)),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(()=>(ye(),ge));t(s,e[1]||"json",i);break}case"audit-uat":{let{cmdAuditUat:t}=await Promise.resolve().then(()=>(Yt(),Ht));t(s,i);break}case"uat":{let t=await Promise.resolve().then(()=>(Yt(),Ht));e[1]==="render-checkpoint"?t.cmdRenderCheckpoint(s,xe(e,["file"]),i):S("Unknown uat subcommand. Available: render-checkpoint");break}case"stats":{let{cmdStats:t}=await Promise.resolve().then(()=>(ye(),ge));t(s,e[1]||"json",i);break}case"todo":{let t=e[1];if(t==="complete"){let{cmdTodoComplete:r}=await Promise.resolve().then(()=>(ye(),ge));r(s,e[2],i)}else if(t==="match-phase"){let{cmdTodoMatchPhase:r}=await Promise.resolve().then(()=>(ye(),ge));r(s,e[2],i)}else S("Unknown todo subcommand. Available: complete, match-phase");break}case"scaffold":{let{cmdScaffold:t}=await Promise.resolve().then(()=>(ye(),ge));t(s,e[1],{phase:xe(e,["phase"]).phase,name:Fn(e,"name")},i);break}case"init":{let t=await Promise.resolve().then(()=>(Bt(),Vt)),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}
381
- 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(),ut));t(s,e[1],i);break}case"state-snapshot":{let{cmdStateSnapshot:t}=await Promise.resolve().then(()=>(Je(),Ut));t(s,i);break}case"summary-extract":{let{cmdSummaryExtract:t}=await Promise.resolve().then(()=>(ye(),ge)),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(()=>(ye(),ge)),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(()=>(Rt(),jt)),r=e.indexOf("--path"),o=e.indexOf("--harness");await t(r!==-1?e[r+1]:null,{verbose:e.includes("--verbose"),json:e.includes("--json"),harness:o!==-1?e[o+1]:null},i);break}case"extract-messages":{let{cmdExtractMessages:t}=await Promise.resolve().then(()=>(Rt(),jt)),r=e.indexOf("--session"),o=e.indexOf("--limit"),a=e.indexOf("--path"),l=c=>c.startsWith("--")&&c.endsWith("--")&&c.length>4;(!e[1]||e[1].startsWith("--")&&!l(e[1]))&&S("Usage: pi-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(()=>(Rt(),jt)),r=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),l=e.indexOf("--max-chars"),c=e.indexOf("--harness");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,harness:c!==-1?e[c+1]:null,maxChars:l!==-1?parseInt(e[l+1],10):500},i);break}case"write-profile":{let{cmdWriteProfile:t}=await Promise.resolve().then(()=>(st(),nt)),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(()=>(st(),nt)),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(()=>(st(),nt)),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(()=>(st(),nt)),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(()=>(st(),nt)),r=e.indexOf("--output"),o=e.indexOf("--harness");t(s,{output:r!==-1?e[r+1]:null,auto:e.includes("--auto"),force:e.includes("--force"),harness:o!==-1?e[o+1]:null},i);break}case"workstream":{let t=await Promise.resolve().then(()=>(Mn(),wn)),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}=await Promise.resolve().then(()=>(rt(),sn)),r=e.indexOf("--output"),o=e.includes("--stdout"),a=r!==-1?e[r+1]:null,l=t();if(o){process.stdout.write(l);break}let c=a?it.default.resolve(a):it.default.resolve(__dirname,"..","references","model-profiles.md");Ce.default.writeFileSync(c,l,"utf-8"),i?process.stdout.write(c):process.stdout.write(`Wrote ${c}
382
- `);break}default:S(`Unknown command: ${n}`)}}mr().catch(n=>{process.stderr.write("Fatal: "+n.message+`
382
+ `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:B(Ne.default.relative(t,s))},n,s)}var nt,Ne,Mt=N(()=>{"use strict";nt=W(require("fs")),Ne=W(require("path"));ge()});var Te=W(require("fs")),It=W(require("path"));ge();var fr=require("jsonpath-plus");function Fs(t,e,n){let r=t;if(n&&(r=(0,fr.JSONPath)({path:n,json:t,wrap:!1})),e==="json")return JSON.stringify(r,null,2);let{encode:s}=require("@toon-format/toon");return s(r)}async function nc(){let{StateJsonCommand:t,StateGetCommand:e,StateUpdateCommand:n,StatePatchCommand:r,StateAdvancePlanCommand:s,StateLoadCommand:i,StateUpdateProgressCommand:o,InitCommand:a,RoadmapAnalyzeCommand:c,RoadmapGetPhaseCommand:l,RoadmapUpdatePlanProgressCommand:d,ConfigGetCommand:u,ConfigSetCommand:m,ConfigSetModelProfileCommand:p,ConfigNewProjectCommand:f,ConfigEnsureSectionCommand:g,PhaseNextDecimalCommand:h,PhaseAddCommand:x,PhaseInsertCommand:S,PhaseRemoveCommand:_,PhaseCompleteCommand:P,PhasePlanIndexCommand:k,MilestoneCompleteCommand:C,RequirementsMarkCompleteCommand:L,ValidateConsistencyCommand:$,ValidateHealthCommand:q,ValidateAgentsCommand:O,VerifyCommand:U,AuditUatCommand:Y,WorkstreamCreateCommand:le,WorkstreamListCommand:be,WorkstreamStatusCommand:te,WorkstreamCompleteCommand:pe,WorkstreamSetCommand:De,WorkstreamGetCommand:We,WorkstreamProgressCommand:Tt,ScaffoldCommand:Cs,CommitCommand:en,FrontmatterGetCommand:tn,FrontmatterSetCommand:ar,FrontmatterMergeCommand:nn,TemplateSelectCommand:Ae,TemplateFillCommand:je,ProgressCommand:mi,StatsCommand:pi,TodoCompleteCommand:fi,TodoMatchPhaseCommand:gi,SummaryExtractCommand:hi,WxpProcessCommand:yi}=await Promise.resolve().then(()=>(li(),ci));return{"state json":t,"state get":e,"state update":n,"state patch":r,"state advance-plan":s,"state load":i,"state update-progress":o,init:a,"roadmap analyze":c,"roadmap get-phase":l,"roadmap update-plan-progress":d,"config-get":u,"config-set":m,"config-set-model-profile":p,"config-new-project":f,"config-ensure-section":g,"phase next-decimal":h,"phase add":x,"phase insert":S,"phase remove":_,"phase complete":P,"phase-plan-index":k,"milestone complete":C,"requirements mark-complete":L,"validate consistency":$,"validate health":q,"validate agents":O,verify:U,"audit-uat":Y,"workstream create":le,"workstream list":be,"workstream status":te,"workstream complete":pe,"workstream set":De,"workstream get":We,"workstream progress":Tt,scaffold:Cs,commit:en,"frontmatter get":tn,"frontmatter set":ar,"frontmatter merge":nn,"template select":Ae,"template fill":je,progress:mi,stats:pi,"todo complete":fi,"todo match-phase":gi,"summary-extract":hi,"wxp process":yi}}function sc(t,e=[],n=[]){let r={};for(let s of e){let i=t.indexOf(`--${s}`);r[s]=i!==-1&&t[i+1]!==void 0&&!t[i+1].startsWith("--")?t[i+1]:null}for(let s of n)r[s]=t.includes(`--${s}`);return r}function di(t,e){let n=e.split("."),r=t;for(let s of n){if(r==null)return;let i=s.match(/^(.+?)\[(-?\d+)]$/);if(i){let o=i[1],a=parseInt(i[2],10);if(r=r[o],!Array.isArray(r))return;r=a<0?r[r.length+a]:r[a]}else r=r[s]}return r}function rc(t,e){let n=t.slice(0,2).join(" ");if(e[n])return n;let r=t[0];return r&&e[r]?r:null}async function ic(){let t=process.argv.slice(2);if(t[0]==="--help"||t[0]==="-h"){ui();return}let e=process.cwd();{let f=t.find(h=>h.startsWith("--cwd=")),g=t.indexOf("--cwd");if(f){let h=f.slice(6).trim();h||b("Missing value for --cwd"),t.splice(t.indexOf(f),1),e=It.default.resolve(h)}else if(g!==-1){let h=t[g+1];(!h||h.startsWith("--"))&&b("Missing value for --cwd"),t.splice(g,2),e=It.default.resolve(h)}(!Te.default.existsSync(e)||!Te.default.statSync(e).isDirectory())&&b(`Invalid --cwd: ${e}`)}if(!Te.default.existsSync(It.default.join(e,".planning"))){let f=qt(e);f!==e&&(e=f)}{let f=t.find(x=>x.startsWith("--ws=")),g=t.indexOf("--ws"),h=null;f?(h=f.slice(5).trim(),h||b("Missing value for --ws"),t.splice(t.indexOf(f),1)):g!==-1?(h=t[g+1],(!h||h.startsWith("--"))&&b("Missing value for --ws"),t.splice(g,2)):process.env.GSD_WORKSTREAM?h=process.env.GSD_WORKSTREAM.trim():h=He(e),h&&!/^[a-zA-Z0-9_-]+$/.test(h)&&b("Invalid workstream name"),h&&(process.env.GSD_WORKSTREAM=h)}let n=t.indexOf("--raw"),r=n!==-1;n!==-1&&t.splice(n,1);let s="json";{let f=t.findIndex(g=>g==="--output"||g==="-o");if(f!==-1){let g=t[f+1];(!g||g.startsWith("--"))&&b("Missing value for --output"),g!=="json"&&g!=="toon"&&b('--output must be "json" or "toon"'),s=g,t.splice(f,2)}}let i=null,o=null;{let f=t.findIndex(g=>g==="--pick"||g==="-p");f!==-1&&(i=t[f+1],(!i||i.startsWith("--"))&&b("Missing value for --pick"),t.splice(f,2))}if(!t[0]){ui();return}let a=[...t,"--cwd",e];r&&a.push("--raw");let c=await nc(),l=rc(t,c);if(l){let f=l.split(" ").length,g=[...t.slice(f),"--cwd",e];if(r&&g.push("--raw"),o||i||s!=="json"){let h=Te.default.writeSync.bind(Te.default),x=[];Te.default.writeSync=(S,_,...P)=>S===1?(x.push(String(_)),String(_).length):h(S,_,...P);try{await c[l].run(g)}finally{Te.default.writeSync=h;let S=x.join("");try{let _=JSON.parse(S),P=_;o&&(P=di(_,o)??""),h(1,Fs(P,s,i??void 0))}catch{h(1,S)}}return}await c[l].run(g);return}let d=t[0],u=t;new Set(["generate-slug","current-timestamp","verify-path-exists","verify-summary","template","frontmatter","generate-model-profiles-md"]).has(d)||(e=Wt(e));let p=async()=>{await oc(d,u,e,r)};if(o||i||s!=="json"){let f=Te.default.writeSync.bind(Te.default),g=[];Te.default.writeSync=(h,x,...S)=>h===1?(g.push(String(x)),String(x).length):f(h,x,...S);try{await p()}finally{Te.default.writeSync=f;let h=g.join("");try{let x=JSON.parse(h),S=x;o&&(S=di(x,o)??""),f(1,Fs(S,s,i??void 0))}catch{f(1,h)}}return}await p()}function ui(){process.stdout.write(["Usage: pi-gsd-tools <command> [subcommand] [args] [--raw] [--cwd <path>] [--ws <name>]","","Commands: state, init, roadmap, config-get, config-set, phase, milestone,"," validate, verify, workstream, scaffold, commit, frontmatter, template,"," progress, stats, todo, summary-extract, wxp, resolve-model, find-phase,"," generate-slug, current-timestamp, list-todos, verify-path-exists,"," audit-uat, uat, generate-model-profiles-md, and more.","","Add --help to any command for details."].join(`
383
+ `)+`
384
+ `)}async function oc(t,e,n,r){switch(t){case"resolve-model":{let{cmdResolveModel:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"find-phase":{let{cmdFindPhase:s}=await Promise.resolve().then(()=>(et(),Qe));s(n,e[1],r);break}case"commit-to-subrepo":{let{cmdCommitToSubrepo:s}=await Promise.resolve().then(()=>(Se(),xe)),i=e.indexOf("--files"),o=e.slice(1,i!==-1?i:e.length).filter(c=>!c.startsWith("--")),a=i!==-1?e.slice(i+1).filter(c=>!c.startsWith("--")):[];s(n,o.join(" ")||void 0,a,r);break}case"verify-summary":{let{cmdVerifySummary:s}=await Promise.resolve().then(()=>(Rt(),jt)),i=e[2]?parseInt(e[2],10):2;s(n,e[1],i,r);break}case"generate-slug":{let{cmdGenerateSlug:s}=await Promise.resolve().then(()=>(Se(),xe));s(e[1],r);break}case"current-timestamp":{let{cmdCurrentTimestamp:s}=await Promise.resolve().then(()=>(Se(),xe));s(e[1],r);break}case"list-todos":{let{cmdListTodos:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"verify-path-exists":{let{cmdVerifyPathExists:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"phases":{let{cmdPhasesList:s}=await Promise.resolve().then(()=>(et(),Qe));s(n,{},r);break}case"requirements":{let{cmdRequirementsMarkComplete:s}=await Promise.resolve().then(()=>(Wn(),Nn));e[1]==="mark-complete"?s(n,e.slice(2),r):b("Unknown requirements subcommand. Available: mark-complete");break}case"uat":{let s=await Promise.resolve().then(()=>(Bs(),zs));e[1]==="render-checkpoint"?s.cmdRenderCheckpoint(n,sc(e,["file"]),r):b("Unknown uat subcommand. Available: render-checkpoint");break}case"state-snapshot":{let{cmdStateSnapshot:s}=await Promise.resolve().then(()=>(Fe(),Ze));s(n,r);break}case"agent-skills":{let{cmdAgentSkills:s}=await Promise.resolve().then(()=>(Sn(),xn));s(n,e[1],r);break}case"history-digest":{let{cmdHistoryDigest:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,r);break}case"scan-sessions":{let{cmdScanSessions:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--path"),o=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{verbose:e.includes("--verbose"),json:e.includes("--json"),harness:o!==-1?e[o+1]:null},r);break}case"extract-messages":{let{cmdExtractMessages:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--session"),o=e.indexOf("--limit"),a=e.indexOf("--path"),c=l=>l.startsWith("--")&&l.endsWith("--")&&l.length>4;(!e[1]||e[1].startsWith("--")&&!c(e[1]))&&b("Usage: pi-gsd-tools extract-messages <project> [--session <id>] [--limit N]"),await s(e[1],{sessionId:i!==-1?e[i+1]:null,limit:o!==-1?parseInt(e[o+1],10):null},r,a!==-1?e[a+1]:null);break}case"profile-sample":{let{cmdProfileSample:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),c=e.indexOf("--max-chars"),l=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{limit:o!==-1?parseInt(e[o+1],10):150,maxPerProject:a!==-1?parseInt(e[a+1],10):null,harness:l!==-1?e[l+1]:null,maxChars:c!==-1?parseInt(e[c+1],10):500},r);break}case"write-profile":{let{cmdWriteProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--input"),o=e.indexOf("--output");i===-1&&b("--input <analysis-json-path> is required"),s(n,{input:e[i+1],output:o!==-1?e[o+1]:null},r);break}case"profile-questionnaire":{let{cmdProfileQuestionnaire:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--answers");s({answers:i!==-1?e[i+1]:null},r);break}case"generate-dev-preferences":{let{cmdGenerateDevPreferences:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output"),a=e.indexOf("--stack");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,stack:a!==-1?e[a+1]:null},r);break}case"generate-claude-profile":{let{cmdGenerateClaudeProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,global:e.includes("--global")},r);break}case"generate-claude-md":{let{cmdGenerateClaudeMd:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--output"),o=e.indexOf("--harness");s(n,{output:i!==-1?e[i+1]:null,auto:e.includes("--auto"),force:e.includes("--force"),harness:o!==-1?e[o+1]:null},r);break}case"generate-model-profiles-md":{let{generateModelProfilesMd:s}=await Promise.resolve().then(()=>(Dt(),cr)),i=e.indexOf("--output"),o=s();if(e.includes("--stdout")){process.stdout.write(o);break}let a=i!==-1?It.default.resolve(e[i+1]):It.default.resolve(__dirname,"..","references","model-profiles.md");Te.default.writeFileSync(a,o,"utf-8"),r?process.stdout.write(a):process.stdout.write(`Wrote ${a}
385
+ `);break}case"websearch":{let{cmdWebsearch:s}=await Promise.resolve().then(()=>(Se(),xe)),i=e.indexOf("--limit"),o=e.indexOf("--freshness");await s(e[1],{limit:i!==-1?parseInt(e[i+1],10):10,freshness:o!==-1?e[o+1]:null},r);break}case"map-codebase":{let{cmdInitMapCodebase:s}=await Promise.resolve().then(()=>(Sn(),xn));await s(n,r);break}case"new-project":case"new-milestone":case"plan-phase":case"execute-phase":case"verify-work":case"phase-op":case"milestone-op":case"resume":case"quick":case"manager":case"progress":case"new-workspace":case"list-workspaces":case"remove-workspace":{b(`Use: pi-gsd-tools init ${t} [args]`);break}default:b(`Unknown command: ${t}`)}}ic().catch(t=>{process.stderr.write("Fatal: "+t.message+`
383
386
  `),process.exit(1)});