pi-gsd 2.0.7 → 2.0.8

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.
@@ -783,7 +783,7 @@ function runLoop(content, filePath, config, projectRoot, pkgRoot, rawArguments,
783
783
  if (inDeadZone(tag.start, extractCodeFenceRegions(current))) continue;
784
784
  const incPath = tag.node.attrs["path"];
785
785
  if (!incPath) continue;
786
- const abs = import_node_path3.default.resolve(import_node_path3.default.dirname(filePath), incPath);
786
+ const abs = import_node_path3.default.resolve(projectRoot, incPath);
787
787
  const check = checkTrustedPath(abs, config, projectRoot, pkgRoot);
788
788
  if (!check.ok) throw new Error(`Include rejected: ${check.reason}`);
789
789
  const included = import_node_fs2.default.readFileSync(abs, "utf8");
@@ -133,22 +133,22 @@ 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 Re,vt,Ci,$i,Dt=N(()=>{"use strict";Re={"gsd-planner":{quality:"opus",balanced:"opus",budget:"sonnet"},"gsd-roadmapper":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-executor":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-phase-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-project-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-research-synthesizer":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-debugger":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-codebase-mapper":{quality:"sonnet",balanced:"haiku",budget:"haiku"},"gsd-verifier":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-plan-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-integration-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-nyquist-auditor":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-ui-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-ui-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-ui-auditor":{quality:"sonnet",balanced:"sonnet",budget:"haiku"}},vt=Object.keys(Re["gsd-planner"]),Ci="/gsd-",$i="pi"});var pr={};he(pr,{MODEL_ALIAS_MAP:()=>lr,MODEL_PROFILES:()=>Re,checkAgentsInstalled:()=>_t,comparePhaseNum:()=>Pe,detectSubRepos:()=>Rs,escapeRegex:()=>ne,execGit:()=>ae,extractCurrentMilestone:()=>ve,extractOneLinerFromBody:()=>Ut,filterPlanFiles:()=>wt,filterSummaryFiles:()=>kt,findPhaseInternal:()=>fe,findProjectRoot:()=>Wt,generateSlugInternal:()=>qe,getActiveWorkstream:()=>He,getAgentsDir:()=>ur,getArchivedPhaseDirs:()=>Lt,getMilestoneInfo:()=>re,getMilestonePhaseFilter:()=>Ce,getPhaseFileStats:()=>mr,getRoadmapPhaseInternal:()=>dt,gsdError:()=>b,isGitIgnored:()=>rn,loadConfig:()=>X,normalizeMd:()=>Ee,normalizePhaseName:()=>de,output:()=>y,pathExistsInternal:()=>Fi,planningDir:()=>T,planningPaths:()=>j,planningRoot:()=>Z,readSubdirectories:()=>Le,reapStaleTempFiles:()=>dr,replaceInCurrentMilestone:()=>lt,resolveModelInternal:()=>se,resolveWorktreeRoot:()=>qt,safeReadFile:()=>Oe,searchPhaseInDir:()=>Es,setActiveWorkstream:()=>ct,stripShippedMilestones:()=>Ot,toPosixPath:()=>G,withPlanningLock:()=>Ei});function G(t){return t.split(A.default.sep).join("/")}function Rs(t){let e=[];try{let n=I.default.readdirSync(t,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(".")||r.name==="node_modules")continue;let s=A.default.join(t,r.name,".git");try{I.default.existsSync(s)&&e.push(r.name)}catch{}}}catch{}return e.sort()}function Wt(t){let e=A.default.resolve(t),n=A.default.parse(e).root,r=sn.default.homedir(),s=A.default.join(e,".planning");if(I.default.existsSync(s)&&I.default.statSync(s).isDirectory())return t;function i(a){let c=e;for(;c!==n;){if(I.default.existsSync(A.default.join(c,".git")))return!0;if(c===a)break;c=A.default.dirname(c)}return!1}let o=e;for(;o!==n;){let a=A.default.dirname(o);if(a===o||a===r)break;let c=A.default.join(a,".planning");if(I.default.existsSync(c)&&I.default.statSync(c).isDirectory()){let l=A.default.join(c,"config.json");try{let d=JSON.parse(I.default.readFileSync(l,"utf-8")),u=d.sub_repos||d.planning?.sub_repos||[];if(Array.isArray(u)&&u.length>0){let p=A.default.relative(a,e).split(A.default.sep)[0];if(u.includes(p))return a}if(d.multiRepo===!0&&i(a))return a}catch{}if(i(a))return a}o=a}return t}function dr(t="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:n=!1}={}){try{let r=sn.default.tmpdir(),s=Date.now();for(let i of I.default.readdirSync(r)){if(!i.startsWith(t))continue;let o=A.default.join(r,i);try{let a=I.default.statSync(o);s-a.mtimeMs>e&&(a.isDirectory()?I.default.rmSync(o,{recursive:!0,force:!0}):n||I.default.unlinkSync(o))}catch{}}}catch{}}function y(t,e=!1,n){let r;if(e&&n!==void 0)r=String(n);else{let s=JSON.stringify(t,null,2);if(s.length>5e4){dr();let i=A.default.join(sn.default.tmpdir(),`gsd-${Date.now()}.json`);I.default.writeFileSync(i,s,"utf-8"),r="@file:"+i}else r=s}I.default.writeSync(1,r)}function b(t){I.default.writeSync(2,"Error: "+t+`
137
- `),process.exit(1)}function Oe(t){try{return I.default.readFileSync(t,"utf-8")}catch{return null}}function X(t){let e=A.default.join(t,".planning","config.json"),n={model_profile:"balanced",commit_docs:!0,search_gitignored:!1,branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null,research:!0,plan_checker:!0,verifier:!0,nyquist_validation:!0,parallelization:!0,brave_search:!1,firecrawl:!1,exa_search:!1,text_mode:!1,sub_repos:[],resolve_model_ids:!1,context_window:2e5,phase_naming:"sequential",model_overrides:null,agent_skills:{}};try{let c=function(d,u){if(i[d]!==void 0)return i[d];let m=i[u?.section??""];if(u&&m?.[u.field]!==void 0)return m[u.field]};var r=c;let s=I.default.readFileSync(e,"utf-8"),i=JSON.parse(s);if("depth"in i&&!("granularity"in i)){let d={quick:"coarse",standard:"standard",comprehensive:"fine"};i.granularity=d[i.depth]||i.depth,delete i.depth;try{I.default.writeFileSync(e,JSON.stringify(i,null,2),"utf-8")}catch{}}let o=!1;if(i.multiRepo===!0&&!i.sub_repos&&!i.planning?.sub_repos){let d=Rs(t);d.length>0&&(i.sub_repos=d,i.planning||(i.planning={}),i.planning.commit_docs=!1,delete i.multiRepo,o=!0)}let a=i.sub_repos||i.planning?.sub_repos||[];if(Array.isArray(a)&&a.length>0){let d=Rs(t);if(d.length>0){let u=[...a].sort();JSON.stringify(u)!==JSON.stringify(d)&&(i.sub_repos=d,o=!0)}}if(o)try{I.default.writeFileSync(e,JSON.stringify(i,null,2),"utf-8")}catch{}let l=(()=>{let d=c("parallelization");return typeof d=="boolean"?d:typeof d=="object"&&d!==null&&"enabled"in d?!!d.enabled:n.parallelization})();return{model_profile:c("model_profile")??n.model_profile,commit_docs:(()=>{let d=c("commit_docs",{section:"planning",field:"commit_docs"});return d!==void 0?!!d:rn(t,".planning/")?!1:n.commit_docs})(),search_gitignored:c("search_gitignored",{section:"planning",field:"search_gitignored"})??n.search_gitignored,branching_strategy:c("branching_strategy",{section:"git",field:"branching_strategy"})??n.branching_strategy,phase_branch_template:c("phase_branch_template",{section:"git",field:"phase_branch_template"})??n.phase_branch_template,milestone_branch_template:c("milestone_branch_template",{section:"git",field:"milestone_branch_template"})??n.milestone_branch_template,quick_branch_template:c("quick_branch_template",{section:"git",field:"quick_branch_template"})??n.quick_branch_template,research:c("research",{section:"workflow",field:"research"})??n.research,plan_checker:c("plan_checker",{section:"workflow",field:"plan_check"})??n.plan_checker,verifier:c("verifier",{section:"workflow",field:"verifier"})??n.verifier,nyquist_validation:c("nyquist_validation",{section:"workflow",field:"nyquist_validation"})??n.nyquist_validation,parallelization:l,brave_search:c("brave_search")??n.brave_search,firecrawl:c("firecrawl")??n.firecrawl,exa_search:c("exa_search")??n.exa_search,text_mode:c("text_mode",{section:"workflow",field:"text_mode"})??n.text_mode,sub_repos:c("sub_repos",{section:"planning",field:"sub_repos"})??n.sub_repos,resolve_model_ids:c("resolve_model_ids")??n.resolve_model_ids,context_window:c("context_window")??n.context_window,phase_naming:c("phase_naming")??n.phase_naming,model_overrides:i.model_overrides??null,agent_skills:i.agent_skills||{}}}catch{return n}}function rn(t,e){try{return(0,Nt.execFileSync)("git",["check-ignore","-q","--no-index","--",e],{cwd:t,stdio:"pipe"}),!0}catch{return!1}}function ae(t,e){let n=(0,Nt.spawnSync)("git",e,{cwd:t,stdio:"pipe",encoding:"utf-8"});return{exitCode:n.status??1,stdout:(n.stdout??"").toString().trim(),stderr:(n.stderr??"").toString().trim()}}function Ee(t){if(!t||typeof t!="string")return t;let e=t.replace(/\r\n/g,`
136
+ `}var Re,vt,Ci,$i,Dt=N(()=>{"use strict";Re={"gsd-planner":{quality:"opus",balanced:"opus",budget:"sonnet"},"gsd-roadmapper":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-executor":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-phase-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-project-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-research-synthesizer":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-debugger":{quality:"opus",balanced:"sonnet",budget:"sonnet"},"gsd-codebase-mapper":{quality:"sonnet",balanced:"haiku",budget:"haiku"},"gsd-verifier":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-plan-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-integration-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-nyquist-auditor":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-ui-researcher":{quality:"opus",balanced:"sonnet",budget:"haiku"},"gsd-ui-checker":{quality:"sonnet",balanced:"sonnet",budget:"haiku"},"gsd-ui-auditor":{quality:"sonnet",balanced:"sonnet",budget:"haiku"}},vt=Object.keys(Re["gsd-planner"]),Ci="/gsd-",$i="pi"});var pr={};he(pr,{MODEL_ALIAS_MAP:()=>lr,MODEL_PROFILES:()=>Re,checkAgentsInstalled:()=>_t,comparePhaseNum:()=>Pe,detectSubRepos:()=>Rs,escapeRegex:()=>ne,execGit:()=>ae,extractCurrentMilestone:()=>ve,extractOneLinerFromBody:()=>Ut,filterPlanFiles:()=>wt,filterSummaryFiles:()=>kt,findPhaseInternal:()=>fe,findProjectRoot:()=>Wt,generateSlugInternal:()=>qe,getActiveWorkstream:()=>He,getAgentsDir:()=>ur,getArchivedPhaseDirs:()=>Lt,getMilestoneInfo:()=>re,getMilestonePhaseFilter:()=>Ce,getPhaseFileStats:()=>mr,getRoadmapPhaseInternal:()=>dt,gsdError:()=>b,isGitIgnored:()=>sn,loadConfig:()=>X,normalizeMd:()=>Ee,normalizePhaseName:()=>de,output:()=>y,pathExistsInternal:()=>Fi,planningDir:()=>T,planningPaths:()=>j,planningRoot:()=>Z,readSubdirectories:()=>Le,reapStaleTempFiles:()=>dr,replaceInCurrentMilestone:()=>lt,resolveModelInternal:()=>se,resolveWorktreeRoot:()=>qt,safeReadFile:()=>Oe,searchPhaseInDir:()=>Es,setActiveWorkstream:()=>ct,stripShippedMilestones:()=>Ot,toPosixPath:()=>G,withPlanningLock:()=>Ei});function G(t){return t.split(A.default.sep).join("/")}function Rs(t){let e=[];try{let n=I.default.readdirSync(t,{withFileTypes:!0});for(let r of n){if(!r.isDirectory()||r.name.startsWith(".")||r.name==="node_modules")continue;let s=A.default.join(t,r.name,".git");try{I.default.existsSync(s)&&e.push(r.name)}catch{}}}catch{}return e.sort()}function Wt(t){let e=A.default.resolve(t),n=A.default.parse(e).root,r=nn.default.homedir(),s=A.default.join(e,".planning");if(I.default.existsSync(s)&&I.default.statSync(s).isDirectory())return t;function i(a){let c=e;for(;c!==n;){if(I.default.existsSync(A.default.join(c,".git")))return!0;if(c===a)break;c=A.default.dirname(c)}return!1}let o=e;for(;o!==n;){let a=A.default.dirname(o);if(a===o||a===r)break;let c=A.default.join(a,".planning");if(I.default.existsSync(c)&&I.default.statSync(c).isDirectory()){let l=A.default.join(c,"config.json");try{let d=JSON.parse(I.default.readFileSync(l,"utf-8")),u=d.sub_repos||d.planning?.sub_repos||[];if(Array.isArray(u)&&u.length>0){let p=A.default.relative(a,e).split(A.default.sep)[0];if(u.includes(p))return a}if(d.multiRepo===!0&&i(a))return a}catch{}if(i(a))return a}o=a}return t}function dr(t="gsd-",{maxAgeMs:e=300*1e3,dirsOnly:n=!1}={}){try{let r=nn.default.tmpdir(),s=Date.now();for(let i of I.default.readdirSync(r)){if(!i.startsWith(t))continue;let o=A.default.join(r,i);try{let a=I.default.statSync(o);s-a.mtimeMs>e&&(a.isDirectory()?I.default.rmSync(o,{recursive:!0,force:!0}):n||I.default.unlinkSync(o))}catch{}}}catch{}}function y(t,e=!1,n){let r;if(e&&n!==void 0)r=String(n);else{let s=JSON.stringify(t,null,2);if(s.length>5e4){dr();let i=A.default.join(nn.default.tmpdir(),`gsd-${Date.now()}.json`);I.default.writeFileSync(i,s,"utf-8"),r="@file:"+i}else r=s}I.default.writeSync(1,r)}function b(t){I.default.writeSync(2,"Error: "+t+`
137
+ `),process.exit(1)}function Oe(t){try{return I.default.readFileSync(t,"utf-8")}catch{return null}}function X(t){let e=A.default.join(t,".planning","config.json"),n={model_profile:"balanced",commit_docs:!0,search_gitignored:!1,branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null,research:!0,plan_checker:!0,verifier:!0,nyquist_validation:!0,parallelization:!0,brave_search:!1,firecrawl:!1,exa_search:!1,text_mode:!1,sub_repos:[],resolve_model_ids:!1,context_window:2e5,phase_naming:"sequential",model_overrides:null,agent_skills:{}};try{let c=function(d,u){if(i[d]!==void 0)return i[d];let m=i[u?.section??""];if(u&&m?.[u.field]!==void 0)return m[u.field]};var r=c;let s=I.default.readFileSync(e,"utf-8"),i=JSON.parse(s);if("depth"in i&&!("granularity"in i)){let d={quick:"coarse",standard:"standard",comprehensive:"fine"};i.granularity=d[i.depth]||i.depth,delete i.depth;try{I.default.writeFileSync(e,JSON.stringify(i,null,2),"utf-8")}catch{}}let o=!1;if(i.multiRepo===!0&&!i.sub_repos&&!i.planning?.sub_repos){let d=Rs(t);d.length>0&&(i.sub_repos=d,i.planning||(i.planning={}),i.planning.commit_docs=!1,delete i.multiRepo,o=!0)}let a=i.sub_repos||i.planning?.sub_repos||[];if(Array.isArray(a)&&a.length>0){let d=Rs(t);if(d.length>0){let u=[...a].sort();JSON.stringify(u)!==JSON.stringify(d)&&(i.sub_repos=d,o=!0)}}if(o)try{I.default.writeFileSync(e,JSON.stringify(i,null,2),"utf-8")}catch{}let l=(()=>{let d=c("parallelization");return typeof d=="boolean"?d:typeof d=="object"&&d!==null&&"enabled"in d?!!d.enabled:n.parallelization})();return{model_profile:c("model_profile")??n.model_profile,commit_docs:(()=>{let d=c("commit_docs",{section:"planning",field:"commit_docs"});return d!==void 0?!!d: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 Ee(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!==""&&!ji(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)&&Ri(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
143
  `),e}function ji(t,e){let n=0;for(let r=0;r<e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===1}function Ri(t,e){let n=0;for(let r=0;r<=e;r++)/^```/.test(t[r].trimEnd())&&n++;return n%2===0}function qt(t){if(I.default.existsSync(A.default.join(t,".planning")))return t;let e=ae(t,["rev-parse","--git-dir"]),n=ae(t,["rev-parse","--git-common-dir"]);if(e.exitCode!==0||n.exitCode!==0)return t;let r=A.default.resolve(t,e.stdout),s=A.default.resolve(t,n.stdout);return r!==s?A.default.dirname(s):t}function Ei(t,e){let n=A.default.join(T(t),".lock"),r=1e4,s=100,i=Date.now();try{I.default.mkdirSync(T(t),{recursive:!0})}catch{}for(;Date.now()-i<r;)try{I.default.writeFileSync(n,JSON.stringify({pid:process.pid,cwd:t,acquired:new Date().toISOString()}),{flag:"wx"});try{return e()}finally{try{I.default.unlinkSync(n)}catch{}}}catch(o){if(o.code==="EEXIST"){try{let a=I.default.statSync(n);if(Date.now()-a.mtimeMs>3e4){I.default.unlinkSync(n);continue}}catch{continue}(0,Nt.spawnSync)("sleep",["0.1"],{stdio:"ignore"});continue}throw o}try{I.default.unlinkSync(n)}catch{}return e()}function T(t,e){let n=e??process.env.GSD_WORKSTREAM??null;return n?A.default.join(t,".planning","workstreams",n):A.default.join(t,".planning")}function Z(t){return A.default.join(t,".planning")}function j(t,e){let n=T(t,e),r=A.default.join(t,".planning");return{planning:n,state:A.default.join(n,"STATE.md"),roadmap:A.default.join(n,"ROADMAP.md"),project:A.default.join(r,"PROJECT.md"),config:A.default.join(r,"config.json"),phases:A.default.join(n,"phases"),requirements:A.default.join(n,"REQUIREMENTS.md")}}function He(t){let e=A.default.join(Z(t),"active-workstream");try{let n=I.default.readFileSync(e,"utf-8").trim();return!n||!/^[a-zA-Z0-9_-]+$/.test(n)||!I.default.existsSync(A.default.join(Z(t),"workstreams",n))?null:n}catch{return null}}function ct(t,e){let n=A.default.join(Z(t),"active-workstream");if(!e){try{I.default.unlinkSync(n)}catch{}return}if(!/^[a-zA-Z0-9_-]+$/.test(e))throw new Error("Invalid workstream name");I.default.writeFileSync(n,e+`
144
- `,"utf-8")}function ne(t){return String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function de(t){let e=String(t),n=e.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);return n?n[1].padStart(2,"0")+(n[2]?n[2].toUpperCase():"")+(n[3]||""):e}function Pe(t,e){let n=String(t).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i),r=String(e).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);if(!n||!r)return String(t).localeCompare(String(e));let s=parseInt(n[1],10)-parseInt(r[1],10);if(s!==0)return s;let i=(n[2]||"").toUpperCase(),o=(r[2]||"").toUpperCase();if(i!==o)return i?o&&i<o?-1:1:-1;let a=n[3]?n[3].slice(1).split(".").map(l=>parseInt(l,10)):[],c=r[3]?r[3].slice(1).split(".").map(l=>parseInt(l,10)):[];if(a.length===0&&c.length>0)return-1;if(c.length===0&&a.length>0)return 1;for(let l=0;l<Math.max(a.length,c.length);l++){let d=Number.isFinite(a[l])?a[l]:0,u=Number.isFinite(c[l])?c[l]:0;if(d!==u)return d-u}return 0}function Es(t,e,n){try{let s=Le(t,!0).find(_=>_.startsWith(n)||_.toUpperCase().startsWith(n.toUpperCase()));if(!s)return null;let i=s.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)||s.match(/^([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*)-(.+)/i)||[null,s,null],o=i?.[1]??n,a=i?.[2]||null,c=A.default.join(t,s),{plans:l,summaries:d,hasResearch:u,hasContext:m,hasVerification:p,hasReviews:f}=mr(c),g=l.sort(),h=d.sort(),x=new Set(h.map(_=>_.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),S=g.filter(_=>!x.has(_.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:G(A.default.join(e,s)),phase_number:o,phase_name:a,phase_slug:a?a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:g,summaries:h,incomplete_plans:S,has_research:u,has_context:m,has_verification:p,has_reviews:f}}catch{return null}}function fe(t,e){if(!e)return null;let n=A.default.join(T(t),"phases"),r=de(e),s=G(A.default.relative(t,n)),i=Es(n,s,r);if(i)return i;let o=A.default.join(t,".planning","milestones");if(!I.default.existsSync(o))return null;try{let a=I.default.readdirSync(o,{withFileTypes:!0}).filter(c=>c.isDirectory()&&/^v[\d.]+-phases$/.test(c.name)).map(c=>c.name).sort().reverse();for(let c of a){let l=c.match(/^(v[\d.]+)-phases$/)[1],d=A.default.join(o,c),u=".planning/milestones/"+c,m=Es(d,u,r);if(m)return m.archived=l,m}}catch{}return null}function Lt(t){let e=A.default.join(t,".planning","milestones"),n=[];if(!I.default.existsSync(e))return n;try{let r=I.default.readdirSync(e,{withFileTypes:!0}).filter(s=>s.isDirectory()&&/^v[\d.]+-phases$/.test(s.name)).map(s=>s.name).sort().reverse();for(let s of r){let i=s.match(/^(v[\d.]+)-phases$/)[1],o=A.default.join(e,s);for(let a of Le(o,!0))n.push({name:a,milestone:i,basePath:A.default.join(".planning","milestones",s),fullPath:A.default.join(o,a)})}}catch{}return n}function Ot(t){return t.replace(/<details>[\s\S]*?<\/details>/gi,"")}function ve(t,e){if(!e)return Ot(t);let n=null;try{let u=A.default.join(T(e),"STATE.md");if(I.default.existsSync(u)){let p=I.default.readFileSync(u,"utf-8").match(/^milestone:\s*(.+)/m);p&&(n=p[1].trim())}}catch{}if(!n){let u=t.match(/🚧\s*\*\*v(\d+\.\d+)\s/);u&&(n="v"+u[1])}if(!n)return Ot(t);let r=new RegExp(`(^#{1,3}\\s+.*${ne(n)}[^\\n]*)`,"mi"),s=t.match(r);if(!s)return Ot(t);let i=s.index,o=s[1].match(/^(#{1,3})\s/)[1].length,c=t.slice(i+s[0].length).match(new RegExp(`^#{1,${o}}\\s+(?:.*v\\d+\\.\\d+|\u2705|\u{1F4CB}|\u{1F6A7})`,"mi")),l=c?i+s[0].length+c.index:t.length;return t.slice(0,i).replace(/<details>[\s\S]*?<\/details>/gi,"")+t.slice(i,l)}function lt(t,e,n){let r=t.lastIndexOf("</details>");if(r===-1)return t.replace(e,n);let s=r+10,i=t.slice(0,s),o=t.slice(s);return i+o.replace(e,n)}function dt(t,e){if(!e)return null;let n=A.default.join(T(t),"ROADMAP.md");if(!I.default.existsSync(n))return null;try{let r=ve(I.default.readFileSync(n,"utf-8"),t),s=new RegExp(`#{2,4}\\s*Phase\\s+${ne(e)}:\\s*([^\\n]+)`,"i"),i=r.match(s);if(!i)return null;let o=i[1].trim(),a=i.index,l=r.slice(a).match(/\n#{2,4}\s+Phase\s+[\w]/i),d=l?a+l.index:r.length,u=r.slice(a,d).trim(),m=u.match(/\*\*Goal(?:\*\*:|\*?\*?:\*\*)\s*([^\n]+)/i);return{found:!0,phase_number:e.toString(),phase_name:o,goal:m?m[1].trim():null,section:u}}catch{return null}}function ur(){return A.default.join(__dirname,"..","..","agents")}function _t(){let t=ur(),e=Object.keys(Re),n=[],r=[];if(!I.default.existsSync(t))return{agents_installed:!1,missing_agents:e,installed_agents:[],agents_dir:t};for(let s of e)I.default.existsSync(A.default.join(t,`${s}.md`))?n.push(s):r.push(s);return{agents_installed:n.length>0&&r.length===0,missing_agents:r,installed_agents:n,agents_dir:t}}function se(t,e){let n=X(t),r=n.model_overrides?.[e];if(r)return r;if(n.resolve_model_ids==="omit")return"";let s=String(n.model_profile||"balanced").toLowerCase(),i=Re[e];if(!i)return"sonnet";if(s==="inherit")return"inherit";let o=i[s]||i.balanced||"sonnet";return n.resolve_model_ids&&lr[o]||o}function Ut(t){if(!t)return null;let n=t.replace(/^---\n[\s\S]*?\n---\n*/,"").match(/^#[^\n]*\n+\*\*([^*]+)\*\*/m);return n?n[1].trim():null}function Fi(t,e){let n=A.default.isAbsolute(e)?e:A.default.join(t,e);try{return I.default.statSync(n),!0}catch{return!1}}function qe(t){return t?t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function re(t){try{let e=I.default.readFileSync(A.default.join(T(t),"ROADMAP.md"),"utf-8"),n=e.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);if(n)return{version:"v"+n[1],name:n[2].trim()};let r=Ot(e),s=r.match(/## .*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);if(s)return{version:"v"+s[1],name:s[2].trim()};let i=r.match(/v(\d+(?:\.\d+)+)/);return{version:i?i[0]:"v1.0",name:"milestone"}}catch{return{version:"v1.0",name:"milestone"}}}function Ce(t){let e=new Set;try{let s=ve(I.default.readFileSync(A.default.join(T(t),"ROADMAP.md"),"utf-8"),t),i=/#{2,4}\s*Phase\s+([\w][\w.-]*)\s*:/gi,o;for(;(o=i.exec(s))!==null;)e.add(o[1])}catch{}if(e.size===0){let s=i=>!0;return s.phaseCount=0,s}let n=new Set([...e].map(s=>(s.replace(/^0+/,"")||"0").toLowerCase()));function r(s){let i=s.match(/^0*(\d+[A-Za-z]?(?:\.\d+)*)/);if(i&&n.has(i[1].toLowerCase()))return!0;let o=s.match(/^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*)/);return!!(o&&n.has(o[1].toLowerCase()))}return r.phaseCount=e.size,r}function wt(t){return t.filter(e=>e.endsWith("-PLAN.md")||e==="PLAN.md")}function kt(t){return t.filter(e=>e.endsWith("-SUMMARY.md")||e==="SUMMARY.md")}function mr(t){let e=I.default.readdirSync(t);return{plans:wt(e),summaries:kt(e),hasResearch:e.some(n=>n.endsWith("-RESEARCH.md")||n==="RESEARCH.md"),hasContext:e.some(n=>n.endsWith("-CONTEXT.md")||n==="CONTEXT.md"),hasVerification:e.some(n=>n.endsWith("-VERIFICATION.md")||n==="VERIFICATION.md"),hasReviews:e.some(n=>n.endsWith("-REVIEWS.md")||n==="REVIEWS.md")}}function Le(t,e=!1){try{let r=I.default.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);return e?r.sort((s,i)=>Pe(s,i)):r}catch{return[]}}var Nt,I,sn,A,lr,ge=N(()=>{"use strict";Nt=require("child_process"),I=W(require("fs")),sn=W(require("os")),A=W(require("path"));Dt();lr={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var st,Ms,on,w,$e=N(()=>{"use strict";st=require("@oclif/core"),Ms=W(require("path")),on=W(require("fs"));ge();w=class extends st.Command{static enableJsonFlag=!1;static baseFlags={cwd:st.Flags.string({description:"Working directory",default:""}),ws:st.Flags.string({description:"Workstream override",default:""}),raw:st.Flags.boolean({description:"Raw JSON output",default:!1}),output:st.Flags.string({description:"Output format",options:["json","toon"],default:"json"}),pick:st.Flags.string({description:"JSONPath pick expression",default:""})};resolveContext(e){let n=e.cwd?Ms.default.resolve(e.cwd):process.cwd();if((!on.default.existsSync(n)||!on.default.statSync(n).isDirectory())&&b(`Invalid --cwd: ${n}`),!on.default.existsSync(Ms.default.join(n,".planning"))){let s=qt(n);s!==n&&(n=s)}let r=null;return e.ws?r=e.ws:process.env.GSD_WORKSTREAM?r=process.env.GSD_WORKSTREAM.trim():r=He(n),r&&!/^[a-zA-Z0-9_-]+$/.test(r)&&b("Invalid workstream name"),r&&(process.env.GSD_WORKSTREAM=r),n=Wt(n),{cwd:n,ws:r,raw:e.raw??!1}}}});var cn={};he(cn,{FRONTMATTER_SCHEMAS:()=>Is,asArr:()=>_e,asObj:()=>Pt,asStr:()=>ue,cmdFrontmatterGet:()=>Mi,cmdFrontmatterMerge:()=>Ti,cmdFrontmatterSet:()=>Ii,cmdFrontmatterValidate:()=>Di,extractFrontmatter:()=>ie,parseMustHavesBlock:()=>an,reconstructFrontmatter:()=>Ct,spliceFrontmatter:()=>Ts});function ue(t){return typeof t=="string"?t:void 0}function _e(t){return Array.isArray(t)?t:void 0}function Pt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ie(t){let e={},n=[...t.matchAll(/(?:^|\n)\s*---\r?\n([\s\S]+?)\r?\n---/g)],r=n.length>0?n[n.length-1]:null;if(!r)return e;let i=r[1].split(/\r?\n/),o=[{obj:e,key:null,indent:-1}];for(let a of i){if(a.trim()==="")continue;let c=a.match(/^(\s*)/),l=c?c[1].length:0;for(;o.length>1&&l<=o[o.length-1].indent;)o.pop();let d=o[o.length-1],u=a.match(/^(\s*)([a-zA-Z0-9_-]+):\s*(.*)/);if(u){let m=u[2],p=u[3].trim();if(p===""||p==="["){d.obj[m]=p==="["?[]:{},d.key=null;let f=d.obj[m];f!==null&&typeof f=="object"&&o.push({obj:f,key:null,indent:l})}else p.startsWith("[")&&p.endsWith("]")?(d.obj[m]=p.slice(1,-1).split(",").map(f=>f.trim().replace(/^["']|["']$/g,"")).filter(Boolean),d.key=null):(d.obj[m]=p.replace(/^["']|["']$/g,""),d.key=null)}else if(a.trim().startsWith("- ")){let m=a.trim().slice(2).replace(/^["']|["']$/g,"");if(typeof d.obj=="object"&&!Array.isArray(d.obj)&&Object.keys(d.obj).length===0){let p=o.length>1?o[o.length-2]:null;if(p){for(let f of Object.keys(p.obj))if(p.obj[f]===d.obj){p.obj[f]=[m],d.obj=p.obj[f];break}}}else Array.isArray(d.obj)&&d.obj.push(m)}}return e}function Ct(t){let e=[];for(let[n,r]of Object.entries(t))if(r!=null)if(Array.isArray(r))if(r.length===0)e.push(`${n}: []`);else if(r.every(s=>typeof s=="string")&&r.length<=3&&r.join(", ").length<60)e.push(`${n}: [${r.join(", ")}]`);else{e.push(`${n}:`);for(let s of r){let i=String(s);e.push(` - ${typeof s=="string"&&(i.includes(":")||i.includes("#"))?`"${i}"`:i}`)}}else if(typeof r=="object"){e.push(`${n}:`);for(let[s,i]of Object.entries(r))if(i!=null)if(Array.isArray(i))if(i.length===0)e.push(` ${s}: []`);else if(i.every(o=>typeof o=="string")&&i.length<=3&&i.join(", ").length<60)e.push(` ${s}: [${i.join(", ")}]`);else{e.push(` ${s}:`);for(let o of i)e.push(` - ${o}`)}else if(typeof i=="object"){e.push(` ${s}:`);for(let[o,a]of Object.entries(i))if(a!=null)if(Array.isArray(a))if(a.length===0)e.push(` ${o}: []`);else{e.push(` ${o}:`);for(let c of a)e.push(` - ${c}`)}else e.push(` ${o}: ${a}`)}else{let o=String(i);e.push(` ${s}: ${o.includes(":")||o.includes("#")?`"${o}"`:o}`)}}else{let s=String(r);s.includes(":")||s.includes("#")||s.startsWith("[")||s.startsWith("{")?e.push(`${n}: "${s}"`):e.push(`${n}: ${s}`)}return e.join(`
144
+ `,"utf-8")}function ne(t){return String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function de(t){let e=String(t),n=e.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);return n?n[1].padStart(2,"0")+(n[2]?n[2].toUpperCase():"")+(n[3]||""):e}function Pe(t,e){let n=String(t).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i),r=String(e).match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);if(!n||!r)return String(t).localeCompare(String(e));let s=parseInt(n[1],10)-parseInt(r[1],10);if(s!==0)return s;let i=(n[2]||"").toUpperCase(),o=(r[2]||"").toUpperCase();if(i!==o)return i?o&&i<o?-1:1:-1;let a=n[3]?n[3].slice(1).split(".").map(l=>parseInt(l,10)):[],c=r[3]?r[3].slice(1).split(".").map(l=>parseInt(l,10)):[];if(a.length===0&&c.length>0)return-1;if(c.length===0&&a.length>0)return 1;for(let l=0;l<Math.max(a.length,c.length);l++){let d=Number.isFinite(a[l])?a[l]:0,u=Number.isFinite(c[l])?c[l]:0;if(d!==u)return d-u}return 0}function Es(t,e,n){try{let s=Le(t,!0).find(_=>_.startsWith(n)||_.toUpperCase().startsWith(n.toUpperCase()));if(!s)return null;let i=s.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i)||s.match(/^([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*)-(.+)/i)||[null,s,null],o=i?.[1]??n,a=i?.[2]||null,c=A.default.join(t,s),{plans:l,summaries:d,hasResearch:u,hasContext:m,hasVerification:p,hasReviews:f}=mr(c),g=l.sort(),h=d.sort(),x=new Set(h.map(_=>_.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),S=g.filter(_=>!x.has(_.replace("-PLAN.md","").replace("PLAN.md","")));return{found:!0,directory:G(A.default.join(e,s)),phase_number:o,phase_name:a,phase_slug:a?a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:g,summaries:h,incomplete_plans:S,has_research:u,has_context:m,has_verification:p,has_reviews:f}}catch{return null}}function fe(t,e){if(!e)return null;let n=A.default.join(T(t),"phases"),r=de(e),s=G(A.default.relative(t,n)),i=Es(n,s,r);if(i)return i;let o=A.default.join(t,".planning","milestones");if(!I.default.existsSync(o))return null;try{let a=I.default.readdirSync(o,{withFileTypes:!0}).filter(c=>c.isDirectory()&&/^v[\d.]+-phases$/.test(c.name)).map(c=>c.name).sort().reverse();for(let c of a){let l=c.match(/^(v[\d.]+)-phases$/)[1],d=A.default.join(o,c),u=".planning/milestones/"+c,m=Es(d,u,r);if(m)return m.archived=l,m}}catch{}return null}function Lt(t){let e=A.default.join(t,".planning","milestones"),n=[];if(!I.default.existsSync(e))return n;try{let r=I.default.readdirSync(e,{withFileTypes:!0}).filter(s=>s.isDirectory()&&/^v[\d.]+-phases$/.test(s.name)).map(s=>s.name).sort().reverse();for(let s of r){let i=s.match(/^(v[\d.]+)-phases$/)[1],o=A.default.join(e,s);for(let a of Le(o,!0))n.push({name:a,milestone:i,basePath:A.default.join(".planning","milestones",s),fullPath:A.default.join(o,a)})}}catch{}return n}function Ot(t){return t.replace(/<details>[\s\S]*?<\/details>/gi,"")}function ve(t,e){if(!e)return Ot(t);let n=null;try{let u=A.default.join(T(e),"STATE.md");if(I.default.existsSync(u)){let p=I.default.readFileSync(u,"utf-8").match(/^milestone:\s*(.+)/m);p&&(n=p[1].trim())}}catch{}if(!n){let u=t.match(/🚧\s*\*\*v(\d+\.\d+)\s/);u&&(n="v"+u[1])}if(!n)return Ot(t);let r=new RegExp(`(^#{1,3}\\s+.*${ne(n)}[^\\n]*)`,"mi"),s=t.match(r);if(!s)return Ot(t);let i=s.index,o=s[1].match(/^(#{1,3})\s/)[1].length,c=t.slice(i+s[0].length).match(new RegExp(`^#{1,${o}}\\s+(?:.*v\\d+\\.\\d+|\u2705|\u{1F4CB}|\u{1F6A7})`,"mi")),l=c?i+s[0].length+c.index:t.length;return t.slice(0,i).replace(/<details>[\s\S]*?<\/details>/gi,"")+t.slice(i,l)}function lt(t,e,n){let r=t.lastIndexOf("</details>");if(r===-1)return t.replace(e,n);let s=r+10,i=t.slice(0,s),o=t.slice(s);return i+o.replace(e,n)}function dt(t,e){if(!e)return null;let n=A.default.join(T(t),"ROADMAP.md");if(!I.default.existsSync(n))return null;try{let r=ve(I.default.readFileSync(n,"utf-8"),t),s=new RegExp(`#{2,4}\\s*Phase\\s+${ne(e)}:\\s*([^\\n]+)`,"i"),i=r.match(s);if(!i)return null;let o=i[1].trim(),a=i.index,l=r.slice(a).match(/\n#{2,4}\s+Phase\s+[\w]/i),d=l?a+l.index:r.length,u=r.slice(a,d).trim(),m=u.match(/\*\*Goal(?:\*\*:|\*?\*?:\*\*)\s*([^\n]+)/i);return{found:!0,phase_number:e.toString(),phase_name:o,goal:m?m[1].trim():null,section:u}}catch{return null}}function ur(){return A.default.join(__dirname,"..","..","agents")}function _t(){let t=ur(),e=Object.keys(Re),n=[],r=[];if(!I.default.existsSync(t))return{agents_installed:!1,missing_agents:e,installed_agents:[],agents_dir:t};for(let s of e)I.default.existsSync(A.default.join(t,`${s}.md`))?n.push(s):r.push(s);return{agents_installed:n.length>0&&r.length===0,missing_agents:r,installed_agents:n,agents_dir:t}}function se(t,e){let n=X(t),r=n.model_overrides?.[e];if(r)return r;if(n.resolve_model_ids==="omit")return"";let s=String(n.model_profile||"balanced").toLowerCase(),i=Re[e];if(!i)return"sonnet";if(s==="inherit")return"inherit";let o=i[s]||i.balanced||"sonnet";return n.resolve_model_ids&&lr[o]||o}function Ut(t){if(!t)return null;let n=t.replace(/^---\n[\s\S]*?\n---\n*/,"").match(/^#[^\n]*\n+\*\*([^*]+)\*\*/m);return n?n[1].trim():null}function Fi(t,e){let n=A.default.isAbsolute(e)?e:A.default.join(t,e);try{return I.default.statSync(n),!0}catch{return!1}}function qe(t){return t?t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null}function re(t){try{let e=I.default.readFileSync(A.default.join(T(t),"ROADMAP.md"),"utf-8"),n=e.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);if(n)return{version:"v"+n[1],name:n[2].trim()};let r=Ot(e),s=r.match(/## .*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);if(s)return{version:"v"+s[1],name:s[2].trim()};let i=r.match(/v(\d+(?:\.\d+)+)/);return{version:i?i[0]:"v1.0",name:"milestone"}}catch{return{version:"v1.0",name:"milestone"}}}function Ce(t){let e=new Set;try{let s=ve(I.default.readFileSync(A.default.join(T(t),"ROADMAP.md"),"utf-8"),t),i=/#{2,4}\s*Phase\s+([\w][\w.-]*)\s*:/gi,o;for(;(o=i.exec(s))!==null;)e.add(o[1])}catch{}if(e.size===0){let s=i=>!0;return s.phaseCount=0,s}let n=new Set([...e].map(s=>(s.replace(/^0+/,"")||"0").toLowerCase()));function r(s){let i=s.match(/^0*(\d+[A-Za-z]?(?:\.\d+)*)/);if(i&&n.has(i[1].toLowerCase()))return!0;let o=s.match(/^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*)/);return!!(o&&n.has(o[1].toLowerCase()))}return r.phaseCount=e.size,r}function wt(t){return t.filter(e=>e.endsWith("-PLAN.md")||e==="PLAN.md")}function kt(t){return t.filter(e=>e.endsWith("-SUMMARY.md")||e==="SUMMARY.md")}function mr(t){let e=I.default.readdirSync(t);return{plans:wt(e),summaries:kt(e),hasResearch:e.some(n=>n.endsWith("-RESEARCH.md")||n==="RESEARCH.md"),hasContext:e.some(n=>n.endsWith("-CONTEXT.md")||n==="CONTEXT.md"),hasVerification:e.some(n=>n.endsWith("-VERIFICATION.md")||n==="VERIFICATION.md"),hasReviews:e.some(n=>n.endsWith("-REVIEWS.md")||n==="REVIEWS.md")}}function Le(t,e=!1){try{let r=I.default.readdirSync(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);return e?r.sort((s,i)=>Pe(s,i)):r}catch{return[]}}var Nt,I,nn,A,lr,ge=N(()=>{"use strict";Nt=require("child_process"),I=W(require("fs")),nn=W(require("os")),A=W(require("path"));Dt();lr={opus:"claude-opus-4-6",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5"}});var st,Ms,rn,w,$e=N(()=>{"use strict";st=require("@oclif/core"),Ms=W(require("path")),rn=W(require("fs"));ge();w=class extends st.Command{static enableJsonFlag=!1;static baseFlags={cwd:st.Flags.string({description:"Working directory",default:""}),ws:st.Flags.string({description:"Workstream override",default:""}),raw:st.Flags.boolean({description:"Raw JSON output",default:!1}),output:st.Flags.string({description:"Output format",options:["json","toon"],default:"json"}),pick:st.Flags.string({description:"JSONPath pick expression",default:""})};resolveContext(e){let n=e.cwd?Ms.default.resolve(e.cwd):process.cwd();if((!rn.default.existsSync(n)||!rn.default.statSync(n).isDirectory())&&b(`Invalid --cwd: ${n}`),!rn.default.existsSync(Ms.default.join(n,".planning"))){let s=qt(n);s!==n&&(n=s)}let r=null;return e.ws?r=e.ws:process.env.GSD_WORKSTREAM?r=process.env.GSD_WORKSTREAM.trim():r=He(n),r&&!/^[a-zA-Z0-9_-]+$/.test(r)&&b("Invalid workstream name"),r&&(process.env.GSD_WORKSTREAM=r),n=Wt(n),{cwd:n,ws:r,raw:e.raw??!1}}}});var an={};he(an,{FRONTMATTER_SCHEMAS:()=>Is,asArr:()=>_e,asObj:()=>Pt,asStr:()=>ue,cmdFrontmatterGet:()=>Mi,cmdFrontmatterMerge:()=>Ti,cmdFrontmatterSet:()=>Ii,cmdFrontmatterValidate:()=>Di,extractFrontmatter:()=>ie,parseMustHavesBlock:()=>on,reconstructFrontmatter:()=>Ct,spliceFrontmatter:()=>Ts});function ue(t){return typeof t=="string"?t:void 0}function _e(t){return Array.isArray(t)?t:void 0}function Pt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ie(t){let e={},n=[...t.matchAll(/(?:^|\n)\s*---\r?\n([\s\S]+?)\r?\n---/g)],r=n.length>0?n[n.length-1]:null;if(!r)return e;let i=r[1].split(/\r?\n/),o=[{obj:e,key:null,indent:-1}];for(let a of i){if(a.trim()==="")continue;let c=a.match(/^(\s*)/),l=c?c[1].length:0;for(;o.length>1&&l<=o[o.length-1].indent;)o.pop();let d=o[o.length-1],u=a.match(/^(\s*)([a-zA-Z0-9_-]+):\s*(.*)/);if(u){let m=u[2],p=u[3].trim();if(p===""||p==="["){d.obj[m]=p==="["?[]:{},d.key=null;let f=d.obj[m];f!==null&&typeof f=="object"&&o.push({obj:f,key:null,indent:l})}else p.startsWith("[")&&p.endsWith("]")?(d.obj[m]=p.slice(1,-1).split(",").map(f=>f.trim().replace(/^["']|["']$/g,"")).filter(Boolean),d.key=null):(d.obj[m]=p.replace(/^["']|["']$/g,""),d.key=null)}else if(a.trim().startsWith("- ")){let m=a.trim().slice(2).replace(/^["']|["']$/g,"");if(typeof d.obj=="object"&&!Array.isArray(d.obj)&&Object.keys(d.obj).length===0){let p=o.length>1?o[o.length-2]:null;if(p){for(let f of Object.keys(p.obj))if(p.obj[f]===d.obj){p.obj[f]=[m],d.obj=p.obj[f];break}}}else Array.isArray(d.obj)&&d.obj.push(m)}}return e}function Ct(t){let e=[];for(let[n,r]of Object.entries(t))if(r!=null)if(Array.isArray(r))if(r.length===0)e.push(`${n}: []`);else if(r.every(s=>typeof s=="string")&&r.length<=3&&r.join(", ").length<60)e.push(`${n}: [${r.join(", ")}]`);else{e.push(`${n}:`);for(let s of r){let i=String(s);e.push(` - ${typeof s=="string"&&(i.includes(":")||i.includes("#"))?`"${i}"`:i}`)}}else if(typeof r=="object"){e.push(`${n}:`);for(let[s,i]of Object.entries(r))if(i!=null)if(Array.isArray(i))if(i.length===0)e.push(` ${s}: []`);else if(i.every(o=>typeof o=="string")&&i.length<=3&&i.join(", ").length<60)e.push(` ${s}: [${i.join(", ")}]`);else{e.push(` ${s}:`);for(let o of i)e.push(` - ${o}`)}else if(typeof i=="object"){e.push(` ${s}:`);for(let[o,a]of Object.entries(i))if(a!=null)if(Array.isArray(a))if(a.length===0)e.push(` ${o}: []`);else{e.push(` ${o}:`);for(let c of a)e.push(` - ${c}`)}else e.push(` ${o}: ${a}`)}else{let o=String(i);e.push(` ${s}: ${o.includes(":")||o.includes("#")?`"${o}"`:o}`)}}else{let s=String(r);s.includes(":")||s.includes("#")||s.startsWith("[")||s.startsWith("{")?e.push(`${n}: "${s}"`):e.push(`${n}: ${s}`)}return e.join(`
145
145
  `)}function Ts(t,e){let n=Ct(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 an(t,e){let n=t.match(/^---\r?\n([\s\S]+?)\r?\n---/);if(!n)return[];let r=n[1],s=r.match(/^(\s*)must_haves:\s*$/m);if(!s)return[];let i=s[1].length,o=new RegExp(`^(\\s+)${e}:\\s*$`,"m"),a=r.match(o);if(!a)return[];let c=a[1].length;if(c<=i)return[];let l=r.indexOf(a[0]);if(l===-1)return[];let u=r.slice(l).split(/\r?\n/).slice(1),m=[],p=null,f=-1;for(let g of u){if(g.trim()==="")continue;let h=g.match(/^(\s*)/)?.[1].length??0;if(h<=c&&g.trim()!=="")break;let x=g.trim();if(x.startsWith("- ")&&(f===-1&&(f=h),h===f)){p&&m.push(p),p={};let S=x.slice(2);if(!S.includes(":"))p=S.replace(/^["']|["']$/g,"");else{let _=S.match(/^(\w+):\s*"?([^"]*)"?\s*$/);_&&(p={},p[_[1]]=_[2])}continue}if(p&&typeof p=="object"&&h>f)if(x.startsWith("- ")){let S=x.slice(2).replace(/^["']|["']$/g,""),_=Object.keys(p),P=_[_.length-1];P&&!Array.isArray(p[P])&&(p[P]=p[P]?[p[P]]:[]);let k=p[P];P&&Array.isArray(k)&&k.push(S)}else{let S=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(S){let _=S[2];p[S[1]]=/^\d+$/.test(_)?parseInt(_,10):_}}}return p&&m.push(p),m}function Mi(t,e,n,r){e||b("file path required"),e.includes("\0")&&b("file path contains null bytes");let s=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e),i=Oe(s);if(!i){y({error:"File not found",path:e},r);return}let o=ie(i);if(n){let a=o[n];if(a===void 0){y({error:"Field not found",field:n},r);return}y({[n]:a},r,JSON.stringify(a))}else y(o,r)}function Ii(t,e,n,r,s){(!e||!n||r===void 0)&&b("file, field, and value required"),e.includes("\0")&&b("file path contains null bytes");let i=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e);if(!ut.default.existsSync(i)){y({error:"File not found",path:e},s);return}let o=ut.default.readFileSync(i,"utf-8"),a=ie(o),c;try{c=JSON.parse(r)}catch{c=r}a[n]=c;let l=Ts(o,a);ut.default.writeFileSync(i,Ee(l),"utf-8"),y({updated:!0,field:n,value:c},s,"true")}function Ti(t,e,n,r){(!e||!n)&&b("file and data required");let s=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e);if(!ut.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=ut.default.readFileSync(s,"utf-8"),o=ie(i),a;try{a=JSON.parse(n)}catch{b("Invalid JSON for --data");return}Object.assign(o,a);let c=Ts(i,o);ut.default.writeFileSync(s,Ee(c),"utf-8"),y({merged:!0,fields:Object.keys(a)},r,"true")}function Di(t,e,n,r){(!e||!n)&&b("file and schema required");let s=Is[n];if(!s){b(`Unknown schema: ${n}. Available: ${Object.keys(Is).join(", ")}`);return}let i=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e),o=Oe(i);if(!o){y({error:"File not found",path:e},r);return}let a=ie(o),c=s.required.filter(d=>a[d]===void 0),l=s.required.filter(d=>a[d]!==void 0);y({valid:c.length===0,missing:c,present:l,schema:n},r,c.length===0?"valid":"invalid")}var ut,Xe,Is,Ue=N(()=>{"use strict";ut=W(require("fs")),Xe=W(require("path"));ge();Is={plan:{required:["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"]},summary:{required:["phase","plan","subsystem","tags","duration","completed"]},verification:{required:["phase","verified","status","score"]}}});function hr(t){if(!t)return t;let e=t.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>gr&&(e=e.slice(0,gr)+"... [truncated]"),e}function Ds(t,e,n={}){if(t.includes("\0"))return{safe:!1,resolved:t,error:"Path contains null bytes"};let r=ln.default.isAbsolute(t)?t:ln.default.resolve(e,t),s=process.env.HOME??"/";return!r.startsWith(s)&&!r.startsWith(e)?{safe:!1,resolved:r,error:"Path traversal rejected"}:!n.allowAbsolute&&ln.default.isAbsolute(t)?{safe:!1,resolved:r,error:"Absolute paths not allowed"}:{safe:!0,resolved:r}}function yr(t,e,n,r={}){let s=Ds(t,e,r);if(!s.safe)throw new Error(`${n||"Path"} validation failed: ${s.error}`);return s.resolved}function Os(t){if(!t||typeof t!="string")return t;let e=t.replace(/[\u200B-\u200F\u2028-\u202F\uFEFF\u00AD]/g,"");return e=e.replace(/<(\/?)(?:system|assistant|human)>/gi,(n,r)=>`\uFF1C${r||""}system-text\uFF1E`),e=e.replace(/\[(SYSTEM|INST)\]/gi,"[$1-TEXT]"),e=e.replace(/<<\s*SYS\s*>>/gi,"\xABSYS-TEXT\xBB"),e}function Ns(t){return!t||typeof t!="string"?{valid:!1,error:"Field name must be a non-empty string"}:/^[a-zA-Z][a-zA-Z0-9 _-]*$/.test(t)?{valid:!0}:{valid:!1,error:`Field name "${t}" contains invalid characters. Only letters, digits, spaces, hyphens, and underscores are allowed.`}}var ln,gr,dn=N(()=>{"use strict";ln=W(require("path")),gr=1e4});var Ze={};he(Ze,{cmdSignalResume:()=>eo,cmdSignalWaiting:()=>Qi,cmdStateAddBlocker:()=>Ji,cmdStateAddDecision:()=>Bi,cmdStateAdvancePlan:()=>Vi,cmdStateBeginPhase:()=>Ki,cmdStateGet:()=>qi,cmdStateJson:()=>Zi,cmdStateLoad:()=>Wi,cmdStatePatch:()=>Li,cmdStateRecordMetric:()=>zi,cmdStateRecordSession:()=>Hi,cmdStateResolveBlocker:()=>Yi,cmdStateSnapshot:()=>Xi,cmdStateUpdate:()=>Ui,cmdStateUpdateProgress:()=>Gi,stateExtractField:()=>J,stateReplaceField:()=>we,stateReplaceFieldWithFallback:()=>ye,stripFrontmatter:()=>qs,writeStateMd:()=>oe});function Oi(t){return j(t).state}function J(t,e){let n=ne(e),r=t.match(new RegExp(`\\*\\*${n}:\\*\\*\\s*(.+)`,"i"));if(r)return r[1].trim();let s=t.match(new RegExp(`^${n}:\\s*(.+)`,"im"));return s?s[1].trim():null}function we(t,e,n){let r=ne(e),s=new RegExp(`(\\*\\*${r}:\\*\\*\\s*)(.*)`,"i");if(s.test(t))return t.replace(s,(o,a)=>`${a}${n}`);let i=new RegExp(`(^${r}:\\s*)(.*)`,"im");return i.test(t)?t.replace(i,(o,a)=>`${a}${n}`):null}function ye(t,e,n,r){let s=we(t,e,r);if(s)return s;if(n){let i=we(t,n,r);if(i)return i}return t}function xr(t,e){let n=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,r=t.match(n);if(!r)return t;let s=r[2];return e.status&&/^Status:/m.test(s)&&(s=s.replace(/^Status:.*$/m,`Status: ${e.status}`)),e.lastActivity&&/^Last activity:/im.test(s)&&(s=s.replace(/^Last activity:.*$/im,`Last activity: ${e.lastActivity}`)),e.plan&&/^Plan:/m.test(s)&&(s=s.replace(/^Plan:.*$/m,`Plan: ${e.plan}`)),t.replace(n,`${r[1]}${s}`)}function Ws(t,e,n,r){if(!n)return e??"";let s=Ds(n,t,{allowAbsolute:!0});if(!s.safe)throw new Error(`${r} path rejected: ${s.error}`);try{return E.default.readFileSync(s.resolved,"utf-8").trimEnd()}catch{throw new Error(`${r} file not found: ${n}`)}}function qs(t){let e=t;for(;;){let n=e.replace(/^\s*---\r?\n[\s\S]*?\r?\n---\s*/,"");if(n===e)break;e=n}return e}function Sr(t,e){let n=J(t,"Current Phase"),r=J(t,"Current Phase Name"),s=J(t,"Current Plan"),i=J(t,"Total Phases"),o=J(t,"Total Plans in Phase"),a=J(t,"Status"),c=J(t,"Progress"),l=J(t,"Last Activity"),d=J(t,"Stopped At")||J(t,"Stopped at"),u=J(t,"Paused At"),m=null,p=null;if(e)try{let L=re(e);m=L.version,p=L.name}catch{}let f=i?parseInt(i,10):null,g=null,h=o?parseInt(o,10):null,x=null;if(e)try{let L=j(e).phases;if(E.default.existsSync(L)){let $=Ce(e),q=E.default.readdirSync(L,{withFileTypes:!0}).filter(le=>le.isDirectory()).map(le=>le.name).filter($),O=0,U=0,Y=0;for(let le of q){let be=E.default.readdirSync(Ve.default.join(L,le)),te=be.filter(De=>De.match(/-PLAN\.md$/i)).length,pe=be.filter(De=>De.match(/-SUMMARY\.md$/i)).length;O+=te,U+=pe,te>0&&pe>=te&&Y++}f=$.phaseCount>0?Math.max(q.length,$.phaseCount):q.length,g=Y,h=O,x=U}}catch{}let S=null;if(c){let L=c.match(/(\d+)%/);L&&(S=parseInt(L[1],10))}let _=a??"unknown",P=(a??"").toLowerCase();P.includes("paused")||P.includes("stopped")||u?_="paused":P.includes("executing")||P.includes("in progress")?_="executing":P.includes("planning")||P.includes("ready to plan")?_="planning":P.includes("discussing")?_="discussing":P.includes("verif")?_="verifying":P.includes("complete")||P.includes("done")?_="completed":P.includes("ready to execute")&&(_="executing");let k={gsd_state_version:"1.0"};m&&(k.milestone=m),p&&(k.milestone_name=p),n&&(k.current_phase=n),r&&(k.current_phase_name=r),s&&(k.current_plan=s),k.status=_,d&&(k.stopped_at=d),u&&(k.paused_at=u),k.last_updated=new Date().toISOString(),l&&(k.last_activity=l);let C={};return f!==null&&(C.total_phases=f),g!==null&&(C.completed_phases=g),h!==null&&(C.total_plans=h),x!==null&&(C.completed_plans=x),S!==null&&(C.percent=S),Object.keys(C).length>0&&(k.progress=C),k}function Ni(t,e){let n=ie(t),r=qs(t),s=Sr(r,e);return s.status==="unknown"&&n.status&&n.status!=="unknown"&&(s.status=n.status),`---
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 x=g.trim();if(x.startsWith("- ")&&(f===-1&&(f=h),h===f)){p&&m.push(p),p={};let S=x.slice(2);if(!S.includes(":"))p=S.replace(/^["']|["']$/g,"");else{let _=S.match(/^(\w+):\s*"?([^"]*)"?\s*$/);_&&(p={},p[_[1]]=_[2])}continue}if(p&&typeof p=="object"&&h>f)if(x.startsWith("- ")){let S=x.slice(2).replace(/^["']|["']$/g,""),_=Object.keys(p),P=_[_.length-1];P&&!Array.isArray(p[P])&&(p[P]=p[P]?[p[P]]:[]);let k=p[P];P&&Array.isArray(k)&&k.push(S)}else{let S=x.match(/^(\w+):\s*"?([^"]*)"?\s*$/);if(S){let _=S[2];p[S[1]]=/^\d+$/.test(_)?parseInt(_,10):_}}}return p&&m.push(p),m}function Mi(t,e,n,r){e||b("file path required"),e.includes("\0")&&b("file path contains null bytes");let s=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e),i=Oe(s);if(!i){y({error:"File not found",path:e},r);return}let o=ie(i);if(n){let a=o[n];if(a===void 0){y({error:"Field not found",field:n},r);return}y({[n]:a},r,JSON.stringify(a))}else y(o,r)}function Ii(t,e,n,r,s){(!e||!n||r===void 0)&&b("file, field, and value required"),e.includes("\0")&&b("file path contains null bytes");let i=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e);if(!ut.default.existsSync(i)){y({error:"File not found",path:e},s);return}let o=ut.default.readFileSync(i,"utf-8"),a=ie(o),c;try{c=JSON.parse(r)}catch{c=r}a[n]=c;let l=Ts(o,a);ut.default.writeFileSync(i,Ee(l),"utf-8"),y({updated:!0,field:n,value:c},s,"true")}function Ti(t,e,n,r){(!e||!n)&&b("file and data required");let s=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e);if(!ut.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=ut.default.readFileSync(s,"utf-8"),o=ie(i),a;try{a=JSON.parse(n)}catch{b("Invalid JSON for --data");return}Object.assign(o,a);let c=Ts(i,o);ut.default.writeFileSync(s,Ee(c),"utf-8"),y({merged:!0,fields:Object.keys(a)},r,"true")}function Di(t,e,n,r){(!e||!n)&&b("file and schema required");let s=Is[n];if(!s){b(`Unknown schema: ${n}. Available: ${Object.keys(Is).join(", ")}`);return}let i=Xe.default.isAbsolute(e)?e:Xe.default.join(t,e),o=Oe(i);if(!o){y({error:"File not found",path:e},r);return}let a=ie(o),c=s.required.filter(d=>a[d]===void 0),l=s.required.filter(d=>a[d]!==void 0);y({valid:c.length===0,missing:c,present:l,schema:n},r,c.length===0?"valid":"invalid")}var ut,Xe,Is,Ue=N(()=>{"use strict";ut=W(require("fs")),Xe=W(require("path"));ge();Is={plan:{required:["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"]},summary:{required:["phase","plan","subsystem","tags","duration","completed"]},verification:{required:["phase","verified","status","score"]}}});function hr(t){if(!t)return t;let e=t.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"");return e.length>gr&&(e=e.slice(0,gr)+"... [truncated]"),e}function Ds(t,e,n={}){if(t.includes("\0"))return{safe:!1,resolved:t,error:"Path contains null bytes"};let r=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 yr(t,e,n,r={}){let s=Ds(t,e,r);if(!s.safe)throw new Error(`${n||"Path"} validation failed: ${s.error}`);return s.resolved}function Os(t){if(!t||typeof t!="string")return t;let e=t.replace(/[\u200B-\u200F\u2028-\u202F\uFEFF\u00AD]/g,"");return e=e.replace(/<(\/?)(?:system|assistant|human)>/gi,(n,r)=>`\uFF1C${r||""}system-text\uFF1E`),e=e.replace(/\[(SYSTEM|INST)\]/gi,"[$1-TEXT]"),e=e.replace(/<<\s*SYS\s*>>/gi,"\xABSYS-TEXT\xBB"),e}function Ns(t){return!t||typeof t!="string"?{valid:!1,error:"Field name must be a non-empty string"}:/^[a-zA-Z][a-zA-Z0-9 _-]*$/.test(t)?{valid:!0}:{valid:!1,error:`Field name "${t}" contains invalid characters. Only letters, digits, spaces, hyphens, and underscores are allowed.`}}var cn,gr,ln=N(()=>{"use strict";cn=W(require("path")),gr=1e4});var Ze={};he(Ze,{cmdSignalResume:()=>eo,cmdSignalWaiting:()=>Qi,cmdStateAddBlocker:()=>Ji,cmdStateAddDecision:()=>Bi,cmdStateAdvancePlan:()=>Vi,cmdStateBeginPhase:()=>Ki,cmdStateGet:()=>qi,cmdStateJson:()=>Zi,cmdStateLoad:()=>Wi,cmdStatePatch:()=>Li,cmdStateRecordMetric:()=>zi,cmdStateRecordSession:()=>Hi,cmdStateResolveBlocker:()=>Yi,cmdStateSnapshot:()=>Xi,cmdStateUpdate:()=>Ui,cmdStateUpdateProgress:()=>Gi,stateExtractField:()=>J,stateReplaceField:()=>we,stateReplaceFieldWithFallback:()=>ye,stripFrontmatter:()=>qs,writeStateMd:()=>oe});function Oi(t){return j(t).state}function J(t,e){let n=ne(e),r=t.match(new RegExp(`\\*\\*${n}:\\*\\*\\s*(.+)`,"i"));if(r)return r[1].trim();let s=t.match(new RegExp(`^${n}:\\s*(.+)`,"im"));return s?s[1].trim():null}function we(t,e,n){let r=ne(e),s=new RegExp(`(\\*\\*${r}:\\*\\*\\s*)(.*)`,"i");if(s.test(t))return t.replace(s,(o,a)=>`${a}${n}`);let i=new RegExp(`(^${r}:\\s*)(.*)`,"im");return i.test(t)?t.replace(i,(o,a)=>`${a}${n}`):null}function ye(t,e,n,r){let s=we(t,e,r);if(s)return s;if(n){let i=we(t,n,r);if(i)return i}return t}function xr(t,e){let n=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,r=t.match(n);if(!r)return t;let s=r[2];return e.status&&/^Status:/m.test(s)&&(s=s.replace(/^Status:.*$/m,`Status: ${e.status}`)),e.lastActivity&&/^Last activity:/im.test(s)&&(s=s.replace(/^Last activity:.*$/im,`Last activity: ${e.lastActivity}`)),e.plan&&/^Plan:/m.test(s)&&(s=s.replace(/^Plan:.*$/m,`Plan: ${e.plan}`)),t.replace(n,`${r[1]}${s}`)}function Ws(t,e,n,r){if(!n)return e??"";let s=Ds(n,t,{allowAbsolute:!0});if(!s.safe)throw new Error(`${r} path rejected: ${s.error}`);try{return E.default.readFileSync(s.resolved,"utf-8").trimEnd()}catch{throw new Error(`${r} file not found: ${n}`)}}function qs(t){let e=t;for(;;){let n=e.replace(/^\s*---\r?\n[\s\S]*?\r?\n---\s*/,"");if(n===e)break;e=n}return e}function Sr(t,e){let n=J(t,"Current Phase"),r=J(t,"Current Phase Name"),s=J(t,"Current Plan"),i=J(t,"Total Phases"),o=J(t,"Total Plans in Phase"),a=J(t,"Status"),c=J(t,"Progress"),l=J(t,"Last Activity"),d=J(t,"Stopped At")||J(t,"Stopped at"),u=J(t,"Paused At"),m=null,p=null;if(e)try{let L=re(e);m=L.version,p=L.name}catch{}let f=i?parseInt(i,10):null,g=null,h=o?parseInt(o,10):null,x=null;if(e)try{let L=j(e).phases;if(E.default.existsSync(L)){let $=Ce(e),q=E.default.readdirSync(L,{withFileTypes:!0}).filter(le=>le.isDirectory()).map(le=>le.name).filter($),O=0,U=0,Y=0;for(let le of q){let be=E.default.readdirSync(Ve.default.join(L,le)),te=be.filter(De=>De.match(/-PLAN\.md$/i)).length,pe=be.filter(De=>De.match(/-SUMMARY\.md$/i)).length;O+=te,U+=pe,te>0&&pe>=te&&Y++}f=$.phaseCount>0?Math.max(q.length,$.phaseCount):q.length,g=Y,h=O,x=U}}catch{}let S=null;if(c){let L=c.match(/(\d+)%/);L&&(S=parseInt(L[1],10))}let _=a??"unknown",P=(a??"").toLowerCase();P.includes("paused")||P.includes("stopped")||u?_="paused":P.includes("executing")||P.includes("in progress")?_="executing":P.includes("planning")||P.includes("ready to plan")?_="planning":P.includes("discussing")?_="discussing":P.includes("verif")?_="verifying":P.includes("complete")||P.includes("done")?_="completed":P.includes("ready to execute")&&(_="executing");let k={gsd_state_version:"1.0"};m&&(k.milestone=m),p&&(k.milestone_name=p),n&&(k.current_phase=n),r&&(k.current_phase_name=r),s&&(k.current_plan=s),k.status=_,d&&(k.stopped_at=d),u&&(k.paused_at=u),k.last_updated=new Date().toISOString(),l&&(k.last_activity=l);let C={};return f!==null&&(C.total_phases=f),g!==null&&(C.completed_phases=g),h!==null&&(C.total_plans=h),x!==null&&(C.completed_plans=x),S!==null&&(C.percent=S),Object.keys(C).length>0&&(k.progress=C),k}function Ni(t,e){let n=ie(t),r=qs(t),s=Sr(r,e);return s.status==="unknown"&&n.status&&n.status!=="unknown"&&(s.status=n.status),`---
152
152
  ${Ct(s)}
153
153
  ---
154
154
 
@@ -166,8 +166,8 @@ ${r}`}function oe(t,e,n){let r=Ni(e,n),s=t+".lock",i=10,o=200;for(let a=0;a<i;a+
166
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 Hi(t,e,n){let r=j(t).state;if(!E.default.existsSync(r)){y({error:"STATE.md not found"},n);return}let s=E.default.readFileSync(r,"utf-8"),i=new Date().toISOString(),o=[],a=d=>{let u=we(s,d,i);u&&(s=u,o.push(d))};if(a("Last session"),a("Last Date"),e.stopped_at){let d=we(s,"Stopped At",e.stopped_at)??we(s,"Stopped at",e.stopped_at);d&&(s=d,o.push("Stopped At"))}let c=e.resume_file??"None",l=we(s,"Resume File",c)??we(s,"Resume file",c);l&&(s=l,o.push("Resume File")),o.length>0?(oe(r,s,t),y({recorded:!0,updated:o},n,"true")):y({recorded:!1,reason:"No session fields found in STATE.md"},n,"false")}function Xi(t,e){let n=Oi(t);if(!E.default.existsSync(n)){y({error:"STATE.md not found"},e);return}let r=E.default.readFileSync(n,"utf-8"),s=u=>J(r,u),i=[],o=r.match(/##\s*Decisions Made[\s\S]*?\n\|[^\n]+\n\|[-|\s]+\n([\s\S]*?)(?=\n##|\n$|$)/i);if(o)for(let u of o[1].trim().split(`
167
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 Zi(t,e){let n=j(t).state;if(!E.default.existsSync(n)){y({error:"STATE.md not found"},e,"STATE.md not found");return}let r=E.default.readFileSync(n,"utf-8"),s=ie(r);if(!s||Object.keys(s).length===0){let i=qs(r),o=Sr(i,t);y(o,e,JSON.stringify(o,null,2));return}y(s,e,JSON.stringify(s,null,2))}function Ki(t,e,n,r,s){let i=j(t).state;if(!E.default.existsSync(i)){y({error:"STATE.md not found"},s);return}let o=E.default.readFileSync(i,"utf-8"),a=new Date().toISOString().split("T")[0],c=[],l=(f,g)=>{let h=we(o,f,g);h&&(o=h,c.push(f))};l("Status",`Executing Phase ${e}`),l("Last Activity",a),l("Last Activity Description",`Phase ${e} execution started`),l("Current Phase",String(e)),n&&l("Current Phase Name",n),l("Current Plan","1"),r&&l("Total Plans in Phase",String(r));let d=n?`Phase ${e} - ${n}`:`Phase ${e}`,u=/(\*\*Current focus:\*\*\s*).*/i;u.test(o)&&(o=o.replace(u,(f,g)=>`${g}${d}`),c.push("Current focus"));let m=/(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i,p=o.match(m);if(p){let f=p[1],g=p[2],h=`Phase: ${e}${n?` (${n})`:""} - EXECUTING`;g=/^Phase:/m.test(g)?g.replace(/^Phase:.*$/m,h):h+`
168
168
  `+g;let x=`Plan: 1 of ${r??"?"}`;g=/^Plan:/m.test(g)?g.replace(/^Plan:.*$/m,x):g.replace(/^(Phase:.*$)/m,`$1
169
- ${x}`),/^Status:/m.test(g)&&(g=g.replace(/^Status:.*$/m,`Status: Executing Phase ${e}`)),/^Last activity:/im.test(g)&&(g=g.replace(/^Last activity:.*$/im,`Last activity: ${a} -- Phase ${e} execution started`)),o=o.replace(m,`${f}${g}`),c.push("Current Position")}c.length>0&&oe(i,o,t),y({updated:c,phase:e,phase_name:n??null,plan_count:r??null},s,c.length>0?"true":"false")}function Qi(t,e,n,r,s,i){let o=E.default.existsSync(Ve.default.join(t,".gsd"))?Ve.default.join(t,".gsd"):T(t),a=Ve.default.join(o,"WAITING.json"),c={status:"waiting",type:e??"decision_point",question:n??null,options:r?r.split("|").map(l=>l.trim()):[],since:new Date().toISOString(),phase:s??null};try{E.default.mkdirSync(o,{recursive:!0}),E.default.writeFileSync(a,JSON.stringify(c,null,2),"utf-8"),y({signaled:!0,path:a},i,"true")}catch(l){y({signaled:!1,error:l.message},i,"false")}}function eo(t,e){let n=[Ve.default.join(t,".gsd","WAITING.json"),Ve.default.join(T(t),"WAITING.json")],r=!1;for(let s of n)if(E.default.existsSync(s))try{E.default.unlinkSync(s),r=!0}catch{}y({resumed:!0,removed:r},e,r?"true":"false")}var E,Ve,Fe=N(()=>{"use strict";E=W(require("fs")),Ve=W(require("path"));ge();Ue();dn()});var mt,un,mn,pn,fn,gn,hn,yn,br=N(()=>{"use strict";mt=require("@oclif/core");$e();un=class t extends w{static description="Output GSD state as JSON";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateJson(n,r)}},mn=class t extends w{static description="Get a specific state field";static args={field:mt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateGet(r,n.field,s)}},pn=class t extends w{static description="Update a state field";static args={field:mt.Args.string({required:!0}),value:mt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateUpdate(r,n.field,n.value)}},fn=class t extends w{static description="Patch multiple state fields";static args={pairs:mt.Args.string({required:!1})};static flags={...w.baseFlags,field:mt.Flags.string({multiple:!0,description:"field=value pair"})};async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=await Promise.resolve().then(()=>(Fe(),Ze)),o={},a=n.filter(c=>!c.startsWith("--"));for(let c=0;c<a.length;c+=2){let l=a[c].replace(/^--/,"");l&&a[c+1]!==void 0&&(o[l]=a[c+1])}i.cmdStatePatch(r,o,s)}},gn=class t extends w{static description="Advance to next plan";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateAdvancePlan(n,r)}},hn=class t extends w{static description="Load and display state";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateLoad(n,r)}},yn=class t extends w{static description="Update progress counters";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Fe(),Ze))).cmdStateUpdateProgress(n,r)}}});var xn={};he(xn,{cmdAgentSkills:()=>xo,cmdInitExecutePhase:()=>to,cmdInitListWorkspaces:()=>ho,cmdInitManager:()=>fo,cmdInitMapCodebase:()=>mo,cmdInitMilestoneOp:()=>uo,cmdInitNewMilestone:()=>ro,cmdInitNewProject:()=>so,cmdInitNewWorkspace:()=>go,cmdInitPhaseOp:()=>co,cmdInitPlanPhase:()=>no,cmdInitProgress:()=>po,cmdInitQuick:()=>io,cmdInitRemoveWorkspace:()=>yo,cmdInitResume:()=>oo,cmdInitTodos:()=>lo,cmdInitVerifyWork:()=>ao});function vr(t){let e=Me.default.join(Z(t),"MILESTONES.md");if(!z.default.existsSync(e))return null;try{let r=z.default.readFileSync(e,"utf-8").match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);return r?{version:r[1],name:r[2].trim()}:null}catch{return null}}function me(t,e){e.project_root=t,e.gsd_bin="dist/gsd-tools.js",e.gsd_root=".",e.gsd_harness_dir=".";let n=_t();return e.agents_installed=n.agents_installed,e.missing_agents=n.missing_agents,e}function to(t,e,n){e||b("phase required for init execute-phase");let r=X(t),s=fe(t,e),i=re(t),o=dt(t,e);if(!s&&o?.found){let d=o.phase_name;s={found:!0,directory:null,phase_number:o.phase_number,phase_name:d,phase_slug:d?d.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:[],summaries:[],incomplete_plans:[],has_research:!1,has_context:!1,has_verification:!1,has_reviews:!1}}let a=o?.section?.match(/^\*\*Requirements\*\*:[^\S\n]*([^\n]*)$/m),c=a?a[1].replace(/[[\]]/g,"").split(",").map(d=>d.trim()).filter(Boolean).join(", "):null,l=me(t,{executor_model:se(t,"gsd-executor"),verifier_model:se(t,"gsd-verifier"),commit_docs:r.commit_docs,sub_repos:r.sub_repos,parallelization:r.parallelization,context_window:r.context_window,branching_strategy:r.branching_strategy,phase_branch_template:r.phase_branch_template,milestone_branch_template:r.milestone_branch_template,verifier_enabled:r.verifier,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,phase_slug:s?.phase_slug??null,phase_req_ids:c&&c!=="TBD"?c:null,plans:s?.plans??[],summaries:s?.summaries??[],incomplete_plans:s?.incomplete_plans??[],has_research:s?.has_research??!1,has_context:s?.has_context??!1,has_verification:s?.has_verification??!1,has_reviews:s?.has_reviews??!1,roadmap_goal:o?.goal??null,roadmap_section:o?.section??null,milestone_version:i.version,milestone_name:i.name});y(l,n)}function no(t,e,n){e||b("phase required for init plan-phase");let r=X(t),s=fe(t,e),i=dt(t,e),o=re(t),a=me(t,{planner_model:se(t,"gsd-planner"),researcher_model:se(t,"gsd-phase-researcher"),synthesizer_model:se(t,"gsd-research-synthesizer"),commit_docs:r.commit_docs,research_enabled:r.research,plan_checker_enabled:r.plan_checker,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,roadmap_goal:i?.goal??null,roadmap_section:i?.section??null,milestone_version:o.version,milestone_name:o.name});y(a,n)}function so(t,e){let n=X(t),r=Z(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,planning_exists:z.default.existsSync(r),project_exists:z.default.existsSync(Me.default.join(r,"PROJECT.md")),config_exists:z.default.existsSync(Me.default.join(r,"config.json")),roadmap_exists:z.default.existsSync(Me.default.join(r,"ROADMAP.md")),state_exists:z.default.existsSync(Me.default.join(r,"STATE.md"))});y(s,e)}function ro(t,e){let n=X(t),r=re(t),s=vr(t),i=me(t,{roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,current_milestone:r,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap)});y(i,e)}function io(t,e,n){let r=X(t),s=re(t),i=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,context_window:r.context_window,branching_strategy:r.branching_strategy,quick_branch_template:r.quick_branch_template,description:e||null,milestone_version:s.version,milestone_name:s.name,state_exists:z.default.existsSync(j(t).state)});y(i,n)}function oo(t,e){let n=X(t),r=re(t),s=z.default.existsSync(j(t).state),i="";if(s)try{i=z.default.readFileSync(j(t).state,"utf-8")}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:n.commit_docs,context_window:n.context_window,state_exists:s,state_raw:i,roadmap_exists:z.default.existsSync(j(t).roadmap),config_exists:z.default.existsSync(j(t).config),milestone_version:r.version,milestone_name:r.name});y(o,e)}function ao(t,e,n){e||b("phase required for init verify-work");let r=X(t),s=fe(t,e),i=dt(t,e),o=me(t,{verifier_model:se(t,"gsd-verifier"),nyquist_model:se(t,"gsd-nyquist-auditor"),commit_docs:r.commit_docs,nyquist_validation:r.nyquist_validation,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,plans:s?.plans??[],summaries:s?.summaries??[],roadmap_goal:i?.goal??null});y(o,n)}function co(t,e,n){let r=X(t),s=e?fe(t,e):null,i=re(t),o=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:r.commit_docs,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,milestone_version:i.version,milestone_name:i.name});y(o,n)}function lo(t,e,n){let r=X(t),s=Me.default.join(T(t),"todos","pending"),i=[];if(z.default.existsSync(s))try{for(let a of z.default.readdirSync(s).filter(c=>c.endsWith(".md")))try{let c=z.default.readFileSync(Me.default.join(s,a),"utf-8"),l=c.match(/^title:\s*(.+)$/m),d=c.match(/^area:\s*(.+)$/m),u=d?d[1].trim():"general";if(e&&u!==e)continue;i.push({file:a,title:l?l[1].trim():"Untitled",area:u})}catch{}}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,todos:i,todo_count:i.length,area:e??null});y(o,n)}function uo(t,e){let n=X(t),r=re(t),s=vr(t),i=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap),state_exists:z.default.existsSync(j(t).state)});y(i,e)}function mo(t,e){let n=X(t),r=me(t,{mapper_model:se(t,"gsd-codebase-mapper"),commit_docs:n.commit_docs,search_gitignored:n.search_gitignored,context_window:n.context_window,project_exists:z.default.existsSync(Me.default.join(Z(t),"PROJECT.md"))});y(r,e)}function po(t,e){let n=X(t),r=re(t),s=Ce(t),i=j(t).phases,o=0,a=0,c=0;if(z.default.existsSync(i))try{let d=z.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).filter(s);c=d.length;for(let u of d){let m=z.default.readdirSync(Me.default.join(i,u));o+=m.filter(p=>p.match(/-PLAN\.md$/i)).length,a+=m.filter(p=>p.match(/-SUMMARY\.md$/i)).length}}catch{}let l=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,phase_count:c,total_plans:o,total_summaries:a,percent:o>0?Math.min(100,Math.round(a/o*100)):0});y(l,e)}function fo(t,e){let n=X(t),r=re(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,state_exists:z.default.existsSync(j(t).state),roadmap_exists:z.default.existsSync(j(t).roadmap)});y(s,e)}function go(t,e){let n=X(t),r=Me.default.join(Z(t),"workstreams"),s=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,workstream_mode:z.default.existsSync(r),workstreams:z.default.existsSync(r)?z.default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name):[]});y(s,e)}function ho(t,e){let n=Me.default.join(Z(t),"workstreams");if(!z.default.existsSync(n)){y(me(t,{mode:"flat",workstreams:[],count:0}),e);return}let r=z.default.readdirSync(n,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);y(me(t,{mode:"workstream",workstreams:r,count:r.length}),e)}function yo(t,e,n){e||b("workstream name required for init remove-workspace");let r=Me.default.join(Z(t),"workstreams",e);if(!z.default.existsSync(r)){y(me(t,{removed:!1,reason:"not_found",workstream:e}),n);return}try{z.default.rmSync(r,{recursive:!0,force:!0})}catch(s){y(me(t,{removed:!1,reason:s.message,workstream:e}),n);return}y(me(t,{removed:!0,workstream:e}),n)}function xo(t,e,n){e||b("agent-type required");let s=X(t).agent_skills[e]??{};y({agent:e,skills:s},n,JSON.stringify(s))}var z,Me,Sn=N(()=>{"use strict";z=W(require("fs")),Me=W(require("path"));ge()});var bn,vn,_r=N(()=>{"use strict";bn=require("@oclif/core");$e();vn=class t extends w{static description="Initialise a GSD workflow context";static args={workflow:bn.Args.string({required:!0}),phase:bn.Args.string({required:!1}),rest:bn.Args.string({required:!1})};static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),i=n,o=i[0],a=await Promise.resolve().then(()=>(Sn(),xn)),{gsdError:c}=await Promise.resolve().then(()=>(ge(),pr));switch(o){case"execute-phase":return a.cmdInitExecutePhase(r,i[1],s);case"plan-phase":return a.cmdInitPlanPhase(r,i[1],s);case"new-project":return a.cmdInitNewProject(r,s);case"new-milestone":return a.cmdInitNewMilestone(r,s);case"quick":return a.cmdInitQuick(r,i.slice(1).join(" "),s);case"resume":return a.cmdInitResume(r,s);case"verify-work":return a.cmdInitVerifyWork(r,i[1],s);case"phase-op":return a.cmdInitPhaseOp(r,i[1],s);case"todos":return a.cmdInitTodos(r,i[1],s);case"milestone-op":return a.cmdInitMilestoneOp(r,s);case"map-codebase":return a.cmdInitMapCodebase(r,s);case"progress":return a.cmdInitProgress(r,s);case"manager":return a.cmdInitManager(r,s);case"new-workspace":return a.cmdInitNewWorkspace(r,s);case"list-workspaces":return a.cmdInitListWorkspaces(r,s);case"remove-workspace":return a.cmdInitRemoveWorkspace(r,i[1],s);default:c(`Unknown init workflow: ${o}`)}}}});var _n={};he(_n,{cmdRoadmapAnalyze:()=>bo,cmdRoadmapGetPhase:()=>So,cmdRoadmapUpdatePlanProgress:()=>vo});function So(t,e,n){let r=j(t).roadmap;if(!ze.default.existsSync(r)){y({found:!1,error:"ROADMAP.md not found"},n,"");return}try{let s=ve(ze.default.readFileSync(r,"utf-8"),t),i=ne(e??""),o=new RegExp(`#{2,4}\\s*Phase\\s+${i}:\\s*([^\\n]+)`,"i"),a=s.match(o);if(!a){let x=new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${i}:\\s*([^*]+)\\*\\*`,"i"),S=s.match(x);if(S){y({found:!1,phase_number:e,phase_name:S[1].trim(),error:"malformed_roadmap",message:`Phase ${e} exists in summary list but missing detail section.`},n,"");return}y({found:!1,phase_number:e},n,"");return}let c=a[1].trim(),l=a.index,u=s.slice(l).match(/\n#{2,4}\s+Phase\s+\d/i),m=u?l+u.index:s.length,p=s.slice(l,m).trim(),f=p.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),g=p.match(/\*\*Success Criteria\*\*[^\n]*:\s*\n((?:\s*\d+\.\s*[^\n]+\n?)+)/i),h=g?g[1].trim().split(`
170
- `).map(x=>x.replace(/^\s*\d+\.\s*/,"").trim()).filter(Boolean):[];y({found:!0,phase_number:e,phase_name:c,goal:f?f[1].trim():null,success_criteria:h,section:p},n,p)}catch(s){b("Failed to read ROADMAP.md: "+s.message)}}function bo(t,e){let n=j(t).roadmap;if(!ze.default.existsSync(n)){y({error:"ROADMAP.md not found",milestones:[],phases:[],current_phase:null},e);return}let r=ze.default.readFileSync(n,"utf-8"),s=ve(r,t),i=j(t).phases,o=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,a=[],c;for(;(c=o.exec(s))!==null;){let C=c[1],L=c[2].replace(/\(INSERTED\)/i,"").trim(),$=c.index,q=s.slice($).match(/\n#{2,4}\s+Phase\s+\d/i),O=q?$+q.index:s.length,U=s.slice($,O),Y=U.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),le=U.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),be=de(C),te="no_directory",pe=0,De=0,We=!1,Tt=!1;try{let nn=ze.default.readdirSync(i,{withFileTypes:!0}).filter(Ae=>Ae.isDirectory()).map(Ae=>Ae.name).find(Ae=>Ae.startsWith(be+"-")||Ae===be);if(nn){let Ae=ze.default.readdirSync(wr.default.join(i,nn));pe=Ae.filter(je=>je.endsWith("-PLAN.md")||je==="PLAN.md").length,De=Ae.filter(je=>je.endsWith("-SUMMARY.md")||je==="SUMMARY.md").length,We=Ae.some(je=>je.endsWith("-CONTEXT.md")||je==="CONTEXT.md"),Tt=Ae.some(je=>je.endsWith("-RESEARCH.md")||je==="RESEARCH.md"),De>=pe&&pe>0?te="complete":De>0?te="partial":pe>0?te="planned":Tt?te="researched":We?te="discussed":te="empty"}}catch{}let Cs=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${ne(C)}[:\\s]`,"i"),en=s.match(Cs),tn=en?en[1]==="x":!1;tn&&te!=="complete"&&(te="complete"),a.push({number:C,name:L,goal:Y?Y[1].trim():null,depends_on:le?le[1].trim():null,plan_count:pe,summary_count:De,has_context:We,has_research:Tt,disk_status:te,roadmap_complete:tn})}let l=[],d=/##\s*(.*v(\d+(?:\.\d+)+)[^(\n]*)/gi,u;for(;(u=d.exec(s))!==null;)l.push({heading:u[1].trim(),version:"v"+u[2]});let m=a.find(C=>C.disk_status==="planned"||C.disk_status==="partial")??null,p=a.find(C=>["empty","no_directory","discussed","researched"].includes(C.disk_status))??null,f=a.reduce((C,L)=>C+L.plan_count,0),g=a.reduce((C,L)=>C+L.summary_count,0),h=a.filter(C=>C.disk_status==="complete").length,x=/-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi,S=new Set,_;for(;(_=x.exec(s))!==null;)S.add(_[1]);let P=new Set(a.map(C=>C.number)),k=[...S].filter(C=>!P.has(C));y({milestones:l,phases:a,phase_count:a.length,completed_phases:h,total_plans:f,total_summaries:g,progress_percent:f>0?Math.min(100,Math.round(g/f*100)):0,current_phase:m?m.number:null,next_phase:p?p.number:null,missing_phase_details:k.length>0?k:null},e)}function vo(t,e,n){e||b("phase number required for roadmap update-plan-progress");let r=j(t).roadmap,s=fe(t,e);s||b(`Phase ${e} not found`);let i=s.plans.length,o=s.summaries.length;if(i===0){y({updated:!1,reason:"No plans found",plan_count:0,summary_count:0},n,"no plans");return}let a=o>=i,c=a?"Complete":o>0?"In Progress":"Planned",l=new Date().toISOString().split("T")[0];if(!ze.default.existsSync(r)){y({updated:!1,reason:"ROADMAP.md not found",plan_count:i,summary_count:o},n,"no roadmap");return}let d=ze.default.readFileSync(r,"utf-8"),u=ne(e),m=new RegExp(`^(\\|\\s*${u}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),p=a?` ${l} `:" ";d=d.replace(m,g=>{let h=g.split("|").slice(1,-1);return h.length===5?(h[2]=` ${o}/${i} `,h[3]=` ${c.padEnd(11)}`,h[4]=p):h.length===4&&(h[1]=` ${o}/${i} `,h[2]=` ${c.padEnd(11)}`,h[3]=p),"|"+h.join("|")+"|"});let f=new RegExp(`(#{2,4}\\s*Phase\\s+${u}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i");if(d=lt(d,f,`$1${a?`${o}/${i} plans complete`:`${o}/${i} plans executed`}`),a){let g=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${u}[:\\s][^\\n]*)`,"i");d=lt(d,g,`$1x$2 (completed ${l})`)}for(let g of s.summaries){let h=g.replace("-SUMMARY.md","").replace("SUMMARY.md","");h&&(d=d.replace(new RegExp(`(-\\s*\\[) (\\]\\s*${ne(h)})`,"i"),"$1x$2"))}ze.default.writeFileSync(r,d,"utf-8"),y({updated:!0,phase:e,plan_count:i,summary_count:o,status:c,complete:a},n,`${o}/${i} ${c}`)}var ze,wr,wn=N(()=>{"use strict";ze=W(require("fs")),wr=W(require("path"));ge()});var Ls,kn,Pn,Cn,kr=N(()=>{"use strict";Ls=require("@oclif/core");$e();kn=class t extends w{static description="Analyze roadmap phases and status";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapAnalyze(n,r)}},Pn=class t extends w{static description="Get details for a specific phase";static args={phase:Ls.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapGetPhase(r,n.phase,s)}},Cn=class t extends w{static description="Update plan progress in roadmap";static args={phase:Ls.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(wn(),_n))).cmdRoadmapUpdatePlanProgress(r,n.phase,s)}}});var $t={};he($t,{cmdConfigEnsureSection:()=>Co,cmdConfigGet:()=>Ao,cmdConfigNewProject:()=>Po,cmdConfigSet:()=>$o,cmdConfigSetModelProfile:()=>jo,ensureConfigFile:()=>Us,setConfigValue:()=>Vs});function wo(t){return!!(Cr.has(t)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(t))}function ko(t){let e=_o[t];e&&b(`Unknown config key: ${t}. Did you mean ${e}?`)}function $r(t){let e=t||{},n=Pr.default.homedir(),r=Ke.default.join(n,".gsd","brave_api_key"),s=!!(process.env.BRAVE_API_KEY||ce.default.existsSync(r)),i=Ke.default.join(n,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||ce.default.existsSync(i)),a=Ke.default.join(n,".gsd","exa_api_key"),c=!!(process.env.EXA_API_KEY||ce.default.existsSync(a)),l=Ke.default.join(n,".gsd","defaults.json"),d={};try{if(ce.default.existsSync(l)&&(d=JSON.parse(ce.default.readFileSync(l,"utf-8")),"depth"in d&&!("granularity"in d))){let m={quick:"coarse",standard:"standard",comprehensive:"fine"};d.granularity=m[d.depth]||d.depth,delete d.depth;try{ce.default.writeFileSync(l,JSON.stringify(d,null,2),"utf-8")}catch{}}}catch{}let u={model_profile:"balanced",commit_docs:!0,parallelization:!0,search_gitignored:!1,brave_search:s,firecrawl:o,exa_search:c,git:{branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null},workflow:{research:!0,plan_check:!0,verifier:!0,nyquist_validation:!0,auto_advance:!1,node_repair:!0,node_repair_budget:2,ui_phase:!0,ui_safety_gate:!0,text_mode:!1,research_before_questions:!1,discuss_mode:"discuss",skip_discuss:!1},hooks:{context_warnings:!0},agent_skills:{}};return{...u,...d,...e,git:{...u.git,...d.git||{},...e.git||{}},workflow:{...u.workflow,...d.workflow||{},...e.workflow||{}},hooks:{...u.hooks,...d.hooks||{},...e.hooks||{}},agent_skills:{...u.agent_skills,...d.agent_skills||{},...e.agent_skills||{}}}}function Us(t){let e=Z(t),n=Ke.default.join(e,"config.json");try{ce.default.existsSync(e)||ce.default.mkdirSync(e,{recursive:!0})}catch(s){b("Failed to create .planning directory: "+s.message)}if(ce.default.existsSync(n))return{created:!1,reason:"already_exists"};let r=$r({});try{return ce.default.writeFileSync(n,JSON.stringify(r,null,2),"utf-8"),{created:!0,path:".planning/config.json"}}catch(s){b("Failed to create config.json: "+s.message)}}function Vs(t,e,n){let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)&&(s=JSON.parse(ce.default.readFileSync(r,"utf-8")))}catch(c){b("Failed to read config.json: "+c.message)}let i=e.split("."),o=s;for(let c=0;c<i.length-1;c++){let l=i[c];(o[l]===void 0||typeof o[l]!="object")&&(o[l]={}),o=o[l]}let a=o[i[i.length-1]];o[i[i.length-1]]=n;try{return ce.default.writeFileSync(r,JSON.stringify(s,null,2),"utf-8"),{updated:!0,key:e,value:n,previousValue:a}}catch(c){b("Failed to write config.json: "+c.message)}}function Po(t,e,n){let r=Z(t),s=Ke.default.join(r,"config.json");if(ce.default.existsSync(s)){y({created:!1,reason:"already_exists"},n,"exists");return}let i={};if(e&&e.trim())try{i=JSON.parse(e)}catch(a){b("Invalid JSON for config-new-project: "+a.message)}try{ce.default.existsSync(r)||ce.default.mkdirSync(r,{recursive:!0})}catch(a){b("Failed to create .planning directory: "+a.message)}let o=$r(i);try{ce.default.writeFileSync(s,JSON.stringify(o,null,2),"utf-8"),y({created:!0,path:".planning/config.json"},n,"created")}catch(a){b("Failed to write config.json: "+a.message)}}function Co(t,e){let n=Us(t);y(n,e,n?.created?"created":"exists")}function $o(t,e,n,r){e||b("Usage: config-set <key.path> <value>"),ko(e),wo(e)||b(`Unknown config key: "${e}". Valid keys: ${[...Cr].sort().join(", ")}, agent_skills.<agent-type>`);let s=n;if(n==="true")s=!0;else if(n==="false")s=!1;else if(n!==void 0&&!isNaN(Number(n))&&n!=="")s=Number(n);else if(typeof n=="string"&&(n.startsWith("[")||n.startsWith("{")))try{s=JSON.parse(n)}catch{}let i=Vs(t,e,s);y(i,r,`${e}=${s}`)}function Ao(t,e,n){e||b("Usage: config-get <key.path>");let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)?s=JSON.parse(ce.default.readFileSync(r,"utf-8")):b("No config.json found at "+r)}catch(a){if(a.message.startsWith("Error:"))throw a;b("Failed to read config.json: "+a.message)}let i=e.split("."),o=s;for(let a of i)(o==null||typeof o!="object")&&b(`Key not found: ${e}`),o=o[a];o===void 0&&b(`Key not found: ${e}`),y(o,n,String(o))}function jo(t,e,n){e||b(`Usage: config-set-model-profile <${vt.join("|")}>`);let r=e.toLowerCase().trim();vt.includes(r)||b(`Invalid profile '${e}'. Valid profiles: ${vt.join(", ")}`),Us(t);let i=Vs(t,"model_profile",r)?.previousValue||"balanced",o=As(r),a=js(o),l=i!==r?`\u2713 Model profile set to: ${r} (was: ${i})
169
+ ${x}`),/^Status:/m.test(g)&&(g=g.replace(/^Status:.*$/m,`Status: Executing Phase ${e}`)),/^Last activity:/im.test(g)&&(g=g.replace(/^Last activity:.*$/im,`Last activity: ${a} -- Phase ${e} execution started`)),o=o.replace(m,`${f}${g}`),c.push("Current Position")}c.length>0&&oe(i,o,t),y({updated:c,phase:e,phase_name:n??null,plan_count:r??null},s,c.length>0?"true":"false")}function Qi(t,e,n,r,s,i){let o=E.default.existsSync(Ve.default.join(t,".gsd"))?Ve.default.join(t,".gsd"):T(t),a=Ve.default.join(o,"WAITING.json"),c={status:"waiting",type:e??"decision_point",question:n??null,options:r?r.split("|").map(l=>l.trim()):[],since:new Date().toISOString(),phase:s??null};try{E.default.mkdirSync(o,{recursive:!0}),E.default.writeFileSync(a,JSON.stringify(c,null,2),"utf-8"),y({signaled:!0,path:a},i,"true")}catch(l){y({signaled:!1,error:l.message},i,"false")}}function eo(t,e){let n=[Ve.default.join(t,".gsd","WAITING.json"),Ve.default.join(T(t),"WAITING.json")],r=!1;for(let s of n)if(E.default.existsSync(s))try{E.default.unlinkSync(s),r=!0}catch{}y({resumed:!0,removed:r},e,r?"true":"false")}var E,Ve,Fe=N(()=>{"use strict";E=W(require("fs")),Ve=W(require("path"));ge();Ue();ln()});var mt,dn,un,mn,pn,fn,gn,hn,br=N(()=>{"use strict";mt=require("@oclif/core");$e();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(()=>(Fe(),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(()=>(Fe(),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(()=>(Fe(),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(()=>(Fe(),Ze)),o={},a=n.filter(c=>!c.startsWith("--"));for(let c=0;c<a.length;c+=2){let l=a[c].replace(/^--/,"");l&&a[c+1]!==void 0&&(o[l]=a[c+1])}i.cmdStatePatch(r,o,s)}},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(()=>(Fe(),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(()=>(Fe(),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(()=>(Fe(),Ze))).cmdStateUpdateProgress(n,r)}}});var yn={};he(yn,{cmdAgentSkills:()=>xo,cmdInitExecutePhase:()=>to,cmdInitListWorkspaces:()=>ho,cmdInitManager:()=>fo,cmdInitMapCodebase:()=>mo,cmdInitMilestoneOp:()=>uo,cmdInitNewMilestone:()=>ro,cmdInitNewProject:()=>so,cmdInitNewWorkspace:()=>go,cmdInitPhaseOp:()=>co,cmdInitPlanPhase:()=>no,cmdInitProgress:()=>po,cmdInitQuick:()=>io,cmdInitRemoveWorkspace:()=>yo,cmdInitResume:()=>oo,cmdInitTodos:()=>lo,cmdInitVerifyWork:()=>ao});function vr(t){let e=Me.default.join(Z(t),"MILESTONES.md");if(!z.default.existsSync(e))return null;try{let r=z.default.readFileSync(e,"utf-8").match(/^##\s+(v[\d.]+)\s+(.+?)\s+\(Shipped:/m);return r?{version:r[1],name:r[2].trim()}:null}catch{return null}}function me(t,e){e.project_root=t,e.gsd_bin="dist/gsd-tools.js",e.gsd_root=".",e.gsd_harness_dir=".";let n=_t();return e.agents_installed=n.agents_installed,e.missing_agents=n.missing_agents,e}function to(t,e,n){e||b("phase required for init execute-phase");let r=X(t),s=fe(t,e),i=re(t),o=dt(t,e);if(!s&&o?.found){let d=o.phase_name;s={found:!0,directory:null,phase_number:o.phase_number,phase_name:d,phase_slug:d?d.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):null,plans:[],summaries:[],incomplete_plans:[],has_research:!1,has_context:!1,has_verification:!1,has_reviews:!1}}let a=o?.section?.match(/^\*\*Requirements\*\*:[^\S\n]*([^\n]*)$/m),c=a?a[1].replace(/[[\]]/g,"").split(",").map(d=>d.trim()).filter(Boolean).join(", "):null,l=me(t,{executor_model:se(t,"gsd-executor"),verifier_model:se(t,"gsd-verifier"),commit_docs:r.commit_docs,sub_repos:r.sub_repos,parallelization:r.parallelization,context_window:r.context_window,branching_strategy:r.branching_strategy,phase_branch_template:r.phase_branch_template,milestone_branch_template:r.milestone_branch_template,verifier_enabled:r.verifier,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,phase_slug:s?.phase_slug??null,phase_req_ids:c&&c!=="TBD"?c:null,plans:s?.plans??[],summaries:s?.summaries??[],incomplete_plans:s?.incomplete_plans??[],has_research:s?.has_research??!1,has_context:s?.has_context??!1,has_verification:s?.has_verification??!1,has_reviews:s?.has_reviews??!1,roadmap_goal:o?.goal??null,roadmap_section:o?.section??null,milestone_version:i.version,milestone_name:i.name});y(l,n)}function no(t,e,n){e||b("phase required for init plan-phase");let r=X(t),s=fe(t,e),i=dt(t,e),o=re(t),a=me(t,{planner_model:se(t,"gsd-planner"),researcher_model:se(t,"gsd-phase-researcher"),synthesizer_model:se(t,"gsd-research-synthesizer"),commit_docs:r.commit_docs,research_enabled:r.research,plan_checker_enabled:r.plan_checker,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,roadmap_goal:i?.goal??null,roadmap_section:i?.section??null,milestone_version:o.version,milestone_name:o.name});y(a,n)}function so(t,e){let n=X(t),r=Z(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,planning_exists:z.default.existsSync(r),project_exists:z.default.existsSync(Me.default.join(r,"PROJECT.md")),config_exists:z.default.existsSync(Me.default.join(r,"config.json")),roadmap_exists:z.default.existsSync(Me.default.join(r,"ROADMAP.md")),state_exists:z.default.existsSync(Me.default.join(r,"STATE.md"))});y(s,e)}function ro(t,e){let n=X(t),r=re(t),s=vr(t),i=me(t,{roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,current_milestone:r,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap)});y(i,e)}function io(t,e,n){let r=X(t),s=re(t),i=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,context_window:r.context_window,branching_strategy:r.branching_strategy,quick_branch_template:r.quick_branch_template,description:e||null,milestone_version:s.version,milestone_name:s.name,state_exists:z.default.existsSync(j(t).state)});y(i,n)}function oo(t,e){let n=X(t),r=re(t),s=z.default.existsSync(j(t).state),i="";if(s)try{i=z.default.readFileSync(j(t).state,"utf-8")}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:n.commit_docs,context_window:n.context_window,state_exists:s,state_raw:i,roadmap_exists:z.default.existsSync(j(t).roadmap),config_exists:z.default.existsSync(j(t).config),milestone_version:r.version,milestone_name:r.name});y(o,e)}function ao(t,e,n){e||b("phase required for init verify-work");let r=X(t),s=fe(t,e),i=dt(t,e),o=me(t,{verifier_model:se(t,"gsd-verifier"),nyquist_model:se(t,"gsd-nyquist-auditor"),commit_docs:r.commit_docs,nyquist_validation:r.nyquist_validation,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,plans:s?.plans??[],summaries:s?.summaries??[],roadmap_goal:i?.goal??null});y(o,n)}function co(t,e,n){let r=X(t),s=e?fe(t,e):null,i=re(t),o=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:r.commit_docs,context_window:r.context_window,phase_found:!!s,phase_dir:s?.directory??null,phase_number:s?.phase_number??null,phase_name:s?.phase_name??null,milestone_version:i.version,milestone_name:i.name});y(o,n)}function lo(t,e,n){let r=X(t),s=Me.default.join(T(t),"todos","pending"),i=[];if(z.default.existsSync(s))try{for(let a of z.default.readdirSync(s).filter(c=>c.endsWith(".md")))try{let c=z.default.readFileSync(Me.default.join(s,a),"utf-8"),l=c.match(/^title:\s*(.+)$/m),d=c.match(/^area:\s*(.+)$/m),u=d?d[1].trim():"general";if(e&&u!==e)continue;i.push({file:a,title:l?l[1].trim():"Untitled",area:u})}catch{}}catch{}let o=me(t,{executor_model:se(t,"gsd-executor"),commit_docs:r.commit_docs,todos:i,todo_count:i.length,area:e??null});y(o,n)}function uo(t,e){let n=X(t),r=re(t),s=vr(t),i=me(t,{planner_model:se(t,"gsd-planner"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,last_completed_milestone:s,roadmap_exists:z.default.existsSync(j(t).roadmap),state_exists:z.default.existsSync(j(t).state)});y(i,e)}function mo(t,e){let n=X(t),r=me(t,{mapper_model:se(t,"gsd-codebase-mapper"),commit_docs:n.commit_docs,search_gitignored:n.search_gitignored,context_window:n.context_window,project_exists:z.default.existsSync(Me.default.join(Z(t),"PROJECT.md"))});y(r,e)}function po(t,e){let n=X(t),r=re(t),s=Ce(t),i=j(t).phases,o=0,a=0,c=0;if(z.default.existsSync(i))try{let d=z.default.readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory()).map(u=>u.name).filter(s);c=d.length;for(let u of d){let m=z.default.readdirSync(Me.default.join(i,u));o+=m.filter(p=>p.match(/-PLAN\.md$/i)).length,a+=m.filter(p=>p.match(/-SUMMARY\.md$/i)).length}}catch{}let l=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,phase_count:c,total_plans:o,total_summaries:a,percent:o>0?Math.min(100,Math.round(a/o*100)):0});y(l,e)}function fo(t,e){let n=X(t),r=re(t),s=me(t,{planner_model:se(t,"gsd-planner"),roadmapper_model:se(t,"gsd-roadmapper"),commit_docs:n.commit_docs,context_window:n.context_window,milestone_version:r.version,milestone_name:r.name,state_exists:z.default.existsSync(j(t).state),roadmap_exists:z.default.existsSync(j(t).roadmap)});y(s,e)}function go(t,e){let n=X(t),r=Me.default.join(Z(t),"workstreams"),s=me(t,{commit_docs:n.commit_docs,context_window:n.context_window,workstream_mode:z.default.existsSync(r),workstreams:z.default.existsSync(r)?z.default.readdirSync(r,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name):[]});y(s,e)}function ho(t,e){let n=Me.default.join(Z(t),"workstreams");if(!z.default.existsSync(n)){y(me(t,{mode:"flat",workstreams:[],count:0}),e);return}let r=z.default.readdirSync(n,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);y(me(t,{mode:"workstream",workstreams:r,count:r.length}),e)}function yo(t,e,n){e||b("workstream name required for init remove-workspace");let r=Me.default.join(Z(t),"workstreams",e);if(!z.default.existsSync(r)){y(me(t,{removed:!1,reason:"not_found",workstream:e}),n);return}try{z.default.rmSync(r,{recursive:!0,force:!0})}catch(s){y(me(t,{removed:!1,reason:s.message,workstream:e}),n);return}y(me(t,{removed:!0,workstream:e}),n)}function xo(t,e,n){e||b("agent-type required");let s=X(t).agent_skills[e]??{};y({agent:e,skills:s},n,JSON.stringify(s))}var z,Me,xn=N(()=>{"use strict";z=W(require("fs")),Me=W(require("path"));ge()});var Sn,bn,_r=N(()=>{"use strict";Sn=require("@oclif/core");$e();bn=class t extends w{static description="Initialise a GSD workflow context";static args={workflow:Sn.Args.string({required:!0}),phase:Sn.Args.string({required:!1}),rest:Sn.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(()=>(xn(),yn)),{gsdError:c}=await Promise.resolve().then(()=>(ge(),pr));switch(o){case"execute-phase":return a.cmdInitExecutePhase(r,i[1],s);case"plan-phase":return a.cmdInitPlanPhase(r,i[1],s);case"new-project":return a.cmdInitNewProject(r,s);case"new-milestone":return a.cmdInitNewMilestone(r,s);case"quick":return a.cmdInitQuick(r,i.slice(1).join(" "),s);case"resume":return a.cmdInitResume(r,s);case"verify-work":return a.cmdInitVerifyWork(r,i[1],s);case"phase-op":return a.cmdInitPhaseOp(r,i[1],s);case"todos":return a.cmdInitTodos(r,i[1],s);case"milestone-op":return a.cmdInitMilestoneOp(r,s);case"map-codebase":return a.cmdInitMapCodebase(r,s);case"progress":return a.cmdInitProgress(r,s);case"manager":return a.cmdInitManager(r,s);case"new-workspace":return a.cmdInitNewWorkspace(r,s);case"list-workspaces":return a.cmdInitListWorkspaces(r,s);case"remove-workspace":return a.cmdInitRemoveWorkspace(r,i[1],s);default:c(`Unknown init workflow: ${o}`)}}}});var vn={};he(vn,{cmdRoadmapAnalyze:()=>bo,cmdRoadmapGetPhase:()=>So,cmdRoadmapUpdatePlanProgress:()=>vo});function So(t,e,n){let r=j(t).roadmap;if(!ze.default.existsSync(r)){y({found:!1,error:"ROADMAP.md not found"},n,"");return}try{let s=ve(ze.default.readFileSync(r,"utf-8"),t),i=ne(e??""),o=new RegExp(`#{2,4}\\s*Phase\\s+${i}:\\s*([^\\n]+)`,"i"),a=s.match(o);if(!a){let x=new RegExp(`-\\s*\\[[ x]\\]\\s*\\*\\*Phase\\s+${i}:\\s*([^*]+)\\*\\*`,"i"),S=s.match(x);if(S){y({found:!1,phase_number:e,phase_name:S[1].trim(),error:"malformed_roadmap",message:`Phase ${e} exists in summary list but missing detail section.`},n,"");return}y({found:!1,phase_number:e},n,"");return}let c=a[1].trim(),l=a.index,u=s.slice(l).match(/\n#{2,4}\s+Phase\s+\d/i),m=u?l+u.index:s.length,p=s.slice(l,m).trim(),f=p.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),g=p.match(/\*\*Success Criteria\*\*[^\n]*:\s*\n((?:\s*\d+\.\s*[^\n]+\n?)+)/i),h=g?g[1].trim().split(`
170
+ `).map(x=>x.replace(/^\s*\d+\.\s*/,"").trim()).filter(Boolean):[];y({found:!0,phase_number:e,phase_name:c,goal:f?f[1].trim():null,success_criteria:h,section:p},n,p)}catch(s){b("Failed to read ROADMAP.md: "+s.message)}}function bo(t,e){let n=j(t).roadmap;if(!ze.default.existsSync(n)){y({error:"ROADMAP.md not found",milestones:[],phases:[],current_phase:null},e);return}let r=ze.default.readFileSync(n,"utf-8"),s=ve(r,t),i=j(t).phases,o=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,a=[],c;for(;(c=o.exec(s))!==null;){let C=c[1],L=c[2].replace(/\(INSERTED\)/i,"").trim(),$=c.index,q=s.slice($).match(/\n#{2,4}\s+Phase\s+\d/i),O=q?$+q.index:s.length,U=s.slice($,O),Y=U.match(/\*\*Goal(?::\*\*|\*\*:)\s*([^\n]+)/i),le=U.match(/\*\*Depends on(?::\*\*|\*\*:)\s*([^\n]+)/i),be=de(C),te="no_directory",pe=0,De=0,We=!1,Tt=!1;try{let tn=ze.default.readdirSync(i,{withFileTypes:!0}).filter(Ae=>Ae.isDirectory()).map(Ae=>Ae.name).find(Ae=>Ae.startsWith(be+"-")||Ae===be);if(tn){let Ae=ze.default.readdirSync(wr.default.join(i,tn));pe=Ae.filter(je=>je.endsWith("-PLAN.md")||je==="PLAN.md").length,De=Ae.filter(je=>je.endsWith("-SUMMARY.md")||je==="SUMMARY.md").length,We=Ae.some(je=>je.endsWith("-CONTEXT.md")||je==="CONTEXT.md"),Tt=Ae.some(je=>je.endsWith("-RESEARCH.md")||je==="RESEARCH.md"),De>=pe&&pe>0?te="complete":De>0?te="partial":pe>0?te="planned":Tt?te="researched":We?te="discussed":te="empty"}}catch{}let Cs=new RegExp(`-\\s*\\[(x| )\\]\\s*.*Phase\\s+${ne(C)}[:\\s]`,"i"),Qt=s.match(Cs),en=Qt?Qt[1]==="x":!1;en&&te!=="complete"&&(te="complete"),a.push({number:C,name:L,goal:Y?Y[1].trim():null,depends_on:le?le[1].trim():null,plan_count:pe,summary_count:De,has_context:We,has_research:Tt,disk_status:te,roadmap_complete: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(C=>C.disk_status==="planned"||C.disk_status==="partial")??null,p=a.find(C=>["empty","no_directory","discussed","researched"].includes(C.disk_status))??null,f=a.reduce((C,L)=>C+L.plan_count,0),g=a.reduce((C,L)=>C+L.summary_count,0),h=a.filter(C=>C.disk_status==="complete").length,x=/-\s*\[[ x]\]\s*\*\*Phase\s+(\d+[A-Z]?(?:\.\d+)*)/gi,S=new Set,_;for(;(_=x.exec(s))!==null;)S.add(_[1]);let P=new Set(a.map(C=>C.number)),k=[...S].filter(C=>!P.has(C));y({milestones:l,phases:a,phase_count:a.length,completed_phases:h,total_plans:f,total_summaries:g,progress_percent:f>0?Math.min(100,Math.round(g/f*100)):0,current_phase:m?m.number:null,next_phase:p?p.number:null,missing_phase_details:k.length>0?k:null},e)}function vo(t,e,n){e||b("phase number required for roadmap update-plan-progress");let r=j(t).roadmap,s=fe(t,e);s||b(`Phase ${e} not found`);let i=s.plans.length,o=s.summaries.length;if(i===0){y({updated:!1,reason:"No plans found",plan_count:0,summary_count:0},n,"no plans");return}let a=o>=i,c=a?"Complete":o>0?"In Progress":"Planned",l=new Date().toISOString().split("T")[0];if(!ze.default.existsSync(r)){y({updated:!1,reason:"ROADMAP.md not found",plan_count:i,summary_count:o},n,"no roadmap");return}let d=ze.default.readFileSync(r,"utf-8"),u=ne(e),m=new RegExp(`^(\\|\\s*${u}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),p=a?` ${l} `:" ";d=d.replace(m,g=>{let h=g.split("|").slice(1,-1);return h.length===5?(h[2]=` ${o}/${i} `,h[3]=` ${c.padEnd(11)}`,h[4]=p):h.length===4&&(h[1]=` ${o}/${i} `,h[2]=` ${c.padEnd(11)}`,h[3]=p),"|"+h.join("|")+"|"});let f=new RegExp(`(#{2,4}\\s*Phase\\s+${u}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i");if(d=lt(d,f,`$1${a?`${o}/${i} plans complete`:`${o}/${i} plans executed`}`),a){let g=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${u}[:\\s][^\\n]*)`,"i");d=lt(d,g,`$1x$2 (completed ${l})`)}for(let g of s.summaries){let h=g.replace("-SUMMARY.md","").replace("SUMMARY.md","");h&&(d=d.replace(new RegExp(`(-\\s*\\[) (\\]\\s*${ne(h)})`,"i"),"$1x$2"))}ze.default.writeFileSync(r,d,"utf-8"),y({updated:!0,phase:e,plan_count:i,summary_count:o,status:c,complete:a},n,`${o}/${i} ${c}`)}var ze,wr,_n=N(()=>{"use strict";ze=W(require("fs")),wr=W(require("path"));ge()});var Ls,wn,kn,Pn,kr=N(()=>{"use strict";Ls=require("@oclif/core");$e();wn=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(()=>(_n(),vn))).cmdRoadmapAnalyze(n,r)}},kn=class t extends w{static description="Get details for a specific phase";static args={phase:Ls.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(_n(),vn))).cmdRoadmapGetPhase(r,n.phase,s)}},Pn=class t extends w{static description="Update plan progress in roadmap";static args={phase:Ls.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(_n(),vn))).cmdRoadmapUpdatePlanProgress(r,n.phase,s)}}});var $t={};he($t,{cmdConfigEnsureSection:()=>Co,cmdConfigGet:()=>Ao,cmdConfigNewProject:()=>Po,cmdConfigSet:()=>$o,cmdConfigSetModelProfile:()=>jo,ensureConfigFile:()=>Us,setConfigValue:()=>Vs});function wo(t){return!!(Cr.has(t)||/^agent_skills\.[a-zA-Z0-9_-]+$/.test(t))}function ko(t){let e=_o[t];e&&b(`Unknown config key: ${t}. Did you mean ${e}?`)}function $r(t){let e=t||{},n=Pr.default.homedir(),r=Ke.default.join(n,".gsd","brave_api_key"),s=!!(process.env.BRAVE_API_KEY||ce.default.existsSync(r)),i=Ke.default.join(n,".gsd","firecrawl_api_key"),o=!!(process.env.FIRECRAWL_API_KEY||ce.default.existsSync(i)),a=Ke.default.join(n,".gsd","exa_api_key"),c=!!(process.env.EXA_API_KEY||ce.default.existsSync(a)),l=Ke.default.join(n,".gsd","defaults.json"),d={};try{if(ce.default.existsSync(l)&&(d=JSON.parse(ce.default.readFileSync(l,"utf-8")),"depth"in d&&!("granularity"in d))){let m={quick:"coarse",standard:"standard",comprehensive:"fine"};d.granularity=m[d.depth]||d.depth,delete d.depth;try{ce.default.writeFileSync(l,JSON.stringify(d,null,2),"utf-8")}catch{}}}catch{}let u={model_profile:"balanced",commit_docs:!0,parallelization:!0,search_gitignored:!1,brave_search:s,firecrawl:o,exa_search:c,git:{branching_strategy:"none",phase_branch_template:"gsd/phase-{phase}-{slug}",milestone_branch_template:"gsd/{milestone}-{slug}",quick_branch_template:null},workflow:{research:!0,plan_check:!0,verifier:!0,nyquist_validation:!0,auto_advance:!1,node_repair:!0,node_repair_budget:2,ui_phase:!0,ui_safety_gate:!0,text_mode:!1,research_before_questions:!1,discuss_mode:"discuss",skip_discuss:!1},hooks:{context_warnings:!0},agent_skills:{}};return{...u,...d,...e,git:{...u.git,...d.git||{},...e.git||{}},workflow:{...u.workflow,...d.workflow||{},...e.workflow||{}},hooks:{...u.hooks,...d.hooks||{},...e.hooks||{}},agent_skills:{...u.agent_skills,...d.agent_skills||{},...e.agent_skills||{}}}}function Us(t){let e=Z(t),n=Ke.default.join(e,"config.json");try{ce.default.existsSync(e)||ce.default.mkdirSync(e,{recursive:!0})}catch(s){b("Failed to create .planning directory: "+s.message)}if(ce.default.existsSync(n))return{created:!1,reason:"already_exists"};let r=$r({});try{return ce.default.writeFileSync(n,JSON.stringify(r,null,2),"utf-8"),{created:!0,path:".planning/config.json"}}catch(s){b("Failed to create config.json: "+s.message)}}function Vs(t,e,n){let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)&&(s=JSON.parse(ce.default.readFileSync(r,"utf-8")))}catch(c){b("Failed to read config.json: "+c.message)}let i=e.split("."),o=s;for(let c=0;c<i.length-1;c++){let l=i[c];(o[l]===void 0||typeof o[l]!="object")&&(o[l]={}),o=o[l]}let a=o[i[i.length-1]];o[i[i.length-1]]=n;try{return ce.default.writeFileSync(r,JSON.stringify(s,null,2),"utf-8"),{updated:!0,key:e,value:n,previousValue:a}}catch(c){b("Failed to write config.json: "+c.message)}}function Po(t,e,n){let r=Z(t),s=Ke.default.join(r,"config.json");if(ce.default.existsSync(s)){y({created:!1,reason:"already_exists"},n,"exists");return}let i={};if(e&&e.trim())try{i=JSON.parse(e)}catch(a){b("Invalid JSON for config-new-project: "+a.message)}try{ce.default.existsSync(r)||ce.default.mkdirSync(r,{recursive:!0})}catch(a){b("Failed to create .planning directory: "+a.message)}let o=$r(i);try{ce.default.writeFileSync(s,JSON.stringify(o,null,2),"utf-8"),y({created:!0,path:".planning/config.json"},n,"created")}catch(a){b("Failed to write config.json: "+a.message)}}function Co(t,e){let n=Us(t);y(n,e,n?.created?"created":"exists")}function $o(t,e,n,r){e||b("Usage: config-set <key.path> <value>"),ko(e),wo(e)||b(`Unknown config key: "${e}". Valid keys: ${[...Cr].sort().join(", ")}, agent_skills.<agent-type>`);let s=n;if(n==="true")s=!0;else if(n==="false")s=!1;else if(n!==void 0&&!isNaN(Number(n))&&n!=="")s=Number(n);else if(typeof n=="string"&&(n.startsWith("[")||n.startsWith("{")))try{s=JSON.parse(n)}catch{}let i=Vs(t,e,s);y(i,r,`${e}=${s}`)}function Ao(t,e,n){e||b("Usage: config-get <key.path>");let r=Ke.default.join(Z(t),"config.json"),s={};try{ce.default.existsSync(r)?s=JSON.parse(ce.default.readFileSync(r,"utf-8")):b("No config.json found at "+r)}catch(a){if(a.message.startsWith("Error:"))throw a;b("Failed to read config.json: "+a.message)}let i=e.split("."),o=s;for(let a of i)(o==null||typeof o!="object")&&b(`Key not found: ${e}`),o=o[a];o===void 0&&b(`Key not found: ${e}`),y(o,n,String(o))}function jo(t,e,n){e||b(`Usage: config-set-model-profile <${vt.join("|")}>`);let r=e.toLowerCase().trim();vt.includes(r)||b(`Invalid profile '${e}'. Valid profiles: ${vt.join(", ")}`),Us(t);let i=Vs(t,"model_profile",r)?.previousValue||"balanced",o=As(r),a=js(o),l=i!==r?`\u2713 Model profile set to: ${r} (was: ${i})
171
171
 
172
172
  Agents will now use:
173
173
 
@@ -176,7 +176,7 @@ Next spawned agents will use the new profile.`:`\u2713 Model profile is already
176
176
 
177
177
  Agents are using:
178
178
 
179
- ${a}`;y({updated:!0,profile:r,previousProfile:i,agentToModelMap:o},n,l)}var ce,Pr,Ke,Cr,_o,At=N(()=>{"use strict";ce=W(require("fs")),Pr=W(require("os")),Ke=W(require("path"));ge();Dt();Cr=new Set(["mode","granularity","parallelization","commit_docs","model_profile","search_gitignored","brave_search","firecrawl","exa_search","workflow.research","workflow.plan_check","workflow.verifier","workflow.nyquist_validation","workflow.ui_phase","workflow.ui_safety_gate","workflow.auto_advance","workflow.node_repair","workflow.node_repair_budget","workflow.text_mode","workflow.research_before_questions","workflow.discuss_mode","workflow.skip_discuss","workflow._auto_chain_active","git.branching_strategy","git.phase_branch_template","git.milestone_branch_template","git.quick_branch_template","planning.commit_docs","planning.search_gitignored","hooks.context_warnings"]),_o={"workflow.nyquist_validation_enabled":"workflow.nyquist_validation","agents.nyquist_validation_enabled":"workflow.nyquist_validation","nyquist.validation_enabled":"workflow.nyquist_validation","hooks.research_questions":"workflow.research_before_questions","workflow.research_questions":"workflow.research_before_questions"}});var pt,$n,An,jn,Rn,En,Ar=N(()=>{"use strict";pt=require("@oclif/core");$e();$n=class t extends w{static description="Get a config value";static args={key:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigGet:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.key,s)}},An=class t extends w{static description="Set a config value";static args={key:pt.Args.string({required:!1}),value:pt.Args.string({required:!1})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSet:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.key,n.value,s)}},jn=class t extends w{static description="Set the active model profile";static args={profile:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSetModelProfile:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.profile,s)}},Rn=class t extends w{static description="Initialise a new project config";static flags={...w.baseFlags,choices:pt.Flags.string({description:"Choices JSON"})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigNewProject:s}=await Promise.resolve().then(()=>(At(),$t));s(n,e.choices,r)}},En=class t extends w{static description="Ensure a config section exists";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigEnsureSection:s}=await Promise.resolve().then(()=>(At(),$t));s(n,r)}}});var Qe={};he(Qe,{cmdFindPhase:()=>Fo,cmdPhaseAdd:()=>Io,cmdPhaseComplete:()=>qo,cmdPhaseInsert:()=>To,cmdPhaseNextDecimal:()=>Eo,cmdPhasePlanIndex:()=>Mo,cmdPhaseRemove:()=>Wo,cmdPhasesList:()=>Ro});function Ro(t,e,n){let r=D.default.join(T(t),"phases"),{type:s,phase:i,includeArchived:o}=e;if(!R.default.existsSync(r)){y(s?{files:[],count:0}:{directories:[],count:0},n,"");return}try{let a=R.default.readdirSync(r,{withFileTypes:!0}).filter(c=>c.isDirectory()).map(c=>c.name);if(o){let c=Lt(t);for(let l of c)a.push(`${l.name} [${l.milestone}]`)}if(a.sort((c,l)=>Pe(c,l)),i){let c=de(i),l=a.find(d=>d.startsWith(c));if(!l){y({files:[],count:0,phase_dir:null,error:"Phase not found"},n,"");return}a=[l]}if(s){let c=[];for(let l of a){let d=D.default.join(r,l),u=R.default.readdirSync(d),m;s==="plans"?m=u.filter(p=>p.endsWith("-PLAN.md")||p==="PLAN.md"):s==="summaries"?m=u.filter(p=>p.endsWith("-SUMMARY.md")||p==="SUMMARY.md"):m=u,c.push(...m.sort())}y({files:c,count:c.length,phase_dir:i?a[0]?.replace(/^\d+(?:\.\d+)*-?/,""):null},n,c.join(`
179
+ ${a}`;y({updated:!0,profile:r,previousProfile:i,agentToModelMap:o},n,l)}var ce,Pr,Ke,Cr,_o,At=N(()=>{"use strict";ce=W(require("fs")),Pr=W(require("os")),Ke=W(require("path"));ge();Dt();Cr=new Set(["mode","granularity","parallelization","commit_docs","model_profile","search_gitignored","brave_search","firecrawl","exa_search","workflow.research","workflow.plan_check","workflow.verifier","workflow.nyquist_validation","workflow.ui_phase","workflow.ui_safety_gate","workflow.auto_advance","workflow.node_repair","workflow.node_repair_budget","workflow.text_mode","workflow.research_before_questions","workflow.discuss_mode","workflow.skip_discuss","workflow._auto_chain_active","git.branching_strategy","git.phase_branch_template","git.milestone_branch_template","git.quick_branch_template","planning.commit_docs","planning.search_gitignored","hooks.context_warnings"]),_o={"workflow.nyquist_validation_enabled":"workflow.nyquist_validation","agents.nyquist_validation_enabled":"workflow.nyquist_validation","nyquist.validation_enabled":"workflow.nyquist_validation","hooks.research_questions":"workflow.research_before_questions","workflow.research_questions":"workflow.research_before_questions"}});var pt,Cn,$n,An,jn,Rn,Ar=N(()=>{"use strict";pt=require("@oclif/core");$e();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(),$t));i(r,n.key,s)}},$n=class t extends w{static description="Set a config value";static args={key:pt.Args.string({required:!1}),value:pt.Args.string({required:!1})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSet:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.key,n.value,s)}},An=class t extends w{static description="Set the active model profile";static args={profile:pt.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdConfigSetModelProfile:i}=await Promise.resolve().then(()=>(At(),$t));i(r,n.profile,s)}},jn=class t extends w{static description="Initialise a new project config";static flags={...w.baseFlags,choices:pt.Flags.string({description:"Choices JSON"})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigNewProject:s}=await Promise.resolve().then(()=>(At(),$t));s(n,e.choices,r)}},Rn=class t extends w{static description="Ensure a config section exists";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e),{cmdConfigEnsureSection:s}=await Promise.resolve().then(()=>(At(),$t));s(n,r)}}});var Qe={};he(Qe,{cmdFindPhase:()=>Fo,cmdPhaseAdd:()=>Io,cmdPhaseComplete:()=>qo,cmdPhaseInsert:()=>To,cmdPhaseNextDecimal:()=>Eo,cmdPhasePlanIndex:()=>Mo,cmdPhaseRemove:()=>Wo,cmdPhasesList:()=>Ro});function Ro(t,e,n){let r=D.default.join(T(t),"phases"),{type:s,phase:i,includeArchived:o}=e;if(!R.default.existsSync(r)){y(s?{files:[],count:0}:{directories:[],count:0},n,"");return}try{let a=R.default.readdirSync(r,{withFileTypes:!0}).filter(c=>c.isDirectory()).map(c=>c.name);if(o){let c=Lt(t);for(let l of c)a.push(`${l.name} [${l.milestone}]`)}if(a.sort((c,l)=>Pe(c,l)),i){let c=de(i),l=a.find(d=>d.startsWith(c));if(!l){y({files:[],count:0,phase_dir:null,error:"Phase not found"},n,"");return}a=[l]}if(s){let c=[];for(let l of a){let d=D.default.join(r,l),u=R.default.readdirSync(d),m;s==="plans"?m=u.filter(p=>p.endsWith("-PLAN.md")||p==="PLAN.md"):s==="summaries"?m=u.filter(p=>p.endsWith("-SUMMARY.md")||p==="SUMMARY.md"):m=u,c.push(...m.sort())}y({files:c,count:c.length,phase_dir:i?a[0]?.replace(/^\d+(?:\.\d+)*-?/,""):null},n,c.join(`
180
180
  `));return}y({directories:a,count:a.length},n,a.join(`
181
181
  `))}catch(a){b("Failed to list phases: "+a.message)}}function Eo(t,e,n){let r=D.default.join(T(t),"phases"),s=de(e??"");if(!R.default.existsSync(r)){y({found:!1,base_phase:s,next:`${s}.1`,existing:[]},n,`${s}.1`);return}try{let i=R.default.readdirSync(r,{withFileTypes:!0}).filter(d=>d.isDirectory()).map(d=>d.name),o=i.some(d=>d.startsWith(s+"-")||d===s),a=new RegExp(`^${s}\\.(\\d+)`),c=i.map(d=>{let u=d.match(a);return u?`${s}.${u[1]}`:null}).filter(Boolean);c.sort((d,u)=>Pe(d,u));let l=c.length===0?`${s}.1`:`${s}.${parseInt(c[c.length-1].split(".")[1],10)+1}`;y({found:o,base_phase:s,next:l,existing:c},n,l)}catch(i){b("Failed to calculate next decimal phase: "+i.message)}}function Fo(t,e,n){e||b("phase identifier required");let r=D.default.join(T(t),"phases"),s=de(e),i={found:!1,directory:null,phase_number:null,phase_name:null,plans:[],summaries:[]};try{let a=R.default.readdirSync(r,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name).sort((g,h)=>Pe(g,h)).find(g=>g.startsWith(s));if(!a){y(i,n,"");return}let c=a.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i),l=c?c[1]:s,d=c&&c[2]?c[2]:null,u=D.default.join(r,a),m=R.default.readdirSync(u),p=m.filter(g=>g.endsWith("-PLAN.md")||g==="PLAN.md").sort(),f=m.filter(g=>g.endsWith("-SUMMARY.md")||g==="SUMMARY.md").sort();y({found:!0,directory:G(D.default.join(D.default.relative(t,T(t)),"phases",a)),phase_number:l,phase_name:d,plans:p,summaries:f},n,G(D.default.join(D.default.relative(t,T(t)),"phases",a)))}catch{y(i,n,"")}}function Mo(t,e,n){e||b("phase required for phase-plan-index");let r=D.default.join(T(t),"phases"),s=de(e),i=null;try{let g=R.default.readdirSync(r,{withFileTypes:!0}).filter(h=>h.isDirectory()).map(h=>h.name).sort((h,x)=>Pe(h,x)).find(h=>h.startsWith(s));g&&(i=D.default.join(r,g))}catch{}if(!i){y({phase:s,error:"Phase not found",plans:[],waves:{},incomplete:[],has_checkpoints:!1},n);return}let o=R.default.readdirSync(i),a=o.filter(f=>f.endsWith("-PLAN.md")||f==="PLAN.md").sort(),c=o.filter(f=>f.endsWith("-SUMMARY.md")||f==="SUMMARY.md"),l=new Set(c.map(f=>f.replace("-SUMMARY.md","").replace("SUMMARY.md",""))),d=[],u={},m=[],p=!1;for(let f of a){let g=f.replace("-PLAN.md","").replace("PLAN.md",""),h=R.default.readFileSync(D.default.join(i,f),"utf-8"),x=ie(h),S=h.match(/<task[\s>]/gi)||[],_=h.match(/##\s*Task\s*\d+/gi)||[],P=S.length||_.length,k=parseInt(String(x.wave),10)||1,C=!0;x.autonomous!==void 0&&(C=x.autonomous==="true"||x.autonomous===!0),C||(p=!0);let L=[],$=x.files_modified??x["files-modified"];if($){let U=_e($);L=U?U.map(Y=>ue(Y)??String(Y)):[ue($)??String($)]}let q=l.has(g);q||m.push(g),d.push({id:g,wave:k,autonomous:C,objective:h.match(/<objective>\s*\n?\s*(.+)/)?.[1]?.trim()??ue(x.objective)??null,files_modified:L,task_count:P,has_summary:q});let O=String(k);u[O]||(u[O]=[]),u[O].push(g)}y({phase:s,plans:d,waves:u,incomplete:m,has_checkpoints:p},n)}function Io(t,e,n,r){e||b("description required for phase add");let s=X(t),i=D.default.join(T(t),"ROADMAP.md");R.default.existsSync(i)||b("ROADMAP.md not found");let o=R.default.readFileSync(i,"utf-8"),a=ve(o,t),c=qe(e),l,d;if(r||s.phase_naming==="custom")l=r||c.toUpperCase().replace(/-/g,"-"),l||b('--id required when phase_naming is "custom"'),d=`${l}-${c}`;else{let h=/#{2,4}\s*Phase\s+(\d+)[A-Z]?(?:\.\d+)*:/gi,x=0,S;for(;(S=h.exec(a))!==null;){let P=parseInt(S[1],10);P>x&&(x=P)}l=x+1,d=`${String(l).padStart(2,"0")}-${c}`}let u=D.default.join(T(t),"phases",d);R.default.mkdirSync(u,{recursive:!0}),R.default.writeFileSync(D.default.join(u,".gitkeep"),"");let m=s.phase_naming==="custom"?"":`
182
182
  **Depends on:** Phase ${typeof l=="number"?l-1:"TBD"}`,p=`
@@ -199,7 +199,7 @@ Plans:
199
199
 
200
200
  Plans:
201
201
  - [ ] TBD (run /gsd-plan-phase ${h} to break down)
202
- `,P=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),k=i.match(P);k||b(`Could not find Phase ${e} header`);let C=i.indexOf(k[0]),$=i.slice(C+k[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),q=$?C+k[0].length+$.index:i.length;R.default.writeFileSync(s,i.slice(0,q)+_+i.slice(q),"utf-8"),y({phase_number:h,after_phase:e,name:n,slug:a,directory:G(D.default.join(D.default.relative(t,T(t)),"phases",x))},r,h)}function Do(t,e,n){let r=[],s=[],i=new RegExp(`^${e}\\.(\\d+)-(.+)$`),o=Le(t,!0).map(a=>{let c=a.match(i);return c?{dir:a,oldDecimal:parseInt(c[1],10),slug:c[2]}:null}).filter(a=>a!==null&&a.oldDecimal>n).sort((a,c)=>c.oldDecimal-a.oldDecimal);for(let a of o){let c=a.oldDecimal-1,l=`${e}.${a.oldDecimal}`,d=`${e}.${c}`,u=`${e}.${c}-${a.slug}`;R.default.renameSync(D.default.join(t,a.dir),D.default.join(t,u)),r.push({from:a.dir,to:u});for(let m of R.default.readdirSync(D.default.join(t,u)))if(m.includes(l)){let p=m.replace(l,d);R.default.renameSync(D.default.join(t,u,m),D.default.join(t,u,p)),s.push({from:m,to:p})}}return{renamedDirs:r,renamedFiles:s}}function Oo(t,e){let n=[],r=[],s=Le(t,!0).map(i=>{let o=i.match(/^(\d+)([A-Z])?(?:\.(\d+))?-(.+)$/i);if(!o)return null;let a=parseInt(o[1],10);return a>e?{dir:i,oldInt:a,letter:o[2]?o[2].toUpperCase():"",decimal:o[3]?parseInt(o[3],10):null,slug:o[4]}:null}).filter(i=>i!==null).sort((i,o)=>i.oldInt!==o.oldInt?o.oldInt-i.oldInt:(o.decimal||0)-(i.decimal||0));for(let i of s){let o=i.oldInt-1,a=String(o).padStart(2,"0"),c=String(i.oldInt).padStart(2,"0"),l=i.letter||"",d=i.decimal!==null?`.${i.decimal}`:"",u=`${c}${l}${d}`,m=`${a}${l}${d}`,p=`${m}-${i.slug}`;R.default.renameSync(D.default.join(t,i.dir),D.default.join(t,p)),n.push({from:i.dir,to:p});for(let f of R.default.readdirSync(D.default.join(t,p)))if(f.startsWith(u)){let g=m+f.slice(u.length);R.default.renameSync(D.default.join(t,p,f),D.default.join(t,p,g)),r.push({from:f,to:g})}}return{renamedDirs:n,renamedFiles:r}}function No(t,e,n,r){let s=R.default.readFileSync(t,"utf-8"),i=ne(e);if(s=s.replace(new RegExp(`\\n?#{2,4}\\s*Phase\\s+${i}\\s*:[\\s\\S]*?(?=\\n#{2,4}\\s+Phase\\s+\\d|$)`,"i"),""),s=s.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${i}[:\\s][^\\n]*`,"gi"),""),s=s.replace(new RegExp(`\\n?\\|\\s*${i}\\.?\\s[^|]*\\|[^\\n]*`,"gi"),""),!n)for(let o=99;o>r;o--){let a=o-1,c=String(o),l=String(a),d=c.padStart(2,"0"),u=l.padStart(2,"0");s=s.replace(new RegExp(`(#{2,4}\\s*Phase\\s+)${c}(\\s*:)`,"gi"),`$1${l}$2`),s=s.replace(new RegExp(`(Phase\\s+)${c}([:\\s])`,"g"),`$1${l}$2`),s=s.replace(new RegExp(`${d}-(\\d{2})`,"g"),`${u}-$1`),s=s.replace(new RegExp(`(\\|\\s*)${c}\\.\\s`,"g"),`$1${l}. `),s=s.replace(new RegExp(`(Depends on:\\*\\*\\s*Phase\\s+)${c}\\b`,"gi"),`$1${l}`)}R.default.writeFileSync(t,s,"utf-8")}function Wo(t,e,n,r){e||b("phase number required for phase remove");let s=D.default.join(T(t),"ROADMAP.md"),i=D.default.join(T(t),"phases");R.default.existsSync(s)||b("ROADMAP.md not found");let o=de(e),a=e.includes("."),c=n.force||!1,l=Le(i,!0).find(p=>p.startsWith(o+"-")||p===o)||null;if(l&&!c){let p=R.default.readdirSync(D.default.join(i,l)).filter(f=>f.endsWith("-SUMMARY.md")||f==="SUMMARY.md");p.length>0&&b(`Phase ${e} has ${p.length} executed plan(s). Use --force to remove anyway.`)}l&&R.default.rmSync(D.default.join(i,l),{recursive:!0,force:!0});let d=[],u=[];try{let p=a?Do(i,o.split(".")[0],parseInt(o.split(".")[1],10)):Oo(i,parseInt(o,10));d=p.renamedDirs,u=p.renamedFiles}catch{}No(s,e,a,parseInt(o,10));let m=D.default.join(T(t),"STATE.md");if(R.default.existsSync(m)){let p=R.default.readFileSync(m,"utf-8"),f=J(p,"Total Phases");f&&(p=we(p,"Total Phases",String(parseInt(f,10)-1))??p);let g=p.match(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i);g&&(p=p.replace(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i,`$1${parseInt(g[2],10)-1}$3`)),oe(m,p,t)}y({removed:e,directory_deleted:l,renamed_directories:d,renamed_files:u,roadmap_updated:!0,state_updated:R.default.existsSync(m)},r)}function qo(t,e,n){e||b("phase number required for phase complete");let r=D.default.join(T(t),"ROADMAP.md"),s=D.default.join(T(t),"STATE.md"),i=D.default.join(T(t),"phases"),o=de(e),a=new Date().toISOString().split("T")[0],c=fe(t,e);c||b(`Phase ${e} not found`);let l=c.plans.length,d=c.summaries.length,u=!1,m=[];try{let h=D.default.join(t,c.directory),x=R.default.readdirSync(h);for(let S of x.filter(_=>_.includes("-UAT")&&_.endsWith(".md"))){let _=R.default.readFileSync(D.default.join(h,S),"utf-8");/result: pending/.test(_)&&m.push(`${S}: has pending tests`),/result: blocked/.test(_)&&m.push(`${S}: has blocked tests`),/status: partial/.test(_)&&m.push(`${S}: testing incomplete (partial)`),/status: diagnosed/.test(_)&&m.push(`${S}: has diagnosed gaps`)}for(let S of x.filter(_=>_.includes("-VERIFICATION")&&_.endsWith(".md"))){let _=R.default.readFileSync(D.default.join(h,S),"utf-8");/status: human_needed/.test(_)&&m.push(`${S}: needs human verification`),/status: gaps_found/.test(_)&&m.push(`${S}: has unresolved gaps`)}}catch{}if(R.default.existsSync(r)){let h=R.default.readFileSync(r,"utf-8"),x=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${ne(e)}[:\\s][^\\n]*)`,"i");h=lt(h,x,`$1x$2 (completed ${a})`);let S=ne(e);h=h.replace(new RegExp(`^(\\|\\s*${S}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),P=>{let k=P.split("|").slice(1,-1);return k.length===5?(k[3]=" Complete ",k[4]=` ${a} `):k.length===4&&(k[2]=" Complete ",k[3]=` ${a} `),"|"+k.join("|")+"|"}),h=lt(h,new RegExp(`(#{2,4}\\s*Phase\\s+${S}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${l} plans complete`),R.default.writeFileSync(r,h,"utf-8");let _=D.default.join(T(t),"REQUIREMENTS.md");if(R.default.existsSync(_)){let k=ve(h,t).match(new RegExp(`(#{2,4}\\s*Phase\\s+${ne(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),L=(k?k[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(L){let $=L[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(O=>O.trim()).filter(Boolean),q=R.default.readFileSync(_,"utf-8");for(let O of $){let U=ne(O);q=q.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${U}\\*\\*)`,"gi"),"$1x$2"),q=q.replace(new RegExp(`(\\|\\s*${U}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}R.default.writeFileSync(_,q,"utf-8"),u=!0}}}let p=null,f=null,g=!0;try{let h=Ce(t),x=R.default.readdirSync(i,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).filter(h).sort((S,_)=>Pe(S,_));for(let S of x){let _=S.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(_&&Pe(_[1],e)>0){p=_[1],f=_[2]||null,g=!1;break}}}catch{}if(g&&R.default.existsSync(r))try{let h=ve(R.default.readFileSync(r,"utf-8"),t),x=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,S;for(;(S=x.exec(h))!==null;)if(Pe(S[1],e)>0){p=S[1],f=S[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),g=!1;break}}catch{}if(R.default.existsSync(s)){let h=R.default.readFileSync(s,"utf-8"),x=p||e,S=J(h,"Current Phase")||J(h,"Phase"),_=String(x);if(S){let k=S.match(/of\s+(\d+)/),C=S.match(/\(([^)]+)\)/);if(k){let L=f?` (${f.replace(/-/g," ")})`:C?` (${C[1]})`:"";_=`${x} of ${k[1]}${L}`}}h=ye(h,"Current Phase","Phase",_),f&&(h=ye(h,"Current Phase Name",null,f.replace(/-/g," "))),h=ye(h,"Status",null,g?"Milestone complete":"Ready to plan"),h=ye(h,"Current Plan","Plan","Not started"),h=ye(h,"Last Activity","Last activity",a),h=ye(h,"Last Activity Description",null,`Phase ${e} complete${p?`, transitioned to Phase ${p}`:""}`);let P=J(h,"Completed Phases");if(P){let k=parseInt(P,10)+1;h=we(h,"Completed Phases",String(k))??h;let C=J(h,"Total Phases");if(C){let L=parseInt(C,10);if(L>0){let $=Math.round(k/L*100);h=we(h,"Progress",`${$}%`)??h,h=h.replace(/(percent:\s*)\d+/,`$1${$}`)}}}oe(s,h,t)}y({completed_phase:e,phase_name:c.phase_name,plans_executed:`${d}/${l}`,next_phase:p,next_phase_name:f,is_last_phase:g,date:a,roadmap_updated:R.default.existsSync(r),state_updated:R.default.existsSync(s),requirements_updated:u,warnings:m,has_warnings:m.length>0},n)}var R,D,et=N(()=>{"use strict";R=W(require("fs")),D=W(require("path"));ge();Ue();Fe()});var Ge,Fn,Mn,In,Tn,Dn,On,jr=N(()=>{"use strict";Ge=require("@oclif/core");$e();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:()=>Uo,cmdRequirementsMarkComplete:()=>Lo});function Lo(t,e,n){(!e||e.length===0)&&b("requirement IDs required.");let r=e.join(" ").replace(/[[\]]/g,"").split(/[,\s]+/).map(l=>l.trim()).filter(Boolean);r.length===0&&b("no valid requirement IDs found");let s=j(t).requirements;if(!B.default.existsSync(s)){y({updated:!1,reason:"REQUIREMENTS.md not found",ids:r},n,"no requirements file");return}let i=B.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&&B.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 Uo(t,e,n,r){e||b("version required for milestone complete (e.g., v1.0)");let s=j(t).roadmap,i=j(t).requirements,o=j(t).state,a=ke.default.join(t,".planning","MILESTONES.md"),c=ke.default.join(t,".planning","milestones"),l=j(t).phases,d=new Date().toISOString().split("T")[0],u=n.name||e;B.default.mkdirSync(c,{recursive:!0});let m=Ce(t),p=0,f=0,g=0,h=[];try{let k=B.default.readdirSync(l,{withFileTypes:!0}).filter(C=>C.isDirectory()).map(C=>C.name).sort();for(let C of k){if(!m(C))continue;p++;let L=B.default.readdirSync(ke.default.join(l,C)),$=L.filter(O=>O.endsWith("-PLAN.md")||O==="PLAN.md"),q=L.filter(O=>O.endsWith("-SUMMARY.md")||O==="SUMMARY.md");f+=$.length;for(let O of q)try{let U=B.default.readFileSync(ke.default.join(l,C,O),"utf-8"),Y=ie(U),le=ue(Y["one-liner"])??Ut(U);le&&h.push(le);let be=U.match(/\*\*Tasks:\*\*\s*(\d+)/);if(be)g+=parseInt(be[1],10);else{let te=U.match(/<task[\s>]/gi)||[],pe=U.match(/##\s*Task\s*\d+/gi)||[];g+=te.length||pe.length}}catch{}}}catch{}B.default.existsSync(s)&&B.default.writeFileSync(ke.default.join(c,`${e}-ROADMAP.md`),B.default.readFileSync(s,"utf-8"),"utf-8"),B.default.existsSync(i)&&B.default.writeFileSync(ke.default.join(c,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
202
+ `,P=new RegExp(`(#{2,4}\\s*Phase\\s+0*${d}:[^\\n]*\\n)`,"i"),k=i.match(P);k||b(`Could not find Phase ${e} header`);let C=i.indexOf(k[0]),$=i.slice(C+k[0].length).match(/\n#{2,4}\s+Phase\s+\d/i),q=$?C+k[0].length+$.index:i.length;R.default.writeFileSync(s,i.slice(0,q)+_+i.slice(q),"utf-8"),y({phase_number:h,after_phase:e,name:n,slug:a,directory:G(D.default.join(D.default.relative(t,T(t)),"phases",x))},r,h)}function Do(t,e,n){let r=[],s=[],i=new RegExp(`^${e}\\.(\\d+)-(.+)$`),o=Le(t,!0).map(a=>{let c=a.match(i);return c?{dir:a,oldDecimal:parseInt(c[1],10),slug:c[2]}:null}).filter(a=>a!==null&&a.oldDecimal>n).sort((a,c)=>c.oldDecimal-a.oldDecimal);for(let a of o){let c=a.oldDecimal-1,l=`${e}.${a.oldDecimal}`,d=`${e}.${c}`,u=`${e}.${c}-${a.slug}`;R.default.renameSync(D.default.join(t,a.dir),D.default.join(t,u)),r.push({from:a.dir,to:u});for(let m of R.default.readdirSync(D.default.join(t,u)))if(m.includes(l)){let p=m.replace(l,d);R.default.renameSync(D.default.join(t,u,m),D.default.join(t,u,p)),s.push({from:m,to:p})}}return{renamedDirs:r,renamedFiles:s}}function Oo(t,e){let n=[],r=[],s=Le(t,!0).map(i=>{let o=i.match(/^(\d+)([A-Z])?(?:\.(\d+))?-(.+)$/i);if(!o)return null;let a=parseInt(o[1],10);return a>e?{dir:i,oldInt:a,letter:o[2]?o[2].toUpperCase():"",decimal:o[3]?parseInt(o[3],10):null,slug:o[4]}:null}).filter(i=>i!==null).sort((i,o)=>i.oldInt!==o.oldInt?o.oldInt-i.oldInt:(o.decimal||0)-(i.decimal||0));for(let i of s){let o=i.oldInt-1,a=String(o).padStart(2,"0"),c=String(i.oldInt).padStart(2,"0"),l=i.letter||"",d=i.decimal!==null?`.${i.decimal}`:"",u=`${c}${l}${d}`,m=`${a}${l}${d}`,p=`${m}-${i.slug}`;R.default.renameSync(D.default.join(t,i.dir),D.default.join(t,p)),n.push({from:i.dir,to:p});for(let f of R.default.readdirSync(D.default.join(t,p)))if(f.startsWith(u)){let g=m+f.slice(u.length);R.default.renameSync(D.default.join(t,p,f),D.default.join(t,p,g)),r.push({from:f,to:g})}}return{renamedDirs:n,renamedFiles:r}}function No(t,e,n,r){let s=R.default.readFileSync(t,"utf-8"),i=ne(e);if(s=s.replace(new RegExp(`\\n?#{2,4}\\s*Phase\\s+${i}\\s*:[\\s\\S]*?(?=\\n#{2,4}\\s+Phase\\s+\\d|$)`,"i"),""),s=s.replace(new RegExp(`\\n?-\\s*\\[[ x]\\]\\s*.*Phase\\s+${i}[:\\s][^\\n]*`,"gi"),""),s=s.replace(new RegExp(`\\n?\\|\\s*${i}\\.?\\s[^|]*\\|[^\\n]*`,"gi"),""),!n)for(let o=99;o>r;o--){let a=o-1,c=String(o),l=String(a),d=c.padStart(2,"0"),u=l.padStart(2,"0");s=s.replace(new RegExp(`(#{2,4}\\s*Phase\\s+)${c}(\\s*:)`,"gi"),`$1${l}$2`),s=s.replace(new RegExp(`(Phase\\s+)${c}([:\\s])`,"g"),`$1${l}$2`),s=s.replace(new RegExp(`${d}-(\\d{2})`,"g"),`${u}-$1`),s=s.replace(new RegExp(`(\\|\\s*)${c}\\.\\s`,"g"),`$1${l}. `),s=s.replace(new RegExp(`(Depends on:\\*\\*\\s*Phase\\s+)${c}\\b`,"gi"),`$1${l}`)}R.default.writeFileSync(t,s,"utf-8")}function Wo(t,e,n,r){e||b("phase number required for phase remove");let s=D.default.join(T(t),"ROADMAP.md"),i=D.default.join(T(t),"phases");R.default.existsSync(s)||b("ROADMAP.md not found");let o=de(e),a=e.includes("."),c=n.force||!1,l=Le(i,!0).find(p=>p.startsWith(o+"-")||p===o)||null;if(l&&!c){let p=R.default.readdirSync(D.default.join(i,l)).filter(f=>f.endsWith("-SUMMARY.md")||f==="SUMMARY.md");p.length>0&&b(`Phase ${e} has ${p.length} executed plan(s). Use --force to remove anyway.`)}l&&R.default.rmSync(D.default.join(i,l),{recursive:!0,force:!0});let d=[],u=[];try{let p=a?Do(i,o.split(".")[0],parseInt(o.split(".")[1],10)):Oo(i,parseInt(o,10));d=p.renamedDirs,u=p.renamedFiles}catch{}No(s,e,a,parseInt(o,10));let m=D.default.join(T(t),"STATE.md");if(R.default.existsSync(m)){let p=R.default.readFileSync(m,"utf-8"),f=J(p,"Total Phases");f&&(p=we(p,"Total Phases",String(parseInt(f,10)-1))??p);let g=p.match(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i);g&&(p=p.replace(/(\bof\s+)(\d+)(\s*(?:\(|phases?))/i,`$1${parseInt(g[2],10)-1}$3`)),oe(m,p,t)}y({removed:e,directory_deleted:l,renamed_directories:d,renamed_files:u,roadmap_updated:!0,state_updated:R.default.existsSync(m)},r)}function qo(t,e,n){e||b("phase number required for phase complete");let r=D.default.join(T(t),"ROADMAP.md"),s=D.default.join(T(t),"STATE.md"),i=D.default.join(T(t),"phases"),o=de(e),a=new Date().toISOString().split("T")[0],c=fe(t,e);c||b(`Phase ${e} not found`);let l=c.plans.length,d=c.summaries.length,u=!1,m=[];try{let h=D.default.join(t,c.directory),x=R.default.readdirSync(h);for(let S of x.filter(_=>_.includes("-UAT")&&_.endsWith(".md"))){let _=R.default.readFileSync(D.default.join(h,S),"utf-8");/result: pending/.test(_)&&m.push(`${S}: has pending tests`),/result: blocked/.test(_)&&m.push(`${S}: has blocked tests`),/status: partial/.test(_)&&m.push(`${S}: testing incomplete (partial)`),/status: diagnosed/.test(_)&&m.push(`${S}: has diagnosed gaps`)}for(let S of x.filter(_=>_.includes("-VERIFICATION")&&_.endsWith(".md"))){let _=R.default.readFileSync(D.default.join(h,S),"utf-8");/status: human_needed/.test(_)&&m.push(`${S}: needs human verification`),/status: gaps_found/.test(_)&&m.push(`${S}: has unresolved gaps`)}}catch{}if(R.default.existsSync(r)){let h=R.default.readFileSync(r,"utf-8"),x=new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${ne(e)}[:\\s][^\\n]*)`,"i");h=lt(h,x,`$1x$2 (completed ${a})`);let S=ne(e);h=h.replace(new RegExp(`^(\\|\\s*${S}\\.?\\s[^|]*(?:\\|[^\\n]*))$`,"im"),P=>{let k=P.split("|").slice(1,-1);return k.length===5?(k[3]=" Complete ",k[4]=` ${a} `):k.length===4&&(k[2]=" Complete ",k[3]=` ${a} `),"|"+k.join("|")+"|"}),h=lt(h,new RegExp(`(#{2,4}\\s*Phase\\s+${S}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`,"i"),`$1${d}/${l} plans complete`),R.default.writeFileSync(r,h,"utf-8");let _=D.default.join(T(t),"REQUIREMENTS.md");if(R.default.existsSync(_)){let k=ve(h,t).match(new RegExp(`(#{2,4}\\s*Phase\\s+${ne(e)}[:\\s][\\s\\S]*?)(?=#{2,4}\\s*Phase\\s+|$)`,"i")),L=(k?k[1]:"").match(/\*\*Requirements:\*\*\s*([^\n]+)/i);if(L){let $=L[1].replace(/[[\]]/g,"").split(/[,\s]+/).map(O=>O.trim()).filter(Boolean),q=R.default.readFileSync(_,"utf-8");for(let O of $){let U=ne(O);q=q.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${U}\\*\\*)`,"gi"),"$1x$2"),q=q.replace(new RegExp(`(\\|\\s*${U}\\s*\\|[^|]+\\|)\\s*(?:Pending|In Progress)\\s*(\\|)`,"gi"),"$1 Complete $2")}R.default.writeFileSync(_,q,"utf-8"),u=!0}}}let p=null,f=null,g=!0;try{let h=Ce(t),x=R.default.readdirSync(i,{withFileTypes:!0}).filter(S=>S.isDirectory()).map(S=>S.name).filter(h).sort((S,_)=>Pe(S,_));for(let S of x){let _=S.match(/^(\d+[A-Z]?(?:\.\d+)*)-?(.*)/i);if(_&&Pe(_[1],e)>0){p=_[1],f=_[2]||null,g=!1;break}}}catch{}if(g&&R.default.existsSync(r))try{let h=ve(R.default.readFileSync(r,"utf-8"),t),x=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi,S;for(;(S=x.exec(h))!==null;)if(Pe(S[1],e)>0){p=S[1],f=S[2].replace(/\(INSERTED\)/i,"").trim().toLowerCase().replace(/\s+/g,"-"),g=!1;break}}catch{}if(R.default.existsSync(s)){let h=R.default.readFileSync(s,"utf-8"),x=p||e,S=J(h,"Current Phase")||J(h,"Phase"),_=String(x);if(S){let k=S.match(/of\s+(\d+)/),C=S.match(/\(([^)]+)\)/);if(k){let L=f?` (${f.replace(/-/g," ")})`:C?` (${C[1]})`:"";_=`${x} of ${k[1]}${L}`}}h=ye(h,"Current Phase","Phase",_),f&&(h=ye(h,"Current Phase Name",null,f.replace(/-/g," "))),h=ye(h,"Status",null,g?"Milestone complete":"Ready to plan"),h=ye(h,"Current Plan","Plan","Not started"),h=ye(h,"Last Activity","Last activity",a),h=ye(h,"Last Activity Description",null,`Phase ${e} complete${p?`, transitioned to Phase ${p}`:""}`);let P=J(h,"Completed Phases");if(P){let k=parseInt(P,10)+1;h=we(h,"Completed Phases",String(k))??h;let C=J(h,"Total Phases");if(C){let L=parseInt(C,10);if(L>0){let $=Math.round(k/L*100);h=we(h,"Progress",`${$}%`)??h,h=h.replace(/(percent:\s*)\d+/,`$1${$}`)}}}oe(s,h,t)}y({completed_phase:e,phase_name:c.phase_name,plans_executed:`${d}/${l}`,next_phase:p,next_phase_name:f,is_last_phase:g,date:a,roadmap_updated:R.default.existsSync(r),state_updated:R.default.existsSync(s),requirements_updated:u,warnings:m,has_warnings:m.length>0},n)}var R,D,et=N(()=>{"use strict";R=W(require("fs")),D=W(require("path"));ge();Ue();Fe()});var Ge,En,Fn,Mn,In,Tn,Dn,jr=N(()=>{"use strict";Ge=require("@oclif/core");$e();En=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)}},Fn=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)}},Mn=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)}},In=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)}},Tn=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)}},Dn=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 On={};he(On,{cmdMilestoneComplete:()=>Uo,cmdRequirementsMarkComplete:()=>Lo});function Lo(t,e,n){(!e||e.length===0)&&b("requirement IDs required.");let r=e.join(" ").replace(/[[\]]/g,"").split(/[,\s]+/).map(l=>l.trim()).filter(Boolean);r.length===0&&b("no valid requirement IDs found");let s=j(t).requirements;if(!B.default.existsSync(s)){y({updated:!1,reason:"REQUIREMENTS.md not found",ids:r},n,"no requirements file");return}let i=B.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&&B.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 Uo(t,e,n,r){e||b("version required for milestone complete (e.g., v1.0)");let s=j(t).roadmap,i=j(t).requirements,o=j(t).state,a=ke.default.join(t,".planning","MILESTONES.md"),c=ke.default.join(t,".planning","milestones"),l=j(t).phases,d=new Date().toISOString().split("T")[0],u=n.name||e;B.default.mkdirSync(c,{recursive:!0});let m=Ce(t),p=0,f=0,g=0,h=[];try{let k=B.default.readdirSync(l,{withFileTypes:!0}).filter(C=>C.isDirectory()).map(C=>C.name).sort();for(let C of k){if(!m(C))continue;p++;let L=B.default.readdirSync(ke.default.join(l,C)),$=L.filter(O=>O.endsWith("-PLAN.md")||O==="PLAN.md"),q=L.filter(O=>O.endsWith("-SUMMARY.md")||O==="SUMMARY.md");f+=$.length;for(let O of q)try{let U=B.default.readFileSync(ke.default.join(l,C,O),"utf-8"),Y=ie(U),le=ue(Y["one-liner"])??Ut(U);le&&h.push(le);let be=U.match(/\*\*Tasks:\*\*\s*(\d+)/);if(be)g+=parseInt(be[1],10);else{let te=U.match(/<task[\s>]/gi)||[],pe=U.match(/##\s*Task\s*\d+/gi)||[];g+=te.length||pe.length}}catch{}}}catch{}B.default.existsSync(s)&&B.default.writeFileSync(ke.default.join(c,`${e}-ROADMAP.md`),B.default.readFileSync(s,"utf-8"),"utf-8"),B.default.existsSync(i)&&B.default.writeFileSync(ke.default.join(c,`${e}-REQUIREMENTS.md`),`# Requirements Archive: ${e} ${u}
203
203
 
204
204
  **Archived:** ${d}
205
205
  **Status:** SHIPPED
@@ -220,8 +220,8 @@ ${S||"- (none recorded)"}
220
220
 
221
221
  ${_}`),"utf-8");else{let C=k.match(/^(#{1,3}\s+[^\n]*\n\n?)/);C?B.default.writeFileSync(a,Ee(C[1]+_+k.slice(C[1].length)),"utf-8"):B.default.writeFileSync(a,Ee(_+k),"utf-8")}}else B.default.writeFileSync(a,Ee(`# Milestones
222
222
 
223
- ${_}`),"utf-8");if(B.default.existsSync(o)){let k=B.default.readFileSync(o,"utf-8");k=ye(k,"Status",null,`${e} milestone complete`),k=ye(k,"Last Activity","Last activity",d),k=ye(k,"Last Activity Description",null,`${e} milestone completed and archived`),oe(o,k,t)}let P=!1;if(n.archivePhases)try{let k=ke.default.join(c,`${e}-phases`);B.default.mkdirSync(k,{recursive:!0});let C=B.default.readdirSync(l,{withFileTypes:!0}).filter($=>$.isDirectory()).map($=>$.name),L=0;for(let $ of C)m($)&&(B.default.renameSync(ke.default.join(l,$),ke.default.join(k,$)),L++);P=L>0}catch{}y({version:e,name:u,date:d,phases:p,plans:f,tasks:g,accomplishments:h,archived:{roadmap:B.default.existsSync(ke.default.join(c,`${e}-ROADMAP.md`)),requirements:B.default.existsSync(ke.default.join(c,`${e}-REQUIREMENTS.md`)),audit:B.default.existsSync(ke.default.join(c,`${e}-MILESTONE-AUDIT.md`)),phases:P},milestones_updated:!0,state_updated:B.default.existsSync(o)},r)}var B,ke,Wn=N(()=>{"use strict";B=W(require("fs")),ke=W(require("path"));ge();Ue();Fe()});var Vt,qn,Ln,Rr=N(()=>{"use strict";Vt=require("@oclif/core");$e();qn=class t extends w{static description="Complete the current milestone";static args={version:Vt.Args.string({required:!1})};static flags={...w.baseFlags,name:Vt.Flags.string({description:"Milestone name"}),"archive-phases":Vt.Flags.boolean({description:"Archive phases",default:!1})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdMilestoneComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n.version??"",{name:e.name??null,archivePhases:e["archive-phases"]},s)}},Ln=class t extends w{static description="Mark requirements as complete";static flags={...w.baseFlags};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdRequirementsMarkComplete:i}=await Promise.resolve().then(()=>(Wn(),Nn));i(r,n,s)}}});var v,Er,Xc,Zc,Kc,Qc,Vo,el,zo,Go,Bo,Un,Fr=N(()=>{"use strict";v=require("zod"),Er=v.z.object({milestone:v.z.string().optional(),milestone_name:v.z.string().optional(),current_phase:v.z.string().optional(),current_phase_name:v.z.string().optional(),current_plan:v.z.string().optional(),total_phases:v.z.coerce.number().int().nonnegative().optional(),total_plans_in_phase:v.z.coerce.number().int().nonnegative().optional(),status:v.z.string().optional(),progress:v.z.string().optional(),last_activity:v.z.string().optional(),paused_at:v.z.string().optional(),stopped_at:v.z.string().optional()}).passthrough(),Xc=v.z.object({found:v.z.literal(!0),phase_number:v.z.string(),phase_name:v.z.string(),goal:v.z.string().nullable(),success_criteria:v.z.array(v.z.string()).default([]),section:v.z.string().optional()}).passthrough(),Zc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),plan:v.z.union([v.z.string(),v.z.number()]),type:v.z.string(),wave:v.z.union([v.z.string(),v.z.number()]),depends_on:v.z.union([v.z.string(),v.z.array(v.z.string())]),files_modified:v.z.union([v.z.string(),v.z.array(v.z.string())]),autonomous:v.z.union([v.z.boolean(),v.z.string()]),must_haves:v.z.union([v.z.string(),v.z.array(v.z.string())])}).passthrough(),Kc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),plan:v.z.union([v.z.string(),v.z.number()]),subsystem:v.z.string(),tags:v.z.union([v.z.string(),v.z.array(v.z.string())]),duration:v.z.string(),completed:v.z.string()}).passthrough(),Qc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),verified:v.z.union([v.z.boolean(),v.z.string()]),status:v.z.string(),score:v.z.union([v.z.number(),v.z.string()])}).passthrough(),Vo=v.z.object({test:v.z.number().int().positive().optional(),name:v.z.string(),expected:v.z.string().optional(),result:v.z.string(),category:v.z.string(),reason:v.z.string().optional(),blocked_by:v.z.string().optional()}).passthrough(),el=v.z.object({phase:v.z.string(),phase_dir:v.z.string(),file:v.z.string(),file_path:v.z.string(),type:v.z.literal("uat"),status:v.z.string(),items:v.z.array(Vo)}).passthrough(),zo=v.z.object({branching_strategy:v.z.enum(["none","phase","milestone","workstream"]).default("none"),phase_branch_template:v.z.string().default("gsd/phase-{phase}-{slug}"),milestone_branch_template:v.z.string().default("gsd/{milestone}-{slug}"),quick_branch_template:v.z.string().nullable().default(null)}).passthrough(),Go=v.z.object({research:v.z.boolean().default(!0),plan_check:v.z.boolean().default(!0),verifier:v.z.boolean().default(!0),nyquist_validation:v.z.boolean().default(!0),auto_advance:v.z.boolean().default(!1),node_repair:v.z.boolean().default(!0),node_repair_budget:v.z.number().int().nonnegative().default(2),auto_retry_audit:v.z.boolean().default(!0),auto_retry_audit_budget:v.z.number().int().nonnegative().default(1),auto_retry_tech_debt:v.z.boolean().default(!0),auto_retry_tech_debt_budget:v.z.number().int().nonnegative().default(1),ui_phase:v.z.boolean().default(!0),ui_safety_gate:v.z.boolean().default(!0),text_mode:v.z.boolean().default(!1),research_before_questions:v.z.boolean().default(!1),discuss_mode:v.z.string().default("discuss"),skip_discuss:v.z.boolean().default(!1),_auto_chain_active:v.z.boolean().default(!1)}).passthrough(),Bo=v.z.object({context_warnings:v.z.boolean().default(!0),workflow_guard:v.z.boolean().default(!1)}).passthrough(),Un=v.z.object({model_profile:v.z.enum(["quality","balanced","budget","inherit"]).default("balanced"),commit_docs:v.z.boolean().default(!0),parallelization:v.z.boolean().default(!0),search_gitignored:v.z.boolean().default(!1),brave_search:v.z.boolean().default(!1),firecrawl:v.z.boolean().default(!1),exa_search:v.z.boolean().default(!1),git:zo.default({}),workflow:Go.default({}),hooks:Bo.default({}),agent_skills:v.z.record(v.z.string(),v.z.unknown()).default({})}).passthrough()});var jt={};he(jt,{cmdValidateAgents:()=>sa,cmdValidateConsistency:()=>ta,cmdValidateHealth:()=>na,cmdVerifyArtifacts:()=>Qo,cmdVerifyCommits:()=>Ko,cmdVerifyKeyLinks:()=>ea,cmdVerifyPhaseCompleteness:()=>Xo,cmdVerifyPlanStructure:()=>Ho,cmdVerifyReferences:()=>Zo,cmdVerifySummary:()=>Yo});function Jo(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}function Yo(t,e,n,r){e||b("summary-path required");let s=K.default.join(t,e),i=n||2;if(!Q.default.existsSync(s)){y({passed:!1,checks:{summary_exists:!1,files_created:{checked:0,found:0,missing:[]},commits_exist:!1,self_check:"not_found"},errors:["SUMMARY.md not found"]},r,"failed");return}let o=Q.default.readFileSync(s,"utf-8"),a=[],c=new Set;for(let g of[/`([^`]+\.[a-zA-Z]+)`/g,/(?:Created|Modified|Added|Updated|Edited):\s*`?([^\s`]+\.[a-zA-Z]+)`?/gi]){let h;for(;(h=g.exec(o))!==null;)h[1]&&!h[1].startsWith("http")&&h[1].includes("/")&&c.add(h[1])}let l=Array.from(c).slice(0,i),d=l.filter(g=>!Q.default.existsSync(K.default.join(t,g))),u=o.match(/\b[0-9a-f]{7,40}\b/g)||[],m=!1;for(let g of u.slice(0,3))if(ae(t,["cat-file","-t",g]).stdout==="commit"){m=!0;break}let p="not_found";if(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i.test(o)){let g=o.slice(o.search(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i));/(?:fail|✗|❌|incomplete|blocked)/i.test(g)?p="failed":/(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i.test(g)&&(p="passed")}d.length>0&&a.push("Missing files: "+d.join(", ")),!m&&u.length>0&&a.push("Referenced commit hashes not found in git history"),p==="failed"&&a.push("Self-check section indicates failure");let f=d.length===0&&p!=="failed";y({passed:f,checks:{summary_exists:!0,files_created:{checked:l.length,found:l.length-d.length,missing:d},commits_exist:m,self_check:p},errors:a},r,f?"passed":"failed")}function Ho(t,e,n){e||b("file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=ie(s),o=[],a=[];for(let m of["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"])i[m]===void 0&&o.push(`Missing required frontmatter field: ${m}`);let c=/<task[^>]*>([\s\S]*?)<\/task>/g,l=[],d;for(;(d=c.exec(s))!==null;){let m=d[1],p=m.match(/<name>([\s\S]*?)<\/name>/),f=p?p[1].trim():"unnamed",g=/<files>/.test(m),h=/<action>/.test(m),x=/<verify>/.test(m),S=/<done>/.test(m);p||o.push("Task missing <name> element"),h||o.push(`Task '${f}' missing <action>`),x||a.push(`Task '${f}' missing <verify>`),S||a.push(`Task '${f}' missing <done>`),g||a.push(`Task '${f}' missing <files>`),l.push({name:f,hasFiles:g,hasAction:h,hasVerify:x,hasDone:S})}l.length===0&&a.push("No <task> elements found"),i.wave&&parseInt(String(i.wave))>1&&(!i.depends_on||Array.isArray(i.depends_on)&&i.depends_on.length===0)&&a.push("Wave > 1 but depends_on is empty"),/<task\s+type=["']?checkpoint/.test(s)&&i.autonomous!=="false"&&i.autonomous!==!1&&o.push("Has checkpoint tasks but autonomous is not false"),y({valid:o.length===0,errors:o,warnings:a,task_count:l.length,tasks:l,frontmatter_fields:Object.keys(i)},n,o.length===0?"valid":"invalid")}function Xo(t,e,n){e||b("phase required");let r=fe(t,e);if(!r?.found){y({error:"Phase not found",phase:e},n);return}let s=K.default.join(t,r.directory),i=[],o=[],a;try{a=Q.default.readdirSync(s)}catch{y({error:"Cannot read phase directory"},n);return}let c=a.filter(f=>f.match(/-PLAN\.md$/i)),l=a.filter(f=>f.match(/-SUMMARY\.md$/i)),d=new Set(c.map(f=>f.replace(/-PLAN\.md$/i,""))),u=new Set(l.map(f=>f.replace(/-SUMMARY\.md$/i,""))),m=[...d].filter(f=>!u.has(f)),p=[...u].filter(f=>!d.has(f));m.length>0&&i.push(`Plans without summaries: ${m.join(", ")}`),p.length>0&&o.push(`Summaries without plans: ${p.join(", ")}`),y({complete:i.length===0,phase:r.phase_number,plan_count:c.length,summary_count:l.length,incomplete_plans:m,orphan_summaries:p,errors:i,warnings:o},n,i.length===0?"complete":"incomplete")}function Zo(t,e,n){e||b("file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=[],o=[];for(let a of s.match(/@([^\s\n,)]+\/[^\s\n,)]+)/g)||[]){let c=a.slice(1),l=c.startsWith("~/")?K.default.join(process.env.HOME??"",c.slice(2)):K.default.join(t,c);(Q.default.existsSync(l)?i:o).push(c)}for(let a of s.match(/`([^`]+\/[^`]+\.[a-zA-Z]{1,10})`/g)||[]){let c=a.slice(1,-1);c.startsWith("http")||c.includes("${")||c.includes("{{")||i.includes(c)||o.includes(c)||(Q.default.existsSync(K.default.join(t,c))?i:o).push(c)}y({valid:o.length===0,found:i.length,missing:o,total:i.length+o.length},n,o.length===0?"valid":"invalid")}function Ko(t,e,n){(!e||e.length===0)&&b("At least one commit hash required");let r=[],s=[];for(let i of e)(ae(t,["cat-file","-t",i]).stdout.trim()==="commit"?r:s).push(i);y({all_valid:s.length===0,valid:r,invalid:s,total:e.length},n,s.length===0?"valid":"invalid")}function Qo(t,e,n){e||b("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=an(s,"artifacts");if(i.length===0){y({error:"No must_haves.artifacts found in frontmatter",path:e},n);return}let o=[];for(let c of i){if(typeof c=="string")continue;let l=c;if(!l.path)continue;let d=K.default.join(t,l.path),u=Q.default.existsSync(d),m={path:l.path,exists:u,issues:[],passed:!1};if(u){let p=Oe(d)??"",f=p.split(`
224
- `).length;if(l.min_lines&&f<l.min_lines&&m.issues.push(`Only ${f} lines, need ${l.min_lines}`),l.contains&&!p.includes(l.contains)&&m.issues.push(`Missing pattern: ${l.contains}`),l.exports){let g=Array.isArray(l.exports)?l.exports:[l.exports];for(let h of g)p.includes(h)||m.issues.push(`Missing export: ${h}`)}m.passed=m.issues.length===0}else m.issues.push("File not found");o.push(m)}let a=o.filter(c=>c.passed).length;y({all_passed:a===o.length,passed:a,total:o.length,artifacts:o},n,a===o.length?"valid":"invalid")}function ea(t,e,n){e||b("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=an(s,"key_links");if(i.length===0){y({error:"No must_haves.key_links found in frontmatter",path:e},n);return}let o=[];for(let c of i){if(typeof c=="string")continue;let l=c,d={from:l.from??"",to:l.to??"",via:l.via||"",verified:!1,detail:""},u=Oe(K.default.join(t,l.from||""));if(!u)d.detail="Source file not found";else if(l.pattern)try{let m=new RegExp(l.pattern);if(m.test(u))d.verified=!0,d.detail="Pattern found in source";else{let p=Oe(K.default.join(t,l.to||""));p&&m.test(p)?(d.verified=!0,d.detail="Pattern found in target"):d.detail=`Pattern "${l.pattern}" not found in source or target`}}catch{d.detail=`Invalid regex pattern: ${l.pattern}`}else u.includes(l.to||"")?(d.verified=!0,d.detail="Target referenced in source"):d.detail="Target not referenced in source";o.push(d)}let a=o.filter(c=>c.verified).length;y({all_verified:a===o.length,verified:a,total:o.length,links:o},n,a===o.length?"valid":"invalid")}function ta(t,e){let n=K.default.join(T(t),"ROADMAP.md"),r=K.default.join(T(t),"phases"),s=[],i=[];if(!Q.default.existsSync(n)){s.push("ROADMAP.md not found"),y({passed:!1,errors:s,warnings:i},e,"failed");return}let o=ve(Q.default.readFileSync(n,"utf-8"),t),a=new Set,c=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi,l;for(;(l=c.exec(o))!==null;)a.add(l[1]);let d=new Set;try{Q.default.readdirSync(r,{withFileTypes:!0}).filter(p=>p.isDirectory()).map(p=>p.name).forEach(p=>{let f=p.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);f&&d.add(f[1])})}catch{}for(let p of a)!d.has(p)&&!d.has(de(p))&&i.push(`Phase ${p} in ROADMAP.md but no directory on disk`);for(let p of d){let f=String(parseInt(p,10));!a.has(p)&&!a.has(f)&&i.push(`Phase ${p} exists on disk but not in ROADMAP.md`)}if(X(t).phase_naming!=="custom"){let p=[...d].filter(f=>!f.includes(".")).map(f=>parseInt(f,10)).sort((f,g)=>f-g);for(let f=1;f<p.length;f++)p[f]!==p[f-1]+1&&i.push(`Gap in phase numbering: ${p[f-1]} \u2192 ${p[f]}`)}let m=s.length===0;y({passed:m,errors:s,warnings:i,warning_count:i.length},e,m?"passed":"failed")}function na(t,e,n){let r=K.default.resolve(t);if(r===Mr.default.homedir()){y({status:"error",errors:[{code:"E010",message:"CWD is home directory - health check would read the wrong .planning/ directory.",fix:"cd into your project directory and retry"}],warnings:[],info:[{code:"I010",message:`Resolved CWD: ${r}`}],repairable_count:0},n);return}let s=T(t),i=Z(t),o=K.default.join(i,"PROJECT.md"),a=K.default.join(s,"ROADMAP.md"),c=K.default.join(s,"STATE.md"),l=K.default.join(i,"config.json"),d=K.default.join(s,"phases"),u=[],m=[],p=[],f=[],g=(S,_,P,k,C=!1,L)=>{let $={code:_,message:P,fix:k,repairable:C,...L};S==="error"?u.push($):S==="warning"?m.push($):p.push($)};if(!Q.default.existsSync(s)){g("error","E001",".planning/ directory not found","Run /gsd-new-project to initialize"),y({status:"broken",errors:u,warnings:m,info:p,repairable_count:0},n);return}if(!Q.default.existsSync(o))g("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let S=Q.default.readFileSync(o,"utf-8");for(let _ of["## What This Is","## Core Value","## Requirements"])S.includes(_)||g("warning","W001",`PROJECT.md missing section: ${_}`,"Add section manually")}if(Q.default.existsSync(a)||g("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!Q.default.existsSync(c))g("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),f.push("regenerateState");else try{let S=Q.default.readFileSync(c,"utf-8"),_=ie(S),P=Er.safeParse(_);if(!P.success){for(let k of P.error.issues){let C=k.path.join(".")||"(root)";g("warning","W011",`STATE.md frontmatter: field "${C}" - ${k.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}f.includes("regenerateState")||f.push("regenerateState")}}catch{}if(!Q.default.existsSync(l))g("warning","W003","config.json not found","Run /gsd-health --repair to create with defaults",!0),f.push("createConfig");else try{let S=JSON.parse(Q.default.readFileSync(l,"utf-8")),_=Un.safeParse(S);if(!_.success){for(let P of _.error.issues){let k=P.path.join(".")||"(root)",C=Jo(S,P.path);g("warning","W005",`config.json: field "${k}" - ${P.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:k,expected:P.message,actual:C})}f.includes("fixSchemaDefaults")||f.push("fixSchemaDefaults")}}catch(S){g("error","E005",`config.json: JSON parse error - ${S.message}`,"Run pi-gsd-tools validate health --repair to reset to defaults",!0),f.push("resetConfig")}try{let S=_t();S.agents_installed||g("warning","W010",S.installed_agents.length===0?`No GSD agents found in ${S.agents_dir}`:`Missing ${S.missing_agents.length} GSD agents: ${S.missing_agents.join(", ")}`,"Run the GSD installer: pi install npm:pi-gsd")}catch{}let h=[];if(e.repair&&f.length>0)for(let S of f)try{if(S==="createConfig"||S==="resetConfig"){let _=Un.parse({});Q.default.writeFileSync(l,JSON.stringify(_,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="fixSchemaDefaults"&&Q.default.existsSync(l)){let _=JSON.parse(Q.default.readFileSync(l,"utf-8")),P=Un.parse(_);Q.default.writeFileSync(l,JSON.stringify(P,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="regenerateState"){if(Q.default.existsSync(c)){let P=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),k=`${c}.bak-${P}`;Q.default.copyFileSync(c,k),h.push({action:"backupState",success:!0,path:k})}let _=re(t);oe(c,`# Session State
223
+ ${_}`),"utf-8");if(B.default.existsSync(o)){let k=B.default.readFileSync(o,"utf-8");k=ye(k,"Status",null,`${e} milestone complete`),k=ye(k,"Last Activity","Last activity",d),k=ye(k,"Last Activity Description",null,`${e} milestone completed and archived`),oe(o,k,t)}let P=!1;if(n.archivePhases)try{let k=ke.default.join(c,`${e}-phases`);B.default.mkdirSync(k,{recursive:!0});let C=B.default.readdirSync(l,{withFileTypes:!0}).filter($=>$.isDirectory()).map($=>$.name),L=0;for(let $ of C)m($)&&(B.default.renameSync(ke.default.join(l,$),ke.default.join(k,$)),L++);P=L>0}catch{}y({version:e,name:u,date:d,phases:p,plans:f,tasks:g,accomplishments:h,archived:{roadmap:B.default.existsSync(ke.default.join(c,`${e}-ROADMAP.md`)),requirements:B.default.existsSync(ke.default.join(c,`${e}-REQUIREMENTS.md`)),audit:B.default.existsSync(ke.default.join(c,`${e}-MILESTONE-AUDIT.md`)),phases:P},milestones_updated:!0,state_updated:B.default.existsSync(o)},r)}var B,ke,Nn=N(()=>{"use strict";B=W(require("fs")),ke=W(require("path"));ge();Ue();Fe()});var Vt,Wn,qn,Rr=N(()=>{"use strict";Vt=require("@oclif/core");$e();Wn=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(()=>(Nn(),On));i(r,n.version??"",{name:e.name??null,archivePhases:e["archive-phases"]},s)}},qn=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(()=>(Nn(),On));i(r,n,s)}}});var v,Er,Xc,Zc,Kc,Qc,Vo,el,zo,Go,Bo,Ln,Fr=N(()=>{"use strict";v=require("zod"),Er=v.z.object({milestone:v.z.string().optional(),milestone_name:v.z.string().optional(),current_phase:v.z.string().optional(),current_phase_name:v.z.string().optional(),current_plan:v.z.string().optional(),total_phases:v.z.coerce.number().int().nonnegative().optional(),total_plans_in_phase:v.z.coerce.number().int().nonnegative().optional(),status:v.z.string().optional(),progress:v.z.string().optional(),last_activity:v.z.string().optional(),paused_at:v.z.string().optional(),stopped_at:v.z.string().optional()}).passthrough(),Xc=v.z.object({found:v.z.literal(!0),phase_number:v.z.string(),phase_name:v.z.string(),goal:v.z.string().nullable(),success_criteria:v.z.array(v.z.string()).default([]),section:v.z.string().optional()}).passthrough(),Zc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),plan:v.z.union([v.z.string(),v.z.number()]),type:v.z.string(),wave:v.z.union([v.z.string(),v.z.number()]),depends_on:v.z.union([v.z.string(),v.z.array(v.z.string())]),files_modified:v.z.union([v.z.string(),v.z.array(v.z.string())]),autonomous:v.z.union([v.z.boolean(),v.z.string()]),must_haves:v.z.union([v.z.string(),v.z.array(v.z.string())])}).passthrough(),Kc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),plan:v.z.union([v.z.string(),v.z.number()]),subsystem:v.z.string(),tags:v.z.union([v.z.string(),v.z.array(v.z.string())]),duration:v.z.string(),completed:v.z.string()}).passthrough(),Qc=v.z.object({phase:v.z.union([v.z.string(),v.z.number()]),verified:v.z.union([v.z.boolean(),v.z.string()]),status:v.z.string(),score:v.z.union([v.z.number(),v.z.string()])}).passthrough(),Vo=v.z.object({test:v.z.number().int().positive().optional(),name:v.z.string(),expected:v.z.string().optional(),result:v.z.string(),category:v.z.string(),reason:v.z.string().optional(),blocked_by:v.z.string().optional()}).passthrough(),el=v.z.object({phase:v.z.string(),phase_dir:v.z.string(),file:v.z.string(),file_path:v.z.string(),type:v.z.literal("uat"),status:v.z.string(),items:v.z.array(Vo)}).passthrough(),zo=v.z.object({branching_strategy:v.z.enum(["none","phase","milestone","workstream"]).default("none"),phase_branch_template:v.z.string().default("gsd/phase-{phase}-{slug}"),milestone_branch_template:v.z.string().default("gsd/{milestone}-{slug}"),quick_branch_template:v.z.string().nullable().default(null)}).passthrough(),Go=v.z.object({research:v.z.boolean().default(!0),plan_check:v.z.boolean().default(!0),verifier:v.z.boolean().default(!0),nyquist_validation:v.z.boolean().default(!0),auto_advance:v.z.boolean().default(!1),node_repair:v.z.boolean().default(!0),node_repair_budget:v.z.number().int().nonnegative().default(2),auto_retry_audit:v.z.boolean().default(!0),auto_retry_audit_budget:v.z.number().int().nonnegative().default(1),auto_retry_tech_debt:v.z.boolean().default(!0),auto_retry_tech_debt_budget:v.z.number().int().nonnegative().default(1),ui_phase:v.z.boolean().default(!0),ui_safety_gate:v.z.boolean().default(!0),text_mode:v.z.boolean().default(!1),research_before_questions:v.z.boolean().default(!1),discuss_mode:v.z.string().default("discuss"),skip_discuss:v.z.boolean().default(!1),_auto_chain_active:v.z.boolean().default(!1)}).passthrough(),Bo=v.z.object({context_warnings:v.z.boolean().default(!0),workflow_guard:v.z.boolean().default(!1)}).passthrough(),Ln=v.z.object({model_profile:v.z.enum(["quality","balanced","budget","inherit"]).default("balanced"),commit_docs:v.z.boolean().default(!0),parallelization:v.z.boolean().default(!0),search_gitignored:v.z.boolean().default(!1),brave_search:v.z.boolean().default(!1),firecrawl:v.z.boolean().default(!1),exa_search:v.z.boolean().default(!1),git:zo.default({}),workflow:Go.default({}),hooks:Bo.default({}),agent_skills:v.z.record(v.z.string(),v.z.unknown()).default({})}).passthrough()});var jt={};he(jt,{cmdValidateAgents:()=>sa,cmdValidateConsistency:()=>ta,cmdValidateHealth:()=>na,cmdVerifyArtifacts:()=>Qo,cmdVerifyCommits:()=>Ko,cmdVerifyKeyLinks:()=>ea,cmdVerifyPhaseCompleteness:()=>Xo,cmdVerifyPlanStructure:()=>Ho,cmdVerifyReferences:()=>Zo,cmdVerifySummary:()=>Yo});function Jo(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}function Yo(t,e,n,r){e||b("summary-path required");let s=K.default.join(t,e),i=n||2;if(!Q.default.existsSync(s)){y({passed:!1,checks:{summary_exists:!1,files_created:{checked:0,found:0,missing:[]},commits_exist:!1,self_check:"not_found"},errors:["SUMMARY.md not found"]},r,"failed");return}let o=Q.default.readFileSync(s,"utf-8"),a=[],c=new Set;for(let g of[/`([^`]+\.[a-zA-Z]+)`/g,/(?:Created|Modified|Added|Updated|Edited):\s*`?([^\s`]+\.[a-zA-Z]+)`?/gi]){let h;for(;(h=g.exec(o))!==null;)h[1]&&!h[1].startsWith("http")&&h[1].includes("/")&&c.add(h[1])}let l=Array.from(c).slice(0,i),d=l.filter(g=>!Q.default.existsSync(K.default.join(t,g))),u=o.match(/\b[0-9a-f]{7,40}\b/g)||[],m=!1;for(let g of u.slice(0,3))if(ae(t,["cat-file","-t",g]).stdout==="commit"){m=!0;break}let p="not_found";if(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i.test(o)){let g=o.slice(o.search(/##\s*(?:Self[- ]?Check|Verification|Quality Check)/i));/(?:fail|✗|❌|incomplete|blocked)/i.test(g)?p="failed":/(?:all\s+)?(?:pass|✓|✅|complete|succeeded)/i.test(g)&&(p="passed")}d.length>0&&a.push("Missing files: "+d.join(", ")),!m&&u.length>0&&a.push("Referenced commit hashes not found in git history"),p==="failed"&&a.push("Self-check section indicates failure");let f=d.length===0&&p!=="failed";y({passed:f,checks:{summary_exists:!0,files_created:{checked:l.length,found:l.length-d.length,missing:d},commits_exist:m,self_check:p},errors:a},r,f?"passed":"failed")}function Ho(t,e,n){e||b("file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=ie(s),o=[],a=[];for(let m of["phase","plan","type","wave","depends_on","files_modified","autonomous","must_haves"])i[m]===void 0&&o.push(`Missing required frontmatter field: ${m}`);let c=/<task[^>]*>([\s\S]*?)<\/task>/g,l=[],d;for(;(d=c.exec(s))!==null;){let m=d[1],p=m.match(/<name>([\s\S]*?)<\/name>/),f=p?p[1].trim():"unnamed",g=/<files>/.test(m),h=/<action>/.test(m),x=/<verify>/.test(m),S=/<done>/.test(m);p||o.push("Task missing <name> element"),h||o.push(`Task '${f}' missing <action>`),x||a.push(`Task '${f}' missing <verify>`),S||a.push(`Task '${f}' missing <done>`),g||a.push(`Task '${f}' missing <files>`),l.push({name:f,hasFiles:g,hasAction:h,hasVerify:x,hasDone:S})}l.length===0&&a.push("No <task> elements found"),i.wave&&parseInt(String(i.wave))>1&&(!i.depends_on||Array.isArray(i.depends_on)&&i.depends_on.length===0)&&a.push("Wave > 1 but depends_on is empty"),/<task\s+type=["']?checkpoint/.test(s)&&i.autonomous!=="false"&&i.autonomous!==!1&&o.push("Has checkpoint tasks but autonomous is not false"),y({valid:o.length===0,errors:o,warnings:a,task_count:l.length,tasks:l,frontmatter_fields:Object.keys(i)},n,o.length===0?"valid":"invalid")}function Xo(t,e,n){e||b("phase required");let r=fe(t,e);if(!r?.found){y({error:"Phase not found",phase:e},n);return}let s=K.default.join(t,r.directory),i=[],o=[],a;try{a=Q.default.readdirSync(s)}catch{y({error:"Cannot read phase directory"},n);return}let c=a.filter(f=>f.match(/-PLAN\.md$/i)),l=a.filter(f=>f.match(/-SUMMARY\.md$/i)),d=new Set(c.map(f=>f.replace(/-PLAN\.md$/i,""))),u=new Set(l.map(f=>f.replace(/-SUMMARY\.md$/i,""))),m=[...d].filter(f=>!u.has(f)),p=[...u].filter(f=>!d.has(f));m.length>0&&i.push(`Plans without summaries: ${m.join(", ")}`),p.length>0&&o.push(`Summaries without plans: ${p.join(", ")}`),y({complete:i.length===0,phase:r.phase_number,plan_count:c.length,summary_count:l.length,incomplete_plans:m,orphan_summaries:p,errors:i,warnings:o},n,i.length===0?"complete":"incomplete")}function Zo(t,e,n){e||b("file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=[],o=[];for(let a of s.match(/@([^\s\n,)]+\/[^\s\n,)]+)/g)||[]){let c=a.slice(1),l=c.startsWith("~/")?K.default.join(process.env.HOME??"",c.slice(2)):K.default.join(t,c);(Q.default.existsSync(l)?i:o).push(c)}for(let a of s.match(/`([^`]+\/[^`]+\.[a-zA-Z]{1,10})`/g)||[]){let c=a.slice(1,-1);c.startsWith("http")||c.includes("${")||c.includes("{{")||i.includes(c)||o.includes(c)||(Q.default.existsSync(K.default.join(t,c))?i:o).push(c)}y({valid:o.length===0,found:i.length,missing:o,total:i.length+o.length},n,o.length===0?"valid":"invalid")}function Ko(t,e,n){(!e||e.length===0)&&b("At least one commit hash required");let r=[],s=[];for(let i of e)(ae(t,["cat-file","-t",i]).stdout.trim()==="commit"?r:s).push(i);y({all_valid:s.length===0,valid:r,invalid:s,total:e.length},n,s.length===0?"valid":"invalid")}function Qo(t,e,n){e||b("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=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=Oe(d)??"",f=p.split(`
224
+ `).length;if(l.min_lines&&f<l.min_lines&&m.issues.push(`Only ${f} lines, need ${l.min_lines}`),l.contains&&!p.includes(l.contains)&&m.issues.push(`Missing pattern: ${l.contains}`),l.exports){let g=Array.isArray(l.exports)?l.exports:[l.exports];for(let h of g)p.includes(h)||m.issues.push(`Missing export: ${h}`)}m.passed=m.issues.length===0}else m.issues.push("File not found");o.push(m)}let a=o.filter(c=>c.passed).length;y({all_passed:a===o.length,passed:a,total:o.length,artifacts:o},n,a===o.length?"valid":"invalid")}function ea(t,e,n){e||b("plan file path required");let r=K.default.isAbsolute(e)?e:K.default.join(t,e),s=Oe(r);if(!s){y({error:"File not found",path:e},n);return}let i=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=Oe(K.default.join(t,l.from||""));if(!u)d.detail="Source file not found";else if(l.pattern)try{let m=new RegExp(l.pattern);if(m.test(u))d.verified=!0,d.detail="Pattern found in source";else{let p=Oe(K.default.join(t,l.to||""));p&&m.test(p)?(d.verified=!0,d.detail="Pattern found in target"):d.detail=`Pattern "${l.pattern}" not found in source or target`}}catch{d.detail=`Invalid regex pattern: ${l.pattern}`}else u.includes(l.to||"")?(d.verified=!0,d.detail="Target referenced in source"):d.detail="Target not referenced in source";o.push(d)}let a=o.filter(c=>c.verified).length;y({all_verified:a===o.length,verified:a,total:o.length,links:o},n,a===o.length?"valid":"invalid")}function ta(t,e){let n=K.default.join(T(t),"ROADMAP.md"),r=K.default.join(T(t),"phases"),s=[],i=[];if(!Q.default.existsSync(n)){s.push("ROADMAP.md not found"),y({passed:!1,errors:s,warnings:i},e,"failed");return}let o=ve(Q.default.readFileSync(n,"utf-8"),t),a=new Set,c=/#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:/gi,l;for(;(l=c.exec(o))!==null;)a.add(l[1]);let d=new Set;try{Q.default.readdirSync(r,{withFileTypes:!0}).filter(p=>p.isDirectory()).map(p=>p.name).forEach(p=>{let f=p.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);f&&d.add(f[1])})}catch{}for(let p of a)!d.has(p)&&!d.has(de(p))&&i.push(`Phase ${p} in ROADMAP.md but no directory on disk`);for(let p of d){let f=String(parseInt(p,10));!a.has(p)&&!a.has(f)&&i.push(`Phase ${p} exists on disk but not in ROADMAP.md`)}if(X(t).phase_naming!=="custom"){let p=[...d].filter(f=>!f.includes(".")).map(f=>parseInt(f,10)).sort((f,g)=>f-g);for(let f=1;f<p.length;f++)p[f]!==p[f-1]+1&&i.push(`Gap in phase numbering: ${p[f-1]} \u2192 ${p[f]}`)}let m=s.length===0;y({passed:m,errors:s,warnings:i,warning_count:i.length},e,m?"passed":"failed")}function na(t,e,n){let r=K.default.resolve(t);if(r===Mr.default.homedir()){y({status:"error",errors:[{code:"E010",message:"CWD is home directory - health check would read the wrong .planning/ directory.",fix:"cd into your project directory and retry"}],warnings:[],info:[{code:"I010",message:`Resolved CWD: ${r}`}],repairable_count:0},n);return}let s=T(t),i=Z(t),o=K.default.join(i,"PROJECT.md"),a=K.default.join(s,"ROADMAP.md"),c=K.default.join(s,"STATE.md"),l=K.default.join(i,"config.json"),d=K.default.join(s,"phases"),u=[],m=[],p=[],f=[],g=(S,_,P,k,C=!1,L)=>{let $={code:_,message:P,fix:k,repairable:C,...L};S==="error"?u.push($):S==="warning"?m.push($):p.push($)};if(!Q.default.existsSync(s)){g("error","E001",".planning/ directory not found","Run /gsd-new-project to initialize"),y({status:"broken",errors:u,warnings:m,info:p,repairable_count:0},n);return}if(!Q.default.existsSync(o))g("error","E002","PROJECT.md not found","Run /gsd-new-project to create");else{let S=Q.default.readFileSync(o,"utf-8");for(let _ of["## What This Is","## Core Value","## Requirements"])S.includes(_)||g("warning","W001",`PROJECT.md missing section: ${_}`,"Add section manually")}if(Q.default.existsSync(a)||g("error","E003","ROADMAP.md not found","Run /gsd-new-milestone to create roadmap"),!Q.default.existsSync(c))g("error","E004","STATE.md not found","Run /gsd-health --repair to regenerate",!0),f.push("regenerateState");else try{let S=Q.default.readFileSync(c,"utf-8"),_=ie(S),P=Er.safeParse(_);if(!P.success){for(let k of P.error.issues){let C=k.path.join(".")||"(root)";g("warning","W011",`STATE.md frontmatter: field "${C}" - ${k.message}`,"Check STATE.md frontmatter manually or run /gsd-health --repair to regenerate",!0)}f.includes("regenerateState")||f.push("regenerateState")}}catch{}if(!Q.default.existsSync(l))g("warning","W003","config.json not found","Run /gsd-health --repair to create with defaults",!0),f.push("createConfig");else try{let S=JSON.parse(Q.default.readFileSync(l,"utf-8")),_=Ln.safeParse(S);if(!_.success){for(let P of _.error.issues){let k=P.path.join(".")||"(root)",C=Jo(S,P.path);g("warning","W005",`config.json: field "${k}" - ${P.message}`,"Run pi-gsd-tools validate health --repair to fix using schema defaults",!0,{field:k,expected:P.message,actual:C})}f.includes("fixSchemaDefaults")||f.push("fixSchemaDefaults")}}catch(S){g("error","E005",`config.json: JSON parse error - ${S.message}`,"Run pi-gsd-tools validate health --repair to reset to defaults",!0),f.push("resetConfig")}try{let S=_t();S.agents_installed||g("warning","W010",S.installed_agents.length===0?`No GSD agents found in ${S.agents_dir}`:`Missing ${S.missing_agents.length} GSD agents: ${S.missing_agents.join(", ")}`,"Run the GSD installer: pi install npm:pi-gsd")}catch{}let h=[];if(e.repair&&f.length>0)for(let S of f)try{if(S==="createConfig"||S==="resetConfig"){let _=Ln.parse({});Q.default.writeFileSync(l,JSON.stringify(_,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="fixSchemaDefaults"&&Q.default.existsSync(l)){let _=JSON.parse(Q.default.readFileSync(l,"utf-8")),P=Ln.parse(_);Q.default.writeFileSync(l,JSON.stringify(P,null,2),"utf-8"),h.push({action:S,success:!0,path:"config.json"})}else if(S==="regenerateState"){if(Q.default.existsSync(c)){let P=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),k=`${c}.bak-${P}`;Q.default.copyFileSync(c,k),h.push({action:"backupState",success:!0,path:k})}let _=re(t);oe(c,`# Session State
225
225
 
226
226
  ## Project Reference
227
227
 
@@ -241,8 +241,8 @@ See: .planning/PROJECT.md
241
241
  `).trim():a=o[1].trim(),{complete:!1,number:parseInt(r[1],10),name:Os(s[1].trim()),expected:Os(a)}}function Tr(t){return["\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557","\u2551 CHECKPOINT: Verification Required \u2551","\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D","",`**Test ${t.number}: ${t.name}**`,"",t.expected,"","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","Type `pass` or describe what's wrong.","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"].join(`
242
242
  `)}function oa(t){let e=[],n=/###\s*(\d+)\.\s*([^\n]+)\nexpected:\s*([^\n]+)\nresult:\s*(\w+)(?:\n(?:reported|reason|blocked_by):\s*[^\n]*)?/g,r;for(;(r=n.exec(t))!==null;){let[,s,i,o,a]=r;if(a==="pending"||a==="skipped"||a==="blocked"){let c=t.slice(r.index),l=c.indexOf(`
243
243
  ###`,1),d=l>0?c.slice(0,l):c,u=d.match(/reason:\s*(.+)/),m=d.match(/blocked_by:\s*(.+)/),p={test:parseInt(s,10),name:i.trim(),expected:o.trim(),result:a,category:ca(a,u?.[1],m?.[1])};u&&(p.reason=u[1].trim()),m&&(p.blocked_by=m[1].trim()),e.push(p)}}return e}function aa(t,e){let n=[];if(e==="human_needed"){let r=t.match(/##\s*Human Verification.*?\n([\s\S]*?)(?=\n##\s|\n---\s|$)/i);if(r)for(let s of r[1].split(`
244
- `)){let i=s.match(/\|\s*(\d+)\s*\|\s*([^|]+)/),o=s.match(/^[-*]\s+(.+)/),a=s.match(/^(\d+)\.\s+(.+)/);i?n.push({test:parseInt(i[1],10),name:i[2].trim(),result:"human_needed",category:"human_uat"}):a?n.push({test:parseInt(a[1],10),name:a[2].trim(),result:"human_needed",category:"human_uat"}):o&&o[1].length>10&&n.push({name:o[1].trim(),result:"human_needed",category:"human_uat"})}}return n}function ca(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,Be,Gs=N(()=>{"use strict";rt=W(require("fs")),Be=W(require("path"));ge();Ue();dn()});var zt,Vn,zn,Gn,Bn,Jn,Dr=N(()=>{"use strict";zt=require("@oclif/core");$e();Vn=class t extends w{static description="Validate planning consistency";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateConsistency(n,r)}},zn=class t extends w{static description="Check .planning/ health";static flags={...w.baseFlags,repair:zt.Flags.boolean({description:"Auto-repair issues",default:!1})};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateHealth(n,{repair:e.repair},r)}},Gn=class t extends w{static description="Validate agent configurations";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(Rt(),jt))).cmdValidateAgents(n,r)}},Bn=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(),zs));s(n,r)}}});var it={};he(it,{cmdWorkstreamComplete:()=>pa,cmdWorkstreamCreate:()=>da,cmdWorkstreamGet:()=>ga,cmdWorkstreamList:()=>ua,cmdWorkstreamProgress:()=>ha,cmdWorkstreamSet:()=>fa,cmdWorkstreamStatus:()=>ma});function la(t,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let n=Z(t),r=M.default.join(n,"workstreams",e);if(F.default.existsSync(M.default.join(n,"workstreams")))throw new Error("Already in workstream mode - .planning/workstreams/ exists");let s=[{name:"ROADMAP.md",type:"file"},{name:"STATE.md",type:"file"},{name:"REQUIREMENTS.md",type:"file"},{name:"phases",type:"dir"}];F.default.mkdirSync(r,{recursive:!0});let i=[];try{for(let o of s){let a=M.default.join(n,o.name);F.default.existsSync(a)&&(F.default.renameSync(a,M.default.join(r,o.name)),i.push(o.name))}}catch(o){for(let a of i)try{F.default.renameSync(M.default.join(r,a),M.default.join(n,a))}catch{}try{F.default.rmSync(r,{recursive:!0})}catch{}try{F.default.rmdirSync(M.default.join(n,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:i}}function da(t,e,n,r){e||b("workstream name required. Usage: workstream create <name>");let s=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");s||b("Invalid workstream name - must contain at least one alphanumeric character");let i=Z(t);F.default.existsSync(i)||b(".planning/ directory not found - run /gsd-new-project first");let o=M.default.join(i,"workstreams"),a=M.default.join(o,s);if(F.default.existsSync(a)&&F.default.existsSync(M.default.join(a,"STATE.md"))){y({created:!1,error:"already_exists",workstream:s,path:G(M.default.relative(t,a))},r);return}let c=!F.default.existsSync(o),l=null;if(c&&n.migrate!==!1)if(F.default.existsSync(M.default.join(i,"ROADMAP.md"))||F.default.existsSync(M.default.join(i,"STATE.md"))||F.default.existsSync(M.default.join(i,"phases"))){let g=n.migrateName??null,h;if(g)h=g;else try{let x=re(t);h=qe(x.name)||"default"}catch{h="default"}try{l=la(t,h)}catch(x){y({created:!1,error:"migration_failed",message:x.message},r);return}}else F.default.mkdirSync(o,{recursive:!0});F.default.mkdirSync(a,{recursive:!0}),F.default.mkdirSync(M.default.join(a,"phases"),{recursive:!0});let d=new Date().toISOString().split("T")[0],u=["---",`workstream: ${s}`,`created: ${d}`,"---","","# Project State","","## Current Position","**Status:** Not started","**Current Phase:** None",`**Last Activity:** ${d}`,"**Last Activity Description:** Workstream created","","## Progress","**Phases Complete:** 0","**Current Plan:** N/A","","## Session Continuity","**Stopped At:** N/A","**Resume File:** None",""].join(`
245
- `),m=M.default.join(a,"STATE.md");F.default.existsSync(m)||F.default.writeFileSync(m,u,"utf-8"),ct(t,s);let p=G(M.default.relative(t,a));y({created:!0,workstream:s,path:p,state_path:p+"/STATE.md",phases_path:p+"/phases",migration:l??null,active:!0},r)}function ua(t,e){let n=M.default.join(Z(t),"workstreams");if(!F.default.existsSync(n)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let r=[];for(let s of F.default.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory())){let i=M.default.join(n,s.name),o=M.default.join(i,"phases"),a=Le(o),c=0;for(let u of a)try{let m=F.default.readdirSync(M.default.join(o,u)),p=wt(m),f=kt(m);p.length>0&&f.length>=p.length&&c++}catch{}let l="unknown",d=null;try{let u=F.default.readFileSync(M.default.join(i,"STATE.md"),"utf-8");l=J(u,"Status")||"unknown",d=J(u,"Current Phase")}catch{}r.push({name:s.name,path:G(M.default.relative(t,i)),has_roadmap:F.default.existsSync(M.default.join(i,"ROADMAP.md")),has_state:F.default.existsSync(M.default.join(i,"STATE.md")),status:l,current_phase:d,phase_count:a.length,completed_phases:c})}y({mode:"workstream",workstreams:r,count:r.length},e)}function ma(t,e,n){e||b("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let r=M.default.join(Z(t),"workstreams",e);if(!F.default.existsSync(r)){y({found:!1,workstream:e},n);return}let s=j(t,e),i={roadmap:F.default.existsSync(s.roadmap),state:F.default.existsSync(s.state),requirements:F.default.existsSync(s.requirements)},o=[];for(let c of Le(s.phases).sort())try{let l=F.default.readdirSync(M.default.join(s.phases,c)),d=wt(l),u=kt(l);o.push({directory:c,status:u.length>=d.length&&d.length>0?"complete":d.length>0?"in_progress":"pending",plan_count:d.length,summary_count:u.length})}catch{}let a={status:"unknown",current_phase:null,last_activity:null};try{let c=F.default.readFileSync(s.state,"utf-8");a={status:J(c,"Status")||"unknown",current_phase:J(c,"Current Phase"),last_activity:J(c,"Last Activity")}}catch{}y({found:!0,workstream:e,path:G(M.default.relative(t,r)),files:i,phases:o,phase_count:o.length,completed_phases:o.filter(c=>c.status==="complete").length,...a},n)}function pa(t,e,n,r){e||b("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let s=Z(t),i=M.default.join(s,"workstreams"),o=M.default.join(i,e);if(!F.default.existsSync(o)){y({completed:!1,error:"not_found",workstream:e},r);return}let a=He(t);a===e&&ct(t,null);let c=M.default.join(s,"milestones"),l=new Date().toISOString().split("T")[0],d=M.default.join(c,`ws-${e}-${l}`),u=1;for(;F.default.existsSync(d);)d=M.default.join(c,`ws-${e}-${l}-${u++}`);F.default.mkdirSync(d,{recursive:!0});let m=[];try{for(let f of F.default.readdirSync(o,{withFileTypes:!0}))F.default.renameSync(M.default.join(o,f.name),M.default.join(d,f.name)),m.push(f.name)}catch(f){for(let g of m)try{F.default.renameSync(M.default.join(d,g),M.default.join(o,g))}catch{}try{F.default.rmSync(d,{recursive:!0})}catch{}a===e&&ct(t,e),y({completed:!1,error:"archive_failed",message:f.message,workstream:e},r);return}try{F.default.rmdirSync(o)}catch{}let p=0;try{p=F.default.readdirSync(i,{withFileTypes:!0}).filter(f=>f.isDirectory()).length,p===0&&F.default.rmdirSync(i)}catch{}y({completed:!0,workstream:e,archived_to:G(M.default.relative(t,d)),remaining_workstreams:p,reverted_to_flat:p===0},r)}function fa(t,e,n){if(!e){ct(t,null),y({active:null,cleared:!0},n);return}if(!/^[a-zA-Z0-9_-]+$/.test(e)){y({active:null,error:"invalid_name",message:"Workstream name must be alphanumeric, hyphens, and underscores only"},n);return}let r=M.default.join(Z(t),"workstreams",e);if(!F.default.existsSync(r)){y({active:null,error:"not_found",workstream:e},n);return}ct(t,e),y({active:e,set:!0},n,e)}function ga(t,e){let n=He(t),r=M.default.join(Z(t),"workstreams");y({active:n,mode:F.default.existsSync(r)?"workstream":"flat"},e,n||"none")}function ha(t,e){let n=Z(t),r=M.default.join(n,"workstreams");if(!F.default.existsSync(r)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let s=He(t),i=[];for(let o of F.default.readdirSync(r,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=M.default.join(r,o.name),c=M.default.join(a,"phases"),l=Le(c),d=0,u=0,m=0;for(let h of l)try{let x=F.default.readdirSync(M.default.join(c,h)),S=wt(x),_=kt(x);u+=S.length,m+=Math.min(_.length,S.length),S.length>0&&_.length>=S.length&&d++}catch{}let p=l.length;try{let x=F.default.readFileSync(M.default.join(a,"ROADMAP.md"),"utf-8").match(/^###?\s+Phase\s+\d/gm);x&&(p=x.length)}catch{}let f="unknown",g=null;try{let h=F.default.readFileSync(M.default.join(a,"STATE.md"),"utf-8");f=J(h,"Status")||"unknown",g=J(h,"Current Phase")}catch{}i.push({name:o.name,active:o.name===s,status:f,current_phase:g,phases:`${d}/${p}`,plans:`${m}/${u}`,progress_percent:p>0?Math.round(d/p*100):0})}y({mode:"workstream",active:s,workstreams:i,count:i.length},e)}var F,M,ot=N(()=>{"use strict";F=W(require("fs")),M=W(require("path"));ge();Fe()});var at,Yn,Hn,Xn,Zn,Kn,Qn,es,Or=N(()=>{"use strict";at=require("@oclif/core");$e();Yn=class t extends w{static description="Create a new workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags,"no-migrate":at.Flags.boolean({description:"Skip migration",default:!1}),"migrate-name":at.Flags.string({description:"Migration name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamCreate(r,n.name,{migrate:!e["no-migrate"],migrateName:e["migrate-name"]??null},s)}},Hn=class t extends w{static description="List workstreams";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamList(n,r)}},Xn=class t extends w{static description="Show workstream status";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamStatus(r,n.name,s)}},Zn=class t extends w{static description="Complete a workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamComplete(r,n.name,{},s)}},Kn=class t extends w{static description="Set active workstream";static args={name:at.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamSet(r,n.name,s)}},Qn=class t extends w{static description="Get active workstream";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamGet(n,r)}},es=class t extends w{static description="Show workstream progress";static flags={...w.baseFlags};async run(){let{flags:e}=await this.parse(t),{cwd:n,raw:r}=this.resolveContext(e);(await Promise.resolve().then(()=>(ot(),it))).cmdWorkstreamProgress(n,r)}}});var xe={};he(xe,{cmdCommit:()=>wa,cmdCommitToSubrepo:()=>ka,cmdCurrentTimestamp:()=>xa,cmdGenerateSlug:()=>ya,cmdHistoryDigest:()=>va,cmdListTodos:()=>Sa,cmdProgressRender:()=>$a,cmdResolveModel:()=>_a,cmdScaffold:()=>Ra,cmdStats:()=>Ea,cmdSummaryExtract:()=>Pa,cmdTodoComplete:()=>Aa,cmdTodoMatchPhase:()=>ja,cmdVerifyPathExists:()=>ba,cmdWebsearch:()=>Ca});function ya(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 xa(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 Sa(t,e,n){let r=H.default.join(T(t),"todos","pending"),s=0,i=[];try{let o=V.default.readdirSync(r).filter(a=>a.endsWith(".md"));for(let a of o)try{let c=V.default.readFileSync(H.default.join(r,a),"utf-8"),l=c.match(/^created:\s*(.+)$/m),d=c.match(/^title:\s*(.+)$/m),u=c.match(/^area:\s*(.+)$/m),m=u?u[1].trim():"general";if(e&&m!==e)continue;s++,i.push({file:a,created:l?l[1].trim():"unknown",title:d?d[1].trim():"Untitled",area:m,path:G(H.default.relative(t,H.default.join(r,a)))})}catch{}}catch{}y({count:s,todos:i},n,s.toString())}function ba(t,e,n){e||b("path required for verification"),e.includes("\0")&&b("path contains null bytes");let r=H.default.isAbsolute(e)?e:H.default.join(t,e);try{let s=V.default.statSync(r);y({exists:!0,type:s.isDirectory()?"directory":s.isFile()?"file":"other"},n,"true")}catch{y({exists:!1,type:null},n,"false")}}function va(t,e){let n=j(t).phases,r={phases:{},decisions:[],tech_stack:new Set},s=[];for(let i of Lt(t))s.push({name:i.name,fullPath:i.fullPath,milestone:i.milestone});if(V.default.existsSync(n))try{for(let i of V.default.readdirSync(n,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())s.push({name:i,fullPath:H.default.join(n,i),milestone:null})}catch{}if(s.length===0){y({phases:{},decisions:[],tech_stack:[]},e);return}try{for(let{name:o,fullPath:a}of s){let c=V.default.readdirSync(a).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of c)try{let d=V.default.readFileSync(H.default.join(a,l),"utf-8"),u=ie(d),m=ue(u.phase)??o.split("-")[0];r.phases[m]||(r.phases[m]={name:ue(u.name)??o.split("-").slice(1).join(" ")??"Unknown",provides:new Set,affects:new Set,patterns:new Set});let p=Pt(u["dependency-graph"]);p?.provides?_e(p.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))):u.provides&&_e(u.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))),p?.affects&&_e(p.affects)?.forEach(g=>r.phases[m].affects.add(ue(g)??String(g))),u["patterns-established"]&&_e(u["patterns-established"])?.forEach(g=>r.phases[m].patterns.add(ue(g)??String(g))),u["key-decisions"]&&_e(u["key-decisions"])?.forEach(g=>r.decisions.push({phase:m,decision:ue(g)??String(g)}));let f=Pt(u["tech-stack"]);f?.added&&_e(f.added)?.forEach(g=>{let h=ue(g);if(h)r.tech_stack.add(h);else{let x=Pt(g);x&&r.tech_stack.add(ue(x.name)??"")}})}catch{}}let i={phases:Object.fromEntries(Object.entries(r.phases).map(([o,a])=>[o,{name:a.name,provides:[...a.provides],affects:[...a.affects],patterns:[...a.patterns]}])),decisions:r.decisions,tech_stack:[...r.tech_stack]};y(i,e)}catch(i){b("Failed to generate history digest: "+i.message)}}function _a(t,e,n){e||b("agent-type required");let r=X(t),s=se(t,e),i=Re[e];y(i?{model:s,profile:r.model_profile}:{model:s,profile:r.model_profile,unknown_agent:!0},n,s)}function wa(t,e,n,r,s=!1,i=!1){!e&&!s&&b("commit message required");let o=e;o&&(o=hr(o));let a=X(t);if(!a.commit_docs){y({committed:!1,hash:null,reason:"skipped_commit_docs_false"},r,"skipped");return}if(rn(t,".planning")){y({committed:!1,hash:null,reason:"skipped_gitignored"},r,"skipped");return}if(a.branching_strategy&&a.branching_strategy!=="none"){let p=null;if(a.branching_strategy==="phase"){let f=(n||[]).join(" ").match(/(\d+)-/);if(f){let g=fe(t,f[1]);g&&(p=a.phase_branch_template.replace("{phase}",g.phase_number).replace("{slug}",g.phase_slug||"phase"))}}else if(a.branching_strategy==="milestone"){let f=re(t);f?.version&&(p=a.milestone_branch_template.replace("{milestone}",f.version).replace("{slug}",qe(f.name)||"milestone"))}if(p){let f=ae(t,["rev-parse","--abbrev-ref","HEAD"]);f.exitCode===0&&f.stdout.trim()!==p&&ae(t,["checkout","-b",p]).exitCode!==0&&ae(t,["checkout",p])}}let c=n&&n.length>0?n:[".planning/"];for(let p of c){let f=H.default.join(t,p);V.default.existsSync(f)?ae(t,["add",p]):ae(t,["rm","--cached","--ignore-unmatch",p])}let l=s?["commit","--amend","--no-edit"]:["commit","-m",o];i&&l.push("--no-verify");let d=ae(t,l);if(d.exitCode!==0){if(d.stdout.includes("nothing to commit")||d.stderr.includes("nothing to commit")){y({committed:!1,hash:null,reason:"nothing_to_commit"},r,"nothing");return}y({committed:!1,hash:null,reason:"nothing_to_commit",error:d.stderr},r,"nothing");return}let u=ae(t,["rev-parse","--short","HEAD"]),m=u.exitCode===0?u.stdout:null;y({committed:!0,hash:m,reason:"committed"},r,m||"committed")}function ka(t,e,n,r){e||b("commit message required");let i=X(t).sub_repos;(!i||i.length===0)&&b("no sub_repos configured in .planning/config.json"),(!n||n.length===0)&&b("--files required for commit-to-subrepo");let o={},a=[];for(let l of n){let d=i.find(u=>l.startsWith(u+"/"));d?(o[d]||(o[d]=[]),o[d].push(l)):a.push(l)}a.length>0&&process.stderr.write(`Warning: ${a.length} file(s) did not match any sub-repo prefix: ${a.join(", ")}
244
+ `)){let i=s.match(/\|\s*(\d+)\s*\|\s*([^|]+)/),o=s.match(/^[-*]\s+(.+)/),a=s.match(/^(\d+)\.\s+(.+)/);i?n.push({test:parseInt(i[1],10),name:i[2].trim(),result:"human_needed",category:"human_uat"}):a?n.push({test:parseInt(a[1],10),name:a[2].trim(),result:"human_needed",category:"human_uat"}):o&&o[1].length>10&&n.push({name:o[1].trim(),result:"human_needed",category:"human_uat"})}}return n}function ca(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,Be,Gs=N(()=>{"use strict";rt=W(require("fs")),Be=W(require("path"));ge();Ue();ln()});var zt,Un,Vn,zn,Gn,Bn,Dr=N(()=>{"use strict";zt=require("@oclif/core");$e();Un=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)}},Vn=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)}},zn=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)}},Bn=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(),zs));s(n,r)}}});var it={};he(it,{cmdWorkstreamComplete:()=>pa,cmdWorkstreamCreate:()=>da,cmdWorkstreamGet:()=>ga,cmdWorkstreamList:()=>ua,cmdWorkstreamProgress:()=>ha,cmdWorkstreamSet:()=>fa,cmdWorkstreamStatus:()=>ma});function la(t,e){if(!e||/[/\\]/.test(e)||e==="."||e==="..")throw new Error("Invalid workstream name for migration");let n=Z(t),r=M.default.join(n,"workstreams",e);if(F.default.existsSync(M.default.join(n,"workstreams")))throw new Error("Already in workstream mode - .planning/workstreams/ exists");let s=[{name:"ROADMAP.md",type:"file"},{name:"STATE.md",type:"file"},{name:"REQUIREMENTS.md",type:"file"},{name:"phases",type:"dir"}];F.default.mkdirSync(r,{recursive:!0});let i=[];try{for(let o of s){let a=M.default.join(n,o.name);F.default.existsSync(a)&&(F.default.renameSync(a,M.default.join(r,o.name)),i.push(o.name))}}catch(o){for(let a of i)try{F.default.renameSync(M.default.join(r,a),M.default.join(n,a))}catch{}try{F.default.rmSync(r,{recursive:!0})}catch{}try{F.default.rmdirSync(M.default.join(n,"workstreams"))}catch{}throw o}return{migrated:!0,workstream:e,files_moved:i}}function da(t,e,n,r){e||b("workstream name required. Usage: workstream create <name>");let s=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");s||b("Invalid workstream name - must contain at least one alphanumeric character");let i=Z(t);F.default.existsSync(i)||b(".planning/ directory not found - run /gsd-new-project first");let o=M.default.join(i,"workstreams"),a=M.default.join(o,s);if(F.default.existsSync(a)&&F.default.existsSync(M.default.join(a,"STATE.md"))){y({created:!1,error:"already_exists",workstream:s,path:G(M.default.relative(t,a))},r);return}let c=!F.default.existsSync(o),l=null;if(c&&n.migrate!==!1)if(F.default.existsSync(M.default.join(i,"ROADMAP.md"))||F.default.existsSync(M.default.join(i,"STATE.md"))||F.default.existsSync(M.default.join(i,"phases"))){let g=n.migrateName??null,h;if(g)h=g;else try{let x=re(t);h=qe(x.name)||"default"}catch{h="default"}try{l=la(t,h)}catch(x){y({created:!1,error:"migration_failed",message:x.message},r);return}}else F.default.mkdirSync(o,{recursive:!0});F.default.mkdirSync(a,{recursive:!0}),F.default.mkdirSync(M.default.join(a,"phases"),{recursive:!0});let d=new Date().toISOString().split("T")[0],u=["---",`workstream: ${s}`,`created: ${d}`,"---","","# Project State","","## Current Position","**Status:** Not started","**Current Phase:** None",`**Last Activity:** ${d}`,"**Last Activity Description:** Workstream created","","## Progress","**Phases Complete:** 0","**Current Plan:** N/A","","## Session Continuity","**Stopped At:** N/A","**Resume File:** None",""].join(`
245
+ `),m=M.default.join(a,"STATE.md");F.default.existsSync(m)||F.default.writeFileSync(m,u,"utf-8"),ct(t,s);let p=G(M.default.relative(t,a));y({created:!0,workstream:s,path:p,state_path:p+"/STATE.md",phases_path:p+"/phases",migration:l??null,active:!0},r)}function ua(t,e){let n=M.default.join(Z(t),"workstreams");if(!F.default.existsSync(n)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let r=[];for(let s of F.default.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory())){let i=M.default.join(n,s.name),o=M.default.join(i,"phases"),a=Le(o),c=0;for(let u of a)try{let m=F.default.readdirSync(M.default.join(o,u)),p=wt(m),f=kt(m);p.length>0&&f.length>=p.length&&c++}catch{}let l="unknown",d=null;try{let u=F.default.readFileSync(M.default.join(i,"STATE.md"),"utf-8");l=J(u,"Status")||"unknown",d=J(u,"Current Phase")}catch{}r.push({name:s.name,path:G(M.default.relative(t,i)),has_roadmap:F.default.existsSync(M.default.join(i,"ROADMAP.md")),has_state:F.default.existsSync(M.default.join(i,"STATE.md")),status:l,current_phase:d,phase_count:a.length,completed_phases:c})}y({mode:"workstream",workstreams:r,count:r.length},e)}function ma(t,e,n){e||b("workstream name required. Usage: workstream status <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let r=M.default.join(Z(t),"workstreams",e);if(!F.default.existsSync(r)){y({found:!1,workstream:e},n);return}let s=j(t,e),i={roadmap:F.default.existsSync(s.roadmap),state:F.default.existsSync(s.state),requirements:F.default.existsSync(s.requirements)},o=[];for(let c of Le(s.phases).sort())try{let l=F.default.readdirSync(M.default.join(s.phases,c)),d=wt(l),u=kt(l);o.push({directory:c,status:u.length>=d.length&&d.length>0?"complete":d.length>0?"in_progress":"pending",plan_count:d.length,summary_count:u.length})}catch{}let a={status:"unknown",current_phase:null,last_activity:null};try{let c=F.default.readFileSync(s.state,"utf-8");a={status:J(c,"Status")||"unknown",current_phase:J(c,"Current Phase"),last_activity:J(c,"Last Activity")}}catch{}y({found:!0,workstream:e,path:G(M.default.relative(t,r)),files:i,phases:o,phase_count:o.length,completed_phases:o.filter(c=>c.status==="complete").length,...a},n)}function pa(t,e,n,r){e||b("workstream name required. Usage: workstream complete <name>"),(/[/\\]/.test(e)||e==="."||e==="..")&&b("Invalid workstream name");let s=Z(t),i=M.default.join(s,"workstreams"),o=M.default.join(i,e);if(!F.default.existsSync(o)){y({completed:!1,error:"not_found",workstream:e},r);return}let a=He(t);a===e&&ct(t,null);let c=M.default.join(s,"milestones"),l=new Date().toISOString().split("T")[0],d=M.default.join(c,`ws-${e}-${l}`),u=1;for(;F.default.existsSync(d);)d=M.default.join(c,`ws-${e}-${l}-${u++}`);F.default.mkdirSync(d,{recursive:!0});let m=[];try{for(let f of F.default.readdirSync(o,{withFileTypes:!0}))F.default.renameSync(M.default.join(o,f.name),M.default.join(d,f.name)),m.push(f.name)}catch(f){for(let g of m)try{F.default.renameSync(M.default.join(d,g),M.default.join(o,g))}catch{}try{F.default.rmSync(d,{recursive:!0})}catch{}a===e&&ct(t,e),y({completed:!1,error:"archive_failed",message:f.message,workstream:e},r);return}try{F.default.rmdirSync(o)}catch{}let p=0;try{p=F.default.readdirSync(i,{withFileTypes:!0}).filter(f=>f.isDirectory()).length,p===0&&F.default.rmdirSync(i)}catch{}y({completed:!0,workstream:e,archived_to:G(M.default.relative(t,d)),remaining_workstreams:p,reverted_to_flat:p===0},r)}function fa(t,e,n){if(!e){ct(t,null),y({active:null,cleared:!0},n);return}if(!/^[a-zA-Z0-9_-]+$/.test(e)){y({active:null,error:"invalid_name",message:"Workstream name must be alphanumeric, hyphens, and underscores only"},n);return}let r=M.default.join(Z(t),"workstreams",e);if(!F.default.existsSync(r)){y({active:null,error:"not_found",workstream:e},n);return}ct(t,e),y({active:e,set:!0},n,e)}function ga(t,e){let n=He(t),r=M.default.join(Z(t),"workstreams");y({active:n,mode:F.default.existsSync(r)?"workstream":"flat"},e,n||"none")}function ha(t,e){let n=Z(t),r=M.default.join(n,"workstreams");if(!F.default.existsSync(r)){y({mode:"flat",workstreams:[],message:"No workstreams - operating in flat mode"},e);return}let s=He(t),i=[];for(let o of F.default.readdirSync(r,{withFileTypes:!0}).filter(a=>a.isDirectory())){let a=M.default.join(r,o.name),c=M.default.join(a,"phases"),l=Le(c),d=0,u=0,m=0;for(let h of l)try{let x=F.default.readdirSync(M.default.join(c,h)),S=wt(x),_=kt(x);u+=S.length,m+=Math.min(_.length,S.length),S.length>0&&_.length>=S.length&&d++}catch{}let p=l.length;try{let x=F.default.readFileSync(M.default.join(a,"ROADMAP.md"),"utf-8").match(/^###?\s+Phase\s+\d/gm);x&&(p=x.length)}catch{}let f="unknown",g=null;try{let h=F.default.readFileSync(M.default.join(a,"STATE.md"),"utf-8");f=J(h,"Status")||"unknown",g=J(h,"Current Phase")}catch{}i.push({name:o.name,active:o.name===s,status:f,current_phase:g,phases:`${d}/${p}`,plans:`${m}/${u}`,progress_percent:p>0?Math.round(d/p*100):0})}y({mode:"workstream",active:s,workstreams:i,count:i.length},e)}var F,M,ot=N(()=>{"use strict";F=W(require("fs")),M=W(require("path"));ge();Fe()});var at,Jn,Yn,Hn,Xn,Zn,Kn,Qn,Or=N(()=>{"use strict";at=require("@oclif/core");$e();Jn=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)}},Yn=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)}},Hn=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)}},Xn=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)}},Zn=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)}},Kn=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)}},Qn=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:()=>wa,cmdCommitToSubrepo:()=>ka,cmdCurrentTimestamp:()=>xa,cmdGenerateSlug:()=>ya,cmdHistoryDigest:()=>va,cmdListTodos:()=>Sa,cmdProgressRender:()=>$a,cmdResolveModel:()=>_a,cmdScaffold:()=>Ra,cmdStats:()=>Ea,cmdSummaryExtract:()=>Pa,cmdTodoComplete:()=>Aa,cmdTodoMatchPhase:()=>ja,cmdVerifyPathExists:()=>ba,cmdWebsearch:()=>Ca});function ya(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 xa(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 Sa(t,e,n){let r=H.default.join(T(t),"todos","pending"),s=0,i=[];try{let o=V.default.readdirSync(r).filter(a=>a.endsWith(".md"));for(let a of o)try{let c=V.default.readFileSync(H.default.join(r,a),"utf-8"),l=c.match(/^created:\s*(.+)$/m),d=c.match(/^title:\s*(.+)$/m),u=c.match(/^area:\s*(.+)$/m),m=u?u[1].trim():"general";if(e&&m!==e)continue;s++,i.push({file:a,created:l?l[1].trim():"unknown",title:d?d[1].trim():"Untitled",area:m,path:G(H.default.relative(t,H.default.join(r,a)))})}catch{}}catch{}y({count:s,todos:i},n,s.toString())}function ba(t,e,n){e||b("path required for verification"),e.includes("\0")&&b("path contains null bytes");let r=H.default.isAbsolute(e)?e:H.default.join(t,e);try{let s=V.default.statSync(r);y({exists:!0,type:s.isDirectory()?"directory":s.isFile()?"file":"other"},n,"true")}catch{y({exists:!1,type:null},n,"false")}}function va(t,e){let n=j(t).phases,r={phases:{},decisions:[],tech_stack:new Set},s=[];for(let i of Lt(t))s.push({name:i.name,fullPath:i.fullPath,milestone:i.milestone});if(V.default.existsSync(n))try{for(let i of V.default.readdirSync(n,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort())s.push({name:i,fullPath:H.default.join(n,i),milestone:null})}catch{}if(s.length===0){y({phases:{},decisions:[],tech_stack:[]},e);return}try{for(let{name:o,fullPath:a}of s){let c=V.default.readdirSync(a).filter(l=>l.endsWith("-SUMMARY.md")||l==="SUMMARY.md");for(let l of c)try{let d=V.default.readFileSync(H.default.join(a,l),"utf-8"),u=ie(d),m=ue(u.phase)??o.split("-")[0];r.phases[m]||(r.phases[m]={name:ue(u.name)??o.split("-").slice(1).join(" ")??"Unknown",provides:new Set,affects:new Set,patterns:new Set});let p=Pt(u["dependency-graph"]);p?.provides?_e(p.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))):u.provides&&_e(u.provides)?.forEach(g=>r.phases[m].provides.add(ue(g)??String(g))),p?.affects&&_e(p.affects)?.forEach(g=>r.phases[m].affects.add(ue(g)??String(g))),u["patterns-established"]&&_e(u["patterns-established"])?.forEach(g=>r.phases[m].patterns.add(ue(g)??String(g))),u["key-decisions"]&&_e(u["key-decisions"])?.forEach(g=>r.decisions.push({phase:m,decision:ue(g)??String(g)}));let f=Pt(u["tech-stack"]);f?.added&&_e(f.added)?.forEach(g=>{let h=ue(g);if(h)r.tech_stack.add(h);else{let x=Pt(g);x&&r.tech_stack.add(ue(x.name)??"")}})}catch{}}let i={phases:Object.fromEntries(Object.entries(r.phases).map(([o,a])=>[o,{name:a.name,provides:[...a.provides],affects:[...a.affects],patterns:[...a.patterns]}])),decisions:r.decisions,tech_stack:[...r.tech_stack]};y(i,e)}catch(i){b("Failed to generate history digest: "+i.message)}}function _a(t,e,n){e||b("agent-type required");let r=X(t),s=se(t,e),i=Re[e];y(i?{model:s,profile:r.model_profile}:{model:s,profile:r.model_profile,unknown_agent:!0},n,s)}function wa(t,e,n,r,s=!1,i=!1){!e&&!s&&b("commit message required");let o=e;o&&(o=hr(o));let a=X(t);if(!a.commit_docs){y({committed:!1,hash:null,reason:"skipped_commit_docs_false"},r,"skipped");return}if(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=re(t);f?.version&&(p=a.milestone_branch_template.replace("{milestone}",f.version).replace("{slug}",qe(f.name)||"milestone"))}if(p){let f=ae(t,["rev-parse","--abbrev-ref","HEAD"]);f.exitCode===0&&f.stdout.trim()!==p&&ae(t,["checkout","-b",p]).exitCode!==0&&ae(t,["checkout",p])}}let c=n&&n.length>0?n:[".planning/"];for(let p of c){let f=H.default.join(t,p);V.default.existsSync(f)?ae(t,["add",p]):ae(t,["rm","--cached","--ignore-unmatch",p])}let l=s?["commit","--amend","--no-edit"]:["commit","-m",o];i&&l.push("--no-verify");let d=ae(t,l);if(d.exitCode!==0){if(d.stdout.includes("nothing to commit")||d.stderr.includes("nothing to commit")){y({committed:!1,hash:null,reason:"nothing_to_commit"},r,"nothing");return}y({committed:!1,hash:null,reason:"nothing_to_commit",error:d.stderr},r,"nothing");return}let u=ae(t,["rev-parse","--short","HEAD"]),m=u.exitCode===0?u.stdout:null;y({committed:!0,hash:m,reason:"committed"},r,m||"committed")}function ka(t,e,n,r){e||b("commit message required");let i=X(t).sub_repos;(!i||i.length===0)&&b("no sub_repos configured in .planning/config.json"),(!n||n.length===0)&&b("--files required for commit-to-subrepo");let o={},a=[];for(let l of n){let d=i.find(u=>l.startsWith(u+"/"));d?(o[d]||(o[d]=[]),o[d].push(l)):a.push(l)}a.length>0&&process.stderr.write(`Warning: ${a.length} file(s) did not match any sub-repo prefix: ${a.join(", ")}
246
246
  `);let c={};for(let[l,d]of Object.entries(o)){let u=H.default.join(t,l);for(let f of d)ae(u,["add",f.slice(l.length+1)]);let m=ae(u,["commit","-m",e]);if(m.exitCode!==0){c[l]={committed:!1,hash:null,files:d,reason:m.stdout.includes("nothing to commit")?"nothing_to_commit":"error",error:m.stderr};continue}let p=ae(u,["rev-parse","--short","HEAD"]);c[l]={committed:!0,hash:p.exitCode===0?p.stdout:null,files:d}}y({committed:Object.values(c).some(l=>l.committed),repos:c,unmatched:a.length>0?a:void 0},r,Object.entries(c).map(([l,d])=>`${l}:${d.hash||"skip"}`).join(" "))}function Pa(t,e,n,r){e||b("summary-path required for summary-extract");let s=H.default.join(t,e);if(!V.default.existsSync(s)){y({error:"File not found",path:e},r);return}let i=V.default.readFileSync(s,"utf-8"),o=ie(i),a=l=>(l||[]).map(d=>{let u=ue(d)??String(d),m=u.indexOf(":");return m>0?{summary:u.substring(0,m).trim(),rationale:u.substring(m+1).trim()}:{summary:u,rationale:null}}),c={path:e,one_liner:ue(o["one-liner"])??Ut(i)??null,key_files:_e(o["key-files"])??[],tech_added:_e(Pt(o["tech-stack"])?.added)??[],patterns:_e(o["patterns-established"])??[],decisions:a(_e(o["key-decisions"])),requirements_completed:_e(o["requirements-completed"])??[]};if(n&&n.length>0){let l={path:e};for(let d of n)c[d]!==void 0&&(l[d]=c[d]);y(l,r);return}y(c,r)}async function Ca(t,e,n){let r=process.env.BRAVE_API_KEY;if(!r){y({available:!1,reason:"BRAVE_API_KEY not set"},n,"");return}if(!t){y({available:!1,error:"Query required"},n,"");return}let s=new URLSearchParams({q:t,count:String(e.limit||10),country:"us",search_lang:"en",text_decorations:"false"});e.freshness&&s.set("freshness",e.freshness);try{let i=await fetch(`https://api.search.brave.com/res/v1/web/search?${s}`,{headers:{Accept:"application/json","X-Subscription-Token":r}});if(!i.ok){y({available:!1,error:`API error: ${i.status}`},n,"");return}let a=((await i.json()).web?.results||[]).map(c=>({title:c.title,url:c.url,description:c.description,age:c.age||null}));y({available:!0,query:t,count:a.length,results:a},n,a.map(c=>`${c.title}
247
247
  ${c.url}
248
248
  ${c.description}`).join(`
@@ -326,7 +326,7 @@ _Pending verification_
326
326
  `;_>0&&(U+=`
327
327
  **Git:** ${_} commits`,P&&(U+=` (since ${P})`),U+=`
328
328
  `),S&&(U+=`**Last activity:** ${S}
329
- `),y({rendered:U},n,U)}else y(L,n)}var V,H,Se=N(()=>{"use strict";V=W(require("fs")),H=W(require("path"));ge();Ue();Dt();dn()});var Gt,ts,Nr=N(()=>{"use strict";Gt=require("@oclif/core");$e();ts=class t extends w{static description="Scaffold a GSD artefact";static args={type:Gt.Args.string({required:!0})};static flags={...w.baseFlags,phase:Gt.Flags.string({description:"Phase number"}),name:Gt.Flags.string({description:"Artefact name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdScaffold:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.type,{phase:e.phase??null,name:e.name??null},s)}}});var ns,ss,Wr=N(()=>{"use strict";ns=require("@oclif/core");$e();ss=class t extends w{static description="Commit GSD changes to git";static flags={...w.baseFlags,amend:ns.Flags.boolean({description:"Amend last commit",default:!1}),"no-verify":ns.Flags.boolean({description:"Skip git hooks",default:!1}),files:ns.Flags.string({description:"Files to include",multiple:!0})};static strict=!1;async run(){let{flags:e,argv:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdCommit:i}=await Promise.resolve().then(()=>(Se(),xe)),a=n.filter(c=>!c.startsWith("--")).join(" ")||void 0;i(r,a,e.files??[],s,e.amend,e["no-verify"])}}});var tt,rs,is,os,qr=N(()=>{"use strict";tt=require("@oclif/core");$e();rs=class t extends w{static description="Get frontmatter field from a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),cn))).cmdFrontmatterGet(r,n.file,e.field??null,s)}},is=class t extends w{static description="Set frontmatter field in a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"}),value:tt.Flags.string({description:"Field value"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),cn))).cmdFrontmatterSet(r,n.file,e.field,e.value,s)}},os=class t extends w{static description="Merge frontmatter data into a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,data:tt.Flags.string({description:"JSON data to merge"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),cn))).cmdFrontmatterMerge(r,n.file,e.data,s)}}});var Bs={};he(Bs,{cmdTemplateFill:()=>Ma,cmdTemplateSelect:()=>Fa});function Fa(t,e,n){e||b("plan-path required");try{let r=Bt.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 Ma(t,e,n,r){e||b("template type required: summary, plan, or verification"),n.phase||b("--phase required");let s=fe(t,n.phase);if(!s||!s.found){y({error:"Phase not found",phase:n.phase},r);return}let i=de(n.phase),o=new Date().toISOString().split("T")[0],a=n.name||s.phase_name||"Unnamed",c=s.phase_slug||qe(a),l=`${i}-${c}`,d=(n.plan||"01").padStart(2,"0"),u=n.fields||{},m,p,f;switch(e){case"summary":m={phase:l,plan:d,subsystem:"[primary category]",tags:[],provides:[],affects:[],"tech-stack":{added:[],patterns:[]},"key-files":{created:[],modified:[]},"key-decisions":[],"patterns-established":[],duration:"[X]min",completed:o,...u},p=[`# Phase ${n.phase}: ${a} Summary`,"","**[Substantive one-liner describing outcome]**","","## Performance","- **Duration:** [time]","- **Tasks:** [count completed]","- **Files modified:** [count]","","## Accomplishments","- [Key outcome 1]","- [Key outcome 2]","","## Task Commits","1. **Task 1: [task name]** - `hash`","","## Files Created/Modified","- `path/to/file.ts` - What it does","","## Decisions & Deviations",'[Key decisions or "None - followed plan as specified"]',"","## Next Phase Readiness","[What's ready for next phase]"].join(`
329
+ `),y({rendered:U},n,U)}else y(L,n)}var V,H,Se=N(()=>{"use strict";V=W(require("fs")),H=W(require("path"));ge();Ue();Dt();ln()});var Gt,es,Nr=N(()=>{"use strict";Gt=require("@oclif/core");$e();es=class t extends w{static description="Scaffold a GSD artefact";static args={type:Gt.Args.string({required:!0})};static flags={...w.baseFlags,phase:Gt.Flags.string({description:"Phase number"}),name:Gt.Flags.string({description:"Artefact name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdScaffold:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.type,{phase:e.phase??null,name:e.name??null},s)}}});var ts,ns,Wr=N(()=>{"use strict";ts=require("@oclif/core");$e();ns=class t extends w{static description="Commit GSD changes to git";static flags={...w.baseFlags,amend:ts.Flags.boolean({description:"Amend last commit",default:!1}),"no-verify":ts.Flags.boolean({description:"Skip git hooks",default:!1}),files:ts.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,ss,rs,is,qr=N(()=>{"use strict";tt=require("@oclif/core");$e();ss=class t extends w{static description="Get frontmatter field from a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),an))).cmdFrontmatterGet(r,n.file,e.field??null,s)}},rs=class t extends w{static description="Set frontmatter field in a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,field:tt.Flags.string({description:"Field name"}),value:tt.Flags.string({description:"Field value"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),an))).cmdFrontmatterSet(r,n.file,e.field,e.value,s)}},is=class t extends w{static description="Merge frontmatter data into a file";static args={file:tt.Args.string({required:!0})};static flags={...w.baseFlags,data:tt.Flags.string({description:"JSON data to merge"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e);(await Promise.resolve().then(()=>(Ue(),an))).cmdFrontmatterMerge(r,n.file,e.data,s)}}});var Bs={};he(Bs,{cmdTemplateFill:()=>Ma,cmdTemplateSelect:()=>Fa});function Fa(t,e,n){e||b("plan-path required");try{let r=Bt.default.join(t,e),s=os.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 Ma(t,e,n,r){e||b("template type required: summary, plan, or verification"),n.phase||b("--phase required");let s=fe(t,n.phase);if(!s||!s.found){y({error:"Phase not found",phase:n.phase},r);return}let i=de(n.phase),o=new Date().toISOString().split("T")[0],a=n.name||s.phase_name||"Unnamed",c=s.phase_slug||qe(a),l=`${i}-${c}`,d=(n.plan||"01").padStart(2,"0"),u=n.fields||{},m,p,f;switch(e){case"summary":m={phase:l,plan:d,subsystem:"[primary category]",tags:[],provides:[],affects:[],"tech-stack":{added:[],patterns:[]},"key-files":{created:[],modified:[]},"key-decisions":[],"patterns-established":[],duration:"[X]min",completed:o,...u},p=[`# Phase ${n.phase}: ${a} Summary`,"","**[Substantive one-liner describing outcome]**","","## Performance","- **Duration:** [time]","- **Tasks:** [count completed]","- **Files modified:** [count]","","## Accomplishments","- [Key outcome 1]","- [Key outcome 2]","","## Task Commits","1. **Task 1: [task name]** - `hash`","","## Files Created/Modified","- `path/to/file.ts` - What it does","","## Decisions & Deviations",'[Key decisions or "None - followed plan as specified"]',"","## Next Phase Readiness","[What's ready for next phase]"].join(`
330
330
  `),f=`${i}-${d}-SUMMARY.md`;break;case"plan":m={phase:l,plan:d,type:n.type||"execute",wave:parseInt(n.wave||"1"),depends_on:[],files_modified:[],autonomous:!0,user_setup:[],must_haves:{truths:[],artifacts:[],key_links:[]},...u},p=[`# Phase ${n.phase} Plan ${d}: [Title]`,"","## Objective","- **What:** [What this plan builds]","- **Why:** [Why it matters for the phase goal]","- **Output:** [Concrete deliverable]","","## Context","@.planning/PROJECT.md","@.planning/ROADMAP.md","@.planning/STATE.md","","## Tasks","",'<task type="code">'," <name>[Task name]</name>"," <files>[file paths]</files>"," <action>[What to do]</action>"," <verify>[How to verify]</verify>"," <done>[Definition of done]</done>","</task>","","## Verification","[How to verify this plan achieved its objective]","","## Success Criteria","- [ ] [Criterion 1]","- [ ] [Criterion 2]"].join(`
331
331
  `),f=`${i}-${d}-PLAN.md`;break;case"verification":m={phase:l,verified:new Date().toISOString(),status:"pending",score:"0/0 must-haves verified",...u},p=[`# Phase ${n.phase}: ${a} - Verification`,"","## Observable Truths","| # | Truth | Status | Evidence |","|---|-------|--------|----------|","| 1 | [Truth] | pending | |","","## Required Artifacts","| Artifact | Expected | Status | Details |","|----------|----------|--------|---------|","| [path] | [what] | pending | |","","## Key Link Verification","| From | To | Via | Status | Details |","|------|----|----|--------|---------|","| [source] | [target] | [connection] | pending | |","","## Requirements Coverage","| Requirement | Status | Blocking Issue |","|-------------|--------|----------------|","| [req] | pending | |","","## Result","[Pending verification]"].join(`
332
332
  `),f=`${i}-VERIFICATION.md`;break;default:b(`Unknown template type: ${e}. Available: summary, plan, verification`);return}let g=`---
@@ -334,10 +334,10 @@ ${Ct(m)}
334
334
  ---
335
335
 
336
336
  ${p}
337
- `,h=Bt.default.join(t,s.directory,f);if(as.default.existsSync(h)){y({error:"File already exists",path:G(Bt.default.relative(t,h))},r);return}as.default.writeFileSync(h,Ee(g),"utf-8");let x=G(Bt.default.relative(t,h));y({created:!0,path:x,template:e},r,x)}var as,Bt,Js=N(()=>{"use strict";as=W(require("fs")),Bt=W(require("path"));ge();Ue()});var Je,cs,ls,Lr=N(()=>{"use strict";Je=require("@oclif/core");$e();cs=class t extends w{static description="Select a workflow template";static args={type:Je.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTemplateSelect:i}=await Promise.resolve().then(()=>(Js(),Bs));i(r,n.type,s)}},ls=class t extends w{static description="Fill a template with values";static args={type:Je.Args.string({required:!0})};static flags={...w.baseFlags,phase:Je.Flags.string(),plan:Je.Flags.string(),name:Je.Flags.string(),type:Je.Flags.string({char:"t"}),wave:Je.Flags.string(),fields:Je.Flags.string({description:"JSON fields"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTemplateFill:i}=await Promise.resolve().then(()=>(Js(),Bs)),o={};if(e.fields)try{o=JSON.parse(e.fields)}catch{}i(r,n.type,{phase:e.phase??void 0,plan:e.plan??void 0,name:e.name??void 0,type:e.type??void 0,wave:e.wave??void 0,...o},s)}}});var Et,ds,us,ms,ps,fs,Ur=N(()=>{"use strict";Et=require("@oclif/core");$e();ds=class t extends w{static description="Show project progress";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdProgressRender:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.format,s)}},us=class t extends w{static description="Show project statistics";static args={format:Et.Args.string({default:"json"})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdStats:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.format,s)}},ms=class t extends w{static description="Mark a todo as complete";static args={id:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoComplete:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.id,s)}},ps=class t extends w{static description="Match todos to phase";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTodoMatchPhase:i}=await Promise.resolve().then(()=>(Se(),xe));i(r,n.phase,s)}},fs=class t extends w{static description="Extract fields from summary files";static args={phase:Et.Args.string({required:!0})};static flags={...w.baseFlags,fields:w.baseFlags.pick};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdSummaryExtract:i}=await Promise.resolve().then(()=>(Se(),xe)),o=e.fields?e.fields.split(","):null;i(r,n.phase,o,s)}}});function ft(t){let e=[],n=/^```[^\n]*\n[\s\S]*?^```/gm,r;for(;(r=n.exec(t))!==null;)e.push([r.index,r.index+r[0].length]);return e}function gt(t,e){return e.some(([n,r])=>t>=n&&t<r)}function Ia(t){let e={},n=/([a-zA-Z0-9_:-]+)(?:=(?:"([^"]*)"|'([^']*)'|([^\s/>]*)))?/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]??r[3]??r[4]??"";e[s]=i}return e}function Vr(t,e){if(t[e]!=="<")return null;let n=/^<([a-zA-Z0-9_:-]+)((?:\s+[a-zA-Z0-9_:-]+(?:=(?:"[^"]*"|'[^']*'|[^\s/>]*))?)*)?\s*(\/??>)/,r=t.slice(e),s=n.exec(r);if(!s)return null;let i=s[1],o=(s[2]??"").trim(),a=s[3],c=Ia(o);if(a==="/>")return{node:{tag:i,attrs:c,children:[],selfClosing:!0},end:e+s[0].length};let l=e+s[0].length,d=[],u=`</${i}>`;for(;l<t.length;){let m=t.indexOf("<",l);if(m===-1)break;if(t.startsWith(u,m))return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:m+u.length};if(t.startsWith("<!--",m)){let f=t.indexOf("-->",m+4);l=f!==-1?f+3:t.length;continue}let p=Vr(t,m);p?(d.push(p.node),l=p.end):l=m+1}return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:l}}function Jt(t){let e=ft(t),n=[],r=/<(gsd-[a-zA-Z0-9_-]+)/g,s;for(;(s=r.exec(t))!==null;){let i=s.index;if(gt(i,e))continue;let o=s[1];if(!Ta.has(o))continue;let a=Vr(t,i);a&&(n.push({node:a.node,start:i,end:a.end}),r.lastIndex=a.end)}return n}function gs(t,e,n,r){return t.slice(0,e)+r+t.slice(n)}var Ta,Ys=N(()=>{"use strict";Ta=new Set(["gsd-execute","gsd-arguments","gsd-paste","gsd-include","gsd-version"])});function zr(){let t=new Map,e=new Map,n=r=>{let s=t.get(r)?.value;if(s!==void 0)return s;let i=r.indexOf(".");if(i===-1)return;let o=r.slice(0,i),a=r.slice(i+1),c=t.get(o)?.value;if(c!==void 0)try{let l=JSON.parse(c);for(let d of a.split(".")){if(l===null||typeof l!="object")return;l=l[d]}return l==null?void 0:String(l)}catch{return}};return{set(r,s,i){let o=t.get(r);o?.owner&&i&&o.owner!==i?(t.delete(r),t.set(`${o.owner}:${r}`,{name:`${o.owner}:${r}`,value:o.value,owner:o.owner}),t.set(`${i}:${r}`,{name:`${i}:${r}`,value:s,owner:i})):t.set(r,{name:r,value:s,owner:i})},get(r){return t.get(r)?.value},resolve(r){return n(r)},setArray(r,s,i){e.set(r,s),t.set(r,{name:r,value:JSON.stringify(s),owner:i})},getArray(r){if(e.has(r))return e.get(r);let s=t.get(r)?.value;if(s)try{let i=JSON.parse(s);if(Array.isArray(i))return i.map(o=>typeof o=="string"?o:JSON.stringify(o))}catch{}},has(r){return t.has(r)||e.has(r)},entries(){return t.entries()},snapshot(){let r={};for(let[s,i]of t)r[s]=i.value;return r}}}var Gr=N(()=>{"use strict"});function Br(t,e,n){let r=t.children.find(g=>g.tag==="settings"),s=r?.children.some(g=>g.tag==="keep-extra-args")??!1,i=r?.children.some(g=>g.tag==="strict-args")??!1,a=r?.children.find(g=>g.tag==="delimiters")?.children.find(g=>g.tag==="delimiter"),c;if(a){let g=a.attrs.value??"",h=g==="\\n"?`
338
- `:g;c=e.split(h).map(x=>x.trim()).filter(Boolean)}else c=e.trim().split(/\s+/).filter(Boolean);let l=t.children.filter(g=>g.tag==="arg"),d=new Set;for(let g of l.filter(h=>h.attrs.type==="flag")){let h=g.attrs.flag??`--${g.attrs.name}`,x=c.indexOf(h),S=g.attrs.name;S&&(x===-1?n.set(S,"false",void 0):(n.set(S,"true",void 0),d.add(x)))}let u=l.filter(g=>g.attrs.type!=="flag"),m=c.filter((g,h)=>!d.has(h)),p=0;for(let g=0;g<u.length;g++){let h=u[g],x=h.attrs.name,S=h.attrs.type??"string",_=g===u.length-1;if(x){if(p>=m.length){if(!("optional"in h.attrs))throw new ht(`Missing required argument '${x}' (type: ${S})`);n.set(x,"",void 0);continue}if(S==="string"&&_)n.set(x,m.slice(p).join(" "),void 0),p=m.length;else if(S==="number"){let P=m[p++],k=Number(P);if(isNaN(k))throw new ht(`Argument '${x}' expected a number, got '${P}'`);n.set(x,String(k),void 0)}else if(S==="boolean"){let P=m[p++].toLowerCase();if(P!=="true"&&P!=="false")throw new ht(`Argument '${x}' expected true/false, got '${P}'`);n.set(x,P,void 0)}else n.set(x,m[p++]??"",void 0)}}let f=m.slice(p).join(" ");if(f){if(i)throw new ht(`Unexpected extra arguments: '${f}'`);s&&n.set("_extra",f,void 0)}}var ht,Hs=N(()=>{"use strict";ht=class extends Error{constructor(e){super(e),this.name="WxpArgumentsError"}}});function hs(t,e,n){switch(t.position){case"project":return Ye.default.resolve(e,t.path);case"pkg":return Ye.default.resolve(n,t.path);case"absolute":return Ye.default.resolve(t.path)}}function Xs(t,e,n,r){let s=Ye.default.resolve(t),i=`${Ye.default.sep}.planning`;if(s.includes(`${i}${Ye.default.sep}`)||s.endsWith(i))return{ok:!1,reason:".planning/ files are never processed by WXP (hard security invariant)"};for(let o of e.untrustedPaths){let a=hs(o,n,r);if(s.startsWith(a+Ye.default.sep)||s===a)return{ok:!1,reason:`File '${t}' is in an explicitly untrusted path: ${a}`}}for(let o of e.trustedPaths){let a=hs(o,n,r);if(s.startsWith(a+Ye.default.sep)||s===a)return{ok:!0}}return{ok:!1,reason:`File '${t}' is not in a trusted WXP path.`}}function Yr(t,e){let n=Ye.default.basename(t);return e.shellBanlist.includes(n)?{ok:!1,reason:`Command '${n}' is explicitly banned by WXP security config.`}:e.shellAllowlist.includes(n)?{ok:!0}:{ok:!1,reason:`Command '${n}' is not in the WXP shell allowlist. Allowed: ${e.shellAllowlist.join(", ")}`}}var Ye,Jr,Yt=N(()=>{"use strict";Ye=W(require("path")),Jr=["pi-gsd-tools","git","node","cat","ls","echo","find"]});function ys(t,e){if(t.attrs.string!==void 0)return t.attrs.string;if(t.attrs.name!==void 0){let n=e.resolve(t.attrs.name)??"",r=t.attrs.wrap;return r?`${r}${n}${r}`:n}return t.attrs.value!==void 0?t.attrs.value:""}function Xr(t,e,n){let r=t.attrs.command??"",s=Yr(r,n);if(!s.ok)throw new yt(r,"",e.snapshot(),s.reason);let i=t.children.find(u=>u.tag==="args"),o=t.children.find(u=>u.tag==="outs"),a=i?i.children.filter(u=>u.tag==="arg").map(u=>ys(u,e)):[],c=o?o.children.some(u=>u.tag==="suppress-errors"):!1,l=o?o.children.filter(u=>u.tag==="out"&&u.attrs.name).map(u=>u.attrs.name):[],d="";try{d=(0,Hr.execFileSync)(r,a,{encoding:"utf8",timeout:n.shellTimeoutMs,windowsHide:!0}).trim()}catch(u){if(c){for(let f of l)e.set(f,"",void 0);return}let m=u,p=(m.stderr??m.message??String(u)).trim();throw new yt(r,p,e.snapshot(),`Shell '${r} ${a.join(" ")}' failed: ${p}`)}l.length>0&&e.set(l[0],d,void 0)}var Hr,yt,xs=N(()=>{"use strict";Hr=require("child_process");Yt();yt=class extends Error{constructor(n,r,s,i){super(i);this.command=n;this.stderr=r;this.variableSnapshot=s;this.name="WxpShellError"}command;stderr;variableSnapshot}});function Zr(t,e){if(t.attrs.op!=="split")throw new xt('<string-op> only op="split" is supported in v1');let r=t.children.find(m=>m.tag==="args"),s=t.children.find(m=>m.tag==="outs");if(!r||!s)throw new xt("<string-op> requires <args> and <outs>");let i=r.children.filter(m=>m.tag==="arg"),o=s.children.filter(m=>m.tag==="out"),a=i[0],c=i[1];if(!a)throw new xt('<string-op op="split"> requires at least 2 <arg> children');let l=ys(a,e);if(a.attrs.name&&e.get(a.attrs.name)===void 0)throw new xt(`string-op split: source variable '${a.attrs.name}' is not defined`);let d=c?ys(c,e):"",u=l.split(d);o.forEach((m,p)=>{let f=m.attrs.name;f&&e.set(f,u[p+1]??u[p]??"",void 0)})}var xt,Zs=N(()=>{"use strict";xs();xt=class extends Error{constructor(e){super(e),this.name="WxpStringOpError"}}});function Ss(t,e){return t.attrs.name?e.resolve(t.attrs.name)??"":t.attrs.value!==void 0?t.attrs.value:""}function Kr(t){return t.attrs.type==="number"}function Oa(t,e){let n=t.children.find(a=>a.tag==="left"),r=t.children.find(a=>a.tag==="right");if(!n||!r)return!1;if(Kr(n)||Kr(r)){let a=Number(Ss(n,e)),c=Number(Ss(r,e));switch(t.tag){case"equals":return a===c;case"not-equals":return a!==c;case"less-than":return a<c;case"greater-than":return a>c;case"less-than-or-equal":return a<=c;case"greater-than-or-equal":return a>=c;default:return!1}}let i=Ss(n,e),o=Ss(r,e);switch(t.tag){case"equals":return i===o;case"not-equals":return i!==o;case"starts-with":return i.startsWith(o);case"contains":return i.includes(o);case"less-than":return Number(i)<Number(o);case"greater-than":return Number(i)>Number(o);case"less-than-or-equal":return Number(i)<=Number(o);case"greater-than-or-equal":return Number(i)>=Number(o);default:return!1}}function Xt(t,e){return t.tag==="and"?t.children.filter(n=>Ht.has(n.tag)).every(n=>Xt(n,e)):t.tag==="or"?t.children.filter(n=>Ht.has(n.tag)).some(n=>Xt(n,e)):Oa(t,e)}function Qr(t,e){let n=t.children.find(s=>s.tag==="condition");if(!n)return!1;let r=n.children.find(s=>Ht.has(s.tag));return r?Xt(r,e):!1}function ei(t,e){let n=t.children.find(r=>Ht.has(r.tag));return n?Xt(n,e):!0}var Da,Ht,ti=N(()=>{"use strict";Da=new Set(["equals","not-equals","starts-with","contains","less-than","greater-than","less-than-or-equal","greater-than-or-equal"]),Ht=new Set([...Da,"and","or"])});function Na(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 Wa(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 qa(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 La(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 Ua(t,e,n){let r=t.attrs.var??"",s=t.attrs.item??"",i=t.children.find(l=>l.tag==="where"),o=t.children.find(l=>l.tag==="sort-by"),a=t.children.filter(l=>l.tag!=="where"&&l.tag!=="sort-by"),c=e.getArray(r);if(c){if(i&&(c=c.filter(l=>(e.set(s,l,void 0),ei(i,e)))),o){let l=o.attrs.key??"",d=o.attrs.type??"string",u=o.attrs.order??"asc";c=[...c].sort((m,p)=>{e.set(s,m,void 0);let f=e.resolve(`${s}.${l}`)??e.resolve(l)??"";e.set(s,p,void 0);let g=e.resolve(`${s}.${l}`)??e.resolve(l)??"",h=d==="number"?Number(f)-Number(g):f.localeCompare(g);return u==="desc"?-h:h})}for(let l of c){e.set(s,l,void 0);for(let d of a)Ks(d,e,n)}}}function Ks(t,e,n){switch(t.tag){case"shell":Xr(t,e,n.config);break;case"string-op":Zr(t,e);break;case"json-parse":Wa(t,e);break;case"read-file":qa(t,e);break;case"write-file":La(t,e,n);break;case"display":Na(t,e,n);break;case"for-each":Ua(t,e,n);break;case"if":{let r=Qr(t,e),s=t.children.find(a=>a.tag==="then"),i=t.children.find(a=>a.tag==="else"),o=r?s:i;if(o)for(let a of o.children)Ks(a,e,n);break}case"gsd-execute":Qs(t,e,n);break;default:break}}function Qs(t,e,n){try{for(let r of t.children)Ks(r,e,n)}catch(r){throw r instanceof yt||r instanceof Error?new bs(r,e.snapshot(),`Execution failed: ${r.message}`):r}}var Zt,Kt,bs,er=N(()=>{"use strict";Zt=W(require("fs")),Kt=W(require("path"));xs();Zs();ti();Yt();bs=class extends Error{constructor(n,r,s){super(s);this.cause=n;this.variableSnapshot=r;this.name="WxpExecutionError"}cause;variableSnapshot}});function ni(t,e){let n=ft(t),r=/<gsd-paste\s+name="([^"]+)"\s*\/>/g,s=[],i;for(;(i=r.exec(t))!==null;)gt(i.index,n)||s.push({index:i.index,full:i[0],name:i[1]});for(let a of s)if(e.get(a.name)===void 0)throw new vs(a.name,e.snapshot());let o=t;for(let a=s.length-1;a>=0;a--){let c=s[a],l=e.get(c.name);o=o.slice(0,c.index)+l+o.slice(c.index+c.full.length)}return o}var vs,tr=N(()=>{"use strict";Ys();vs=class extends Error{constructor(n,r){super(`<gsd-paste name="${n}" /> references undefined variable '${n}'`);this.variableName=n;this.variableSnapshot=r;this.name="WxpPasteError"}variableName;variableSnapshot}});function ri(t,e,n,r,s,i="",o=za){let a=Xs(e,n,r,s);if(!a.ok)throw new St(e,new Error(a.reason),{},[],[]);return Ga(t,e,n,r,s,i,o)}function Ga(t,e,n,r,s,i,o){let a=zr(),c=[],l=t,d={config:n,projectRoot:r,pkgRoot:s,onDisplay:o};for(let u=0;u<Va;u++){let p=Jt(l).filter(g=>g.node.tag!=="gsd-version");if(p.length===0)break;let f=p.map(g=>g.node.tag);try{let g=!1;for(let x of Jt(l)){if(x.node.tag!=="gsd-include"||gt(x.start,ft(l)))continue;let S=x.node.attrs.path;if(!S)continue;let _=Qt.default.resolve(Qt.default.dirname(e),S),P=Xs(_,n,r,s);if(!P.ok)throw new Error(`Include rejected: ${P.reason}`);let k=si.default.readFileSync(_,"utf8"),C=Qt.default.basename(_,Qt.default.extname(_));for(let $ of x.node.children)if($.tag==="gsd-arguments")for(let q of $.children.filter(O=>O.tag==="arg")){let O=q.attrs.name,U=q.attrs.as;if(O&&U){let Y=a.get(O);Y!==void 0&&a.set(U,Y,C)}}let L="include-arguments"in x.node.attrs?`
339
- ${i}`:"";l=gs(l,x.start,x.end,k+L),c.push("gsd-include"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-arguments"&&!gt(x.start,ft(l))){Br(x.node,i,a),l=gs(l,x.start,x.end,""),c.push("gsd-arguments"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-execute"&&!gt(x.start,ft(l))){Qs(x.node,a,d),l=gs(l,x.start,x.end,""),c.push("gsd-execute"),g=!0;break}if(g)continue;let h=ni(l,a);if(h!==l){l=h,c.push("gsd-paste");continue}break}catch(g){if(g instanceof St)throw g;let h=g instanceof Error?g:new Error(String(g));throw new St(e,h,a.snapshot(),f,c)}}return l}var si,Qt,Va,za,St,ii=N(()=>{"use strict";si=W(require("fs")),Qt=W(require("path"));Ys();Gr();Hs();er();tr();Yt();er();xs();tr();Zs();Hs();Va=50,za=()=>{},St=class extends Error{constructor(n,r,s,i,o){super(["WXP Processing Error",`File: ${n}`,`Error: ${r.message}`,`Variable Namespace: ${JSON.stringify(s,null,2)}`,`Pending Operations: [${i.join(", ")}]`,`Completed Operations: [${o.join(", ")}]`].join(`
340
- `));this.filePath=n;this.cause=r;this.variableSnapshot=s;this.pendingOperations=i;this.completedOperations=o;this.name="WxpProcessingError"}filePath;cause;variableSnapshot;pendingOperations;completedOperations}});var bt,oi,nr,_s,ai=N(()=>{"use strict";bt=require("@oclif/core"),oi=require("@oclif/core"),nr=W(require("path"));ii();Yt();_s=class t extends oi.Command{static description="Process WXP tags in a workflow file";static args={file:bt.Args.string({description:"File to process",required:!1})};static flags={input:bt.Flags.string({description:"Input content string (alternative to file)"}),arguments:bt.Flags.string({description:"Raw $ARGUMENTS string",default:""}),"project-root":bt.Flags.string({description:"Project root directory",default:process.cwd()}),"pkg-root":bt.Flags.string({description:"Package root directory",default:process.cwd()})};async run(){let{flags:e,args:n}=await this.parse(t),r,s;if(e.input!==void 0)r=e.input,s=nr.default.join(e["project-root"],".pi","gsd","workflows","_inline.md");else if(n.file){let o=await import("fs");s=nr.default.resolve(n.file),r=o.default.readFileSync(s,"utf8")}else{this.error("Provide a file argument or --input string");return}let i={trustedPaths:[{position:"project",path:".pi/gsd"},{position:"pkg",path:".gsd/harnesses/pi/get-shit-done"}],untrustedPaths:[],shellAllowlist:[...Jr],shellBanlist:[],shellTimeoutMs:3e4};try{let o=ri(r,s,i,e["project-root"],e["pkg-root"],e.arguments);process.stdout.write(o)}catch(o){throw o instanceof St&&this.error(o.message,{exit:1}),o}}}});var ci={};he(ci,{AuditUatCommand:()=>Jn,CommitCommand:()=>ss,ConfigEnsureSectionCommand:()=>En,ConfigGetCommand:()=>$n,ConfigNewProjectCommand:()=>Rn,ConfigSetCommand:()=>An,ConfigSetModelProfileCommand:()=>jn,FrontmatterGetCommand:()=>rs,FrontmatterMergeCommand:()=>os,FrontmatterSetCommand:()=>is,InitCommand:()=>vn,MilestoneCompleteCommand:()=>qn,PhaseAddCommand:()=>Mn,PhaseCompleteCommand:()=>Dn,PhaseInsertCommand:()=>In,PhaseNextDecimalCommand:()=>Fn,PhasePlanIndexCommand:()=>On,PhaseRemoveCommand:()=>Tn,ProgressCommand:()=>ds,RequirementsMarkCompleteCommand:()=>Ln,RoadmapAnalyzeCommand:()=>kn,RoadmapGetPhaseCommand:()=>Pn,RoadmapUpdatePlanProgressCommand:()=>Cn,ScaffoldCommand:()=>ts,StateAdvancePlanCommand:()=>gn,StateGetCommand:()=>mn,StateJsonCommand:()=>un,StateLoadCommand:()=>hn,StatePatchCommand:()=>fn,StateUpdateCommand:()=>pn,StateUpdateProgressCommand:()=>yn,StatsCommand:()=>us,SummaryExtractCommand:()=>fs,TemplateFillCommand:()=>ls,TemplateSelectCommand:()=>cs,TodoCompleteCommand:()=>ms,TodoMatchPhaseCommand:()=>ps,ValidateAgentsCommand:()=>Gn,ValidateConsistencyCommand:()=>Vn,ValidateHealthCommand:()=>zn,VerifyCommand:()=>Bn,WorkstreamCompleteCommand:()=>Zn,WorkstreamCreateCommand:()=>Yn,WorkstreamGetCommand:()=>Qn,WorkstreamListCommand:()=>Hn,WorkstreamProgressCommand:()=>es,WorkstreamSetCommand:()=>Kn,WorkstreamStatusCommand:()=>Xn,WxpProcessCommand:()=>_s});var li=N(()=>{"use strict";br();_r();kr();Ar();jr();Rr();Dr();Or();Nr();Wr();qr();Lr();Ur();ai()});var di=ki(($d,Ba)=>{Ba.exports={name:"pi-gsd",version:"2.0.7",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 ws={};he(ws,{cmdExtractMessages:()=>Za,cmdProfileSample:()=>Ka,cmdScanSessions:()=>Xa});function sr(t){if(t)return t;let e=process.env.HOME??"",n=Ie.join(e,".agent","projects");return ee.existsSync(n)?n:Ie.join(e,".claude","projects")}function rr(){let t=process.env.HOME??"";return Ie.join(t,".pi","agent","sessions")}function ir(t){return t.startsWith("--")&&t.endsWith("--")?"/"+t.slice(2,-2).replace(/-/g,"/"):t}function Ja(t){try{let e=ee.readFileSync(t,"utf-8").split(`
337
+ `,h=Bt.default.join(t,s.directory,f);if(os.default.existsSync(h)){y({error:"File already exists",path:G(Bt.default.relative(t,h))},r);return}os.default.writeFileSync(h,Ee(g),"utf-8");let x=G(Bt.default.relative(t,h));y({created:!0,path:x,template:e},r,x)}var os,Bt,Js=N(()=>{"use strict";os=W(require("fs")),Bt=W(require("path"));ge();Ue()});var Je,as,cs,Lr=N(()=>{"use strict";Je=require("@oclif/core");$e();as=class t extends w{static description="Select a workflow template";static args={type:Je.Args.string({required:!0})};static flags={...w.baseFlags};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTemplateSelect:i}=await Promise.resolve().then(()=>(Js(),Bs));i(r,n.type,s)}},cs=class t extends w{static description="Fill a template with values";static args={type:Je.Args.string({required:!0})};static flags={...w.baseFlags,phase:Je.Flags.string(),plan:Je.Flags.string(),name:Je.Flags.string(),type:Je.Flags.string({char:"t"}),wave:Je.Flags.string(),fields:Je.Flags.string({description:"JSON fields"})};async run(){let{flags:e,args:n}=await this.parse(t),{cwd:r,raw:s}=this.resolveContext(e),{cmdTemplateFill:i}=await Promise.resolve().then(()=>(Js(),Bs)),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,ls,ds,us,ms,ps,Ur=N(()=>{"use strict";Et=require("@oclif/core");$e();ls=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)}},ds=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)}},us=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)}},ms=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)}},ps=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 Ia(t){let e={},n=/([a-zA-Z0-9_:-]+)(?:=(?:"([^"]*)"|'([^']*)'|([^\s/>]*)))?/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],i=r[2]??r[3]??r[4]??"";e[s]=i}return e}function Vr(t,e){if(t[e]!=="<")return null;let n=/^<([a-zA-Z0-9_:-]+)((?:\s+[a-zA-Z0-9_:-]+(?:=(?:"[^"]*"|'[^']*'|[^\s/>]*))?)*)?\s*(\/??>)/,r=t.slice(e),s=n.exec(r);if(!s)return null;let i=s[1],o=(s[2]??"").trim(),a=s[3],c=Ia(o);if(a==="/>")return{node:{tag:i,attrs:c,children:[],selfClosing:!0},end:e+s[0].length};let l=e+s[0].length,d=[],u=`</${i}>`;for(;l<t.length;){let m=t.indexOf("<",l);if(m===-1)break;if(t.startsWith(u,m))return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:m+u.length};if(t.startsWith("<!--",m)){let f=t.indexOf("-->",m+4);l=f!==-1?f+3:t.length;continue}let p=Vr(t,m);p?(d.push(p.node),l=p.end):l=m+1}return{node:{tag:i,attrs:c,children:d,selfClosing:!1},end:l}}function Jt(t){let e=ft(t),n=[],r=/<(gsd-[a-zA-Z0-9_-]+)/g,s;for(;(s=r.exec(t))!==null;){let i=s.index;if(gt(i,e))continue;let o=s[1];if(!Ta.has(o))continue;let a=Vr(t,i);a&&(n.push({node:a.node,start:i,end:a.end}),r.lastIndex=a.end)}return n}function fs(t,e,n,r){return t.slice(0,e)+r+t.slice(n)}var Ta,Ys=N(()=>{"use strict";Ta=new Set(["gsd-execute","gsd-arguments","gsd-paste","gsd-include","gsd-version"])});function zr(){let t=new Map,e=new Map,n=r=>{let s=t.get(r)?.value;if(s!==void 0)return s;let i=r.indexOf(".");if(i===-1)return;let o=r.slice(0,i),a=r.slice(i+1),c=t.get(o)?.value;if(c!==void 0)try{let l=JSON.parse(c);for(let d of a.split(".")){if(l===null||typeof l!="object")return;l=l[d]}return l==null?void 0:String(l)}catch{return}};return{set(r,s,i){let o=t.get(r);o?.owner&&i&&o.owner!==i?(t.delete(r),t.set(`${o.owner}:${r}`,{name:`${o.owner}:${r}`,value:o.value,owner:o.owner}),t.set(`${i}:${r}`,{name:`${i}:${r}`,value:s,owner:i})):t.set(r,{name:r,value:s,owner:i})},get(r){return t.get(r)?.value},resolve(r){return n(r)},setArray(r,s,i){e.set(r,s),t.set(r,{name:r,value:JSON.stringify(s),owner:i})},getArray(r){if(e.has(r))return e.get(r);let s=t.get(r)?.value;if(s)try{let i=JSON.parse(s);if(Array.isArray(i))return i.map(o=>typeof o=="string"?o:JSON.stringify(o))}catch{}},has(r){return t.has(r)||e.has(r)},entries(){return t.entries()},snapshot(){let r={};for(let[s,i]of t)r[s]=i.value;return r}}}var Gr=N(()=>{"use strict"});function Br(t,e,n){let r=t.children.find(g=>g.tag==="settings"),s=r?.children.some(g=>g.tag==="keep-extra-args")??!1,i=r?.children.some(g=>g.tag==="strict-args")??!1,a=r?.children.find(g=>g.tag==="delimiters")?.children.find(g=>g.tag==="delimiter"),c;if(a){let g=a.attrs.value??"",h=g==="\\n"?`
338
+ `:g;c=e.split(h).map(x=>x.trim()).filter(Boolean)}else c=e.trim().split(/\s+/).filter(Boolean);let l=t.children.filter(g=>g.tag==="arg"),d=new Set;for(let g of l.filter(h=>h.attrs.type==="flag")){let h=g.attrs.flag??`--${g.attrs.name}`,x=c.indexOf(h),S=g.attrs.name;S&&(x===-1?n.set(S,"false",void 0):(n.set(S,"true",void 0),d.add(x)))}let u=l.filter(g=>g.attrs.type!=="flag"),m=c.filter((g,h)=>!d.has(h)),p=0;for(let g=0;g<u.length;g++){let h=u[g],x=h.attrs.name,S=h.attrs.type??"string",_=g===u.length-1;if(x){if(p>=m.length){if(!("optional"in h.attrs))throw new ht(`Missing required argument '${x}' (type: ${S})`);n.set(x,"",void 0);continue}if(S==="string"&&_)n.set(x,m.slice(p).join(" "),void 0),p=m.length;else if(S==="number"){let P=m[p++],k=Number(P);if(isNaN(k))throw new ht(`Argument '${x}' expected a number, got '${P}'`);n.set(x,String(k),void 0)}else if(S==="boolean"){let P=m[p++].toLowerCase();if(P!=="true"&&P!=="false")throw new ht(`Argument '${x}' expected true/false, got '${P}'`);n.set(x,P,void 0)}else n.set(x,m[p++]??"",void 0)}}let f=m.slice(p).join(" ");if(f){if(i)throw new ht(`Unexpected extra arguments: '${f}'`);s&&n.set("_extra",f,void 0)}}var ht,Hs=N(()=>{"use strict";ht=class extends Error{constructor(e){super(e),this.name="WxpArgumentsError"}}});function gs(t,e,n){switch(t.position){case"project":return Ye.default.resolve(e,t.path);case"pkg":return Ye.default.resolve(n,t.path);case"absolute":return Ye.default.resolve(t.path)}}function Xs(t,e,n,r){let s=Ye.default.resolve(t),i=`${Ye.default.sep}.planning`;if(s.includes(`${i}${Ye.default.sep}`)||s.endsWith(i))return{ok:!1,reason:".planning/ files are never processed by WXP (hard security invariant)"};for(let o of e.untrustedPaths){let a=gs(o,n,r);if(s.startsWith(a+Ye.default.sep)||s===a)return{ok:!1,reason:`File '${t}' is in an explicitly untrusted path: ${a}`}}for(let o of e.trustedPaths){let a=gs(o,n,r);if(s.startsWith(a+Ye.default.sep)||s===a)return{ok:!0}}return{ok:!1,reason:`File '${t}' is not in a trusted WXP path.`}}function Yr(t,e){let n=Ye.default.basename(t);return e.shellBanlist.includes(n)?{ok:!1,reason:`Command '${n}' is explicitly banned by WXP security config.`}:e.shellAllowlist.includes(n)?{ok:!0}:{ok:!1,reason:`Command '${n}' is not in the WXP shell allowlist. Allowed: ${e.shellAllowlist.join(", ")}`}}var Ye,Jr,Yt=N(()=>{"use strict";Ye=W(require("path")),Jr=["pi-gsd-tools","git","node","cat","ls","echo","find"]});function hs(t,e){if(t.attrs.string!==void 0)return t.attrs.string;if(t.attrs.name!==void 0){let n=e.resolve(t.attrs.name)??"",r=t.attrs.wrap;return r?`${r}${n}${r}`:n}return t.attrs.value!==void 0?t.attrs.value:""}function Xr(t,e,n){let r=t.attrs.command??"",s=Yr(r,n);if(!s.ok)throw new yt(r,"",e.snapshot(),s.reason);let i=t.children.find(u=>u.tag==="args"),o=t.children.find(u=>u.tag==="outs"),a=i?i.children.filter(u=>u.tag==="arg").map(u=>hs(u,e)):[],c=o?o.children.some(u=>u.tag==="suppress-errors"):!1,l=o?o.children.filter(u=>u.tag==="out"&&u.attrs.name).map(u=>u.attrs.name):[],d="";try{d=(0,Hr.execFileSync)(r,a,{encoding:"utf8",timeout:n.shellTimeoutMs,windowsHide:!0}).trim()}catch(u){if(c){for(let f of l)e.set(f,"",void 0);return}let m=u,p=(m.stderr??m.message??String(u)).trim();throw new yt(r,p,e.snapshot(),`Shell '${r} ${a.join(" ")}' failed: ${p}`)}l.length>0&&e.set(l[0],d,void 0)}var Hr,yt,ys=N(()=>{"use strict";Hr=require("child_process");Yt();yt=class extends Error{constructor(n,r,s,i){super(i);this.command=n;this.stderr=r;this.variableSnapshot=s;this.name="WxpShellError"}command;stderr;variableSnapshot}});function Zr(t,e){if(t.attrs.op!=="split")throw new xt('<string-op> only op="split" is supported in v1');let r=t.children.find(m=>m.tag==="args"),s=t.children.find(m=>m.tag==="outs");if(!r||!s)throw new xt("<string-op> requires <args> and <outs>");let i=r.children.filter(m=>m.tag==="arg"),o=s.children.filter(m=>m.tag==="out"),a=i[0],c=i[1];if(!a)throw new xt('<string-op op="split"> requires at least 2 <arg> children');let l=hs(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?hs(c,e):"",u=l.split(d);o.forEach((m,p)=>{let f=m.attrs.name;f&&e.set(f,u[p+1]??u[p]??"",void 0)})}var xt,Zs=N(()=>{"use strict";ys();xt=class extends Error{constructor(e){super(e),this.name="WxpStringOpError"}}});function xs(t,e){return t.attrs.name?e.resolve(t.attrs.name)??"":t.attrs.value!==void 0?t.attrs.value:""}function Kr(t){return t.attrs.type==="number"}function Oa(t,e){let n=t.children.find(a=>a.tag==="left"),r=t.children.find(a=>a.tag==="right");if(!n||!r)return!1;if(Kr(n)||Kr(r)){let a=Number(xs(n,e)),c=Number(xs(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=xs(n,e),o=xs(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)):Oa(t,e)}function Qr(t,e){let n=t.children.find(s=>s.tag==="condition");if(!n)return!1;let r=n.children.find(s=>Ht.has(s.tag));return r?Xt(r,e):!1}function ei(t,e){let n=t.children.find(r=>Ht.has(r.tag));return n?Xt(n,e):!0}var Da,Ht,ti=N(()=>{"use strict";Da=new Set(["equals","not-equals","starts-with","contains","less-than","greater-than","less-than-or-equal","greater-than-or-equal"]),Ht=new Set([...Da,"and","or"])});function Na(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 Wa(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 qa(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 La(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=gs(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 Ua(t,e,n){let r=t.attrs.var??"",s=t.attrs.item??"",i=t.children.find(l=>l.tag==="where"),o=t.children.find(l=>l.tag==="sort-by"),a=t.children.filter(l=>l.tag!=="where"&&l.tag!=="sort-by"),c=e.getArray(r);if(c){if(i&&(c=c.filter(l=>(e.set(s,l,void 0),ei(i,e)))),o){let l=o.attrs.key??"",d=o.attrs.type??"string",u=o.attrs.order??"asc";c=[...c].sort((m,p)=>{e.set(s,m,void 0);let f=e.resolve(`${s}.${l}`)??e.resolve(l)??"";e.set(s,p,void 0);let g=e.resolve(`${s}.${l}`)??e.resolve(l)??"",h=d==="number"?Number(f)-Number(g):f.localeCompare(g);return u==="desc"?-h:h})}for(let l of c){e.set(s,l,void 0);for(let d of a)Ks(d,e,n)}}}function Ks(t,e,n){switch(t.tag){case"shell":Xr(t,e,n.config);break;case"string-op":Zr(t,e);break;case"json-parse":Wa(t,e);break;case"read-file":qa(t,e);break;case"write-file":La(t,e,n);break;case"display":Na(t,e,n);break;case"for-each":Ua(t,e,n);break;case"if":{let r=Qr(t,e),s=t.children.find(a=>a.tag==="then"),i=t.children.find(a=>a.tag==="else"),o=r?s:i;if(o)for(let a of o.children)Ks(a,e,n);break}case"gsd-execute":Qs(t,e,n);break;default:break}}function Qs(t,e,n){try{for(let r of t.children)Ks(r,e,n)}catch(r){throw r instanceof yt||r instanceof Error?new Ss(r,e.snapshot(),`Execution failed: ${r.message}`):r}}var Zt,Kt,Ss,er=N(()=>{"use strict";Zt=W(require("fs")),Kt=W(require("path"));ys();Zs();ti();Yt();Ss=class extends Error{constructor(n,r,s){super(s);this.cause=n;this.variableSnapshot=r;this.name="WxpExecutionError"}cause;variableSnapshot}});function ni(t,e){let n=ft(t),r=/<gsd-paste\s+name="([^"]+)"\s*\/>/g,s=[],i;for(;(i=r.exec(t))!==null;)gt(i.index,n)||s.push({index:i.index,full:i[0],name:i[1]});for(let a of s)if(e.get(a.name)===void 0)throw new bs(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 bs,tr=N(()=>{"use strict";Ys();bs=class extends Error{constructor(n,r){super(`<gsd-paste name="${n}" /> references undefined variable '${n}'`);this.variableName=n;this.variableSnapshot=r;this.name="WxpPasteError"}variableName;variableSnapshot}});function ri(t,e,n,r,s,i="",o=za){let a=Xs(e,n,r,s);if(!a.ok)throw new St(e,new Error(a.reason),{},[],[]);return Ga(t,e,n,r,s,i,o)}function Ga(t,e,n,r,s,i,o){let a=zr(),c=[],l=t,d={config:n,projectRoot:r,pkgRoot:s,onDisplay:o};for(let u=0;u<Va;u++){let p=Jt(l).filter(g=>g.node.tag!=="gsd-version");if(p.length===0)break;let f=p.map(g=>g.node.tag);try{let g=!1;for(let x of Jt(l)){if(x.node.tag!=="gsd-include"||gt(x.start,ft(l)))continue;let S=x.node.attrs.path;if(!S)continue;let _=vs.default.resolve(r,S),P=Xs(_,n,r,s);if(!P.ok)throw new Error(`Include rejected: ${P.reason}`);let k=si.default.readFileSync(_,"utf8"),C=vs.default.basename(_,vs.default.extname(_));for(let $ of x.node.children)if($.tag==="gsd-arguments")for(let q of $.children.filter(O=>O.tag==="arg")){let O=q.attrs.name,U=q.attrs.as;if(O&&U){let Y=a.get(O);Y!==void 0&&a.set(U,Y,C)}}let L="include-arguments"in x.node.attrs?`
339
+ ${i}`:"";l=fs(l,x.start,x.end,k+L),c.push("gsd-include"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-arguments"&&!gt(x.start,ft(l))){Br(x.node,i,a),l=fs(l,x.start,x.end,""),c.push("gsd-arguments"),g=!0;break}if(g)continue;for(let x of Jt(l))if(x.node.tag==="gsd-execute"&&!gt(x.start,ft(l))){Qs(x.node,a,d),l=fs(l,x.start,x.end,""),c.push("gsd-execute"),g=!0;break}if(g)continue;let h=ni(l,a);if(h!==l){l=h,c.push("gsd-paste");continue}break}catch(g){if(g instanceof St)throw g;let h=g instanceof Error?g:new Error(String(g));throw new St(e,h,a.snapshot(),f,c)}}return l}var si,vs,Va,za,St,ii=N(()=>{"use strict";si=W(require("fs")),vs=W(require("path"));Ys();Gr();Hs();er();tr();Yt();er();ys();tr();Zs();Hs();Va=50,za=()=>{},St=class extends Error{constructor(n,r,s,i,o){super(["WXP Processing Error",`File: ${n}`,`Error: ${r.message}`,`Variable Namespace: ${JSON.stringify(s,null,2)}`,`Pending Operations: [${i.join(", ")}]`,`Completed Operations: [${o.join(", ")}]`].join(`
340
+ `));this.filePath=n;this.cause=r;this.variableSnapshot=s;this.pendingOperations=i;this.completedOperations=o;this.name="WxpProcessingError"}filePath;cause;variableSnapshot;pendingOperations;completedOperations}});var bt,oi,nr,_s,ai=N(()=>{"use strict";bt=require("@oclif/core"),oi=require("@oclif/core"),nr=W(require("path"));ii();Yt();_s=class t extends oi.Command{static description="Process WXP tags in a workflow file";static args={file:bt.Args.string({description:"File to process",required:!1})};static flags={input:bt.Flags.string({description:"Input content string (alternative to file)"}),arguments:bt.Flags.string({description:"Raw $ARGUMENTS string",default:""}),"project-root":bt.Flags.string({description:"Project root directory",default:process.cwd()}),"pkg-root":bt.Flags.string({description:"Package root directory",default:process.cwd()})};async run(){let{flags:e,args:n}=await this.parse(t),r,s;if(e.input!==void 0)r=e.input,s=nr.default.join(e["project-root"],".pi","gsd","workflows","_inline.md");else if(n.file){let o=await import("fs");s=nr.default.resolve(n.file),r=o.default.readFileSync(s,"utf8")}else{this.error("Provide a file argument or --input string");return}let i={trustedPaths:[{position:"project",path:".pi/gsd"},{position:"pkg",path:".gsd/harnesses/pi/get-shit-done"}],untrustedPaths:[],shellAllowlist:[...Jr],shellBanlist:[],shellTimeoutMs:3e4};try{let o=ri(r,s,i,e["project-root"],e["pkg-root"],e.arguments);process.stdout.write(o)}catch(o){throw o instanceof St&&this.error(o.message,{exit:1}),o}}}});var ci={};he(ci,{AuditUatCommand:()=>Bn,CommitCommand:()=>ns,ConfigEnsureSectionCommand:()=>Rn,ConfigGetCommand:()=>Cn,ConfigNewProjectCommand:()=>jn,ConfigSetCommand:()=>$n,ConfigSetModelProfileCommand:()=>An,FrontmatterGetCommand:()=>ss,FrontmatterMergeCommand:()=>is,FrontmatterSetCommand:()=>rs,InitCommand:()=>bn,MilestoneCompleteCommand:()=>Wn,PhaseAddCommand:()=>Fn,PhaseCompleteCommand:()=>Tn,PhaseInsertCommand:()=>Mn,PhaseNextDecimalCommand:()=>En,PhasePlanIndexCommand:()=>Dn,PhaseRemoveCommand:()=>In,ProgressCommand:()=>ls,RequirementsMarkCompleteCommand:()=>qn,RoadmapAnalyzeCommand:()=>wn,RoadmapGetPhaseCommand:()=>kn,RoadmapUpdatePlanProgressCommand:()=>Pn,ScaffoldCommand:()=>es,StateAdvancePlanCommand:()=>fn,StateGetCommand:()=>un,StateJsonCommand:()=>dn,StateLoadCommand:()=>gn,StatePatchCommand:()=>pn,StateUpdateCommand:()=>mn,StateUpdateProgressCommand:()=>hn,StatsCommand:()=>ds,SummaryExtractCommand:()=>ps,TemplateFillCommand:()=>cs,TemplateSelectCommand:()=>as,TodoCompleteCommand:()=>us,TodoMatchPhaseCommand:()=>ms,ValidateAgentsCommand:()=>zn,ValidateConsistencyCommand:()=>Un,ValidateHealthCommand:()=>Vn,VerifyCommand:()=>Gn,WorkstreamCompleteCommand:()=>Xn,WorkstreamCreateCommand:()=>Jn,WorkstreamGetCommand:()=>Kn,WorkstreamListCommand:()=>Yn,WorkstreamProgressCommand:()=>Qn,WorkstreamSetCommand:()=>Zn,WorkstreamStatusCommand:()=>Hn,WxpProcessCommand:()=>_s});var li=N(()=>{"use strict";br();_r();kr();Ar();jr();Rr();Dr();Or();Nr();Wr();qr();Lr();Ur();ai()});var di=ki(($d,Ba)=>{Ba.exports={name:"pi-gsd",version:"2.0.8",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 ws={};he(ws,{cmdExtractMessages:()=>Za,cmdProfileSample:()=>Ka,cmdScanSessions:()=>Xa});function sr(t){if(t)return t;let e=process.env.HOME??"",n=Ie.join(e,".agent","projects");return ee.existsSync(n)?n:Ie.join(e,".claude","projects")}function rr(){let t=process.env.HOME??"";return Ie.join(t,".pi","agent","sessions")}function ir(t){return t.startsWith("--")&&t.endsWith("--")?"/"+t.slice(2,-2).replace(/-/g,"/"):t}function Ja(t){try{let e=ee.readFileSync(t,"utf-8").split(`
341
341
  `).find(r=>r.trim().length>0);if(!e)return!1;let n=JSON.parse(e);return n.type==="session"&&"version"in n}catch{return!1}}function Ya(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 Ha(t){try{let e=ee.readFileSync(t,"utf-8").split(`
342
342
  `).filter(Boolean),n=[];for(let r of e)try{let s=JSON.parse(r);s.type==="message"&&s.message&&n.push(s)}catch{}return n}catch{return[]}}async function Xa(t,e,n){let s=(e.harness??null)==="pi",i=rr(),o=ee.existsSync(i),a=[];if(o)try{let m=ee.readdirSync(i,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=Ie.join(i,p.name),g=ee.readdirSync(f).filter(h=>h.endsWith(".jsonl"));a.push({name:p.name,sessions:g.length,path:f,source:"pi",cwd:ir(p.name)})}}catch{}let c=sr(s&&!t?null:t),l=!s||t?ee.existsSync(c):!1,d=[];if(l&&(!s||t))try{let m=ee.readdirSync(c,{withFileTypes:!0}).filter(p=>p.isDirectory());for(let p of m){let f=Ie.join(c,p.name),g=ee.readdirSync(f).filter(h=>h.endsWith(".jsonl")||h.endsWith(".json"));d.push({name:p.name,sessions:g.length,path:f,source:"claude"})}}catch{}let u=s?[...a,...d]:[...d,...a];if(u.length===0){let m=[];o?m.push(i):m.push(i+" (not found)"),s||m.push(l?c:c+" (not found)"),y({available:!1,reason:`No sessions found. Searched: ${m.join(", ")}`,projects:[],count:0},n);return}y({available:!0,pi_base:o?i:null,claude_base:l?c:null,projects:u,count:u.length},n)}async function Za(t,e,n,r){let s=rr(),i=null,o="claude";if(ee.existsSync(s)){let d=Ie.join(s,t);if(ee.existsSync(d))i=d,o="pi";else try{let u=ee.readdirSync(s,{withFileTypes:!0}).filter(m=>m.isDirectory());for(let m of u){let p=ir(m.name);if(p.endsWith("/"+t)||p===t||m.name===t){i=Ie.join(s,m.name),o="pi";break}}}catch{}}if(!i){let d=sr(r),u=Ie.join(d,t);ee.existsSync(u)&&(i=u,o="claude")}if(!i){y({error:`Project not found: ${t}`,available_projects:[]},n);return}let a=[],c=ee.readdirSync(i).filter(d=>d.endsWith(".jsonl")),l=e.limit??null;for(let d of c){if(e.sessionId&&!d.includes(e.sessionId))continue;let u=Ie.join(i,d);if(o==="pi"||Ja(u))try{let m=ee.readFileSync(u,"utf-8").split(`
343
343
  `).filter(Boolean);for(let p of m)try{let f=JSON.parse(p);if(f.type==="message"&&f.message&&(a.push(f.message),l&&a.length>=l))break}catch{}}catch{}else try{let m=ee.readFileSync(u,"utf-8").split(`
@@ -379,9 +379,9 @@ See \`.planning/PROJECT.md\` for project overview.
379
379
  ## GSD Integration
380
380
 
381
381
  This project uses GSD (Get Shit Done) for structured development. Run \`/gsd-help\` to see available commands.
382
- `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:G(Ne.default.relative(t,s))},n,s)}var nt,Ne,Mt=N(()=>{"use strict";nt=W(require("fs")),Ne=W(require("path"));ge()});var Te=W(require("fs")),It=W(require("path"));ge();var fr=require("jsonpath-plus");function Fs(t,e,n){let r=t;if(n&&(r=(0,fr.JSONPath)({path:n,json:t,wrap:!1})),e==="json")return JSON.stringify(r,null,2);let{encode:s}=require("@toon-format/toon");return s(r)}async function ic(){let{StateJsonCommand:t,StateGetCommand:e,StateUpdateCommand:n,StatePatchCommand:r,StateAdvancePlanCommand:s,StateLoadCommand:i,StateUpdateProgressCommand:o,InitCommand:a,RoadmapAnalyzeCommand:c,RoadmapGetPhaseCommand:l,RoadmapUpdatePlanProgressCommand:d,ConfigGetCommand:u,ConfigSetCommand:m,ConfigSetModelProfileCommand:p,ConfigNewProjectCommand:f,ConfigEnsureSectionCommand:g,PhaseNextDecimalCommand:h,PhaseAddCommand:x,PhaseInsertCommand:S,PhaseRemoveCommand:_,PhaseCompleteCommand:P,PhasePlanIndexCommand:k,MilestoneCompleteCommand:C,RequirementsMarkCompleteCommand:L,ValidateConsistencyCommand:$,ValidateHealthCommand:q,ValidateAgentsCommand:O,VerifyCommand:U,AuditUatCommand:Y,WorkstreamCreateCommand:le,WorkstreamListCommand:be,WorkstreamStatusCommand:te,WorkstreamCompleteCommand:pe,WorkstreamSetCommand:De,WorkstreamGetCommand:We,WorkstreamProgressCommand:Tt,ScaffoldCommand:Cs,CommitCommand:en,FrontmatterGetCommand:tn,FrontmatterSetCommand:ar,FrontmatterMergeCommand:nn,TemplateSelectCommand:Ae,TemplateFillCommand:je,ProgressCommand:pi,StatsCommand:fi,TodoCompleteCommand:gi,TodoMatchPhaseCommand:hi,SummaryExtractCommand:yi,WxpProcessCommand:xi}=await Promise.resolve().then(()=>(li(),ci));return{"state json":t,"state get":e,"state update":n,"state patch":r,"state advance-plan":s,"state load":i,"state update-progress":o,init:a,"roadmap analyze":c,"roadmap get-phase":l,"roadmap update-plan-progress":d,"config-get":u,"config-set":m,"config-set-model-profile":p,"config-new-project":f,"config-ensure-section":g,"phase next-decimal":h,"phase add":x,"phase insert":S,"phase remove":_,"phase complete":P,"phase-plan-index":k,"milestone complete":C,"requirements mark-complete":L,"validate consistency":$,"validate health":q,"validate agents":O,verify:U,"audit-uat":Y,"workstream create":le,"workstream list":be,"workstream status":te,"workstream complete":pe,"workstream set":De,"workstream get":We,"workstream progress":Tt,scaffold:Cs,commit:en,"frontmatter get":tn,"frontmatter set":ar,"frontmatter merge":nn,"template select":Ae,"template fill":je,progress:pi,stats:fi,"todo complete":gi,"todo match-phase":hi,"summary-extract":yi,"wxp process":xi}}function oc(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 ui(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 ac(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 cc(){let t=process.argv.slice(2);if(t[0]==="--version"||t[0]==="-v"){let{version:f}=di();process.stdout.write(`pi-gsd-tools v${f}
382
+ `;nt.default.writeFileSync(s,o,"utf-8"),y({written:!0,path:G(Ne.default.relative(t,s))},n,s)}var nt,Ne,Mt=N(()=>{"use strict";nt=W(require("fs")),Ne=W(require("path"));ge()});var Te=W(require("fs")),It=W(require("path"));ge();var fr=require("jsonpath-plus");function Fs(t,e,n){let r=t;if(n&&(r=(0,fr.JSONPath)({path:n,json:t,wrap:!1})),e==="json")return JSON.stringify(r,null,2);let{encode:s}=require("@toon-format/toon");return s(r)}async function ic(){let{StateJsonCommand:t,StateGetCommand:e,StateUpdateCommand:n,StatePatchCommand:r,StateAdvancePlanCommand:s,StateLoadCommand:i,StateUpdateProgressCommand:o,InitCommand:a,RoadmapAnalyzeCommand:c,RoadmapGetPhaseCommand:l,RoadmapUpdatePlanProgressCommand:d,ConfigGetCommand:u,ConfigSetCommand:m,ConfigSetModelProfileCommand:p,ConfigNewProjectCommand:f,ConfigEnsureSectionCommand:g,PhaseNextDecimalCommand:h,PhaseAddCommand:x,PhaseInsertCommand:S,PhaseRemoveCommand:_,PhaseCompleteCommand:P,PhasePlanIndexCommand:k,MilestoneCompleteCommand:C,RequirementsMarkCompleteCommand:L,ValidateConsistencyCommand:$,ValidateHealthCommand:q,ValidateAgentsCommand:O,VerifyCommand:U,AuditUatCommand:Y,WorkstreamCreateCommand:le,WorkstreamListCommand:be,WorkstreamStatusCommand:te,WorkstreamCompleteCommand:pe,WorkstreamSetCommand:De,WorkstreamGetCommand:We,WorkstreamProgressCommand:Tt,ScaffoldCommand:Cs,CommitCommand:Qt,FrontmatterGetCommand:en,FrontmatterSetCommand:ar,FrontmatterMergeCommand:tn,TemplateSelectCommand:Ae,TemplateFillCommand:je,ProgressCommand:pi,StatsCommand:fi,TodoCompleteCommand:gi,TodoMatchPhaseCommand:hi,SummaryExtractCommand:yi,WxpProcessCommand:xi}=await Promise.resolve().then(()=>(li(),ci));return{"state json":t,"state get":e,"state update":n,"state patch":r,"state advance-plan":s,"state load":i,"state update-progress":o,init:a,"roadmap analyze":c,"roadmap get-phase":l,"roadmap update-plan-progress":d,"config-get":u,"config-set":m,"config-set-model-profile":p,"config-new-project":f,"config-ensure-section":g,"phase next-decimal":h,"phase add":x,"phase insert":S,"phase remove":_,"phase complete":P,"phase-plan-index":k,"milestone complete":C,"requirements mark-complete":L,"validate consistency":$,"validate health":q,"validate agents":O,verify:U,"audit-uat":Y,"workstream create":le,"workstream list":be,"workstream status":te,"workstream complete":pe,"workstream set":De,"workstream get":We,"workstream progress":Tt,scaffold:Cs,commit:Qt,"frontmatter get":en,"frontmatter set":ar,"frontmatter merge":tn,"template select":Ae,"template fill":je,progress:pi,stats:fi,"todo complete":gi,"todo match-phase":hi,"summary-extract":yi,"wxp process":xi}}function oc(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 ui(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 ac(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 cc(){let t=process.argv.slice(2);if(t[0]==="--version"||t[0]==="-v"){let{version:f}=di();process.stdout.write(`pi-gsd-tools v${f}
383
383
  `);return}if(t[0]==="--help"||t[0]==="-h"){mi();return}let e=process.cwd();{let f=t.find(h=>h.startsWith("--cwd=")),g=t.indexOf("--cwd");if(f){let h=f.slice(6).trim();h||b("Missing value for --cwd"),t.splice(t.indexOf(f),1),e=It.default.resolve(h)}else if(g!==-1){let h=t[g+1];(!h||h.startsWith("--"))&&b("Missing value for --cwd"),t.splice(g,2),e=It.default.resolve(h)}(!Te.default.existsSync(e)||!Te.default.statSync(e).isDirectory())&&b(`Invalid --cwd: ${e}`)}if(!Te.default.existsSync(It.default.join(e,".planning"))){let f=qt(e);f!==e&&(e=f)}{let f=t.find(x=>x.startsWith("--ws=")),g=t.indexOf("--ws"),h=null;f?(h=f.slice(5).trim(),h||b("Missing value for --ws"),t.splice(t.indexOf(f),1)):g!==-1?(h=t[g+1],(!h||h.startsWith("--"))&&b("Missing value for --ws"),t.splice(g,2)):process.env.GSD_WORKSTREAM?h=process.env.GSD_WORKSTREAM.trim():h=He(e),h&&!/^[a-zA-Z0-9_-]+$/.test(h)&&b("Invalid workstream name"),h&&(process.env.GSD_WORKSTREAM=h)}let n=t.indexOf("--raw"),r=n!==-1;n!==-1&&t.splice(n,1);let s="json";{let f=t.findIndex(g=>g==="--output"||g==="-o");if(f!==-1){let g=t[f+1];(!g||g.startsWith("--"))&&b("Missing value for --output"),g!=="json"&&g!=="toon"&&b('--output must be "json" or "toon"'),s=g,t.splice(f,2)}}let i=null,o=null;{let f=t.findIndex(g=>g==="--pick"||g==="-p");f!==-1&&(i=t[f+1],(!i||i.startsWith("--"))&&b("Missing value for --pick"),t.splice(f,2))}if(!t[0]){mi();return}let a=[...t,"--cwd",e];r&&a.push("--raw");let c=await ic(),l=ac(t,c);if(l){let f=l.split(" ").length,g=[...t.slice(f),"--cwd",e];if(r&&g.push("--raw"),o||i||s!=="json"){let h=Te.default.writeSync.bind(Te.default),x=[];Te.default.writeSync=(S,_,...P)=>S===1?(x.push(String(_)),String(_).length):h(S,_,...P);try{await c[l].run(g)}finally{Te.default.writeSync=h;let S=x.join("");try{let _=JSON.parse(S),P=_;o&&(P=ui(_,o)??""),h(1,Fs(P,s,i??void 0))}catch{h(1,S)}}return}await c[l].run(g);return}let d=t[0],u=t;new Set(["generate-slug","current-timestamp","verify-path-exists","verify-summary","template","frontmatter","generate-model-profiles-md"]).has(d)||(e=Wt(e));let p=async()=>{await lc(d,u,e,r)};if(o||i||s!=="json"){let f=Te.default.writeSync.bind(Te.default),g=[];Te.default.writeSync=(h,x,...S)=>h===1?(g.push(String(x)),String(x).length):f(h,x,...S);try{await p()}finally{Te.default.writeSync=f;let h=g.join("");try{let x=JSON.parse(h),S=x;o&&(S=ui(x,o)??""),f(1,Fs(S,s,i??void 0))}catch{f(1,h)}}return}await p()}function mi(){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
384
  `)+`
385
- `)}async function lc(t,e,n,r){switch(t){case"resolve-model":{let{cmdResolveModel:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"find-phase":{let{cmdFindPhase:s}=await Promise.resolve().then(()=>(et(),Qe));s(n,e[1],r);break}case"commit-to-subrepo":{let{cmdCommitToSubrepo:s}=await Promise.resolve().then(()=>(Se(),xe)),i=e.indexOf("--files"),o=e.slice(1,i!==-1?i:e.length).filter(c=>!c.startsWith("--")),a=i!==-1?e.slice(i+1).filter(c=>!c.startsWith("--")):[];s(n,o.join(" ")||void 0,a,r);break}case"verify-summary":{let{cmdVerifySummary:s}=await Promise.resolve().then(()=>(Rt(),jt)),i=e[2]?parseInt(e[2],10):2;s(n,e[1],i,r);break}case"generate-slug":{let{cmdGenerateSlug:s}=await Promise.resolve().then(()=>(Se(),xe));s(e[1],r);break}case"current-timestamp":{let{cmdCurrentTimestamp:s}=await Promise.resolve().then(()=>(Se(),xe));s(e[1],r);break}case"list-todos":{let{cmdListTodos:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"verify-path-exists":{let{cmdVerifyPathExists:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,e[1],r);break}case"phases":{let{cmdPhasesList:s}=await Promise.resolve().then(()=>(et(),Qe));s(n,{},r);break}case"requirements":{let{cmdRequirementsMarkComplete:s}=await Promise.resolve().then(()=>(Wn(),Nn));e[1]==="mark-complete"?s(n,e.slice(2),r):b("Unknown requirements subcommand. Available: mark-complete");break}case"uat":{let s=await Promise.resolve().then(()=>(Gs(),zs));e[1]==="render-checkpoint"?s.cmdRenderCheckpoint(n,oc(e,["file"]),r):b("Unknown uat subcommand. Available: render-checkpoint");break}case"state-snapshot":{let{cmdStateSnapshot:s}=await Promise.resolve().then(()=>(Fe(),Ze));s(n,r);break}case"agent-skills":{let{cmdAgentSkills:s}=await Promise.resolve().then(()=>(Sn(),xn));s(n,e[1],r);break}case"history-digest":{let{cmdHistoryDigest:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,r);break}case"scan-sessions":{let{cmdScanSessions:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--path"),o=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{verbose:e.includes("--verbose"),json:e.includes("--json"),harness:o!==-1?e[o+1]:null},r);break}case"extract-messages":{let{cmdExtractMessages:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--session"),o=e.indexOf("--limit"),a=e.indexOf("--path"),c=l=>l.startsWith("--")&&l.endsWith("--")&&l.length>4;(!e[1]||e[1].startsWith("--")&&!c(e[1]))&&b("Usage: pi-gsd-tools extract-messages <project> [--session <id>] [--limit N]"),await s(e[1],{sessionId:i!==-1?e[i+1]:null,limit:o!==-1?parseInt(e[o+1],10):null},r,a!==-1?e[a+1]:null);break}case"profile-sample":{let{cmdProfileSample:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),c=e.indexOf("--max-chars"),l=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{limit:o!==-1?parseInt(e[o+1],10):150,maxPerProject:a!==-1?parseInt(e[a+1],10):null,harness:l!==-1?e[l+1]:null,maxChars:c!==-1?parseInt(e[c+1],10):500},r);break}case"write-profile":{let{cmdWriteProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--input"),o=e.indexOf("--output");i===-1&&b("--input <analysis-json-path> is required"),s(n,{input:e[i+1],output:o!==-1?e[o+1]:null},r);break}case"profile-questionnaire":{let{cmdProfileQuestionnaire:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--answers");s({answers:i!==-1?e[i+1]:null},r);break}case"generate-dev-preferences":{let{cmdGenerateDevPreferences:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output"),a=e.indexOf("--stack");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,stack:a!==-1?e[a+1]:null},r);break}case"generate-claude-profile":{let{cmdGenerateClaudeProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,global:e.includes("--global")},r);break}case"generate-claude-md":{let{cmdGenerateClaudeMd:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--output"),o=e.indexOf("--harness");s(n,{output:i!==-1?e[i+1]:null,auto:e.includes("--auto"),force:e.includes("--force"),harness:o!==-1?e[o+1]:null},r);break}case"generate-model-profiles-md":{let{generateModelProfilesMd:s}=await Promise.resolve().then(()=>(Dt(),cr)),i=e.indexOf("--output"),o=s();if(e.includes("--stdout")){process.stdout.write(o);break}let a=i!==-1?It.default.resolve(e[i+1]):It.default.resolve(__dirname,"..","references","model-profiles.md");Te.default.writeFileSync(a,o,"utf-8"),r?process.stdout.write(a):process.stdout.write(`Wrote ${a}
386
- `);break}case"websearch":{let{cmdWebsearch:s}=await Promise.resolve().then(()=>(Se(),xe)),i=e.indexOf("--limit"),o=e.indexOf("--freshness");await s(e[1],{limit:i!==-1?parseInt(e[i+1],10):10,freshness:o!==-1?e[o+1]:null},r);break}case"map-codebase":{let{cmdInitMapCodebase:s}=await Promise.resolve().then(()=>(Sn(),xn));await s(n,r);break}case"new-project":case"new-milestone":case"plan-phase":case"execute-phase":case"verify-work":case"phase-op":case"milestone-op":case"resume":case"quick":case"manager":case"progress":case"new-workspace":case"list-workspaces":case"remove-workspace":{b(`Use: pi-gsd-tools init ${t} [args]`);break}default:b(`Unknown command: ${t}`)}}cc().catch(t=>{process.stderr.write("Fatal: "+t.message+`
385
+ `)}async function lc(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(()=>(Nn(),On));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(),zs));e[1]==="render-checkpoint"?s.cmdRenderCheckpoint(n,oc(e,["file"]),r):b("Unknown uat subcommand. Available: render-checkpoint");break}case"state-snapshot":{let{cmdStateSnapshot:s}=await Promise.resolve().then(()=>(Fe(),Ze));s(n,r);break}case"agent-skills":{let{cmdAgentSkills:s}=await Promise.resolve().then(()=>(xn(),yn));s(n,e[1],r);break}case"history-digest":{let{cmdHistoryDigest:s}=await Promise.resolve().then(()=>(Se(),xe));s(n,r);break}case"scan-sessions":{let{cmdScanSessions:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--path"),o=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{verbose:e.includes("--verbose"),json:e.includes("--json"),harness:o!==-1?e[o+1]:null},r);break}case"extract-messages":{let{cmdExtractMessages:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--session"),o=e.indexOf("--limit"),a=e.indexOf("--path"),c=l=>l.startsWith("--")&&l.endsWith("--")&&l.length>4;(!e[1]||e[1].startsWith("--")&&!c(e[1]))&&b("Usage: pi-gsd-tools extract-messages <project> [--session <id>] [--limit N]"),await s(e[1],{sessionId:i!==-1?e[i+1]:null,limit:o!==-1?parseInt(e[o+1],10):null},r,a!==-1?e[a+1]:null);break}case"profile-sample":{let{cmdProfileSample:s}=await Promise.resolve().then(()=>(ks(),ws)),i=e.indexOf("--path"),o=e.indexOf("--limit"),a=e.indexOf("--max-per-project"),c=e.indexOf("--max-chars"),l=e.indexOf("--harness");await s(i!==-1?e[i+1]:null,{limit:o!==-1?parseInt(e[o+1],10):150,maxPerProject:a!==-1?parseInt(e[a+1],10):null,harness:l!==-1?e[l+1]:null,maxChars:c!==-1?parseInt(e[c+1],10):500},r);break}case"write-profile":{let{cmdWriteProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--input"),o=e.indexOf("--output");i===-1&&b("--input <analysis-json-path> is required"),s(n,{input:e[i+1],output:o!==-1?e[o+1]:null},r);break}case"profile-questionnaire":{let{cmdProfileQuestionnaire:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--answers");s({answers:i!==-1?e[i+1]:null},r);break}case"generate-dev-preferences":{let{cmdGenerateDevPreferences:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output"),a=e.indexOf("--stack");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,stack:a!==-1?e[a+1]:null},r);break}case"generate-claude-profile":{let{cmdGenerateClaudeProfile:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--analysis"),o=e.indexOf("--output");s(n,{analysis:i!==-1?e[i+1]:null,output:o!==-1?e[o+1]:null,global:e.includes("--global")},r);break}case"generate-claude-md":{let{cmdGenerateClaudeMd:s}=await Promise.resolve().then(()=>(Mt(),Ft)),i=e.indexOf("--output"),o=e.indexOf("--harness");s(n,{output:i!==-1?e[i+1]:null,auto:e.includes("--auto"),force:e.includes("--force"),harness:o!==-1?e[o+1]:null},r);break}case"generate-model-profiles-md":{let{generateModelProfilesMd:s}=await Promise.resolve().then(()=>(Dt(),cr)),i=e.indexOf("--output"),o=s();if(e.includes("--stdout")){process.stdout.write(o);break}let a=i!==-1?It.default.resolve(e[i+1]):It.default.resolve(__dirname,"..","references","model-profiles.md");Te.default.writeFileSync(a,o,"utf-8"),r?process.stdout.write(a):process.stdout.write(`Wrote ${a}
386
+ `);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(()=>(xn(),yn));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}`)}}cc().catch(t=>{process.stderr.write("Fatal: "+t.message+`
387
387
  `),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gsd",
3
- "version": "2.0.7",
3
+ "version": "2.0.8",
4
4
  "description": "Get Shit Done - Unofficial port of the renowned AI-native project-planning spec-driven toolkit",
5
5
  "main": "dist/pi-gsd-tools.js",
6
6
  "bin": {