pi-gsd 2.0.13 → 2.0.16

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.
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var vi=Object.create;var As=Object.defineProperty;var _i=Object.getOwnPropertyDescriptor;var wi=Object.getOwnPropertyNames;var ki=Object.getPrototypeOf,Pi=Object.prototype.hasOwnProperty;var L=(t,e)=>()=>(t&&(e=t(t=0)),e);var $i=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),ye=(t,e)=>{for(var n in e)As(t,n,{get:e[n],enumerable:!0})},Ci=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of wi(e))!Pi.call(t,s)&&s!==n&&As(t,s,{get:()=>e[s],enumerable:!(r=_i(e,s))||r.enumerable});return t};var U=(t,e,n)=>(n=t!=null?vi(ki(t)):{},Ci(e||!t||!t.__esModule?As(n,"default",{value:t,enumerable:!0}):n,t));var lr={};ye(lr,{MODEL_PROFILES:()=>Me,VALID_PROFILES:()=>vt,formatAgentToModelMapAsTable:()=>Rs,generateModelProfilesMd:()=>Ri,getAgentToModelMapForProfile:()=>js});function js(t){let e={};for(let[n,r]of Object.entries(Me))e[n]=r[t];return e}function Rs(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 vi=Object.create;var As=Object.defineProperty;var _i=Object.getOwnPropertyDescriptor;var wi=Object.getOwnPropertyNames;var ki=Object.getPrototypeOf,Pi=Object.prototype.hasOwnProperty;var q=(t,e)=>()=>(t&&(e=t(t=0)),e);var $i=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),he=(t,e)=>{for(var n in e)As(t,n,{get:e[n],enumerable:!0})},Ci=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of wi(e))!Pi.call(t,s)&&s!==n&&As(t,s,{get:()=>e[s],enumerable:!(r=_i(e,s))||r.enumerable});return t};var L=(t,e,n)=>(n=t!=null?vi(ki(t)):{},Ci(e||!t||!t.__esModule?As(n,"default",{value:t,enumerable:!0}):n,t));var lr={};he(lr,{MODEL_PROFILES:()=>Fe,VALID_PROFILES:()=>vt,formatAgentToModelMapAsTable:()=>Rs,generateModelProfilesMd:()=>Ri,getAgentToModelMapForProfile:()=>js});function js(t){let e={};for(let[n,r]of Object.entries(Fe))e[n]=r[t];return e}function Rs(t){let e=Math.max(5,...Object.keys(t).map(o=>o.length)),n=Math.max(5,...Object.values(t).map(o=>o.length)),r="\u2500".repeat(e+2)+"\u253C"+"\u2500".repeat(n+2),i=" "+"Agent".padEnd(e)+" \u2502 "+"Model".padEnd(n)+`
3
3
  `+r+`
4
4
  `;for(let[o,a]of Object.entries(t))i+=" "+o.padEnd(e)+" \u2502 "+a.padEnd(n)+`
5
- `;return i}function Ri(){let t=ji,e=Ai,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 p=n.map(m=>Me[u][m]);return"| "+[u,...p,"inherit"].join(" | ")+" |"}),c=[i,o,...a].join(`
5
+ `;return i}function Ri(){let t=ji,e=Ai,n=vt,r=Object.keys(Fe),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=>Fe[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,43 @@ 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,Ai,ji,Dt=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"]),Ai="/gsd-",ji="pi"});var fr={};ye(fr,{MODEL_ALIAS_MAP:()=>dr,MODEL_PROFILES:()=>Me,checkAgentsInstalled:()=>_t,comparePhaseNum:()=>Ae,detectSubRepos:()=>Es,escapeRegex:()=>re,execGit:()=>de,extractCurrentMilestone:()=>_e,extractOneLinerFromBody:()=>Ut,filterPlanFiles:()=>wt,filterSummaryFiles:()=>kt,findPhaseInternal:()=>ge,findProjectRoot:()=>Wt,generateSlugInternal:()=>Le,getActiveWorkstream:()=>Xe,getAgentsDir:()=>mr,getArchivedPhaseDirs:()=>Lt,getMilestoneInfo:()=>ce,getMilestonePhaseFilter:()=>we,getPhaseFileStats:()=>pr,getRoadmapPhaseInternal:()=>dt,gsdError:()=>b,isGitIgnored:()=>sn,loadConfig:()=>Z,normalizeMd:()=>Ie,normalizePhaseName:()=>me,output:()=>y,pathExistsInternal:()=>Ii,planningDir:()=>W,planningPaths:()=>E,planningRoot:()=>Q,readSubdirectories:()=>Ue,reapStaleTempFiles:()=>ur,replaceInCurrentMilestone:()=>lt,resolveModelInternal:()=>ie,resolveWorktreeRoot:()=>qt,safeReadFile:()=>Ne,searchPhaseInDir:()=>Fs,setActiveWorkstream:()=>ct,stripShippedMilestones:()=>Ot,toPosixPath:()=>G,withPlanningLock:()=>Mi});function G(t){return t.split(F.default.sep).join("/")}function Es(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=F.default.join(t,r.name,".git");try{N.default.existsSync(s)&&e.push(r.name)}catch{}}}catch{}return e.sort()}function Wt(t){let e=F.default.resolve(t),n=F.default.parse(e).root,r=nn.default.homedir(),s=F.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(F.default.join(c,".git")))return!0;if(c===a)break;c=F.default.dirname(c)}return!1}let o=e;for(;o!==n;){let a=F.default.dirname(o);if(a===o||a===r)break;let c=F.default.join(a,".planning");if(N.default.existsSync(c)&&N.default.statSync(c).isDirectory()){let l=F.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 m=F.default.relative(a,e).split(F.default.sep)[0];if(u.includes(m))return a}if(d.multiRepo===!0&&i(a))return a}catch{}if(i(a))return a}o=a}return t}function ur(t="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:n=!1}={}){try{let r=nn.default.tmpdir(),s=Date.now();for(let i of N.default.readdirSync(r)){if(!i.startsWith(t))continue;let o=F.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){ur();let i=F.default.join(nn.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 Z(t){let e=F.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 p=i[u?.section??""];if(u&&p?.[u.field]!==void 0)return p[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=Es(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=Es(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:sn(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 sn(t,e){try{return(0,Nt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:t,stdio:"pipe"}),!0}catch{return!1}}function de(t,e){let n=(0,Nt.spawnSync)("git",e,{cwd:t,stdio:"pipe",encoding:"utf-8"});return{exitCode:n.status??1,stdout:(n.stdout??"").toString().trim(),stderr:(n.stderr??"").toString().trim()}}function Ie(t){if(!t||typeof t!="string")return t;let e=t.replace(/\r\n/g,`
136
+ `}var Fe,vt,Ai,ji,Dt=q(()=>{"use strict";Fe={"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(Fe["gsd-planner"]),Ai="/gsd-",ji="pi"});var fr={};he(fr,{MODEL_ALIAS_MAP:()=>dr,MODEL_PROFILES:()=>Fe,checkAgentsInstalled:()=>_t,comparePhaseNum:()=>$e,detectSubRepos:()=>Es,escapeRegex:()=>ne,execGit:()=>ae,extractCurrentMilestone:()=>ve,extractOneLinerFromBody:()=>Ut,filterPlanFiles:()=>wt,filterSummaryFiles:()=>kt,findPhaseInternal:()=>fe,findProjectRoot:()=>Wt,generateSlugInternal:()=>Le,getActiveWorkstream:()=>Xe,getAgentsDir:()=>mr,getArchivedPhaseDirs:()=>Lt,getMilestoneInfo:()=>ie,getMilestonePhaseFilter:()=>_e,getPhaseFileStats:()=>pr,getRoadmapPhaseInternal:()=>dt,gsdError:()=>v,isGitIgnored:()=>sn,loadConfig:()=>X,normalizeMd:()=>Me,normalizePhaseName:()=>de,output:()=>y,pathExistsInternal:()=>Ii,planningDir:()=>O,planningPaths:()=>j,planningRoot:()=>Z,readSubdirectories:()=>Ue,reapStaleTempFiles:()=>ur,replaceInCurrentMilestone:()=>lt,resolveModelInternal:()=>se,resolveWorktreeRoot:()=>qt,safeReadFile:()=>Ne,searchPhaseInDir:()=>Fs,setActiveWorkstream:()=>ct,stripShippedMilestones:()=>Ot,toPosixPath:()=>B,withPlanningLock:()=>Mi});function B(t){return t.split(R.default.sep).join("/")}function Es(t){let e=[];try{let n=D.default.readdirSync(t,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(".")||r.name==="node_modules")continue;let s=R.default.join(t,r.name,".git");try{D.default.existsSync(s)&&e.push(r.name)}catch{}}}catch{}return e.sort()}function Wt(t){let e=R.default.resolve(t),n=R.default.parse(e).root,r=nn.default.homedir(),s=R.default.join(e,".planning");if(D.default.existsSync(s)&&D.default.statSync(s).isDirectory())return t;function i(a){let c=e;for(;c!==n;){if(D.default.existsSync(R.default.join(c,".git")))return!0;if(c===a)break;c=R.default.dirname(c)}return!1}let o=e;for(;o!==n;){let a=R.default.dirname(o);if(a===o||a===r)break;let c=R.default.join(a,".planning");if(D.default.existsSync(c)&&D.default.statSync(c).isDirectory()){let l=R.default.join(c,"config.json");try{let d=JSON.parse(D.default.readFileSync(l,"utf-8")),u=d.sub_repos||d.planning?.sub_repos||[];if(Array.isArray(u)&&u.length>0){let p=R.default.relative(a,e).split(R.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 ur(t="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:n=!1}={}){try{let r=nn.default.tmpdir(),s=Date.now();for(let i of D.default.readdirSync(r)){if(!i.startsWith(t))continue;let o=R.default.join(r,i);try{let a=D.default.statSync(o);s-a.mtimeMs>e&&(a.isDirectory()?D.default.rmSync(o,{recursive:!0,force:!0}):n||D.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){ur();let i=R.default.join(nn.default.tmpdir(),`gsd-${Date.now()}.json`);D.default.writeFileSync(i,s,"utf-8"),r="@file:"+i}else r=s}D.default.writeSync(1,r)}function v(t){D.default.writeSync(2,"Error: "+t+`
137
+ `),process.exit(1)}function Ne(t){try{return D.default.readFileSync(t,"utf-8")}catch{return null}}function X(t){let e=R.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=D.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{D.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=Es(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=Es(t);if(d.length>0){let u=[...a].sort();JSON.stringify(u)!==JSON.stringify(d)&&(i.sub_repos=d,o=!0)}}if(o)try{D.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:sn(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 sn(t,e){try{return(0,Nt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:t,stdio:"pipe"}),!0}catch{return!1}}function ae(t,e){let n=(0,Nt.spawnSync)("git",e,{cwd:t,stdio:"pipe",encoding:"utf-8"});return{exitCode:n.status??1,stdout:(n.stdout??"").toString().trim(),stderr:(n.stderr??"").toString().trim()}}function Me(t){if(!t||typeof t!="string")return t;let e=t.replace(/\r\n/g,`
138
138
  `),n=e.split(`
139
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!==""&&!Ei(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)&&Fi(n,s)&&s<n.length-1&&n[s+1]?.trimEnd()!==""&&r.push(""),/^(\s*[-*+]\s|\s*\d+\.\s)/.test(i)&&s<n.length-1){let l=n[s+1];l!==void 0&&l.trimEnd()!==""&&!/^(\s*[-*+]\s|\s*\d+\.\s)/.test(l)&&!/^\s/.test(l)&&r.push("")}}return e=r.join(`
140
140
  `),e=e.replace(/\n{3,}/g,`
141
141
 
142
142
  `),e=e.replace(/\n*$/,`
143
- `),e}function Ei(t,e){let n=0;for(let r=0;r<e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===1}function Fi(t,e){let n=0;for(let r=0;r<=e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===0}function qt(t){if(N.default.existsSync(F.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=F.default.resolve(t,e.stdout),s=F.default.resolve(t,n.stdout);return r!==s?F.default.dirname(s):t}function Mi(t,e){let n=F.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,Nt.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?F.default.join(t,".planning","workstreams",n):F.default.join(t,".planning")}function Q(t){return F.default.join(t,".planning")}function E(t,e){let n=W(t,e),r=F.default.join(t,".planning");return{planning:n,state:F.default.join(n,"STATE.md"),roadmap:F.default.join(n,"ROADMAP.md"),project:F.default.join(r,"PROJECT.md"),config:F.default.join(r,"config.json"),phases:F.default.join(n,"phases"),requirements:F.default.join(n,"REQUIREMENTS.md")}}function Xe(t){let e=F.default.join(Q(t),"active-workstream");try{let n=N.default.readFileSync(e,"utf-8").trim();return!n||!/^[a-zA-Z0-9_-]+$/.test(n)||!N.default.existsSync(F.default.join(Q(t),"workstreams",n))?null:n}catch{return null}}function ct(t,e){let n=F.default.join(Q(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 me(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 Ae(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 Fs(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=F.default.join(t,s),{plans:l,summaries:d,hasResearch:u,hasContext:p,hasVerification:m,hasReviews:f}=pr(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:G(F.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:p,has_verification:m,has_reviews:f}}catch{return null}}function ge(t,e){if(!e)return null;let n=F.default.join(W(t),"phases"),r=me(e),s=G(F.default.relative(t,n)),i=Fs(n,s,r);if(i)return i;let o=F.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=F.default.join(o,c),u=".planning/milestones/"+c,p=Fs(d,u,r);if(p)return p.archived=l,p}}catch{}return null}function Lt(t){let e=F.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=F.default.join(e,s);for(let a of Ue(o,!0))n.push({name:a,milestone:i,basePath:F.default.join(".planning","milestones",s),fullPath:F.default.join(o,a)})}}catch{}return n}function Ot(t){return t.replace(/<details>[\s\S]*?<\/details>/gi,"")}function _e(t,e){if(!e)return Ot(t);let n=null;try{let u=F.default.join(W(e),"STATE.md");if(N.default.existsSync(u)){let m=N.default.readFileSync(u,"utf-8").match(/^milestone:\s*(.+)/m);m&&(n=m[1].trim())}}catch{}if(!n){let u=t.match(/🚧\s*\*\*v(\d+\.\d+)\s/);u&&(n="v"+u[1])}if(!n)return Ot(t);let r=new RegExp(`(^#{1,3}\\s+.*${re(n)}[^\\n]*)`,"mi"),s=t.match(r);if(!s)return Ot(t);let i=s.index,o=s[1].match(/^(#{1,3})\s/)[1].length,c=t.slice(i+s[0].length).match(new RegExp(`^#{1,${o}}\\s+(?:.*v\\d+\\.\\d+|\u2705|\u{1F4CB}|\u{1F6A7})`,"mi")),l=c?i+s[0].length+c.index:t.length;return t.slice(0,i).replace(/<details>[\s\S]*?<\/details>/gi,"")+t.slice(i,l)}function lt(t,e,n){let r=t.lastIndexOf("</details>");if(r===-1)return t.replace(e,n);let s=r+10,i=t.slice(0,s),o=t.slice(s);return i+o.replace(e,n)}function dt(t,e){if(!e)return null;let n=F.default.join(W(t),"ROADMAP.md");if(!N.default.existsSync(n))return null;try{let r=_e(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(),p=u.match(/\*\*Goal(?:\*\*:|\*?\*?:\*\*)\s*([^\n]+)/i);return{found:!0,phase_number:e.toString(),phase_name:o,goal:p?p[1].trim():null,section:u}}catch{return null}}function mr(){return F.default.join(__dirname,"..","..","agents")}function _t(){let t=mr(),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(F.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=Z(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&&dr[o]||o}function Ut(t){if(!t)return null;let n=t.replace(/^---\n[\s\S]*?\n---\n*/,"").match(/^#[^\n]*\n+\*\*([^*]+)\*\*/m);return n?n[1].trim():null}function Ii(t,e){let n=F.default.isAbsolute(e)?e:F.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(F.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=Ot(e),s=r.match(/## .*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);if(s)return{version:"v"+s[1],name:s[2].trim()};let i=r.match(/v(\d+(?:\.\d+)+)/);return{version:i?i[0]:"v1.0",name:"milestone"}}catch{return{version:"v1.0",name:"milestone"}}}function we(t){let e=new Set;try{let s=_e(N.default.readFileSync(F.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 pr(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)=>Ae(s,i)):r}catch{return[]}}var Nt,N,nn,F,dr,he=L(()=>{"use strict";Nt=require("child_process"),N=U(require("fs")),nn=U(require("os")),F=U(require("path"));Dt();dr={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var st,Is,rn,w,je=L(()=>{"use strict";st=require("@oclif/core"),Is=U(require("path")),rn=U(require("fs"));he();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?Is.default.resolve(e.cwd):process.cwd();if((!rn.default.existsSync(n)||!rn.default.statSync(n).isDirectory())&&b(`Invalid --cwd: ${n}`),!rn.default.existsSync(Is.default.join(n,".planning"))){let s=qt(n);s!==n&&(n=s)}let r=null;return e.ws?r=e.ws:process.env.GSD_WORKSTREAM?r=process.env.GSD_WORKSTREAM.trim():r=Xe(n),r&&!/^[a-zA-Z0-9_-]+$/.test(r)&&b("Invalid workstream name"),r&&(process.env.GSD_WORKSTREAM=r),n=Wt(n),{cwd:n,ws:r,raw:e.raw??!1}}}});var an={};ye(an,{FRONTMATTER_SCHEMAS:()=>Ts,asArr:()=>ke,asObj:()=>Pt,asStr:()=>pe,cmdFrontmatterGet:()=>Ti,cmdFrontmatterMerge:()=>Oi,cmdFrontmatterSet:()=>Di,cmdFrontmatterValidate:()=>Ni,extractFrontmatter:()=>le,parseMustHavesBlock:()=>on,reconstructFrontmatter:()=>$t,spliceFrontmatter:()=>Ds});function pe(t){return typeof t=="string"?t:void 0}function ke(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 p=u[2],m=u[3].trim();if(m===""||m==="["){d.obj[p]=m==="["?[]:{},d.key=null;let f=d.obj[p];f!==null&&typeof f=="object"&&o.push({obj:f,key:null,indent:l})}else m.startsWith("[")&&m.endsWith("]")?(d.obj[p]=m.slice(1,-1).split(",").map(f=>f.trim().replace(/^["']|["']$/g,"")).filter(Boolean),d.key=null):(d.obj[p]=m.replace(/^["']|["']$/g,""),d.key=null)}else if(a.trim().startsWith("- ")){let p=a.trim().slice(2).replace(/^["']|["']$/g,"");if(typeof d.obj=="object"&&!Array.isArray(d.obj)&&Object.keys(d.obj).length===0){let m=o.length>1?o[o.length-2]:null;if(m){for(let f of Object.keys(m.obj))if(m.obj[f]===d.obj){m.obj[f]=[p],d.obj=m.obj[f];break}}}else Array.isArray(d.obj)&&d.obj.push(p)}}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(`
143
+ `),e}function Ei(t,e){let n=0;for(let r=0;r<e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===1}function Fi(t,e){let n=0;for(let r=0;r<=e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===0}function qt(t){if(D.default.existsSync(R.default.join(t,".planning")))return t;let e=ae(t,["rev-parse","--git-dir"]),n=ae(t,["rev-parse","--git-common-dir"]);if(e.exitCode!==0||n.exitCode!==0)return t;let r=R.default.resolve(t,e.stdout),s=R.default.resolve(t,n.stdout);return r!==s?R.default.dirname(s):t}function Mi(t,e){let n=R.default.join(O(t),".lock"),r=1e4,s=100,i=Date.now();try{D.default.mkdirSync(O(t),{recursive:!0})}catch{}for(;Date.now()-i<r;)try{D.default.writeFileSync(n,JSON.stringify({pid:process.pid,cwd:t,acquired:new Date().toISOString()}),{flag:"wx"});try{return e()}finally{try{D.default.unlinkSync(n)}catch{}}}catch(o){if(o.code==="EEXIST"){try{let a=D.default.statSync(n);if(Date.now()-a.mtimeMs>3e4){D.default.unlinkSync(n);continue}}catch{continue}(0,Nt.spawnSync)("sleep",["0.1"],{stdio:"ignore"});continue}throw o}try{D.default.unlinkSync(n)}catch{}return e()}function O(t,e){let n=e??process.env.GSD_WORKSTREAM??null;return n?R.default.join(t,".planning","workstreams",n):R.default.join(t,".planning")}function Z(t){return R.default.join(t,".planning")}function j(t,e){let n=O(t,e),r=R.default.join(t,".planning");return{planning:n,state:R.default.join(n,"STATE.md"),roadmap:R.default.join(n,"ROADMAP.md"),project:R.default.join(r,"PROJECT.md"),config:R.default.join(r,"config.json"),phases:R.default.join(n,"phases"),requirements:R.default.join(n,"REQUIREMENTS.md")}}function Xe(t){let e=R.default.join(Z(t),"active-workstream");try{let n=D.default.readFileSync(e,"utf-8").trim();return!n||!/^[a-zA-Z0-9_-]+$/.test(n)||!D.default.existsSync(R.default.join(Z(t),"workstreams",n))?null:n}catch{return null}}function ct(t,e){let n=R.default.join(Z(t),"active-workstream");if(!e){try{D.default.unlinkSync(n)}catch{}return}if(!/^[a-zA-Z0-9_-]+$/.test(e))throw new Error("Invalid workstream name");D.default.writeFileSync(n,e+`
144
+ `,"utf-8")}function ne(t){return String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function de(t){let e=String(t),n=e.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);return n?n[1].padStart(2,"0")+(n[2]?n[2].toUpperCase():"")+(n[3]||""):e}function $e(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 Fs(t,e,n){try{let s=Ue(t,!0).find(b=>b.startsWith(n)||b.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=R.default.join(t,s),{plans:l,summaries:d,hasResearch:u,hasContext:m,hasVerification:p,hasReviews:f}=pr(c),g=l.sort(),h=d.sort(),S=new Set(h.map(b=>b.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),x=g.filter(b=>!S.has(b.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:B(R.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:x,has_research:u,has_context:m,has_verification:p,has_reviews:f}}catch{return null}}function fe(t,e){if(!e)return null;let n=R.default.join(O(t),"phases"),r=de(e),s=B(R.default.relative(t,n)),i=Fs(n,s,r);if(i)return i;let o=R.default.join(t,".planning","milestones");if(!D.default.existsSync(o))return null;try{let a=D.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=R.default.join(o,c),u=".planning/milestones/"+c,m=Fs(d,u,r);if(m)return m.archived=l,m}}catch{}return null}function Lt(t){let e=R.default.join(t,".planning","milestones"),n=[];if(!D.default.existsSync(e))return n;try{let r=D.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=R.default.join(e,s);for(let a of Ue(o,!0))n.push({name:a,milestone:i,basePath:R.default.join(".planning","milestones",s),fullPath:R.default.join(o,a)})}}catch{}return n}function Ot(t){return t.replace(/<details>[\s\S]*?<\/details>/gi,"")}function ve(t,e){if(!e)return Ot(t);let n=null;try{let u=R.default.join(O(e),"STATE.md");if(D.default.existsSync(u)){let p=D.default.readFileSync(u,"utf-8").match(/^milestone:\s*(.+)/m);p&&(n=p[1].trim())}}catch{}if(!n){let u=t.match(/🚧\s*\*\*v(\d+\.\d+)\s/);u&&(n="v"+u[1])}if(!n)return Ot(t);let r=new RegExp(`(^#{1,3}\\s+.*${ne(n)}[^\\n]*)`,"mi"),s=t.match(r);if(!s)return Ot(t);let i=s.index,o=s[1].match(/^(#{1,3})\s/)[1].length,c=t.slice(i+s[0].length).match(new RegExp(`^#{1,${o}}\\s+(?:.*v\\d+\\.\\d+|\u2705|\u{1F4CB}|\u{1F6A7})`,"mi")),l=c?i+s[0].length+c.index:t.length;return t.slice(0,i).replace(/<details>[\s\S]*?<\/details>/gi,"")+t.slice(i,l)}function lt(t,e,n){let r=t.lastIndexOf("</details>");if(r===-1)return t.replace(e,n);let s=r+10,i=t.slice(0,s),o=t.slice(s);return i+o.replace(e,n)}function dt(t,e){if(!e)return null;let n=R.default.join(O(t),"ROADMAP.md");if(!D.default.existsSync(n))return null;try{let r=ve(D.default.readFileSync(n,"utf-8"),t),s=new RegExp(`#{2,4}\\s*Phase\\s+${ne(e)}:\\s*([^\\n]+)`,"i"),i=r.match(s);if(!i)return null;let o=i[1].trim(),a=i.index,l=r.slice(a).match(/\n#{2,4}\s+Phase\s+[\w]/i),d=l?a+l.index:r.length,u=r.slice(a,d).trim(),m=u.match(/\*\*Goal(?:\*\*:|\*?\*?:\*\*)\s*([^\n]+)/i);return{found:!0,phase_number:e.toString(),phase_name:o,goal:m?m[1].trim():null,section:u}}catch{return null}}function mr(){return R.default.join(__dirname,"..","..","agents")}function _t(){let t=mr(),e=Object.keys(Fe),n=[],r=[];if(!D.default.existsSync(t))return{agents_installed:!1,missing_agents:e,installed_agents:[],agents_dir:t};for(let s of e)D.default.existsSync(R.default.join(t,`${s}.md`))?n.push(s):r.push(s);return{agents_installed:n.length>0&&r.length===0,missing_agents:r,installed_agents:n,agents_dir:t}}function se(t,e){let n=X(t),r=n.model_overrides?.[e];if(r)return r;if(n.resolve_model_ids==="omit")return"";let s=String(n.model_profile||"balanced").toLowerCase(),i=Fe[e];if(!i)return"sonnet";if(s==="inherit")return"inherit";let o=i[s]||i.balanced||"sonnet";return n.resolve_model_ids&&dr[o]||o}function Ut(t){if(!t)return null;let n=t.replace(/^---\n[\s\S]*?\n---\n*/,"").match(/^#[^\n]*\n+\*\*([^*]+)\*\*/m);return n?n[1].trim():null}function Ii(t,e){let n=R.default.isAbsolute(e)?e:R.default.join(t,e);try{return D.default.statSync(n),!0}catch{return!1}}function Le(t){return t?t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function ie(t){try{let e=D.default.readFileSync(R.default.join(O(t),"ROADMAP.md"),"utf-8"),n=e.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);if(n)return{version:"v"+n[1],name:n[2].trim()};let r=Ot(e),s=r.match(/## .*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);if(s)return{version:"v"+s[1],name:s[2].trim()};let i=r.match(/v(\d+(?:\.\d+)+)/);return{version:i?i[0]:"v1.0",name:"milestone"}}catch{return{version:"v1.0",name:"milestone"}}}function _e(t){let e=new Set;try{let s=ve(D.default.readFileSync(R.default.join(O(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 pr(t){let e=D.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=D.default.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);return e?r.sort((s,i)=>$e(s,i)):r}catch{return[]}}var Nt,D,nn,R,dr,ge=q(()=>{"use strict";Nt=require("child_process"),D=L(require("fs")),nn=L(require("os")),R=L(require("path"));Dt();dr={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var st,Is,rn,w,Ce=q(()=>{"use strict";st=require("@oclif/core"),Is=L(require("path")),rn=L(require("fs"));ge();w=class extends st.Command{static enableJsonFlag=!1;static baseFlags={cwd:st.Flags.string({description:"Working directory",default:""}),ws:st.Flags.string({description:"Workstream override",default:""}),raw:st.Flags.boolean({description:"Raw JSON output",default:!1}),output:st.Flags.string({description:"Output format",options:["json","toon"],default:"json"}),pick:st.Flags.string({description:"JSONPath pick expression",default:""})};resolveContext(e){let n=e.cwd?Is.default.resolve(e.cwd):process.cwd();if((!rn.default.existsSync(n)||!rn.default.statSync(n).isDirectory())&&v(`Invalid --cwd: ${n}`),!rn.default.existsSync(Is.default.join(n,".planning"))){let s=qt(n);s!==n&&(n=s)}let r=null;return e.ws?r=e.ws:process.env.GSD_WORKSTREAM?r=process.env.GSD_WORKSTREAM.trim():r=Xe(n),r&&!/^[a-zA-Z0-9_-]+$/.test(r)&&v("Invalid workstream name"),r&&(process.env.GSD_WORKSTREAM=r),n=Wt(n),{cwd:n,ws:r,raw:e.raw??!1}}}});var an={};he(an,{FRONTMATTER_SCHEMAS:()=>Ts,asArr:()=>we,asObj:()=>Pt,asStr:()=>ue,cmdFrontmatterGet:()=>Ti,cmdFrontmatterMerge:()=>Oi,cmdFrontmatterSet:()=>Di,cmdFrontmatterValidate:()=>Ni,extractFrontmatter:()=>oe,parseMustHavesBlock:()=>on,reconstructFrontmatter:()=>$t,spliceFrontmatter:()=>Ds});function ue(t){return typeof t=="string"?t:void 0}function we(t){return Array.isArray(t)?t:void 0}function Pt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function oe(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
145
  `)}function Ds(t,e){let n=$t(e),r=t.match(/^---\r?\n[\s\S]+?\r?\n---/);return r?`---
146
146
  ${n}
147
147
  ---`+t.slice(r[0].length):`---
148
148
  ${n}
149
149
  ---
150
150
 
151
- `+t}function on(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),p=[],m=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)){m&&p.push(m),m={};let S=x.slice(2);if(!S.includes(":"))m=S.replace(/^["']|["']$/g,"");else{let v=S.match(/^(\w+):\s*"?([^"]*)"?\s*$/);v&&(m={},m[v[1]]=v[2])}continue}if(m&&typeof m=="object"&&h>f)if(x.startsWith("- ")){let S=x.slice(2).replace(/^["']|["']$/g,""),v=Object.keys(m),P=v[v.length-1];P&&!Array.isArray(m[P])&&(m[P]=m[P]?[m[P]]:[]);let k=m[P];P&&Array.isArray(k)&&k.push(S)}else{let S=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(S){let v=S[2];m[S[1]]=/^\d+$/.test(v)?parseInt(v,10):v}}}return m&&p.push(m),p}function Ti(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 Di(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=Ds(o,a);ut.default.writeFileSync(i,Ie(l),"utf-8"),y({updated:!0,field:n,value:c},s,"true")}function Oi(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=Ds(i,o);ut.default.writeFileSync(s,Ie(c),"utf-8"),y({merged:!0,fields:Object.keys(a)},r,"true")}function Ni(t,e,n,r){(!e||!n)&&b("file and schema required");let s=Ts[n];if(!s){b(`Unknown schema: ${n}. Available: ${Object.keys(Ts).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,Ts,Ve=L(()=>{"use strict";ut=U(require("fs")),Ze=U(require("path"));he();Ts={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 yr(t){if(!t)return t;let e=t.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>hr&&(e=e.slice(0,hr)+"... [truncated]"),e}function Os(t,e,n={}){if(t.includes("\0"))return{safe:!1,resolved:t,error:"Path contains null bytes"};let r=cn.default.isAbsolute(t)?t:cn.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&&cn.default.isAbsolute(t)?{safe:!1,resolved:r,error:"Absolute paths not allowed"}:{safe:!0,resolved:r}}function xr(t,e,n,r={}){let s=Os(t,e,r);if(!s.safe)throw new Error(`${n||"Path"} validation failed: ${s.error}`);return s.resolved}function Ns(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 Ws(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 cn,hr,ln=L(()=>{"use strict";cn=U(require("path")),hr=1e4});var ze={};ye(ze,{cmdSignalResume:()=>no,cmdSignalWaiting:()=>to,cmdStateAddBlocker:()=>Hi,cmdStateAddDecision:()=>Yi,cmdStateAdvancePlan:()=>Bi,cmdStateBeginPhase:()=>eo,cmdStateGet:()=>Ui,cmdStateJson:()=>Qi,cmdStateLoad:()=>Li,cmdStatePatch:()=>Vi,cmdStateReconcile:()=>so,cmdStateRecordMetric:()=>Gi,cmdStateRecordSession:()=>Zi,cmdStateResolveBlocker:()=>Xi,cmdStateSnapshot:()=>Ki,cmdStateUpdate:()=>zi,cmdStateUpdateProgress:()=>Ji,stateExtractField:()=>Y,stateReplaceField:()=>Pe,stateReplaceFieldWithFallback:()=>Se,stripFrontmatter:()=>Ls,writeStateMd:()=>oe});function Wi(t){return E(t).state}function Y(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 Pe(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 Se(t,e,n,r){let s=Pe(t,e,r);if(s)return s;if(n){let i=Pe(t,n,r);if(i)return i}return t}function Sr(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 qs(t,e,n,r){if(!n)return e??"";let s=Os(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 Ls(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 br(t,e){let n=Y(t,"Current Phase"),r=Y(t,"Current Phase Name"),s=Y(t,"Current Plan"),i=Y(t,"Total Phases"),o=Y(t,"Total Plans in Phase"),a=Y(t,"Status"),c=Y(t,"Progress"),l=Y(t,"Last Activity"),d=Y(t,"Stopped At")||Y(t,"Stopped at"),u=Y(t,"Paused At"),p=null,m=null;if(e)try{let D=ce(e);p=D.version,m=D.name}catch{}let f=i?parseInt(i,10):null,g=null,h=o?parseInt(o,10):null,x=null;if(e)try{let D=E(e).phases;if(A.default.existsSync(D)){let C=we(e),j=A.default.readdirSync(D,{withFileTypes:!0}).filter(X=>X.isDirectory()).map(X=>X.name).filter(C),I=0,R=0,V=0;for(let X of j){let ae=A.default.readdirSync(xe.default.join(D,X)),K=ae.filter(Ce=>Ce.match(/-PLAN\.md$/i)).length,se=ae.filter(Ce=>Ce.match(/-SUMMARY\.md$/i)).length;I+=K,R+=se,K>0&&se>=K&&V++}f=C.phaseCount>0?Math.max(j.length,C.phaseCount):j.length,g=V,h=I,x=R}}catch{}let S=null;if(c){let D=c.match(/(\d+)%/);D&&(S=parseInt(D[1],10))}let v=a??"unknown",P=(a??"").toLowerCase();P.includes("paused")||P.includes("stopped")||u?v="paused":P.includes("executing")||P.includes("in progress")?v="executing":P.includes("planning")||P.includes("ready to plan")?v="planning":P.includes("discussing")?v="discussing":P.includes("verif")?v="verifying":P.includes("complete")||P.includes("done")?v="completed":P.includes("ready to execute")&&(v="executing");let k={gsd_state_version:"1.0"};p&&(k.milestone=p),m&&(k.milestone_name=m),n&&(k.current_phase=n),r&&(k.current_phase_name=r),s&&(k.current_plan=s),k.status=v,d&&(k.stopped_at=d),u&&(k.paused_at=u),k.last_updated=new Date().toISOString(),l&&(k.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&&(k.progress=$),k}function qi(t,e){let n=le(t),r=Ls(t),s=br(r,e);return s.status==="unknown"&&n.status&&n.status!=="unknown"&&(s.status=n.status),`---
151
+ `+t}function on(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 S=g.trim();if(S.startsWith("- ")&&(f===-1&&(f=h),h===f)){p&&m.push(p),p={};let x=S.slice(2);if(!x.includes(":"))p=x.replace(/^["']|["']$/g,"");else{let b=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);b&&(p={},p[b[1]]=b[2])}continue}if(p&&typeof p=="object"&&h>f)if(S.startsWith("- ")){let x=S.slice(2).replace(/^["']|["']$/g,""),b=Object.keys(p),P=b[b.length-1];P&&!Array.isArray(p[P])&&(p[P]=p[P]?[p[P]]:[]);let k=p[P];P&&Array.isArray(k)&&k.push(x)}else{let x=S.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(x){let b=x[2];p[x[1]]=/^\d+$/.test(b)?parseInt(b,10):b}}}return p&&m.push(p),m}function Ti(t,e,n,r){e||v("file path required"),e.includes("\0")&&v("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=oe(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 Di(t,e,n,r,s){(!e||!n||r===void 0)&&v("file, field, and value required"),e.includes("\0")&&v("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=oe(o),c;try{c=JSON.parse(r)}catch{c=r}a[n]=c;let l=Ds(o,a);ut.default.writeFileSync(i,Me(l),"utf-8"),y({updated:!0,field:n,value:c},s,"true")}function Oi(t,e,n,r){(!e||!n)&&v("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=oe(i),a;try{a=JSON.parse(n)}catch{v("Invalid JSON for --data");return}Object.assign(o,a);let c=Ds(i,o);ut.default.writeFileSync(s,Me(c),"utf-8"),y({merged:!0,fields:Object.keys(a)},r,"true")}function Ni(t,e,n,r){(!e||!n)&&v("file and schema required");let s=Ts[n];if(!s){v(`Unknown schema: ${n}. Available: ${Object.keys(Ts).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=oe(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,Ts,Ve=q(()=>{"use strict";ut=L(require("fs")),Ze=L(require("path"));ge();Ts={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 yr(t){if(!t)return t;let e=t.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>hr&&(e=e.slice(0,hr)+"... [truncated]"),e}function Os(t,e,n={}){if(t.includes("\0"))return{safe:!1,resolved:t,error:"Path contains null bytes"};let r=cn.default.isAbsolute(t)?t:cn.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&&cn.default.isAbsolute(t)?{safe:!1,resolved:r,error:"Absolute paths not allowed"}:{safe:!0,resolved:r}}function xr(t,e,n,r={}){let s=Os(t,e,r);if(!s.safe)throw new Error(`${n||"Path"} validation failed: ${s.error}`);return s.resolved}function Ns(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 Ws(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 cn,hr,ln=q(()=>{"use strict";cn=L(require("path")),hr=1e4});var ze={};he(ze,{cmdSignalResume:()=>no,cmdSignalWaiting:()=>to,cmdStateAddBlocker:()=>Hi,cmdStateAddDecision:()=>Yi,cmdStateAdvancePlan:()=>Bi,cmdStateBeginPhase:()=>eo,cmdStateGet:()=>Ui,cmdStateJson:()=>Qi,cmdStateLoad:()=>Li,cmdStatePatch:()=>Vi,cmdStateReconcile:()=>so,cmdStateRecordMetric:()=>Gi,cmdStateRecordSession:()=>Zi,cmdStateResolveBlocker:()=>Xi,cmdStateSnapshot:()=>Ki,cmdStateUpdate:()=>zi,cmdStateUpdateProgress:()=>Ji,stateExtractField:()=>J,stateReplaceField:()=>ke,stateReplaceFieldWithFallback:()=>ye,stripFrontmatter:()=>Ls,writeStateMd:()=>re});function Wi(t){return j(t).state}function J(t,e){let n=ne(e),r=t.match(new RegExp(`\\*\\*${n}:\\*\\*\\s*(.+)`,"i"));if(r)return r[1].trim();let s=t.match(new RegExp(`^${n}:\\s*(.+)`,"im"));return s?s[1].trim():null}function ke(t,e,n){let r=ne(e),s=new RegExp(`(\\*\\*${r}:\\*\\*\\s*)(.*)`,"i");if(s.test(t))return t.replace(s,(o,a)=>`${a}${n}`);let i=new RegExp(`(^${r}:\\s*)(.*)`,"im");return i.test(t)?t.replace(i,(o,a)=>`${a}${n}`):null}function ye(t,e,n,r){let s=ke(t,e,r);if(s)return s;if(n){let i=ke(t,n,r);if(i)return i}return t}function Sr(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 qs(t,e,n,r){if(!n)return e??"";let s=Os(n,t,{allowAbsolute:!0});if(!s.safe)throw new Error(`${r} path rejected: ${s.error}`);try{return C.default.readFileSync(s.resolved,"utf-8").trimEnd()}catch{throw new Error(`${r} file not found: ${n}`)}}function Ls(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 br(t,e){let n=J(t,"Current Phase"),r=J(t,"Current Phase Name"),s=J(t,"Current Plan"),i=J(t,"Total Phases"),o=J(t,"Total Plans in Phase"),a=J(t,"Status"),c=J(t,"Progress"),l=J(t,"Last Activity"),d=J(t,"Stopped At")||J(t,"Stopped at"),u=J(t,"Paused At"),m=null,p=null;if(e)try{let M=ie(e);m=M.version,p=M.name}catch{}let f=i?parseInt(i,10):null,g=null,h=o?parseInt(o,10):null,S=null;if(e)try{let M=j(e).phases;if(C.default.existsSync(M)){let A=_e(e),W=C.default.readdirSync(M,{withFileTypes:!0}).filter(le=>le.isDirectory()).map(le=>le.name).filter(A),F=0,U=0,Y=0;for(let le of W){let be=C.default.readdirSync(Ae.default.join(M,le)),te=be.filter(Oe=>Oe.match(/-PLAN\.md$/i)).length,pe=be.filter(Oe=>Oe.match(/-SUMMARY\.md$/i)).length;F+=te,U+=pe,te>0&&pe>=te&&Y++}f=A.phaseCount>0?Math.max(W.length,A.phaseCount):W.length,g=Y,h=F,S=U}}catch{}let x=null;if(c){let M=c.match(/(\d+)%/);M&&(x=parseInt(M[1],10))}let b=a??"unknown",P=(a??"").toLowerCase();P.includes("paused")||P.includes("stopped")||u?b="paused":P.includes("executing")||P.includes("in progress")?b="executing":P.includes("planning")||P.includes("ready to plan")?b="planning":P.includes("discussing")?b="discussing":P.includes("verif")?b="verifying":P.includes("complete")||P.includes("done")?b="completed":P.includes("ready to execute")&&(b="executing");let k={gsd_state_version:"1.0"};m&&(k.milestone=m),p&&(k.milestone_name=p),n&&(k.current_phase=n),r&&(k.current_phase_name=r),s&&(k.current_plan=s),k.status=b,d&&(k.stopped_at=d),u&&(k.paused_at=u),k.last_updated=new Date().toISOString(),l&&(k.last_activity=l);let $={};return f!==null&&($.total_phases=f),g!==null&&($.completed_phases=g),h!==null&&($.total_plans=h),S!==null&&($.completed_plans=S),x!==null&&($.percent=x),Object.keys($).length>0&&(k.progress=$),k}function qi(t,e){let n=oe(t),r=Ls(t),s=br(r,e);return s.status==="unknown"&&n.status&&n.status!=="unknown"&&(s.status=n.status),`---
152
152
  ${$t(s)}
153
153
  ---
154
154
 
155
- ${r}`}function oe(t,e,n){let r=qi(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 Li(t,e){let n=Z(t),r=E(t).planning,s="";try{s=A.default.readFileSync(xe.default.join(r,"STATE.md"),"utf-8")}catch{}let i=A.default.existsSync(xe.default.join(r,"config.json")),o=A.default.existsSync(xe.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 Ui(t,e,n){let r=E(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 Vi(t,e,n){for(let s of Object.keys(e)){let i=Ws(s);i.valid||b(`state patch: ${i.error}`)}let r=E(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,p)=>`${p}${a}`),i.updated.push(o)):d.test(s)?(s=s.replace(d,(u,p)=>`${p}${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 zi(t,e,n){(!e||n===void 0)&&b("field and value required for state update");let r=Ws(e);r.valid||b(`state update: ${r.error}`);let s=E(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 Bi(t,e){let n=E(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=Y(r,"Current Plan"),o=Y(r,"Total Plans in Phase"),a=Y(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=Se(r,"Status",null,"Phase complete - ready for verification"),r=Se(r,"Last Activity","Last activity",s),r=Sr(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,p;d&&a?(p=a.replace(/^\d+/,String(u)),r=Pe(r,"Plan",p)??r):(p=`${u} of ${l}`,r=Pe(r,"Current Plan",String(u))??r),r=Se(r,"Status",null,"Ready to execute"),r=Se(r,"Last Activity","Last activity",s),r=Sr(r,{status:"Ready to execute",lastActivity:s,plan:p}),oe(n,r,t),y({advanced:!0,previous_plan:c,current_plan:u,total_plans:l},e,"true")}}function Gi(t,e,n){let r=E(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 p=u[2].trimEnd(),m=`| Phase ${s} P${i} | ${o} | ${a??"-"} tasks | ${c??"-"} files |`;p=!p.trim()||p.includes("None yet")?m:p+`
158
- `+m,l=l.replace(d,(f,g)=>`${g}${p}
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 Ji(t,e){let n=E(t).state;if(!A.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(n,"utf-8"),s=E(t).phases,i=0,o=0;if(A.default.existsSync(s)){let f=we(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(xe.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}%`,p=/(\*\*Progress:\*\*\s*).*/i,m=/^(Progress:\s*).*/im;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)):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)):y({updated:!1,reason:"Progress field not found in STATE.md"},e,"false")}function Yi(t,e,n){let r=E(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=qs(t,i??null,o??null,"summary"),d=qs(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"),p=`- [Phase ${s??"?"}]: ${l}${d?` - ${d}`:""}`,m=/(###?\s*(?:Decisions|Decisions Made|Accumulated.*Decisions)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,f=u.match(m);if(f){let g=f[2].replace(/None yet\.?\s*\n?/gi,"").replace(/No decisions yet\.?\s*\n?/gi,"");g=g.trimEnd()+`
160
- `+p+`
161
- `,u=u.replace(m,(h,x)=>`${x}${g}`),oe(r,u,t),y({added:!0,decision:p},n,"true")}else y({added:!1,reason:"Decisions section not found in STATE.md"},n,"false")}function Hi(t,e,n){let r=E(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=qs(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()+`
155
+ ${r}`}function re(t,e,n){let r=qi(e,n),s=t+".lock",i=10,o=200;for(let a=0;a<i;a++)try{let c=C.default.openSync(s,C.default.constants.O_CREAT|C.default.constants.O_EXCL|C.default.constants.O_WRONLY);C.default.writeSync(c,String(process.pid)),C.default.closeSync(c);break}catch(c){if(c.code==="EEXIST"){try{let u=C.default.statSync(s);if(Date.now()-u.mtimeMs>1e4){C.default.unlinkSync(s);continue}}catch{continue}if(a===i-1){try{C.default.unlinkSync(s)}catch{}break}let l=Date.now(),d=Math.floor(Math.random()*50);for(;Date.now()-l<o+d;);continue}break}try{C.default.writeFileSync(t,Me(r),"utf-8")}finally{try{C.default.unlinkSync(s)}catch{}}}function Li(t,e){let n=X(t),r=j(t).planning,s="";try{s=C.default.readFileSync(Ae.default.join(r,"STATE.md"),"utf-8")}catch{}let i=C.default.existsSync(Ae.default.join(r,"config.json")),o=C.default.existsSync(Ae.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 Ui(t,e,n){let r=j(t).state;try{let s=C.default.readFileSync(r,"utf-8");if(!e){y({content:s},n,s);return}let i=ne(e),o=s.match(new RegExp(`\\*\\*${i}:\\*\\*\\s*(.*)`,"i"));if(o){y({[e]:o[1].trim()},n,o[1].trim());return}let a=s.match(new RegExp(`^${i}:\\s*(.*)`,"im"));if(a){y({[e]:a[1].trim()},n,a[1].trim());return}let c=s.match(new RegExp(`##\\s*${i}\\s*
157
+ ([\\s\\S]*?)(?=\\n##|$)`,"i"));if(c){y({[e]:c[1].trim()},n,c[1].trim());return}y({error:`Section or field "${e}" not found`},n,"")}catch{v("STATE.md not found")}}function Vi(t,e,n){for(let s of Object.keys(e)){let i=Ws(s);i.valid||v(`state patch: ${i.error}`)}let r=j(t).state;try{let s=C.default.readFileSync(r,"utf-8"),i={updated:[],failed:[]};for(let[o,a]of Object.entries(e)){let c=ne(o),l=new RegExp(`(\\*\\*${c}:\\*\\*\\s*)(.*)`,"i"),d=new RegExp(`(^${c}:\\s*)(.*)`,"im");l.test(s)?(s=s.replace(l,(u,m)=>`${m}${a}`),i.updated.push(o)):d.test(s)?(s=s.replace(d,(u,m)=>`${m}${a}`),i.updated.push(o)):i.failed.push(o)}i.updated.length>0&&re(r,s,t),y(i,n,i.updated.length>0?"true":"false")}catch{v("STATE.md not found")}}function zi(t,e,n){(!e||n===void 0)&&v("field and value required for state update");let r=Ws(e);r.valid||v(`state update: ${r.error}`);let s=j(t).state;try{let i=C.default.readFileSync(s,"utf-8"),o=ne(e),a=new RegExp(`(\\*\\*${o}:\\*\\*\\s*)(.*)`,"i"),c=new RegExp(`(^${o}:\\s*)(.*)`,"im");a.test(i)?(i=i.replace(a,(l,d)=>`${d}${n}`),re(s,i,t),y({updated:!0})):c.test(i)?(i=i.replace(c,(l,d)=>`${d}${n}`),re(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 Bi(t,e){let n=j(t).state;if(!C.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=C.default.readFileSync(n,"utf-8"),s=new Date().toISOString().split("T")[0],i=J(r,"Current Plan"),o=J(r,"Total Plans in Phase"),a=J(r,"Plan"),c,l,d=!1;if(i&&o)c=parseInt(i,10),l=parseInt(o,10);else if(a){c=parseInt(a,10);let u=a.match(/of\s+(\d+)/);l=u?parseInt(u[1],10):NaN,d=!0}else{y({error:"Cannot parse plan fields from STATE.md"},e);return}if(isNaN(c)||isNaN(l)){y({error:"Cannot parse Current Plan or Total Plans in Phase from STATE.md"},e);return}if(c>=l)r=ye(r,"Status",null,"Phase complete - ready for verification"),r=ye(r,"Last Activity","Last activity",s),r=Sr(r,{status:"Phase complete - ready for verification",lastActivity:s}),re(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=ke(r,"Plan",m)??r):(m=`${u} of ${l}`,r=ke(r,"Current Plan",String(u))??r),r=ye(r,"Status",null,"Ready to execute"),r=ye(r,"Last Activity","Last activity",s),r=Sr(r,{status:"Ready to execute",lastActivity:s,plan:m}),re(n,r,t),y({advanced:!0,previous_plan:c,current_plan:u,total_plans:l},e,"true")}}function Gi(t,e,n){let r=j(t).state;if(!C.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=C.default.readFileSync(r,"utf-8"),d=/(##\s*Performance Metrics[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n)([\s\S]*?)(?=\n##|\n$|$)/i,u=l.match(d);if(u){let m=u[2].trimEnd(),p=`| Phase ${s} P${i} | ${o} | ${a??"-"} tasks | ${c??"-"} files |`;m=!m.trim()||m.includes("None yet")?p:m+`
158
+ `+p,l=l.replace(d,(f,g)=>`${g}${m}
159
+ `),re(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 Ji(t,e){let n=j(t).state;if(!C.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=C.default.readFileSync(n,"utf-8"),s=j(t).phases,i=0,o=0;if(C.default.existsSync(s)){let f=_e(t),g=C.default.readdirSync(s,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).filter(f);for(let h of g){let S=C.default.readdirSync(Ae.default.join(s,h));i+=S.filter(x=>x.match(/-PLAN\.md$/i)).length,o+=S.filter(x=>x.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}`),re(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}`),re(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 Yi(t,e,n){let r=j(t).state;if(!C.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=qs(t,i??null,o??null,"summary"),d=qs(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=C.default.readFileSync(r,"utf-8"),m=`- [Phase ${s??"?"}]: ${l}${d?` - ${d}`:""}`,p=/(###?\s*(?:Decisions|Decisions Made|Accumulated.*Decisions)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,f=u.match(p);if(f){let g=f[2].replace(/None yet\.?\s*\n?/gi,"").replace(/No decisions yet\.?\s*\n?/gi,"");g=g.trimEnd()+`
160
+ `+m+`
161
+ `,u=u.replace(p,(h,S)=>`${S}${g}`),re(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 Hi(t,e,n){let r=j(t).state;if(!C.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=qs(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=C.default.readFileSync(r,"utf-8"),a=`- ${i}`,c=/(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,l=o.match(c);if(l){let d=l[2].replace(/None\.?\s*\n?/gi,"").replace(/None yet\.?\s*\n?/gi,"");d=d.trimEnd()+`
162
162
  `+a+`
163
- `,o=o.replace(c,(u,p)=>`${p}${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 Xi(t,e,n){let r=E(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(`
163
+ `,o=o.replace(c,(u,m)=>`${m}${d}`),re(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 Xi(t,e,n){let r=j(t).state;if(!C.default.existsSync(r)){y({error:"STATE.md not found"},n);return}if(!e){y({error:"text required"},n);return}let s=C.default.readFileSync(r,"utf-8"),i=/(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i,o=s.match(i);if(o){let l=o[2].split(`
164
164
  `).filter(d=>!d.startsWith("- ")||!d.toLowerCase().includes(e.toLowerCase())).join(`
165
165
  `);(!l.trim()||!l.includes("- "))&&(l=`None
166
- `),s=s.replace(i,(d,u)=>`${u}${l}`),oe(r,s,t),y({resolved:!0,blocker:e},n,"true")}else y({resolved:!1,reason:"Blockers section not found in STATE.md"},n,"false")}function Zi(t,e,n){let r=E(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=Pe(s,d,i);u&&(s=u,o.push(d))};if(a("Last session"),a("Last Date"),e.stopped_at){let d=Pe(s,"Stopped At",e.stopped_at)??Pe(s,"Stopped at",e.stopped_at);d&&(s=d,o.push("Stopped At"))}let c=e.resume_file??"None",l=Pe(s,"Resume File",c)??Pe(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 Ki(t,e){let n=Wi(t);if(!A.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=A.default.readFileSync(n,"utf-8"),s=u=>Y(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(p=>p.includes("|"))){let p=u.split("|").map(m=>m.trim()).filter(Boolean);p.length>=3&&i.push({phase:p[0],summary:p[1],rationale:p[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 Qi(t,e){let n=E(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=Ls(r),o=br(i,t);y(o,e,JSON.stringify(o,null,2));return}y(s,e,JSON.stringify(s,null,2))}function eo(t,e,n,r,s){let i=E(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=Pe(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 p=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,m=o.match(p);if(m){let f=m[1],g=m[2],h=`Phase: ${e}${n?` (${n})`:""} - EXECUTING`;g=/^Phase:/m.test(g)?g.replace(/^Phase:.*$/m,h):h+`
168
- `+g;let x=`Plan: 1 of ${r??"?"}`;g=/^Plan:/m.test(g)?g.replace(/^Plan:.*$/m,x):g.replace(/^(Phase:.*$)/m,`$1
169
- ${x}`),/^Status:/m.test(g)&&(g=g.replace(/^Status:.*$/m,`Status: Executing Phase ${e}`)),/^Last activity:/im.test(g)&&(g=g.replace(/^Last activity:.*$/im,`Last activity: ${a} -- Phase ${e} execution started`)),o=o.replace(p,`${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 to(t,e,n,r,s,i){let o=A.default.existsSync(xe.default.join(t,".gsd"))?xe.default.join(t,".gsd"):W(t),a=xe.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 no(t,e){let n=[xe.default.join(t,".gsd","WAITING.json"),xe.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 so(t,e){let n=E(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=we(t),s=A.default.readdirSync(n.phases,{withFileTypes:!0}).filter(k=>k.isDirectory()).map(k=>k.name).filter(r).sort(),i=0,o=0,a=0,c=s.length,l=[],d=n.roadmap,u=A.default.existsSync(d)?A.default.readFileSync(d,"utf-8"):"";for(let k of s){let $=xe.default.join(n.phases,k),D=A.default.readdirSync($),C=D.filter(X=>X.match(/-PLAN\.md$/i)),j=D.filter(X=>X.match(/-SUMMARY\.md$/i));i+=C.length,o+=j.length;let I=C.length>0&&j.length>=C.length,R=k.match(/^(\d+(?:\.\d+)?)/)?.[1]??k.split("-")[0],V=u.includes(`[x] Phase ${R}`)||u.includes(`[x] **Phase ${R}`)||new RegExp(`\\|\\s*${R}\\.?\\s.*\\|.*Complete`,"i").test(u);if(I&&(a++,!V&&u)){let X=new Date().toISOString().split("T")[0],ae=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${R}[:\\s][^\\n]*)`,"i"),K=new RegExp(`(\\|\\s*${R}\\.?\\s.*\\|[^|]*\\|[^|]*\\|[^|]*)\\b(?:Pending|In Progress|Planning|Executing|Verifying)\\b`,"i");ae.test(u)?(u=u.replace(ae,`$1x$2 (completed ${X})`),l.push(`Phase ${R}: marked complete (${j.length}/${C.length} plans)`)):K.test(u)&&(u=u.replace(K,"$1Complete"),l.push(`Phase ${R}: marked complete in table (${j.length}/${C.length} plans)`))}}let p=new Map;for(let k of s){let $=xe.default.join(n.phases,k),D=A.default.readdirSync($),C=D.filter(R=>R.match(/-PLAN\.md$/i)),j=D.filter(R=>R.match(/-SUMMARY\.md$/i)),I=k.match(/^(\d+(?:\.\d+)?)/)?.[1]??k.split("-")[0];p.set(I,C.length>0&&j.length>=C.length)}for(let k of s){let $=xe.default.join(n.phases,k),C=A.default.readdirSync($).filter(se=>se.match(/-PLAN\.md$/i)),j=k.match(/^(\d+(?:\.\d+)?)/)?.[1]??k.split("-")[0],I=parseFloat(j);if(C.length>0||p.get(j)||![...p.entries()].some(([se,Ce])=>Ce&&parseFloat(se)>I))continue;let V=j.replace(".","-"),X=xe.default.join($,`${V}-01-PLAN.md`),ae=xe.default.join($,`${V}-01-SUMMARY.md`),K=new Date().toISOString().split("T")[0];A.default.existsSync(X)||A.default.writeFileSync(X,["---",`plan: "${V}-01"`,`phase: "${j}"`,"status: complete","absorbed: true","---","",`# Plan ${V}-01 \u2014 [ABSORBED]`,"","Phase absorbed into a later phase. All deliverables completed there.",""].join(`
170
- `),"utf-8"),A.default.existsSync(ae)||A.default.writeFileSync(ae,["---",`plan: "${V}-01"`,`phase: "${j}"`,"status: complete","absorbed: true",`completed_at: "${K}"`,"---","",`# Summary ${V}-01 \u2014 Phase ${j} Absorbed`,"","Phase deliverables were completed as part of a later phase execution.",""].join(`
171
- `),"utf-8"),i+=1,o+=1,a++,l.push(`Phase ${j}: auto-created absorbed PLAN+SUMMARY (0 plans, later phase complete)`)}l.length>0&&u&&A.default.writeFileSync(d,u,"utf-8");let m=A.default.readFileSync(n.state,"utf-8"),f=i>0?Math.min(100,Math.round(o/i*100)):0,g=10,h=Math.round(f/100*g),S=`[${"\u2588".repeat(h)+"\u2591".repeat(g-h)}] ${f}%`,v=/(\*\*Progress:\*\*\s*).*/i,P=/^(Progress:\s*).*/im;v.test(m)?m=m.replace(v,(k,$)=>`${$}${S}`):P.test(m)&&(m=m.replace(P,(k,$)=>`${$}${S}`)),oe(n.state,m,t),y({reconciled:!0,changes:l,phases_complete:a,phases_total:c,plans_complete:o,plans_total:i,percent:f},e,l.length>0?`Reconciled ${l.length} phase(s): ${l.join("; ")}`:`State is consistent (${a}/${c} phases, ${o}/${i} plans)`)}var A,xe,Re=L(()=>{"use strict";A=U(require("fs")),xe=U(require("path"));he();Ve();ln()});var mt,dn,un,mn,pn,fn,gn,hn,yn,vr=L(()=>{"use strict";mt=require("@oclif/core");je();dn=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(()=>(Re(),ze))).cmdStateJson(n,r)}},un=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(()=>(Re(),ze))).cmdStateGet(r,n.field,s)}},mn=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(()=>(Re(),ze))).cmdStateUpdate(r,n.field,n.value)}},pn=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(()=>(Re(),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)}},fn=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(()=>(Re(),ze))).cmdStateAdvancePlan(n,r)}},gn=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(()=>(Re(),ze))).cmdStateLoad(n,r)}},hn=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(()=>(Re(),ze))).cmdStateUpdateProgress(n,r)}},yn=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(()=>(Re(),ze))).cmdStateReconcile(n,r)}}});var xn={};ye(xn,{cmdAgentSkills:()=>vo,cmdInitExecutePhase:()=>ro,cmdInitListWorkspaces:()=>So,cmdInitManager:()=>yo,cmdInitMapCodebase:()=>go,cmdInitMilestoneOp:()=>fo,cmdInitNewMilestone:()=>ao,cmdInitNewProject:()=>oo,cmdInitNewWorkspace:()=>xo,cmdInitPhaseOp:()=>mo,cmdInitPlanPhase:()=>io,cmdInitProgress:()=>ho,cmdInitQuick:()=>co,cmdInitRemoveWorkspace:()=>bo,cmdInitResume:()=>lo,cmdInitTodos:()=>po,cmdInitVerifyWork:()=>uo});function _r(t){let e=Te.default.join(Q(t),"MILESTONES.md");if(!B.default.existsSync(e))return null;try{let r=B.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 fe(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 ro(t,e,n){e||b("phase required for init execute-phase");let r=Z(t),s=ge(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=fe(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 io(t,e,n){e||b("phase required for init plan-phase");let r=Z(t),s=ge(t,e),i=dt(t,e),o=ce(t),a=fe(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 oo(t,e){let n=Z(t),r=Q(t),s=fe(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:B.default.existsSync(r),project_exists:B.default.existsSync(Te.default.join(r,"PROJECT.md")),config_exists:B.default.existsSync(Te.default.join(r,"config.json")),roadmap_exists:B.default.existsSync(Te.default.join(r,"ROADMAP.md")),state_exists:B.default.existsSync(Te.default.join(r,"STATE.md"))});y(s,e)}function ao(t,e){let n=Z(t),r=ce(t),s=_r(t),i=fe(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:B.default.existsSync(E(t).roadmap)});y(i,e)}function co(t,e,n){let r=Z(t),s=ce(t),i=fe(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:B.default.existsSync(E(t).state)});y(i,n)}function lo(t,e){let n=Z(t),r=ce(t),s=B.default.existsSync(E(t).state),i="";if(s)try{i=B.default.readFileSync(E(t).state,"utf-8")}catch{}let o=fe(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:B.default.existsSync(E(t).roadmap),config_exists:B.default.existsSync(E(t).config),milestone_version:r.version,milestone_name:r.name});y(o,e)}function uo(t,e,n){e||b("phase required for init verify-work");let r=Z(t),s=ge(t,e),i=dt(t,e),o=fe(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 mo(t,e,n){let r=Z(t),s=e?ge(t,e):null,i=ce(t),o=fe(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 po(t,e,n){let r=Z(t),s=Te.default.join(W(t),"todos","pending"),i=[];if(B.default.existsSync(s))try{for(let a of B.default.readdirSync(s).filter(c=>c.endsWith(".md")))try{let c=B.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=fe(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 fo(t,e){let n=Z(t),r=ce(t),s=_r(t),i=fe(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:B.default.existsSync(E(t).roadmap),state_exists:B.default.existsSync(E(t).state)});y(i,e)}function go(t,e){let n=Z(t),r=fe(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:B.default.existsSync(Te.default.join(Q(t),"PROJECT.md"))});y(r,e)}function ho(t,e){let n=Z(t),r=ce(t),s=we(t),i=E(t).phases,o=0,a=0,c=0;if(B.default.existsSync(i))try{let d=B.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).filter(s);c=d.length;for(let u of d){let p=B.default.readdirSync(Te.default.join(i,u));o+=p.filter(m=>m.match(/-PLAN\.md$/i)).length,a+=p.filter(m=>m.match(/-SUMMARY\.md$/i)).length}}catch{}let l=fe(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 yo(t,e){let n=Z(t),r=ce(t),s=fe(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:B.default.existsSync(E(t).state),roadmap_exists:B.default.existsSync(E(t).roadmap)});y(s,e)}function xo(t,e){let n=Z(t),r=Te.default.join(Q(t),"workstreams"),s=fe(t,{commit_docs:n.commit_docs,context_window:n.context_window,workstream_mode:B.default.existsSync(r),workstreams:B.default.existsSync(r)?B.default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name):[]});y(s,e)}function So(t,e){let n=Te.default.join(Q(t),"workstreams");if(!B.default.existsSync(n)){y(fe(t,{mode:"flat",workstreams:[],count:0}),e);return}let r=B.default.readdirSync(n,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);y(fe(t,{mode:"workstream",workstreams:r,count:r.length}),e)}function bo(t,e,n){e||b("workstream name required for init remove-workspace");let r=Te.default.join(Q(t),"workstreams",e);if(!B.default.existsSync(r)){y(fe(t,{removed:!1,reason:"not_found",workstream:e}),n);return}try{B.default.rmSync(r,{recursive:!0,force:!0})}catch(s){y(fe(t,{removed:!1,reason:s.message,workstream:e}),n);return}y(fe(t,{removed:!0,workstream:e}),n)}function vo(t,e,n){e||b("agent-type required");let s=Z(t).agent_skills[e]??{};y({agent:e,skills:s},n,JSON.stringify(s))}var B,Te,Sn=L(()=>{"use strict";B=U(require("fs")),Te=U(require("path"));he()});var bn,vn,wr=L(()=>{"use strict";bn=require("@oclif/core");je();vn=class t extends w{static description="Initialise a GSD workflow context";static args={workflow:bn.Args.string({required:!0}),phase:bn.Args.string({required:!1}),rest:bn.Args.string({required:!1})};static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=n,o=i[0],a=await Promise.resolve().then(()=>(Sn(),xn)),{gsdError:c}=await Promise.resolve().then(()=>(he(),fr));switch(o){case"execute-phase":return a.cmdInitExecutePhase(r,i[1],s);case"plan-phase":return a.cmdInitPlanPhase(r,i[1],s);case"new-project":return a.cmdInitNewProject(r,s);case"new-milestone":return a.cmdInitNewMilestone(r,s);case"quick":return a.cmdInitQuick(r,i.slice(1).join(" "),s);case"resume":return a.cmdInitResume(r,s);case"verify-work":return a.cmdInitVerifyWork(r,i[1],s);case"phase-op":return a.cmdInitPhaseOp(r,i[1],s);case"todos":return a.cmdInitTodos(r,i[1],s);case"milestone-op":return a.cmdInitMilestoneOp(r,s);case"map-codebase":return a.cmdInitMapCodebase(r,s);case"progress":return a.cmdInitProgress(r,s);case"manager":return a.cmdInitManager(r,s);case"new-workspace":return a.cmdInitNewWorkspace(r,s);case"list-workspaces":return a.cmdInitListWorkspaces(r,s);case"remove-workspace":return a.cmdInitRemoveWorkspace(r,i[1],s);default:c(`Unknown init workflow: ${o}`)}}}});var _n={};ye(_n,{cmdRoadmapAnalyze:()=>wo,cmdRoadmapGetPhase:()=>_o,cmdRoadmapUpdatePlanProgress:()=>ko});function _o(t,e,n){let r=E(t).roadmap;if(!Be.default.existsSync(r)){y({found:!1,error:"ROADMAP.md not found"},n,"");return}try{let s=_e(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),p=u?l+u.index:s.length,m=s.slice(l,p).trim(),f=m.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),g=m.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:m},n,m)}catch(s){b("Failed to read ROADMAP.md: "+s.message)}}function wo(t,e){let n=E(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=_e(r,t),i=E(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[1],D=c[2].replace(/\(INSERTED\)/i,"").trim(),C=c.index,j=s.slice(C).match(/\n#{2,4}\s+Phase\s+\d/i),I=j?C+j.index:s.length,R=s.slice(C,I),V=R.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),X=R.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),ae=me($),K="no_directory",se=0,Ce=0,qe=!1,Tt=!1;try{let tn=Be.default.readdirSync(i,{withFileTypes:!0}).filter(Ee=>Ee.isDirectory()).map(Ee=>Ee.name).find(Ee=>Ee.startsWith(ae+"-")||Ee===ae);if(tn){let Ee=Be.default.readdirSync(kr.default.join(i,tn));se=Ee.filter(Fe=>Fe.endsWith("-PLAN.md")||Fe==="PLAN.md").length,Ce=Ee.filter(Fe=>Fe.endsWith("-SUMMARY.md")||Fe==="SUMMARY.md").length,qe=Ee.some(Fe=>Fe.endsWith("-CONTEXT.md")||Fe==="CONTEXT.md"),Tt=Ee.some(Fe=>Fe.endsWith("-RESEARCH.md")||Fe==="RESEARCH.md"),Ce>=se&&se>0?K="complete":Ce>0?K="partial":se>0?K="planned":Tt?K="researched":qe?K="discussed":K="empty"}}catch{}let Cs=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${re($)}[:\\s]`,"i"),Qt=s.match(Cs),en=Qt?Qt[1]==="x":!1;en&&K!=="complete"&&(K="complete"),a.push({number:$,name:D,goal:V?V[1].trim():null,depends_on:X?X[1].trim():null,plan_count:se,summary_count:Ce,has_context:qe,has_research:Tt,disk_status:K,roadmap_complete:en})}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 p=a.find($=>$.disk_status==="planned"||$.disk_status==="partial")??null,m=a.find($=>["empty","no_directory","discussed","researched"].includes($.disk_status))??null,f=a.reduce(($,D)=>$+D.plan_count,0),g=a.reduce(($,D)=>$+D.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(s))!==null;)S.add(v[1]);let P=new Set(a.map($=>$.number)),k=[...S].filter($=>!P.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:p?p.number:null,next_phase:m?m.number:null,missing_phase_details:k.length>0?k:null},e)}function ko(t,e,n){e||b("phase number required for roadmap update-plan-progress");let r=E(t).roadmap,s=ge(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),p=new RegExp(`^(\\|\\s*${u}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),m=a?` ${l} `:" ";d=d.replace(p,g=>{let h=g.split("|").slice(1,-1);return h.length===5?(h[2]=` ${o}/${i} `,h[3]=` ${c.padEnd(11)}`,h[4]=m):h.length===4&&(h[1]=` ${o}/${i} `,h[2]=` ${c.padEnd(11)}`,h[3]=m),"|"+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,kr,wn=L(()=>{"use strict";Be=U(require("fs")),kr=U(require("path"));he()});var Us,kn,Pn,$n,Pr=L(()=>{"use strict";Us=require("@oclif/core");je();kn=class t extends w{static description="Analyze roadmap phases and status";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapAnalyze(n,r)}},Pn=class t extends w{static description="Get details for a specific phase";static args={phase:Us.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapGetPhase(r,n.phase,s)}},$n=class t extends w{static description="Update plan progress in roadmap";static args={phase:Us.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapUpdatePlanProgress(r,n.phase,s)}}});var Ct={};ye(Ct,{cmdConfigEnsureSection:()=>jo,cmdConfigGet:()=>Eo,cmdConfigNewProject:()=>Ao,cmdConfigSet:()=>Ro,cmdConfigSetModelProfile:()=>Fo,ensureConfigFile:()=>Vs,setConfigValue:()=>zs});function $o(t){return!!(Cr.has(t)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(t))}function Co(t){let e=Po[t];e&&b(`Unknown config key: ${t}. Did you mean ${e}?`)}function Ar(t){let e=t||{},n=$r.default.homedir(),r=Ke.default.join(n,".gsd","brave_api_key"),s=!!(process.env.BRAVE_API_KEY||ue.default.existsSync(r)),i=Ke.default.join(n,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||ue.default.existsSync(i)),a=Ke.default.join(n,".gsd","exa_api_key"),c=!!(process.env.EXA_API_KEY||ue.default.existsSync(a)),l=Ke.default.join(n,".gsd","defaults.json"),d={};try{if(ue.default.existsSync(l)&&(d=JSON.parse(ue.default.readFileSync(l,"utf-8")),"depth"in d&&!("granularity"in d))){let p={quick:"coarse",standard:"standard",comprehensive:"fine"};d.granularity=p[d.depth]||d.depth,delete d.depth;try{ue.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 Vs(t){let e=Q(t),n=Ke.default.join(e,"config.json");try{ue.default.existsSync(e)||ue.default.mkdirSync(e,{recursive:!0})}catch(s){b("Failed to create .planning directory: "+s.message)}if(ue.default.existsSync(n))return{created:!1,reason:"already_exists"};let r=Ar({});try{return ue.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 zs(t,e,n){let r=Ke.default.join(Q(t),"config.json"),s={};try{ue.default.existsSync(r)&&(s=JSON.parse(ue.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 ue.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 Ao(t,e,n){let r=Q(t),s=Ke.default.join(r,"config.json");if(ue.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{ue.default.existsSync(r)||ue.default.mkdirSync(r,{recursive:!0})}catch(a){b("Failed to create .planning directory: "+a.message)}let o=Ar(i);try{ue.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 jo(t,e){let n=Vs(t);y(n,e,n?.created?"created":"exists")}function Ro(t,e,n,r){e||b("Usage: config-set <key.path> <value>"),Co(e),$o(e)||b(`Unknown config key: "${e}". Valid keys: ${[...Cr].sort().join(", ")}, agent_skills.<agent-type>`);let s=n;if(n==="true")s=!0;else if(n==="false")s=!1;else if(n!==void 0&&!isNaN(Number(n))&&n!=="")s=Number(n);else if(typeof n=="string"&&(n.startsWith("[")||n.startsWith("{")))try{s=JSON.parse(n)}catch{}let i=zs(t,e,s);y(i,r,`${e}=${s}`)}function Eo(t,e,n){e||b("Usage: config-get <key.path>");let r=Ke.default.join(Q(t),"config.json"),s={};try{ue.default.existsSync(r)?s=JSON.parse(ue.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 Fo(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(", ")}`),Vs(t);let i=zs(t,"model_profile",r)?.previousValue||"balanced",o=js(r),a=Rs(o),l=i!==r?`\u2713 Model profile set to: ${r} (was: ${i})
166
+ `),s=s.replace(i,(d,u)=>`${u}${l}`),re(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 Zi(t,e,n){let r=j(t).state;if(!C.default.existsSync(r)){y({error:"STATE.md not found"},n);return}let s=C.default.readFileSync(r,"utf-8"),i=new Date().toISOString(),o=[],a=d=>{let u=ke(s,d,i);u&&(s=u,o.push(d))};if(a("Last session"),a("Last Date"),e.stopped_at){let d=ke(s,"Stopped At",e.stopped_at)??ke(s,"Stopped at",e.stopped_at);d&&(s=d,o.push("Stopped At"))}let c=e.resume_file??"None",l=ke(s,"Resume File",c)??ke(s,"Resume file",c);l&&(s=l,o.push("Resume File")),o.length>0?(re(r,s,t),y({recorded:!0,updated:o},n,"true")):y({recorded:!1,reason:"No session fields found in STATE.md"},n,"false")}function Ki(t,e){let n=Wi(t);if(!C.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=C.default.readFileSync(n,"utf-8"),s=u=>J(r,u),i=[],o=r.match(/##\s*Decisions Made[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n([\s\S]*?)(?=\n##|\n$|$)/i);if(o)for(let u of o[1].trim().split(`
167
+ `).filter(m=>m.includes("|"))){let m=u.split("|").map(p=>p.trim()).filter(Boolean);m.length>=3&&i.push({phase:m[0],summary:m[1],rationale:m[2]})}let a=[],c=r.match(/##\s*Blockers\s*\n([\s\S]*?)(?=\n##|$)/i);if(c)for(let u of c[1].match(/^-\s+(.+)$/gm)??[])a.push(u.replace(/^-\s+/,"").trim());let l={last_date:null,stopped_at:null,resume_file:null},d=r.match(/##\s*Session\s*\n([\s\S]*?)(?=\n##|$)/i);if(d){let u=d[1];l.last_date=(u.match(/\*\*Last Date:\*\*\s*(.+)/i)??u.match(/^Last Date:\s*(.+)/im))?.[1]?.trim()??null,l.stopped_at=(u.match(/\*\*Stopped At:\*\*\s*(.+)/i)??u.match(/^Stopped At:\s*(.+)/im))?.[1]?.trim()??null,l.resume_file=(u.match(/\*\*Resume File:\*\*\s*(.+)/i)??u.match(/^Resume File:\s*(.+)/im))?.[1]?.trim()??null}y({current_phase:s("Current Phase"),current_phase_name:s("Current Phase Name"),total_phases:s("Total Phases")?parseInt(s("Total Phases"),10):null,current_plan:s("Current Plan"),total_plans_in_phase:s("Total Plans in Phase")?parseInt(s("Total Plans in Phase"),10):null,status:s("Status"),progress_percent:s("Progress")?parseInt(s("Progress").replace("%",""),10):null,last_activity:s("Last Activity"),last_activity_desc:s("Last Activity Description"),decisions:i,blockers:a,paused_at:s("Paused At"),session:l},e)}function Qi(t,e){let n=j(t).state;if(!C.default.existsSync(n)){y({error:"STATE.md not found"},e,"STATE.md not found");return}let r=C.default.readFileSync(n,"utf-8"),s=oe(r);if(!s||Object.keys(s).length===0){let i=Ls(r),o=br(i,t);y(o,e,JSON.stringify(o,null,2));return}y(s,e,JSON.stringify(s,null,2))}function eo(t,e,n,r,s){let i=j(t).state;if(!C.default.existsSync(i)){y({error:"STATE.md not found"},s);return}let o=C.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0],c=[],l=(f,g)=>{let h=ke(o,f,g);h&&(o=h,c.push(f))};l("Status",`Executing Phase ${e}`),l("Last Activity",a),l("Last Activity Description",`Phase ${e} execution started`),l("Current Phase",String(e)),n&&l("Current Phase Name",n),l("Current Plan","1"),r&&l("Total Plans in Phase",String(r));let d=n?`Phase ${e} - ${n}`:`Phase ${e}`,u=/(\*\*Current focus:\*\*\s*).*/i;u.test(o)&&(o=o.replace(u,(f,g)=>`${g}${d}`),c.push("Current focus"));let m=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,p=o.match(m);if(p){let f=p[1],g=p[2],h=`Phase: ${e}${n?` (${n})`:""} - EXECUTING`;g=/^Phase:/m.test(g)?g.replace(/^Phase:.*$/m,h):h+`
168
+ `+g;let S=`Plan: 1 of ${r??"?"}`;g=/^Plan:/m.test(g)?g.replace(/^Plan:.*$/m,S):g.replace(/^(Phase:.*$)/m,`$1
169
+ ${S}`),/^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&&re(i,o,t),y({updated:c,phase:e,phase_name:n??null,plan_count:r??null},s,c.length>0?"true":"false")}function to(t,e,n,r,s,i){let o=C.default.existsSync(Ae.default.join(t,".gsd"))?Ae.default.join(t,".gsd"):O(t),a=Ae.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{C.default.mkdirSync(o,{recursive:!0}),C.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 no(t,e){let n=[Ae.default.join(t,".gsd","WAITING.json"),Ae.default.join(O(t),"WAITING.json")],r=!1;for(let s of n)if(C.default.existsSync(s))try{C.default.unlinkSync(s),r=!0}catch{}y({resumed:!0,removed:r},e,r?"true":"false")}function so(t,e){let n=j(t);if(!C.default.existsSync(n.state)){y({reconciled:!1,reason:"no STATE.md"},e,"false");return}if(!C.default.existsSync(n.phases)){y({reconciled:!1,reason:"no phases dir"},e,"false");return}let r=_e(t),s=C.default.readdirSync(n.phases,{withFileTypes:!0}).filter(x=>x.isDirectory()).map(x=>x.name).filter(r).sort(),i=0,o=0,a=0,c=s.length,l=[],d=new Date().toISOString().split("T")[0],u=[];for(let x of s){let b=Ae.default.join(n.phases,x),P=C.default.readdirSync(b),k=P.filter(F=>F.match(/-PLAN\.md$/i)).length,$=P.filter(F=>F.match(/-SUMMARY\.md$/i)).length,M=P.some(F=>F.match(/CONTEXT\.md$/i)),A=x.match(/^(\d+(?:\.\d+)?)/)?.[1]??x.split("-")[0],W=k>0&&$>=k;i+=k,o+=$,W&&a++,u.push({dir:x,dirPath:b,phaseNum:A,numVal:parseFloat(A),plans:k,summaries:$,hasContext:M,complete:W})}for(let x of u){if(x.plans>0||x.complete||!u.some(M=>M.numVal>x.numVal&&M.complete))continue;let P=x.phaseNum.replace(".","-"),k=Ae.default.join(x.dirPath,`${P}-01-PLAN.md`),$=Ae.default.join(x.dirPath,`${P}-01-SUMMARY.md`);C.default.existsSync(k)||C.default.writeFileSync(k,["---",`plan: "${P}-01"`,`phase: "${x.phaseNum}"`,"status: complete","absorbed: true","---","",`# Plan ${P}-01 \u2014 [ABSORBED]`,"","Phase absorbed into a later phase. All deliverables completed there.",""].join(`
170
+ `),"utf-8"),C.default.existsSync($)||C.default.writeFileSync($,["---",`plan: "${P}-01"`,`phase: "${x.phaseNum}"`,"status: complete","absorbed: true",`completed_at: "${d}"`,"---","",`# Summary ${P}-01 \u2014 Phase ${x.phaseNum} Absorbed`,"","Phase deliverables completed as part of a later phase execution.",""].join(`
171
+ `),"utf-8"),i++,o++,a++,x.complete=!0,l.push(`Phase ${x.phaseNum}: absorbed (0 plans, later phase complete) \u2014 created stubs`)}if(C.default.existsSync(n.roadmap)){let x=C.default.readFileSync(n.roadmap,"utf-8"),b=!1;for(let P of u){if(!P.complete)continue;let k=P.phaseNum.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),$=new RegExp(`(-\\s*\\[)[ ](\\]\\s*(?:\\*\\*)?\\s*Phase\\s+${k}[^\\n]*)`,"i");if($.test(x)){x=x.replace($,"$1x$2"),b=!0;continue}let M=new RegExp(`(\\|\\s*${k}\\.?\\s+[^|]*(?:\\|[^|]*)*\\|[^|]*)\\b(?:Pending|In Progress|Planning|Executing|Verifying|Discussed|Researched|Empty)\\b`,"i");M.test(x)&&(x=x.replace(M,"$1Complete"),b=!0)}b&&(C.default.writeFileSync(n.roadmap,x,"utf-8"),l.push("ROADMAP.md updated to match disk completion status"))}let m=C.default.readFileSync(n.state,"utf-8"),p=i>0?Math.min(100,Math.round(o/i*100)):0,f=Math.round(p/100*10),g=`[${"\u2588".repeat(f)}${"\u2591".repeat(10-f)}] ${p}%`,h=/(\*\*Progress:\*\*\s*).*/i,S=/^(Progress:\s*).*/im;h.test(m)?m=m.replace(h,(x,b)=>`${b}${g}`):S.test(m)&&(m=m.replace(S,(x,b)=>`${b}${g}`)),re(n.state,m,t),y({reconciled:!0,changes:l,phases_complete:a,phases_total:c,plans_complete:o,plans_total:i,percent:p},e,l.length>0?`Reconciled: ${l.join("; ")}`:`State consistent (${a}/${c} phases, ${o}/${i} plans)`)}var C,Ae,je=q(()=>{"use strict";C=L(require("fs")),Ae=L(require("path"));ge();Ve();ln()});var mt,dn,un,mn,pn,fn,gn,hn,yn,vr=q(()=>{"use strict";mt=require("@oclif/core");Ce();dn=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(()=>(je(),ze))).cmdStateJson(n,r)}},un=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(()=>(je(),ze))).cmdStateGet(r,n.field,s)}},mn=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(()=>(je(),ze))).cmdStateUpdate(r,n.field,n.value)}},pn=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(()=>(je(),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)}},fn=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(()=>(je(),ze))).cmdStateAdvancePlan(n,r)}},gn=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(()=>(je(),ze))).cmdStateLoad(n,r)}},hn=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(()=>(je(),ze))).cmdStateUpdateProgress(n,r)}},yn=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(()=>(je(),ze))).cmdStateReconcile(n,r)}}});var xn={};he(xn,{cmdAgentSkills:()=>vo,cmdInitExecutePhase:()=>ro,cmdInitListWorkspaces:()=>So,cmdInitManager:()=>yo,cmdInitMapCodebase:()=>go,cmdInitMilestoneOp:()=>fo,cmdInitNewMilestone:()=>ao,cmdInitNewProject:()=>oo,cmdInitNewWorkspace:()=>xo,cmdInitPhaseOp:()=>mo,cmdInitPlanPhase:()=>io,cmdInitProgress:()=>ho,cmdInitQuick:()=>co,cmdInitRemoveWorkspace:()=>bo,cmdInitResume:()=>lo,cmdInitTodos:()=>po,cmdInitVerifyWork:()=>uo});function _r(t){let e=Ie.default.join(Z(t),"MILESTONES.md");if(!z.default.existsSync(e))return null;try{let r=z.default.readFileSync(e,"utf-8").match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);return r?{version:r[1],name:r[2].trim()}:null}catch{return null}}function me(t,e){e.project_root=t,e.gsd_bin="dist/gsd-tools.js",e.gsd_root=".",e.gsd_harness_dir=".";let n=_t();return e.agents_installed=n.agents_installed,e.missing_agents=n.missing_agents,e}function ro(t,e,n){e||v("phase required for init execute-phase");let r=X(t),s=fe(t,e),i=ie(t),o=dt(t,e);if(!s&&o?.found){let d=o.phase_name;s={found:!0,directory:null,phase_number:o.phase_number,phase_name:d,phase_slug:d?d.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:[],summaries:[],incomplete_plans:[],has_research:!1,has_context:!1,has_verification:!1,has_reviews:!1}}let a=o?.section?.match(/^\*\*Requirements\*\*:[^\S\n]*([^\n]*)$/m),c=a?a[1].replace(/[[\]]/g,"").split(",").map(d=>d.trim()).filter(Boolean).join(", "):null,l=me(t,{executor_model:se(t,"gsd-executor"),verifier_model:se(t,"gsd-verifier"),commit_docs:r.commit_docs,sub_repos:r.sub_repos,parallelization:r.parallelization,context_window:r.context_window,branching_strategy:r.branching_strategy,phase_branch_template:r.phase_branch_template,milestone_branch_template:r.milestone_branch_template,verifier_enabled:r.verifier,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,phase_slug:s?.phase_slug??null,phase_req_ids:c&&c!=="TBD"?c:null,plans:s?.plans??[],summaries:s?.summaries??[],incomplete_plans:s?.incomplete_plans??[],has_research:s?.has_research??!1,has_context:s?.has_context??!1,has_verification:s?.has_verification??!1,has_reviews:s?.has_reviews??!1,roadmap_goal:o?.goal??null,roadmap_section:o?.section??null,milestone_version:i.version,milestone_name:i.name});y(l,n)}function io(t,e,n){e||v("phase required for init plan-phase");let r=X(t),s=fe(t,e),i=dt(t,e),o=ie(t),a=me(t,{planner_model:se(t,"gsd-planner"),researcher_model:se(t,"gsd-phase-researcher"),synthesizer_model:se(t,"gsd-research-synthesizer"),commit_docs:r.commit_docs,research_enabled:r.research,plan_checker_enabled:r.plan_checker,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,roadmap_goal:i?.goal??null,roadmap_section:i?.section??null,milestone_version:o.version,milestone_name:o.name});y(a,n)}function oo(t,e){let n=X(t),r=Z(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,planning_exists:z.default.existsSync(r),project_exists:z.default.existsSync(Ie.default.join(r,"PROJECT.md")),config_exists:z.default.existsSync(Ie.default.join(r,"config.json")),roadmap_exists:z.default.existsSync(Ie.default.join(r,"ROADMAP.md")),state_exists:z.default.existsSync(Ie.default.join(r,"STATE.md"))});y(s,e)}function ao(t,e){let n=X(t),r=ie(t),s=_r(t),i=me(t,{roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,current_milestone:r,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap)});y(i,e)}function co(t,e,n){let r=X(t),s=ie(t),i=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,context_window:r.context_window,branching_strategy:r.branching_strategy,quick_branch_template:r.quick_branch_template,description:e||null,milestone_version:s.version,milestone_name:s.name,state_exists:z.default.existsSync(j(t).state)});y(i,n)}function lo(t,e){let n=X(t),r=ie(t),s=z.default.existsSync(j(t).state),i="";if(s)try{i=z.default.readFileSync(j(t).state,"utf-8")}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:n.commit_docs,context_window:n.context_window,state_exists:s,state_raw:i,roadmap_exists:z.default.existsSync(j(t).roadmap),config_exists:z.default.existsSync(j(t).config),milestone_version:r.version,milestone_name:r.name});y(o,e)}function uo(t,e,n){e||v("phase required for init verify-work");let r=X(t),s=fe(t,e),i=dt(t,e),o=me(t,{verifier_model:se(t,"gsd-verifier"),nyquist_model:se(t,"gsd-nyquist-auditor"),commit_docs:r.commit_docs,nyquist_validation:r.nyquist_validation,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,plans:s?.plans??[],summaries:s?.summaries??[],roadmap_goal:i?.goal??null});y(o,n)}function mo(t,e,n){let r=X(t),s=e?fe(t,e):null,i=ie(t),o=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:r.commit_docs,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,milestone_version:i.version,milestone_name:i.name});y(o,n)}function po(t,e,n){let r=X(t),s=Ie.default.join(O(t),"todos","pending"),i=[];if(z.default.existsSync(s))try{for(let a of z.default.readdirSync(s).filter(c=>c.endsWith(".md")))try{let c=z.default.readFileSync(Ie.default.join(s,a),"utf-8"),l=c.match(/^title:\s*(.+)$/m),d=c.match(/^area:\s*(.+)$/m),u=d?d[1].trim():"general";if(e&&u!==e)continue;i.push({file:a,title:l?l[1].trim():"Untitled",area:u})}catch{}}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,todos:i,todo_count:i.length,area:e??null});y(o,n)}function fo(t,e){let n=X(t),r=ie(t),s=_r(t),i=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap),state_exists:z.default.existsSync(j(t).state)});y(i,e)}function go(t,e){let n=X(t),r=me(t,{mapper_model:se(t,"gsd-codebase-mapper"),commit_docs:n.commit_docs,search_gitignored:n.search_gitignored,context_window:n.context_window,project_exists:z.default.existsSync(Ie.default.join(Z(t),"PROJECT.md"))});y(r,e)}function ho(t,e){let n=X(t),r=ie(t),s=_e(t),i=j(t).phases,o=0,a=0,c=0;if(z.default.existsSync(i))try{let d=z.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).filter(s);c=d.length;for(let u of d){let m=z.default.readdirSync(Ie.default.join(i,u));o+=m.filter(p=>p.match(/-PLAN\.md$/i)).length,a+=m.filter(p=>p.match(/-SUMMARY\.md$/i)).length}}catch{}let l=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,phase_count:c,total_plans:o,total_summaries:a,percent:o>0?Math.min(100,Math.round(a/o*100)):0});y(l,e)}function yo(t,e){let n=X(t),r=ie(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,state_exists:z.default.existsSync(j(t).state),roadmap_exists:z.default.existsSync(j(t).roadmap)});y(s,e)}function xo(t,e){let n=X(t),r=Ie.default.join(Z(t),"workstreams"),s=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,workstream_mode:z.default.existsSync(r),workstreams:z.default.existsSync(r)?z.default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name):[]});y(s,e)}function So(t,e){let n=Ie.default.join(Z(t),"workstreams");if(!z.default.existsSync(n)){y(me(t,{mode:"flat",workstreams:[],count:0}),e);return}let r=z.default.readdirSync(n,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);y(me(t,{mode:"workstream",workstreams:r,count:r.length}),e)}function bo(t,e,n){e||v("workstream name required for init remove-workspace");let r=Ie.default.join(Z(t),"workstreams",e);if(!z.default.existsSync(r)){y(me(t,{removed:!1,reason:"not_found",workstream:e}),n);return}try{z.default.rmSync(r,{recursive:!0,force:!0})}catch(s){y(me(t,{removed:!1,reason:s.message,workstream:e}),n);return}y(me(t,{removed:!0,workstream:e}),n)}function vo(t,e,n){e||v("agent-type required");let s=X(t).agent_skills[e]??{};y({agent:e,skills:s},n,JSON.stringify(s))}var z,Ie,Sn=q(()=>{"use strict";z=L(require("fs")),Ie=L(require("path"));ge()});var bn,vn,wr=q(()=>{"use strict";bn=require("@oclif/core");Ce();vn=class t extends w{static description="Initialise a GSD workflow context";static args={workflow:bn.Args.string({required:!0}),phase:bn.Args.string({required:!1}),rest:bn.Args.string({required:!1})};static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=n,o=i[0],a=await Promise.resolve().then(()=>(Sn(),xn)),{gsdError:c}=await Promise.resolve().then(()=>(ge(),fr));switch(o){case"execute-phase":return a.cmdInitExecutePhase(r,i[1],s);case"plan-phase":return a.cmdInitPlanPhase(r,i[1],s);case"new-project":return a.cmdInitNewProject(r,s);case"new-milestone":return a.cmdInitNewMilestone(r,s);case"quick":return a.cmdInitQuick(r,i.slice(1).join(" "),s);case"resume":return a.cmdInitResume(r,s);case"verify-work":return a.cmdInitVerifyWork(r,i[1],s);case"phase-op":return a.cmdInitPhaseOp(r,i[1],s);case"todos":return a.cmdInitTodos(r,i[1],s);case"milestone-op":return a.cmdInitMilestoneOp(r,s);case"map-codebase":return a.cmdInitMapCodebase(r,s);case"progress":return a.cmdInitProgress(r,s);case"manager":return a.cmdInitManager(r,s);case"new-workspace":return a.cmdInitNewWorkspace(r,s);case"list-workspaces":return a.cmdInitListWorkspaces(r,s);case"remove-workspace":return a.cmdInitRemoveWorkspace(r,i[1],s);default:c(`Unknown init workflow: ${o}`)}}}});var _n={};he(_n,{cmdRoadmapAnalyze:()=>wo,cmdRoadmapGetPhase:()=>_o,cmdRoadmapUpdatePlanProgress:()=>ko});function _o(t,e,n){let r=j(t).roadmap;if(!Be.default.existsSync(r)){y({found:!1,error:"ROADMAP.md not found"},n,"");return}try{let s=ve(Be.default.readFileSync(r,"utf-8"),t),i=ne(e??""),o=new RegExp(`#{2,4}\\s*Phase\\s+${i}:\\s*([^\\n]+)`,"i"),a=s.match(o);if(!a){let S=new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${i}:\\s*([^*]+)\\*\\*`,"i"),x=s.match(S);if(x){y({found:!1,phase_number:e,phase_name:x[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(S=>S.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){v("Failed to read ROADMAP.md: "+s.message)}}function wo(t,e){let n=j(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=ve(r,t),i=j(t).phases,o=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,a=[],c;for(;(c=o.exec(s))!==null;){let $=c[1],M=c[2].replace(/\(INSERTED\)/i,"").trim(),A=c.index,W=s.slice(A).match(/\n#{2,4}\s+Phase\s+\d/i),F=W?A+W.index:s.length,U=s.slice(A,F),Y=U.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),le=U.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),be=de($),te="no_directory",pe=0,Oe=0,qe=!1,Tt=!1;try{let tn=Be.default.readdirSync(i,{withFileTypes:!0}).filter(Re=>Re.isDirectory()).map(Re=>Re.name).find(Re=>Re.startsWith(be+"-")||Re===be);if(tn){let Re=Be.default.readdirSync(kr.default.join(i,tn));pe=Re.filter(Ee=>Ee.endsWith("-PLAN.md")||Ee==="PLAN.md").length,Oe=Re.filter(Ee=>Ee.endsWith("-SUMMARY.md")||Ee==="SUMMARY.md").length,qe=Re.some(Ee=>Ee.endsWith("-CONTEXT.md")||Ee==="CONTEXT.md"),Tt=Re.some(Ee=>Ee.endsWith("-RESEARCH.md")||Ee==="RESEARCH.md"),Oe>=pe&&pe>0?te="complete":Oe>0?te="partial":pe>0?te="planned":Tt?te="researched":qe?te="discussed":te="empty"}}catch{}let Cs=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${ne($)}[:\\s]`,"i"),Qt=s.match(Cs),en=Qt?Qt[1]==="x":!1;en&&te!=="complete"&&(te="complete"),a.push({number:$,name:M,goal:Y?Y[1].trim():null,depends_on:le?le[1].trim():null,plan_count:pe,summary_count:Oe,has_context:qe,has_research:Tt,disk_status:te,roadmap_complete:en})}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($=>$.disk_status==="planned"||$.disk_status==="partial")??null,p=a.find($=>["empty","no_directory","discussed","researched"].includes($.disk_status))??null,f=a.reduce(($,M)=>$+M.plan_count,0),g=a.reduce(($,M)=>$+M.summary_count,0),h=a.filter($=>$.disk_status==="complete").length,S=/-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi,x=new Set,b;for(;(b=S.exec(s))!==null;)x.add(b[1]);let P=new Set(a.map($=>$.number)),k=[...x].filter($=>!P.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:k.length>0?k:null},e)}function ko(t,e,n){e||v("phase number required for roadmap update-plan-progress");let r=j(t).roadmap,s=fe(t,e);s||v(`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=ne(e),m=new RegExp(`^(\\|\\s*${u}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),p=a?` ${l} `:" ";d=d.replace(m,g=>{let h=g.split("|").slice(1,-1);return h.length===5?(h[2]=` ${o}/${i} `,h[3]=` ${c.padEnd(11)}`,h[4]=p):h.length===4&&(h[1]=` ${o}/${i} `,h[2]=` ${c.padEnd(11)}`,h[3]=p),"|"+h.join("|")+"|"});let f=new RegExp(`(#{2,4}\\s*Phase\\s+${u}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i");if(d=lt(d,f,`$1${a?`${o}/${i} plans complete`:`${o}/${i} plans executed`}`),a){let g=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${u}[:\\s][^\\n]*)`,"i");d=lt(d,g,`$1x$2 (completed ${l})`)}for(let g of s.summaries){let h=g.replace("-SUMMARY.md","").replace("SUMMARY.md","");h&&(d=d.replace(new RegExp(`(-\\s*\\[) (\\]\\s*${ne(h)})`,"i"),"$1x$2"))}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,kr,wn=q(()=>{"use strict";Be=L(require("fs")),kr=L(require("path"));ge()});var Us,kn,Pn,$n,Pr=q(()=>{"use strict";Us=require("@oclif/core");Ce();kn=class t extends w{static description="Analyze roadmap phases and status";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapAnalyze(n,r)}},Pn=class t extends w{static description="Get details for a specific phase";static args={phase:Us.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapGetPhase(r,n.phase,s)}},$n=class t extends w{static description="Update plan progress in roadmap";static args={phase:Us.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapUpdatePlanProgress(r,n.phase,s)}}});var Ct={};he(Ct,{cmdConfigEnsureSection:()=>jo,cmdConfigGet:()=>Eo,cmdConfigNewProject:()=>Ao,cmdConfigSet:()=>Ro,cmdConfigSetModelProfile:()=>Fo,ensureConfigFile:()=>Vs,setConfigValue:()=>zs});function $o(t){return!!(Cr.has(t)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(t))}function Co(t){let e=Po[t];e&&v(`Unknown config key: ${t}. Did you mean ${e}?`)}function Ar(t){let e=t||{},n=$r.default.homedir(),r=Ke.default.join(n,".gsd","brave_api_key"),s=!!(process.env.BRAVE_API_KEY||ce.default.existsSync(r)),i=Ke.default.join(n,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||ce.default.existsSync(i)),a=Ke.default.join(n,".gsd","exa_api_key"),c=!!(process.env.EXA_API_KEY||ce.default.existsSync(a)),l=Ke.default.join(n,".gsd","defaults.json"),d={};try{if(ce.default.existsSync(l)&&(d=JSON.parse(ce.default.readFileSync(l,"utf-8")),"depth"in d&&!("granularity"in d))){let m={quick:"coarse",standard:"standard",comprehensive:"fine"};d.granularity=m[d.depth]||d.depth,delete d.depth;try{ce.default.writeFileSync(l,JSON.stringify(d,null,2),"utf-8")}catch{}}}catch{}let u={model_profile:"balanced",commit_docs:!0,parallelization:!0,search_gitignored:!1,brave_search:s,firecrawl:o,exa_search:c,git:{branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null},workflow:{research:!0,plan_check:!0,verifier:!0,nyquist_validation:!0,auto_advance:!1,node_repair:!0,node_repair_budget:2,ui_phase:!0,ui_safety_gate:!0,text_mode:!1,research_before_questions:!1,discuss_mode:"discuss",skip_discuss:!1},hooks:{context_warnings:!0},agent_skills:{}};return{...u,...d,...e,git:{...u.git,...d.git||{},...e.git||{}},workflow:{...u.workflow,...d.workflow||{},...e.workflow||{}},hooks:{...u.hooks,...d.hooks||{},...e.hooks||{}},agent_skills:{...u.agent_skills,...d.agent_skills||{},...e.agent_skills||{}}}}function Vs(t){let e=Z(t),n=Ke.default.join(e,"config.json");try{ce.default.existsSync(e)||ce.default.mkdirSync(e,{recursive:!0})}catch(s){v("Failed to create .planning directory: "+s.message)}if(ce.default.existsSync(n))return{created:!1,reason:"already_exists"};let r=Ar({});try{return ce.default.writeFileSync(n,JSON.stringify(r,null,2),"utf-8"),{created:!0,path:".planning/config.json"}}catch(s){v("Failed to create config.json: "+s.message)}}function zs(t,e,n){let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)&&(s=JSON.parse(ce.default.readFileSync(r,"utf-8")))}catch(c){v("Failed to read config.json: "+c.message)}let i=e.split("."),o=s;for(let c=0;c<i.length-1;c++){let l=i[c];(o[l]===void 0||typeof o[l]!="object")&&(o[l]={}),o=o[l]}let a=o[i[i.length-1]];o[i[i.length-1]]=n;try{return ce.default.writeFileSync(r,JSON.stringify(s,null,2),"utf-8"),{updated:!0,key:e,value:n,previousValue:a}}catch(c){v("Failed to write config.json: "+c.message)}}function Ao(t,e,n){let r=Z(t),s=Ke.default.join(r,"config.json");if(ce.default.existsSync(s)){y({created:!1,reason:"already_exists"},n,"exists");return}let i={};if(e&&e.trim())try{i=JSON.parse(e)}catch(a){v("Invalid JSON for config-new-project: "+a.message)}try{ce.default.existsSync(r)||ce.default.mkdirSync(r,{recursive:!0})}catch(a){v("Failed to create .planning directory: "+a.message)}let o=Ar(i);try{ce.default.writeFileSync(s,JSON.stringify(o,null,2),"utf-8"),y({created:!0,path:".planning/config.json"},n,"created")}catch(a){v("Failed to write config.json: "+a.message)}}function jo(t,e){let n=Vs(t);y(n,e,n?.created?"created":"exists")}function Ro(t,e,n,r){e||v("Usage: config-set <key.path> <value>"),Co(e),$o(e)||v(`Unknown config key: "${e}". Valid keys: ${[...Cr].sort().join(", ")}, agent_skills.<agent-type>`);let s=n;if(n==="true")s=!0;else if(n==="false")s=!1;else if(n!==void 0&&!isNaN(Number(n))&&n!=="")s=Number(n);else if(typeof n=="string"&&(n.startsWith("[")||n.startsWith("{")))try{s=JSON.parse(n)}catch{}let i=zs(t,e,s);y(i,r,`${e}=${s}`)}function Eo(t,e,n){e||v("Usage: config-get <key.path>");let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)?s=JSON.parse(ce.default.readFileSync(r,"utf-8")):v("No config.json found at "+r)}catch(a){if(a.message.startsWith("Error:"))throw a;v("Failed to read config.json: "+a.message)}let i=e.split("."),o=s;for(let a of i)(o==null||typeof o!="object")&&v(`Key not found: ${e}`),o=o[a];o===void 0&&v(`Key not found: ${e}`),y(o,n,String(o))}function Fo(t,e,n){e||v(`Usage: config-set-model-profile <${vt.join("|")}>`);let r=e.toLowerCase().trim();vt.includes(r)||v(`Invalid profile '${e}'. Valid profiles: ${vt.join(", ")}`),Vs(t);let i=zs(t,"model_profile",r)?.previousValue||"balanced",o=js(r),a=Rs(o),l=i!==r?`\u2713 Model profile set to: ${r} (was: ${i})
173
173
 
174
174
  Agents will now use:
175
175
 
@@ -178,20 +178,20 @@ Next spawned agents will use the new profile.`:`\u2713 Model profile is already
178
178
 
179
179
  Agents are using:
180
180
 
181
- ${a}`;y({updated:!0,profile:r,previousProfile:i,agentToModelMap:o},n,l)}var ue,$r,Ke,Cr,Po,At=L(()=>{"use strict";ue=U(require("fs")),$r=U(require("os")),Ke=U(require("path"));he();Dt();Cr=new Set(["mode","granularity","parallelization","commit_docs","model_profile","search_gitignored","brave_search","firecrawl","exa_search","workflow.research","workflow.plan_check","workflow.verifier","workflow.nyquist_validation","workflow.ui_phase","workflow.ui_safety_gate","workflow.auto_advance","workflow.node_repair","workflow.node_repair_budget","workflow.text_mode","workflow.research_before_questions","workflow.discuss_mode","workflow.skip_discuss","workflow._auto_chain_active","git.branching_strategy","git.phase_branch_template","git.milestone_branch_template","git.quick_branch_template","planning.commit_docs","planning.search_gitignored","hooks.context_warnings"]),Po={"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,Cn,An,jn,Rn,En,jr=L(()=>{"use strict";pt=require("@oclif/core");je();Cn=class t extends w{static description="Get a config value";static args={key:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigGet:i}=await Promise.resolve().then(()=>(At(),Ct));i(r,n.key,s)}},An=class t extends w{static description="Set a config value";static args={key:pt.Args.string({required:!1}),value:pt.Args.string({required:!1})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSet:i}=await Promise.resolve().then(()=>(At(),Ct));i(r,n.key,n.value,s)}},jn=class t extends w{static description="Set the active model profile";static args={profile:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSetModelProfile:i}=await Promise.resolve().then(()=>(At(),Ct));i(r,n.profile,s)}},Rn=class t extends w{static description="Initialise a new project config";static flags={...w.baseFlags,choices:pt.Flags.string({description:"Choices JSON"})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigNewProject:s}=await Promise.resolve().then(()=>(At(),Ct));s(n,e.choices,r)}},En=class t extends w{static description="Ensure a config section exists";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigEnsureSection:s}=await Promise.resolve().then(()=>(At(),Ct));s(n,r)}}});var Qe={};ye(Qe,{cmdFindPhase:()=>To,cmdPhaseAdd:()=>Oo,cmdPhaseComplete:()=>Vo,cmdPhaseInsert:()=>No,cmdPhaseNextDecimal:()=>Io,cmdPhasePlanIndex:()=>Do,cmdPhaseRemove:()=>Uo,cmdPhasesList:()=>Mo});function Mo(t,e,n){let r=q.default.join(W(t),"phases"),{type:s,phase:i,includeArchived:o}=e;if(!M.default.existsSync(r)){y(s?{files:[],count:0}:{directories:[],count:0},n,"");return}try{let a=M.default.readdirSync(r,{withFileTypes:!0}).filter(c=>c.isDirectory()).map(c=>c.name);if(o){let c=Lt(t);for(let l of c)a.push(`${l.name} [${l.milestone}]`)}if(a.sort((c,l)=>Ae(c,l)),i){let c=me(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=M.default.readdirSync(d),p;s==="plans"?p=u.filter(m=>m.endsWith("-PLAN.md")||m==="PLAN.md"):s==="summaries"?p=u.filter(m=>m.endsWith("-SUMMARY.md")||m==="SUMMARY.md"):p=u,c.push(...p.sort())}y({files:c,count:c.length,phase_dir:i?a[0]?.replace(/^\d+(?:\.\d+)*-?/,""):null},n,c.join(`
181
+ ${a}`;y({updated:!0,profile:r,previousProfile:i,agentToModelMap:o},n,l)}var ce,$r,Ke,Cr,Po,At=q(()=>{"use strict";ce=L(require("fs")),$r=L(require("os")),Ke=L(require("path"));ge();Dt();Cr=new Set(["mode","granularity","parallelization","commit_docs","model_profile","search_gitignored","brave_search","firecrawl","exa_search","workflow.research","workflow.plan_check","workflow.verifier","workflow.nyquist_validation","workflow.ui_phase","workflow.ui_safety_gate","workflow.auto_advance","workflow.node_repair","workflow.node_repair_budget","workflow.text_mode","workflow.research_before_questions","workflow.discuss_mode","workflow.skip_discuss","workflow._auto_chain_active","git.branching_strategy","git.phase_branch_template","git.milestone_branch_template","git.quick_branch_template","planning.commit_docs","planning.search_gitignored","hooks.context_warnings"]),Po={"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,Cn,An,jn,Rn,En,jr=q(()=>{"use strict";pt=require("@oclif/core");Ce();Cn=class t extends w{static description="Get a config value";static args={key:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigGet:i}=await Promise.resolve().then(()=>(At(),Ct));i(r,n.key,s)}},An=class t extends w{static description="Set a config value";static args={key:pt.Args.string({required:!1}),value:pt.Args.string({required:!1})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSet:i}=await Promise.resolve().then(()=>(At(),Ct));i(r,n.key,n.value,s)}},jn=class t extends w{static description="Set the active model profile";static args={profile:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSetModelProfile:i}=await Promise.resolve().then(()=>(At(),Ct));i(r,n.profile,s)}},Rn=class t extends w{static description="Initialise a new project config";static flags={...w.baseFlags,choices:pt.Flags.string({description:"Choices JSON"})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigNewProject:s}=await Promise.resolve().then(()=>(At(),Ct));s(n,e.choices,r)}},En=class t extends w{static description="Ensure a config section exists";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigEnsureSection:s}=await Promise.resolve().then(()=>(At(),Ct));s(n,r)}}});var Qe={};he(Qe,{cmdFindPhase:()=>To,cmdPhaseAdd:()=>Oo,cmdPhaseComplete:()=>Vo,cmdPhaseInsert:()=>No,cmdPhaseNextDecimal:()=>Io,cmdPhasePlanIndex:()=>Do,cmdPhaseRemove:()=>Uo,cmdPhasesList:()=>Mo});function Mo(t,e,n){let r=N.default.join(O(t),"phases"),{type:s,phase:i,includeArchived:o}=e;if(!E.default.existsSync(r)){y(s?{files:[],count:0}:{directories:[],count:0},n,"");return}try{let a=E.default.readdirSync(r,{withFileTypes:!0}).filter(c=>c.isDirectory()).map(c=>c.name);if(o){let c=Lt(t);for(let l of c)a.push(`${l.name} [${l.milestone}]`)}if(a.sort((c,l)=>$e(c,l)),i){let c=de(i),l=a.find(d=>d.startsWith(c));if(!l){y({files:[],count:0,phase_dir:null,error:"Phase not found"},n,"");return}a=[l]}if(s){let c=[];for(let l of a){let d=N.default.join(r,l),u=E.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
182
  `));return}y({directories:a,count:a.length},n,a.join(`
183
- `))}catch(a){b("Failed to list phases: "+a.message)}}function Io(t,e,n){let r=q.default.join(W(t),"phases"),s=me(e??"");if(!M.default.existsSync(r)){y({found:!1,base_phase:s,next:`${s}.1`,existing:[]},n,`${s}.1`);return}try{let i=M.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)=>Ae(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 To(t,e,n){e||b("phase identifier required");let r=q.default.join(W(t),"phases"),s=me(e),i={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=M.default.readdirSync(r,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,h)=>Ae(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),p=M.default.readdirSync(u),m=p.filter(g=>g.endsWith("-PLAN.md")||g==="PLAN.md").sort(),f=p.filter(g=>g.endsWith("-SUMMARY.md")||g==="SUMMARY.md").sort();y({found:!0,directory:G(q.default.join(q.default.relative(t,W(t)),"phases",a)),phase_number:l,phase_name:d,plans:m,summaries:f},n,G(q.default.join(q.default.relative(t,W(t)),"phases",a)))}catch{y(i,n,"")}}function Do(t,e,n){e||b("phase required for phase-plan-index");let r=q.default.join(W(t),"phases"),s=me(e),i=null;try{let g=M.default.readdirSync(r,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).sort((h,x)=>Ae(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=M.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={},p=[],m=!1;for(let f of a){let g=f.replace("-PLAN.md","").replace("PLAN.md",""),h=M.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)||[],P=S.length||v.length,k=parseInt(String(x.wave),10)||1,$=!0;x.autonomous!==void 0&&($=x.autonomous==="true"||x.autonomous===!0),$||(m=!0);let D=[],C=x.files_modified??x["files-modified"];if(C){let R=ke(C);D=R?R.map(V=>pe(V)??String(V)):[pe(C)??String(C)]}let j=l.has(g);j||p.push(g),d.push({id:g,wave:k,autonomous:$,objective:h.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()??pe(x.objective)??null,files_modified:D,task_count:P,has_summary:j});let I=String(k);u[I]||(u[I]=[]),u[I].push(g)}y({phase:s,plans:d,waves:u,incomplete:p,has_checkpoints:m},n)}function Oo(t,e,n,r){e||b("description required for phase add");let s=Z(t),i=q.default.join(W(t),"ROADMAP.md");M.default.existsSync(i)||b("ROADMAP.md not found");let o=M.default.readFileSync(i,"utf-8"),a=_e(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 P=parseInt(S[1],10);P>x&&(x=P)}l=x+1,d=`${String(l).padStart(2,"0")}-${c}`}let u=q.default.join(W(t),"phases",d);M.default.mkdirSync(u,{recursive:!0}),M.default.writeFileSync(q.default.join(u,".gitkeep"),"");let p=s.phase_naming==="custom"?"":`
184
- **Depends on:** Phase ${typeof l=="number"?l-1:"TBD"}`,m=`
183
+ `))}catch(a){v("Failed to list phases: "+a.message)}}function Io(t,e,n){let r=N.default.join(O(t),"phases"),s=de(e??"");if(!E.default.existsSync(r)){y({found:!1,base_phase:s,next:`${s}.1`,existing:[]},n,`${s}.1`);return}try{let i=E.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)=>$e(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){v("Failed to calculate next decimal phase: "+i.message)}}function To(t,e,n){e||v("phase identifier required");let r=N.default.join(O(t),"phases"),s=de(e),i={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=E.default.readdirSync(r,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,h)=>$e(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=N.default.join(r,a),m=E.default.readdirSync(u),p=m.filter(g=>g.endsWith("-PLAN.md")||g==="PLAN.md").sort(),f=m.filter(g=>g.endsWith("-SUMMARY.md")||g==="SUMMARY.md").sort();y({found:!0,directory:B(N.default.join(N.default.relative(t,O(t)),"phases",a)),phase_number:l,phase_name:d,plans:p,summaries:f},n,B(N.default.join(N.default.relative(t,O(t)),"phases",a)))}catch{y(i,n,"")}}function Do(t,e,n){e||v("phase required for phase-plan-index");let r=N.default.join(O(t),"phases"),s=de(e),i=null;try{let g=E.default.readdirSync(r,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).sort((h,S)=>$e(h,S)).find(h=>h.startsWith(s));g&&(i=N.default.join(r,g))}catch{}if(!i){y({phase:s,error:"Phase not found",plans:[],waves:{},incomplete:[],has_checkpoints:!1},n);return}let o=E.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=E.default.readFileSync(N.default.join(i,f),"utf-8"),S=oe(h),x=h.match(/<task[\s>]/gi)||[],b=h.match(/##\s*Task\s*\d+/gi)||[],P=x.length||b.length,k=parseInt(String(S.wave),10)||1,$=!0;S.autonomous!==void 0&&($=S.autonomous==="true"||S.autonomous===!0),$||(p=!0);let M=[],A=S.files_modified??S["files-modified"];if(A){let U=we(A);M=U?U.map(Y=>ue(Y)??String(Y)):[ue(A)??String(A)]}let W=l.has(g);W||m.push(g),d.push({id:g,wave:k,autonomous:$,objective:h.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()??ue(S.objective)??null,files_modified:M,task_count:P,has_summary:W});let F=String(k);u[F]||(u[F]=[]),u[F].push(g)}y({phase:s,plans:d,waves:u,incomplete:m,has_checkpoints:p},n)}function Oo(t,e,n,r){e||v("description required for phase add");let s=X(t),i=N.default.join(O(t),"ROADMAP.md");E.default.existsSync(i)||v("ROADMAP.md not found");let o=E.default.readFileSync(i,"utf-8"),a=ve(o,t),c=Le(e),l,d;if(r||s.phase_naming==="custom")l=r||c.toUpperCase().replace(/-/g,"-"),l||v('--id required when phase_naming is "custom"'),d=`${l}-${c}`;else{let h=/#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi,S=0,x;for(;(x=h.exec(a))!==null;){let P=parseInt(x[1],10);P>S&&(S=P)}l=S+1,d=`${String(l).padStart(2,"0")}-${c}`}let u=N.default.join(O(t),"phases",d);E.default.mkdirSync(u,{recursive:!0}),E.default.writeFileSync(N.default.join(u,".gitkeep"),"");let m=s.phase_naming==="custom"?"":`
184
+ **Depends on:** Phase ${typeof l=="number"?l-1:"TBD"}`,p=`
185
185
  ### Phase ${l}: ${e}
186
186
 
187
187
  **Goal:** [To be planned]
188
- **Requirements**: TBD${p}
188
+ **Requirements**: TBD${m}
189
189
  **Plans:** 0 plans
190
190
 
191
191
  Plans:
192
192
  - [ ] TBD (run /gsd-plan-phase ${l} to break down)
193
193
  `,f=o.lastIndexOf(`
194
- ---`),g=f>0?o.slice(0,f)+m+o.slice(f):o+m;M.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:G(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 No(t,e,n,r){(!e||!n)&&b("after-phase and description required for phase insert");let s=q.default.join(W(t),"ROADMAP.md");M.default.existsSync(s)||b("ROADMAP.md not found");let i=M.default.readFileSync(s,"utf-8"),o=_e(i,t),a=Le(n),d=me(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 p=q.default.join(W(t),"phases"),m=me(e),f=[];try{let I=M.default.readdirSync(p,{withFileTypes:!0}).filter(V=>V.isDirectory()).map(V=>V.name),R=new RegExp(`^${m}\\.(\\d+)`);for(let V of I){let X=V.match(R);X&&f.push(parseInt(X[1],10))}}catch{}let g=f.length===0?1:Math.max(...f)+1,h=`${m}.${g}`,x=`${h}-${a}`,S=q.default.join(W(t),"phases",x);M.default.mkdirSync(S,{recursive:!0}),M.default.writeFileSync(q.default.join(S,".gitkeep"),"");let v=`
194
+ ---`),g=f>0?o.slice(0,f)+p+o.slice(f):o+p;E.default.writeFileSync(i,g,"utf-8"),y({phase_number:typeof l=="number"?l:String(l),padded:typeof l=="number"?String(l).padStart(2,"0"):String(l),name:e,slug:c,directory:B(N.default.join(N.default.relative(t,O(t)),"phases",d)),naming_mode:s.phase_naming},n,typeof l=="number"?String(l).padStart(2,"0"):String(l))}function No(t,e,n,r){(!e||!n)&&v("after-phase and description required for phase insert");let s=N.default.join(O(t),"ROADMAP.md");E.default.existsSync(s)||v("ROADMAP.md not found");let i=E.default.readFileSync(s,"utf-8"),o=ve(i,t),a=Le(n),d=de(e).replace(/^0+/,"").replace(/\./g,"\\.");new RegExp(`#{2,4}\\s*Phase\\s+0*${d}:`,"i").test(o)||v(`Phase ${e} not found in ROADMAP.md`);let m=N.default.join(O(t),"phases"),p=de(e),f=[];try{let F=E.default.readdirSync(m,{withFileTypes:!0}).filter(Y=>Y.isDirectory()).map(Y=>Y.name),U=new RegExp(`^${p}\\.(\\d+)`);for(let Y of F){let le=Y.match(U);le&&f.push(parseInt(le[1],10))}}catch{}let g=f.length===0?1:Math.max(...f)+1,h=`${p}.${g}`,S=`${h}-${a}`,x=N.default.join(O(t),"phases",S);E.default.mkdirSync(x,{recursive:!0}),E.default.writeFileSync(N.default.join(x,".gitkeep"),"");let b=`
195
195
  ### Phase ${h}: ${n} (INSERTED)
196
196
 
197
197
  **Goal:** [Urgent work - to be planned]
@@ -201,29 +201,29 @@ Plans:
201
201
 
202
202
  Plans:
203
203
  - [ ] TBD (run /gsd-plan-phase ${h} to break down)
204
- `,P=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),k=i.match(P);k||b(`Could not find Phase ${e} header`);let $=i.indexOf(k[0]),C=i.slice($+k[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),j=C?$+k[0].length+C.index:i.length;M.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:G(q.default.join(q.default.relative(t,W(t)),"phases",x))},r,h)}function Wo(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}`;M.default.renameSync(q.default.join(t,a.dir),q.default.join(t,u)),r.push({from:a.dir,to:u});for(let p of M.default.readdirSync(q.default.join(t,u)))if(p.includes(l)){let m=p.replace(l,d);M.default.renameSync(q.default.join(t,u,p),q.default.join(t,u,m)),s.push({from:p,to:m})}}return{renamedDirs:r,renamedFiles:s}}function qo(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}`,p=`${a}${l}${d}`,m=`${p}-${i.slug}`;M.default.renameSync(q.default.join(t,i.dir),q.default.join(t,m)),n.push({from:i.dir,to:m});for(let f of M.default.readdirSync(q.default.join(t,m)))if(f.startsWith(u)){let g=p+f.slice(u.length);M.default.renameSync(q.default.join(t,m,f),q.default.join(t,m,g)),r.push({from:f,to:g})}}return{renamedDirs:n,renamedFiles:r}}function Lo(t,e,n,r){let s=M.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}`)}M.default.writeFileSync(t,s,"utf-8")}function Uo(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");M.default.existsSync(s)||b("ROADMAP.md not found");let o=me(e),a=e.includes("."),c=n.force||!1,l=Ue(i,!0).find(m=>m.startsWith(o+"-")||m===o)||null;if(l&&!c){let m=M.default.readdirSync(q.default.join(i,l)).filter(f=>f.endsWith("-SUMMARY.md")||f==="SUMMARY.md");m.length>0&&b(`Phase ${e} has ${m.length} executed plan(s). Use --force to remove anyway.`)}l&&M.default.rmSync(q.default.join(i,l),{recursive:!0,force:!0});let d=[],u=[];try{let m=a?Wo(i,o.split(".")[0],parseInt(o.split(".")[1],10)):qo(i,parseInt(o,10));d=m.renamedDirs,u=m.renamedFiles}catch{}Lo(s,e,a,parseInt(o,10));let p=q.default.join(W(t),"STATE.md");if(M.default.existsSync(p)){let m=M.default.readFileSync(p,"utf-8"),f=Y(m,"Total Phases");f&&(m=Pe(m,"Total Phases",String(parseInt(f,10)-1))??m);let g=m.match(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i);g&&(m=m.replace(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i,`$1${parseInt(g[2],10)-1}$3`)),oe(p,m,t)}y({removed:e,directory_deleted:l,renamed_directories:d,renamed_files:u,roadmap_updated:!0,state_updated:M.default.existsSync(p)},r)}function Vo(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=me(e),a=new Date().toISOString().split("T")[0],c=ge(t,e);c||b(`Phase ${e} not found`);let l=c.plans.length,d=c.summaries.length,u=!1,p=[];try{let h=q.default.join(t,c.directory),x=M.default.readdirSync(h);for(let S of x.filter(v=>v.includes("-UAT")&&v.endsWith(".md"))){let v=M.default.readFileSync(q.default.join(h,S),"utf-8");/result: pending/.test(v)&&p.push(`${S}: has pending tests`),/result: blocked/.test(v)&&p.push(`${S}: has blocked tests`),/status: partial/.test(v)&&p.push(`${S}: testing incomplete (partial)`),/status: diagnosed/.test(v)&&p.push(`${S}: has diagnosed gaps`)}for(let S of x.filter(v=>v.includes("-VERIFICATION")&&v.endsWith(".md"))){let v=M.default.readFileSync(q.default.join(h,S),"utf-8");/status: human_needed/.test(v)&&p.push(`${S}: needs human verification`),/status: gaps_found/.test(v)&&p.push(`${S}: has unresolved gaps`)}}catch{}if(M.default.existsSync(r)){let h=M.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"),P=>{let k=P.split("|").slice(1,-1);return k.length===5?(k[3]=" Complete ",k[4]=` ${a} `):k.length===4&&(k[2]=" Complete ",k[3]=` ${a} `),"|"+k.join("|")+"|"}),h=lt(h,new RegExp(`(#{2,4}\\s*Phase\\s+${S}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${l} plans complete`),M.default.writeFileSync(r,h,"utf-8");let v=q.default.join(W(t),"REQUIREMENTS.md");if(M.default.existsSync(v)){let k=_e(h,t).match(new RegExp(`(#{2,4}\\s*Phase\\s+${re(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),D=(k?k[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(D){let C=D[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(I=>I.trim()).filter(Boolean),j=M.default.readFileSync(v,"utf-8");for(let I of C){let R=re(I);j=j.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${R}\\*\\*)`,"gi"),"$1x$2"),j=j.replace(new RegExp(`(\\|\\s*${R}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}M.default.writeFileSync(v,j,"utf-8"),u=!0}}}let m=null,f=null,g=!0;try{let h=we(t),x=M.default.readdirSync(i,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).filter(h).sort((S,v)=>Ae(S,v));for(let S of x){let v=S.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(v&&Ae(v[1],e)>0){m=v[1],f=v[2]||null,g=!1;break}}}catch{}if(g&&M.default.existsSync(r))try{let h=_e(M.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(Ae(S[1],e)>0){m=S[1],f=S[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),g=!1;break}}catch{}if(M.default.existsSync(s)){let h=M.default.readFileSync(s,"utf-8"),x=m||e,S=Y(h,"Current Phase")||Y(h,"Phase"),v=String(x);if(S){let k=S.match(/of\s+(\d+)/),$=S.match(/\(([^)]+)\)/);if(k){let D=f?` (${f.replace(/-/g," ")})`:$?` (${$[1]})`:"";v=`${x} of ${k[1]}${D}`}}h=Se(h,"Current Phase","Phase",v),f&&(h=Se(h,"Current Phase Name",null,f.replace(/-/g," "))),h=Se(h,"Status",null,g?"Milestone complete":"Ready to plan"),h=Se(h,"Current Plan","Plan","Not started"),h=Se(h,"Last Activity","Last activity",a),h=Se(h,"Last Activity Description",null,`Phase ${e} complete${m?`, transitioned to Phase ${m}`:""}`);let P=Y(h,"Completed Phases");if(P){let k=parseInt(P,10)+1;h=Pe(h,"Completed Phases",String(k))??h;let $=Y(h,"Total Phases");if($){let D=parseInt($,10);if(D>0){let C=Math.round(k/D*100);h=Pe(h,"Progress",`${C}%`)??h,h=h.replace(/(percent:\s*)\d+/,`$1${C}`)}}}oe(s,h,t)}y({completed_phase:e,phase_name:c.phase_name,plans_executed:`${d}/${l}`,next_phase:m,next_phase_name:f,is_last_phase:g,date:a,roadmap_updated:M.default.existsSync(r),state_updated:M.default.existsSync(s),requirements_updated:u,warnings:p,has_warnings:p.length>0},n)}var M,q,et=L(()=>{"use strict";M=U(require("fs")),q=U(require("path"));he();Ve();Re()});var Ge,Fn,Mn,In,Tn,Dn,On,Rr=L(()=>{"use strict";Ge=require("@oclif/core");je();Fn=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)}},Mn=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)}},In=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)}},Tn=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)}},Dn=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)}},On=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 Nn={};ye(Nn,{cmdMilestoneComplete:()=>Bo,cmdRequirementsMarkComplete:()=>zo});function zo(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=E(t).requirements;if(!J.default.existsSync(s)){y({updated:!1,reason:"REQUIREMENTS.md not found",ids:r},n,"no requirements file");return}let i=J.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&&J.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 Bo(t,e,n,r){e||b("version required for milestone complete (e.g., v1.0)");let s=E(t).roadmap,i=E(t).requirements,o=E(t).state,a=$e.default.join(t,".planning","MILESTONES.md"),c=$e.default.join(t,".planning","milestones"),l=E(t).phases,d=new Date().toISOString().split("T")[0],u=n.name||e;J.default.mkdirSync(c,{recursive:!0});let p=we(t),m=0,f=0,g=0,h=[];try{let k=J.default.readdirSync(l,{withFileTypes:!0}).filter($=>$.isDirectory()).map($=>$.name).sort();for(let $ of k){if(!p($))continue;m++;let D=J.default.readdirSync($e.default.join(l,$)),C=D.filter(I=>I.endsWith("-PLAN.md")||I==="PLAN.md"),j=D.filter(I=>I.endsWith("-SUMMARY.md")||I==="SUMMARY.md");f+=C.length;for(let I of j)try{let R=J.default.readFileSync($e.default.join(l,$,I),"utf-8"),V=le(R),X=pe(V["one-liner"])??Ut(R);X&&h.push(X);let ae=R.match(/\*\*Tasks:\*\*\s*(\d+)/);if(ae)g+=parseInt(ae[1],10);else{let K=R.match(/<task[\s>]/gi)||[],se=R.match(/##\s*Task\s*\d+/gi)||[];g+=K.length||se.length}}catch{}}}catch{}J.default.existsSync(s)&&J.default.writeFileSync($e.default.join(c,`${e}-ROADMAP.md`),J.default.readFileSync(s,"utf-8"),"utf-8"),J.default.existsSync(i)&&J.default.writeFileSync($e.default.join(c,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
204
+ `,P=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),k=i.match(P);k||v(`Could not find Phase ${e} header`);let $=i.indexOf(k[0]),A=i.slice($+k[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),W=A?$+k[0].length+A.index:i.length;E.default.writeFileSync(s,i.slice(0,W)+b+i.slice(W),"utf-8"),y({phase_number:h,after_phase:e,name:n,slug:a,directory:B(N.default.join(N.default.relative(t,O(t)),"phases",S))},r,h)}function Wo(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}`;E.default.renameSync(N.default.join(t,a.dir),N.default.join(t,u)),r.push({from:a.dir,to:u});for(let m of E.default.readdirSync(N.default.join(t,u)))if(m.includes(l)){let p=m.replace(l,d);E.default.renameSync(N.default.join(t,u,m),N.default.join(t,u,p)),s.push({from:m,to:p})}}return{renamedDirs:r,renamedFiles:s}}function qo(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}`;E.default.renameSync(N.default.join(t,i.dir),N.default.join(t,p)),n.push({from:i.dir,to:p});for(let f of E.default.readdirSync(N.default.join(t,p)))if(f.startsWith(u)){let g=m+f.slice(u.length);E.default.renameSync(N.default.join(t,p,f),N.default.join(t,p,g)),r.push({from:f,to:g})}}return{renamedDirs:n,renamedFiles:r}}function Lo(t,e,n,r){let s=E.default.readFileSync(t,"utf-8"),i=ne(e);if(s=s.replace(new RegExp(`\\n?#{2,4}\\s*Phase\\s+${i}\\s*:[\\s\\S]*?(?=\\n#{2,4}\\s+Phase\\s+\\d|$)`,"i"),""),s=s.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${i}[:\\s][^\\n]*`,"gi"),""),s=s.replace(new RegExp(`\\n?\\|\\s*${i}\\.?\\s[^|]*\\|[^\\n]*`,"gi"),""),!n)for(let o=99;o>r;o--){let a=o-1,c=String(o),l=String(a),d=c.padStart(2,"0"),u=l.padStart(2,"0");s=s.replace(new RegExp(`(#{2,4}\\s*Phase\\s+)${c}(\\s*:)`,"gi"),`$1${l}$2`),s=s.replace(new RegExp(`(Phase\\s+)${c}([:\\s])`,"g"),`$1${l}$2`),s=s.replace(new RegExp(`${d}-(\\d{2})`,"g"),`${u}-$1`),s=s.replace(new RegExp(`(\\|\\s*)${c}\\.\\s`,"g"),`$1${l}. `),s=s.replace(new RegExp(`(Depends on:\\*\\*\\s*Phase\\s+)${c}\\b`,"gi"),`$1${l}`)}E.default.writeFileSync(t,s,"utf-8")}function Uo(t,e,n,r){e||v("phase number required for phase remove");let s=N.default.join(O(t),"ROADMAP.md"),i=N.default.join(O(t),"phases");E.default.existsSync(s)||v("ROADMAP.md not found");let o=de(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=E.default.readdirSync(N.default.join(i,l)).filter(f=>f.endsWith("-SUMMARY.md")||f==="SUMMARY.md");p.length>0&&v(`Phase ${e} has ${p.length} executed plan(s). Use --force to remove anyway.`)}l&&E.default.rmSync(N.default.join(i,l),{recursive:!0,force:!0});let d=[],u=[];try{let p=a?Wo(i,o.split(".")[0],parseInt(o.split(".")[1],10)):qo(i,parseInt(o,10));d=p.renamedDirs,u=p.renamedFiles}catch{}Lo(s,e,a,parseInt(o,10));let m=N.default.join(O(t),"STATE.md");if(E.default.existsSync(m)){let p=E.default.readFileSync(m,"utf-8"),f=J(p,"Total Phases");f&&(p=ke(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`)),re(m,p,t)}y({removed:e,directory_deleted:l,renamed_directories:d,renamed_files:u,roadmap_updated:!0,state_updated:E.default.existsSync(m)},r)}function Vo(t,e,n){e||v("phase number required for phase complete");let r=N.default.join(O(t),"ROADMAP.md"),s=N.default.join(O(t),"STATE.md"),i=N.default.join(O(t),"phases"),o=de(e),a=new Date().toISOString().split("T")[0],c=fe(t,e);c||v(`Phase ${e} not found`);let l=c.plans.length,d=c.summaries.length,u=!1,m=[];try{let h=N.default.join(t,c.directory),S=E.default.readdirSync(h);for(let x of S.filter(b=>b.includes("-UAT")&&b.endsWith(".md"))){let b=E.default.readFileSync(N.default.join(h,x),"utf-8");/result: pending/.test(b)&&m.push(`${x}: has pending tests`),/result: blocked/.test(b)&&m.push(`${x}: has blocked tests`),/status: partial/.test(b)&&m.push(`${x}: testing incomplete (partial)`),/status: diagnosed/.test(b)&&m.push(`${x}: has diagnosed gaps`)}for(let x of S.filter(b=>b.includes("-VERIFICATION")&&b.endsWith(".md"))){let b=E.default.readFileSync(N.default.join(h,x),"utf-8");/status: human_needed/.test(b)&&m.push(`${x}: needs human verification`),/status: gaps_found/.test(b)&&m.push(`${x}: has unresolved gaps`)}}catch{}if(E.default.existsSync(r)){let h=E.default.readFileSync(r,"utf-8"),S=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${ne(e)}[:\\s][^\\n]*)`,"i");h=lt(h,S,`$1x$2 (completed ${a})`);let x=ne(e);h=h.replace(new RegExp(`^(\\|\\s*${x}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),P=>{let k=P.split("|").slice(1,-1);return k.length===5?(k[3]=" Complete ",k[4]=` ${a} `):k.length===4&&(k[2]=" Complete ",k[3]=` ${a} `),"|"+k.join("|")+"|"}),h=lt(h,new RegExp(`(#{2,4}\\s*Phase\\s+${x}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${l} plans complete`),E.default.writeFileSync(r,h,"utf-8");let b=N.default.join(O(t),"REQUIREMENTS.md");if(E.default.existsSync(b)){let k=ve(h,t).match(new RegExp(`(#{2,4}\\s*Phase\\s+${ne(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),M=(k?k[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(M){let A=M[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(F=>F.trim()).filter(Boolean),W=E.default.readFileSync(b,"utf-8");for(let F of A){let U=ne(F);W=W.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${U}\\*\\*)`,"gi"),"$1x$2"),W=W.replace(new RegExp(`(\\|\\s*${U}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}E.default.writeFileSync(b,W,"utf-8"),u=!0}}}let p=null,f=null,g=!0;try{let h=_e(t),S=E.default.readdirSync(i,{withFileTypes:!0}).filter(x=>x.isDirectory()).map(x=>x.name).filter(h).sort((x,b)=>$e(x,b));for(let x of S){let b=x.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(b&&$e(b[1],e)>0){p=b[1],f=b[2]||null,g=!1;break}}}catch{}if(g&&E.default.existsSync(r))try{let h=ve(E.default.readFileSync(r,"utf-8"),t),S=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,x;for(;(x=S.exec(h))!==null;)if($e(x[1],e)>0){p=x[1],f=x[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),g=!1;break}}catch{}if(E.default.existsSync(s)){let h=E.default.readFileSync(s,"utf-8"),S=p||e,x=J(h,"Current Phase")||J(h,"Phase"),b=String(S);if(x){let k=x.match(/of\s+(\d+)/),$=x.match(/\(([^)]+)\)/);if(k){let M=f?` (${f.replace(/-/g," ")})`:$?` (${$[1]})`:"";b=`${S} of ${k[1]}${M}`}}h=ye(h,"Current Phase","Phase",b),f&&(h=ye(h,"Current Phase Name",null,f.replace(/-/g," "))),h=ye(h,"Status",null,g?"Milestone complete":"Ready to plan"),h=ye(h,"Current Plan","Plan","Not started"),h=ye(h,"Last Activity","Last activity",a),h=ye(h,"Last Activity Description",null,`Phase ${e} complete${p?`, transitioned to Phase ${p}`:""}`);let P=J(h,"Completed Phases");if(P){let k=parseInt(P,10)+1;h=ke(h,"Completed Phases",String(k))??h;let $=J(h,"Total Phases");if($){let M=parseInt($,10);if(M>0){let A=Math.round(k/M*100);h=ke(h,"Progress",`${A}%`)??h,h=h.replace(/(percent:\s*)\d+/,`$1${A}`)}}}re(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:E.default.existsSync(r),state_updated:E.default.existsSync(s),requirements_updated:u,warnings:m,has_warnings:m.length>0},n)}var E,N,et=q(()=>{"use strict";E=L(require("fs")),N=L(require("path"));ge();Ve();je()});var Ge,Fn,Mn,In,Tn,Dn,On,Rr=q(()=>{"use strict";Ge=require("@oclif/core");Ce();Fn=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)}},Mn=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)}},In=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)}},Tn=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)}},Dn=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)}},On=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 Nn={};he(Nn,{cmdMilestoneComplete:()=>Bo,cmdRequirementsMarkComplete:()=>zo});function zo(t,e,n){(!e||e.length===0)&&v("requirement IDs required.");let r=e.join(" ").replace(/[[\]]/g,"").split(/[,\s]+/).map(l=>l.trim()).filter(Boolean);r.length===0&&v("no valid requirement IDs found");let s=j(t).requirements;if(!G.default.existsSync(s)){y({updated:!1,reason:"REQUIREMENTS.md not found",ids:r},n,"no requirements file");return}let i=G.default.readFileSync(s,"utf-8"),o=[],a=[],c=[];for(let l of r){let d=!1,u=ne(l);new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${u}\\*\\*)`,"gi").test(i)&&(i=i.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${u}\\*\\*)`,"gi"),"$1x$2"),d=!0),new RegExp(`(\\|\\s*${u}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi").test(i)&&(i=i.replace(new RegExp(`(\\|\\s*${u}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`,"gi"),"$1 Complete $2"),d=!0),d?o.push(l):new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${u}\\*\\*`,"gi").test(i)||new RegExp(`\\|\\s*${u}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`,"gi").test(i)?a.push(l):c.push(l)}o.length>0&&G.default.writeFileSync(s,i,"utf-8"),y({updated:o.length>0,marked_complete:o,already_complete:a,not_found:c,total:r.length},n,`${o.length}/${r.length} requirements marked complete`)}function Bo(t,e,n,r){e||v("version required for milestone complete (e.g., v1.0)");let s=j(t).roadmap,i=j(t).requirements,o=j(t).state,a=Pe.default.join(t,".planning","MILESTONES.md"),c=Pe.default.join(t,".planning","milestones"),l=j(t).phases,d=new Date().toISOString().split("T")[0],u=n.name||e;G.default.mkdirSync(c,{recursive:!0});let m=_e(t),p=0,f=0,g=0,h=[];try{let k=G.default.readdirSync(l,{withFileTypes:!0}).filter($=>$.isDirectory()).map($=>$.name).sort();for(let $ of k){if(!m($))continue;p++;let M=G.default.readdirSync(Pe.default.join(l,$)),A=M.filter(F=>F.endsWith("-PLAN.md")||F==="PLAN.md"),W=M.filter(F=>F.endsWith("-SUMMARY.md")||F==="SUMMARY.md");f+=A.length;for(let F of W)try{let U=G.default.readFileSync(Pe.default.join(l,$,F),"utf-8"),Y=oe(U),le=ue(Y["one-liner"])??Ut(U);le&&h.push(le);let be=U.match(/\*\*Tasks:\*\*\s*(\d+)/);if(be)g+=parseInt(be[1],10);else{let te=U.match(/<task[\s>]/gi)||[],pe=U.match(/##\s*Task\s*\d+/gi)||[];g+=te.length||pe.length}}catch{}}}catch{}G.default.existsSync(s)&&G.default.writeFileSync(Pe.default.join(c,`${e}-ROADMAP.md`),G.default.readFileSync(s,"utf-8"),"utf-8"),G.default.existsSync(i)&&G.default.writeFileSync(Pe.default.join(c,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
205
205
 
206
206
  **Archived:** ${d}
207
207
  **Status:** SHIPPED
208
208
 
209
209
  ---
210
210
 
211
- `+J.default.readFileSync(i,"utf-8"),"utf-8");let x=$e.default.join(t,".planning",`${e}-MILESTONE-AUDIT.md`);J.default.existsSync(x)&&J.default.renameSync(x,$e.default.join(c,`${e}-MILESTONE-AUDIT.md`));let S=h.map(k=>`- ${k}`).join(`
212
- `),v=`## ${e} ${u} (Shipped: ${d})
211
+ `+G.default.readFileSync(i,"utf-8"),"utf-8");let S=Pe.default.join(t,".planning",`${e}-MILESTONE-AUDIT.md`);G.default.existsSync(S)&&G.default.renameSync(S,Pe.default.join(c,`${e}-MILESTONE-AUDIT.md`));let x=h.map(k=>`- ${k}`).join(`
212
+ `),b=`## ${e} ${u} (Shipped: ${d})
213
213
 
214
- **Phases completed:** ${m} phases, ${f} plans, ${g} tasks
214
+ **Phases completed:** ${p} phases, ${f} plans, ${g} tasks
215
215
 
216
216
  **Key accomplishments:**
217
- ${S||"- (none recorded)"}
217
+ ${x||"- (none recorded)"}
218
218
 
219
219
  ---
220
220
 
221
- `;if(J.default.existsSync(a)){let k=J.default.readFileSync(a,"utf-8");if(!k.trim())J.default.writeFileSync(a,Ie(`# Milestones
221
+ `;if(G.default.existsSync(a)){let k=G.default.readFileSync(a,"utf-8");if(!k.trim())G.default.writeFileSync(a,Me(`# Milestones
222
222
 
223
- ${v}`),"utf-8");else{let $=k.match(/^(#{1,3}\s+[^\n]*\n\n?)/);$?J.default.writeFileSync(a,Ie($[1]+v+k.slice($[1].length)),"utf-8"):J.default.writeFileSync(a,Ie(v+k),"utf-8")}}else J.default.writeFileSync(a,Ie(`# Milestones
223
+ ${b}`),"utf-8");else{let $=k.match(/^(#{1,3}\s+[^\n]*\n\n?)/);$?G.default.writeFileSync(a,Me($[1]+b+k.slice($[1].length)),"utf-8"):G.default.writeFileSync(a,Me(b+k),"utf-8")}}else G.default.writeFileSync(a,Me(`# Milestones
224
224
 
225
- ${v}`),"utf-8");if(J.default.existsSync(o)){let k=J.default.readFileSync(o,"utf-8");k=Se(k,"Status",null,`${e} milestone complete`),k=Se(k,"Last Activity","Last activity",d),k=Se(k,"Last Activity Description",null,`${e} milestone completed and archived`),oe(o,k,t)}let P=!1;if(n.archivePhases)try{let k=$e.default.join(c,`${e}-phases`);J.default.mkdirSync(k,{recursive:!0});let $=J.default.readdirSync(l,{withFileTypes:!0}).filter(C=>C.isDirectory()).map(C=>C.name),D=0;for(let C of $)p(C)&&(J.default.renameSync($e.default.join(l,C),$e.default.join(k,C)),D++);P=D>0}catch{}y({version:e,name:u,date:d,phases:m,plans:f,tasks:g,accomplishments:h,archived:{roadmap:J.default.existsSync($e.default.join(c,`${e}-ROADMAP.md`)),requirements:J.default.existsSync($e.default.join(c,`${e}-REQUIREMENTS.md`)),audit:J.default.existsSync($e.default.join(c,`${e}-MILESTONE-AUDIT.md`)),phases:P},milestones_updated:!0,state_updated:J.default.existsSync(o)},r)}var J,$e,Wn=L(()=>{"use strict";J=U(require("fs")),$e=U(require("path"));he();Ve();Re()});var Vt,qn,Ln,Er=L(()=>{"use strict";Vt=require("@oclif/core");je();qn=class t extends w{static description="Complete the current milestone";static args={version:Vt.Args.string({required:!1})};static flags={...w.baseFlags,name:Vt.Flags.string({description:"Milestone name"}),"archive-phases":Vt.Flags.boolean({description:"Archive phases",default:!1})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdMilestoneComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n.version??"",{name:e.name??null,archivePhases:e["archive-phases"]},s)}},Ln=class t extends w{static description="Mark requirements as complete";static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdRequirementsMarkComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n,s)}}});var _,Fr,Qc,el,tl,nl,Go,sl,Jo,Yo,Ho,Un,Mr=L(()=>{"use strict";_=require("zod"),Fr=_.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(),Qc=_.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(),el=_.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(),tl=_.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(),nl=_.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(),Go=_.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(),sl=_.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(Go)}).passthrough(),Jo=_.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(),Yo=_.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(),Ho=_.z.object({context_warnings:_.z.boolean().default(!0),workflow_guard:_.z.boolean().default(!1)}).passthrough(),Un=_.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:Jo.default({}),workflow:Yo.default({}),hooks:Ho.default({}),agent_skills:_.z.record(_.z.string(),_.z.unknown()).default({})}).passthrough()});var jt={};ye(jt,{cmdValidateAgents:()=>oa,cmdValidateConsistency:()=>ra,cmdValidateHealth:()=>ia,cmdVerifyArtifacts:()=>na,cmdVerifyCommits:()=>ta,cmdVerifyKeyLinks:()=>sa,cmdVerifyPhaseCompleteness:()=>Qo,cmdVerifyPlanStructure:()=>Ko,cmdVerifyReferences:()=>ea,cmdVerifySummary:()=>Zo});function Xo(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}function Zo(t,e,n,r){e||b("summary-path required");let s=ee.default.join(t,e),i=n||2;if(!te.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=te.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=>!te.default.existsSync(ee.default.join(t,g))),u=o.match(/\b[0-9a-f]{7,40}\b/g)||[],p=!1;for(let g of u.slice(0,3))if(de(t,["cat-file","-t",g]).stdout==="commit"){p=!0;break}let m="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)?m="failed":/(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i.test(g)&&(m="passed")}d.length>0&&a.push("Missing files: "+d.join(", ")),!p&&u.length>0&&a.push("Referenced commit hashes not found in git history"),m==="failed"&&a.push("Self-check section indicates failure");let f=d.length===0&&m!=="failed";y({passed:f,checks:{summary_exists:!0,files_created:{checked:l.length,found:l.length-d.length,missing:d},commits_exist:p,self_check:m},errors:a},r,f?"passed":"failed")}function Ko(t,e,n){e||b("file path required");let r=ee.default.isAbsolute(e)?e:ee.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 p of["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"])i[p]===void 0&&o.push(`Missing required frontmatter field: ${p}`);let c=/<task[^>]*>([\s\S]*?)<\/task>/g,l=[],d;for(;(d=c.exec(s))!==null;){let p=d[1],m=p.match(/<name>([\s\S]*?)<\/name>/),f=m?m[1].trim():"unnamed",g=/<files>/.test(p),h=/<action>/.test(p),x=/<verify>/.test(p),S=/<done>/.test(p);m||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 Qo(t,e,n){e||b("phase required");let r=ge(t,e);if(!r?.found){y({error:"Phase not found",phase:e},n);return}let s=ee.default.join(t,r.directory),i=[],o=[],a;try{a=te.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,""))),p=[...d].filter(f=>!u.has(f)),m=[...u].filter(f=>!d.has(f));p.length>0&&i.push(`Plans without summaries: ${p.join(", ")}`),m.length>0&&o.push(`Summaries without plans: ${m.join(", ")}`),y({complete:i.length===0,phase:r.phase_number,plan_count:c.length,summary_count:l.length,incomplete_plans:p,orphan_summaries:m,errors:i,warnings:o},n,i.length===0?"complete":"incomplete")}function ea(t,e,n){e||b("file path required");let r=ee.default.isAbsolute(e)?e:ee.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("~/")?ee.default.join(process.env.HOME??"",c.slice(2)):ee.default.join(t,c);(te.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)||(te.default.existsSync(ee.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 ta(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 na(t,e,n){e||b("plan file path required");let r=ee.default.isAbsolute(e)?e:ee.default.join(t,e),s=Ne(r);if(!s){y({error:"File not found",path:e},n);return}let i=on(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=ee.default.join(t,l.path),u=te.default.existsSync(d),p={path:l.path,exists:u,issues:[],passed:!1};if(u){let m=Ne(d)??"",f=m.split(`
226
- `).length;if(l.min_lines&&f<l.min_lines&&p.issues.push(`Only ${f} lines, need ${l.min_lines}`),l.contains&&!m.includes(l.contains)&&p.issues.push(`Missing pattern: ${l.contains}`),l.exports){let g=Array.isArray(l.exports)?l.exports:[l.exports];for(let h of g)m.includes(h)||p.issues.push(`Missing export: ${h}`)}p.passed=p.issues.length===0}else p.issues.push("File not found");o.push(p)}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 sa(t,e,n){e||b("plan file path required");let r=ee.default.isAbsolute(e)?e:ee.default.join(t,e),s=Ne(r);if(!s){y({error:"File not found",path:e},n);return}let i=on(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(ee.default.join(t,l.from||""));if(!u)d.detail="Source file not found";else if(l.pattern)try{let p=new RegExp(l.pattern);if(p.test(u))d.verified=!0,d.detail="Pattern found in source";else{let m=Ne(ee.default.join(t,l.to||""));m&&p.test(m)?(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 ra(t,e){let n=ee.default.join(W(t),"ROADMAP.md"),r=ee.default.join(W(t),"phases"),s=[],i=[];if(!te.default.existsSync(n)){s.push("ROADMAP.md not found"),y({passed:!1,errors:s,warnings:i},e,"failed");return}let o=_e(te.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{te.default.readdirSync(r,{withFileTypes:!0}).filter(m=>m.isDirectory()).map(m=>m.name).forEach(m=>{let f=m.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);f&&d.add(f[1])})}catch{}for(let m of a)!d.has(m)&&!d.has(me(m))&&i.push(`Phase ${m} in ROADMAP.md but no directory on disk`);for(let m of d){let f=String(parseInt(m,10));!a.has(m)&&!a.has(f)&&i.push(`Phase ${m} exists on disk but not in ROADMAP.md`)}if(Z(t).phase_naming!=="custom"){let m=[...d].filter(f=>!f.includes(".")).map(f=>parseInt(f,10)).sort((f,g)=>f-g);for(let f=1;f<m.length;f++)m[f]!==m[f-1]+1&&i.push(`Gap in phase numbering: ${m[f-1]} \u2192 ${m[f]}`)}let p=s.length===0;y({passed:p,errors:s,warnings:i,warning_count:i.length},e,p?"passed":"failed")}function ia(t,e,n){let r=ee.default.resolve(t);if(r===Ir.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=Q(t),o=ee.default.join(i,"PROJECT.md"),a=ee.default.join(s,"ROADMAP.md"),c=ee.default.join(s,"STATE.md"),l=ee.default.join(i,"config.json"),d=ee.default.join(s,"phases"),u=[],p=[],m=[],f=[],g=(S,v,P,k,$=!1,D)=>{let C={code:v,message:P,fix:k,repairable:$,...D};S==="error"?u.push(C):S==="warning"?p.push(C):m.push(C)};if(!te.default.existsSync(s)){g("error","E001",".planning/ directory not found","Run /gsd-new-project to initialize"),y({status:"broken",errors:u,warnings:p,info:m,repairable_count:0},n);return}if(!te.default.existsSync(o))g("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let S=te.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(te.default.existsSync(a)||g("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!te.default.existsSync(c))g("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),f.push("regenerateState");else try{let S=te.default.readFileSync(c,"utf-8"),v=le(S),P=Fr.safeParse(v);if(!P.success){for(let k of P.error.issues){let $=k.path.join(".")||"(root)";g("warning","W011",`STATE.md frontmatter: field "${$}" - ${k.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}f.includes("regenerateState")||f.push("regenerateState")}}catch{}if(!te.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(te.default.readFileSync(l,"utf-8")),v=Un.safeParse(S);if(!v.success){for(let P of v.error.issues){let k=P.path.join(".")||"(root)",$=Xo(S,P.path);g("warning","W005",`config.json: field "${k}" - ${P.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:k,expected:P.message,actual:$})}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=Un.parse({});te.default.writeFileSync(l,JSON.stringify(v,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="fixSchemaDefaults"&&te.default.existsSync(l)){let v=JSON.parse(te.default.readFileSync(l,"utf-8")),P=Un.parse(v);te.default.writeFileSync(l,JSON.stringify(P,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="regenerateState"){if(te.default.existsSync(c)){let P=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),k=`${c}.bak-${P}`;te.default.copyFileSync(c,k),h.push({action:"backupState",success:!0,path:k})}let v=ce(t);oe(c,`# Session State
225
+ ${b}`),"utf-8");if(G.default.existsSync(o)){let k=G.default.readFileSync(o,"utf-8");k=ye(k,"Status",null,`${e} milestone complete`),k=ye(k,"Last Activity","Last activity",d),k=ye(k,"Last Activity Description",null,`${e} milestone completed and archived`),re(o,k,t)}let P=!1;if(n.archivePhases)try{let k=Pe.default.join(c,`${e}-phases`);G.default.mkdirSync(k,{recursive:!0});let $=G.default.readdirSync(l,{withFileTypes:!0}).filter(A=>A.isDirectory()).map(A=>A.name),M=0;for(let A of $)m(A)&&(G.default.renameSync(Pe.default.join(l,A),Pe.default.join(k,A)),M++);P=M>0}catch{}y({version:e,name:u,date:d,phases:p,plans:f,tasks:g,accomplishments:h,archived:{roadmap:G.default.existsSync(Pe.default.join(c,`${e}-ROADMAP.md`)),requirements:G.default.existsSync(Pe.default.join(c,`${e}-REQUIREMENTS.md`)),audit:G.default.existsSync(Pe.default.join(c,`${e}-MILESTONE-AUDIT.md`)),phases:P},milestones_updated:!0,state_updated:G.default.existsSync(o)},r)}var G,Pe,Wn=q(()=>{"use strict";G=L(require("fs")),Pe=L(require("path"));ge();Ve();je()});var Vt,qn,Ln,Er=q(()=>{"use strict";Vt=require("@oclif/core");Ce();qn=class t extends w{static description="Complete the current milestone";static args={version:Vt.Args.string({required:!1})};static flags={...w.baseFlags,name:Vt.Flags.string({description:"Milestone name"}),"archive-phases":Vt.Flags.boolean({description:"Archive phases",default:!1})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdMilestoneComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n.version??"",{name:e.name??null,archivePhases:e["archive-phases"]},s)}},Ln=class t extends w{static description="Mark requirements as complete";static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdRequirementsMarkComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n,s)}}});var _,Fr,Qc,el,tl,nl,Go,sl,Jo,Yo,Ho,Un,Mr=q(()=>{"use strict";_=require("zod"),Fr=_.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(),Qc=_.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(),el=_.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(),tl=_.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(),nl=_.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(),Go=_.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(),sl=_.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(Go)}).passthrough(),Jo=_.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(),Yo=_.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(),Ho=_.z.object({context_warnings:_.z.boolean().default(!0),workflow_guard:_.z.boolean().default(!1)}).passthrough(),Un=_.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:Jo.default({}),workflow:Yo.default({}),hooks:Ho.default({}),agent_skills:_.z.record(_.z.string(),_.z.unknown()).default({})}).passthrough()});var jt={};he(jt,{cmdValidateAgents:()=>oa,cmdValidateConsistency:()=>ra,cmdValidateHealth:()=>ia,cmdVerifyArtifacts:()=>na,cmdVerifyCommits:()=>ta,cmdVerifyKeyLinks:()=>sa,cmdVerifyPhaseCompleteness:()=>Qo,cmdVerifyPlanStructure:()=>Ko,cmdVerifyReferences:()=>ea,cmdVerifySummary:()=>Zo});function Xo(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}function Zo(t,e,n,r){e||v("summary-path required");let s=K.default.join(t,e),i=n||2;if(!Q.default.existsSync(s)){y({passed:!1,checks:{summary_exists:!1,files_created:{checked:0,found:0,missing:[]},commits_exist:!1,self_check:"not_found"},errors:["SUMMARY.md not found"]},r,"failed");return}let o=Q.default.readFileSync(s,"utf-8"),a=[],c=new Set;for(let g of[/`([^`]+\.[a-zA-Z]+)`/g,/(?:Created|Modified|Added|Updated|Edited):\s*`?([^\s`]+\.[a-zA-Z]+)`?/gi]){let h;for(;(h=g.exec(o))!==null;)h[1]&&!h[1].startsWith("http")&&h[1].includes("/")&&c.add(h[1])}let l=Array.from(c).slice(0,i),d=l.filter(g=>!Q.default.existsSync(K.default.join(t,g))),u=o.match(/\b[0-9a-f]{7,40}\b/g)||[],m=!1;for(let g of u.slice(0,3))if(ae(t,["cat-file","-t",g]).stdout==="commit"){m=!0;break}let p="not_found";if(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i.test(o)){let g=o.slice(o.search(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i));/(?:fail|✗|❌|incomplete|blocked)/i.test(g)?p="failed":/(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i.test(g)&&(p="passed")}d.length>0&&a.push("Missing files: "+d.join(", ")),!m&&u.length>0&&a.push("Referenced commit hashes not found in git history"),p==="failed"&&a.push("Self-check section indicates failure");let f=d.length===0&&p!=="failed";y({passed:f,checks:{summary_exists:!0,files_created:{checked:l.length,found:l.length-d.length,missing:d},commits_exist:m,self_check:p},errors:a},r,f?"passed":"failed")}function Ko(t,e,n){e||v("file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Ne(r);if(!s){y({error:"File not found",path:e},n);return}let i=oe(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),S=/<verify>/.test(m),x=/<done>/.test(m);p||o.push("Task missing <name> element"),h||o.push(`Task '${f}' missing <action>`),S||a.push(`Task '${f}' missing <verify>`),x||a.push(`Task '${f}' missing <done>`),g||a.push(`Task '${f}' missing <files>`),l.push({name:f,hasFiles:g,hasAction:h,hasVerify:S,hasDone:x})}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 Qo(t,e,n){e||v("phase required");let r=fe(t,e);if(!r?.found){y({error:"Phase not found",phase:e},n);return}let s=K.default.join(t,r.directory),i=[],o=[],a;try{a=Q.default.readdirSync(s)}catch{y({error:"Cannot read phase directory"},n);return}let c=a.filter(f=>f.match(/-PLAN\.md$/i)),l=a.filter(f=>f.match(/-SUMMARY\.md$/i)),d=new Set(c.map(f=>f.replace(/-PLAN\.md$/i,""))),u=new Set(l.map(f=>f.replace(/-SUMMARY\.md$/i,""))),m=[...d].filter(f=>!u.has(f)),p=[...u].filter(f=>!d.has(f));m.length>0&&i.push(`Plans without summaries: ${m.join(", ")}`),p.length>0&&o.push(`Summaries without plans: ${p.join(", ")}`),y({complete:i.length===0,phase:r.phase_number,plan_count:c.length,summary_count:l.length,incomplete_plans:m,orphan_summaries:p,errors:i,warnings:o},n,i.length===0?"complete":"incomplete")}function ea(t,e,n){e||v("file path required");let r=K.default.isAbsolute(e)?e:K.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("~/")?K.default.join(process.env.HOME??"",c.slice(2)):K.default.join(t,c);(Q.default.existsSync(l)?i:o).push(c)}for(let a of s.match(/`([^`]+\/[^`]+\.[a-zA-Z]{1,10})`/g)||[]){let c=a.slice(1,-1);c.startsWith("http")||c.includes("${")||c.includes("{{")||i.includes(c)||o.includes(c)||(Q.default.existsSync(K.default.join(t,c))?i:o).push(c)}y({valid:o.length===0,found:i.length,missing:o,total:i.length+o.length},n,o.length===0?"valid":"invalid")}function ta(t,e,n){(!e||e.length===0)&&v("At least one commit hash required");let r=[],s=[];for(let i of e)(ae(t,["cat-file","-t",i]).stdout.trim()==="commit"?r:s).push(i);y({all_valid:s.length===0,valid:r,invalid:s,total:e.length},n,s.length===0?"valid":"invalid")}function na(t,e,n){e||v("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Ne(r);if(!s){y({error:"File not found",path:e},n);return}let i=on(s,"artifacts");if(i.length===0){y({error:"No must_haves.artifacts found in frontmatter",path:e},n);return}let o=[];for(let c of i){if(typeof c=="string")continue;let l=c;if(!l.path)continue;let d=K.default.join(t,l.path),u=Q.default.existsSync(d),m={path:l.path,exists:u,issues:[],passed:!1};if(u){let p=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 sa(t,e,n){e||v("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Ne(r);if(!s){y({error:"File not found",path:e},n);return}let i=on(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(K.default.join(t,l.from||""));if(!u)d.detail="Source file not found";else if(l.pattern)try{let m=new RegExp(l.pattern);if(m.test(u))d.verified=!0,d.detail="Pattern found in source";else{let p=Ne(K.default.join(t,l.to||""));p&&m.test(p)?(d.verified=!0,d.detail="Pattern found in target"):d.detail=`Pattern "${l.pattern}" not found in source or target`}}catch{d.detail=`Invalid regex pattern: ${l.pattern}`}else u.includes(l.to||"")?(d.verified=!0,d.detail="Target referenced in source"):d.detail="Target not referenced in source";o.push(d)}let a=o.filter(c=>c.verified).length;y({all_verified:a===o.length,verified:a,total:o.length,links:o},n,a===o.length?"valid":"invalid")}function ra(t,e){let n=K.default.join(O(t),"ROADMAP.md"),r=K.default.join(O(t),"phases"),s=[],i=[];if(!Q.default.existsSync(n)){s.push("ROADMAP.md not found"),y({passed:!1,errors:s,warnings:i},e,"failed");return}let o=ve(Q.default.readFileSync(n,"utf-8"),t),a=new Set,c=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi,l;for(;(l=c.exec(o))!==null;)a.add(l[1]);let d=new Set;try{Q.default.readdirSync(r,{withFileTypes:!0}).filter(p=>p.isDirectory()).map(p=>p.name).forEach(p=>{let f=p.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);f&&d.add(f[1])})}catch{}for(let p of a)!d.has(p)&&!d.has(de(p))&&i.push(`Phase ${p} in ROADMAP.md but no directory on disk`);for(let p of d){let f=String(parseInt(p,10));!a.has(p)&&!a.has(f)&&i.push(`Phase ${p} exists on disk but not in ROADMAP.md`)}if(X(t).phase_naming!=="custom"){let p=[...d].filter(f=>!f.includes(".")).map(f=>parseInt(f,10)).sort((f,g)=>f-g);for(let f=1;f<p.length;f++)p[f]!==p[f-1]+1&&i.push(`Gap in phase numbering: ${p[f-1]} \u2192 ${p[f]}`)}let m=s.length===0;y({passed:m,errors:s,warnings:i,warning_count:i.length},e,m?"passed":"failed")}function ia(t,e,n){let r=K.default.resolve(t);if(r===Ir.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=O(t),i=Z(t),o=K.default.join(i,"PROJECT.md"),a=K.default.join(s,"ROADMAP.md"),c=K.default.join(s,"STATE.md"),l=K.default.join(i,"config.json"),d=K.default.join(s,"phases"),u=[],m=[],p=[],f=[],g=(x,b,P,k,$=!1,M)=>{let A={code:b,message:P,fix:k,repairable:$,...M};x==="error"?u.push(A):x==="warning"?m.push(A):p.push(A)};if(!Q.default.existsSync(s)){g("error","E001",".planning/ directory not found","Run /gsd-new-project to initialize"),y({status:"broken",errors:u,warnings:m,info:p,repairable_count:0},n);return}if(!Q.default.existsSync(o))g("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let x=Q.default.readFileSync(o,"utf-8");for(let b of["## What This Is","## Core Value","## Requirements"])x.includes(b)||g("warning","W001",`PROJECT.md missing section: ${b}`,"Add section manually")}if(Q.default.existsSync(a)||g("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!Q.default.existsSync(c))g("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),f.push("regenerateState");else try{let x=Q.default.readFileSync(c,"utf-8"),b=oe(x),P=Fr.safeParse(b);if(!P.success){for(let k of P.error.issues){let $=k.path.join(".")||"(root)";g("warning","W011",`STATE.md frontmatter: field "${$}" - ${k.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}f.includes("regenerateState")||f.push("regenerateState")}}catch{}if(!Q.default.existsSync(l))g("warning","W003","config.json not found","Run /gsd-health --repair to create with defaults",!0),f.push("createConfig");else try{let x=JSON.parse(Q.default.readFileSync(l,"utf-8")),b=Un.safeParse(x);if(!b.success){for(let P of b.error.issues){let k=P.path.join(".")||"(root)",$=Xo(x,P.path);g("warning","W005",`config.json: field "${k}" - ${P.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:k,expected:P.message,actual:$})}f.includes("fixSchemaDefaults")||f.push("fixSchemaDefaults")}}catch(x){g("error","E005",`config.json: JSON parse error - ${x.message}`,"Run pi-gsd-tools validate health --repair to reset to defaults",!0),f.push("resetConfig")}try{let x=_t();x.agents_installed||g("warning","W010",x.installed_agents.length===0?`No GSD agents found in ${x.agents_dir}`:`Missing ${x.missing_agents.length} GSD agents: ${x.missing_agents.join(", ")}`,"Run the GSD installer: pi install npm:pi-gsd")}catch{}let h=[];if(e.repair&&f.length>0)for(let x of f)try{if(x==="createConfig"||x==="resetConfig"){let b=Un.parse({});Q.default.writeFileSync(l,JSON.stringify(b,null,2),"utf-8"),h.push({action:x,success:!0,path:"config.json"})}else if(x==="fixSchemaDefaults"&&Q.default.existsSync(l)){let b=JSON.parse(Q.default.readFileSync(l,"utf-8")),P=Un.parse(b);Q.default.writeFileSync(l,JSON.stringify(P,null,2),"utf-8"),h.push({action:x,success:!0,path:"config.json"})}else if(x==="regenerateState"){if(Q.default.existsSync(c)){let P=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),k=`${c}.bak-${P}`;Q.default.copyFileSync(c,k),h.push({action:"backupState",success:!0,path:k})}let b=ie(t);re(c,`# Session State
227
227
 
228
228
  ## Project Reference
229
229
 
@@ -231,33 +231,33 @@ See: .planning/PROJECT.md
231
231
 
232
232
  ## Position
233
233
 
234
- **Milestone:** ${v.version} ${v.name}
234
+ **Milestone:** ${b.version} ${b.name}
235
235
  **Current phase:** (determining...)
236
236
  **Status:** Resuming
237
237
 
238
238
  ## Session Log
239
239
 
240
240
  - ${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":p.length>0?"degraded":"healthy";y({status:x,errors:u,warnings:p,info:m,repairable_count:u.filter(S=>S.repairable).length+p.filter(S=>S.repairable).length,repairs_performed:h.length>0?h:void 0},n)}function oa(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 te,Ir,ee,Rt=L(()=>{"use strict";te=U(require("fs")),Ir=U(require("os")),ee=U(require("path"));he();Ve();Mr();Re()});var Bs={};ye(Bs,{buildCheckpoint:()=>Dr,cmdAuditUat:()=>aa,cmdRenderCheckpoint:()=>ca,parseCurrentTest:()=>Tr});function aa(t,e){let n=Je.default.join(W(t),"phases");rt.default.existsSync(n)||b("No phases directory found in planning directory");let r=we(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 p of u.filter(m=>m.includes("-UAT")&&m.endsWith(".md"))){let m=rt.default.readFileSync(Je.default.join(d,p),"utf-8"),f=la(m);f.length>0&&s.push({phase:l,phase_dir:a,file:p,file_path:G(Je.default.relative(t,Je.default.join(d,p))),type:"uat",status:le(m).status||"unknown",items:f})}for(let p of u.filter(m=>m.includes("-VERIFICATION")&&m.endsWith(".md"))){let m=rt.default.readFileSync(Je.default.join(d,p),"utf-8"),f=le(m).status||"unknown";if(f==="human_needed"||f==="gaps_found"){let g=da(m,f);g.length>0&&s.push({phase:l,phase_dir:a,file:p,file_path:G(Je.default.relative(t,Je.default.join(d,p))),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 ca(t,e,n){let r=e.file;r||b("UAT file required: use uat render-checkpoint --file <path>");let s=xr(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=Tr(i);o.complete&&b("UAT session is already complete; no pending checkpoint to render");let a=Dr(o);y({file_path:G(Je.default.relative(t,s)),test_number:o.number,test_name:o.name,checkpoint:a},n,a)}function Tr(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(`
241
+ `,t),h.push({action:x,success:!0,path:"STATE.md"})}}catch(b){h.push({action:x,success:!1,error:b.message})}let S=u.length>0?"broken":m.length>0?"degraded":"healthy";y({status:S,errors:u,warnings:m,info:p,repairable_count:u.filter(x=>x.repairable).length+m.filter(x=>x.repairable).length,repairs_performed:h.length>0?h:void 0},n)}function oa(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(Fe)},e)}var Q,Ir,K,Rt=q(()=>{"use strict";Q=L(require("fs")),Ir=L(require("os")),K=L(require("path"));ge();Ve();Mr();je()});var Bs={};he(Bs,{buildCheckpoint:()=>Dr,cmdAuditUat:()=>aa,cmdRenderCheckpoint:()=>ca,parseCurrentTest:()=>Tr});function aa(t,e){let n=Je.default.join(O(t),"phases");rt.default.existsSync(n)||v("No phases directory found in planning directory");let r=_e(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=la(p);f.length>0&&s.push({phase:l,phase_dir:a,file:m,file_path:B(Je.default.relative(t,Je.default.join(d,m))),type:"uat",status:oe(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=oe(p).status||"unknown";if(f==="human_needed"||f==="gaps_found"){let g=da(p,f);g.length>0&&s.push({phase:l,phase_dir:a,file:m,file_path:B(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 ca(t,e,n){let r=e.file;r||v("UAT file required: use uat render-checkpoint --file <path>");let s=xr(r,t,"UAT file",{allowAbsolute:!0});rt.default.existsSync(s)||v(`UAT file not found: ${r}`);let i=rt.default.readFileSync(s,"utf-8"),o=Tr(i);o.complete&&v("UAT session is already complete; no pending checkpoint to render");let a=Dr(o);y({file_path:B(Je.default.relative(t,s)),test_number:o.number,test_name:o.name,checkpoint:a},n,a)}function Tr(t){let e=t.match(/##\s*Current Test\s*(?:\n<!--[\s\S]*?-->)?\n([\s\S]*?)(?=\n##\s|$)/i);e||v("UAT file is missing a Current Test section");let n=e[1].trimEnd();if(n.trim()||v("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)&&v("Current Test section is malformed");let a;return i?a=i[1].split(`
242
242
  `).map(c=>c.replace(/^ {2}/,"")).join(`
243
243
  `).trim():a=o[1].trim(),{complete:!1,number:parseInt(r[1],10),name:Ns(s[1].trim()),expected:Ns(a)}}function Dr(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
244
  `)}function la(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*(.+)/),p=d.match(/blocked_by:\s*(.+)/),m={test:parseInt(s,10),name:i.trim(),expected:o.trim(),result:a,category:ua(a,u?.[1],p?.[1])};u&&(m.reason=u[1].trim()),p&&(m.blocked_by=p[1].trim()),e.push(m)}}return e}function da(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 ua(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,Gs=L(()=>{"use strict";rt=U(require("fs")),Je=U(require("path"));he();Ve();ln()});var zt,Vn,zn,Bn,Gn,Jn,Or=L(()=>{"use strict";zt=require("@oclif/core");je();Vn=class t extends w{static description="Validate planning consistency";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateConsistency(n,r)}},zn=class t extends w{static description="Check .planning/ health";static flags={...w.baseFlags,repair:zt.Flags.boolean({description:"Auto-repair issues",default:!1})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateHealth(n,{repair:e.repair},r)}},Bn=class t extends w{static description="Validate agent configurations";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateAgents(n,r)}},Gn=class t extends w{static description="Run UAT verification";static args={phase:zt.Args.string({required:!1})};static flags={...w.baseFlags,plan:zt.Flags.string({description:"Plan to verify"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateConsistency(r,s)}},Jn=class t extends w{static description="Audit UAT results";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdAuditUat:s}=await Promise.resolve().then(()=>(Gs(),Bs));s(n,r)}}});var it={};ye(it,{cmdWorkstreamComplete:()=>ha,cmdWorkstreamCreate:()=>pa,cmdWorkstreamGet:()=>xa,cmdWorkstreamList:()=>fa,cmdWorkstreamProgress:()=>Sa,cmdWorkstreamSet:()=>ya,cmdWorkstreamStatus:()=>ga});function ma(t,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let n=Q(t),r=O.default.join(n,"workstreams",e);if(T.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"}];T.default.mkdirSync(r,{recursive:!0});let i=[];try{for(let o of s){let a=O.default.join(n,o.name);T.default.existsSync(a)&&(T.default.renameSync(a,O.default.join(r,o.name)),i.push(o.name))}}catch(o){for(let a of i)try{T.default.renameSync(O.default.join(r,a),O.default.join(n,a))}catch{}try{T.default.rmSync(r,{recursive:!0})}catch{}try{T.default.rmdirSync(O.default.join(n,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:i}}function pa(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=Q(t);T.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(T.default.existsSync(a)&&T.default.existsSync(O.default.join(a,"STATE.md"))){y({created:!1,error:"already_exists",workstream:s,path:G(O.default.relative(t,a))},r);return}let c=!T.default.existsSync(o),l=null;if(c&&n.migrate!==!1)if(T.default.existsSync(O.default.join(i,"ROADMAP.md"))||T.default.existsSync(O.default.join(i,"STATE.md"))||T.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=ma(t,h)}catch(x){y({created:!1,error:"migration_failed",message:x.message},r);return}}else T.default.mkdirSync(o,{recursive:!0});T.default.mkdirSync(a,{recursive:!0}),T.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
- `),p=O.default.join(a,"STATE.md");T.default.existsSync(p)||T.default.writeFileSync(p,u,"utf-8"),ct(t,s);let m=G(O.default.relative(t,a));y({created:!0,workstream:s,path:m,state_path:m+"/STATE.md",phases_path:m+"/phases",migration:l??null,active:!0},r)}function fa(t,e){let n=O.default.join(Q(t),"workstreams");if(!T.default.existsSync(n)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let r=[];for(let s of T.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 p=T.default.readdirSync(O.default.join(o,u)),m=wt(p),f=kt(p);m.length>0&&f.length>=m.length&&c++}catch{}let l="unknown",d=null;try{let u=T.default.readFileSync(O.default.join(i,"STATE.md"),"utf-8");l=Y(u,"Status")||"unknown",d=Y(u,"Current Phase")}catch{}r.push({name:s.name,path:G(O.default.relative(t,i)),has_roadmap:T.default.existsSync(O.default.join(i,"ROADMAP.md")),has_state:T.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 ga(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(Q(t),"workstreams",e);if(!T.default.existsSync(r)){y({found:!1,workstream:e},n);return}let s=E(t,e),i={roadmap:T.default.existsSync(s.roadmap),state:T.default.existsSync(s.state),requirements:T.default.existsSync(s.requirements)},o=[];for(let c of Ue(s.phases).sort())try{let l=T.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=T.default.readFileSync(s.state,"utf-8");a={status:Y(c,"Status")||"unknown",current_phase:Y(c,"Current Phase"),last_activity:Y(c,"Last Activity")}}catch{}y({found:!0,workstream:e,path:G(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 ha(t,e,n,r){e||b("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let s=Q(t),i=O.default.join(s,"workstreams"),o=O.default.join(i,e);if(!T.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(;T.default.existsSync(d);)d=O.default.join(c,`ws-${e}-${l}-${u++}`);T.default.mkdirSync(d,{recursive:!0});let p=[];try{for(let f of T.default.readdirSync(o,{withFileTypes:!0}))T.default.renameSync(O.default.join(o,f.name),O.default.join(d,f.name)),p.push(f.name)}catch(f){for(let g of p)try{T.default.renameSync(O.default.join(d,g),O.default.join(o,g))}catch{}try{T.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{T.default.rmdirSync(o)}catch{}let m=0;try{m=T.default.readdirSync(i,{withFileTypes:!0}).filter(f=>f.isDirectory()).length,m===0&&T.default.rmdirSync(i)}catch{}y({completed:!0,workstream:e,archived_to:G(O.default.relative(t,d)),remaining_workstreams:m,reverted_to_flat:m===0},r)}function ya(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(Q(t),"workstreams",e);if(!T.default.existsSync(r)){y({active:null,error:"not_found",workstream:e},n);return}ct(t,e),y({active:e,set:!0},n,e)}function xa(t,e){let n=Xe(t),r=O.default.join(Q(t),"workstreams");y({active:n,mode:T.default.existsSync(r)?"workstream":"flat"},e,n||"none")}function Sa(t,e){let n=Q(t),r=O.default.join(n,"workstreams");if(!T.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 T.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,p=0;for(let h of l)try{let x=T.default.readdirSync(O.default.join(c,h)),S=wt(x),v=kt(x);u+=S.length,p+=Math.min(v.length,S.length),S.length>0&&v.length>=S.length&&d++}catch{}let m=l.length;try{let x=T.default.readFileSync(O.default.join(a,"ROADMAP.md"),"utf-8").match(/^###?\s+Phase\s+\d/gm);x&&(m=x.length)}catch{}let f="unknown",g=null;try{let h=T.default.readFileSync(O.default.join(a,"STATE.md"),"utf-8");f=Y(h,"Status")||"unknown",g=Y(h,"Current Phase")}catch{}i.push({name:o.name,active:o.name===s,status:f,current_phase:g,phases:`${d}/${m}`,plans:`${p}/${u}`,progress_percent:m>0?Math.round(d/m*100):0})}y({mode:"workstream",active:s,workstreams:i,count:i.length},e)}var T,O,ot=L(()=>{"use strict";T=U(require("fs")),O=U(require("path"));he();Re()});var at,Yn,Hn,Xn,Zn,Kn,Qn,es,Nr=L(()=>{"use strict";at=require("@oclif/core");je();Yn=class t extends w{static description="Create a new workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags,"no-migrate":at.Flags.boolean({description:"Skip migration",default:!1}),"migrate-name":at.Flags.string({description:"Migration name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamCreate(r,n.name,{migrate:!e["no-migrate"],migrateName:e["migrate-name"]??null},s)}},Hn=class t extends w{static description="List workstreams";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamList(n,r)}},Xn=class t extends w{static description="Show workstream status";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamStatus(r,n.name,s)}},Zn=class t extends w{static description="Complete a workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamComplete(r,n.name,{},s)}},Kn=class t extends w{static description="Set active workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamSet(r,n.name,s)}},Qn=class t extends w{static description="Get active workstream";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamGet(n,r)}},es=class t extends w{static description="Show workstream progress";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamProgress(n,r)}}});var be={};ye(be,{cmdCommit:()=>$a,cmdCommitToSubrepo:()=>Ca,cmdCurrentTimestamp:()=>va,cmdGenerateSlug:()=>ba,cmdHistoryDigest:()=>ka,cmdListTodos:()=>_a,cmdProgressRender:()=>Ra,cmdResolveModel:()=>Pa,cmdScaffold:()=>Ma,cmdStats:()=>Ia,cmdSummaryExtract:()=>Aa,cmdTodoComplete:()=>Ea,cmdTodoMatchPhase:()=>Fa,cmdVerifyPathExists:()=>wa,cmdWebsearch:()=>ja});function ba(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 va(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 _a(t,e,n){let r=H.default.join(W(t),"todos","pending"),s=0,i=[];try{let o=z.default.readdirSync(r).filter(a=>a.endsWith(".md"));for(let a of o)try{let c=z.default.readFileSync(H.default.join(r,a),"utf-8"),l=c.match(/^created:\s*(.+)$/m),d=c.match(/^title:\s*(.+)$/m),u=c.match(/^area:\s*(.+)$/m),p=u?u[1].trim():"general";if(e&&p!==e)continue;s++,i.push({file:a,created:l?l[1].trim():"unknown",title:d?d[1].trim():"Untitled",area:p,path:G(H.default.relative(t,H.default.join(r,a)))})}catch{}}catch{}y({count:s,todos:i},n,s.toString())}function wa(t,e,n){e||b("path required for verification"),e.includes("\0")&&b("path contains null bytes");let r=H.default.isAbsolute(e)?e:H.default.join(t,e);try{let s=z.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 ka(t,e){let n=E(t).phases,r={phases:{},decisions:[],tech_stack:new Set},s=[];for(let i of Lt(t))s.push({name:i.name,fullPath:i.fullPath,milestone:i.milestone});if(z.default.existsSync(n))try{for(let i of z.default.readdirSync(n,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())s.push({name:i,fullPath:H.default.join(n,i),milestone:null})}catch{}if(s.length===0){y({phases:{},decisions:[],tech_stack:[]},e);return}try{for(let{name:o,fullPath:a}of s){let c=z.default.readdirSync(a).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of c)try{let d=z.default.readFileSync(H.default.join(a,l),"utf-8"),u=le(d),p=pe(u.phase)??o.split("-")[0];r.phases[p]||(r.phases[p]={name:pe(u.name)??o.split("-").slice(1).join(" ")??"Unknown",provides:new Set,affects:new Set,patterns:new Set});let m=Pt(u["dependency-graph"]);m?.provides?ke(m.provides)?.forEach(g=>r.phases[p].provides.add(pe(g)??String(g))):u.provides&&ke(u.provides)?.forEach(g=>r.phases[p].provides.add(pe(g)??String(g))),m?.affects&&ke(m.affects)?.forEach(g=>r.phases[p].affects.add(pe(g)??String(g))),u["patterns-established"]&&ke(u["patterns-established"])?.forEach(g=>r.phases[p].patterns.add(pe(g)??String(g))),u["key-decisions"]&&ke(u["key-decisions"])?.forEach(g=>r.decisions.push({phase:p,decision:pe(g)??String(g)}));let f=Pt(u["tech-stack"]);f?.added&&ke(f.added)?.forEach(g=>{let h=pe(g);if(h)r.tech_stack.add(h);else{let x=Pt(g);x&&r.tech_stack.add(pe(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 Pa(t,e,n){e||b("agent-type required");let r=Z(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 $a(t,e,n,r,s=!1,i=!1){!e&&!s&&b("commit message required");let o=e;o&&(o=yr(o));let a=Z(t);if(!a.commit_docs){y({committed:!1,hash:null,reason:"skipped_commit_docs_false"},r,"skipped");return}if(sn(t,".planning")){y({committed:!1,hash:null,reason:"skipped_gitignored"},r,"skipped");return}if(a.branching_strategy&&a.branching_strategy!=="none"){let m=null;if(a.branching_strategy==="phase"){let f=(n||[]).join(" ").match(/(\d+)-/);if(f){let g=ge(t,f[1]);g&&(m=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&&(m=a.milestone_branch_template.replace("{milestone}",f.version).replace("{slug}",Le(f.name)||"milestone"))}if(m){let f=de(t,["rev-parse","--abbrev-ref","HEAD"]);f.exitCode===0&&f.stdout.trim()!==m&&de(t,["checkout","-b",m]).exitCode!==0&&de(t,["checkout",m])}}let c=n&&n.length>0?n:[".planning/"];for(let m of c){let f=H.default.join(t,m);z.default.existsSync(f)?de(t,["add",m]):de(t,["rm","--cached","--ignore-unmatch",m])}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"]),p=u.exitCode===0?u.stdout:null;y({committed:!0,hash:p,reason:"committed"},r,p||"committed")}function Ca(t,e,n,r){e||b("commit message required");let i=Z(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=H.default.join(t,l);for(let f of d)de(u,["add",f.slice(l.length+1)]);let p=de(u,["commit","-m",e]);if(p.exitCode!==0){c[l]={committed:!1,hash:null,files:d,reason:p.stdout.includes("nothing to commit")?"nothing_to_commit":"error",error:p.stderr};continue}let m=de(u,["rev-parse","--short","HEAD"]);c[l]={committed:!0,hash:m.exitCode===0?m.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 Aa(t,e,n,r){e||b("summary-path required for summary-extract");let s=H.default.join(t,e);if(!z.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=z.default.readFileSync(s,"utf-8"),o=le(i),a=l=>(l||[]).map(d=>{let u=pe(d)??String(d),p=u.indexOf(":");return p>0?{summary:u.substring(0,p).trim(),rationale:u.substring(p+1).trim()}:{summary:u,rationale:null}}),c={path:e,one_liner:pe(o["one-liner"])??Ut(i)??null,key_files:ke(o["key-files"])??[],tech_added:ke(Pt(o["tech-stack"])?.added)??[],patterns:ke(o["patterns-established"])??[],decisions:a(ke(o["key-decisions"])),requirements_completed:ke(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 ja(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}
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:ua(a,u?.[1],m?.[1])};u&&(p.reason=u[1].trim()),m&&(p.blocked_by=m[1].trim()),e.push(p)}}return e}function da(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 ua(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,Gs=q(()=>{"use strict";rt=L(require("fs")),Je=L(require("path"));ge();Ve();ln()});var zt,Vn,zn,Bn,Gn,Jn,Or=q(()=>{"use strict";zt=require("@oclif/core");Ce();Vn=class t extends w{static description="Validate planning consistency";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateConsistency(n,r)}},zn=class t extends w{static description="Check .planning/ health";static flags={...w.baseFlags,repair:zt.Flags.boolean({description:"Auto-repair issues",default:!1})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateHealth(n,{repair:e.repair},r)}},Bn=class t extends w{static description="Validate agent configurations";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateAgents(n,r)}},Gn=class t extends w{static description="Run UAT verification";static args={phase:zt.Args.string({required:!1})};static flags={...w.baseFlags,plan:zt.Flags.string({description:"Plan to verify"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateConsistency(r,s)}},Jn=class t extends w{static description="Audit UAT results";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdAuditUat:s}=await Promise.resolve().then(()=>(Gs(),Bs));s(n,r)}}});var it={};he(it,{cmdWorkstreamComplete:()=>ha,cmdWorkstreamCreate:()=>pa,cmdWorkstreamGet:()=>xa,cmdWorkstreamList:()=>fa,cmdWorkstreamProgress:()=>Sa,cmdWorkstreamSet:()=>ya,cmdWorkstreamStatus:()=>ga});function ma(t,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let n=Z(t),r=T.default.join(n,"workstreams",e);if(I.default.existsSync(T.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"}];I.default.mkdirSync(r,{recursive:!0});let i=[];try{for(let o of s){let a=T.default.join(n,o.name);I.default.existsSync(a)&&(I.default.renameSync(a,T.default.join(r,o.name)),i.push(o.name))}}catch(o){for(let a of i)try{I.default.renameSync(T.default.join(r,a),T.default.join(n,a))}catch{}try{I.default.rmSync(r,{recursive:!0})}catch{}try{I.default.rmdirSync(T.default.join(n,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:i}}function pa(t,e,n,r){e||v("workstream name required. Usage: workstream create <name>");let s=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");s||v("Invalid workstream name - must contain at least one alphanumeric character");let i=Z(t);I.default.existsSync(i)||v(".planning/ directory not found - run /gsd-new-project first");let o=T.default.join(i,"workstreams"),a=T.default.join(o,s);if(I.default.existsSync(a)&&I.default.existsSync(T.default.join(a,"STATE.md"))){y({created:!1,error:"already_exists",workstream:s,path:B(T.default.relative(t,a))},r);return}let c=!I.default.existsSync(o),l=null;if(c&&n.migrate!==!1)if(I.default.existsSync(T.default.join(i,"ROADMAP.md"))||I.default.existsSync(T.default.join(i,"STATE.md"))||I.default.existsSync(T.default.join(i,"phases"))){let g=n.migrateName??null,h;if(g)h=g;else try{let S=ie(t);h=Le(S.name)||"default"}catch{h="default"}try{l=ma(t,h)}catch(S){y({created:!1,error:"migration_failed",message:S.message},r);return}}else I.default.mkdirSync(o,{recursive:!0});I.default.mkdirSync(a,{recursive:!0}),I.default.mkdirSync(T.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=T.default.join(a,"STATE.md");I.default.existsSync(m)||I.default.writeFileSync(m,u,"utf-8"),ct(t,s);let p=B(T.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 fa(t,e){let n=T.default.join(Z(t),"workstreams");if(!I.default.existsSync(n)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let r=[];for(let s of I.default.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory())){let i=T.default.join(n,s.name),o=T.default.join(i,"phases"),a=Ue(o),c=0;for(let u of a)try{let m=I.default.readdirSync(T.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=I.default.readFileSync(T.default.join(i,"STATE.md"),"utf-8");l=J(u,"Status")||"unknown",d=J(u,"Current Phase")}catch{}r.push({name:s.name,path:B(T.default.relative(t,i)),has_roadmap:I.default.existsSync(T.default.join(i,"ROADMAP.md")),has_state:I.default.existsSync(T.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 ga(t,e,n){e||v("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&v("Invalid workstream name");let r=T.default.join(Z(t),"workstreams",e);if(!I.default.existsSync(r)){y({found:!1,workstream:e},n);return}let s=j(t,e),i={roadmap:I.default.existsSync(s.roadmap),state:I.default.existsSync(s.state),requirements:I.default.existsSync(s.requirements)},o=[];for(let c of Ue(s.phases).sort())try{let l=I.default.readdirSync(T.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=I.default.readFileSync(s.state,"utf-8");a={status:J(c,"Status")||"unknown",current_phase:J(c,"Current Phase"),last_activity:J(c,"Last Activity")}}catch{}y({found:!0,workstream:e,path:B(T.default.relative(t,r)),files:i,phases:o,phase_count:o.length,completed_phases:o.filter(c=>c.status==="complete").length,...a},n)}function ha(t,e,n,r){e||v("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&v("Invalid workstream name");let s=Z(t),i=T.default.join(s,"workstreams"),o=T.default.join(i,e);if(!I.default.existsSync(o)){y({completed:!1,error:"not_found",workstream:e},r);return}let a=Xe(t);a===e&&ct(t,null);let c=T.default.join(s,"milestones"),l=new Date().toISOString().split("T")[0],d=T.default.join(c,`ws-${e}-${l}`),u=1;for(;I.default.existsSync(d);)d=T.default.join(c,`ws-${e}-${l}-${u++}`);I.default.mkdirSync(d,{recursive:!0});let m=[];try{for(let f of I.default.readdirSync(o,{withFileTypes:!0}))I.default.renameSync(T.default.join(o,f.name),T.default.join(d,f.name)),m.push(f.name)}catch(f){for(let g of m)try{I.default.renameSync(T.default.join(d,g),T.default.join(o,g))}catch{}try{I.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{I.default.rmdirSync(o)}catch{}let p=0;try{p=I.default.readdirSync(i,{withFileTypes:!0}).filter(f=>f.isDirectory()).length,p===0&&I.default.rmdirSync(i)}catch{}y({completed:!0,workstream:e,archived_to:B(T.default.relative(t,d)),remaining_workstreams:p,reverted_to_flat:p===0},r)}function ya(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=T.default.join(Z(t),"workstreams",e);if(!I.default.existsSync(r)){y({active:null,error:"not_found",workstream:e},n);return}ct(t,e),y({active:e,set:!0},n,e)}function xa(t,e){let n=Xe(t),r=T.default.join(Z(t),"workstreams");y({active:n,mode:I.default.existsSync(r)?"workstream":"flat"},e,n||"none")}function Sa(t,e){let n=Z(t),r=T.default.join(n,"workstreams");if(!I.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 I.default.readdirSync(r,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=T.default.join(r,o.name),c=T.default.join(a,"phases"),l=Ue(c),d=0,u=0,m=0;for(let h of l)try{let S=I.default.readdirSync(T.default.join(c,h)),x=wt(S),b=kt(S);u+=x.length,m+=Math.min(b.length,x.length),x.length>0&&b.length>=x.length&&d++}catch{}let p=l.length;try{let S=I.default.readFileSync(T.default.join(a,"ROADMAP.md"),"utf-8").match(/^###?\s+Phase\s+\d/gm);S&&(p=S.length)}catch{}let f="unknown",g=null;try{let h=I.default.readFileSync(T.default.join(a,"STATE.md"),"utf-8");f=J(h,"Status")||"unknown",g=J(h,"Current Phase")}catch{}i.push({name:o.name,active:o.name===s,status:f,current_phase:g,phases:`${d}/${p}`,plans:`${m}/${u}`,progress_percent:p>0?Math.round(d/p*100):0})}y({mode:"workstream",active:s,workstreams:i,count:i.length},e)}var I,T,ot=q(()=>{"use strict";I=L(require("fs")),T=L(require("path"));ge();je()});var at,Yn,Hn,Xn,Zn,Kn,Qn,es,Nr=q(()=>{"use strict";at=require("@oclif/core");Ce();Yn=class t extends w{static description="Create a new workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags,"no-migrate":at.Flags.boolean({description:"Skip migration",default:!1}),"migrate-name":at.Flags.string({description:"Migration name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamCreate(r,n.name,{migrate:!e["no-migrate"],migrateName:e["migrate-name"]??null},s)}},Hn=class t extends w{static description="List workstreams";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamList(n,r)}},Xn=class t extends w{static description="Show workstream status";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamStatus(r,n.name,s)}},Zn=class t extends w{static description="Complete a workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamComplete(r,n.name,{},s)}},Kn=class t extends w{static description="Set active workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamSet(r,n.name,s)}},Qn=class t extends w{static description="Get active workstream";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamGet(n,r)}},es=class t extends w{static description="Show workstream progress";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamProgress(n,r)}}});var xe={};he(xe,{cmdCommit:()=>$a,cmdCommitToSubrepo:()=>Ca,cmdCurrentTimestamp:()=>va,cmdGenerateSlug:()=>ba,cmdHistoryDigest:()=>ka,cmdListTodos:()=>_a,cmdProgressRender:()=>Ra,cmdResolveModel:()=>Pa,cmdScaffold:()=>Ma,cmdStats:()=>Ia,cmdSummaryExtract:()=>Aa,cmdTodoComplete:()=>Ea,cmdTodoMatchPhase:()=>Fa,cmdVerifyPathExists:()=>wa,cmdWebsearch:()=>ja});function ba(t,e){t||v("text required for slug generation");let n=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");y({slug:n},e,n)}function va(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 _a(t,e,n){let r=H.default.join(O(t),"todos","pending"),s=0,i=[];try{let o=V.default.readdirSync(r).filter(a=>a.endsWith(".md"));for(let a of o)try{let c=V.default.readFileSync(H.default.join(r,a),"utf-8"),l=c.match(/^created:\s*(.+)$/m),d=c.match(/^title:\s*(.+)$/m),u=c.match(/^area:\s*(.+)$/m),m=u?u[1].trim():"general";if(e&&m!==e)continue;s++,i.push({file:a,created:l?l[1].trim():"unknown",title:d?d[1].trim():"Untitled",area:m,path:B(H.default.relative(t,H.default.join(r,a)))})}catch{}}catch{}y({count:s,todos:i},n,s.toString())}function wa(t,e,n){e||v("path required for verification"),e.includes("\0")&&v("path contains null bytes");let r=H.default.isAbsolute(e)?e:H.default.join(t,e);try{let s=V.default.statSync(r);y({exists:!0,type:s.isDirectory()?"directory":s.isFile()?"file":"other"},n,"true")}catch{y({exists:!1,type:null},n,"false")}}function ka(t,e){let n=j(t).phases,r={phases:{},decisions:[],tech_stack:new Set},s=[];for(let i of Lt(t))s.push({name:i.name,fullPath:i.fullPath,milestone:i.milestone});if(V.default.existsSync(n))try{for(let i of V.default.readdirSync(n,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())s.push({name:i,fullPath:H.default.join(n,i),milestone:null})}catch{}if(s.length===0){y({phases:{},decisions:[],tech_stack:[]},e);return}try{for(let{name:o,fullPath:a}of s){let c=V.default.readdirSync(a).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of c)try{let d=V.default.readFileSync(H.default.join(a,l),"utf-8"),u=oe(d),m=ue(u.phase)??o.split("-")[0];r.phases[m]||(r.phases[m]={name:ue(u.name)??o.split("-").slice(1).join(" ")??"Unknown",provides:new Set,affects:new Set,patterns:new Set});let p=Pt(u["dependency-graph"]);p?.provides?we(p.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))):u.provides&&we(u.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))),p?.affects&&we(p.affects)?.forEach(g=>r.phases[m].affects.add(ue(g)??String(g))),u["patterns-established"]&&we(u["patterns-established"])?.forEach(g=>r.phases[m].patterns.add(ue(g)??String(g))),u["key-decisions"]&&we(u["key-decisions"])?.forEach(g=>r.decisions.push({phase:m,decision:ue(g)??String(g)}));let f=Pt(u["tech-stack"]);f?.added&&we(f.added)?.forEach(g=>{let h=ue(g);if(h)r.tech_stack.add(h);else{let S=Pt(g);S&&r.tech_stack.add(ue(S.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){v("Failed to generate history digest: "+i.message)}}function Pa(t,e,n){e||v("agent-type required");let r=X(t),s=se(t,e),i=Fe[e];y(i?{model:s,profile:r.model_profile}:{model:s,profile:r.model_profile,unknown_agent:!0},n,s)}function $a(t,e,n,r,s=!1,i=!1){!e&&!s&&v("commit message required");let o=e;o&&(o=yr(o));let a=X(t);if(!a.commit_docs){y({committed:!1,hash:null,reason:"skipped_commit_docs_false"},r,"skipped");return}if(sn(t,".planning")){y({committed:!1,hash:null,reason:"skipped_gitignored"},r,"skipped");return}if(a.branching_strategy&&a.branching_strategy!=="none"){let p=null;if(a.branching_strategy==="phase"){let f=(n||[]).join(" ").match(/(\d+)-/);if(f){let g=fe(t,f[1]);g&&(p=a.phase_branch_template.replace("{phase}",g.phase_number).replace("{slug}",g.phase_slug||"phase"))}}else if(a.branching_strategy==="milestone"){let f=ie(t);f?.version&&(p=a.milestone_branch_template.replace("{milestone}",f.version).replace("{slug}",Le(f.name)||"milestone"))}if(p){let f=ae(t,["rev-parse","--abbrev-ref","HEAD"]);f.exitCode===0&&f.stdout.trim()!==p&&ae(t,["checkout","-b",p]).exitCode!==0&&ae(t,["checkout",p])}}let c=n&&n.length>0?n:[".planning/"];for(let p of c){let f=H.default.join(t,p);V.default.existsSync(f)?ae(t,["add",p]):ae(t,["rm","--cached","--ignore-unmatch",p])}let l=s?["commit","--amend","--no-edit"]:["commit","-m",o];i&&l.push("--no-verify");let d=ae(t,l);if(d.exitCode!==0){if(d.stdout.includes("nothing to commit")||d.stderr.includes("nothing to commit")){y({committed:!1,hash:null,reason:"nothing_to_commit"},r,"nothing");return}y({committed:!1,hash:null,reason:"nothing_to_commit",error:d.stderr},r,"nothing");return}let u=ae(t,["rev-parse","--short","HEAD"]),m=u.exitCode===0?u.stdout:null;y({committed:!0,hash:m,reason:"committed"},r,m||"committed")}function Ca(t,e,n,r){e||v("commit message required");let i=X(t).sub_repos;(!i||i.length===0)&&v("no sub_repos configured in .planning/config.json"),(!n||n.length===0)&&v("--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=H.default.join(t,l);for(let f of d)ae(u,["add",f.slice(l.length+1)]);let m=ae(u,["commit","-m",e]);if(m.exitCode!==0){c[l]={committed:!1,hash:null,files:d,reason:m.stdout.includes("nothing to commit")?"nothing_to_commit":"error",error:m.stderr};continue}let p=ae(u,["rev-parse","--short","HEAD"]);c[l]={committed:!0,hash:p.exitCode===0?p.stdout:null,files:d}}y({committed:Object.values(c).some(l=>l.committed),repos:c,unmatched:a.length>0?a:void 0},r,Object.entries(c).map(([l,d])=>`${l}:${d.hash||"skip"}`).join(" "))}function Aa(t,e,n,r){e||v("summary-path required for summary-extract");let s=H.default.join(t,e);if(!V.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=V.default.readFileSync(s,"utf-8"),o=oe(i),a=l=>(l||[]).map(d=>{let u=ue(d)??String(d),m=u.indexOf(":");return m>0?{summary:u.substring(0,m).trim(),rationale:u.substring(m+1).trim()}:{summary:u,rationale:null}}),c={path:e,one_liner:ue(o["one-liner"])??Ut(i)??null,key_files:we(o["key-files"])??[],tech_added:we(Pt(o["tech-stack"])?.added)??[],patterns:we(o["patterns-established"])??[],decisions:a(we(o["key-decisions"])),requirements_completed:we(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 ja(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}
249
249
  ${c.url}
250
250
  ${c.description}`).join(`
251
251
 
252
- `))}catch(i){y({available:!1,error:i.message},n,"")}}function Ra(t,e,n){let r=E(t).phases,s=E(t).roadmap,i=ce(t),o=[],a=0,c=0;try{let d=z.default.readdirSync(r,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).sort((u,p)=>Ae(u,p));for(let u of d){let p=u.match(/^(\d+(?:\.\d+)*)-?(.*)/),m=p?p[1]:u,f=p&&p[2]?p[2].replace(/-/g," "):"",g=z.default.readdirSync(H.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:m,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),p="\u2588".repeat(u)+"\u2591".repeat(10-u),m=`# ${i.version} ${i.name}
252
+ `))}catch(i){y({available:!1,error:i.message},n,"")}}function Ra(t,e,n){let r=j(t).phases,s=j(t).roadmap,i=ie(t),o=[],a=0,c=0;try{let d=V.default.readdirSync(r,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).sort((u,m)=>$e(u,m));for(let u of d){let m=u.match(/^(\d+(?:\.\d+)*)-?(.*)/),p=m?m[1]:u,f=m&&m[2]?m[2].replace(/-/g," "):"",g=V.default.readdirSync(H.default.join(r,u)),h=g.filter(b=>b.endsWith("-PLAN.md")||b==="PLAN.md").length,S=g.filter(b=>b.endsWith("-SUMMARY.md")||b==="SUMMARY.md").length;a+=h,c+=S;let x;h===0?x="Pending":S>=h?x="Complete":S>0?x="In Progress":x="Planned",o.push({number:p,name:f,plans:h,summaries:S,status:x})}}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
253
 
254
- **Progress:** [${p}] ${c}/${a} plans (${l}%)
254
+ **Progress:** [${m}] ${c}/${a} plans (${l}%)
255
255
 
256
256
  | Phase | Name | Plans | Status |
257
257
  |-------|------|-------|--------|
258
- `;for(let f of o)m+=`| ${f.number} | ${f.name} | ${f.summaries}/${f.plans} | ${f.status} |
259
- `;y({rendered:m},n,m)}else if(e==="bar"){let u=Math.round(l/100*20),m=`[${"\u2588".repeat(u)+"\u2591".repeat(20-u)}] ${c}/${a} plans (${l}%)`;y({bar:m,percent:l,completed:c,total:a},n,m)}else y({milestone_version:i.version,milestone_name:i.name,phases:o,total_plans:a,total_summaries:c,percent:l},n)}function Ea(t,e,n){e||b("filename required for todo complete");let r=H.default.join(W(t),"todos","pending"),s=H.default.join(W(t),"todos","completed"),i=H.default.join(r,e);z.default.existsSync(i)||b(`Todo not found: ${e}`),z.default.mkdirSync(s,{recursive:!0});let o=z.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0];o=`completed: ${a}
260
- `+o,z.default.writeFileSync(H.default.join(s,e),o,"utf-8"),z.default.unlinkSync(i),y({completed:!0,file:e,date:a},n,"completed")}function Fa(t,e,n){e||b("phase required for todo match-phase");let r=H.default.join(W(t),"todos","pending"),s=[];try{for(let p of z.default.readdirSync(r).filter(m=>m.endsWith(".md")))try{let m=z.default.readFileSync(H.default.join(r,p),"utf-8"),f=m.match(/^title:\s*(.+)$/m),g=m.match(/^area:\s*(.+)$/m),h=m.match(/^files:\s*(.+)$/m),x=m.replace(/^(title|area|files|created|priority):.*$/gm,"").trim();s.push({file:p,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(p=>p.replace(/[^a-z0-9]/g,"")).filter(p=>p.length>2&&!a.has(p))),l=ge(t,e),d=[];if(l?.found)try{let p=H.default.join(t,l.directory);for(let m of z.default.readdirSync(p).filter(f=>f.endsWith("-PLAN.md")))try{let g=z.default.readFileSync(H.default.join(p,m),"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 p of s){let m=0,f=[],h=`${p.title} ${p.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&&(m+=Math.min(h.length*.2,.6),f.push(`keywords: ${[...new Set(h)].slice(0,5).join(", ")}`)),p.area!=="general"&&o.includes(p.area.toLowerCase())&&(m+=.3,f.push(`area: ${p.area}`)),p.files.length>0&&d.length>0){let x=p.files.filter(S=>d.some(v=>v.includes(S)||S.includes(v)));x.length>0&&(m+=.4,f.push(`files: ${x.slice(0,3).join(", ")}`))}m>0&&u.push({file:p.file,title:p.title,area:p.area,score:Math.round(m*100)/100,reasons:f})}u.sort((p,m)=>m.score-p.score),y({phase:e,matches:u,todo_count:s.length},n)}function Ma(t,e,n,r){let{phase:s,name:i}=n,o=s?me(s):"00",a=new Date().toISOString().split("T")[0],c=s?ge(t,s):null,l=c?H.default.join(t,c.directory):null;s&&!l&&e!=="phase-dir"&&b(`Phase ${s} directory not found`);let d,u;switch(e){case"context":d=H.default.join(l,`${o}-CONTEXT.md`),u=`---
258
+ `;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 Ea(t,e,n){e||v("filename required for todo complete");let r=H.default.join(O(t),"todos","pending"),s=H.default.join(O(t),"todos","completed"),i=H.default.join(r,e);V.default.existsSync(i)||v(`Todo not found: ${e}`),V.default.mkdirSync(s,{recursive:!0});let o=V.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0];o=`completed: ${a}
260
+ `+o,V.default.writeFileSync(H.default.join(s,e),o,"utf-8"),V.default.unlinkSync(i),y({completed:!0,file:e,date:a},n,"completed")}function Fa(t,e,n){e||v("phase required for todo match-phase");let r=H.default.join(O(t),"todos","pending"),s=[];try{for(let m of V.default.readdirSync(r).filter(p=>p.endsWith(".md")))try{let p=V.default.readFileSync(H.default.join(r,m),"utf-8"),f=p.match(/^title:\s*(.+)$/m),g=p.match(/^area:\s*(.+)$/m),h=p.match(/^files:\s*(.+)$/m),S=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:S.slice(0,200)})}catch{}}catch{}if(s.length===0){y({phase:e,matches:[],todo_count:0},n);return}let i=dt(t,e),o=`${i?.phase_name??""} ${i?.goal??""} ${i?.section??""}`.toLowerCase(),a=new Set(["the","and","for","with","from","that","this","will","are","was","has","have","been","not","but","all","can","into","each","when","any","use","new"]),c=new Set(o.split(/[\s\-_/.,;:()[\]{}|]+/).map(m=>m.replace(/[^a-z0-9]/g,"")).filter(m=>m.length>2&&!a.has(m))),l=fe(t,e),d=[];if(l?.found)try{let m=H.default.join(t,l.directory);for(let p of V.default.readdirSync(m).filter(f=>f.endsWith("-PLAN.md")))try{let g=V.default.readFileSync(H.default.join(m,p),"utf-8").match(/files_modified:\s*\[([^\]]*)\]/);g&&d.push(...g[1].split(",").map(h=>h.trim().replace(/['"]/g,"")).filter(Boolean))}catch{}}catch{}let u=[];for(let m of s){let p=0,f=[],h=`${m.title} ${m.body}`.toLowerCase().split(/[\s\-_/.,;:()[\]{}|]+/).map(S=>S.replace(/[^a-z0-9]/g,"")).filter(S=>S.length>2&&!a.has(S)).filter(S=>c.has(S));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 S=m.files.filter(x=>d.some(b=>b.includes(x)||x.includes(b)));S.length>0&&(p+=.4,f.push(`files: ${S.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 Ma(t,e,n,r){let{phase:s,name:i}=n,o=s?de(s):"00",a=new Date().toISOString().split("T")[0],c=s?fe(t,s):null,l=c?H.default.join(t,c.directory):null;s&&!l&&e!=="phase-dir"&&v(`Phase ${s} directory not found`);let d,u;switch(e){case"context":d=H.default.join(l,`${o}-CONTEXT.md`),u=`---
261
261
  phase: "${o}"
262
262
  name: "${i||c?.phase_name||"Unnamed"}"
263
263
  created: ${a}
@@ -314,43 +314,43 @@ status: pending
314
314
  ## Result
315
315
 
316
316
  _Pending verification_
317
- `;break;case"phase-dir":{(!s||!i)&&b("phase and name required for phase-dir scaffold");let m=Le(i),f=`${o}-${m}`,g=E(t).phases;z.default.mkdirSync(g,{recursive:!0});let h=H.default.join(g,f);z.default.mkdirSync(h,{recursive:!0}),y({created:!0,directory:G(H.default.relative(t,h)),path:h},r,h);return}default:b(`Unknown scaffold type: ${e}. Available: context, uat, verification, phase-dir`);return}if(z.default.existsSync(d)){y({created:!1,reason:"already_exists",path:d},r,"exists");return}z.default.writeFileSync(d,u,"utf-8");let p=G(H.default.relative(t,d));y({created:!0,path:p},r,p)}function Ia(t,e,n){let r=E(t).phases,s=E(t).roadmap,i=E(t).requirements,o=E(t).state,a=ce(t),c=we(t),l=new Map,d=0,u=0;try{let C=_e(z.default.readFileSync(s,"utf-8"),t),j=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,I;for(;(I=j.exec(C))!==null;)l.set(I[1],{number:I[1],name:I[2].replace(/\(INSERTED\)/i,"").trim(),plans:0,summaries:0,status:"Not Started"})}catch{}try{let C=z.default.readdirSync(r,{withFileTypes:!0}).filter(j=>j.isDirectory()).map(j=>j.name).filter(c).sort((j,I)=>Ae(j,I));for(let j of C){let I=j.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),R=I?I[1]:j,V=I&&I[2]?I[2].replace(/-/g," "):"",X=z.default.readdirSync(H.default.join(r,j)),ae=X.filter(qe=>qe.endsWith("-PLAN.md")||qe==="PLAN.md").length,K=X.filter(qe=>qe.endsWith("-SUMMARY.md")||qe==="SUMMARY.md").length;d+=ae,u+=K;let se;ae===0?se="Not Started":K>=ae?se="Complete":K>0?se="In Progress":se="Planned";let Ce=l.get(R);l.set(R,{number:R,name:Ce?.name||V,plans:ae,summaries:K,status:se})}}catch{}let p=[...l.values()].sort((C,j)=>Ae(C.number,j.number)),m=p.filter(C=>C.status==="Complete").length,f=d>0?Math.min(100,Math.round(u/d*100)):0,g=p.length>0?Math.min(100,Math.round(m/p.length*100)):0,h=0,x=0;try{if(z.default.existsSync(i)){let C=z.default.readFileSync(i,"utf-8");x=(C.match(/^- \[x\] \*\*/gm)||[]).length,h=x+(C.match(/^- \[ \] \*\*/gm)||[]).length}}catch{}let S=null;try{if(z.default.existsSync(o)){let C=z.default.readFileSync(o,"utf-8");S=(C.match(/^last_activity:\s*(.+)$/im)??C.match(/\*\*Last Activity:\*\*\s*(.+)/i)??C.match(/^Last Activity:\s*(.+)$/im))?.[1]?.trim()??null}}catch{}let v=0,P=null,k=de(t,["rev-list","--count","HEAD"]);k.exitCode===0&&(v=parseInt(k.stdout,10)||0);let $=de(t,["rev-list","--max-parents=0","HEAD"]);if($.exitCode===0&&$.stdout){let C=de(t,["show","-s","--format=%as",$.stdout.split(`
318
- `)[0].trim()]);C.exitCode===0&&(P=C.stdout||null)}let D={milestone_version:a.version,milestone_name:a.name,phases:p,phases_completed:m,phases_total:p.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:P,last_activity:S};if(e==="table"){let j=Math.round(g/100*10),I="\u2588".repeat(j)+"\u2591".repeat(10-j),R=`# ${a.version} ${a.name} - Statistics
319
-
320
- **Progress:** [${I}] ${m}/${p.length} phases (${g}%)
321
- `;d>0&&(R+=`**Plans:** ${u}/${d} complete (${f}%)
322
- `),R+=`**Phases:** ${m}/${p.length} complete
323
- `,h>0&&(R+=`**Requirements:** ${x}/${h} complete
324
- `),R+=`
317
+ `;break;case"phase-dir":{(!s||!i)&&v("phase and name required for phase-dir scaffold");let p=Le(i),f=`${o}-${p}`,g=j(t).phases;V.default.mkdirSync(g,{recursive:!0});let h=H.default.join(g,f);V.default.mkdirSync(h,{recursive:!0}),y({created:!0,directory:B(H.default.relative(t,h)),path:h},r,h);return}default:v(`Unknown scaffold type: ${e}. Available: context, uat, verification, phase-dir`);return}if(V.default.existsSync(d)){y({created:!1,reason:"already_exists",path:d},r,"exists");return}V.default.writeFileSync(d,u,"utf-8");let m=B(H.default.relative(t,d));y({created:!0,path:m},r,m)}function Ia(t,e,n){let r=j(t).phases,s=j(t).roadmap,i=j(t).requirements,o=j(t).state,a=ie(t),c=_e(t),l=new Map,d=0,u=0;try{let A=ve(V.default.readFileSync(s,"utf-8"),t),W=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,F;for(;(F=W.exec(A))!==null;)l.set(F[1],{number:F[1],name:F[2].replace(/\(INSERTED\)/i,"").trim(),plans:0,summaries:0,status:"Not Started"})}catch{}try{let A=V.default.readdirSync(r,{withFileTypes:!0}).filter(W=>W.isDirectory()).map(W=>W.name).filter(c).sort((W,F)=>$e(W,F));for(let W of A){let F=W.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),U=F?F[1]:W,Y=F&&F[2]?F[2].replace(/-/g," "):"",le=V.default.readdirSync(H.default.join(r,W)),be=le.filter(qe=>qe.endsWith("-PLAN.md")||qe==="PLAN.md").length,te=le.filter(qe=>qe.endsWith("-SUMMARY.md")||qe==="SUMMARY.md").length;d+=be,u+=te;let pe;be===0?pe="Not Started":te>=be?pe="Complete":te>0?pe="In Progress":pe="Planned";let Oe=l.get(U);l.set(U,{number:U,name:Oe?.name||Y,plans:be,summaries:te,status:pe})}}catch{}let m=[...l.values()].sort((A,W)=>$e(A.number,W.number)),p=m.filter(A=>A.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,S=0;try{if(V.default.existsSync(i)){let A=V.default.readFileSync(i,"utf-8");S=(A.match(/^- \[x\] \*\*/gm)||[]).length,h=S+(A.match(/^- \[ \] \*\*/gm)||[]).length}}catch{}let x=null;try{if(V.default.existsSync(o)){let A=V.default.readFileSync(o,"utf-8");x=(A.match(/^last_activity:\s*(.+)$/im)??A.match(/\*\*Last Activity:\*\*\s*(.+)/i)??A.match(/^Last Activity:\s*(.+)$/im))?.[1]?.trim()??null}}catch{}let b=0,P=null,k=ae(t,["rev-list","--count","HEAD"]);k.exitCode===0&&(b=parseInt(k.stdout,10)||0);let $=ae(t,["rev-list","--max-parents=0","HEAD"]);if($.exitCode===0&&$.stdout){let A=ae(t,["show","-s","--format=%as",$.stdout.split(`
318
+ `)[0].trim()]);A.exitCode===0&&(P=A.stdout||null)}let M={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:S,git_commits:b,git_first_commit_date:P,last_activity:x};if(e==="table"){let W=Math.round(g/100*10),F="\u2588".repeat(W)+"\u2591".repeat(10-W),U=`# ${a.version} ${a.name} - Statistics
319
+
320
+ **Progress:** [${F}] ${p}/${m.length} phases (${g}%)
321
+ `;d>0&&(U+=`**Plans:** ${u}/${d} complete (${f}%)
322
+ `),U+=`**Phases:** ${p}/${m.length} complete
323
+ `,h>0&&(U+=`**Requirements:** ${S}/${h} complete
324
+ `),U+=`
325
325
  | Phase | Name | Plans | Completed | Status |
326
326
  |-------|------|-------|-----------|--------|
327
- `;for(let V of p)R+=`| ${V.number} | ${V.name} | ${V.plans} | ${V.summaries} | ${V.status} |
328
- `;v>0&&(R+=`
329
- **Git:** ${v} commits`,P&&(R+=` (since ${P})`),R+=`
330
- `),S&&(R+=`**Last activity:** ${S}
331
- `),y({rendered:R},n,R)}else y(D,n)}var z,H,ve=L(()=>{"use strict";z=U(require("fs")),H=U(require("path"));he();Ve();Dt();ln()});var Bt,ts,Wr=L(()=>{"use strict";Bt=require("@oclif/core");je();ts=class t extends w{static description="Scaffold a GSD artefact";static args={type:Bt.Args.string({required:!0})};static flags={...w.baseFlags,phase:Bt.Flags.string({description:"Phase number"}),name:Bt.Flags.string({description:"Artefact name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdScaffold:i}=await Promise.resolve().then(()=>(ve(),be));i(r,n.type,{phase:e.phase??null,name:e.name??null},s)}}});var ns,ss,qr=L(()=>{"use strict";ns=require("@oclif/core");je();ss=class t extends w{static description="Commit GSD changes to git";static flags={...w.baseFlags,amend:ns.Flags.boolean({description:"Amend last commit",default:!1}),"no-verify":ns.Flags.boolean({description:"Skip git hooks",default:!1}),files:ns.Flags.string({description:"Files to include",multiple:!0})};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdCommit:i}=await Promise.resolve().then(()=>(ve(),be)),a=n.filter(c=>!c.startsWith("--")).join(" ")||void 0;i(r,a,e.files??[],s,e.amend,e["no-verify"])}}});var tt,rs,is,os,Lr=L(()=>{"use strict";tt=require("@oclif/core");je();rs=class t extends w{static description="Get frontmatter field from a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),an))).cmdFrontmatterGet(r,n.file,e.field??null,s)}},is=class t extends w{static description="Set frontmatter field in a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"}),value:tt.Flags.string({description:"Field value"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),an))).cmdFrontmatterSet(r,n.file,e.field,e.value,s)}},os=class t extends w{static description="Merge frontmatter data into a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,data:tt.Flags.string({description:"JSON data to merge"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),an))).cmdFrontmatterMerge(r,n.file,e.data,s)}}});var Js={};ye(Js,{cmdTemplateFill:()=>Da,cmdTemplateSelect:()=>Ta});function Ta(t,e,n){e||b("plan-path required");try{let r=Gt.default.join(t,e),s=as.default.readFileSync(r,"utf-8"),i=(s.match(/###\s*Task\s*\d+/g)||[]).length,o=(s.match(/decision/gi)||[]).length>0,a=new Set,c=/`([^`]+\.[a-zA-Z]+)`/g,l;for(;(l=c.exec(s))!==null;)l[1].includes("/")&&!l[1].startsWith("http")&&a.add(l[1]);let d=a.size,u="templates/summary-standard.md",p="standard";i<=2&&d<=3&&!o?(u="templates/summary-minimal.md",p="minimal"):(o||d>6||i>5)&&(u="templates/summary-complex.md",p="complex"),y({template:u,type:p,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 Da(t,e,n,r){e||b("template type required: summary, plan, or verification"),n.phase||b("--phase required");let s=ge(t,n.phase);if(!s||!s.found){y({error:"Phase not found",phase:n.phase},r);return}let i=me(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||{},p,m,f;switch(e){case"summary":p={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},m=[`# 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":p={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},m=[`# 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":p={phase:l,verified:new Date().toISOString(),status:"pending",score:"0/0 must-haves verified",...u},m=[`# 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(`
334
- `),f=`${i}-VERIFICATION.md`;break;default:b(`Unknown template type: ${e}. Available: summary, plan, verification`);return}let g=`---
335
- ${$t(p)}
327
+ `;for(let Y of m)U+=`| ${Y.number} | ${Y.name} | ${Y.plans} | ${Y.summaries} | ${Y.status} |
328
+ `;b>0&&(U+=`
329
+ **Git:** ${b} commits`,P&&(U+=` (since ${P})`),U+=`
330
+ `),x&&(U+=`**Last activity:** ${x}
331
+ `),y({rendered:U},n,U)}else y(M,n)}var V,H,Se=q(()=>{"use strict";V=L(require("fs")),H=L(require("path"));ge();Ve();Dt();ln()});var Bt,ts,Wr=q(()=>{"use strict";Bt=require("@oclif/core");Ce();ts=class t extends w{static description="Scaffold a GSD artefact";static args={type:Bt.Args.string({required:!0})};static flags={...w.baseFlags,phase:Bt.Flags.string({description:"Phase number"}),name:Bt.Flags.string({description:"Artefact name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdScaffold:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.type,{phase:e.phase??null,name:e.name??null},s)}}});var ns,ss,qr=q(()=>{"use strict";ns=require("@oclif/core");Ce();ss=class t extends w{static description="Commit GSD changes to git";static flags={...w.baseFlags,amend:ns.Flags.boolean({description:"Amend last commit",default:!1}),"no-verify":ns.Flags.boolean({description:"Skip git hooks",default:!1}),files:ns.Flags.string({description:"Files to include",multiple:!0})};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdCommit:i}=await Promise.resolve().then(()=>(Se(),xe)),a=n.filter(c=>!c.startsWith("--")).join(" ")||void 0;i(r,a,e.files??[],s,e.amend,e["no-verify"])}}});var tt,rs,is,os,Lr=q(()=>{"use strict";tt=require("@oclif/core");Ce();rs=class t extends w{static description="Get frontmatter field from a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),an))).cmdFrontmatterGet(r,n.file,e.field??null,s)}},is=class t extends w{static description="Set frontmatter field in a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"}),value:tt.Flags.string({description:"Field value"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),an))).cmdFrontmatterSet(r,n.file,e.field,e.value,s)}},os=class t extends w{static description="Merge frontmatter data into a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,data:tt.Flags.string({description:"JSON data to merge"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ve(),an))).cmdFrontmatterMerge(r,n.file,e.data,s)}}});var Js={};he(Js,{cmdTemplateFill:()=>Da,cmdTemplateSelect:()=>Ta});function Ta(t,e,n){e||v("plan-path required");try{let r=Gt.default.join(t,e),s=as.default.readFileSync(r,"utf-8"),i=(s.match(/###\s*Task\s*\d+/g)||[]).length,o=(s.match(/decision/gi)||[]).length>0,a=new Set,c=/`([^`]+\.[a-zA-Z]+)`/g,l;for(;(l=c.exec(s))!==null;)l[1].includes("/")&&!l[1].startsWith("http")&&a.add(l[1]);let d=a.size,u="templates/summary-standard.md",m="standard";i<=2&&d<=3&&!o?(u="templates/summary-minimal.md",m="minimal"):(o||d>6||i>5)&&(u="templates/summary-complex.md",m="complex"),y({template:u,type:m,taskCount:i,fileCount:d,hasDecisions:o},n,u)}catch(r){y({template:"templates/summary-standard.md",type:"standard",error:r.message},n,"templates/summary-standard.md")}}function Da(t,e,n,r){e||v("template type required: summary, plan, or verification"),n.phase||v("--phase required");let s=fe(t,n.phase);if(!s||!s.found){y({error:"Phase not found",phase:n.phase},r);return}let i=de(n.phase),o=new Date().toISOString().split("T")[0],a=n.name||s.phase_name||"Unnamed",c=s.phase_slug||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(`
334
+ `),f=`${i}-VERIFICATION.md`;break;default:v(`Unknown template type: ${e}. Available: summary, plan, verification`);return}let g=`---
335
+ ${$t(m)}
336
336
  ---
337
337
 
338
- ${m}
339
- `,h=Gt.default.join(t,s.directory,f);if(as.default.existsSync(h)){y({error:"File already exists",path:G(Gt.default.relative(t,h))},r);return}as.default.writeFileSync(h,Ie(g),"utf-8");let x=G(Gt.default.relative(t,h));y({created:!0,path:x,template:e},r,x)}var as,Gt,Ys=L(()=>{"use strict";as=U(require("fs")),Gt=U(require("path"));he();Ve()});var Ye,cs,ls,Ur=L(()=>{"use strict";Ye=require("@oclif/core");je();cs=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(()=>(Ys(),Js));i(r,n.type,s)}},ls=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(()=>(Ys(),Js)),o={};if(e.fields)try{o=JSON.parse(e.fields)}catch{}i(r,n.type,{phase:e.phase??void 0,plan:e.plan??void 0,name:e.name??void 0,type:e.type??void 0,wave:e.wave??void 0,...o},s)}}});var Et,ds,us,ms,ps,fs,Vr=L(()=>{"use strict";Et=require("@oclif/core");je();ds=class t extends w{static description="Show project progress";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdProgressRender:i}=await Promise.resolve().then(()=>(ve(),be));i(r,n.format,s)}},us=class t extends w{static description="Show project statistics";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdStats:i}=await Promise.resolve().then(()=>(ve(),be));i(r,n.format,s)}},ms=class t extends w{static description="Mark a todo as complete";static args={id:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoComplete:i}=await Promise.resolve().then(()=>(ve(),be));i(r,n.id,s)}},ps=class t extends w{static description="Match todos to phase";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoMatchPhase:i}=await Promise.resolve().then(()=>(ve(),be));i(r,n.phase,s)}},fs=class t extends w{static description="Extract fields from summary files";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags,fields:w.baseFlags.pick};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdSummaryExtract:i}=await Promise.resolve().then(()=>(ve(),be)),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 Oa(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 zr(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=Oa(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 p=t.indexOf("<",l);if(p===-1)break;if(t.startsWith(u,p))return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:p+u.length};if(t.startsWith("<!--",p)){let f=t.indexOf("-->",p+4);l=f!==-1?f+3:t.length;continue}let m=zr(t,p);m?(d.push(m.node),l=m.end):l=p+1}return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:l}}function Jt(t){let e=ft(t),n=[],r=/<(gsd-[a-zA-Z0-9_-]+)/g,s;for(;(s=r.exec(t))!==null;){let i=s.index;if(gt(i,e))continue;let o=s[1];if(!Na.has(o))continue;let a=zr(t,i);a&&(n.push({node:a.node,start:i,end:a.end}),r.lastIndex=a.end)}return n}function gs(t,e,n,r){return t.slice(0,e)+r+t.slice(n)}var Na,Hs=L(()=>{"use strict";Na=new Set(["gsd-execute","gsd-arguments","gsd-paste","gsd-include","gsd-version"])});function Br(){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 Gr=L(()=>{"use strict"});function Jr(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"),p=c.filter((g,h)=>!d.has(h)),m=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(m>=p.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,p.slice(m).join(" "),void 0),m=p.length;else if(S==="number"){let P=p[m++],k=Number(P);if(isNaN(k))throw new ht(`Argument '${x}' expected a number, got '${P}'`);n.set(x,String(k),void 0)}else if(S==="boolean"){let P=p[m++].toLowerCase();if(P!=="true"&&P!=="false")throw new ht(`Argument '${x}' expected true/false, got '${P}'`);n.set(x,P,void 0)}else n.set(x,p[m++]??"",void 0)}}let f=p.slice(m).join(" ");if(f){if(i)throw new ht(`Unexpected extra arguments: '${f}'`);s&&n.set("_extra",f,void 0)}}var ht,Xs=L(()=>{"use strict";ht=class extends Error{constructor(e){super(e),this.name="WxpArgumentsError"}}});function hs(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 Zs(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=hs(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=hs(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 Hr(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,Yr,Yt=L(()=>{"use strict";He=U(require("path")),Yr=["pi-gsd-tools","git","node","cat","ls","echo","find"]});function ys(t,e){if(t.attrs.string!==void 0)return t.attrs.string;if(t.attrs.name!==void 0){let n=e.resolve(t.attrs.name)??"",r=t.attrs.wrap;return r?`${r}${n}${r}`:n}return t.attrs.value!==void 0?t.attrs.value:""}function Zr(t,e,n){let r=t.attrs.command??"",s=Hr(r,n);if(!s.ok)throw new yt(r,"",e.snapshot(),s.reason);let i=t.children.find(u=>u.tag==="args"),o=t.children.find(u=>u.tag==="outs"),a=i?i.children.filter(u=>u.tag==="arg").map(u=>ys(u,e)):[],c=o?o.children.some(u=>u.tag==="suppress-errors"):!1,l=o?o.children.filter(u=>u.tag==="out"&&u.attrs.name).map(u=>u.attrs.name):[],d="";try{d=(0,Xr.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 p=u,m=(p.stderr??p.message??String(u)).trim();throw new yt(r,m,e.snapshot(),`Shell '${r} ${a.join(" ")}' failed: ${m}`)}l.length>0&&e.set(l[0],d,void 0)}var Xr,yt,xs=L(()=>{"use strict";Xr=require("child_process");Yt();yt=class extends Error{constructor(n,r,s,i){super(i);this.command=n;this.stderr=r;this.variableSnapshot=s;this.name="WxpShellError"}command;stderr;variableSnapshot}});function Kr(t,e){if(t.attrs.op!=="split")throw new xt('<string-op> only op="split" is supported in v1');let r=t.children.find(p=>p.tag==="args"),s=t.children.find(p=>p.tag==="outs");if(!r||!s)throw new xt("<string-op> requires <args> and <outs>");let i=r.children.filter(p=>p.tag==="arg"),o=s.children.filter(p=>p.tag==="out"),a=i[0],c=i[1];if(!a)throw new xt('<string-op op="split"> requires at least 2 <arg> children');let l=ys(a,e);if(a.attrs.name&&e.get(a.attrs.name)===void 0)throw new xt(`string-op split: source variable '${a.attrs.name}' is not defined`);let d=c?ys(c,e):"",u=l.split(d);o.forEach((p,m)=>{let f=p.attrs.name;f&&e.set(f,u[m+1]??u[m]??"",void 0)})}var xt,Ks=L(()=>{"use strict";xs();xt=class extends Error{constructor(e){super(e),this.name="WxpStringOpError"}}});function Ss(t,e){return t.attrs.name?e.resolve(t.attrs.name)??"":t.attrs.value!==void 0?t.attrs.value:""}function Qr(t){return t.attrs.type==="number"}function qa(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(Qr(n)||Qr(r)){let a=Number(Ss(n,e)),c=Number(Ss(r,e));switch(t.tag){case"equals":return a===c;case"not-equals":return a!==c;case"less-than":return a<c;case"greater-than":return a>c;case"less-than-or-equal":return a<=c;case"greater-than-or-equal":return a>=c;default:return!1}}let i=Ss(n,e),o=Ss(r,e);switch(t.tag){case"equals":return i===o;case"not-equals":return i!==o;case"starts-with":return i.startsWith(o);case"contains":return i.includes(o);case"less-than":return Number(i)<Number(o);case"greater-than":return Number(i)>Number(o);case"less-than-or-equal":return Number(i)<=Number(o);case"greater-than-or-equal":return Number(i)>=Number(o);default:return!1}}function Xt(t,e){return t.tag==="and"?t.children.filter(n=>Ht.has(n.tag)).every(n=>Xt(n,e)):t.tag==="or"?t.children.filter(n=>Ht.has(n.tag)).some(n=>Xt(n,e)):qa(t,e)}function ei(t,e){let n=t.children.find(s=>s.tag==="condition");if(!n)return!1;let r=n.children.find(s=>Ht.has(s.tag));return r?Xt(r,e):!1}function ti(t,e){let n=t.children.find(r=>Ht.has(r.tag));return n?Xt(n,e):!0}var Wa,Ht,ni=L(()=>{"use strict";Wa=new Set(["equals","not-equals","starts-with","contains","less-than","greater-than","less-than-or-equal","greater-than-or-equal"]),Ht=new Set([...Wa,"and","or"])});function La(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 Ua(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 Va(t,e){let n=t.attrs.path??"",r=t.attrs.out??"",s=Zt.default.readFileSync(Kt.default.resolve(n),"utf8");e.set(r,s,void 0)}function za(t,e,n){let r=t.attrs.path??"",s=t.attrs.src??"",i=Kt.default.resolve(r);if(Zt.default.existsSync(i))throw new Error(`<write-file>: '${r}' already exists (create-only, never overwrites)`);for(let a of n.config.trustedPaths){let c=hs(a,n.projectRoot,n.pkgRoot);if(i.startsWith(c+Kt.default.sep)||i===c)throw new Error(`<write-file>: cannot write to trusted harness path '${r}'`)}let o=e.get(s)??"";Zt.default.mkdirSync(Kt.default.dirname(i),{recursive:!0}),Zt.default.writeFileSync(i,o,"utf8")}function Ba(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),ti(i,e)))),o){let l=o.attrs.key??"",d=o.attrs.type??"string",u=o.attrs.order??"asc";c=[...c].sort((p,m)=>{e.set(s,p,void 0);let f=e.resolve(`${s}.${l}`)??e.resolve(l)??"";e.set(s,m,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)Qs(d,e,n)}}}function Qs(t,e,n){switch(t.tag){case"shell":Zr(t,e,n.config);break;case"string-op":Kr(t,e);break;case"json-parse":Ua(t,e);break;case"read-file":Va(t,e);break;case"write-file":za(t,e,n);break;case"display":La(t,e,n);break;case"for-each":Ba(t,e,n);break;case"if":{let r=ei(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)Qs(a,e,n);break}case"gsd-execute":er(t,e,n);break;default:break}}function er(t,e,n){try{for(let r of t.children)Qs(r,e,n)}catch(r){throw r instanceof yt||r instanceof Error?new bs(r,e.snapshot(),`Execution failed: ${r.message}`):r}}var Zt,Kt,bs,tr=L(()=>{"use strict";Zt=U(require("fs")),Kt=U(require("path"));xs();Ks();ni();Yt();bs=class extends Error{constructor(n,r,s){super(s);this.cause=n;this.variableSnapshot=r;this.name="WxpExecutionError"}cause;variableSnapshot}});function si(t,e){let n=ft(t),r=/<gsd-paste\s+name="([^"]+)"\s*\/>/g,s=[],i;for(;(i=r.exec(t))!==null;)gt(i.index,n)||s.push({index:i.index,full:i[0],name:i[1]});for(let a of s)if(e.get(a.name)===void 0)throw new vs(a.name,e.snapshot());let o=t;for(let a=s.length-1;a>=0;a--){let c=s[a],l=e.get(c.name);o=o.slice(0,c.index)+l+o.slice(c.index+c.full.length)}return o}var vs,nr=L(()=>{"use strict";Hs();vs=class extends Error{constructor(n,r){super(`<gsd-paste name="${n}" /> references undefined variable '${n}'`);this.variableName=n;this.variableSnapshot=r;this.name="WxpPasteError"}variableName;variableSnapshot}});function ii(t,e,n,r,s,i="",o=Ja){let a=Zs(e,n,r,s);if(!a.ok)throw new St(e,new Error(a.reason),{},[],[]);return Ya(t,e,n,r,s,i,o)}function Ya(t,e,n,r,s,i,o){let a=Br(),c=[],l=t,d={config:n,projectRoot:r,pkgRoot:s,onDisplay:o};for(let u=0;u<Ga;u++){let m=Jt(l).filter(g=>g.node.tag!=="gsd-version");if(m.length===0)break;let f=m.map(g=>g.node.tag);try{let g=!1;for(let x of Jt(l)){if(x.node.tag!=="gsd-include"||gt(x.start,ft(l)))continue;let S=x.node.attrs.path;if(!S)continue;let v=_s.default.resolve(r,S),P=Zs(v,n,r,s);if(!P.ok)throw new Error(`Include rejected: ${P.reason}`);let k=ri.default.readFileSync(v,"utf8"),$=_s.default.basename(v,_s.default.extname(v));for(let C of x.node.children)if(C.tag==="gsd-arguments")for(let j of C.children.filter(I=>I.tag==="arg")){let I=j.attrs.name,R=j.attrs.as;if(I&&R){let V=a.get(I);V!==void 0&&a.set(R,V,$)}}let D="include-arguments"in x.node.attrs?`
341
- ${i}`:"";l=gs(l,x.start,x.end,k+D),c.push("gsd-include"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-arguments"&&!gt(x.start,ft(l))){Jr(x.node,i,a),l=gs(l,x.start,x.end,""),c.push("gsd-arguments"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-execute"&&!gt(x.start,ft(l))){er(x.node,a,d),l=gs(l,x.start,x.end,""),c.push("gsd-execute"),g=!0;break}if(g)continue;let h=si(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 ri,_s,Ga,Ja,St,oi=L(()=>{"use strict";ri=U(require("fs")),_s=U(require("path"));Hs();Gr();Xs();tr();nr();Yt();tr();xs();nr();Ks();Xs();Ga=50,Ja=()=>{},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,ai,sr,ws,ci=L(()=>{"use strict";bt=require("@oclif/core"),ai=require("@oclif/core"),sr=U(require("path"));oi();Yt();ws=class t extends ai.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=sr.default.join(e["project-root"],".pi","gsd","workflows","_inline.md");else if(n.file){let o=await import("fs");s=sr.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:[...Yr],shellBanlist:[],shellTimeoutMs:3e4};try{let o=ii(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 li={};ye(li,{AuditUatCommand:()=>Jn,CommitCommand:()=>ss,ConfigEnsureSectionCommand:()=>En,ConfigGetCommand:()=>Cn,ConfigNewProjectCommand:()=>Rn,ConfigSetCommand:()=>An,ConfigSetModelProfileCommand:()=>jn,FrontmatterGetCommand:()=>rs,FrontmatterMergeCommand:()=>os,FrontmatterSetCommand:()=>is,InitCommand:()=>vn,MilestoneCompleteCommand:()=>qn,PhaseAddCommand:()=>Mn,PhaseCompleteCommand:()=>Dn,PhaseInsertCommand:()=>In,PhaseNextDecimalCommand:()=>Fn,PhasePlanIndexCommand:()=>On,PhaseRemoveCommand:()=>Tn,ProgressCommand:()=>ds,RequirementsMarkCompleteCommand:()=>Ln,RoadmapAnalyzeCommand:()=>kn,RoadmapGetPhaseCommand:()=>Pn,RoadmapUpdatePlanProgressCommand:()=>$n,ScaffoldCommand:()=>ts,StateAdvancePlanCommand:()=>fn,StateGetCommand:()=>un,StateJsonCommand:()=>dn,StateLoadCommand:()=>gn,StatePatchCommand:()=>pn,StateReconcileCommand:()=>yn,StateUpdateCommand:()=>mn,StateUpdateProgressCommand:()=>hn,StatsCommand:()=>us,SummaryExtractCommand:()=>fs,TemplateFillCommand:()=>ls,TemplateSelectCommand:()=>cs,TodoCompleteCommand:()=>ms,TodoMatchPhaseCommand:()=>ps,ValidateAgentsCommand:()=>Bn,ValidateConsistencyCommand:()=>Vn,ValidateHealthCommand:()=>zn,VerifyCommand:()=>Gn,WorkstreamCompleteCommand:()=>Zn,WorkstreamCreateCommand:()=>Yn,WorkstreamGetCommand:()=>Qn,WorkstreamListCommand:()=>Hn,WorkstreamProgressCommand:()=>es,WorkstreamSetCommand:()=>Kn,WorkstreamStatusCommand:()=>Xn,WxpProcessCommand:()=>ws});var di=L(()=>{"use strict";vr();wr();Pr();jr();Rr();Er();Or();Nr();Wr();qr();Lr();Ur();Vr();ci()});var ui=$i((Rd,Ha)=>{Ha.exports={name:"pi-gsd",version:"2.0.13",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 ks={};ye(ks,{cmdExtractMessages:()=>ec,cmdProfileSample:()=>tc,cmdScanSessions:()=>Qa});function rr(t){if(t)return t;let e=process.env.HOME??"",n=De.join(e,".agent","projects");return ne.existsSync(n)?n:De.join(e,".claude","projects")}function ir(){let t=process.env.HOME??"";return De.join(t,".pi","agent","sessions")}function or(t){return t.startsWith("--")&&t.endsWith("--")?"/"+t.slice(2,-2).replace(/-/g,"/"):t}function Xa(t){try{let e=ne.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 Za(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 Ka(t){try{let e=ne.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 Qa(t,e,n){let s=(e.harness??null)==="pi",i=ir(),o=ne.existsSync(i),a=[];if(o)try{let p=ne.readdirSync(i,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of p){let f=De.join(i,m.name),g=ne.readdirSync(f).filter(h=>h.endsWith(".jsonl"));a.push({name:m.name,sessions:g.length,path:f,source:"pi",cwd:or(m.name)})}}catch{}let c=rr(s&&!t?null:t),l=!s||t?ne.existsSync(c):!1,d=[];if(l&&(!s||t))try{let p=ne.readdirSync(c,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of p){let f=De.join(c,m.name),g=ne.readdirSync(f).filter(h=>h.endsWith(".jsonl")||h.endsWith(".json"));d.push({name:m.name,sessions:g.length,path:f,source:"claude"})}}catch{}let u=s?[...a,...d]:[...d,...a];if(u.length===0){let p=[];o?p.push(i):p.push(i+" (not found)"),s||p.push(l?c:c+" (not found)"),y({available:!1,reason:`No sessions found. Searched: ${p.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 ec(t,e,n,r){let s=ir(),i=null,o="claude";if(ne.existsSync(s)){let d=De.join(s,t);if(ne.existsSync(d))i=d,o="pi";else try{let u=ne.readdirSync(s,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of u){let m=or(p.name);if(m.endsWith("/"+t)||m===t||p.name===t){i=De.join(s,p.name),o="pi";break}}}catch{}}if(!i){let d=rr(r),u=De.join(d,t);ne.existsSync(u)&&(i=u,o="claude")}if(!i){y({error:`Project not found: ${t}`,available_projects:[]},n);return}let a=[],c=ne.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"||Xa(u))try{let p=ne.readFileSync(u,"utf-8").split(`
345
- `).filter(Boolean);for(let m of p)try{let f=JSON.parse(m);if(f.type==="message"&&f.message&&(a.push(f.message),l&&a.length>=l))break}catch{}}catch{}else try{let p=ne.readFileSync(u,"utf-8").split(`
346
- `).filter(Boolean);for(let m of p)try{let f=JSON.parse(m);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 tc(t,e,n){let s=(e.harness??null)==="pi",i=e.limit??150,o=e.maxChars??500,a=[],c=ir();if(ne.existsSync(c))try{let d=ne.readdirSync(c,{withFileTypes:!0}).filter(u=>u.isDirectory());e:for(let u of d){let p=De.join(c,u.name),m=ne.readdirSync(p).filter(g=>g.endsWith(".jsonl")),f=0;for(let g of m){let h=Ka(De.join(p,g));for(let x of h)if(x.message?.role==="user"){let S=Za(x.message.content).slice(0,o);if(S.length>20){if(a.push({project:or(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=rr(t);if(ne.existsSync(d))try{let u=ne.readdirSync(d,{withFileTypes:!0}).filter(p=>p.isDirectory());e:for(let p of u){let m=De.join(d,p.name),f=ne.readdirSync(m).filter(h=>h.endsWith(".jsonl")),g=0;for(let h of f)try{let x=ne.readFileSync(De.join(m,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 P=(v.content||v.message||"").slice(0,o);if(P.length>20){if(a.push({project:p.name,text:P,source:"claude"}),g++,e.maxPerProject&&g>=e.maxPerProject)break;if(a.length>=i)break e}}}catch{}}catch{}}}catch{}}if(a.length===0){y({available:!1,reason:"No user messages found in any session",samples:[],count:0},n);return}y({available:!0,samples:a,count:a.length},n)}var ne,De,Ps=L(()=>{"use strict";he();ne=require("fs"),De=require("path")});var Ft={};ye(Ft,{cmdGenerateClaudeMd:()=>ac,cmdGenerateClaudeProfile:()=>oc,cmdGenerateDevPreferences:()=>ic,cmdProfileQuestionnaire:()=>rc,cmdWriteProfile:()=>sc});function $s(t,e,n="CLAUDE.md"){return e?We.default.resolve(e):We.default.join(t,n)}function ar(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 nc(t){return t.map(e=>`## ${e.heading}
338
+ ${p}
339
+ `,h=Gt.default.join(t,s.directory,f);if(as.default.existsSync(h)){y({error:"File already exists",path:B(Gt.default.relative(t,h))},r);return}as.default.writeFileSync(h,Me(g),"utf-8");let S=B(Gt.default.relative(t,h));y({created:!0,path:S,template:e},r,S)}var as,Gt,Ys=q(()=>{"use strict";as=L(require("fs")),Gt=L(require("path"));ge();Ve()});var Ye,cs,ls,Ur=q(()=>{"use strict";Ye=require("@oclif/core");Ce();cs=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(()=>(Ys(),Js));i(r,n.type,s)}},ls=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(()=>(Ys(),Js)),o={};if(e.fields)try{o=JSON.parse(e.fields)}catch{}i(r,n.type,{phase:e.phase??void 0,plan:e.plan??void 0,name:e.name??void 0,type:e.type??void 0,wave:e.wave??void 0,...o},s)}}});var Et,ds,us,ms,ps,fs,Vr=q(()=>{"use strict";Et=require("@oclif/core");Ce();ds=class t extends w{static description="Show project progress";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdProgressRender:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.format,s)}},us=class t extends w{static description="Show project statistics";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdStats:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.format,s)}},ms=class t extends w{static description="Mark a todo as complete";static args={id:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoComplete:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.id,s)}},ps=class t extends w{static description="Match todos to phase";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoMatchPhase:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.phase,s)}},fs=class t extends w{static description="Extract fields from summary files";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags,fields:w.baseFlags.pick};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdSummaryExtract:i}=await Promise.resolve().then(()=>(Se(),xe)),o=e.fields?e.fields.split(","):null;i(r,n.phase,o,s)}}});function ft(t){let e=[],n=/^```[^\n]*\n[\s\S]*?^```/gm,r;for(;(r=n.exec(t))!==null;)e.push([r.index,r.index+r[0].length]);return e}function gt(t,e){return e.some(([n,r])=>t>=n&&t<r)}function Oa(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 zr(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=Oa(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=zr(t,m);p?(d.push(p.node),l=p.end):l=m+1}return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:l}}function Jt(t){let e=ft(t),n=[],r=/<(gsd-[a-zA-Z0-9_-]+)/g,s;for(;(s=r.exec(t))!==null;){let i=s.index;if(gt(i,e))continue;let o=s[1];if(!Na.has(o))continue;let a=zr(t,i);a&&(n.push({node:a.node,start:i,end:a.end}),r.lastIndex=a.end)}return n}function gs(t,e,n,r){return t.slice(0,e)+r+t.slice(n)}var Na,Hs=q(()=>{"use strict";Na=new Set(["gsd-execute","gsd-arguments","gsd-paste","gsd-include","gsd-version"])});function Br(){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 Gr=q(()=>{"use strict"});function Jr(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(S=>S.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}`,S=c.indexOf(h),x=g.attrs.name;x&&(S===-1?n.set(x,"false",void 0):(n.set(x,"true",void 0),d.add(S)))}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],S=h.attrs.name,x=h.attrs.type??"string",b=g===u.length-1;if(S){if(p>=m.length){if(!("optional"in h.attrs))throw new ht(`Missing required argument '${S}' (type: ${x})`);n.set(S,"",void 0);continue}if(x==="string"&&b)n.set(S,m.slice(p).join(" "),void 0),p=m.length;else if(x==="number"){let P=m[p++],k=Number(P);if(isNaN(k))throw new ht(`Argument '${S}' expected a number, got '${P}'`);n.set(S,String(k),void 0)}else if(x==="boolean"){let P=m[p++].toLowerCase();if(P!=="true"&&P!=="false")throw new ht(`Argument '${S}' expected true/false, got '${P}'`);n.set(S,P,void 0)}else n.set(S,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,Xs=q(()=>{"use strict";ht=class extends Error{constructor(e){super(e),this.name="WxpArgumentsError"}}});function hs(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 Zs(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=hs(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=hs(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 Hr(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,Yr,Yt=q(()=>{"use strict";He=L(require("path")),Yr=["pi-gsd-tools","git","node","cat","ls","echo","find"]});function ys(t,e){if(t.attrs.string!==void 0)return t.attrs.string;if(t.attrs.name!==void 0){let n=e.resolve(t.attrs.name)??"",r=t.attrs.wrap;return r?`${r}${n}${r}`:n}return t.attrs.value!==void 0?t.attrs.value:""}function Zr(t,e,n){let r=t.attrs.command??"",s=Hr(r,n);if(!s.ok)throw new yt(r,"",e.snapshot(),s.reason);let i=t.children.find(u=>u.tag==="args"),o=t.children.find(u=>u.tag==="outs"),a=i?i.children.filter(u=>u.tag==="arg").map(u=>ys(u,e)):[],c=o?o.children.some(u=>u.tag==="suppress-errors"):!1,l=o?o.children.filter(u=>u.tag==="out"&&u.attrs.name).map(u=>u.attrs.name):[],d="";try{d=(0,Xr.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 Xr,yt,xs=q(()=>{"use strict";Xr=require("child_process");Yt();yt=class extends Error{constructor(n,r,s,i){super(i);this.command=n;this.stderr=r;this.variableSnapshot=s;this.name="WxpShellError"}command;stderr;variableSnapshot}});function Kr(t,e){if(t.attrs.op!=="split")throw new xt('<string-op> only op="split" is supported in v1');let r=t.children.find(m=>m.tag==="args"),s=t.children.find(m=>m.tag==="outs");if(!r||!s)throw new xt("<string-op> requires <args> and <outs>");let i=r.children.filter(m=>m.tag==="arg"),o=s.children.filter(m=>m.tag==="out"),a=i[0],c=i[1];if(!a)throw new xt('<string-op op="split"> requires at least 2 <arg> children');let l=ys(a,e);if(a.attrs.name&&e.get(a.attrs.name)===void 0)throw new xt(`string-op split: source variable '${a.attrs.name}' is not defined`);let d=c?ys(c,e):"",u=l.split(d);o.forEach((m,p)=>{let f=m.attrs.name;f&&e.set(f,u[p+1]??u[p]??"",void 0)})}var xt,Ks=q(()=>{"use strict";xs();xt=class extends Error{constructor(e){super(e),this.name="WxpStringOpError"}}});function Ss(t,e){return t.attrs.name?e.resolve(t.attrs.name)??"":t.attrs.value!==void 0?t.attrs.value:""}function Qr(t){return t.attrs.type==="number"}function qa(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(Qr(n)||Qr(r)){let a=Number(Ss(n,e)),c=Number(Ss(r,e));switch(t.tag){case"equals":return a===c;case"not-equals":return a!==c;case"less-than":return a<c;case"greater-than":return a>c;case"less-than-or-equal":return a<=c;case"greater-than-or-equal":return a>=c;default:return!1}}let i=Ss(n,e),o=Ss(r,e);switch(t.tag){case"equals":return i===o;case"not-equals":return i!==o;case"starts-with":return i.startsWith(o);case"contains":return i.includes(o);case"less-than":return Number(i)<Number(o);case"greater-than":return Number(i)>Number(o);case"less-than-or-equal":return Number(i)<=Number(o);case"greater-than-or-equal":return Number(i)>=Number(o);default:return!1}}function Xt(t,e){return t.tag==="and"?t.children.filter(n=>Ht.has(n.tag)).every(n=>Xt(n,e)):t.tag==="or"?t.children.filter(n=>Ht.has(n.tag)).some(n=>Xt(n,e)):qa(t,e)}function ei(t,e){let n=t.children.find(s=>s.tag==="condition");if(!n)return!1;let r=n.children.find(s=>Ht.has(s.tag));return r?Xt(r,e):!1}function ti(t,e){let n=t.children.find(r=>Ht.has(r.tag));return n?Xt(n,e):!0}var Wa,Ht,ni=q(()=>{"use strict";Wa=new Set(["equals","not-equals","starts-with","contains","less-than","greater-than","less-than-or-equal","greater-than-or-equal"]),Ht=new Set([...Wa,"and","or"])});function La(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 Ua(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 Va(t,e){let n=t.attrs.path??"",r=t.attrs.out??"",s=Zt.default.readFileSync(Kt.default.resolve(n),"utf8");e.set(r,s,void 0)}function za(t,e,n){let r=t.attrs.path??"",s=t.attrs.src??"",i=Kt.default.resolve(r);if(Zt.default.existsSync(i))throw new Error(`<write-file>: '${r}' already exists (create-only, never overwrites)`);for(let a of n.config.trustedPaths){let c=hs(a,n.projectRoot,n.pkgRoot);if(i.startsWith(c+Kt.default.sep)||i===c)throw new Error(`<write-file>: cannot write to trusted harness path '${r}'`)}let o=e.get(s)??"";Zt.default.mkdirSync(Kt.default.dirname(i),{recursive:!0}),Zt.default.writeFileSync(i,o,"utf8")}function Ba(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),ti(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)Qs(d,e,n)}}}function Qs(t,e,n){switch(t.tag){case"shell":Zr(t,e,n.config);break;case"string-op":Kr(t,e);break;case"json-parse":Ua(t,e);break;case"read-file":Va(t,e);break;case"write-file":za(t,e,n);break;case"display":La(t,e,n);break;case"for-each":Ba(t,e,n);break;case"if":{let r=ei(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)Qs(a,e,n);break}case"gsd-execute":er(t,e,n);break;default:break}}function er(t,e,n){try{for(let r of t.children)Qs(r,e,n)}catch(r){throw r instanceof yt||r instanceof Error?new bs(r,e.snapshot(),`Execution failed: ${r.message}`):r}}var Zt,Kt,bs,tr=q(()=>{"use strict";Zt=L(require("fs")),Kt=L(require("path"));xs();Ks();ni();Yt();bs=class extends Error{constructor(n,r,s){super(s);this.cause=n;this.variableSnapshot=r;this.name="WxpExecutionError"}cause;variableSnapshot}});function si(t,e){let n=ft(t),r=/<gsd-paste\s+name="([^"]+)"\s*\/>/g,s=[],i;for(;(i=r.exec(t))!==null;)gt(i.index,n)||s.push({index:i.index,full:i[0],name:i[1]});for(let a of s)if(e.get(a.name)===void 0)throw new vs(a.name,e.snapshot());let o=t;for(let a=s.length-1;a>=0;a--){let c=s[a],l=e.get(c.name);o=o.slice(0,c.index)+l+o.slice(c.index+c.full.length)}return o}var vs,nr=q(()=>{"use strict";Hs();vs=class extends Error{constructor(n,r){super(`<gsd-paste name="${n}" /> references undefined variable '${n}'`);this.variableName=n;this.variableSnapshot=r;this.name="WxpPasteError"}variableName;variableSnapshot}});function ii(t,e,n,r,s,i="",o=Ja){let a=Zs(e,n,r,s);if(!a.ok)throw new St(e,new Error(a.reason),{},[],[]);return Ya(t,e,n,r,s,i,o)}function Ya(t,e,n,r,s,i,o){let a=Br(),c=[],l=t,d={config:n,projectRoot:r,pkgRoot:s,onDisplay:o};for(let u=0;u<Ga;u++){let p=Jt(l).filter(g=>g.node.tag!=="gsd-version");if(p.length===0)break;let f=p.map(g=>g.node.tag);try{let g=!1;for(let S of Jt(l)){if(S.node.tag!=="gsd-include"||gt(S.start,ft(l)))continue;let x=S.node.attrs.path;if(!x)continue;let b=_s.default.resolve(r,x),P=Zs(b,n,r,s);if(!P.ok)throw new Error(`Include rejected: ${P.reason}`);let k=ri.default.readFileSync(b,"utf8"),$=_s.default.basename(b,_s.default.extname(b));for(let A of S.node.children)if(A.tag==="gsd-arguments")for(let W of A.children.filter(F=>F.tag==="arg")){let F=W.attrs.name,U=W.attrs.as;if(F&&U){let Y=a.get(F);Y!==void 0&&a.set(U,Y,$)}}let M="include-arguments"in S.node.attrs?`
341
+ ${i}`:"";l=gs(l,S.start,S.end,k+M),c.push("gsd-include"),g=!0;break}if(g)continue;for(let S of Jt(l))if(S.node.tag==="gsd-arguments"&&!gt(S.start,ft(l))){Jr(S.node,i,a),l=gs(l,S.start,S.end,""),c.push("gsd-arguments"),g=!0;break}if(g)continue;for(let S of Jt(l))if(S.node.tag==="gsd-execute"&&!gt(S.start,ft(l))){er(S.node,a,d),l=gs(l,S.start,S.end,""),c.push("gsd-execute"),g=!0;break}if(g)continue;let h=si(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 ri,_s,Ga,Ja,St,oi=q(()=>{"use strict";ri=L(require("fs")),_s=L(require("path"));Hs();Gr();Xs();tr();nr();Yt();tr();xs();nr();Ks();Xs();Ga=50,Ja=()=>{},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,ai,sr,ws,ci=q(()=>{"use strict";bt=require("@oclif/core"),ai=require("@oclif/core"),sr=L(require("path"));oi();Yt();ws=class t extends ai.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=sr.default.join(e["project-root"],".pi","gsd","workflows","_inline.md");else if(n.file){let o=await import("fs");s=sr.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:[...Yr],shellBanlist:[],shellTimeoutMs:3e4};try{let o=ii(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 li={};he(li,{AuditUatCommand:()=>Jn,CommitCommand:()=>ss,ConfigEnsureSectionCommand:()=>En,ConfigGetCommand:()=>Cn,ConfigNewProjectCommand:()=>Rn,ConfigSetCommand:()=>An,ConfigSetModelProfileCommand:()=>jn,FrontmatterGetCommand:()=>rs,FrontmatterMergeCommand:()=>os,FrontmatterSetCommand:()=>is,InitCommand:()=>vn,MilestoneCompleteCommand:()=>qn,PhaseAddCommand:()=>Mn,PhaseCompleteCommand:()=>Dn,PhaseInsertCommand:()=>In,PhaseNextDecimalCommand:()=>Fn,PhasePlanIndexCommand:()=>On,PhaseRemoveCommand:()=>Tn,ProgressCommand:()=>ds,RequirementsMarkCompleteCommand:()=>Ln,RoadmapAnalyzeCommand:()=>kn,RoadmapGetPhaseCommand:()=>Pn,RoadmapUpdatePlanProgressCommand:()=>$n,ScaffoldCommand:()=>ts,StateAdvancePlanCommand:()=>fn,StateGetCommand:()=>un,StateJsonCommand:()=>dn,StateLoadCommand:()=>gn,StatePatchCommand:()=>pn,StateReconcileCommand:()=>yn,StateUpdateCommand:()=>mn,StateUpdateProgressCommand:()=>hn,StatsCommand:()=>us,SummaryExtractCommand:()=>fs,TemplateFillCommand:()=>ls,TemplateSelectCommand:()=>cs,TodoCompleteCommand:()=>ms,TodoMatchPhaseCommand:()=>ps,ValidateAgentsCommand:()=>Bn,ValidateConsistencyCommand:()=>Vn,ValidateHealthCommand:()=>zn,VerifyCommand:()=>Gn,WorkstreamCompleteCommand:()=>Zn,WorkstreamCreateCommand:()=>Yn,WorkstreamGetCommand:()=>Qn,WorkstreamListCommand:()=>Hn,WorkstreamProgressCommand:()=>es,WorkstreamSetCommand:()=>Kn,WorkstreamStatusCommand:()=>Xn,WxpProcessCommand:()=>ws});var di=q(()=>{"use strict";vr();wr();Pr();jr();Rr();Er();Or();Nr();Wr();qr();Lr();Ur();Vr();ci()});var ui=$i((Rd,Ha)=>{Ha.exports={name:"pi-gsd",version:"2.0.16",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 ks={};he(ks,{cmdExtractMessages:()=>ec,cmdProfileSample:()=>tc,cmdScanSessions:()=>Qa});function rr(t){if(t)return t;let e=process.env.HOME??"",n=Te.join(e,".agent","projects");return ee.existsSync(n)?n:Te.join(e,".claude","projects")}function ir(){let t=process.env.HOME??"";return Te.join(t,".pi","agent","sessions")}function or(t){return t.startsWith("--")&&t.endsWith("--")?"/"+t.slice(2,-2).replace(/-/g,"/"):t}function Xa(t){try{let e=ee.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 Za(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 Ka(t){try{let e=ee.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 Qa(t,e,n){let s=(e.harness??null)==="pi",i=ir(),o=ee.existsSync(i),a=[];if(o)try{let m=ee.readdirSync(i,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=Te.join(i,p.name),g=ee.readdirSync(f).filter(h=>h.endsWith(".jsonl"));a.push({name:p.name,sessions:g.length,path:f,source:"pi",cwd:or(p.name)})}}catch{}let c=rr(s&&!t?null:t),l=!s||t?ee.existsSync(c):!1,d=[];if(l&&(!s||t))try{let m=ee.readdirSync(c,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=Te.join(c,p.name),g=ee.readdirSync(f).filter(h=>h.endsWith(".jsonl")||h.endsWith(".json"));d.push({name:p.name,sessions:g.length,path:f,source:"claude"})}}catch{}let u=s?[...a,...d]:[...d,...a];if(u.length===0){let m=[];o?m.push(i):m.push(i+" (not found)"),s||m.push(l?c:c+" (not found)"),y({available:!1,reason:`No sessions found. Searched: ${m.join(", ")}`,projects:[],count:0},n);return}y({available:!0,pi_base:o?i:null,claude_base:l?c:null,projects:u,count:u.length},n)}async function ec(t,e,n,r){let s=ir(),i=null,o="claude";if(ee.existsSync(s)){let d=Te.join(s,t);if(ee.existsSync(d))i=d,o="pi";else try{let u=ee.readdirSync(s,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of u){let p=or(m.name);if(p.endsWith("/"+t)||p===t||m.name===t){i=Te.join(s,m.name),o="pi";break}}}catch{}}if(!i){let d=rr(r),u=Te.join(d,t);ee.existsSync(u)&&(i=u,o="claude")}if(!i){y({error:`Project not found: ${t}`,available_projects:[]},n);return}let a=[],c=ee.readdirSync(i).filter(d=>d.endsWith(".jsonl")),l=e.limit??null;for(let d of c){if(e.sessionId&&!d.includes(e.sessionId))continue;let u=Te.join(i,d);if(o==="pi"||Xa(u))try{let m=ee.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=ee.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 tc(t,e,n){let s=(e.harness??null)==="pi",i=e.limit??150,o=e.maxChars??500,a=[],c=ir();if(ee.existsSync(c))try{let d=ee.readdirSync(c,{withFileTypes:!0}).filter(u=>u.isDirectory());e:for(let u of d){let m=Te.join(c,u.name),p=ee.readdirSync(m).filter(g=>g.endsWith(".jsonl")),f=0;for(let g of p){let h=Ka(Te.join(m,g));for(let S of h)if(S.message?.role==="user"){let x=Za(S.message.content).slice(0,o);if(x.length>20){if(a.push({project:or(u.name),text:x,source:"pi"}),f++,e.maxPerProject&&f>=e.maxPerProject)break;if(a.length>=i)break e}}}}}catch{}if(!(s&&!t&&a.length>=i)){let d=rr(t);if(ee.existsSync(d))try{let u=ee.readdirSync(d,{withFileTypes:!0}).filter(m=>m.isDirectory());e:for(let m of u){let p=Te.join(d,m.name),f=ee.readdirSync(p).filter(h=>h.endsWith(".jsonl")),g=0;for(let h of f)try{let S=ee.readFileSync(Te.join(p,h),"utf-8").split(`
347
+ `).filter(Boolean);for(let x of S)try{let b=JSON.parse(x);if(b.role==="human"||b.type==="human"){let P=(b.content||b.message||"").slice(0,o);if(P.length>20){if(a.push({project:m.name,text:P,source:"claude"}),g++,e.maxPerProject&&g>=e.maxPerProject)break;if(a.length>=i)break e}}}catch{}}catch{}}}catch{}}if(a.length===0){y({available:!1,reason:"No user messages found in any session",samples:[],count:0},n);return}y({available:!0,samples:a,count:a.length},n)}var ee,Te,Ps=q(()=>{"use strict";ge();ee=require("fs"),Te=require("path")});var Ft={};he(Ft,{cmdGenerateClaudeMd:()=>ac,cmdGenerateClaudeProfile:()=>oc,cmdGenerateDevPreferences:()=>ic,cmdProfileQuestionnaire:()=>rc,cmdWriteProfile:()=>sc});function $s(t,e,n="CLAUDE.md"){return e?We.default.resolve(e):We.default.join(t,n)}function ar(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 nc(t){return t.map(e=>`## ${e.heading}
348
348
 
349
349
  ${e.body}`).join(`
350
350
 
351
351
  `)+`
352
- `}function sc(t,e,n){e.input||b("--input <analysis-json-path> is required");let r=ar(e.input,t);if(!r){y({error:"Could not load analysis file",input:e.input},n);return}let s=$s(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?nc(i):JSON.stringify(r,null,2)+`
353
- `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:G(We.default.relative(t,s))},n,s)}function rc(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 ic(t,e,n){let r=ar(e.analysis,t),s=$s(t,e.output,".dev-preferences.md"),i=e.stack?`
352
+ `}function sc(t,e,n){e.input||v("--input <analysis-json-path> is required");let r=ar(e.input,t);if(!r){y({error:"Could not load analysis file",input:e.input},n);return}let s=$s(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?nc(i):JSON.stringify(r,null,2)+`
353
+ `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:B(We.default.relative(t,s))},n,s)}function rc(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 ic(t,e,n){let r=ar(e.analysis,t),s=$s(t,e.output,".dev-preferences.md"),i=e.stack?`
354
354
 
355
355
  ## Stack
356
356
 
@@ -362,7 +362,7 @@ ${JSON.stringify(r,null,2)}
362
362
  `:`# Developer Preferences
363
363
 
364
364
  *No analysis provided - edit manually.*${i}
365
- `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:G(We.default.relative(t,s))},n,s)}function oc(t,e,n){let r=ar(e.analysis,t),s=e.global?We.default.join(process.env.HOME??"",".claude","CLAUDE.md"):$s(t,e.output,"CLAUDE.md");nt.default.mkdirSync(We.default.dirname(s),{recursive:!0});let i=r?`# Claude Profile
365
+ `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:B(We.default.relative(t,s))},n,s)}function oc(t,e,n){let r=ar(e.analysis,t),s=e.global?We.default.join(process.env.HOME??"",".claude","CLAUDE.md"):$s(t,e.output,"CLAUDE.md");nt.default.mkdirSync(We.default.dirname(s),{recursive:!0});let i=r?`# Claude Profile
366
366
 
367
367
  *Generated from session analysis*
368
368
 
@@ -370,7 +370,7 @@ ${JSON.stringify(r,null,2)}
370
370
  `:`# Claude Profile
371
371
 
372
372
  *No analysis provided - edit manually.*
373
- `;nt.default.writeFileSync(s,i,"utf-8"),y({written:!0,path:e.global?s:G(We.default.relative(t,s))},n,s)}function ac(t,e,n){let r=e.harness==="pi"?"AGENTS.md":"CLAUDE.md",s=$s(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:G(We.default.relative(t,s))},n,"exists");return}let o=`# ${e.harness==="pi"?"AGENTS.md":"CLAUDE.md"}
373
+ `;nt.default.writeFileSync(s,i,"utf-8"),y({written:!0,path:e.global?s:B(We.default.relative(t,s))},n,s)}function ac(t,e,n){let r=e.harness==="pi"?"AGENTS.md":"CLAUDE.md",s=$s(t,e.output,r);if(nt.default.existsSync(s)&&!e.force&&!e.auto){y({written:!1,reason:"File already exists. Use --force to overwrite.",path:B(We.default.relative(t,s))},n,"exists");return}let o=`# ${e.harness==="pi"?"AGENTS.md":"CLAUDE.md"}
374
374
 
375
375
  *Agent profile for this project.*
376
376
 
@@ -381,9 +381,9 @@ See \`.planning/PROJECT.md\` for project overview.
381
381
  ## GSD Integration
382
382
 
383
383
  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:G(We.default.relative(t,s))},n,s)}var nt,We,Mt=L(()=>{"use strict";nt=U(require("fs")),We=U(require("path"));he()});var Oe=U(require("fs")),It=U(require("path"));he();var gr=require("jsonpath-plus");function Ms(t,e,n){let r=t;if(n&&(r=(0,gr.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 cc(){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:p,ConfigSetCommand:m,ConfigSetModelProfileCommand:f,ConfigNewProjectCommand:g,ConfigEnsureSectionCommand:h,PhaseNextDecimalCommand:x,PhaseAddCommand:S,PhaseInsertCommand:v,PhaseRemoveCommand:P,PhaseCompleteCommand:k,PhasePlanIndexCommand:$,MilestoneCompleteCommand:D,RequirementsMarkCompleteCommand:C,ValidateConsistencyCommand:j,ValidateHealthCommand:I,ValidateAgentsCommand:R,VerifyCommand:V,AuditUatCommand:X,WorkstreamCreateCommand:ae,WorkstreamListCommand:K,WorkstreamStatusCommand:se,WorkstreamCompleteCommand:Ce,WorkstreamSetCommand:qe,WorkstreamGetCommand:Tt,WorkstreamProgressCommand:Cs,ScaffoldCommand:Qt,CommitCommand:en,FrontmatterGetCommand:cr,FrontmatterSetCommand:tn,FrontmatterMergeCommand:Ee,TemplateSelectCommand:Fe,TemplateFillCommand:fi,ProgressCommand:gi,StatsCommand:hi,TodoCompleteCommand:yi,TodoMatchPhaseCommand:xi,SummaryExtractCommand:Si,WxpProcessCommand:bi}=await Promise.resolve().then(()=>(di(),li));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":p,"config-set":m,"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":P,"phase complete":k,"phase-plan-index":$,"milestone complete":D,"requirements mark-complete":C,"validate consistency":j,"validate health":I,"validate agents":R,verify:V,"audit-uat":X,"workstream create":ae,"workstream list":K,"workstream status":se,"workstream complete":Ce,"workstream set":qe,"workstream get":Tt,"workstream progress":Cs,scaffold:Qt,commit:en,"frontmatter get":cr,"frontmatter set":tn,"frontmatter merge":Ee,"template select":Fe,"template fill":fi,progress:gi,stats:hi,"todo complete":yi,"todo match-phase":xi,"summary-extract":Si,"wxp process":bi}}function lc(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 mi(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 dc(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 uc(){let t=process.argv.slice(2);if(t[0]==="--version"||t[0]==="-v"){let{version:f}=ui();process.stdout.write(`pi-gsd-tools v${f}
385
- `);return}if(t[0]==="--help"||t[0]==="-h"){pi();return}let e=process.cwd();{let f=t.find(h=>h.startsWith("--cwd=")),g=t.indexOf("--cwd");if(f){let h=f.slice(6).trim();h||b("Missing value for --cwd"),t.splice(t.indexOf(f),1),e=It.default.resolve(h)}else if(g!==-1){let h=t[g+1];(!h||h.startsWith("--"))&&b("Missing value for --cwd"),t.splice(g,2),e=It.default.resolve(h)}(!Oe.default.existsSync(e)||!Oe.default.statSync(e).isDirectory())&&b(`Invalid --cwd: ${e}`)}if(!Oe.default.existsSync(It.default.join(e,".planning"))){let f=qt(e);f!==e&&(e=f)}{let f=t.find(x=>x.startsWith("--ws=")),g=t.indexOf("--ws"),h=null;f?(h=f.slice(5).trim(),h||b("Missing value for --ws"),t.splice(t.indexOf(f),1)):g!==-1?(h=t[g+1],(!h||h.startsWith("--"))&&b("Missing value for --ws"),t.splice(g,2)):process.env.GSD_WORKSTREAM?h=process.env.GSD_WORKSTREAM.trim():h=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]){pi();return}let a=[...t,"--cwd",e];r&&a.push("--raw");let c=await cc(),l=dc(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,...P)=>S===1?(x.push(String(v)),String(v).length):h(S,v,...P);try{await c[l].run(g)}finally{Oe.default.writeSync=h;let S=x.join("");try{let v=JSON.parse(S),P=v;o&&(P=mi(v,o)??""),h(1,Ms(P,s,i??void 0))}catch{h(1,S)}}return}await c[l].run(g);return}let d=t[0],u=t;new Set(["generate-slug","current-timestamp","verify-path-exists","verify-summary","template","frontmatter","generate-model-profiles-md"]).has(d)||(e=Wt(e));let m=async()=>{await mc(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 m()}finally{Oe.default.writeSync=f;let h=g.join("");try{let x=JSON.parse(h),S=x;o&&(S=mi(x,o)??""),f(1,Ms(S,s,i??void 0))}catch{f(1,h)}}return}await m()}function pi(){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(`
384
+ `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:B(We.default.relative(t,s))},n,s)}var nt,We,Mt=q(()=>{"use strict";nt=L(require("fs")),We=L(require("path"));ge()});var De=L(require("fs")),It=L(require("path"));ge();var gr=require("jsonpath-plus");function Ms(t,e,n){let r=t;if(n&&(r=(0,gr.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 cc(){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:S,PhaseAddCommand:x,PhaseInsertCommand:b,PhaseRemoveCommand:P,PhaseCompleteCommand:k,PhasePlanIndexCommand:$,MilestoneCompleteCommand:M,RequirementsMarkCompleteCommand:A,ValidateConsistencyCommand:W,ValidateHealthCommand:F,ValidateAgentsCommand:U,VerifyCommand:Y,AuditUatCommand:le,WorkstreamCreateCommand:be,WorkstreamListCommand:te,WorkstreamStatusCommand:pe,WorkstreamCompleteCommand:Oe,WorkstreamSetCommand:qe,WorkstreamGetCommand:Tt,WorkstreamProgressCommand:Cs,ScaffoldCommand:Qt,CommitCommand:en,FrontmatterGetCommand:cr,FrontmatterSetCommand:tn,FrontmatterMergeCommand:Re,TemplateSelectCommand:Ee,TemplateFillCommand:fi,ProgressCommand:gi,StatsCommand:hi,TodoCompleteCommand:yi,TodoMatchPhaseCommand:xi,SummaryExtractCommand:Si,WxpProcessCommand:bi}=await Promise.resolve().then(()=>(di(),li));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":S,"phase add":x,"phase insert":b,"phase remove":P,"phase complete":k,"phase-plan-index":$,"milestone complete":M,"requirements mark-complete":A,"validate consistency":W,"validate health":F,"validate agents":U,verify:Y,"audit-uat":le,"workstream create":be,"workstream list":te,"workstream status":pe,"workstream complete":Oe,"workstream set":qe,"workstream get":Tt,"workstream progress":Cs,scaffold:Qt,commit:en,"frontmatter get":cr,"frontmatter set":tn,"frontmatter merge":Re,"template select":Ee,"template fill":fi,progress:gi,stats:hi,"todo complete":yi,"todo match-phase":xi,"summary-extract":Si,"wxp process":bi}}function lc(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 mi(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 dc(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 uc(){let t=process.argv.slice(2);if(t[0]==="--version"||t[0]==="-v"){let{version:f}=ui();process.stdout.write(`pi-gsd-tools v${f}
385
+ `);return}if(t[0]==="--help"||t[0]==="-h"){pi();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||v("Missing value for --cwd"),t.splice(t.indexOf(f),1),e=It.default.resolve(h)}else if(g!==-1){let h=t[g+1];(!h||h.startsWith("--"))&&v("Missing value for --cwd"),t.splice(g,2),e=It.default.resolve(h)}(!De.default.existsSync(e)||!De.default.statSync(e).isDirectory())&&v(`Invalid --cwd: ${e}`)}if(!De.default.existsSync(It.default.join(e,".planning"))){let f=qt(e);f!==e&&(e=f)}{let f=t.find(S=>S.startsWith("--ws=")),g=t.indexOf("--ws"),h=null;f?(h=f.slice(5).trim(),h||v("Missing value for --ws"),t.splice(t.indexOf(f),1)):g!==-1?(h=t[g+1],(!h||h.startsWith("--"))&&v("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)&&v("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("--"))&&v("Missing value for --output"),g!=="json"&&g!=="toon"&&v('--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("--"))&&v("Missing value for --pick"),t.splice(f,2))}if(!t[0]){pi();return}let a=[...t,"--cwd",e];r&&a.push("--raw");let c=await cc(),l=dc(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=De.default.writeSync.bind(De.default),S=[];De.default.writeSync=(x,b,...P)=>x===1?(S.push(String(b)),String(b).length):h(x,b,...P);try{await c[l].run(g)}finally{De.default.writeSync=h;let x=S.join("");try{let b=JSON.parse(x),P=b;o&&(P=mi(b,o)??""),h(1,Ms(P,s,i??void 0))}catch{h(1,x)}}return}await c[l].run(g);return}let d=t[0],u=t;new Set(["generate-slug","current-timestamp","verify-path-exists","verify-summary","template","frontmatter","generate-model-profiles-md"]).has(d)||(e=Wt(e));let p=async()=>{await mc(d,u,e,r)};if(o||i||s!=="json"){let f=De.default.writeSync.bind(De.default),g=[];De.default.writeSync=(h,S,...x)=>h===1?(g.push(String(S)),String(S).length):f(h,S,...x);try{await p()}finally{De.default.writeSync=f;let h=g.join("");try{let S=JSON.parse(h),x=S;o&&(x=mi(S,o)??""),f(1,Ms(x,s,i??void 0))}catch{f(1,h)}}return}await p()}function pi(){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
386
  `)+`
387
- `)}async function mc(t,e,n,r){switch(t){case"resolve-model":{let{cmdResolveModel:s}=await Promise.resolve().then(()=>(ve(),be));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(()=>(ve(),be)),i=e.indexOf("--files"),o=e.slice(1,i!==-1?i:e.length).filter(c=>!c.startsWith("--")),a=i!==-1?e.slice(i+1).filter(c=>!c.startsWith("--")):[];s(n,o.join(" ")||void 0,a,r);break}case"verify-summary":{let{cmdVerifySummary:s}=await Promise.resolve().then(()=>(Rt(),jt)),i=e[2]?parseInt(e[2],10):2;s(n,e[1],i,r);break}case"generate-slug":{let{cmdGenerateSlug:s}=await Promise.resolve().then(()=>(ve(),be));s(e[1],r);break}case"current-timestamp":{let{cmdCurrentTimestamp:s}=await Promise.resolve().then(()=>(ve(),be));s(e[1],r);break}case"list-todos":{let{cmdListTodos:s}=await Promise.resolve().then(()=>(ve(),be));s(n,e[1],r);break}case"verify-path-exists":{let{cmdVerifyPathExists:s}=await Promise.resolve().then(()=>(ve(),be));s(n,e[1],r);break}case"phases":{let{cmdPhasesList:s}=await Promise.resolve().then(()=>(et(),Qe));s(n,{},r);break}case"requirements":{let{cmdRequirementsMarkComplete:s}=await Promise.resolve().then(()=>(Wn(),Nn));e[1]==="mark-complete"?s(n,e.slice(2),r):b("Unknown requirements subcommand. Available: mark-complete");break}case"uat":{let s=await Promise.resolve().then(()=>(Gs(),Bs));e[1]==="render-checkpoint"?s.cmdRenderCheckpoint(n,lc(e,["file"]),r):b("Unknown uat subcommand. Available: render-checkpoint");break}case"state-snapshot":{let{cmdStateSnapshot:s}=await Promise.resolve().then(()=>(Re(),ze));s(n,r);break}case"agent-skills":{let{cmdAgentSkills:s}=await Promise.resolve().then(()=>(Sn(),xn));s(n,e[1],r);break}case"history-digest":{let{cmdHistoryDigest:s}=await Promise.resolve().then(()=>(ve(),be));s(n,r);break}case"scan-sessions":{let{cmdScanSessions:s}=await Promise.resolve().then(()=>(Ps(),ks)),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(()=>(Ps(),ks)),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(()=>(Ps(),ks)),i=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),c=e.indexOf("--max-chars"),l=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{limit:o!==-1?parseInt(e[o+1],10):150,maxPerProject:a!==-1?parseInt(e[a+1],10):null,harness:l!==-1?e[l+1]:null,maxChars:c!==-1?parseInt(e[c+1],10):500},r);break}case"write-profile":{let{cmdWriteProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--input"),o=e.indexOf("--output");i===-1&&b("--input <analysis-json-path> is required"),s(n,{input:e[i+1],output:o!==-1?e[o+1]:null},r);break}case"profile-questionnaire":{let{cmdProfileQuestionnaire:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--answers");s({answers:i!==-1?e[i+1]:null},r);break}case"generate-dev-preferences":{let{cmdGenerateDevPreferences:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output"),a=e.indexOf("--stack");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,stack:a!==-1?e[a+1]:null},r);break}case"generate-claude-profile":{let{cmdGenerateClaudeProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,global:e.includes("--global")},r);break}case"generate-claude-md":{let{cmdGenerateClaudeMd:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--output"),o=e.indexOf("--harness");s(n,{output:i!==-1?e[i+1]:null,auto:e.includes("--auto"),force:e.includes("--force"),harness:o!==-1?e[o+1]:null},r);break}case"generate-model-profiles-md":{let{generateModelProfilesMd:s}=await Promise.resolve().then(()=>(Dt(),lr)),i=e.indexOf("--output"),o=s();if(e.includes("--stdout")){process.stdout.write(o);break}let a=i!==-1?It.default.resolve(e[i+1]):It.default.resolve(__dirname,"..","references","model-profiles.md");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(()=>(ve(),be)),i=e.indexOf("--limit"),o=e.indexOf("--freshness");await s(e[1],{limit:i!==-1?parseInt(e[i+1],10):10,freshness:o!==-1?e[o+1]:null},r);break}case"map-codebase":{let{cmdInitMapCodebase:s}=await Promise.resolve().then(()=>(Sn(),xn));await s(n,r);break}case"new-project":case"new-milestone":case"plan-phase":case"execute-phase":case"verify-work":case"phase-op":case"milestone-op":case"resume":case"quick":case"manager":case"progress":case"new-workspace":case"list-workspaces":case"remove-workspace":{b(`Use: pi-gsd-tools init ${t} [args]`);break}default:b(`Unknown command: ${t}`)}}uc().catch(t=>{process.stderr.write("Fatal: "+t.message+`
387
+ `)}async function mc(t,e,n,r){switch(t){case"resolve-model":{let{cmdResolveModel:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"find-phase":{let{cmdFindPhase:s}=await Promise.resolve().then(()=>(et(),Qe));s(n,e[1],r);break}case"commit-to-subrepo":{let{cmdCommitToSubrepo:s}=await Promise.resolve().then(()=>(Se(),xe)),i=e.indexOf("--files"),o=e.slice(1,i!==-1?i:e.length).filter(c=>!c.startsWith("--")),a=i!==-1?e.slice(i+1).filter(c=>!c.startsWith("--")):[];s(n,o.join(" ")||void 0,a,r);break}case"verify-summary":{let{cmdVerifySummary:s}=await Promise.resolve().then(()=>(Rt(),jt)),i=e[2]?parseInt(e[2],10):2;s(n,e[1],i,r);break}case"generate-slug":{let{cmdGenerateSlug:s}=await Promise.resolve().then(()=>(Se(),xe));s(e[1],r);break}case"current-timestamp":{let{cmdCurrentTimestamp:s}=await Promise.resolve().then(()=>(Se(),xe));s(e[1],r);break}case"list-todos":{let{cmdListTodos:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"verify-path-exists":{let{cmdVerifyPathExists:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"phases":{let{cmdPhasesList:s}=await Promise.resolve().then(()=>(et(),Qe));s(n,{},r);break}case"requirements":{let{cmdRequirementsMarkComplete:s}=await Promise.resolve().then(()=>(Wn(),Nn));e[1]==="mark-complete"?s(n,e.slice(2),r):v("Unknown requirements subcommand. Available: mark-complete");break}case"uat":{let s=await Promise.resolve().then(()=>(Gs(),Bs));e[1]==="render-checkpoint"?s.cmdRenderCheckpoint(n,lc(e,["file"]),r):v("Unknown uat subcommand. Available: render-checkpoint");break}case"state-snapshot":{let{cmdStateSnapshot:s}=await Promise.resolve().then(()=>(je(),ze));s(n,r);break}case"agent-skills":{let{cmdAgentSkills:s}=await Promise.resolve().then(()=>(Sn(),xn));s(n,e[1],r);break}case"history-digest":{let{cmdHistoryDigest:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,r);break}case"scan-sessions":{let{cmdScanSessions:s}=await Promise.resolve().then(()=>(Ps(),ks)),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(()=>(Ps(),ks)),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]))&&v("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(()=>(Ps(),ks)),i=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),c=e.indexOf("--max-chars"),l=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{limit:o!==-1?parseInt(e[o+1],10):150,maxPerProject:a!==-1?parseInt(e[a+1],10):null,harness:l!==-1?e[l+1]:null,maxChars:c!==-1?parseInt(e[c+1],10):500},r);break}case"write-profile":{let{cmdWriteProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--input"),o=e.indexOf("--output");i===-1&&v("--input <analysis-json-path> is required"),s(n,{input:e[i+1],output:o!==-1?e[o+1]:null},r);break}case"profile-questionnaire":{let{cmdProfileQuestionnaire:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--answers");s({answers:i!==-1?e[i+1]:null},r);break}case"generate-dev-preferences":{let{cmdGenerateDevPreferences:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output"),a=e.indexOf("--stack");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,stack:a!==-1?e[a+1]:null},r);break}case"generate-claude-profile":{let{cmdGenerateClaudeProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,global:e.includes("--global")},r);break}case"generate-claude-md":{let{cmdGenerateClaudeMd:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--output"),o=e.indexOf("--harness");s(n,{output:i!==-1?e[i+1]:null,auto:e.includes("--auto"),force:e.includes("--force"),harness:o!==-1?e[o+1]:null},r);break}case"generate-model-profiles-md":{let{generateModelProfilesMd:s}=await Promise.resolve().then(()=>(Dt(),lr)),i=e.indexOf("--output"),o=s();if(e.includes("--stdout")){process.stdout.write(o);break}let a=i!==-1?It.default.resolve(e[i+1]):It.default.resolve(__dirname,"..","references","model-profiles.md");De.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(()=>(Se(),xe)),i=e.indexOf("--limit"),o=e.indexOf("--freshness");await s(e[1],{limit:i!==-1?parseInt(e[i+1],10):10,freshness:o!==-1?e[o+1]:null},r);break}case"map-codebase":{let{cmdInitMapCodebase:s}=await Promise.resolve().then(()=>(Sn(),xn));await s(n,r);break}case"new-project":case"new-milestone":case"plan-phase":case"execute-phase":case"verify-work":case"phase-op":case"milestone-op":case"resume":case"quick":case"manager":case"progress":case"new-workspace":case"list-workspaces":case"remove-workspace":{v(`Use: pi-gsd-tools init ${t} [args]`);break}default:v(`Unknown command: ${t}`)}}uc().catch(t=>{process.stderr.write("Fatal: "+t.message+`
389
389
  `),process.exit(1)});