prjct-cli 2.23.16 → 2.23.18
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 +10 -0
- package/dist/bin/prjct-core.mjs +131 -131
- package/dist/daemon/entry.mjs +8 -8
- package/package.json +1 -1
package/dist/daemon/entry.mjs
CHANGED
|
@@ -717,9 +717,9 @@ ${s.body(e)}`}function Wb(){return process.env.HOME||Lb.homedir()}var Bc,Gc,vg,S
|
|
|
717
717
|
`).filter(d=>d.trim()).length),a){let d=a.stdout.trim().split(`
|
|
718
718
|
`).filter(Boolean);e.hasChanges=d.length>0;for(let p of d){let m=p.substring(0,2),g=p.substring(3);m.startsWith("A")||m.startsWith("M ")?e.stagedFiles.push(g):m.includes("M")?e.modifiedFiles.push(g):m.startsWith("??")&&e.untrackedFiles.push(g)}}return l&&(e.recentCommits=l.stdout.split(`
|
|
719
719
|
`).filter(Boolean).map(d=>{let[p,m,g]=d.split("|");return{hash:p,message:m,date:g}})),u&&(e.weeklyCommits=u.stdout.split(`
|
|
720
|
-
`).filter(d=>d.trim()).length),!r&&!o&&!a&&F.debug("Git analysis failed (not a git repo?)"),e}async function Et(s,e){let t=await C(el.join(s,e));return t||F.debug("File not found",{filename:e}),t}async function Qg(s){let e={fileCount:0,version:"0.0.0",name:el.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await nn(s,{skipDotfiles:!0});e.fileCount=n.filter(r=>t.some(o=>r.endsWith(o))).length}catch(t){F.debug("File count failed",{path:s,error:_e(t)}),e.fileCount=0}try{let t=el.join(s,"package.json"),n=await je(t);if(!n)throw new Error("No package.json found");e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript",n.devDependencies?.typescript||await Et(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){F.debug("No package.json found",{path:s,error:_e(t)})}return await Et(s,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Et(s,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Et(s,"requirements.txt")||await Et(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Zg(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Et(s,"bun.lockb")||await Et(s,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Et(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Et(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Et(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Et(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function ef(s){return new vi(s).detect()}var tf=h(()=>{"use strict";cn();Xg();He();X();Nt();Kg();c(Yg,"analyzeGit");c(Et,"fileExistsInProject");c(Qg,"gatherStats");c(Zg,"detectCommands");c(ef,"detectStack")});import nf from"node:fs/promises";import tl from"node:path";var sf,nl,rf,of=h(()=>{"use strict";st();U();He();sf={async jsonFilesValid(s){let e=Date.now(),t=[],n=tl.basename(s);try{await V.read(n)}catch(r){$(r)||t.push(`state: ${w(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=tl.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await nf.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await nf.readFile(tl.join(t,i),"utf-8");for(let l of n)if(l.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!$(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},nl=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[sf.jsonFilesValid(t),sf.noSensitiveData(t)];for(let m of l){let g=await m;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(y=>y.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&n?.checks)for(let m of n.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let y=n.checks.slice(n.checks.indexOf(m)+1);a+=y.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await N(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},rf=new nl});import{z as Si}from"zod";function aT(){let s=rt(af);if(!s)throw new Error(`Missing bundled crew checkpoints template: ${af}`);return s}var bi,af,iT,sl,cT,cf,lf=h(()=>{"use strict";Dn();te();ne();bi="crew:checkpoints",af="crew/CHECKPOINTS.md",iT=Si.object({content:Si.string(),source:Si.enum(["default","user","migrated"]),updated_at:Si.string().min(1)});c(aT,"getBundledDefault");sl=class{static{c(this,"CheckpointsStorage")}get(e){let t=E.getDoc(e,bi);return t===null?{content:aT(),source:"default",updated_at:v()}:iT.parse(t)}hasCustomization(e){return E.hasDoc(e,bi)}set(e,t,n="user"){let r={content:t,source:n,updated_at:v()};return E.setDoc(e,bi,r),r}reset(e){E.deleteDoc(e,bi)}},cT=new sl,cf=cT});var uf={};re(uf,{TEAM_ENROLLMENT_KEY:()=>Ti,TeamEnrollmentSchema:()=>rl,default:()=>Ci,serializeCanonical:()=>Ei,teamEnrollmentStorage:()=>Cs});import{z as xr}from"zod";function Ei(s){let e=Object.keys(s).sort(),t={};for(let n of e)t[n]=s[n];return JSON.stringify(t)}var Ti,rl,ol,Cs,Ci,Pi=h(()=>{"use strict";ne();Ti="team:enrollment",rl=xr.object({required:xr.boolean(),minVersion:xr.string().min(1),enrolledAt:xr.string().min(1),enrolledBy:xr.string().nullable().default(null)}),ol=class{static{c(this,"TeamEnrollmentStorage")}get(e){let t=E.getDoc(e,Ti);return t===null?null:rl.parse(t)}set(e,t){let n=rl.parse(t);E.setDoc(e,Ti,n)}clear(e){E.deleteDoc(e,Ti)}};c(Ei,"serializeCanonical");Cs=new ol,Ci=Cs});function Ar(s){let e=[];for(let{name:t,re:n}of df)n.test(s)&&e.push(t);return e}function pf(s){return s.replace(/[`*_[\](){}<>\\]/g,e=>`\\${e}`)}var df,j0,jr=h(()=>{"use strict";df=[{name:"instruction-override",re:/\b(ignore|disregard|override|forget)\b[^.]{0,40}\b(previous|prior|above|system|prompt|instructions?|rules?|constraints?)\b/i},{name:"role-play-injection",re:/\b(you\s+are\s+now|act\s+as|pretend\s+to\s+be|roleplay\s+as|assume\s+the\s+role)\b[^.]{0,40}\b(system|admin|root|developer|operator|jailbreak)\b/i},{name:"jailbreak-phrase",re:/\b(DAN\s+mode|do\s+anything\s+now|without\s+restrictions?|bypass\s+(?:safety|filters?|guidelines?)|jailbreak\s+mode)\b/i},{name:"fake-system-tag",re:/<\s*(?:system|assistant|tool[_-]?call|function[_-]?call)\s*>/i}],j0=df.map(s=>s.name);c(Ar,"scanForPromptInjection");c(pf,"escapeMarkdownInline")});var mf,il,_r,gf,Ps,Ri=h(()=>{"use strict";mf="memory.",il="remember.",_r=`${mf}${il}`,gf=`${mf}task.tagged`,Ps="status.changed"});var Ai={};re(Ai,{BASE_MEMORY_TYPES:()=>yf,MEMORY_TYPES:()=>Rs,deriveTitle:()=>xi,formatMemoryMd:()=>xs,linkifyMemRefs:()=>yn,projectMemory:()=>Le});function wf(s,e){try{return JSON.parse(s)}catch{return e}}function al(s){let e=s.type.slice(_r.length),t=wf(s.data,{});return{id:`mem_${s.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:s.timestamp,source:t.source,provenance:t.provenance??"declared"}}function ff(s){let e=s.data?wf(s.data,{}):{},t=e.tags??{};return s.type&&(t.type=s.type),{id:`ship_${s.id}`,type:"shipped",content:s.name,tags:t,rememberedAt:s.shipped_at,source:e.taskId,provenance:"extracted"}}function pT(s,e){let t=e.toLowerCase();if(s.content.toLowerCase().includes(t))return!0;for(let n of Object.values(s.tags))if(n.toLowerCase().includes(t))return!0;return!1}function mT(s,e){for(let[t,n]of Object.entries(e))if(s.tags[t]!==n)return!1;return!0}function gT(s){let e=new Set,t=[];for(let n of s){let r=n.tags.key;if(!r){t.push(n);continue}let o=`${n.type}::${r}`;e.has(o)||(e.add(o),t.push(n))}return t}function fT(s){return s.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function xi(s){let e=(s.content??"").trim();e=e.replace(/^(?:[-*•]\s+|\s+)+/,""),e=e.replace(/^(?:\[\[[^\]]*\]\]|mem[_-]\d+)[\s:,-]*/i,"").trim();let t=e.length;for(let o of[/\n/,/\.\s/,/:\s/,/;\s/,/\s—\s/,/\s\(/]){let i=e.match(o);i&&i.index!==void 0&&i.index>4&&i.index<t&&(t=i.index)}let n=e.slice(0,t).replace(/\s+/g," ").trim();if(n=n.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),n.length>hf){let o=n.slice(0,hf),i=o.lastIndexOf(" ");n=`${(i>40?o.slice(0,i):o).trim()}\u2026`}n.length<6&&(n=`${s.type} ${s.id}`);let r=s.tags?.pr;return r&&!new RegExp(`\\b#?${r}\\b`).test(n)&&(n=`${n} (PR #${r})`),n}function yn(s,e){return s.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,n)=>{let r=`mem_${n}`,o=e?.idTypeIndex?.get(r),i=e?.idTitleIndex?.get(r),a=e?.idSlugIndex?.get(r),l=i?fT(i):r;return a&&o&&e?.perEntryTypes?.has(o)?`[[${a}|${l}]]`:o?`[[${o}#^mem-${n}|${l}]]`:i?`[[${r}|${l}]]`:`\`${r}\``})}function xs(s,e){if(s.length===0)return"> No matching memory entries.";let t=new Map;for(let u of s){let d=t.get(u.type)??[];d.push(u),t.set(u.type,d)}let n=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],r=[],o={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=e?.boundary==="llm",a=c((u,d)=>{if(d.length!==0){r.push(`### ${u.toUpperCase()}`);for(let p of d){let m=Object.entries(p.tags).map(([T,D])=>`${T}=${i?pf(D):D}`).join(" "),g=o[p.provenance],y=e?.vault?yn(p.content,e):p.content,b=m?` _(${e?.vault?yn(m,e):m})_`:"",P=p.id.replace(/^mem[_-]/,""),k=e?.vault?` ^mem-${P}`:"",x=`- \`${g}\` [${p.id} \xB7 ${p.type}] ${y}${b}${k}`;i?(r.push(`<user_content id="${p.id}" type="${p.type}">`),r.push(x),r.push("</user_content>")):r.push(x)}r.push("")}},"renderGroup"),l=new Set;for(let u of n){let d=t.get(u);!d||d.length===0||(a(u,d),l.add(u))}for(let[u,d]of t)l.has(u)||a(u,d);return r.join(`
|
|
720
|
+
`).filter(d=>d.trim()).length),!r&&!o&&!a&&F.debug("Git analysis failed (not a git repo?)"),e}async function Et(s,e){let t=await C(el.join(s,e));return t||F.debug("File not found",{filename:e}),t}async function Qg(s){let e={fileCount:0,version:"0.0.0",name:el.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await nn(s,{skipDotfiles:!0});e.fileCount=n.filter(r=>t.some(o=>r.endsWith(o))).length}catch(t){F.debug("File count failed",{path:s,error:_e(t)}),e.fileCount=0}try{let t=el.join(s,"package.json"),n=await je(t);if(!n)throw new Error("No package.json found");e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript",n.devDependencies?.typescript||await Et(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){F.debug("No package.json found",{path:s,error:_e(t)})}return await Et(s,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Et(s,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Et(s,"requirements.txt")||await Et(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Zg(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Et(s,"bun.lockb")||await Et(s,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Et(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Et(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Et(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Et(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function ef(s){return new vi(s).detect()}var tf=h(()=>{"use strict";cn();Xg();He();X();Nt();Kg();c(Yg,"analyzeGit");c(Et,"fileExistsInProject");c(Qg,"gatherStats");c(Zg,"detectCommands");c(ef,"detectStack")});import nf from"node:fs/promises";import tl from"node:path";var sf,nl,rf,of=h(()=>{"use strict";st();U();He();sf={async jsonFilesValid(s){let e=Date.now(),t=[],n=tl.basename(s);try{await V.read(n)}catch(r){$(r)||t.push(`state: ${w(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=tl.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await nf.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await nf.readFile(tl.join(t,i),"utf-8");for(let l of n)if(l.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!$(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},nl=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[sf.jsonFilesValid(t),sf.noSensitiveData(t)];for(let m of l){let g=await m;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(y=>y.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&n?.checks)for(let m of n.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let y=n.checks.slice(n.checks.indexOf(m)+1);a+=y.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await N(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},rf=new nl});import{z as Si}from"zod";function aT(){let s=rt(af);if(!s)throw new Error(`Missing bundled crew checkpoints template: ${af}`);return s}var bi,af,iT,sl,cT,cf,lf=h(()=>{"use strict";Dn();te();ne();bi="crew:checkpoints",af="crew/CHECKPOINTS.md",iT=Si.object({content:Si.string(),source:Si.enum(["default","user","migrated"]),updated_at:Si.string().min(1)});c(aT,"getBundledDefault");sl=class{static{c(this,"CheckpointsStorage")}get(e){let t=E.getDoc(e,bi);return t===null?{content:aT(),source:"default",updated_at:v()}:iT.parse(t)}hasCustomization(e){return E.hasDoc(e,bi)}set(e,t,n="user"){let r={content:t,source:n,updated_at:v()};return E.setDoc(e,bi,r),r}reset(e){E.deleteDoc(e,bi)}},cT=new sl,cf=cT});var uf={};re(uf,{TEAM_ENROLLMENT_KEY:()=>Ti,TeamEnrollmentSchema:()=>rl,default:()=>Ci,serializeCanonical:()=>Ei,teamEnrollmentStorage:()=>Cs});import{z as xr}from"zod";function Ei(s){let e=Object.keys(s).sort(),t={};for(let n of e)t[n]=s[n];return JSON.stringify(t)}var Ti,rl,ol,Cs,Ci,Pi=h(()=>{"use strict";ne();Ti="team:enrollment",rl=xr.object({required:xr.boolean(),minVersion:xr.string().min(1),enrolledAt:xr.string().min(1),enrolledBy:xr.string().nullable().default(null)}),ol=class{static{c(this,"TeamEnrollmentStorage")}get(e){let t=E.getDoc(e,Ti);return t===null?null:rl.parse(t)}set(e,t){let n=rl.parse(t);E.setDoc(e,Ti,n)}clear(e){E.deleteDoc(e,Ti)}};c(Ei,"serializeCanonical");Cs=new ol,Ci=Cs});function Ar(s){let e=[];for(let{name:t,re:n}of df)n.test(s)&&e.push(t);return e}function pf(s){return s.replace(/[`*_[\](){}<>\\]/g,e=>`\\${e}`)}var df,A0,jr=h(()=>{"use strict";df=[{name:"instruction-override",re:/\b(ignore|disregard|override|forget)\b[^.]{0,40}\b(previous|prior|above|system|prompt|instructions?|rules?|constraints?)\b/i},{name:"role-play-injection",re:/\b(you\s+are\s+now|act\s+as|pretend\s+to\s+be|roleplay\s+as|assume\s+the\s+role)\b[^.]{0,40}\b(system|admin|root|developer|operator|jailbreak)\b/i},{name:"jailbreak-phrase",re:/\b(DAN\s+mode|do\s+anything\s+now|without\s+restrictions?|bypass\s+(?:safety|filters?|guidelines?)|jailbreak\s+mode)\b/i},{name:"fake-system-tag",re:/<\s*(?:system|assistant|tool[_-]?call|function[_-]?call)\s*>/i}],A0=df.map(s=>s.name);c(Ar,"scanForPromptInjection");c(pf,"escapeMarkdownInline")});var mf,il,_r,gf,Ps,Ri=h(()=>{"use strict";mf="memory.",il="remember.",_r=`${mf}${il}`,gf=`${mf}task.tagged`,Ps="status.changed"});var Ai={};re(Ai,{BASE_MEMORY_TYPES:()=>yf,MEMORY_TYPES:()=>Rs,deriveTitle:()=>xi,formatMemoryMd:()=>xs,linkifyMemRefs:()=>yn,projectMemory:()=>Le});function wf(s,e){try{return JSON.parse(s)}catch{return e}}function al(s){let e=s.type.slice(_r.length),t=wf(s.data,{});return{id:`mem_${s.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:s.timestamp,source:t.source,provenance:t.provenance??"declared"}}function ff(s){let e=s.data?wf(s.data,{}):{},t=e.tags??{};return s.type&&(t.type=s.type),{id:`ship_${s.id}`,type:"shipped",content:s.name,tags:t,rememberedAt:s.shipped_at,source:e.taskId,provenance:"extracted"}}function pT(s,e){let t=e.toLowerCase();if(s.content.toLowerCase().includes(t))return!0;for(let n of Object.values(s.tags))if(n.toLowerCase().includes(t))return!0;return!1}function mT(s,e){for(let[t,n]of Object.entries(e))if(s.tags[t]!==n)return!1;return!0}function gT(s){let e=new Set,t=[];for(let n of s){let r=n.tags.key;if(!r){t.push(n);continue}let o=`${n.type}::${r}`;e.has(o)||(e.add(o),t.push(n))}return t}function fT(s){return s.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function xi(s){let e=(s.content??"").trim();e=e.replace(/^(?:[-*•]\s+|\s+)+/,""),e=e.replace(/^(?:\[\[[^\]]*\]\]|mem[_-]\d+)[\s:,-]*/i,"").trim();let t=e.length;for(let o of[/\n/,/\.\s/,/:\s/,/;\s/,/\s—\s/,/\s\(/]){let i=e.match(o);i&&i.index!==void 0&&i.index>4&&i.index<t&&(t=i.index)}let n=e.slice(0,t).replace(/\s+/g," ").trim();if(n=n.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),n.length>hf){let o=n.slice(0,hf),i=o.lastIndexOf(" ");n=`${(i>40?o.slice(0,i):o).trim()}\u2026`}n.length<6&&(n=`${s.type} ${s.id}`);let r=s.tags?.pr;return r&&!new RegExp(`\\b#?${r}\\b`).test(n)&&(n=`${n} (PR #${r})`),n}function yn(s,e){return s.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,n)=>{let r=`mem_${n}`,o=e?.idTypeIndex?.get(r),i=e?.idTitleIndex?.get(r),a=e?.idSlugIndex?.get(r),l=i?fT(i):r;return a&&o&&e?.perEntryTypes?.has(o)?`[[${a}|${l}]]`:o?`[[${o}#^mem-${n}|${l}]]`:i?`[[${r}|${l}]]`:`\`${r}\``})}function xs(s,e){if(s.length===0)return"> No matching memory entries.";let t=new Map;for(let u of s){let d=t.get(u.type)??[];d.push(u),t.set(u.type,d)}let n=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],r=[],o={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=e?.boundary==="llm",a=c((u,d)=>{if(d.length!==0){r.push(`### ${u.toUpperCase()}`);for(let p of d){let m=Object.entries(p.tags).map(([T,D])=>`${T}=${i?pf(D):D}`).join(" "),g=o[p.provenance],y=e?.vault?yn(p.content,e):p.content,b=m?` _(${e?.vault?yn(m,e):m})_`:"",P=p.id.replace(/^mem[_-]/,""),k=e?.vault?` ^mem-${P}`:"",x=`- \`${g}\` [${p.id} \xB7 ${p.type}] ${y}${b}${k}`;i?(r.push(`<user_content id="${p.id}" type="${p.type}">`),r.push(x),r.push("</user_content>")):r.push(x)}r.push("")}},"renderGroup"),l=new Set;for(let u of n){let d=t.get(u);!d||d.length===0||(a(u,d),l.add(u))}for(let[u,d]of t)l.has(u)||a(u,d);return r.join(`
|
|
721
721
|
`).trim()}var yf,Rs,lT,uT,dT,Le,hf,Ye=h(()=>{"use strict";Un();ne();jr();Ri();yf=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],Rs=yf,lT=25,uT=4,dT=100;c(wf,"safeJson");c(al,"rowToEntry");c(ff,"shippedRowToEntry");c(pT,"matchesTopic");c(mT,"matchesTags");c(gT,"dedupeLatestByKey");Le={async remember(s,e){await Ke.log(s,`${il}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"});try{let{default:t}=await Promise.resolve().then(()=>(Pe(),ps)),r=(await t.readConfig(s))?.projectId;if(!r)return;let{publishCRUD:o}=await Promise.resolve().then(()=>(Sr(),bp)),i=e.tags?.spec_id??e.tags?.task_id??e.tags?.id??e.source??`mem-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await o({projectId:r,entityType:"memories",entityId:i,eventType:"upsert",data:{id:i,type:e.type,content:e.content,tags:e.tags??{},source:e.source??null,provenance:e.provenance??"declared",rememberedAt:new Date().toISOString()}})}catch{}},recall(s,e={}){let t=e.limit??lT,n=Math.max(t*uT,dT),r=E.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${_r}%`,n),o=E.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",n),i=[...r.map(al),...o.map(ff)];if(e.types&&e.types.length>0){let a=new Set(e.types);i=i.filter(l=>a.has(l.type))}return e.tags&&(i=i.filter(a=>mT(a,e.tags??{}))),e.topic&&(i=i.filter(a=>pT(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),e.dedupeByKey!==!1&&(i=gT(i)),i.slice(0,t)},getById(s,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;let n=Number(t[1]);try{let r=E.get(s,"SELECT id, type, data, timestamp FROM events WHERE id = ? AND type LIKE ?",n,`${_r}%`);return r?al(r):null}catch{return null}},allEntriesForIndex(s){try{let e=E.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC",`${_r}%`),t=E.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e.map(al),...t.map(ff)]}catch{return[]}},similar(s,e,t=10){let n=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return n.length===0?[]:Le.recall(s,{limit:200}).map(i=>{let a=`${i.content} ${Object.values(i.tags).join(" ")}`.toLowerCase(),l=n.reduce((u,d)=>a.includes(d)?u+1:u,0);return{entry:i,hits:l}}).filter(i=>i.hits>0).sort((i,a)=>a.hits-i.hits).slice(0,t).map(i=>i.entry)}},hf=72;c(fT,"linkLabel");c(xi,"deriveTitle");c(yn,"linkifyMemRefs");c(xs,"formatMemoryMd")});var Ef={};re(Ef,{legacyCrewSweep:()=>kT});import kf from"node:fs/promises";import vf from"node:path";function hT(s){let e={required:s.required,minVersion:s.minVersion,enrolledAt:s.enrolledAt};return s.enrolledBy!==null&&(e.enrolledBy=s.enrolledBy),`${JSON.stringify(e,null,2)}
|
|
722
|
-
`}async function Sf(s){try{return(await kf.stat(s)).mtimeMs}catch{return null}}async function bf(s){try{return await kf.readFile(s,"utf-8")}catch{return null}}function Tf(s,e){return E.getDoc(s,e)}function _i(s,e,t){E.setDoc(s,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function $i(s,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>(Ye(),Ai));await n.remember(s,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){F.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function yT(s,e,t){let n=vf.join(s,$r),r=await Sf(n);if(r===null)return;let o=Tf(e,cl);if(o===null){let i=await bf(n);if(i===null){t.errors.push({file:$r,reason:"read failed"});return}try{cf.set(e,i,"migrated"),_i(e,cl,r),t.checkpointsMigrated=!0,await $i(s,"Legacy .prjct/CHECKPOINTS.md migrated into kv_store crew:checkpoints. Manage with 'prjct crew checkpoints show|set|reset|export'. Original file left in place (not authoritative).",{"migration:v2.19.8":"1",topic:"crew-checkpoints"})}catch(a){t.errors.push({file:$r,reason:a instanceof Error?a.message:String(a)})}return}r>o.mtime_ms&&(await $i(s,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${$r}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),_i(e,cl,r),t.checkpointsHandEditWarned=!0)}async function wT(s,e,t){let n=vf.join(s,ji),r=await Sf(n);if(r===null)return;let o=Tf(e,ll),i=Ci.get(e);if(o===null){let a=await bf(n);if(a===null){t.errors.push({file:ji,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(a),u={required:l.required===!0,minVersion:typeof l.minVersion=="string"?l.minVersion:"0.0.0",enrolledAt:typeof l.enrolledAt=="string"?l.enrolledAt:new Date().toISOString(),enrolledBy:typeof l.enrolledBy=="string"?l.enrolledBy:null};Ci.set(e,u),await is(n,hT(u)),t.teamMigrated=!0,await $i(s,"Legacy .prjct/team.json adopted into kv_store team:enrollment. The disk file is now a derived mirror \u2014 do not hand-edit; run 'prjct team check' to detect drift.",{"migration:v2.19.8":"1",topic:"team-enrollment"})}_i(e,ll,r)}catch(l){t.errors.push({file:ji,reason:l instanceof Error?l.message:String(l)})}return}r>o.mtime_ms&&(await $i(s,".prjct/team.json hand-edited after migration \u2014 your edit was NOT applied (file is a derived mirror). Run 'prjct team check' to rewrite the mirror from DB, or 'prjct team' to re-enroll with new values.",{"migration:v2.19.8":"1",topic:"team-enrollment",state:"hand-edited"}),_i(e,ll,r),t.teamHandEditWarned=!0)}async function kT(s,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await yT(s,e,t).catch(n=>{t.errors.push({file:$r,reason:n instanceof Error?n.message:String(n)})}),await wT(s,e,t).catch(n=>{t.errors.push({file:ji,reason:n instanceof Error?n.message:String(n)})}),t}var $r,ji,cl,ll,Cf=h(()=>{"use strict";lf();ne();Pi();X();Nt();$r=".prjct/CHECKPOINTS.md",ji=".prjct/team.json",cl="migration:v2.19.8:last-flagged-checkpoints",ll="migration:v2.19.8:last-flagged-team";c(hT,"renderMirror");c(Sf,"statMtimeMs");c(bf,"tryReadFile");c(Tf,"readFlag");c(_i,"writeFlag");c($i,"captureInboxWarning");c(yT,"sweepCheckpoints");c(wT,"sweepTeamJson");c(kT,"legacyCrewSweep")});import vT from"node:fs/promises";import Pf from"node:path";function ul(s,e){let t,n=new Promise((r,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${Rf}ms`)),Rf)});return Promise.race([s,n]).finally(()=>{t&&clearTimeout(t)})}async function at(s,e){let t=Date.now();F.debug("sync phase start",{phase:s});try{let n=await e();return F.debug("sync phase done",{phase:s,ms:Date.now()-t}),n}catch(n){throw F.debug("sync phase failed",{phase:s,ms:Date.now()-t,error:_e(n)}),n}}var Rf,dl,As,pl=h(()=>{"use strict";kc();jo();Sc();Yo();cn();tt();Ft();Pe();ge();ii();gn();ai();fs();Nc();Fn();Ts();st();pg();X();Nt();Jo();Sg();bg();jg();Ug();qg();tf();of();Rf=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(ul,"withTimeout");c(at,"phase");dl=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await B.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:mi(),stats:gi(),commands:fi(),stack:hi(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await vT.rm(Pf.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await An()).installed){let O=await oi({autoRepair:!0});O.verified||F.warn(`Codex p. router not ready: ${O.message||"verification failed"}`)}await at("mcp-defaults",()=>qo({silent:!0,verifyContext7:!1}));try{r=await at("context7",()=>Mn.ensureReady())}catch(O){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:mi(),stats:gi(),commands:fi(),stack:hi(),context7:{installed:r.installed,verified:!1,message:_e(O)},error:`Context7 MCP is required but not ready: ${_e(O)}. Run 'prjct start' to repair.`}}await Bg(this.globalPath),process.env.PRJCT_SKIP_JSON_MIGRATION==="1"||(await at("migrate",()=>ul(di(this.projectId),"migrate")),await at("sweep",async()=>{try{let O=await pi(this.projectId);O>0&&F.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){F.debug("Legacy JSON sweep failed (non-critical)",{error:_e(O)})}})),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await at("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:O}=await Promise.resolve().then(()=>(Cf(),Ef)),Ie=await O(this.projectPath,this.projectId);(Ie.checkpointsMigrated||Ie.teamMigrated||Ie.checkpointsHandEditWarned||Ie.teamHandEditWarned||Ie.errors.length>0)&&F.info("Legacy crew sweep ran",{checkpointsMigrated:Ie.checkpointsMigrated,teamMigrated:Ie.teamMigrated,checkpointsHandEditWarned:Ie.checkpointsHandEditWarned,teamHandEditWarned:Ie.teamHandEditWarned,errors:Ie.errors.length})}catch(O){F.debug("Legacy crew sweep failed (non-critical)",{error:_e(O)})}});let[l,u,d,p]=await at("gather",()=>ul(Promise.all([Yg(this.projectPath),Qg(this.projectPath),Zg(this.projectPath),ef(this.projectPath)]),"gather")),{shouldRebuildIndexes:m,changedDomains:g,incrementalInfo:y}=await at("incremental",()=>Ag({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));m&&await at("index",async()=>{try{await ul(Promise.all([sp(this.projectPath,this.projectId),Pm(this.projectPath,this.projectId),Em(this.projectPath,this.projectId)]),"index")}catch(O){F.debug("File ranking index build failed (non-critical)",{error:_e(O)})}});let b,P=Date.now();F.debug("sync phase start",{phase:"skills"});try{let[O,Ie,no,Rn,ts,ar,ns,so,ss,cr,ha]=await Promise.all([Promise.resolve(nt.getActive(this.projectId)).catch(()=>null),Ne.getActive(this.projectId).catch(()=>null),wt.getRecent(this.projectId,3).catch(()=>[]),dg.getMetrics(this.projectId).catch(()=>null),qe.getBacklog(this.projectId).catch(()=>[]),V.getTaskHistory(this.projectId).catch(()=>[]),V.getAllPausedTasks(this.projectId).catch(()=>[]),V.getAggregatedFeedback(this.projectId).catch(()=>null),V.getCurrentTask(this.projectId).catch(()=>null),Ln.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),wt.getCount(this.projectId).catch(()=>0)]),lr={backlogCount:ts.length,completedTaskCount:ar.length,pausedTaskCount:ns.length,hasActiveTask:!!ss},ur=O?O.patterns.map(Z=>({name:Z.name,description:Z.description,location:Z.locations?.[0]})):(Ie?.patterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({name:Z.name,description:Z.description,location:Z.location})),ro=O?O.antiPatterns.map(Z=>({issue:Z.issue,file:Z.files?.[0]??"multiple",suggestion:Z.suggestion,severity:Z.severity??"medium"})):(Ie?.antiPatterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({issue:Z.issue,file:Z.file,suggestion:Z.suggestion,severity:Z.severity??"medium"})),rs=O?.commands?{install:O.commands.install??d.install,run:d.run,test:O.commands.test??d.test,build:O.commands.build??d.build,dev:O.commands.dev??d.dev,lint:O.commands.lint??d.lint,format:O.commands.format??d.format}:d,dr={version:u.version,fileCount:u.fileCount,patterns:ur,antiPatterns:ro,recentShipped:no.map(Z=>({name:Z.name,type:Z.type??"feature",duration:Z.duration,filesChanged:Z.changes?.length})),velocity:Rn?{avgPoints:Rn.averageVelocity,trend:Rn.velocityTrend,accuracy:Rn.estimationAccuracy}:null,backlogCount:ts.length,completedTaskCount:ar.length,pausedTaskCount:ns.length,knownGotchas:so?.knownGotchas??[],userPatterns:so?.patternsDiscovered??[],hasActiveTask:!!ss,activeTaskDescription:ss?.description??"",pausedTasks:ns.map(Z=>({description:Z.description,pausedAt:Z.pausedAt??""})),topBacklog:ts.slice(0,3).map(Z=>({description:Z.description,priority:Z.priority??"medium"})),ideasCount:cr?.pending??0,shippedCount:ha};b=await vg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:rs,stack:p},lr,dr)}catch(O){F.debug("Native skill generation failed (non-critical)",{error:_e(O)})}F.debug("sync phase done",{phase:"skills",ms:Date.now()-P}),await at("update-files",()=>Promise.all([Gg({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:l,stats:u}),Vg({projectId:this.projectId,projectPath:this.projectPath,stats:u,stack:p}),Promise.resolve(Jg(this.projectId,l,u)),Lg(this.projectId,this.projectPath,l,u,p,r.verified)]));let k=await Ne.getActive(this.projectId),x={patterns:k?.patterns?.length||0,antiPatterns:k?.antiPatterns?.length||0,criticalAntiPatterns:k?.antiPatterns?.filter(O=>O.severity==="high").length||0},T=Date.now()-n,D=await at("metrics",()=>Ng(this.projectId,u,T));await at("archive",()=>Fg(this.projectId)),await at("install-global",async()=>{await Re.installGlobalConfig(),await Re.syncCommands()});let L;return await at("verify",async()=>{try{let O=await B.readConfig(this.projectPath);L=await rf.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){F.debug("Verification failed (non-critical)",{error:_e(O)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:d,stack:p,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:x,syncMetrics:D,verification:L,incremental:y,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:mi(),stats:gi(),commands:fi(),stack:hi(),context7:{installed:r.installed,verified:r.verified,message:r.message},error:_e(o)}}}async getCliVersion(){try{let e=Pf.join(__dirname,"..","..","package.json");return(await je(e))?.version||"0.0.0"}catch(e){return F.debug("Failed to read CLI version",{error:_e(e)}),"0.0.0"}}},As=new dl});import Wn from"chalk";var xf,ST,bT,Ct,Af=h(()=>{"use strict";tt();xf=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ST=80,bT={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:xf,speed:ST},cli:{header:c(()=>`${Wn.cyan.bold("\u26A1")} ${Wn.cyan("prjct")}`,"header"),footer:c(()=>Wn.dim("\u26A1 prjct"),"footer"),spin:c((s,e)=>`${Wn.cyan("\u26A1")} ${Wn.cyan("prjct")} ${Wn.cyan(xf[s%10])} ${Wn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:c((s="claude")=>So(s).commitFooter,"getCommitFooter"),getSignature:c((s="claude")=>So(s).signature,"getSignature")},Ct=bT});import ce from"chalk";function CT(){return TT[ET]}var IM,ml,TT,ET,Hn,js,gl,ct,wn,PT,RT,f,Se=h(()=>{"use strict";Af();ni();Pc();IM=Ct.spinner.frames,ml=Ct.spinner.speed,TT={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},ET="compact";c(CT,"getTierConfig");Hn={success:ce.green("\u2713"),fail:ce.red("\u2717"),warn:ce.yellow("\u26A0"),info:ce.blue("\u2139"),debug:ce.dim("\u{1F527}"),bullet:ce.dim("\u2022"),arrow:ce.dim("\u2192"),check:ce.green("\u2713"),cross:ce.red("\u2717"),spinner:ce.cyan("\u25D0")},js=null,gl=0,ct=!1,wn=c((s,e)=>{let t=e??(CT().maxCharsPerLine||bt.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate"),PT=c(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(bt.CLEAR_WIDTH)}\r`):!0,"clear"),RT={start(){return ct||console.log(Ct.cli.header()),this},end(){return ct||console.log(Ct.cli.footer()),this},spin(s){return ct?this:(this.stop(),process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${Ct.cli.spin(gl++,wn(s,bt.SPINNER_MSG))}`)},ml),this):(process.stdout.write(`${Ct.cli.spin(0,wn(s,bt.SPINNER_MSG))}
|
|
722
|
+
`}async function Sf(s){try{return(await kf.stat(s)).mtimeMs}catch{return null}}async function bf(s){try{return await kf.readFile(s,"utf-8")}catch{return null}}function Tf(s,e){return E.getDoc(s,e)}function _i(s,e,t){E.setDoc(s,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function $i(s,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>(Ye(),Ai));await n.remember(s,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){F.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function yT(s,e,t){let n=vf.join(s,$r),r=await Sf(n);if(r===null)return;let o=Tf(e,cl);if(o===null){let i=await bf(n);if(i===null){t.errors.push({file:$r,reason:"read failed"});return}try{cf.set(e,i,"migrated"),_i(e,cl,r),t.checkpointsMigrated=!0,await $i(s,"Legacy .prjct/CHECKPOINTS.md migrated into kv_store crew:checkpoints. Manage with 'prjct crew checkpoints show|set|reset|export'. Original file left in place (not authoritative).",{"migration:v2.19.8":"1",topic:"crew-checkpoints"})}catch(a){t.errors.push({file:$r,reason:a instanceof Error?a.message:String(a)})}return}r>o.mtime_ms&&(await $i(s,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${$r}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),_i(e,cl,r),t.checkpointsHandEditWarned=!0)}async function wT(s,e,t){let n=vf.join(s,ji),r=await Sf(n);if(r===null)return;let o=Tf(e,ll),i=Ci.get(e);if(o===null){let a=await bf(n);if(a===null){t.errors.push({file:ji,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(a),u={required:l.required===!0,minVersion:typeof l.minVersion=="string"?l.minVersion:"0.0.0",enrolledAt:typeof l.enrolledAt=="string"?l.enrolledAt:new Date().toISOString(),enrolledBy:typeof l.enrolledBy=="string"?l.enrolledBy:null};Ci.set(e,u),await is(n,hT(u)),t.teamMigrated=!0,await $i(s,"Legacy .prjct/team.json adopted into kv_store team:enrollment. The disk file is now a derived mirror \u2014 do not hand-edit; run 'prjct team check' to detect drift.",{"migration:v2.19.8":"1",topic:"team-enrollment"})}_i(e,ll,r)}catch(l){t.errors.push({file:ji,reason:l instanceof Error?l.message:String(l)})}return}r>o.mtime_ms&&(await $i(s,".prjct/team.json hand-edited after migration \u2014 your edit was NOT applied (file is a derived mirror). Run 'prjct team check' to rewrite the mirror from DB, or 'prjct team' to re-enroll with new values.",{"migration:v2.19.8":"1",topic:"team-enrollment",state:"hand-edited"}),_i(e,ll,r),t.teamHandEditWarned=!0)}async function kT(s,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await yT(s,e,t).catch(n=>{t.errors.push({file:$r,reason:n instanceof Error?n.message:String(n)})}),await wT(s,e,t).catch(n=>{t.errors.push({file:ji,reason:n instanceof Error?n.message:String(n)})}),t}var $r,ji,cl,ll,Cf=h(()=>{"use strict";lf();ne();Pi();X();Nt();$r=".prjct/CHECKPOINTS.md",ji=".prjct/team.json",cl="migration:v2.19.8:last-flagged-checkpoints",ll="migration:v2.19.8:last-flagged-team";c(hT,"renderMirror");c(Sf,"statMtimeMs");c(bf,"tryReadFile");c(Tf,"readFlag");c(_i,"writeFlag");c($i,"captureInboxWarning");c(yT,"sweepCheckpoints");c(wT,"sweepTeamJson");c(kT,"legacyCrewSweep")});import vT from"node:fs/promises";import Pf from"node:path";function ul(s,e){let t,n=new Promise((r,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${Rf}ms`)),Rf)});return Promise.race([s,n]).finally(()=>{t&&clearTimeout(t)})}async function at(s,e){let t=Date.now();F.debug("sync phase start",{phase:s});try{let n=await e();return F.debug("sync phase done",{phase:s,ms:Date.now()-t}),n}catch(n){throw F.debug("sync phase failed",{phase:s,ms:Date.now()-t,error:_e(n)}),n}}var Rf,dl,As,pl=h(()=>{"use strict";kc();jo();Sc();Yo();cn();tt();Ft();Pe();ge();ii();gn();ai();fs();Nc();Fn();Ts();st();pg();X();Nt();Jo();Sg();bg();jg();Ug();qg();tf();of();Rf=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(ul,"withTimeout");c(at,"phase");dl=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await B.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:mi(),stats:gi(),commands:fi(),stack:hi(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await vT.rm(Pf.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await An()).installed){let O=await oi({autoRepair:!0});O.verified||F.warn(`Codex p. router not ready: ${O.message||"verification failed"}`)}await at("mcp-defaults",()=>qo({silent:!0,verifyContext7:!1}));try{r=await at("context7",()=>Mn.ensureReady())}catch(O){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:mi(),stats:gi(),commands:fi(),stack:hi(),context7:{installed:r.installed,verified:!1,message:_e(O)},error:`Context7 MCP is required but not ready: ${_e(O)}. Run 'prjct start' to repair.`}}await Bg(this.globalPath),process.env.PRJCT_SKIP_JSON_MIGRATION==="1"||(await at("migrate",()=>ul(di(this.projectId),"migrate")),await at("sweep",async()=>{try{let O=await pi(this.projectId);O>0&&F.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){F.debug("Legacy JSON sweep failed (non-critical)",{error:_e(O)})}})),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await at("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:O}=await Promise.resolve().then(()=>(Cf(),Ef)),Ie=await O(this.projectPath,this.projectId);(Ie.checkpointsMigrated||Ie.teamMigrated||Ie.checkpointsHandEditWarned||Ie.teamHandEditWarned||Ie.errors.length>0)&&F.info("Legacy crew sweep ran",{checkpointsMigrated:Ie.checkpointsMigrated,teamMigrated:Ie.teamMigrated,checkpointsHandEditWarned:Ie.checkpointsHandEditWarned,teamHandEditWarned:Ie.teamHandEditWarned,errors:Ie.errors.length})}catch(O){F.debug("Legacy crew sweep failed (non-critical)",{error:_e(O)})}});let[l,u,d,p]=await at("gather",()=>ul(Promise.all([Yg(this.projectPath),Qg(this.projectPath),Zg(this.projectPath),ef(this.projectPath)]),"gather")),{shouldRebuildIndexes:m,changedDomains:g,incrementalInfo:y}=await at("incremental",()=>Ag({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));m&&await at("index",async()=>{try{await ul(Promise.all([sp(this.projectPath,this.projectId),Pm(this.projectPath,this.projectId),Em(this.projectPath,this.projectId)]),"index")}catch(O){F.debug("File ranking index build failed (non-critical)",{error:_e(O)})}});let b,P=Date.now();F.debug("sync phase start",{phase:"skills"});try{let[O,Ie,no,Rn,ts,ar,ns,so,ss,cr,ha]=await Promise.all([Promise.resolve(nt.getActive(this.projectId)).catch(()=>null),Ne.getActive(this.projectId).catch(()=>null),wt.getRecent(this.projectId,3).catch(()=>[]),dg.getMetrics(this.projectId).catch(()=>null),qe.getBacklog(this.projectId).catch(()=>[]),V.getTaskHistory(this.projectId).catch(()=>[]),V.getAllPausedTasks(this.projectId).catch(()=>[]),V.getAggregatedFeedback(this.projectId).catch(()=>null),V.getCurrentTask(this.projectId).catch(()=>null),Ln.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),wt.getCount(this.projectId).catch(()=>0)]),lr={backlogCount:ts.length,completedTaskCount:ar.length,pausedTaskCount:ns.length,hasActiveTask:!!ss},ur=O?O.patterns.map(Z=>({name:Z.name,description:Z.description,location:Z.locations?.[0]})):(Ie?.patterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({name:Z.name,description:Z.description,location:Z.location})),ro=O?O.antiPatterns.map(Z=>({issue:Z.issue,file:Z.files?.[0]??"multiple",suggestion:Z.suggestion,severity:Z.severity??"medium"})):(Ie?.antiPatterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({issue:Z.issue,file:Z.file,suggestion:Z.suggestion,severity:Z.severity??"medium"})),rs=O?.commands?{install:O.commands.install??d.install,run:d.run,test:O.commands.test??d.test,build:O.commands.build??d.build,dev:O.commands.dev??d.dev,lint:O.commands.lint??d.lint,format:O.commands.format??d.format}:d,dr={version:u.version,fileCount:u.fileCount,patterns:ur,antiPatterns:ro,recentShipped:no.map(Z=>({name:Z.name,type:Z.type??"feature",duration:Z.duration,filesChanged:Z.changes?.length})),velocity:Rn?{avgPoints:Rn.averageVelocity,trend:Rn.velocityTrend,accuracy:Rn.estimationAccuracy}:null,backlogCount:ts.length,completedTaskCount:ar.length,pausedTaskCount:ns.length,knownGotchas:so?.knownGotchas??[],userPatterns:so?.patternsDiscovered??[],hasActiveTask:!!ss,activeTaskDescription:ss?.description??"",pausedTasks:ns.map(Z=>({description:Z.description,pausedAt:Z.pausedAt??""})),topBacklog:ts.slice(0,3).map(Z=>({description:Z.description,priority:Z.priority??"medium"})),ideasCount:cr?.pending??0,shippedCount:ha};b=await vg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:rs,stack:p},lr,dr)}catch(O){F.debug("Native skill generation failed (non-critical)",{error:_e(O)})}F.debug("sync phase done",{phase:"skills",ms:Date.now()-P}),await at("update-files",()=>Promise.all([Gg({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:l,stats:u}),Vg({projectId:this.projectId,projectPath:this.projectPath,stats:u,stack:p}),Promise.resolve(Jg(this.projectId,l,u)),Lg(this.projectId,this.projectPath,l,u,p,r.verified)]));let k=await Ne.getActive(this.projectId),x={patterns:k?.patterns?.length||0,antiPatterns:k?.antiPatterns?.length||0,criticalAntiPatterns:k?.antiPatterns?.filter(O=>O.severity==="high").length||0},T=Date.now()-n,D=await at("metrics",()=>Ng(this.projectId,u,T));await at("archive",()=>Fg(this.projectId)),await at("install-global",async()=>{await Re.installGlobalConfig(),await Re.syncCommands()});let L;return await at("verify",async()=>{try{let O=await B.readConfig(this.projectPath);L=await rf.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){F.debug("Verification failed (non-critical)",{error:_e(O)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:d,stack:p,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:x,syncMetrics:D,verification:L,incremental:y,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:mi(),stats:gi(),commands:fi(),stack:hi(),context7:{installed:r.installed,verified:r.verified,message:r.message},error:_e(o)}}}async getCliVersion(){try{let e=Pf.join(__dirname,"..","..","package.json");return(await je(e))?.version||"0.0.0"}catch(e){return F.debug("Failed to read CLI version",{error:_e(e)}),"0.0.0"}}},As=new dl});import Wn from"chalk";var xf,ST,bT,Ct,Af=h(()=>{"use strict";tt();xf=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ST=80,bT={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:xf,speed:ST},cli:{header:c(()=>`${Wn.cyan.bold("\u26A1")} ${Wn.cyan("prjct")}`,"header"),footer:c(()=>Wn.dim("\u26A1 prjct"),"footer"),spin:c((s,e)=>`${Wn.cyan("\u26A1")} ${Wn.cyan("prjct")} ${Wn.cyan(xf[s%10])} ${Wn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:c((s="claude")=>So(s).commitFooter,"getCommitFooter"),getSignature:c((s="claude")=>So(s).signature,"getSignature")},Ct=bT});import ce from"chalk";function CT(){return TT[ET]}var $M,ml,TT,ET,Hn,js,gl,ct,wn,PT,RT,f,Se=h(()=>{"use strict";Af();ni();Pc();$M=Ct.spinner.frames,ml=Ct.spinner.speed,TT={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},ET="compact";c(CT,"getTierConfig");Hn={success:ce.green("\u2713"),fail:ce.red("\u2717"),warn:ce.yellow("\u26A0"),info:ce.blue("\u2139"),debug:ce.dim("\u{1F527}"),bullet:ce.dim("\u2022"),arrow:ce.dim("\u2192"),check:ce.green("\u2713"),cross:ce.red("\u2717"),spinner:ce.cyan("\u25D0")},js=null,gl=0,ct=!1,wn=c((s,e)=>{let t=e??(CT().maxCharsPerLine||bt.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate"),PT=c(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(bt.CLEAR_WIDTH)}\r`):!0,"clear"),RT={start(){return ct||console.log(Ct.cli.header()),this},end(){return ct||console.log(Ct.cli.footer()),this},spin(s){return ct?this:(this.stop(),process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${Ct.cli.spin(gl++,wn(s,bt.SPINNER_MSG))}`)},ml),this):(process.stdout.write(`${Ct.cli.spin(0,wn(s,bt.SPINNER_MSG))}
|
|
723
723
|
`),this))},done(s,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=ce.dim(` [${n.join(" | ")}]`))}console.log(`${Hn.success} ${wn(s,bt.DONE_MSG)}${t}`)}return this},fail(s){return this.stop(),console.error(`${Hn.fail} ${wn(s,bt.FAIL_MSG)}`),this},failWithHint(s){this.stop();let e=typeof s=="string"?Im(s):s;return console.error(),console.error(`${Hn.fail} ${e.message}`),e.file&&console.error(ce.dim(` File: ${e.file}`)),e.hint&&console.error(ce.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ce.dim(` Docs: ${e.docs}`)),console.error(),this},warn(s){return this.stop(),ct||console.log(`${Hn.warn} ${wn(s,bt.WARN_MSG)}`),this},info(s){return this.stop(),ct||console.log(`${Hn.info} ${s}`),this},debug(s){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${Hn.debug} ${ce.dim(s)}`),this},success(s,e){return this.done(s,e)},list(s,e={}){if(this.stop(),ct)return this;let t=e.bullet||Hn.bullet,n=" ".repeat(e.indent||0);for(let r of s)console.log(`${n}${t} ${r}`);return this},table(s,e={}){if(this.stop(),ct||s.length===0)return this;let t=Object.keys(s[0]),n={};for(let r of t){n[r]=r.length;for(let o of s){let i=String(o[r]??"");i.length>n[r]&&(n[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(n[o])).join(" ");console.log(ce.dim(r)),console.log(ce.dim("\u2500".repeat(r.length)))}for(let r of s){let o=t.map(i=>String(r[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(s,e){if(this.stop(),ct)return this;let t=e.split(`
|
|
724
724
|
`),n=Math.max(s.length,...t.map(o=>o.length)),r="\u2500".repeat(n+2);console.log(ce.dim(`\u250C${r}\u2510`)),console.log(`${ce.dim("\u2502")} ${ce.bold(s.padEnd(n))} ${ce.dim("\u2502")}`),console.log(ce.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${ce.dim("\u2502")} ${o.padEnd(n)} ${ce.dim("\u2502")}`);return console.log(ce.dim(`\u2514${r}\u2518`)),this},section(s){return this.stop(),ct?this:(console.log(`
|
|
725
725
|
${ce.bold(s)}`),console.log(ce.dim("\u2500".repeat(s.length))),this)},stop(){return js&&(clearInterval(js),js=null,PT()),this},step(s,e,t){if(ct)return this;this.stop();let n=ce.dim(`[${s}/${e}]`);return process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${Ct.cli.spin(gl++,`${n} ${wn(t,bt.STEP_MSG)}`)}`)},ml),this):(process.stdout.write(`${Ct.cli.spin(0,`${n} ${wn(t,bt.STEP_MSG)}`)}
|
|
@@ -763,7 +763,7 @@ ${Ff}
|
|
|
763
763
|
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let r=E.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return Mt({projectId:e,entityType:"custom_workflows",entityId:String(r.id),eventType:"upsert",data:{id:r.id,name:t.name,description:t.description??null,metadata:t.metadata??null,created_at:n,updated_at:n,is_builtin:0,enabled:1}}),r.id}getWorkflow(e,t){let n=E.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return E.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];if(n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0)return!1;i.push("updated_at = ?"),a.push(o),a.push(t),E.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a);let l=this.getWorkflow(e,t);return l&&Mt({projectId:e,entityType:"custom_workflows",entityId:String(l.id),eventType:"upsert",data:{id:l.id,name:l.name,description:l.description??null,enabled:l.enabled?1:0,metadata:l.metadata??null,updated_at:o}}),!0}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return E.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),Mt({projectId:e,entityType:"custom_workflows",entityId:String(n.id),eventType:"delete",data:{id:n.id,name:t}}),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Xe=new wl});function kl(s){let e=s.trust_source==="imported"?"imported":"local";return{id:s.id,type:s.type,command:s.command,position:s.position,action:s.action,description:s.description,enabled:s.enabled===1,timeoutMs:s.timeout_ms,createdAt:s.created_at,sortOrder:s.sort_order,whenExpr:s.when_expr??null,parallel:s.parallel===null?!0:s.parallel===1,trustSource:e}}var vl,ee,zt=h(()=>{"use strict";Sr();Mr();ne();c(kl,"rowToRule");vl=class{static{c(this,"WorkflowRuleStorage")}addRule(e,t){let n=A.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),r=t.sortOrder||(n?.m??-1)+1;A.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
|
|
764
764
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r,t.whenExpr??null,t.parallel===!1?0:1,t.trustSource??"local");let i=A.get(e,"SELECT last_insert_rowid() as id")?.id??0;return i>0&&Mt({projectId:e,entityType:"workflow_rules",entityId:String(i),eventType:"upsert",data:{id:i,type:t.type,command:t.command,position:t.position,action:t.action,description:t.description??null,enabled:t.enabled?1:0,timeout_ms:t.timeoutMs,sort_order:r,when_expr:t.whenExpr??null,parallel:t.parallel===!1?0:1,trust_source:t.trustSource??"local",created_at:t.createdAt}}),i}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),Mt({projectId:e,entityType:"workflow_rules",entityId:String(t),eventType:"delete",data:{id:t}}),!0):!1}updateRule(e,t,n){if(!A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:c(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:c(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},i=[],a=[];for(let[l,u]of Object.entries(n)){let d=o[l];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),A.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=A.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?kl(n):null}getRulesForCommand(e,t){let n=Xe.getWorkflow(e,t);return!n||!n.enabled?[]:A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(kl)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(kl)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},ee=new vl});import Ge from"node:path";async function DT(s,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await C(Ge.join(s,"pnpm-lock.yaml"))?"pnpm":await C(Ge.join(s,"yarn.lock"))?"yarn":await C(Ge.join(s,"bun.lockb"))||await C(Ge.join(s,"bun.lock"))?"bun":(await C(Ge.join(s,"package-lock.json")),"npm")}function Hf(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function OT(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function $s(s,e){for(let r of MT)if(await C(Ge.join(s,r)))return r;let n=(e??await on(s)).find(r=>r.endsWith(NT));if(n)return n}async function Kt(s){for(let e of LT)if(await C(Ge.join(s,e)))return e}async function Di(s){let e=Ge.join(s,"package.json"),t=await je(e,null);if(t){let a=await DT(s,t),l=t.scripts||{},u={stack:"js",packageManager:a};return l.lint&&(u.lint={tool:a,command:Hf(a,"lint")}),l.typecheck&&(u.typecheck={tool:a,command:Hf(a,"typecheck")}),l.test&&(u.test={tool:a,command:OT(a)}),u.versionFile=await $s(s),u.changelogFile=await Kt(s),u}if(await C(Ge.join(s,"pytest.ini"))){let a=await $s(s),l=await Kt(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}let n=await mt(Ge.join(s,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await $s(s),l=await Kt(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}if(await C(Ge.join(s,"Cargo.toml"))){let a=await Kt(s);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(Ge.join(s,"go.mod"))){let a=await $s(s),l=await Kt(s);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:l}}let r=await on(s);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await $s(s,r),l=await Kt(s);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:l}}if(await C(Ge.join(s,"pom.xml"))){let a=await Kt(s);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(Ge.join(s,"gradlew"))&&(await C(Ge.join(s,"build.gradle"))||await C(Ge.join(s,"build.gradle.kts")))){let a=await Kt(s);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await $s(s),i=await Kt(s);return{stack:"unknown",versionFile:o,changelogFile:i}}var MT,NT,LT,Sl=h(()=>{"use strict";X();c(DT,"detectPackageManager");c(Hf,"pmRun");c(OT,"pmTest");MT=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],NT=".csproj",LT=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];c($s,"detectVersionFile");c(Kt,"detectChangelogFile");c(Di,"detectProjectCommands")});import Oi from"node:fs/promises";import bl from"node:os";import vn from"node:path";async function El(s){try{let e=await Oi.readdir(s);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=vn.join(s,"package.json"),n=JSON.parse(await Oi.readFile(t,"utf-8")),r={...n.dependencies,...n.devDependencies};if(n.bin)return"cli-tool";if(n.main&&!r.react&&!r.vue&&!r.angular&&!r.express&&!r.hono)return"library";if((r.react||r.vue)&&(r.express||r.hono||r.fastify))return"fullstack";if(r.react||r.vue||r["@angular/core"]||r.next||r.nuxt)return"web-app";if(r.express||r.hono||r.fastify||r.koa||r.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(n=>["main.py","app.py","server.py"].includes(n))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function Cl(s){let e=[];await rn(vn.join(bl.homedir(),".claude"))&&e.push("claude"),await C(vn.join(s,".cursorrules"))&&e.push("cursor"),await C(vn.join(s,".windsurfrules"))&&e.push("windsurf"),await C(vn.join(s,".github","copilot-instructions.md"))&&e.push("copilot"),await rn(vn.join(bl.homedir(),".gemini"))&&e.push("gemini");try{let{execAsync:t}=await Promise.resolve().then(()=>(He(),va));await t("which codex"),e.push("codex")}catch{await rn(vn.join(bl.homedir(),".codex"))&&e.push("codex")}return e.length>0?e:["claude"]}async function Pl(s){let e={language:"Unknown",technologies:[]};try{let t=await Oi.readdir(s);if(t.includes("package.json")){let n=vn.join(s,"package.json"),r=JSON.parse(await Oi.readFile(n,"utf-8")),o={...r.dependencies,...r.devDependencies};e.language=o.typescript?"TypeScript":"JavaScript",o.next?e.framework="Next.js":o.nuxt?e.framework="Nuxt":o.react?e.framework="React":o.vue?e.framework="Vue":o["@angular/core"]?e.framework="Angular":o.express?e.framework="Express":o.hono?e.framework="Hono":o.fastify?e.framework="Fastify":(o.nestjs||o["@nestjs/core"])&&(e.framework="NestJS"),o.bun||o["@types/bun"]||r.engines?.bun?e.runtime="Bun":e.runtime="Node.js",t.includes("bun.lockb")?e.packageManager="Bun":t.includes("pnpm-lock.yaml")?e.packageManager="pnpm":t.includes("yarn.lock")?e.packageManager="Yarn":t.includes("package-lock.json")&&(e.packageManager="npm"),(o.prisma||o["@prisma/client"])&&e.technologies.push("Prisma"),(o.drizzle||o["drizzle-orm"])&&e.technologies.push("Drizzle"),o.tailwindcss&&e.technologies.push("Tailwind CSS"),o.zod&&e.technologies.push("Zod"),(o.trpc||o["@trpc/server"])&&e.technologies.push("tRPC")}else t.includes("pyproject.toml")||t.includes("requirements.txt")?e.language="Python":t.includes("go.mod")?e.language="Go":t.includes("Cargo.toml")?e.language="Rust":(t.includes("pom.xml")||t.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var Nr,Tl,Bf=h(()=>{"use strict";X();Nr=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Tl=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}];c(El,"detectProjectType");c(Cl,"detectInstalledAgents");c(Pl,"detectStack")});import*as le from"@clack/prompts";import Bn from"chalk";var Lr,Gf=h(()=>{"use strict";Se();Bf();Lr=class{static{c(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){le.intro(Bn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:c(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:c(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:c(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:c(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:c(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return le.outro(Bn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await El(this.projectPath),this.confirmedType=this.detectedType;let e=await Cl(this.projectPath);return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await Pl(this.projectPath),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await El(this.projectPath);let e=Nr.findIndex(n=>n.value===this.detectedType),t=await le.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Nr.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Nr[e].value:void 0});return le.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await Cl(this.projectPath),t=await le.multiselect({message:"Which AI agents do you use?",options:Tl.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return le.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await Pl(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);le.note(e,"Detected stack");let t=await le.confirm({message:"Is this stack correct?",initialValue:!0});if(le.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await le.group({language:c(()=>le.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:c(()=>le.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:c(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await le.group({verbosity:c(()=>le.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:c(()=>le.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:c(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Bn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Bn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Bn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Bn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Bn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
765
765
|
`);le.note(e,"Configuration Summary");let t=await le.confirm({message:"Generate configuration with these settings?",initialValue:!0});return le.isCancel(t)||!t?(le.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,le.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Nr.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Tl.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import FT from"node:https";import Vf from"node:path";import Sn from"chalk";function UT(s,e){let t=`Update available! ${s} \u2192 ${e}`,n="prjct upgrade",r=Math.max(t.length,`Run: ${n}`.length)+4,o=`\u250C${"\u2500".repeat(r)}\u2510`,i=`\u2514${"\u2500".repeat(r)}\u2518`,a=c(l=>`\u2502 ${l}${" ".repeat(r-l.length-2)}\u2502`,"pad");return["",Sn.yellow(o),Sn.yellow(a("")),Sn.yellow(`\u2502 ${Sn.bold(t)}${" ".repeat(r-t.length-2)}\u2502`),Sn.yellow(`\u2502 Run: ${Sn.cyan(n)}${" ".repeat(r-n.length-7)}\u2502`),Sn.yellow(a("")),Sn.yellow(i),""].join(`
|
|
766
|
-
`)}var Rl,Fr,
|
|
766
|
+
`)}var Rl,Fr,xN,xl=h(()=>{"use strict";U();X();ht();ge();Rl=class{static{c(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=j.globalConfigDir,this.cacheFile=Vf.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=Vf.join(__dirname,"..","..","package.json");return(await je(e))?.version??null}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},r=FT.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await je(this.cacheFile)}catch{}return null}async writeCache(e){try{await me(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let r=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:UT(e.currentVersion,e.latestVersion)}},Fr=Rl,xN=24*60*60*1e3;c(UT,"formatUpdateBanner")});import Jf from"node:path";async function BT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await C(Jf.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(Jf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function GT(){return{...WT}}function VT(){return{...HT}}async function qf(){return Mi||(Mi=await BT()?GT():VT(),Mi)}var Mi,WT,HT,Xf=h(()=>{"use strict";X();Mi=null,WT={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},HT={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};c(BT,"isClaudeEnvironment");c(GT,"getClaudeAgent");c(VT,"getTerminalAgent");c(qf,"detect")});import Ni from"node:fs/promises";var Al,zf,Kf=h(()=>{"use strict";U();X();Al=class{static{c(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${w(t)}`)}return await Ni.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${w(n)}`)}await Ni.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${w(t)}`)}return await Ni.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await Ni.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
767
767
|
${e.map((t,n)=>`${n+1}. ${t}`).join(`
|
|
768
768
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
769
769
|
|
|
@@ -808,7 +808,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
808
808
|
|
|
809
809
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
810
810
|
|
|
811
|
-
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},zf=Al});function Yf(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&qT.has(e.code))return!0;if(e.code&&Zf.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function XT(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&Zf.has(e.code))}function Qf(s,e,t){let n=bn.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(bn.delete(s),!1):!0:!1}function jl(s,e){let t=bn.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bn.set(s,t)}function zT(s){bn.delete(s)}var qT,Zf,bn,Li,eh,
|
|
811
|
+
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},zf=Al});function Yf(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&qT.has(e.code))return!0;if(e.code&&Zf.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function XT(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&Zf.has(e.code))}function Qf(s,e,t){let n=bn.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(bn.delete(s),!1):!0:!1}function jl(s,e){let t=bn.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bn.set(s,t)}function zT(s){bn.delete(s)}var qT,Zf,bn,Li,eh,FN,th=h(()=>{"use strict";qT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Zf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);c(Yf,"isTransientError");c(XT,"isPermanentError");bn=new Map;c(Qf,"isCircuitOpen");c(jl,"recordFailure");c(zT,"recordSuccess");Li=class{static{c(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(Qf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return zT(t),o}catch(o){if(n=o,r++,XT(o))throw jl(t,this.options.circuitBreakerThreshold),o;if(!(Yf(o)&&r<this.options.maxAttempts))throw jl(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,a))}throw jl(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Yf(e)}isCircuitOpen(e){return Qf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bn.get(e)}resetCircuit(e){bn.delete(e)}resetAllCircuits(){bn.clear()}},eh=new Li({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),FN=new Li({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var KT,_l,Fi,nh=h(()=>{"use strict";cn();Xf();Kf();th();KT=["claude"],_l=class{static{c(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await eh.execute(async()=>{if(this.agentInfo=await qf(),!this.agentInfo?.isSupported)throw mr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!KT.includes(e))throw mr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new zf,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Fi=new _l});var $l,Il,sh=h(()=>{"use strict";$l=class{static{c(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Il=new $l});var se,Ve=h(()=>{"use strict";xl();nh();sh();Un();Dl();se=class{static{c(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Fr,this.updateNotificationShown=!1}get agent(){return Fi.getAgent()}get agentInfo(){return Fi.getInfo()}get currentAuthor(){return Yt.getCurrentAuthor()}async initializeAgent(){return Fi.initialize()}async ensureProjectInit(e){return Yt.ensureInit(e)}async ensureAuthor(){return Yt.ensureAuthor()}async getGlobalProjectPath(e){return Yt.getGlobalPath(e)}async logToMemory(e,t,n){let r=await this.ensureAuthor();return Ke.log(e,t,n,r.name)}async _detectEmptyDirectory(e){return Yt.isEmptyDirectory(e)}async _detectExistingCode(e){return Yt.hasExistingCode(e)}_breakdownFeatureTasks(e){return Il.breakdownFeature(e)}_detectBugSeverity(e){return Il.detectBugSeverity(e)}}});function rh(s){return Gn[s]??null}var Gn,Ol,Ml=h(()=>{"use strict";Gn={code:{name:"code",description:"Coding work: features, bugs, refactors, TDD, shipping.",suggestedPersona:{role:"DEV",mcps:["github"]},memoryTypes:["fact","decision","learning","gotcha","pattern","anti-pattern","shipped"],workflowSlots:{ship:{description:"Publish finished work \u2014 tests, commit, push, PR."},review:{description:"Pre-commit or pre-PR review pass."}},hookSignals:[],suggestedTags:{domain:["auth","api","frontend","infra","data"]}},daily:{name:"daily",description:"Day-to-day capture + review. GTD-style inbox + weekly review.",memoryTypes:["inbox","todo","idea"],workflowSlots:{morning:{description:"Morning briefing \u2014 pull open todos + upcoming commitments."},clarify:{description:"Reclassify inbox entries to real memory types."},review:{description:"Weekly/biweekly review across memory."}},hookSignals:[]},pm:{name:"pm",description:"Product Management: specs, user interviews, roadmap, backlog triage.",suggestedPersona:{role:"PM",mcps:["linear","posthog"]},memoryTypes:["insight","question","stakeholder","decision","source"],workflowSlots:{spec:{description:"Draft a technical/product spec from captured insights."},triage:{description:"Review Linear backlog and prioritize."},interview:{description:"User interview pre-brief + post-synthesis."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"spec|requirements?|prd",inject:["type=insight","type=question"]}],suggestedTags:{audience:["team","stakeholders"],quarter:["q1","q2","q3","q4"]}},founder:{name:"founder",description:"Founder ops: strategy, fundraising, hiring, stakeholder comms.",suggestedPersona:{role:"Founder",mcps:["gmail","linear","posthog"]},memoryTypes:["goal","okr","person","stakeholder","decision","shipped"],workflowSlots:{"investor-update":{description:"Monthly investor update draft."},"1on1":{description:"1:1 prep + synthesis."},strategy:{description:"Strategy checkpoint \u2014 OKR progress + pivots."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"investor|board|update|fundrais",inject:["type=okr","type=shipped","type=stakeholder"]}],suggestedTags:{audience:["board","investors","team"]}},research:{name:"research",description:"Research: deep-dives, literature review, competitive scans.",suggestedPersona:{role:"Research",mcps:["web"]},memoryTypes:["source","claim","question","insight"],workflowSlots:{"lit-review":{description:"Literature review across captured sources."},analyze:{description:"Data analysis run via MCP, persist findings."}},hookSignals:[],suggestedTags:{confidence:["high","medium","low"]}}},Ol=Object.keys(Gn);c(rh,"getPackManifest")});var oh={};re(oh,{activatePacks:()=>Ll,deactivatePacks:()=>Fl,detectSuggestedPacks:()=>Nl,listActivePacks:()=>Ul});async function Nl(s){let e=await import("node:fs/promises"),t=await import("node:path"),n=new Set(["daily"]),r=["package.json","go.mod","Cargo.toml","pyproject.toml","Gemfile","pom.xml","build.gradle"];for(let o of r)try{await e.stat(t.join(s,o)),n.add("code");break}catch{}return[...n]}async function Ll(s,e,t={}){let n=[],r=[],o=await B.readConfig(s);if(!o)throw new Error("No prjct project here \u2014 run `prjct init` first.");let i=o.persona??{role:"DEV"},a=new Set(i.packs??[]);for(let p of e){if(!Gn[p]){r.push(p);continue}a.has(p)||(a.add(p),n.push(p))}let l=[...a],u={...i,packs:l};t.suggestPersona&&n.length>0&&YT(u,n);let d={...o,persona:u};return await B.writeConfig(s,d),{activated:n,skipped:r}}async function Fl(s,e){let t=await B.readConfig(s);if(!t)throw new Error("No prjct project here \u2014 run `prjct init` first.");let n=t.persona??{role:"DEV"},r=new Set(n.packs??[]),o=[],i=[];for(let u of e)r.delete(u)?o.push(u):i.push(u);let a={...n,packs:[...r]},l={...t,persona:a};return await B.writeConfig(s,l),{deactivated:o,notActive:i}}async function Ul(s){let t=(await B.readConfig(s))?.persona?.packs??[],n=[];for(let r of t){let o=Gn[r];o&&n.push({name:o.name,description:o.description,memoryTypes:o.memoryTypes,slots:Object.keys(o.workflowSlots)})}return n}function YT(s,e){let t=s.role&&s.role!=="DEV",n=s.mcps&&s.mcps.length>0;for(let r of e){let o=rh(r);if(o?.suggestedPersona&&(!t&&o.suggestedPersona.role&&(s.role=o.suggestedPersona.role),!s.focus&&o.suggestedPersona.focus&&(s.focus=o.suggestedPersona.focus),!n&&o.suggestedPersona.mcps&&(s.mcps=[...o.suggestedPersona.mcps]),s.role&&s.role!=="DEV"))break}}var Wl=h(()=>{"use strict";Pe();Ml();c(Nl,"detectSuggestedPacks");c(Ll,"activatePacks");c(Fl,"deactivatePacks");c(Ul,"listActivePacks");c(YT,"applyPersonaSuggestion")});import ih from"node:path";var QT,ZT,Ui,ah=h(()=>{"use strict";te();X();QT=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],ZT=`# Changelog
|
|
812
812
|
|
|
813
813
|
All notable changes to this project will be documented in this file.
|
|
814
814
|
|
|
@@ -925,7 +925,7 @@ Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},sourc
|
|
|
925
925
|
`)}
|
|
926
926
|
`)}let n=["# Workflows",""];n.push("Workflow definitions stored in SQLite, rendered as Markdown for inspection. To edit, see the per-workflow page."),n.push("");for(let[r,o]of t){let i=o.filter(a=>a.enabled).length;n.push(`- [${r}](${r}.md) \u2014 ${i} active rule(s)`)}return e.set("workflows/index.md",`${n.join(`
|
|
927
927
|
`)}
|
|
928
|
-
`),{files:e,commandCount:t.size}}var ry=h(()=>{"use strict";c(sy,"buildWorkflowFiles")});function Vr(s){let e=[];for(let{name:t,re:n}of oy)n.test(s)&&e.push(t);return e}var oy,
|
|
928
|
+
`),{files:e,commandCount:t.size}}var ry=h(()=>{"use strict";c(sy,"buildWorkflowFiles")});function Vr(s){let e=[];for(let{name:t,re:n}of oy)n.test(s)&&e.push(t);return e}var oy,tU,Xi=h(()=>{"use strict";oy=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}],tU=oy.map(s=>s.name);c(Vr,"scanForSecrets")});import Rt from"node:fs/promises";import Ms from"node:path";async function Jr(s){await fC(s);let e=await B.readConfig(s).catch(()=>null);return await j.getWikiPath(s,e?.vaultPath)}async function fC(s){let e=await B.readConfig(s).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=j.getLegacyWikiPath(s);if(!await ay(t))return{moved:!1,reason:"no-legacy"};let r=await j.getWikiPath(s);if(await ay(r))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${r} already has content.
|
|
929
929
|
Merge manually or set \`vaultPath\` in .prjct/prjct.config.json to choose one.`),{moved:!1,reason:"conflict",from:t,to:r};await Rt.mkdir(Ms.dirname(r),{recursive:!0});let i=await hC(t,r);return await yC(s),console.error(`\u2139 prjct: migrated Obsidian vault
|
|
930
930
|
from: ${j.getDisplayPath(t)}
|
|
931
931
|
to: ${j.getDisplayPath(r)}
|
|
@@ -1039,7 +1039,7 @@ Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}asyn
|
|
|
1039
1039
|
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(p)}catch(p){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),r.on("error",l=>{i||(i=!0,clearTimeout(a),t(l))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function tR(s,e,t,n,r,o=!0){let i=Ce.socket();if(!Oe.existsSync(i))return o&&Aw().catch(()=>{}),null;try{return await Qr({id:aa.randomUUID(),command:s,args:e,options:t,cwd:n,perfStartNs:r})}catch{return null}}async function nR(){try{return(await Qr({id:aa.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function sR(){let s=Ce.pid(),e=Ce.socket(),t=!1;if(Oe.existsSync(s)){let n=parseInt(Oe.readFileSync(s,"utf-8").trim(),10);if(!Number.isNaN(n))try{process.kill(n,"SIGKILL"),t=!0}catch{}}try{Oe.existsSync(s)&&Oe.unlinkSync(s)}catch{}try{Oe.existsSync(e)&&Oe.unlinkSync(e)}catch{}return t}async function Aw(){let{spawn:s}=await import("node:child_process"),e=tr.join(__dirname,"entry.ts"),t=tr.join(__dirname,"..","daemon","entry.mjs"),n=tr.join(__dirname,"..","dist","daemon","entry.mjs"),r,o;if(Oe.existsSync(e))r=e,o="bun";else if(Oe.existsSync(t))r=t,o=Ha()?"bun":"node";else if(Oe.existsSync(n))r=n,o=Ha()?"bun":"node";else return!1;ZP();let i=Ce.runDir();Oe.mkdirSync(i,{recursive:!0});let a=Ce.log(),l=Oe.openSync(a,"a");s(o,[r],{detached:!0,stdio:["ignore",l,l],env:process.env}).unref(),Oe.closeSync(l);let d=Date.now()+3e3;for(;Date.now()<d;)if(await new Promise(p=>setTimeout(p,300)),await xw())return!0;return!1}var Ku=h(()=>{"use strict";Ba();ia();c(QP,"packageRoot");c(ZP,"repairNativeDependencies");c(xw,"isDaemonRunning");c(eR,"getDaemonStatus");c(Qr,"sendRequest");c(tR,"executeViaDaemon");c(nR,"stopDaemon");c(sR,"forceKillDaemon");c(Aw,"spawnDaemon")});var yk={};re(yk,{isSyncCurrent:()=>SR,runSelfHeal:()=>bR});import id from"node:fs";import wR from"node:path";function kR(){try{return id.readFileSync(hk(),"utf-8").trim()}catch{return null}}function vR(s){try{id.mkdirSync(fk(),{recursive:!0}),id.writeFileSync(hk(),s,"utf-8")}catch{}}function SR(s){return s?kR()===s:!0}async function bR(s){if(s&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(Ft(),jm));await e()}catch{}try{await(await Promise.resolve().then(()=>(Ou(),Qy))).install()}catch{}vR(s)}}var fk,hk,wk=h(()=>{"use strict";ge();fk=c(()=>j.getStatePath(),"stampDir"),hk=c(()=>wR.join(fk(),"installed-version"),"stampPath");c(kR,"readStamp");c(vR,"writeStamp");c(SR,"isSyncCurrent");c(bR,"runSelfHeal")});import pt from"node:fs";import{createServer as TR}from"node:net";ta();Ye();U();Ae();Se();jr();Xi();Ve();var Fs=class extends se{static{c(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return f.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let r=e.trim(),o=Vr(r);if(o.length>0&&!n.force)return f.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=Ar(r);if(i.length>0&&!n.force)return f.fail(`refusing to capture content that looks like prompt injection (${i.join(", ")}). Captures are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let a=VC(n.tags),l=await this.ensureProjectInit(t);if(!l.success)return l;await Le.remember(t,{type:"inbox",content:r,tags:a,provenance:"declared"});let u=r.length>60?`${r.slice(0,57)}\u2026`:r;return n.md?console.log(`\u2713 captured: ${u}`):f.done(`captured: ${u}`),{success:!0,type:"inbox",content:r,tags:a}}catch(r){let o=w(r);return J(o)}}};function VC(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}c(VC,"parseFlagTags");import Eu from"node:fs";import JC from"node:os";import Hy from"node:path";var By=Hy.join(JC.homedir(),".prjct-cli","config"),Cu=Hy.join(By,"global.json");function Pu(){try{let s=Eu.readFileSync(Cu,"utf-8"),e=JSON.parse(s);if(e&&typeof e=="object"&&!Array.isArray(e))return e}catch{}return{}}c(Pu,"readRaw");function qC(s){Eu.mkdirSync(By,{recursive:!0}),Eu.writeFileSync(Cu,`${JSON.stringify(s,null,2)}
|
|
1040
1040
|
`,"utf-8")}c(qC,"writeRaw");function Gy(s){return Pu()[s]}c(Gy,"getConfig");function Vy(){return Pu()}c(Vy,"getAll");function Ru(s,e){let t=Pu();e===void 0?delete t[s]:t[s]=e,qC(t)}c(Ru,"setConfig");function Jy(s){Ru(s,void 0)}c(Jy,"unsetConfig");function qy(){return Cu}c(qy,"configPath");Qe();Se();Ve();var Us=class extends se{static{c(this,"ConfigCommands")}async config(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list";switch(o){case"list":return this.list(n);case"get":return this.get(r[1],n);case"set":return this.set(r[1],r.slice(2).join(" "),n);case"unset":return this.unset(r[1],n);default:return f.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=Vy(),n=Object.keys(t).sort();if(e.md){let r=n.length===0?"_No global config set._":n.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
|
|
1041
1041
|
`);console.log(I(W("Global config",r),W("Path",`\`${qy()}\``)))}else if(n.length===0)f.info("No global config set.");else for(let r of n)console.log(` ${r} = ${JSON.stringify(t[r])}`);return{success:!0,config:t}}get(e,t){if(!e)return f.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let n=Gy(e);return t.md?console.log(I(W(e,n===void 0?"_(unset)_":`\`${JSON.stringify(n)}\``))):n===void 0?f.info("(unset)"):console.log(JSON.stringify(n)),{success:!0,key:e,value:n}}set(e,t,n){if(!e||t===void 0||t==="")return f.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let r=XC(t);Ru(e,r);let o=`${e} = ${JSON.stringify(r)}`;return n.md?console.log(I(W("Set",o))):f.done(o),{success:!0,key:e,value:r}}unset(e,t){if(!e)return f.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};Jy(e);let n=`Removed ${e}`;return t.md?console.log(I(W("Unset",n))):f.done(n),{success:!0,key:e}}};function XC(s){let e=s.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(s);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(s)?t:s}c(XC,"parseValue");Pe();ge();st();U();Qe();import zC from"node:fs/promises";import KC from"node:path";var Kn=class{static{c(this,"ContextCommands")}async context(e=null,t=process.cwd(),n={}){try{let r=await B.readConfig(t);if(!r||!r.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=r.projectId,i=j.getGlobalProjectPath(o),a=await V.read(o),l=a?.currentTask?{id:a.currentTask.id,description:a.currentTask.description,startedAt:a.currentTask.startedAt,subtasks:a.currentTask.subtasks?.map(p=>({id:p.id,description:p.description,status:p.status,domain:p.domain})),currentSubtaskIndex:a.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return n.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(r){return{success:!1,message:`Context error: ${w(r)}`}}}formatContextMd(e){let t=[];if(t.push(W("Project",yl(hl("ID",e.projectId),hl("Path",e.globalPath)))),e.currentTask){let n=e.currentTask;if(t.push(Ir({description:n.description,status:"in-progress"})),n.subtasks&&n.subtasks.length>0){let r=n.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(r.join(`
|
|
1042
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(W("Stack",kn({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),I(...t)}async loadRepoAnalysis(e){try{let t=KC.join(e,"analysis","repo-analysis.json"),n=await zC.readFile(t,"utf-8"),r=JSON.parse(n);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return $(t),null}}},
|
|
1042
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(W("Stack",kn({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),I(...t)}async loadRepoAnalysis(e){try{let t=KC.join(e,"analysis","repo-analysis.json"),n=await zC.readFile(t,"utf-8"),r=JSON.parse(n);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return $(t),null}}},fH=new Kn;Ou();U();Ae();Se();Ve();import{execFileSync as ZC}from"node:child_process";import Mu from"node:path";function Zy(){try{return Mu.dirname(We.resolve("prjct-cli/package.json"))}catch{return Mu.resolve(__dirname,"..","..")}}c(Zy,"packageRoot");function eP(){let s=Mu.join(Zy(),"scripts","ensure-native-deps.js");try{return ZC(process.execPath,[s],{cwd:Zy(),stdio:"inherit",timeout:12e4}),!0}catch{return!1}}c(eP,"ensureNativeDependencies");var Hs=class extends se{static{c(this,"InstallCommands")}async install(e=null,t=process.cwd(),n={}){try{let r=eP(),o=await $u(),i=zr.length,a=`installed ${o.hooksWritten} new, ${o.alreadyPresent} already present (total ${i} hooks)`;return n.md?console.log(["# prjct hooks installed","",`Wrote to \`${o.settingsPath}\`.`,"",`- new: ${o.hooksWritten}`,`- already present: ${o.alreadyPresent}`,`- total expected: ${i}`,`- native dependencies: ${r?"ready":"repair deferred"}`,"","> Only `_prjctManaged: true` entries were touched. Your other hooks are untouched."].join(`
|
|
1043
1043
|
`)):(f.done(a),f.info(`settings: ${o.settingsPath}`),r||f.warn("SQLite native dependency repair deferred; daemon startup will retry.")),{success:!0,hooksWritten:o.hooksWritten}}catch(r){let o=w(r);return J(o)}}async uninstall(e=null,t=process.cwd(),n={}){try{let r=await Iu(),o=`removed ${r.hooksRemoved} prjct hook(s)`;return n.md?console.log(`# prjct hooks removed
|
|
1044
1044
|
|
|
1045
1045
|
- removed: ${r.hooksRemoved}
|
|
@@ -1058,7 +1058,7 @@ Nothing to show.
|
|
|
1058
1058
|
Types: ${Rs.join(" | ")}`),{success:!1,error:"Missing args"};let o=iP(e);if(!o.ok)return J(o.error);let{type:i,content:a}=o,l=Vr(a);if(l.length>0&&!n.force){let y=l.join(", ");return f.fail(`refusing to store memory that looks like a secret (${y}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Ar(a);if(u.length>0&&!n.force)return f.fail(`refusing to store memory that looks like prompt injection (${u.join(", ")}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let d=oP(n.tags),p=await ye(t);if(!p.ok)return p.result;let m=await V.getCurrentTask(p.value);await Le.remember(t,{type:i,content:a,tags:d,source:m?.id});let{regenerateWikiDeferred:g}=await Promise.resolve().then(()=>(Xr(),qr));return await g(t,p.value),n.md?console.log(`\u2713 remembered ${i}: ${a}`):f.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:d}}catch(r){let o=w(r);return J(o)}}};function rP(s){let e=s.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let n=t.indexOf(":");return n<=0?null:[t.slice(0,n),t.slice(n+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}c(rP,"parseTagPairs");function oP(s){if(!s)return{};let e={};for(let t of s.split(",")){let n=t.trim(),r=n.indexOf(":");r>0&&(e[n.slice(0,r)]=n.slice(r+1))}return e}c(oP,"parseFlagTags");function iP(s){let e=s.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let n=e.slice(0,t).toLowerCase().trim();if(!n||!/^[a-z][a-z0-9-]*$/.test(n))return{ok:!1,error:`invalid type '${n}'. Lowercase letters + dashes only. Base types: ${Rs.join(", ")}`};let r=n,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:r,content:o}:{ok:!1,error:"content is required"}}c(iP,"parseRememberArgs");async function aP(s,e){try{let{default:t}=await Promise.resolve().then(()=>(ne(),Zd)),n=t.query(s,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${Ps}`);for(let r of n)try{let o=JSON.parse(r.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}c(aP,"readLastStatus");Ml();Wl();U();Ae();Se();Ve();var Vs=class extends se{static{c(this,"SeedCommands")}async seed(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list",i=r.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,n);case"remove":return this.remove(i||null,t,n);case"list":return this.list(null,t,n);case"suggest":return this.suggest(null,t,n);default:return f.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),n={}){try{if(!e)return f.info(`Usage: prjct seed add <pack>[,<pack>...]
|
|
1059
1059
|
Available: ${Ol.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await Ll(t,r,{suggestPersona:n.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):f.done(i),{success:!0,...o}}catch(r){let o=w(r);return J(o)}}async remove(e=null,t=process.cwd(),n={}){try{if(!e)return f.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await Fl(t,r),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):f.done(i),{success:!0,...o}}catch(r){let o=w(r);return J(o)}}async list(e=null,t=process.cwd(),n={}){try{let r=await Ul(t);if(r.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${Ol.join(", ")}`;return n.md?console.log(`> ${o}`):f.info(o),{success:!0,active:[]}}if(n.md){let o=["# Active packs",""];for(let i of r)o.push(`## ${i.name}`),o.push(i.description),o.push(`- memory types: ${i.memoryTypes.join(", ")||"\u2014"}`),o.push(`- workflow slots: ${i.slots.join(", ")||"\u2014"}`),o.push("");console.log(o.join(`
|
|
1060
1060
|
`))}else for(let o of r)f.info(`${o.name}: ${o.description}`),f.info(` memory: ${o.memoryTypes.join(", ")||"\u2014"}`),f.info(` slots: ${o.slots.join(", ")||"\u2014"}`);return{success:!0,active:r}}catch(r){let o=w(r);return J(o)}}async suggest(e=null,t=process.cwd(),n={}){try{let r=await Nl(t),o=r.map(i=>{let a=Gn[i];return{name:i,description:a?.description??""}});if(n.md){let i=["# Suggested packs for this project",""];for(let a of o)i.push(`- **${a.name}** \u2014 ${a.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${r.join(",")}\``),console.log(i.join(`
|
|
1061
|
-
`))}else f.info(`Suggested: ${r.join(", ")}`),f.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=w(r);return J(o)}}};Ft();Pe();ge();gs();import hP from"node:fs/promises";import yP from"node:http";import wP from"node:path";import Y from"chalk";ni();gs();var cP={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function lP(s){return s.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}c(lP,"camelToSnake");function uP(s){let e={};for(let[t,n]of Object.entries(s))e[lP(t)]=n;return e}c(uP,"snakeCaseKeys");function dP(s,e){let[t,n]=e.type.split("."),r=cP[t];if(!r)return null;let i=n==="deleted"?"delete":"upsert",a=e.data||{},l=uP(a),u=l.id||a.id||"",d={event_type:i,entity_type:r,entity_id:u,data:{...l,project_id:s},project_id:s};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}c(dP,"mapCliEventToWebFormat");function ew(s,e){return e.map(t=>dP(s,t)).filter(t=>t!==null)}c(ew,"mapCliEventsToWebFormat");var Fu=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=ew(e,t),i=await this.fetchWithRetry(`${n}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":r},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t,n){let{apiUrl:r,apiKey:o}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let i={projectId:e};typeof t=="number"&&t>0&&(i.sinceEventId=t);let a=await this.fetchWithRetry(`${r}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":o},body:JSON.stringify(i)});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async getStatus(e){let{apiUrl:t,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let r=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":n}});if(!r.ok)throw await this.parseErrorResponse(r);return await r.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),bs("API_REQUEST"));try{let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)return clearTimeout(t),!1;let o=await fetch(`${n}/health`,{method:"GET",headers:{"X-Api-Key":r},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Fe.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Fe.getApiUrl(),Fe.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,n=0){let r=new AbortController,o=setTimeout(()=>r.abort(),bs("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:r.signal});if(clearTimeout(o),a&&l.status>=500&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${bs("API_REQUEST")}ms)`);if(a&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),n=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",n,e.status):this.createError("API_ERROR",n,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,n){return{code:e,message:t,status:n}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Js=new Fu;$o();gs();ai();var tw={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.title||e.text||"",r=e.priority||"medium",o=e.status||"active";await Ln.update(s,i=>{let a=i.ideas.findIndex(p=>p.id===t),u={id:t,text:n,priority:r,status:o==="archived"?"archived":"pending",addedAt:i.ideas[a]?.addedAt??new Date().toISOString(),tags:i.ideas[a]?.tags??[]},d=a>=0?i.ideas.map((p,m)=>m===a?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(s,e){let t=e.id||"";t&&await Ln.update(s,n=>({...n,ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r)}))}};Fn();var nw={async upsert(s,e){let t=e.id||"";if(!t){await qe.addTask(s,{description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"});return}await qe.update(s,n=>{let r=n.tasks.findIndex(a=>a.id===t),o={id:t,description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"},i=r>=0?n.tasks.map((a,l)=>l===r?{...a,...o}:a):[...n.tasks,o];return{...n,tasks:i}})},async delete(s,e){let t=e.id||"";t&&await qe.update(s,n=>({...n,tasks:n.tasks.filter(r=>r.id!==t)}))}};Ts();var Uu={async upsert(s,e){await wt.addShipped(s,{name:e.name||e.title||"",version:e.version||"",description:e.description||""})},async delete(s,e){}};Fn();st();var sw={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.status||"";if(n==="completed"||n==="shipped"){await V.update(s,r=>r.currentTask?.id===t?{...r,currentTask:null}:r);return}if(n==="active"||e.started_at||e.startedAt){await V.update(s,r=>({...r,currentTask:{id:t,description:e.description,startedAt:e.started_at||e.startedAt||new Date().toISOString(),sessionId:e.session_id||e.sessionId||""}}));return}await qe.update(s,r=>{let o=r.tasks.findIndex(l=>l.id===t),i={id:t,description:e.description,priority:e.priority||"medium",type:e.type||"feature",section:"backlog"},a=o>=0?r.tasks.map((l,u)=>u===o?{...l,...i}:l):[...r.tasks,i];return{...r,tasks:a}})},async delete(s,e){let t=e.id||"";t&&await V.update(s,n=>n.currentTask?.id===t?{...n,currentTask:null}:n)}};var Wu={tasks:sw,ideas:tw,queue_tasks:nw,shipped_items:Uu,shipped_features:Uu}
|
|
1061
|
+
`))}else f.info(`Suggested: ${r.join(", ")}`),f.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=w(r);return J(o)}}};Ft();Pe();ge();gs();import hP from"node:fs/promises";import yP from"node:http";import wP from"node:path";import Y from"chalk";ni();gs();var cP={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function lP(s){return s.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}c(lP,"camelToSnake");function uP(s){let e={};for(let[t,n]of Object.entries(s))e[lP(t)]=n;return e}c(uP,"snakeCaseKeys");function dP(s,e){let[t,n]=e.type.split("."),r=cP[t];if(!r)return null;let i=n==="deleted"?"delete":"upsert",a=e.data||{},l=uP(a),u=l.id||a.id||"",d={event_type:i,entity_type:r,entity_id:u,data:{...l,project_id:s},project_id:s};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}c(dP,"mapCliEventToWebFormat");function ew(s,e){return e.map(t=>dP(s,t)).filter(t=>t!==null)}c(ew,"mapCliEventsToWebFormat");var Fu=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=ew(e,t),i=await this.fetchWithRetry(`${n}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":r},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t,n){let{apiUrl:r,apiKey:o}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let i={projectId:e};typeof t=="number"&&t>0&&(i.sinceEventId=t);let a=await this.fetchWithRetry(`${r}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":o},body:JSON.stringify(i)});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async getStatus(e){let{apiUrl:t,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let r=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":n}});if(!r.ok)throw await this.parseErrorResponse(r);return await r.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),bs("API_REQUEST"));try{let{apiUrl:n,apiKey:r}=await this.getAuthHeaders();if(!r)return clearTimeout(t),!1;let o=await fetch(`${n}/health`,{method:"GET",headers:{"X-Api-Key":r},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Fe.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Fe.getApiUrl(),Fe.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,n=0){let r=new AbortController,o=setTimeout(()=>r.abort(),bs("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:r.signal});if(clearTimeout(o),a&&l.status>=500&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${bs("API_REQUEST")}ms)`);if(a&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),n=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",n,e.status):this.createError("API_ERROR",n,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,n){return{code:e,message:t,status:n}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Js=new Fu;$o();gs();ai();var tw={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.title||e.text||"",r=e.priority||"medium",o=e.status||"active";await Ln.update(s,i=>{let a=i.ideas.findIndex(p=>p.id===t),u={id:t,text:n,priority:r,status:o==="archived"?"archived":"pending",addedAt:i.ideas[a]?.addedAt??new Date().toISOString(),tags:i.ideas[a]?.tags??[]},d=a>=0?i.ideas.map((p,m)=>m===a?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(s,e){let t=e.id||"";t&&await Ln.update(s,n=>({...n,ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r)}))}};Fn();var nw={async upsert(s,e){let t=e.id||"";if(!t){await qe.addTask(s,{description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"});return}await qe.update(s,n=>{let r=n.tasks.findIndex(a=>a.id===t),o={id:t,description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"},i=r>=0?n.tasks.map((a,l)=>l===r?{...a,...o}:a):[...n.tasks,o];return{...n,tasks:i}})},async delete(s,e){let t=e.id||"";t&&await qe.update(s,n=>({...n,tasks:n.tasks.filter(r=>r.id!==t)}))}};Ts();var Uu={async upsert(s,e){await wt.addShipped(s,{name:e.name||e.title||"",version:e.version||"",description:e.description||""})},async delete(s,e){}};Fn();st();var sw={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.status||"";if(n==="completed"||n==="shipped"){await V.update(s,r=>r.currentTask?.id===t?{...r,currentTask:null}:r);return}if(n==="active"||e.started_at||e.startedAt){await V.update(s,r=>({...r,currentTask:{id:t,description:e.description,startedAt:e.started_at||e.startedAt||new Date().toISOString(),sessionId:e.session_id||e.sessionId||""}}));return}await qe.update(s,r=>{let o=r.tasks.findIndex(l=>l.id===t),i={id:t,description:e.description,priority:e.priority||"medium",type:e.type||"feature",section:"backlog"},a=o>=0?r.tasks.map((l,u)=>u===o?{...l,...i}:l):[...r.tasks,i];return{...r,tasks:a}})},async delete(s,e){let t=e.id||"";t&&await V.update(s,n=>n.currentTask?.id===t?{...n,currentTask:null}:n)}};var Wu={tasks:sw,ideas:tw,queue_tasks:nw,shipped_items:Uu,shipped_features:Uu},$B=Object.keys(Wu),rw=new Set(["roadmap_features","projects","sessions","agents"]);ne();te();function ow(s,e,t){if(!e||!t)return null;try{return E.get(s,"SELECT content_hash, applied_at FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)?.content_hash??null}catch{return null}}c(ow,"getApplied");function iw(s,e,t,n){if(!(!e||!t||!n))try{E.run(s,`INSERT INTO sync_applied_hashes (entity_type, entity_id, content_hash, applied_at)
|
|
1062
1062
|
VALUES (?, ?, ?, ?)
|
|
1063
1063
|
ON CONFLICT(entity_type, entity_id) DO UPDATE SET
|
|
1064
1064
|
content_hash = excluded.content_hash,
|
|
@@ -1327,7 +1327,7 @@ Run with: p. ${o}`)),{success:!0,workflowId:a,name:o,templatePath:l.path}):(Xe.d
|
|
|
1327
1327
|
`))),r.length>0&&i.push(W("Custom Workflows",r.map(o).join(`
|
|
1328
1328
|
`))),console.log(I(...i,$e([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(lt(`${t.length} workflow${t.length!==1?"s":""}`),n.length>0){console.log(`
|
|
1329
1329
|
Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(r.length>0){console.log(`
|
|
1330
|
-
Custom:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}c(Vw,"workflowList");async function Jw(s,e,t){let n=s.trim();if(!n)return M("Usage: prjct workflow delete <name>",t);try{return Xe.deleteWorkflow(e,n)?(await nd.deleteWorkflowTemplate(n),t.md?console.log(I(fe("Workflow Deleted",`Deleted workflow: ${n}`))):lt(`deleted workflow: ${n}`),{success:!0}):M(`Workflow '${n}' not found`,t)}catch(r){return M(w(r),t)}}c(Jw,"workflowDelete");var sr=class extends se{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await ye(t);if(!r.ok)return r.result;let o=r.value;if(!e)return this._showActiveTask(o,n);let i=await Tn(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=/^[A-Z]+-\d+$/.test(e)?e:void 0,l=e,u=De(),d=n.spec;if(await V.startTask(o,{id:u,description:l,sessionId:De(),linearId:a,linkedSpecId:d}),d)try{let{specService:m}=await Promise.resolve().then(()=>(Gi(),Zl));await m.linkTask(t,d,u)}catch{}await this.logToMemory(t,"task_started",{task:l,taskId:u,timestamp:v()}),await Tn(o,"task","after",{projectPath:t,skipRules:n.skipHooks});let p=await Hi(t).catch(()=>"");return n.md?console.log(I(Ir({description:l,status:"active"}),W("State",Ee([`Task: \`${u}\``,p?`Branch: \`${p}\``:null,a?`Linear: \`${a}\``:null,i.instructions.length>0?`Agent instructions: ${i.instructions.length}`:null].filter(m=>m!==null))),i.instructions.length>0?W("Agent Instructions",Ee(i.instructions)):null,$e([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(f.done(`Task: ${l}`),Mf("working"),_s("task")),{success:!0,task:l,taskId:u}}catch(r){let o=w(r);return n.md?console.log(`> ${o}`):f.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t){let n=await V.getCurrentTask(e);if(!n){let r='no active task. `prjct task "<description>"` to start one.';return t.md?console.log(`> ${r}`):f.info(r),{success:!0,message:"no active task"}}return t.md?console.log(I(Ir({description:n.description,status:"active"}),W("State",Ee([`Task: \`${n.id}\``,n.branch?`Branch: \`${n.branch}\``:null,n.linearId?`Linear: \`${n.linearId}\``:null,`Started: ${n.startedAt}`].filter(r=>r!==null))))):f.info(`Active: ${n.description}`),{success:!0,currentTask:n}}async workflow(e=null,t=process.cwd(),n={}){try{let r=await ye(t,n);if(!r.ok)return r.result;let o=r.value,i=e?.trim()??"";if(!i)return ua(null,o,n);let a=_w(i);switch(a.type){case"add":return Ow(a.args,o,n);case"gate":return Mw(a.args,o,n);case"instruction":return Nw(a.args,o,n);case"remove":return Lw(a.args,o,n);case"disable":return Uw(a.args,o,n);case"reset":return Fw(o,n);case"init":return Bw(o,t,n);case"help":return Hw(n);case"create":return Gw(a.args,o,t,n);case"list":return Vw(o,n);case"delete":return Jw(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return ua(a.args||null,o,n);default:return ua(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(r){return n.md?console.log(`> Error: ${w(r)}`):f.fail(w(r)),Te(r)}}async run(e,t=process.cwd(),n={}){try{let r=await ye(t,n);if(!r.ok)return r.result;let o=r.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=Xe.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let l=await Tn(o,i,"before",{projectPath:t});if(!l.success){if(n.md)If("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await Tn(o,i,"after",{projectPath:t}),n.md?console.log(I(fe(`Workflow: ${i}`,a.description||""),$e([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=w(r);return n.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}};var rr=class{static{c(this,"PrjctCommands")}workflow;planning;shipping;analysis;setupCmds;updateCmds;contextCmds;primitivesCmds;seedCmds;installCmds;captureCmds;mcpCmds;teamCmds;configCmds;specCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new sr,this.planning=new Xn,this.shipping=new qn,this.analysis=new zn,this.setupCmds=new qs,this.updateCmds=new nr,this.contextCmds=new Kn,this.primitivesCmds=new Gs,this.seedCmds=new Vs,this.installCmds=new Hs,this.captureCmds=new Fs,this.mcpCmds=new Bs,this.teamCmds=new Ys,this.configCmds=new Us,this.specCmds=new zs,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async regenVault(e=process.cwd(),t={}){return this.analysis.regenVault(e,t)}async context(e=null,t=process.cwd(),n={}){return this.contextCmds.context(e,t,n)}async status(e=null,t=process.cwd(),n={}){return this.primitivesCmds.status(e,t,n)}async tag(e=null,t=process.cwd(),n={}){return this.primitivesCmds.tag(e,t,n)}async remember(e=null,t=process.cwd(),n={}){return this.primitivesCmds.remember(e,t,n)}async seed(e=null,t=process.cwd(),n={}){return this.seedCmds.seed(e,t,n)}async install(e=null,t=process.cwd(),n={}){return this.installCmds.install(null,t,n)}async capture(e=null,t=process.cwd(),n={}){return this.captureCmds.capture(e,t,n)}async mcp(e=null,t=process.cwd(),n={}){return this.mcpCmds.mcp(e,t,n)}async team(e=null,t=process.cwd(),n={}){return this.teamCmds.team(e,t,n)}async config(e=null,t=process.cwd(),n={}){return this.configCmds.config(e,t,n)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}async spec(e=null,t=process.cwd(),n={}){return this.specCmds.draft(e,t,n)}async specList(e=process.cwd(),t={}){return this.specCmds.list(null,e,t)}async specShow(e=null,t=process.cwd(),n={}){return this.specCmds.show(e,t,n)}async specUpdate(e=null,t=process.cwd(),n={}){return this.specCmds.update(e,t,n)}async specSetStatus(e=null,t=process.cwd(),n={}){return this.specCmds.setStatus(e,t,n)}async specRecordReview(e=null,t=process.cwd(),n={}){return this.specCmds.recordReview(e,t,n)}async specLinkTask(e=null,t=process.cwd(),n={}){return this.specCmds.linkTask(e,t,n)}async specShip(e=null,t=process.cwd(),n={}){return this.specCmds.ship(e,t,n)}async specAudit(e=null,t=process.cwd(),n={}){return this.specCmds.audit(e,t,n)}async specBreakdown(e=null,t=process.cwd(),n={}){return this.specCmds.breakdown(e,t,n)}async specInventory(e=process.cwd(),t={}){return this.specCmds.inventory(null,e,t)}},iq=new rr;Pe();ge();U();te();var sd=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,r){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=c(async(a,l)=>a!=null?o.call(t,a,l.projectPath):o.call(t,l.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(r=>r.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),r=n.filter((a,l)=>n.indexOf(a)!==l);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(l=>!i.includes(l.group));a.length>0&&e.push(`Invalid categories: ${a.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await B.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:v()};else try{o=await this.buildContext(n)}catch(l){return{success:!1,error:w(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:v()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:v()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},kt=new sd;ta();var qw={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Xw=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},description:"Register a task (or show the active one)",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},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 falls back to current work"]},{name:"sync",group:"core",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:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"/p:regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",routing:{group:"primitives",method:"status"},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"/p:status <value>",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:"core",routing:{group:"primitives",method:"tag"},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"/p:tag type:bug",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",routing:{group:"primitives",method:"remember"},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:!0,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:"capture",group:"core",routing:{group:"capture",method:"capture"},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'/p:capture "<anything>"',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:"core",routing:{group:"seed",method:"seed"},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:"core",routing:{group:"mcp",method:"mcp"},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:"core",routing:{group:"install",method:"install"},description:"Install Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{name:"help",group:"core",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",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist an analysis JSON blob produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <jsonPath>"},params:"<jsonPathOrInline>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},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",routing:{group:"setup",method:"start"},description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",routing:{group:"context",method:"context"},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:"update",group:"setup",routing:{group:"update",method:"update"},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",routing:{group:"uninstall",method:"uninstall"},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:"core",routing:{group:"team",method:"team"},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:"config",group:"core",routing:{group:"config",method:"config"},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:"core",routing:{group:"spec",method:"draft"},description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',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","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",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"]}];ea();Zi();ge();Ve();import ke from"chalk";Ft();ge();U();X();import{execFileSync as ek}from"node:child_process";import tn from"node:fs/promises";import aR from"node:os";import ga from"node:path";import cR from"node:readline";Ft();ge();X();import{execFileSync as zw}from"node:child_process";import pa from"node:fs/promises";import Zr from"node:path";var ma="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",eo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Yw(s){let e=0;try{let t=await pa.readdir(s,{withFileTypes:!0});for(let n of t){let r=Zr.join(s,n.name);if(n.isDirectory())e+=await Yw(r);else try{let o=await pa.stat(r);e+=o.size}catch{}}}catch{}return e}c(Yw,"getDirectorySize");function rd(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}c(rd,"formatSize");async function iR(s){try{return(await pa.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}c(iR,"countDirectoryItems");function Qw(){let s={homebrew:!1,npm:!1};try{zw("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{zw("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}c(Qw,"detectInstallation");async function Zw(){let s=[],e=Cc(),t=j.getGlobalBasePath(),n=await C(t),r=n?await iR(Zr.join(t,"projects")):0,o=n?await Yw(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=Zr.join(e.claude.config,"CLAUDE.md");s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await Kw(i)}),s.push({path:e.claude.router,type:"file",description:"Claude router",exists:await C(e.claude.router)});let a=Zr.join(e.claude.config,"prjct-statusline.sh");s.push({path:a,type:"file",description:"Status line script",exists:await C(a)}),s.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await C(e.gemini.router)});let l=Zr.join(e.gemini.config,"GEMINI.md");return await Kw(l)&&s.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}c(Zw,"gatherUninstallItems");async function Kw(s){if(!await C(s))return!1;try{let e=await pa.readFile(s,"utf-8");return e.includes(ma)&&e.includes(eo)}catch{return!1}}c(Kw,"hasMarkerSection");async function tk(s,e){await tn.mkdir(e,{recursive:!0});let t=await tn.readdir(s,{withFileTypes:!0});for(let n of t){let r=ga.join(s,n.name),o=ga.join(e,n.name);n.isDirectory()?await tk(r,o):await tn.copyFile(r,o)}}c(tk,"copyDirectory");async function nk(){let s=aR.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ga.join(s,`.prjct-backup-${e}`);try{await tn.mkdir(t,{recursive:!0});let n=j.getGlobalBasePath();return await C(n)&&await tk(n,ga.join(t,".prjct-cli")),t}catch{return null}}c(nk,"createBackup");async function lR(s){try{let e=await tn.readFile(s,"utf-8");if(!e.includes(ma)||!e.includes(eo))return!1;let t=e.indexOf(ma),n=e.indexOf(eo)+eo.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
|
|
1330
|
+
Custom:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}c(Vw,"workflowList");async function Jw(s,e,t){let n=s.trim();if(!n)return M("Usage: prjct workflow delete <name>",t);try{return Xe.deleteWorkflow(e,n)?(await nd.deleteWorkflowTemplate(n),t.md?console.log(I(fe("Workflow Deleted",`Deleted workflow: ${n}`))):lt(`deleted workflow: ${n}`),{success:!0}):M(`Workflow '${n}' not found`,t)}catch(r){return M(w(r),t)}}c(Jw,"workflowDelete");var sr=class extends se{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await ye(t);if(!r.ok)return r.result;let o=r.value;if(!e)return this._showActiveTask(o,n);let i=await Tn(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=/^[A-Z]+-\d+$/.test(e)?e:void 0,l=e,u=De(),d=n.spec;if(await V.startTask(o,{id:u,description:l,sessionId:De(),linearId:a,linkedSpecId:d}),d)try{let{specService:m}=await Promise.resolve().then(()=>(Gi(),Zl));await m.linkTask(t,d,u)}catch{}await this.logToMemory(t,"task_started",{task:l,taskId:u,timestamp:v()}),await Tn(o,"task","after",{projectPath:t,skipRules:n.skipHooks});let p=await Hi(t).catch(()=>"");return n.md?console.log(I(Ir({description:l,status:"active"}),W("State",Ee([`Task: \`${u}\``,p?`Branch: \`${p}\``:null,a?`Linear: \`${a}\``:null,i.instructions.length>0?`Agent instructions: ${i.instructions.length}`:null].filter(m=>m!==null))),i.instructions.length>0?W("Agent Instructions",Ee(i.instructions)):null,$e([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(f.done(`Task: ${l}`),Mf("working"),_s("task")),{success:!0,task:l,taskId:u}}catch(r){let o=w(r);return n.md?console.log(`> ${o}`):f.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t){let n=await V.getCurrentTask(e);if(!n){let r='no active task. `prjct task "<description>"` to start one.';return t.md?console.log(`> ${r}`):f.info(r),{success:!0,message:"no active task"}}return t.md?console.log(I(Ir({description:n.description,status:"active"}),W("State",Ee([`Task: \`${n.id}\``,n.branch?`Branch: \`${n.branch}\``:null,n.linearId?`Linear: \`${n.linearId}\``:null,`Started: ${n.startedAt}`].filter(r=>r!==null))))):f.info(`Active: ${n.description}`),{success:!0,currentTask:n}}async workflow(e=null,t=process.cwd(),n={}){try{let r=await ye(t,n);if(!r.ok)return r.result;let o=r.value,i=e?.trim()??"";if(!i)return ua(null,o,n);let a=_w(i);switch(a.type){case"add":return Ow(a.args,o,n);case"gate":return Mw(a.args,o,n);case"instruction":return Nw(a.args,o,n);case"remove":return Lw(a.args,o,n);case"disable":return Uw(a.args,o,n);case"reset":return Fw(o,n);case"init":return Bw(o,t,n);case"help":return Hw(n);case"create":return Gw(a.args,o,t,n);case"list":return Vw(o,n);case"delete":return Jw(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return ua(a.args||null,o,n);default:return ua(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(r){return n.md?console.log(`> Error: ${w(r)}`):f.fail(w(r)),Te(r)}}async run(e,t=process.cwd(),n={}){try{let r=await ye(t,n);if(!r.ok)return r.result;let o=r.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=Xe.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let l=await Tn(o,i,"before",{projectPath:t});if(!l.success){if(n.md)If("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await Tn(o,i,"after",{projectPath:t}),n.md?console.log(I(fe(`Workflow: ${i}`,a.description||""),$e([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=w(r);return n.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}};var rr=class{static{c(this,"PrjctCommands")}workflow;planning;shipping;analysis;setupCmds;updateCmds;contextCmds;primitivesCmds;seedCmds;installCmds;captureCmds;mcpCmds;teamCmds;configCmds;specCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new sr,this.planning=new Xn,this.shipping=new qn,this.analysis=new zn,this.setupCmds=new qs,this.updateCmds=new nr,this.contextCmds=new Kn,this.primitivesCmds=new Gs,this.seedCmds=new Vs,this.installCmds=new Hs,this.captureCmds=new Fs,this.mcpCmds=new Bs,this.teamCmds=new Ys,this.configCmds=new Us,this.specCmds=new zs,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async regenVault(e=process.cwd(),t={}){return this.analysis.regenVault(e,t)}async context(e=null,t=process.cwd(),n={}){return this.contextCmds.context(e,t,n)}async status(e=null,t=process.cwd(),n={}){return this.primitivesCmds.status(e,t,n)}async tag(e=null,t=process.cwd(),n={}){return this.primitivesCmds.tag(e,t,n)}async remember(e=null,t=process.cwd(),n={}){return this.primitivesCmds.remember(e,t,n)}async seed(e=null,t=process.cwd(),n={}){return this.seedCmds.seed(e,t,n)}async install(e=null,t=process.cwd(),n={}){return this.installCmds.install(null,t,n)}async capture(e=null,t=process.cwd(),n={}){return this.captureCmds.capture(e,t,n)}async mcp(e=null,t=process.cwd(),n={}){return this.mcpCmds.mcp(e,t,n)}async team(e=null,t=process.cwd(),n={}){return this.teamCmds.team(e,t,n)}async config(e=null,t=process.cwd(),n={}){return this.configCmds.config(e,t,n)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}async spec(e=null,t=process.cwd(),n={}){return this.specCmds.draft(e,t,n)}async specList(e=process.cwd(),t={}){return this.specCmds.list(null,e,t)}async specShow(e=null,t=process.cwd(),n={}){return this.specCmds.show(e,t,n)}async specUpdate(e=null,t=process.cwd(),n={}){return this.specCmds.update(e,t,n)}async specSetStatus(e=null,t=process.cwd(),n={}){return this.specCmds.setStatus(e,t,n)}async specRecordReview(e=null,t=process.cwd(),n={}){return this.specCmds.recordReview(e,t,n)}async specLinkTask(e=null,t=process.cwd(),n={}){return this.specCmds.linkTask(e,t,n)}async specShip(e=null,t=process.cwd(),n={}){return this.specCmds.ship(e,t,n)}async specAudit(e=null,t=process.cwd(),n={}){return this.specCmds.audit(e,t,n)}async specBreakdown(e=null,t=process.cwd(),n={}){return this.specCmds.breakdown(e,t,n)}async specInventory(e=process.cwd(),t={}){return this.specCmds.inventory(null,e,t)}},nq=new rr;Pe();ge();U();te();var sd=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,r){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=c(async(a,l)=>a!=null?o.call(t,a,l.projectPath):o.call(t,l.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(r=>r.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),r=n.filter((a,l)=>n.indexOf(a)!==l);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(l=>!i.includes(l.group));a.length>0&&e.push(`Invalid categories: ${a.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await B.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:v()};else try{o=await this.buildContext(n)}catch(l){return{success:!1,error:w(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:v()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:v()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},kt=new sd;ta();var qw={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Xw=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},description:"Register a task (or show the active one)",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},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 falls back to current work"]},{name:"sync",group:"core",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:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"/p:regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",routing:{group:"primitives",method:"status"},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"/p:status <value>",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:"core",routing:{group:"primitives",method:"tag"},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"/p:tag type:bug",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",routing:{group:"primitives",method:"remember"},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:!0,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:"capture",group:"core",routing:{group:"capture",method:"capture"},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'/p:capture "<anything>"',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:"core",routing:{group:"seed",method:"seed"},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:"core",routing:{group:"mcp",method:"mcp"},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:"core",routing:{group:"install",method:"install"},description:"Install Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{name:"help",group:"core",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",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist an analysis JSON blob produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <jsonPath>"},params:"<jsonPathOrInline>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},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",routing:{group:"setup",method:"start"},description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",routing:{group:"context",method:"context"},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:"update",group:"setup",routing:{group:"update",method:"update"},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",routing:{group:"uninstall",method:"uninstall"},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:"core",routing:{group:"team",method:"team"},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:"config",group:"core",routing:{group:"config",method:"config"},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:"core",routing:{group:"spec",method:"draft"},description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',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","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",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"]}];ea();Zi();ge();Ve();import ke from"chalk";Ft();ge();U();X();import{execFileSync as ek}from"node:child_process";import tn from"node:fs/promises";import aR from"node:os";import ga from"node:path";import cR from"node:readline";Ft();ge();X();import{execFileSync as zw}from"node:child_process";import pa from"node:fs/promises";import Zr from"node:path";var ma="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",eo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Yw(s){let e=0;try{let t=await pa.readdir(s,{withFileTypes:!0});for(let n of t){let r=Zr.join(s,n.name);if(n.isDirectory())e+=await Yw(r);else try{let o=await pa.stat(r);e+=o.size}catch{}}}catch{}return e}c(Yw,"getDirectorySize");function rd(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}c(rd,"formatSize");async function iR(s){try{return(await pa.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}c(iR,"countDirectoryItems");function Qw(){let s={homebrew:!1,npm:!1};try{zw("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{zw("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}c(Qw,"detectInstallation");async function Zw(){let s=[],e=Cc(),t=j.getGlobalBasePath(),n=await C(t),r=n?await iR(Zr.join(t,"projects")):0,o=n?await Yw(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=Zr.join(e.claude.config,"CLAUDE.md");s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await Kw(i)}),s.push({path:e.claude.router,type:"file",description:"Claude router",exists:await C(e.claude.router)});let a=Zr.join(e.claude.config,"prjct-statusline.sh");s.push({path:a,type:"file",description:"Status line script",exists:await C(a)}),s.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await C(e.gemini.router)});let l=Zr.join(e.gemini.config,"GEMINI.md");return await Kw(l)&&s.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}c(Zw,"gatherUninstallItems");async function Kw(s){if(!await C(s))return!1;try{let e=await pa.readFile(s,"utf-8");return e.includes(ma)&&e.includes(eo)}catch{return!1}}c(Kw,"hasMarkerSection");async function tk(s,e){await tn.mkdir(e,{recursive:!0});let t=await tn.readdir(s,{withFileTypes:!0});for(let n of t){let r=ga.join(s,n.name),o=ga.join(e,n.name);n.isDirectory()?await tk(r,o):await tn.copyFile(r,o)}}c(tk,"copyDirectory");async function nk(){let s=aR.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ga.join(s,`.prjct-backup-${e}`);try{await tn.mkdir(t,{recursive:!0});let n=j.getGlobalBasePath();return await C(n)&&await tk(n,ga.join(t,".prjct-cli")),t}catch{return null}}c(nk,"createBackup");async function lR(s){try{let e=await tn.readFile(s,"utf-8");if(!e.includes(ma)||!e.includes(eo))return!1;let t=e.indexOf(ma),n=e.indexOf(eo)+eo.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
|
|
1331
1331
|
|
|
1332
1332
|
`).trim(),!r||r.trim().length===0?await tn.unlink(s):await tn.writeFile(s,`${r}
|
|
1333
1333
|
`,"utf-8"),!0}catch{return!1}}c(lR,"removePrjctSection");async function sk(s,e,t){let n=[],r=[];for(let o of s)if(o.exists)try{o.type==="section"?await lR(o.path)&&n.push(o.path):o.type==="directory"?(await tn.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await tn.unlink(o.path),n.push(o.path))}catch(i){r.push(`${o.path}: ${w(i)}`)}try{await new Lt().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ek("brew",["uninstall",e.homebrewFormula],{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||ek("npm",["uninstall","-g","prjct-cli"],{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){r.push(`npm: ${w(o)}`)}}return{deleted:n,errors:r}}c(sk,"performUninstall");async function rk(s){let e=cR.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(s,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}c(rk,"promptConfirmation");async function uR(s={},e=process.cwd()){let t=await Zw(),n=Qw(),r=t.filter(l=>l.exists);if(r.length===0&&!n.homebrew&&!n.npm)return console.log(ke.yellow(`
|