prjct-cli 3.65.0 → 3.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1260,7 +1260,7 @@ CREATE TABLE velocity_sprints (
1260
1260
  _No changes detected (clean tree / no base range)._
1261
1261
  `;let e=["## Detect changes","",`- **Source**: ${t.source}`,`- **Changed**: ${t.changedFiles.length} file(s)`,`- **Blast radius**: ${t.affectedFiles.length} file(s) (imports + call-graph)`,`- **Risk**: critical ${t.summary.critical} \xB7 high ${t.summary.high} \xB7 medium ${t.summary.medium} \xB7 low ${t.summary.low}`,"","### Per-file risk",""];for(let n of t.changes){let r=n.touchedSymbols.length>0?` \xB7 symbols: ${n.touchedSymbols.slice(0,6).join(", ")}`:"";e.push(`- **${n.risk.toUpperCase()}** \`${n.file}\`${r}`,` - ${n.reasons.join("; ")}`)}if(t.affectedFiles.length>t.changedFiles.length){e.push("","### Affected beyond diff","");let n=t.affectedFiles.filter(r=>!t.changedFiles.includes(r)).slice(0,25);for(let r of n)e.push(`- \`${r}\``);t.affectedFiles.length-t.changedFiles.length>25&&e.push(`- _\u2026+${t.affectedFiles.length-t.changedFiles.length-25} more_`)}return e.push("","_Advisory. Expand with `prjct code trace <symbol>` or MCP `prjct_trace_path`._"),e.join(`
1262
1262
  `)}function SC(t){if(t.changedFiles.length===0)return"detect-changes: no changes detected";let e=[`Detect changes (${t.source}): ${t.changedFiles.length} changed \u2192 blast ${t.affectedFiles.length}`,`Risk: critical=${t.summary.critical} high=${t.summary.high} medium=${t.summary.medium} low=${t.summary.low}`];for(let n of t.changes.slice(0,30)){let r=n.touchedSymbols.length?` [${n.touchedSymbols.slice(0,4).join(",")}]`:"";e.push(` [${n.risk.toUpperCase()}] ${n.file}${r} \u2014 ${n.reasons[0]??""}`)}return e.join(`
1263
- `)}function vC(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var wC,TC,Fl=h(()=>{"use strict";nn();$t();ue();a(yt,"safeGit");a(hC,"listWorkingTreeFiles");a(yC,"listCommittedFiles");a(EC,"resolveDiffBase");a(hh,"parseChangedLinesFromUnifiedDiff");a(kC,"loadHunkLines");a(yh,"symbolsTouchedByHunks");wC=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,TC=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(bC,"classifyRisk");a(Ml,"detectChanges");a($l,"formatDetectChangesMd");a(SC,"formatDetectChangesText");a(vC,"shipStructuralRiskCue")});function _C(t){return t instanceof ei}function xe(t){return _C(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var ei,Uo,ti,rn=h(()=>{"use strict";ei=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Uo=class t extends ei{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},ti=class t extends ei{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(_C,"isPrjctError");a(xe,"getErrorMessage")});function kh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Hl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:kh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:kh(r.host),repoSlug:s}}catch{return{}}}async function xC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function RC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Qn(t){return typeof t=="string"&&t.length>0?t:void 0}function wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function CC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Th(t){let e=T.getDoc(t,"project")||{},n=Qn(e.repoPath),{provider:r,repoSlug:s}=n?Hl(await xC(n)||""):{},i=n?await RC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return CC({provider:r,repoSlug:s,currentBranch:Qn(e.currentBranch),defaultBranch:i,stack:Qn(e.stack),techStack:o&&o.length>0?o:void 0,version:Qn(e.version),commitCount:wh(e.commitCount),fileCount:wh(e.fileCount),lastCommit:Qn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Qn(e.cliVersion),syncedAt:Qn(e.lastSync)})}var Ul=h(()=>{"use strict";j();ue();a(kh,"providerForHost");a(Hl,"parseRemote");a(xC,"gitRemoteUrl");a(RC,"gitDefaultBranch");a(Qn,"str");a(wh,"num");a(CC,"compact");a(Th,"buildProjectMeta")});import{execFile as AC}from"node:child_process";import NC from"node:crypto";import{promisify as IC}from"node:util";function LC(t,e=DC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=NC.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function OC(t){let e;try{let{stdout:s}=await PC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Hl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function bh(t){let e=await OC(t);return e?LC(e):null}var PC,DC,Sh=h(()=>{"use strict";Ul();PC=IC(AC),DC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(LC,"uuidv5");a(OC,"repoKey");a(bh,"deriveProjectId")});var Gl={};L(Gl,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Bl,getVersion:()=>Bo,resetPackageRoot:()=>jC});import Wl from"node:fs";import Wo from"node:path";function Bl(){if(Hr)return Hr;let t=__dirname;for(let e=0;e<5;e++){let n=Wo.join(t,"package.json");if(Wl.existsSync(n))try{if(JSON.parse(Wl.readFileSync(n,"utf-8")).name==="prjct-cli")return Hr=t,t}catch{}t=Wo.dirname(t)}return Hr=Wo.join(__dirname,"..","..",".."),Hr}function Bo(){if(Zn)return Zn;let t="3.65.0";if(t&&/^\d+\.\d+\.\d+/.test(t))return Zn=t,Zn;try{let e=Wo.join(Bl(),"package.json");return Zn=JSON.parse(Wl.readFileSync(e,"utf-8")).version,Zn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",A(e)),"0.0.0"}}function jC(t){Hr=t,Zn=null}var Zn,Hr,Cn,An,sn=h(()=>{"use strict";ie();Zn=null,Hr=null;a(Bl,"getPackageRoot");a(Bo,"getVersion");a(jC,"resetPackageRoot");Cn=Bo(),An=Bl()});async function Go(t){try{let{stdout:e}=await H(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function MC(){let t=await Go("gh api user --jq .login");return t.success&&t.output||(t=await Go("git config --global github.user"),t.success&&t.output)?t.output:null}async function $C(){let t=await Go("git config user.name");return t.success&&t.output?t.output:null}async function FC(){let t=await Go("git config user.email");return t.success&&t.output?t.output:null}async function Ur(){let[t,e,n]=await Promise.all([MC(),$C(),FC()]);return{github:t,email:n,name:e||t||"Unknown"}}var Xo=h(()=>{"use strict";ue();a(Go,"execCommand");a(MC,"detectGitHubUsername");a($C,"detectGitName");a(FC,"detectGitEmail");a(Ur,"detect")});var qo={};L(qo,{worktreeService:()=>HC});import ql from"node:fs/promises";import Ft from"node:path";var vh,Vl,HC,Vo=h(()=>{"use strict";ue();se();vh=".worktrees",Vl=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ft.join(s,vh,n),o=r.branch||`feat/${n}`;await ql.mkdir(Ft.join(s,vh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await H(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await H("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await H(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await H(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await H("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await H("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await H("git rev-parse --git-dir",{cwd:e}),s=Ft.resolve(e,n.trim()),i=Ft.resolve(e,r.trim());if(s!==i){let{stdout:o}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await H("git rev-parse HEAD",{cwd:e}),{stdout:l}=await H("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ft.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await H("git worktree list --porcelain",{cwd:e}),s=r.split(`
1263
+ `)}function vC(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var wC,TC,Fl=h(()=>{"use strict";nn();$t();ue();a(yt,"safeGit");a(hC,"listWorkingTreeFiles");a(yC,"listCommittedFiles");a(EC,"resolveDiffBase");a(hh,"parseChangedLinesFromUnifiedDiff");a(kC,"loadHunkLines");a(yh,"symbolsTouchedByHunks");wC=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,TC=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(bC,"classifyRisk");a(Ml,"detectChanges");a($l,"formatDetectChangesMd");a(SC,"formatDetectChangesText");a(vC,"shipStructuralRiskCue")});function _C(t){return t instanceof ei}function xe(t){return _C(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var ei,Uo,ti,rn=h(()=>{"use strict";ei=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Uo=class t extends ei{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},ti=class t extends ei{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(_C,"isPrjctError");a(xe,"getErrorMessage")});function kh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Hl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:kh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:kh(r.host),repoSlug:s}}catch{return{}}}async function xC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function RC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Qn(t){return typeof t=="string"&&t.length>0?t:void 0}function wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function CC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Th(t){let e=T.getDoc(t,"project")||{},n=Qn(e.repoPath),{provider:r,repoSlug:s}=n?Hl(await xC(n)||""):{},i=n?await RC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return CC({provider:r,repoSlug:s,currentBranch:Qn(e.currentBranch),defaultBranch:i,stack:Qn(e.stack),techStack:o&&o.length>0?o:void 0,version:Qn(e.version),commitCount:wh(e.commitCount),fileCount:wh(e.fileCount),lastCommit:Qn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Qn(e.cliVersion),syncedAt:Qn(e.lastSync)})}var Ul=h(()=>{"use strict";j();ue();a(kh,"providerForHost");a(Hl,"parseRemote");a(xC,"gitRemoteUrl");a(RC,"gitDefaultBranch");a(Qn,"str");a(wh,"num");a(CC,"compact");a(Th,"buildProjectMeta")});import{execFile as AC}from"node:child_process";import NC from"node:crypto";import{promisify as IC}from"node:util";function LC(t,e=DC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=NC.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function OC(t){let e;try{let{stdout:s}=await PC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Hl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function bh(t){let e=await OC(t);return e?LC(e):null}var PC,DC,Sh=h(()=>{"use strict";Ul();PC=IC(AC),DC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(LC,"uuidv5");a(OC,"repoKey");a(bh,"deriveProjectId")});var Gl={};L(Gl,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Bl,getVersion:()=>Bo,resetPackageRoot:()=>jC});import Wl from"node:fs";import Wo from"node:path";function Bl(){if(Hr)return Hr;let t=__dirname;for(let e=0;e<5;e++){let n=Wo.join(t,"package.json");if(Wl.existsSync(n))try{if(JSON.parse(Wl.readFileSync(n,"utf-8")).name==="prjct-cli")return Hr=t,t}catch{}t=Wo.dirname(t)}return Hr=Wo.join(__dirname,"..","..",".."),Hr}function Bo(){if(Zn)return Zn;let t="3.66.0";if(t&&/^\d+\.\d+\.\d+/.test(t))return Zn=t,Zn;try{let e=Wo.join(Bl(),"package.json");return Zn=JSON.parse(Wl.readFileSync(e,"utf-8")).version,Zn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",A(e)),"0.0.0"}}function jC(t){Hr=t,Zn=null}var Zn,Hr,Cn,An,sn=h(()=>{"use strict";ie();Zn=null,Hr=null;a(Bl,"getPackageRoot");a(Bo,"getVersion");a(jC,"resetPackageRoot");Cn=Bo(),An=Bl()});async function Go(t){try{let{stdout:e}=await H(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function MC(){let t=await Go("gh api user --jq .login");return t.success&&t.output||(t=await Go("git config --global github.user"),t.success&&t.output)?t.output:null}async function $C(){let t=await Go("git config user.name");return t.success&&t.output?t.output:null}async function FC(){let t=await Go("git config user.email");return t.success&&t.output?t.output:null}async function Ur(){let[t,e,n]=await Promise.all([MC(),$C(),FC()]);return{github:t,email:n,name:e||t||"Unknown"}}var Xo=h(()=>{"use strict";ue();a(Go,"execCommand");a(MC,"detectGitHubUsername");a($C,"detectGitName");a(FC,"detectGitEmail");a(Ur,"detect")});var qo={};L(qo,{worktreeService:()=>HC});import ql from"node:fs/promises";import Ft from"node:path";var vh,Vl,HC,Vo=h(()=>{"use strict";ue();se();vh=".worktrees",Vl=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ft.join(s,vh,n),o=r.branch||`feat/${n}`;await ql.mkdir(Ft.join(s,vh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await H(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await H("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await H(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await H(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await H("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await H("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await H("git rev-parse --git-dir",{cwd:e}),s=Ft.resolve(e,n.trim()),i=Ft.resolve(e,r.trim());if(s!==i){let{stdout:o}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await H("git rev-parse HEAD",{cwd:e}),{stdout:l}=await H("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ft.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await H("git worktree list --porcelain",{cwd:e}),s=r.split(`
1264
1264
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await H("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=Ft.join(n,".env");await I(r)&&await ql.copyFile(r,Ft.join(e,".env"));let s=Ft.join(n,".prjct"),i=Ft.join(e,".prjct");await I(s)&&!await I(i)&&await ql.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await H("git worktree prune",{cwd:s});for(let i of n)i.isMain||await I(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
1265
1265
 
1266
1266
  `);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
@@ -1481,7 +1481,7 @@ ${i.join(`
1481
1481
  ORDER BY s.shipped_at DESC`,e);return[...n,...r.map(pa)]}catch{return[]}},allEntriesForIndex(t){try{let e=Ln(t,"ORDER BY created_at DESC, rowid DESC"),n=E.query(t,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e,...n.map(pa)]}catch{return[]}}}});function ck(t,e,n=8){let r=e.map(m=>m.trim()).filter(Boolean),s=!!Fe(t),i=!!ht(t),o=new Map;if(r.length>0&&s)try{for(let m of jr(r,Fe(t),2)){if(r.some(f=>f.endsWith(m.path)||m.path.endsWith(f)))continue;let g=o.get(m.path)??{score:0,via:new Set};g.score+=m.score,g.via.add("imports"),o.set(m.path,g)}}catch{}if(r.length>0&&i)try{for(let m of Yn(r,ht(t))){if(r.some(f=>f.endsWith(m.path)||m.path.endsWith(f)))continue;let g=o.get(m.path)??{score:0,via:new Set};g.score+=m.score,g.via.add("cochange"),o.set(m.path,g)}}catch{}let c=[...o.entries()].map(([m,g])=>({path:m,score:g.score,via:g.via.size>1?"both":[...g.via][0]??"imports"})).sort((m,g)=>g.score-m.score).slice(0,n),l=[];for(let m of r.slice(0,5))try{let g=$.recallForFile(t,m,2,{preventiveOnly:!0});for(let f of g)l.push({id:f.id,type:f.type,title:f.content.replace(/\s+/g," ").trim().slice(0,100),file:m})}catch{}let u=c.length>0?`related=${c.slice(0,3).map(m=>m.path.split("/").pop()).join(",")}`:s||i?"related=none-strong":"indexes=cold",d=l.length>0?`traps=${l.length}`:"traps=0",p=r.length===0?"World model: no seed files":`World model impact: seeds=${r.length} \xB7 ${u} \xB7 ${d}`;return{seeds:r,neighbors:c,traps:l.slice(0,n),line:p,hasIndexes:{imports:s,cochange:i}}}var lk=h(()=>{"use strict";Mr();nn();be();a(ck,"breakImpact")});var hd={};L(hd,{enrichedRecall:()=>Pa});async function Pa(t,e,n={}){let{topic:r,types:s,tags:i}=n,o=n.limit??30,c=[];if(r){let l=r.split(/\s+/).filter(Boolean);try{let u=$.searchFts(e,l,o);s&&(u=u.filter(d=>s.includes(d.type))),i&&(u=u.filter(d=>gi(d,i))),c=u}catch{c=[]}}if(c.length===0){let l=new Set(c.map(d=>d.id)),u=$.recall(e,{topic:r,types:s,tags:i,limit:o});for(let d of u)if(!l.has(d.id)&&(c.push(d),c.length>=o))break}if(r)try{let l=await W.readConfig(t);if(l&&fd.isEnabled(l)){let u=await fd.semanticSearch(e,r,l,10);if(u.length>0){let d=new Set(c.map(m=>m.id)),p=u.filter(m=>!d.has(m.id));s&&(p=p.filter(m=>s.includes(m.type))),i&&(p=p.filter(m=>gi(m,i))),c=[...p,...c].slice(0,o)}}}catch{}if(c=c.filter(l=>Bt(l)||(s?.includes(l.type)??!1)),!s?.includes("improvement-signal"))try{let{isAutoSource:l}=await Promise.resolve().then(()=>(os(),od)),u=45*864e5,d=Date.now(),p=c.filter(f=>{if(!l(f.tags?.source)||XP.has(f.type)&&!l(f.tags?.source))return!0;let k=Date.parse(f.rememberedAt);return Number.isFinite(k)?d-k<u:!0}),m=p.filter(f=>!l(f.tags?.source)),g=p.filter(f=>l(f.tags?.source));c=[...m,...g].slice(0,Math.max(o,p.length))}catch{}if(c.length>1&&(c=Gt.rerank(e,c)),n.expandLinks!==!1&&c.length>0){let l=$.expandWithLinks(e,c,5);l.length>0&&(c=c.concat(l))}try{let l=await K.getCurrentTask(e),u=new Date().toISOString();l?.id&&Gt.recordSurfaced(e,c.map(d=>d.id),l.id,u,{queryText:r,surface:"context-memory"});for(let d of c)Gt.recordFetch(e,d.id,u)}catch{}return c}var XP,Da=h(()=>{"use strict";Ie();ka();Dn();ot();Nn();be();XP=new Set(["decision","gotcha","learning","fact","feedback","spec"]);a(Pa,"enrichedRecall")});var wd={};L(wd,{extractFilePathsFromEntries:()=>Ed,formatWorkScopeBlock:()=>yk,isUsefulScopePath:()=>JP,resolveWorkScope:()=>qP,resolveWorkScopeSync:()=>yd,toLikelyFileHits:()=>kd});function yd(t,e,n=dk){let r=e.trim();if(!r)return hk();let s=mk(t,r);return pk(t,r,s,n)}async function qP(t,e,n,r=dk){let s=n.trim();if(!s)return hk();let i=new Set(mk(e,s));try{let{enrichedRecall:o}=await Promise.resolve().then(()=>(Da(),hd)),c=await o(t,e,{topic:s,types:["context","decision","gotcha","anti-pattern","learning"],limit:12});for(let l of Ed(c,e))i.add(l)}catch{}return pk(e,s,i,r)}function pk(t,e,n,r){let s=Zy(t),i=new Map,o=Fr(t),c=Fo(t),l=a((g,f,k,w)=>{if(!Zs(t,g))return;let R=f*Ol(t,g),x=i.get(g);if(!x){i.set(g,{path:g,score:R,signals:[k],reason:w});return}x.score+=R,x.signals.includes(k)||x.signals.push(k),R>=.4&&(x.reason=w)},"bump");for(let g of n)l(g,VP(g,c),"memory","linked from project judgment memory (decision/gotcha/context)");let u=0;if(s.bm25||s.symbols)try{let g=Qy(t,e,{topN:Math.max(r*2,12)});u=g.length;for(let f of g){let k=f.signals.symbols??0,w=[f.signals.bm25>0?"bm25":null,k>0?"symbols":null,f.signals.imports>0?"imports":null,f.signals.cochange>0?"cochange":null].filter(b=>b!==null),R=Math.max(f.signals.bm25,k,f.signals.imports,f.signals.cochange),x=k>=R&&k>0?"matches function/class/route symbols in code graph":f.signals.bm25>=f.signals.imports&&f.signals.bm25>=f.signals.cochange?"matches task terms in code index (BM25)":f.signals.imports>=f.signals.cochange?"import-graph neighbor of matched files":"historically co-changes with matched files";l(f.path,f.finalScore,w[0]??"bm25",x);for(let b of w.slice(1)){let C=i.get(f.path);C&&!C.signals.includes(b)&&C.signals.push(b)}}}catch{}let d=0,p=[...i.keys()].slice(0,5);if(p.length===0&&n.size>0&&p.push(...[...n].slice(0,5)),p.length>0)try{let g=ck(t,p,r);for(let f of g.neighbors)d++,l(f.path,.35*Math.min(1,f.score+.1),f.via==="both"?"imports":f.via,f.via==="cochange"?"historically co-changes with seed files":"import-graph neighbor of seed files")}catch{}let m=[...i.values()].sort((g,f)=>f.score-g.score).slice(0,r);return{files:m,indexesReady:s.bm25||s.imports||s.cochange||s.symbols,sources:{memorySeeds:n.size,indexHits:u,graphNeighbors:d},agentBlock:yk(m,{indexesReady:s.bm25||s.imports||s.cochange||s.symbols,memorySeeds:n.size,inventoryLine:jl(o)})}}function mk(t,e){let n=new Set;try{let r=e.split(/\s+/).filter(i=>i.length>2).slice(0,12),s=[];if(r.length>0)try{s=$.searchFts(t,r,15)}catch{s=[]}s.length===0&&(s=$.recall(t,{types:["gotcha","decision","anti-pattern","context"],limit:20}));for(let i of Ed(s,t))n.add(i)}catch{}return n}function Ed(t,e){let n=new Set,r=a(s=>{let i=gk(s);i&&(e?Zs(e,i)&&n.add(i):fk(i)&&n.add(i))},"accept");for(let s of t){let i=s.tags?.file?.trim();i&&r(i);let o=s.tags?.files?.trim();if(o)for(let u of o.split(",")){let d=u.trim();d&&r(d)}let c=s.content??"";uk.lastIndex=0;let l;for(;(l=uk.exec(c))!==null;)r(l[1])}return[...n]}function gk(t){return t.replace(/^\.\//,"").replace(/\\/g,"/")}function fk(t){let e=gk(t).trim();return!e||e.length<3?!1:e.includes("/")&&e.includes(".")}function VP(t,e){let n=(t.split("/").pop()??t).toLowerCase(),r=n.includes(".")?`.${n.split(".").pop()}`:"";return n==="package.json"||n==="cargo.toml"||n==="go.mod"?.4:e.size>0&&r&&e.has(r)?t.includes("/")?.9:.75:t.includes("/")&&n.includes(".")?.7:.5}function hk(){return{files:[],indexesReady:!1,sources:{memorySeeds:0,indexHits:0,graphNeighbors:0},agentBlock:""}}function yk(t,e){if(t.length===0)return e?.indexesReady===!1?["**Work scope (prjct):** indexes cold \u2014 run `prjct sync` once, then re-resolve scope.",e.inventoryLine?`_${e.inventoryLine}_`:"","Until then: prefer `prjct search` / `prjct context memory <topic>` over raw Grep/Glob walks."].filter(Boolean).join(`
1482
1482
  `):["**Work scope (prjct):** no high-confidence file hits for this query.",e?.inventoryLine?`_${e.inventoryLine}_`:"","MUST still try `prjct context memory <topic>` + `prjct search` before a broad Grep/Glob walk."].filter(Boolean).join(`
1483
1483
  `);let n=["**Work scope \u2014 prjct (MUST read before Grep/Glob):**","> Do NOT walk the tree. Open these first. Expand only via `prjct guard <file>` (graph neighbors + traps) or MCP `prjct_relevant_files` / `prjct_impact_analysis`.",...t.map(r=>{let s=r.signals.length>0?` (${r.signals.join("+")})`:"";return`- \`${r.path}\` \u2014 ${r.reason}${s}`})];return e?.memorySeeds&&e.memorySeeds>0&&n.push(`_Seeded from ${e.memorySeeds} memory path hit(s) + code index + graph._`),e?.inventoryLine&&n.push(`_${e.inventoryLine}_`),n.join(`
1484
- `)}function kd(t){return t.map(({path:e,signals:n,reason:r})=>({path:e,signals:n,reason:r}))}function JP(t,e){return e?Zs(e,t):fk(t)}var dk,uk,La=h(()=>{"use strict";eE();be();Ho();lk();dk=8,uk=/(?:^|[\s`"'(])((?:@?[\w.-]+\/)+[\w.-]+\.[\w.-]+)(?:$|[\s`"'),;:])/g;a(yd,"resolveWorkScopeSync");a(qP,"resolveWorkScope");a(pk,"mergeScope");a(mk,"memoryFileSeedsSync");a(Ed,"extractFilePathsFromEntries");a(gk,"normalizePath");a(fk,"looksLikeRepoPath");a(VP,"memorySeedWeight");a(hk,"emptyResult");a(yk,"formatWorkScopeBlock");a(kd,"toLikelyFileHits");a(JP,"isUsefulScopePath")});var ja,KP,YP,kk=h(()=>{"use strict";ja=[{name:"intent",group:"core",surface:"ai-agile",routing:{group:"spec",method:"draft"},routingMode:"cold-only",optionSchema:{strings:["goal","tags"]},description:"Frame the work brief: objective, constraints, risks, and success signal",usage:{claude:'p. intent "<title>"',terminal:'prjct intent "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["v3 work-cycle replacement for ticket-style planning","Stores the durable brief in SQLite","Sub-verbs mirror spec for compatibility: list, show, update, audit, link-work, ship"]},{name:"work",group:"core",surface:"ai-agile",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec","geometry"],booleans:["extend"]},description:"Start or inspect a work cycle with context and evidence",usage:{claude:'p. work "<intent>"',terminal:'prjct work "<intent>" [--geometry split|single|direct]'},params:"[intent] [--geometry]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["v3 name for the execution cycle formerly exposed as task","No arg \u2192 shows the active work cycle","Surfaces related context before planning/editing","Captures harness/evidence expectations for the cycle"]},{name:"init",group:"core",surface:"support",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'p. init "[idea]"',terminal:'prjct init "[idea]" [--yes] [--pack code,daily]'},params:"[idea] [--yes]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases","`--yes` skips wizard (CI / 60s quickstart)"]},{name:"quickstart",group:"core",surface:"support",routing:{group:"planning",method:"quickstart"},optionSchema:{strings:["pack"]},description:"One-shot init + packs + agent surfaces (\u224860s install)",usage:{claude:"p. quickstart",terminal:"prjct quickstart [--pack code,daily]"},params:"[--pack]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Non-interactive init --yes","Default packs + AGENTS/CLAUDE routing","Prints three next verbs for the agent"]},{name:"task",group:"legacy",surface:"legacy",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"],booleans:["extend"]},description:"Compatibility alias for `work`",usage:{claude:null,terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Deprecated public language: use `prjct work` for the v3 work cycle","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",surface:"ai-agile",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate","allowNewDeps","forcePressure","noJudgmentGate"],strings:["intent","geometry"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",surface:"ai-agile",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"eval",group:"optional",surface:"support",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{name:"status",group:"legacy",surface:"legacy",routing:{group:"primitives",method:"status"},optionSchema:{strings:["tokensIn","tokensOut"]},description:"Compatibility lifecycle escape hatch; prefer `work` outcomes",usage:{claude:null,terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"legacy",surface:"legacy",routing:{group:"primitives",method:"tag"},optionSchema:{},description:"Compatibility metadata escape hatch; prefer synthesized context tags",usage:{claude:null,terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",surface:"ai-agile",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"],booleans:["force","global"]},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'p. remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"forget",group:"core",surface:"ai-agile",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically"]},{name:"close",group:"core",surface:"ai-agile",routing:{group:"primitives",method:"close"},optionSchema:{strings:["reason"]},description:"Resolve/close a memory entry (inbox, signal, trap) so it leaves rotation \u2014 soft-delete + closed tag",usage:{claude:'p. close mem_1234 --reason "fixed in PR"',terminal:'prjct close mem_1234 [--reason "..."] [--md]'},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Soft-removes from recall/FTS/embeddings; records status:closed for audit","Use for resolved inbox/improvement-signals \u2014 prefer over silent forget when the resolution matters"]},{name:"capture",group:"legacy",surface:"legacy",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force","fromCurrent"]},description:"Compatibility inbox fallback; prefer synthesized `remember context`",usage:{claude:null,terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"setup",surface:"support",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"setup",surface:"support",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"setup",surface:"support",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"setup",surface:"support",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",surface:"internal",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"legacy",surface:"legacy",routing:{group:"analysis",method:"analyze"},description:"Compatibility alias for sync analysis",usage:{claude:null,terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"code",group:"optional",surface:"support",routing:{group:"code",method:"code"},optionSchema:{},description:"Structural code graph: symbols, trace, impact/risk, architecture (run after sync)",usage:{claude:"p. code [symbols|trace|impact|architecture|dead|export|import|push-graph|reindex|cbm]",terminal:"prjct code [symbols|trace|impact|architecture|dead|export|import|push-graph|reindex|cbm]"},params:"[symbols|trace|impact|architecture|dead|export|import|push-graph|reindex|cbm] [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Symbol index on sync; 4th work-scope signal; CALLS with enclosing + imports","trace / impact (hunk-level) / architecture / dead one-shots","Per-project cache under ~/.prjct-cli/projects/<id>/ (never in client repo)","push-graph: compact Function/Class/File + CALLS snapshot \u2192 cloud 3D","PreToolUse Grep|Glob augment; ship structural risk cue; optional CBM cli"]},{name:"lean",group:"optional",surface:"support",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",surface:"support",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"judgment",group:"optional",surface:"support",routing:{group:"judgment",method:"judgment"},optionSchema:{booleans:["md"]},description:"Precision judgment v2: evidence tax, DNA, RED/BLUE merge, ghosts, next card, ship gate",usage:{claude:"p. judgment [plan|open|add|merge|challenge|next|approve|\u2026]",terminal:"prjct judgment [sub]"},params:"[plan|open|add|merge|challenge|fix-round|fixed|verify|brief|next|ghosts|approve|escalate|status|clear]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["next \u2192 machine directive card (agent loop never re-derives state)","evidence tax + finding DNA + project ghost FP memory","RED/BLUE dual-blind merge; contradiction auto-escalates","code-strict ship hard-gates on ledger.approved before task complete"]},{name:"sdd",group:"optional",surface:"support",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"setup",surface:"support",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"setup",surface:"support",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents (doctor) or harness surface map (surfaces)",usage:{claude:"p. agents [doctor|surfaces|doctor --fix]",terminal:"prjct agents [doctor|surfaces [--detail]|doctor --fix]"},params:"[doctor|status|list|surfaces] [--fix] [--detail]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","surfaces: benchmark-tier harness map (hooks/MCP/skills wire status)","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Grok"']},{name:"value",group:"legacy",surface:"legacy",routing:{group:"product",method:"value"},optionSchema:{},description:"Compatibility alias for `insights value`",usage:{claude:null,terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"legacy",surface:"legacy",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Compatibility alias for `insights quality`",usage:{claude:null,terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"legacy",surface:"legacy",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Compatibility alias for `insights report`",usage:{claude:null,terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"legacy",surface:"legacy",routing:{group:"product",method:"handoff"},optionSchema:{},description:'Static continuation brief for another agent. For realtime ownership transfer use `prjct switch <agent> --reason "\u2026"` + `prjct accept`.',usage:{claude:null,terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, Grok, and unknown future agents","For stuck same-branch rescue with ownership transfer: prjct switch / accept (not this alias)"]},{name:"guardrails",group:"legacy",surface:"legacy",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Compatibility alias for `insights guardrails`",usage:{claude:null,terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"insights",group:"optional",surface:"ai-agile",routing:{group:"product",method:"insights"},optionSchema:{numbers:["days"]},description:"Harness intelligence: value, quality, reliability, token cost, reports, continuation, and guardrails",usage:{claude:"p. insights [value|quality|reliability|cost|report|continue|guardrails]",terminal:"prjct insights [value|quality|reliability|cost|report|continue|guardrails] [--md]"},params:"[value|quality|reliability|cost|report|continue|guardrails] [agent|days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["v3 surface for project intelligence formerly spread across value/report/handoff/memory-doctor/guardrails","Default view summarizes whether the project is compounding","reliability/trust shows whether value, cost, and performance metrics are decision-ready","cost/spend/tokens shows subscription burn, token coverage, context reuse, and capture gaps","Subcommands remain read-only except where underlying compatibility commands already mutate nothing"]},{name:"performance",group:"optional",surface:"ai-agile",routing:{group:"product",method:"performance"},optionSchema:{numbers:["days"]},description:"Measure dev+LLM efficiency per work cycle: time, tokens, model/runtime, tools, friction",usage:{claude:"p. performance [7]",terminal:"prjct performance [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Uses real task/session rows and available token columns","Stores unknown when a runtime does not expose exact model/token data","Designed to guide the next work cycle, not to create scrum velocity reports"]},{name:"cloud",group:"setup",surface:"support",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): connect/disconnect projects, sync/pull, pause/resume, list, status",usage:{claude:"p. cloud [link|unlink|projects|sync|pull|pause|resume|status] [--all|--interactive|--yes]",terminal:"prjct cloud [sub] [--all|--interactive|--yes]"},params:"[link|unlink|projects|sync|pull|pause|resume|status] [--all|--interactive|--yes]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Local-first: nothing leaves until `prjct connect` / `prjct cloud link`","One project (cwd), one-by-one (--interactive), or all (--all --yes)","Disconnect is soft \u2014 cloud history kept; local vault untouched","Auto-syncs on `prjct ship` and at session end once connected"]},{name:"connect",group:"setup",surface:"support",routing:{group:"cloud",method:"connect"},optionSchema:{},description:"Connect this project to Cloud Sync (alias of `prjct cloud link`)",usage:{claude:"p. connect [--all|--interactive|--yes]",terminal:"prjct connect [--all|--interactive|--yes]"},params:"[--all|--interactive|--yes]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["cwd: connect one repo after `prjct login`","--all --yes: bulk connect (confirm with human first)","--interactive: one-by-one Y/n (TTY)"]},{name:"disconnect",group:"setup",surface:"support",routing:{group:"cloud",method:"disconnect"},optionSchema:{},description:"Disconnect this project from Cloud Sync (alias of `prjct cloud unlink`)",usage:{claude:"p. disconnect [--all|--yes]",terminal:"prjct disconnect [--all|--yes]"},params:"[--all|--yes]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Soft disconnect \u2014 leaves Cloud list; records kept; local vault untouched","Re-connect with `prjct connect`","--all --yes: bulk disconnect after human confirm"]},{name:"workflow",group:"optional",surface:"support",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",surface:"support",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",surface:"support",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup"},params:"[--force] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",surface:"support",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"logout",group:"setup",surface:"support",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"auth",group:"setup",surface:"support",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"context",group:"setup",surface:"support",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"search",group:"core",surface:"ai-agile",routing:{group:"context",method:"search"},optionSchema:{booleans:["global"]},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'p. search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",surface:"support",routing:{group:"update",method:"update"},routingMode:"bin-only",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",surface:"support",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"setup",surface:"support",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"p. team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"embeddings",group:"setup",surface:"support",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"p. embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"log",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"log"},optionSchema:{strings:["task"]},params:"<note>",description:'Append-only implementation journal on the active work cycle \u2014 "what did the last agent try", the cheapest session-to-session continuity. Surfaced in prjct brief and prime.',usage:{claude:'p. log "tried X, blocked on Y"',terminal:'prjct log "<note>" [--task id]'}},{name:"brief",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"brief"},optionSchema:{},description:"COMPILED context artifact for a task: orchestration directive + journal + related memory + recently-landed conventions + graph position. Persisted, regenerable \u2014 retrieval as a build step.",usage:{claude:"p. brief",terminal:"prjct brief [task-id] [--md]"}},{name:"replan",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"replan"},optionSchema:{},params:"<what-changed>",description:"Cascading drift repair: captures the pivot as a decision memory FIRST, then serves a re-plan directive over the open frontier so downstream items get re-evaluated against reality.",usage:{claude:'p. replan "auth moved to JWT"',terminal:'prjct replan "<what changed>"'}},{name:"prime",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"prime"},optionSchema:{},description:"Session-open bundle in ONE pull: active cycle + its last journal entries + ready frontier + pull-pointers. The named start-of-session ceremony.",usage:{claude:"p. prime",terminal:"prjct prime [--md]"}},{name:"land",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"land"},optionSchema:{},description:'Session-close checklist ("land the plane"): open cycle, claimed-but-unfinished items, pending sync, hand-off reminder \u2014 everything that must not die with the context.',usage:{claude:"p. land",terminal:"prjct land [--md]"}},{name:"dream",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"dream"},optionSchema:{booleans:["force","dryRun","md"],numbers:["minHours","minSessions"]},description:"Memory auto-dream: consolidate vault (triage inbox + Rho retention) and rebuild the L0 memory index \u2014 Claude Code KAIROS pattern, deterministic (no model call).",usage:{claude:"p. dream --force",terminal:"prjct dream [--force] [--dry-run] [--min-hours=24] [--min-sessions=5] [--md]"},params:"[--force] [--dry-run]",features:["Gates: \u226524h since last dream AND \u22655 lands (session counter) \u2014 bypass with --force","Phases: orient \u2192 gather \u2192 consolidate (triageInbox + applyRetention) \u2192 prune (L0 index)","Land auto-runs when gates open; dry-run previews without writes"]},{name:"ready",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"ready"},optionSchema:{},description:'The ready frontier: open backlog items with zero unresolved blocking dependencies \u2014 "what can I work on NOW" as a structural query, ranked by how much each item unblocks.',usage:{claude:"p. ready",terminal:"prjct ready [--md]"}},{name:"next",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"next"},optionSchema:{},description:'Deterministic "what now": top unclaimed item of the ready frontier, served WITH its orchestration directive (model tier, effort, ceremony, fan-out, points).',usage:{claude:"p. next",terminal:"prjct next [--md]"}},{name:"claim",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"claim"},optionSchema:{strings:["as"]},params:"<id>",description:"Race-free claim of a backlog item for multi-agent fan-out: succeeds only if unclaimed (atomic check-and-set).",usage:{claude:"p. claim <id>",terminal:"prjct claim <id> [--as name]"}},{name:"depend",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"depend"},optionSchema:{strings:["on","type"]},params:"<id>",description:"Add a typed dependency edge between work items: blocks | parent | related | discovered-from. Blocking edges are cycle-checked.",usage:{claude:"p. depend <id> --on <id>",terminal:"prjct depend <id> --on <id> [--type blocks|parent|related|discovered-from]"}},{name:"phases",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"phases"},optionSchema:{},description:"Topological execution phases over the dependency graph: items in the same phase are parallelizable \u2014 a data-driven fan-out plan with per-item orchestration.",usage:{claude:"p. phases",terminal:"prjct phases [--md]"}},{name:"expand",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"expand"},optionSchema:{},params:"<id>",description:"Decomposition loop: read the persisted complexity record + expansion directive for an item, or persist the agent's decomposition as subtasks with parent edges.",usage:{claude:"p. expand <id>",terminal:'prjct expand <id> ["subtask 1" "subtask 2" ...]'}},{name:"switch",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"switch"},optionSchema:{booleans:["launch"],strings:["reason"]},params:"<agent>",description:"Yield the active work cycle to another agent runtime (codex/claude/grok/\u2026) with who started + why \u2014 realtime handoff for stuck multi-terminal work.",usage:{claude:'p. switch codex --reason "\u2026"',terminal:'prjct switch <agent> [--reason "\u2026"] [--launch]'}},{name:"accept",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"accept"},optionSchema:{},params:"[hand_id]",description:"Accept a pending multi-agent handoff: rebind ownership of the live cycle and print the resume brief (who/why/task id).",usage:{claude:"p. accept [hand_id]",terminal:"prjct accept [hand_id] [--md]"}},{name:"handoffs",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"handoffs"},optionSchema:{},description:"List pending and recent multi-agent handoffs for this project.",usage:{claude:"p. handoffs",terminal:"prjct handoffs [--md]"}},{name:"changelog",group:"changelog",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"changelog",method:"changelog"},optionSchema:{},description:"Release notes from the typed delivery record: what shipped (by version) + completed work cycles in the window. Zero LLM \u2014 pure data-plane render.",usage:{claude:"p. changelog 14",terminal:"prjct changelog [days]"}},{name:"workflows",group:"workflowsReference",surface:"ai-agile",requiresProject:!1,implemented:!0,hasTemplate:!1,routing:{group:"workflowsReference",method:"workflows"},optionSchema:{},description:"Print the quality methodology reference (subagent dispatch, model policy, review/judgment/security workflows) \u2014 the rig-agnostic pull of what Claude reads as workflows.md.",usage:{claude:"p. workflows",terminal:"prjct workflows --md"}},{name:"memory",group:"memoryExport",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"memoryExport",method:"memory"},optionSchema:{booleans:["force","dryRun","md"],strings:["reason"]},description:"Memory surface: export|import (git-shareable), index (L0 TOC), close|forget (lifecycle), dream (auto-consolidation).",usage:{claude:"p. memory index",terminal:"prjct memory export|import|index|close <id>|forget <id>|dream [--force] [--dry-run]"},features:["export/import \u2014 git-shareable JSONL under .prjct/memory-export/","index \u2014 rebuild/show L0 compact memory TOC (SessionStart injects it)","close/forget \u2014 lifecycle aliases of top-level verbs","dream \u2014 auto-consolidation + L0 rebuild"]},{name:"guard",group:"core",surface:"ai-agile",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"],strings:["diff"],booleans:["strict"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"p. guard <file>",terminal:"prjct guard <file> | prjct guard --diff <range> [--strict]"},params:"[file]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"setup",surface:"support",routing:{group:"config",method:"config"},optionSchema:{},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"p. config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"legacy",surface:"legacy",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Compatibility alias for `intent` \u2014 Goal/Acceptance/Scope/Risks before work starts.",usage:{claude:null,terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"legacy",surface:"legacy",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Compatibility alias for `intent audit <id>`",usage:{claude:null,terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["harness","Harness scorecard + Body/rig adoption (score \xB7 learn-from \xB7 list \xB7 use)"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([t,e,n])=>({name:t,group:"setup",description:e,routing:n,usage:{claude:null,terminal:`prjct ${t}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],KP={"-h":"help","--help":"help","-v":"version","--version":"version"},YP=new Set([...ja.filter(t=>t.routingMode==="bin-only").map(t=>t.name),...Object.entries(KP).filter(([,t])=>ja.some(e=>e.name===t&&e.routingMode==="bin-only")).map(([t])=>t)])});var wk,Tk=h(()=>{"use strict";kk();wk=new Set(ja.filter(t=>t.routing).map(t=>t.name))});var bk={};L(bk,{getGitBranch:()=>ur,getModifiedFiles:()=>zP});async function ur(t){try{let{stdout:e}=await H("git branch --show-current",{cwd:t});return e.trim()||void 0}catch{return}}async function zP(t,e=20){try{let{stdout:n}=await H("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:t});return n.trim().split(`
1484
+ `)}function kd(t){return t.map(({path:e,signals:n,reason:r})=>({path:e,signals:n,reason:r}))}function JP(t,e){return e?Zs(e,t):fk(t)}var dk,uk,La=h(()=>{"use strict";eE();be();Ho();lk();dk=8,uk=/(?:^|[\s`"'(])((?:@?[\w.-]+\/)+[\w.-]+\.[\w.-]+)(?:$|[\s`"'),;:])/g;a(yd,"resolveWorkScopeSync");a(qP,"resolveWorkScope");a(pk,"mergeScope");a(mk,"memoryFileSeedsSync");a(Ed,"extractFilePathsFromEntries");a(gk,"normalizePath");a(fk,"looksLikeRepoPath");a(VP,"memorySeedWeight");a(hk,"emptyResult");a(yk,"formatWorkScopeBlock");a(kd,"toLikelyFileHits");a(JP,"isUsefulScopePath")});var ja,KP,YP,kk=h(()=>{"use strict";ja=[{name:"intent",group:"core",surface:"ai-agile",routing:{group:"spec",method:"draft"},routingMode:"cold-only",optionSchema:{strings:["goal","tags"]},description:"Frame the work brief: objective, constraints, risks, and success signal",usage:{claude:'p. intent "<title>"',terminal:'prjct intent "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["v3 work-cycle replacement for ticket-style planning","Stores the durable brief in SQLite","Sub-verbs mirror spec for compatibility: list, show, update, audit, link-work, ship"]},{name:"work",group:"core",surface:"ai-agile",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec","geometry"],booleans:["extend"]},description:"Start or inspect a work cycle with context and evidence",usage:{claude:'p. work "<intent>"',terminal:'prjct work "<intent>" [--geometry split|single|direct]'},params:"[intent] [--geometry]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["v3 name for the execution cycle formerly exposed as task","No arg \u2192 shows the active work cycle","Surfaces related context before planning/editing","Captures harness/evidence expectations for the cycle"]},{name:"init",group:"core",surface:"support",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'p. init "[idea]"',terminal:'prjct init "[idea]" [--yes] [--pack code,daily]'},params:"[idea] [--yes]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases","`--yes` skips wizard (CI / 60s quickstart)"]},{name:"quickstart",group:"core",surface:"support",routing:{group:"planning",method:"quickstart"},optionSchema:{strings:["pack"]},description:"One-shot init + packs + agent surfaces (\u224860s install)",usage:{claude:"p. quickstart",terminal:"prjct quickstart [--pack code,daily]"},params:"[--pack]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Non-interactive init --yes","Default packs + AGENTS/CLAUDE routing","Prints three next verbs for the agent"]},{name:"task",group:"legacy",surface:"legacy",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"],booleans:["extend"]},description:"Compatibility alias for `work`",usage:{claude:null,terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Deprecated public language: use `prjct work` for the v3 work cycle","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",surface:"ai-agile",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate","allowNewDeps","forcePressure","noJudgmentGate"],strings:["intent","geometry"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",surface:"ai-agile",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"eval",group:"optional",surface:"support",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{name:"status",group:"legacy",surface:"legacy",routing:{group:"primitives",method:"status"},optionSchema:{strings:["tokensIn","tokensOut"]},description:"Compatibility lifecycle escape hatch; prefer `work` outcomes",usage:{claude:null,terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"legacy",surface:"legacy",routing:{group:"primitives",method:"tag"},optionSchema:{},description:"Compatibility metadata escape hatch; prefer synthesized context tags",usage:{claude:null,terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",surface:"ai-agile",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"],booleans:["force","global"]},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'p. remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"forget",group:"core",surface:"ai-agile",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically"]},{name:"close",group:"core",surface:"ai-agile",routing:{group:"primitives",method:"close"},optionSchema:{strings:["reason"]},description:"Resolve/close a memory entry (inbox, signal, trap) so it leaves rotation \u2014 soft-delete + closed tag",usage:{claude:'p. close mem_1234 --reason "fixed in PR"',terminal:'prjct close mem_1234 [--reason "..."] [--md]'},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Soft-removes from recall/FTS/embeddings; records status:closed for audit","Use for resolved inbox/improvement-signals \u2014 prefer over silent forget when the resolution matters"]},{name:"capture",group:"legacy",surface:"legacy",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force","fromCurrent"]},description:"Compatibility inbox fallback; prefer synthesized `remember context`",usage:{claude:null,terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"setup",surface:"support",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"setup",surface:"support",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"setup",surface:"support",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"setup",surface:"support",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",surface:"internal",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"legacy",surface:"legacy",routing:{group:"analysis",method:"analyze"},description:"Compatibility alias for sync analysis",usage:{claude:null,terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"code",group:"optional",surface:"support",routing:{group:"code",method:"code"},optionSchema:{},description:"Structural code graph: symbols, trace, impact/risk, architecture (run after sync)",usage:{claude:"p. code [symbols|trace|impact|architecture|dead|export|import|push-graph|reindex|cbm]",terminal:"prjct code [symbols|trace|impact|architecture|dead|export|import|push-graph|reindex|cbm]"},params:"[symbols|trace|impact|architecture|dead|export|import|push-graph|reindex|cbm] [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Symbol index on sync; 4th work-scope signal; CALLS with enclosing + imports","trace / impact (hunk-level) / architecture / dead one-shots","Per-project cache under ~/.prjct-cli/projects/<id>/ (never in client repo)","push-graph: compact Function/Class/File + CALLS snapshot \u2192 cloud 3D","PreToolUse Grep|Glob augment; ship structural risk cue; optional CBM cli"]},{name:"lean",group:"optional",surface:"support",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",surface:"support",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"judgment",group:"optional",surface:"support",routing:{group:"judgment",method:"judgment"},optionSchema:{booleans:["md"]},description:"Precision judgment v2: evidence tax, DNA, RED/BLUE merge, ghosts, next card, ship gate",usage:{claude:"p. judgment [plan|open|add|merge|challenge|next|approve|\u2026]",terminal:"prjct judgment [sub]"},params:"[plan|open|add|merge|challenge|fix-round|fixed|verify|brief|next|ghosts|approve|escalate|status|clear]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["next \u2192 machine directive card (agent loop never re-derives state)","evidence tax + finding DNA + project ghost FP memory","RED/BLUE dual-blind merge; contradiction auto-escalates","code-strict ship hard-gates on ledger.approved before task complete"]},{name:"sdd",group:"optional",surface:"support",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"setup",surface:"support",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"setup",surface:"support",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents (doctor) or harness surface map (surfaces)",usage:{claude:"p. agents [doctor|surfaces|doctor --fix]",terminal:"prjct agents [doctor|surfaces [--detail]|doctor --fix]"},params:"[doctor|status|list|surfaces] [--fix] [--detail]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","surfaces: benchmark-tier harness map (hooks/MCP/skills wire status)","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Grok"']},{name:"value",group:"legacy",surface:"legacy",routing:{group:"product",method:"value"},optionSchema:{},description:"Compatibility alias for `insights value`",usage:{claude:null,terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"legacy",surface:"legacy",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Compatibility alias for `insights quality`",usage:{claude:null,terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"legacy",surface:"legacy",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Compatibility alias for `insights report`",usage:{claude:null,terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"legacy",surface:"legacy",routing:{group:"product",method:"handoff"},optionSchema:{},description:'Static continuation brief for another agent. For realtime ownership transfer use `prjct switch <agent> --reason "\u2026"` + `prjct accept`.',usage:{claude:null,terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, Grok, and unknown future agents","For stuck same-branch rescue with ownership transfer: prjct switch / accept (not this alias)"]},{name:"guardrails",group:"legacy",surface:"legacy",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Compatibility alias for `insights guardrails`",usage:{claude:null,terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"insights",group:"optional",surface:"ai-agile",routing:{group:"product",method:"insights"},optionSchema:{numbers:["days"]},description:"Harness intelligence: value, quality, reliability, token cost, reports, continuation, and guardrails",usage:{claude:"p. insights [value|quality|reliability|cost|report|continue|guardrails]",terminal:"prjct insights [value|quality|reliability|cost|report|continue|guardrails] [--md]"},params:"[value|quality|reliability|cost|report|continue|guardrails] [agent|days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["v3 surface for project intelligence formerly spread across value/report/handoff/memory-doctor/guardrails","Default view summarizes whether the project is compounding","reliability/trust shows whether value, cost, and performance metrics are decision-ready","cost/spend/tokens shows subscription burn, token coverage, context reuse, and capture gaps","Subcommands remain read-only except where underlying compatibility commands already mutate nothing"]},{name:"performance",group:"optional",surface:"ai-agile",routing:{group:"product",method:"performance"},optionSchema:{numbers:["days"]},description:"Measure dev+LLM efficiency per work cycle: time, tokens, model/runtime, tools, friction",usage:{claude:"p. performance [7]",terminal:"prjct performance [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Uses real task/session rows and available token columns","Stores unknown when a runtime does not expose exact model/token data","Designed to guide the next work cycle, not to create scrum velocity reports"]},{name:"cloud",group:"setup",surface:"support",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): connect/disconnect projects, sync/pull, pause/resume, list, status",usage:{claude:"p. cloud [link|unlink|projects|sync|pull|pause|resume|status] [--all|--interactive|--yes]",terminal:"prjct cloud [sub] [--all|--interactive|--yes]"},params:"[link|unlink|projects|sync|pull|pause|resume|status] [--all|--interactive|--yes]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Local-first: nothing leaves until `prjct connect` / `prjct cloud link`","One project (cwd), one-by-one (--interactive), or all (--all --yes)","Disconnect is soft \u2014 cloud history kept; local vault untouched","Auto-syncs on `prjct ship` and at session end once connected"]},{name:"connect",group:"setup",surface:"support",routing:{group:"cloud",method:"connect"},optionSchema:{},description:"Connect this project to Cloud Sync (alias of `prjct cloud link`)",usage:{claude:"p. connect [--all|--interactive|--yes]",terminal:"prjct connect [--all|--interactive|--yes]"},params:"[--all|--interactive|--yes]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["cwd: connect one repo after `prjct login`","--all --yes: bulk connect (confirm with human first)","--interactive: one-by-one Y/n (TTY)"]},{name:"disconnect",group:"setup",surface:"support",routing:{group:"cloud",method:"disconnect"},optionSchema:{},description:"Disconnect this project from Cloud Sync (alias of `prjct cloud unlink`)",usage:{claude:"p. disconnect [--all|--yes]",terminal:"prjct disconnect [--all|--yes]"},params:"[--all|--yes]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Soft disconnect \u2014 leaves Cloud list; records kept; local vault untouched","Re-connect with `prjct connect`","--all --yes: bulk disconnect after human confirm"]},{name:"workflow",group:"optional",surface:"support",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",surface:"support",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",surface:"support",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup"},params:"[--force] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",surface:"support",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"logout",group:"setup",surface:"support",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"auth",group:"setup",surface:"support",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"context",group:"setup",surface:"support",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"search",group:"core",surface:"ai-agile",routing:{group:"context",method:"search"},optionSchema:{booleans:["global"]},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'p. search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",surface:"support",routing:{group:"update",method:"update"},routingMode:"bin-only",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",surface:"support",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"setup",surface:"support",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"p. team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"embeddings",group:"setup",surface:"support",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"p. embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"log",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"log"},optionSchema:{strings:["task"]},params:"<note>",description:'Append-only implementation journal on the active work cycle \u2014 "what did the last agent try", the cheapest session-to-session continuity. Surfaced in prjct brief and prime.',usage:{claude:'p. log "tried X, blocked on Y"',terminal:'prjct log "<note>" [--task id]'}},{name:"brief",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"brief"},optionSchema:{},description:"COMPILED context artifact for a task: orchestration directive + journal + related memory + recently-landed conventions + graph position. Persisted, regenerable \u2014 retrieval as a build step.",usage:{claude:"p. brief",terminal:"prjct brief [task-id] [--md]"}},{name:"replan",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"replan"},optionSchema:{},params:"<what-changed>",description:"Cascading drift repair: captures the pivot as a decision memory FIRST, then serves a re-plan directive over the open frontier so downstream items get re-evaluated against reality.",usage:{claude:'p. replan "auth moved to JWT"',terminal:'prjct replan "<what changed>"'}},{name:"plan",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"plan"},optionSchema:{},params:'["title"] | show | write "<md>" | approve | clear',description:"Plan-mode ceremony (read-only until approve): SQLite-backed plan with Context/Approach/Files/Reuse/Verification. Host must not edit source while status is draft.",usage:{claude:'p. plan "Add auth"',terminal:'prjct plan ["title"] | show | write "..." | approve | clear [--md]'},features:["Grok Build plan-mode pattern at the harness layer (no TUI ownership)","draft \u2192 write \u2192 approve; approve persists a decision memory","Single SoT in kv_store work-plan:active"]},{name:"prime",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"prime"},optionSchema:{},description:"Session-open bundle in ONE pull: active cycle + its last journal entries + ready frontier + pull-pointers. The named start-of-session ceremony.",usage:{claude:"p. prime",terminal:"prjct prime [--md]"}},{name:"land",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"land"},optionSchema:{},description:'Session-close checklist ("land the plane"): open cycle, claimed-but-unfinished items, pending sync, hand-off reminder \u2014 everything that must not die with the context.',usage:{claude:"p. land",terminal:"prjct land [--md]"}},{name:"dream",group:"ceremonies",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"ceremonies",method:"dream"},optionSchema:{booleans:["force","dryRun","md"],numbers:["minHours","minSessions"]},description:"Memory auto-dream: consolidate vault (triage inbox + Rho retention) and rebuild the L0 memory index \u2014 Claude Code KAIROS pattern, deterministic (no model call).",usage:{claude:"p. dream --force",terminal:"prjct dream [--force] [--dry-run] [--min-hours=24] [--min-sessions=5] [--md]"},params:"[--force] [--dry-run]",features:["Gates: \u226524h since last dream AND \u22655 lands (session counter) \u2014 bypass with --force","Phases: orient \u2192 gather \u2192 consolidate (triageInbox + applyRetention) \u2192 prune (L0 index)","Land auto-runs when gates open; dry-run previews without writes"]},{name:"ready",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"ready"},optionSchema:{},description:'The ready frontier: open backlog items with zero unresolved blocking dependencies \u2014 "what can I work on NOW" as a structural query, ranked by how much each item unblocks.',usage:{claude:"p. ready",terminal:"prjct ready [--md]"}},{name:"next",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"next"},optionSchema:{},description:'Deterministic "what now": top unclaimed item of the ready frontier, served WITH its orchestration directive (model tier, effort, ceremony, fan-out, points).',usage:{claude:"p. next",terminal:"prjct next [--md]"}},{name:"claim",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"claim"},optionSchema:{strings:["as"]},params:"<id>",description:"Race-free claim of a backlog item for multi-agent fan-out: succeeds only if unclaimed (atomic check-and-set).",usage:{claude:"p. claim <id>",terminal:"prjct claim <id> [--as name]"}},{name:"depend",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"depend"},optionSchema:{strings:["on","type"]},params:"<id>",description:"Add a typed dependency edge between work items: blocks | parent | related | discovered-from. Blocking edges are cycle-checked.",usage:{claude:"p. depend <id> --on <id>",terminal:"prjct depend <id> --on <id> [--type blocks|parent|related|discovered-from]"}},{name:"phases",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"phases"},optionSchema:{},description:"Topological execution phases over the dependency graph: items in the same phase are parallelizable \u2014 a data-driven fan-out plan with per-item orchestration.",usage:{claude:"p. phases",terminal:"prjct phases [--md]"}},{name:"expand",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"expand"},optionSchema:{},params:"<id>",description:"Decomposition loop: read the persisted complexity record + expansion directive for an item, or persist the agent's decomposition as subtasks with parent edges.",usage:{claude:"p. expand <id>",terminal:'prjct expand <id> ["subtask 1" "subtask 2" ...]'}},{name:"switch",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"switch"},optionSchema:{booleans:["launch"],strings:["reason"]},params:"<agent>",description:"Yield the active work cycle to another agent runtime (codex/claude/grok/\u2026) with who started + why \u2014 realtime handoff for stuck multi-terminal work.",usage:{claude:'p. switch codex --reason "\u2026"',terminal:'prjct switch <agent> [--reason "\u2026"] [--launch]'}},{name:"accept",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"accept"},optionSchema:{},params:"[hand_id]",description:"Accept a pending multi-agent handoff: rebind ownership of the live cycle and print the resume brief (who/why/task id).",usage:{claude:"p. accept [hand_id]",terminal:"prjct accept [hand_id] [--md]"}},{name:"handoffs",group:"workGraph",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"workGraph",method:"handoffs"},optionSchema:{},description:"List pending and recent multi-agent handoffs for this project.",usage:{claude:"p. handoffs",terminal:"prjct handoffs [--md]"}},{name:"changelog",group:"changelog",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"changelog",method:"changelog"},optionSchema:{},description:"Release notes from the typed delivery record: what shipped (by version) + completed work cycles in the window. Zero LLM \u2014 pure data-plane render.",usage:{claude:"p. changelog 14",terminal:"prjct changelog [days]"}},{name:"workflows",group:"workflowsReference",surface:"ai-agile",requiresProject:!1,implemented:!0,hasTemplate:!1,routing:{group:"workflowsReference",method:"workflows"},optionSchema:{},description:"Print the quality methodology reference (subagent dispatch, model policy, review/judgment/security workflows) \u2014 the rig-agnostic pull of what Claude reads as workflows.md.",usage:{claude:"p. workflows",terminal:"prjct workflows --md"}},{name:"memory",group:"memoryExport",surface:"ai-agile",requiresProject:!0,implemented:!0,hasTemplate:!1,routing:{group:"memoryExport",method:"memory"},optionSchema:{booleans:["force","dryRun","md"],strings:["reason"]},description:"Memory surface: export|import (git-shareable), index (L0 TOC), close|forget (lifecycle), dream (auto-consolidation).",usage:{claude:"p. memory index",terminal:"prjct memory export|import|index|close <id>|forget <id>|dream [--force] [--dry-run]"},features:["export/import \u2014 git-shareable JSONL under .prjct/memory-export/","index \u2014 rebuild/show L0 compact memory TOC (SessionStart injects it)","close/forget \u2014 lifecycle aliases of top-level verbs","dream \u2014 auto-consolidation + L0 rebuild"]},{name:"guard",group:"core",surface:"ai-agile",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"],strings:["diff"],booleans:["strict"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"p. guard <file>",terminal:"prjct guard <file> | prjct guard --diff <range> [--strict]"},params:"[file]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"setup",surface:"support",routing:{group:"config",method:"config"},optionSchema:{},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"p. config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"legacy",surface:"legacy",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Compatibility alias for `intent` \u2014 Goal/Acceptance/Scope/Risks before work starts.",usage:{claude:null,terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"legacy",surface:"legacy",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Compatibility alias for `intent audit <id>`",usage:{claude:null,terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["harness","Harness scorecard + Body/rig adoption (score \xB7 learn-from \xB7 list \xB7 use)"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([t,e,n])=>({name:t,group:"setup",description:e,routing:n,usage:{claude:null,terminal:`prjct ${t}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],KP={"-h":"help","--help":"help","-v":"version","--version":"version"},YP=new Set([...ja.filter(t=>t.routingMode==="bin-only").map(t=>t.name),...Object.entries(KP).filter(([,t])=>ja.some(e=>e.name===t&&e.routingMode==="bin-only")).map(([t])=>t)])});var wk,Tk=h(()=>{"use strict";kk();wk=new Set(ja.filter(t=>t.routing).map(t=>t.name))});var bk={};L(bk,{getGitBranch:()=>ur,getModifiedFiles:()=>zP});async function ur(t){try{let{stdout:e}=await H("git branch --show-current",{cwd:t});return e.trim()||void 0}catch{return}}async function zP(t,e=20){try{let{stdout:n}=await H("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:t});return n.trim().split(`
1485
1485
  `).filter(r=>r.length>0).slice(0,e)}catch{return[]}}var Ni=h(()=>{"use strict";ue();a(ur,"getGitBranch");a(zP,"getModifiedFiles")});function QP(t){return{projectId:t.project_id,taskId:t.task_id,workspaceId:t.workspace_id,classification:t.classification,station:t.station,requiresSpec:t.requires_spec===1,requiresTestsFirst:t.requires_tests_first===1,reason:t.reason,linkedSpecId:t.linked_spec_id,createdAt:t.created_at,updatedAt:t.updated_at}}function Sk(t,e){let n=Ii(t,e.taskId,e.workspaceId),r=_(),s=n?.createdAt??r;return T.run(t,`INSERT INTO task_pipeline_state (
1486
1486
  project_id, task_id, workspace_id, classification, station,
1487
1487
  requires_spec, requires_tests_first, reason, linked_spec_id,
@@ -1496,13 +1496,13 @@ ${i.join(`
1496
1496
  linked_spec_id = excluded.linked_spec_id,
1497
1497
  updated_at = excluded.updated_at`,t,e.taskId,e.workspaceId,e.classification,e.station,e.requiresSpec?1:0,e.requiresTestsFirst?1:0,e.reason,e.linkedSpecId??null,s,r),Ii(t,e.taskId,e.workspaceId)}function Ii(t,e,n){let s=T.query(t,`SELECT * FROM task_pipeline_state
1498
1498
  WHERE project_id = ? AND task_id = ? AND workspace_id = ?
1499
- LIMIT 1`,t,e,n)[0];return s?QP(s):null}var Td=h(()=>{"use strict";ee();j();a(QP,"toState");a(Sk,"upsertTaskPipelineState");a(Ii,"getTaskPipelineState")});import vk from"node:path";var ZP,eD,Ma,_k=h(()=>{"use strict";ee();se();ZP=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],eD=`# Changelog
1499
+ LIMIT 1`,t,e,n)[0];return s?QP(s):null}var Td=h(()=>{"use strict";ee();j();a(QP,"toState");a(Sk,"upsertTaskPipelineState");a(Ii,"getTaskPipelineState")});import vk from"node:path";var ZP,e0,Ma,_k=h(()=>{"use strict";ee();se();ZP=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],e0=`# Changelog
1500
1500
 
1501
1501
  All notable changes to this project will be documented in this file.
1502
1502
 
1503
1503
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
1504
1504
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1505
- `,Ma=class{static{a(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let r of ZP){let s=vk.join(this.projectPath,r);if(await I(s)){let i=await gt(s),o=this.detectFormat(i);return{filePath:s,fileName:r,format:o,created:!1}}}let e="CHANGELOG.md",n=vk.join(this.projectPath,e);return await wn(n,`${eD}
1505
+ `,Ma=class{static{a(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let r of ZP){let s=vk.join(this.projectPath,r);if(await I(s)){let i=await gt(s),o=this.detectFormat(i);return{filePath:s,fileName:r,format:o,created:!1}}}let e="CHANGELOG.md",n=vk.join(this.projectPath,e);return await wn(n,`${e0}
1506
1506
  `),{filePath:n,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let n=await this.detect(),r=await gt(n.filePath);if(this.hasVersionEntry(r,e.version,n.format))return;let s=e.date||Zg(new Date),i;n.format==="keepachangelog"?i=this.insertKeepAChangelogEntry(r,e,s):i=this.insertMarkdownEntry(r,e,s),await wn(n.filePath,i)}hasVersionEntry(e,n,r){let s=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return(r==="keepachangelog"?new RegExp(`^## \\[${s}\\]`,"m"):new RegExp(`^## ${s}\\b`,"m")).test(e)}async addFeature(e,n){await this.addEntry({version:e,sections:{Added:[n]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,n,r){let s=e.split(`
1507
1507
  `),i=s.findIndex(l=>/^##\s*\[Unreleased\]\s*$/i.test(l));if(i!==-1){let l=s.length;for(let m=i+1;m<s.length;m++)if(/^##\s/.test(s[m])){l=m;break}let u=s.slice(i+1,l).join(`
1508
1508
  `).trim(),d=this.promoteUnreleasedBody(u,n,r);return`${[...s.slice(0,i),"## [Unreleased]","",d,"",...s.slice(l)].join(`
@@ -1533,21 +1533,21 @@ ${c}`}return`${s}
1533
1533
 
1534
1534
  ${e}`}formatKeepAChangelogEntry(e,n){let r=[`## [${e.version}] - ${n}`];if(r.push(""),e.sections)for(let[s,i]of Object.entries(e.sections)){r.push(`### ${s}`);for(let o of i)r.push(`- ${o}`);r.push("")}else e.description&&(r.push("### Added"),r.push(`- ${e.description}`),r.push(""));return r.join(`
1535
1535
  `)}formatMarkdownEntry(e,n){let r=[`## ${e.version} - ${n}`];if(r.push(""),e.sections)for(let[s,i]of Object.entries(e.sections)){r.push(`### ${s}`);for(let o of i)r.push(`- ${o}`);r.push("")}else e.description&&(r.push(`- ${e.description}`),r.push(""));return r.join(`
1536
- `)}}});import dr from"node:path";function bd(t){return/^\d+\.\d+\.\d+/.test(t)}function pr(t){let e=t.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return t;let[,n,r,s,i]=e;if(i){let o=i.split("."),c=o.length-1;return/^\d+$/.test(o[c])?(o[c]=String(Number(o[c])+1),`${n}.${r}.${s}-${o.join(".")}`):`${n}.${r}.${s}-${i}.1`}return`${n}.${r}.${Number(s)+1}`}function tD(t){let e=t.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${e[1]}.${Number(e[2])+1}.0`:t}function nD(t){let e=t.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${Number(e[1])+1}.0.0`:t}function rD(t,e){return e==="major"?nD(t):e==="minor"?tD(t):pr(t)}function Ak(t){let e=(t??"").toLowerCase().trim();return e?/^[a-z]+(\([^)]*\))?!:/.test(e)||e.includes("breaking change")?"major":/^(fix|chore|docs|refactor|perf|style|test|build|ci|revert)(\([^)]*\))?:/.test(e)?"patch":"minor":"patch"}function xk(t){let e=t.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Rk(t){let e=t.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let r=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}let n=t.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(n){let r=n[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}return null}function Ck(t){return t.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var $a,Nk=h(()=>{"use strict";ue();se();$a=class{static{a(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let n of e){let r=await n();if(r)return r}return this.createFallbackVersion()}async bump(e="patch"){let n=await this.detect();if(n.file){let s=await this.readVersionFromGitHead(n.file,n.format);if(s&&this.isAheadOf(n.current,s))return n.current}let r=rD(n.current,e);return await this.writeVersion({...n,next:r}),r}async readVersionFromGitHead(e,n){try{let r=dr.relative(this.projectPath,e),{stdout:s}=await U("git",["show",`HEAD:${r}`],{cwd:this.projectPath});if(n==="json")return JSON.parse(s).version??null;if(n==="plaintext"){let i=s.trim();return bd(i)?i:null}return n==="toml"?xk(s)??Rk(s):n==="xml"?Ck(s):null}catch{return null}}isAheadOf(e,n){let r=e.split(".").map(i=>Number.parseInt(i,10)||0),s=n.split(".").map(i=>Number.parseInt(i,10)||0);for(let i=0;i<3;i++){let o=r[i]??0,c=s[i]??0;if(o>c)return!0;if(o<c)return!1}return!1}async fromPackageJson(){let e=dr.join(this.projectPath,"package.json"),n=await We(e,null);return n?.version?{current:n.version,next:pr(n.version),file:e,format:"json"}:null}async fromCargoToml(){let e=dr.join(this.projectPath,"Cargo.toml"),n=await gt(e,"");if(!n)return null;let r=xk(n);return r?{current:r,next:pr(r),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=dr.join(this.projectPath,"pyproject.toml"),n=await gt(e,"");if(!n)return null;let r=Rk(n);return r?{current:r,next:pr(r),file:e,format:"toml"}:null}async fromCsproj(){let e=await Tn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let n=dr.join(this.projectPath,e[0]),r=await gt(n,"");if(!r)return null;let s=Ck(r);return s?{current:s,next:pr(s),file:n,format:"xml"}:null}async fromVersionFile(e){let n=dr.join(this.projectPath,e),r=await gt(n,"");if(!r)return null;let s=r.trim();return bd(s)?{current:s,next:pr(s),file:n,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await H("git tag --sort=-v:refname",{cwd:this.projectPath}),n=e.trim().split(`
1536
+ `)}}});import dr from"node:path";function bd(t){return/^\d+\.\d+\.\d+/.test(t)}function pr(t){let e=t.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return t;let[,n,r,s,i]=e;if(i){let o=i.split("."),c=o.length-1;return/^\d+$/.test(o[c])?(o[c]=String(Number(o[c])+1),`${n}.${r}.${s}-${o.join(".")}`):`${n}.${r}.${s}-${i}.1`}return`${n}.${r}.${Number(s)+1}`}function t0(t){let e=t.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${e[1]}.${Number(e[2])+1}.0`:t}function n0(t){let e=t.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${Number(e[1])+1}.0.0`:t}function r0(t,e){return e==="major"?n0(t):e==="minor"?t0(t):pr(t)}function Ak(t){let e=(t??"").toLowerCase().trim();return e?/^[a-z]+(\([^)]*\))?!:/.test(e)||e.includes("breaking change")?"major":/^(fix|chore|docs|refactor|perf|style|test|build|ci|revert)(\([^)]*\))?:/.test(e)?"patch":"minor":"patch"}function xk(t){let e=t.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Rk(t){let e=t.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let r=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}let n=t.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(n){let r=n[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}return null}function Ck(t){return t.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var $a,Nk=h(()=>{"use strict";ue();se();$a=class{static{a(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let n of e){let r=await n();if(r)return r}return this.createFallbackVersion()}async bump(e="patch"){let n=await this.detect();if(n.file){let s=await this.readVersionFromGitHead(n.file,n.format);if(s&&this.isAheadOf(n.current,s))return n.current}let r=r0(n.current,e);return await this.writeVersion({...n,next:r}),r}async readVersionFromGitHead(e,n){try{let r=dr.relative(this.projectPath,e),{stdout:s}=await U("git",["show",`HEAD:${r}`],{cwd:this.projectPath});if(n==="json")return JSON.parse(s).version??null;if(n==="plaintext"){let i=s.trim();return bd(i)?i:null}return n==="toml"?xk(s)??Rk(s):n==="xml"?Ck(s):null}catch{return null}}isAheadOf(e,n){let r=e.split(".").map(i=>Number.parseInt(i,10)||0),s=n.split(".").map(i=>Number.parseInt(i,10)||0);for(let i=0;i<3;i++){let o=r[i]??0,c=s[i]??0;if(o>c)return!0;if(o<c)return!1}return!1}async fromPackageJson(){let e=dr.join(this.projectPath,"package.json"),n=await We(e,null);return n?.version?{current:n.version,next:pr(n.version),file:e,format:"json"}:null}async fromCargoToml(){let e=dr.join(this.projectPath,"Cargo.toml"),n=await gt(e,"");if(!n)return null;let r=xk(n);return r?{current:r,next:pr(r),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=dr.join(this.projectPath,"pyproject.toml"),n=await gt(e,"");if(!n)return null;let r=Rk(n);return r?{current:r,next:pr(r),file:e,format:"toml"}:null}async fromCsproj(){let e=await Tn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let n=dr.join(this.projectPath,e[0]),r=await gt(n,"");if(!r)return null;let s=Ck(r);return s?{current:s,next:pr(s),file:n,format:"xml"}:null}async fromVersionFile(e){let n=dr.join(this.projectPath,e),r=await gt(n,"");if(!r)return null;let s=r.trim();return bd(s)?{current:s,next:pr(s),file:n,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await H("git tag --sort=-v:refname",{cwd:this.projectPath}),n=e.trim().split(`
1537
1537
  `);for(let r of n){let s=r.trim().replace(/^v/,"");if(bd(s))return{current:s,next:pr(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=dr.join(this.projectPath,"VERSION");return await wn(e,`0.1.0
1538
1538
  `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await U("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await wn(e.file,`${e.next}
1539
- `);break}}async writeJsonVersion(e,n){let r=await We(e,{});r&&(r.version=n,await De(e,r))}async writeTomlVersion(e,n){let r=await gt(e,"");if(!r)return;let s=r.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${n}$3`);await wn(e,s)}async writeXmlVersion(e,n){let r=await gt(e,"");if(!r)return;let s=r.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${n}$3`);await wn(e,s)}};a(bd,"isSemver");a(pr,"bumpPatch");a(tD,"bumpMinor");a(nD,"bumpMajor");a(rD,"bumpVersion");a(Ak,"inferBumpLevel");a(xk,"parseTomlVersion");a(Rk,"parsePyprojectVersion");a(Ck,"parseCsprojVersion")});var Sd,Pi,Fa=h(()=>{"use strict";Wt();j();Sd=class{static{a(this,"CustomWorkflowStorage")}createWorkflow(e,n){let r=new Date().toISOString();E.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1540
- VALUES (?, ?, ?, ?, 0, 1, ?)`,n.name,n.description??null,r,r,n.metadata?JSON.stringify(n.metadata):null);let s=E.get(e,"SELECT id FROM custom_workflows WHERE name = ?",n.name);if(!s)throw new Error(`Failed to create workflow: ${n.name}`);return ze({projectId:e,entityType:"custom_workflows",entityId:String(s.id),eventType:"upsert",data:{id:s.id,name:n.name,description:n.description??null,metadata:n.metadata??null,created_at:r,updated_at:r,is_builtin:0,enabled:1}}),s.id}getWorkflow(e,n){let r=E.get(e,"SELECT * FROM custom_workflows WHERE name = ?",n);return r?this.rowToWorkflow(r):null}getAllWorkflows(e,n=!1){let r=n?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return E.query(e,r).map(i=>this.rowToWorkflow(i))}updateWorkflow(e,n,r){if(!this.getWorkflow(e,n))return!1;let i=new Date().toISOString(),o=[],c=[];if(r.description!==void 0&&(o.push("description = ?"),c.push(r.description)),r.enabled!==void 0&&(o.push("enabled = ?"),c.push(r.enabled?1:0)),r.metadata!==void 0&&(o.push("metadata = ?"),c.push(JSON.stringify(r.metadata))),o.length===0)return!1;o.push("updated_at = ?"),c.push(i),c.push(n),E.run(e,`UPDATE custom_workflows SET ${o.join(", ")} WHERE name = ?`,...c);let l=this.getWorkflow(e,n);return l&&ze({projectId:e,entityType:"custom_workflows",entityId:String(l.id),eventType:"upsert",data:{id:l.id,name:l.name,description:l.description??null,enabled:l.enabled?1:0,metadata:l.metadata??null,updated_at:i}}),!0}deleteWorkflow(e,n){let r=this.getWorkflow(e,n);if(!r)return!1;if(r.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${n}`);return E.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",n),ze({projectId:e,entityType:"custom_workflows",entityId:String(r.id),eventType:"delete",data:{id:r.id,name:n}}),!0}isBuiltin(e,n){return this.getWorkflow(e,n)?.isBuiltin??!1}isReservedName(e){let n=["task","done","ship","sync"],r=["add","rm","gate","list","create","delete","run","help","reset","init"];return n.includes(e)||r.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Pi=new Sd});function vd(t){let e=t.trust_source==="imported"?"imported":"local",n=sD.includes(t.type)?t.type:"step";return{id:t.id,type:n,command:t.command,position:t.position,action:t.action,description:t.description,enabled:t.enabled===1,timeoutMs:t.timeout_ms,createdAt:t.created_at,sortOrder:t.sort_order,whenExpr:t.when_expr??null,parallel:t.parallel===null?!0:t.parallel===1,trustSource:e}}var sD,_d,Ge,Di=h(()=>{"use strict";Wt();Fa();j();sD=["hook","gate","step","instruction"];a(vd,"rowToRule");_d=class{static{a(this,"WorkflowRuleStorage")}addRule(e,n){let r=T.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",n.command),s=n.sortOrder||(r?.m??-1)+1;T.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
1541
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,n.type,n.command,n.position,n.action,n.description??null,n.enabled?1:0,n.timeoutMs,n.createdAt,s,n.whenExpr??null,n.parallel===!1?0:1,n.trustSource??"local");let o=T.get(e,"SELECT last_insert_rowid() as id")?.id??0;return o>0&&ze({projectId:e,entityType:"workflow_rules",entityId:String(o),eventType:"upsert",data:{id:o,type:n.type,command:n.command,position:n.position,action:n.action,description:n.description??null,enabled:n.enabled?1:0,timeout_ms:n.timeoutMs,sort_order:s,when_expr:n.whenExpr??null,parallel:n.parallel===!1?0:1,trust_source:n.trustSource??"local",created_at:n.createdAt}}),o}removeRule(e,n){return T.get(e,"SELECT id FROM workflow_rules WHERE id = ?",n)?(T.run(e,"DELETE FROM workflow_rules WHERE id = ?",n),ze({projectId:e,entityType:"workflow_rules",entityId:String(n),eventType:"delete",data:{id:n}}),!0):!1}updateRule(e,n,r){if(!T.get(e,"SELECT id FROM workflow_rules WHERE id = ?",n))return!1;let i={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:a(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:a(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},o=[],c=[];for(let[l,u]of Object.entries(r)){let d=i[l];if(!d)continue;o.push(`${d.column} = ?`);let p=u;c.push(d.transform?d.transform(p):p)}return o.length===0||(c.push(n),T.run(e,`UPDATE workflow_rules SET ${o.join(", ")} WHERE id = ?`,...c)),!0}getRuleById(e,n){let r=T.get(e,"SELECT * FROM workflow_rules WHERE id = ?",n);return r?vd(r):null}getRulesForCommand(e,n){let r=Pi.getWorkflow(e,n);return!r||!r.enabled?[]:T.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",n).map(vd)}getAllRules(e){return T.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(vd)}resetRules(e){let n=T.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return T.run(e,"DELETE FROM workflow_rules"),n?.c??0}},Ge=new _d});import Xe from"node:path";async function iD(t,e){let n=e?.packageManager?.trim().toLowerCase();return n?.startsWith("pnpm@")?"pnpm":n?.startsWith("yarn@")?"yarn":n?.startsWith("bun@")?"bun":n?.startsWith("npm@")?"npm":await I(Xe.join(t,"pnpm-lock.yaml"))?"pnpm":await I(Xe.join(t,"yarn.lock"))?"yarn":await I(Xe.join(t,"bun.lockb"))||await I(Xe.join(t,"bun.lock"))?"bun":(await I(Xe.join(t,"package-lock.json")),"npm")}function Ik(t,e){return t==="yarn"?`yarn ${e}`:t==="pnpm"?`pnpm run ${e}`:t==="bun"?`bun run ${e}`:`npm run ${e}`}function oD(t){return t==="yarn"?"yarn test":t==="pnpm"?"pnpm test":t==="bun"?"bun test":"npm test"}async function ls(t,e){for(let s of aD)if(await I(Xe.join(t,s)))return s;let r=(e??await Tn(t)).find(s=>s.endsWith(cD));if(r)return r}async function un(t){for(let e of lD)if(await I(Xe.join(t,e)))return e}async function Xt(t){let e=Xe.join(t,"package.json"),n=await We(e,null);if(n){let c=await iD(t,n),l=n.scripts||{},u={stack:"js",packageManager:c};return l.lint&&(u.lint={tool:c,command:Ik(c,"lint")}),l.typecheck&&(u.typecheck={tool:c,command:Ik(c,"typecheck")}),l.test&&(u.test={tool:c,command:oD(c)}),u.versionFile=await ls(t),u.changelogFile=await un(t),u}if(await I(Xe.join(t,"pytest.ini"))){let c=await ls(t),l=await un(t);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}let r=await gt(Xe.join(t,"pyproject.toml"),"");if(r.includes("[tool.pytest")||r.includes("pytest")){let c=await ls(t),l=await un(t);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}if(await I(Xe.join(t,"Cargo.toml"))){let c=await un(t);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:c}}if(await I(Xe.join(t,"go.mod"))){let c=await ls(t),l=await un(t);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:c,changelogFile:l}}let s=await Tn(t);if(s.some(c=>c.endsWith(".sln")||c.endsWith(".csproj")||c.endsWith(".fsproj"))){let c=await ls(t,s),l=await un(t);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:c,changelogFile:l}}if(await I(Xe.join(t,"pom.xml"))){let c=await un(t);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:c}}if(await I(Xe.join(t,"gradlew"))&&(await I(Xe.join(t,"build.gradle"))||await I(Xe.join(t,"build.gradle.kts")))){let c=await un(t);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:c}}let i=await ls(t),o=await un(t);return{stack:"unknown",versionFile:i,changelogFile:o}}var aD,cD,lD,Li=h(()=>{"use strict";se();a(iD,"detectPackageManager");a(Ik,"pmRun");a(oD,"pmTest");aD=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],cD=".csproj",lD=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];a(ls,"detectVersionFile");a(un,"detectChangelogFile");a(Xt,"detectProjectCommands")});function Pk(t,e,n){try{let r=Te();return E.run(t,`INSERT INTO workflow_runs
1539
+ `);break}}async writeJsonVersion(e,n){let r=await We(e,{});r&&(r.version=n,await De(e,r))}async writeTomlVersion(e,n){let r=await gt(e,"");if(!r)return;let s=r.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${n}$3`);await wn(e,s)}async writeXmlVersion(e,n){let r=await gt(e,"");if(!r)return;let s=r.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${n}$3`);await wn(e,s)}};a(bd,"isSemver");a(pr,"bumpPatch");a(t0,"bumpMinor");a(n0,"bumpMajor");a(r0,"bumpVersion");a(Ak,"inferBumpLevel");a(xk,"parseTomlVersion");a(Rk,"parsePyprojectVersion");a(Ck,"parseCsprojVersion")});var Sd,Pi,Fa=h(()=>{"use strict";Wt();j();Sd=class{static{a(this,"CustomWorkflowStorage")}createWorkflow(e,n){let r=new Date().toISOString();E.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1540
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,n.name,n.description??null,r,r,n.metadata?JSON.stringify(n.metadata):null);let s=E.get(e,"SELECT id FROM custom_workflows WHERE name = ?",n.name);if(!s)throw new Error(`Failed to create workflow: ${n.name}`);return ze({projectId:e,entityType:"custom_workflows",entityId:String(s.id),eventType:"upsert",data:{id:s.id,name:n.name,description:n.description??null,metadata:n.metadata??null,created_at:r,updated_at:r,is_builtin:0,enabled:1}}),s.id}getWorkflow(e,n){let r=E.get(e,"SELECT * FROM custom_workflows WHERE name = ?",n);return r?this.rowToWorkflow(r):null}getAllWorkflows(e,n=!1){let r=n?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return E.query(e,r).map(i=>this.rowToWorkflow(i))}updateWorkflow(e,n,r){if(!this.getWorkflow(e,n))return!1;let i=new Date().toISOString(),o=[],c=[];if(r.description!==void 0&&(o.push("description = ?"),c.push(r.description)),r.enabled!==void 0&&(o.push("enabled = ?"),c.push(r.enabled?1:0)),r.metadata!==void 0&&(o.push("metadata = ?"),c.push(JSON.stringify(r.metadata))),o.length===0)return!1;o.push("updated_at = ?"),c.push(i),c.push(n),E.run(e,`UPDATE custom_workflows SET ${o.join(", ")} WHERE name = ?`,...c);let l=this.getWorkflow(e,n);return l&&ze({projectId:e,entityType:"custom_workflows",entityId:String(l.id),eventType:"upsert",data:{id:l.id,name:l.name,description:l.description??null,enabled:l.enabled?1:0,metadata:l.metadata??null,updated_at:i}}),!0}deleteWorkflow(e,n){let r=this.getWorkflow(e,n);if(!r)return!1;if(r.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${n}`);return E.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",n),ze({projectId:e,entityType:"custom_workflows",entityId:String(r.id),eventType:"delete",data:{id:r.id,name:n}}),!0}isBuiltin(e,n){return this.getWorkflow(e,n)?.isBuiltin??!1}isReservedName(e){let n=["task","done","ship","sync"],r=["add","rm","gate","list","create","delete","run","help","reset","init"];return n.includes(e)||r.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Pi=new Sd});function vd(t){let e=t.trust_source==="imported"?"imported":"local",n=s0.includes(t.type)?t.type:"step";return{id:t.id,type:n,command:t.command,position:t.position,action:t.action,description:t.description,enabled:t.enabled===1,timeoutMs:t.timeout_ms,createdAt:t.created_at,sortOrder:t.sort_order,whenExpr:t.when_expr??null,parallel:t.parallel===null?!0:t.parallel===1,trustSource:e}}var s0,_d,Ge,Di=h(()=>{"use strict";Wt();Fa();j();s0=["hook","gate","step","instruction"];a(vd,"rowToRule");_d=class{static{a(this,"WorkflowRuleStorage")}addRule(e,n){let r=T.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",n.command),s=n.sortOrder||(r?.m??-1)+1;T.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
1541
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,n.type,n.command,n.position,n.action,n.description??null,n.enabled?1:0,n.timeoutMs,n.createdAt,s,n.whenExpr??null,n.parallel===!1?0:1,n.trustSource??"local");let o=T.get(e,"SELECT last_insert_rowid() as id")?.id??0;return o>0&&ze({projectId:e,entityType:"workflow_rules",entityId:String(o),eventType:"upsert",data:{id:o,type:n.type,command:n.command,position:n.position,action:n.action,description:n.description??null,enabled:n.enabled?1:0,timeout_ms:n.timeoutMs,sort_order:s,when_expr:n.whenExpr??null,parallel:n.parallel===!1?0:1,trust_source:n.trustSource??"local",created_at:n.createdAt}}),o}removeRule(e,n){return T.get(e,"SELECT id FROM workflow_rules WHERE id = ?",n)?(T.run(e,"DELETE FROM workflow_rules WHERE id = ?",n),ze({projectId:e,entityType:"workflow_rules",entityId:String(n),eventType:"delete",data:{id:n}}),!0):!1}updateRule(e,n,r){if(!T.get(e,"SELECT id FROM workflow_rules WHERE id = ?",n))return!1;let i={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:a(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:a(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},o=[],c=[];for(let[l,u]of Object.entries(r)){let d=i[l];if(!d)continue;o.push(`${d.column} = ?`);let p=u;c.push(d.transform?d.transform(p):p)}return o.length===0||(c.push(n),T.run(e,`UPDATE workflow_rules SET ${o.join(", ")} WHERE id = ?`,...c)),!0}getRuleById(e,n){let r=T.get(e,"SELECT * FROM workflow_rules WHERE id = ?",n);return r?vd(r):null}getRulesForCommand(e,n){let r=Pi.getWorkflow(e,n);return!r||!r.enabled?[]:T.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",n).map(vd)}getAllRules(e){return T.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(vd)}resetRules(e){let n=T.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return T.run(e,"DELETE FROM workflow_rules"),n?.c??0}},Ge=new _d});import Xe from"node:path";async function i0(t,e){let n=e?.packageManager?.trim().toLowerCase();return n?.startsWith("pnpm@")?"pnpm":n?.startsWith("yarn@")?"yarn":n?.startsWith("bun@")?"bun":n?.startsWith("npm@")?"npm":await I(Xe.join(t,"pnpm-lock.yaml"))?"pnpm":await I(Xe.join(t,"yarn.lock"))?"yarn":await I(Xe.join(t,"bun.lockb"))||await I(Xe.join(t,"bun.lock"))?"bun":(await I(Xe.join(t,"package-lock.json")),"npm")}function Ik(t,e){return t==="yarn"?`yarn ${e}`:t==="pnpm"?`pnpm run ${e}`:t==="bun"?`bun run ${e}`:`npm run ${e}`}function o0(t){return t==="yarn"?"yarn test":t==="pnpm"?"pnpm test":t==="bun"?"bun test":"npm test"}async function ls(t,e){for(let s of a0)if(await I(Xe.join(t,s)))return s;let r=(e??await Tn(t)).find(s=>s.endsWith(c0));if(r)return r}async function un(t){for(let e of l0)if(await I(Xe.join(t,e)))return e}async function Xt(t){let e=Xe.join(t,"package.json"),n=await We(e,null);if(n){let c=await i0(t,n),l=n.scripts||{},u={stack:"js",packageManager:c};return l.lint&&(u.lint={tool:c,command:Ik(c,"lint")}),l.typecheck&&(u.typecheck={tool:c,command:Ik(c,"typecheck")}),l.test&&(u.test={tool:c,command:o0(c)}),u.versionFile=await ls(t),u.changelogFile=await un(t),u}if(await I(Xe.join(t,"pytest.ini"))){let c=await ls(t),l=await un(t);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}let r=await gt(Xe.join(t,"pyproject.toml"),"");if(r.includes("[tool.pytest")||r.includes("pytest")){let c=await ls(t),l=await un(t);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}if(await I(Xe.join(t,"Cargo.toml"))){let c=await un(t);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:c}}if(await I(Xe.join(t,"go.mod"))){let c=await ls(t),l=await un(t);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:c,changelogFile:l}}let s=await Tn(t);if(s.some(c=>c.endsWith(".sln")||c.endsWith(".csproj")||c.endsWith(".fsproj"))){let c=await ls(t,s),l=await un(t);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:c,changelogFile:l}}if(await I(Xe.join(t,"pom.xml"))){let c=await un(t);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:c}}if(await I(Xe.join(t,"gradlew"))&&(await I(Xe.join(t,"build.gradle"))||await I(Xe.join(t,"build.gradle.kts")))){let c=await un(t);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:c}}let i=await ls(t),o=await un(t);return{stack:"unknown",versionFile:i,changelogFile:o}}var a0,c0,l0,Li=h(()=>{"use strict";se();a(i0,"detectPackageManager");a(Ik,"pmRun");a(o0,"pmTest");a0=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],c0=".csproj",l0=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];a(ls,"detectVersionFile");a(un,"detectChangelogFile");a(Xt,"detectProjectCommands")});function Pk(t,e,n){try{let r=Te();return E.run(t,`INSERT INTO workflow_runs
1542
1542
  (id, project_id, command, work_cycle_id, status, iteration, max_iterations, started_at)
1543
1543
  VALUES (?, ?, ?, ?, 'running', 0, NULL, ?)`,r,t,e,n??null,Date.now()),r}catch{return null}}function xd(t,e,n,r,s){if(e)try{E.run(t,`INSERT INTO gate_evaluation (id, run_id, rule_id, passed, reason, evaluated_at)
1544
1544
  VALUES (?, ?, ?, ?, ?, ?)`,Te(),e,String(n),r?1:0,s??null,Date.now())}catch{}}function Rd(t,e,n,r,s,i){if(e)try{E.run(t,`INSERT INTO workflow_run_step (id, run_id, rule_id, seq, status, attempt, output, ended_at)
1545
- VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,Te(),e,String(n),r,s,i??null,Date.now())}catch{}}function Ha(t,e,n){if(e)try{E.run(t,"UPDATE workflow_runs SET status = ?, ended_at = ? WHERE id = ?",n,Date.now(),e)}catch{}}var Dk=h(()=>{"use strict";Ht();j();a(Pk,"startWorkflowRun");a(xd,"recordGateEvaluation");a(Rd,"recordRunStep");a(Ha,"finishWorkflowRun")});function uD(t){let e=t.split(/\s+/).map(r=>r.trim()).filter(Boolean),n=[];for(let r of e){let s=r.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(s){n.push({kind:"tags",key:s[1],op:s[2],value:s[3]});continue}let i=r.match(/^branch([=~])(.+)$/);if(i){n.push({kind:"branch",op:i[1],value:i[2]});continue}let o=r.match(/^files:(.+)$/);o&&n.push({kind:"files",op:"~",value:o[1]})}return n}function dD(t){let e=Lk.get(t);if(e)return e;let n="";for(let s=0;s<t.length;s++){let i=t[s];i==="*"?t[s+1]==="*"?(n+=".*",s++):n+="[^/]*":/[.+^${}()|[\]\\]/.test(i)?n+=`\\${i}`:n+=i}let r=new RegExp(`^${n}$`);return Lk.set(t,r),r}function pD(t,e){if(t.kind==="tags"){let n=e.tags[t.key??""]??"";return t.op==="="?n===t.value:n.toLowerCase().includes(t.value.toLowerCase())}if(t.kind==="branch")return t.op==="="?e.branch===t.value:e.branch.toLowerCase().includes(t.value.toLowerCase());if(t.kind==="files"){let n=dD(t.value);return e.filesChanged.some(r=>n.test(r))}return!0}function Ok(t,e){if(!t||!t.trim())return!0;let n=uD(t);return n.length===0?!0:n.every(r=>pD(r,e))}var Lk,jk=h(()=>{"use strict";a(uD,"parseWhen");Lk=new Map;a(dD,"globToRegex");a(pD,"matchCondition");a(Ok,"evaluateWhen")});import{execSync as mD}from"node:child_process";import Mk from"node:fs/promises";import mr from"node:path";import at from"chalk";async function yD(t,e,n){let r=await K.getCurrentTask(t);if(!r)throw new Error(`Cannot transition to '${n}': no active work cycle`);await Qe.log(e,ir,{taskId:r.id,from:r.type??null,to:n,source:"workflow"})}async function ED(t,e){let{evaluateWorkflowRuleExecutable:n}=await Promise.resolve().then(()=>(zr(),fi)),r=n(t.trustSource,t.description||t.action);if(!r.allow)throw new Error(r.denyMessage);await H(t.action,{timeout:t.timeoutMs,cwd:e,env:{...process.env}})}async function kD(t){let{test:e}=await Xt(t);return e?.command??null}async function wD(t,e){let{evaluateWorkflowRuleExecutable:n}=await Promise.resolve().then(()=>(zr(),fi)),r=n(t.trustSource,t.description||t.action);if(!r.allow)throw new Error(r.denyMessage);let s=t.action.slice(Wk.length).trim();if(!s)throw new Error(`Empty command in verify action '${t.action}'`);if(s==="auto"){let i=await kD(e);if(!i)throw new Error("verify:auto found no test script (package.json `scripts.test`). Specify an explicit check, e.g. `verify:bun test` or `verify:npm run typecheck`.");s=i}try{await H(s,{timeout:t.timeoutMs,cwd:e,env:{...process.env}})}catch(i){throw new Error(`Verification failed: \`${s}\`
1545
+ VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,Te(),e,String(n),r,s,i??null,Date.now())}catch{}}function Ha(t,e,n){if(e)try{E.run(t,"UPDATE workflow_runs SET status = ?, ended_at = ? WHERE id = ?",n,Date.now(),e)}catch{}}var Dk=h(()=>{"use strict";Ht();j();a(Pk,"startWorkflowRun");a(xd,"recordGateEvaluation");a(Rd,"recordRunStep");a(Ha,"finishWorkflowRun")});function u0(t){let e=t.split(/\s+/).map(r=>r.trim()).filter(Boolean),n=[];for(let r of e){let s=r.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(s){n.push({kind:"tags",key:s[1],op:s[2],value:s[3]});continue}let i=r.match(/^branch([=~])(.+)$/);if(i){n.push({kind:"branch",op:i[1],value:i[2]});continue}let o=r.match(/^files:(.+)$/);o&&n.push({kind:"files",op:"~",value:o[1]})}return n}function d0(t){let e=Lk.get(t);if(e)return e;let n="";for(let s=0;s<t.length;s++){let i=t[s];i==="*"?t[s+1]==="*"?(n+=".*",s++):n+="[^/]*":/[.+^${}()|[\]\\]/.test(i)?n+=`\\${i}`:n+=i}let r=new RegExp(`^${n}$`);return Lk.set(t,r),r}function p0(t,e){if(t.kind==="tags"){let n=e.tags[t.key??""]??"";return t.op==="="?n===t.value:n.toLowerCase().includes(t.value.toLowerCase())}if(t.kind==="branch")return t.op==="="?e.branch===t.value:e.branch.toLowerCase().includes(t.value.toLowerCase());if(t.kind==="files"){let n=d0(t.value);return e.filesChanged.some(r=>n.test(r))}return!0}function Ok(t,e){if(!t||!t.trim())return!0;let n=u0(t);return n.length===0?!0:n.every(r=>p0(r,e))}var Lk,jk=h(()=>{"use strict";a(u0,"parseWhen");Lk=new Map;a(d0,"globToRegex");a(p0,"matchCondition");a(Ok,"evaluateWhen")});import{execSync as m0}from"node:child_process";import Mk from"node:fs/promises";import mr from"node:path";import at from"chalk";async function y0(t,e,n){let r=await K.getCurrentTask(t);if(!r)throw new Error(`Cannot transition to '${n}': no active work cycle`);await Qe.log(e,ir,{taskId:r.id,from:r.type??null,to:n,source:"workflow"})}async function E0(t,e){let{evaluateWorkflowRuleExecutable:n}=await Promise.resolve().then(()=>(zr(),fi)),r=n(t.trustSource,t.description||t.action);if(!r.allow)throw new Error(r.denyMessage);await H(t.action,{timeout:t.timeoutMs,cwd:e,env:{...process.env}})}async function k0(t){let{test:e}=await Xt(t);return e?.command??null}async function w0(t,e){let{evaluateWorkflowRuleExecutable:n}=await Promise.resolve().then(()=>(zr(),fi)),r=n(t.trustSource,t.description||t.action);if(!r.allow)throw new Error(r.denyMessage);let s=t.action.slice(Wk.length).trim();if(!s)throw new Error(`Empty command in verify action '${t.action}'`);if(s==="auto"){let i=await k0(e);if(!i)throw new Error("verify:auto found no test script (package.json `scripts.test`). Specify an explicit check, e.g. `verify:bun test` or `verify:npm run typecheck`.");s=i}try{await H(s,{timeout:t.timeoutMs,cwd:e,env:{...process.env}})}catch(i){throw new Error(`Verification failed: \`${s}\`
1546
1546
  ${A(i)}
1547
- Stop-the-line: do not proceed. Fix the failure and re-run this check \u2014 unverified output must not advance.`)}}async function TD(t,e,n){let{evaluateWorkflowRuleExecutable:r}=await Promise.resolve().then(()=>(zr(),fi)),s=r(t.trustSource,t.description||t.action);if(!s.allow)throw new Error(s.denyMessage);let i=t.action.slice(Hk.length).trim();if(!i)throw new Error(`Empty script path in action '${t.action}'`);if(mr.isAbsolute(i)||i.includes("\0"))throw new Error(`Script path escapes workflows dir: ${i}`);let o=mr.resolve(e,".prjct/workflows"),c=mr.resolve(o,i),l=mr.relative(o,c);if(l.startsWith("..")||mr.isAbsolute(l))throw new Error(`Script path escapes workflows dir: ${i}`);let u=c;try{u=await Mk.realpath(c)}catch{throw new Error(`Script not found: .prjct/workflows/${i}`)}let d=o;try{d=await Mk.realpath(o)}catch{}let p=mr.relative(d,u);if(p.startsWith("..")||mr.isAbsolute(p))throw new Error(`Script path escapes workflows dir: ${i}`);await U("bash",[u],{timeout:t.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:n.branch,PRJCT_FILES_CHANGED:n.filesChanged.join(","),PRJCT_TAGS:Object.entries(n.tags).map(([m,g])=>`${m}=${g}`).join(",")}})}function bD(t){let e=t.action.slice(Uk.length).trim(),n=e.indexOf(":");if(n===-1)return`Call MCP tool ${JSON.stringify(e)} (server unspecified \u2014 re-author rule with format \`mcp:<server>:<tool>[:<args>]\`).`;let r=e.slice(0,n),s=e.slice(n+1),i=s.indexOf(":"),o=i===-1?s:s.slice(0,i),c=i===-1?"":s.slice(i+1),l=t.description?` (${t.description})`:"";return c?`Call MCP \`${r}.${o}\` with args ${c}${l}.`:`Call MCP \`${r}.${o}\`${l}.`}async function SD(t){try{let{default:e}=await Promise.resolve().then(()=>(Ie(),ni)),r=(await e.readConfig(t))?.persona;if(!r)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let s=[`You are **${r.role}** in this project.`];return r.focus&&s.push(`Focus: ${r.focus}.`),r.mcps&&r.mcps.length>0&&s.push(`MCPs available: ${r.mcps.join(", ")}.`),r.packs&&r.packs.length>0&&s.push(`Active packs: ${r.packs.join(", ")}.`),s.join(" ")}catch(e){return`Could not resolve persona: ${A(e)}`}}async function vD(t,e){let n=new $a(t),r=Ak(typeof e.feature=="string"?e.feature:void 0),s=await n.bump(r);e.version=s}async function _D(t,e){let n=typeof e.version=="string"?e.version:null,r=typeof e.feature=="string"?e.feature:null;if(!n)throw new Error("changelog:add requires a prior version:bump step (no version in runContext)");if(!r)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new Ma(t).addFeature(n,r)}function xD(t,e){return t.replace(/\$([A-Z_]+)/g,(n,r)=>{let s=r.toLowerCase(),i=e[s];return typeof i=="string"?i:""})}async function RD(t,e,n){let s=t.slice(Ad.length).replace(/^:/,"").trim()||(n.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),i=`${xD(s,n)}
1547
+ Stop-the-line: do not proceed. Fix the failure and re-run this check \u2014 unverified output must not advance.`)}}async function T0(t,e,n){let{evaluateWorkflowRuleExecutable:r}=await Promise.resolve().then(()=>(zr(),fi)),s=r(t.trustSource,t.description||t.action);if(!s.allow)throw new Error(s.denyMessage);let i=t.action.slice(Hk.length).trim();if(!i)throw new Error(`Empty script path in action '${t.action}'`);if(mr.isAbsolute(i)||i.includes("\0"))throw new Error(`Script path escapes workflows dir: ${i}`);let o=mr.resolve(e,".prjct/workflows"),c=mr.resolve(o,i),l=mr.relative(o,c);if(l.startsWith("..")||mr.isAbsolute(l))throw new Error(`Script path escapes workflows dir: ${i}`);let u=c;try{u=await Mk.realpath(c)}catch{throw new Error(`Script not found: .prjct/workflows/${i}`)}let d=o;try{d=await Mk.realpath(o)}catch{}let p=mr.relative(d,u);if(p.startsWith("..")||mr.isAbsolute(p))throw new Error(`Script path escapes workflows dir: ${i}`);await U("bash",[u],{timeout:t.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:n.branch,PRJCT_FILES_CHANGED:n.filesChanged.join(","),PRJCT_TAGS:Object.entries(n.tags).map(([m,g])=>`${m}=${g}`).join(",")}})}function b0(t){let e=t.action.slice(Uk.length).trim(),n=e.indexOf(":");if(n===-1)return`Call MCP tool ${JSON.stringify(e)} (server unspecified \u2014 re-author rule with format \`mcp:<server>:<tool>[:<args>]\`).`;let r=e.slice(0,n),s=e.slice(n+1),i=s.indexOf(":"),o=i===-1?s:s.slice(0,i),c=i===-1?"":s.slice(i+1),l=t.description?` (${t.description})`:"";return c?`Call MCP \`${r}.${o}\` with args ${c}${l}.`:`Call MCP \`${r}.${o}\`${l}.`}async function S0(t){try{let{default:e}=await Promise.resolve().then(()=>(Ie(),ni)),r=(await e.readConfig(t))?.persona;if(!r)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let s=[`You are **${r.role}** in this project.`];return r.focus&&s.push(`Focus: ${r.focus}.`),r.mcps&&r.mcps.length>0&&s.push(`MCPs available: ${r.mcps.join(", ")}.`),r.packs&&r.packs.length>0&&s.push(`Active packs: ${r.packs.join(", ")}.`),s.join(" ")}catch(e){return`Could not resolve persona: ${A(e)}`}}async function v0(t,e){let n=new $a(t),r=Ak(typeof e.feature=="string"?e.feature:void 0),s=await n.bump(r);e.version=s}async function _0(t,e){let n=typeof e.version=="string"?e.version:null,r=typeof e.feature=="string"?e.feature:null;if(!n)throw new Error("changelog:add requires a prior version:bump step (no version in runContext)");if(!r)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new Ma(t).addFeature(n,r)}function x0(t,e){return t.replace(/\$([A-Z_]+)/g,(n,r)=>{let s=r.toLowerCase(),i=e[s];return typeof i=="string"?i:""})}async function R0(t,e,n){let s=t.slice(Ad.length).replace(/^:/,"").trim()||(n.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),i=`${x0(s,n)}
1548
1548
 
1549
- Generated with [p/](https://www.prjct.app/)`;await U("git",["add","."],{cwd:e}),await U("git",["commit","-m",i],{cwd:e})}function CD(t,e){let n=t.trim(),r=e.trim(),s=r.includes("/")?r.slice(r.indexOf("/")+1):"";return!!n&&s===n?["push"]:["push","-u","origin","HEAD"]}async function AD(t){let e=await U("git",["rev-parse","--abbrev-ref","HEAD"],{cwd:t}).then(s=>s.stdout.trim()).catch(()=>""),n=await U("git",["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],{cwd:t}).then(s=>s.stdout.trim()).catch(()=>""),r=CD(e,n);try{await U("git",r,{cwd:t,timeout:3e4})}catch(s){let i=A(s);throw new Error(`git push failed: ${i}`)}}async function Cd(t,e,n,r,s,i){let o=t.action;if(o.startsWith($k)){let c=o.slice($k.length).trim();if(!c)throw new Error(`Empty status target in action '${o}'`);await yD(e,n,c);return}if(o.startsWith(Hk)){await TD(t,n,r);return}if(o.startsWith(Uk)){s.instructions.push(bD(t));return}if(o===gD){s.instructions.push(await SD(n));return}if(o===Fk||o.startsWith(`${Fk}:`)){await vD(n,i);return}if(o===fD){await _D(n,i);return}if(o===Ad||o.startsWith(`${Ad}:`)){await RD(o,n,i);return}if(o===hD){await AD(n);return}if(o.startsWith(Wk)){await wD(t,n);return}await ED(t,n)}async function ND(t,e){let[n,r,s]=await Promise.all([ID(e),PD(e),DD(t)]);return{branch:n,filesChanged:r,tags:s}}async function ID(t){try{return await ur(t)||""}catch{return""}}async function PD(t){let e={cwd:t,encoding:"utf-8"},n=a(async i=>{try{return mD(i,e).split(`
1550
- `).map(o=>o.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[r,s]=await Promise.all([n("git diff --cached --name-only"),n("git diff --name-only")]);return[...new Set([...r,...s])]}async function DD(t){try{let e=await K.getCurrentTask(t),n={};if(e?.type&&(n.type=e.type),!e)return n;let r=E.get(t,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 1",tE);if(r)try{let s=JSON.parse(r.data);if(s.taskId===e.id&&s.tags)return{...n,...s.tags}}catch{}return n}catch{return{}}}async function us(t,e,n,r={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(r.skipRules)return s;let i=r.runContext??{},c=Ge.getRulesForCommand(t,e).filter(y=>y.position===n),l=r.projectPath||process.cwd(),d=c.some(y=>y.whenExpr||y.type==="gate")?await ND(t,l):{branch:"",filesChanged:[],tags:{}},p=c.filter(y=>Ok(y.whenExpr,d)),m=p.length>0?Pk(t,`${n}:${e}`):null,g=p.filter(y=>y.type==="gate");for(let y of g){let v=y.description||y.action;console.log(`
1549
+ Generated with [p/](https://www.prjct.app/)`;await U("git",["add","."],{cwd:e}),await U("git",["commit","-m",i],{cwd:e})}function C0(t,e){let n=t.trim(),r=e.trim(),s=r.includes("/")?r.slice(r.indexOf("/")+1):"";return!!n&&s===n?["push"]:["push","-u","origin","HEAD"]}async function A0(t){let e=await U("git",["rev-parse","--abbrev-ref","HEAD"],{cwd:t}).then(s=>s.stdout.trim()).catch(()=>""),n=await U("git",["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],{cwd:t}).then(s=>s.stdout.trim()).catch(()=>""),r=C0(e,n);try{await U("git",r,{cwd:t,timeout:3e4})}catch(s){let i=A(s);throw new Error(`git push failed: ${i}`)}}async function Cd(t,e,n,r,s,i){let o=t.action;if(o.startsWith($k)){let c=o.slice($k.length).trim();if(!c)throw new Error(`Empty status target in action '${o}'`);await y0(e,n,c);return}if(o.startsWith(Hk)){await T0(t,n,r);return}if(o.startsWith(Uk)){s.instructions.push(b0(t));return}if(o===g0){s.instructions.push(await S0(n));return}if(o===Fk||o.startsWith(`${Fk}:`)){await v0(n,i);return}if(o===f0){await _0(n,i);return}if(o===Ad||o.startsWith(`${Ad}:`)){await R0(o,n,i);return}if(o===h0){await A0(n);return}if(o.startsWith(Wk)){await w0(t,n);return}await E0(t,n)}async function N0(t,e){let[n,r,s]=await Promise.all([I0(e),P0(e),D0(t)]);return{branch:n,filesChanged:r,tags:s}}async function I0(t){try{return await ur(t)||""}catch{return""}}async function P0(t){let e={cwd:t,encoding:"utf-8"},n=a(async i=>{try{return m0(i,e).split(`
1550
+ `).map(o=>o.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[r,s]=await Promise.all([n("git diff --cached --name-only"),n("git diff --name-only")]);return[...new Set([...r,...s])]}async function D0(t){try{let e=await K.getCurrentTask(t),n={};if(e?.type&&(n.type=e.type),!e)return n;let r=E.get(t,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 1",tE);if(r)try{let s=JSON.parse(r.data);if(s.taskId===e.id&&s.tags)return{...n,...s.tags}}catch{}return n}catch{return{}}}async function us(t,e,n,r={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(r.skipRules)return s;let i=r.runContext??{},c=Ge.getRulesForCommand(t,e).filter(y=>y.position===n),l=r.projectPath||process.cwd(),d=c.some(y=>y.whenExpr||y.type==="gate")?await N0(t,l):{branch:"",filesChanged:[],tags:{}},p=c.filter(y=>Ok(y.whenExpr,d)),m=p.length>0?Pk(t,`${n}:${e}`):null,g=p.filter(y=>y.type==="gate");for(let y of g){let v=y.description||y.action;console.log(`
1551
1551
  ${at.dim(`[gate] ${n}-${e}: ${y.action}`)}`);try{let N=Date.now();await Cd(y,t,l,d,s,i);let q=Date.now()-N,he=q>1e3?`${(q/1e3).toFixed(1)}s`:`${q}ms`;console.log(`${at.green("\u2713")} ${at.dim(`gate passed (${he})`)}`),xd(t,m,y.id,!0)}catch(N){return console.log(`${at.red("\u2717")} gate failed: ${v}`),s.gatesFailed.push(v),s.success=!1,s.output+=`Gate failed: ${v}
1552
1552
  ${A(N)}
1553
1553
  `,xd(t,m,y.id,!1,A(N)),Ha(t,m,"blocked"),s}}let f=p.filter(y=>y.type==="instruction");for(let y of f){let v=y.description||y.action;console.log(`
@@ -1557,33 +1557,33 @@ ${A(v)}
1557
1557
  `}},"runHook");for(let y of w)await x(y);R.length>0&&await Promise.all(R.map(x));let b=p.filter(y=>y.type==="step"),C=0;for(let y of b){console.log(`
1558
1558
  ${at.dim(`[step] ${e}: ${y.action}`)}`);try{let v=Date.now();await Cd(y,t,l,d,s,i);let N=Date.now()-v,q=N>1e3?`${(N/1e3).toFixed(1)}s`:`${N}ms`;console.log(`${at.green("\u2713")} ${at.dim(`step passed (${q})`)}`),s.stepsRun.push(y.description||y.action),Rd(t,m,y.id,C++,"ok")}catch(v){return console.log(`${at.red("\u2717")} step failed: ${y.action}`),s.gatesFailed.push(y.description||y.action),s.success=!1,s.output+=`Step failed: ${y.action}
1559
1559
  ${A(v)}
1560
- `,Rd(t,m,y.id,C++,"failed",A(v)),Ha(t,m,"failed"),s}}return Ha(t,m,"passed"),s}var $k,Hk,Uk,gD,Fk,fD,Ad,hD,Wk,Nd=h(()=>{"use strict";Kr();_k();or();Nk();Ni();j();ot();Di();ie();ue();Li();Dk();jk();$k="status:",Hk="script:",Uk="mcp:",gD="persona:context",Fk="version:bump",fD="changelog:add",Ad="git:commit",hD="git:push",Wk="verify:";a(yD,"runStatusTransition");a(ED,"runShellAction");a(kD,"detectVerifyCommand");a(wD,"runVerifyAction");a(TD,"runScriptAction");a(bD,"buildMcpInstruction");a(SD,"buildPersonaInstruction");a(vD,"runVersionBump");a(_D,"runChangelogAdd");a(xD,"expandTemplate");a(RD,"runGitCommit");a(CD,"decideGitPushArgs");a(AD,"runGitPush");a(Cd,"runRuleAction");a(ND,"buildWhenContext");a(ID,"resolveBranch");a(PD,"resolveChangedFiles");a(DD,"resolveActiveTags");a(us,"executeWorkflowRules")});function Id(t,e,n=LD){return kd(yd(t,e,n).files)}function Bk(t){let e=t.signals.length>0?` (${t.signals.join("+")})`:"";return`\`${t.path}\` \u2014 ${t.reason}${e}`}var LD,Pd=h(()=>{"use strict";La();LD=8;a(Id,"rankLikelyFiles");a(Bk,"formatLikelyFileForAgent")});import gr from"chalk";var Gk,OD,jD,qt,Xk=h(()=>{"use strict";ft();Gk=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],OD=80,jD={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Gk,speed:OD},cli:{header:a(()=>`${gr.cyan.bold("\u26A1")} ${gr.cyan("prjct")}`,"header"),footer:a(()=>gr.dim("\u26A1 prjct"),"footer"),spin:a((t,e)=>`${gr.cyan("\u26A1")} ${gr.cyan("prjct")} ${gr.cyan(Gk[t%10])} ${gr.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:a((t="claude")=>Ao(t).commitFooter,"getCommitFooter"),getSignature:a((t="claude")=>Ao(t).signature,"getSignature")},qt=jD});function Ua(t){let e=`PRJCT_TIMEOUT_${t}`,n=process.env[e];if(n){let r=Number.parseInt(n,10);if(!Number.isNaN(r)&&r>0)return r}return MD[t]}var MD,At,Dd=h(()=>{"use strict";MD={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};a(Ua,"getTimeout");At={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80}});var qk,Vk=h(()=>{"use strict";qk={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Configure the Linear MCP server in your AI client"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active work cycle",hint:`Start work with 'p. work "intent"'`},TASK_ALREADY_ACTIVE:{message:"A work cycle is already in progress",hint:"Use 'p. work' to inspect it or ship when complete"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Jk(t,e){return{...qk[t],...e}}var Kk=h(()=>{"use strict";Vk();a(Jk,"getError")});import de from"chalk";function HD(){return $D[FD]}var Ld,$D,FD,fr,ds,Od,ct,On,UD,WD,P,lt=h(()=>{"use strict";Xk();Dd();Kk();Ld=qt.spinner.speed,$D={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},FD="compact";a(HD,"getTierConfig");fr={success:de.green("\u2713"),fail:de.red("\u2717"),warn:de.yellow("\u26A0"),info:de.blue("\u2139"),debug:de.dim("\u{1F527}"),bullet:de.dim("\u2022"),arrow:de.dim("\u2192"),check:de.green("\u2713"),cross:de.red("\u2717"),spinner:de.cyan("\u25D0")},ds=null,Od=0,ct=!1,On=a((t,e)=>{if(!process.stdout.isTTY&&!process.stderr.isTTY)return t||"";let n=e??(HD().maxCharsPerLine||At.FALLBACK_TRUNCATE);return t&&t.length>n?`${t.slice(0,n-1)}\u2026`:t||""},"truncate"),UD=a(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(At.CLEAR_WIDTH)}\r`):!0,"clear"),WD={start(){return ct||console.log(qt.cli.header()),this},end(){return ct||console.log(qt.cli.footer()),this},spin(t){return ct?this:(this.stop(),process.stdout.isTTY?(ds=setInterval(()=>{process.stdout.write(`\r${qt.cli.spin(Od++,On(t,At.SPINNER_MSG))}`)},Ld),this):(process.stdout.write(`${qt.cli.spin(0,On(t,At.SPINNER_MSG))}
1560
+ `,Rd(t,m,y.id,C++,"failed",A(v)),Ha(t,m,"failed"),s}}return Ha(t,m,"passed"),s}var $k,Hk,Uk,g0,Fk,f0,Ad,h0,Wk,Nd=h(()=>{"use strict";Kr();_k();or();Nk();Ni();j();ot();Di();ie();ue();Li();Dk();jk();$k="status:",Hk="script:",Uk="mcp:",g0="persona:context",Fk="version:bump",f0="changelog:add",Ad="git:commit",h0="git:push",Wk="verify:";a(y0,"runStatusTransition");a(E0,"runShellAction");a(k0,"detectVerifyCommand");a(w0,"runVerifyAction");a(T0,"runScriptAction");a(b0,"buildMcpInstruction");a(S0,"buildPersonaInstruction");a(v0,"runVersionBump");a(_0,"runChangelogAdd");a(x0,"expandTemplate");a(R0,"runGitCommit");a(C0,"decideGitPushArgs");a(A0,"runGitPush");a(Cd,"runRuleAction");a(N0,"buildWhenContext");a(I0,"resolveBranch");a(P0,"resolveChangedFiles");a(D0,"resolveActiveTags");a(us,"executeWorkflowRules")});function Id(t,e,n=L0){return kd(yd(t,e,n).files)}function Bk(t){let e=t.signals.length>0?` (${t.signals.join("+")})`:"";return`\`${t.path}\` \u2014 ${t.reason}${e}`}var L0,Pd=h(()=>{"use strict";La();L0=8;a(Id,"rankLikelyFiles");a(Bk,"formatLikelyFileForAgent")});import gr from"chalk";var Gk,O0,j0,qt,Xk=h(()=>{"use strict";ft();Gk=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],O0=80,j0={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Gk,speed:O0},cli:{header:a(()=>`${gr.cyan.bold("\u26A1")} ${gr.cyan("prjct")}`,"header"),footer:a(()=>gr.dim("\u26A1 prjct"),"footer"),spin:a((t,e)=>`${gr.cyan("\u26A1")} ${gr.cyan("prjct")} ${gr.cyan(Gk[t%10])} ${gr.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:a((t="claude")=>Ao(t).commitFooter,"getCommitFooter"),getSignature:a((t="claude")=>Ao(t).signature,"getSignature")},qt=j0});function Ua(t){let e=`PRJCT_TIMEOUT_${t}`,n=process.env[e];if(n){let r=Number.parseInt(n,10);if(!Number.isNaN(r)&&r>0)return r}return M0[t]}var M0,At,Dd=h(()=>{"use strict";M0={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};a(Ua,"getTimeout");At={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80}});var qk,Vk=h(()=>{"use strict";qk={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Configure the Linear MCP server in your AI client"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active work cycle",hint:`Start work with 'p. work "intent"'`},TASK_ALREADY_ACTIVE:{message:"A work cycle is already in progress",hint:"Use 'p. work' to inspect it or ship when complete"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Jk(t,e){return{...qk[t],...e}}var Kk=h(()=>{"use strict";Vk();a(Jk,"getError")});import de from"chalk";function H0(){return $0[F0]}var Ld,$0,F0,fr,ds,Od,ct,On,U0,W0,P,lt=h(()=>{"use strict";Xk();Dd();Kk();Ld=qt.spinner.speed,$0={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},F0="compact";a(H0,"getTierConfig");fr={success:de.green("\u2713"),fail:de.red("\u2717"),warn:de.yellow("\u26A0"),info:de.blue("\u2139"),debug:de.dim("\u{1F527}"),bullet:de.dim("\u2022"),arrow:de.dim("\u2192"),check:de.green("\u2713"),cross:de.red("\u2717"),spinner:de.cyan("\u25D0")},ds=null,Od=0,ct=!1,On=a((t,e)=>{if(!process.stdout.isTTY&&!process.stderr.isTTY)return t||"";let n=e??(H0().maxCharsPerLine||At.FALLBACK_TRUNCATE);return t&&t.length>n?`${t.slice(0,n-1)}\u2026`:t||""},"truncate"),U0=a(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(At.CLEAR_WIDTH)}\r`):!0,"clear"),W0={start(){return ct||console.log(qt.cli.header()),this},end(){return ct||console.log(qt.cli.footer()),this},spin(t){return ct?this:(this.stop(),process.stdout.isTTY?(ds=setInterval(()=>{process.stdout.write(`\r${qt.cli.spin(Od++,On(t,At.SPINNER_MSG))}`)},Ld),this):(process.stdout.write(`${qt.cli.spin(0,On(t,At.SPINNER_MSG))}
1561
1561
  `),this))},done(t,e){if(this.stop(),!ct){let n="";if(e){let r=[];e.agents!==void 0&&r.push(`${e.agents}a`),e.reduction!==void 0&&r.push(`${e.reduction}%`),e.tokens!==void 0&&r.push(`${Math.round(e.tokens)}K`),r.length>0&&(n=de.dim(` [${r.join(" | ")}]`))}console.log(`${fr.success} ${On(t,At.DONE_MSG)}${n}`)}return this},fail(t){return this.stop(),console.error(`${fr.fail} ${On(t,At.FAIL_MSG)}`),this},failWithHint(t){this.stop();let e=typeof t=="string"?Jk(t):t;return console.error(),console.error(`${fr.fail} ${e.message}`),e.file&&console.error(de.dim(` File: ${e.file}`)),e.hint&&console.error(de.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(de.dim(` Docs: ${e.docs}`)),console.error(),this},warn(t){return this.stop(),ct||console.log(`${fr.warn} ${On(t,At.WARN_MSG)}`),this},info(t){return this.stop(),ct||console.log(`${fr.info} ${t}`),this},debug(t){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${fr.debug} ${de.dim(t)}`),this},success(t,e){return this.done(t,e)},list(t,e={}){if(this.stop(),ct)return this;let n=e.bullet||fr.bullet,r=" ".repeat(e.indent||0);for(let s of t)console.log(`${r}${n} ${s}`);return this},table(t,e={}){if(this.stop(),ct||t.length===0)return this;let n=Object.keys(t[0]),r={};for(let s of n){r[s]=s.length;for(let i of t){let o=String(i[s]??"");o.length>r[s]&&(r[s]=o.length)}}if(e.header!==!1){let s=n.map(i=>i.padEnd(r[i])).join(" ");console.log(de.dim(s)),console.log(de.dim("\u2500".repeat(s.length)))}for(let s of t){let i=n.map(o=>String(s[o]??"").padEnd(r[o])).join(" ");console.log(i)}return this},box(t,e){if(this.stop(),ct)return this;let n=e.split(`
1562
1562
  `),r=Math.max(t.length,...n.map(i=>i.length)),s="\u2500".repeat(r+2);console.log(de.dim(`\u250C${s}\u2510`)),console.log(`${de.dim("\u2502")} ${de.bold(t.padEnd(r))} ${de.dim("\u2502")}`),console.log(de.dim(`\u251C${s}\u2524`));for(let i of n)console.log(`${de.dim("\u2502")} ${i.padEnd(r)} ${de.dim("\u2502")}`);return console.log(de.dim(`\u2514${s}\u2518`)),this},section(t){return this.stop(),ct?this:(console.log(`
1563
- ${de.bold(t)}`),console.log(de.dim("\u2500".repeat(t.length))),this)},stop(){return ds&&(clearInterval(ds),ds=null,UD()),this},step(t,e,n){if(ct)return this;this.stop();let r=de.dim(`[${t}/${e}]`);return process.stdout.isTTY?(ds=setInterval(()=>{process.stdout.write(`\r${qt.cli.spin(Od++,`${r} ${On(n,At.STEP_MSG)}`)}`)},Ld),this):(process.stdout.write(`${qt.cli.spin(0,`${r} ${On(n,At.STEP_MSG)}`)}
1563
+ ${de.bold(t)}`),console.log(de.dim("\u2500".repeat(t.length))),this)},stop(){return ds&&(clearInterval(ds),ds=null,U0()),this},step(t,e,n){if(ct)return this;this.stop();let r=de.dim(`[${t}/${e}]`);return process.stdout.isTTY?(ds=setInterval(()=>{process.stdout.write(`\r${qt.cli.spin(Od++,`${r} ${On(n,At.STEP_MSG)}`)}`)},Ld),this):(process.stdout.write(`${qt.cli.spin(0,`${r} ${On(n,At.STEP_MSG)}`)}
1564
1564
  `),this)},progress(t,e,n){if(ct)return this;this.stop();let r=Math.round(t/e*100),s=Math.round(r/10),i=10-s,o=de.cyan("\u2588".repeat(s))+de.dim("\u2591".repeat(i)),c=n?` ${On(n,At.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ds=setInterval(()=>{process.stdout.write(`\r${qt.cli.spin(Od++,`[${o}] ${r}%${c}`)}`)},Ld),this):(process.stdout.write(`${qt.cli.spin(0,`[${o}] ${r}%${c}`)}
1565
- `),this)}},P=WD});function Wa(t,e,n,r){if(!t)return{content:e,action:"created"};if(!(t.includes(n)&&t.includes(r)))return{content:`${t}
1565
+ `),this)}},P=W0});function Wa(t,e,n,r){if(!t)return{content:e,action:"created"};if(!(t.includes(n)&&t.includes(r)))return{content:`${t}
1566
1566
 
1567
- ${e}`,action:"appended"};let i=t.substring(0,t.indexOf(n)),o=t.substring(t.indexOf(r)+r.length),c;return e.includes(n)&&e.includes(r)?c=e.substring(e.indexOf(n),e.indexOf(r)+r.length):c=e,{content:i+c+o,action:"updated"}}var jd=h(()=>{"use strict";a(Wa,"mergeWithMarkers")});import Yk from"node:fs/promises";import BD from"node:path";async function Ba(t,e,n){let r=BD.join(t,e),s="",i=!0;try{s=await Yk.readFile(r,"utf-8")}catch(c){if(!V(c))throw new Error(`Could not read ${r}: ${A(c)}`);i=!1}let o=Wa(i?s:"",n,Oi,ji);return i&&o.content===s?{action:"unchanged",path:r}:(await Yk.writeFile(r,o.content,"utf-8"),{action:i?"updated":"created",path:r})}var Oi,ji,jn,Mi=h(()=>{"use strict";jd();ie();Oi="<!-- prjct:routing - do not edit between markers -->",ji="<!-- /prjct:routing - managed by prjct -->",jn="## prjct\nThis file holds no rules. Default surface: `work` + `ship` (user text confirm). Rest is pull-on-demand.\n- work: `prjct work --md` \xB7 ship: `prjct ship`\n- pull: `search` / `remember` / `guard` / `land` / `prime`\n- deep: `prjct workflows --md` \xB7 grade: `prjct harness score --md`";a(Ba,"writeRoutingBlock")});function Ga(){return`${["---","name: prjct","description: prjct work cycles + memory; run prjct verbs, do not preload context.","---","","# prjct","","Run `prjct <cmd> --md` and follow it.","",`- ${ut.rag}`,`- ${ut.entrypoint}`,`- ${ut.pull}`,`- ${ut.remember}`,`- ${ut.kb}`,`- ${ut.ship}`,`- ${ut.loop}`,`- ${ut.identity}`,"",`Commit footer: \`${zk}\``].join(`
1567
+ ${e}`,action:"appended"};let i=t.substring(0,t.indexOf(n)),o=t.substring(t.indexOf(r)+r.length),c;return e.includes(n)&&e.includes(r)?c=e.substring(e.indexOf(n),e.indexOf(r)+r.length):c=e,{content:i+c+o,action:"updated"}}var jd=h(()=>{"use strict";a(Wa,"mergeWithMarkers")});import Yk from"node:fs/promises";import B0 from"node:path";async function Ba(t,e,n){let r=B0.join(t,e),s="",i=!0;try{s=await Yk.readFile(r,"utf-8")}catch(c){if(!V(c))throw new Error(`Could not read ${r}: ${A(c)}`);i=!1}let o=Wa(i?s:"",n,Oi,ji);return i&&o.content===s?{action:"unchanged",path:r}:(await Yk.writeFile(r,o.content,"utf-8"),{action:i?"updated":"created",path:r})}var Oi,ji,jn,Mi=h(()=>{"use strict";jd();ie();Oi="<!-- prjct:routing - do not edit between markers -->",ji="<!-- /prjct:routing - managed by prjct -->",jn="## prjct\nThis file holds no rules. Default surface: `work` + `ship` (user text confirm). Rest is pull-on-demand.\n- work: `prjct work --md` \xB7 ship: `prjct ship`\n- pull: `search` / `remember` / `guard` / `land` / `prime`\n- deep: `prjct workflows --md` \xB7 grade: `prjct harness score --md`";a(Ba,"writeRoutingBlock")});function Ga(){return`${["---","name: prjct","description: prjct work cycles + memory; run prjct verbs, do not preload context.","---","","# prjct","","Run `prjct <cmd> --md` and follow it.","",`- ${ut.rag}`,`- ${ut.entrypoint}`,`- ${ut.pull}`,`- ${ut.remember}`,`- ${ut.kb}`,`- ${ut.ship}`,`- ${ut.loop}`,`- ${ut.identity}`,"",`Commit footer: \`${zk}\``].join(`
1568
1568
  `)}
1569
1569
  `}function ew(t){return`${["<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","# p/ \u2014 Context layer for AI agents","","Skills auto-activate for: work, intent, ship, sync, guard, remember, search, insights, performance","Other commands: run `prjct <command> --md` and follow CLI output","","Flow: `prjct work` is the single normal entrypoint. Trivial work proceeds","directly. Substantive implementation work follows the persisted work-cycle","station from `prjct work --md`: reviewed intent, evidence, tests when","required, then code.","","Data:","- Persist everything (memories, context, intents) in ENGLISH, whatever language the user speaks",`- ${ut.rag}`,`- ${ut.pull}`,`- Sovereign knowledge base \u2014 ${ut.kb}`,`- ${ut.remember}`,`- ${ut.loop}`,"- On close, save synthesized context; raw quotes, counters, detector rows, and transcript chunks are inputs, not final memory","- prjct remembers and shows the path; the agent decides how to execute with its own native tools","- Treat prjct output as signals, not a prescriptive harness",`- Commit footer: \`${zk}\``,"- Path resolution: `.prjct/prjct.config.json` \u2192 `~/.prjct-cli/projects/{projectId}`","- Storage: `prjct` CLI (SQLite internally)","- Worktree hygiene: if working in a git worktree, remove it AFTER its PR merges \u2014 `git worktree remove` from the main worktree; never with uncommitted/unpushed work, never `--force`","",`Crew (opt-in via \`prjct crew install\`): Leader (blue) \xB7 Implementer (purple) \xB7 Reviewer (pink). Subagent dispatch is Claude-Code-only; in ${t}, identify the role you are playing explicitly.`,"","**Auto-managed by prjct-cli** | https://prjct.app","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"].join(`
1570
1570
  `)}
1571
- `}function rw(t){return`${["---",t,"---","",XD,jn,"","**Auto-managed by prjct-cli** | https://prjct.app",qD].join(`
1571
+ `}function rw(t){return`${["---",t,"---","",X0,jn,"","**Auto-managed by prjct-cli** | https://prjct.app",q0].join(`
1572
1572
  `)}
1573
- `}var GD,zk,XD,qD,ut,Qk,Zk,tw,nw,sw,iw,Md=h(()=>{"use strict";Nn();Mi();GD=Cu.join("/"),zk="Generated with [p/](https://www.prjct.app/)",XD="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",qD="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",ut={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'`prjct work "<intent>" --md` is the single entrypoint \u2014 recognize intent and run the verb yourself.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${GD}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};a(Ga,"buildCompactSkill");Qk=Ga,Zk=Ga;a(ew,"buildGlobalConfig");tw=a(()=>ew("Gemini"),"buildGeminiConfig"),nw=a(()=>ew("Antigravity"),"buildAntigravityConfig");a(rw,"buildIdePointer");sw=a(()=>rw(`description: "prjct \u2014 pull project memory + workflow on demand"
1573
+ `}var G0,zk,X0,q0,ut,Qk,Zk,tw,nw,sw,iw,Md=h(()=>{"use strict";Nn();Mi();G0=Cu.join("/"),zk="Generated with [p/](https://www.prjct.app/)",X0="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",q0="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",ut={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'`prjct work "<intent>" --md` is the single entrypoint \u2014 recognize intent and run the verb yourself.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${G0}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};a(Ga,"buildCompactSkill");Qk=Ga,Zk=Ga;a(ew,"buildGlobalConfig");tw=a(()=>ew("Gemini"),"buildGeminiConfig"),nw=a(()=>ew("Antigravity"),"buildAntigravityConfig");a(rw,"buildIdePointer");sw=a(()=>rw(`description: "prjct \u2014 pull project memory + workflow on demand"
1574
1574
  alwaysApply: true`),"buildCursorRule"),iw=a(()=>rw(`trigger: always_on
1575
- description: "prjct \u2014 pull project memory + workflow on demand"`),"buildWindsurfRule")});import Fd from"node:fs";import Hd from"node:path";function aw(){if(ow)return $d;ow=!0;let t=Hd.join(An,"dist","templates.json");try{let e=Fd.readFileSync(t,"utf-8");return $d=JSON.parse(e),$d}catch{return null}}function Nt(t){let e=aw();if(e?.[t])return e[t];let n=VD(t);if(n)return n;let r=Hd.join(An,"templates",t);try{return Fd.readFileSync(r,"utf-8")}catch{return null}}function VD(t){switch(t){case"codex/SKILL.md":return Qk();case"antigravity/SKILL.md":return Zk();case"global/GEMINI.md":return tw();case"global/ANTIGRAVITY.md":return nw();case"global/CURSOR.mdc":return sw();case"global/WINDSURF.md":return iw();default:return null}}function cw(t){let e=aw();if(e)return Object.keys(e).filter(r=>r.startsWith(t));let n=Hd.join(An,"templates",t);try{return Fd.readdirSync(n).map(s=>`${t}${s}`)}catch{return[]}}var $d,ow,ps=h(()=>{"use strict";rn();Md();sn();$d=null,ow=!1;a(aw,"loadBundle");a(Nt,"getTemplateContent");a(VD,"getGeneratedTemplateContent");a(cw,"listTemplates")});import dn from"node:fs/promises";import hr from"node:path";async function uw(){try{let t=Q.getDocsPath();await dn.mkdir(t,{recursive:!0});let e=cw("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let i=Nt(s);i&&await dn.writeFile(hr.join(t,hr.basename(s)),i,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:n}=(sn(),Ir(Gl)),r=hr.join(n,"templates/global/docs");try{let s=await dn.readdir(r);for(let i of s)if(i.endsWith(".md")){let o=await dn.readFile(hr.join(r,i),"utf-8");await dn.writeFile(hr.join(t,i),o,"utf-8")}}catch{}return{success:!0}}catch(t){return{success:!1,error:A(t)}}}async function dw(){let t=(ft(),Ir(Xs)),e=await t.getActiveProvider(),n=e.name;if(!(await t.detectProvider(n)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await dn.mkdir(e.configDir,{recursive:!0});let s=hr.join(e.configDir,e.contextFile),i=lw;if(n!=="claude"){let g=Nt(`global/${e.contextFile}`);if(g)i=g;else{let{PACKAGE_ROOT:f}=(sn(),Ir(Gl)),k=hr.join(f,"templates","global",e.contextFile);try{i=await dn.readFile(k,"utf-8")}catch{n==="gemini"&&(i=lw.replace(/Claude/g,"Gemini"))}}}let o="",c=!1;try{o=await dn.readFile(s,"utf-8"),c=!0}catch(g){if(V(g))c=!1;else throw g}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(o.includes(l)&&o.includes(u)){let g=o.substring(0,o.indexOf(l)),f=o.substring(o.indexOf(u)+u.length);o=`${(g+f).replace(/\n{3,}/g,`
1575
+ description: "prjct \u2014 pull project memory + workflow on demand"`),"buildWindsurfRule")});import Fd from"node:fs";import Hd from"node:path";function aw(){if(ow)return $d;ow=!0;let t=Hd.join(An,"dist","templates.json");try{let e=Fd.readFileSync(t,"utf-8");return $d=JSON.parse(e),$d}catch{return null}}function Nt(t){let e=aw();if(e?.[t])return e[t];let n=V0(t);if(n)return n;let r=Hd.join(An,"templates",t);try{return Fd.readFileSync(r,"utf-8")}catch{return null}}function V0(t){switch(t){case"codex/SKILL.md":return Qk();case"antigravity/SKILL.md":return Zk();case"global/GEMINI.md":return tw();case"global/ANTIGRAVITY.md":return nw();case"global/CURSOR.mdc":return sw();case"global/WINDSURF.md":return iw();default:return null}}function cw(t){let e=aw();if(e)return Object.keys(e).filter(r=>r.startsWith(t));let n=Hd.join(An,"templates",t);try{return Fd.readdirSync(n).map(s=>`${t}${s}`)}catch{return[]}}var $d,ow,ps=h(()=>{"use strict";rn();Md();sn();$d=null,ow=!1;a(aw,"loadBundle");a(Nt,"getTemplateContent");a(V0,"getGeneratedTemplateContent");a(cw,"listTemplates")});import dn from"node:fs/promises";import hr from"node:path";async function uw(){try{let t=Q.getDocsPath();await dn.mkdir(t,{recursive:!0});let e=cw("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let i=Nt(s);i&&await dn.writeFile(hr.join(t,hr.basename(s)),i,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:n}=(sn(),Ir(Gl)),r=hr.join(n,"templates/global/docs");try{let s=await dn.readdir(r);for(let i of s)if(i.endsWith(".md")){let o=await dn.readFile(hr.join(r,i),"utf-8");await dn.writeFile(hr.join(t,i),o,"utf-8")}}catch{}return{success:!0}}catch(t){return{success:!1,error:A(t)}}}async function dw(){let t=(ft(),Ir(Xs)),e=await t.getActiveProvider(),n=e.name;if(!(await t.detectProvider(n)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await dn.mkdir(e.configDir,{recursive:!0});let s=hr.join(e.configDir,e.contextFile),i=lw;if(n!=="claude"){let g=Nt(`global/${e.contextFile}`);if(g)i=g;else{let{PACKAGE_ROOT:f}=(sn(),Ir(Gl)),k=hr.join(f,"templates","global",e.contextFile);try{i=await dn.readFile(k,"utf-8")}catch{n==="gemini"&&(i=lw.replace(/Claude/g,"Gemini"))}}}let o="",c=!1;try{o=await dn.readFile(s,"utf-8"),c=!0}catch(g){if(V(g))c=!1;else throw g}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(o.includes(l)&&o.includes(u)){let g=o.substring(0,o.indexOf(l)),f=o.substring(o.indexOf(u)+u.length);o=`${(g+f).replace(/\n{3,}/g,`
1576
1576
 
1577
1577
  `).trim()}
1578
- `}let m=Wa(c?o:"",i,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await dn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:A(s),action:"failed"}}}var lw,pw=h(()=>{"use strict";ps();ie();jd();Ke();lw='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project in SQLite and serves it to you through tools. **Query it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when `.prjct/` is in cwd OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), QUERY prjct first \u2014 bounded, ranked answers from SQLite, no markdown trees to wade through:\n\n- `prjct context memory <topic>` / `prjct search "<q>"` \u2014 captured decisions, gotchas, learnings, facts\n- `prjct context --md` \u2014 current state: active cycle, ships, recent learnings\n- architecture / conventions / patterns / anti-patterns / tech-debt / insights \u2192 MCP `prjct_analysis` (add `mode:archive` for history)\n- developer preferences \u2192 MCP `prjct_developer`; machine signals \u2192 MCP `prjct_signals`\n- specs \u2192 MCP `prjct_spec_list` / `prjct_spec_get`; per-file traps before editing \u2192 `prjct guard <file>`\n\nOnly fall through to source/repo reading when prjct does not contain the answer.\n\n**Skill \u2260 project identity.** The prjct skill is a portable multi-LLM contract (L0). Live name/stack/branch come from SessionStart + `prjct context --md` for **this cwd**. If skill text and the tree disagree, trust the cwd and the tree.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha \u2014 persist it: `prjct remember <decision|learning|gotcha|fact> "..."` or `prjct capture "<text>" --tags k:v`. **Author every entry in ENGLISH**, whatever language the user speaks. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.** The full verb map and task workflow live in the `prjct` skill.\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI / MCP tools)\n- Project config: `.prjct/prjct.config.json` in repo root\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';a(uw,"installDocs");a(dw,"installGlobalConfig")});import Mn from"node:fs/promises";import It from"node:path";var Ud,JD,pn,Xa=h(()=>{"use strict";ie();se();ft();pw();Gn();Ud=class{static{a(this,"CommandInstaller")}commandsPath="";configPath="";_initialized=!1;async ensureInit(){if(this._initialized)return;let e=await _n();this.configPath=e.configDir??"",this.commandsPath=this.configPath?It.join(this.configPath,"commands"):"",this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),I(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),n=await _n();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${n.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let n of["p.md","p.toml"]){let r=It.join(this.commandsPath,n);try{await Mn.unlink(r),e.push(n)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:A(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:A(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(n){return{success:!1,error:A(n),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let n of["p.md","p.toml"]){let r=It.join(this.commandsPath,n);try{await Mn.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=It.join(this.commandsPath,"p");try{if((await Mn.stat(e).catch(()=>null))?.isDirectory())return await Mn.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return dw()}async cleanupAllLegacy(){let e=Or(),n=[],r=[It.join(e,".claude","commands","p.md"),It.join(e,".claude","commands","p.toml"),It.join(e,".gemini","commands","p.md"),It.join(e,".gemini","commands","p.toml")];for(let o of r)try{await Mn.unlink(o),n.push(o)}catch{}let s=[It.join(e,".claude","commands","p"),It.join(e,".gemini","commands","p")];for(let o of s)try{(await Mn.stat(o).catch(()=>null))?.isDirectory()&&(await Mn.rm(o,{recursive:!0,force:!0}),n.push(o))}catch{}let i=[It.join(e,".prjct-cli","config","homebrew-migrated")];for(let o of i)try{await Mn.unlink(o),n.push(o)}catch{}return{cleaned:n}}async installDocs(){return uw()}},JD=new Ud,pn=JD});async function mw(t){return Ba(t,"AGENTS.md",KD)}var KD,gw=h(()=>{"use strict";Mi();KD=`${Oi}
1578
+ `}let m=Wa(c?o:"",i,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await dn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:A(s),action:"failed"}}}var lw,pw=h(()=>{"use strict";ps();ie();jd();Ke();lw='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project in SQLite and serves it to you through tools. **Query it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when `.prjct/` is in cwd OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), QUERY prjct first \u2014 bounded, ranked answers from SQLite, no markdown trees to wade through:\n\n- `prjct context memory <topic>` / `prjct search "<q>"` \u2014 captured decisions, gotchas, learnings, facts\n- `prjct context --md` \u2014 current state: active cycle, ships, recent learnings\n- architecture / conventions / patterns / anti-patterns / tech-debt / insights \u2192 MCP `prjct_analysis` (add `mode:archive` for history)\n- developer preferences \u2192 MCP `prjct_developer`; machine signals \u2192 MCP `prjct_signals`\n- specs \u2192 MCP `prjct_spec_list` / `prjct_spec_get`; per-file traps before editing \u2192 `prjct guard <file>`\n\nOnly fall through to source/repo reading when prjct does not contain the answer.\n\n**Skill \u2260 project identity.** The prjct skill is a portable multi-LLM contract (L0). Live name/stack/branch come from SessionStart + `prjct context --md` for **this cwd**. If skill text and the tree disagree, trust the cwd and the tree.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha \u2014 persist it: `prjct remember <decision|learning|gotcha|fact> "..."` or `prjct capture "<text>" --tags k:v`. **Author every entry in ENGLISH**, whatever language the user speaks. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.** The full verb map and task workflow live in the `prjct` skill.\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI / MCP tools)\n- Project config: `.prjct/prjct.config.json` in repo root\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';a(uw,"installDocs");a(dw,"installGlobalConfig")});import Mn from"node:fs/promises";import It from"node:path";var Ud,J0,pn,Xa=h(()=>{"use strict";ie();se();ft();pw();Gn();Ud=class{static{a(this,"CommandInstaller")}commandsPath="";configPath="";_initialized=!1;async ensureInit(){if(this._initialized)return;let e=await _n();this.configPath=e.configDir??"",this.commandsPath=this.configPath?It.join(this.configPath,"commands"):"",this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),I(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),n=await _n();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${n.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let n of["p.md","p.toml"]){let r=It.join(this.commandsPath,n);try{await Mn.unlink(r),e.push(n)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:A(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:A(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(n){return{success:!1,error:A(n),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let n of["p.md","p.toml"]){let r=It.join(this.commandsPath,n);try{await Mn.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=It.join(this.commandsPath,"p");try{if((await Mn.stat(e).catch(()=>null))?.isDirectory())return await Mn.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return dw()}async cleanupAllLegacy(){let e=Or(),n=[],r=[It.join(e,".claude","commands","p.md"),It.join(e,".claude","commands","p.toml"),It.join(e,".gemini","commands","p.md"),It.join(e,".gemini","commands","p.toml")];for(let o of r)try{await Mn.unlink(o),n.push(o)}catch{}let s=[It.join(e,".claude","commands","p"),It.join(e,".gemini","commands","p")];for(let o of s)try{(await Mn.stat(o).catch(()=>null))?.isDirectory()&&(await Mn.rm(o,{recursive:!0,force:!0}),n.push(o))}catch{}let i=[It.join(e,".prjct-cli","config","homebrew-migrated")];for(let o of i)try{await Mn.unlink(o),n.push(o)}catch{}return{cleaned:n}}async installDocs(){return uw()}},J0=new Ud,pn=J0});async function mw(t){return Ba(t,"AGENTS.md",K0)}var K0,gw=h(()=>{"use strict";Mi();K0=`${Oi}
1579
1579
  ${jn}
1580
1580
  ${ji}
1581
- `;a(mw,"writeProjectAgentsMd")});async function fw(t){return Ba(t,"CLAUDE.md",YD)}var YD,hw=h(()=>{"use strict";Mi();YD=`${Oi}
1581
+ `;a(mw,"writeProjectAgentsMd")});async function fw(t){return Ba(t,"CLAUDE.md",Y0)}var Y0,hw=h(()=>{"use strict";Mi();Y0=`${Oi}
1582
1582
  ${jn}
1583
1583
  ${ji}
1584
- `;a(fw,"writeProjectClaudeMd")});import yw from"node:path";function Ew(){return zD.flatMap(t=>t.projectRuleTargets??[])}var zD,kw=h(()=>{"use strict";se();Gs();Gn();zD=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Claude Code + Opus frontier. CLAUDE.md, skills, hooks, MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Codex + GPT-5.x (TB leader). AGENTS.md, config.toml MCP (native), hooks opt-in (planned installer)."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.gemini/settings.json mcpServers",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Gemini CLI + Pro/Flash. GEMINI.md; prjct install writes MCP+hooks to ~/.gemini/settings.json."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[yw.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"opencode.jsonc mcp",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Benchmark-tier open-source CLI (2026-07): most-starred multi-provider agent. AGENTS.md + plugins + MCP."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.kimi/mcp.json",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"grok",displayName:"xAI Grok Build",kind:"cli",status:"stable",detectsBy:{homeDirs:[".grok"],commands:["grok"]},contextFiles:["AGENTS.md","CLAUDE.md"],mcpTargets:[{format:"generic",pathHint:"~/.grok config/plugins (MCP)",writable:!1},{format:"claude-json",pathHint:"~/.claude/mcp.json (Grok Claude-compat)",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Grok Build. AGENTS.md + native Claude Code compat (CLAUDE.md, skills, MCP, hooks). prjct install covers Grok via inherits-claude \u2014 see harness-surfaces."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier AI IDE (2026-07): agent mode + CLI. Rules under .cursor/rules; prjct install writes ~/.cursor/hooks.json."},{id:"windsurf",displayName:"Windsurf",kind:"ide",status:"legacy",detectsBy:{projectDirs:[".windsurf"],projectFiles:[".windsurfrules"]},contextFiles:["AGENTS.md",".windsurf/rules/prjct.md"],projectRuleTargets:[{relativePath:".windsurf/rules/prjct.md",templateKey:"global/WINDSURF.md",detectPath:".windsurf"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"LEGACY (2026-07): Windsurf is no longer a product focus. Keep AGENTS.md + optional .windsurf/rules for residual installs; do not expand surface area. Prefer Cursor, Claude Code, Codex, Gemini CLI, OpenCode, Cline."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"Benchmark-tier open agent (2026-07): VS Code + multi-model. AGENTS.md, rules, skills, hooks, MCP, ACP."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[yw.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"GitHub Copilot coding agent / Copilot CLI (2026-07 benchmark field). Repo AGENTS.md + .github instructions + MCP."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];a(Ew,"listProjectRuleTargets")});import Wd from"node:fs/promises";import qa from"node:path";async function QD(t){let e=Nt(t);return e||Wd.readFile(qa.join(An,"templates",t),"utf-8")}async function ZD(t,e,n){let r=qa.join(t,e);await Wd.mkdir(qa.dirname(r),{recursive:!0}),await Wd.writeFile(r,await QD(n),"utf-8")}async function ww(t,e={}){let n=new Set(e.agents??[]),r=[];for(let s of Ew())(n.has(s.relativePath.split("/")[0].replace(/^\./,""))||s.detectPath&&await I(qa.join(t,s.detectPath)))&&(await ZD(t,s.relativePath,s.templateKey),r.push(s.relativePath));return{written:r}}var Tw=h(()=>{"use strict";ps();kw();se();sn();a(QD,"loadTemplate");a(ZD,"writeRule");a(ww,"writeProjectIdeRules")});import bw from"node:path";async function yr(t,e={}){if(!e.explicit)return{agentsMd:{action:"unchanged",path:bw.join(t,"AGENTS.md")},ideRules:[]};let n=new Set(e.agents??[]),r=await mw(t),s=await I(bw.join(t,"CLAUDE.md")),o=n.has("claude")||s?await fw(t):void 0,c=await ww(t,e);return{agentsMd:r,...o?{claudeMd:o}:{},ideRules:c.written}}var Bd=h(()=>{"use strict";se();gw();hw();Tw();a(yr,"writeProjectAgentSurfaces")});function Sw(t,e,n){if(n.md){console.log(`> ${e}`);return}P[t](e)}function $i(t,e={}){return e0(t,e),{success:!1,error:t}}function $n(t,e={}){return vw(t,e),{success:!1,error:t}}function dt(t,e){let n=A(t);return e&&vw(n,e),{success:!1,error:n}}var e0,vw,Vt=h(()=>{"use strict";ie();lt();a(Sw,"notify");e0=a((t,e={})=>Sw("warn",t,e),"notifyWarn"),vw=a((t,e={})=>Sw("fail",t,e),"notifyFail");a($i,"failWith");a($n,"failHard");a(dt,"failFromError")});var _w={};L(_w,{AI_AGENTS:()=>Ka,PROJECT_TYPES:()=>ms,detectInstalledAgents:()=>za,detectProjectType:()=>Ya,detectStack:()=>Qa});import Ja from"node:fs/promises";import Va from"node:os";import Re from"node:path";async function Ya(t){try{let e=await Ja.readdir(t);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let n=Re.join(t,"package.json"),r=JSON.parse(await Ja.readFile(n,"utf-8")),s={...r.dependencies,...r.devDependencies};if(r.bin)return"cli-tool";if(r.main&&!s.react&&!s.vue&&!s.angular&&!s.express&&!s.hono)return"library";if((s.react||s.vue)&&(s.express||s.hono||s.fastify))return"fullstack";if(s.react||s.vue||s["@angular/core"]||s.next||s.nuxt)return"web-app";if(s.express||s.hono||s.fastify||s.koa||s.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(r=>["main.py","app.py","server.py"].includes(r))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function za(t){let e=[];await Me(Re.join(Va.homedir(),".claude"))&&e.push("claude"),await I(Re.join(t,".cursorrules"))&&e.push("cursor"),await I(Re.join(t,".windsurfrules"))&&e.push("windsurf"),await I(Re.join(t,".github","copilot-instructions.md"))&&e.push("copilot"),await Me(Re.join(Va.homedir(),".gemini"))&&e.push("gemini"),await Me(Re.join(Va.homedir(),".gemini","antigravity"))&&e.push("antigravity"),await Me(Re.join(t,".opencode"))&&e.push("opencode"),await Me(Re.join(t,".qwen"))&&e.push("qwen-code"),await Me(Re.join(t,".goose"))&&e.push("goose"),(await I(Re.join(t,".aider.conf.yml"))||await I(Re.join(t,".aider.conf.yaml")))&&e.push("aider"),(await Me(Re.join(t,".cline"))||await Me(Re.join(t,".clinerules"))||await I(Re.join(t,".clinerules")))&&e.push("cline"),await Me(Re.join(t,".roo"))&&e.push("roo-code"),await Me(Re.join(t,".continue"))&&e.push("continue"),await Me(Re.join(t,".kiro"))&&e.push("kiro"),await Me(Re.join(t,".zed"))&&e.push("zed");try{let{execAsync:n}=await Promise.resolve().then(()=>(ue(),xo));await n("which codex"),e.push("codex")}catch{await Me(Re.join(Va.homedir(),".codex"))&&e.push("codex")}return e}async function Qa(t){let e={language:"Unknown",technologies:[]};try{let n=await Ja.readdir(t);if(n.includes("package.json")){let r=Re.join(t,"package.json"),s=JSON.parse(await Ja.readFile(r,"utf-8")),i={...s.dependencies,...s.devDependencies};e.language=i.typescript?"TypeScript":"JavaScript",i.next?e.framework="Next.js":i.nuxt?e.framework="Nuxt":i.react?e.framework="React":i.vue?e.framework="Vue":i["@angular/core"]?e.framework="Angular":i.express?e.framework="Express":i.hono?e.framework="Hono":i.fastify?e.framework="Fastify":(i.nestjs||i["@nestjs/core"])&&(e.framework="NestJS"),i.bun||i["@types/bun"]||s.engines?.bun?e.runtime="Bun":e.runtime="Node.js",n.includes("bun.lockb")?e.packageManager="Bun":n.includes("pnpm-lock.yaml")?e.packageManager="pnpm":n.includes("yarn.lock")?e.packageManager="Yarn":n.includes("package-lock.json")&&(e.packageManager="npm"),(i.prisma||i["@prisma/client"])&&e.technologies.push("Prisma"),(i.drizzle||i["drizzle-orm"])&&e.technologies.push("Drizzle"),i.tailwindcss&&e.technologies.push("Tailwind CSS"),i.zod&&e.technologies.push("Zod"),(i.trpc||i["@trpc/server"])&&e.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?e.language="Python":n.includes("go.mod")?e.language="Go":n.includes("Cargo.toml")?e.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var ms,Ka,Gd=h(()=>{"use strict";se();ms=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Ka=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"},{value:"opencode",title:"OpenCode",description:"Open-source terminal coding agent"},{value:"qwen-code",title:"Qwen Code",description:"Qwen-family coding runtime"},{value:"goose",title:"Goose",description:"Open-source coding agent with extensions"},{value:"aider",title:"Aider",description:"Terminal pair-programming agent"},{value:"cline",title:"Cline",description:"VS Code coding agent"},{value:"roo-code",title:"Roo Code",description:"VS Code coding agent with MCP"},{value:"continue",title:"Continue",description:"IDE assistant with MCP config"},{value:"kiro",title:"Kiro",description:"Agentic IDE with steering docs"},{value:"zed",title:"Zed",description:"Editor agent with ACP support"}];a(Ya,"detectProjectType");a(za,"detectInstalledAgents");a(Qa,"detectStack")});import*as pe from"@clack/prompts";import Er from"chalk";var Fi,xw=h(()=>{"use strict";lt();Gd();Fi=class{static{a(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){pe.intro(Er.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:a(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:a(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:a(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:a(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:a(()=>this.stepSummary(),"run")}];for(let n of e)if(!await n.run()||this.aborted)return this.buildResult(!0);return pe.outro(Er.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){P.spin("Auto-detecting project configuration..."),this.detectedType=await Ya(this.projectPath),this.confirmedType=this.detectedType;let e=await za(this.projectPath);return this.selectedAgents=e,this.detectedStack=await Qa(this.projectPath),this.confirmedStack=this.detectedStack,P.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await Ya(this.projectPath);let e=ms.findIndex(r=>r.value===this.detectedType),n=await pe.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ms.map(r=>({label:r.title,hint:r.description,value:r.value})),initialValue:e>=0?ms[e].value:void 0});return pe.isCancel(n)?(this.handleCancel(),!1):(this.confirmedType=n||this.detectedType,!0)}async stepAIAgents(){let e=await za(this.projectPath),n=Ka.map(s=>({label:s.title,hint:s.description,value:s.value})),r=await pe.multiselect({message:"Which AI agents do you use?",options:n,initialValues:e,required:!0});return pe.isCancel(r)?(this.handleCancel(),!1):(this.selectedAgents=r,!0)}async stepStack(){this.detectedStack=await Qa(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);pe.note(e,"Detected stack");let n=await pe.confirm({message:"Is this stack correct?",initialValue:!0});if(pe.isCancel(n))return this.handleCancel(),!1;if(n)this.confirmedStack=this.detectedStack;else{let r=await pe.group({language:a(()=>pe.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:a(()=>pe.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:a(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:r.language||this.detectedStack.language,framework:r.framework||void 0}}return!0}async stepPreferences(){let e=await pe.group({verbosity:a(()=>pe.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:a(()=>pe.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:a(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Er.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Er.cyan("AI Agents:")} ${this.selectedAgents.map(r=>this.getAgentLabel(r)).join(", ")}`,`${Er.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Er.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Er.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1585
- `);pe.note(e,"Configuration Summary");let n=await pe.confirm({message:"Generate configuration with these settings?",initialValue:!0});return pe.isCancel(n)||!n?(pe.isCancel(n)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,pe.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ms.find(n=>n.value===e)?.title||"Unknown"}getAgentLabel(e){return Ka.find(n=>n.value===e)?.title||e}formatStackDisplay(e){let n=[e.language];return e.framework&&n.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&n.push(e.runtime),e.technologies.length>0&&n.push(`+ ${e.technologies.slice(0,3).join(", ")}`),n.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import t0 from"node:https";import Rw from"node:path";import Fn from"chalk";function n0(t,e){let n=`Update available! ${t} \u2192 ${e}`,r="prjct upgrade",s=Math.max(n.length,`Run: ${r}`.length)+4,i=`\u250C${"\u2500".repeat(s)}\u2510`,o=`\u2514${"\u2500".repeat(s)}\u2518`,c=a(l=>`\u2502 ${l}${" ".repeat(s-l.length-2)}\u2502`,"pad");return["",Fn.yellow(i),Fn.yellow(c("")),Fn.yellow(`\u2502 ${Fn.bold(n)}${" ".repeat(s-n.length-2)}\u2502`),Fn.yellow(`\u2502 Run: ${Fn.cyan(r)}${" ".repeat(s-r.length-7)}\u2502`),Fn.yellow(c("")),Fn.yellow(o),""].join(`
1586
- `)}var Xd,Cw,HJ,Aw=h(()=>{"use strict";ie();se();sn();Ke();Xd=class{static{a(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Q.globalConfigDir,this.cacheFile=Rw.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rw.join(__dirname,"..","..","package.json");return(await We(e))?.version??null}catch(e){return console.error("Error reading package version:",A(e)),null}}async getLatestVersion(){return new Promise((e,n)=>{let r={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=t0.request(r,i=>{let o="";i.on("data",c=>{o+=c}),i.on("end",()=>{try{if(i.statusCode===200){let c=JSON.parse(o);e(c.version)}else n(new Error(`npm registry returned status ${i.statusCode}`))}catch(c){n(c)}})});s.on("error",i=>{n(i)}),s.setTimeout(5e3,()=>{s.destroy(),n(new Error("Request timeout"))}),s.end()})}compareVersions(e,n){let r=e.split(".").map(Number),s=n.split(".").map(Number);for(let i=0;i<3;i++){let o=r[i]||0,c=s[i]||0;if(o>c)return 1;if(o<c)return-1}return 0}async readCache(){try{if(await I(this.cacheFile))return await We(this.cacheFile)}catch{}return null}async writeCache(e){try{await De(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let n=await this.readCache(),r=Date.now();if(n?.lastCheck&&r-n.lastCheck<this.checkInterval)return n.latestVersion&&this.compareVersions(n.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:n.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:r,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:n0(e.currentVersion,e.latestVersion)}},Cw=Xd,HJ=1440*60*1e3;a(n0,"formatUpdateBanner")});import Nw from"node:path";async function i0(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let t=process.cwd();if(await I(Nw.join(t,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await I(Nw.join(e,".claude")))return!0;let n=process.cwd();return!!(n.includes("/.claude/")||n.includes("/claude-workspace/"))}function o0(){return{...r0}}function a0(){return{...s0}}function c0(){return!!(process.env.CODEX_SANDBOX||process.env.PRJCT_SANDBOX==="1")}async function Iw(){if(Za)return Za;let t=await i0()?o0():a0();return t.environment={...t.environment,sandboxed:c0()},Za=t,Za}var Za,r0,s0,Pw=h(()=>{"use strict";se();Za=null,r0={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"p.",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},s0={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};a(i0,"isClaudeEnvironment");a(o0,"getClaudeAgent");a(a0,"getTerminalAgent");a(c0,"isSandboxed");a(Iw,"detect")});import ec from"node:fs/promises";var qd,Dw,Lw=h(()=>{"use strict";ie();se();qd=class{static{a(this,"RuntimeClaude")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,n="info"){let r={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${r[n]||r.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(n){console.warn(`MCP readFile failed, falling back to fs: ${A(n)}`)}return await ec.readFile(e,"utf8")}async writeFile(e,n){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,n)}catch(r){console.warn(`MCP writeFile failed, falling back to fs: ${A(r)}`)}await ec.writeFile(e,n,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(n){console.warn(`MCP listDirectory failed, falling back to fs: ${A(n)}`)}return await ec.readdir(e)}async fileExists(e){return I(e)}async createDirectory(e){await ec.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1584
+ `;a(fw,"writeProjectClaudeMd")});import yw from"node:path";function Ew(){return z0.flatMap(t=>t.projectRuleTargets??[])}var z0,kw=h(()=>{"use strict";se();Gs();Gn();z0=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Claude Code + Opus frontier. CLAUDE.md, skills, hooks, MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Codex + GPT-5.x (TB leader). AGENTS.md, config.toml MCP (native), hooks opt-in (planned installer)."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.gemini/settings.json mcpServers",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Gemini CLI + Pro/Flash. GEMINI.md; prjct install writes MCP+hooks to ~/.gemini/settings.json."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[yw.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"opencode.jsonc mcp",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Benchmark-tier open-source CLI (2026-07): most-starred multi-provider agent. AGENTS.md + plugins + MCP."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.kimi/mcp.json",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"grok",displayName:"xAI Grok Build",kind:"cli",status:"stable",detectsBy:{homeDirs:[".grok"],commands:["grok"]},contextFiles:["AGENTS.md","CLAUDE.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.grok/config.toml",writable:!0},{format:"claude-json",pathHint:"~/.claude/mcp.json (Grok Claude-compat fallback)",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Grok Build. Native MCP + skill via prjct install (~/.grok/config.toml + ~/.grok/skills/prjct). Hooks still Claude-compat. See harness-surfaces."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier AI IDE (2026-07): agent mode + CLI. Rules under .cursor/rules; prjct install writes ~/.cursor/hooks.json."},{id:"windsurf",displayName:"Windsurf",kind:"ide",status:"legacy",detectsBy:{projectDirs:[".windsurf"],projectFiles:[".windsurfrules"]},contextFiles:["AGENTS.md",".windsurf/rules/prjct.md"],projectRuleTargets:[{relativePath:".windsurf/rules/prjct.md",templateKey:"global/WINDSURF.md",detectPath:".windsurf"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"LEGACY (2026-07): Windsurf is no longer a product focus. Keep AGENTS.md + optional .windsurf/rules for residual installs; do not expand surface area. Prefer Cursor, Claude Code, Codex, Gemini CLI, OpenCode, Cline."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"Benchmark-tier open agent (2026-07): VS Code + multi-model. AGENTS.md, rules, skills, hooks, MCP, ACP."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[yw.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"GitHub Copilot coding agent / Copilot CLI (2026-07 benchmark field). Repo AGENTS.md + .github instructions + MCP."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];a(Ew,"listProjectRuleTargets")});import Wd from"node:fs/promises";import qa from"node:path";async function Q0(t){let e=Nt(t);return e||Wd.readFile(qa.join(An,"templates",t),"utf-8")}async function Z0(t,e,n){let r=qa.join(t,e);await Wd.mkdir(qa.dirname(r),{recursive:!0}),await Wd.writeFile(r,await Q0(n),"utf-8")}async function ww(t,e={}){let n=new Set(e.agents??[]),r=[];for(let s of Ew())(n.has(s.relativePath.split("/")[0].replace(/^\./,""))||s.detectPath&&await I(qa.join(t,s.detectPath)))&&(await Z0(t,s.relativePath,s.templateKey),r.push(s.relativePath));return{written:r}}var Tw=h(()=>{"use strict";ps();kw();se();sn();a(Q0,"loadTemplate");a(Z0,"writeRule");a(ww,"writeProjectIdeRules")});import bw from"node:path";async function yr(t,e={}){if(!e.explicit)return{agentsMd:{action:"unchanged",path:bw.join(t,"AGENTS.md")},ideRules:[]};let n=new Set(e.agents??[]),r=await mw(t),s=await I(bw.join(t,"CLAUDE.md")),o=n.has("claude")||s?await fw(t):void 0,c=await ww(t,e);return{agentsMd:r,...o?{claudeMd:o}:{},ideRules:c.written}}var Bd=h(()=>{"use strict";se();gw();hw();Tw();a(yr,"writeProjectAgentSurfaces")});function Sw(t,e,n){if(n.md){console.log(`> ${e}`);return}P[t](e)}function $i(t,e={}){return eD(t,e),{success:!1,error:t}}function $n(t,e={}){return vw(t,e),{success:!1,error:t}}function dt(t,e){let n=A(t);return e&&vw(n,e),{success:!1,error:n}}var eD,vw,Vt=h(()=>{"use strict";ie();lt();a(Sw,"notify");eD=a((t,e={})=>Sw("warn",t,e),"notifyWarn"),vw=a((t,e={})=>Sw("fail",t,e),"notifyFail");a($i,"failWith");a($n,"failHard");a(dt,"failFromError")});var _w={};L(_w,{AI_AGENTS:()=>Ka,PROJECT_TYPES:()=>ms,detectInstalledAgents:()=>za,detectProjectType:()=>Ya,detectStack:()=>Qa});import Ja from"node:fs/promises";import Va from"node:os";import Re from"node:path";async function Ya(t){try{let e=await Ja.readdir(t);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let n=Re.join(t,"package.json"),r=JSON.parse(await Ja.readFile(n,"utf-8")),s={...r.dependencies,...r.devDependencies};if(r.bin)return"cli-tool";if(r.main&&!s.react&&!s.vue&&!s.angular&&!s.express&&!s.hono)return"library";if((s.react||s.vue)&&(s.express||s.hono||s.fastify))return"fullstack";if(s.react||s.vue||s["@angular/core"]||s.next||s.nuxt)return"web-app";if(s.express||s.hono||s.fastify||s.koa||s.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(r=>["main.py","app.py","server.py"].includes(r))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function za(t){let e=[];await Me(Re.join(Va.homedir(),".claude"))&&e.push("claude"),await I(Re.join(t,".cursorrules"))&&e.push("cursor"),await I(Re.join(t,".windsurfrules"))&&e.push("windsurf"),await I(Re.join(t,".github","copilot-instructions.md"))&&e.push("copilot"),await Me(Re.join(Va.homedir(),".gemini"))&&e.push("gemini"),await Me(Re.join(Va.homedir(),".gemini","antigravity"))&&e.push("antigravity"),await Me(Re.join(t,".opencode"))&&e.push("opencode"),await Me(Re.join(t,".qwen"))&&e.push("qwen-code"),await Me(Re.join(t,".goose"))&&e.push("goose"),(await I(Re.join(t,".aider.conf.yml"))||await I(Re.join(t,".aider.conf.yaml")))&&e.push("aider"),(await Me(Re.join(t,".cline"))||await Me(Re.join(t,".clinerules"))||await I(Re.join(t,".clinerules")))&&e.push("cline"),await Me(Re.join(t,".roo"))&&e.push("roo-code"),await Me(Re.join(t,".continue"))&&e.push("continue"),await Me(Re.join(t,".kiro"))&&e.push("kiro"),await Me(Re.join(t,".zed"))&&e.push("zed");try{let{execAsync:n}=await Promise.resolve().then(()=>(ue(),xo));await n("which codex"),e.push("codex")}catch{await Me(Re.join(Va.homedir(),".codex"))&&e.push("codex")}return e}async function Qa(t){let e={language:"Unknown",technologies:[]};try{let n=await Ja.readdir(t);if(n.includes("package.json")){let r=Re.join(t,"package.json"),s=JSON.parse(await Ja.readFile(r,"utf-8")),i={...s.dependencies,...s.devDependencies};e.language=i.typescript?"TypeScript":"JavaScript",i.next?e.framework="Next.js":i.nuxt?e.framework="Nuxt":i.react?e.framework="React":i.vue?e.framework="Vue":i["@angular/core"]?e.framework="Angular":i.express?e.framework="Express":i.hono?e.framework="Hono":i.fastify?e.framework="Fastify":(i.nestjs||i["@nestjs/core"])&&(e.framework="NestJS"),i.bun||i["@types/bun"]||s.engines?.bun?e.runtime="Bun":e.runtime="Node.js",n.includes("bun.lockb")?e.packageManager="Bun":n.includes("pnpm-lock.yaml")?e.packageManager="pnpm":n.includes("yarn.lock")?e.packageManager="Yarn":n.includes("package-lock.json")&&(e.packageManager="npm"),(i.prisma||i["@prisma/client"])&&e.technologies.push("Prisma"),(i.drizzle||i["drizzle-orm"])&&e.technologies.push("Drizzle"),i.tailwindcss&&e.technologies.push("Tailwind CSS"),i.zod&&e.technologies.push("Zod"),(i.trpc||i["@trpc/server"])&&e.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?e.language="Python":n.includes("go.mod")?e.language="Go":n.includes("Cargo.toml")?e.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var ms,Ka,Gd=h(()=>{"use strict";se();ms=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Ka=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"},{value:"opencode",title:"OpenCode",description:"Open-source terminal coding agent"},{value:"qwen-code",title:"Qwen Code",description:"Qwen-family coding runtime"},{value:"goose",title:"Goose",description:"Open-source coding agent with extensions"},{value:"aider",title:"Aider",description:"Terminal pair-programming agent"},{value:"cline",title:"Cline",description:"VS Code coding agent"},{value:"roo-code",title:"Roo Code",description:"VS Code coding agent with MCP"},{value:"continue",title:"Continue",description:"IDE assistant with MCP config"},{value:"kiro",title:"Kiro",description:"Agentic IDE with steering docs"},{value:"zed",title:"Zed",description:"Editor agent with ACP support"}];a(Ya,"detectProjectType");a(za,"detectInstalledAgents");a(Qa,"detectStack")});import*as pe from"@clack/prompts";import Er from"chalk";var Fi,xw=h(()=>{"use strict";lt();Gd();Fi=class{static{a(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){pe.intro(Er.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:a(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:a(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:a(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:a(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:a(()=>this.stepSummary(),"run")}];for(let n of e)if(!await n.run()||this.aborted)return this.buildResult(!0);return pe.outro(Er.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){P.spin("Auto-detecting project configuration..."),this.detectedType=await Ya(this.projectPath),this.confirmedType=this.detectedType;let e=await za(this.projectPath);return this.selectedAgents=e,this.detectedStack=await Qa(this.projectPath),this.confirmedStack=this.detectedStack,P.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await Ya(this.projectPath);let e=ms.findIndex(r=>r.value===this.detectedType),n=await pe.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ms.map(r=>({label:r.title,hint:r.description,value:r.value})),initialValue:e>=0?ms[e].value:void 0});return pe.isCancel(n)?(this.handleCancel(),!1):(this.confirmedType=n||this.detectedType,!0)}async stepAIAgents(){let e=await za(this.projectPath),n=Ka.map(s=>({label:s.title,hint:s.description,value:s.value})),r=await pe.multiselect({message:"Which AI agents do you use?",options:n,initialValues:e,required:!0});return pe.isCancel(r)?(this.handleCancel(),!1):(this.selectedAgents=r,!0)}async stepStack(){this.detectedStack=await Qa(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);pe.note(e,"Detected stack");let n=await pe.confirm({message:"Is this stack correct?",initialValue:!0});if(pe.isCancel(n))return this.handleCancel(),!1;if(n)this.confirmedStack=this.detectedStack;else{let r=await pe.group({language:a(()=>pe.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:a(()=>pe.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:a(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:r.language||this.detectedStack.language,framework:r.framework||void 0}}return!0}async stepPreferences(){let e=await pe.group({verbosity:a(()=>pe.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:a(()=>pe.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:a(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Er.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Er.cyan("AI Agents:")} ${this.selectedAgents.map(r=>this.getAgentLabel(r)).join(", ")}`,`${Er.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Er.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Er.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1585
+ `);pe.note(e,"Configuration Summary");let n=await pe.confirm({message:"Generate configuration with these settings?",initialValue:!0});return pe.isCancel(n)||!n?(pe.isCancel(n)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,pe.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ms.find(n=>n.value===e)?.title||"Unknown"}getAgentLabel(e){return Ka.find(n=>n.value===e)?.title||e}formatStackDisplay(e){let n=[e.language];return e.framework&&n.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&n.push(e.runtime),e.technologies.length>0&&n.push(`+ ${e.technologies.slice(0,3).join(", ")}`),n.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import tD from"node:https";import Rw from"node:path";import Fn from"chalk";function nD(t,e){let n=`Update available! ${t} \u2192 ${e}`,r="prjct upgrade",s=Math.max(n.length,`Run: ${r}`.length)+4,i=`\u250C${"\u2500".repeat(s)}\u2510`,o=`\u2514${"\u2500".repeat(s)}\u2518`,c=a(l=>`\u2502 ${l}${" ".repeat(s-l.length-2)}\u2502`,"pad");return["",Fn.yellow(i),Fn.yellow(c("")),Fn.yellow(`\u2502 ${Fn.bold(n)}${" ".repeat(s-n.length-2)}\u2502`),Fn.yellow(`\u2502 Run: ${Fn.cyan(r)}${" ".repeat(s-r.length-7)}\u2502`),Fn.yellow(c("")),Fn.yellow(o),""].join(`
1586
+ `)}var Xd,Cw,HJ,Aw=h(()=>{"use strict";ie();se();sn();Ke();Xd=class{static{a(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Q.globalConfigDir,this.cacheFile=Rw.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rw.join(__dirname,"..","..","package.json");return(await We(e))?.version??null}catch(e){return console.error("Error reading package version:",A(e)),null}}async getLatestVersion(){return new Promise((e,n)=>{let r={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=tD.request(r,i=>{let o="";i.on("data",c=>{o+=c}),i.on("end",()=>{try{if(i.statusCode===200){let c=JSON.parse(o);e(c.version)}else n(new Error(`npm registry returned status ${i.statusCode}`))}catch(c){n(c)}})});s.on("error",i=>{n(i)}),s.setTimeout(5e3,()=>{s.destroy(),n(new Error("Request timeout"))}),s.end()})}compareVersions(e,n){let r=e.split(".").map(Number),s=n.split(".").map(Number);for(let i=0;i<3;i++){let o=r[i]||0,c=s[i]||0;if(o>c)return 1;if(o<c)return-1}return 0}async readCache(){try{if(await I(this.cacheFile))return await We(this.cacheFile)}catch{}return null}async writeCache(e){try{await De(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let n=await this.readCache(),r=Date.now();if(n?.lastCheck&&r-n.lastCheck<this.checkInterval)return n.latestVersion&&this.compareVersions(n.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:n.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:r,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:nD(e.currentVersion,e.latestVersion)}},Cw=Xd,HJ=1440*60*1e3;a(nD,"formatUpdateBanner")});import Nw from"node:path";async function iD(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let t=process.cwd();if(await I(Nw.join(t,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await I(Nw.join(e,".claude")))return!0;let n=process.cwd();return!!(n.includes("/.claude/")||n.includes("/claude-workspace/"))}function oD(){return{...rD}}function aD(){return{...sD}}function cD(){return!!(process.env.CODEX_SANDBOX||process.env.PRJCT_SANDBOX==="1")}async function Iw(){if(Za)return Za;let t=await iD()?oD():aD();return t.environment={...t.environment,sandboxed:cD()},Za=t,Za}var Za,rD,sD,Pw=h(()=>{"use strict";se();Za=null,rD={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"p.",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},sD={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};a(iD,"isClaudeEnvironment");a(oD,"getClaudeAgent");a(aD,"getTerminalAgent");a(cD,"isSandboxed");a(Iw,"detect")});import ec from"node:fs/promises";var qd,Dw,Lw=h(()=>{"use strict";ie();se();qd=class{static{a(this,"RuntimeClaude")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,n="info"){let r={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${r[n]||r.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(n){console.warn(`MCP readFile failed, falling back to fs: ${A(n)}`)}return await ec.readFile(e,"utf8")}async writeFile(e,n){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,n)}catch(r){console.warn(`MCP writeFile failed, falling back to fs: ${A(r)}`)}await ec.writeFile(e,n,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(n){console.warn(`MCP listDirectory failed, falling back to fs: ${A(n)}`)}return await ec.readdir(e)}async fileExists(e){return I(e)}async createDirectory(e){await ec.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1587
1587
  ${e.map((n,r)=>`${r+1}. ${n}`).join(`
1588
1588
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
1589
1589
 
@@ -1628,24 +1628,24 @@ Or type p. help to see all options`,stuck:`Let's break it down:
1628
1628
 
1629
1629
  Or: p. work | p. remember | p. insights`}[e]||`What would you like to do?
1630
1630
 
1631
- Type p. help to see all options`}detectIntent(e){let n=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(n)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(n)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(n)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(n)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(n)||/^(progress|status|recap|avance)/i.test(n)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(n)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(n)||/^(next|sigue)/i.test(n)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},Dw=qd});function Ow(t){if(!t||typeof t!="object")return!1;let e=t;if(e.code&&u0.has(e.code))return!0;if(e.code&&Mw.has(e.code))return!1;if(e.message){let n=e.message.toLowerCase();if(n.includes("timeout")||n.includes("timed out"))return!0}return!1}function d0(t){if(!t||typeof t!="object")return!1;let e=t;return!!(e.code&&Mw.has(e.code))}function jw(t,e,n){let r=Hn.get(t);return r&&r.consecutiveFailures>=e&&r.openedAt?Date.now()-r.openedAt>=n?(Hn.delete(t),!1):!0:!1}function Vd(t,e){let n=Hn.get(t)||{consecutiveFailures:0,openedAt:null};n.consecutiveFailures++,n.consecutiveFailures>=e&&!n.openedAt&&(n.openedAt=Date.now()),Hn.set(t,n)}function p0(t){Hn.delete(t)}var u0,Mw,Hn,tc,$w,zJ,Fw=h(()=>{"use strict";u0=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Mw=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);a(Ow,"isTransientError");a(d0,"isPermanentError");Hn=new Map;a(jw,"isCircuitOpen");a(Vd,"recordFailure");a(p0,"recordSuccess");tc=class{static{a(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,n="default"){if(jw(n,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${n}. Too many consecutive failures.`);let r,s=0;for(;s<this.options.maxAttempts;)try{let i=await e();return p0(n),i}catch(i){if(r=i,s++,d0(i))throw Vd(n,this.options.circuitBreakerThreshold),i;if(!(Ow(i)&&s<this.options.maxAttempts))throw Vd(n,this.options.circuitBreakerThreshold),i;let c=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,c))}throw Vd(n,this.options.circuitBreakerThreshold),r}isTransientError(e){return Ow(e)}isCircuitOpen(e){return jw(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Hn.get(e)}resetCircuit(e){Hn.delete(e)}resetAllCircuits(){Hn.clear()}},$w=new tc({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),zJ=new tc({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var m0,Jd,nc,Hw=h(()=>{"use strict";rn();Pw();Lw();Fw();m0=["claude"],Jd=class{static{a(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await $w.execute(async()=>{if(this.agentInfo=await Iw(),!this.agentInfo?.isSupported)throw ti.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!m0.includes(e))throw ti.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Dw,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},nc=new Jd});var Kd,Yd,Uw=h(()=>{"use strict";Kd=class{static{a(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Yd=new Kd});var kt,gs=h(()=>{"use strict";Aw();Hw();Uw();or();rc();kt=class{static{a(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Cw,this.updateNotificationShown=!1}get agent(){return nc.getAgent()}get agentInfo(){return nc.getInfo()}get currentAuthor(){return Jt.getCurrentAuthor()}async initializeAgent(){return nc.initialize()}async ensureProjectInit(e){return Jt.ensureInit(e)}async ensureAuthor(){return Jt.ensureAuthor()}async getGlobalProjectPath(e){return Jt.getGlobalPath(e)}async logToMemory(e,n,r){let s=await this.ensureAuthor();await Qe.log(e,n,r,s.name)}async _detectEmptyDirectory(e){return Jt.isEmptyDirectory(e)}async _detectExistingCode(e){return Jt.hasExistingCode(e)}_breakdownFeatureTasks(e){return Yd.breakdownFeature(e)}_detectBugSeverity(e){return Yd.detectBugSeverity(e)}}});import wt from"node:fs/promises";import Pt from"node:path";var zd,g0,He,Ww=h(()=>{"use strict";ie();ue();se();zd=class{static{a(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Pt.join(this.projectPath,"package.json"),n=await wt.readFile(e,"utf-8");return JSON.parse(n)}catch(e){if(V(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Pt.join(this.projectPath,"Cargo.toml");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readRequirements(){try{let e=Pt.join(this.projectPath,"requirements.txt");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readGoMod(){try{let e=Pt.join(this.projectPath,"go.mod");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readGemfile(){try{let e=Pt.join(this.projectPath,"Gemfile");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readMixExs(){try{let e=Pt.join(this.projectPath,"mix.exs");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readPomXml(){try{let e=Pt.join(this.projectPath,"pom.xml");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readComposerJson(){try{let e=Pt.join(this.projectPath,"composer.json"),n=await wt.readFile(e,"utf-8");return JSON.parse(n)}catch(e){if(V(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Pt.join(this.projectPath,"pyproject.toml");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await H('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),n={};return e.trim().split(`
1631
+ Type p. help to see all options`}detectIntent(e){let n=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(n)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(n)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(n)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(n)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(n)||/^(progress|status|recap|avance)/i.test(n)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(n)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(n)||/^(next|sigue)/i.test(n)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},Dw=qd});function Ow(t){if(!t||typeof t!="object")return!1;let e=t;if(e.code&&uD.has(e.code))return!0;if(e.code&&Mw.has(e.code))return!1;if(e.message){let n=e.message.toLowerCase();if(n.includes("timeout")||n.includes("timed out"))return!0}return!1}function dD(t){if(!t||typeof t!="object")return!1;let e=t;return!!(e.code&&Mw.has(e.code))}function jw(t,e,n){let r=Hn.get(t);return r&&r.consecutiveFailures>=e&&r.openedAt?Date.now()-r.openedAt>=n?(Hn.delete(t),!1):!0:!1}function Vd(t,e){let n=Hn.get(t)||{consecutiveFailures:0,openedAt:null};n.consecutiveFailures++,n.consecutiveFailures>=e&&!n.openedAt&&(n.openedAt=Date.now()),Hn.set(t,n)}function pD(t){Hn.delete(t)}var uD,Mw,Hn,tc,$w,zJ,Fw=h(()=>{"use strict";uD=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Mw=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);a(Ow,"isTransientError");a(dD,"isPermanentError");Hn=new Map;a(jw,"isCircuitOpen");a(Vd,"recordFailure");a(pD,"recordSuccess");tc=class{static{a(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,n="default"){if(jw(n,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${n}. Too many consecutive failures.`);let r,s=0;for(;s<this.options.maxAttempts;)try{let i=await e();return pD(n),i}catch(i){if(r=i,s++,dD(i))throw Vd(n,this.options.circuitBreakerThreshold),i;if(!(Ow(i)&&s<this.options.maxAttempts))throw Vd(n,this.options.circuitBreakerThreshold),i;let c=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,c))}throw Vd(n,this.options.circuitBreakerThreshold),r}isTransientError(e){return Ow(e)}isCircuitOpen(e){return jw(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Hn.get(e)}resetCircuit(e){Hn.delete(e)}resetAllCircuits(){Hn.clear()}},$w=new tc({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),zJ=new tc({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var mD,Jd,nc,Hw=h(()=>{"use strict";rn();Pw();Lw();Fw();mD=["claude"],Jd=class{static{a(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await $w.execute(async()=>{if(this.agentInfo=await Iw(),!this.agentInfo?.isSupported)throw ti.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!mD.includes(e))throw ti.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Dw,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},nc=new Jd});var Kd,Yd,Uw=h(()=>{"use strict";Kd=class{static{a(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Yd=new Kd});var kt,gs=h(()=>{"use strict";Aw();Hw();Uw();or();rc();kt=class{static{a(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Cw,this.updateNotificationShown=!1}get agent(){return nc.getAgent()}get agentInfo(){return nc.getInfo()}get currentAuthor(){return Jt.getCurrentAuthor()}async initializeAgent(){return nc.initialize()}async ensureProjectInit(e){return Jt.ensureInit(e)}async ensureAuthor(){return Jt.ensureAuthor()}async getGlobalProjectPath(e){return Jt.getGlobalPath(e)}async logToMemory(e,n,r){let s=await this.ensureAuthor();await Qe.log(e,n,r,s.name)}async _detectEmptyDirectory(e){return Jt.isEmptyDirectory(e)}async _detectExistingCode(e){return Jt.hasExistingCode(e)}_breakdownFeatureTasks(e){return Yd.breakdownFeature(e)}_detectBugSeverity(e){return Yd.detectBugSeverity(e)}}});import wt from"node:fs/promises";import Pt from"node:path";var zd,gD,He,Ww=h(()=>{"use strict";ie();ue();se();zd=class{static{a(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Pt.join(this.projectPath,"package.json"),n=await wt.readFile(e,"utf-8");return JSON.parse(n)}catch(e){if(V(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Pt.join(this.projectPath,"Cargo.toml");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readRequirements(){try{let e=Pt.join(this.projectPath,"requirements.txt");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readGoMod(){try{let e=Pt.join(this.projectPath,"go.mod");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readGemfile(){try{let e=Pt.join(this.projectPath,"Gemfile");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readMixExs(){try{let e=Pt.join(this.projectPath,"mix.exs");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readPomXml(){try{let e=Pt.join(this.projectPath,"pom.xml");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async readComposerJson(){try{let e=Pt.join(this.projectPath,"composer.json"),n=await wt.readFile(e,"utf-8");return JSON.parse(n)}catch(e){if(V(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Pt.join(this.projectPath,"pyproject.toml");return await wt.readFile(e,"utf-8")}catch(e){if(V(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await H('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),n={};return e.trim().split(`
1632
1632
  `).filter(Boolean).forEach(r=>{let s=r.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(n[s[2]]=parseInt(s[1],10))}),n}catch{return{}}}async listConfigFiles(){try{let e=await wt.readdir(this.projectPath),n=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(r=>n.some(s=>s.test(r)))}catch(e){if(V(e))return[];throw e}}async listDirectories(){try{return(await wt.readdir(this.projectPath,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).filter(n=>!n.startsWith(".")&&n!=="node_modules")}catch(e){if(V(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:n}=await H(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return n}catch{return""}}async getGitStats(){try{let{stdout:e}=await H("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:n}=await H('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:r}=await H('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(n.trim(),10)||0,age:r.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await H('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return I(Pt.join(this.projectPath,e))}async readFile(e){try{let n=Pt.join(this.projectPath,e);return await wt.readFile(n,"utf-8")}catch(n){if(V(n))return null;throw n}}async findFiles(e){try{let{stdout:n}=await H(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return n.trim().split(`
1633
- `).filter(Boolean)}catch{return[]}}},g0=new zd,He=g0});function Bw(t,e){let n=[];Hi("Languages",t.languages,e.languages,n),Hi("Frameworks",t.frameworks,e.frameworks,n),(t.packageManager??"")!==(e.packageManager??"")&&n.push({field:"Package manager",type:"changed",before:t.packageManager??"(none)",after:e.packageManager??"(none)"}),(t.sourceDir??"")!==(e.sourceDir??"")&&n.push({field:"Source directory",type:"changed",before:t.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(t.testDir??"")!==(e.testDir??"")&&n.push({field:"Test directory",type:"changed",before:t.testDir??"(none)",after:e.testDir??"(none)"}),Hi("Config files",t.configFiles,e.configFiles,n),t.fileCount!==e.fileCount&&n.push({field:"File count",type:"changed",before:String(t.fileCount),after:String(e.fileCount)});let r=t.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Hi("Patterns",r,s,n);let i=t.antiPatterns.map(d=>d.issue),o=e.antiPatterns.map(d=>d.issue);Hi("Anti-patterns",i,o,n);let c=n.filter(d=>d.type==="added").length,l=n.filter(d=>d.type==="removed").length,u=n.filter(d=>d.type==="changed").length;return{hasChanges:n.length>0,items:n,summary:{added:c,removed:l,changed:u},beforeCommit:t.commitHash??null,afterCommit:e.commitHash??null}}function sc(t){if(!t.hasChanges)return`## Analysis Diff
1633
+ `).filter(Boolean)}catch{return[]}}},gD=new zd,He=gD});function Bw(t,e){let n=[];Hi("Languages",t.languages,e.languages,n),Hi("Frameworks",t.frameworks,e.frameworks,n),(t.packageManager??"")!==(e.packageManager??"")&&n.push({field:"Package manager",type:"changed",before:t.packageManager??"(none)",after:e.packageManager??"(none)"}),(t.sourceDir??"")!==(e.sourceDir??"")&&n.push({field:"Source directory",type:"changed",before:t.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(t.testDir??"")!==(e.testDir??"")&&n.push({field:"Test directory",type:"changed",before:t.testDir??"(none)",after:e.testDir??"(none)"}),Hi("Config files",t.configFiles,e.configFiles,n),t.fileCount!==e.fileCount&&n.push({field:"File count",type:"changed",before:String(t.fileCount),after:String(e.fileCount)});let r=t.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Hi("Patterns",r,s,n);let i=t.antiPatterns.map(d=>d.issue),o=e.antiPatterns.map(d=>d.issue);Hi("Anti-patterns",i,o,n);let c=n.filter(d=>d.type==="added").length,l=n.filter(d=>d.type==="removed").length,u=n.filter(d=>d.type==="changed").length;return{hasChanges:n.length>0,items:n,summary:{added:c,removed:l,changed:u},beforeCommit:t.commitHash??null,afterCommit:e.commitHash??null}}function sc(t){if(!t.hasChanges)return`## Analysis Diff
1634
1634
 
1635
1635
  No changes between runs.`;let e=[];e.push("## Analysis Diff"),(t.beforeCommit||t.afterCommit)&&e.push(`> \`${t.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${t.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let r of t.items){let s=r.type==="added"?"+":r.type==="removed"?"-":"~",i=r.type==="changed"?`${r.before} \u2192 ${r.after}`:r.after??r.before??"";e.push(`| ${s} | ${r.field} | ${i} |`)}e.push("");let n=[];return t.summary.added>0&&n.push(`${t.summary.added} added`),t.summary.removed>0&&n.push(`${t.summary.removed} removed`),t.summary.changed>0&&n.push(`${t.summary.changed} changed`),e.push(`**Summary**: ${n.join(", ")}`),e.join(`
1636
1636
  `)}function Gw(t){if(!t.hasChanges)return"No changes between analysis runs.";let e=[];(t.beforeCommit||t.afterCommit)&&(e.push(` ${t.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${t.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let n of t.items)n.type==="added"?e.push(` + ${n.field}: ${n.after}`):n.type==="removed"?e.push(` - ${n.field}: ${n.before}`):e.push(` ~ ${n.field}: ${n.before} \u2192 ${n.after}`);return e.join(`
1637
- `)}function Hi(t,e,n,r){let s=new Set(e),i=new Set(n);for(let o of n)s.has(o)||r.push({field:t,type:"added",after:o});for(let o of e)i.has(o)||r.push({field:t,type:"removed",before:o})}var ic=h(()=>{"use strict";a(Bw,"generateAnalysisDiff");a(sc,"formatAnalysisDiffMd");a(Gw,"formatAnalysisDiffText");a(Hi,"diffStringArray")});import Qd from"node:fs/promises";import Un from"node:path";import{z as te}from"zod";async function k0(t,e){let n=Date.now();if(t.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-n};try{let r=Un.join(e,"package.json"),s=await Qd.readFile(r,"utf-8"),i=JSON.parse(s),o={...i.dependencies,...i.devDependencies},c=[],l=[];for(let u of t.frameworks){let d=u.toLowerCase();Object.keys(o).some(m=>m.toLowerCase().includes(d))?l.push(u):c.push(u)}return c.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-n}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${c.join(", ")}`,durationMs:Date.now()-n}}catch(r){return V(r)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-n}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-n}}}async function w0(t,e){let n=Date.now();if(t.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-n};try{let r=await v0(e),s=new Set(r),i=[],o=[];for(let c of t.languages){let l=E0[c];if(!l)continue;l.some(d=>s.has(d))?i.push(c):o.push(c)}return o.length===0?{name:"Language verification",passed:!0,output:`${i.length} language(s) verified with matching files`,durationMs:Date.now()-n}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${o.join(", ")}`,durationMs:Date.now()-n}}catch(r){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-n}}}async function T0(t,e){let n=Date.now(),r=t.patterns.filter(o=>o.location);if(r.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-n};let s=[],i=[];for(let o of r){let c=o.location,l=Un.join(e,c);await I(l)?i.push(c):s.push(`${o.name} (${c})`)}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${i.length} pattern location(s) verified`,durationMs:Date.now()-n}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-n}}async function b0(t,e){let n=Date.now();try{let r=await _0(e),s=t.fileCount,i=.1,o=Math.abs(r-s),c=s*i;return o<=c?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${r})`,durationMs:Date.now()-n}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${r} (diff: ${o})`,durationMs:Date.now()-n}}catch(r){return{name:"File count verification",passed:!1,error:`Failed to count files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-n}}}async function S0(t,e){let n=Date.now();if(t.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-n};let r=[],s=[];for(let i of t.antiPatterns){let o=Un.join(e,i.file);await I(o)?s.push(i.file):r.push(`${i.issue} (${i.file})`)}return r.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-n}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${r.join(", ")}`,durationMs:Date.now()-n}}async function Xw(t,e){let n=Date.now(),r=await Promise.all([k0(t,e),w0(t,e),T0(t,e),b0(t,e),S0(t,e)]),s=r.filter(o=>!o.passed).length,i=r.filter(o=>o.passed).length;return{passed:s===0,checks:r,totalMs:Date.now()-n,failedCount:s,passedCount:i}}async function v0(t){let e=new Set,n=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let i=await Qd.readdir(s,{withFileTypes:!0});for(let o of i){let c=Un.join(s,o.name),l=Un.relative(t,c);if(!n.some(u=>u.test(l))){if(o.isDirectory())await r(c);else if(o.isFile()){let u=Un.extname(o.name);u&&e.add(u)}}}}catch{}}return a(r,"scanDir"),await r(t),Array.from(e)}async function _0(t){let e=0,n=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let i=await Qd.readdir(s,{withFileTypes:!0});for(let o of i){let c=Un.join(s,o.name),l=Un.relative(t,c);n.some(u=>u.test(l))||(o.isDirectory()?await r(c):o.isFile()&&e++)}}catch{}}return a(r,"scanDir"),await r(t),e}var f0,h0,y0,Zd,E0,qw=h(()=>{"use strict";ie();se();Us();f0=te.enum(["draft","verified","sealed"]),h0=te.object({name:te.string(),description:te.string(),location:te.string().optional(),severity:te.enum(["low","medium","high"]).optional(),language:te.string().optional(),framework:te.string().optional(),source:te.enum(["baseline","repo","context7","feedback"]).optional(),confidence:te.number().min(0).max(1).optional()}),y0=te.object({issue:te.string(),file:te.string(),suggestion:te.string(),severity:te.enum(["low","medium","high"]).optional(),language:te.string().optional(),framework:te.string().optional(),source:te.enum(["baseline","repo","context7","feedback"]).optional(),confidence:te.number().min(0).max(1).optional()}),Zd=te.object({projectId:te.string(),languages:te.array(te.string()),frameworks:te.array(te.string()),packageManager:te.string().optional(),sourceDir:te.string().optional(),testDir:te.string().optional(),configFiles:te.array(te.string()),fileCount:te.number(),patterns:te.array(h0),antiPatterns:te.array(y0),analyzedAt:te.string(),modelMetadata:Hs.optional(),status:f0.default("draft"),commitHash:te.string().optional(),signature:te.string().optional(),sealedAt:te.string().optional(),verifiedAt:te.string().optional()}),E0={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};a(k0,"verifyFrameworks");a(w0,"verifyLanguages");a(T0,"verifyPatternLocations");a(b0,"verifyFileCount");a(S0,"verifyAntiPatternFiles");a(Xw,"semanticVerify");a(v0,"getProjectExtensions");a(_0,"countProjectFiles")});import{createHash as Vw}from"node:crypto";function Ui(t){return Vw("sha256").update(t).digest("hex")}function oc(t){return Ui(t).slice(0,16)}function Jw(t){return Vw("md5").update(t).digest("hex")}var fs=h(()=>{"use strict";a(Ui,"sha256");a(oc,"sha256Short");a(Jw,"md5")});var ep,Ze,kr=h(()=>{"use strict";qw();ic();Wt();ee();fs();rr();ep=class extends nt{static{a(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,n){let r={...n,status:"draft"};Zd.parse(r),await this.update(e,s=>({...s,draft:r,lastUpdated:_()})),this.publishAnalysis(e,r)}publishAnalysis(e,n){ze({projectId:e,entityType:"analysis",entityId:e,eventType:"upsert",data:{...n,id:e}})}async seal(e){let n=await this.read(e);if(!n.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(n.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let r=this.computeSignature(n.draft),s=_(),i={...n.draft,status:"sealed",signature:r,sealedAt:s};return Zd.parse(i),await this.write(e,{draft:null,sealed:i,previousSealed:n.sealed,lastUpdated:s}),this.publishAnalysis(e,i),{success:!0,signature:r}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let n=await this.read(e);return n.sealed??n.draft}async getStatus(e){let n=await this.read(e);return{hasSealed:n.sealed!==null,hasDraft:n.draft!==null,hasPreviousSealed:n.previousSealed!==null,sealedCommit:n.sealed?.commitHash??null,draftCommit:n.draft?.commitHash??null,previousSealedCommit:n.previousSealed?.commitHash??null,sealedAt:n.sealed?.sealedAt??null}}async rollback(e){let n=await this.read(e);if(!n.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let r=_();return await this.write(e,{draft:n.sealed,sealed:n.previousSealed,previousSealed:null,lastUpdated:r}),this.publishAnalysis(e,n.previousSealed),{success:!0,restoredSignature:n.previousSealed.signature}}async diff(e){let n=await this.read(e);return!n.sealed||!n.draft?null:Bw(n.sealed,n.draft)}checkStaleness(e,n){return e?n?e!==n?{isStale:!0,sealedCommit:e,currentCommit:n,message:`Analysis is stale: sealed at ${e}, HEAD is ${n}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:n,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:n,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let n=await this.read(e);if(!n.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!n.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let r=this.computeSignature({...n.sealed,signature:void 0,sealedAt:void 0});return r===n.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${r}, got ${n.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,n){let r=await this.read(e),s=r.sealed??r.draft;return s?await Xw(s,n):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let n={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Ui(JSON.stringify(n))}},Ze=new ep});function x0(t,e,n){let r=t.prepare("INSERT INTO analysis_finding (id, analysis_id, kind, title, detail, severity, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?)"),s=0,i=a((m,g,f,k)=>{g&&(r.run(`${e}-f${s}`,e,m,g,f,k,s),s++)},"addFinding");for(let m of n.patterns??[])i("pattern",m.name,m.description,null);for(let m of n.antiPatterns??[])i("anti_pattern",m.issue,m.suggestion,m.severity);for(let m of n.techDebt??[])i("tech_debt",m.description,`${m.area}: ${m.impact}`,m.priority);for(let m of n.riskAreas??[])i("risk_area",m.path,`${m.reason} \u2014 ${m.risk}`,m.severity);for(let m of n.refactorSuggestions??[])i("refactor",m.description,m.benefit,null);for(let m of n.projectInsights??[])i("insight",m,null,null);for(let m of n.architecture?.insights??[])i("insight",m,null,null);let o=t.prepare("INSERT INTO analysis_convention (id, analysis_id, rule, sort_order) VALUES (?, ?, ?, ?)");(n.conventions??[]).forEach((m,g)=>{o.run(`${e}-c${g}`,e,m.rule,g)});let c=t.prepare("INSERT INTO analysis_stack_item (id, analysis_id, kind, name) VALUES (?, ?, ?, ?)"),l=0;for(let m of n.stack?.languages??[])c.run(`${e}-s${l++}`,e,"language",m);for(let m of n.stack?.frameworks??[])c.run(`${e}-s${l++}`,e,"framework",m);let u=t.prepare("INSERT INTO analysis_command (id, analysis_id, name, command, purpose) VALUES (?, ?, ?, ?, ?)"),d=0;for(let[m,g]of Object.entries(n.commands??{}))g&&u.run(`${e}-cmd${d++}`,e,m,g,null);let p=t.prepare("INSERT INTO analysis_domain (id, analysis_id, name, paths) VALUES (?, ?, ?, ?)");(n.architecture?.domains??[]).forEach((m,g)=>{p.run(`${e}-d${g}`,e,m,null)})}var tp,R0,Tt,Wi=h(()=>{"use strict";ee();j();a(x0,"writeAnalysisChildren");tp=class{static{a(this,"LLMAnalysisStorage")}save(e,n){let r=T.getDb(e),s=_();r.transaction(()=>{r.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s);let i=r.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(n.commitHash??null,"active",JSON.stringify(n),n.analyzedAt);x0(r,String(i.lastInsertRowid),n)})()}getActiveRelational(e){let n=T.get(e,"SELECT id FROM llm_analysis WHERE status = 'active' LIMIT 1");if(!n)return null;let r=String(n.id),s=T.query(e,"SELECT kind, title, detail FROM analysis_finding WHERE analysis_id = ? ORDER BY kind, sort_order",r),i=T.query(e,"SELECT rule FROM analysis_convention WHERE analysis_id = ? ORDER BY sort_order",r).map(u=>u.rule),o=T.query(e,"SELECT kind, name FROM analysis_stack_item WHERE analysis_id = ?",r),c=T.query(e,"SELECT name FROM analysis_domain WHERE analysis_id = ?",r).map(u=>u.name),l=T.query(e,"SELECT name, command FROM analysis_command WHERE analysis_id = ?",r);return s.length===0&&i.length===0&&o.length===0?null:{findings:s,conventions:i,stack:o,domains:c,commands:l}}getActive(e){let n=T.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return n?JSON.parse(n.analysis):null}getActiveSummary(e){let n=this.getActive(e);return n?{commitHash:n.commitHash,architectureStyle:n.architecture.style,patternCount:n.patterns.length,antiPatternCount:n.antiPatterns.length,analyzedAt:n.analyzedAt}:null}isCurrent(e,n){return n?T.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===n:!1}getAllFull(e){return T.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(r=>({id:r.id,status:r.status,commitHash:r.commit_hash,analyzedAt:r.analyzed_at,supersededAt:r.superseded_at,analysis:JSON.parse(r.analysis)}))}getHistory(e,n=10){return T.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",n).map(s=>{let i=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:i.patterns.length}})}},R0=new tp,Tt=R0});import Kw from"node:fs/promises";import Yw from"node:path";async function rp(t,e,n,r){let[s,i,o,c]=await Promise.all([N0(t,e,r),I0(t),P0(t),D0(t)]);return{project:{name:r.name,ecosystem:r.ecosystem,languages:r.languages,frameworks:r.frameworks,fileCount:r.fileCount,projectType:r.projectType},git:{branch:n.branch,recentCommits:n.recentCommits.slice(0,C0).map(l=>({message:l.message,date:l.date})),hasChanges:n.hasChanges,weeklyCommits:n.weeklyCommits},codeSamples:s,existingPatterns:i,taskHistory:o,previousAnalysis:c??void 0}}async function N0(t,e,n){let r=[],s=[...n.frameworks.map(c=>c.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),i=ca(t,s,np*2);for(let c of i){if(r.length>=np)break;try{let l=Yw.join(e,c.path),u=await Kw.readFile(l,"utf-8");u.length>ac*3?r.push({path:c.path,content:`${u.slice(0,ac)}
1638
- // ... truncated`,reason:`BM25 score: ${c.score.toFixed(2)} (truncated, ${u.length} chars)`}):r.push({path:c.path,content:u.slice(0,ac),reason:`BM25 score: ${c.score.toFixed(2)}`})}catch{}}let o=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let c of o){if(r.length>=np)break;if(!r.some(l=>l.path===c))try{let l=Yw.join(e,c),u=await Kw.readFile(l,"utf-8");r.push({path:c,content:u.slice(0,ac),reason:"entry point"})}catch{}}return r}async function I0(t){try{let e=await Ze.getActive(t);return e?{patterns:(e.patterns??[]).map(n=>({name:n.name,description:n.description})),antiPatterns:(e.antiPatterns??[]).map(n=>({issue:n.issue,file:n.file,suggestion:n.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function P0(t){try{return(await K.getTaskHistory(t)).slice(0,A0).map(n=>({description:n.title,status:n.classification,branch:n.branchName}))}catch{return[]}}function D0(t){try{let e=Tt.getActiveSummary(t);return Promise.resolve(e)}catch(e){return X.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var ac,np,C0,A0,zw=h(()=>{"use strict";Jr();kr();Wi();ot();Et();ac=800,np=6,C0=8,A0=5;a(rp,"buildAnalysisPayload");a(N0,"selectCodeSamples");a(I0,"getExistingPatterns");a(P0,"getTaskHistory");a(D0,"getPreviousAnalysisSummary")});var sp,Qw=h(()=>{"use strict";sp="mcp-remote@0.1.38"});import wr from"node:fs";import L0 from"node:fs/promises";import ip from"node:os";import Ce from"node:path";function O0(){let t=j0();if(t)return t;if(process.env.PRJCT_MCP_ALLOW_LOCAL==="1"){let e=M0();if(e)return{command:e,args:["mcp-server"],description:op}}return{command:"npx",args:["-y","prjct-cli@latest","mcp-server"],description:op}}function Zw(t){let e=t.replace(/\\/g,"/");return!!(e.includes("/.worktrees/")||e.includes("/prjct-cli/bin/prjct")&&!e.includes("/node_modules/prjct-cli/"))}function j0(){let t=[];try{t.push(Ce.dirname(wo.resolve("prjct-cli/package.json")))}catch{}let e=ip.homedir();for(let n of[process.env.NVM_BIN?Ce.resolve(process.env.NVM_BIN,".."):"",Ce.join(e,".nvm","versions","node",process.version,"lib"),"/opt/homebrew/lib","/usr/local/lib"].filter(Boolean))t.push(Ce.join(n,"node_modules","prjct-cli"));for(let n of t){if(Zw(n))continue;let r=Ce.join(n,"bin","prjct.cjs"),s=wr.existsSync(Ce.join(n,"dist","bin","prjct.mjs"))||wr.existsSync(Ce.join(n,"dist","bin","prjct-core.mjs"));if(!wr.existsSync(r)||!s)continue;let i=[process.execPath,Ce.join(Ce.dirname(process.execPath),"node"),Ce.join(n,"..","..","bin","node")],o=process.execPath;for(let l of i)if(l&&wr.existsSync(l)){o=l;break}let c=Ce.resolve(n,"..","..","..","bin","node");return wr.existsSync(c)&&(o=c),{command:o,args:[r,"mcp-server"],env:{PATH:`${Ce.dirname(o)}${Ce.delimiter}/usr/bin${Ce.delimiter}/bin`},description:op}}return null}function M0(){let t=process.argv[1],e=[t?Ce.resolve(Ce.dirname(t),"prjct"):"",t?Ce.resolve(Ce.dirname(t),"..","bin","prjct"):"",Ce.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let n of e){if(!wr.existsSync(n))continue;let r=n;try{r=wr.realpathSync(n)}catch{}if(!Zw(r))return r}return null}function hs(){return process.env.PRJCT_TEST_MODE==="1"?Ce.join(ip.tmpdir(),"prjct-context7-test","mcp.json"):Ce.join(ip.homedir(),".claude","mcp.json")}async function eT(t=hs()){try{let e=await L0.readFile(t,"utf-8");return JSON.parse(e)}catch(e){let n=A(e).toLowerCase();if(n.includes("no such file")||n.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${t}: ${A(e)}`)}}async function $0(t,e=hs()){await De(e,t)}async function Bi(t,e,n=hs()){let r=await eT(n),s={...r.mcpServers||{}},i=s[t];s[t]=e,r.mcpServers=s;let o=JSON.stringify(i)!==JSON.stringify(e);return await $0(r,n),{path:n,changed:o}}async function tT(t,e=hs()){return!!(await eT(e)).mcpServers?.[t]}var op,Kt,Gi=h(()=>{"use strict";ie();se();Qw();op="prjct: agentic harness with project memory, workflow gates, intent briefs, and performance context. Use prjct_task_start as the MCP entrypoint for a work cycle; prjct retrieves focused context, persists evidence stations, and keeps humans in the loop for risky gates. Agents resume from prjct_task_status/workflow output, create or link reviewed intent/spec briefs when required, and persist synthesized learning instead of raw transcript fragments.";a(O0,"getPrjctMcpConfig");a(Zw,"isNonProductionPrjctPath");a(j0,"resolvePublishedPrjctMcpConfig");a(M0,"resolveLocalPrjctBin");Kt={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:O0(),linear:{command:"npx",args:["-y",sp,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",sp,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};a(hs,"getClaudeMcpConfigPath");a(eT,"readMcpConfig");a($0,"writeMcpConfig");a(Bi,"upsertMcpServer");a(tT,"hasMcpServer")});import Tr from"node:fs/promises";import ap from"node:path";function qi(){return process.env.PRJCT_TEST_MODE==="1"?ap.join(Le(".prjct-tests"),"codex","config.toml"):Le(".codex","config.toml")}function Xi(t){return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function aT(t,e,n,r){let s=(e.args??[]).map(Xi).join(", "),i=[n,`[mcp_servers.${t}]`,`command = ${Xi(e.command)}`,`args = [${s}]`];if(e.env&&Object.keys(e.env).length>0){let o=Object.entries(e.env).map(([c,l])=>`${c} = ${Xi(l)}`).join(", ");i.push(`env = { ${o} }`)}return i.push(r,""),i.join(`
1639
- `)}function F0(t=Kt.prjct){return aT("prjct",t,nT,rT)}function H0(t=Kt.context7){return aT("context7",t,sT,iT)}function cT(t,e,n,r,s){let i=t.indexOf(n),o=t.indexOf(r);if(i!==-1&&o!==-1&&o>i){let c=t.slice(0,i),l=t.slice(o+r.length);return l.startsWith(`
1637
+ `)}function Hi(t,e,n,r){let s=new Set(e),i=new Set(n);for(let o of n)s.has(o)||r.push({field:t,type:"added",after:o});for(let o of e)i.has(o)||r.push({field:t,type:"removed",before:o})}var ic=h(()=>{"use strict";a(Bw,"generateAnalysisDiff");a(sc,"formatAnalysisDiffMd");a(Gw,"formatAnalysisDiffText");a(Hi,"diffStringArray")});import Qd from"node:fs/promises";import Un from"node:path";import{z as te}from"zod";async function kD(t,e){let n=Date.now();if(t.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-n};try{let r=Un.join(e,"package.json"),s=await Qd.readFile(r,"utf-8"),i=JSON.parse(s),o={...i.dependencies,...i.devDependencies},c=[],l=[];for(let u of t.frameworks){let d=u.toLowerCase();Object.keys(o).some(m=>m.toLowerCase().includes(d))?l.push(u):c.push(u)}return c.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-n}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${c.join(", ")}`,durationMs:Date.now()-n}}catch(r){return V(r)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-n}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-n}}}async function wD(t,e){let n=Date.now();if(t.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-n};try{let r=await vD(e),s=new Set(r),i=[],o=[];for(let c of t.languages){let l=ED[c];if(!l)continue;l.some(d=>s.has(d))?i.push(c):o.push(c)}return o.length===0?{name:"Language verification",passed:!0,output:`${i.length} language(s) verified with matching files`,durationMs:Date.now()-n}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${o.join(", ")}`,durationMs:Date.now()-n}}catch(r){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-n}}}async function TD(t,e){let n=Date.now(),r=t.patterns.filter(o=>o.location);if(r.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-n};let s=[],i=[];for(let o of r){let c=o.location,l=Un.join(e,c);await I(l)?i.push(c):s.push(`${o.name} (${c})`)}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${i.length} pattern location(s) verified`,durationMs:Date.now()-n}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-n}}async function bD(t,e){let n=Date.now();try{let r=await _D(e),s=t.fileCount,i=.1,o=Math.abs(r-s),c=s*i;return o<=c?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${r})`,durationMs:Date.now()-n}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${r} (diff: ${o})`,durationMs:Date.now()-n}}catch(r){return{name:"File count verification",passed:!1,error:`Failed to count files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-n}}}async function SD(t,e){let n=Date.now();if(t.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-n};let r=[],s=[];for(let i of t.antiPatterns){let o=Un.join(e,i.file);await I(o)?s.push(i.file):r.push(`${i.issue} (${i.file})`)}return r.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-n}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${r.join(", ")}`,durationMs:Date.now()-n}}async function Xw(t,e){let n=Date.now(),r=await Promise.all([kD(t,e),wD(t,e),TD(t,e),bD(t,e),SD(t,e)]),s=r.filter(o=>!o.passed).length,i=r.filter(o=>o.passed).length;return{passed:s===0,checks:r,totalMs:Date.now()-n,failedCount:s,passedCount:i}}async function vD(t){let e=new Set,n=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let i=await Qd.readdir(s,{withFileTypes:!0});for(let o of i){let c=Un.join(s,o.name),l=Un.relative(t,c);if(!n.some(u=>u.test(l))){if(o.isDirectory())await r(c);else if(o.isFile()){let u=Un.extname(o.name);u&&e.add(u)}}}}catch{}}return a(r,"scanDir"),await r(t),Array.from(e)}async function _D(t){let e=0,n=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let i=await Qd.readdir(s,{withFileTypes:!0});for(let o of i){let c=Un.join(s,o.name),l=Un.relative(t,c);n.some(u=>u.test(l))||(o.isDirectory()?await r(c):o.isFile()&&e++)}}catch{}}return a(r,"scanDir"),await r(t),e}var fD,hD,yD,Zd,ED,qw=h(()=>{"use strict";ie();se();Us();fD=te.enum(["draft","verified","sealed"]),hD=te.object({name:te.string(),description:te.string(),location:te.string().optional(),severity:te.enum(["low","medium","high"]).optional(),language:te.string().optional(),framework:te.string().optional(),source:te.enum(["baseline","repo","context7","feedback"]).optional(),confidence:te.number().min(0).max(1).optional()}),yD=te.object({issue:te.string(),file:te.string(),suggestion:te.string(),severity:te.enum(["low","medium","high"]).optional(),language:te.string().optional(),framework:te.string().optional(),source:te.enum(["baseline","repo","context7","feedback"]).optional(),confidence:te.number().min(0).max(1).optional()}),Zd=te.object({projectId:te.string(),languages:te.array(te.string()),frameworks:te.array(te.string()),packageManager:te.string().optional(),sourceDir:te.string().optional(),testDir:te.string().optional(),configFiles:te.array(te.string()),fileCount:te.number(),patterns:te.array(hD),antiPatterns:te.array(yD),analyzedAt:te.string(),modelMetadata:Hs.optional(),status:fD.default("draft"),commitHash:te.string().optional(),signature:te.string().optional(),sealedAt:te.string().optional(),verifiedAt:te.string().optional()}),ED={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};a(kD,"verifyFrameworks");a(wD,"verifyLanguages");a(TD,"verifyPatternLocations");a(bD,"verifyFileCount");a(SD,"verifyAntiPatternFiles");a(Xw,"semanticVerify");a(vD,"getProjectExtensions");a(_D,"countProjectFiles")});import{createHash as Vw}from"node:crypto";function Ui(t){return Vw("sha256").update(t).digest("hex")}function oc(t){return Ui(t).slice(0,16)}function Jw(t){return Vw("md5").update(t).digest("hex")}var fs=h(()=>{"use strict";a(Ui,"sha256");a(oc,"sha256Short");a(Jw,"md5")});var ep,Ze,kr=h(()=>{"use strict";qw();ic();Wt();ee();fs();rr();ep=class extends nt{static{a(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,n){let r={...n,status:"draft"};Zd.parse(r),await this.update(e,s=>({...s,draft:r,lastUpdated:_()})),this.publishAnalysis(e,r)}publishAnalysis(e,n){ze({projectId:e,entityType:"analysis",entityId:e,eventType:"upsert",data:{...n,id:e}})}async seal(e){let n=await this.read(e);if(!n.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(n.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let r=this.computeSignature(n.draft),s=_(),i={...n.draft,status:"sealed",signature:r,sealedAt:s};return Zd.parse(i),await this.write(e,{draft:null,sealed:i,previousSealed:n.sealed,lastUpdated:s}),this.publishAnalysis(e,i),{success:!0,signature:r}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let n=await this.read(e);return n.sealed??n.draft}async getStatus(e){let n=await this.read(e);return{hasSealed:n.sealed!==null,hasDraft:n.draft!==null,hasPreviousSealed:n.previousSealed!==null,sealedCommit:n.sealed?.commitHash??null,draftCommit:n.draft?.commitHash??null,previousSealedCommit:n.previousSealed?.commitHash??null,sealedAt:n.sealed?.sealedAt??null}}async rollback(e){let n=await this.read(e);if(!n.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let r=_();return await this.write(e,{draft:n.sealed,sealed:n.previousSealed,previousSealed:null,lastUpdated:r}),this.publishAnalysis(e,n.previousSealed),{success:!0,restoredSignature:n.previousSealed.signature}}async diff(e){let n=await this.read(e);return!n.sealed||!n.draft?null:Bw(n.sealed,n.draft)}checkStaleness(e,n){return e?n?e!==n?{isStale:!0,sealedCommit:e,currentCommit:n,message:`Analysis is stale: sealed at ${e}, HEAD is ${n}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:n,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:n,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let n=await this.read(e);if(!n.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!n.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let r=this.computeSignature({...n.sealed,signature:void 0,sealedAt:void 0});return r===n.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${r}, got ${n.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,n){let r=await this.read(e),s=r.sealed??r.draft;return s?await Xw(s,n):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let n={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Ui(JSON.stringify(n))}},Ze=new ep});function xD(t,e,n){let r=t.prepare("INSERT INTO analysis_finding (id, analysis_id, kind, title, detail, severity, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?)"),s=0,i=a((m,g,f,k)=>{g&&(r.run(`${e}-f${s}`,e,m,g,f,k,s),s++)},"addFinding");for(let m of n.patterns??[])i("pattern",m.name,m.description,null);for(let m of n.antiPatterns??[])i("anti_pattern",m.issue,m.suggestion,m.severity);for(let m of n.techDebt??[])i("tech_debt",m.description,`${m.area}: ${m.impact}`,m.priority);for(let m of n.riskAreas??[])i("risk_area",m.path,`${m.reason} \u2014 ${m.risk}`,m.severity);for(let m of n.refactorSuggestions??[])i("refactor",m.description,m.benefit,null);for(let m of n.projectInsights??[])i("insight",m,null,null);for(let m of n.architecture?.insights??[])i("insight",m,null,null);let o=t.prepare("INSERT INTO analysis_convention (id, analysis_id, rule, sort_order) VALUES (?, ?, ?, ?)");(n.conventions??[]).forEach((m,g)=>{o.run(`${e}-c${g}`,e,m.rule,g)});let c=t.prepare("INSERT INTO analysis_stack_item (id, analysis_id, kind, name) VALUES (?, ?, ?, ?)"),l=0;for(let m of n.stack?.languages??[])c.run(`${e}-s${l++}`,e,"language",m);for(let m of n.stack?.frameworks??[])c.run(`${e}-s${l++}`,e,"framework",m);let u=t.prepare("INSERT INTO analysis_command (id, analysis_id, name, command, purpose) VALUES (?, ?, ?, ?, ?)"),d=0;for(let[m,g]of Object.entries(n.commands??{}))g&&u.run(`${e}-cmd${d++}`,e,m,g,null);let p=t.prepare("INSERT INTO analysis_domain (id, analysis_id, name, paths) VALUES (?, ?, ?, ?)");(n.architecture?.domains??[]).forEach((m,g)=>{p.run(`${e}-d${g}`,e,m,null)})}var tp,RD,Tt,Wi=h(()=>{"use strict";ee();j();a(xD,"writeAnalysisChildren");tp=class{static{a(this,"LLMAnalysisStorage")}save(e,n){let r=T.getDb(e),s=_();r.transaction(()=>{r.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s);let i=r.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(n.commitHash??null,"active",JSON.stringify(n),n.analyzedAt);xD(r,String(i.lastInsertRowid),n)})()}getActiveRelational(e){let n=T.get(e,"SELECT id FROM llm_analysis WHERE status = 'active' LIMIT 1");if(!n)return null;let r=String(n.id),s=T.query(e,"SELECT kind, title, detail FROM analysis_finding WHERE analysis_id = ? ORDER BY kind, sort_order",r),i=T.query(e,"SELECT rule FROM analysis_convention WHERE analysis_id = ? ORDER BY sort_order",r).map(u=>u.rule),o=T.query(e,"SELECT kind, name FROM analysis_stack_item WHERE analysis_id = ?",r),c=T.query(e,"SELECT name FROM analysis_domain WHERE analysis_id = ?",r).map(u=>u.name),l=T.query(e,"SELECT name, command FROM analysis_command WHERE analysis_id = ?",r);return s.length===0&&i.length===0&&o.length===0?null:{findings:s,conventions:i,stack:o,domains:c,commands:l}}getActive(e){let n=T.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return n?JSON.parse(n.analysis):null}getActiveSummary(e){let n=this.getActive(e);return n?{commitHash:n.commitHash,architectureStyle:n.architecture.style,patternCount:n.patterns.length,antiPatternCount:n.antiPatterns.length,analyzedAt:n.analyzedAt}:null}isCurrent(e,n){return n?T.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===n:!1}getAllFull(e){return T.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(r=>({id:r.id,status:r.status,commitHash:r.commit_hash,analyzedAt:r.analyzed_at,supersededAt:r.superseded_at,analysis:JSON.parse(r.analysis)}))}getHistory(e,n=10){return T.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",n).map(s=>{let i=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:i.patterns.length}})}},RD=new tp,Tt=RD});import Kw from"node:fs/promises";import Yw from"node:path";async function rp(t,e,n,r){let[s,i,o,c]=await Promise.all([ND(t,e,r),ID(t),PD(t),DD(t)]);return{project:{name:r.name,ecosystem:r.ecosystem,languages:r.languages,frameworks:r.frameworks,fileCount:r.fileCount,projectType:r.projectType},git:{branch:n.branch,recentCommits:n.recentCommits.slice(0,CD).map(l=>({message:l.message,date:l.date})),hasChanges:n.hasChanges,weeklyCommits:n.weeklyCommits},codeSamples:s,existingPatterns:i,taskHistory:o,previousAnalysis:c??void 0}}async function ND(t,e,n){let r=[],s=[...n.frameworks.map(c=>c.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),i=ca(t,s,np*2);for(let c of i){if(r.length>=np)break;try{let l=Yw.join(e,c.path),u=await Kw.readFile(l,"utf-8");u.length>ac*3?r.push({path:c.path,content:`${u.slice(0,ac)}
1638
+ // ... truncated`,reason:`BM25 score: ${c.score.toFixed(2)} (truncated, ${u.length} chars)`}):r.push({path:c.path,content:u.slice(0,ac),reason:`BM25 score: ${c.score.toFixed(2)}`})}catch{}}let o=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let c of o){if(r.length>=np)break;if(!r.some(l=>l.path===c))try{let l=Yw.join(e,c),u=await Kw.readFile(l,"utf-8");r.push({path:c,content:u.slice(0,ac),reason:"entry point"})}catch{}}return r}async function ID(t){try{let e=await Ze.getActive(t);return e?{patterns:(e.patterns??[]).map(n=>({name:n.name,description:n.description})),antiPatterns:(e.antiPatterns??[]).map(n=>({issue:n.issue,file:n.file,suggestion:n.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function PD(t){try{return(await K.getTaskHistory(t)).slice(0,AD).map(n=>({description:n.title,status:n.classification,branch:n.branchName}))}catch{return[]}}function DD(t){try{let e=Tt.getActiveSummary(t);return Promise.resolve(e)}catch(e){return X.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var ac,np,CD,AD,zw=h(()=>{"use strict";Jr();kr();Wi();ot();Et();ac=800,np=6,CD=8,AD=5;a(rp,"buildAnalysisPayload");a(ND,"selectCodeSamples");a(ID,"getExistingPatterns");a(PD,"getTaskHistory");a(DD,"getPreviousAnalysisSummary")});var sp,Qw=h(()=>{"use strict";sp="mcp-remote@0.1.38"});import wr from"node:fs";import LD from"node:fs/promises";import ip from"node:os";import Ce from"node:path";function OD(){let t=jD();if(t)return t;if(process.env.PRJCT_MCP_ALLOW_LOCAL==="1"){let e=MD();if(e)return{command:e,args:["mcp-server"],description:op}}return{command:"npx",args:["-y","prjct-cli@latest","mcp-server"],description:op}}function Zw(t){let e=t.replace(/\\/g,"/");return!!(e.includes("/.worktrees/")||e.includes("/prjct-cli/bin/prjct")&&!e.includes("/node_modules/prjct-cli/"))}function jD(){let t=[];try{t.push(Ce.dirname(wo.resolve("prjct-cli/package.json")))}catch{}let e=ip.homedir();for(let n of[process.env.NVM_BIN?Ce.resolve(process.env.NVM_BIN,".."):"",Ce.join(e,".nvm","versions","node",process.version,"lib"),"/opt/homebrew/lib","/usr/local/lib"].filter(Boolean))t.push(Ce.join(n,"node_modules","prjct-cli"));for(let n of t){if(Zw(n))continue;let r=Ce.join(n,"bin","prjct.cjs"),s=wr.existsSync(Ce.join(n,"dist","bin","prjct.mjs"))||wr.existsSync(Ce.join(n,"dist","bin","prjct-core.mjs"));if(!wr.existsSync(r)||!s)continue;let i=[process.execPath,Ce.join(Ce.dirname(process.execPath),"node"),Ce.join(n,"..","..","bin","node")],o=process.execPath;for(let l of i)if(l&&wr.existsSync(l)){o=l;break}let c=Ce.resolve(n,"..","..","..","bin","node");return wr.existsSync(c)&&(o=c),{command:o,args:[r,"mcp-server"],env:{PATH:`${Ce.dirname(o)}${Ce.delimiter}/usr/bin${Ce.delimiter}/bin`},description:op}}return null}function MD(){let t=process.argv[1],e=[t?Ce.resolve(Ce.dirname(t),"prjct"):"",t?Ce.resolve(Ce.dirname(t),"..","bin","prjct"):"",Ce.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let n of e){if(!wr.existsSync(n))continue;let r=n;try{r=wr.realpathSync(n)}catch{}if(!Zw(r))return r}return null}function hs(){return process.env.PRJCT_TEST_MODE==="1"?Ce.join(ip.tmpdir(),"prjct-context7-test","mcp.json"):Ce.join(ip.homedir(),".claude","mcp.json")}async function eT(t=hs()){try{let e=await LD.readFile(t,"utf-8");return JSON.parse(e)}catch(e){let n=A(e).toLowerCase();if(n.includes("no such file")||n.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${t}: ${A(e)}`)}}async function $D(t,e=hs()){await De(e,t)}async function Bi(t,e,n=hs()){let r=await eT(n),s={...r.mcpServers||{}},i=s[t];s[t]=e,r.mcpServers=s;let o=JSON.stringify(i)!==JSON.stringify(e);return await $D(r,n),{path:n,changed:o}}async function tT(t,e=hs()){return!!(await eT(e)).mcpServers?.[t]}var op,Kt,Gi=h(()=>{"use strict";ie();se();Qw();op="prjct: agentic harness with project memory, workflow gates, intent briefs, and performance context. Use prjct_task_start as the MCP entrypoint for a work cycle; prjct retrieves focused context, persists evidence stations, and keeps humans in the loop for risky gates. Agents resume from prjct_task_status/workflow output, create or link reviewed intent/spec briefs when required, and persist synthesized learning instead of raw transcript fragments.";a(OD,"getPrjctMcpConfig");a(Zw,"isNonProductionPrjctPath");a(jD,"resolvePublishedPrjctMcpConfig");a(MD,"resolveLocalPrjctBin");Kt={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:OD(),linear:{command:"npx",args:["-y",sp,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",sp,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};a(hs,"getClaudeMcpConfigPath");a(eT,"readMcpConfig");a($D,"writeMcpConfig");a(Bi,"upsertMcpServer");a(tT,"hasMcpServer")});import Tr from"node:fs/promises";import ap from"node:path";function qi(){return process.env.PRJCT_TEST_MODE==="1"?ap.join(Le(".prjct-tests"),"codex","config.toml"):Le(".codex","config.toml")}function Xi(t){return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function aT(t,e,n,r){let s=(e.args??[]).map(Xi).join(", "),i=[n,`[mcp_servers.${t}]`,`command = ${Xi(e.command)}`,`args = [${s}]`];if(e.env&&Object.keys(e.env).length>0){let o=Object.entries(e.env).map(([c,l])=>`${c} = ${Xi(l)}`).join(", ");i.push(`env = { ${o} }`)}return i.push(r,""),i.join(`
1639
+ `)}function FD(t=Kt.prjct){return aT("prjct",t,nT,rT)}function HD(t=Kt.context7){return aT("context7",t,sT,iT)}function cT(t,e,n,r,s){let i=t.indexOf(n),o=t.indexOf(r);if(i!==-1&&o!==-1&&o>i){let c=t.slice(0,i),l=t.slice(o+r.length);return l.startsWith(`
1640
1640
  `)&&(l=l.slice(1)),{next:c+e+l}}return new RegExp(`^\\s*\\[mcp_servers\\.${s}\\]`,"m").test(t)?{next:t,skipped:"user-managed"}:t.trim().length>0?{next:`${t.trimEnd()}
1641
1641
 
1642
- ${e}`}:{next:e}}function U0(){return["[tui]",`status_line = [${oT.map(Xi).join(", ")}]`,""].join(`
1643
- `)}function W0(t){return/^\s*(?:tui\.)?status_line\s*=/m.test(t)}function B0(t){if(W0(t))return{toml:t,changed:!1};let n=`status_line = [${oT.map(Xi).join(", ")}]
1642
+ ${e}`}:{next:e}}function UD(){return["[tui]",`status_line = [${oT.map(Xi).join(", ")}]`,""].join(`
1643
+ `)}function WD(t){return/^\s*(?:tui\.)?status_line\s*=/m.test(t)}function BD(t){if(WD(t))return{toml:t,changed:!1};let n=`status_line = [${oT.map(Xi).join(", ")}]
1644
1644
  `,r=/^\s*\[tui\]\s*$/m.exec(t);if(r){let i=r.index+r[0].length,o=t.slice(0,i),c=t.slice(i);return c.startsWith(`
1645
1645
  `)&&(c=c.slice(1)),{toml:`${o}
1646
- ${n}${c}`,changed:!0}}let s=U0();return{toml:t.trim().length>0?`${t.trimEnd()}
1646
+ ${n}${c}`,changed:!0}}let s=UD();return{toml:t.trim().length>0?`${t.trimEnd()}
1647
1647
 
1648
- ${s}`:s,changed:!0}}async function lT(t=qi()){let e="";try{e=await Tr.readFile(t,"utf-8")}catch{}let n=F0(),r=cT(e,n,nT,rT,"prjct"),s=r.skipped,i=B0(r.next),o=i.toml;return o===e?{path:t,changed:!1,skipped:s}:(await Tr.mkdir(ap.dirname(t),{recursive:!0}),await Tr.writeFile(t,o,"utf-8"),{path:t,changed:!0,skipped:s,statusLineChanged:i.changed})}async function cc(t=qi()){let e="";try{e=await Tr.readFile(t,"utf-8")}catch{}let n=H0(),{next:r,skipped:s}=cT(e,n,sT,iT,"context7");return r===e?{path:t,changed:!1,skipped:s}:(await Tr.mkdir(ap.dirname(t),{recursive:!0}),await Tr.writeFile(t,r,"utf-8"),{path:t,changed:!0,skipped:s})}async function uT(t=qi()){try{let e=await Tr.readFile(t,"utf-8");return/^\s*\[mcp_servers\.context7\]/m.test(e)}catch{return!1}}var nT,rT,sT,iT,oT,cp=h(()=>{"use strict";Gn();Gi();nT="# prjct:mcp:start - managed by prjct, do not edit between markers",rT="# prjct:mcp:end",sT="# prjct:mcp:context7:start - managed by prjct, do not edit between markers",iT="# prjct:mcp:context7:end",oT=["model-with-reasoning","current-dir","git-branch","context-remaining","five-hour-limit","weekly-limit","task-progress"];a(qi,"getCodexConfigTomlPath");a(Xi,"tomlString");a(aT,"buildMcpTomlBlock");a(F0,"buildPrjctMcpTomlBlock");a(H0,"buildContext7McpTomlBlock");a(cT,"upsertMarkedBlock");a(U0,"buildCodexStatusLineToml");a(W0,"hasCodexStatusLine");a(B0,"ensureCodexStatusLineToml");a(lT,"ensureCodexMcpServer");a(cc,"ensureCodexContext7Server");a(uT,"codexHasContext7Server")});import{constants as G0}from"node:fs";import br from"node:fs/promises";import lc from"node:os";import Se from"node:path";function fT(){return process.env.NODE_ENV==="test"?Se.join(lc.tmpdir(),"prjct-context7-test","verify-cache.json"):Se.join(Sn(),"state","context7-verify.json")}async function X0(){try{let t=await br.readFile(fT(),"utf-8"),e=JSON.parse(t);if(typeof e?.at=="number"&&e.status)return{...e,provider:e.provider??"claude"}}catch{}return null}async function q0(t,e,n){let r=fT();try{await br.mkdir(Se.dirname(r),{recursive:!0}),await br.writeFile(r,JSON.stringify({at:t,provider:e,status:n}),"utf-8")}catch{}}function K0(){let t=Nt("mcp-config.json");if(!t)return{mcpServers:{context7:lp}};try{return JSON.parse(t)}catch{return{mcpServers:{context7:lp}}}}function hT(){return K0().mcpServers?.context7||lp}async function pT(t){try{return(await br.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name)}catch{return[]}}async function Y0(t){let e=[],n=process.env.NVM_DIR||Se.join(t,".nvm"),r=Se.join(n,"versions","node");for(let o of await pT(r))e.push(Se.join(r,o,"bin"));let s=process.env.FNM_DIR||Se.join(t,".local","share","fnm"),i=Se.join(s,"node-versions");for(let o of await pT(i))e.push(Se.join(i,o,"installation","bin"));return e}async function z0(t=process.env.PATH||"",e=lc.homedir()){let n=new Set,r=[],s=J0.map(o=>Se.join(e,...o)),i=[...V0,...s,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[Se.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[Se.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[Se.join(process.env.MISE_DATA_DIR,"shims")]:[],...await Y0(e)];for(let o of[...t.split(Se.delimiter),...i]){let c=o.trim();!c||n.has(c)||(n.add(c),r.push(c))}return r.join(Se.delimiter)}async function Q0(t,e){if(Se.isAbsolute(t)||t.includes(Se.sep))return t;let n=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of e.split(Se.delimiter))if(r)for(let s of n){let i=Se.join(r,t+s);try{return await br.access(i,G0.X_OK),i}catch{}}return t}function mT(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Se.join(lc.tmpdir(),"prjct-context7-test","mcp.json"):Se.join(lc.homedir(),".claude","mcp.json")}async function gT(t){try{let e=await br.readFile(t,"utf-8");return JSON.parse(e)}catch(e){if(V(e))return{};throw e}}async function Z0(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let t=hT(),e=[...t.args||[],"--help"],n=await z0(),r=await Q0(t.command||"npx",n);await U(r,e,{timeout:15e3,env:{...process.env,PATH:n}})}var lp,mn,V0,J0,up,eL,Vi,dp=h(()=>{"use strict";ps();dl();$s();ie();cp();ue();se();Gi();a(fT,"getVerifyCachePath");a(X0,"readPersistedVerify");a(q0,"writePersistedVerify");lp=Kt.context7,mn=null,V0=[Se.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],J0=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];a(K0,"parseTemplateConfig");a(hT,"getContext7Config");a(pT,"listChildDirs");a(Y0,"discoverNodeManagerBinDirs");a(z0,"buildContext7SmokePath");a(Q0,"resolveExecutable");a(mT,"getConfigPath");a(gT,"readConfig");a(Z0,"runSmokeCheck");up=class{static{a(this,"Context7Service")}async install(e="claude"){if(e==="codex")return this.installCodex();if(e!=="claude")return{installed:!1,verified:!1,configPath:"",message:`Context7 auto-config not supported for ${e}; skipping`};let n=mT(),r=Se.dirname(n);await br.mkdir(r,{recursive:!0});let s=await gT(n),i=s.mcpServers||{},o=hT(),c=i.context7;return c&&JSON.stringify(c)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:n,message:"Context7 MCP already configured"}:(i.context7=o,s.mcpServers=i,await De(n,s),mn=null,{installed:!0,verified:!1,configPath:n,message:"Context7 MCP configured"})}async installCodex(){let e=await cc();return e.changed&&(mn=null),{installed:!0,verified:!1,configPath:e.path,message:e.skipped==="user-managed"?"Context7 MCP user-managed in config.toml":"Context7 MCP configured in config.toml"}}async resolveConfigured(e){if(e==="codex"){let o=qi();return await uT(o)?{ok:!0,configPath:o}:{ok:!1,configPath:o,message:"Context7 MCP not configured in ~/.codex/config.toml"}}if(e!=="claude")return{ok:!1,configPath:"",message:`Context7 not managed for ${e}`};let n=mT(),i=((await gT(n)).mcpServers||{}).context7;return!i?.command||!Array.isArray(i.args)||i.args.length===0?{ok:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"}:{ok:!0,configPath:n}}async verify(e="claude"){let n=Date.now();if(mn&&mn.provider===e&&n-mn.at<3e5)return mn.status;let r=await X0();if(r?.status.verified&&r.provider===e&&n-r.at<3e5)return mn=r,r.status;let s=await this.resolveConfigured(e);if(!s.ok)return{installed:!1,verified:!1,configPath:s.configPath,message:s.message};try{await Z0();let i={installed:!0,verified:!0,configPath:s.configPath};return mn={at:n,provider:e,status:i},await q0(n,e,i),i}catch(i){let o={installed:!0,verified:!1,configPath:s.configPath,message:`Context7 smoke check failed: ${A(i)}`};return mn={at:n,provider:e,status:o},o}}async ensureReady(e="claude"){await this.install(e);let n=await this.verify(e);if(!n.verified){let r=n.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(r)}return n}},eL=new up,Vi=eL});function tL(){return process.env.PRJCT_TEST_MODE==="1"?Le(".prjct-tests","kimi","mcp.json"):Le(".kimi","mcp.json")}async function yT(t=tL()){let e=await Bi("context7",Kt.context7,t),n=await Bi("prjct",Kt.prjct,t);return{path:t,changed:e.changed||n.changed}}var ET=h(()=>{"use strict";Gn();Gi();a(tL,"getKimiMcpConfigPath");a(yT,"ensureKimiMcpServer")});async function kT(t={}){t.silent||console.log(`
1648
+ ${s}`:s,changed:!0}}async function lT(t=qi()){let e="";try{e=await Tr.readFile(t,"utf-8")}catch{}let n=FD(),r=cT(e,n,nT,rT,"prjct"),s=r.skipped,i=BD(r.next),o=i.toml;return o===e?{path:t,changed:!1,skipped:s}:(await Tr.mkdir(ap.dirname(t),{recursive:!0}),await Tr.writeFile(t,o,"utf-8"),{path:t,changed:!0,skipped:s,statusLineChanged:i.changed})}async function cc(t=qi()){let e="";try{e=await Tr.readFile(t,"utf-8")}catch{}let n=HD(),{next:r,skipped:s}=cT(e,n,sT,iT,"context7");return r===e?{path:t,changed:!1,skipped:s}:(await Tr.mkdir(ap.dirname(t),{recursive:!0}),await Tr.writeFile(t,r,"utf-8"),{path:t,changed:!0,skipped:s})}async function uT(t=qi()){try{let e=await Tr.readFile(t,"utf-8");return/^\s*\[mcp_servers\.context7\]/m.test(e)}catch{return!1}}var nT,rT,sT,iT,oT,cp=h(()=>{"use strict";Gn();Gi();nT="# prjct:mcp:start - managed by prjct, do not edit between markers",rT="# prjct:mcp:end",sT="# prjct:mcp:context7:start - managed by prjct, do not edit between markers",iT="# prjct:mcp:context7:end",oT=["model-with-reasoning","current-dir","git-branch","context-remaining","five-hour-limit","weekly-limit","task-progress"];a(qi,"getCodexConfigTomlPath");a(Xi,"tomlString");a(aT,"buildMcpTomlBlock");a(FD,"buildPrjctMcpTomlBlock");a(HD,"buildContext7McpTomlBlock");a(cT,"upsertMarkedBlock");a(UD,"buildCodexStatusLineToml");a(WD,"hasCodexStatusLine");a(BD,"ensureCodexStatusLineToml");a(lT,"ensureCodexMcpServer");a(cc,"ensureCodexContext7Server");a(uT,"codexHasContext7Server")});import{constants as GD}from"node:fs";import br from"node:fs/promises";import lc from"node:os";import Se from"node:path";function fT(){return process.env.NODE_ENV==="test"?Se.join(lc.tmpdir(),"prjct-context7-test","verify-cache.json"):Se.join(Sn(),"state","context7-verify.json")}async function XD(){try{let t=await br.readFile(fT(),"utf-8"),e=JSON.parse(t);if(typeof e?.at=="number"&&e.status)return{...e,provider:e.provider??"claude"}}catch{}return null}async function qD(t,e,n){let r=fT();try{await br.mkdir(Se.dirname(r),{recursive:!0}),await br.writeFile(r,JSON.stringify({at:t,provider:e,status:n}),"utf-8")}catch{}}function KD(){let t=Nt("mcp-config.json");if(!t)return{mcpServers:{context7:lp}};try{return JSON.parse(t)}catch{return{mcpServers:{context7:lp}}}}function hT(){return KD().mcpServers?.context7||lp}async function pT(t){try{return(await br.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name)}catch{return[]}}async function YD(t){let e=[],n=process.env.NVM_DIR||Se.join(t,".nvm"),r=Se.join(n,"versions","node");for(let o of await pT(r))e.push(Se.join(r,o,"bin"));let s=process.env.FNM_DIR||Se.join(t,".local","share","fnm"),i=Se.join(s,"node-versions");for(let o of await pT(i))e.push(Se.join(i,o,"installation","bin"));return e}async function zD(t=process.env.PATH||"",e=lc.homedir()){let n=new Set,r=[],s=JD.map(o=>Se.join(e,...o)),i=[...VD,...s,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[Se.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[Se.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[Se.join(process.env.MISE_DATA_DIR,"shims")]:[],...await YD(e)];for(let o of[...t.split(Se.delimiter),...i]){let c=o.trim();!c||n.has(c)||(n.add(c),r.push(c))}return r.join(Se.delimiter)}async function QD(t,e){if(Se.isAbsolute(t)||t.includes(Se.sep))return t;let n=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of e.split(Se.delimiter))if(r)for(let s of n){let i=Se.join(r,t+s);try{return await br.access(i,GD.X_OK),i}catch{}}return t}function mT(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Se.join(lc.tmpdir(),"prjct-context7-test","mcp.json"):Se.join(lc.homedir(),".claude","mcp.json")}async function gT(t){try{let e=await br.readFile(t,"utf-8");return JSON.parse(e)}catch(e){if(V(e))return{};throw e}}async function ZD(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let t=hT(),e=[...t.args||[],"--help"],n=await zD(),r=await QD(t.command||"npx",n);await U(r,e,{timeout:15e3,env:{...process.env,PATH:n}})}var lp,mn,VD,JD,up,eL,Vi,dp=h(()=>{"use strict";ps();dl();$s();ie();cp();ue();se();Gi();a(fT,"getVerifyCachePath");a(XD,"readPersistedVerify");a(qD,"writePersistedVerify");lp=Kt.context7,mn=null,VD=[Se.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],JD=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];a(KD,"parseTemplateConfig");a(hT,"getContext7Config");a(pT,"listChildDirs");a(YD,"discoverNodeManagerBinDirs");a(zD,"buildContext7SmokePath");a(QD,"resolveExecutable");a(mT,"getConfigPath");a(gT,"readConfig");a(ZD,"runSmokeCheck");up=class{static{a(this,"Context7Service")}async install(e="claude"){if(e==="codex")return this.installCodex();if(e!=="claude")return{installed:!1,verified:!1,configPath:"",message:`Context7 auto-config not supported for ${e}; skipping`};let n=mT(),r=Se.dirname(n);await br.mkdir(r,{recursive:!0});let s=await gT(n),i=s.mcpServers||{},o=hT(),c=i.context7;return c&&JSON.stringify(c)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:n,message:"Context7 MCP already configured"}:(i.context7=o,s.mcpServers=i,await De(n,s),mn=null,{installed:!0,verified:!1,configPath:n,message:"Context7 MCP configured"})}async installCodex(){let e=await cc();return e.changed&&(mn=null),{installed:!0,verified:!1,configPath:e.path,message:e.skipped==="user-managed"?"Context7 MCP user-managed in config.toml":"Context7 MCP configured in config.toml"}}async resolveConfigured(e){if(e==="codex"){let o=qi();return await uT(o)?{ok:!0,configPath:o}:{ok:!1,configPath:o,message:"Context7 MCP not configured in ~/.codex/config.toml"}}if(e!=="claude")return{ok:!1,configPath:"",message:`Context7 not managed for ${e}`};let n=mT(),i=((await gT(n)).mcpServers||{}).context7;return!i?.command||!Array.isArray(i.args)||i.args.length===0?{ok:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"}:{ok:!0,configPath:n}}async verify(e="claude"){let n=Date.now();if(mn&&mn.provider===e&&n-mn.at<3e5)return mn.status;let r=await XD();if(r?.status.verified&&r.provider===e&&n-r.at<3e5)return mn=r,r.status;let s=await this.resolveConfigured(e);if(!s.ok)return{installed:!1,verified:!1,configPath:s.configPath,message:s.message};try{await ZD();let i={installed:!0,verified:!0,configPath:s.configPath};return mn={at:n,provider:e,status:i},await qD(n,e,i),i}catch(i){let o={installed:!0,verified:!1,configPath:s.configPath,message:`Context7 smoke check failed: ${A(i)}`};return mn={at:n,provider:e,status:o},o}}async ensureReady(e="claude"){await this.install(e);let n=await this.verify(e);if(!n.verified){let r=n.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(r)}return n}},eL=new up,Vi=eL});function tL(){return process.env.PRJCT_TEST_MODE==="1"?Le(".prjct-tests","kimi","mcp.json"):Le(".kimi","mcp.json")}async function yT(t=tL()){let e=await Bi("context7",Kt.context7,t),n=await Bi("prjct",Kt.prjct,t);return{path:t,changed:e.changed||n.changed}}var ET=h(()=>{"use strict";Gn();Gi();a(tL,"getKimiMcpConfigPath");a(yT,"ensureKimiMcpServer")});async function kT(t={}){t.silent||console.log(`
1649
1649
  \u{1F50C} Configuring MCP servers...`);try{await Vi.install();let e=t.verifyContext7===!1?null:await Vi.verify();t.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){t.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${A(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of nL)try{let n=hs(),r=await tT(e.name,n),s=await Bi(e.name,Kt[e.name],n);r&&!s.changed?t.silent||console.log(e.ready):t.silent||console.log(e.added)}catch(n){t.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${A(n)}`),console.log(e.manual))}try{if((await xn()).installed){let n=await lT(),r=await cc();t.silent||(n.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):n.changed||r.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${A(e)}`),console.log(" Run `prjct start` again to retry."))}try{if((await wl()).installed){let n=await yT();t.silent||console.log(n.changed?"\u2705 prjct Kimi config updated in ~/.kimi/mcp.json":"\u2705 prjct Kimi config already ready")}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Kimi config setup failed: ${A(e)}`),console.log(" Run `prjct start` again to retry."))}}var nL,wT=h(()=>{"use strict";ft();dp();ie();cp();ET();Gi();nL=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];a(kT,"setupMcpServers")});import Ji from"node:fs/promises";import rL from"node:os";import ST from"node:path";function _T(){return ST.join(rL.homedir(),".codex","skills","prjct","SKILL.md")}function sL(t){return`<!-- ${vT}: ${JSON.stringify({v:Cn,h:t})} -->`}function bT(t){let e=t.match(new RegExp(`<!--\\s*${vT}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let n=JSON.parse(e[1]);return{version:n.v??n.version,templateHash:n.h??n.templateHash}}catch{return null}}function iL(t){return Ui(t).slice(0,12)}async function xT(){return Nt("codex/SKILL.md")}function RT(t){let e=t.trimEnd(),n=iL(e),r=sL(n);return{content:`${e}
1650
1650
 
1651
1651
  ${r}