@pan-stack/cli 0.3.40 → 0.3.41

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.
package/bin/pan.js CHANGED
@@ -1083,7 +1083,7 @@ init();
1083
1083
  `).trim()),m.push("```"),m.push("")}}return m.push("---"),m.push(""),m.push(p("STATS_REVIEW_MD_AI_H2")),m.push(""),m.push(p("STATS_REVIEW_MD_AI_INTRO")),m.push(""),m.push(p("STATS_REVIEW_MD_AI_CRITERIA")),m.push(""),m.push(p("STATS_REVIEW_MD_AI_OUTRO")),m.join(`
1084
1084
  `)}function vC(t){try{return(0,SC.execFileSync)("git",t,{encoding:"utf8",maxBuffer:512*1024*1024})}catch(e){let n=e instanceof Error?e.message:String(e);throw new Error(p("STATS_GIT_ERROR__MSG",{msg:n.split(`
1085
1085
  `)[0]??""}))}}function dG(t){let e=[],n=null;for(let r of t.split(`
1086
- `)){if(r.includes("")){n&&e.push(n);let[i,a,s,l,c]=r.split("");n={hash:i??"",date:a??"",name:s??"",email:l??"",subject:c||"",additions:0,deletions:0};continue}let o=r.match(/(\d+) insertion[s]?\(\+\)|(\d+) deletion[s]?\(-\)/g);if(o&&n)for(let i of o){let a=i.match(/(\d+) insertion/),s=i.match(/(\d+) deletion/);a?.[1]&&(n.additions+=parseInt(a[1],10)),s?.[1]&&(n.deletions+=parseInt(s[1],10))}}return n&&e.push(n),e}function fG(t){return String(t||"").replace(/\|/g,"\\|")}function AC(t,e){return zy.default.mkdirSync(wC.default.dirname(t),{recursive:!0}),zy.default.writeFileSync(t,e),t}var zy,wC,SC,TC=O(()=>{"use strict";zy=L(require("fs")),wC=L(require("path")),SC=require("child_process");Hp();Z()});var Vy={};he(Vy,{runStats:()=>mG});function pG(t){let e={_:[],open:!0,diff:!0};for(let n=0;n<t.length;n++){let r=t[n];r!==void 0&&(r==="--since"?e.since=t[++n]:r==="--from"?e.from=t[++n]:r==="--to"?e.to=t[++n]:r==="--member"||r==="-m"?e.member=t[++n]:r==="--project"||r==="-p"?e.project=t[++n]:r==="--port"?e.port=parseInt(t[++n]??"",10):r==="--out"||r==="-o"?e.out=t[++n]:r==="--no-open"?e.open=!1:r==="--no-diff"?e.diff=!1:r==="--head-only"?e.headOnly=!0:r==="--max-diff-lines"?e.maxDiffLines=parseInt(t[++n]??"",10):r.startsWith("--since=")?e.since=r.slice(8):e._.push(r))}return e}function Kp(){let t=Hs.default.join(NC.default.homedir(),".pan-code-graph");return zp.default.mkdirSync(t,{recursive:!0}),t}function Yy(){let t=Ss();if(t)return{repos:sC(t),source:`.project.yaml (${t.project})`};let e=ws(process.cwd());if(!e.length)throw new Error(p("STATS_NO_REPOS__CWD",{cwd:process.cwd()}));return console.log(p("STATS_FALLBACK_SCAN__CWD",{cwd:process.cwd()})),{repos:e,source:p("STATS_SOURCE_FALLBACK")}}function hG(){console.log(p("STATS_USAGE"))}async function mG(t){let e=pG(t),n=e._[0],r=n!==void 0&&["report","people","review"].includes(n)?e._.shift():"report";return e._[0]==="help"||e.help?hG():r==="review"?yG(e):r==="people"?bG(e):_G(e)}function gG(t){let{repos:e}=Yy(),n=eu(t),r=!t.headOnly,o=r?p("STATS_SCOPE_ALL_BRANCHES"):p("STATS_SCOPE_HEAD_ONLY");console.log(p("STATS_SCAN_RANGE__N_SCOPE_LABEL",{n:e.length,scope:o,label:n.label}));let{commits:i,repoStatus:a}=Gy(e,n,{allBranches:r}),s=Hy(Hs.default.join(Kp(),"alias-map.json"));return{repos:e,range:n,commits:i,repoStatus:a,aliasMap:s}}function _G(t){let{repos:e}=Yy(),n=eu({}),r=!t.headOnly,o=r?p("STATS_SCOPE_ALL_BRANCHES"):p("STATS_SCOPE_HEAD_ONLY");console.log(p("STATS_SCAN_FULL__N_SCOPE",{n:e.length,scope:o}));let{commits:i,repoStatus:a}=Gy(e,n,{allBranches:r}),s=Hy(Hs.default.join(Kp(),"alias-map.json")),l=i.map(h=>({e:Wp(h.email,s),n:h.name||h.email,t:h.ts,r:h.repoName,a:h.additions,d:h.deletions})),c=a.filter(h=>!h.available).map(h=>({name:h.name,reason:h.reason}));eu(t);let u={reposTotal:a.length,reposAvailable:a.filter(h=>h.available).length,unavailable:c,initialSince:t.since!=null?Number(t.since):null,initialFrom:t.from||null,initialTo:t.to||null,initialMembers:t.member?[t.member]:[]},d=gC(l,u),f=t.out||Hs.default.join(Kp(),"report.html");zp.default.writeFileSync(f,d),console.log(p("STATS_WROTE_REPORT__PATH_N",{path:f,n:l.length})),c.length&&console.log(p("STATS_UNAVAILABLE__N",{n:c.length})),EC(d,{port:t.port||4321,open:t.open})}function bG(t){let{commits:e,aliasMap:n}=gG(t),{members:r}=uC(e,n);console.log(p("STATS_PEOPLE_HEADER__N",{n:r.length}));for(let o of r)console.log(p("STATS_PEOPLE_ROW__N_NAME_EMAIL",{n:String(o.commits).padStart(5),name:o.name,email:o.email}))}function yG(t){if(!t.member||!t.project)throw new Error(p("STATS_REVIEW_NEED_FLAGS"));let{repos:e}=Yy(),n=e.find(s=>s.name===t.project);if(!n)throw new Error(p("STATS_REVIEW_NO_PROJECT__PROJECT_NAMES",{project:t.project,names:e.map(s=>s.name).join(", ")}));if(!zp.default.existsSync(n.dir))throw new Error(p("STATS_REVIEW_NOT_CLONED__PROJECT_DIR",{project:t.project,dir:n.dir}));let r=eu(t);console.log(p("STATS_REVIEW_BUILDING__MEMBER_PROJECT_LABEL",{member:t.member,project:t.project,label:r.label}));let o=kC(n,t.member,r,{withDiff:t.diff,maxDiffLines:t.maxDiffLines,allBranches:!t.headOnly}),i=`${t.project}_${t.member.replace(/[^a-z0-9]+/gi,"-")}`.toLowerCase(),a=t.out||Hs.default.join(Kp(),`review-${i}.md`);AC(a,o),console.log(p("STATS_REVIEW_WROTE__PATH",{path:a})),console.log(p("STATS_REVIEW_HINT"))}var zp,Hs,NC,qy=O(()=>{"use strict";zp=L(require("fs")),Hs=L(require("path")),NC=L(require("os"));Tn();lC();Hp();Wy();dC();_C();xC();TC();Z()});var CC=D((vue,EG)=>{EG.exports={name:"@pan-stack/cli",version:"0.3.40",description:"PAN Stack CLI \u2014 multi-repo git and project commands from .project.yaml",license:"SEE LICENSE IN LICENSE.txt",bin:{pan:"bin/pan.js"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},files:["bin","dist/agent-plugin"],scripts:{build:"node tools/pan-stack-cli/build.mjs","build:agent-plugin":"node tools/pan-stack-cli/build-agent-plugin.ts",prepare:"node tools/pan-stack-cli/build.mjs",prepublishOnly:"node tools/pan-stack-cli/build.mjs",test:'tsc --noEmit && tsc -p tsconfig.test.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.web.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.e2e.json --noEmit && node --test "tools/pan-stack-plan/test/*.test.ts" "tools/pan-stack-cli/test/*.test.ts" "tools/pan-lineage/test/*.test.ts" "tools/pan-harness/test/*.test.ts" "tools/pan-program/test/*.test.ts" "tools/pan-handover/test/*.test.ts" "agent-plugin/plugins/pan/test/*.test.mjs" && node --test "tools/pan-cicd/test/*.test.mjs"',"test:pan-cicd":'node tools/pan-stack-cli/build.mjs && node --test "tools/pan-cicd/test/*.test.mjs"',"test:pan-stack-plan":'node --test "tools/pan-stack-plan/test/*.test.ts"',"test:pan-stack-cli":'node --test "tools/pan-stack-cli/test/*.test.ts"',typecheck:"tsc --noEmit && tsc -p tsconfig.test.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.web.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.e2e.json --noEmit","build:web":"node tools/pan-stack-plan/build-web.mjs",pretest:"node tools/pan-stack-plan/build-web.mjs","test:e2e":"playwright test -c tools/pan-stack-plan/playwright.config.ts","test:pan-lineage":'node --test "tools/pan-lineage/test/*.test.ts"'},engines:{node:">=18"},keywords:["pan-stack","monorepo","git","cli"],devDependencies:{"@inquirer/core":"^11.2.1","@inquirer/prompts":"^8.5.2","@inquirer/testing":"^3.3.9","@playwright/test":"1.62.1","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-popover":"1.1.23","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-tooltip":"^1.2.16","@tailwindcss/cli":"4.3.3","@tailwindcss/typography":"0.5.20","@types/node":"22.18.8","@types/picomatch":"3.0.1","@types/react":"^19.2.18","@types/react-dom":"^19.2.5","@types/sanitize-html":"2.16.0","class-variance-authority":"0.7.1",clsx:"2.1.1",cmdk:"1.1.1","csv-parse":"7.0.1","csv-stringify":"6.8.1",esbuild:"0.28.1",marked:"15.0.12",picomatch:"4.0.2",react:"19.2.8","react-dom":"19.2.8","react-markdown":"10.1.0","remark-gfm":"4.0.1","sanitize-html":"2.16.0",serve:"^14.2.4","tailwind-merge":"3.6.0",tailwindcss:"4.3.3",typescript:"5.9.3",yaml:"2.6.1"},optionalDependencies:{"@pan-stack/powerpoint":"^0.1.0"}}});var IC={};he(IC,{runInteractiveMenu:()=>vG});function xG(t){let e=t,n=String(e&&`${String(e.name)} ${String(e.message)}`||"");return/ExitPromptError|force closed|SIGINT|cancel/i.test(n)}async function Jy({message:t,choices:e,hotkeys:n=[]}){try{return await We({message:t,choices:e,hotkeys:n})}catch(r){if(String(r?.message)!=="no-core")throw r;let o=await Sr();if(!o||typeof o.select!="function")return"__exit__";let i=n.map(s=>({name:`${s.key} ${s.label}`,value:s.value})),a=i.length?[...e,new o.Separator,...i]:e;return o.select({message:t,choices:a,pageSize:20,loop:!1,theme:Ut(!1)})}}async function vG({printUsage:t,version:e}={}){let n=await ip(),r=await Sr();if(!n&&(!r||typeof r.select!="function"))return!1;let o=$f().filter(i=>Cc(i).length>0).sort((i,a)=>Xr(i).localeCompare(Xr(a)));if(o.length===0)return console.log(p("NO_PAN_YAML_WITH_COMMANDS")),console.log(p("NO_PAN_YAML_BUT_GIT_STILL_WORKS")),!1;try{for(;;){let i=await Jy({message:p("MENU_SELECT_PROJECT"),choices:o.map((f,h)=>({name:Xr(f),value:h,description:`${Cc(f).length} ${p("COMMANDS_LABEL")} \xB7 ${f.root}`})),hotkeys:[{key:"h",label:p("HELP_LABEL"),value:"__help__"},{key:"v",label:p("VERSION_LABEL"),value:"__version__"},{key:"x",label:p("EXIT_LABEL"),value:"__exit__"}]});if(i==="__exit__")return!0;if(i==="__version__"){console.log(`@pan-stack/cli ${e||"?"}`);continue}if(i==="__help__"){typeof t=="function"&&t();continue}let a=typeof i=="number"?o[i]:void 0;if(!a)continue;let s=Cc(a),l=await Jy({message:`[${Xr(a)}] ${p("MENU_SELECT_COMMAND")}`,choices:s.map(f=>({name:f.name+(f.aliases&&f.aliases.length?` (${f.aliases.join(", ")})`:"")+(f.hasTargets?` [${f.targets.join("|")}]`:""),value:f.name,description:f.description||""})),hotkeys:[{key:"b",label:p("BACK_LABEL"),value:"__back__"},{key:"x",label:p("EXIT_LABEL"),value:"__exit__"}]});if(l==="__exit__")return!0;if(l==="__back__")continue;let c=a.commands[String(l)],u=[];if(c&&c.targets&&Object.keys(c.targets).length>0){let f=Object.keys(c.targets),h=await Jy({message:p("SELECT_TARGET__CMD",{cmd:l}),choices:[...f.map(m=>({name:m,value:m})),{name:p("DEFAULT_LABEL"),value:"__default__"}],hotkeys:[{key:"b",label:p("BACK_LABEL"),value:"__back__"}]});if(h==="__back__")continue;h!=="__default__"&&u.push(String(h))}console.error(`
1086
+ `)){if(r.includes("")){n&&e.push(n);let[i,a,s,l,c]=r.split("");n={hash:i??"",date:a??"",name:s??"",email:l??"",subject:c||"",additions:0,deletions:0};continue}let o=r.match(/(\d+) insertion[s]?\(\+\)|(\d+) deletion[s]?\(-\)/g);if(o&&n)for(let i of o){let a=i.match(/(\d+) insertion/),s=i.match(/(\d+) deletion/);a?.[1]&&(n.additions+=parseInt(a[1],10)),s?.[1]&&(n.deletions+=parseInt(s[1],10))}}return n&&e.push(n),e}function fG(t){return String(t||"").replace(/\|/g,"\\|")}function AC(t,e){return zy.default.mkdirSync(wC.default.dirname(t),{recursive:!0}),zy.default.writeFileSync(t,e),t}var zy,wC,SC,TC=O(()=>{"use strict";zy=L(require("fs")),wC=L(require("path")),SC=require("child_process");Hp();Z()});var Vy={};he(Vy,{runStats:()=>mG});function pG(t){let e={_:[],open:!0,diff:!0};for(let n=0;n<t.length;n++){let r=t[n];r!==void 0&&(r==="--since"?e.since=t[++n]:r==="--from"?e.from=t[++n]:r==="--to"?e.to=t[++n]:r==="--member"||r==="-m"?e.member=t[++n]:r==="--project"||r==="-p"?e.project=t[++n]:r==="--port"?e.port=parseInt(t[++n]??"",10):r==="--out"||r==="-o"?e.out=t[++n]:r==="--no-open"?e.open=!1:r==="--no-diff"?e.diff=!1:r==="--head-only"?e.headOnly=!0:r==="--max-diff-lines"?e.maxDiffLines=parseInt(t[++n]??"",10):r.startsWith("--since=")?e.since=r.slice(8):e._.push(r))}return e}function Kp(){let t=Hs.default.join(NC.default.homedir(),".pan-code-graph");return zp.default.mkdirSync(t,{recursive:!0}),t}function Yy(){let t=Ss();if(t)return{repos:sC(t),source:`.project.yaml (${t.project})`};let e=ws(process.cwd());if(!e.length)throw new Error(p("STATS_NO_REPOS__CWD",{cwd:process.cwd()}));return console.log(p("STATS_FALLBACK_SCAN__CWD",{cwd:process.cwd()})),{repos:e,source:p("STATS_SOURCE_FALLBACK")}}function hG(){console.log(p("STATS_USAGE"))}async function mG(t){let e=pG(t),n=e._[0],r=n!==void 0&&["report","people","review"].includes(n)?e._.shift():"report";return e._[0]==="help"||e.help?hG():r==="review"?yG(e):r==="people"?bG(e):_G(e)}function gG(t){let{repos:e}=Yy(),n=eu(t),r=!t.headOnly,o=r?p("STATS_SCOPE_ALL_BRANCHES"):p("STATS_SCOPE_HEAD_ONLY");console.log(p("STATS_SCAN_RANGE__N_SCOPE_LABEL",{n:e.length,scope:o,label:n.label}));let{commits:i,repoStatus:a}=Gy(e,n,{allBranches:r}),s=Hy(Hs.default.join(Kp(),"alias-map.json"));return{repos:e,range:n,commits:i,repoStatus:a,aliasMap:s}}function _G(t){let{repos:e}=Yy(),n=eu({}),r=!t.headOnly,o=r?p("STATS_SCOPE_ALL_BRANCHES"):p("STATS_SCOPE_HEAD_ONLY");console.log(p("STATS_SCAN_FULL__N_SCOPE",{n:e.length,scope:o}));let{commits:i,repoStatus:a}=Gy(e,n,{allBranches:r}),s=Hy(Hs.default.join(Kp(),"alias-map.json")),l=i.map(h=>({e:Wp(h.email,s),n:h.name||h.email,t:h.ts,r:h.repoName,a:h.additions,d:h.deletions})),c=a.filter(h=>!h.available).map(h=>({name:h.name,reason:h.reason}));eu(t);let u={reposTotal:a.length,reposAvailable:a.filter(h=>h.available).length,unavailable:c,initialSince:t.since!=null?Number(t.since):null,initialFrom:t.from||null,initialTo:t.to||null,initialMembers:t.member?[t.member]:[]},d=gC(l,u),f=t.out||Hs.default.join(Kp(),"report.html");zp.default.writeFileSync(f,d),console.log(p("STATS_WROTE_REPORT__PATH_N",{path:f,n:l.length})),c.length&&console.log(p("STATS_UNAVAILABLE__N",{n:c.length})),EC(d,{port:t.port||4321,open:t.open})}function bG(t){let{commits:e,aliasMap:n}=gG(t),{members:r}=uC(e,n);console.log(p("STATS_PEOPLE_HEADER__N",{n:r.length}));for(let o of r)console.log(p("STATS_PEOPLE_ROW__N_NAME_EMAIL",{n:String(o.commits).padStart(5),name:o.name,email:o.email}))}function yG(t){if(!t.member||!t.project)throw new Error(p("STATS_REVIEW_NEED_FLAGS"));let{repos:e}=Yy(),n=e.find(s=>s.name===t.project);if(!n)throw new Error(p("STATS_REVIEW_NO_PROJECT__PROJECT_NAMES",{project:t.project,names:e.map(s=>s.name).join(", ")}));if(!zp.default.existsSync(n.dir))throw new Error(p("STATS_REVIEW_NOT_CLONED__PROJECT_DIR",{project:t.project,dir:n.dir}));let r=eu(t);console.log(p("STATS_REVIEW_BUILDING__MEMBER_PROJECT_LABEL",{member:t.member,project:t.project,label:r.label}));let o=kC(n,t.member,r,{withDiff:t.diff,maxDiffLines:t.maxDiffLines,allBranches:!t.headOnly}),i=`${t.project}_${t.member.replace(/[^a-z0-9]+/gi,"-")}`.toLowerCase(),a=t.out||Hs.default.join(Kp(),`review-${i}.md`);AC(a,o),console.log(p("STATS_REVIEW_WROTE__PATH",{path:a})),console.log(p("STATS_REVIEW_HINT"))}var zp,Hs,NC,qy=O(()=>{"use strict";zp=L(require("fs")),Hs=L(require("path")),NC=L(require("os"));Tn();lC();Hp();Wy();dC();_C();xC();TC();Z()});var CC=D((vue,EG)=>{EG.exports={name:"@pan-stack/cli",version:"0.3.41",description:"PAN Stack CLI \u2014 multi-repo git and project commands from .project.yaml",license:"SEE LICENSE IN LICENSE.txt",bin:{pan:"bin/pan.js"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},files:["bin","dist/agent-plugin"],scripts:{build:"node tools/pan-stack-cli/build.mjs","build:agent-plugin":"node tools/pan-stack-cli/build-agent-plugin.ts",prepare:"node tools/pan-stack-cli/build.mjs",prepublishOnly:"node tools/pan-stack-cli/build.mjs",test:'tsc --noEmit && tsc -p tsconfig.test.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.web.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.e2e.json --noEmit && node --test "tools/pan-stack-plan/test/*.test.ts" "tools/pan-stack-cli/test/*.test.ts" "tools/pan-lineage/test/*.test.ts" "tools/pan-harness/test/*.test.ts" "tools/pan-program/test/*.test.ts" "tools/pan-handover/test/*.test.ts" "agent-plugin/plugins/pan/test/*.test.mjs" && node --test "tools/pan-cicd/test/*.test.mjs"',"test:pan-cicd":'node tools/pan-stack-cli/build.mjs && node --test "tools/pan-cicd/test/*.test.mjs"',"test:pan-stack-plan":'node --test "tools/pan-stack-plan/test/*.test.ts"',"test:pan-stack-cli":'node --test "tools/pan-stack-cli/test/*.test.ts"',typecheck:"tsc --noEmit && tsc -p tsconfig.test.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.web.json --noEmit && tsc -p tools/pan-stack-plan/tsconfig.e2e.json --noEmit","build:web":"node tools/pan-stack-plan/build-web.mjs",pretest:"node tools/pan-stack-plan/build-web.mjs","test:e2e":"playwright test -c tools/pan-stack-plan/playwright.config.ts","test:pan-lineage":'node --test "tools/pan-lineage/test/*.test.ts"'},engines:{node:">=18"},keywords:["pan-stack","monorepo","git","cli"],devDependencies:{"@inquirer/core":"^11.2.1","@inquirer/prompts":"^8.5.2","@inquirer/testing":"^3.3.9","@playwright/test":"1.62.1","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-popover":"1.1.23","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-tooltip":"^1.2.16","@tailwindcss/cli":"4.3.3","@tailwindcss/typography":"0.5.20","@types/node":"22.18.8","@types/picomatch":"3.0.1","@types/react":"^19.2.18","@types/react-dom":"^19.2.5","@types/sanitize-html":"2.16.0","class-variance-authority":"0.7.1",clsx:"2.1.1",cmdk:"1.1.1","csv-parse":"7.0.1","csv-stringify":"6.8.1",esbuild:"0.28.1",marked:"15.0.12",picomatch:"4.0.2",react:"19.2.8","react-dom":"19.2.8","react-markdown":"10.1.0","remark-gfm":"4.0.1","sanitize-html":"2.16.0",serve:"^14.2.4","tailwind-merge":"3.6.0",tailwindcss:"4.3.3",typescript:"5.9.3",yaml:"2.6.1"},optionalDependencies:{"@pan-stack/powerpoint":"^0.1.0"}}});var IC={};he(IC,{runInteractiveMenu:()=>vG});function xG(t){let e=t,n=String(e&&`${String(e.name)} ${String(e.message)}`||"");return/ExitPromptError|force closed|SIGINT|cancel/i.test(n)}async function Jy({message:t,choices:e,hotkeys:n=[]}){try{return await We({message:t,choices:e,hotkeys:n})}catch(r){if(String(r?.message)!=="no-core")throw r;let o=await Sr();if(!o||typeof o.select!="function")return"__exit__";let i=n.map(s=>({name:`${s.key} ${s.label}`,value:s.value})),a=i.length?[...e,new o.Separator,...i]:e;return o.select({message:t,choices:a,pageSize:20,loop:!1,theme:Ut(!1)})}}async function vG({printUsage:t,version:e}={}){let n=await ip(),r=await Sr();if(!n&&(!r||typeof r.select!="function"))return!1;let o=$f().filter(i=>Cc(i).length>0).sort((i,a)=>Xr(i).localeCompare(Xr(a)));if(o.length===0)return console.log(p("NO_PAN_YAML_WITH_COMMANDS")),console.log(p("NO_PAN_YAML_BUT_GIT_STILL_WORKS")),!1;try{for(;;){let i=await Jy({message:p("MENU_SELECT_PROJECT"),choices:o.map((f,h)=>({name:Xr(f),value:h,description:`${Cc(f).length} ${p("COMMANDS_LABEL")} \xB7 ${f.root}`})),hotkeys:[{key:"h",label:p("HELP_LABEL"),value:"__help__"},{key:"v",label:p("VERSION_LABEL"),value:"__version__"},{key:"x",label:p("EXIT_LABEL"),value:"__exit__"}]});if(i==="__exit__")return!0;if(i==="__version__"){console.log(`@pan-stack/cli ${e||"?"}`);continue}if(i==="__help__"){typeof t=="function"&&t();continue}let a=typeof i=="number"?o[i]:void 0;if(!a)continue;let s=Cc(a),l=await Jy({message:`[${Xr(a)}] ${p("MENU_SELECT_COMMAND")}`,choices:s.map(f=>({name:f.name+(f.aliases&&f.aliases.length?` (${f.aliases.join(", ")})`:"")+(f.hasTargets?` [${f.targets.join("|")}]`:""),value:f.name,description:f.description||""})),hotkeys:[{key:"b",label:p("BACK_LABEL"),value:"__back__"},{key:"x",label:p("EXIT_LABEL"),value:"__exit__"}]});if(l==="__exit__")return!0;if(l==="__back__")continue;let c=a.commands[String(l)],u=[];if(c&&c.targets&&Object.keys(c.targets).length>0){let f=Object.keys(c.targets),h=await Jy({message:p("SELECT_TARGET__CMD",{cmd:l}),choices:[...f.map(m=>({name:m,value:m})),{name:p("DEFAULT_LABEL"),value:"__default__"}],hotkeys:[{key:"b",label:p("BACK_LABEL"),value:"__back__"}]});if(h==="__back__")continue;h!=="__default__"&&u.push(String(h))}console.error(`
1087
1087
  \u25B6 pan ${l}${u.length?" "+u.join(" "):""} (${RC.default.basename(a.root)})
1088
1088
  `);let d=await Fp(a,String(l),u);if(!(d&&d.backed))return!0}}catch(i){if(xG(i))return console.error(`
1089
1089
  `+p("EXITED")),!0;throw i}}var RC,LC=O(()=>{"use strict";RC=L(require("path"));Tn();da();Iy();Ei();dn();ya();Z()});var GC={};he(GC,{MANAGED_BY_PAN:()=>Sa,PRODUCTS_DIR:()=>Tr,PRODUCT_LAYOUT:()=>Po,SHARED_LAYOUT:()=>Vp,TEMPLATES:()=>tu,findTemplateDir:()=>Xy,listProducts:()=>Aa,renderReadme:()=>Zy,runBa:()=>BG});function TG(){console.log(p("BA_USAGE",{skill:ka,productsDir:Tr}))}function NG(t){let e={positional:[],dir:"",title:"",products:[],dryRun:!1,help:!1};for(let n=0;n<t.length;n+=1){let r=t[n];if(r!==void 0)if(r==="-h"||r==="--help")e.help=!0;else if(r==="--dry-run")e.dryRun=!0;else if(r==="--title")e.title=t[n+=1]||"";else if(r.startsWith("--title="))e.title=r.slice(8);else if(r==="--dir")e.dir=t[n+=1]||"";else if(r.startsWith("--dir="))e.dir=r.slice(6);else if(r==="--product")e.products.push(t[n+=1]||"");else if(r.startsWith("--product="))e.products.push(r.slice(10));else{if(r.startsWith("-"))throw new Error(p("BA_UNKNOWN_FLAG__FLAG",{flag:r}));e.positional.push(r)}}return e}function Xy(t){let e=xe.default.resolve(t);for(let r=0;r<8;r+=1){for(let i of MC)for(let a of[ka,wG]){let s=xe.default.join(e,i,"skills",a,"references","templates");if(OC(s))return s}let o=xe.default.dirname(e);if(o===e)break;e=o}let n=xe.default.join(DC.default.homedir(),".pan","agent-plugin","plugins","pan","skills",ka,"references","templates");return OC(n)?n:null}function Qy(t){let e=Xy(t);if(e)return e;throw new Error(p("BA_TEMPLATE_NOT_FOUND__SKILL_SEARCHED_ROOT",{skill:ka,searched:MC.map(n=>`${n}/skills/${ka}/references/templates`).join(", "),root:t}))}function BC(t,e){try{return ce.default.readFileSync(t,"utf8")===ce.default.readFileSync(e,"utf8")}catch{return!1}}function Aa(t){let e=xe.default.join(t,Tr);return ce.default.existsSync(e)?ce.default.readdirSync(e,{withFileTypes:!0}).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name).sort():[]}function CG(t){return Aa(t).length>0}function jC(t){for(let e of ce.default.readdirSync(t,{withFileTypes:!0}))if(!(e.name===".gitkeep"||e.name.startsWith(".")))if(e.isDirectory()){if(jC(xe.default.join(t,e.name)))return!0}else return!0;return!1}function UC(t){if(!ce.default.existsSync(t)||!ce.default.statSync(t).isDirectory())return!1;for(let n of ce.default.readdirSync(t,{withFileTypes:!0}))n.isDirectory()&&UC(xe.default.join(t,n.name));return ce.default.readdirSync(t).filter(n=>n!==".gitkeep").length?!1:(ce.default.rmSync(xe.default.join(t,".gitkeep"),{force:!0}),ce.default.rmdirSync(t),!0)}function RG(t){return[...new Set(Po.map(([n])=>n.split("/")[0]??n))].filter(n=>{let r=xe.default.join(t,n);return ce.default.existsSync(r)&&jC(r)})}function Yp(t,e,n,r){let o=0;for(let[i]of e){let a=xe.default.join(t,i);ce.default.existsSync(a)||(o+=1,r(` + ${xe.default.relative(process.cwd(),a)||i}`),n||(ce.default.mkdirSync(a,{recursive:!0}),ce.default.writeFileSync(xe.default.join(a,".gitkeep"),kG)))}return o}function $C(t,e,n){let r=0;for(let o of tu.map(([i])=>i).concat("README.md")){let i=xe.default.join(e,o),a=xe.default.join(t,"00-templates",o);if(!ce.default.existsSync(i)){o!=="README.md"&&console.error(p("BA_SKILL_MISSING_TEMPLATE__NAME",{name:o}));continue}ce.default.existsSync(a)&&BC(i,a)||(r+=1,console.log(` ${ce.default.existsSync(a)?"~":"+"} 00-templates/${o}`),n||(ce.default.mkdirSync(xe.default.dirname(a),{recursive:!0}),ce.default.copyFileSync(i,a)))}return r}function Zy(t,e){let n=e.length>0,r=Vp.map(([l,c])=>`| \`${l}/\` | ${c} |`).join(`
@@ -1476,7 +1476,7 @@ exec ${ml}
1476
1476
  `)}]}let o=N0.default.readFileSync(e,"utf8");if(t.require)return new RegExp(t.require,"m").test(o)?[]:[r(0,"")];let i=new RegExp(t.forbid);return o.split(`
1477
1477
  `).flatMap((a,s)=>i.test(a)?[r(s+1,a)]:[])}function XO(t,e){let n=new Map(t.lint.map(r=>[r,(0,JO.default)(r.files,{dot:!0})]));return e.flatMap(r=>!N0.default.existsSync(r)||!N0.default.statSync(r).isFile()?[]:t.lint.flatMap(o=>{let i=T0.default.relative(o.repo.dir,r).split(T0.default.sep).join("/");return i.startsWith("../")||T0.default.isAbsolute(i)||!n.get(o)?.(i)?[]:dq(o,r,i)}))}var qO,N0,T0,JO,sq,lq,cq,uq,QO=O(()=>{"use strict";qO=require("node:child_process"),N0=L(require("node:fs")),T0=L(require("node:path")),JO=L(eh()),sq=2e4,lq=160,cq=20,uq=t=>process.platform==="win32"?`"${t}"`:`'${t.replace(/'/g,"'\\''")}'`});function fq(t,e,n){let r=cx(e),o=new Map,i=(m,g)=>{let _=`${m}\0${g.join("\0")}`;return o.has(_)||o.set(_,zu(m,g)),o.get(_)??""},a=cl(t,e,n).map(m=>{let g=YL(m.repo.dir,m.on);if(m.builtin){let E=ux(e);return{id:m.id,repo:m.repo.name,status:E.ok?"pass":"fail",checkedAt:new Date().toISOString(),changed:g,stale:E.count}}let _=JL(r,m.repo.name,m.id),S=_?_.treeHash!==i(m.repo.dir,m.on)?"outdated":_.state==="pass"?"pass":"fail":"never";return{id:m.id,repo:m.repo.name,status:S,checkedAt:_?.ts??"",changed:g}}),s=p0(e,n),l=gx(e).filter(m=>m.phase===n.name),c=n.spec.length?s:mx(t,e,n,i),u=c.hash?l.filter(m=>m.spec_hash===c.hash).at(-1):void 0,d=u??l.at(-1),f=n.approve.length?{status:u?"approved":d?"outdated":"missing",role:d?.role??"",by:d?.principal??"",at:d?.ts??"",actorKind:d?.actor_kind??"",actor:d?.actor??"",suggested:n.approve}:null,h=!a.length&&!f?"open":a.some(m=>m.status==="fail")?"failing":a.some(m=>m.status!=="pass")?"needs-check":f&&f.status!=="approved"?"awaiting-approval":"done";return{phase:n.name,ai:n.ai,state:h,spec:{files:s.files.length,hash:s.hash},gates:a,approval:f}}function xl(t,e){return t.phases.map(n=>fq(t,e,n))}var C0=O(()=>{"use strict";m0();Ba();Yu()});function mq(t){let e=pq.exec(t)?.[0];if(!e)return null;let n=i=>{let a=hq(e,i);return a?(a[1]??a[2]??a[3]??"").trim():""},r=n("id"),o;try{o=new URL(n("apiUrl"))}catch{return null}return!/^[A-Za-z0-9-]{1,64}$/.test(r)||!["https:","http:"].includes(o.protocol)?null:{id:r,apiUrl:o.href.replace(/\/+$/,"")}}function n4(t,e){try{return(0,ZO.execFileSync)("git",["-C",t,...e],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}function gq(t){let e=new Map;for(let n of t.repos)for(let r of n4(n.dir,["ls-files","-co","--exclude-standard","--","*app.panui.yaml","app.panui.yaml"]).split(`
1478
1478
  `)){if(!r)continue;let o=mq(e4.default.readFileSync(Px.default.join(n.dir,r),"utf8"));o&&e.set(`${o.apiUrl} ${o.id}`,o)}return[...e.values()]}async function Dx(t,e,n){let r=n.studio?[{id:n.studio,apiUrl:Ze(e.root).apiUrl}]:gq(e);if(!r.length)throw new vl(p("HARNESS_ERR_PUSH_NO_LINK"));let o=Rt(e.root);if(!o.email)throw new vl(p("HARNESS_ERR_NO_PRINCIPAL"));let i=(process.env.PAN_ACTOR_KIND??"").toLowerCase()==="ai",a=xl(t,e),s={workspace:Px.default.basename(e.root),commit:n4(e.root,["rev-parse","--short","HEAD"])||null,principal:o.email,actorKind:i?"ai":"human",actor:i?process.env.PAN_ACTOR||"ai":o.email.split("@")[0]??"",machine:(0,Ta.machineId)(),machineHost:t4.default.hostname(),phases:a},l=[];for(let c of r){let u=Wt(c.apiUrl),d=process.env.PAN_STUDIO_TOKEN||(u&&!gn(u)?u.token:""),f={project:c.id,apiUrl:c.apiUrl,ok:!1,phases:a.length,error:""};if(!d){l.push({...f,error:p("HARNESS_ERR_PUSH_LOGIN__API",{api:c.apiUrl})});continue}try{let h=await fetch(`${c.apiUrl}/api/v1/sync/projects/${encodeURIComponent(c.id)}/harness`,{method:"POST",headers:{"content-type":"application/json",accept:"application/json",authorization:`Bearer ${d}`},body:JSON.stringify(s)});if(h.ok)l.push({...f,ok:!0});else{let m=await h.json().catch(()=>({})),g=typeof m.message=="string"?m.message:typeof m.code=="string"?m.code:"";l.push({...f,error:`HTTP ${h.status}${g?` \u2014 ${g}`:""}`})}}catch(h){l.push({...f,error:h.message})}}return l}var ZO,e4,t4,Px,vl,pq,hq,r4=O(()=>{"use strict";ZO=require("node:child_process"),e4=L(require("node:fs")),t4=L(require("node:os")),Px=L(require("node:path"));Z();jn();Nr();C0();vl=class extends Error{name="PushError"},pq=/^backend:[ \t]*\n(?:[ \t]+\S[^\n]*\n?|\n)*/m,hq=(t,e)=>new RegExp(`^[ \\t]+${e}:[ \\t]*(?:"([^"\\n]*)"|'([^'\\n]*)'|([^\\s#'"][^\\n#]*?))[ \\t]*(?:#.*)?$`,"m").exec(t)});function Bx(t=st.default.dirname(xt.default.realpathSync(process.argv[1]??"."))){for(let e=st.default.resolve(t);;e=st.default.dirname(e)){let n=st.default.join(e,"dist","agent-plugin");if(xt.default.existsSync(st.default.join(n,".claude-plugin","marketplace.json")))return n;if(st.default.dirname(e)===e)return null}}function bq(t,e,n,r,o=!1){let i=[];if(t.includes("claude")){for(let a of r.plugins.filter(s=>s.id.startsWith(`${wl}@`)&&s.id!==od||s.id.startsWith(`${R0}@`)))i.push({agent:"claude",run:{cmd:"claude",args:["plugin","uninstall",a.id,"--scope",a.scope],cwd:a.projectPath}});i.push({agent:"claude",run:{cmd:"claude",args:r.marketplaces.includes(id)?["plugin","marketplace","update",id]:["plugin","marketplace","add",e]}}),i.push({agent:"claude",run:{cmd:"claude",args:r.plugins.some(a=>a.id===od)?["plugin","update",od]:["plugin","install",od,"--scope","user"]}})}return t.includes("codex")&&(o&&i.push({agent:"codex",run:{cmd:"codex",args:["plugin","remove",`${R0}@${id}`]}}),i.push({agent:"codex",run:{cmd:"codex",args:["plugin","marketplace","add",e]}}),i.push({agent:"codex",run:{cmd:"codex",args:["plugin","add",od]}})),t.includes("cursor")&&(i.push({agent:"cursor",remove:st.default.join(n,".cursor","plugins","local",R0)}),i.push({agent:"cursor",copy:{from:st.default.join(e,"plugins",wl),to:st.default.join(n,".cursor","plugins","local",wl)}})),i}function Eq(t,e){let n=[];for(let r of _q)for(let o of e.flatMap(i=>[i,`f-${i}`,...yq[i]??[]]))xt.default.existsSync(st.default.join(t,r,o,"SKILL.md"))&&n.push(`${r}/${o}`);return n}function vq(t){return Mx.filter(e=>e==="cursor"?xt.default.existsSync(st.default.join(t,".cursor")):xq(e))}function wq(t){try{return xt.default.readFileSync(st.default.join(t,".codex","config.toml"),"utf8").includes(`[plugins."${R0}@${id}"]`)}catch{return!1}}function Sq(){let t=e=>{let n=(0,I0.spawnSync)("claude",[...e,"--json"],{encoding:"utf8"});try{return n.status===0?JSON.parse(n.stdout):[]}catch{return[]}};return{plugins:t(["plugin","list"])??[],marketplaces:(t(["plugin","marketplace","list"])??[]).map(e=>e.name)}}async function kq(t){let e=Ar(),n=new Map((await Lo(e,{types:["skill"]})).map(o=>[o.name,o])),r=ad.flatMap(o=>n.get(o)??[]);return await Promise.all(r.map(async o=>xt.default.rmSync(st.default.join(await Oo(e,o,t),"metadata.json"),{force:!0}))),r.length}async function Aq(t,e,n){let r=st.default.join(e,".pan","agent-plugin"),o=`${r}.tmp-${process.pid}`;xt.default.rmSync(o,{recursive:!0,force:!0}),xt.default.cpSync(t,o,{recursive:!0});try{let i=await n(st.default.join(o,"plugins",wl,"skills"));return xt.default.rmSync(r,{recursive:!0,force:!0}),xt.default.renameSync(o,r),{dir:r,skills:i}}finally{xt.default.rmSync(o,{recursive:!0,force:!0})}}async function i4(t){let e=t.home??o4.default.homedir(),n=t.bundle===void 0?Bx():t.bundle;if(!n)throw new Sl("no-bundle");let r=st.default.join(n,"plugins",wl),o=JSON.parse(xt.default.readFileSync(st.default.join(r,".claude-plugin","plugin.json"),"utf8")).version,i=t.agents??vq(e);if(!i.length)throw new Sl("no-agent");let{dir:a,skills:s}=t.dryRun?{dir:st.default.join(e,".pan","agent-plugin"),skills:ad.length}:await Aq(n,e,t.fetchSkills??kq),l=bq(i,a,e,i.includes("claude")?Sq():{plugins:[],marketplaces:[]},i.includes("codex")&&wq(e)),c=new Map,u=[];for(let d of l){if(t.dryRun||c.has(d.agent))continue;if(d.remove){xt.default.rmSync(d.remove,{recursive:!0,force:!0});continue}if(d.copy){xt.default.rmSync(d.copy.to,{recursive:!0,force:!0}),xt.default.mkdirSync(st.default.dirname(d.copy.to),{recursive:!0}),xt.default.cpSync(d.copy.from,d.copy.to,{recursive:!0});continue}let{cmd:f,args:h,cwd:m}=d.run,g=(0,I0.spawnSync)(f,h,{encoding:"utf8",cwd:m&&xt.default.existsSync(m)?m:void 0});g.status===0?(h[1]==="uninstall"||h[1]==="remove")&&u.push(h[2]):h[1]!=="remove"&&c.set(d.agent,`${f} ${h.join(" ")}: ${(g.stderr||g.stdout||g.error?.message||"").trim().split(`
1479
- `).pop()}`)}return{version:o,dir:a,skills:s,agents:i.map(d=>({agent:d,ok:!c.has(d),error:c.get(d)})),removed:u,duplicates:t.workspaceRoot?Eq(t.workspaceRoot,ad):[],dryRun:!!t.dryRun,...t.dryRun?{steps:l}:{}}}var I0,xt,o4,st,Mx,id,wl,od,R0,ad,_q,yq,xq,Sl,a4=O(()=>{"use strict";I0=require("node:child_process"),xt=L(require("node:fs")),o4=L(require("node:os")),st=L(require("node:path"));Zc();Mx=["claude","codex","cursor"],id="pan-stack",wl="pan",od=`${wl}@${id}`,R0="pan-harness",ad=["bql-syntax","java","pan-java","ui-spec","ponytail","agent-device-qa","architecture","ba","brainstorm","code-review","craft","databases","db","debug","docs","drawio","e2e","elicit","fix","git","journal","mermaidjs-v11","outcome","plan","plans-kanban","predict","preview","project-management","project-organization","requirements","research","retro","scenario","scout","security-scan","ship","team","test","test-bql","user-guide","vn-locale","web-testing","wireframe"],_q=[".claude/skills",".cursor/skills",".codex/skills",".agents/skills"];yq={"ui-spec":["panui-spec"]};xq=t=>(0,I0.spawnSync)(t,["--version"],{stdio:"ignore"}).status===0;Sl=class extends Error{name="SetupError";code;constructor(e){super(e),this.code=e}}});var f4={};he(f4,{runHarness:()=>Iq});function Nq(t){let e=[],n=new Map;for(let r=0;r<t.length;r++){let o=t[r]??"";if(o==="-h")n.set("help","true");else if(!o.startsWith("--"))e.push(o);else{let[i="",a]=o.slice(2).split(/=(.*)/s,2);n.set(i,a??(Tq.includes(i)?"true":t[++r]??""))}}return{positionals:e,flags:n}}function sd(t){let e=Bo(t);if(!e)throw new fr(p("HARNESS_ERR_NO_CONFIG"));return e}function s4(t,e){if(!e)throw new fr(`${p("HARNESS_ERR_NEED_PHASE__PHASES",{phases:t.phases.map(r=>r.name).join(", ")||"\u2014"})}`);let n=ul(t,e);if(!n)throw new fr(p("HARNESS_ERR_UNKNOWN_PHASE__PHASE_PHASES",{phase:e,phases:t.phases.map(r=>r.name).join(", ")||"\u2014"}));return n}async function Rq(t,e){let n=t.flags.get("agent")?.split(",").map(c=>c.trim()).filter(Boolean),r=n?.find(c=>!Mx.includes(c));if(r)throw new fr(p("HARNESS_SETUP_BAD_AGENT__AGENT",{agent:r}));let o=null;try{o=tn(process.cwd()).root}catch{}let i=Bx();if(!i)throw new fr(p("HARNESS_SETUP_NO_BUNDLE"));!e&&!t.flags.has("dry-run")&&console.log(p("HARNESS_SETUP_FETCHING__COUNT",{count:ad.length}));let a;try{a=await i4({agents:n,dryRun:t.flags.has("dry-run"),workspaceRoot:o,bundle:i})}catch(c){throw c instanceof Sl?new fr(p(c.code==="no-bundle"?"HARNESS_SETUP_NO_BUNDLE":"HARNESS_SETUP_NO_AGENT")):c}let s=a.agents.some(c=>!c.ok);if(e)return console.log(JSON.stringify({ok:!s,data:a})),s?1:0;if(console.log(p("HARNESS_SETUP_PLUGIN__VERSION_SKILLS_DIR",{version:a.version,skills:a.skills,dir:a.dir.replace(u4.default.homedir(),"~")})),a.dryRun){console.log(p("HARNESS_SETUP_DRY"));for(let c of a.steps??[])console.log(` ${c.agent}: ${c.run?[c.run.cmd,...c.run.args].join(" "):`cp -r ${c.copy.from} ${c.copy.to}`}`);return 0}for(let c of a.removed)console.log(p("HARNESS_SETUP_REMOVED__ID",{id:c}));let l={claude:"HARNESS_SETUP_OK_CLAUDE",codex:"HARNESS_SETUP_OK_CODEX",cursor:"HARNESS_SETUP_OK_CURSOR"};for(let c of a.agents)console.log(c.ok?p(l[c.agent]):p("HARNESS_SETUP_FAIL__AGENT_ERROR",{agent:c.agent,error:c.error??""}));return a.duplicates.length&&console.log(p("HARNESS_SETUP_DUPES__COUNT_SAMPLE",{count:a.duplicates.length,sample:a.duplicates.slice(0,3).join(", ")+(a.duplicates.length>3?", \u2026":"")})),s?1:0}async function Iq(t,{version:e=""}={}){let n=Nq(t),[r,o]=n.positionals,i=n.flags.has("json"),a=(s,l)=>i?console.log(JSON.stringify({ok:!0,data:s})):l();try{if(n.flags.has("help")||!r)return console.log(p("HARNESS_USAGE")),n.flags.has("help")?0:2;if(r==="setup")return Rq(n,i);let s=tn(process.cwd());switch(r){case"check":{let l=sd(s),c=s4(l,o),u=await f0(l,s,c,{repo:n.flags.get("repo"),capture:i,onStart:m=>{i||console.log(p("HARNESS_CHECK_START__ID_REPO",{id:m.id,repo:m.repo.name}))}}),d=u.every(m=>m.state==="pass"),f=n.flags.has("push")?await Dx(l,s,{studio:n.flags.get("studio")}):void 0,h=d&&(f??[]).every(m=>m.ok);if(i)console.log(JSON.stringify({ok:h,data:{phase:c.name,results:u,...f?{push:f}:{}}}));else{console.log(p("HARNESS_CHECK_HEADING__PHASE",{phase:c.name})),u.length||console.log(p("HARNESS_CHECK_NO_GATES"));for(let m of u)console.log(` ${p(`HARNESS_STATE_${m.state.toUpperCase()}`)} ${m.id} @ ${m.repo} ${Cq(m.durationMs)}${m.note?` \u2014 ${m.note}`:""}`);for(let m of f??[])console.log(l4(m))}return h?0:1}case"approve":{let l=sd(s),c=s4(l,o),u=Ks(n.flags.get("run-mode"));if(!u)throw new fr(p("HARNESS_ERR_RUN_MODE__VALUE",{value:n.flags.get("run-mode")??process.env.PAN_RUN_MODE??""}));let d=h0(l,s,c,{role:n.flags.get("role"),note:n.flags.get("note"),runMode:u});return a(d,()=>{console.log(p("HARNESS_APPROVED__PHASE_WHO_HASH_FILES",{phase:d.phase,who:c4(d.principal,d.role,d.actor_kind,d.actor),hash:d.spec_hash,files:d.spec_files})),d.role||console.log(p("HARNESS_HINT_NO_ROLE"))}),0}case"status":{let l=sd(s),c=xl(l,s);return a(c,()=>{for(let u of c){console.log(`${u.phase}${u.ai?` (${u.ai})`:""} ${p(`HARNESS_PHASE_${u.state.toUpperCase().replace(/-/g,"_")}`)}`),u.spec.files&&console.log(` ${p("HARNESS_STATUS_SPEC__FILES_HASH",{files:u.spec.files,hash:u.spec.hash})}`);for(let f of u.gates)console.log(` ${p(`HARNESS_GATE_${f.status.toUpperCase()}`)} ${f.id} @ ${f.repo}`);let d=u.approval;d&&console.log(` ${p(`HARNESS_APPROVAL_${d.status.toUpperCase()}`)} ${d.by?c4(d.by,d.role,d.actorKind,d.actor):p("HARNESS_APPROVAL_ANYONE__ROLES",{roles:d.suggested.join(", ")})}`)}}),c.every(u=>u.state==="done"||u.state==="open")?0:1}case"lint":{let l=sd(s),c=n.positionals.slice(1).map(d=>d4.default.resolve(d));if(!c.length)throw new fr(p("HARNESS_ERR_NEED_FILE"));let u=XO(l,c);if(i)console.log(JSON.stringify({ok:!u.length,data:u}));else if(!u.length)console.log(p("HARNESS_LINT_CLEAN__COUNT",{count:l.lint.length}));else for(let d of u)console.log(`${d.file}${d.line?`:${d.line}`:""} ${d.rule}${d.message?` \u2014 ${d.message}`:""}`),d.text&&console.log(d.text.replace(/^/gm," "));return u.length?1:0}case"push":{let l=sd(s),c=await Dx(l,s,{studio:n.flags.get("studio")}),u=c.some(d=>!d.ok);if(i)console.log(JSON.stringify({ok:!u,data:c}));else for(let d of c)console.log(l4(d));return u?1:0}case"doctor":{let{checks:l}=YO(s,e),c=l.some(u=>u.level==="error");if(i)console.log(JSON.stringify({ok:!c,data:l}));else for(let u of l)console.log(`${{ok:"\u2713",warn:"!",error:"\u2717"}[u.level]} ${u.message}`),u.fix&&console.log(` \u2192 ${u.fix}`);return c?1:0}default:throw new fr(`${p("HARNESS_ERR_UNKNOWN_COMMAND__COMMAND",{command:r})}
1479
+ `).pop()}`)}return{version:o,dir:a,skills:s,agents:i.map(d=>({agent:d,ok:!c.has(d),error:c.get(d)})),removed:u,duplicates:t.workspaceRoot?Eq(t.workspaceRoot,ad):[],dryRun:!!t.dryRun,...t.dryRun?{steps:l}:{}}}var I0,xt,o4,st,Mx,id,wl,od,R0,ad,_q,yq,xq,Sl,a4=O(()=>{"use strict";I0=require("node:child_process"),xt=L(require("node:fs")),o4=L(require("node:os")),st=L(require("node:path"));Zc();Mx=["claude","codex","cursor"],id="pan-stack",wl="pan",od=`${wl}@${id}`,R0="pan-harness",ad=["bql-syntax","java","pan-java","ui-spec","ponytail","ponytail-audit","ponytail-debt","ponytail-gain","ponytail-help","ponytail-review","writing-guidelines","agent-device-qa","architecture","ba","brainstorm","code-review","craft","databases","db","debug","docs","drawio","e2e","elicit","fix","git","journal","mermaidjs-v11","outcome","plan","plans-kanban","predict","preview","project-management","project-organization","requirements","research","retro","scenario","scout","security-scan","ship","team","test","test-bql","user-guide","vn-locale","web-testing","wireframe"],_q=[".claude/skills",".cursor/skills",".codex/skills",".agents/skills"];yq={"ui-spec":["panui-spec"]};xq=t=>(0,I0.spawnSync)(t,["--version"],{stdio:"ignore"}).status===0;Sl=class extends Error{name="SetupError";code;constructor(e){super(e),this.code=e}}});var f4={};he(f4,{runHarness:()=>Iq});function Nq(t){let e=[],n=new Map;for(let r=0;r<t.length;r++){let o=t[r]??"";if(o==="-h")n.set("help","true");else if(!o.startsWith("--"))e.push(o);else{let[i="",a]=o.slice(2).split(/=(.*)/s,2);n.set(i,a??(Tq.includes(i)?"true":t[++r]??""))}}return{positionals:e,flags:n}}function sd(t){let e=Bo(t);if(!e)throw new fr(p("HARNESS_ERR_NO_CONFIG"));return e}function s4(t,e){if(!e)throw new fr(`${p("HARNESS_ERR_NEED_PHASE__PHASES",{phases:t.phases.map(r=>r.name).join(", ")||"\u2014"})}`);let n=ul(t,e);if(!n)throw new fr(p("HARNESS_ERR_UNKNOWN_PHASE__PHASE_PHASES",{phase:e,phases:t.phases.map(r=>r.name).join(", ")||"\u2014"}));return n}async function Rq(t,e){let n=t.flags.get("agent")?.split(",").map(c=>c.trim()).filter(Boolean),r=n?.find(c=>!Mx.includes(c));if(r)throw new fr(p("HARNESS_SETUP_BAD_AGENT__AGENT",{agent:r}));let o=null;try{o=tn(process.cwd()).root}catch{}let i=Bx();if(!i)throw new fr(p("HARNESS_SETUP_NO_BUNDLE"));!e&&!t.flags.has("dry-run")&&console.log(p("HARNESS_SETUP_FETCHING__COUNT",{count:ad.length}));let a;try{a=await i4({agents:n,dryRun:t.flags.has("dry-run"),workspaceRoot:o,bundle:i})}catch(c){throw c instanceof Sl?new fr(p(c.code==="no-bundle"?"HARNESS_SETUP_NO_BUNDLE":"HARNESS_SETUP_NO_AGENT")):c}let s=a.agents.some(c=>!c.ok);if(e)return console.log(JSON.stringify({ok:!s,data:a})),s?1:0;if(console.log(p("HARNESS_SETUP_PLUGIN__VERSION_SKILLS_DIR",{version:a.version,skills:a.skills,dir:a.dir.replace(u4.default.homedir(),"~")})),a.dryRun){console.log(p("HARNESS_SETUP_DRY"));for(let c of a.steps??[])console.log(` ${c.agent}: ${c.run?[c.run.cmd,...c.run.args].join(" "):`cp -r ${c.copy.from} ${c.copy.to}`}`);return 0}for(let c of a.removed)console.log(p("HARNESS_SETUP_REMOVED__ID",{id:c}));let l={claude:"HARNESS_SETUP_OK_CLAUDE",codex:"HARNESS_SETUP_OK_CODEX",cursor:"HARNESS_SETUP_OK_CURSOR"};for(let c of a.agents)console.log(c.ok?p(l[c.agent]):p("HARNESS_SETUP_FAIL__AGENT_ERROR",{agent:c.agent,error:c.error??""}));return a.duplicates.length&&console.log(p("HARNESS_SETUP_DUPES__COUNT_SAMPLE",{count:a.duplicates.length,sample:a.duplicates.slice(0,3).join(", ")+(a.duplicates.length>3?", \u2026":"")})),s?1:0}async function Iq(t,{version:e=""}={}){let n=Nq(t),[r,o]=n.positionals,i=n.flags.has("json"),a=(s,l)=>i?console.log(JSON.stringify({ok:!0,data:s})):l();try{if(n.flags.has("help")||!r)return console.log(p("HARNESS_USAGE")),n.flags.has("help")?0:2;if(r==="setup")return Rq(n,i);let s=tn(process.cwd());switch(r){case"check":{let l=sd(s),c=s4(l,o),u=await f0(l,s,c,{repo:n.flags.get("repo"),capture:i,onStart:m=>{i||console.log(p("HARNESS_CHECK_START__ID_REPO",{id:m.id,repo:m.repo.name}))}}),d=u.every(m=>m.state==="pass"),f=n.flags.has("push")?await Dx(l,s,{studio:n.flags.get("studio")}):void 0,h=d&&(f??[]).every(m=>m.ok);if(i)console.log(JSON.stringify({ok:h,data:{phase:c.name,results:u,...f?{push:f}:{}}}));else{console.log(p("HARNESS_CHECK_HEADING__PHASE",{phase:c.name})),u.length||console.log(p("HARNESS_CHECK_NO_GATES"));for(let m of u)console.log(` ${p(`HARNESS_STATE_${m.state.toUpperCase()}`)} ${m.id} @ ${m.repo} ${Cq(m.durationMs)}${m.note?` \u2014 ${m.note}`:""}`);for(let m of f??[])console.log(l4(m))}return h?0:1}case"approve":{let l=sd(s),c=s4(l,o),u=Ks(n.flags.get("run-mode"));if(!u)throw new fr(p("HARNESS_ERR_RUN_MODE__VALUE",{value:n.flags.get("run-mode")??process.env.PAN_RUN_MODE??""}));let d=h0(l,s,c,{role:n.flags.get("role"),note:n.flags.get("note"),runMode:u});return a(d,()=>{console.log(p("HARNESS_APPROVED__PHASE_WHO_HASH_FILES",{phase:d.phase,who:c4(d.principal,d.role,d.actor_kind,d.actor),hash:d.spec_hash,files:d.spec_files})),d.role||console.log(p("HARNESS_HINT_NO_ROLE"))}),0}case"status":{let l=sd(s),c=xl(l,s);return a(c,()=>{for(let u of c){console.log(`${u.phase}${u.ai?` (${u.ai})`:""} ${p(`HARNESS_PHASE_${u.state.toUpperCase().replace(/-/g,"_")}`)}`),u.spec.files&&console.log(` ${p("HARNESS_STATUS_SPEC__FILES_HASH",{files:u.spec.files,hash:u.spec.hash})}`);for(let f of u.gates)console.log(` ${p(`HARNESS_GATE_${f.status.toUpperCase()}`)} ${f.id} @ ${f.repo}`);let d=u.approval;d&&console.log(` ${p(`HARNESS_APPROVAL_${d.status.toUpperCase()}`)} ${d.by?c4(d.by,d.role,d.actorKind,d.actor):p("HARNESS_APPROVAL_ANYONE__ROLES",{roles:d.suggested.join(", ")})}`)}}),c.every(u=>u.state==="done"||u.state==="open")?0:1}case"lint":{let l=sd(s),c=n.positionals.slice(1).map(d=>d4.default.resolve(d));if(!c.length)throw new fr(p("HARNESS_ERR_NEED_FILE"));let u=XO(l,c);if(i)console.log(JSON.stringify({ok:!u.length,data:u}));else if(!u.length)console.log(p("HARNESS_LINT_CLEAN__COUNT",{count:l.lint.length}));else for(let d of u)console.log(`${d.file}${d.line?`:${d.line}`:""} ${d.rule}${d.message?` \u2014 ${d.message}`:""}`),d.text&&console.log(d.text.replace(/^/gm," "));return u.length?1:0}case"push":{let l=sd(s),c=await Dx(l,s,{studio:n.flags.get("studio")}),u=c.some(d=>!d.ok);if(i)console.log(JSON.stringify({ok:!u,data:c}));else for(let d of c)console.log(l4(d));return u?1:0}case"doctor":{let{checks:l}=YO(s,e),c=l.some(u=>u.level==="error");if(i)console.log(JSON.stringify({ok:!c,data:l}));else for(let u of l)console.log(`${{ok:"\u2713",warn:"!",error:"\u2717"}[u.level]} ${u.message}`),u.fix&&console.log(` \u2192 ${u.fix}`);return c?1:0}default:throw new fr(`${p("HARNESS_ERR_UNKNOWN_COMMAND__COMMAND",{command:r})}
1480
1480
 
1481
1481
  ${p("HARNESS_USAGE")}`)}}catch(s){if(s instanceof fr||s instanceof Dn||s instanceof ur||s instanceof $o||s instanceof vl){let l=s instanceof ur?s.problems:void 0;return i?console.log(JSON.stringify({ok:!1,error:{code:s.name,message:s.message,problems:l}})):console.error(s.message),2}throw s}}var u4,d4,Tq,fr,Cq,l4,c4,p4=O(()=>{"use strict";u4=L(require("node:os")),d4=L(require("node:path"));Z();Nr();Na();m0();Ba();VO();Yu();QO();r4();a4();C0();Tq=["json","help","push","dry-run"];fr=class extends Error{name="UsageError"};Cq=t=>`${(t/1e3).toFixed(1)}s`,l4=t=>t.ok?p("HARNESS_PUSHED__PROJECT_API_PHASES",{project:t.project,api:t.apiUrl,phases:t.phases}):p("HARNESS_PUSH_FAILED__PROJECT_API_ERROR",{project:t.project,api:t.apiUrl,error:t.error}),c4=(t,e,n,r)=>`${t}${e?` (${e})`:""}${n==="ai"?` \xB7 AI ${r}`:""}`});function Pq(t){return new Promise(e=>setTimeout(e,t))}async function kl(t,e,n={}){let r=Math.max(1,n.attempts??(m4?8:3)),o=Math.max(1,n.baseDelayMs??25),i;for(let a=1;a<=r;a+=1)try{await h4.default.rename(t,e);return}catch(s){i=s;let l=s.code??"";if(!Lq.has(l)||a===r)throw s;await Pq(o*a)}throw i}function Al(t){let e=String(t);if(m4){(0,jx.execFile)(process.env.ComSpec||"cmd.exe",["/s","/c","start",'""',e],{windowsVerbatimArguments:!0},()=>{});return}let n=process.platform==="darwin"?"open":"xdg-open";(0,jx.execFile)(n,[e],()=>{})}function g4(t){return!t||Oq.has(t.code??"")}var jx,h4,m4,Lq,Oq,Wa=O(()=>{"use strict";jx=require("node:child_process"),h4=L(require("node:fs/promises")),m4=process.platform==="win32",Lq=new Set(["EBUSY","EPERM","EACCES","ENOTEMPTY"]),Oq=new Set(["EINVAL","ENOTSUP","EPERM","EACCES","EISDIR","EBADF"])});function Bi(t,e=60){return t.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/đ/g,"d").replace(/Đ/g,"D").replace(/[^A-Za-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,e).replace(/-+$/g,"").toLowerCase()||"item"}function Mq(t){let e=Ie.default.extname(t).slice(1).toLowerCase();return["mp4","webm","mov","m4v"].includes(e)?"video":["md","markdown"].includes(e)?"article":e==="pdf"?"pdf":["png","jpg","jpeg","gif","webp","svg","avif"].includes(e)?"image":"file"}function Bq(t,e="vi"){return["# T\xE0i li\u1EC7u b\xE0n giao \u2014 `pan handover view` \u0111\u1EC3 xem, `pan handover check` \u0111\u1EC3 ki\u1EC3m.","# S\u1EEDa ti\xEAu \u0111\u1EC1 / m\xF4 t\u1EA3 / th\u1EE9 t\u1EF1 tho\u1EA3i m\xE1i; `id` l\xE0 kho\xE1 \u0111\u01B0\u1EDDng d\u1EABn + \u0111\u1ED3ng b\u1ED9 \u2014 \u0111\u1ED5i id l\xE0 b\xE0i m\u1EDBi.",`title: ${JSON.stringify(t)}`,'description: ""',`locale: ${e}`,"theme: classic # classic | midnight | minimal (theme khi xu\u1EA5t)","sections: []",""].join(`
1482
1482
  `)}function y4(t,e=process.cwd()){if(t){let r=Ie.default.resolve(e,t);return lt.default.existsSync(Ie.default.join(r,Lt))?r:null}let n=Ie.default.resolve(e);for(;;){if(lt.default.existsSync(Ie.default.join(n,Lt)))return n;if(lt.default.existsSync(Ie.default.join(n,"handover",Lt)))return Ie.default.join(n,"handover");let r=Ie.default.dirname(n);if(r===n)return null;n=r}}function E4(t){let e=(0,io.parseDocument)(lt.default.readFileSync(Ie.default.join(t,Lt),"utf8"));if(e.errors.length)throw new Error(`${Lt}: ${e.errors[0].message}`);return e}function Ka(t){let e=E4(t).toJS()??{},n=Array.isArray(e.sections)?e.sections:[];return{title:Tl(e.title)||Ie.default.basename(Ie.default.resolve(t,"..")),description:Tl(e.description)||void 0,locale:Tl(e.locale)||"vi",theme:Dq.includes(e.theme)?String(e.theme):"classic",sections:n.filter(r=>!!r&&typeof r=="object").map(r=>({id:Tl(r.id),title:Tl(r.title)||Tl(r.id),lessons:(Array.isArray(r.lessons)?r.lessons:[]).filter(o=>!!o&&typeof o=="object").map(o=>o)}))}}function $x(t){let e=new Set;for(let n of t.sections)for(let r of n.lessons){for(let o of[r.src,r.poster,r.body])o&&e.add(o);for(let o of r.subtitles??[])o?.src&&e.add(o.src);for(let o of r.attachments??[])o?.src&&e.add(o.src)}return[...e].sort()}function Cl(t){return!t||t.startsWith("/")||t.includes("\\")||/[\u0000-\u001f]/.test(t)?!1:!t.split("/").some(e=>e===".."||e==="")}function L0(t){let e=[],n;try{n=Ka(t)}catch(i){return[{level:"error",where:Lt,message:i instanceof Error?i.message:String(i)}]}let r=new Map,o=new Set;n.sections.length||e.push({level:"warn",where:Lt,message:"no sections yet"});for(let[i,a]of n.sections.entries()){let s=`sections[${i}]${a.id?` (${a.id})`:""}`;a.id?a.id!==Bi(a.id)?e.push({level:"error",where:s,message:`"id" must be a slug, e.g. "${Bi(a.id)}"`}):o.has(a.id)&&e.push({level:"error",where:s,message:`duplicate section id "${a.id}"`}):e.push({level:"error",where:s,message:'"id" is required'}),o.add(a.id),a.title||e.push({level:"warn",where:s,message:'"title" is empty'});for(let[l,c]of a.lessons.entries()){let u=`${s} \u203A lessons[${l}]${c.id?` (${c.id})`:""}`;c.id?c.id!==Bi(c.id)?e.push({level:"error",where:u,message:`"id" must be a slug, e.g. "${Bi(c.id)}"`}):r.has(c.id)&&e.push({level:"error",where:u,message:`duplicate lesson id "${c.id}" (also in ${r.get(c.id)})`}):e.push({level:"error",where:u,message:'"id" is required'}),c.id&&r.set(c.id,s),c.title||e.push({level:"warn",where:u,message:'"title" is empty'}),Nl.includes(c.type)?c.src?jq[c.type].test(c.src)||e.push({level:"warn",where:u,message:`"${c.src}" does not look like a ${c.type}`}):e.push({level:"error",where:u,message:'"src" is required'}):e.push({level:"error",where:u,message:`"type" must be ${Nl.join(" | ")}`}),c.type==="video"&&!(c.subtitles??[]).length&&e.push({level:"warn",where:u,message:"video without subtitles"});for(let d of c.subtitles??[])d?.src&&!/\.vtt$/i.test(d.src)&&e.push({level:"warn",where:u,message:`subtitle "${d.src}" should be WebVTT (.vtt)`})}}for(let i of $x(n))Cl(i)?lt.default.existsSync(Ie.default.join(t,i))?/\.(md|markdown)$/i.test(i)&&e.push(...$q(t,i)):e.push({level:"error",where:i,message:"file not found"}):e.push({level:"error",where:i,message:'path must stay inside the handover folder (relative, no "..")'});return e}function Uq(t){let e=[],n=/(!?)\[[^\]]*\]\(\s*(?:<([^>]+)>|([^)\s]+))(?:\s+"[^"]*")?\s*\)/g;for(let r of t.matchAll(n)){let o=r[2]??r[3];/^([a-z][a-z0-9+.-]*:|#|\/)/i.test(o)||e.push({url:decodeURI(o.split("#")[0].split("?")[0]),image:r[1]==="!"})}return e}function $q(t,e){let n=lt.default.readFileSync(Ie.default.join(t,e),"utf8"),r=Ie.default.posix.dirname(e),o=[];for(let i of Uq(n)){let a=Ie.default.posix.normalize(Ie.default.posix.join(r,i.url));Cl(a)?lt.default.existsSync(Ie.default.join(t,a))||o.push({level:i.image?"error":"warn",where:e,message:`${i.image?"image":"link"} "${i.url}" not found (${a})`}):o.push({level:"error",where:e,message:`"${i.url}" points outside the handover folder`})}return o}function _4(t,e,n){let r=t.get(e,!0);if((0,io.isSeq)(r))return r.flow=!1,r;let o=n.createNode([]);return o.flow=!1,t.set(e,o),o}function x4(t,e,n){if(!lt.default.existsSync(e)||!lt.default.statSync(e).isFile())throw new Error(`not a file: ${e}`);let r=E4(t);if(!(0,io.isMap)(r.contents))throw new Error(`${Lt}: top level must be a mapping`);let o=_4(r.contents,"sections",r),i=Bi(n.section),a=o.items.find(f=>(0,io.isMap)(f)&&(f.get("id")===i||f.get("title")===n.section));a||(a=r.createNode({id:i,title:n.section,lessons:[]}),o.add(a));let s=Ie.default.basename(e),l=n.title??Ie.default.basename(e,Ie.default.extname(e)),c=new Set(o.items.flatMap(f=>(0,io.isMap)(f)&&(0,io.isSeq)(f.get("lessons",!0))?f.get("lessons",!0).items.map(h=>(0,io.isMap)(h)?String(h.get("id")):""):[])),u=n.id?Bi(n.id):Bi(l);for(let f=2;c.has(u);f++)u=`${Bi(n.id??l)}-${f}`;let d=`content/${String(a.get("id")||i)}/${u}/${s}`;return lt.default.mkdirSync(Ie.default.dirname(Ie.default.join(t,d)),{recursive:!0}),lt.default.copyFileSync(e,Ie.default.join(t,d)),_4(a,"lessons",r).add(r.createNode({id:u,title:l,type:n.type??Mq(e),src:d})),lt.default.writeFileSync(Ie.default.join(t,Lt),r.toString({lineWidth:0})),{sectionId:String(a.get("id")||i),lessonId:u,dest:d}}function v4(t,e,n="vi"){let r=Ie.default.resolve(t);lt.default.mkdirSync(Ie.default.join(r,"content"),{recursive:!0});let o=Ie.default.join(r,Lt),i=!lt.default.existsSync(o);i&&lt.default.writeFileSync(o,Bq(e,n));let a=Ie.default.join(r,".gitignore"),s=`${Ux}/`,l=lt.default.existsSync(a)?lt.default.readFileSync(a,"utf8"):"";return l.split(/\r?\n/).includes(s)||lt.default.writeFileSync(a,`${l}${l&&!l.endsWith(`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pan",
3
3
  "displayName": "PAN",
4
- "version": "0.3.40",
4
+ "version": "0.3.41",
5
5
  "description": "Harness cho workspace PAN Stack: mọi commit của Claude mang danh tính AI + người chủ quản + máy; nguồn tài liệu (Pan Lineage) của tệp hiện ra trước khi sửa.",
6
6
  "author": {
7
7
  "name": "n46-labs"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pan",
3
- "version": "0.3.40",
3
+ "version": "0.3.41",
4
4
  "description": "PAN Stack harness for AI agents: every commit carries AI + owner + machine identity, document sources (Pan Lineage) show before edits, and PAN skills load on their own.",
5
5
  "author": {
6
6
  "name": "n46-labs"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pan",
3
3
  "displayName": "PAN",
4
- "version": "0.3.40",
4
+ "version": "0.3.41",
5
5
  "description": "PAN Stack harness for AI agents: every commit carries AI + owner + machine identity, document sources (Pan Lineage) show before edits, and PAN skills load on their own.",
6
6
  "author": {
7
7
  "name": "n46-labs"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pan-stack/cli",
3
- "version": "0.3.40",
3
+ "version": "0.3.41",
4
4
  "description": "PAN Stack CLI — multi-repo git and project commands from .project.yaml",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "bin": {