pi-gsd 2.0.21 → 2.0.23

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 (70) hide show
  1. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-codebase-mapper.md +13 -13
  2. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-debugger.md +37 -37
  3. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-executor.md +8 -8
  4. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-nyquist-auditor.md +31 -31
  5. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-phase-researcher.md +85 -85
  6. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-plan-checker.md +32 -32
  7. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-planner.md +108 -108
  8. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-project-researcher.md +76 -76
  9. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-research-synthesizer.md +16 -16
  10. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-roadmapper.md +39 -39
  11. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-ui-auditor.md +24 -24
  12. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-ui-checker.md +21 -21
  13. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-ui-researcher.md +35 -35
  14. package/.gsd/harnesses/pi/get-shit-done/agents/gsd-verifier.md +30 -30
  15. package/.gsd/harnesses/pi/get-shit-done/references/continuation-format.md +11 -11
  16. package/.gsd/harnesses/pi/get-shit-done/references/ui-brand.md +1 -1
  17. package/.gsd/harnesses/pi/get-shit-done/templates/DEBUG.md +4 -4
  18. package/.gsd/harnesses/pi/get-shit-done/templates/UAT.md +1 -1
  19. package/.gsd/harnesses/pi/get-shit-done/workflows/add-backlog.md +132 -0
  20. package/.gsd/harnesses/pi/get-shit-done/workflows/add-phase.md +36 -68
  21. package/.gsd/harnesses/pi/get-shit-done/workflows/audit-milestone.md +3 -3
  22. package/.gsd/harnesses/pi/get-shit-done/workflows/complete-milestone.md +1 -1
  23. package/.gsd/harnesses/pi/get-shit-done/workflows/debug.md +250 -0
  24. package/.gsd/harnesses/pi/get-shit-done/workflows/discuss-phase-assumptions.md +1 -1
  25. package/.gsd/harnesses/pi/get-shit-done/workflows/discuss-phase.md +2 -2
  26. package/.gsd/harnesses/pi/get-shit-done/workflows/discuss-phase.md.bak +2 -2
  27. package/.gsd/harnesses/pi/get-shit-done/workflows/execute-phase.md +5 -2
  28. package/.gsd/harnesses/pi/get-shit-done/workflows/execute-phase.md.bak +2 -2
  29. package/.gsd/harnesses/pi/get-shit-done/workflows/execute-plan.md +1 -1
  30. package/.gsd/harnesses/pi/get-shit-done/workflows/help.md +5 -5
  31. package/.gsd/harnesses/pi/get-shit-done/workflows/insert-phase.md +1 -1
  32. package/.gsd/harnesses/pi/get-shit-done/workflows/list-phase-assumptions.md +78 -30
  33. package/.gsd/harnesses/pi/get-shit-done/workflows/map-codebase.md +1 -1
  34. package/.gsd/harnesses/pi/get-shit-done/workflows/new-milestone.md +1 -1
  35. package/.gsd/harnesses/pi/get-shit-done/workflows/new-milestone.md.bak +1 -1
  36. package/.gsd/harnesses/pi/get-shit-done/workflows/new-project.md +2 -2
  37. package/.gsd/harnesses/pi/get-shit-done/workflows/new-project.md.bak +2 -2
  38. package/.gsd/harnesses/pi/get-shit-done/workflows/plan-milestone-gaps.md +1 -1
  39. package/.gsd/harnesses/pi/get-shit-done/workflows/plan-phase.md +5 -1
  40. package/.gsd/harnesses/pi/get-shit-done/workflows/plan-phase.md.bak +1 -1
  41. package/.gsd/harnesses/pi/get-shit-done/workflows/progress.md +10 -10
  42. package/.gsd/harnesses/pi/get-shit-done/workflows/resume-project.md +2 -2
  43. package/.gsd/harnesses/pi/get-shit-done/workflows/review-backlog.md +219 -0
  44. package/.gsd/harnesses/pi/get-shit-done/workflows/session-report.md +47 -0
  45. package/.gsd/harnesses/pi/get-shit-done/workflows/set-profile.md +135 -0
  46. package/.gsd/harnesses/pi/get-shit-done/workflows/settings.md +1 -1
  47. package/.gsd/harnesses/pi/get-shit-done/workflows/thread.md +213 -0
  48. package/.gsd/harnesses/pi/get-shit-done/workflows/transition.md +3 -3
  49. package/.gsd/harnesses/pi/get-shit-done/workflows/ui-phase.md +3 -2
  50. package/.gsd/harnesses/pi/get-shit-done/workflows/ui-review.md +1 -1
  51. package/.gsd/harnesses/pi/get-shit-done/workflows/validate-phase.md +1 -1
  52. package/.gsd/harnesses/pi/get-shit-done/workflows/verify-work.md +1 -1
  53. package/.gsd/harnesses/pi/get-shit-done/workflows/workstreams.md +215 -0
  54. package/.gsd/harnesses/pi/gsd-file-manifest.json +1 -1
  55. package/.gsd/harnesses/pi/hooks/gsd-context-monitor.js +102 -102
  56. package/.gsd/harnesses/pi/hooks/gsd-statusline.js +2 -2
  57. package/.gsd/harnesses/pi/hooks/gsd-workflow-guard.js +65 -65
  58. package/README.md +1 -1
  59. package/dist/pi-gsd-hooks.js +33 -6
  60. package/dist/pi-gsd-tools.js +87 -76
  61. package/package.json +1 -1
  62. package/prompts/gsd-add-backlog.md +2 -0
  63. package/prompts/gsd-complete-milestone.md +2 -0
  64. package/prompts/gsd-debug.md +2 -0
  65. package/prompts/gsd-list-phase-assumptions.md +1 -1
  66. package/prompts/gsd-research-phase.md +2 -0
  67. package/prompts/gsd-review-backlog.md +2 -0
  68. package/prompts/gsd-set-profile.md +2 -0
  69. package/prompts/gsd-thread.md +2 -0
  70. package/prompts/gsd-workstreams.md +2 -0
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var _i=Object.create;var js=Object.defineProperty;var wi=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames;var Pi=Object.getPrototypeOf,$i=Object.prototype.hasOwnProperty;var L=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ci=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),xe=(t,e)=>{for(var n in e)js(t,n,{get:e[n],enumerable:!0})},Ai=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ki(e))!$i.call(t,s)&&s!==n&&js(t,s,{get:()=>e[s],enumerable:!(r=wi(e,s))||r.enumerable});return t};var U=(t,e,n)=>(n=t!=null?_i(Pi(t)):{},Ai(e||!t||!t.__esModule?js(n,"default",{value:t,enumerable:!0}):n,t));var mr={};xe(mr,{MODEL_PROFILES:()=>Me,VALID_PROFILES:()=>vt,formatAgentToModelMapAsTable:()=>Es,generateModelProfilesMd:()=>Ei,getAgentToModelMapForProfile:()=>Rs});function Rs(t){let e={};for(let[n,r]of Object.entries(Me))e[n]=r[t];return e}function Es(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)+`
2
+ "use strict";var $i=Object.create;var js=Object.defineProperty;var Ci=Object.getOwnPropertyDescriptor;var Ai=Object.getOwnPropertyNames;var ji=Object.getPrototypeOf,Ri=Object.prototype.hasOwnProperty;var L=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ei=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),xe=(t,e)=>{for(var s in e)js(t,s,{get:e[s],enumerable:!0})},Fi=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ai(e))!Ri.call(t,n)&&n!==s&&js(t,n,{get:()=>e[n],enumerable:!(r=Ci(e,n))||r.enumerable});return t};var U=(t,e,s)=>(s=t!=null?$i(ji(t)):{},Fi(e||!t||!t.__esModule?js(s,"default",{value:t,enumerable:!0}):s,t));var pr={};xe(pr,{MODEL_PROFILES:()=>Me,VALID_PROFILES:()=>vt,formatAgentToModelMapAsTable:()=>Es,generateModelProfilesMd:()=>Ti,getAgentToModelMapForProfile:()=>Rs});function Rs(t){let e={};for(let[s,r]of Object.entries(Me))e[s]=r[t];return e}function Es(t){let e=Math.max(5,...Object.keys(t).map(o=>o.length)),s=Math.max(5,...Object.values(t).map(o=>o.length)),r="\u2500".repeat(e+2)+"\u253C"+"\u2500".repeat(s+2),i=" "+"Agent".padEnd(e)+" \u2502 "+"Model".padEnd(s)+`
3
3
  `+r+`
4
- `;for(let[o,a]of Object.entries(t))i+=" "+o.padEnd(e)+" \u2502 "+a.padEnd(n)+`
5
- `;return i}function Ei(){let t=Ri,e=ji,n=vt,r=Object.keys(Me),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=>Me[u][p]);return"| "+[u,...m,"inherit"].join(" | ")+" |"}),c=[i,o,...a].join(`
4
+ `;for(let[o,a]of Object.entries(t))i+=" "+o.padEnd(e)+" \u2502 "+a.padEnd(s)+`
5
+ `;return i}function Ti(){let t=Ii,e=Mi,s=vt,r=Object.keys(Me),n=["Agent",...s.map(u=>"`"+u+"`"),"`inherit`"],i="| "+n.join(" | ")+" |",o="|"+n.map(u=>"-".repeat(u.length+2)).join("|")+"|",a=r.map(u=>{let m=s.map(p=>Me[u][p]);return"| "+[u,...m,"inherit"].join(" | ")+" |"}),c=[i,o,...a].join(`
6
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
@@ -133,43 +133,54 @@ 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 Me,vt,ji,Ri,Ot=L(()=>{"use strict";Me={"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(Me["gsd-planner"]),ji="/gsd-",Ri="pi"});var yr={};xe(yr,{MODEL_ALIAS_MAP:()=>pr,MODEL_PROFILES:()=>Me,checkAgentsInstalled:()=>_t,comparePhaseNum:()=>Se,detectSubRepos:()=>Fs,escapeRegex:()=>re,execGit:()=>de,extractCurrentMilestone:()=>we,extractOneLinerFromBody:()=>Vt,filterPlanFiles:()=>wt,filterSummaryFiles:()=>kt,findPhaseInternal:()=>he,findProjectRoot:()=>qt,generateSlugInternal:()=>Le,getActiveWorkstream:()=>Xe,getAgentsDir:()=>gr,getArchivedPhaseDirs:()=>Ut,getMilestoneInfo:()=>ce,getMilestonePhaseFilter:()=>ke,getPhaseFileStats:()=>hr,getRoadmapPhaseInternal:()=>dt,gsdError:()=>b,isGitIgnored:()=>rn,loadConfig:()=>Q,normalizeMd:()=>Ie,normalizePhaseName:()=>pe,output:()=>y,pathExistsInternal:()=>Ti,planningDir:()=>W,planningPaths:()=>F,planningRoot:()=>ee,readSubdirectories:()=>Ue,reapStaleTempFiles:()=>fr,replaceInCurrentMilestone:()=>lt,resolveModelInternal:()=>ie,resolveWorktreeRoot:()=>Lt,safeReadFile:()=>Ne,searchPhaseInDir:()=>Ms,setActiveWorkstream:()=>ct,stripShippedMilestones:()=>Nt,toPosixPath:()=>J,withPlanningLock:()=>Ii});function J(t){return t.split(M.default.sep).join("/")}function Fs(t){let e=[];try{let n=N.default.readdirSync(t,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(".")||r.name==="node_modules")continue;let s=M.default.join(t,r.name,".git");try{N.default.existsSync(s)&&e.push(r.name)}catch{}}}catch{}return e.sort()}function qt(t){let e=M.default.resolve(t),n=M.default.parse(e).root,r=sn.default.homedir(),s=M.default.join(e,".planning");if(N.default.existsSync(s)&&N.default.statSync(s).isDirectory())return t;function i(a){let c=e;for(;c!==n;){if(N.default.existsSync(M.default.join(c,".git")))return!0;if(c===a)break;c=M.default.dirname(c)}return!1}let o=e;for(;o!==n;){let a=M.default.dirname(o);if(a===o||a===r)break;let c=M.default.join(a,".planning");if(N.default.existsSync(c)&&N.default.statSync(c).isDirectory()){let l=M.default.join(c,"config.json");try{let d=JSON.parse(N.default.readFileSync(l,"utf-8")),u=d.sub_repos||d.planning?.sub_repos||[];if(Array.isArray(u)&&u.length>0){let p=M.default.relative(a,e).split(M.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 fr(t="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:n=!1}={}){try{let r=sn.default.tmpdir(),s=Date.now();for(let i of N.default.readdirSync(r)){if(!i.startsWith(t))continue;let o=M.default.join(r,i);try{let a=N.default.statSync(o);s-a.mtimeMs>e&&(a.isDirectory()?N.default.rmSync(o,{recursive:!0,force:!0}):n||N.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){fr();let i=M.default.join(sn.default.tmpdir(),`gsd-${Date.now()}.json`);N.default.writeFileSync(i,s,"utf-8"),r="@file:"+i}else r=s}N.default.writeSync(1,r)}function b(t){N.default.writeSync(2,"Error: "+t+`
137
- `),process.exit(1)}function Ne(t){try{return N.default.readFileSync(t,"utf-8")}catch{return null}}function Q(t){let e=M.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=N.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{N.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=Fs(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=Fs(t);if(d.length>0){let u=[...a].sort();JSON.stringify(u)!==JSON.stringify(d)&&(i.sub_repos=d,o=!0)}}if(o)try{N.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,Wt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:t,stdio:"pipe"}),!0}catch{return!1}}function de(t,e){let n=(0,Wt.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 Ie(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!==""&&!Fi(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)&&Mi(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(`
136
+ `}var Me,vt,Mi,Ii,Ot=L(()=>{"use strict";Me={"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(Me["gsd-planner"]),Mi="/gsd-",Ii="pi"});var xr={};xe(xr,{MODEL_ALIAS_MAP:()=>fr,MODEL_PROFILES:()=>Me,checkAgentsInstalled:()=>_t,comparePhaseNum:()=>Se,detectSubRepos:()=>Fs,escapeRegex:()=>ie,execGit:()=>de,extractCurrentMilestone:()=>we,extractOneLinerFromBody:()=>Vt,filterPlanFiles:()=>wt,filterSummaryFiles:()=>kt,findPhaseInternal:()=>he,findProjectRoot:()=>qt,generateSlugInternal:()=>Le,getActiveWorkstream:()=>Ke,getAgentsDir:()=>hr,getArchivedPhaseDirs:()=>Ut,getMilestoneInfo:()=>ce,getMilestonePhaseFilter:()=>ke,getPhaseFileStats:()=>yr,getRoadmapPhaseInternal:()=>dt,gsdError:()=>b,isGitIgnored:()=>rn,loadConfig:()=>Q,normalizeMd:()=>Ie,normalizePhaseName:()=>pe,output:()=>y,pathExistsInternal:()=>Wi,planningDir:()=>W,planningPaths:()=>F,planningRoot:()=>ee,readSubdirectories:()=>Ue,reapStaleTempFiles:()=>gr,replaceInCurrentMilestone:()=>lt,resolveModelInternal:()=>oe,resolveWorktreeRoot:()=>Lt,safeReadFile:()=>Ne,searchPhaseInDir:()=>Ms,setActiveWorkstream:()=>ct,stripShippedMilestones:()=>Nt,toPosixPath:()=>J,withPlanningLock:()=>Ni});function J(t){return t.split(M.default.sep).join("/")}function Fs(t){let e=[];try{let s=N.default.readdirSync(t,{withFileTypes:!0});for(let r of s){if(!r.isDirectory()||r.name.startsWith(".")||r.name==="node_modules")continue;let n=M.default.join(t,r.name,".git");try{N.default.existsSync(n)&&e.push(r.name)}catch{}}}catch{}return e.sort()}function qt(t){let e=M.default.resolve(t),s=M.default.parse(e).root,r=sn.default.homedir(),n=M.default.join(e,".planning");if(N.default.existsSync(n)&&N.default.statSync(n).isDirectory())return t;function i(a){let c=e;for(;c!==s;){if(N.default.existsSync(M.default.join(c,".git")))return!0;if(c===a)break;c=M.default.dirname(c)}return!1}let o=e;for(;o!==s;){let a=M.default.dirname(o);if(a===o||a===r)break;let c=M.default.join(a,".planning");if(N.default.existsSync(c)&&N.default.statSync(c).isDirectory()){let l=M.default.join(c,"config.json");try{let d=JSON.parse(N.default.readFileSync(l,"utf-8")),u=d.sub_repos||d.planning?.sub_repos||[];if(Array.isArray(u)&&u.length>0){let p=M.default.relative(a,e).split(M.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 gr(t="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:s=!1}={}){try{let r=sn.default.tmpdir(),n=Date.now();for(let i of N.default.readdirSync(r)){if(!i.startsWith(t))continue;let o=M.default.join(r,i);try{let a=N.default.statSync(o);n-a.mtimeMs>e&&(a.isDirectory()?N.default.rmSync(o,{recursive:!0,force:!0}):s||N.default.unlinkSync(o))}catch{}}}catch{}}function y(t,e=!1,s){let r;if(e&&s!==void 0)r=String(s);else{let n=JSON.stringify(t,null,2);if(n.length>5e4){gr();let i=M.default.join(sn.default.tmpdir(),`gsd-${Date.now()}.json`);N.default.writeFileSync(i,n,"utf-8"),r="@file:"+i}else r=n}N.default.writeSync(1,r)}function b(t){N.default.writeSync(2,"Error: "+t+`
137
+ `),process.exit(1)}function Ne(t){try{return N.default.readFileSync(t,"utf-8")}catch{return null}}function Q(t){let e=M.default.join(t,".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 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 n=N.default.readFileSync(e,"utf-8"),i=JSON.parse(n);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{N.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=Fs(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=Fs(t);if(d.length>0){let u=[...a].sort();JSON.stringify(u)!==JSON.stringify(d)&&(i.sub_repos=d,o=!0)}}if(o)try{N.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:s.parallelization})();return{model_profile:c("model_profile")??s.model_profile,commit_docs:(()=>{let d=c("commit_docs",{section:"planning",field:"commit_docs"});return d!==void 0?!!d:rn(t,".planning/")?!1:s.commit_docs})(),search_gitignored:c("search_gitignored",{section:"planning",field:"search_gitignored"})??s.search_gitignored,branching_strategy:c("branching_strategy",{section:"git",field:"branching_strategy"})??s.branching_strategy,phase_branch_template:c("phase_branch_template",{section:"git",field:"phase_branch_template"})??s.phase_branch_template,milestone_branch_template:c("milestone_branch_template",{section:"git",field:"milestone_branch_template"})??s.milestone_branch_template,quick_branch_template:c("quick_branch_template",{section:"git",field:"quick_branch_template"})??s.quick_branch_template,research:c("research",{section:"workflow",field:"research"})??s.research,plan_checker:c("plan_checker",{section:"workflow",field:"plan_check"})??s.plan_checker,verifier:c("verifier",{section:"workflow",field:"verifier"})??s.verifier,nyquist_validation:c("nyquist_validation",{section:"workflow",field:"nyquist_validation"})??s.nyquist_validation,parallelization:l,brave_search:c("brave_search")??s.brave_search,firecrawl:c("firecrawl")??s.firecrawl,exa_search:c("exa_search")??s.exa_search,text_mode:c("text_mode",{section:"workflow",field:"text_mode"})??s.text_mode,sub_repos:c("sub_repos",{section:"planning",field:"sub_repos"})??s.sub_repos,resolve_model_ids:c("resolve_model_ids")??s.resolve_model_ids,context_window:c("context_window")??s.context_window,phase_naming:c("phase_naming")??s.phase_naming,model_overrides:i.model_overrides??null,agent_skills:i.agent_skills||{}}}catch{return s}}function rn(t,e){try{return(0,Wt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:t,stdio:"pipe"}),!0}catch{return!1}}function de(t,e){let s=(0,Wt.spawnSync)("git",e,{cwd:t,stdio:"pipe",encoding:"utf-8"});return{exitCode:s.status??1,stdout:(s.stdout??"").toString().trim(),stderr:(s.stderr??"").toString().trim()}}function Ie(t){if(!t||typeof t!="string")return t;let e=t.replace(/\r\n/g,`
138
+ `),s=e.split(`
139
+ `),r=[];for(let n=0;n<s.length;n++){let i=s[n],o=n>0?s[n-1]:"",a=o.trimEnd(),c=i.trimEnd();if(/^#{1,6}\s/.test(c)&&n>0&&a!==""&&a!=="---"&&r.push(""),/^```/.test(c)&&n>0&&a!==""&&!Di(s,n)&&r.push(""),/^(\s*[-*+]\s|\s*\d+\.\s)/.test(i)&&n>0&&a!==""&&!/^(\s*[-*+]\s|\s*\d+\.\s)/.test(o)&&a!=="---"&&r.push(""),r.push(i),/^#{1,6}\s/.test(c)&&n<s.length-1&&s[n+1]?.trimEnd()!==""&&r.push(""),/^```\s*$/.test(c)&&Oi(s,n)&&n<s.length-1&&s[n+1]?.trimEnd()!==""&&r.push(""),/^(\s*[-*+]\s|\s*\d+\.\s)/.test(i)&&n<s.length-1){let l=s[n+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 Fi(t,e){let n=0;for(let r=0;r<e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===1}function Mi(t,e){let n=0;for(let r=0;r<=e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===0}function Lt(t){if(N.default.existsSync(M.default.join(t,".planning")))return t;let e=de(t,["rev-parse","--git-dir"]),n=de(t,["rev-parse","--git-common-dir"]);if(e.exitCode!==0||n.exitCode!==0)return t;let r=M.default.resolve(t,e.stdout),s=M.default.resolve(t,n.stdout);return r!==s?M.default.dirname(s):t}function Ii(t,e){let n=M.default.join(W(t),".lock"),r=1e4,s=100,i=Date.now();try{N.default.mkdirSync(W(t),{recursive:!0})}catch{}for(;Date.now()-i<r;)try{N.default.writeFileSync(n,JSON.stringify({pid:process.pid,cwd:t,acquired:new Date().toISOString()}),{flag:"wx"});try{return e()}finally{try{N.default.unlinkSync(n)}catch{}}}catch(o){if(o.code==="EEXIST"){try{let a=N.default.statSync(n);if(Date.now()-a.mtimeMs>3e4){N.default.unlinkSync(n);continue}}catch{continue}(0,Wt.spawnSync)("sleep",["0.1"],{stdio:"ignore"});continue}throw o}try{N.default.unlinkSync(n)}catch{}return e()}function W(t,e){let n=e??process.env.GSD_WORKSTREAM??null;return n?M.default.join(t,".planning","workstreams",n):M.default.join(t,".planning")}function ee(t){return M.default.join(t,".planning")}function F(t,e){let n=W(t,e),r=M.default.join(t,".planning");return{planning:n,state:M.default.join(n,"STATE.md"),roadmap:M.default.join(n,"ROADMAP.md"),project:M.default.join(r,"PROJECT.md"),config:M.default.join(r,"config.json"),phases:M.default.join(n,"phases"),requirements:M.default.join(n,"REQUIREMENTS.md")}}function Xe(t){let e=M.default.join(ee(t),"active-workstream");try{let n=N.default.readFileSync(e,"utf-8").trim();return!n||!/^[a-zA-Z0-9_-]+$/.test(n)||!N.default.existsSync(M.default.join(ee(t),"workstreams",n))?null:n}catch{return null}}function ct(t,e){let n=M.default.join(ee(t),"active-workstream");if(!e){try{N.default.unlinkSync(n)}catch{}return}if(!/^[a-zA-Z0-9_-]+$/.test(e))throw new Error("Invalid workstream name");N.default.writeFileSync(n,e+`
144
- `,"utf-8")}function re(t){return String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pe(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 Se(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 Ms(t,e,n){try{let s=Ue(t,!0).find(v=>v.startsWith(n)||v.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=M.default.join(t,s),{plans:l,summaries:d,hasResearch:u,hasContext:m,hasVerification:p,hasReviews:f}=hr(c),g=l.sort(),h=d.sort(),x=new Set(h.map(v=>v.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),S=g.filter(v=>!x.has(v.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:J(M.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 he(t,e){if(!e)return null;let n=M.default.join(W(t),"phases"),r=pe(e),s=J(M.default.relative(t,n)),i=Ms(n,s,r);if(i)return i;let o=M.default.join(t,".planning","milestones");if(!N.default.existsSync(o))return null;try{let a=N.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=M.default.join(o,c),u=".planning/milestones/"+c,m=Ms(d,u,r);if(m)return m.archived=l,m}}catch{}return null}function Ut(t){let e=M.default.join(t,".planning","milestones"),n=[];if(!N.default.existsSync(e))return n;try{let r=N.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=M.default.join(e,s);for(let a of Ue(o,!0))n.push({name:a,milestone:i,basePath:M.default.join(".planning","milestones",s),fullPath:M.default.join(o,a)})}}catch{}return n}function Nt(t){return t.replace(/<details>[\s\S]*?<\/details>/gi,"")}function we(t,e){if(!e)return Nt(t);let n=null;try{let u=M.default.join(W(e),"STATE.md");if(N.default.existsSync(u)){let p=N.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 Nt(t);let r=new RegExp(`(^#{1,3}\\s+.*${re(n)}[^\\n]*)`,"mi"),s=t.match(r);if(!s)return Nt(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=M.default.join(W(t),"ROADMAP.md");if(!N.default.existsSync(n))return null;try{let r=we(N.default.readFileSync(n,"utf-8"),t),s=new RegExp(`#{2,4}\\s*Phase\\s+${re(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 gr(){return M.default.join(__dirname,"..","..","agents")}function _t(){let t=gr(),e=Object.keys(Me),n=[],r=[];if(!N.default.existsSync(t))return{agents_installed:!1,missing_agents:e,installed_agents:[],agents_dir:t};for(let s of e)N.default.existsSync(M.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 ie(t,e){let n=Q(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=Me[e];if(!i)return"sonnet";if(s==="inherit")return"inherit";let o=i[s]||i.balanced||"sonnet";return n.resolve_model_ids&&pr[o]||o}function Vt(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 Ti(t,e){let n=M.default.isAbsolute(e)?e:M.default.join(t,e);try{return N.default.statSync(n),!0}catch{return!1}}function Le(t){return t?t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function ce(t){try{let e=N.default.readFileSync(M.default.join(W(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=Nt(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 ke(t){let e=new Set;try{let s=we(N.default.readFileSync(M.default.join(W(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 hr(t){let e=N.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 Ue(t,e=!1){try{let r=N.default.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);return e?r.sort((s,i)=>Se(s,i)):r}catch{return[]}}var Wt,N,sn,M,pr,ye=L(()=>{"use strict";Wt=require("child_process"),N=U(require("fs")),sn=U(require("os")),M=U(require("path"));Ot();pr={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var st,Ts,on,w,je=L(()=>{"use strict";st=require("@oclif/core"),Ts=U(require("path")),on=U(require("fs"));ye();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?Ts.default.resolve(e.cwd):process.cwd();if((!on.default.existsSync(n)||!on.default.statSync(n).isDirectory())&&b(`Invalid --cwd: ${n}`),!on.default.existsSync(Ts.default.join(n,".planning"))){let s=Lt(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=Xe(n),r&&!/^[a-zA-Z0-9_-]+$/.test(r)&&b("Invalid workstream name"),r&&(process.env.GSD_WORKSTREAM=r),n=qt(n),{cwd:n,ws:r,raw:e.raw??!1}}}});var cn={};xe(cn,{FRONTMATTER_SCHEMAS:()=>Ds,asArr:()=>Pe,asObj:()=>Pt,asStr:()=>fe,cmdFrontmatterGet:()=>Di,cmdFrontmatterMerge:()=>Ni,cmdFrontmatterSet:()=>Oi,cmdFrontmatterValidate:()=>Wi,extractFrontmatter:()=>le,parseMustHavesBlock:()=>an,reconstructFrontmatter:()=>$t,spliceFrontmatter:()=>Os});function fe(t){return typeof t=="string"?t:void 0}function Pe(t){return Array.isArray(t)?t:void 0}function Pt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function le(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 $t(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 Os(t,e){let n=$t(e),r=t.match(/^---\r?\n[\s\S]+?\r?\n---/);return r?`---
146
- ${n}
143
+ `),e}function Di(t,e){let s=0;for(let r=0;r<e;r++)/^```/.test(t[r].trimEnd())&&s++;return s%2===1}function Oi(t,e){let s=0;for(let r=0;r<=e;r++)/^```/.test(t[r].trimEnd())&&s++;return s%2===0}function Lt(t){if(N.default.existsSync(M.default.join(t,".planning")))return t;let e=de(t,["rev-parse","--git-dir"]),s=de(t,["rev-parse","--git-common-dir"]);if(e.exitCode!==0||s.exitCode!==0)return t;let r=M.default.resolve(t,e.stdout),n=M.default.resolve(t,s.stdout);return r!==n?M.default.dirname(n):t}function Ni(t,e){let s=M.default.join(W(t),".lock"),r=1e4,n=100,i=Date.now();try{N.default.mkdirSync(W(t),{recursive:!0})}catch{}for(;Date.now()-i<r;)try{N.default.writeFileSync(s,JSON.stringify({pid:process.pid,cwd:t,acquired:new Date().toISOString()}),{flag:"wx"});try{return e()}finally{try{N.default.unlinkSync(s)}catch{}}}catch(o){if(o.code==="EEXIST"){try{let a=N.default.statSync(s);if(Date.now()-a.mtimeMs>3e4){N.default.unlinkSync(s);continue}}catch{continue}(0,Wt.spawnSync)("sleep",["0.1"],{stdio:"ignore"});continue}throw o}try{N.default.unlinkSync(s)}catch{}return e()}function W(t,e){let s=e??process.env.GSD_WORKSTREAM??null;return s?M.default.join(t,".planning","workstreams",s):M.default.join(t,".planning")}function ee(t){return M.default.join(t,".planning")}function F(t,e){let s=W(t,e),r=M.default.join(t,".planning");return{planning:s,state:M.default.join(s,"STATE.md"),roadmap:M.default.join(s,"ROADMAP.md"),project:M.default.join(r,"PROJECT.md"),config:M.default.join(r,"config.json"),phases:M.default.join(s,"phases"),requirements:M.default.join(s,"REQUIREMENTS.md")}}function Ke(t){let e=M.default.join(ee(t),"active-workstream");try{let s=N.default.readFileSync(e,"utf-8").trim();return!s||!/^[a-zA-Z0-9_-]+$/.test(s)||!N.default.existsSync(M.default.join(ee(t),"workstreams",s))?null:s}catch{return null}}function ct(t,e){let s=M.default.join(ee(t),"active-workstream");if(!e){try{N.default.unlinkSync(s)}catch{}return}if(!/^[a-zA-Z0-9_-]+$/.test(e))throw new Error("Invalid workstream name");N.default.writeFileSync(s,e+`
144
+ `,"utf-8")}function ie(t){return String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pe(t){let e=String(t),s=e.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);return s?s[1].padStart(2,"0")+(s[2]?s[2].toUpperCase():"")+(s[3]||""):e}function Se(t,e){let s=String(t).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i),r=String(e).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);if(!s||!r)return String(t).localeCompare(String(e));let n=parseInt(s[1],10)-parseInt(r[1],10);if(n!==0)return n;let i=(s[2]||"").toUpperCase(),o=(r[2]||"").toUpperCase();if(i!==o)return i?o&&i<o?-1:1:-1;let a=s[3]?s[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 Ms(t,e,s){try{let n=Ue(t,!0).find(v=>v.startsWith(s)||v.toUpperCase().startsWith(s.toUpperCase()));if(!n)return null;let i=n.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)||n.match(/^([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*)-(.+)/i)||[null,n,null],o=i?.[1]??s,a=i?.[2]||null,c=M.default.join(t,n),{plans:l,summaries:d,hasResearch:u,hasContext:m,hasVerification:p,hasReviews:f}=yr(c),g=l.sort(),h=d.sort(),x=new Set(h.map(v=>v.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),S=g.filter(v=>!x.has(v.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:J(M.default.join(e,n)),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 he(t,e){if(!e)return null;let s=M.default.join(W(t),"phases"),r=pe(e),n=J(M.default.relative(t,s)),i=Ms(s,n,r);if(i)return i;let o=M.default.join(t,".planning","milestones");if(!N.default.existsSync(o))return null;try{let a=N.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=M.default.join(o,c),u=".planning/milestones/"+c,m=Ms(d,u,r);if(m)return m.archived=l,m}}catch{}return null}function Ut(t){let e=M.default.join(t,".planning","milestones"),s=[];if(!N.default.existsSync(e))return s;try{let r=N.default.readdirSync(e,{withFileTypes:!0}).filter(n=>n.isDirectory()&&/^v[\d.]+-phases$/.test(n.name)).map(n=>n.name).sort().reverse();for(let n of r){let i=n.match(/^(v[\d.]+)-phases$/)[1],o=M.default.join(e,n);for(let a of Ue(o,!0))s.push({name:a,milestone:i,basePath:M.default.join(".planning","milestones",n),fullPath:M.default.join(o,a)})}}catch{}return s}function Nt(t){return t.replace(/<details>[\s\S]*?<\/details>/gi,"")}function we(t,e){if(!e)return Nt(t);let s=null;try{let u=M.default.join(W(e),"STATE.md");if(N.default.existsSync(u)){let p=N.default.readFileSync(u,"utf-8").match(/^milestone:\s*(.+)/m);p&&(s=p[1].trim())}}catch{}if(!s){let u=t.match(/🚧\s*\*\*v(\d+\.\d+)\s/);u&&(s="v"+u[1])}if(!s)return Nt(t);let r=new RegExp(`(^#{1,3}\\s+.*${ie(s)}[^\\n]*)`,"mi"),n=t.match(r);if(!n)return Nt(t);let i=n.index,o=n[1].match(/^(#{1,3})\s/)[1].length,c=t.slice(i+n[0].length).match(new RegExp(`^#{1,${o}}\\s+(?:.*v\\d+\\.\\d+|\u2705|\u{1F4CB}|\u{1F6A7})`,"mi")),l=c?i+n[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,s){let r=t.lastIndexOf("</details>");if(r===-1)return t.replace(e,s);let n=r+10,i=t.slice(0,n),o=t.slice(n);return i+o.replace(e,s)}function dt(t,e){if(!e)return null;let s=M.default.join(W(t),"ROADMAP.md");if(!N.default.existsSync(s))return null;try{let r=we(N.default.readFileSync(s,"utf-8"),t),n=new RegExp(`#{2,4}\\s*Phase\\s+${ie(e)}:\\s*([^\\n]+)`,"i"),i=r.match(n);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 hr(){return M.default.join(__dirname,"..","..","agents")}function _t(){let t=hr(),e=Object.keys(Me),s=[],r=[];if(!N.default.existsSync(t))return{agents_installed:!1,missing_agents:e,installed_agents:[],agents_dir:t};for(let n of e)N.default.existsSync(M.default.join(t,`${n}.md`))?s.push(n):r.push(n);return{agents_installed:s.length>0&&r.length===0,missing_agents:r,installed_agents:s,agents_dir:t}}function oe(t,e){let s=Q(t),r=s.model_overrides?.[e];if(r)return r;if(s.resolve_model_ids==="omit")return"";let n=String(s.model_profile||"balanced").toLowerCase(),i=Me[e];if(!i)return"sonnet";if(n==="inherit")return"inherit";let o=i[n]||i.balanced||"sonnet";return s.resolve_model_ids&&fr[o]||o}function Vt(t){if(!t)return null;let s=t.replace(/^---\n[\s\S]*?\n---\n*/,"").match(/^#[^\n]*\n+\*\*([^*]+)\*\*/m);return s?s[1].trim():null}function Wi(t,e){let s=M.default.isAbsolute(e)?e:M.default.join(t,e);try{return N.default.statSync(s),!0}catch{return!1}}function Le(t){return t?t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function ce(t){try{let e=N.default.readFileSync(M.default.join(W(t),"ROADMAP.md"),"utf-8"),s=e.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);if(s)return{version:"v"+s[1],name:s[2].trim()};let r=Nt(e),n=r.match(/## .*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);if(n)return{version:"v"+n[1],name:n[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 ke(t){let e=new Set;try{let n=we(N.default.readFileSync(M.default.join(W(t),"ROADMAP.md"),"utf-8"),t),i=/#{2,4}\s*Phase\s+([\w][\w.-]*)\s*:/gi,o;for(;(o=i.exec(n))!==null;)e.add(o[1])}catch{}if(e.size===0){let n=i=>!0;return n.phaseCount=0,n}let s=new Set([...e].map(n=>(n.replace(/^0+/,"")||"0").toLowerCase()));function r(n){let i=n.match(/^0*(\d+[A-Za-z]?(?:\.\d+)*)/);if(i&&s.has(i[1].toLowerCase()))return!0;let o=n.match(/^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*)/);return!!(o&&s.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 yr(t){let e=N.default.readdirSync(t);return{plans:wt(e),summaries:kt(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 Ue(t,e=!1){try{let r=N.default.readdirSync(t,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>n.name);return e?r.sort((n,i)=>Se(n,i)):r}catch{return[]}}var Wt,N,sn,M,fr,ye=L(()=>{"use strict";Wt=require("child_process"),N=U(require("fs")),sn=U(require("os")),M=U(require("path"));Ot();fr={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var st,Ts,on,w,je=L(()=>{"use strict";st=require("@oclif/core"),Ts=U(require("path")),on=U(require("fs"));ye();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 s=e.cwd?Ts.default.resolve(e.cwd):process.cwd();if((!on.default.existsSync(s)||!on.default.statSync(s).isDirectory())&&b(`Invalid --cwd: ${s}`),!on.default.existsSync(Ts.default.join(s,".planning"))){let n=Lt(s);n!==s&&(s=n)}let r=null;return e.ws?r=e.ws:process.env.GSD_WORKSTREAM?r=process.env.GSD_WORKSTREAM.trim():r=Ke(s),r&&!/^[a-zA-Z0-9_-]+$/.test(r)&&b("Invalid workstream name"),r&&(process.env.GSD_WORKSTREAM=r),s=qt(s),{cwd:s,ws:r,raw:e.raw??!1}}}});var cn={};xe(cn,{FRONTMATTER_SCHEMAS:()=>Ds,asArr:()=>Pe,asObj:()=>Pt,asStr:()=>fe,cmdFrontmatterGet:()=>qi,cmdFrontmatterMerge:()=>Ui,cmdFrontmatterSet:()=>Li,cmdFrontmatterValidate:()=>Vi,extractFrontmatter:()=>le,parseMustHavesBlock:()=>an,reconstructFrontmatter:()=>$t,spliceFrontmatter:()=>Os});function fe(t){return typeof t=="string"?t:void 0}function Pe(t){return Array.isArray(t)?t:void 0}function Pt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function le(t){let e={},s=[...t.matchAll(/(?:^|\n)\s*---\r?\n([\s\S]+?)\r?\n---/g)],r=s.length>0?s[s.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 $t(t){let e=[];for(let[s,r]of Object.entries(t))if(r!=null)if(Array.isArray(r))if(r.length===0)e.push(`${s}: []`);else if(r.every(n=>typeof n=="string")&&r.length<=3&&r.join(", ").length<60)e.push(`${s}: [${r.join(", ")}]`);else{e.push(`${s}:`);for(let n of r){let i=String(n);e.push(` - ${typeof n=="string"&&(i.includes(":")||i.includes("#"))?`"${i}"`:i}`)}}else if(typeof r=="object"){e.push(`${s}:`);for(let[n,i]of Object.entries(r))if(i!=null)if(Array.isArray(i))if(i.length===0)e.push(` ${n}: []`);else if(i.every(o=>typeof o=="string")&&i.length<=3&&i.join(", ").length<60)e.push(` ${n}: [${i.join(", ")}]`);else{e.push(` ${n}:`);for(let o of i)e.push(` - ${o}`)}else if(typeof i=="object"){e.push(` ${n}:`);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(` ${n}: ${o.includes(":")||o.includes("#")?`"${o}"`:o}`)}}else{let n=String(r);n.includes(":")||n.includes("#")||n.startsWith("[")||n.startsWith("{")?e.push(`${s}: "${n}"`):e.push(`${s}: ${n}`)}return e.join(`
145
+ `)}function Os(t,e){let s=$t(e),r=t.match(/^---\r?\n[\s\S]+?\r?\n---/);return r?`---
146
+ ${s}
147
147
  ---`+t.slice(r[0].length):`---
148
- ${n}
148
+ ${s}
149
149
  ---
150
150
 
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 v=S.match(/^(\w+):\s*"?([^"]*)"?\s*$/);v&&(p={},p[v[1]]=v[2])}continue}if(p&&typeof p=="object"&&h>f)if(x.startsWith("- ")){let S=x.slice(2).replace(/^["']|["']$/g,""),v=Object.keys(p),$=v[v.length-1];$&&!Array.isArray(p[$])&&(p[$]=p[$]?[p[$]]:[]);let P=p[$];$&&Array.isArray(P)&&P.push(S)}else{let S=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(S){let v=S[2];p[S[1]]=/^\d+$/.test(v)?parseInt(v,10):v}}}return p&&m.push(p),m}function Di(t,e,n,r){e||b("file path required"),e.includes("\0")&&b("file path contains null bytes");let s=Ze.default.isAbsolute(e)?e:Ze.default.join(t,e),i=Ne(s);if(!i){y({error:"File not found",path:e},r);return}let o=le(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 Oi(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=Ze.default.isAbsolute(e)?e:Ze.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=le(o),c;try{c=JSON.parse(r)}catch{c=r}a[n]=c;let l=Os(o,a);ut.default.writeFileSync(i,Ie(l),"utf-8"),y({updated:!0,field:n,value:c},s,"true")}function Ni(t,e,n,r){(!e||!n)&&b("file and data required");let s=Ze.default.isAbsolute(e)?e:Ze.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=le(i),a;try{a=JSON.parse(n)}catch{b("Invalid JSON for --data");return}Object.assign(o,a);let c=Os(i,o);ut.default.writeFileSync(s,Ie(c),"utf-8"),y({merged:!0,fields:Object.keys(a)},r,"true")}function Wi(t,e,n,r){(!e||!n)&&b("file and schema required");let s=Ds[n];if(!s){b(`Unknown schema: ${n}. Available: ${Object.keys(Ds).join(", ")}`);return}let i=Ze.default.isAbsolute(e)?e:Ze.default.join(t,e),o=Ne(i);if(!o){y({error:"File not found",path:e},r);return}let a=le(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,Ze,Ds,Ve=L(()=>{"use strict";ut=U(require("fs")),Ze=U(require("path"));ye();Ds={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 br(t){if(!t)return t;let e=t.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>Sr&&(e=e.slice(0,Sr)+"... [truncated]"),e}function Ns(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 vr(t,e,n,r={}){let s=Ns(t,e,r);if(!s.safe)throw new Error(`${n||"Path"} validation failed: ${s.error}`);return s.resolved}function Ws(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 qs(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,Sr,dn=L(()=>{"use strict";ln=U(require("path")),Sr=1e4});var ze={};xe(ze,{cmdSignalResume:()=>so,cmdSignalWaiting:()=>no,cmdStateAddBlocker:()=>Xi,cmdStateAddDecision:()=>Hi,cmdStateAdvancePlan:()=>Gi,cmdStateBeginPhase:()=>to,cmdStateGet:()=>Vi,cmdStateJson:()=>eo,cmdStateLoad:()=>Ui,cmdStatePatch:()=>zi,cmdStateReconcile:()=>ro,cmdStateRecordMetric:()=>Ji,cmdStateRecordSession:()=>Ki,cmdStateResolveBlocker:()=>Zi,cmdStateSnapshot:()=>Qi,cmdStateUpdate:()=>Bi,cmdStateUpdateProgress:()=>Yi,reconcileState:()=>Ct,stateExtractField:()=>z,stateReplaceField:()=>be,stateReplaceFieldWithFallback:()=>ue,stripFrontmatter:()=>Vs,writeStateMd:()=>oe});function qi(t){return F(t).state}function z(t,e){let n=re(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 be(t,e,n){let r=re(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 ue(t,e,n,r){let s=be(t,e,r);if(s)return s;if(n){let i=be(t,n,r);if(i)return i}return t}function Ls(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 Us(t,e,n,r){if(!n)return e??"";let s=Ns(n,t,{allowAbsolute:!0});if(!s.safe)throw new Error(`${r} path rejected: ${s.error}`);try{return A.default.readFileSync(s.resolved,"utf-8").trimEnd()}catch{throw new Error(`${r} file not found: ${n}`)}}function Vs(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 _r(t,e){let n=z(t,"Current Phase"),r=z(t,"Current Phase Name"),s=z(t,"Current Plan"),i=z(t,"Total Phases"),o=z(t,"Total Plans in Phase"),a=z(t,"Status"),c=z(t,"Progress"),l=z(t,"Last Activity"),d=z(t,"Stopped At")||z(t,"Stopped at"),u=z(t,"Paused At"),m=null,p=null;if(e)try{let T=ce(e);m=T.version,p=T.name}catch{}let f=i?parseInt(i,10):null,g=null,h=o?parseInt(o,10):null,x=null;if(e)try{let T=F(e).phases;if(A.default.existsSync(T)){let k=ke(e),j=A.default.readdirSync(T,{withFileTypes:!0}).filter(H=>H.isDirectory()).map(H=>H.name).filter(k),R=0,E=0,V=0;for(let H of j){let ae=A.default.readdirSync(Re.default.join(T,H)),X=ae.filter(Ae=>Ae.match(/-PLAN\.md$/i)).length,Z=ae.filter(Ae=>Ae.match(/-SUMMARY\.md$/i)).length;R+=X,E+=Z,X>0&&Z>=X&&V++}f=k.phaseCount>0?Math.max(j.length,k.phaseCount):j.length,g=V,h=R,x=E}}catch{}let S=null;if(c){let T=c.match(/(\d+)%/);T&&(S=parseInt(T[1],10))}let v=a??"unknown",$=(a??"").toLowerCase();$.includes("paused")||$.includes("stopped")||u?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 P={gsd_state_version:"1.0"};m&&(P.milestone=m),p&&(P.milestone_name=p),n&&(P.current_phase=n),r&&(P.current_phase_name=r),s&&(P.current_plan=s),P.status=v,d&&(P.stopped_at=d),u&&(P.paused_at=u),P.last_updated=new Date().toISOString(),l&&(P.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&&(P.progress=C),P}function Li(t,e){let n=le(t),r=Vs(t),s=_r(r,e);return s.status==="unknown"&&n.status&&n.status!=="unknown"&&(s.status=n.status),`---
152
- ${$t(s)}
151
+ `+t}function an(t,e){let s=t.match(/^---\r?\n([\s\S]+?)\r?\n---/);if(!s)return[];let r=s[1],n=r.match(/^(\s*)must_haves:\s*$/m);if(!n)return[];let i=n[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 v=S.match(/^(\w+):\s*"?([^"]*)"?\s*$/);v&&(p={},p[v[1]]=v[2])}continue}if(p&&typeof p=="object"&&h>f)if(x.startsWith("- ")){let S=x.slice(2).replace(/^["']|["']$/g,""),v=Object.keys(p),C=v[v.length-1];C&&!Array.isArray(p[C])&&(p[C]=p[C]?[p[C]]:[]);let P=p[C];C&&Array.isArray(P)&&P.push(S)}else{let S=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(S){let v=S[2];p[S[1]]=/^\d+$/.test(v)?parseInt(v,10):v}}}return p&&m.push(p),m}function qi(t,e,s,r){e||b("file path required"),e.includes("\0")&&b("file path contains null bytes");let n=Qe.default.isAbsolute(e)?e:Qe.default.join(t,e),i=Ne(n);if(!i){y({error:"File not found",path:e},r);return}let o=le(i);if(s){let a=o[s];if(a===void 0){y({error:"Field not found",field:s},r);return}y({[s]:a},r,JSON.stringify(a))}else y(o,r)}function Li(t,e,s,r,n){(!e||!s||r===void 0)&&b("file, field, and value required"),e.includes("\0")&&b("file path contains null bytes");let i=Qe.default.isAbsolute(e)?e:Qe.default.join(t,e);if(!ut.default.existsSync(i)){y({error:"File not found",path:e},n);return}let o=ut.default.readFileSync(i,"utf-8"),a=le(o),c;try{c=JSON.parse(r)}catch{c=r}a[s]=c;let l=Os(o,a);ut.default.writeFileSync(i,Ie(l),"utf-8"),y({updated:!0,field:s,value:c},n,"true")}function Ui(t,e,s,r){(!e||!s)&&b("file and data required");let n=Qe.default.isAbsolute(e)?e:Qe.default.join(t,e);if(!ut.default.existsSync(n)){y({error:"File not found",path:e},r);return}let i=ut.default.readFileSync(n,"utf-8"),o=le(i),a;try{a=JSON.parse(s)}catch{b("Invalid JSON for --data");return}Object.assign(o,a);let c=Os(i,o);ut.default.writeFileSync(n,Ie(c),"utf-8"),y({merged:!0,fields:Object.keys(a)},r,"true")}function Vi(t,e,s,r){(!e||!s)&&b("file and schema required");let n=Ds[s];if(!n){b(`Unknown schema: ${s}. Available: ${Object.keys(Ds).join(", ")}`);return}let i=Qe.default.isAbsolute(e)?e:Qe.default.join(t,e),o=Ne(i);if(!o){y({error:"File not found",path:e},r);return}let a=le(o),c=n.required.filter(d=>a[d]===void 0),l=n.required.filter(d=>a[d]!==void 0);y({valid:c.length===0,missing:c,present:l,schema:s},r,c.length===0?"valid":"invalid")}var ut,Qe,Ds,Ve=L(()=>{"use strict";ut=U(require("fs")),Qe=U(require("path"));ye();Ds={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 vr(t){if(!t)return t;let e=t.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>br&&(e=e.slice(0,br)+"... [truncated]"),e}function Ns(t,e,s={}){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),n=process.env.HOME??"/";return!r.startsWith(n)&&!r.startsWith(e)?{safe:!1,resolved:r,error:"Path traversal rejected"}:!s.allowAbsolute&&ln.default.isAbsolute(t)?{safe:!1,resolved:r,error:"Absolute paths not allowed"}:{safe:!0,resolved:r}}function _r(t,e,s,r={}){let n=Ns(t,e,r);if(!n.safe)throw new Error(`${s||"Path"} validation failed: ${n.error}`);return n.resolved}function Ws(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,(s,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 qs(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,br,dn=L(()=>{"use strict";ln=U(require("path")),br=1e4});var ze={};xe(ze,{cmdSignalResume:()=>ao,cmdSignalWaiting:()=>oo,cmdStateAddBlocker:()=>eo,cmdStateAddDecision:()=>Qi,cmdStateAdvancePlan:()=>Xi,cmdStateBeginPhase:()=>io,cmdStateGet:()=>Ji,cmdStateJson:()=>ro,cmdStateLoad:()=>Gi,cmdStateNote:()=>zs,cmdStatePatch:()=>Yi,cmdStateReconcile:()=>co,cmdStateRecordMetric:()=>Zi,cmdStateRecordSession:()=>no,cmdStateResolveBlocker:()=>to,cmdStateSnapshot:()=>so,cmdStateUpdate:()=>Hi,cmdStateUpdateProgress:()=>Ki,reconcileState:()=>Ct,stateExtractField:()=>z,stateReplaceField:()=>be,stateReplaceFieldWithFallback:()=>ue,stripFrontmatter:()=>Vs,writeStateMd:()=>ne});function zi(t){return F(t).state}function z(t,e){let s=ie(e),r=t.match(new RegExp(`\\*\\*${s}:\\*\\*\\s*(.+)`,"i"));if(r)return r[1].trim();let n=t.match(new RegExp(`^${s}:\\s*(.+)`,"im"));return n?n[1].trim():null}function be(t,e,s){let r=ie(e),n=new RegExp(`(\\*\\*${r}:\\*\\*\\s*)(.*)`,"i");if(n.test(t))return t.replace(n,(o,a)=>`${a}${s}`);let i=new RegExp(`(^${r}:\\s*)(.*)`,"im");return i.test(t)?t.replace(i,(o,a)=>`${a}${s}`):null}function ue(t,e,s,r){let n=be(t,e,r);if(n)return n;if(s){let i=be(t,s,r);if(i)return i}return t}function Ls(t,e){let s=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,r=t.match(s);if(!r)return t;let n=r[2];return e.status&&/^Status:/m.test(n)&&(n=n.replace(/^Status:.*$/m,`Status: ${e.status}`)),e.lastActivity&&/^Last activity:/im.test(n)&&(n=n.replace(/^Last activity:.*$/im,`Last activity: ${e.lastActivity}`)),e.plan&&/^Plan:/m.test(n)&&(n=n.replace(/^Plan:.*$/m,`Plan: ${e.plan}`)),t.replace(s,`${r[1]}${n}`)}function Us(t,e,s,r){if(!s)return e??"";let n=Ns(s,t,{allowAbsolute:!0});if(!n.safe)throw new Error(`${r} path rejected: ${n.error}`);try{return A.default.readFileSync(n.resolved,"utf-8").trimEnd()}catch{throw new Error(`${r} file not found: ${s}`)}}function Vs(t){let e=t;for(;;){let s=e.replace(/^\s*---\r?\n[\s\S]*?\r?\n---\s*/,"");if(s===e)break;e=s}return e}function wr(t,e){let s=z(t,"Current Phase"),r=z(t,"Current Phase Name"),n=z(t,"Current Plan"),i=z(t,"Total Phases"),o=z(t,"Total Plans in Phase"),a=z(t,"Status"),c=z(t,"Progress"),l=z(t,"Last Activity"),d=z(t,"Stopped At")||z(t,"Stopped at"),u=z(t,"Paused At"),m=null,p=null;if(e)try{let T=ce(e);m=T.version,p=T.name}catch{}let f=i?parseInt(i,10):null,g=null,h=o?parseInt(o,10):null,x=null;if(e)try{let T=F(e).phases;if(A.default.existsSync(T)){let k=ke(e),j=A.default.readdirSync(T,{withFileTypes:!0}).filter(H=>H.isDirectory()).map(H=>H.name).filter(k),R=0,E=0,V=0;for(let H of j){let ae=A.default.readdirSync(Re.default.join(T,H)),X=ae.filter(Ae=>Ae.match(/-PLAN\.md$/i)).length,Z=ae.filter(Ae=>Ae.match(/-SUMMARY\.md$/i)).length;R+=X,E+=Z,X>0&&Z>=X&&V++}f=k.phaseCount>0?Math.max(j.length,k.phaseCount):j.length,g=V,h=R,x=E}}catch{}let S=null;if(c){let T=c.match(/(\d+)%/);T&&(S=parseInt(T[1],10))}let v=a??"unknown",C=(a??"").toLowerCase();C.includes("paused")||C.includes("stopped")||u?v="paused":C.includes("executing")||C.includes("in progress")?v="executing":C.includes("planning")||C.includes("ready to plan")?v="planning":C.includes("discussing")?v="discussing":C.includes("verif")?v="verifying":C.includes("complete")||C.includes("done")?v="completed":C.includes("ready to execute")&&(v="executing");let P={gsd_state_version:"1.0"};m&&(P.milestone=m),p&&(P.milestone_name=p),s&&(P.current_phase=s),r&&(P.current_phase_name=r),n&&(P.current_plan=n),P.status=v,d&&(P.stopped_at=d),u&&(P.paused_at=u),P.last_updated=new Date().toISOString(),l&&(P.last_activity=l);let $={};return f!==null&&($.total_phases=f),g!==null&&($.completed_phases=g),h!==null&&($.total_plans=h),x!==null&&($.completed_plans=x),S!==null&&($.percent=S),Object.keys($).length>0&&(P.progress=$),P}function Bi(t,e){let s=le(t),r=Vs(t),n=wr(r,e);return n.status==="unknown"&&s.status&&s.status!=="unknown"&&(n.status=s.status),`---
152
+ ${$t(n)}
153
153
  ---
154
154
 
155
- ${r}`}function oe(t,e,n){let r=Li(e,n),s=t+".lock",i=10,o=200;for(let a=0;a<i;a++)try{let c=A.default.openSync(s,A.default.constants.O_CREAT|A.default.constants.O_EXCL|A.default.constants.O_WRONLY);A.default.writeSync(c,String(process.pid)),A.default.closeSync(c);break}catch(c){if(c.code==="EEXIST"){try{let u=A.default.statSync(s);if(Date.now()-u.mtimeMs>1e4){A.default.unlinkSync(s);continue}}catch{continue}if(a===i-1){try{A.default.unlinkSync(s)}catch{}break}let l=Date.now(),d=Math.floor(Math.random()*50);for(;Date.now()-l<o+d;);continue}break}try{A.default.writeFileSync(t,Ie(r),"utf-8")}finally{try{A.default.unlinkSync(s)}catch{}}}function Ui(t,e){let n=Q(t),r=F(t).planning,s="";try{s=A.default.readFileSync(Re.default.join(r,"STATE.md"),"utf-8")}catch{}let i=A.default.existsSync(Re.default.join(r,"config.json")),o=A.default.existsSync(Re.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 Vi(t,e,n){let r=F(t).state;try{let s=A.default.readFileSync(r,"utf-8");if(!e){y({content:s},n,s);return}let i=re(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 zi(t,e,n){for(let s of Object.keys(e)){let i=qs(s);i.valid||b(`state patch: ${i.error}`)}let r=F(t).state;try{let s=A.default.readFileSync(r,"utf-8"),i={updated:[],failed:[]};for(let[o,a]of Object.entries(e)){let c=re(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 Bi(t,e,n){(!e||n===void 0)&&b("field and value required for state update");let r=qs(e);r.valid||b(`state update: ${r.error}`);let s=F(t).state;try{let i=A.default.readFileSync(s,"utf-8"),o=re(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 Gi(t,e){let n=F(t).state;if(!A.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(n,"utf-8"),s=new Date().toISOString().split("T")[0],i=z(r,"Current Plan"),o=z(r,"Total Plans in Phase"),a=z(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=ue(r,"Status",null,"Phase complete - ready for verification"),r=ue(r,"Last Activity","Last activity",s),r=Ls(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=be(r,"Plan",m)??r):(m=`${u} of ${l}`,r=be(r,"Current Plan",String(u))??r),r=ue(r,"Status",null,"Ready to execute"),r=ue(r,"Last Activity","Last activity",s),r=Ls(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 Ji(t,e,n){let r=F(t).state;if(!A.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=A.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+`
155
+ ${r}`}function ne(t,e,s){let r=Bi(e,s),n=t+".lock",i=10,o=200;for(let a=0;a<i;a++)try{let c=A.default.openSync(n,A.default.constants.O_CREAT|A.default.constants.O_EXCL|A.default.constants.O_WRONLY);A.default.writeSync(c,String(process.pid)),A.default.closeSync(c);break}catch(c){if(c.code==="EEXIST"){try{let u=A.default.statSync(n);if(Date.now()-u.mtimeMs>1e4){A.default.unlinkSync(n);continue}}catch{continue}if(a===i-1){try{A.default.unlinkSync(n)}catch{}break}let l=Date.now(),d=Math.floor(Math.random()*50);for(;Date.now()-l<o+d;);continue}break}try{A.default.writeFileSync(t,Ie(r),"utf-8")}finally{try{A.default.unlinkSync(n)}catch{}}}function Gi(t,e){let s=Q(t),r=F(t).planning,n="";try{n=A.default.readFileSync(Re.default.join(r,"STATE.md"),"utf-8")}catch{}let i=A.default.existsSync(Re.default.join(r,"config.json")),o=A.default.existsSync(Re.default.join(r,"ROADMAP.md")),a=n.length>0;if(e){let c=s,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:s,state_raw:n,state_exists:a,roadmap_exists:o,config_exists:i})}function Ji(t,e,s){let r=F(t).state;try{let n=A.default.readFileSync(r,"utf-8");if(!e){y({content:n},s,n);return}let i=ie(e),o=n.match(new RegExp(`\\*\\*${i}:\\*\\*\\s*(.*)`,"i"));if(o){y({[e]:o[1].trim()},s,o[1].trim());return}let a=n.match(new RegExp(`^${i}:\\s*(.*)`,"im"));if(a){y({[e]:a[1].trim()},s,a[1].trim());return}let c=n.match(new RegExp(`##\\s*${i}\\s*
157
+ ([\\s\\S]*?)(?=\\n##|$)`,"i"));if(c){y({[e]:c[1].trim()},s,c[1].trim());return}y({error:`Section or field "${e}" not found`},s,"")}catch{b("STATE.md not found")}}function Yi(t,e,s){for(let n of Object.keys(e)){let i=qs(n);i.valid||b(`state patch: ${i.error}`)}let r=F(t).state;try{let n=A.default.readFileSync(r,"utf-8"),i={updated:[],failed:[]};for(let[o,a]of Object.entries(e)){let c=ie(o),l=new RegExp(`(\\*\\*${c}:\\*\\*\\s*)(.*)`,"i"),d=new RegExp(`(^${c}:\\s*)(.*)`,"im");l.test(n)?(n=n.replace(l,(u,m)=>`${m}${a}`),i.updated.push(o)):d.test(n)?(n=n.replace(d,(u,m)=>`${m}${a}`),i.updated.push(o)):i.failed.push(o)}i.updated.length>0&&ne(r,n,t),y(i,s,i.updated.length>0?"true":"false")}catch{b("STATE.md not found")}}function Hi(t,e,s){(!e||s===void 0)&&b("field and value required for state update");let r=qs(e);r.valid||b(`state update: ${r.error}`);let n=F(t).state;try{let i=A.default.readFileSync(n,"utf-8"),o=ie(e),a=new RegExp(`(\\*\\*${o}:\\*\\*\\s*)(.*)`,"i"),c=new RegExp(`(^${o}:\\s*)(.*)`,"im");a.test(i)?(i=i.replace(a,(l,d)=>`${d}${s}`),ne(n,i,t),y({updated:!0})):c.test(i)?(i=i.replace(c,(l,d)=>`${d}${s}`),ne(n,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 Xi(t,e){let s=F(t).state;if(!A.default.existsSync(s)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(s,"utf-8"),n=new Date().toISOString().split("T")[0],i=z(r,"Current Plan"),o=z(r,"Total Plans in Phase"),a=z(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=ue(r,"Status",null,"Phase complete - ready for verification"),r=ue(r,"Last Activity","Last activity",n),r=Ls(r,{status:"Phase complete - ready for verification",lastActivity:n}),ne(s,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=be(r,"Plan",m)??r):(m=`${u} of ${l}`,r=be(r,"Current Plan",String(u))??r),r=ue(r,"Status",null,"Ready to execute"),r=ue(r,"Last Activity","Last activity",n),r=Ls(r,{status:"Ready to execute",lastActivity:n,plan:m}),ne(s,r,t),y({advanced:!0,previous_plan:c,current_plan:u,total_plans:l},e,"true")}}function Zi(t,e,s){let r=F(t).state;if(!A.default.existsSync(r)){y({error:"STATE.md not found"},s);return}let{phase:n,plan:i,duration:o,tasks:a,files:c}=e;if(!n||!i||!o){y({error:"phase, plan, and duration required"},s);return}let l=A.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 ${n} P${i} | ${o} | ${a??"-"} tasks | ${c??"-"} files |`;m=!m.trim()||m.includes("None yet")?p:m+`
158
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 Yi(t,e){let n=F(t).state;if(!A.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(n,"utf-8"),s=F(t).phases,i=0,o=0;if(A.default.existsSync(s)){let f=ke(t),g=A.default.readdirSync(s,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).filter(f);for(let h of g){let x=A.default.readdirSync(Re.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 Hi(t,e,n){let r=F(t).state;if(!A.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=Us(t,i??null,o??null,"summary"),d=Us(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=A.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()+`
159
+ `),ne(r,l,t),y({recorded:!0,phase:n,plan:i,duration:o},s,"true")}else y({recorded:!1,reason:"Performance Metrics section not found in STATE.md"},s,"false")}function Ki(t,e){let s=F(t).state;if(!A.default.existsSync(s)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(s,"utf-8"),n=F(t).phases,i=0,o=0;if(A.default.existsSync(n)){let f=ke(t),g=A.default.readdirSync(n,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).filter(f);for(let h of g){let x=A.default.readdirSync(Re.default.join(n,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}`),ne(s,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}`),ne(s,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 Qi(t,e,s){let r=F(t).state;if(!A.default.existsSync(r)){y({error:"STATE.md not found"},s);return}let{phase:n,summary:i,summary_file:o,rationale:a,rationale_file:c}=e,l=null,d="";try{l=Us(t,i??null,o??null,"summary"),d=Us(t,a??"",c??null,"rationale")}catch(g){y({added:!1,reason:g.message},s,"false");return}if(!l){y({error:"summary required"},s);return}let u=A.default.readFileSync(r,"utf-8"),m=`- [Phase ${n??"?"}]: ${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
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 Xi(t,e,n){let r=F(t).state;if(!A.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=Us(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=A.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()+`
161
+ `,u=u.replace(p,(h,x)=>`${x}${g}`),ne(r,u,t),y({added:!0,decision:m},s,"true")}else y({added:!1,reason:"Decisions section not found in STATE.md"},s,"false")}function zs(t,e,s){e?.trim()||b("note text required");let r=F(t).state;if(!A.default.existsSync(r)){y({updated:!1,reason:"STATE.md not found"},s,"false");return}let n=A.default.readFileSync(r,"utf-8"),i=`- ${e.trim()}`,o=/(###\s*Roadmap Evolution\s*\n)([\s\S]*?)(?=\n###|\n##[^#]|$)/i,a=n.match(o);if(a){let d=(a[2]??"").trimEnd();n=n.replace(o,(u,m)=>`${m}${d?d+`
162
+ `:""}${i}
163
+ `),ne(r,n,t),y({updated:!0,note:i},s,"true");return}let c=/(##\s*Accumulated Context\s*\n)/i,l=n.match(c);if(l){let d=l.index+l[0].length;n=n.slice(0,d)+`
164
+ ### Roadmap Evolution
165
+ ${i}
166
+ `+n.slice(d),ne(r,n,t),y({updated:!0,note:i},s,"true");return}n=n.trimEnd()+`
167
+
168
+ ## Accumulated Context
169
+
170
+ ### Roadmap Evolution
171
+ ${i}
172
+ `,ne(r,n,t),y({updated:!0,note:i},s,"true")}function eo(t,e,s){let r=F(t).state;if(!A.default.existsSync(r)){y({error:"STATE.md not found"},s);return}let n=typeof e=="object"&&e!==null?e:{text:e},i=null;try{i=Us(t,n.text??null,n.text_file??null,"blocker")}catch(d){y({added:!1,reason:d.message},s,"false");return}if(!i){y({error:"text required"},s);return}let o=A.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
173
  `+a+`
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 Zi(t,e,n){let r=F(t).state;if(!A.default.existsSync(r)){y({error:"STATE.md not found"},n);return}if(!e){y({error:"text required"},n);return}let s=A.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(`
174
+ `,o=o.replace(c,(u,m)=>`${m}${d}`),ne(r,o,t),y({added:!0,blocker:i},s,"true")}else y({added:!1,reason:"Blockers section not found in STATE.md"},s,"false")}function to(t,e,s){let r=F(t).state;if(!A.default.existsSync(r)){y({error:"STATE.md not found"},s);return}if(!e){y({error:"text required"},s);return}let n=A.default.readFileSync(r,"utf-8"),i=/(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,o=n.match(i);if(o){let l=o[2].split(`
164
175
  `).filter(d=>!d.startsWith("- ")||!d.toLowerCase().includes(e.toLowerCase())).join(`
165
176
  `);(!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 Ki(t,e,n){let r=F(t).state;if(!A.default.existsSync(r)){y({error:"STATE.md not found"},n);return}let s=A.default.readFileSync(r,"utf-8"),i=new Date().toISOString(),o=[],a=d=>{let u=be(s,d,i);u&&(s=u,o.push(d))};if(a("Last session"),a("Last Date"),e.stopped_at){let d=be(s,"Stopped At",e.stopped_at)??be(s,"Stopped at",e.stopped_at);d&&(s=d,o.push("Stopped At"))}let c=e.resume_file??"None",l=be(s,"Resume File",c)??be(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 Qi(t,e){let n=qi(t);if(!A.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(n,"utf-8"),s=u=>z(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 eo(t,e){let n=F(t).state;if(!A.default.existsSync(n)){y({error:"STATE.md not found"},e,"STATE.md not found");return}let r=A.default.readFileSync(n,"utf-8"),s=le(r);if(!s||Object.keys(s).length===0){let i=Vs(r),o=_r(i,t);y(o,e,JSON.stringify(o,null,2));return}y(s,e,JSON.stringify(s,null,2))}function to(t,e,n,r,s){let i=F(t).state;if(!A.default.existsSync(i)){y({error:"STATE.md not found"},s);return}let o=A.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0],c=[],l=(f,g)=>{let h=be(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+`
177
+ `),n=n.replace(i,(d,u)=>`${u}${l}`),ne(r,n,t),y({resolved:!0,blocker:e},s,"true")}else y({resolved:!1,reason:"Blockers section not found in STATE.md"},s,"false")}function no(t,e,s){let r=F(t).state;if(!A.default.existsSync(r)){y({error:"STATE.md not found"},s);return}let n=A.default.readFileSync(r,"utf-8"),i=new Date().toISOString(),o=[],a=d=>{let u=be(n,d,i);u&&(n=u,o.push(d))};if(a("Last session"),a("Last Date"),e.stopped_at){let d=be(n,"Stopped At",e.stopped_at)??be(n,"Stopped at",e.stopped_at);d&&(n=d,o.push("Stopped At"))}let c=e.resume_file??"None",l=be(n,"Resume File",c)??be(n,"Resume file",c);l&&(n=l,o.push("Resume File")),o.length>0?(ne(r,n,t),y({recorded:!0,updated:o},s,"true")):y({recorded:!1,reason:"No session fields found in STATE.md"},s,"false")}function so(t,e){let s=zi(t);if(!A.default.existsSync(s)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(s,"utf-8"),n=u=>z(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(`
178
+ `).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:n("Current Phase"),current_phase_name:n("Current Phase Name"),total_phases:n("Total Phases")?parseInt(n("Total Phases"),10):null,current_plan:n("Current Plan"),total_plans_in_phase:n("Total Plans in Phase")?parseInt(n("Total Plans in Phase"),10):null,status:n("Status"),progress_percent:n("Progress")?parseInt(n("Progress").replace("%",""),10):null,last_activity:n("Last Activity"),last_activity_desc:n("Last Activity Description"),decisions:i,blockers:a,paused_at:n("Paused At"),session:l},e)}function ro(t,e){let s=F(t).state;if(!A.default.existsSync(s)){y({error:"STATE.md not found"},e,"STATE.md not found");return}let r=A.default.readFileSync(s,"utf-8"),n=le(r);if(!n||Object.keys(n).length===0){let i=Vs(r),o=wr(i,t);y(o,e,JSON.stringify(o,null,2));return}y(n,e,JSON.stringify(n,null,2))}function io(t,e,s,r,n){let i=F(t).state;if(!A.default.existsSync(i)){y({error:"STATE.md not found"},n);return}let o=A.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0],c=[],l=(f,g)=>{let h=be(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)),s&&l("Current Phase Name",s),l("Current Plan","1"),r&&l("Total Plans in Phase",String(r));let d=s?`Phase ${e} - ${s}`:`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}${s?` (${s})`:""} - EXECUTING`;g=/^Phase:/m.test(g)?g.replace(/^Phase:.*$/m,h):h+`
168
179
  `+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 no(t,e,n,r,s,i){let o=A.default.existsSync(Re.default.join(t,".gsd"))?Re.default.join(t,".gsd"):W(t),a=Re.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{A.default.mkdirSync(o,{recursive:!0}),A.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 so(t,e){let n=[Re.default.join(t,".gsd","WAITING.json"),Re.default.join(W(t),"WAITING.json")],r=!1;for(let s of n)if(A.default.existsSync(s))try{A.default.unlinkSync(s),r=!0}catch{}y({resumed:!0,removed:r},e,r?"true":"false")}function Ct(t){let e=F(t);if(!A.default.existsSync(e.state))return{reconciled:!1,changes:[],phases_complete:0,phases_total:0,plans_complete:0,plans_total:0,percent:0};if(!A.default.existsSync(e.phases))return{reconciled:!1,changes:[],phases_complete:0,phases_total:0,plans_complete:0,plans_total:0,percent:0};let n=ke(t),r=A.default.readdirSync(e.phases,{withFileTypes:!0}).filter(k=>k.isDirectory()).map(k=>k.name).filter(n).sort(),s=0,i=0,o=0,a=r.length,c=[],l=new Date().toISOString().split("T")[0],d=[];for(let k of r){let j=Re.default.join(e.phases,k),R=A.default.readdirSync(j),E=R.filter(Z=>Z.match(/-PLAN\.md$/i)).length,V=R.filter(Z=>Z.match(/-SUMMARY\.md$/i)).length,H=R.some(Z=>Z.match(/CONTEXT\.md$/i)),ae=k.match(/^(\d+(?:\.\d+)?)/)?.[1]??k.split("-")[0],X=E>0&&V>=E;s+=E,i+=V,X&&o++,d.push({dir:k,dirPath:j,phaseNum:ae,numVal:parseFloat(ae),plans:E,summaries:V,hasContext:H,complete:X})}for(let k of d){if(k.plans>0||k.complete||!d.some(H=>H.numVal>k.numVal&&H.complete))continue;let R=k.phaseNum.replace(".","-"),E=Re.default.join(k.dirPath,`${R}-01-PLAN.md`),V=Re.default.join(k.dirPath,`${R}-01-SUMMARY.md`);A.default.existsSync(E)||A.default.writeFileSync(E,["---",`plan: "${R}-01"`,`phase: "${k.phaseNum}"`,"status: complete","absorbed: true","---","",`# Plan ${R}-01 \u2014 [ABSORBED]`,"","Phase absorbed into a later phase. All deliverables completed there.",""].join(`
180
+ ${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&&ne(i,o,t),y({updated:c,phase:e,phase_name:s??null,plan_count:r??null},n,c.length>0?"true":"false")}function oo(t,e,s,r,n,i){let o=A.default.existsSync(Re.default.join(t,".gsd"))?Re.default.join(t,".gsd"):W(t),a=Re.default.join(o,"WAITING.json"),c={status:"waiting",type:e??"decision_point",question:s??null,options:r?r.split("|").map(l=>l.trim()):[],since:new Date().toISOString(),phase:n??null};try{A.default.mkdirSync(o,{recursive:!0}),A.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 ao(t,e){let s=[Re.default.join(t,".gsd","WAITING.json"),Re.default.join(W(t),"WAITING.json")],r=!1;for(let n of s)if(A.default.existsSync(n))try{A.default.unlinkSync(n),r=!0}catch{}y({resumed:!0,removed:r},e,r?"true":"false")}function Ct(t){let e=F(t);if(!A.default.existsSync(e.state))return{reconciled:!1,changes:[],phases_complete:0,phases_total:0,plans_complete:0,plans_total:0,percent:0};if(!A.default.existsSync(e.phases))return{reconciled:!1,changes:[],phases_complete:0,phases_total:0,plans_complete:0,plans_total:0,percent:0};let s=ke(t),r=A.default.readdirSync(e.phases,{withFileTypes:!0}).filter(k=>k.isDirectory()).map(k=>k.name).filter(s).sort(),n=0,i=0,o=0,a=r.length,c=[],l=new Date().toISOString().split("T")[0],d=[];for(let k of r){let j=Re.default.join(e.phases,k),R=A.default.readdirSync(j),E=R.filter(Z=>Z.match(/-PLAN\.md$/i)).length,V=R.filter(Z=>Z.match(/-SUMMARY\.md$/i)).length,H=R.some(Z=>Z.match(/CONTEXT\.md$/i)),ae=k.match(/^(\d+(?:\.\d+)?)/)?.[1]??k.split("-")[0],X=E>0&&V>=E;n+=E,i+=V,X&&o++,d.push({dir:k,dirPath:j,phaseNum:ae,numVal:parseFloat(ae),plans:E,summaries:V,hasContext:H,complete:X})}for(let k of d){if(k.plans>0||k.complete||!d.some(H=>H.numVal>k.numVal&&H.complete))continue;let R=k.phaseNum.replace(".","-"),E=Re.default.join(k.dirPath,`${R}-01-PLAN.md`),V=Re.default.join(k.dirPath,`${R}-01-SUMMARY.md`);A.default.existsSync(E)||A.default.writeFileSync(E,["---",`plan: "${R}-01"`,`phase: "${k.phaseNum}"`,"status: complete","absorbed: true","---","",`# Plan ${R}-01 \u2014 [ABSORBED]`,"","Phase absorbed into a later phase. All deliverables completed there.",""].join(`
170
181
  `),"utf-8"),A.default.existsSync(V)||A.default.writeFileSync(V,["---",`plan: "${R}-01"`,`phase: "${k.phaseNum}"`,"status: complete","absorbed: true",`completed_at: "${l}"`,"---","",`# Summary ${R}-01 \u2014 Phase ${k.phaseNum} Absorbed`,"","Phase deliverables completed as part of a later phase execution.",""].join(`
171
- `),"utf-8"),s++,i++,o++,k.complete=!0,c.push(`Phase ${k.phaseNum}: absorbed (0 plans, later phase complete) \u2014 created stubs`)}if(A.default.existsSync(e.roadmap)){let k=A.default.readFileSync(e.roadmap,"utf-8"),j=!1;for(let R of d){if(!R.complete)continue;let E=R.phaseNum.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),V=new RegExp(`(-\\s*\\[)[ ](\\]\\s*(?:\\*\\*)?\\s*Phase\\s+${E}[^\\n]*)`,"i");if(V.test(k)){k=k.replace(V,"$1x$2"),j=!0;continue}let H=new RegExp(`(\\|\\s*${E}\\.?\\s+[^|]*(?:\\|[^|]*)*\\|[^|]*)\\b(?:Pending|In Progress|Planning|Executing|Verifying|Discussed|Researched|Empty)\\b`,"i");H.test(k)&&(k=k.replace(H,"$1Complete"),j=!0)}j&&(A.default.writeFileSync(e.roadmap,k,"utf-8"),c.push("ROADMAP.md updated to match disk completion status"))}let u=A.default.readFileSync(e.state,"utf-8"),m=s>0?Math.min(100,Math.round(i/s*100)):0,p=Math.round(m/100*10),f=`${"\u2588".repeat(p)}${"\u2591".repeat(10-p)}] ${m}%`,g=/(\*\*Progress:\*\*\s*).*/i,h=/^(Progress:\s*).*/im;g.test(u)?u=u.replace(g,(k,j)=>`${j}[${f}`):h.test(u)&&(u=u.replace(h,(k,j)=>`${j}[${f}`));let x=[...d].sort((k,j)=>Se(k.phaseNum,j.phaseNum)),S=x.find(k=>k.plans>0&&k.summaries<k.plans),v=x.find(k=>k.plans===0&&!k.complete),$=x.length>0&&x.every(k=>k.complete),P=null,C="",T="";if(S){P=S;let k=S.summaries+1;C=`Executing Phase ${S.phaseNum}`,T=`${k} of ${S.plans}`}else if($)if(v)P=v,C="Ready to plan",T="Not started";else{let k=x[x.length-1];P=k,C="Milestone complete",T=`${k.plans} of ${k.plans}`}else{let k=x.find(j=>!j.complete);k&&(P=k,k.plans>0?(C="Ready to execute",T=`1 of ${k.plans}`):(C="Ready to plan",T="Not started"))}if(P){let k=z(u,"Current Phase"),j=z(u,"Status"),R=k?.match(/^(\d+(?:\.\d+)?)/)?.[1]??null,E=P.phaseNum,V=R===E,H=!V||j&&!j.toLowerCase().includes(C.toLowerCase().split(" ")[0]);if(!V){let Z=P.dir.replace(/^\d+(?:\.\d+)?-?/,"").replace(/-/g," "),Ae=a>0?`${E} of ${a}${Z?` (${Z})`:""}`:E;u=ue(u,"Current Phase","Phase",Ae),Z&&(u=ue(u,"Current Phase Name",null,Z)),c.push(`Current Phase: ${R??"(unset)"} \u2192 ${E}`)}H&&(u=ue(u,"Status",null,C),c.push(`Status: ${j??"(unset)"} \u2192 ${C}`));let ae=z(u,"Current Plan")??z(u,"Plan");ae!==T&&(u=ue(u,"Current Plan","Plan",T),c.push(`Plan: ${ae??"(unset)"} \u2192 ${T}`));let X=z(u,"Total Phases");X&&parseInt(X,10)!==a&&(u=be(u,"Total Phases",String(a))??u,c.push(`Total Phases: ${X} \u2192 ${a}`)),u=Ls(u,{status:C,plan:T})}return oe(e.state,u,t),{reconciled:!0,changes:c,phases_complete:o,phases_total:a,plans_complete:i,plans_total:s,percent:m}}function ro(t,e){let n=F(t);if(!A.default.existsSync(n.state)){y({reconciled:!1,reason:"no STATE.md"},e,"false");return}if(!A.default.existsSync(n.phases)){y({reconciled:!1,reason:"no phases dir"},e,"false");return}let r=Ct(t);y(r,e,r.changes.length>0?`Reconciled: ${r.changes.join("; ")}`:`State consistent (${r.phases_complete}/${r.phases_total} phases, ${r.plans_complete}/${r.plans_total} plans)`)}var A,Re,$e=L(()=>{"use strict";A=U(require("fs")),Re=U(require("path"));ye();Ve();dn()});var mt,un,mn,pn,fn,gn,hn,yn,xn,wr=L(()=>{"use strict";mt=require("@oclif/core");je();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(()=>($e(),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(()=>($e(),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(()=>($e(),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(()=>($e(),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(()=>($e(),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(()=>($e(),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(()=>($e(),ze))).cmdStateUpdateProgress(n,r)}},xn=class t extends w{static description="Reconcile STATE.md with disk truth";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateReconcile(n,r)}}});var Sn={};xe(Sn,{cmdAgentSkills:()=>_o,cmdInitExecutePhase:()=>io,cmdInitListWorkspaces:()=>bo,cmdInitManager:()=>xo,cmdInitMapCodebase:()=>ho,cmdInitMilestoneOp:()=>go,cmdInitNewMilestone:()=>co,cmdInitNewProject:()=>ao,cmdInitNewWorkspace:()=>So,cmdInitPhaseOp:()=>po,cmdInitPlanPhase:()=>oo,cmdInitProgress:()=>yo,cmdInitQuick:()=>lo,cmdInitRemoveWorkspace:()=>vo,cmdInitResume:()=>uo,cmdInitTodos:()=>fo,cmdInitVerifyWork:()=>mo});function kr(t){let e=Te.default.join(ee(t),"MILESTONES.md");if(!G.default.existsSync(e))return null;try{let r=G.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 ge(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 io(t,e,n){e||b("phase required for init execute-phase"),Ct(t);let r=Q(t),s=he(t,e),i=ce(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=ge(t,{executor_model:ie(t,"gsd-executor"),verifier_model:ie(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 oo(t,e,n){e||b("phase required for init plan-phase");let r=Q(t),s=he(t,e),i=dt(t,e),o=ce(t),a=ge(t,{planner_model:ie(t,"gsd-planner"),researcher_model:ie(t,"gsd-phase-researcher"),synthesizer_model:ie(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 ao(t,e){let n=Q(t),r=ee(t),s=ge(t,{planner_model:ie(t,"gsd-planner"),roadmapper_model:ie(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,planning_exists:G.default.existsSync(r),project_exists:G.default.existsSync(Te.default.join(r,"PROJECT.md")),config_exists:G.default.existsSync(Te.default.join(r,"config.json")),roadmap_exists:G.default.existsSync(Te.default.join(r,"ROADMAP.md")),state_exists:G.default.existsSync(Te.default.join(r,"STATE.md"))});y(s,e)}function co(t,e){let n=Q(t),r=ce(t),s=kr(t),i=ge(t,{roadmapper_model:ie(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,current_milestone:r,last_completed_milestone:s,roadmap_exists:G.default.existsSync(F(t).roadmap)});y(i,e)}function lo(t,e,n){let r=Q(t),s=ce(t),i=ge(t,{executor_model:ie(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:G.default.existsSync(F(t).state)});y(i,n)}function uo(t,e){Ct(t);let n=Q(t),r=ce(t),s=G.default.existsSync(F(t).state),i="";if(s)try{i=G.default.readFileSync(F(t).state,"utf-8")}catch{}let o=ge(t,{executor_model:ie(t,"gsd-executor"),commit_docs:n.commit_docs,context_window:n.context_window,state_exists:s,state_raw:i,roadmap_exists:G.default.existsSync(F(t).roadmap),config_exists:G.default.existsSync(F(t).config),milestone_version:r.version,milestone_name:r.name});y(o,e)}function mo(t,e,n){e||b("phase required for init verify-work");let r=Q(t),s=he(t,e),i=dt(t,e),o=ge(t,{verifier_model:ie(t,"gsd-verifier"),nyquist_model:ie(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 po(t,e,n){let r=Q(t),s=e?he(t,e):null,i=ce(t),o=ge(t,{planner_model:ie(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 fo(t,e,n){let r=Q(t),s=Te.default.join(W(t),"todos","pending"),i=[];if(G.default.existsSync(s))try{for(let a of G.default.readdirSync(s).filter(c=>c.endsWith(".md")))try{let c=G.default.readFileSync(Te.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=ge(t,{executor_model:ie(t,"gsd-executor"),commit_docs:r.commit_docs,todos:i,todo_count:i.length,area:e??null});y(o,n)}function go(t,e){let n=Q(t),r=ce(t),s=kr(t),i=ge(t,{planner_model:ie(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:G.default.existsSync(F(t).roadmap),state_exists:G.default.existsSync(F(t).state)});y(i,e)}function ho(t,e){let n=Q(t),r=ge(t,{mapper_model:ie(t,"gsd-codebase-mapper"),commit_docs:n.commit_docs,search_gitignored:n.search_gitignored,context_window:n.context_window,project_exists:G.default.existsSync(Te.default.join(ee(t),"PROJECT.md"))});y(r,e)}function yo(t,e){Ct(t);let n=Q(t),r=ce(t),s=ke(t),i=F(t).phases,o=0,a=0,c=0;if(G.default.existsSync(i))try{let d=G.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=G.default.readdirSync(Te.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=ge(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 xo(t,e){let n=Q(t),r=ce(t),s=ge(t,{planner_model:ie(t,"gsd-planner"),roadmapper_model:ie(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,state_exists:G.default.existsSync(F(t).state),roadmap_exists:G.default.existsSync(F(t).roadmap)});y(s,e)}function So(t,e){let n=Q(t),r=Te.default.join(ee(t),"workstreams"),s=ge(t,{commit_docs:n.commit_docs,context_window:n.context_window,workstream_mode:G.default.existsSync(r),workstreams:G.default.existsSync(r)?G.default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name):[]});y(s,e)}function bo(t,e){let n=Te.default.join(ee(t),"workstreams");if(!G.default.existsSync(n)){y(ge(t,{mode:"flat",workstreams:[],count:0}),e);return}let r=G.default.readdirSync(n,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);y(ge(t,{mode:"workstream",workstreams:r,count:r.length}),e)}function vo(t,e,n){e||b("workstream name required for init remove-workspace");let r=Te.default.join(ee(t),"workstreams",e);if(!G.default.existsSync(r)){y(ge(t,{removed:!1,reason:"not_found",workstream:e}),n);return}try{G.default.rmSync(r,{recursive:!0,force:!0})}catch(s){y(ge(t,{removed:!1,reason:s.message,workstream:e}),n);return}y(ge(t,{removed:!0,workstream:e}),n)}function _o(t,e,n){e||b("agent-type required");let s=Q(t).agent_skills[e]??{};y({agent:e,skills:s},n,JSON.stringify(s))}var G,Te,bn=L(()=>{"use strict";G=U(require("fs")),Te=U(require("path"));ye();$e()});var vn,_n,Pr=L(()=>{"use strict";vn=require("@oclif/core");je();_n=class t extends w{static description="Initialise a GSD workflow context";static args={workflow:vn.Args.string({required:!0}),phase:vn.Args.string({required:!1}),rest:vn.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(()=>(bn(),Sn)),{gsdError:c}=await Promise.resolve().then(()=>(ye(),yr));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 wn={};xe(wn,{cmdRoadmapAnalyze:()=>ko,cmdRoadmapGetPhase:()=>wo,cmdRoadmapUpdatePlanProgress:()=>Po});function wo(t,e,n){let r=F(t).roadmap;if(!Be.default.existsSync(r)){y({found:!1,error:"ROADMAP.md not found"},n,"");return}try{let s=we(Be.default.readFileSync(r,"utf-8"),t),i=re(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(`
172
- `).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 ko(t,e){let n=F(t).roadmap;if(!Be.default.existsSync(n)){y({error:"ROADMAP.md not found",milestones:[],phases:[],current_phase:null},e);return}let r=Be.default.readFileSync(n,"utf-8"),s=we(r,t),i=F(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],T=c[2].replace(/\(INSERTED\)/i,"").trim(),k=c.index,j=s.slice(k).match(/\n#{2,4}\s+Phase\s+\d/i),R=j?k+j.index:s.length,E=s.slice(k,R),V=E.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),H=E.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),ae=pe(C),X="no_directory",Z=0,Ae=0,qe=!1,Dt=!1;try{let nn=Be.default.readdirSync(i,{withFileTypes:!0}).filter(Ee=>Ee.isDirectory()).map(Ee=>Ee.name).find(Ee=>Ee.startsWith(ae+"-")||Ee===ae);if(nn){let Ee=Be.default.readdirSync($r.default.join(i,nn));Z=Ee.filter(Fe=>Fe.endsWith("-PLAN.md")||Fe==="PLAN.md").length,Ae=Ee.filter(Fe=>Fe.endsWith("-SUMMARY.md")||Fe==="SUMMARY.md").length,qe=Ee.some(Fe=>Fe.endsWith("-CONTEXT.md")||Fe==="CONTEXT.md"),Dt=Ee.some(Fe=>Fe.endsWith("-RESEARCH.md")||Fe==="RESEARCH.md"),Ae>=Z&&Z>0?X="complete":Ae>0?X="partial":Z>0?X="planned":Dt?X="researched":qe?X="discussed":X="empty"}}catch{}let As=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${re(C)}[:\\s]`,"i"),en=s.match(As),tn=en?en[1]==="x":!1;tn&&X!=="complete"&&(X="complete"),a.push({number:C,name:T,goal:V?V[1].trim():null,depends_on:H?H[1].trim():null,plan_count:Z,summary_count:Ae,has_context:qe,has_research:Dt,disk_status:X,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,T)=>C+T.plan_count,0),g=a.reduce((C,T)=>C+T.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,v;for(;(v=x.exec(s))!==null;)S.add(v[1]);let $=new Set(a.map(C=>C.number)),P=[...S].filter(C=>!$.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:P.length>0?P:null},e)}function Po(t,e,n){e||b("phase number required for roadmap update-plan-progress");let r=F(t).roadmap,s=he(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(!Be.default.existsSync(r)){y({updated:!1,reason:"ROADMAP.md not found",plan_count:i,summary_count:o},n,"no roadmap");return}let d=Be.default.readFileSync(r,"utf-8"),u=re(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*${re(h)})`,"i"),"$1x$2"))}Be.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 Be,$r,kn=L(()=>{"use strict";Be=U(require("fs")),$r=U(require("path"));ye()});var zs,Pn,$n,Cn,Cr=L(()=>{"use strict";zs=require("@oclif/core");je();Pn=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(()=>(kn(),wn))).cmdRoadmapAnalyze(n,r)}},$n=class t extends w{static description="Get details for a specific phase";static args={phase:zs.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(()=>(kn(),wn))).cmdRoadmapGetPhase(r,n.phase,s)}},Cn=class t extends w{static description="Update plan progress in roadmap";static args={phase:zs.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(()=>(kn(),wn))).cmdRoadmapUpdatePlanProgress(r,n.phase,s)}}});var At={};xe(At,{cmdConfigEnsureSection:()=>Ro,cmdConfigGet:()=>Fo,cmdConfigNewProject:()=>jo,cmdConfigSet:()=>Eo,cmdConfigSetModelProfile:()=>Mo,ensureConfigFile:()=>Bs,setConfigValue:()=>Gs});function Co(t){return!!(jr.has(t)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(t))}function Ao(t){let e=$o[t];e&&b(`Unknown config key: ${t}. Did you mean ${e}?`)}function Rr(t){let e=t||{},n=Ar.default.homedir(),r=Ke.default.join(n,".gsd","brave_api_key"),s=!!(process.env.BRAVE_API_KEY||me.default.existsSync(r)),i=Ke.default.join(n,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||me.default.existsSync(i)),a=Ke.default.join(n,".gsd","exa_api_key"),c=!!(process.env.EXA_API_KEY||me.default.existsSync(a)),l=Ke.default.join(n,".gsd","defaults.json"),d={};try{if(me.default.existsSync(l)&&(d=JSON.parse(me.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{me.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 Bs(t){let e=ee(t),n=Ke.default.join(e,"config.json");try{me.default.existsSync(e)||me.default.mkdirSync(e,{recursive:!0})}catch(s){b("Failed to create .planning directory: "+s.message)}if(me.default.existsSync(n))return{created:!1,reason:"already_exists"};let r=Rr({});try{return me.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 Gs(t,e,n){let r=Ke.default.join(ee(t),"config.json"),s={};try{me.default.existsSync(r)&&(s=JSON.parse(me.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 me.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 jo(t,e,n){let r=ee(t),s=Ke.default.join(r,"config.json");if(me.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{me.default.existsSync(r)||me.default.mkdirSync(r,{recursive:!0})}catch(a){b("Failed to create .planning directory: "+a.message)}let o=Rr(i);try{me.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 Ro(t,e){let n=Bs(t);y(n,e,n?.created?"created":"exists")}function Eo(t,e,n,r){e||b("Usage: config-set <key.path> <value>"),Ao(e),Co(e)||b(`Unknown config key: "${e}". Valid keys: ${[...jr].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=Gs(t,e,s);y(i,r,`${e}=${s}`)}function Fo(t,e,n){e||b("Usage: config-get <key.path>");let r=Ke.default.join(ee(t),"config.json"),s={};try{me.default.existsSync(r)?s=JSON.parse(me.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 Mo(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(", ")}`),Bs(t);let i=Gs(t,"model_profile",r)?.previousValue||"balanced",o=Rs(r),a=Es(o),l=i!==r?`\u2713 Model profile set to: ${r} (was: ${i})
182
+ `),"utf-8"),n++,i++,o++,k.complete=!0,c.push(`Phase ${k.phaseNum}: absorbed (0 plans, later phase complete) \u2014 created stubs`)}if(A.default.existsSync(e.roadmap)){let k=A.default.readFileSync(e.roadmap,"utf-8"),j=!1;for(let R of d){if(!R.complete)continue;let E=R.phaseNum.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),V=new RegExp(`(-\\s*\\[)[ ](\\]\\s*(?:\\*\\*)?\\s*Phase\\s+${E}[^\\n]*)`,"i");if(V.test(k)){k=k.replace(V,"$1x$2"),j=!0;continue}let H=new RegExp(`(\\|\\s*${E}\\.?\\s+[^|]*(?:\\|[^|]*)*\\|[^|]*)\\b(?:Pending|In Progress|Planning|Executing|Verifying|Discussed|Researched|Empty)\\b`,"i");H.test(k)&&(k=k.replace(H,"$1Complete"),j=!0)}j&&(A.default.writeFileSync(e.roadmap,k,"utf-8"),c.push("ROADMAP.md updated to match disk completion status"))}let u=A.default.readFileSync(e.state,"utf-8"),m=n>0?Math.min(100,Math.round(i/n*100)):0,p=Math.round(m/100*10),f=`${"\u2588".repeat(p)}${"\u2591".repeat(10-p)}] ${m}%`,g=/(\*\*Progress:\*\*\s*).*/i,h=/^(Progress:\s*).*/im;g.test(u)?u=u.replace(g,(k,j)=>`${j}[${f}`):h.test(u)&&(u=u.replace(h,(k,j)=>`${j}[${f}`));let x=[...d].sort((k,j)=>Se(k.phaseNum,j.phaseNum)),S=x.find(k=>k.plans>0&&k.summaries<k.plans),v=x.find(k=>k.plans===0&&!k.complete),C=x.length>0&&x.every(k=>k.complete),P=null,$="",T="";if(S){P=S;let k=S.summaries+1;$=`Executing Phase ${S.phaseNum}`,T=`${k} of ${S.plans}`}else if(C)if(v)P=v,$="Ready to plan",T="Not started";else{let k=x[x.length-1];P=k,$="Milestone complete",T=`${k.plans} of ${k.plans}`}else{let k=x.find(j=>!j.complete);k&&(P=k,k.plans>0?($="Ready to execute",T=`1 of ${k.plans}`):($="Ready to plan",T="Not started"))}if(P){let k=z(u,"Current Phase"),j=z(u,"Status"),R=k?.match(/^(\d+(?:\.\d+)?)/)?.[1]??null,E=P.phaseNum,V=R===E,H=!V||j&&!j.toLowerCase().includes($.toLowerCase().split(" ")[0]);if(!V){let Z=P.dir.replace(/^\d+(?:\.\d+)?-?/,"").replace(/-/g," "),Ae=a>0?`${E} of ${a}${Z?` (${Z})`:""}`:E;u=ue(u,"Current Phase","Phase",Ae),Z&&(u=ue(u,"Current Phase Name",null,Z)),c.push(`Current Phase: ${R??"(unset)"} \u2192 ${E}`)}H&&(u=ue(u,"Status",null,$),c.push(`Status: ${j??"(unset)"} \u2192 ${$}`));let ae=z(u,"Current Plan")??z(u,"Plan");ae!==T&&(u=ue(u,"Current Plan","Plan",T),c.push(`Plan: ${ae??"(unset)"} \u2192 ${T}`));let X=z(u,"Total Phases");X&&parseInt(X,10)!==a&&(u=be(u,"Total Phases",String(a))??u,c.push(`Total Phases: ${X} \u2192 ${a}`)),u=Ls(u,{status:$,plan:T})}return ne(e.state,u,t),{reconciled:!0,changes:c,phases_complete:o,phases_total:a,plans_complete:i,plans_total:n,percent:m}}function co(t,e){let s=F(t);if(!A.default.existsSync(s.state)){y({reconciled:!1,reason:"no STATE.md"},e,"false");return}if(!A.default.existsSync(s.phases)){y({reconciled:!1,reason:"no phases dir"},e,"false");return}let r=Ct(t);y(r,e,r.changes.length>0?`Reconciled: ${r.changes.join("; ")}`:`State consistent (${r.phases_complete}/${r.phases_total} phases, ${r.plans_complete}/${r.plans_total} plans)`)}var A,Re,$e=L(()=>{"use strict";A=U(require("fs")),Re=U(require("path"));ye();Ve();dn()});var mt,un,mn,pn,fn,gn,hn,yn,xn,kr=L(()=>{"use strict";mt=require("@oclif/core");je();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:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateJson(s,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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateGet(r,s.field,n)}},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:s}=await this.parse(t),{cwd:r}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateUpdate(r,s.field,s.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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),i=await Promise.resolve().then(()=>($e(),ze)),o={},a=s.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,n)}},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:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateAdvancePlan(s,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:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateLoad(s,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:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateUpdateProgress(s,r)}},xn=class t extends w{static description="Reconcile STATE.md with disk truth";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>($e(),ze))).cmdStateReconcile(s,r)}}});var Sn={};xe(Sn,{cmdAgentSkills:()=>$o,cmdInitExecutePhase:()=>lo,cmdInitListWorkspaces:()=>ko,cmdInitManager:()=>_o,cmdInitMapCodebase:()=>bo,cmdInitMilestoneOp:()=>So,cmdInitNewMilestone:()=>po,cmdInitNewProject:()=>mo,cmdInitNewWorkspace:()=>wo,cmdInitPhaseOp:()=>yo,cmdInitPlanPhase:()=>uo,cmdInitProgress:()=>vo,cmdInitQuick:()=>fo,cmdInitRemoveWorkspace:()=>Po,cmdInitResume:()=>go,cmdInitTodos:()=>xo,cmdInitVerifyWork:()=>ho});function Pr(t){let e=Te.default.join(ee(t),"MILESTONES.md");if(!G.default.existsSync(e))return null;try{let r=G.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 ge(t,e){e.project_root=t,e.gsd_bin="dist/gsd-tools.js",e.gsd_root=".",e.gsd_harness_dir=".";let s=_t();return e.agents_installed=s.agents_installed,e.missing_agents=s.missing_agents,e}function lo(t,e,s){e||b("phase required for init execute-phase"),Ct(t);let r=Q(t),n=he(t,e),i=ce(t),o=dt(t,e);if(!n&&o?.found){let d=o.phase_name;n={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=ge(t,{executor_model:oe(t,"gsd-executor"),verifier_model:oe(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:!!n,phase_dir:n?.directory??null,phase_number:n?.phase_number??null,phase_name:n?.phase_name??null,phase_slug:n?.phase_slug??null,phase_req_ids:c&&c!=="TBD"?c:null,plans:n?.plans??[],summaries:n?.summaries??[],incomplete_plans:n?.incomplete_plans??[],has_research:n?.has_research??!1,has_context:n?.has_context??!1,has_verification:n?.has_verification??!1,has_reviews:n?.has_reviews??!1,roadmap_goal:o?.goal??null,roadmap_section:o?.section??null,milestone_version:i.version,milestone_name:i.name});y(l,s)}function uo(t,e,s){e||b("phase required for init plan-phase");let r=Q(t),n=he(t,e),i=dt(t,e),o=ce(t),a=ge(t,{planner_model:oe(t,"gsd-planner"),researcher_model:oe(t,"gsd-phase-researcher"),synthesizer_model:oe(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:!!n,phase_dir:n?.directory??null,phase_number:n?.phase_number??null,phase_name:n?.phase_name??null,roadmap_goal:i?.goal??null,roadmap_section:i?.section??null,milestone_version:o.version,milestone_name:o.name});y(a,s)}function mo(t,e){let s=Q(t),r=ee(t),n=ge(t,{planner_model:oe(t,"gsd-planner"),roadmapper_model:oe(t,"gsd-roadmapper"),commit_docs:s.commit_docs,context_window:s.context_window,planning_exists:G.default.existsSync(r),project_exists:G.default.existsSync(Te.default.join(r,"PROJECT.md")),config_exists:G.default.existsSync(Te.default.join(r,"config.json")),roadmap_exists:G.default.existsSync(Te.default.join(r,"ROADMAP.md")),state_exists:G.default.existsSync(Te.default.join(r,"STATE.md"))});y(n,e)}function po(t,e){let s=Q(t),r=ce(t),n=Pr(t),i=ge(t,{roadmapper_model:oe(t,"gsd-roadmapper"),commit_docs:s.commit_docs,context_window:s.context_window,current_milestone:r,last_completed_milestone:n,roadmap_exists:G.default.existsSync(F(t).roadmap)});y(i,e)}function fo(t,e,s){let r=Q(t),n=ce(t),i=ge(t,{executor_model:oe(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:n.version,milestone_name:n.name,state_exists:G.default.existsSync(F(t).state)});y(i,s)}function go(t,e){Ct(t);let s=Q(t),r=ce(t),n=G.default.existsSync(F(t).state),i="";if(n)try{i=G.default.readFileSync(F(t).state,"utf-8")}catch{}let o=ge(t,{executor_model:oe(t,"gsd-executor"),commit_docs:s.commit_docs,context_window:s.context_window,state_exists:n,state_raw:i,roadmap_exists:G.default.existsSync(F(t).roadmap),config_exists:G.default.existsSync(F(t).config),milestone_version:r.version,milestone_name:r.name});y(o,e)}function ho(t,e,s){e||b("phase required for init verify-work");let r=Q(t),n=he(t,e),i=dt(t,e),o=ge(t,{verifier_model:oe(t,"gsd-verifier"),nyquist_model:oe(t,"gsd-nyquist-auditor"),commit_docs:r.commit_docs,nyquist_validation:r.nyquist_validation,context_window:r.context_window,phase_found:!!n,phase_dir:n?.directory??null,phase_number:n?.phase_number??null,phase_name:n?.phase_name??null,plans:n?.plans??[],summaries:n?.summaries??[],roadmap_goal:i?.goal??null});y(o,s)}function yo(t,e,s){let r=Q(t),n=e?he(t,e):null,i=ce(t),o=ge(t,{planner_model:oe(t,"gsd-planner"),commit_docs:r.commit_docs,context_window:r.context_window,phase_found:!!n,phase_dir:n?.directory??null,phase_number:n?.phase_number??null,phase_name:n?.phase_name??null,milestone_version:i.version,milestone_name:i.name});y(o,s)}function xo(t,e,s){let r=Q(t),n=Te.default.join(W(t),"todos","pending"),i=[];if(G.default.existsSync(n))try{for(let a of G.default.readdirSync(n).filter(c=>c.endsWith(".md")))try{let c=G.default.readFileSync(Te.default.join(n,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=ge(t,{executor_model:oe(t,"gsd-executor"),commit_docs:r.commit_docs,todos:i,todo_count:i.length,area:e??null});y(o,s)}function So(t,e){let s=Q(t),r=ce(t),n=Pr(t),i=ge(t,{planner_model:oe(t,"gsd-planner"),commit_docs:s.commit_docs,context_window:s.context_window,milestone_version:r.version,milestone_name:r.name,last_completed_milestone:n,roadmap_exists:G.default.existsSync(F(t).roadmap),state_exists:G.default.existsSync(F(t).state)});y(i,e)}function bo(t,e){let s=Q(t),r=ge(t,{mapper_model:oe(t,"gsd-codebase-mapper"),commit_docs:s.commit_docs,search_gitignored:s.search_gitignored,context_window:s.context_window,project_exists:G.default.existsSync(Te.default.join(ee(t),"PROJECT.md"))});y(r,e)}function vo(t,e){Ct(t);let s=Q(t),r=ce(t),n=ke(t),i=F(t).phases,o=0,a=0,c=0;if(G.default.existsSync(i))try{let d=G.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).filter(n);c=d.length;for(let u of d){let m=G.default.readdirSync(Te.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=ge(t,{commit_docs:s.commit_docs,context_window:s.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 _o(t,e){let s=Q(t),r=ce(t),n=ge(t,{planner_model:oe(t,"gsd-planner"),roadmapper_model:oe(t,"gsd-roadmapper"),commit_docs:s.commit_docs,context_window:s.context_window,milestone_version:r.version,milestone_name:r.name,state_exists:G.default.existsSync(F(t).state),roadmap_exists:G.default.existsSync(F(t).roadmap)});y(n,e)}function wo(t,e){let s=Q(t),r=Te.default.join(ee(t),"workstreams"),n=ge(t,{commit_docs:s.commit_docs,context_window:s.context_window,workstream_mode:G.default.existsSync(r),workstreams:G.default.existsSync(r)?G.default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name):[]});y(n,e)}function ko(t,e){let s=Te.default.join(ee(t),"workstreams");if(!G.default.existsSync(s)){y(ge(t,{mode:"flat",workstreams:[],count:0}),e);return}let r=G.default.readdirSync(s,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>n.name);y(ge(t,{mode:"workstream",workstreams:r,count:r.length}),e)}function Po(t,e,s){e||b("workstream name required for init remove-workspace");let r=Te.default.join(ee(t),"workstreams",e);if(!G.default.existsSync(r)){y(ge(t,{removed:!1,reason:"not_found",workstream:e}),s);return}try{G.default.rmSync(r,{recursive:!0,force:!0})}catch(n){y(ge(t,{removed:!1,reason:n.message,workstream:e}),s);return}y(ge(t,{removed:!0,workstream:e}),s)}function $o(t,e,s){e||b("agent-type required");let n=Q(t).agent_skills[e]??{};y({agent:e,skills:n},s,JSON.stringify(n))}var G,Te,bn=L(()=>{"use strict";G=U(require("fs")),Te=U(require("path"));ye();$e()});var vn,_n,$r=L(()=>{"use strict";vn=require("@oclif/core");je();_n=class t extends w{static description="Initialise a GSD workflow context";static args={workflow:vn.Args.string({required:!0}),phase:vn.Args.string({required:!1}),rest:vn.Args.string({required:!1})};static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),i=s,o=i[0],a=await Promise.resolve().then(()=>(bn(),Sn)),{gsdError:c}=await Promise.resolve().then(()=>(ye(),xr));switch(o){case"execute-phase":return a.cmdInitExecutePhase(r,i[1],n);case"plan-phase":return a.cmdInitPlanPhase(r,i[1],n);case"new-project":return a.cmdInitNewProject(r,n);case"new-milestone":return a.cmdInitNewMilestone(r,n);case"quick":return a.cmdInitQuick(r,i.slice(1).join(" "),n);case"resume":return a.cmdInitResume(r,n);case"verify-work":return a.cmdInitVerifyWork(r,i[1],n);case"phase-op":return a.cmdInitPhaseOp(r,i[1],n);case"todos":return a.cmdInitTodos(r,i[1],n);case"milestone-op":return a.cmdInitMilestoneOp(r,n);case"map-codebase":return a.cmdInitMapCodebase(r,n);case"progress":return a.cmdInitProgress(r,n);case"manager":return a.cmdInitManager(r,n);case"new-workspace":return a.cmdInitNewWorkspace(r,n);case"list-workspaces":return a.cmdInitListWorkspaces(r,n);case"remove-workspace":return a.cmdInitRemoveWorkspace(r,i[1],n);default:c(`Unknown init workflow: ${o}`)}}}});var wn={};xe(wn,{cmdRoadmapAnalyze:()=>Ao,cmdRoadmapGetPhase:()=>Co,cmdRoadmapUpdatePlanProgress:()=>jo});function Co(t,e,s){let r=F(t).roadmap;if(!Be.default.existsSync(r)){y({found:!1,error:"ROADMAP.md not found"},s,"");return}try{let n=we(Be.default.readFileSync(r,"utf-8"),t),i=ie(e??""),o=new RegExp(`#{2,4}\\s*Phase\\s+${i}:\\s*([^\\n]+)`,"i"),a=n.match(o);if(!a){let x=new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${i}:\\s*([^*]+)\\*\\*`,"i"),S=n.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.`},s,"");return}y({found:!1,phase_number:e},s,"");return}let c=a[1].trim(),l=a.index,u=n.slice(l).match(/\n#{2,4}\s+Phase\s+\d/i),m=u?l+u.index:n.length,p=n.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(`
183
+ `).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},s,p)}catch(n){b("Failed to read ROADMAP.md: "+n.message)}}function Ao(t,e){let s=F(t).roadmap;if(!Be.default.existsSync(s)){y({error:"ROADMAP.md not found",milestones:[],phases:[],current_phase:null},e);return}let r=Be.default.readFileSync(s,"utf-8"),n=we(r,t),i=F(t).phases,o=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,a=[],c;for(;(c=o.exec(n))!==null;){let $=c[1],T=c[2].replace(/\(INSERTED\)/i,"").trim(),k=c.index,j=n.slice(k).match(/\n#{2,4}\s+Phase\s+\d/i),R=j?k+j.index:n.length,E=n.slice(k,R),V=E.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),H=E.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),ae=pe($),X="no_directory",Z=0,Ae=0,qe=!1,Dt=!1;try{let nn=Be.default.readdirSync(i,{withFileTypes:!0}).filter(Ee=>Ee.isDirectory()).map(Ee=>Ee.name).find(Ee=>Ee.startsWith(ae+"-")||Ee===ae);if(nn){let Ee=Be.default.readdirSync(Cr.default.join(i,nn));Z=Ee.filter(Fe=>Fe.endsWith("-PLAN.md")||Fe==="PLAN.md").length,Ae=Ee.filter(Fe=>Fe.endsWith("-SUMMARY.md")||Fe==="SUMMARY.md").length,qe=Ee.some(Fe=>Fe.endsWith("-CONTEXT.md")||Fe==="CONTEXT.md"),Dt=Ee.some(Fe=>Fe.endsWith("-RESEARCH.md")||Fe==="RESEARCH.md"),Ae>=Z&&Z>0?X="complete":Ae>0?X="partial":Z>0?X="planned":Dt?X="researched":qe?X="discussed":X="empty"}}catch{}let As=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${ie($)}[:\\s]`,"i"),en=n.match(As),tn=en?en[1]==="x":!1;tn&&X!=="complete"&&(X="complete"),a.push({number:$,name:T,goal:V?V[1].trim():null,depends_on:H?H[1].trim():null,plan_count:Z,summary_count:Ae,has_context:qe,has_research:Dt,disk_status:X,roadmap_complete:tn})}let l=[],d=/##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi,u;for(;(u=d.exec(n))!==null;)l.push({heading:u[1].trim(),version:"v"+u[2]});let m=a.find($=>$.disk_status==="planned"||$.disk_status==="partial")??null,p=a.find($=>["empty","no_directory","discussed","researched"].includes($.disk_status))??null,f=a.reduce(($,T)=>$+T.plan_count,0),g=a.reduce(($,T)=>$+T.summary_count,0),h=a.filter($=>$.disk_status==="complete").length,x=/-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi,S=new Set,v;for(;(v=x.exec(n))!==null;)S.add(v[1]);let C=new Set(a.map($=>$.number)),P=[...S].filter($=>!C.has($));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:P.length>0?P:null},e)}function jo(t,e,s){e||b("phase number required for roadmap update-plan-progress");let r=F(t).roadmap,n=he(t,e);n||b(`Phase ${e} not found`);let i=n.plans.length,o=n.summaries.length;if(i===0){y({updated:!1,reason:"No plans found",plan_count:0,summary_count:0},s,"no plans");return}let a=o>=i,c=a?"Complete":o>0?"In Progress":"Planned",l=new Date().toISOString().split("T")[0];if(!Be.default.existsSync(r)){y({updated:!1,reason:"ROADMAP.md not found",plan_count:i,summary_count:o},s,"no roadmap");return}let d=Be.default.readFileSync(r,"utf-8"),u=ie(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 n.summaries){let h=g.replace("-SUMMARY.md","").replace("SUMMARY.md","");h&&(d=d.replace(new RegExp(`(-\\s*\\[) (\\]\\s*${ie(h)})`,"i"),"$1x$2"))}Be.default.writeFileSync(r,d,"utf-8"),y({updated:!0,phase:e,plan_count:i,summary_count:o,status:c,complete:a},s,`${o}/${i} ${c}`)}var Be,Cr,kn=L(()=>{"use strict";Be=U(require("fs")),Cr=U(require("path"));ye()});var Bs,Pn,$n,Cn,Ar=L(()=>{"use strict";Bs=require("@oclif/core");je();Pn=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:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(kn(),wn))).cmdRoadmapAnalyze(s,r)}},$n=class t extends w{static description="Get details for a specific phase";static args={phase:Bs.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(kn(),wn))).cmdRoadmapGetPhase(r,s.phase,n)}},Cn=class t extends w{static description="Update plan progress in roadmap";static args={phase:Bs.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(kn(),wn))).cmdRoadmapUpdatePlanProgress(r,s.phase,n)}}});var At={};xe(At,{cmdConfigEnsureSection:()=>Io,cmdConfigGet:()=>Do,cmdConfigNewProject:()=>Mo,cmdConfigSet:()=>To,cmdConfigSetModelProfile:()=>Oo,ensureConfigFile:()=>Gs,setConfigValue:()=>Js});function Eo(t){return!!(Rr.has(t)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(t))}function Fo(t){let e=Ro[t];e&&b(`Unknown config key: ${t}. Did you mean ${e}?`)}function Er(t){let e=t||{},s=jr.default.homedir(),r=et.default.join(s,".gsd","brave_api_key"),n=!!(process.env.BRAVE_API_KEY||me.default.existsSync(r)),i=et.default.join(s,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||me.default.existsSync(i)),a=et.default.join(s,".gsd","exa_api_key"),c=!!(process.env.EXA_API_KEY||me.default.existsSync(a)),l=et.default.join(s,".gsd","defaults.json"),d={};try{if(me.default.existsSync(l)&&(d=JSON.parse(me.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{me.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:n,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 Gs(t){let e=ee(t),s=et.default.join(e,"config.json");try{me.default.existsSync(e)||me.default.mkdirSync(e,{recursive:!0})}catch(n){b("Failed to create .planning directory: "+n.message)}if(me.default.existsSync(s))return{created:!1,reason:"already_exists"};let r=Er({});try{return me.default.writeFileSync(s,JSON.stringify(r,null,2),"utf-8"),{created:!0,path:".planning/config.json"}}catch(n){b("Failed to create config.json: "+n.message)}}function Js(t,e,s){let r=et.default.join(ee(t),"config.json"),n={};try{me.default.existsSync(r)&&(n=JSON.parse(me.default.readFileSync(r,"utf-8")))}catch(c){b("Failed to read config.json: "+c.message)}let i=e.split("."),o=n;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]]=s;try{return me.default.writeFileSync(r,JSON.stringify(n,null,2),"utf-8"),{updated:!0,key:e,value:s,previousValue:a}}catch(c){b("Failed to write config.json: "+c.message)}}function Mo(t,e,s){let r=ee(t),n=et.default.join(r,"config.json");if(me.default.existsSync(n)){y({created:!1,reason:"already_exists"},s,"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{me.default.existsSync(r)||me.default.mkdirSync(r,{recursive:!0})}catch(a){b("Failed to create .planning directory: "+a.message)}let o=Er(i);try{me.default.writeFileSync(n,JSON.stringify(o,null,2),"utf-8"),y({created:!0,path:".planning/config.json"},s,"created")}catch(a){b("Failed to write config.json: "+a.message)}}function Io(t,e){let s=Gs(t);y(s,e,s?.created?"created":"exists")}function To(t,e,s,r){e||b("Usage: config-set <key.path> <value>"),Fo(e),Eo(e)||b(`Unknown config key: "${e}". Valid keys: ${[...Rr].sort().join(", ")}, agent_skills.<agent-type>`);let n=s;if(s==="true")n=!0;else if(s==="false")n=!1;else if(s!==void 0&&!isNaN(Number(s))&&s!=="")n=Number(s);else if(typeof s=="string"&&(s.startsWith("[")||s.startsWith("{")))try{n=JSON.parse(s)}catch{}let i=Js(t,e,n);y(i,r,`${e}=${n}`)}function Do(t,e,s){e||b("Usage: config-get <key.path>");let r=et.default.join(ee(t),"config.json"),n={};try{me.default.existsSync(r)?n=JSON.parse(me.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=n;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,s,String(o))}function Oo(t,e,s){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(", ")}`),Gs(t);let i=Js(t,"model_profile",r)?.previousValue||"balanced",o=Rs(r),a=Es(o),l=i!==r?`\u2713 Model profile set to: ${r} (was: ${i})
173
184
 
174
185
  Agents will now use:
175
186
 
@@ -178,21 +189,21 @@ Next spawned agents will use the new profile.`:`\u2713 Model profile is already
178
189
 
179
190
  Agents are using:
180
191
 
181
- ${a}`;y({updated:!0,profile:r,previousProfile:i,agentToModelMap:o},n,l)}var me,Ar,Ke,jr,$o,jt=L(()=>{"use strict";me=U(require("fs")),Ar=U(require("os")),Ke=U(require("path"));ye();Ot();jr=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"]),$o={"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,An,jn,Rn,En,Fn,Er=L(()=>{"use strict";pt=require("@oclif/core");je();An=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(()=>(jt(),At));i(r,n.key,s)}},jn=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(()=>(jt(),At));i(r,n.key,n.value,s)}},Rn=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(()=>(jt(),At));i(r,n.profile,s)}},En=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(()=>(jt(),At));s(n,e.choices,r)}},Fn=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(()=>(jt(),At));s(n,r)}}});var Qe={};xe(Qe,{cmdFindPhase:()=>Do,cmdPhaseAdd:()=>No,cmdPhaseComplete:()=>zo,cmdPhaseInsert:()=>Wo,cmdPhaseNextDecimal:()=>To,cmdPhasePlanIndex:()=>Oo,cmdPhaseRemove:()=>Vo,cmdPhasesList:()=>Io});function Io(t,e,n){let r=q.default.join(W(t),"phases"),{type:s,phase:i,includeArchived:o}=e;if(!I.default.existsSync(r)){y(s?{files:[],count:0}:{directories:[],count:0},n,"");return}try{let a=I.default.readdirSync(r,{withFileTypes:!0}).filter(c=>c.isDirectory()).map(c=>c.name);if(o){let c=Ut(t);for(let l of c)a.push(`${l.name} [${l.milestone}]`)}if(a.sort((c,l)=>Se(c,l)),i){let c=pe(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=q.default.join(r,l),u=I.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(`
182
- `));return}y({directories:a,count:a.length},n,a.join(`
183
- `))}catch(a){b("Failed to list phases: "+a.message)}}function To(t,e,n){let r=q.default.join(W(t),"phases"),s=pe(e??"");if(!I.default.existsSync(r)){y({found:!1,base_phase:s,next:`${s}.1`,existing:[]},n,`${s}.1`);return}try{let i=I.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)=>Se(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 Do(t,e,n){e||b("phase identifier required");let r=q.default.join(W(t),"phases"),s=pe(e),i={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=I.default.readdirSync(r,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,h)=>Se(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=q.default.join(r,a),m=I.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:J(q.default.join(q.default.relative(t,W(t)),"phases",a)),phase_number:l,phase_name:d,plans:p,summaries:f},n,J(q.default.join(q.default.relative(t,W(t)),"phases",a)))}catch{y(i,n,"")}}function Oo(t,e,n){e||b("phase required for phase-plan-index");let r=q.default.join(W(t),"phases"),s=pe(e),i=null;try{let g=I.default.readdirSync(r,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).sort((h,x)=>Se(h,x)).find(h=>h.startsWith(s));g&&(i=q.default.join(r,g))}catch{}if(!i){y({phase:s,error:"Phase not found",plans:[],waves:{},incomplete:[],has_checkpoints:!1},n);return}let o=I.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=I.default.readFileSync(q.default.join(i,f),"utf-8"),x=le(h),S=h.match(/<task[\s>]/gi)||[],v=h.match(/##\s*Task\s*\d+/gi)||[],$=S.length||v.length,P=parseInt(String(x.wave),10)||1,C=!0;x.autonomous!==void 0&&(C=x.autonomous==="true"||x.autonomous===!0),C||(p=!0);let T=[],k=x.files_modified??x["files-modified"];if(k){let E=Pe(k);T=E?E.map(V=>fe(V)??String(V)):[fe(k)??String(k)]}let j=l.has(g);j||m.push(g),d.push({id:g,wave:P,autonomous:C,objective:h.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()??fe(x.objective)??null,files_modified:T,task_count:$,has_summary:j});let R=String(P);u[R]||(u[R]=[]),u[R].push(g)}y({phase:s,plans:d,waves:u,incomplete:m,has_checkpoints:p},n)}function No(t,e,n,r){e||b("description required for phase add");let s=Q(t),i=q.default.join(W(t),"ROADMAP.md");I.default.existsSync(i)||b("ROADMAP.md not found");let o=I.default.readFileSync(i,"utf-8"),a=we(o,t),c=Le(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 $=parseInt(S[1],10);$>x&&(x=$)}l=x+1,d=`${String(l).padStart(2,"0")}-${c}`}let u=q.default.join(W(t),"phases",d);I.default.mkdirSync(u,{recursive:!0}),I.default.writeFileSync(q.default.join(u,".gitkeep"),"");let m=s.phase_naming==="custom"?"":`
184
- **Depends on:** Phase ${typeof l=="number"?l-1:"TBD"}`,p=`
185
- ### Phase ${l}: ${e}
192
+ ${a}`;y({updated:!0,profile:r,previousProfile:i,agentToModelMap:o},s,l)}var me,jr,et,Rr,Ro,jt=L(()=>{"use strict";me=U(require("fs")),jr=U(require("os")),et=U(require("path"));ye();Ot();Rr=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"]),Ro={"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,An,jn,Rn,En,Fn,Fr=L(()=>{"use strict";pt=require("@oclif/core");je();An=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdConfigGet:i}=await Promise.resolve().then(()=>(jt(),At));i(r,s.key,n)}},jn=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdConfigSet:i}=await Promise.resolve().then(()=>(jt(),At));i(r,s.key,s.value,n)}},Rn=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdConfigSetModelProfile:i}=await Promise.resolve().then(()=>(jt(),At));i(r,s.profile,n)}},En=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:s,raw:r}=this.resolveContext(e),{cmdConfigNewProject:n}=await Promise.resolve().then(()=>(jt(),At));n(s,e.choices,r)}},Fn=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:s,raw:r}=this.resolveContext(e),{cmdConfigEnsureSection:n}=await Promise.resolve().then(()=>(jt(),At));n(s,r)}}});var Ge={};xe(Ge,{cmdFindPhase:()=>qo,cmdPhaseAdd:()=>Uo,cmdPhaseAddBatch:()=>Vo,cmdPhaseComplete:()=>Ho,cmdPhaseInsert:()=>zo,cmdPhaseNextDecimal:()=>Wo,cmdPhasePlanIndex:()=>Lo,cmdPhaseRemove:()=>Yo,cmdPhasesList:()=>No});function No(t,e,s){let r=q.default.join(W(t),"phases"),{type:n,phase:i,includeArchived:o}=e;if(!I.default.existsSync(r)){y(n?{files:[],count:0}:{directories:[],count:0},s,"");return}try{let a=I.default.readdirSync(r,{withFileTypes:!0}).filter(c=>c.isDirectory()).map(c=>c.name);if(o){let c=Ut(t);for(let l of c)a.push(`${l.name} [${l.milestone}]`)}if(a.sort((c,l)=>Se(c,l)),i){let c=pe(i),l=a.find(d=>d.startsWith(c));if(!l){y({files:[],count:0,phase_dir:null,error:"Phase not found"},s,"");return}a=[l]}if(n){let c=[];for(let l of a){let d=q.default.join(r,l),u=I.default.readdirSync(d),m;n==="plans"?m=u.filter(p=>p.endsWith("-PLAN.md")||p==="PLAN.md"):n==="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},s,c.join(`
193
+ `));return}y({directories:a,count:a.length},s,a.join(`
194
+ `))}catch(a){b("Failed to list phases: "+a.message)}}function Wo(t,e,s){let r=q.default.join(W(t),"phases"),n=pe(e??"");if(!I.default.existsSync(r)){y({found:!1,base_phase:n,next:`${n}.1`,existing:[]},s,`${n}.1`);return}try{let i=I.default.readdirSync(r,{withFileTypes:!0}).filter(d=>d.isDirectory()).map(d=>d.name),o=i.some(d=>d.startsWith(n+"-")||d===n),a=new RegExp(`^${n}\\.(\\d+)`),c=i.map(d=>{let u=d.match(a);return u?`${n}.${u[1]}`:null}).filter(Boolean);c.sort((d,u)=>Se(d,u));let l=c.length===0?`${n}.1`:`${n}.${parseInt(c[c.length-1].split(".")[1],10)+1}`;y({found:o,base_phase:n,next:l,existing:c},s,l)}catch(i){b("Failed to calculate next decimal phase: "+i.message)}}function qo(t,e,s){e||b("phase identifier required");let r=q.default.join(W(t),"phases"),n=pe(e),i={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=I.default.readdirSync(r,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,h)=>Se(g,h)).find(g=>g.startsWith(n));if(!a){y(i,s,"");return}let c=a.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),l=c?c[1]:n,d=c&&c[2]?c[2]:null,u=q.default.join(r,a),m=I.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:J(q.default.join(q.default.relative(t,W(t)),"phases",a)),phase_number:l,phase_name:d,plans:p,summaries:f},s,J(q.default.join(q.default.relative(t,W(t)),"phases",a)))}catch{y(i,s,"")}}function Lo(t,e,s){e||b("phase required for phase-plan-index");let r=q.default.join(W(t),"phases"),n=pe(e),i=null;try{let g=I.default.readdirSync(r,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).sort((h,x)=>Se(h,x)).find(h=>h.startsWith(n));g&&(i=q.default.join(r,g))}catch{}if(!i){y({phase:n,error:"Phase not found",plans:[],waves:{},incomplete:[],has_checkpoints:!1},s);return}let o=I.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=I.default.readFileSync(q.default.join(i,f),"utf-8"),x=le(h),S=h.match(/<task[\s>]/gi)||[],v=h.match(/##\s*Task\s*\d+/gi)||[],C=S.length||v.length,P=parseInt(String(x.wave),10)||1,$=!0;x.autonomous!==void 0&&($=x.autonomous==="true"||x.autonomous===!0),$||(p=!0);let T=[],k=x.files_modified??x["files-modified"];if(k){let E=Pe(k);T=E?E.map(V=>fe(V)??String(V)):[fe(k)??String(k)]}let j=l.has(g);j||m.push(g),d.push({id:g,wave:P,autonomous:$,objective:h.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()??fe(x.objective)??null,files_modified:T,task_count:C,has_summary:j});let R=String(P);u[R]||(u[R]=[]),u[R].push(g)}y({phase:n,plans:d,waves:u,incomplete:m,has_checkpoints:p},s)}function Mr(t,e,s){let r=Q(t),n=q.default.join(W(t),"ROADMAP.md");I.default.existsSync(n)||b("ROADMAP.md not found");let i=I.default.readFileSync(n,"utf-8"),o=we(i,t),a=Le(e),c,l;if(s||r.phase_naming==="custom")c=s||a.toUpperCase().replace(/-/g,"-"),c||b('--id required when phase_naming is "custom"'),l=`${c}-${a}`;else{let g=/#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi,h=0,x;for(;(x=g.exec(o))!==null;){let v=parseInt(x[1],10);v>h&&(h=v)}c=h+1,l=`${String(c).padStart(2,"0")}-${a}`}let d=q.default.join(W(t),"phases",l);I.default.mkdirSync(d,{recursive:!0}),I.default.writeFileSync(q.default.join(d,".gitkeep"),"");let u=r.phase_naming==="custom"?"":`
195
+ **Depends on:** Phase ${typeof c=="number"?c-1:"TBD"}`,m=`
196
+ ### Phase ${c}: ${e}
186
197
 
187
198
  **Goal:** [To be planned]
188
- **Requirements**: TBD${m}
199
+ **Requirements**: TBD${u}
189
200
  **Plans:** 0 plans
190
201
 
191
202
  Plans:
192
- - [ ] TBD (run /gsd-plan-phase ${l} to break down)
193
- `,f=o.lastIndexOf(`
194
- ---`),g=f>0?o.slice(0,f)+p+o.slice(f):o+p;I.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:J(q.default.join(q.default.relative(t,W(t)),"phases",d)),naming_mode:s.phase_naming},n,typeof l=="number"?String(l).padStart(2,"0"):String(l))}function Wo(t,e,n,r){(!e||!n)&&b("after-phase and description required for phase insert");let s=q.default.join(W(t),"ROADMAP.md");I.default.existsSync(s)||b("ROADMAP.md not found");let i=I.default.readFileSync(s,"utf-8"),o=we(i,t),a=Le(n),d=pe(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=q.default.join(W(t),"phases"),p=pe(e),f=[];try{let R=I.default.readdirSync(m,{withFileTypes:!0}).filter(V=>V.isDirectory()).map(V=>V.name),E=new RegExp(`^${p}\\.(\\d+)`);for(let V of R){let H=V.match(E);H&&f.push(parseInt(H[1],10))}}catch{}let g=f.length===0?1:Math.max(...f)+1,h=`${p}.${g}`,x=`${h}-${a}`,S=q.default.join(W(t),"phases",x);I.default.mkdirSync(S,{recursive:!0}),I.default.writeFileSync(q.default.join(S,".gitkeep"),"");let v=`
195
- ### Phase ${h}: ${n} (INSERTED)
203
+ - [ ] TBD (run /gsd-plan-phase ${c} to break down)
204
+ `,p=i.lastIndexOf(`
205
+ ---`),f=p>0?i.slice(0,p)+m+i.slice(p):i+m;return I.default.writeFileSync(n,f,"utf-8"),{phase_number:typeof c=="number"?c:String(c),padded:typeof c=="number"?String(c).padStart(2,"0"):String(c),name:e,slug:a,directory:J(q.default.join(q.default.relative(t,W(t)),"phases",l)),naming_mode:r.phase_naming}}function Uo(t,e,s,r){e||b("description required for phase add");let n=Mr(t,e,r);y(n,s,n.padded)}function Vo(t,e,s){e?.trim()||b("description required for phase add-batch");let r=e.split(/ \+ /).map(i=>i.trim()).filter(Boolean),n=[];for(let i of r){let o=Mr(t,i);try{zs(t,`Phase ${o.phase_number} added: ${i}`,!1)}catch{}n.push(o)}y({phases:n,count:n.length},s)}function zo(t,e,s,r){(!e||!s)&&b("after-phase and description required for phase insert");let n=q.default.join(W(t),"ROADMAP.md");I.default.existsSync(n)||b("ROADMAP.md not found");let i=I.default.readFileSync(n,"utf-8"),o=we(i,t),a=Le(s),d=pe(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=q.default.join(W(t),"phases"),p=pe(e),f=[];try{let R=I.default.readdirSync(m,{withFileTypes:!0}).filter(V=>V.isDirectory()).map(V=>V.name),E=new RegExp(`^${p}\\.(\\d+)`);for(let V of R){let H=V.match(E);H&&f.push(parseInt(H[1],10))}}catch{}let g=f.length===0?1:Math.max(...f)+1,h=`${p}.${g}`,x=`${h}-${a}`,S=q.default.join(W(t),"phases",x);I.default.mkdirSync(S,{recursive:!0}),I.default.writeFileSync(q.default.join(S,".gitkeep"),"");let v=`
206
+ ### Phase ${h}: ${s} (INSERTED)
196
207
 
197
208
  **Goal:** [Urgent work - to be planned]
198
209
  **Requirements**: TBD
@@ -201,7 +212,7 @@ Plans:
201
212
 
202
213
  Plans:
203
214
  - [ ] TBD (run /gsd-plan-phase ${h} to break down)
204
- `,$=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),P=i.match($);P||b(`Could not find Phase ${e} header`);let C=i.indexOf(P[0]),k=i.slice(C+P[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),j=k?C+P[0].length+k.index:i.length;I.default.writeFileSync(s,i.slice(0,j)+v+i.slice(j),"utf-8"),y({phase_number:h,after_phase:e,name:n,slug:a,directory:J(q.default.join(q.default.relative(t,W(t)),"phases",x))},r,h)}function qo(t,e,n){let r=[],s=[],i=new RegExp(`^${e}\\.(\\d+)-(.+)$`),o=Ue(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}`;I.default.renameSync(q.default.join(t,a.dir),q.default.join(t,u)),r.push({from:a.dir,to:u});for(let m of I.default.readdirSync(q.default.join(t,u)))if(m.includes(l)){let p=m.replace(l,d);I.default.renameSync(q.default.join(t,u,m),q.default.join(t,u,p)),s.push({from:m,to:p})}}return{renamedDirs:r,renamedFiles:s}}function Lo(t,e){let n=[],r=[],s=Ue(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}`;I.default.renameSync(q.default.join(t,i.dir),q.default.join(t,p)),n.push({from:i.dir,to:p});for(let f of I.default.readdirSync(q.default.join(t,p)))if(f.startsWith(u)){let g=m+f.slice(u.length);I.default.renameSync(q.default.join(t,p,f),q.default.join(t,p,g)),r.push({from:f,to:g})}}return{renamedDirs:n,renamedFiles:r}}function Uo(t,e,n,r){let s=I.default.readFileSync(t,"utf-8"),i=re(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}`)}I.default.writeFileSync(t,s,"utf-8")}function Vo(t,e,n,r){e||b("phase number required for phase remove");let s=q.default.join(W(t),"ROADMAP.md"),i=q.default.join(W(t),"phases");I.default.existsSync(s)||b("ROADMAP.md not found");let o=pe(e),a=e.includes("."),c=n.force||!1,l=Ue(i,!0).find(p=>p.startsWith(o+"-")||p===o)||null;if(l&&!c){let p=I.default.readdirSync(q.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&&I.default.rmSync(q.default.join(i,l),{recursive:!0,force:!0});let d=[],u=[];try{let p=a?qo(i,o.split(".")[0],parseInt(o.split(".")[1],10)):Lo(i,parseInt(o,10));d=p.renamedDirs,u=p.renamedFiles}catch{}Uo(s,e,a,parseInt(o,10));let m=q.default.join(W(t),"STATE.md");if(I.default.existsSync(m)){let p=I.default.readFileSync(m,"utf-8"),f=z(p,"Total Phases");f&&(p=be(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:I.default.existsSync(m)},r)}function zo(t,e,n){e||b("phase number required for phase complete");let r=q.default.join(W(t),"ROADMAP.md"),s=q.default.join(W(t),"STATE.md"),i=q.default.join(W(t),"phases"),o=pe(e),a=new Date().toISOString().split("T")[0],c=he(t,e);c||b(`Phase ${e} not found`);let l=c.plans.length,d=c.summaries.length,u=!1,m=[];try{let h=q.default.join(t,c.directory),x=I.default.readdirSync(h);for(let S of x.filter(v=>v.includes("-UAT")&&v.endsWith(".md"))){let v=I.default.readFileSync(q.default.join(h,S),"utf-8");/result: pending/.test(v)&&m.push(`${S}: has pending tests`),/result: blocked/.test(v)&&m.push(`${S}: has blocked tests`),/status: partial/.test(v)&&m.push(`${S}: testing incomplete (partial)`),/status: diagnosed/.test(v)&&m.push(`${S}: has diagnosed gaps`)}for(let S of x.filter(v=>v.includes("-VERIFICATION")&&v.endsWith(".md"))){let v=I.default.readFileSync(q.default.join(h,S),"utf-8");/status: human_needed/.test(v)&&m.push(`${S}: needs human verification`),/status: gaps_found/.test(v)&&m.push(`${S}: has unresolved gaps`)}}catch{}if(I.default.existsSync(r)){let h=I.default.readFileSync(r,"utf-8"),x=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${re(e)}[:\\s][^\\n]*)`,"i");h=lt(h,x,`$1x$2 (completed ${a})`);let S=re(e);h=h.replace(new RegExp(`^(\\|\\s*${S}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),$=>{let P=$.split("|").slice(1,-1);return P.length===5?(P[3]=" Complete ",P[4]=` ${a} `):P.length===4&&(P[2]=" Complete ",P[3]=` ${a} `),"|"+P.join("|")+"|"}),h=lt(h,new RegExp(`(#{2,4}\\s*Phase\\s+${S}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${l} plans complete`),I.default.writeFileSync(r,h,"utf-8");let v=q.default.join(W(t),"REQUIREMENTS.md");if(I.default.existsSync(v)){let P=we(h,t).match(new RegExp(`(#{2,4}\\s*Phase\\s+${re(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),T=(P?P[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(T){let k=T[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(R=>R.trim()).filter(Boolean),j=I.default.readFileSync(v,"utf-8");for(let R of k){let E=re(R);j=j.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${E}\\*\\*)`,"gi"),"$1x$2"),j=j.replace(new RegExp(`(\\|\\s*${E}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}I.default.writeFileSync(v,j,"utf-8"),u=!0}}}let p=null,f=null,g=!0;try{let h=ke(t),x=I.default.readdirSync(i,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).filter(h).sort((S,v)=>Se(S,v));for(let S of x){let v=S.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(v&&Se(v[1],e)>0){p=v[1],f=v[2]||null,g=!1;break}}}catch{}if(g&&I.default.existsSync(r))try{let h=we(I.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(Se(S[1],e)>0){p=S[1],f=S[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),g=!1;break}}catch{}if(I.default.existsSync(s)){let h=I.default.readFileSync(s,"utf-8"),x=p||e,S=z(h,"Current Phase")||z(h,"Phase"),v=String(x);if(S){let P=S.match(/of\s+(\d+)/),C=S.match(/\(([^)]+)\)/);if(P){let T=f?` (${f.replace(/-/g," ")})`:C?` (${C[1]})`:"";v=`${x} of ${P[1]}${T}`}}h=ue(h,"Current Phase","Phase",v),f&&(h=ue(h,"Current Phase Name",null,f.replace(/-/g," "))),h=ue(h,"Status",null,g?"Milestone complete":"Ready to plan"),h=ue(h,"Current Plan","Plan","Not started"),h=ue(h,"Last Activity","Last activity",a),h=ue(h,"Last Activity Description",null,`Phase ${e} complete${p?`, transitioned to Phase ${p}`:""}`);let $=z(h,"Completed Phases");if($){let P=parseInt($,10)+1;h=be(h,"Completed Phases",String(P))??h;let C=z(h,"Total Phases");if(C){let T=parseInt(C,10);if(T>0){let k=Math.round(P/T*100);h=be(h,"Progress",`${k}%`)??h,h=h.replace(/(percent:\s*)\d+/,`$1${k}`)}}}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:I.default.existsSync(r),state_updated:I.default.existsSync(s),requirements_updated:u,warnings:m,has_warnings:m.length>0},n)}var I,q,et=L(()=>{"use strict";I=U(require("fs")),q=U(require("path"));ye();Ve();$e()});var Ge,Mn,In,Tn,Dn,On,Nn,Fr=L(()=>{"use strict";Ge=require("@oclif/core");je();Mn=class t extends w{static description="Get next decimal phase number";static args={phase:Ge.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)}},In=class t extends w{static description="Add a new phase";static flags={...w.baseFlags,id:Ge.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)}},Tn=class t extends w{static description="Insert a phase at position";static args={position:Ge.Args.string({required:!0}),description:Ge.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)}},Dn=class t extends w{static description="Remove a phase";static args={phase:Ge.Args.string({required:!0})};static flags={...w.baseFlags,force:Ge.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)}},On=class t extends w{static description="Mark a phase as complete";static args={phase:Ge.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)}},Nn=class t extends w{static description="Get phase plan index";static args={phase:Ge.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 Wn={};xe(Wn,{cmdMilestoneComplete:()=>Go,cmdRequirementsMarkComplete:()=>Bo});function Bo(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=F(t).requirements;if(!Y.default.existsSync(s)){y({updated:!1,reason:"REQUIREMENTS.md not found",ids:r},n,"no requirements file");return}let i=Y.default.readFileSync(s,"utf-8"),o=[],a=[],c=[];for(let l of r){let d=!1,u=re(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&&Y.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 Go(t,e,n,r){e||b("version required for milestone complete (e.g., v1.0)");let s=F(t).roadmap,i=F(t).requirements,o=F(t).state,a=Ce.default.join(t,".planning","MILESTONES.md"),c=Ce.default.join(t,".planning","milestones"),l=F(t).phases,d=new Date().toISOString().split("T")[0],u=n.name||e;Y.default.mkdirSync(c,{recursive:!0});let m=ke(t),p=0,f=0,g=0,h=[];try{let P=Y.default.readdirSync(l,{withFileTypes:!0}).filter(C=>C.isDirectory()).map(C=>C.name).sort();for(let C of P){if(!m(C))continue;p++;let T=Y.default.readdirSync(Ce.default.join(l,C)),k=T.filter(R=>R.endsWith("-PLAN.md")||R==="PLAN.md"),j=T.filter(R=>R.endsWith("-SUMMARY.md")||R==="SUMMARY.md");f+=k.length;for(let R of j)try{let E=Y.default.readFileSync(Ce.default.join(l,C,R),"utf-8"),V=le(E),H=fe(V["one-liner"])??Vt(E);H&&h.push(H);let ae=E.match(/\*\*Tasks:\*\*\s*(\d+)/);if(ae)g+=parseInt(ae[1],10);else{let X=E.match(/<task[\s>]/gi)||[],Z=E.match(/##\s*Task\s*\d+/gi)||[];g+=X.length||Z.length}}catch{}}}catch{}Y.default.existsSync(s)&&Y.default.writeFileSync(Ce.default.join(c,`${e}-ROADMAP.md`),Y.default.readFileSync(s,"utf-8"),"utf-8"),Y.default.existsSync(i)&&Y.default.writeFileSync(Ce.default.join(c,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
215
+ `,C=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),P=i.match(C);P||b(`Could not find Phase ${e} header`);let $=i.indexOf(P[0]),k=i.slice($+P[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),j=k?$+P[0].length+k.index:i.length;I.default.writeFileSync(n,i.slice(0,j)+v+i.slice(j),"utf-8"),y({phase_number:h,after_phase:e,name:s,slug:a,directory:J(q.default.join(q.default.relative(t,W(t)),"phases",x))},r,h)}function Bo(t,e,s){let r=[],n=[],i=new RegExp(`^${e}\\.(\\d+)-(.+)$`),o=Ue(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>s).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}`;I.default.renameSync(q.default.join(t,a.dir),q.default.join(t,u)),r.push({from:a.dir,to:u});for(let m of I.default.readdirSync(q.default.join(t,u)))if(m.includes(l)){let p=m.replace(l,d);I.default.renameSync(q.default.join(t,u,m),q.default.join(t,u,p)),n.push({from:m,to:p})}}return{renamedDirs:r,renamedFiles:n}}function Go(t,e){let s=[],r=[],n=Ue(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 n){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}`;I.default.renameSync(q.default.join(t,i.dir),q.default.join(t,p)),s.push({from:i.dir,to:p});for(let f of I.default.readdirSync(q.default.join(t,p)))if(f.startsWith(u)){let g=m+f.slice(u.length);I.default.renameSync(q.default.join(t,p,f),q.default.join(t,p,g)),r.push({from:f,to:g})}}return{renamedDirs:s,renamedFiles:r}}function Jo(t,e,s,r){let n=I.default.readFileSync(t,"utf-8"),i=ie(e);if(n=n.replace(new RegExp(`\\n?#{2,4}\\s*Phase\\s+${i}\\s*:[\\s\\S]*?(?=\\n#{2,4}\\s+Phase\\s+\\d|$)`,"i"),""),n=n.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${i}[:\\s][^\\n]*`,"gi"),""),n=n.replace(new RegExp(`\\n?\\|\\s*${i}\\.?\\s[^|]*\\|[^\\n]*`,"gi"),""),!s)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");n=n.replace(new RegExp(`(#{2,4}\\s*Phase\\s+)${c}(\\s*:)`,"gi"),`$1${l}$2`),n=n.replace(new RegExp(`(Phase\\s+)${c}([:\\s])`,"g"),`$1${l}$2`),n=n.replace(new RegExp(`${d}-(\\d{2})`,"g"),`${u}-$1`),n=n.replace(new RegExp(`(\\|\\s*)${c}\\.\\s`,"g"),`$1${l}. `),n=n.replace(new RegExp(`(Depends on:\\*\\*\\s*Phase\\s+)${c}\\b`,"gi"),`$1${l}`)}I.default.writeFileSync(t,n,"utf-8")}function Yo(t,e,s,r){e||b("phase number required for phase remove");let n=q.default.join(W(t),"ROADMAP.md"),i=q.default.join(W(t),"phases");I.default.existsSync(n)||b("ROADMAP.md not found");let o=pe(e),a=e.includes("."),c=s.force||!1,l=Ue(i,!0).find(p=>p.startsWith(o+"-")||p===o)||null;if(l&&!c){let p=I.default.readdirSync(q.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&&I.default.rmSync(q.default.join(i,l),{recursive:!0,force:!0});let d=[],u=[];try{let p=a?Bo(i,o.split(".")[0],parseInt(o.split(".")[1],10)):Go(i,parseInt(o,10));d=p.renamedDirs,u=p.renamedFiles}catch{}Jo(n,e,a,parseInt(o,10));let m=q.default.join(W(t),"STATE.md");if(I.default.existsSync(m)){let p=I.default.readFileSync(m,"utf-8"),f=z(p,"Total Phases");f&&(p=be(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`)),ne(m,p,t)}y({removed:e,directory_deleted:l,renamed_directories:d,renamed_files:u,roadmap_updated:!0,state_updated:I.default.existsSync(m)},r)}function Ho(t,e,s){e||b("phase number required for phase complete");let r=q.default.join(W(t),"ROADMAP.md"),n=q.default.join(W(t),"STATE.md"),i=q.default.join(W(t),"phases"),o=pe(e),a=new Date().toISOString().split("T")[0],c=he(t,e);c||b(`Phase ${e} not found`);let l=c.plans.length,d=c.summaries.length,u=!1,m=[];try{let h=q.default.join(t,c.directory),x=I.default.readdirSync(h);for(let S of x.filter(v=>v.includes("-UAT")&&v.endsWith(".md"))){let v=I.default.readFileSync(q.default.join(h,S),"utf-8");/result: pending/.test(v)&&m.push(`${S}: has pending tests`),/result: blocked/.test(v)&&m.push(`${S}: has blocked tests`),/status: partial/.test(v)&&m.push(`${S}: testing incomplete (partial)`),/status: diagnosed/.test(v)&&m.push(`${S}: has diagnosed gaps`)}for(let S of x.filter(v=>v.includes("-VERIFICATION")&&v.endsWith(".md"))){let v=I.default.readFileSync(q.default.join(h,S),"utf-8");/status: human_needed/.test(v)&&m.push(`${S}: needs human verification`),/status: gaps_found/.test(v)&&m.push(`${S}: has unresolved gaps`)}}catch{}if(I.default.existsSync(r)){let h=I.default.readFileSync(r,"utf-8"),x=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${ie(e)}[:\\s][^\\n]*)`,"i");h=lt(h,x,`$1x$2 (completed ${a})`);let S=ie(e);h=h.replace(new RegExp(`^(\\|\\s*${S}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),C=>{let P=C.split("|").slice(1,-1);return P.length===5?(P[3]=" Complete ",P[4]=` ${a} `):P.length===4&&(P[2]=" Complete ",P[3]=` ${a} `),"|"+P.join("|")+"|"}),h=lt(h,new RegExp(`(#{2,4}\\s*Phase\\s+${S}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${l} plans complete`),I.default.writeFileSync(r,h,"utf-8");let v=q.default.join(W(t),"REQUIREMENTS.md");if(I.default.existsSync(v)){let P=we(h,t).match(new RegExp(`(#{2,4}\\s*Phase\\s+${ie(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),T=(P?P[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(T){let k=T[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(R=>R.trim()).filter(Boolean),j=I.default.readFileSync(v,"utf-8");for(let R of k){let E=ie(R);j=j.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${E}\\*\\*)`,"gi"),"$1x$2"),j=j.replace(new RegExp(`(\\|\\s*${E}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}I.default.writeFileSync(v,j,"utf-8"),u=!0}}}let p=null,f=null,g=!0;try{let h=ke(t),x=I.default.readdirSync(i,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).filter(h).sort((S,v)=>Se(S,v));for(let S of x){let v=S.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(v&&Se(v[1],e)>0){p=v[1],f=v[2]||null,g=!1;break}}}catch{}if(g&&I.default.existsSync(r))try{let h=we(I.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(Se(S[1],e)>0){p=S[1],f=S[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),g=!1;break}}catch{}if(I.default.existsSync(n)){let h=I.default.readFileSync(n,"utf-8"),x=p||e,S=z(h,"Current Phase")||z(h,"Phase"),v=String(x);if(S){let P=S.match(/of\s+(\d+)/),$=S.match(/\(([^)]+)\)/);if(P){let T=f?` (${f.replace(/-/g," ")})`:$?` (${$[1]})`:"";v=`${x} of ${P[1]}${T}`}}h=ue(h,"Current Phase","Phase",v),f&&(h=ue(h,"Current Phase Name",null,f.replace(/-/g," "))),h=ue(h,"Status",null,g?"Milestone complete":"Ready to plan"),h=ue(h,"Current Plan","Plan","Not started"),h=ue(h,"Last Activity","Last activity",a),h=ue(h,"Last Activity Description",null,`Phase ${e} complete${p?`, transitioned to Phase ${p}`:""}`);let C=z(h,"Completed Phases");if(C){let P=parseInt(C,10)+1;h=be(h,"Completed Phases",String(P))??h;let $=z(h,"Total Phases");if($){let T=parseInt($,10);if(T>0){let k=Math.round(P/T*100);h=be(h,"Progress",`${k}%`)??h,h=h.replace(/(percent:\s*)\d+/,`$1${k}`)}}}ne(n,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:I.default.existsSync(r),state_updated:I.default.existsSync(n),requirements_updated:u,warnings:m,has_warnings:m.length>0},s)}var I,q,Je=L(()=>{"use strict";I=U(require("fs")),q=U(require("path"));ye();Ve();$e()});var Ye,Mn,In,Ir,Tn,Dn,On,Nn,Tr=L(()=>{"use strict";Ye=require("@oclif/core");je();Mn=class t extends w{static description="Get next decimal phase number";static args={phase:Ye.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(Je(),Ge))).cmdPhaseNextDecimal(r,s.phase,n)}},In=class t extends w{static description="Add a new phase";static flags={...w.baseFlags,id:Ye.Flags.string({description:"Custom phase ID"})};static strict=!1;async run(){let{flags:e,argv:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),i=await Promise.resolve().then(()=>(Je(),Ge)),o=s.join(" ");i.cmdPhaseAdd(r,o,n,e.id??null)}},Ir=class t extends w{static description="Add one or more phases from a description string. Multiple phases may be separated by ' + '.";static strict=!1;static flags={...w.baseFlags};async run(){let{flags:e,argv:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),i=await Promise.resolve().then(()=>(Je(),Ge)),o=s.join(" ");i.cmdPhaseAddBatch(r,o,n)}},Tn=class t extends w{static description="Insert a phase at position";static args={position:Ye.Args.string({required:!0}),description:Ye.Args.string({required:!1})};static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),i=s;(await Promise.resolve().then(()=>(Je(),Ge))).cmdPhaseInsert(r,i[0],i.slice(1).join(" "),n)}},Dn=class t extends w{static description="Remove a phase";static args={phase:Ye.Args.string({required:!0})};static flags={...w.baseFlags,force:Ye.Flags.boolean({description:"Force removal",default:!1})};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(Je(),Ge))).cmdPhaseRemove(r,s.phase,{force:e.force},n)}},On=class t extends w{static description="Mark a phase as complete";static args={phase:Ye.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(Je(),Ge))).cmdPhaseComplete(r,s.phase,n)}},Nn=class t extends w{static description="Get phase plan index";static args={phase:Ye.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdPhasePlanIndex:i}=await Promise.resolve().then(()=>(Je(),Ge));i(r,s.phase,n)}}});var Wn={};xe(Wn,{cmdMilestoneComplete:()=>Zo,cmdRequirementsMarkComplete:()=>Xo});function Xo(t,e,s){(!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 n=F(t).requirements;if(!Y.default.existsSync(n)){y({updated:!1,reason:"REQUIREMENTS.md not found",ids:r},s,"no requirements file");return}let i=Y.default.readFileSync(n,"utf-8"),o=[],a=[],c=[];for(let l of r){let d=!1,u=ie(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&&Y.default.writeFileSync(n,i,"utf-8"),y({updated:o.length>0,marked_complete:o,already_complete:a,not_found:c,total:r.length},s,`${o.length}/${r.length} requirements marked complete`)}function Zo(t,e,s,r){e||b("version required for milestone complete (e.g., v1.0)");let n=F(t).roadmap,i=F(t).requirements,o=F(t).state,a=Ce.default.join(t,".planning","MILESTONES.md"),c=Ce.default.join(t,".planning","milestones"),l=F(t).phases,d=new Date().toISOString().split("T")[0],u=s.name||e;Y.default.mkdirSync(c,{recursive:!0});let m=ke(t),p=0,f=0,g=0,h=[];try{let P=Y.default.readdirSync(l,{withFileTypes:!0}).filter($=>$.isDirectory()).map($=>$.name).sort();for(let $ of P){if(!m($))continue;p++;let T=Y.default.readdirSync(Ce.default.join(l,$)),k=T.filter(R=>R.endsWith("-PLAN.md")||R==="PLAN.md"),j=T.filter(R=>R.endsWith("-SUMMARY.md")||R==="SUMMARY.md");f+=k.length;for(let R of j)try{let E=Y.default.readFileSync(Ce.default.join(l,$,R),"utf-8"),V=le(E),H=fe(V["one-liner"])??Vt(E);H&&h.push(H);let ae=E.match(/\*\*Tasks:\*\*\s*(\d+)/);if(ae)g+=parseInt(ae[1],10);else{let X=E.match(/<task[\s>]/gi)||[],Z=E.match(/##\s*Task\s*\d+/gi)||[];g+=X.length||Z.length}}catch{}}}catch{}Y.default.existsSync(n)&&Y.default.writeFileSync(Ce.default.join(c,`${e}-ROADMAP.md`),Y.default.readFileSync(n,"utf-8"),"utf-8"),Y.default.existsSync(i)&&Y.default.writeFileSync(Ce.default.join(c,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
205
216
 
206
217
  **Archived:** ${d}
207
218
  **Status:** SHIPPED
@@ -220,10 +231,10 @@ ${S||"- (none recorded)"}
220
231
 
221
232
  `;if(Y.default.existsSync(a)){let P=Y.default.readFileSync(a,"utf-8");if(!P.trim())Y.default.writeFileSync(a,Ie(`# Milestones
222
233
 
223
- ${v}`),"utf-8");else{let C=P.match(/^(#{1,3}\s+[^\n]*\n\n?)/);C?Y.default.writeFileSync(a,Ie(C[1]+v+P.slice(C[1].length)),"utf-8"):Y.default.writeFileSync(a,Ie(v+P),"utf-8")}}else Y.default.writeFileSync(a,Ie(`# Milestones
234
+ ${v}`),"utf-8");else{let $=P.match(/^(#{1,3}\s+[^\n]*\n\n?)/);$?Y.default.writeFileSync(a,Ie($[1]+v+P.slice($[1].length)),"utf-8"):Y.default.writeFileSync(a,Ie(v+P),"utf-8")}}else Y.default.writeFileSync(a,Ie(`# Milestones
224
235
 
225
- ${v}`),"utf-8");if(Y.default.existsSync(o)){let P=Y.default.readFileSync(o,"utf-8");P=ue(P,"Status",null,`${e} milestone complete`),P=ue(P,"Last Activity","Last activity",d),P=ue(P,"Last Activity Description",null,`${e} milestone completed and archived`),oe(o,P,t)}let $=!1;if(n.archivePhases)try{let P=Ce.default.join(c,`${e}-phases`);Y.default.mkdirSync(P,{recursive:!0});let C=Y.default.readdirSync(l,{withFileTypes:!0}).filter(k=>k.isDirectory()).map(k=>k.name),T=0;for(let k of C)m(k)&&(Y.default.renameSync(Ce.default.join(l,k),Ce.default.join(P,k)),T++);$=T>0}catch{}y({version:e,name:u,date:d,phases:p,plans:f,tasks:g,accomplishments:h,archived:{roadmap:Y.default.existsSync(Ce.default.join(c,`${e}-ROADMAP.md`)),requirements:Y.default.existsSync(Ce.default.join(c,`${e}-REQUIREMENTS.md`)),audit:Y.default.existsSync(Ce.default.join(c,`${e}-MILESTONE-AUDIT.md`)),phases:$},milestones_updated:!0,state_updated:Y.default.existsSync(o)},r)}var Y,Ce,qn=L(()=>{"use strict";Y=U(require("fs")),Ce=U(require("path"));ye();Ve();$e()});var zt,Ln,Un,Mr=L(()=>{"use strict";zt=require("@oclif/core");je();Ln=class t extends w{static description="Complete the current milestone";static args={version:zt.Args.string({required:!1})};static flags={...w.baseFlags,name:zt.Flags.string({description:"Milestone name"}),"archive-phases":zt.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(()=>(qn(),Wn));i(r,n.version??"",{name:e.name??null,archivePhases:e["archive-phases"]},s)}},Un=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(()=>(qn(),Wn));i(r,n,s)}}});var _,Ir,tl,nl,sl,rl,Jo,il,Yo,Ho,Xo,Vn,Tr=L(()=>{"use strict";_=require("zod"),Ir=_.z.object({milestone:_.z.string().optional(),milestone_name:_.z.string().optional(),current_phase:_.z.string().optional(),current_phase_name:_.z.string().optional(),current_plan:_.z.string().optional(),total_phases:_.z.coerce.number().int().nonnegative().optional(),total_plans_in_phase:_.z.coerce.number().int().nonnegative().optional(),status:_.z.string().optional(),progress:_.z.string().optional(),last_activity:_.z.string().optional(),paused_at:_.z.string().optional(),stopped_at:_.z.string().optional()}).passthrough(),tl=_.z.object({found:_.z.literal(!0),phase_number:_.z.string(),phase_name:_.z.string(),goal:_.z.string().nullable(),success_criteria:_.z.array(_.z.string()).default([]),section:_.z.string().optional()}).passthrough(),nl=_.z.object({phase:_.z.union([_.z.string(),_.z.number()]),plan:_.z.union([_.z.string(),_.z.number()]),type:_.z.string(),wave:_.z.union([_.z.string(),_.z.number()]),depends_on:_.z.union([_.z.string(),_.z.array(_.z.string())]),files_modified:_.z.union([_.z.string(),_.z.array(_.z.string())]),autonomous:_.z.union([_.z.boolean(),_.z.string()]),must_haves:_.z.union([_.z.string(),_.z.array(_.z.string())])}).passthrough(),sl=_.z.object({phase:_.z.union([_.z.string(),_.z.number()]),plan:_.z.union([_.z.string(),_.z.number()]),subsystem:_.z.string(),tags:_.z.union([_.z.string(),_.z.array(_.z.string())]),duration:_.z.string(),completed:_.z.string()}).passthrough(),rl=_.z.object({phase:_.z.union([_.z.string(),_.z.number()]),verified:_.z.union([_.z.boolean(),_.z.string()]),status:_.z.string(),score:_.z.union([_.z.number(),_.z.string()])}).passthrough(),Jo=_.z.object({test:_.z.number().int().positive().optional(),name:_.z.string(),expected:_.z.string().optional(),result:_.z.string(),category:_.z.string(),reason:_.z.string().optional(),blocked_by:_.z.string().optional()}).passthrough(),il=_.z.object({phase:_.z.string(),phase_dir:_.z.string(),file:_.z.string(),file_path:_.z.string(),type:_.z.literal("uat"),status:_.z.string(),items:_.z.array(Jo)}).passthrough(),Yo=_.z.object({branching_strategy:_.z.enum(["none","phase","milestone","workstream"]).default("none"),phase_branch_template:_.z.string().default("gsd/phase-{phase}-{slug}"),milestone_branch_template:_.z.string().default("gsd/{milestone}-{slug}"),quick_branch_template:_.z.string().nullable().default(null)}).passthrough(),Ho=_.z.object({research:_.z.boolean().default(!0),plan_check:_.z.boolean().default(!0),verifier:_.z.boolean().default(!0),nyquist_validation:_.z.boolean().default(!0),auto_advance:_.z.boolean().default(!1),node_repair:_.z.boolean().default(!0),node_repair_budget:_.z.number().int().nonnegative().default(2),auto_retry_audit:_.z.boolean().default(!0),auto_retry_audit_budget:_.z.number().int().nonnegative().default(1),auto_retry_tech_debt:_.z.boolean().default(!0),auto_retry_tech_debt_budget:_.z.number().int().nonnegative().default(1),ui_phase:_.z.boolean().default(!0),ui_safety_gate:_.z.boolean().default(!0),text_mode:_.z.boolean().default(!1),research_before_questions:_.z.boolean().default(!1),discuss_mode:_.z.string().default("discuss"),skip_discuss:_.z.boolean().default(!1),_auto_chain_active:_.z.boolean().default(!1)}).passthrough(),Xo=_.z.object({context_warnings:_.z.boolean().default(!0),workflow_guard:_.z.boolean().default(!1)}).passthrough(),Vn=_.z.object({model_profile:_.z.enum(["quality","balanced","budget","inherit"]).default("balanced"),commit_docs:_.z.boolean().default(!0),parallelization:_.z.boolean().default(!0),search_gitignored:_.z.boolean().default(!1),brave_search:_.z.boolean().default(!1),firecrawl:_.z.boolean().default(!1),exa_search:_.z.boolean().default(!1),git:Yo.default({}),workflow:Ho.default({}),hooks:Xo.default({}),agent_skills:_.z.record(_.z.string(),_.z.unknown()).default({})}).passthrough()});var Rt={};xe(Rt,{cmdValidateAgents:()=>aa,cmdValidateConsistency:()=>ia,cmdValidateHealth:()=>oa,cmdVerifyArtifacts:()=>sa,cmdVerifyCommits:()=>na,cmdVerifyKeyLinks:()=>ra,cmdVerifyPhaseCompleteness:()=>ea,cmdVerifyPlanStructure:()=>Qo,cmdVerifyReferences:()=>ta,cmdVerifySummary:()=>Ko});function Zo(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}function Ko(t,e,n,r){e||b("summary-path required");let s=te.default.join(t,e),i=n||2;if(!ne.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=ne.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=>!ne.default.existsSync(te.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(de(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 Qo(t,e,n){e||b("file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),s=Ne(r);if(!s){y({error:"File not found",path:e},n);return}let i=le(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 ea(t,e,n){e||b("phase required");let r=he(t,e);if(!r?.found){y({error:"Phase not found",phase:e},n);return}let s=te.default.join(t,r.directory),i=[],o=[],a;try{a=ne.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 ta(t,e,n){e||b("file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),s=Ne(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("~/")?te.default.join(process.env.HOME??"",c.slice(2)):te.default.join(t,c);(ne.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)||(ne.default.existsSync(te.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 na(t,e,n){(!e||e.length===0)&&b("At least one commit hash required");let r=[],s=[];for(let i of e)(de(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 sa(t,e,n){e||b("plan file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),s=Ne(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=te.default.join(t,l.path),u=ne.default.existsSync(d),m={path:l.path,exists:u,issues:[],passed:!1};if(u){let p=Ne(d)??"",f=p.split(`
226
- `).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 ra(t,e,n){e||b("plan file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),s=Ne(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=Ne(te.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=Ne(te.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 ia(t,e){let n=te.default.join(W(t),"ROADMAP.md"),r=te.default.join(W(t),"phases"),s=[],i=[];if(!ne.default.existsSync(n)){s.push("ROADMAP.md not found"),y({passed:!1,errors:s,warnings:i},e,"failed");return}let o=we(ne.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{ne.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(pe(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(Q(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 oa(t,e,n){let r=te.default.resolve(t);if(r===Dr.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=W(t),i=ee(t),o=te.default.join(i,"PROJECT.md"),a=te.default.join(s,"ROADMAP.md"),c=te.default.join(s,"STATE.md"),l=te.default.join(i,"config.json"),d=te.default.join(s,"phases"),u=[],m=[],p=[],f=[],g=(S,v,$,P,C=!1,T)=>{let k={code:v,message:$,fix:P,repairable:C,...T};S==="error"?u.push(k):S==="warning"?m.push(k):p.push(k)};if(!ne.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(!ne.default.existsSync(o))g("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let S=ne.default.readFileSync(o,"utf-8");for(let v of["## What This Is","## Core Value","## Requirements"])S.includes(v)||g("warning","W001",`PROJECT.md missing section: ${v}`,"Add section manually")}if(ne.default.existsSync(a)||g("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!ne.default.existsSync(c))g("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),f.push("regenerateState");else try{let S=ne.default.readFileSync(c,"utf-8"),v=le(S),$=Ir.safeParse(v);if(!$.success){for(let P of $.error.issues){let C=P.path.join(".")||"(root)";g("warning","W011",`STATE.md frontmatter: field "${C}" - ${P.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}f.includes("regenerateState")||f.push("regenerateState")}}catch{}if(!ne.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(ne.default.readFileSync(l,"utf-8")),v=Vn.safeParse(S);if(!v.success){for(let $ of v.error.issues){let P=$.path.join(".")||"(root)",C=Zo(S,$.path);g("warning","W005",`config.json: field "${P}" - ${$.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:P,expected:$.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 v=Vn.parse({});ne.default.writeFileSync(l,JSON.stringify(v,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="fixSchemaDefaults"&&ne.default.existsSync(l)){let v=JSON.parse(ne.default.readFileSync(l,"utf-8")),$=Vn.parse(v);ne.default.writeFileSync(l,JSON.stringify($,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="regenerateState"){if(ne.default.existsSync(c)){let $=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),P=`${c}.bak-${$}`;ne.default.copyFileSync(c,P),h.push({action:"backupState",success:!0,path:P})}let v=ce(t);oe(c,`# Session State
236
+ ${v}`),"utf-8");if(Y.default.existsSync(o)){let P=Y.default.readFileSync(o,"utf-8");P=ue(P,"Status",null,`${e} milestone complete`),P=ue(P,"Last Activity","Last activity",d),P=ue(P,"Last Activity Description",null,`${e} milestone completed and archived`),ne(o,P,t)}let C=!1;if(s.archivePhases)try{let P=Ce.default.join(c,`${e}-phases`);Y.default.mkdirSync(P,{recursive:!0});let $=Y.default.readdirSync(l,{withFileTypes:!0}).filter(k=>k.isDirectory()).map(k=>k.name),T=0;for(let k of $)m(k)&&(Y.default.renameSync(Ce.default.join(l,k),Ce.default.join(P,k)),T++);C=T>0}catch{}y({version:e,name:u,date:d,phases:p,plans:f,tasks:g,accomplishments:h,archived:{roadmap:Y.default.existsSync(Ce.default.join(c,`${e}-ROADMAP.md`)),requirements:Y.default.existsSync(Ce.default.join(c,`${e}-REQUIREMENTS.md`)),audit:Y.default.existsSync(Ce.default.join(c,`${e}-MILESTONE-AUDIT.md`)),phases:C},milestones_updated:!0,state_updated:Y.default.existsSync(o)},r)}var Y,Ce,qn=L(()=>{"use strict";Y=U(require("fs")),Ce=U(require("path"));ye();Ve();$e()});var zt,Ln,Un,Dr=L(()=>{"use strict";zt=require("@oclif/core");je();Ln=class t extends w{static description="Complete the current milestone";static args={version:zt.Args.string({required:!1})};static flags={...w.baseFlags,name:zt.Flags.string({description:"Milestone name"}),"archive-phases":zt.Flags.boolean({description:"Archive phases",default:!1})};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdMilestoneComplete:i}=await Promise.resolve().then(()=>(qn(),Wn));i(r,s.version??"",{name:e.name??null,archivePhases:e["archive-phases"]},n)}},Un=class t extends w{static description="Mark requirements as complete";static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdRequirementsMarkComplete:i}=await Promise.resolve().then(()=>(qn(),Wn));i(r,s,n)}}});var _,Or,ol,al,cl,ll,Ko,dl,Qo,ea,ta,Vn,Nr=L(()=>{"use strict";_=require("zod"),Or=_.z.object({milestone:_.z.string().optional(),milestone_name:_.z.string().optional(),current_phase:_.z.string().optional(),current_phase_name:_.z.string().optional(),current_plan:_.z.string().optional(),total_phases:_.z.coerce.number().int().nonnegative().optional(),total_plans_in_phase:_.z.coerce.number().int().nonnegative().optional(),status:_.z.string().optional(),progress:_.z.string().optional(),last_activity:_.z.string().optional(),paused_at:_.z.string().optional(),stopped_at:_.z.string().optional()}).passthrough(),ol=_.z.object({found:_.z.literal(!0),phase_number:_.z.string(),phase_name:_.z.string(),goal:_.z.string().nullable(),success_criteria:_.z.array(_.z.string()).default([]),section:_.z.string().optional()}).passthrough(),al=_.z.object({phase:_.z.union([_.z.string(),_.z.number()]),plan:_.z.union([_.z.string(),_.z.number()]),type:_.z.string(),wave:_.z.union([_.z.string(),_.z.number()]),depends_on:_.z.union([_.z.string(),_.z.array(_.z.string())]),files_modified:_.z.union([_.z.string(),_.z.array(_.z.string())]),autonomous:_.z.union([_.z.boolean(),_.z.string()]),must_haves:_.z.union([_.z.string(),_.z.array(_.z.string())])}).passthrough(),cl=_.z.object({phase:_.z.union([_.z.string(),_.z.number()]),plan:_.z.union([_.z.string(),_.z.number()]),subsystem:_.z.string(),tags:_.z.union([_.z.string(),_.z.array(_.z.string())]),duration:_.z.string(),completed:_.z.string()}).passthrough(),ll=_.z.object({phase:_.z.union([_.z.string(),_.z.number()]),verified:_.z.union([_.z.boolean(),_.z.string()]),status:_.z.string(),score:_.z.union([_.z.number(),_.z.string()])}).passthrough(),Ko=_.z.object({test:_.z.number().int().positive().optional(),name:_.z.string(),expected:_.z.string().optional(),result:_.z.string(),category:_.z.string(),reason:_.z.string().optional(),blocked_by:_.z.string().optional()}).passthrough(),dl=_.z.object({phase:_.z.string(),phase_dir:_.z.string(),file:_.z.string(),file_path:_.z.string(),type:_.z.literal("uat"),status:_.z.string(),items:_.z.array(Ko)}).passthrough(),Qo=_.z.object({branching_strategy:_.z.enum(["none","phase","milestone","workstream"]).default("none"),phase_branch_template:_.z.string().default("gsd/phase-{phase}-{slug}"),milestone_branch_template:_.z.string().default("gsd/{milestone}-{slug}"),quick_branch_template:_.z.string().nullable().default(null)}).passthrough(),ea=_.z.object({research:_.z.boolean().default(!0),plan_check:_.z.boolean().default(!0),verifier:_.z.boolean().default(!0),nyquist_validation:_.z.boolean().default(!0),auto_advance:_.z.boolean().default(!1),node_repair:_.z.boolean().default(!0),node_repair_budget:_.z.number().int().nonnegative().default(2),auto_retry_audit:_.z.boolean().default(!0),auto_retry_audit_budget:_.z.number().int().nonnegative().default(1),auto_retry_tech_debt:_.z.boolean().default(!0),auto_retry_tech_debt_budget:_.z.number().int().nonnegative().default(1),ui_phase:_.z.boolean().default(!0),ui_safety_gate:_.z.boolean().default(!0),text_mode:_.z.boolean().default(!1),research_before_questions:_.z.boolean().default(!1),discuss_mode:_.z.string().default("discuss"),skip_discuss:_.z.boolean().default(!1),_auto_chain_active:_.z.boolean().default(!1)}).passthrough(),ta=_.z.object({context_warnings:_.z.boolean().default(!0),workflow_guard:_.z.boolean().default(!1)}).passthrough(),Vn=_.z.object({model_profile:_.z.enum(["quality","balanced","budget","inherit"]).default("balanced"),commit_docs:_.z.boolean().default(!0),parallelization:_.z.boolean().default(!0),search_gitignored:_.z.boolean().default(!1),brave_search:_.z.boolean().default(!1),firecrawl:_.z.boolean().default(!1),exa_search:_.z.boolean().default(!1),git:Qo.default({}),workflow:ea.default({}),hooks:ta.default({}),agent_skills:_.z.record(_.z.string(),_.z.unknown()).default({})}).passthrough()});var Rt={};xe(Rt,{cmdValidateAgents:()=>ma,cmdValidateConsistency:()=>da,cmdValidateHealth:()=>ua,cmdVerifyArtifacts:()=>ca,cmdVerifyCommits:()=>aa,cmdVerifyKeyLinks:()=>la,cmdVerifyPhaseCompleteness:()=>ia,cmdVerifyPlanStructure:()=>ra,cmdVerifyReferences:()=>oa,cmdVerifySummary:()=>sa});function na(t,e){let s=t;for(let r of e){if(s==null||typeof s!="object")return;s=s[r]}return s}function sa(t,e,s,r){e||b("summary-path required");let n=te.default.join(t,e),i=s||2;if(!se.default.existsSync(n)){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=se.default.readFileSync(n,"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=>!se.default.existsSync(te.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(de(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 ra(t,e,s){e||b("file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),n=Ne(r);if(!n){y({error:"File not found",path:e},s);return}let i=le(n),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(n))!==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(n)&&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)},s,o.length===0?"valid":"invalid")}function ia(t,e,s){e||b("phase required");let r=he(t,e);if(!r?.found){y({error:"Phase not found",phase:e},s);return}let n=te.default.join(t,r.directory),i=[],o=[],a;try{a=se.default.readdirSync(n)}catch{y({error:"Cannot read phase directory"},s);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},s,i.length===0?"complete":"incomplete")}function oa(t,e,s){e||b("file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),n=Ne(r);if(!n){y({error:"File not found",path:e},s);return}let i=[],o=[];for(let a of n.match(/@([^\s\n,)]+\/[^\s\n,)]+)/g)||[]){let c=a.slice(1),l=c.startsWith("~/")?te.default.join(process.env.HOME??"",c.slice(2)):te.default.join(t,c);(se.default.existsSync(l)?i:o).push(c)}for(let a of n.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)||(se.default.existsSync(te.default.join(t,c))?i:o).push(c)}y({valid:o.length===0,found:i.length,missing:o,total:i.length+o.length},s,o.length===0?"valid":"invalid")}function aa(t,e,s){(!e||e.length===0)&&b("At least one commit hash required");let r=[],n=[];for(let i of e)(de(t,["cat-file","-t",i]).stdout.trim()==="commit"?r:n).push(i);y({all_valid:n.length===0,valid:r,invalid:n,total:e.length},s,n.length===0?"valid":"invalid")}function ca(t,e,s){e||b("plan file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),n=Ne(r);if(!n){y({error:"File not found",path:e},s);return}let i=an(n,"artifacts");if(i.length===0){y({error:"No must_haves.artifacts found in frontmatter",path:e},s);return}let o=[];for(let c of i){if(typeof c=="string")continue;let l=c;if(!l.path)continue;let d=te.default.join(t,l.path),u=se.default.existsSync(d),m={path:l.path,exists:u,issues:[],passed:!1};if(u){let p=Ne(d)??"",f=p.split(`
237
+ `).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},s,a===o.length?"valid":"invalid")}function la(t,e,s){e||b("plan file path required");let r=te.default.isAbsolute(e)?e:te.default.join(t,e),n=Ne(r);if(!n){y({error:"File not found",path:e},s);return}let i=an(n,"key_links");if(i.length===0){y({error:"No must_haves.key_links found in frontmatter",path:e},s);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=Ne(te.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=Ne(te.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},s,a===o.length?"valid":"invalid")}function da(t,e){let s=te.default.join(W(t),"ROADMAP.md"),r=te.default.join(W(t),"phases"),n=[],i=[];if(!se.default.existsSync(s)){n.push("ROADMAP.md not found"),y({passed:!1,errors:n,warnings:i},e,"failed");return}let o=we(se.default.readFileSync(s,"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{se.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(pe(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(Q(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=n.length===0;y({passed:m,errors:n,warnings:i,warning_count:i.length},e,m?"passed":"failed")}function ua(t,e,s){let r=te.default.resolve(t);if(r===Wr.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},s);return}let n=W(t),i=ee(t),o=te.default.join(i,"PROJECT.md"),a=te.default.join(n,"ROADMAP.md"),c=te.default.join(n,"STATE.md"),l=te.default.join(i,"config.json"),d=te.default.join(n,"phases"),u=[],m=[],p=[],f=[],g=(S,v,C,P,$=!1,T)=>{let k={code:v,message:C,fix:P,repairable:$,...T};S==="error"?u.push(k):S==="warning"?m.push(k):p.push(k)};if(!se.default.existsSync(n)){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},s);return}if(!se.default.existsSync(o))g("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let S=se.default.readFileSync(o,"utf-8");for(let v of["## What This Is","## Core Value","## Requirements"])S.includes(v)||g("warning","W001",`PROJECT.md missing section: ${v}`,"Add section manually")}if(se.default.existsSync(a)||g("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!se.default.existsSync(c))g("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),f.push("regenerateState");else try{let S=se.default.readFileSync(c,"utf-8"),v=le(S),C=Or.safeParse(v);if(!C.success){for(let P of C.error.issues){let $=P.path.join(".")||"(root)";g("warning","W011",`STATE.md frontmatter: field "${$}" - ${P.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}f.includes("regenerateState")||f.push("regenerateState")}}catch{}if(!se.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(se.default.readFileSync(l,"utf-8")),v=Vn.safeParse(S);if(!v.success){for(let C of v.error.issues){let P=C.path.join(".")||"(root)",$=na(S,C.path);g("warning","W005",`config.json: field "${P}" - ${C.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:P,expected:C.message,actual:$})}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 v=Vn.parse({});se.default.writeFileSync(l,JSON.stringify(v,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="fixSchemaDefaults"&&se.default.existsSync(l)){let v=JSON.parse(se.default.readFileSync(l,"utf-8")),C=Vn.parse(v);se.default.writeFileSync(l,JSON.stringify(C,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="regenerateState"){if(se.default.existsSync(c)){let C=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),P=`${c}.bak-${C}`;se.default.copyFileSync(c,P),h.push({action:"backupState",success:!0,path:P})}let v=ce(t);ne(c,`# Session State
227
238
 
228
239
  ## Project Reference
229
240
 
@@ -238,36 +249,36 @@ See: .planning/PROJECT.md
238
249
  ## Session Log
239
250
 
240
251
  - ${new Date().toISOString().split("T")[0]}: STATE.md regenerated by /gsd-health --repair
241
- `,t),h.push({action:S,success:!0,path:"STATE.md"})}}catch(v){h.push({action:S,success:!1,error:v.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 aa(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(Me)},e)}var ne,Dr,te,Et=L(()=>{"use strict";ne=U(require("fs")),Dr=U(require("os")),te=U(require("path"));ye();Ve();Tr();$e()});var Js={};xe(Js,{buildCheckpoint:()=>Nr,cmdAuditUat:()=>ca,cmdRenderCheckpoint:()=>la,parseCurrentTest:()=>Or});function ca(t,e){let n=Je.default.join(W(t),"phases");rt.default.existsSync(n)||b("No phases directory found in planning directory");let r=ke(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=Je.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(Je.default.join(d,m),"utf-8"),f=da(p);f.length>0&&s.push({phase:l,phase_dir:a,file:m,file_path:J(Je.default.relative(t,Je.default.join(d,m))),type:"uat",status:le(p).status||"unknown",items:f})}for(let m of u.filter(p=>p.includes("-VERIFICATION")&&p.endsWith(".md"))){let p=rt.default.readFileSync(Je.default.join(d,m),"utf-8"),f=le(p).status||"unknown";if(f==="human_needed"||f==="gaps_found"){let g=ua(p,f);g.length>0&&s.push({phase:l,phase_dir:a,file:m,file_path:J(Je.default.relative(t,Je.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 la(t,e,n){let r=e.file;r||b("UAT file required: use uat render-checkpoint --file <path>");let s=vr(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=Or(i);o.complete&&b("UAT session is already complete; no pending checkpoint to render");let a=Nr(o);y({file_path:J(Je.default.relative(t,s)),test_number:o.number,test_name:o.name,checkpoint:a},n,a)}function Or(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(`
252
+ `,t),h.push({action:S,success:!0,path:"STATE.md"})}}catch(v){h.push({action:S,success:!1,error:v.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},s)}function ma(t,e){let s=_t();y({agents_dir:s.agents_dir,agents_found:s.agents_installed,installed:s.installed_agents,missing:s.missing_agents,expected:Object.keys(Me)},e)}var se,Wr,te,Et=L(()=>{"use strict";se=U(require("fs")),Wr=U(require("os")),te=U(require("path"));ye();Ve();Nr();$e()});var Ys={};xe(Ys,{buildCheckpoint:()=>Lr,cmdAuditUat:()=>pa,cmdRenderCheckpoint:()=>fa,parseCurrentTest:()=>qr});function pa(t,e){let s=He.default.join(W(t),"phases");rt.default.existsSync(s)||b("No phases directory found in planning directory");let r=ke(t),n=[],i=rt.default.readdirSync(s,{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=He.default.join(s,a),u=rt.default.readdirSync(d);for(let m of u.filter(p=>p.includes("-UAT")&&p.endsWith(".md"))){let p=rt.default.readFileSync(He.default.join(d,m),"utf-8"),f=ga(p);f.length>0&&n.push({phase:l,phase_dir:a,file:m,file_path:J(He.default.relative(t,He.default.join(d,m))),type:"uat",status:le(p).status||"unknown",items:f})}for(let m of u.filter(p=>p.includes("-VERIFICATION")&&p.endsWith(".md"))){let p=rt.default.readFileSync(He.default.join(d,m),"utf-8"),f=le(p).status||"unknown";if(f==="human_needed"||f==="gaps_found"){let g=ha(p,f);g.length>0&&n.push({phase:l,phase_dir:a,file:m,file_path:J(He.default.relative(t,He.default.join(d,m))),type:"verification",status:f,items:g})}}}let o={total_files:n.length,total_items:n.reduce((a,c)=>a+c.items.length,0),by_category:{},by_phase:{}};for(let a of n){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:n,summary:o},e)}function fa(t,e,s){let r=e.file;r||b("UAT file required: use uat render-checkpoint --file <path>");let n=_r(r,t,"UAT file",{allowAbsolute:!0});rt.default.existsSync(n)||b(`UAT file not found: ${r}`);let i=rt.default.readFileSync(n,"utf-8"),o=qr(i);o.complete&&b("UAT session is already complete; no pending checkpoint to render");let a=Lr(o);y({file_path:J(He.default.relative(t,n)),test_number:o.number,test_name:o.name,checkpoint:a},s,a)}function qr(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 s=e[1].trimEnd();if(s.trim()||b("Current Test section is empty"),/\[testing complete\]/i.test(s))return{complete:!0};let r=s.match(/^number:\s*(\d+)\s*$/m),n=s.match(/^name:\s*(.+)\s*$/m),i=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);(!r||!n||!i&&!o)&&b("Current Test section is malformed");let a;return i?a=i[1].split(`
242
253
  `).map(c=>c.replace(/^ {2}/,"")).join(`
243
- `).trim():a=o[1].trim(),{complete:!1,number:parseInt(r[1],10),name:Ws(s[1].trim()),expected:Ws(a)}}function Nr(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(`
244
- `)}function da(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(`
245
- ###`,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:ma(a,u?.[1],m?.[1])};u&&(p.reason=u[1].trim()),m&&(p.blocked_by=m[1].trim()),e.push(p)}}return e}function ua(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(`
246
- `)){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 ma(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,Je,Ys=L(()=>{"use strict";rt=U(require("fs")),Je=U(require("path"));ye();Ve();dn()});var Bt,zn,Bn,Gn,Jn,Yn,Wr=L(()=>{"use strict";Bt=require("@oclif/core");je();zn=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(()=>(Et(),Rt))).cmdValidateConsistency(n,r)}},Bn=class t extends w{static description="Check .planning/ health";static flags={...w.baseFlags,repair:Bt.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(()=>(Et(),Rt))).cmdValidateHealth(n,{repair:e.repair},r)}},Gn=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(()=>(Et(),Rt))).cmdValidateAgents(n,r)}},Jn=class t extends w{static description="Run UAT verification";static args={phase:Bt.Args.string({required:!1})};static flags={...w.baseFlags,plan:Bt.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(()=>(Et(),Rt))).cmdValidateConsistency(r,s)}},Yn=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(()=>(Ys(),Js));s(n,r)}}});var it={};xe(it,{cmdWorkstreamComplete:()=>ya,cmdWorkstreamCreate:()=>fa,cmdWorkstreamGet:()=>Sa,cmdWorkstreamList:()=>ga,cmdWorkstreamProgress:()=>ba,cmdWorkstreamSet:()=>xa,cmdWorkstreamStatus:()=>ha});function pa(t,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let n=ee(t),r=O.default.join(n,"workstreams",e);if(D.default.existsSync(O.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"}];D.default.mkdirSync(r,{recursive:!0});let i=[];try{for(let o of s){let a=O.default.join(n,o.name);D.default.existsSync(a)&&(D.default.renameSync(a,O.default.join(r,o.name)),i.push(o.name))}}catch(o){for(let a of i)try{D.default.renameSync(O.default.join(r,a),O.default.join(n,a))}catch{}try{D.default.rmSync(r,{recursive:!0})}catch{}try{D.default.rmdirSync(O.default.join(n,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:i}}function fa(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=ee(t);D.default.existsSync(i)||b(".planning/ directory not found - run /gsd-new-project first");let o=O.default.join(i,"workstreams"),a=O.default.join(o,s);if(D.default.existsSync(a)&&D.default.existsSync(O.default.join(a,"STATE.md"))){y({created:!1,error:"already_exists",workstream:s,path:J(O.default.relative(t,a))},r);return}let c=!D.default.existsSync(o),l=null;if(c&&n.migrate!==!1)if(D.default.existsSync(O.default.join(i,"ROADMAP.md"))||D.default.existsSync(O.default.join(i,"STATE.md"))||D.default.existsSync(O.default.join(i,"phases"))){let g=n.migrateName??null,h;if(g)h=g;else try{let x=ce(t);h=Le(x.name)||"default"}catch{h="default"}try{l=pa(t,h)}catch(x){y({created:!1,error:"migration_failed",message:x.message},r);return}}else D.default.mkdirSync(o,{recursive:!0});D.default.mkdirSync(a,{recursive:!0}),D.default.mkdirSync(O.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(`
247
- `),m=O.default.join(a,"STATE.md");D.default.existsSync(m)||D.default.writeFileSync(m,u,"utf-8"),ct(t,s);let p=J(O.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 ga(t,e){let n=O.default.join(ee(t),"workstreams");if(!D.default.existsSync(n)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let r=[];for(let s of D.default.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory())){let i=O.default.join(n,s.name),o=O.default.join(i,"phases"),a=Ue(o),c=0;for(let u of a)try{let m=D.default.readdirSync(O.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=D.default.readFileSync(O.default.join(i,"STATE.md"),"utf-8");l=z(u,"Status")||"unknown",d=z(u,"Current Phase")}catch{}r.push({name:s.name,path:J(O.default.relative(t,i)),has_roadmap:D.default.existsSync(O.default.join(i,"ROADMAP.md")),has_state:D.default.existsSync(O.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 ha(t,e,n){e||b("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let r=O.default.join(ee(t),"workstreams",e);if(!D.default.existsSync(r)){y({found:!1,workstream:e},n);return}let s=F(t,e),i={roadmap:D.default.existsSync(s.roadmap),state:D.default.existsSync(s.state),requirements:D.default.existsSync(s.requirements)},o=[];for(let c of Ue(s.phases).sort())try{let l=D.default.readdirSync(O.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=D.default.readFileSync(s.state,"utf-8");a={status:z(c,"Status")||"unknown",current_phase:z(c,"Current Phase"),last_activity:z(c,"Last Activity")}}catch{}y({found:!0,workstream:e,path:J(O.default.relative(t,r)),files:i,phases:o,phase_count:o.length,completed_phases:o.filter(c=>c.status==="complete").length,...a},n)}function ya(t,e,n,r){e||b("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let s=ee(t),i=O.default.join(s,"workstreams"),o=O.default.join(i,e);if(!D.default.existsSync(o)){y({completed:!1,error:"not_found",workstream:e},r);return}let a=Xe(t);a===e&&ct(t,null);let c=O.default.join(s,"milestones"),l=new Date().toISOString().split("T")[0],d=O.default.join(c,`ws-${e}-${l}`),u=1;for(;D.default.existsSync(d);)d=O.default.join(c,`ws-${e}-${l}-${u++}`);D.default.mkdirSync(d,{recursive:!0});let m=[];try{for(let f of D.default.readdirSync(o,{withFileTypes:!0}))D.default.renameSync(O.default.join(o,f.name),O.default.join(d,f.name)),m.push(f.name)}catch(f){for(let g of m)try{D.default.renameSync(O.default.join(d,g),O.default.join(o,g))}catch{}try{D.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{D.default.rmdirSync(o)}catch{}let p=0;try{p=D.default.readdirSync(i,{withFileTypes:!0}).filter(f=>f.isDirectory()).length,p===0&&D.default.rmdirSync(i)}catch{}y({completed:!0,workstream:e,archived_to:J(O.default.relative(t,d)),remaining_workstreams:p,reverted_to_flat:p===0},r)}function xa(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=O.default.join(ee(t),"workstreams",e);if(!D.default.existsSync(r)){y({active:null,error:"not_found",workstream:e},n);return}ct(t,e),y({active:e,set:!0},n,e)}function Sa(t,e){let n=Xe(t),r=O.default.join(ee(t),"workstreams");y({active:n,mode:D.default.existsSync(r)?"workstream":"flat"},e,n||"none")}function ba(t,e){let n=ee(t),r=O.default.join(n,"workstreams");if(!D.default.existsSync(r)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let s=Xe(t),i=[];for(let o of D.default.readdirSync(r,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=O.default.join(r,o.name),c=O.default.join(a,"phases"),l=Ue(c),d=0,u=0,m=0;for(let h of l)try{let x=D.default.readdirSync(O.default.join(c,h)),S=wt(x),v=kt(x);u+=S.length,m+=Math.min(v.length,S.length),S.length>0&&v.length>=S.length&&d++}catch{}let p=l.length;try{let x=D.default.readFileSync(O.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=D.default.readFileSync(O.default.join(a,"STATE.md"),"utf-8");f=z(h,"Status")||"unknown",g=z(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 D,O,ot=L(()=>{"use strict";D=U(require("fs")),O=U(require("path"));ye();$e()});var at,Hn,Xn,Zn,Kn,Qn,es,ts,qr=L(()=>{"use strict";at=require("@oclif/core");je();Hn=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)}},Xn=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)}},Zn=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)}},Kn=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)}},Qn=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)}},es=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)}},ts=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 ve={};xe(ve,{cmdCommit:()=>Ca,cmdCommitToSubrepo:()=>Aa,cmdCurrentTimestamp:()=>_a,cmdGenerateSlug:()=>va,cmdHistoryDigest:()=>Pa,cmdListTodos:()=>wa,cmdProgressRender:()=>Ea,cmdResolveModel:()=>$a,cmdScaffold:()=>Ia,cmdStats:()=>Ta,cmdSummaryExtract:()=>ja,cmdTodoComplete:()=>Fa,cmdTodoMatchPhase:()=>Ma,cmdVerifyPathExists:()=>ka,cmdWebsearch:()=>Ra});function va(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 _a(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 wa(t,e,n){let r=K.default.join(W(t),"todos","pending"),s=0,i=[];try{let o=B.default.readdirSync(r).filter(a=>a.endsWith(".md"));for(let a of o)try{let c=B.default.readFileSync(K.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:J(K.default.relative(t,K.default.join(r,a)))})}catch{}}catch{}y({count:s,todos:i},n,s.toString())}function ka(t,e,n){e||b("path required for verification"),e.includes("\0")&&b("path contains null bytes");let r=K.default.isAbsolute(e)?e:K.default.join(t,e);try{let s=B.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 Pa(t,e){let n=F(t).phases,r={phases:{},decisions:[],tech_stack:new Set},s=[];for(let i of Ut(t))s.push({name:i.name,fullPath:i.fullPath,milestone:i.milestone});if(B.default.existsSync(n))try{for(let i of B.default.readdirSync(n,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())s.push({name:i,fullPath:K.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=B.default.readdirSync(a).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of c)try{let d=B.default.readFileSync(K.default.join(a,l),"utf-8"),u=le(d),m=fe(u.phase)??o.split("-")[0];r.phases[m]||(r.phases[m]={name:fe(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?Pe(p.provides)?.forEach(g=>r.phases[m].provides.add(fe(g)??String(g))):u.provides&&Pe(u.provides)?.forEach(g=>r.phases[m].provides.add(fe(g)??String(g))),p?.affects&&Pe(p.affects)?.forEach(g=>r.phases[m].affects.add(fe(g)??String(g))),u["patterns-established"]&&Pe(u["patterns-established"])?.forEach(g=>r.phases[m].patterns.add(fe(g)??String(g))),u["key-decisions"]&&Pe(u["key-decisions"])?.forEach(g=>r.decisions.push({phase:m,decision:fe(g)??String(g)}));let f=Pt(u["tech-stack"]);f?.added&&Pe(f.added)?.forEach(g=>{let h=fe(g);if(h)r.tech_stack.add(h);else{let x=Pt(g);x&&r.tech_stack.add(fe(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 $a(t,e,n){e||b("agent-type required");let r=Q(t),s=ie(t,e),i=Me[e];y(i?{model:s,profile:r.model_profile}:{model:s,profile:r.model_profile,unknown_agent:!0},n,s)}function Ca(t,e,n,r,s=!1,i=!1){!e&&!s&&b("commit message required");let o=e;o&&(o=br(o));let a=Q(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=he(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=ce(t);f?.version&&(p=a.milestone_branch_template.replace("{milestone}",f.version).replace("{slug}",Le(f.name)||"milestone"))}if(p){let f=de(t,["rev-parse","--abbrev-ref","HEAD"]);f.exitCode===0&&f.stdout.trim()!==p&&de(t,["checkout","-b",p]).exitCode!==0&&de(t,["checkout",p])}}let c=n&&n.length>0?n:[".planning/"];for(let p of c){let f=K.default.join(t,p);B.default.existsSync(f)?de(t,["add",p]):de(t,["rm","--cached","--ignore-unmatch",p])}let l=s?["commit","--amend","--no-edit"]:["commit","-m",o];i&&l.push("--no-verify");let d=de(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=de(t,["rev-parse","--short","HEAD"]),m=u.exitCode===0?u.stdout:null;y({committed:!0,hash:m,reason:"committed"},r,m||"committed")}function Aa(t,e,n,r){e||b("commit message required");let i=Q(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(", ")}
248
- `);let c={};for(let[l,d]of Object.entries(o)){let u=K.default.join(t,l);for(let f of d)de(u,["add",f.slice(l.length+1)]);let m=de(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=de(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 ja(t,e,n,r){e||b("summary-path required for summary-extract");let s=K.default.join(t,e);if(!B.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=B.default.readFileSync(s,"utf-8"),o=le(i),a=l=>(l||[]).map(d=>{let u=fe(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:fe(o["one-liner"])??Vt(i)??null,key_files:Pe(o["key-files"])??[],tech_added:Pe(Pt(o["tech-stack"])?.added)??[],patterns:Pe(o["patterns-established"])??[],decisions:a(Pe(o["key-decisions"])),requirements_completed:Pe(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 Ra(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}
254
+ `).trim():a=o[1].trim(),{complete:!1,number:parseInt(r[1],10),name:Ws(n[1].trim()),expected:Ws(a)}}function Lr(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(`
255
+ `)}function ga(t){let e=[],s=/###\s*(\d+)\.\s*([^\n]+)\nexpected:\s*([^\n]+)\nresult:\s*(\w+)(?:\n(?:reported|reason|blocked_by):\s*[^\n]*)?/g,r;for(;(r=s.exec(t))!==null;){let[,n,i,o,a]=r;if(a==="pending"||a==="skipped"||a==="blocked"){let c=t.slice(r.index),l=c.indexOf(`
256
+ ###`,1),d=l>0?c.slice(0,l):c,u=d.match(/reason:\s*(.+)/),m=d.match(/blocked_by:\s*(.+)/),p={test:parseInt(n,10),name:i.trim(),expected:o.trim(),result:a,category:ya(a,u?.[1],m?.[1])};u&&(p.reason=u[1].trim()),m&&(p.blocked_by=m[1].trim()),e.push(p)}}return e}function ha(t,e){let s=[];if(e==="human_needed"){let r=t.match(/##\s*Human Verification.*?\n([\s\S]*?)(?=\n##\s|\n---\s|$)/i);if(r)for(let n of r[1].split(`
257
+ `)){let i=n.match(/\|\s*(\d+)\s*\|\s*([^|]+)/),o=n.match(/^[-*]\s+(.+)/),a=n.match(/^(\d+)\.\s+(.+)/);i?s.push({test:parseInt(i[1],10),name:i[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 ya(t,e,s){if(t==="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 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,He,Hs=L(()=>{"use strict";rt=U(require("fs")),He=U(require("path"));ye();Ve();dn()});var Bt,zn,Bn,Gn,Jn,Yn,Ur=L(()=>{"use strict";Bt=require("@oclif/core");je();zn=class t extends w{static description="Validate planning consistency";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Et(),Rt))).cmdValidateConsistency(s,r)}},Bn=class t extends w{static description="Check .planning/ health";static flags={...w.baseFlags,repair:Bt.Flags.boolean({description:"Auto-repair issues",default:!1})};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Et(),Rt))).cmdValidateHealth(s,{repair:e.repair},r)}},Gn=class t extends w{static description="Validate agent configurations";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Et(),Rt))).cmdValidateAgents(s,r)}},Jn=class t extends w{static description="Run UAT verification";static args={phase:Bt.Args.string({required:!1})};static flags={...w.baseFlags,plan:Bt.Flags.string({description:"Plan to verify"})};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(Et(),Rt))).cmdValidateConsistency(r,n)}},Yn=class t extends w{static description="Audit UAT results";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e),{cmdAuditUat:n}=await Promise.resolve().then(()=>(Hs(),Ys));n(s,r)}}});var it={};xe(it,{cmdWorkstreamComplete:()=>_a,cmdWorkstreamCreate:()=>Sa,cmdWorkstreamGet:()=>ka,cmdWorkstreamList:()=>ba,cmdWorkstreamProgress:()=>Pa,cmdWorkstreamSet:()=>wa,cmdWorkstreamStatus:()=>va});function xa(t,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let s=ee(t),r=O.default.join(s,"workstreams",e);if(D.default.existsSync(O.default.join(s,"workstreams")))throw new Error("Already in workstream mode - .planning/workstreams/ exists");let n=[{name:"ROADMAP.md",type:"file"},{name:"STATE.md",type:"file"},{name:"REQUIREMENTS.md",type:"file"},{name:"phases",type:"dir"}];D.default.mkdirSync(r,{recursive:!0});let i=[];try{for(let o of n){let a=O.default.join(s,o.name);D.default.existsSync(a)&&(D.default.renameSync(a,O.default.join(r,o.name)),i.push(o.name))}}catch(o){for(let a of i)try{D.default.renameSync(O.default.join(r,a),O.default.join(s,a))}catch{}try{D.default.rmSync(r,{recursive:!0})}catch{}try{D.default.rmdirSync(O.default.join(s,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:i}}function Sa(t,e,s,r){e||b("workstream name required. Usage: workstream create <name>");let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");n||b("Invalid workstream name - must contain at least one alphanumeric character");let i=ee(t);D.default.existsSync(i)||b(".planning/ directory not found - run /gsd-new-project first");let o=O.default.join(i,"workstreams"),a=O.default.join(o,n);if(D.default.existsSync(a)&&D.default.existsSync(O.default.join(a,"STATE.md"))){y({created:!1,error:"already_exists",workstream:n,path:J(O.default.relative(t,a))},r);return}let c=!D.default.existsSync(o),l=null;if(c&&s.migrate!==!1)if(D.default.existsSync(O.default.join(i,"ROADMAP.md"))||D.default.existsSync(O.default.join(i,"STATE.md"))||D.default.existsSync(O.default.join(i,"phases"))){let g=s.migrateName??null,h;if(g)h=g;else try{let x=ce(t);h=Le(x.name)||"default"}catch{h="default"}try{l=xa(t,h)}catch(x){y({created:!1,error:"migration_failed",message:x.message},r);return}}else D.default.mkdirSync(o,{recursive:!0});D.default.mkdirSync(a,{recursive:!0}),D.default.mkdirSync(O.default.join(a,"phases"),{recursive:!0});let d=new Date().toISOString().split("T")[0],u=["---",`workstream: ${n}`,`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(`
258
+ `),m=O.default.join(a,"STATE.md");D.default.existsSync(m)||D.default.writeFileSync(m,u,"utf-8"),ct(t,n);let p=J(O.default.relative(t,a));y({created:!0,workstream:n,path:p,state_path:p+"/STATE.md",phases_path:p+"/phases",migration:l??null,active:!0},r)}function ba(t,e){let s=O.default.join(ee(t),"workstreams");if(!D.default.existsSync(s)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let r=[];for(let n of D.default.readdirSync(s,{withFileTypes:!0}).filter(i=>i.isDirectory())){let i=O.default.join(s,n.name),o=O.default.join(i,"phases"),a=Ue(o),c=0;for(let u of a)try{let m=D.default.readdirSync(O.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=D.default.readFileSync(O.default.join(i,"STATE.md"),"utf-8");l=z(u,"Status")||"unknown",d=z(u,"Current Phase")}catch{}r.push({name:n.name,path:J(O.default.relative(t,i)),has_roadmap:D.default.existsSync(O.default.join(i,"ROADMAP.md")),has_state:D.default.existsSync(O.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 va(t,e,s){e||b("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let r=O.default.join(ee(t),"workstreams",e);if(!D.default.existsSync(r)){y({found:!1,workstream:e},s);return}let n=F(t,e),i={roadmap:D.default.existsSync(n.roadmap),state:D.default.existsSync(n.state),requirements:D.default.existsSync(n.requirements)},o=[];for(let c of Ue(n.phases).sort())try{let l=D.default.readdirSync(O.default.join(n.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=D.default.readFileSync(n.state,"utf-8");a={status:z(c,"Status")||"unknown",current_phase:z(c,"Current Phase"),last_activity:z(c,"Last Activity")}}catch{}y({found:!0,workstream:e,path:J(O.default.relative(t,r)),files:i,phases:o,phase_count:o.length,completed_phases:o.filter(c=>c.status==="complete").length,...a},s)}function _a(t,e,s,r){e||b("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let n=ee(t),i=O.default.join(n,"workstreams"),o=O.default.join(i,e);if(!D.default.existsSync(o)){y({completed:!1,error:"not_found",workstream:e},r);return}let a=Ke(t);a===e&&ct(t,null);let c=O.default.join(n,"milestones"),l=new Date().toISOString().split("T")[0],d=O.default.join(c,`ws-${e}-${l}`),u=1;for(;D.default.existsSync(d);)d=O.default.join(c,`ws-${e}-${l}-${u++}`);D.default.mkdirSync(d,{recursive:!0});let m=[];try{for(let f of D.default.readdirSync(o,{withFileTypes:!0}))D.default.renameSync(O.default.join(o,f.name),O.default.join(d,f.name)),m.push(f.name)}catch(f){for(let g of m)try{D.default.renameSync(O.default.join(d,g),O.default.join(o,g))}catch{}try{D.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{D.default.rmdirSync(o)}catch{}let p=0;try{p=D.default.readdirSync(i,{withFileTypes:!0}).filter(f=>f.isDirectory()).length,p===0&&D.default.rmdirSync(i)}catch{}y({completed:!0,workstream:e,archived_to:J(O.default.relative(t,d)),remaining_workstreams:p,reverted_to_flat:p===0},r)}function wa(t,e,s){if(!e){ct(t,null),y({active:null,cleared:!0},s);return}if(!/^[a-zA-Z0-9_-]+$/.test(e)){y({active:null,error:"invalid_name",message:"Workstream name must be alphanumeric, hyphens, and underscores only"},s);return}let r=O.default.join(ee(t),"workstreams",e);if(!D.default.existsSync(r)){y({active:null,error:"not_found",workstream:e},s);return}ct(t,e),y({active:e,set:!0},s,e)}function ka(t,e){let s=Ke(t),r=O.default.join(ee(t),"workstreams");y({active:s,mode:D.default.existsSync(r)?"workstream":"flat"},e,s||"none")}function Pa(t,e){let s=ee(t),r=O.default.join(s,"workstreams");if(!D.default.existsSync(r)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let n=Ke(t),i=[];for(let o of D.default.readdirSync(r,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=O.default.join(r,o.name),c=O.default.join(a,"phases"),l=Ue(c),d=0,u=0,m=0;for(let h of l)try{let x=D.default.readdirSync(O.default.join(c,h)),S=wt(x),v=kt(x);u+=S.length,m+=Math.min(v.length,S.length),S.length>0&&v.length>=S.length&&d++}catch{}let p=l.length;try{let x=D.default.readFileSync(O.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=D.default.readFileSync(O.default.join(a,"STATE.md"),"utf-8");f=z(h,"Status")||"unknown",g=z(h,"Current Phase")}catch{}i.push({name:o.name,active:o.name===n,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:n,workstreams:i,count:i.length},e)}var D,O,ot=L(()=>{"use strict";D=U(require("fs")),O=U(require("path"));ye();$e()});var at,Hn,Xn,Zn,Kn,Qn,es,ts,Vr=L(()=>{"use strict";at=require("@oclif/core");je();Hn=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamCreate(r,s.name,{migrate:!e["no-migrate"],migrateName:e["migrate-name"]??null},n)}},Xn=class t extends w{static description="List workstreams";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamList(s,r)}},Zn=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamStatus(r,s.name,n)}},Kn=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamComplete(r,s.name,{},n)}},Qn=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamSet(r,s.name,n)}},es=class t extends w{static description="Get active workstream";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamGet(s,r)}},ts=class t extends w{static description="Show workstream progress";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:s,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamProgress(s,r)}}});var ve={};xe(ve,{cmdCommit:()=>Fa,cmdCommitToSubrepo:()=>Ma,cmdCurrentTimestamp:()=>Ca,cmdGenerateSlug:()=>$a,cmdHistoryDigest:()=>Ra,cmdListTodos:()=>Aa,cmdProgressRender:()=>Da,cmdResolveModel:()=>Ea,cmdScaffold:()=>Wa,cmdStats:()=>qa,cmdSummaryExtract:()=>Ia,cmdTodoComplete:()=>Oa,cmdTodoMatchPhase:()=>Na,cmdVerifyPathExists:()=>ja,cmdWebsearch:()=>Ta});function $a(t,e){t||b("text required for slug generation");let s=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");y({slug:s},e,s)}function Ca(t,e){let s=new Date,r;t==="date"?r=s.toISOString().split("T")[0]:t==="filename"?r=s.toISOString().replace(/:/g,"-").replace(/\..+/,""):r=s.toISOString(),y({timestamp:r},e,r)}function Aa(t,e,s){let r=K.default.join(W(t),"todos","pending"),n=0,i=[];try{let o=B.default.readdirSync(r).filter(a=>a.endsWith(".md"));for(let a of o)try{let c=B.default.readFileSync(K.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;n++,i.push({file:a,created:l?l[1].trim():"unknown",title:d?d[1].trim():"Untitled",area:m,path:J(K.default.relative(t,K.default.join(r,a)))})}catch{}}catch{}y({count:n,todos:i},s,n.toString())}function ja(t,e,s){e||b("path required for verification"),e.includes("\0")&&b("path contains null bytes");let r=K.default.isAbsolute(e)?e:K.default.join(t,e);try{let n=B.default.statSync(r);y({exists:!0,type:n.isDirectory()?"directory":n.isFile()?"file":"other"},s,"true")}catch{y({exists:!1,type:null},s,"false")}}function Ra(t,e){let s=F(t).phases,r={phases:{},decisions:[],tech_stack:new Set},n=[];for(let i of Ut(t))n.push({name:i.name,fullPath:i.fullPath,milestone:i.milestone});if(B.default.existsSync(s))try{for(let i of B.default.readdirSync(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())n.push({name:i,fullPath:K.default.join(s,i),milestone:null})}catch{}if(n.length===0){y({phases:{},decisions:[],tech_stack:[]},e);return}try{for(let{name:o,fullPath:a}of n){let c=B.default.readdirSync(a).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of c)try{let d=B.default.readFileSync(K.default.join(a,l),"utf-8"),u=le(d),m=fe(u.phase)??o.split("-")[0];r.phases[m]||(r.phases[m]={name:fe(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?Pe(p.provides)?.forEach(g=>r.phases[m].provides.add(fe(g)??String(g))):u.provides&&Pe(u.provides)?.forEach(g=>r.phases[m].provides.add(fe(g)??String(g))),p?.affects&&Pe(p.affects)?.forEach(g=>r.phases[m].affects.add(fe(g)??String(g))),u["patterns-established"]&&Pe(u["patterns-established"])?.forEach(g=>r.phases[m].patterns.add(fe(g)??String(g))),u["key-decisions"]&&Pe(u["key-decisions"])?.forEach(g=>r.decisions.push({phase:m,decision:fe(g)??String(g)}));let f=Pt(u["tech-stack"]);f?.added&&Pe(f.added)?.forEach(g=>{let h=fe(g);if(h)r.tech_stack.add(h);else{let x=Pt(g);x&&r.tech_stack.add(fe(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 Ea(t,e,s){e||b("agent-type required");let r=Q(t),n=oe(t,e),i=Me[e];y(i?{model:n,profile:r.model_profile}:{model:n,profile:r.model_profile,unknown_agent:!0},s,n)}function Fa(t,e,s,r,n=!1,i=!1){!e&&!n&&b("commit message required");let o=e;o&&(o=vr(o));let a=Q(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=(s||[]).join(" ").match(/(\d+)-/);if(f){let g=he(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=ce(t);f?.version&&(p=a.milestone_branch_template.replace("{milestone}",f.version).replace("{slug}",Le(f.name)||"milestone"))}if(p){let f=de(t,["rev-parse","--abbrev-ref","HEAD"]);f.exitCode===0&&f.stdout.trim()!==p&&de(t,["checkout","-b",p]).exitCode!==0&&de(t,["checkout",p])}}let c=s&&s.length>0?s:[".planning/"];for(let p of c){let f=K.default.join(t,p);B.default.existsSync(f)?de(t,["add",p]):de(t,["rm","--cached","--ignore-unmatch",p])}let l=n?["commit","--amend","--no-edit"]:["commit","-m",o];i&&l.push("--no-verify");let d=de(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=de(t,["rev-parse","--short","HEAD"]),m=u.exitCode===0?u.stdout:null;y({committed:!0,hash:m,reason:"committed"},r,m||"committed")}function Ma(t,e,s,r){e||b("commit message required");let i=Q(t).sub_repos;(!i||i.length===0)&&b("no sub_repos configured in .planning/config.json"),(!s||s.length===0)&&b("--files required for commit-to-subrepo");let o={},a=[];for(let l of s){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(", ")}
259
+ `);let c={};for(let[l,d]of Object.entries(o)){let u=K.default.join(t,l);for(let f of d)de(u,["add",f.slice(l.length+1)]);let m=de(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=de(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 Ia(t,e,s,r){e||b("summary-path required for summary-extract");let n=K.default.join(t,e);if(!B.default.existsSync(n)){y({error:"File not found",path:e},r);return}let i=B.default.readFileSync(n,"utf-8"),o=le(i),a=l=>(l||[]).map(d=>{let u=fe(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:fe(o["one-liner"])??Vt(i)??null,key_files:Pe(o["key-files"])??[],tech_added:Pe(Pt(o["tech-stack"])?.added)??[],patterns:Pe(o["patterns-established"])??[],decisions:a(Pe(o["key-decisions"])),requirements_completed:Pe(o["requirements-completed"])??[]};if(s&&s.length>0){let l={path:e};for(let d of s)c[d]!==void 0&&(l[d]=c[d]);y(l,r);return}y(c,r)}async function Ta(t,e,s){let r=process.env.BRAVE_API_KEY;if(!r){y({available:!1,reason:"BRAVE_API_KEY not set"},s,"");return}if(!t){y({available:!1,error:"Query required"},s,"");return}let n=new URLSearchParams({q:t,count:String(e.limit||10),country:"us",search_lang:"en",text_decorations:"false"});e.freshness&&n.set("freshness",e.freshness);try{let i=await fetch(`https://api.search.brave.com/res/v1/web/search?${n}`,{headers:{Accept:"application/json","X-Subscription-Token":r}});if(!i.ok){y({available:!1,error:`API error: ${i.status}`},s,"");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},s,a.map(c=>`${c.title}
249
260
  ${c.url}
250
261
  ${c.description}`).join(`
251
262
 
252
- `))}catch(i){y({available:!1,error:i.message},n,"")}}function Ea(t,e,n){let r=F(t).phases,s=F(t).roadmap,i=ce(t),o=[],a=0,c=0;try{let d=B.default.readdirSync(r,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).sort((u,m)=>Se(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=B.default.readdirSync(K.default.join(r,u)),h=g.filter(v=>v.endsWith("-PLAN.md")||v==="PLAN.md").length,x=g.filter(v=>v.endsWith("-SUMMARY.md")||v==="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}
263
+ `))}catch(i){y({available:!1,error:i.message},s,"")}}function Da(t,e,s){let r=F(t).phases,n=F(t).roadmap,i=ce(t),o=[],a=0,c=0;try{let d=B.default.readdirSync(r,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).sort((u,m)=>Se(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=B.default.readdirSync(K.default.join(r,u)),h=g.filter(v=>v.endsWith("-PLAN.md")||v==="PLAN.md").length,x=g.filter(v=>v.endsWith("-SUMMARY.md")||v==="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}
253
264
 
254
265
  **Progress:** [${m}] ${c}/${a} plans (${l}%)
255
266
 
256
267
  | Phase | Name | Plans | Status |
257
268
  |-------|------|-------|--------|
258
269
  `;for(let f of o)p+=`| ${f.number} | ${f.name} | ${f.summaries}/${f.plans} | ${f.status} |
259
- `;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 Fa(t,e,n){e||b("filename required for todo complete");let r=K.default.join(W(t),"todos","pending"),s=K.default.join(W(t),"todos","completed"),i=K.default.join(r,e);B.default.existsSync(i)||b(`Todo not found: ${e}`),B.default.mkdirSync(s,{recursive:!0});let o=B.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0];o=`completed: ${a}
260
- `+o,B.default.writeFileSync(K.default.join(s,e),o,"utf-8"),B.default.unlinkSync(i),y({completed:!0,file:e,date:a},n,"completed")}function Ma(t,e,n){e||b("phase required for todo match-phase");let r=K.default.join(W(t),"todos","pending"),s=[];try{for(let m of B.default.readdirSync(r).filter(p=>p.endsWith(".md")))try{let p=B.default.readFileSync(K.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=he(t,e),d=[];if(l?.found)try{let m=K.default.join(t,l.directory);for(let p of B.default.readdirSync(m).filter(f=>f.endsWith("-PLAN.md")))try{let g=B.default.readFileSync(K.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(v=>v.includes(S)||S.includes(v)));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 Ia(t,e,n,r){let{phase:s,name:i}=n,o=s?pe(s):"00",a=new Date().toISOString().split("T")[0],c=s?he(t,s):null,l=c?K.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=K.default.join(l,`${o}-CONTEXT.md`),u=`---
270
+ `;y({rendered:p},s,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},s,p)}else y({milestone_version:i.version,milestone_name:i.name,phases:o,total_plans:a,total_summaries:c,percent:l},s)}function Oa(t,e,s){e||b("filename required for todo complete");let r=K.default.join(W(t),"todos","pending"),n=K.default.join(W(t),"todos","completed"),i=K.default.join(r,e);B.default.existsSync(i)||b(`Todo not found: ${e}`),B.default.mkdirSync(n,{recursive:!0});let o=B.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0];o=`completed: ${a}
271
+ `+o,B.default.writeFileSync(K.default.join(n,e),o,"utf-8"),B.default.unlinkSync(i),y({completed:!0,file:e,date:a},s,"completed")}function Na(t,e,s){e||b("phase required for todo match-phase");let r=K.default.join(W(t),"todos","pending"),n=[];try{for(let m of B.default.readdirSync(r).filter(p=>p.endsWith(".md")))try{let p=B.default.readFileSync(K.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();n.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(n.length===0){y({phase:e,matches:[],todo_count:0},s);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=he(t,e),d=[];if(l?.found)try{let m=K.default.join(t,l.directory);for(let p of B.default.readdirSync(m).filter(f=>f.endsWith("-PLAN.md")))try{let g=B.default.readFileSync(K.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 n){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(v=>v.includes(S)||S.includes(v)));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:n.length},s)}function Wa(t,e,s,r){let{phase:n,name:i}=s,o=n?pe(n):"00",a=new Date().toISOString().split("T")[0],c=n?he(t,n):null,l=c?K.default.join(t,c.directory):null;n&&!l&&e!=="phase-dir"&&b(`Phase ${n} directory not found`);let d,u;switch(e){case"context":d=K.default.join(l,`${o}-CONTEXT.md`),u=`---
261
272
  phase: "${o}"
262
273
  name: "${i||c?.phase_name||"Unnamed"}"
263
274
  created: ${a}
264
275
  ---
265
276
 
266
- # Phase ${s}: ${i||c?.phase_name||"Unnamed"} - Context
277
+ # Phase ${n}: ${i||c?.phase_name||"Unnamed"} - Context
267
278
 
268
279
  ## Decisions
269
280
 
270
- _Decisions will be captured during /gsd-discuss-phase ${s}_
281
+ _Decisions will be captured during /gsd-discuss-phase ${n}_
271
282
 
272
283
  ## Discretion Areas
273
284
 
@@ -283,7 +294,7 @@ created: ${a}
283
294
  status: pending
284
295
  ---
285
296
 
286
- # Phase ${s}: ${i||c?.phase_name||"Unnamed"} - User Acceptance Testing
297
+ # Phase ${n}: ${i||c?.phase_name||"Unnamed"} - User Acceptance Testing
287
298
 
288
299
  ## Test Results
289
300
 
@@ -300,7 +311,7 @@ created: ${a}
300
311
  status: pending
301
312
  ---
302
313
 
303
- # Phase ${s}: ${i||c?.phase_name||"Unnamed"} - Verification
314
+ # Phase ${n}: ${i||c?.phase_name||"Unnamed"} - Verification
304
315
 
305
316
  ## Goal-Backward Verification
306
317
 
@@ -314,8 +325,8 @@ status: pending
314
325
  ## Result
315
326
 
316
327
  _Pending verification_
317
- `;break;case"phase-dir":{(!s||!i)&&b("phase and name required for phase-dir scaffold");let p=Le(i),f=`${o}-${p}`,g=F(t).phases;B.default.mkdirSync(g,{recursive:!0});let h=K.default.join(g,f);B.default.mkdirSync(h,{recursive:!0}),y({created:!0,directory:J(K.default.relative(t,h)),path:h},r,h);return}default:b(`Unknown scaffold type: ${e}. Available: context, uat, verification, phase-dir`);return}if(B.default.existsSync(d)){y({created:!1,reason:"already_exists",path:d},r,"exists");return}B.default.writeFileSync(d,u,"utf-8");let m=J(K.default.relative(t,d));y({created:!0,path:m},r,m)}function Ta(t,e,n){let r=F(t).phases,s=F(t).roadmap,i=F(t).requirements,o=F(t).state,a=ce(t),c=ke(t),l=new Map,d=0,u=0;try{let k=we(B.default.readFileSync(s,"utf-8"),t),j=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,R;for(;(R=j.exec(k))!==null;)l.set(R[1],{number:R[1],name:R[2].replace(/\(INSERTED\)/i,"").trim(),plans:0,summaries:0,status:"Not Started"})}catch{}try{let k=B.default.readdirSync(r,{withFileTypes:!0}).filter(j=>j.isDirectory()).map(j=>j.name).filter(c).sort((j,R)=>Se(j,R));for(let j of k){let R=j.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),E=R?R[1]:j,V=R&&R[2]?R[2].replace(/-/g," "):"",H=B.default.readdirSync(K.default.join(r,j)),ae=H.filter(qe=>qe.endsWith("-PLAN.md")||qe==="PLAN.md").length,X=H.filter(qe=>qe.endsWith("-SUMMARY.md")||qe==="SUMMARY.md").length;d+=ae,u+=X;let Z;ae===0?Z="Not Started":X>=ae?Z="Complete":X>0?Z="In Progress":Z="Planned";let Ae=l.get(E);l.set(E,{number:E,name:Ae?.name||V,plans:ae,summaries:X,status:Z})}}catch{}let m=[...l.values()].sort((k,j)=>Se(k.number,j.number)),p=m.filter(k=>k.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(B.default.existsSync(i)){let k=B.default.readFileSync(i,"utf-8");x=(k.match(/^- \[x\] \*\*/gm)||[]).length,h=x+(k.match(/^- \[ \] \*\*/gm)||[]).length}}catch{}let S=null;try{if(B.default.existsSync(o)){let k=B.default.readFileSync(o,"utf-8");S=(k.match(/^last_activity:\s*(.+)$/im)??k.match(/\*\*Last Activity:\*\*\s*(.+)/i)??k.match(/^Last Activity:\s*(.+)$/im))?.[1]?.trim()??null}}catch{}let v=0,$=null,P=de(t,["rev-list","--count","HEAD"]);P.exitCode===0&&(v=parseInt(P.stdout,10)||0);let C=de(t,["rev-list","--max-parents=0","HEAD"]);if(C.exitCode===0&&C.stdout){let k=de(t,["show","-s","--format=%as",C.stdout.split(`
318
- `)[0].trim()]);k.exitCode===0&&($=k.stdout||null)}let T={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:v,git_first_commit_date:$,last_activity:S};if(e==="table"){let j=Math.round(g/100*10),R="\u2588".repeat(j)+"\u2591".repeat(10-j),E=`# ${a.version} ${a.name} - Statistics
328
+ `;break;case"phase-dir":{(!n||!i)&&b("phase and name required for phase-dir scaffold");let p=Le(i),f=`${o}-${p}`,g=F(t).phases;B.default.mkdirSync(g,{recursive:!0});let h=K.default.join(g,f);B.default.mkdirSync(h,{recursive:!0}),y({created:!0,directory:J(K.default.relative(t,h)),path:h},r,h);return}default:b(`Unknown scaffold type: ${e}. Available: context, uat, verification, phase-dir`);return}if(B.default.existsSync(d)){y({created:!1,reason:"already_exists",path:d},r,"exists");return}B.default.writeFileSync(d,u,"utf-8");let m=J(K.default.relative(t,d));y({created:!0,path:m},r,m)}function qa(t,e,s){let r=F(t).phases,n=F(t).roadmap,i=F(t).requirements,o=F(t).state,a=ce(t),c=ke(t),l=new Map,d=0,u=0;try{let k=we(B.default.readFileSync(n,"utf-8"),t),j=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,R;for(;(R=j.exec(k))!==null;)l.set(R[1],{number:R[1],name:R[2].replace(/\(INSERTED\)/i,"").trim(),plans:0,summaries:0,status:"Not Started"})}catch{}try{let k=B.default.readdirSync(r,{withFileTypes:!0}).filter(j=>j.isDirectory()).map(j=>j.name).filter(c).sort((j,R)=>Se(j,R));for(let j of k){let R=j.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),E=R?R[1]:j,V=R&&R[2]?R[2].replace(/-/g," "):"",H=B.default.readdirSync(K.default.join(r,j)),ae=H.filter(qe=>qe.endsWith("-PLAN.md")||qe==="PLAN.md").length,X=H.filter(qe=>qe.endsWith("-SUMMARY.md")||qe==="SUMMARY.md").length;d+=ae,u+=X;let Z;ae===0?Z="Not Started":X>=ae?Z="Complete":X>0?Z="In Progress":Z="Planned";let Ae=l.get(E);l.set(E,{number:E,name:Ae?.name||V,plans:ae,summaries:X,status:Z})}}catch{}let m=[...l.values()].sort((k,j)=>Se(k.number,j.number)),p=m.filter(k=>k.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(B.default.existsSync(i)){let k=B.default.readFileSync(i,"utf-8");x=(k.match(/^- \[x\] \*\*/gm)||[]).length,h=x+(k.match(/^- \[ \] \*\*/gm)||[]).length}}catch{}let S=null;try{if(B.default.existsSync(o)){let k=B.default.readFileSync(o,"utf-8");S=(k.match(/^last_activity:\s*(.+)$/im)??k.match(/\*\*Last Activity:\*\*\s*(.+)/i)??k.match(/^Last Activity:\s*(.+)$/im))?.[1]?.trim()??null}}catch{}let v=0,C=null,P=de(t,["rev-list","--count","HEAD"]);P.exitCode===0&&(v=parseInt(P.stdout,10)||0);let $=de(t,["rev-list","--max-parents=0","HEAD"]);if($.exitCode===0&&$.stdout){let k=de(t,["show","-s","--format=%as",$.stdout.split(`
329
+ `)[0].trim()]);k.exitCode===0&&(C=k.stdout||null)}let T={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:v,git_first_commit_date:C,last_activity:S};if(e==="table"){let j=Math.round(g/100*10),R="\u2588".repeat(j)+"\u2591".repeat(10-j),E=`# ${a.version} ${a.name} - Statistics
319
330
 
320
331
  **Progress:** [${R}] ${p}/${m.length} phases (${g}%)
321
332
  `;d>0&&(E+=`**Plans:** ${u}/${d} complete (${f}%)
@@ -326,31 +337,31 @@ _Pending verification_
326
337
  |-------|------|-------|-----------|--------|
327
338
  `;for(let V of m)E+=`| ${V.number} | ${V.name} | ${V.plans} | ${V.summaries} | ${V.status} |
328
339
  `;v>0&&(E+=`
329
- **Git:** ${v} commits`,$&&(E+=` (since ${$})`),E+=`
340
+ **Git:** ${v} commits`,C&&(E+=` (since ${C})`),E+=`
330
341
  `),S&&(E+=`**Last activity:** ${S}
331
- `),y({rendered:E},n,E)}else y(T,n)}var B,K,_e=L(()=>{"use strict";B=U(require("fs")),K=U(require("path"));ye();Ve();Ot();dn()});var Gt,ns,Lr=L(()=>{"use strict";Gt=require("@oclif/core");je();ns=class t extends w{static description="Scaffold a GSD artefact";static args={type:Gt.Args.string({required:!0})};static flags={...w.baseFlags,phase:Gt.Flags.string({description:"Phase number"}),name:Gt.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(()=>(_e(),ve));i(r,n.type,{phase:e.phase??null,name:e.name??null},s)}}});var ss,rs,Ur=L(()=>{"use strict";ss=require("@oclif/core");je();rs=class t extends w{static description="Commit GSD changes to git";static flags={...w.baseFlags,amend:ss.Flags.boolean({description:"Amend last commit",default:!1}),"no-verify":ss.Flags.boolean({description:"Skip git hooks",default:!1}),files:ss.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(()=>(_e(),ve)),a=n.filter(c=>!c.startsWith("--")).join(" ")||void 0;i(r,a,e.files??[],s,e.amend,e["no-verify"])}}});var tt,is,os,as,Vr=L(()=>{"use strict";tt=require("@oclif/core");je();is=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(()=>(Ve(),cn))).cmdFrontmatterGet(r,n.file,e.field??null,s)}},os=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(()=>(Ve(),cn))).cmdFrontmatterSet(r,n.file,e.field,e.value,s)}},as=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(()=>(Ve(),cn))).cmdFrontmatterMerge(r,n.file,e.data,s)}}});var Hs={};xe(Hs,{cmdTemplateFill:()=>Oa,cmdTemplateSelect:()=>Da});function Da(t,e,n){e||b("plan-path required");try{let r=Jt.default.join(t,e),s=cs.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 Oa(t,e,n,r){e||b("template type required: summary, plan, or verification"),n.phase||b("--phase required");let s=he(t,n.phase);if(!s||!s.found){y({error:"Phase not found",phase:n.phase},r);return}let i=pe(n.phase),o=new Date().toISOString().split("T")[0],a=n.name||s.phase_name||"Unnamed",c=s.phase_slug||Le(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(`
332
- `),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(`
333
- `),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(`
342
+ `),y({rendered:E},s,E)}else y(T,s)}var B,K,_e=L(()=>{"use strict";B=U(require("fs")),K=U(require("path"));ye();Ve();Ot();dn()});var Gt,ns,zr=L(()=>{"use strict";Gt=require("@oclif/core");je();ns=class t extends w{static description="Scaffold a GSD artefact";static args={type:Gt.Args.string({required:!0})};static flags={...w.baseFlags,phase:Gt.Flags.string({description:"Phase number"}),name:Gt.Flags.string({description:"Artefact name"})};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdScaffold:i}=await Promise.resolve().then(()=>(_e(),ve));i(r,s.type,{phase:e.phase??null,name:e.name??null},n)}}});var ss,rs,Br=L(()=>{"use strict";ss=require("@oclif/core");je();rs=class t extends w{static description="Commit GSD changes to git";static flags={...w.baseFlags,amend:ss.Flags.boolean({description:"Amend last commit",default:!1}),"no-verify":ss.Flags.boolean({description:"Skip git hooks",default:!1}),files:ss.Flags.string({description:"Files to include",multiple:!0})};static strict=!1;async run(){let{flags:e,argv:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdCommit:i}=await Promise.resolve().then(()=>(_e(),ve)),a=s.filter(c=>!c.startsWith("--")).join(" ")||void 0;i(r,a,e.files??[],n,e.amend,e["no-verify"])}}});var tt,is,os,as,Gr=L(()=>{"use strict";tt=require("@oclif/core");je();is=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),cn))).cmdFrontmatterGet(r,s.file,e.field??null,n)}},os=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),cn))).cmdFrontmatterSet(r,s.file,e.field,e.value,n)}},as=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:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),cn))).cmdFrontmatterMerge(r,s.file,e.data,n)}}});var Xs={};xe(Xs,{cmdTemplateFill:()=>Ua,cmdTemplateSelect:()=>La});function La(t,e,s){e||b("plan-path required");try{let r=Jt.default.join(t,e),n=cs.default.readFileSync(r,"utf-8"),i=(n.match(/###\s*Task\s*\d+/g)||[]).length,o=(n.match(/decision/gi)||[]).length>0,a=new Set,c=/`([^`]+\.[a-zA-Z]+)`/g,l;for(;(l=c.exec(n))!==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},s,u)}catch(r){y({template:"templates/summary-standard.md",type:"standard",error:r.message},s,"templates/summary-standard.md")}}function Ua(t,e,s,r){e||b("template type required: summary, plan, or verification"),s.phase||b("--phase required");let n=he(t,s.phase);if(!n||!n.found){y({error:"Phase not found",phase:s.phase},r);return}let i=pe(s.phase),o=new Date().toISOString().split("T")[0],a=s.name||n.phase_name||"Unnamed",c=n.phase_slug||Le(a),l=`${i}-${c}`,d=(s.plan||"01").padStart(2,"0"),u=s.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 ${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(`
343
+ `),f=`${i}-${d}-SUMMARY.md`;break;case"plan":m={phase:l,plan:d,type:s.type||"execute",wave:parseInt(s.wave||"1"),depends_on:[],files_modified:[],autonomous:!0,user_setup:[],must_haves:{truths:[],artifacts:[],key_links:[]},...u},p=[`# Phase ${s.phase} Plan ${d}: [Title]`,"","## Objective","- **What:** [What this plan builds]","- **Why:** [Why it matters for the phase goal]","- **Output:** [Concrete deliverable]","","## Context","@.planning/PROJECT.md","@.planning/ROADMAP.md","@.planning/STATE.md","","## Tasks","",'<task type="code">'," <name>[Task name]</name>"," <files>[file paths]</files>"," <action>[What to do]</action>"," <verify>[How to verify]</verify>"," <done>[Definition of done]</done>","</task>","","## Verification","[How to verify this plan achieved its objective]","","## Success Criteria","- [ ] [Criterion 1]","- [ ] [Criterion 2]"].join(`
344
+ `),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 ${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(`
334
345
  `),f=`${i}-VERIFICATION.md`;break;default:b(`Unknown template type: ${e}. Available: summary, plan, verification`);return}let g=`---
335
346
  ${$t(m)}
336
347
  ---
337
348
 
338
349
  ${p}
339
- `,h=Jt.default.join(t,s.directory,f);if(cs.default.existsSync(h)){y({error:"File already exists",path:J(Jt.default.relative(t,h))},r);return}cs.default.writeFileSync(h,Ie(g),"utf-8");let x=J(Jt.default.relative(t,h));y({created:!0,path:x,template:e},r,x)}var cs,Jt,Xs=L(()=>{"use strict";cs=U(require("fs")),Jt=U(require("path"));ye();Ve()});var Ye,ls,ds,zr=L(()=>{"use strict";Ye=require("@oclif/core");je();ls=class t extends w{static description="Select a workflow template";static args={type:Ye.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(()=>(Xs(),Hs));i(r,n.type,s)}},ds=class t extends w{static description="Fill a template with values";static args={type:Ye.Args.string({required:!0})};static flags={...w.baseFlags,phase:Ye.Flags.string(),plan:Ye.Flags.string(),name:Ye.Flags.string(),type:Ye.Flags.string({char:"t"}),wave:Ye.Flags.string(),fields:Ye.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(()=>(Xs(),Hs)),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 Ft,us,ms,ps,fs,gs,Br=L(()=>{"use strict";Ft=require("@oclif/core");je();us=class t extends w{static description="Show project progress";static args={format:Ft.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(()=>(_e(),ve));i(r,n.format,s)}},ms=class t extends w{static description="Show project statistics";static args={format:Ft.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(()=>(_e(),ve));i(r,n.format,s)}},ps=class t extends w{static description="Mark a todo as complete";static args={id:Ft.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(()=>(_e(),ve));i(r,n.id,s)}},fs=class t extends w{static description="Match todos to phase";static args={phase:Ft.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(()=>(_e(),ve));i(r,n.phase,s)}},gs=class t extends w{static description="Extract fields from summary files";static args={phase:Ft.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(()=>(_e(),ve)),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 Na(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 Gr(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=Na(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=Gr(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 Yt(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(!Wa.has(o))continue;let a=Gr(t,i);a&&(n.push({node:a.node,start:i,end:a.end}),r.lastIndex=a.end)}return n}function hs(t,e,n,r){return t.slice(0,e)+r+t.slice(n)}var Wa,Zs=L(()=>{"use strict";Wa=new Set(["gsd-execute","gsd-arguments","gsd-paste","gsd-include","gsd-version"])});function Jr(){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 Yr=L(()=>{"use strict"});function Hr(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"?`
340
- `: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",v=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"&&v)n.set(x,m.slice(p).join(" "),void 0),p=m.length;else if(S==="number"){let $=m[p++],P=Number($);if(isNaN(P))throw new ht(`Argument '${x}' expected a number, got '${$}'`);n.set(x,String(P),void 0)}else if(S==="boolean"){let $=m[p++].toLowerCase();if($!=="true"&&$!=="false")throw new ht(`Argument '${x}' expected true/false, got '${$}'`);n.set(x,$,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,Ks=L(()=>{"use strict";ht=class extends Error{constructor(e){super(e),this.name="WxpArgumentsError"}}});function ys(t,e,n){switch(t.position){case"project":return He.default.resolve(e,t.path);case"pkg":return He.default.resolve(n,t.path);case"absolute":return He.default.resolve(t.path)}}function Qs(t,e,n,r){let s=He.default.resolve(t),i=`${He.default.sep}.planning`;if(s.includes(`${i}${He.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=ys(o,n,r);if(s.startsWith(a+He.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=ys(o,n,r);if(s.startsWith(a+He.default.sep)||s===a)return{ok:!0}}return{ok:!1,reason:`File '${t}' is not in a trusted WXP path.`}}function Zr(t,e){let n=He.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 He,Xr,Ht=L(()=>{"use strict";He=U(require("path")),Xr=["pi-gsd-tools","git","node","cat","ls","echo","find"]});function xs(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 Qr(t,e,n){let r=t.attrs.command??"",s=Zr(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=>xs(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,Kr.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 Kr,yt,Ss=L(()=>{"use strict";Kr=require("child_process");Ht();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 ei(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=xs(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?xs(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,er=L(()=>{"use strict";Ss();xt=class extends Error{constructor(e){super(e),this.name="WxpStringOpError"}}});function bs(t,e){return t.attrs.name?e.resolve(t.attrs.name)??"":t.attrs.value!==void 0?t.attrs.value:""}function ti(t){return t.attrs.type==="number"}function La(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(ti(n)||ti(r)){let a=Number(bs(n,e)),c=Number(bs(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=bs(n,e),o=bs(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 Zt(t,e){return t.tag==="and"?t.children.filter(n=>Xt.has(n.tag)).every(n=>Zt(n,e)):t.tag==="or"?t.children.filter(n=>Xt.has(n.tag)).some(n=>Zt(n,e)):La(t,e)}function ni(t,e){let n=t.children.find(s=>s.tag==="condition");if(!n)return!1;let r=n.children.find(s=>Xt.has(s.tag));return r?Zt(r,e):!1}function si(t,e){let n=t.children.find(r=>Xt.has(r.tag));return n?Zt(n,e):!0}var qa,Xt,ri=L(()=>{"use strict";qa=new Set(["equals","not-equals","starts-with","contains","less-than","greater-than","less-than-or-equal","greater-than-or-equal"]),Xt=new Set([...qa,"and","or"])});function Ua(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 Va(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 za(t,e){let n=t.attrs.path??"",r=t.attrs.out??"",s=Kt.default.readFileSync(Qt.default.resolve(n),"utf8");e.set(r,s,void 0)}function Ba(t,e,n){let r=t.attrs.path??"",s=t.attrs.src??"",i=Qt.default.resolve(r);if(Kt.default.existsSync(i))throw new Error(`<write-file>: '${r}' already exists (create-only, never overwrites)`);for(let a of n.config.trustedPaths){let c=ys(a,n.projectRoot,n.pkgRoot);if(i.startsWith(c+Qt.default.sep)||i===c)throw new Error(`<write-file>: cannot write to trusted harness path '${r}'`)}let o=e.get(s)??"";Kt.default.mkdirSync(Qt.default.dirname(i),{recursive:!0}),Kt.default.writeFileSync(i,o,"utf8")}function Ga(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),si(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)tr(d,e,n)}}}function tr(t,e,n){switch(t.tag){case"shell":Qr(t,e,n.config);break;case"string-op":ei(t,e);break;case"json-parse":Va(t,e);break;case"read-file":za(t,e);break;case"write-file":Ba(t,e,n);break;case"display":Ua(t,e,n);break;case"for-each":Ga(t,e,n);break;case"if":{let r=ni(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)tr(a,e,n);break}case"gsd-execute":nr(t,e,n);break;default:break}}function nr(t,e,n){try{for(let r of t.children)tr(r,e,n)}catch(r){throw r instanceof yt||r instanceof Error?new vs(r,e.snapshot(),`Execution failed: ${r.message}`):r}}var Kt,Qt,vs,sr=L(()=>{"use strict";Kt=U(require("fs")),Qt=U(require("path"));Ss();er();ri();Ht();vs=class extends Error{constructor(n,r,s){super(s);this.cause=n;this.variableSnapshot=r;this.name="WxpExecutionError"}cause;variableSnapshot}});function ii(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 _s(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 _s,rr=L(()=>{"use strict";Zs();_s=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 oi(t,e,n,r,s,i="",o=Ya){let a=Qs(e,n,r,s);if(!a.ok)throw new St(e,new Error(a.reason),{},[],[]);return Ha(t,e,n,r,s,i,o)}function Ha(t,e,n,r,s,i,o){let a=Jr(),c=[],l=t,d={config:n,projectRoot:r,pkgRoot:s,onDisplay:o};for(let u=0;u<Ja;u++){let p=Yt(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 Yt(l)){if(x.node.tag!=="gsd-include"||gt(x.start,ft(l)))continue;let S=x.node.attrs.path;if(!S)continue;let v=ws.default.resolve(r,S);if(!ir.default.existsSync(v))throw new Error(`Include not found: ${S}`);let $=Qs(v,n,r,s);if(!$.ok)throw new Error(`Include rejected: ${$.reason}`);let P=ir.default.readFileSync(v,"utf8"),C=ws.default.basename(v,ws.default.extname(v));for(let k of x.node.children)if(k.tag==="gsd-arguments")for(let j of k.children.filter(R=>R.tag==="arg")){let R=j.attrs.name,E=j.attrs.as;if(R&&E){let V=a.get(R);V!==void 0&&a.set(E,V,C)}}let T="include-arguments"in x.node.attrs?`
341
- ${i}`:"";l=hs(l,x.start,x.end,P+T),c.push("gsd-include"),g=!0;break}if(g)continue;for(let x of Yt(l))if(x.node.tag==="gsd-arguments"&&!gt(x.start,ft(l))){Hr(x.node,i,a),l=hs(l,x.start,x.end,""),c.push("gsd-arguments"),g=!0;break}if(g)continue;for(let x of Yt(l))if(x.node.tag==="gsd-execute"&&!gt(x.start,ft(l))){nr(x.node,a,d),l=hs(l,x.start,x.end,""),c.push("gsd-execute"),g=!0;break}if(g)continue;let h=ii(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 ir,ws,Ja,Ya,St,ai=L(()=>{"use strict";ir=U(require("fs")),ws=U(require("path"));Zs();Yr();Ks();sr();rr();Ht();sr();Ss();rr();er();Ks();Ja=50,Ya=()=>{},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(`
342
- `));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,ci,or,ks,li=L(()=>{"use strict";bt=require("@oclif/core"),ci=require("@oclif/core"),or=U(require("path"));ai();Ht();ks=class t extends ci.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=or.default.join(e["project-root"],".pi","gsd","workflows","_inline.md");else if(n.file){let o=await import("fs");s=or.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:[...Xr],shellBanlist:[],shellTimeoutMs:3e4};try{let o=oi(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 di={};xe(di,{AuditUatCommand:()=>Yn,CommitCommand:()=>rs,ConfigEnsureSectionCommand:()=>Fn,ConfigGetCommand:()=>An,ConfigNewProjectCommand:()=>En,ConfigSetCommand:()=>jn,ConfigSetModelProfileCommand:()=>Rn,FrontmatterGetCommand:()=>is,FrontmatterMergeCommand:()=>as,FrontmatterSetCommand:()=>os,InitCommand:()=>_n,MilestoneCompleteCommand:()=>Ln,PhaseAddCommand:()=>In,PhaseCompleteCommand:()=>On,PhaseInsertCommand:()=>Tn,PhaseNextDecimalCommand:()=>Mn,PhasePlanIndexCommand:()=>Nn,PhaseRemoveCommand:()=>Dn,ProgressCommand:()=>us,RequirementsMarkCompleteCommand:()=>Un,RoadmapAnalyzeCommand:()=>Pn,RoadmapGetPhaseCommand:()=>$n,RoadmapUpdatePlanProgressCommand:()=>Cn,ScaffoldCommand:()=>ns,StateAdvancePlanCommand:()=>gn,StateGetCommand:()=>mn,StateJsonCommand:()=>un,StateLoadCommand:()=>hn,StatePatchCommand:()=>fn,StateReconcileCommand:()=>xn,StateUpdateCommand:()=>pn,StateUpdateProgressCommand:()=>yn,StatsCommand:()=>ms,SummaryExtractCommand:()=>gs,TemplateFillCommand:()=>ds,TemplateSelectCommand:()=>ls,TodoCompleteCommand:()=>ps,TodoMatchPhaseCommand:()=>fs,ValidateAgentsCommand:()=>Gn,ValidateConsistencyCommand:()=>zn,ValidateHealthCommand:()=>Bn,VerifyCommand:()=>Jn,WorkstreamCompleteCommand:()=>Kn,WorkstreamCreateCommand:()=>Hn,WorkstreamGetCommand:()=>es,WorkstreamListCommand:()=>Xn,WorkstreamProgressCommand:()=>ts,WorkstreamSetCommand:()=>Qn,WorkstreamStatusCommand:()=>Zn,WxpProcessCommand:()=>ks});var ui=L(()=>{"use strict";wr();Pr();Cr();Er();Fr();Mr();Wr();qr();Lr();Ur();Vr();zr();Br();li()});var mi=Ci((Fd,Xa)=>{Xa.exports={name:"pi-gsd",version:"2.0.21",description:"Get Shit Done - Unofficial port of the renowned AI-native project-planning spec-driven toolkit",main:"dist/pi-gsd-tools.js",bin:{"pi-gsd-tools":"./dist/pi-gsd-tools.js","pi-gsd":"./dist/pi-gsd-tools.js"},scripts:{build:"tsup",dev:"tsup src/cli.ts --format cjs --out-dir dist --watch",typecheck:"tsc --noEmit",check:"tsc --noEmit && npm run build",postinstall:"node scripts/postinstall.js",prepublishOnly:"npm run build",test:"vitest run","test:unit":"vitest run src/wxp/__tests__ --ignore src/wxp/__tests__/integration.test.ts","test:integration":"vitest run src/wxp/__tests__/integration.test.ts",lint:"eslint src/ --ext .ts"},files:["dist","scripts/postinstall.js",".gsd/harnesses","README.md","LICENSE","prompts"],engines:{node:">=18.0.0"},keywords:["ai","agent","planning","cli","workflow","get-shit-done","gsd","productivity","project-management","milestones","phases","spec","pi-package"],author:"Alessio Corsi",license:"MIT",repository:{type:"git",url:"https://github.com/fulgidus/pi-gsd.git"},bugs:{url:"https://github.com/fulgidus/pi-gsd/issues"},homepage:"https://github.com/fulgidus/pi-gsd#readme",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},pi:{extensions:["./dist/pi-gsd-hooks.js"],prompts:["./prompts"]},dependencies:{"@oclif/core":"^4.10.5","@toon-format/toon":"^2.1.0","jsonpath-plus":"^10.4.0",zod:"^3.25.76"},devDependencies:{"@mariozechner/pi-coding-agent":"^0.65.0","@types/node":"^22.0.0","@typescript-eslint/eslint-plugin":"^8.58.0","@typescript-eslint/parser":"^8.58.0",eslint:"^10.2.0",tsup:"^8.0.0",typescript:"^5.0.0",vitest:"^4.1.2"}}});var Ps={};xe(Ps,{cmdExtractMessages:()=>tc,cmdProfileSample:()=>nc,cmdScanSessions:()=>ec});function ar(t){if(t)return t;let e=process.env.HOME??"",n=De.join(e,".agent","projects");return se.existsSync(n)?n:De.join(e,".claude","projects")}function cr(){let t=process.env.HOME??"";return De.join(t,".pi","agent","sessions")}function lr(t){return t.startsWith("--")&&t.endsWith("--")?"/"+t.slice(2,-2).replace(/-/g,"/"):t}function Za(t){try{let e=se.readFileSync(t,"utf-8").split(`
343
- `).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 Ka(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 Qa(t){try{let e=se.readFileSync(t,"utf-8").split(`
344
- `).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 ec(t,e,n){let s=(e.harness??null)==="pi",i=cr(),o=se.existsSync(i),a=[];if(o)try{let m=se.readdirSync(i,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=De.join(i,p.name),g=se.readdirSync(f).filter(h=>h.endsWith(".jsonl"));a.push({name:p.name,sessions:g.length,path:f,source:"pi",cwd:lr(p.name)})}}catch{}let c=ar(s&&!t?null:t),l=!s||t?se.existsSync(c):!1,d=[];if(l&&(!s||t))try{let m=se.readdirSync(c,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=De.join(c,p.name),g=se.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 tc(t,e,n,r){let s=cr(),i=null,o="claude";if(se.existsSync(s)){let d=De.join(s,t);if(se.existsSync(d))i=d,o="pi";else try{let u=se.readdirSync(s,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of u){let p=lr(m.name);if(p.endsWith("/"+t)||p===t||m.name===t){i=De.join(s,m.name),o="pi";break}}}catch{}}if(!i){let d=ar(r),u=De.join(d,t);se.existsSync(u)&&(i=u,o="claude")}if(!i){y({error:`Project not found: ${t}`,available_projects:[]},n);return}let a=[],c=se.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=De.join(i,d);if(o==="pi"||Za(u))try{let m=se.readFileSync(u,"utf-8").split(`
345
- `).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=se.readFileSync(u,"utf-8").split(`
346
- `).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 nc(t,e,n){let s=(e.harness??null)==="pi",i=e.limit??150,o=e.maxChars??500,a=[],c=cr();if(se.existsSync(c))try{let d=se.readdirSync(c,{withFileTypes:!0}).filter(u=>u.isDirectory());e:for(let u of d){let m=De.join(c,u.name),p=se.readdirSync(m).filter(g=>g.endsWith(".jsonl")),f=0;for(let g of p){let h=Qa(De.join(m,g));for(let x of h)if(x.message?.role==="user"){let S=Ka(x.message.content).slice(0,o);if(S.length>20){if(a.push({project:lr(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=ar(t);if(se.existsSync(d))try{let u=se.readdirSync(d,{withFileTypes:!0}).filter(m=>m.isDirectory());e:for(let m of u){let p=De.join(d,m.name),f=se.readdirSync(p).filter(h=>h.endsWith(".jsonl")),g=0;for(let h of f)try{let x=se.readFileSync(De.join(p,h),"utf-8").split(`
347
- `).filter(Boolean);for(let S of x)try{let v=JSON.parse(S);if(v.role==="human"||v.type==="human"){let $=(v.content||v.message||"").slice(0,o);if($.length>20){if(a.push({project:m.name,text:$,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 se,De,$s=L(()=>{"use strict";ye();se=require("fs"),De=require("path")});var Mt={};xe(Mt,{cmdGenerateClaudeMd:()=>cc,cmdGenerateClaudeProfile:()=>ac,cmdGenerateDevPreferences:()=>oc,cmdProfileQuestionnaire:()=>ic,cmdWriteProfile:()=>rc});function Cs(t,e,n="CLAUDE.md"){return e?We.default.resolve(e):We.default.join(t,n)}function dr(t,e){if(!t)return null;let n=We.default.isAbsolute(t)?t:We.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 sc(t){return t.map(e=>`## ${e.heading}
350
+ `,h=Jt.default.join(t,n.directory,f);if(cs.default.existsSync(h)){y({error:"File already exists",path:J(Jt.default.relative(t,h))},r);return}cs.default.writeFileSync(h,Ie(g),"utf-8");let x=J(Jt.default.relative(t,h));y({created:!0,path:x,template:e},r,x)}var cs,Jt,Zs=L(()=>{"use strict";cs=U(require("fs")),Jt=U(require("path"));ye();Ve()});var Xe,ls,ds,Jr=L(()=>{"use strict";Xe=require("@oclif/core");je();ls=class t extends w{static description="Select a workflow template";static args={type:Xe.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdTemplateSelect:i}=await Promise.resolve().then(()=>(Zs(),Xs));i(r,s.type,n)}},ds=class t extends w{static description="Fill a template with values";static args={type:Xe.Args.string({required:!0})};static flags={...w.baseFlags,phase:Xe.Flags.string(),plan:Xe.Flags.string(),name:Xe.Flags.string(),type:Xe.Flags.string({char:"t"}),wave:Xe.Flags.string(),fields:Xe.Flags.string({description:"JSON fields"})};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdTemplateFill:i}=await Promise.resolve().then(()=>(Zs(),Xs)),o={};if(e.fields)try{o=JSON.parse(e.fields)}catch{}i(r,s.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},n)}}});var Ft,us,ms,ps,fs,gs,Yr=L(()=>{"use strict";Ft=require("@oclif/core");je();us=class t extends w{static description="Show project progress";static args={format:Ft.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdProgressRender:i}=await Promise.resolve().then(()=>(_e(),ve));i(r,s.format,n)}},ms=class t extends w{static description="Show project statistics";static args={format:Ft.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdStats:i}=await Promise.resolve().then(()=>(_e(),ve));i(r,s.format,n)}},ps=class t extends w{static description="Mark a todo as complete";static args={id:Ft.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdTodoComplete:i}=await Promise.resolve().then(()=>(_e(),ve));i(r,s.id,n)}},fs=class t extends w{static description="Match todos to phase";static args={phase:Ft.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdTodoMatchPhase:i}=await Promise.resolve().then(()=>(_e(),ve));i(r,s.phase,n)}},gs=class t extends w{static description="Extract fields from summary files";static args={phase:Ft.Args.string({required:!0})};static flags={...w.baseFlags,fields:w.baseFlags.pick};async run(){let{flags:e,args:s}=await this.parse(t),{cwd:r,raw:n}=this.resolveContext(e),{cmdSummaryExtract:i}=await Promise.resolve().then(()=>(_e(),ve)),o=e.fields?e.fields.split(","):null;i(r,s.phase,o,n)}}});function ft(t){let e=[],s=/^```[^\n]*\n[\s\S]*?^```/gm,r;for(;(r=s.exec(t))!==null;)e.push([r.index,r.index+r[0].length]);return e}function gt(t,e){return e.some(([s,r])=>t>=s&&t<r)}function Va(t){let e={},s=/([a-zA-Z0-9_:-]+)(?:=(?:"([^"]*)"|'([^']*)'|([^\s/>]*)))?/g,r;for(;(r=s.exec(t))!==null;){let n=r[1],i=r[2]??r[3]??r[4]??"";e[n]=i}return e}function Hr(t,e){if(t[e]!=="<")return null;let s=/^<([a-zA-Z0-9_:-]+)((?:\s+[a-zA-Z0-9_:-]+(?:=(?:"[^"]*"|'[^']*'|[^\s/>]*))?)*)?\s*(\/??>)/,r=t.slice(e),n=s.exec(r);if(!n)return null;let i=n[1],o=(n[2]??"").trim(),a=n[3],c=Va(o);if(a==="/>")return{node:{tag:i,attrs:c,children:[],selfClosing:!0},end:e+n[0].length};let l=e+n[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=Hr(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 Yt(t){let e=ft(t),s=[],r=/<(gsd-[a-zA-Z0-9_-]+)/g,n;for(;(n=r.exec(t))!==null;){let i=n.index;if(gt(i,e))continue;let o=n[1];if(!za.has(o))continue;let a=Hr(t,i);a&&(s.push({node:a.node,start:i,end:a.end}),r.lastIndex=a.end)}return s}function hs(t,e,s,r){return t.slice(0,e)+r+t.slice(s)}var za,Ks=L(()=>{"use strict";za=new Set(["gsd-execute","gsd-arguments","gsd-paste","gsd-include","gsd-version"])});function Xr(){let t=new Map,e=new Map,s=r=>{let n=t.get(r)?.value;if(n!==void 0)return n;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,n,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:n,owner:i})):t.set(r,{name:r,value:n,owner:i})},get(r){return t.get(r)?.value},resolve(r){return s(r)},setArray(r,n,i){e.set(r,n),t.set(r,{name:r,value:JSON.stringify(n),owner:i})},getArray(r){if(e.has(r))return e.get(r);let n=t.get(r)?.value;if(n)try{let i=JSON.parse(n);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[n,i]of t)r[n]=i.value;return r}}}var Zr=L(()=>{"use strict"});function Kr(t,e,s){let r=t.children.find(g=>g.tag==="settings"),n=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"?`
351
+ `: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?s.set(S,"false",void 0):(s.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",v=g===u.length-1;if(x){if(p>=m.length){if(!("optional"in h.attrs))throw new ht(`Missing required argument '${x}' (type: ${S})`);s.set(x,"",void 0);continue}if(S==="string"&&v)s.set(x,m.slice(p).join(" "),void 0),p=m.length;else if(S==="number"){let C=m[p++],P=Number(C);if(isNaN(P))throw new ht(`Argument '${x}' expected a number, got '${C}'`);s.set(x,String(P),void 0)}else if(S==="boolean"){let C=m[p++].toLowerCase();if(C!=="true"&&C!=="false")throw new ht(`Argument '${x}' expected true/false, got '${C}'`);s.set(x,C,void 0)}else s.set(x,m[p++]??"",void 0)}}let f=m.slice(p).join(" ");if(f){if(i)throw new ht(`Unexpected extra arguments: '${f}'`);n&&s.set("_extra",f,void 0)}}var ht,Qs=L(()=>{"use strict";ht=class extends Error{constructor(e){super(e),this.name="WxpArgumentsError"}}});function ys(t,e,s){switch(t.position){case"project":return Ze.default.resolve(e,t.path);case"pkg":return Ze.default.resolve(s,t.path);case"absolute":return Ze.default.resolve(t.path)}}function er(t,e,s,r){let n=Ze.default.resolve(t),i=`${Ze.default.sep}.planning`;if(n.includes(`${i}${Ze.default.sep}`)||n.endsWith(i))return{ok:!1,reason:".planning/ files are never processed by WXP (hard security invariant)"};for(let o of e.untrustedPaths){let a=ys(o,s,r);if(n.startsWith(a+Ze.default.sep)||n===a)return{ok:!1,reason:`File '${t}' is in an explicitly untrusted path: ${a}`}}for(let o of e.trustedPaths){let a=ys(o,s,r);if(n.startsWith(a+Ze.default.sep)||n===a)return{ok:!0}}return{ok:!1,reason:`File '${t}' is not in a trusted WXP path.`}}function ei(t,e){let s=Ze.default.basename(t);return e.shellBanlist.includes(s)?{ok:!1,reason:`Command '${s}' is explicitly banned by WXP security config.`}:e.shellAllowlist.includes(s)?{ok:!0}:{ok:!1,reason:`Command '${s}' is not in the WXP shell allowlist. Allowed: ${e.shellAllowlist.join(", ")}`}}var Ze,Qr,Ht=L(()=>{"use strict";Ze=U(require("path")),Qr=["pi-gsd-tools","git","node","cat","ls","echo","find"]});function xs(t,e){if(t.attrs.string!==void 0)return t.attrs.string;if(t.attrs.name!==void 0){let s=e.resolve(t.attrs.name)??"",r=t.attrs.wrap;return r?`${r}${s}${r}`:s}return t.attrs.value!==void 0?t.attrs.value:""}function ni(t,e,s){let r=t.attrs.command??"",n=ei(r,s);if(!n.ok)throw new yt(r,"",e.snapshot(),n.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=>xs(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,ti.execFileSync)(r,a,{encoding:"utf8",timeout:s.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 ti,yt,Ss=L(()=>{"use strict";ti=require("child_process");Ht();yt=class extends Error{constructor(s,r,n,i){super(i);this.command=s;this.stderr=r;this.variableSnapshot=n;this.name="WxpShellError"}command;stderr;variableSnapshot}});function si(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"),n=t.children.find(m=>m.tag==="outs");if(!r||!n)throw new xt("<string-op> requires <args> and <outs>");let i=r.children.filter(m=>m.tag==="arg"),o=n.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=xs(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?xs(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,tr=L(()=>{"use strict";Ss();xt=class extends Error{constructor(e){super(e),this.name="WxpStringOpError"}}});function bs(t,e){return t.attrs.name?e.resolve(t.attrs.name)??"":t.attrs.value!==void 0?t.attrs.value:""}function ri(t){return t.attrs.type==="number"}function Ga(t,e){let s=t.children.find(a=>a.tag==="left"),r=t.children.find(a=>a.tag==="right");if(!s||!r)return!1;if(ri(s)||ri(r)){let a=Number(bs(s,e)),c=Number(bs(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=bs(s,e),o=bs(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 Zt(t,e){return t.tag==="and"?t.children.filter(s=>Xt.has(s.tag)).every(s=>Zt(s,e)):t.tag==="or"?t.children.filter(s=>Xt.has(s.tag)).some(s=>Zt(s,e)):Ga(t,e)}function ii(t,e){let s=t.children.find(n=>n.tag==="condition");if(!s)return!1;let r=s.children.find(n=>Xt.has(n.tag));return r?Zt(r,e):!1}function oi(t,e){let s=t.children.find(r=>Xt.has(r.tag));return s?Zt(s,e):!0}var Ba,Xt,ai=L(()=>{"use strict";Ba=new Set(["equals","not-equals","starts-with","contains","less-than","greater-than","less-than-or-equal","greater-than-or-equal"]),Xt=new Set([...Ba,"and","or"])});function Ja(t,e,s){let r=(t.attrs.msg??"").replace(/\{([^}]+)\}/g,(i,o)=>e.resolve(o)??""),n=t.attrs.level;s.onDisplay(r,n==="warning"||n==="error"?n:"info")}function Ya(t,e){let s=t.attrs.src??"",r=t.attrs.out??"",n=t.attrs.path,i=e.get(s);if(i===void 0)throw new Error(`<json-parse>: source variable '${s}' is not defined`);let o;try{o=JSON.parse(i)}catch{throw new Error(`<json-parse>: '${s}' does not contain valid JSON`)}if(n){let a=n.replace(/^\$\.?/,"").split("."),c=o;for(let l of a){if(c===null||typeof c!="object")throw new Error(`<json-parse>: path '${n}' 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 Ha(t,e){let s=t.attrs.path??"",r=t.attrs.out??"",n=Kt.default.readFileSync(Qt.default.resolve(s),"utf8");e.set(r,n,void 0)}function Xa(t,e,s){let r=t.attrs.path??"",n=t.attrs.src??"",i=Qt.default.resolve(r);if(Kt.default.existsSync(i))throw new Error(`<write-file>: '${r}' already exists (create-only, never overwrites)`);for(let a of s.config.trustedPaths){let c=ys(a,s.projectRoot,s.pkgRoot);if(i.startsWith(c+Qt.default.sep)||i===c)throw new Error(`<write-file>: cannot write to trusted harness path '${r}'`)}let o=e.get(n)??"";Kt.default.mkdirSync(Qt.default.dirname(i),{recursive:!0}),Kt.default.writeFileSync(i,o,"utf8")}function Za(t,e,s){let r=t.attrs.var??"",n=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(n,l,void 0),oi(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(n,m,void 0);let f=e.resolve(`${n}.${l}`)??e.resolve(l)??"";e.set(n,p,void 0);let g=e.resolve(`${n}.${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(n,l,void 0);for(let d of a)nr(d,e,s)}}}function nr(t,e,s){switch(t.tag){case"shell":ni(t,e,s.config);break;case"string-op":si(t,e);break;case"json-parse":Ya(t,e);break;case"read-file":Ha(t,e);break;case"write-file":Xa(t,e,s);break;case"display":Ja(t,e,s);break;case"for-each":Za(t,e,s);break;case"if":{let r=ii(t,e),n=t.children.find(a=>a.tag==="then"),i=t.children.find(a=>a.tag==="else"),o=r?n:i;if(o)for(let a of o.children)nr(a,e,s);break}case"gsd-execute":sr(t,e,s);break;default:break}}function sr(t,e,s){try{for(let r of t.children)nr(r,e,s)}catch(r){throw r instanceof yt||r instanceof Error?new vs(r,e.snapshot(),`Execution failed: ${r.message}`):r}}var Kt,Qt,vs,rr=L(()=>{"use strict";Kt=U(require("fs")),Qt=U(require("path"));Ss();tr();ai();Ht();vs=class extends Error{constructor(s,r,n){super(n);this.cause=s;this.variableSnapshot=r;this.name="WxpExecutionError"}cause;variableSnapshot}});function ci(t,e){let s=ft(t),r=/<gsd-paste\s+name="([^"]+)"\s*\/>/g,n=[],i;for(;(i=r.exec(t))!==null;)gt(i.index,s)||n.push({index:i.index,full:i[0],name:i[1]});for(let a of n)if(e.get(a.name)===void 0)throw new _s(a.name,e.snapshot());let o=t;for(let a=n.length-1;a>=0;a--){let c=n[a],l=e.get(c.name);o=o.slice(0,c.index)+l+o.slice(c.index+c.full.length)}return o}var _s,ir=L(()=>{"use strict";Ks();_s=class extends Error{constructor(s,r){super(`<gsd-paste name="${s}" /> references undefined variable '${s}'`);this.variableName=s;this.variableSnapshot=r;this.name="WxpPasteError"}variableName;variableSnapshot}});function li(t,e,s,r,n,i="",o=Qa){let a=er(e,s,r,n);if(!a.ok)throw new St(e,new Error(a.reason),{},[],[]);return ec(t,e,s,r,n,i,o)}function ec(t,e,s,r,n,i,o){let a=Xr(),c=[],l=t,d={config:s,projectRoot:r,pkgRoot:n,onDisplay:o};for(let u=0;u<Ka;u++){let p=Yt(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 Yt(l)){if(x.node.tag!=="gsd-include"||gt(x.start,ft(l)))continue;let S=x.node.attrs.path;if(!S)continue;let v=ws.default.resolve(r,S);if(!or.default.existsSync(v))throw new Error(`Include not found: ${S}`);let C=er(v,s,r,n);if(!C.ok)throw new Error(`Include rejected: ${C.reason}`);let P=or.default.readFileSync(v,"utf8"),$=ws.default.basename(v,ws.default.extname(v));for(let k of x.node.children)if(k.tag==="gsd-arguments")for(let j of k.children.filter(R=>R.tag==="arg")){let R=j.attrs.name,E=j.attrs.as;if(R&&E){let V=a.get(R);V!==void 0&&a.set(E,V,$)}}let T="include-arguments"in x.node.attrs?`
352
+ ${i}`:"";l=hs(l,x.start,x.end,P+T),c.push("gsd-include"),g=!0;break}if(g)continue;for(let x of Yt(l))if(x.node.tag==="gsd-arguments"&&!gt(x.start,ft(l))){Kr(x.node,i,a),l=hs(l,x.start,x.end,""),c.push("gsd-arguments"),g=!0;break}if(g)continue;for(let x of Yt(l))if(x.node.tag==="gsd-execute"&&!gt(x.start,ft(l))){sr(x.node,a,d),l=hs(l,x.start,x.end,""),c.push("gsd-execute"),g=!0;break}if(g)continue;let h=ci(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 or,ws,Ka,Qa,St,di=L(()=>{"use strict";or=U(require("fs")),ws=U(require("path"));Ks();Zr();Qs();rr();ir();Ht();rr();Ss();ir();tr();Qs();Ka=50,Qa=()=>{},St=class extends Error{constructor(s,r,n,i,o){super(["WXP Processing Error",`File: ${s}`,`Error: ${r.message}`,`Variable Namespace: ${JSON.stringify(n,null,2)}`,`Pending Operations: [${i.join(", ")}]`,`Completed Operations: [${o.join(", ")}]`].join(`
353
+ `));this.filePath=s;this.cause=r;this.variableSnapshot=n;this.pendingOperations=i;this.completedOperations=o;this.name="WxpProcessingError"}filePath;cause;variableSnapshot;pendingOperations;completedOperations}});var bt,ui,ar,ks,mi=L(()=>{"use strict";bt=require("@oclif/core"),ui=require("@oclif/core"),ar=U(require("path"));di();Ht();ks=class t extends ui.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:s}=await this.parse(t),r,n;if(e.input!==void 0)r=e.input,n=ar.default.join(e["project-root"],".pi","gsd","workflows","_inline.md");else if(s.file){let o=await import("fs");n=ar.default.resolve(s.file),r=o.default.readFileSync(n,"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:[...Qr],shellBanlist:[],shellTimeoutMs:3e4};try{let o=li(r,n,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 pi={};xe(pi,{AuditUatCommand:()=>Yn,CommitCommand:()=>rs,ConfigEnsureSectionCommand:()=>Fn,ConfigGetCommand:()=>An,ConfigNewProjectCommand:()=>En,ConfigSetCommand:()=>jn,ConfigSetModelProfileCommand:()=>Rn,FrontmatterGetCommand:()=>is,FrontmatterMergeCommand:()=>as,FrontmatterSetCommand:()=>os,InitCommand:()=>_n,MilestoneCompleteCommand:()=>Ln,PhaseAddCommand:()=>In,PhaseCompleteCommand:()=>On,PhaseInsertCommand:()=>Tn,PhaseNextDecimalCommand:()=>Mn,PhasePlanIndexCommand:()=>Nn,PhaseRemoveCommand:()=>Dn,ProgressCommand:()=>us,RequirementsMarkCompleteCommand:()=>Un,RoadmapAnalyzeCommand:()=>Pn,RoadmapGetPhaseCommand:()=>$n,RoadmapUpdatePlanProgressCommand:()=>Cn,ScaffoldCommand:()=>ns,StateAdvancePlanCommand:()=>gn,StateGetCommand:()=>mn,StateJsonCommand:()=>un,StateLoadCommand:()=>hn,StatePatchCommand:()=>fn,StateReconcileCommand:()=>xn,StateUpdateCommand:()=>pn,StateUpdateProgressCommand:()=>yn,StatsCommand:()=>ms,SummaryExtractCommand:()=>gs,TemplateFillCommand:()=>ds,TemplateSelectCommand:()=>ls,TodoCompleteCommand:()=>ps,TodoMatchPhaseCommand:()=>fs,ValidateAgentsCommand:()=>Gn,ValidateConsistencyCommand:()=>zn,ValidateHealthCommand:()=>Bn,VerifyCommand:()=>Jn,WorkstreamCompleteCommand:()=>Kn,WorkstreamCreateCommand:()=>Hn,WorkstreamGetCommand:()=>es,WorkstreamListCommand:()=>Xn,WorkstreamProgressCommand:()=>ts,WorkstreamSetCommand:()=>Qn,WorkstreamStatusCommand:()=>Zn,WxpProcessCommand:()=>ks});var fi=L(()=>{"use strict";kr();$r();Ar();Fr();Tr();Dr();Ur();Vr();zr();Br();Gr();Jr();Yr();mi()});var gi=Ei((Od,tc)=>{tc.exports={name:"pi-gsd",version:"2.0.23",description:"Get Shit Done - Unofficial port of the renowned AI-native project-planning spec-driven toolkit",main:"dist/pi-gsd-tools.js",bin:{"pi-gsd-tools":"./dist/pi-gsd-tools.js","pi-gsd":"./dist/pi-gsd-tools.js"},scripts:{build:"tsup",dev:"tsup src/cli.ts --format cjs --out-dir dist --watch",typecheck:"tsc --noEmit",check:"tsc --noEmit && npm run build",postinstall:"node scripts/postinstall.js",prepublishOnly:"npm run build",test:"vitest run","test:unit":"vitest run src/wxp/__tests__ --ignore src/wxp/__tests__/integration.test.ts","test:integration":"vitest run src/wxp/__tests__/integration.test.ts",lint:"eslint src/ --ext .ts"},files:["dist","scripts/postinstall.js",".gsd/harnesses","README.md","LICENSE","prompts"],engines:{node:">=18.0.0"},keywords:["ai","agent","planning","cli","workflow","get-shit-done","gsd","productivity","project-management","milestones","phases","spec","pi-package"],author:"Alessio Corsi",license:"MIT",repository:{type:"git",url:"https://github.com/fulgidus/pi-gsd.git"},bugs:{url:"https://github.com/fulgidus/pi-gsd/issues"},homepage:"https://github.com/fulgidus/pi-gsd#readme",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},pi:{extensions:["./dist/pi-gsd-hooks.js"],prompts:["./prompts"]},dependencies:{"@oclif/core":"^4.10.5","@toon-format/toon":"^2.1.0","jsonpath-plus":"^10.4.0",zod:"^3.25.76"},devDependencies:{"@mariozechner/pi-coding-agent":"^0.65.0","@types/node":"^22.0.0","@typescript-eslint/eslint-plugin":"^8.58.0","@typescript-eslint/parser":"^8.58.0",eslint:"^10.2.0",tsup:"^8.0.0",typescript:"^5.0.0",vitest:"^4.1.2"}}});var Ps={};xe(Ps,{cmdExtractMessages:()=>oc,cmdProfileSample:()=>ac,cmdScanSessions:()=>ic});function cr(t){if(t)return t;let e=process.env.HOME??"",s=De.join(e,".agent","projects");return re.existsSync(s)?s:De.join(e,".claude","projects")}function lr(){let t=process.env.HOME??"";return De.join(t,".pi","agent","sessions")}function dr(t){return t.startsWith("--")&&t.endsWith("--")?"/"+t.slice(2,-2).replace(/-/g,"/"):t}function nc(t){try{let e=re.readFileSync(t,"utf-8").split(`
354
+ `).find(r=>r.trim().length>0);if(!e)return!1;let s=JSON.parse(e);return s.type==="session"&&"version"in s}catch{return!1}}function sc(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 rc(t){try{let e=re.readFileSync(t,"utf-8").split(`
355
+ `).filter(Boolean),s=[];for(let r of e)try{let n=JSON.parse(r);n.type==="message"&&n.message&&s.push(n)}catch{}return s}catch{return[]}}async function ic(t,e,s){let n=(e.harness??null)==="pi",i=lr(),o=re.existsSync(i),a=[];if(o)try{let m=re.readdirSync(i,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=De.join(i,p.name),g=re.readdirSync(f).filter(h=>h.endsWith(".jsonl"));a.push({name:p.name,sessions:g.length,path:f,source:"pi",cwd:dr(p.name)})}}catch{}let c=cr(n&&!t?null:t),l=!n||t?re.existsSync(c):!1,d=[];if(l&&(!n||t))try{let m=re.readdirSync(c,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=De.join(c,p.name),g=re.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=n?[...a,...d]:[...d,...a];if(u.length===0){let m=[];o?m.push(i):m.push(i+" (not found)"),n||m.push(l?c:c+" (not found)"),y({available:!1,reason:`No sessions found. Searched: ${m.join(", ")}`,projects:[],count:0},s);return}y({available:!0,pi_base:o?i:null,claude_base:l?c:null,projects:u,count:u.length},s)}async function oc(t,e,s,r){let n=lr(),i=null,o="claude";if(re.existsSync(n)){let d=De.join(n,t);if(re.existsSync(d))i=d,o="pi";else try{let u=re.readdirSync(n,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of u){let p=dr(m.name);if(p.endsWith("/"+t)||p===t||m.name===t){i=De.join(n,m.name),o="pi";break}}}catch{}}if(!i){let d=cr(r),u=De.join(d,t);re.existsSync(u)&&(i=u,o="claude")}if(!i){y({error:`Project not found: ${t}`,available_projects:[]},s);return}let a=[],c=re.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=De.join(i,d);if(o==="pi"||nc(u))try{let m=re.readFileSync(u,"utf-8").split(`
356
+ `).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=re.readFileSync(u,"utf-8").split(`
357
+ `).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},s)}async function ac(t,e,s){let n=(e.harness??null)==="pi",i=e.limit??150,o=e.maxChars??500,a=[],c=lr();if(re.existsSync(c))try{let d=re.readdirSync(c,{withFileTypes:!0}).filter(u=>u.isDirectory());e:for(let u of d){let m=De.join(c,u.name),p=re.readdirSync(m).filter(g=>g.endsWith(".jsonl")),f=0;for(let g of p){let h=rc(De.join(m,g));for(let x of h)if(x.message?.role==="user"){let S=sc(x.message.content).slice(0,o);if(S.length>20){if(a.push({project:dr(u.name),text:S,source:"pi"}),f++,e.maxPerProject&&f>=e.maxPerProject)break;if(a.length>=i)break e}}}}}catch{}if(!(n&&!t&&a.length>=i)){let d=cr(t);if(re.existsSync(d))try{let u=re.readdirSync(d,{withFileTypes:!0}).filter(m=>m.isDirectory());e:for(let m of u){let p=De.join(d,m.name),f=re.readdirSync(p).filter(h=>h.endsWith(".jsonl")),g=0;for(let h of f)try{let x=re.readFileSync(De.join(p,h),"utf-8").split(`
358
+ `).filter(Boolean);for(let S of x)try{let v=JSON.parse(S);if(v.role==="human"||v.type==="human"){let C=(v.content||v.message||"").slice(0,o);if(C.length>20){if(a.push({project:m.name,text:C,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},s);return}y({available:!0,samples:a,count:a.length},s)}var re,De,$s=L(()=>{"use strict";ye();re=require("fs"),De=require("path")});var Mt={};xe(Mt,{cmdGenerateClaudeMd:()=>pc,cmdGenerateClaudeProfile:()=>mc,cmdGenerateDevPreferences:()=>uc,cmdProfileQuestionnaire:()=>dc,cmdWriteProfile:()=>lc});function Cs(t,e,s="CLAUDE.md"){return e?We.default.resolve(e):We.default.join(t,s)}function ur(t,e){if(!t)return null;let s=We.default.isAbsolute(t)?t:We.default.join(e,t);if(!nt.default.existsSync(s))return null;try{return JSON.parse(nt.default.readFileSync(s,"utf-8"))}catch{return null}}function cc(t){return t.map(e=>`## ${e.heading}
348
359
 
349
360
  ${e.body}`).join(`
350
361
 
351
362
  `)+`
352
- `}function rc(t,e,n){e.input||b("--input <analysis-json-path> is required");let r=dr(e.input,t);if(!r){y({error:"Could not load analysis file",input:e.input},n);return}let s=Cs(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?sc(i):JSON.stringify(r,null,2)+`
353
- `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:J(We.default.relative(t,s))},n,s)}function ic(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 oc(t,e,n){let r=dr(e.analysis,t),s=Cs(t,e.output,".dev-preferences.md"),i=e.stack?`
363
+ `}function lc(t,e,s){e.input||b("--input <analysis-json-path> is required");let r=ur(e.input,t);if(!r){y({error:"Could not load analysis file",input:e.input},s);return}let n=Cs(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?cc(i):JSON.stringify(r,null,2)+`
364
+ `;nt.default.writeFileSync(n,o,"utf-8"),y({written:!0,path:J(We.default.relative(t,n))},s,n)}function dc(t,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(t.answers)try{let r=JSON.parse(t.answers);y({questionnaire:s,answers:r,complete:!0},e)}catch{y({questionnaire:s,answers:null,complete:!1},e)}else y({questionnaire:s,instructions:`Re-run with --answers '{"style":"...","testing":"..."}' to record preferences`},e)}function uc(t,e,s){let r=ur(e.analysis,t),n=Cs(t,e.output,".dev-preferences.md"),i=e.stack?`
354
365
 
355
366
  ## Stack
356
367
 
@@ -362,7 +373,7 @@ ${JSON.stringify(r,null,2)}
362
373
  `:`# Developer Preferences
363
374
 
364
375
  *No analysis provided - edit manually.*${i}
365
- `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:J(We.default.relative(t,s))},n,s)}function ac(t,e,n){let r=dr(e.analysis,t),s=e.global?We.default.join(process.env.HOME??"",".claude","CLAUDE.md"):Cs(t,e.output,"CLAUDE.md");nt.default.mkdirSync(We.default.dirname(s),{recursive:!0});let i=r?`# Claude Profile
376
+ `;nt.default.writeFileSync(n,o,"utf-8"),y({written:!0,path:J(We.default.relative(t,n))},s,n)}function mc(t,e,s){let r=ur(e.analysis,t),n=e.global?We.default.join(process.env.HOME??"",".claude","CLAUDE.md"):Cs(t,e.output,"CLAUDE.md");nt.default.mkdirSync(We.default.dirname(n),{recursive:!0});let i=r?`# Claude Profile
366
377
 
367
378
  *Generated from session analysis*
368
379
 
@@ -370,7 +381,7 @@ ${JSON.stringify(r,null,2)}
370
381
  `:`# Claude Profile
371
382
 
372
383
  *No analysis provided - edit manually.*
373
- `;nt.default.writeFileSync(s,i,"utf-8"),y({written:!0,path:e.global?s:J(We.default.relative(t,s))},n,s)}function cc(t,e,n){let r=e.harness==="pi"?"AGENTS.md":"CLAUDE.md",s=Cs(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:J(We.default.relative(t,s))},n,"exists");return}let o=`# ${e.harness==="pi"?"AGENTS.md":"CLAUDE.md"}
384
+ `;nt.default.writeFileSync(n,i,"utf-8"),y({written:!0,path:e.global?n:J(We.default.relative(t,n))},s,n)}function pc(t,e,s){let r=e.harness==="pi"?"AGENTS.md":"CLAUDE.md",n=Cs(t,e.output,r);if(nt.default.existsSync(n)&&!e.force&&!e.auto){y({written:!1,reason:"File already exists. Use --force to overwrite.",path:J(We.default.relative(t,n))},s,"exists");return}let o=`# ${e.harness==="pi"?"AGENTS.md":"CLAUDE.md"}
374
385
 
375
386
  *Agent profile for this project.*
376
387
 
@@ -381,9 +392,9 @@ See \`.planning/PROJECT.md\` for project overview.
381
392
  ## GSD Integration
382
393
 
383
394
  This project uses GSD (Get Shit Done) for structured development. Run \`/gsd-help\` to see available commands.
384
- `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:J(We.default.relative(t,s))},n,s)}var nt,We,It=L(()=>{"use strict";nt=U(require("fs")),We=U(require("path"));ye()});var Oe=U(require("fs")),Tt=U(require("path"));ye();var xr=require("jsonpath-plus");function Is(t,e,n){let r=t;if(n&&(r=(0,xr.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 lc(){let{StateJsonCommand:t,StateGetCommand:e,StateUpdateCommand:n,StatePatchCommand:r,StateAdvancePlanCommand:s,StateLoadCommand:i,StateUpdateProgressCommand:o,StateReconcileCommand:a,InitCommand:c,RoadmapAnalyzeCommand:l,RoadmapGetPhaseCommand:d,RoadmapUpdatePlanProgressCommand:u,ConfigGetCommand:m,ConfigSetCommand:p,ConfigSetModelProfileCommand:f,ConfigNewProjectCommand:g,ConfigEnsureSectionCommand:h,PhaseNextDecimalCommand:x,PhaseAddCommand:S,PhaseInsertCommand:v,PhaseRemoveCommand:$,PhaseCompleteCommand:P,PhasePlanIndexCommand:C,MilestoneCompleteCommand:T,RequirementsMarkCompleteCommand:k,ValidateConsistencyCommand:j,ValidateHealthCommand:R,ValidateAgentsCommand:E,VerifyCommand:V,AuditUatCommand:H,WorkstreamCreateCommand:ae,WorkstreamListCommand:X,WorkstreamStatusCommand:Z,WorkstreamCompleteCommand:Ae,WorkstreamSetCommand:qe,WorkstreamGetCommand:Dt,WorkstreamProgressCommand:As,ScaffoldCommand:en,CommitCommand:tn,FrontmatterGetCommand:ur,FrontmatterSetCommand:nn,FrontmatterMergeCommand:Ee,TemplateSelectCommand:Fe,TemplateFillCommand:gi,ProgressCommand:hi,StatsCommand:yi,TodoCompleteCommand:xi,TodoMatchPhaseCommand:Si,SummaryExtractCommand:bi,WxpProcessCommand:vi}=await Promise.resolve().then(()=>(ui(),di));return{"state json":t,"state get":e,"state update":n,"state patch":r,"state advance-plan":s,"state load":i,"state update-progress":o,"state reconcile":a,init:c,"roadmap analyze":l,"roadmap get-phase":d,"roadmap update-plan-progress":u,"config-get":m,"config-set":p,"config-set-model-profile":f,"config-new-project":g,"config-ensure-section":h,"phase next-decimal":x,"phase add":S,"phase insert":v,"phase remove":$,"phase complete":P,"phase-plan-index":C,"milestone complete":T,"requirements mark-complete":k,"validate consistency":j,"validate health":R,"validate agents":E,verify:V,"audit-uat":H,"workstream create":ae,"workstream list":X,"workstream status":Z,"workstream complete":Ae,"workstream set":qe,"workstream get":Dt,"workstream progress":As,scaffold:en,commit:tn,"frontmatter get":ur,"frontmatter set":nn,"frontmatter merge":Ee,"template select":Fe,"template fill":gi,progress:hi,stats:yi,"todo complete":xi,"todo match-phase":Si,"summary-extract":bi,"wxp process":vi}}function dc(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 pi(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 uc(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 mc(){let t=process.argv.slice(2);if(t[0]==="--version"||t[0]==="-v"){let{version:f}=mi();process.stdout.write(`pi-gsd-tools v${f}
385
- `);return}if(t[0]==="--help"||t[0]==="-h"){fi();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=Tt.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=Tt.default.resolve(h)}(!Oe.default.existsSync(e)||!Oe.default.statSync(e).isDirectory())&&b(`Invalid --cwd: ${e}`)}if(!Oe.default.existsSync(Tt.default.join(e,".planning"))){let f=Lt(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=Xe(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]){fi();return}let a=[...t,"--cwd",e];r&&a.push("--raw");let c=await lc(),l=uc(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=Oe.default.writeSync.bind(Oe.default),x=[];Oe.default.writeSync=(S,v,...$)=>S===1?(x.push(String(v)),String(v).length):h(S,v,...$);try{await c[l].run(g)}finally{Oe.default.writeSync=h;let S=x.join("");try{let v=JSON.parse(S),$=v;o&&($=pi(v,o)??""),h(1,Is($,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=qt(e));let p=async()=>{await pc(d,u,e,r)};if(o||i||s!=="json"){let f=Oe.default.writeSync.bind(Oe.default),g=[];Oe.default.writeSync=(h,x,...S)=>h===1?(g.push(String(x)),String(x).length):f(h,x,...S);try{await p()}finally{Oe.default.writeSync=f;let h=g.join("");try{let x=JSON.parse(h),S=x;o&&(S=pi(x,o)??""),f(1,Is(S,s,i??void 0))}catch{f(1,h)}}return}await p()}function fi(){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(`
395
+ `;nt.default.writeFileSync(n,o,"utf-8"),y({written:!0,path:J(We.default.relative(t,n))},s,n)}var nt,We,It=L(()=>{"use strict";nt=U(require("fs")),We=U(require("path"));ye()});var Oe=U(require("fs")),Tt=U(require("path"));ye();var Sr=require("jsonpath-plus");function Is(t,e,s){let r=t;if(s&&(r=(0,Sr.JSONPath)({path:s,json:t,wrap:!1})),e==="json")return JSON.stringify(r,null,2);let{encode:n}=require("@toon-format/toon");return n(r)}async function fc(){let{StateJsonCommand:t,StateGetCommand:e,StateUpdateCommand:s,StatePatchCommand:r,StateAdvancePlanCommand:n,StateLoadCommand:i,StateUpdateProgressCommand:o,StateReconcileCommand:a,InitCommand:c,RoadmapAnalyzeCommand:l,RoadmapGetPhaseCommand:d,RoadmapUpdatePlanProgressCommand:u,ConfigGetCommand:m,ConfigSetCommand:p,ConfigSetModelProfileCommand:f,ConfigNewProjectCommand:g,ConfigEnsureSectionCommand:h,PhaseNextDecimalCommand:x,PhaseAddCommand:S,PhaseAddBatchCommand:v,PhaseInsertCommand:C,PhaseRemoveCommand:P,PhaseCompleteCommand:$,PhasePlanIndexCommand:T,MilestoneCompleteCommand:k,RequirementsMarkCompleteCommand:j,ValidateConsistencyCommand:R,ValidateHealthCommand:E,ValidateAgentsCommand:V,VerifyCommand:H,AuditUatCommand:ae,WorkstreamCreateCommand:X,WorkstreamListCommand:Z,WorkstreamStatusCommand:Ae,WorkstreamCompleteCommand:qe,WorkstreamSetCommand:Dt,WorkstreamGetCommand:As,WorkstreamProgressCommand:en,ScaffoldCommand:tn,CommitCommand:mr,FrontmatterGetCommand:nn,FrontmatterSetCommand:Ee,FrontmatterMergeCommand:Fe,TemplateSelectCommand:xi,TemplateFillCommand:Si,ProgressCommand:bi,StatsCommand:vi,TodoCompleteCommand:_i,TodoMatchPhaseCommand:wi,SummaryExtractCommand:ki,WxpProcessCommand:Pi}=await Promise.resolve().then(()=>(fi(),pi));return{"state json":t,"state get":e,"state update":s,"state patch":r,"state advance-plan":n,"state load":i,"state update-progress":o,"state reconcile":a,init:c,"roadmap analyze":l,"roadmap get-phase":d,"roadmap update-plan-progress":u,"config-get":m,"config-set":p,"config-set-model-profile":f,"config-new-project":g,"config-ensure-section":h,"phase next-decimal":x,"phase add":S,"phase add-batch":v,"phase insert":C,"phase remove":P,"phase complete":$,"phase-plan-index":T,"milestone complete":k,"requirements mark-complete":j,"validate consistency":R,"validate health":E,"validate agents":V,verify:H,"audit-uat":ae,"workstream create":X,"workstream list":Z,"workstream status":Ae,"workstream complete":qe,"workstream set":Dt,"workstream get":As,"workstream progress":en,scaffold:tn,commit:mr,"frontmatter get":nn,"frontmatter set":Ee,"frontmatter merge":Fe,"template select":xi,"template fill":Si,progress:bi,stats:vi,"todo complete":_i,"todo match-phase":wi,"summary-extract":ki,"wxp process":Pi}}function gc(t,e=[],s=[]){let r={};for(let n of e){let i=t.indexOf(`--${n}`);r[n]=i!==-1&&t[i+1]!==void 0&&!t[i+1].startsWith("--")?t[i+1]:null}for(let n of s)r[n]=t.includes(`--${n}`);return r}function hi(t,e){let s=e.split("."),r=t;for(let n of s){if(r==null)return;let i=n.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[n]}return r}function hc(t,e){let s=t.slice(0,2).join(" ");if(e[s])return s;let r=t[0];return r&&e[r]?r:null}async function yc(){let t=process.argv.slice(2);if(t[0]==="--version"||t[0]==="-v"){let{version:f}=gi();process.stdout.write(`pi-gsd-tools v${f}
396
+ `);return}if(t[0]==="--help"||t[0]==="-h"){yi();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=Tt.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=Tt.default.resolve(h)}(!Oe.default.existsSync(e)||!Oe.default.statSync(e).isDirectory())&&b(`Invalid --cwd: ${e}`)}if(!Oe.default.existsSync(Tt.default.join(e,".planning"))){let f=Lt(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=Ke(e),h&&!/^[a-zA-Z0-9_-]+$/.test(h)&&b("Invalid workstream name"),h&&(process.env.GSD_WORKSTREAM=h)}let s=t.indexOf("--raw"),r=s!==-1;s!==-1&&t.splice(s,1);let n="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"'),n=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]){yi();return}let a=[...t,"--cwd",e];r&&a.push("--raw");let c=await fc(),l=hc(t,c);if(l){let f=l.split(" ").length,g=[...t.slice(f),"--cwd",e];if(r&&g.push("--raw"),o||i||n!=="json"){let h=Oe.default.writeSync.bind(Oe.default),x=[];Oe.default.writeSync=(S,v,...C)=>S===1?(x.push(String(v)),String(v).length):h(S,v,...C);try{await c[l].run(g)}finally{Oe.default.writeSync=h;let S=x.join("");try{let v=JSON.parse(S),C=v;o&&(C=hi(v,o)??""),h(1,Is(C,n,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=qt(e));let p=async()=>{await xc(d,u,e,r)};if(o||i||n!=="json"){let f=Oe.default.writeSync.bind(Oe.default),g=[];Oe.default.writeSync=(h,x,...S)=>h===1?(g.push(String(x)),String(x).length):f(h,x,...S);try{await p()}finally{Oe.default.writeSync=f;let h=g.join("");try{let x=JSON.parse(h),S=x;o&&(S=hi(x,o)??""),f(1,Is(S,n,i??void 0))}catch{f(1,h)}}return}await p()}function yi(){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(`
386
397
  `)+`
387
- `)}async function pc(t,e,n,r){switch(t){case"resolve-model":{let{cmdResolveModel:s}=await Promise.resolve().then(()=>(_e(),ve));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(()=>(_e(),ve)),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(()=>(Et(),Rt)),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(()=>(_e(),ve));s(e[1],r);break}case"current-timestamp":{let{cmdCurrentTimestamp:s}=await Promise.resolve().then(()=>(_e(),ve));s(e[1],r);break}case"list-todos":{let{cmdListTodos:s}=await Promise.resolve().then(()=>(_e(),ve));s(n,e[1],r);break}case"verify-path-exists":{let{cmdVerifyPathExists:s}=await Promise.resolve().then(()=>(_e(),ve));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(()=>(qn(),Wn));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(()=>(Ys(),Js));e[1]==="render-checkpoint"?s.cmdRenderCheckpoint(n,dc(e,["file"]),r):b("Unknown uat subcommand. Available: render-checkpoint");break}case"state-snapshot":{let{cmdStateSnapshot:s}=await Promise.resolve().then(()=>($e(),ze));s(n,r);break}case"agent-skills":{let{cmdAgentSkills:s}=await Promise.resolve().then(()=>(bn(),Sn));s(n,e[1],r);break}case"history-digest":{let{cmdHistoryDigest:s}=await Promise.resolve().then(()=>(_e(),ve));s(n,r);break}case"scan-sessions":{let{cmdScanSessions:s}=await Promise.resolve().then(()=>($s(),Ps)),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(()=>($s(),Ps)),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(()=>($s(),Ps)),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(()=>(It(),Mt)),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(()=>(It(),Mt)),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(()=>(It(),Mt)),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(()=>(It(),Mt)),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(()=>(It(),Mt)),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(()=>(Ot(),mr)),i=e.indexOf("--output"),o=s();if(e.includes("--stdout")){process.stdout.write(o);break}let a=i!==-1?Tt.default.resolve(e[i+1]):Tt.default.resolve(__dirname,"..","references","model-profiles.md");Oe.default.writeFileSync(a,o,"utf-8"),r?process.stdout.write(a):process.stdout.write(`Wrote ${a}
388
- `);break}case"websearch":{let{cmdWebsearch:s}=await Promise.resolve().then(()=>(_e(),ve)),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(()=>(bn(),Sn));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}`)}}mc().catch(t=>{process.stderr.write("Fatal: "+t.message+`
398
+ `)}async function xc(t,e,s,r){switch(t){case"resolve-model":{let{cmdResolveModel:n}=await Promise.resolve().then(()=>(_e(),ve));n(s,e[1],r);break}case"find-phase":{let{cmdFindPhase:n}=await Promise.resolve().then(()=>(Je(),Ge));n(s,e[1],r);break}case"commit-to-subrepo":{let{cmdCommitToSubrepo:n}=await Promise.resolve().then(()=>(_e(),ve)),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("--")):[];n(s,o.join(" ")||void 0,a,r);break}case"verify-summary":{let{cmdVerifySummary:n}=await Promise.resolve().then(()=>(Et(),Rt)),i=e[2]?parseInt(e[2],10):2;n(s,e[1],i,r);break}case"generate-slug":{let{cmdGenerateSlug:n}=await Promise.resolve().then(()=>(_e(),ve));n(e[1],r);break}case"current-timestamp":{let{cmdCurrentTimestamp:n}=await Promise.resolve().then(()=>(_e(),ve));n(e[1],r);break}case"list-todos":{let{cmdListTodos:n}=await Promise.resolve().then(()=>(_e(),ve));n(s,e[1],r);break}case"verify-path-exists":{let{cmdVerifyPathExists:n}=await Promise.resolve().then(()=>(_e(),ve));n(s,e[1],r);break}case"phases":{let{cmdPhasesList:n}=await Promise.resolve().then(()=>(Je(),Ge));n(s,{},r);break}case"requirements":{let{cmdRequirementsMarkComplete:n}=await Promise.resolve().then(()=>(qn(),Wn));e[1]==="mark-complete"?n(s,e.slice(2),r):b("Unknown requirements subcommand. Available: mark-complete");break}case"uat":{let n=await Promise.resolve().then(()=>(Hs(),Ys));e[1]==="render-checkpoint"?n.cmdRenderCheckpoint(s,gc(e,["file"]),r):b("Unknown uat subcommand. Available: render-checkpoint");break}case"state-snapshot":{let{cmdStateSnapshot:n}=await Promise.resolve().then(()=>($e(),ze));n(s,r);break}case"agent-skills":{let{cmdAgentSkills:n}=await Promise.resolve().then(()=>(bn(),Sn));n(s,e[1],r);break}case"history-digest":{let{cmdHistoryDigest:n}=await Promise.resolve().then(()=>(_e(),ve));n(s,r);break}case"scan-sessions":{let{cmdScanSessions:n}=await Promise.resolve().then(()=>($s(),Ps)),i=e.indexOf("--path"),o=e.indexOf("--harness");await n(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:n}=await Promise.resolve().then(()=>($s(),Ps)),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 n(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:n}=await Promise.resolve().then(()=>($s(),Ps)),i=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),c=e.indexOf("--max-chars"),l=e.indexOf("--harness");await n(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:n}=await Promise.resolve().then(()=>(It(),Mt)),i=e.indexOf("--input"),o=e.indexOf("--output");i===-1&&b("--input <analysis-json-path> is required"),n(s,{input:e[i+1],output:o!==-1?e[o+1]:null},r);break}case"profile-questionnaire":{let{cmdProfileQuestionnaire:n}=await Promise.resolve().then(()=>(It(),Mt)),i=e.indexOf("--answers");n({answers:i!==-1?e[i+1]:null},r);break}case"generate-dev-preferences":{let{cmdGenerateDevPreferences:n}=await Promise.resolve().then(()=>(It(),Mt)),i=e.indexOf("--analysis"),o=e.indexOf("--output"),a=e.indexOf("--stack");n(s,{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:n}=await Promise.resolve().then(()=>(It(),Mt)),i=e.indexOf("--analysis"),o=e.indexOf("--output");n(s,{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:n}=await Promise.resolve().then(()=>(It(),Mt)),i=e.indexOf("--output"),o=e.indexOf("--harness");n(s,{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:n}=await Promise.resolve().then(()=>(Ot(),pr)),i=e.indexOf("--output"),o=n();if(e.includes("--stdout")){process.stdout.write(o);break}let a=i!==-1?Tt.default.resolve(e[i+1]):Tt.default.resolve(__dirname,"..","references","model-profiles.md");Oe.default.writeFileSync(a,o,"utf-8"),r?process.stdout.write(a):process.stdout.write(`Wrote ${a}
399
+ `);break}case"websearch":{let{cmdWebsearch:n}=await Promise.resolve().then(()=>(_e(),ve)),i=e.indexOf("--limit"),o=e.indexOf("--freshness");await n(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:n}=await Promise.resolve().then(()=>(bn(),Sn));await n(s,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}`)}}yc().catch(t=>{process.stderr.write("Fatal: "+t.message+`
389
400
  `),process.exit(1)});