prjct-cli 3.50.0 → 3.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/bin/prjct-core.mjs +536 -536
- package/dist/bin/prjct-hooks.mjs +286 -286
- package/dist/bin/prjct.mjs +1 -1
- package/dist/daemon/entry.mjs +494 -494
- package/dist/mcp/server.mjs +4 -4
- package/package.json +1 -1
package/dist/mcp/server.mjs
CHANGED
|
@@ -1212,7 +1212,7 @@ CREATE TABLE velocity_sprints (
|
|
|
1212
1212
|
`);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=so.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;Is.existsSync(i)&&Is.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)qc(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new io,y=E});import Vc from"node:fs/promises";import jn from"node:path";function Jg(t){let e=[],n,r=new RegExp(ig.source,"g");for(;(n=r.exec(t))!==null;){let s=n[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Kg(t,e,n){let r;if(t.startsWith("@/"))r=jn.join(n,"src",t.slice(2));else{let s=jn.dirname(jn.join(n,e));r=jn.resolve(s,t)}for(let s of sg){let i=r+s;try{if((await Vc.stat(i)).isFile())return jn.relative(n,i)}catch{}}return null}async function sx(t){let e=await Rt(t),n={},r={},s=0,i=await un(e,50,async o=>{try{let c=await Vc.readFile(jn.join(t,o),"utf-8"),l=Jg(c),u=[];for(let d of l){let p=await Kg(d,o,t);p&&p!==o&&u.push(p)}return u.length>0?{filePath:o,imports:u}:null}catch{return null}});for(let{filePath:o,imports:c}of i){n[o]=c,s+=c.length;for(let l of c)r[l]||(r[l]=[]),r[l].push(o)}return{forward:n,reverse:r,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function vr(t,e,n=2){let r=new Set(t),s=new Map,i=[];for(let o of t){let c=e.forward[o]||[],l=e.reverse[o]||[];for(let u of[...c,...l])r.has(u)||i.push({file:u,depth:1})}for(let o=0;o<i.length;o++){let{file:c,depth:l}=i[o];if(l>n)continue;let u=1/(l+1),d=s.get(c);if(d){u>d.score&&s.set(c,{score:u,depth:l});continue}if(s.set(c,{score:u,depth:l}),l<n){let p=e.forward[c]||[],m=e.reverse[c]||[];for(let g of[...p,...m])!r.has(g)&&!s.has(g)&&i.push({file:g,depth:l+1})}}return Array.from(s.entries()).map(([o,{score:c,depth:l}])=>({path:o,score:c,depth:l})).sort((o,c)=>c.score-o.score)}function ix(t){return Object.values(t).reduce((e,n)=>e+n.length,0)}function ox(t,e){let n=t.forward[e]||[];delete t.forward[e];for(let r of n){let s=(t.reverse[r]||[]).filter(i=>i!==e);s.length===0?delete t.reverse[r]:t.reverse[r]=s}}function ax(t,e){let n=t.reverse[e]||[];delete t.reverse[e];let r=[];for(let s of n){let i=(t.forward[s]||[]).filter(o=>o!==e);i.length===0?delete t.forward[s]:t.forward[s]=i,r.push(s)}return r}function cx(t,e,n){if(n.length===0)return;let r=Array.from(new Set(n));t.forward[e]=r;for(let s of r)t.reverse[s]||(t.reverse[s]=[]),t.reverse[s].includes(e)||t.reverse[s].push(e)}async function lx(t,e){try{let n=await Vc.readFile(jn.join(t,e),"utf-8"),r=Jg(n),s=[];for(let i of r){let o=await Kg(i,e,t);o&&o!==e&&s.push(o)}return{filePath:e,imports:s}}catch{return null}}function Yg(t){return{schemaVersion:2,fileCount:t.fileCount,edgeCount:t.edgeCount,builtAt:t.builtAt}}function ux(t,e){try{y.transaction(t,n=>{n.prepare("DELETE FROM import_graph_edges").run();let r=n.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let[s,i]of Object.entries(e.forward))for(let[o,c]of i.entries())r.run(s,c,o)})}catch{}}function dx(t,e,n,r){try{y.transaction(t,s=>{let i=s.prepare("DELETE FROM import_graph_edges WHERE from_path = ?"),o=s.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let c of new Set([...n,...r]))i.run(c);for(let c of n){let l=e.forward[c]||[];for(let[u,d]of l.entries())o.run(c,d,u)}})}catch{}}function px(t,e,n){try{let r=y.query(t,"SELECT from_path, to_path FROM import_graph_edges ORDER BY from_path, sort_order, to_path");if(r.length===0){if(n?.edgeCount===0){let l={forward:{},reverse:{},fileCount:n.fileCount,edgeCount:0,builtAt:n.builtAt};return Mn.set(t,{graph:l,updatedAt:e}),l}return null}let s={},i={};for(let l of r)s[l.from_path]||(s[l.from_path]=[]),s[l.from_path].push(l.to_path),i[l.to_path]||(i[l.to_path]=[]),i[l.to_path].push(l.from_path);let o=new Set;for(let[l,u]of Object.entries(s)){o.add(l);for(let d of u)o.add(d)}let c={forward:s,reverse:i,fileCount:n?.fileCount??o.size,edgeCount:r.length,builtAt:n?.builtAt??e};return Mn.set(t,{graph:c,updatedAt:e}),c}catch{return null}}function mx(t,e){y.setDoc(t,oo,Yg(e)),ux(t,e),Mn.delete(t)}function gx(t,e,n,r){y.setDoc(t,oo,Yg(e)),dx(t,e,n,r),Mn.delete(t)}function Ye(t){let e=y.get(t,"SELECT updated_at FROM kv_store WHERE key = ?",oo);if(!e)return Mn.delete(t),null;let n=Mn.get(t);if(n&&n.updatedAt===e.updated_at)return n.graph;let r=y.getDoc(t,oo),s=px(t,e.updated_at,r);if(s)return s;if(!r?.forward||!r?.reverse)return null;let i={forward:r.forward,reverse:r.reverse,fileCount:r.fileCount,edgeCount:r.edgeCount,builtAt:r.builtAt};return Mn.set(t,{graph:i,updatedAt:e.updated_at}),i}async function Ds(t,e){let n=await sx(t);return mx(e,n),n}async function zg(t,e,n,r=[]){let s=Ye(e);if(!s)return Ds(t,e);let i=new Set([...n,...r]);for(let l of i)ox(s,l);let o=new Set;for(let l of r)for(let u of ax(s,l))o.add(u);let c=await un(n,50,l=>lx(t,l));for(let l of c)cx(s,l.filePath,l.imports);return s.edgeCount=ix(s.forward),s.builtAt=new Date().toISOString(),gx(e,s,[...n,...o],r),s}var oo,Mn,$n=f(()=>{"use strict";Cc();L();re();a(Jg,"extractImportSources");a(Kg,"resolveImport");a(sx,"buildGraph");a(vr,"scoreFromSeeds");oo="import-graph",Mn=new Map;a(ix,"countEdges");a(ox,"removeOutgoingEdges");a(ax,"removeIncomingEdges");a(cx,"addEdges");a(lx,"importsForFile");a(Yg,"graphMetadata");a(ux,"replacePerFileEdges");a(dx,"updatePerFileEdges");a(px,"loadGraphFromPerFileEdges");a(mx,"saveGraph");a(gx,"saveGraphUpdate");a(Ye,"loadGraph");a(Ds,"indexImports");a(zg,"updateImportGraph")});function ao(t,e){let n=[...t.added,...t.modified],r=new Set(n),s=new Set,i=Ye(e);if(i)for(let l of n){let u=i.reverse[l];if(u)for(let d of u)r.has(d)||s.add(d)}let o=Array.from(s),c=[...n,...o];return{directlyChanged:n,affectedByImports:o,deleted:t.deleted,allAffected:c}}function co(t){let e=new Set;for(let n of t){let r=n.toLowerCase();(r.endsWith(".tsx")||r.endsWith(".jsx")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".vue")||r.endsWith(".svelte")||r.includes("/components/")||r.includes("/pages/")||r.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("/test/"))&&e.add("testing"),(r.includes("dockerfile")||r.includes("docker-compose")||r.includes(".dockerignore")||r.includes(".github/")||r.includes("ci/")||r.includes("cd/"))&&e.add("devops"),(r.endsWith(".sql")||r.includes("prisma")||r.includes("drizzle")||r.includes("migration")||r.includes("/db/"))&&e.add("database"),(r.endsWith(".ts")||r.endsWith(".js"))&&!r.includes(".test.")&&!r.includes(".spec.")&&!r.endsWith(".d.ts")&&e.add("backend")}return e}var Jc=f(()=>{"use strict";$n();a(ao,"propagateChanges");a(co,"affectedDomains")});var Kc=f(()=>{"use strict"});async function hx(t,e=100){try{let{stdout:n}=await $(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:t,maxBuffer:10485760}),r=[],s=null;for(let i of n.split(`
|
|
1213
1213
|
`)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&yx(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function yx(t){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(t)&&!t.includes("node_modules/")}async function Ex(t,e=100){let n=await hx(t,e),r=new Map,s=new Map;for(let o of n){let c=Array.from(o);for(let l of c)r.set(l,(r.get(l)||0)+1);for(let l=0;l<c.length;l++)for(let u=l+1;u<c.length;u++){let d=kx(c[l],c[u]);s.set(d,(s.get(d)||0)+1)}}let i={};for(let[o,c]of s){let[l,u]=o.split("\0"),d=r.get(l)||0,p=r.get(u)||0;if(d<2||p<2)continue;let m=d+p-c,g=m>0?c/m:0;g<.1||(i[l]||(i[l]={}),i[u]||(i[u]={}),i[l][u]=g,i[u][l]=g)}return{matrix:i,commitsAnalyzed:n.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}function kx(t,e){return t<e?`${t}\0${e}`:`${e}\0${t}`}function Fn(t,e){let n=new Set(t),r=new Map;for(let s of t){let i=e.matrix[s];if(i)for(let[o,c]of Object.entries(i)){if(n.has(o))continue;let l=r.get(o)||0;c>l&&r.set(o,c)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}function Tx(t,e){y.setDoc(t,Yc,e),lo.delete(t)}function pt(t){let e=y.get(t,"SELECT updated_at FROM kv_store WHERE key = ?",Yc);if(!e)return lo.delete(t),null;let n=lo.get(t);if(n&&n.updatedAt===e.updated_at)return n.matrix;let r=y.getDoc(t,Yc);return r&&lo.set(t,{matrix:r,updatedAt:e.updated_at}),r}async function wx(t,e){try{let{stdout:n}=await $(`git rev-list --max-count=${e} HEAD`,{cwd:t,maxBuffer:1048576}),r=n.split(`
|
|
1214
1214
|
`).map(s=>s.trim()).filter(Boolean);return r.length>0?r.join(`
|
|
1215
|
-
`):null}catch{return null}}async function uo(t,e,n=100){let r=await wx(t,n),s=r?pt(e):null;if(s?.historyFingerprint===r)return s;let i=await Ex(t,n);return r&&(i.historyFingerprint=r),Tx(e,i),i}var Yc,lo,br=f(()=>{"use strict";Kc();L();de();a(hx,"parseGitLog");a(yx,"isSourceFile");a(Ex,"buildMatrix");a(kx,"pairKey");a(Fn,"scoreFromSeeds");Yc="cochange-index",lo=new Map;a(Tx,"saveMatrix");a(pt,"loadMatrix");a(wx,"recentHistoryFingerprint");a(uo,"indexCoChanges")});function Sx(t){return t instanceof Ls}function Ae(t){return Sx(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ls,po,Os,Xt=f(()=>{"use strict";Ls=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)}},po=class t extends Ls{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")}},Os=class t extends Ls{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(Sx,"isPrjctError");a(Ae,"getErrorMessage")});function ef(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zc(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:ef(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:ef(r.host),repoSlug:s}}catch{return{}}}async function vx(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function bx(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 Un(t){return typeof t=="string"&&t.length>0?t:void 0}function tf(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function _x(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function nf(t){let e=E.getDoc(t,"project")||{},n=Un(e.repoPath),{provider:r,repoSlug:s}=n?zc(await vx(n)||""):{},i=n?await bx(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return _x({provider:r,repoSlug:s,currentBranch:Un(e.currentBranch),defaultBranch:i,stack:Un(e.stack),techStack:o&&o.length>0?o:void 0,version:Un(e.version),commitCount:tf(e.commitCount),fileCount:tf(e.fileCount),lastCommit:Un(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Un(e.cliVersion),syncedAt:Un(e.lastSync)})}var Qc=f(()=>{"use strict";L();de();a(ef,"providerForHost");a(zc,"parseRemote");a(vx,"gitRemoteUrl");a(bx,"gitDefaultBranch");a(Un,"str");a(tf,"num");a(_x,"compact");a(nf,"buildProjectMeta")});import{execFile as xx}from"node:child_process";import Rx from"node:crypto";import{promisify as Ax}from"node:util";function Ix(t,e=Nx){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=Rx.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 Px(t){let e;try{let{stdout:s}=await Cx("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zc(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function rf(t){let e=await Px(t);return e?Ix(e):null}var Cx,Nx,sf=f(()=>{"use strict";Qc();Cx=Ax(xx),Nx="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(Ix,"uuidv5");a(Px,"repoKey");a(rf,"deriveProjectId")});var tl={};P(tl,{PACKAGE_ROOT:()=>kn,VERSION:()=>En,getPackageRoot:()=>el,getVersion:()=>go,resetPackageRoot:()=>Dx});import Zc from"node:fs";import mo from"node:path";function el(){if(_r)return _r;let t=__dirname;for(let e=0;e<5;e++){let n=mo.join(t,"package.json");if(Zc.existsSync(n))try{if(JSON.parse(Zc.readFileSync(n,"utf-8")).name==="prjct-cli")return _r=t,t}catch{}t=mo.dirname(t)}return _r=mo.join(__dirname,"..","..",".."),_r}function go(){if(Hn)return Hn;let t="3.50.
|
|
1215
|
+
`):null}catch{return null}}async function uo(t,e,n=100){let r=await wx(t,n),s=r?pt(e):null;if(s?.historyFingerprint===r)return s;let i=await Ex(t,n);return r&&(i.historyFingerprint=r),Tx(e,i),i}var Yc,lo,br=f(()=>{"use strict";Kc();L();de();a(hx,"parseGitLog");a(yx,"isSourceFile");a(Ex,"buildMatrix");a(kx,"pairKey");a(Fn,"scoreFromSeeds");Yc="cochange-index",lo=new Map;a(Tx,"saveMatrix");a(pt,"loadMatrix");a(wx,"recentHistoryFingerprint");a(uo,"indexCoChanges")});function Sx(t){return t instanceof Ls}function Ae(t){return Sx(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ls,po,Os,Xt=f(()=>{"use strict";Ls=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)}},po=class t extends Ls{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")}},Os=class t extends Ls{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(Sx,"isPrjctError");a(Ae,"getErrorMessage")});function ef(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zc(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:ef(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:ef(r.host),repoSlug:s}}catch{return{}}}async function vx(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function bx(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 Un(t){return typeof t=="string"&&t.length>0?t:void 0}function tf(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function _x(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function nf(t){let e=E.getDoc(t,"project")||{},n=Un(e.repoPath),{provider:r,repoSlug:s}=n?zc(await vx(n)||""):{},i=n?await bx(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return _x({provider:r,repoSlug:s,currentBranch:Un(e.currentBranch),defaultBranch:i,stack:Un(e.stack),techStack:o&&o.length>0?o:void 0,version:Un(e.version),commitCount:tf(e.commitCount),fileCount:tf(e.fileCount),lastCommit:Un(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Un(e.cliVersion),syncedAt:Un(e.lastSync)})}var Qc=f(()=>{"use strict";L();de();a(ef,"providerForHost");a(zc,"parseRemote");a(vx,"gitRemoteUrl");a(bx,"gitDefaultBranch");a(Un,"str");a(tf,"num");a(_x,"compact");a(nf,"buildProjectMeta")});import{execFile as xx}from"node:child_process";import Rx from"node:crypto";import{promisify as Ax}from"node:util";function Ix(t,e=Nx){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=Rx.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 Px(t){let e;try{let{stdout:s}=await Cx("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zc(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function rf(t){let e=await Px(t);return e?Ix(e):null}var Cx,Nx,sf=f(()=>{"use strict";Qc();Cx=Ax(xx),Nx="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(Ix,"uuidv5");a(Px,"repoKey");a(rf,"deriveProjectId")});var tl={};P(tl,{PACKAGE_ROOT:()=>kn,VERSION:()=>En,getPackageRoot:()=>el,getVersion:()=>go,resetPackageRoot:()=>Dx});import Zc from"node:fs";import mo from"node:path";function el(){if(_r)return _r;let t=__dirname;for(let e=0;e<5;e++){let n=mo.join(t,"package.json");if(Zc.existsSync(n))try{if(JSON.parse(Zc.readFileSync(n,"utf-8")).name==="prjct-cli")return _r=t,t}catch{}t=mo.dirname(t)}return _r=mo.join(__dirname,"..","..",".."),_r}function go(){if(Hn)return Hn;let t="3.50.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return Hn=t,Hn;try{let e=mo.join(el(),"package.json");return Hn=JSON.parse(Zc.readFileSync(e,"utf-8")).version,Hn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",_(e)),"0.0.0"}}function Dx(t){_r=t,Hn=null}var Hn,_r,En,kn,qt=f(()=>{"use strict";ne();Hn=null,_r=null;a(el,"getPackageRoot");a(go,"getVersion");a(Dx,"resetPackageRoot");En=go(),kn=el()});async function fo(t){try{let{stdout:e}=await $(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Lx(){let t=await fo("gh api user --jq .login");return t.success&&t.output||(t=await fo("git config --global github.user"),t.success&&t.output)?t.output:null}async function Ox(){let t=await fo("git config user.name");return t.success&&t.output?t.output:null}async function jx(){let t=await fo("git config user.email");return t.success&&t.output?t.output:null}async function xr(){let[t,e,n]=await Promise.all([Lx(),Ox(),jx()]);return{github:t,email:n,name:e||t||"Unknown"}}var ho=f(()=>{"use strict";de();a(fo,"execCommand");a(Lx,"detectGitHubUsername");a(Ox,"detectGitName");a(jx,"detectGitEmail");a(xr,"detect")});var yo={};P(yo,{worktreeService:()=>Mx});import rl from"node:fs/promises";import Ct from"node:path";var of,sl,Mx,Eo=f(()=>{"use strict";de();re();of=".worktrees",sl=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ct.join(s,of,n),o=r.branch||`feat/${n}`;await rl.mkdir(Ct.join(s,of),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await $(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await $("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 $("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await $(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await $(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await $("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await $("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await $("git rev-parse --git-dir",{cwd:e}),s=Ct.resolve(e,n.trim()),i=Ct.resolve(e,r.trim());if(s!==i){let{stdout:o}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await $("git rev-parse HEAD",{cwd:e}),{stdout:l}=await $("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ct.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 $("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1216
1216
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await $("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=Ct.join(n,".env");await R(r)&&await rl.copyFile(r,Ct.join(e,".env"));let s=Ct.join(n,".prjct"),i=Ct.join(e,".prjct");await R(s)&&!await R(i)&&await rl.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await $("git worktree prune",{cwd:s});for(let i of n)i.isMain||await R(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
|
|
1217
1217
|
|
|
1218
1218
|
`);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
|
|
@@ -1322,7 +1322,7 @@ public static class PrjctCredentialManager {
|
|
|
1322
1322
|
WHERE status = 'completed' AND completed_at IS NOT NULL ${e}
|
|
1323
1323
|
ORDER BY completed_at DESC, rowid DESC LIMIT ${TR}`,...n).map(wR)}catch{return[]}}async function Pf(t,e){await t.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:T()}))}async function Df(t,e){let n=await t.read(e),r=t.getPausedTasksFromState(n);return n.currentTask!==null||r.length>0}async function Lf(t,e){let n=await t.read(e);return t.getPausedTasksFromState(n)[0]||null}async function Of(t,e){let n=await t.read(e);return t.getPausedTasksFromState(n)}async function Nl(t,e){return Cl(e)}async function jf(t,e){return Cl(e)[0]||null}async function Mf(t,e,n){return Cl(e,"AND type = ?",n)}async function $f(t,e){let r=(await Nl(t,e)).filter(m=>m.feedback),s=[],i=[],o=[],c=[];for(let m of r){let g=m.feedback;Array.isArray(g.stackConfirmed)&&s.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&i.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&o.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&c.push(...g.issuesEncountered)}let l=[...new Set(s)],u=[...new Set(i)],d=new Map;for(let m of c)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:o,issuesEncountered:[...new Set(c)],knownGotchas:p}}var TR,Ff=f(()=>{"use strict";Q();L();TR=20;a(wR,"rowToHistoryEntry");a(Cl,"queryHistory");a(Pf,"clearTask");a(Df,"hasTask");a(Lf,"getPausedTask");a(Of,"getAllPausedTasks");a(Nl,"getTaskHistory");a(jf,"getMostRecentTask");a(Mf,"getTaskHistoryByType");a($f,"getAggregatedFeedback")});async function xo(t,e,n,r){let s={};return await t.update(e,i=>{if(!i.currentTask?.subtasks)return i;let o=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[o];if(!c)return i;let l=[...i.currentTask.subtasks];l[o]=n(c);let u=o+1,d=l.length;u<d&&(l[u]={...l[u],status:"in_progress",startedAt:T()});let p=u<d?l[u]:null,m=r?Hf(r(l),d):void 0;return s.value={taskId:i.currentTask.id,current:l[o],next:p,...m?{progress:m}:{}},{...i,currentTask:{...i.currentTask,subtasks:l,currentSubtaskIndex:u<d?u:o,...m?{subtaskProgress:m}:{}},lastUpdated:T()}}),s.value??null}function Hf(t,e){return{completed:t,total:e,percentage:e>0?Math.round(t/e*100):0}}async function Wf(t,e,n){let r=null,s=[];await t.update(e,i=>i.currentTask?(r=i.currentTask.id,s=n.map((o,c)=>({...o,status:c===0?"in_progress":"pending",startedAt:c===0?T():void 0,dependsOn:o.dependsOn||[]})),{...i,currentTask:{...i.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:Hf(0,s.length)},lastUpdated:T()}):i),r&&await t.publish(e,"subtasks.created",{taskId:r,subtaskCount:s.length,subtasks:s.map(i=>({id:i.id,description:i.description,domain:i.domain}))})}async function Bf(t,e,n){let r=uf.safeParse(n);if(!r.success){let c=r.error.issues.map(l=>`${l.path.join(".")}: ${l.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
1324
1324
|
${c.join(`
|
|
1325
|
-
`)}`)}let{output:s,summary:i}=r.data,o=await xo(t,e,c=>({...c,status:"completed",completedAt:T(),output:s,summary:i}),vR);return o?(await t.publish(e,"subtask.completed",{taskId:o.taskId,subtaskId:o.current.id,description:o.current.description,output:s,handoff:i.outputForNextAgent,filesChanged:i.filesChanged.length,progress:o.progress}),o.next):null}async function Gf(t,e){let n=await t.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0;return n.currentTask.subtasks[r]||null}async function Xf(t,e){let n=await t.read(e);if(!n.currentTask?.subtasks)return null;let r=(n.currentTask.currentSubtaskIndex||0)+1;return n.currentTask.subtasks[r]||null}async function Il(t,e){let n=await t.read(e);if(!n.currentTask?.subtasks)return null;let r=(n.currentTask.currentSubtaskIndex||0)-1;return r<0?null:n.currentTask.subtasks[r]||null}async function qf(t,e){let n=await Il(t,e);return n?.summary?.outputForNextAgent?{fromSubtask:n.description,outputForNextAgent:n.summary.outputForNextAgent,filesChanged:n.summary.filesChanged,whatWasDone:n.summary.whatWasDone}:null}async function Vf(t,e){return(await t.read(e)).currentTask?.subtasks||[]}async function Jf(t,e){return(await t.read(e)).currentTask?.subtaskProgress||null}async function Kf(t,e){return((await t.read(e)).currentTask?.subtasks?.length||0)>0}async function Yf(t,e){let n=await t.read(e);return n.currentTask?.subtasks?n.currentTask.subtasks.every(r=>r.status==="completed"||r.status==="failed"||r.status==="skipped"):!0}async function zf(t,e,n){let r=await xo(t,e,s=>({...s,status:"failed",completedAt:T(),output:`Failed: ${n}`}),Uf);return r?(await t.publish(e,"subtask.failed",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,error:n}),r.next):null}async function Qf(t,e,n){let r=await xo(t,e,s=>({...s,status:"skipped",completedAt:T(),output:`Skipped: ${n}`,skipReason:n}),Uf);return r?(await t.publish(e,"subtask.skipped",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,reason:n}),r.next):null}async function Zf(t,e,n){let r=await xo(t,e,s=>({...s,status:"blocked",output:`Blocked: ${n}`,blockReason:n}));return r?(await t.publish(e,"subtask.blocked",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,blocker:n}),r.next):null}var vR,Uf,eh=f(()=>{"use strict";So();Q();vR=a(t=>t.filter(e=>e.status==="completed").length,"countCompleted"),Uf=a(t=>t.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="skipped").length,"countResolved");a(xo,"mutateCurrentSubtask");a(Hf,"progressFrom");a(Wf,"createSubtasks");a(Bf,"completeSubtask");a(Gf,"getCurrentSubtask");a(Xf,"getNextSubtask");a(Il,"getPreviousSubtask");a(qf,"getPreviousHandoff");a(Vf,"getSubtasks");a(Jf,"getSubtaskProgress");a(Kf,"hasSubtasks");a(Yf,"areAllSubtasksComplete");a(zf,"failSubtask");a(Qf,"skipSubtask");a(Zf,"blockSubtask")});async function th(t,e,n,r){let s={...n,workspaceId:r,startedAt:T()};return await t.update(e,i=>{if((i.activeTasks||[]).some(o=>o.workspaceId===r))throw new Error("A task is already active in this workspace");return{...i,activeTasks:[...i.activeTasks||[],s],lastUpdated:T()}}),await t.publish(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId,workspaceId:r}),s}async function nh(t,e,n){return((await t.read(e)).activeTasks||[]).find(s=>s.workspaceId===n)??null}async function rh(t,e,n,r){let i=((await t.read(e)).activeTasks||[]).find(l=>l.workspaceId===n);if(!i)return null;let o=T(),c=i;return await t.update(e,l=>(c=(l.activeTasks||[]).find(u=>u.workspaceId===n)??i,{...l,activeTasks:(l.activeTasks||[]).filter(u=>u.workspaceId!==n),lastUpdated:o})),t.persistHistoryEntry(e,t.createTaskHistoryEntry(c,o,r)),await t.publish(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:o,workspaceId:n}),i}async function sh(t,e){return(await t.read(e)).activeTasks||[]}async function ih(t,e){return((await t.read(e)).activeTasks||[]).length}async function oh(t,e,n,r){let i=((await t.read(e)).activeTasks||[]).find(l=>l.workspaceId===n);if(!i)return null;let o=a(l=>{let u={...l};for(let[d,p]of Object.entries(r))p===null?delete u[d]:p!==void 0&&(u[d]=p);return u.workspaceId=n,u},"merge"),c=i;return await t.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>u.workspaceId!==n?u:(c=o(u),c)),lastUpdated:T()})),c}async function ah(t,e,n,r,s){let i=await t.read(e);if(s){if(!(i.activeTasks||[]).some(l=>l.workspaceId===s))return null;let c=null;return await t.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>{if(u.workspaceId!==s)return u;let d=(u.tokensIn||0)+n,p=(u.tokensOut||0)+r;return c={tokensIn:d,tokensOut:p},{...u,tokensIn:d,tokensOut:p}}),lastUpdated:T()})),c}if(!i.currentTask)return null;let o=null;return await t.update(e,c=>{if(!c.currentTask)return c;let l=(c.currentTask.tokensIn||0)+n,u=(c.currentTask.tokensOut||0)+r;return o={tokensIn:l,tokensOut:u},{...c,currentTask:{...c.currentTask,tokensIn:l,tokensOut:u},lastUpdated:T()}}),o}var ch=f(()=>{"use strict";Q();a(th,"startTaskInWorkspace");a(nh,"getCurrentTaskForWorkspace");a(rh,"completeTaskInWorkspace");a(sh,"getActiveTasks");a(ih,"getActiveTaskCount");a(oh,"updateWorkspaceTask");a(ah,"addTokens")});import xR from"node:crypto";function RR(t){let[e,n]=t.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:n==="deleted"||n==="archived"||n==="removed"?"delete":"upsert"}:{}}function AR(t){if(!t||typeof t!="object")return;let e=t;for(let n of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let r=e[n];if(typeof r=="string"&&r.length>0)return r}}function CR(t){let e=t&&typeof t=="object"&&!Array.isArray(t)?JSON.stringify(NR(t)):JSON.stringify(t);return xR.createHash("sha256").update(e).digest("hex")}function NR(t){let e={};for(let n of Object.keys(t).sort())e[n]=t[n];return e}async function IR(){if(Ro)return Ro;try{let{default:t}=await Promise.resolve().then(()=>(Ws(),xl)),e=t;return typeof e.getDeviceId=="function"?(Ro=await e.getDeviceId(),Ro):"unknown-device"}catch{return"unknown-device"}}var Ro,ze,Xn=f(()=>{"use strict";vo();jc();Q();L();a(RR,"deriveEntityShape");a(AR,"entityIdOf");a(CR,"hashPayload");a(NR,"sortKeys");Ro=null;a(IR,"_resolveDeviceId");ze=class{static{a(this,"StorageManager")}filename;cache;constructor(e,n){this.filename=e,this.cache=new eo({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let r=this.cache.get(e);if(r!==null)return r}try{let r=E.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,n){E.setDoc(e,this.getStoreKey(),n),this.cache.set(e,n)}async update(e,n){let r=this.getStoreKey(),s=E.updateDoc(e,r,n,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,n,r){let s=RR(n),i={type:n,path:[this.filename.replace(".json","")],data:r,timestamp:T(),projectId:e,entityType:s.entityType,entityId:AR(r),eventType:s.eventType,contentHash:CR(r),deviceId:await IR(),revisionCount:1};await It.publish(i)}async publishEntityEvent(e,n,r,s){let i=`${n}.${r}`,o={...s,timestamp:T()};await this.publishEvent(e,i,o)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Pl,H,Qe=f(()=>{"use strict";So();Q();ll();L();If();Ff();eh();ch();Xn();Pl=class extends ze{static{a(this,"StateStorage")}constructor(){super("state.json",gf)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,n,r){let s=Rr.getCurrentState(e,r),i=Rr.canTransition(s,n);if(!i.valid)throw new Error(`${i.error}. ${i.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async bumpTurnCount(e){let n={count:0};return await this.update(e,r=>{if(!r.currentTask)return r;let s=(r.currentTask.turnCount??0)+1;return n.count=s,{...r,currentTask:
|
|
1325
|
+
`)}`)}let{output:s,summary:i}=r.data,o=await xo(t,e,c=>({...c,status:"completed",completedAt:T(),output:s,summary:i}),vR);return o?(await t.publish(e,"subtask.completed",{taskId:o.taskId,subtaskId:o.current.id,description:o.current.description,output:s,handoff:i.outputForNextAgent,filesChanged:i.filesChanged.length,progress:o.progress}),o.next):null}async function Gf(t,e){let n=await t.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0;return n.currentTask.subtasks[r]||null}async function Xf(t,e){let n=await t.read(e);if(!n.currentTask?.subtasks)return null;let r=(n.currentTask.currentSubtaskIndex||0)+1;return n.currentTask.subtasks[r]||null}async function Il(t,e){let n=await t.read(e);if(!n.currentTask?.subtasks)return null;let r=(n.currentTask.currentSubtaskIndex||0)-1;return r<0?null:n.currentTask.subtasks[r]||null}async function qf(t,e){let n=await Il(t,e);return n?.summary?.outputForNextAgent?{fromSubtask:n.description,outputForNextAgent:n.summary.outputForNextAgent,filesChanged:n.summary.filesChanged,whatWasDone:n.summary.whatWasDone}:null}async function Vf(t,e){return(await t.read(e)).currentTask?.subtasks||[]}async function Jf(t,e){return(await t.read(e)).currentTask?.subtaskProgress||null}async function Kf(t,e){return((await t.read(e)).currentTask?.subtasks?.length||0)>0}async function Yf(t,e){let n=await t.read(e);return n.currentTask?.subtasks?n.currentTask.subtasks.every(r=>r.status==="completed"||r.status==="failed"||r.status==="skipped"):!0}async function zf(t,e,n){let r=await xo(t,e,s=>({...s,status:"failed",completedAt:T(),output:`Failed: ${n}`}),Uf);return r?(await t.publish(e,"subtask.failed",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,error:n}),r.next):null}async function Qf(t,e,n){let r=await xo(t,e,s=>({...s,status:"skipped",completedAt:T(),output:`Skipped: ${n}`,skipReason:n}),Uf);return r?(await t.publish(e,"subtask.skipped",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,reason:n}),r.next):null}async function Zf(t,e,n){let r=await xo(t,e,s=>({...s,status:"blocked",output:`Blocked: ${n}`,blockReason:n}));return r?(await t.publish(e,"subtask.blocked",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,blocker:n}),r.next):null}var vR,Uf,eh=f(()=>{"use strict";So();Q();vR=a(t=>t.filter(e=>e.status==="completed").length,"countCompleted"),Uf=a(t=>t.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="skipped").length,"countResolved");a(xo,"mutateCurrentSubtask");a(Hf,"progressFrom");a(Wf,"createSubtasks");a(Bf,"completeSubtask");a(Gf,"getCurrentSubtask");a(Xf,"getNextSubtask");a(Il,"getPreviousSubtask");a(qf,"getPreviousHandoff");a(Vf,"getSubtasks");a(Jf,"getSubtaskProgress");a(Kf,"hasSubtasks");a(Yf,"areAllSubtasksComplete");a(zf,"failSubtask");a(Qf,"skipSubtask");a(Zf,"blockSubtask")});async function th(t,e,n,r){let s={...n,workspaceId:r,startedAt:T()};return await t.update(e,i=>{if((i.activeTasks||[]).some(o=>o.workspaceId===r))throw new Error("A task is already active in this workspace");return{...i,activeTasks:[...i.activeTasks||[],s],lastUpdated:T()}}),await t.publish(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId,workspaceId:r}),s}async function nh(t,e,n){return((await t.read(e)).activeTasks||[]).find(s=>s.workspaceId===n)??null}async function rh(t,e,n,r){let i=((await t.read(e)).activeTasks||[]).find(l=>l.workspaceId===n);if(!i)return null;let o=T(),c=i;return await t.update(e,l=>(c=(l.activeTasks||[]).find(u=>u.workspaceId===n)??i,{...l,activeTasks:(l.activeTasks||[]).filter(u=>u.workspaceId!==n),lastUpdated:o})),t.persistHistoryEntry(e,t.createTaskHistoryEntry(c,o,r)),await t.publish(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:o,workspaceId:n}),i}async function sh(t,e){return(await t.read(e)).activeTasks||[]}async function ih(t,e){return((await t.read(e)).activeTasks||[]).length}async function oh(t,e,n,r){let i=((await t.read(e)).activeTasks||[]).find(l=>l.workspaceId===n);if(!i)return null;let o=a(l=>{let u={...l};for(let[d,p]of Object.entries(r))p===null?delete u[d]:p!==void 0&&(u[d]=p);return u.workspaceId=n,u},"merge"),c=i;return await t.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>u.workspaceId!==n?u:(c=o(u),c)),lastUpdated:T()})),c}async function ah(t,e,n,r,s){let i=await t.read(e);if(s){if(!(i.activeTasks||[]).some(l=>l.workspaceId===s))return null;let c=null;return await t.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>{if(u.workspaceId!==s)return u;let d=(u.tokensIn||0)+n,p=(u.tokensOut||0)+r;return c={tokensIn:d,tokensOut:p},{...u,tokensIn:d,tokensOut:p}}),lastUpdated:T()})),c}if(!i.currentTask)return null;let o=null;return await t.update(e,c=>{if(!c.currentTask)return c;let l=(c.currentTask.tokensIn||0)+n,u=(c.currentTask.tokensOut||0)+r;return o={tokensIn:l,tokensOut:u},{...c,currentTask:{...c.currentTask,tokensIn:l,tokensOut:u},lastUpdated:T()}}),o}var ch=f(()=>{"use strict";Q();a(th,"startTaskInWorkspace");a(nh,"getCurrentTaskForWorkspace");a(rh,"completeTaskInWorkspace");a(sh,"getActiveTasks");a(ih,"getActiveTaskCount");a(oh,"updateWorkspaceTask");a(ah,"addTokens")});import xR from"node:crypto";function RR(t){let[e,n]=t.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:n==="deleted"||n==="archived"||n==="removed"?"delete":"upsert"}:{}}function AR(t){if(!t||typeof t!="object")return;let e=t;for(let n of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let r=e[n];if(typeof r=="string"&&r.length>0)return r}}function CR(t){let e=t&&typeof t=="object"&&!Array.isArray(t)?JSON.stringify(NR(t)):JSON.stringify(t);return xR.createHash("sha256").update(e).digest("hex")}function NR(t){let e={};for(let n of Object.keys(t).sort())e[n]=t[n];return e}async function IR(){if(Ro)return Ro;try{let{default:t}=await Promise.resolve().then(()=>(Ws(),xl)),e=t;return typeof e.getDeviceId=="function"?(Ro=await e.getDeviceId(),Ro):"unknown-device"}catch{return"unknown-device"}}var Ro,ze,Xn=f(()=>{"use strict";vo();jc();Q();L();a(RR,"deriveEntityShape");a(AR,"entityIdOf");a(CR,"hashPayload");a(NR,"sortKeys");Ro=null;a(IR,"_resolveDeviceId");ze=class{static{a(this,"StorageManager")}filename;cache;constructor(e,n){this.filename=e,this.cache=new eo({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let r=this.cache.get(e);if(r!==null)return r}try{let r=E.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,n){E.setDoc(e,this.getStoreKey(),n),this.cache.set(e,n)}async update(e,n){let r=this.getStoreKey(),s=E.updateDoc(e,r,n,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,n,r){let s=RR(n),i={type:n,path:[this.filename.replace(".json","")],data:r,timestamp:T(),projectId:e,entityType:s.entityType,entityId:AR(r),eventType:s.eventType,contentHash:CR(r),deviceId:await IR(),revisionCount:1};await It.publish(i)}async publishEntityEvent(e,n,r,s){let i=`${n}.${r}`,o={...s,timestamp:T()};await this.publishEvent(e,i,o)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Pl,H,Qe=f(()=>{"use strict";So();Q();ll();L();If();Ff();eh();ch();Xn();Pl=class extends ze{static{a(this,"StateStorage")}constructor(){super("state.json",gf)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,n,r){let s=Rr.getCurrentState(e,r),i=Rr.canTransition(s,n);if(!i.valid)throw new Error(`${i.error}. ${i.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async bumpTurnCount(e){let n={count:0,task:null};return await this.update(e,r=>{if(!r.currentTask)return r;let s=(r.currentTask.turnCount??0)+1,i={...r.currentTask,turnCount:s};return n.count=s,n.task=i,{...r,currentTask:i}}),n}async acknowledgeTurnLimit(e,n){let r={ok:!1};return await this.update(e,s=>s.currentTask?(r.ok=!0,{...s,currentTask:{...s.currentTask,turnLimitAcknowledgedAt:n}}):s),r.ok}async getPausedTasks(e){let n=await this.read(e);return this.getPausedTasksFromState(n)}async startTask(e,n){let r={};if(await this.update(e,i=>(this.validateTransition(i,"task"),r.currentTask={...n,startedAt:T()},{...i,currentTask:r.currentTask,lastUpdated:T()})),!r.currentTask)throw new Error("Failed to start task");let s=r.currentTask;return this.mirrorTaskRow(e,s,"in_progress"),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}mirrorTaskRow(e,n,r,s={}){try{y.run(e,`INSERT INTO tasks (id, description, type, status, branch, linked_spec_id, session_id, feature_id, started_at, completed_at, paused_at, pause_reason)
|
|
1326
1326
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1327
1327
|
ON CONFLICT(id) DO UPDATE SET
|
|
1328
1328
|
description = excluded.description,
|
|
@@ -1372,7 +1372,7 @@ Install denied (strict pack). Verify packages before adding them.`,decision:n}}f
|
|
|
1372
1372
|
query_text = COALESCE(memory_surface_log.query_text, excluded.query_text),
|
|
1373
1373
|
surface = COALESCE(memory_surface_log.surface, excluded.surface)`,c,n,r,i,o)}catch{}},penalizeSurfaced(t,e,n=new Date().toISOString()){if(!e)return 0;try{let r=y.query(t,"SELECT memory_id FROM memory_surface_log WHERE task_id = ?",e);for(let s of r)Wo(t,s.memory_id,gC,n);return r.length}catch{return 0}},penalizeSkillMiss(t,e,n=new Date().toISOString()){try{Wo(t,e,fC,n)}catch{}},creditShippedTask(t,e,n=new Date().toISOString()){if(!e)return 0;try{let r=y.query(t,"SELECT memory_id, query_text, surface FROM memory_surface_log WHERE task_id = ?",e);for(let s of r){Wo(t,s.memory_id,pC,n);let i=s.query_text?.trim();i&&y.run(t,`INSERT OR IGNORE INTO retrieval_eval_labels
|
|
1374
1374
|
(query_text, positive_id, source, source_task_id, created_at, metadata)
|
|
1375
|
-
VALUES (?, ?, ?, ?, ?, ?)`,i,s.memory_id,"ship-surfaced",e,n,JSON.stringify({surface:s.surface??"unknown"}))}return y.run(t,"DELETE FROM memory_surface_log WHERE task_id = ?",e),r.length}catch{return 0}},decayedScores(t,e=Date.now()){let
|
|
1375
|
+
VALUES (?, ?, ?, ?, ?, ?)`,i,s.memory_id,"ship-surfaced",e,n,JSON.stringify({surface:s.surface??"unknown"}))}return y.run(t,"DELETE FROM memory_surface_log WHERE task_id = ?",e),r.length}catch{return 0}},decayedScores(t,e=Date.now(),n){let r=new Map,s;try{if(n&&n.length>0){let i=[...new Set(n)].slice(0,200),o=i.map(()=>"?").join(",");s=y.query(t,`SELECT memory_id, score, last_used_at FROM memory_usefulness WHERE memory_id IN (${o})`,...i)}else{if(n&&n.length===0)return r;s=y.query(t,"SELECT memory_id, score, last_used_at FROM memory_usefulness")}}catch{return r}for(let i of s){let o=Date.parse(i.last_used_at),c=Number.isNaN(o)?1:.5**(Math.max(0,e-o)/hC/lC);r.set(i.memory_id,i.score*c)}return r},rerank(t,e,n=Date.now()){if(e.length<2)return e;let r;try{r=this.decayedScores(t,n,e.map(l=>l.id))}catch{return e}if(r.size===0)return e;let s=Math.max(1,...r.values()),i=4,o=e.length,c=e.map((l,u)=>{let d=(r.get(l.id)??0)/s;return{entry:l,i:u,rankScore:o-u+i*d}});return c.sort((l,u)=>u.rankScore-l.rankScore||l.i-u.i),c.map(l=>l.entry)}}});var pu={};P(pu,{AUTO_SOURCE_PREFIXES:()=>gy,DEFAULT_ARCHIVE_PRUNE_DAYS:()=>my,DEFAULT_AUTO_SOURCE_MAX_LIVE:()=>lu,DEFAULT_SOFT_DELETED_PURGE_DAYS:()=>Br,isAutoSource:()=>Yt,purgeOrphanRememberEvents:()=>Xo,purgeSoftDeleted:()=>Go,runVaultPurge:()=>du,trimAutoSourceCap:()=>ei,vaultHealth:()=>uu});function Yt(t){return t?gy.some(e=>t===e||t.startsWith(`${e}-`)||t.startsWith(e)):!1}function Go(t,e=Br,n=500){let r=Date.now()-e*864e5;try{let s=y.query(t,`SELECT id FROM memory_entries
|
|
1376
1376
|
WHERE deleted_at IS NOT NULL AND deleted_at < ?
|
|
1377
1377
|
ORDER BY deleted_at ASC
|
|
1378
1378
|
LIMIT ?`,r,n);return s.length===0?0:(y.transaction(t,i=>{let o=i.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),c=i.prepare("DELETE FROM memory_entries WHERE id = ?");for(let l of s){try{o.run(l.id)}catch{}c.run(l.id)}}),s.length)}catch{return 0}}function Xo(t,e=Br,n=500){let r=new Date(Date.now()-e*864e5).toISOString();try{let s=y.query(t,`SELECT e.id FROM events e
|
|
@@ -1431,7 +1431,7 @@ ${i.join(`
|
|
|
1431
1431
|
ORDER BY s.shipped_at DESC`,e);return[...n,...r.map(jo)]}catch{return[]}},allEntriesForIndex(t){try{let e=vn(t,"ORDER BY created_at DESC, rowid DESC"),n=y.query(t,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e,...n.map(jo)]}catch{return[]}}}});var Fy={};P(Fy,{FILE_INVENTORY_DOC_KEY:()=>_u,buildFileInventory:()=>jy,formatInventorySummary:()=>Ru,inventoryExtensions:()=>zo,inventoryPathWeight:()=>xu,languagesFromExtensions:()=>My,loadFileInventory:()=>Yo,pathMatchesInventory:()=>oi,refreshFileInventory:()=>gN,saveFileInventory:()=>$y});import ii from"node:path";async function jy(t,e={}){let n=await Rt(t,{skipDotfiles:!0,maxFiles:e.maxFiles??5e4}),r=Object.create(null),s=0;for(let o of n){if(Ly.test(o))continue;let c=ii.basename(o);if(Dy.test(c))continue;let l=ii.extname(c).toLowerCase();!l||l==="."||Oy.has(l)||(r[l]=(r[l]??0)+1,s++)}let i=My(r);return{extensions:r,languages:i,fileCount:s,builtAt:new Date().toISOString(),projectHint:ii.basename(t)}}function My(t){let e=new Set,n=Object.entries(t).sort((r,s)=>s[1]-r[1]);for(let[r]of n){let s=mN[r];s&&e.add(s)}return[...e]}function $y(t,e){E.setDoc(t,_u,e)}function Yo(t){try{return E.getDoc(t,_u)}catch{return null}}async function gN(t,e){let n=await jy(e);return $y(t,n),n}function zo(t){let e=Yo(t);return e?.extensions?new Set(Object.keys(e.extensions).map(n=>n.toLowerCase())):new Set}function oi(t,e,n={}){let r=e.replace(/^\.\//,"").replace(/\\/g,"/").trim();if(!r||Ly.test(r))return!1;let s=r.split("/").pop()??r;if(Dy.test(s))return!1;let i=ii.extname(s).toLowerCase();return i?!Oy.has(i):r.includes("/")}function xu(t,e){let n=e.replace(/^\.\//,"").replace(/\\/g,"/").trim(),r=n.split("/").pop()??n,s=ii.extname(r).toLowerCase();if(!s)return .7;let i=zo(t);return i.size===0||i.has(s)?1:.45}function Ru(t){if(!t||Object.keys(t.extensions).length===0)return"File inventory: empty \u2014 run `prjct sync` to discover languages/extensions.";let e=Object.entries(t.extensions).sort((r,s)=>s[1]-r[1]).slice(0,12).map(([r,s])=>`${r}\xD7${s}`).join(" "),n=t.languages.length>0?t.languages.join(", "):"unknown";return`File inventory: ${t.fileCount} files \xB7 langs: ${n} \xB7 ${e}`}var _u,Dy,Ly,Oy,mN,Au=f(()=>{"use strict";L();re();_u="file-inventory",Dy=/^(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|composer\.lock|Cargo\.lock|poetry\.lock|CHANGELOG(\.md)?|LICENSE(\.md)?|\.DS_Store)$/i,Ly=/(^|\/)(node_modules|dist|build|\.git|coverage|\.next|target|vendor)(\/|$)/i,Oy=new Set([".png",".jpg",".jpeg",".gif",".webp",".ico",".woff",".woff2",".ttf",".eot",".mp4",".mp3",".zip",".gz",".tar",".wasm",".exe",".dll",".so",".dylib",".bin",".pdf",".ico"]),mN={".ts":"TypeScript",".tsx":"TypeScript",".js":"JavaScript",".jsx":"JavaScript",".mjs":"JavaScript",".cjs":"JavaScript",".vue":"Vue",".svelte":"Svelte",".py":"Python",".go":"Go",".rs":"Rust",".java":"Java",".kt":"Kotlin",".kts":"Kotlin",".swift":"Swift",".rb":"Ruby",".php":"PHP",".cs":"C#",".fs":"F#",".cpp":"C++",".cc":"C++",".c":"C",".h":"C/C++",".hpp":"C++",".m":"Objective-C",".mm":"Objective-C++",".scala":"Scala",".clj":"Clojure",".ex":"Elixir",".exs":"Elixir",".erl":"Erlang",".hs":"Haskell",".lua":"Lua",".r":"R",".dart":"Dart",".sql":"SQL",".graphql":"GraphQL",".gql":"GraphQL",".proto":"Protobuf",".md":"Markdown",".mdx":"MDX",".json":"JSON",".yml":"YAML",".yaml":"YAML",".toml":"TOML",".css":"CSS",".scss":"SCSS",".sass":"Sass",".less":"Less",".html":"HTML",".htm":"HTML",".sh":"Shell",".bash":"Shell",".zsh":"Shell",".ps1":"PowerShell",".swiftui":"Swift"};a(jy,"buildFileInventory");a(My,"languagesFromExtensions");a($y,"saveFileInventory");a(Yo,"loadFileInventory");a(gN,"refreshFileInventory");a(zo,"inventoryExtensions");a(oi,"pathMatchesInventory");a(xu,"inventoryPathWeight");a(Ru,"formatInventorySummary")});function Uy(t,e,n=8){let r=e.map(m=>m.trim()).filter(Boolean),s=!!Ye(t),i=!!pt(t),o=new Map;if(r.length>0&&s)try{for(let m of vr(r,Ye(t),2)){if(r.some(h=>h.endsWith(m.path)||m.path.endsWith(h)))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 Fn(r,pt(t))){if(r.some(h=>h.endsWith(m.path)||m.path.endsWith(h)))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=M.recallForFile(t,m,2,{preventiveOnly:!0});for(let h of g)l.push({id:h.id,type:h.type,title:h.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 Hy=f(()=>{"use strict";br();$n();Te();a(Uy,"breakImpact")});var Cu={};P(Cu,{enrichedRecall:()=>Qo});async function Qo(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=M.searchFts(e,l,o);s&&(u=u.filter(d=>s.includes(d.type))),i&&(u=u.filter(d=>Js(d,i))),c=u}catch{c=[]}}if(c.length===0){let l=new Set(c.map(d=>d.id)),u=M.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 F.readConfig(t);if(l&&vu.isEnabled(l)){let u=await vu.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=>Js(m,i))),c=[...p,...c].slice(0,o)}}}catch{}if(c=c.filter(l=>Dt(l)||(s?.includes(l.type)??!1)),!s?.includes("improvement-signal"))try{let{isAutoSource:l}=await Promise.resolve().then(()=>(Gr(),pu)),u=45*864e5,d=Date.now(),p=c.filter(h=>{if(!l(h.tags?.source)||fN.has(h.type)&&!l(h.tags?.source))return!0;let w=Date.parse(h.rememberedAt);return Number.isFinite(w)?d-w<u:!0}),m=p.filter(h=>!l(h.tags?.source)),g=p.filter(h=>l(h.tags?.source));c=[...m,...g].slice(0,Math.max(o,p.length))}catch{}if(c.length>1&&(c=Lt.rerank(e,c)),n.expandLinks!==!1&&c.length>0){let l=M.expandWithLinks(e,c,5);l.length>0&&(c=c.concat(l))}try{let l=await H.getCurrentTask(e),u=new Date().toISOString();l?.id&&Lt.recordSurfaced(e,c.map(d=>d.id),l.id,u,{queryText:r,surface:"context-memory"});for(let d of c)Lt.recordFetch(e,d.id,u)}catch{}return c}var fN,Zo=f(()=>{"use strict";Ce();bu();Sn();Qe();Tn();Te();fN=new Set(["decision","gotcha","learning","fact","feedback","spec"]);a(Qo,"enrichedRecall")});var Du={};P(Du,{extractFilePathsFromEntries:()=>Iu,formatWorkScopeBlock:()=>Ky,isUsefulScopePath:()=>EN,resolveWorkScope:()=>hN,resolveWorkScopeSync:()=>Nu,toLikelyFileHits:()=>Pu});function Nu(t,e,n=By){let r=e.trim();if(!r)return Jy();let s=Xy(t,r);return Gy(t,r,s,n)}async function hN(t,e,n,r=By){let s=n.trim();if(!s)return Jy();let i=new Set(Xy(e,s));try{let{enrichedRecall:o}=await Promise.resolve().then(()=>(Zo(),Cu)),c=await o(t,e,{topic:s,types:["context","decision","gotcha","anti-pattern","learning"],limit:12});for(let l of Iu(c,e))i.add(l)}catch{}return Gy(e,s,i,r)}function Gy(t,e,n,r){let s=Lh(t),i=new Map,o=Yo(t),c=zo(t),l=a((g,h,w,v)=>{if(!oi(t,g))return;let N=h*xu(t,g),B=i.get(g);if(!B){i.set(g,{path:g,score:N,signals:[w],reason:v});return}B.score+=N,B.signals.includes(w)||B.signals.push(w),N>=.4&&(B.reason=v)},"bump");for(let g of n)l(g,yN(g,c),"memory","linked from project judgment memory (decision/gotcha/context)");let u=0;if(s.bm25)try{let g=Dh(t,e,{topN:Math.max(r*2,12)});u=g.length;for(let h of g){let w=[h.signals.bm25>0?"bm25":null,h.signals.imports>0?"imports":null,h.signals.cochange>0?"cochange":null].filter(N=>N!==null),v=h.signals.bm25>=h.signals.imports&&h.signals.bm25>=h.signals.cochange?"matches task terms in code index (BM25)":h.signals.imports>=h.signals.cochange?"import-graph neighbor of matched files":"historically co-changes with matched files";l(h.path,h.finalScore,w[0]??"bm25",v);for(let N of w.slice(1)){let B=i.get(h.path);B&&!B.signals.includes(N)&&B.signals.push(N)}}}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=Uy(t,p,r);for(let h of g.neighbors)d++,l(h.path,.35*Math.min(1,h.score+.1),h.via==="both"?"imports":h.via,h.via==="cochange"?"historically co-changes with seed files":"import-graph neighbor of seed files")}catch{}let m=[...i.values()].sort((g,h)=>h.score-g.score).slice(0,r);return{files:m,indexesReady:s.bm25||s.imports||s.cochange,sources:{memorySeeds:n.size,indexHits:u,graphNeighbors:d},agentBlock:Ky(m,{indexesReady:s.bm25||s.imports||s.cochange,memorySeeds:n.size,inventoryLine:Ru(o)})}}function Xy(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=M.searchFts(t,r,15)}catch{s=[]}s.length===0&&(s=M.recall(t,{types:["gotcha","decision","anti-pattern","context"],limit:20}));for(let i of Iu(s,t))n.add(i)}catch{}return n}function Iu(t,e){let n=new Set,r=a(s=>{let i=qy(s);i&&(e?oi(e,i)&&n.add(i):Vy(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??"";Wy.lastIndex=0;let l;for(;(l=Wy.exec(c))!==null;)r(l[1])}return[...n]}function qy(t){return t.replace(/^\.\//,"").replace(/\\/g,"/")}function Vy(t){let e=qy(t).trim();return!e||e.length<3?!1:e.includes("/")&&e.includes(".")}function yN(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 Jy(){return{files:[],indexesReady:!1,sources:{memorySeeds:0,indexHits:0,graphNeighbors:0},agentBlock:""}}function Ky(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(`
|
|
1432
1432
|
`):["**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(`
|
|
1433
1433
|
`);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(`
|
|
1434
|
-
`)}function Pu(t){return t.map(({path:e,signals:n,reason:r})=>({path:e,signals:n,reason:r}))}function EN(t,e){return e?oi(e,t):Vy(t)}var By,Wy,ea=f(()=>{"use strict";Oh();Te();Au();Hy();By=8,Wy=/(?:^|[\s`"'(])((?:@?[\w.-]+\/)+[\w.-]+\.[\w.-]+)(?:$|[\s`"'),;:])/g;a(Nu,"resolveWorkScopeSync");a(hN,"resolveWorkScope");a(Gy,"mergeScope");a(Xy,"memoryFileSeedsSync");a(Iu,"extractFilePathsFromEntries");a(qy,"normalizePath");a(Vy,"looksLikeRepoPath");a(yN,"memorySeedWeight");a(Jy,"emptyResult");a(Ky,"formatWorkScopeBlock");a(Pu,"toLikelyFileHits");a(EN,"isUsefulScopePath")});var ta,kN,TN,zy=f(()=>{"use strict";ta=[{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 AI Agile 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 an AI Agile 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 AI Agile 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:"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:"AI Agile 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): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{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:"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:{},description:"Git-shareable project memory: `export` writes chunked JSONL to .prjct/memory-export/ (commit it); `import` replays a committed export with content-hash dedup \u2014 zero-server team onboarding.",usage:{claude:"p. memory export",terminal:"prjct memory export | prjct memory import"}},{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"],["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"}))],kN={"-h":"help","--help":"help","-v":"version","--version":"version"},TN=new Set([...ta.filter(t=>t.routingMode==="bin-only").map(t=>t.name),...Object.entries(kN).filter(([,t])=>ta.some(e=>e.name===t&&e.routingMode==="bin-only")).map(([t])=>t)])});var Qy,Zy=f(()=>{"use strict";zy();Qy=new Set(ta.filter(t=>t.routing).map(t=>t.name))});var eE={};P(eE,{getGitBranch:()=>zn,getModifiedFiles:()=>wN});async function zn(t){try{let{stdout:e}=await $("git branch --show-current",{cwd:t});return e.trim()||void 0}catch{return}}async function wN(t,e=20){try{let{stdout:n}=await $("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:t});return n.trim().split(`
|
|
1434
|
+
`)}function Pu(t){return t.map(({path:e,signals:n,reason:r})=>({path:e,signals:n,reason:r}))}function EN(t,e){return e?oi(e,t):Vy(t)}var By,Wy,ea=f(()=>{"use strict";Oh();Te();Au();Hy();By=8,Wy=/(?:^|[\s`"'(])((?:@?[\w.-]+\/)+[\w.-]+\.[\w.-]+)(?:$|[\s`"'),;:])/g;a(Nu,"resolveWorkScopeSync");a(hN,"resolveWorkScope");a(Gy,"mergeScope");a(Xy,"memoryFileSeedsSync");a(Iu,"extractFilePathsFromEntries");a(qy,"normalizePath");a(Vy,"looksLikeRepoPath");a(yN,"memorySeedWeight");a(Jy,"emptyResult");a(Ky,"formatWorkScopeBlock");a(Pu,"toLikelyFileHits");a(EN,"isUsefulScopePath")});var ta,kN,TN,zy=f(()=>{"use strict";ta=[{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 AI Agile 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 an AI Agile 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 AI Agile 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:"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:"AI Agile 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): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{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:"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:{},description:"Git-shareable project memory: `export` writes chunked JSONL to .prjct/memory-export/ (commit it); `import` replays a committed export with content-hash dedup \u2014 zero-server team onboarding.",usage:{claude:"p. memory export",terminal:"prjct memory export | prjct memory import"}},{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"}))],kN={"-h":"help","--help":"help","-v":"version","--version":"version"},TN=new Set([...ta.filter(t=>t.routingMode==="bin-only").map(t=>t.name),...Object.entries(kN).filter(([,t])=>ta.some(e=>e.name===t&&e.routingMode==="bin-only")).map(([t])=>t)])});var Qy,Zy=f(()=>{"use strict";zy();Qy=new Set(ta.filter(t=>t.routing).map(t=>t.name))});var eE={};P(eE,{getGitBranch:()=>zn,getModifiedFiles:()=>wN});async function zn(t){try{let{stdout:e}=await $("git branch --show-current",{cwd:t});return e.trim()||void 0}catch{return}}async function wN(t,e=20){try{let{stdout:n}=await $("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:t});return n.trim().split(`
|
|
1435
1435
|
`).filter(r=>r.length>0).slice(0,e)}catch{return[]}}var ai=f(()=>{"use strict";de();a(zn,"getGitBranch");a(wN,"getModifiedFiles")});function SN(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 tE(t,e){let n=ci(t,e.taskId,e.workspaceId),r=T(),s=n?.createdAt??r;return E.run(t,`INSERT INTO task_pipeline_state (
|
|
1436
1436
|
project_id, task_id, workspace_id, classification, station,
|
|
1437
1437
|
requires_spec, requires_tests_first, reason, linked_spec_id,
|