prjct-cli 2.19.8 → 2.19.9

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.
@@ -537,23 +537,23 @@ CREATE TABLE velocity_sprints (
537
537
  applied_at TEXT NOT NULL,
538
538
  PRIMARY KEY (entity_type, entity_id)
539
539
  );
540
- `)},"up")}]});function xd(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ad(){return xd()==="bun"}function Ea(){if(xd()==="bun")return!0;try{let{execSync:s}=ct("node:child_process");return s("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var Ca=h(()=>{"use strict";c(xd,"detectRuntime");c(Ad,"isBun");c(Ea,"isBunAvailable")});function ho(s){let e=vk(s);return e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA busy_timeout = 5000"),e}function vk(s){if(Ad()){let{Database:r}=ct("bun:sqlite");return new r(s,{create:!0})}let e=ct("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var Pa=h(()=>{"use strict";Ca();c(ho,"openDatabase");c(vk,"openRaw")});var _d={};re(_d,{PrjctDatabase:()=>yo,default:()=>E,prjctDb:()=>A});import Ra from"node:fs";import jd from"node:path";var bk,yo,A,E,te=h(()=>{"use strict";De();Rd();Pa();bk=3,yo=class{static{c(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(e,t){let n=this.statementCache.get(e);n||(n=new Map,this.statementCache.set(e,n));let r=n.get(t);if(r)return r;let o=e.prepare(t);return n.set(t,o),o}getDbPath(e){return jd.join(D.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=bk&&this.evictLru();let n=this.getDbPath(e),r=jd.dirname(n);Ra.existsSync(r)||Ra.mkdirSync(r,{recursive:!0});let o=ho(n);return o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(n=>n!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return Ra.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e),r=this.prepareCached(n,"SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,n){let r=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();this.prepareCached(r,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){let n=this.getDb(e);this.prepareCached(n,"DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}listDocsByPrefix(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(t).map(o=>({key:o.key,data:JSON.parse(o.data)}))}appendEvent(e,t,n,r){let o=this.getDb(e),i=new Date().toISOString();this.prepareCached(o,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let r=this.getDb(e);return t?this.prepareCached(r,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):this.prepareCached(r,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).all(...n)}run(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).run(...n)}get(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
540
+ `)},"up")}]});function xd(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ad(){return xd()==="bun"}function Ea(){if(xd()==="bun")return!0;try{let{execSync:s}=ct("node:child_process");return s("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var Ca=h(()=>{"use strict";c(xd,"detectRuntime");c(Ad,"isBun");c(Ea,"isBunAvailable")});function ho(s){let e=vk(s);return e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA busy_timeout = 5000"),e}function vk(s){if(Ad()){let{Database:r}=ct("bun:sqlite");return new r(s,{create:!0})}let e=ct("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var Pa=h(()=>{"use strict";Ca();c(ho,"openDatabase");c(vk,"openRaw")});var _d={};re(_d,{PrjctDatabase:()=>yo,default:()=>T,prjctDb:()=>A});import Ra from"node:fs";import jd from"node:path";var bk,yo,A,T,te=h(()=>{"use strict";De();Rd();Pa();bk=3,yo=class{static{c(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(e,t){let n=this.statementCache.get(e);n||(n=new Map,this.statementCache.set(e,n));let r=n.get(t);if(r)return r;let o=e.prepare(t);return n.set(t,o),o}getDbPath(e){return jd.join(D.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=bk&&this.evictLru();let n=this.getDbPath(e),r=jd.dirname(n);Ra.existsSync(r)||Ra.mkdirSync(r,{recursive:!0});let o=ho(n);return o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(n=>n!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return Ra.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e),r=this.prepareCached(n,"SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,n){let r=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();this.prepareCached(r,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){let n=this.getDb(e);this.prepareCached(n,"DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}listDocsByPrefix(e,t){let n=this.getDb(e);return this.prepareCached(n,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(t).map(o=>({key:o.key,data:JSON.parse(o.data)}))}appendEvent(e,t,n,r){let o=this.getDb(e),i=new Date().toISOString();this.prepareCached(o,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let r=this.getDb(e);return t?this.prepareCached(r,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):this.prepareCached(r,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).all(...n)}run(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).run(...n)}get(e,t,...n){let r=this.getDb(e);return this.prepareCached(r,t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
541
541
  CREATE TABLE IF NOT EXISTS _migrations (
542
542
  version INTEGER PRIMARY KEY,
543
543
  name TEXT NOT NULL,
544
544
  applied_at TEXT NOT NULL
545
545
  )
546
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Pd)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},A=new yo,E=A});import Tk from"node:fs/promises";import Ek from"node:path";function ps(s){return s.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Ck(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of n)t.push(...ps(m));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of r){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ps(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ps(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...ps(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...ps(g))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(s))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(s))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!$d.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function Pk(s){return s.split(/\s+/).flatMap(e=>ps(e)).filter(e=>e.length>1&&!$d.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Rk(s){let e=await tn(s),t={},n={},r=0,o=await rs(e,50,async a=>{try{let l=await Tk.readFile(Ek.join(s,a),"utf-8"),u=Ck(l,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:l}of o){t[a]={tokens:l,length:l.length},r+=l.length;let u=new Map;for(let d of l)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)n[d]||(n[d]=[]),n[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function xk(s,e){return Math.log((e-s+.5)/(s+.5)+1)}function Ak(s,e){let t=Pk(s);if(t.length===0)return[];let n=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=xk(o.length,e.totalDocs);for(let{path:a,tf:l}of o){let u=e.documents[a];if(!u)continue;let d=l*(1.2+1),p=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);n.set(a,(n.get(a)||0)+m)}}return Array.from(n.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function jk(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};E.setDoc(s,xa,t),wo.delete(s)}function ko(s){let e=E.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",xa);if(!e)return wo.delete(s),null;let t=wo.get(s);if(t&&t.updatedAt===e.updated_at)return t.index;let n=E.getDoc(s,xa);if(!n)return null;let r={};for(let[i,a]of Object.entries(n.docLengths))r[i]={tokens:[],length:a};let o={documents:r,invertedIndex:n.invertedIndex,avgDocLength:n.avgDocLength,totalDocs:n.totalDocs,builtAt:n.builtAt};return wo.set(s,{index:o,updatedAt:e.updated_at}),o}async function Od(s,e){let t=await Rk(s);return jk(e,t),t}function Nd(s,e,t=15){let n=ko(s);return n?Ak(e,n).slice(0,t):[]}var $d,xa,wo,So=h(()=>{"use strict";Ta();te();J();$d=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);c(ps,"splitIdentifier");c(Ck,"tokenizeFile");c(Pk,"tokenizeQuery");c(Rk,"buildIndex");c(xk,"idf");c(Ak,"score");xa="bm25-index",wo=new Map;c(jk,"saveIndex");c(ko,"loadIndex");c(Od,"indexProject");c(Nd,"queryFiles")});import Aa from"node:fs/promises";import un from"node:path";import{z as V}from"zod";async function Ok(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=un.join(e,"package.json"),r=await Aa.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],l=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?l.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return I(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Nk(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await Uk(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let l=$k[a];if(!l)continue;l.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Mk(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,l=un.join(e,a);await b(l)?o.push(a):r.push(`${i.name} (${a})`)}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function Lk(s,e){let t=Date.now();try{let n=await Wk(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Fk(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=un.join(e,o.file);await b(i)?r.push(o.file):n.push(`${o.issue} (${o.file})`)}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Md(s,e){let t=Date.now(),n=await Promise.all([Ok(s,e),Nk(s,e),Mk(s,e),Lk(s,e),Fk(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function Uk(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Aa.readdir(r,{withFileTypes:!0});for(let i of o){let a=un.join(r,i.name),l=un.relative(s,a);if(!t.some(u=>u.test(l))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=un.extname(i.name);u&&e.add(u)}}}}catch{}}return c(n,"scanDir"),await n(s),Array.from(e)}async function Wk(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Aa.readdir(r,{withFileTypes:!0});for(let i of o){let a=un.join(r,i.name),l=un.relative(s,a);t.some(u=>u.test(l))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return c(n,"scanDir"),await n(s),e}var _k,Dk,Ik,ja,$k,Ld=h(()=>{"use strict";F();J();ro();_k=V.enum(["draft","verified","sealed"]),Dk=V.object({name:V.string(),description:V.string(),location:V.string().optional(),severity:V.enum(["low","medium","high"]).optional(),language:V.string().optional(),framework:V.string().optional(),source:V.enum(["baseline","repo","context7","feedback"]).optional(),confidence:V.number().min(0).max(1).optional()}),Ik=V.object({issue:V.string(),file:V.string(),suggestion:V.string(),severity:V.enum(["low","medium","high"]).optional(),language:V.string().optional(),framework:V.string().optional(),source:V.enum(["baseline","repo","context7","feedback"]).optional(),confidence:V.number().min(0).max(1).optional()}),ja=V.object({projectId:V.string(),languages:V.array(V.string()),frameworks:V.array(V.string()),packageManager:V.string().optional(),sourceDir:V.string().optional(),testDir:V.string().optional(),configFiles:V.array(V.string()),fileCount:V.number(),patterns:V.array(Dk),antiPatterns:V.array(Ik),analyzedAt:V.string(),modelMetadata:pr.optional(),status:_k.default("draft"),commitHash:V.string().optional(),signature:V.string().optional(),sealedAt:V.string().optional(),verifiedAt:V.string().optional()}),$k={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};c(Ok,"verifyFrameworks");c(Nk,"verifyLanguages");c(Mk,"verifyPatternLocations");c(Lk,"verifyFileCount");c(Fk,"verifyAntiPatternFiles");c(Md,"semanticVerify");c(Uk,"getProjectExtensions");c(Wk,"countProjectFiles")});import{createHash as Hk}from"node:crypto";function fr(s){return Hk("sha256").update(s).digest("hex")}function Fd(s){return fr(s).slice(0,16)}var vo=h(()=>{"use strict";c(fr,"sha256");c(Fd,"sha256Short")});var _a,xn,Ud=h(()=>{"use strict";ee();te();_a=class{static{c(this,"SyncPendingStorage")}append(e,t){let n=k(),r=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&E.run(e,`DELETE FROM sync_pending
546
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Pd)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},A=new yo,T=A});import Tk from"node:fs/promises";import Ek from"node:path";function ps(s){return s.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Ck(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of n)t.push(...ps(m));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of r){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ps(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(s))!==null;)g[1]&&t.push(...ps(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...ps(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...ps(g))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(s))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(s))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!$d.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function Pk(s){return s.split(/\s+/).flatMap(e=>ps(e)).filter(e=>e.length>1&&!$d.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Rk(s){let e=await tn(s),t={},n={},r=0,o=await rs(e,50,async a=>{try{let l=await Tk.readFile(Ek.join(s,a),"utf-8"),u=Ck(l,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:l}of o){t[a]={tokens:l,length:l.length},r+=l.length;let u=new Map;for(let d of l)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)n[d]||(n[d]=[]),n[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function xk(s,e){return Math.log((e-s+.5)/(s+.5)+1)}function Ak(s,e){let t=Pk(s);if(t.length===0)return[];let n=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=xk(o.length,e.totalDocs);for(let{path:a,tf:l}of o){let u=e.documents[a];if(!u)continue;let d=l*(1.2+1),p=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);n.set(a,(n.get(a)||0)+m)}}return Array.from(n.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function jk(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};T.setDoc(s,xa,t),wo.delete(s)}function ko(s){let e=T.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",xa);if(!e)return wo.delete(s),null;let t=wo.get(s);if(t&&t.updatedAt===e.updated_at)return t.index;let n=T.getDoc(s,xa);if(!n)return null;let r={};for(let[i,a]of Object.entries(n.docLengths))r[i]={tokens:[],length:a};let o={documents:r,invertedIndex:n.invertedIndex,avgDocLength:n.avgDocLength,totalDocs:n.totalDocs,builtAt:n.builtAt};return wo.set(s,{index:o,updatedAt:e.updated_at}),o}async function Od(s,e){let t=await Rk(s);return jk(e,t),t}function Nd(s,e,t=15){let n=ko(s);return n?Ak(e,n).slice(0,t):[]}var $d,xa,wo,So=h(()=>{"use strict";Ta();te();J();$d=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);c(ps,"splitIdentifier");c(Ck,"tokenizeFile");c(Pk,"tokenizeQuery");c(Rk,"buildIndex");c(xk,"idf");c(Ak,"score");xa="bm25-index",wo=new Map;c(jk,"saveIndex");c(ko,"loadIndex");c(Od,"indexProject");c(Nd,"queryFiles")});import Aa from"node:fs/promises";import un from"node:path";import{z as V}from"zod";async function Ok(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=un.join(e,"package.json"),r=await Aa.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],l=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?l.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return I(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Nk(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await Uk(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let l=$k[a];if(!l)continue;l.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Mk(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,l=un.join(e,a);await b(l)?o.push(a):r.push(`${i.name} (${a})`)}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function Lk(s,e){let t=Date.now();try{let n=await Wk(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Fk(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=un.join(e,o.file);await b(i)?r.push(o.file):n.push(`${o.issue} (${o.file})`)}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Md(s,e){let t=Date.now(),n=await Promise.all([Ok(s,e),Nk(s,e),Mk(s,e),Lk(s,e),Fk(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function Uk(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Aa.readdir(r,{withFileTypes:!0});for(let i of o){let a=un.join(r,i.name),l=un.relative(s,a);if(!t.some(u=>u.test(l))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=un.extname(i.name);u&&e.add(u)}}}}catch{}}return c(n,"scanDir"),await n(s),Array.from(e)}async function Wk(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Aa.readdir(r,{withFileTypes:!0});for(let i of o){let a=un.join(r,i.name),l=un.relative(s,a);t.some(u=>u.test(l))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return c(n,"scanDir"),await n(s),e}var _k,Dk,Ik,ja,$k,Ld=h(()=>{"use strict";F();J();ro();_k=V.enum(["draft","verified","sealed"]),Dk=V.object({name:V.string(),description:V.string(),location:V.string().optional(),severity:V.enum(["low","medium","high"]).optional(),language:V.string().optional(),framework:V.string().optional(),source:V.enum(["baseline","repo","context7","feedback"]).optional(),confidence:V.number().min(0).max(1).optional()}),Ik=V.object({issue:V.string(),file:V.string(),suggestion:V.string(),severity:V.enum(["low","medium","high"]).optional(),language:V.string().optional(),framework:V.string().optional(),source:V.enum(["baseline","repo","context7","feedback"]).optional(),confidence:V.number().min(0).max(1).optional()}),ja=V.object({projectId:V.string(),languages:V.array(V.string()),frameworks:V.array(V.string()),packageManager:V.string().optional(),sourceDir:V.string().optional(),testDir:V.string().optional(),configFiles:V.array(V.string()),fileCount:V.number(),patterns:V.array(Dk),antiPatterns:V.array(Ik),analyzedAt:V.string(),modelMetadata:pr.optional(),status:_k.default("draft"),commitHash:V.string().optional(),signature:V.string().optional(),sealedAt:V.string().optional(),verifiedAt:V.string().optional()}),$k={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};c(Ok,"verifyFrameworks");c(Nk,"verifyLanguages");c(Mk,"verifyPatternLocations");c(Lk,"verifyFileCount");c(Fk,"verifyAntiPatternFiles");c(Md,"semanticVerify");c(Uk,"getProjectExtensions");c(Wk,"countProjectFiles")});import{createHash as Hk}from"node:crypto";function fr(s){return Hk("sha256").update(s).digest("hex")}function Fd(s){return fr(s).slice(0,16)}var vo=h(()=>{"use strict";c(fr,"sha256");c(Fd,"sha256Short")});var _a,xn,Ud=h(()=>{"use strict";ee();te();_a=class{static{c(this,"SyncPendingStorage")}append(e,t){let n=k(),r=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&T.run(e,`DELETE FROM sync_pending
547
547
  WHERE project_id = ?
548
548
  AND entity_type = ?
549
549
  AND entity_id = ?
550
- AND content_hash = ?`,e,t.entityType,t.entityId,t.contentHash),E.run(e,`INSERT INTO sync_pending
550
+ AND content_hash = ?`,e,t.entityType,t.entityId,t.contentHash),T.run(e,`INSERT INTO sync_pending
551
551
  (project_id, entity_type, entity_id, event_type, content_hash, payload, enqueued_at)
552
- VALUES (?, ?, ?, ?, ?, ?, ?)`,e,t.entityType??null,t.entityId??null,t.eventType??null,t.contentHash??null,r,n),{id:E.get(e,"SELECT last_insert_rowid() AS id")?.id??0,event:t,enqueuedAt:n}}list(e,t){let n=t?"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC LIMIT ?":"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC";return(t?E.query(e,n,e,t):E.query(e,n,e)).map(o=>this.rowToEntry(o))}count(e){return E.get(e,"SELECT COUNT(*) AS n FROM sync_pending WHERE project_id = ?",e)?.n??0}clearUpTo(e,t){if(t<=0)return 0;let n=this.count(e);return E.run(e,"DELETE FROM sync_pending WHERE project_id = ? AND id <= ?",e,t),n-this.count(e)}clearAll(e){E.run(e,"DELETE FROM sync_pending WHERE project_id = ?",e)}clearByIds(e,t){if(t.length===0)return;let n=t.map(()=>"?").join(",");E.run(e,`DELETE FROM sync_pending WHERE project_id = ? AND id IN (${n})`,e,...t)}rowToEntry(e){let t;try{t=JSON.parse(e.payload)}catch{t={type:"unknown.corrupt",path:[],data:null,timestamp:e.enqueued_at,projectId:e.project_id}}return{id:e.id,event:t,enqueuedAt:e.enqueued_at}}},xn=new _a});var Da,$t,bo=h(()=>{"use strict";De();Ud();ee();J();Da=class{static{c(this,"SyncEventBus")}async publish(e){xn.append(e.projectId,e)}async getPending(e){return xn.list(e).map(t=>t.event)}async clearPending(e){xn.clearAll(e)}async getPendingEntries(e){return xn.list(e)}async clearPendingUpTo(e,t){return xn.clearUpTo(e,t)}async clearPendingByIds(e,t){xn.clearByIds(e,t)}async updateLastSync(e){let t=D.getLastSyncPath(e),n={timestamp:k(),success:!0};await pe(t,n)}async getLastSync(e){let t=D.getLastSyncPath(e);return await Ae(t,null)}},$t=new Da});var $a={};re($a,{default:()=>Le});import Bk from"node:crypto";import Wd from"node:fs/promises";import Hd from"node:os";import Gk from"node:path";function Gd(){return Bk.randomUUID()}var Vd,Bd,Ia,Vk,Le,ms=h(()=>{"use strict";De();J();Vd="https://api.prjct.app",Bd={apiKey:null,apiUrl:Vd,userId:null,email:null,lastAuth:null};c(Gd,"freshDeviceId");Ia=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=D.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ae(this.configPath),t=e??{...Bd},n=!1;if(t.deviceId||(t.deviceId=Gd(),n=!0),t.hostname||(t.hostname=Hd.hostname(),n=!0),this.cachedConfig=t,n&&e)try{await pe(this.configPath,this.cachedConfig),await Wd.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Gd()}async getHostname(){return(await this.read()).hostname??Hd.hostname()}async write(e){let n={...await this.read(),...e,lastAuth:new Date().toISOString()};await At(Gk.dirname(this.configPath)),await pe(this.configPath,n),await Wd.chmod(this.configPath,384),this.cachedConfig=n}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Vd}async saveAuth(e,t,n){await this.write({apiKey:e,userId:t,email:n})}async clearAuth(){this.cachedConfig={...Bd},await pe(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},Vk=new Ia,Le=Vk});import Jk from"node:crypto";function qk(s){let[e,t]=s.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function Xk(s){if(!s||typeof s!="object")return;let e=s;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let n=e[t];if(typeof n=="string"&&n.length>0)return n}}function zk(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(Kk(s)):JSON.stringify(s);return Jk.createHash("sha256").update(e).digest("hex")}function Kk(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function Yk(){if(To)return To;try{let{default:s}=await Promise.resolve().then(()=>(ms(),$a)),e=s;return typeof e.getDeviceId=="function"?(To=await e.getDeviceId(),To):"unknown-device"}catch{return"unknown-device"}}var To,We,dn=h(()=>{"use strict";bo();ao();ee();te();c(qk,"deriveEntityShape");c(Xk,"entityIdOf");c(zk,"hashPayload");c(Kk,"sortKeys");To=null;c(Yk,"_resolveDeviceId");We=class{static{c(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new oo({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r=qk(t),o={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:k(),projectId:e,entityType:r.entityType,entityId:Xk(n),eventType:r.eventType,contentHash:zk(n),deviceId:await Yk(),revisionCount:1};await $t.publish(o)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:k()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Oa,Oe,pn=h(()=>{"use strict";Ld();fo();ee();vo();dn();Oa=class extends We{static{c(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};ja.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:k()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=k(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return ja.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=k();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:bd(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await Md(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return fr(JSON.stringify(t))}},Oe=new Oa});var Na,Qk,Qe,gs=h(()=>{"use strict";ee();te();Na=class{static{c(this,"LLMAnalysisStorage")}save(e,t){let n=A.getDb(e),r=k();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),n.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=A.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(n=>({id:n.id,status:n.status,commitHash:n.commit_hash,analyzedAt:n.analyzed_at,supersededAt:n.superseded_at,analysis:JSON.parse(n.analysis)}))}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},Qk=new Na,Qe=Qk});import{z as S}from"zod";var Zk,Eo,eS,tS,Ma,qd,Xd,zd,Kd,Jd,nS,sS,rS,Yd,oS,Qd,Co=h(()=>{"use strict";ro();Zk=S.enum(["low","medium","high","critical"]),Eo=S.enum(["feature","bug","improvement","chore"]),eS=S.enum(["active","backlog","previously_active"]),tS=S.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ma=S.object({title:S.string(),description:S.string(),filesChanged:S.array(S.object({path:S.string(),action:S.enum(["created","modified","deleted"])})),whatWasDone:S.array(S.string()).min(1),outputForNextAgent:S.string().min(1),notes:S.string().optional()}),qd=S.object({output:S.string().min(1,"Subtask output is required"),summary:Ma}),Xd=S.object({id:S.string(),description:S.string(),domain:S.string(),agent:S.string(),status:tS,dependsOn:S.array(S.string()),startedAt:S.string().optional(),completedAt:S.string().optional(),output:S.string().optional(),summary:Ma.optional(),skipReason:S.string().optional(),blockReason:S.string().optional(),estimatedPoints:S.number().optional(),estimatedMinutes:S.number().optional()}),zd=S.object({completed:S.number(),total:S.number(),percentage:S.number()}),Kd=S.object({id:S.string(),description:S.string(),type:Eo.optional(),startedAt:S.string(),sessionId:S.string(),featureId:S.string().optional(),subtasks:S.array(Xd).optional(),currentSubtaskIndex:S.number().optional(),subtaskProgress:zd.optional(),linearId:S.string().optional(),linearUuid:S.string().optional(),linkedSpecId:S.string().optional(),estimatedPoints:S.number().optional(),estimatedMinutes:S.number().optional(),modelMetadata:pr.optional(),tokensIn:S.number().optional(),tokensOut:S.number().optional(),parentDescription:S.string().optional(),branch:S.string().optional(),prUrl:S.string().optional()}),Jd=S.object({id:S.string(),description:S.string(),status:S.literal("paused"),startedAt:S.string(),pausedAt:S.string(),pauseReason:S.string().optional(),type:Eo.optional(),sessionId:S.string().optional(),featureId:S.string().optional(),subtasks:S.array(Xd).optional(),currentSubtaskIndex:S.number().optional(),subtaskProgress:zd.optional(),linearId:S.string().optional(),linearUuid:S.string().optional(),estimatedPoints:S.number().optional(),estimatedMinutes:S.number().optional(),modelMetadata:pr.optional(),tokensIn:S.number().optional(),tokensOut:S.number().optional()}),nS=S.object({stackConfirmed:S.array(S.string()).optional(),patternsDiscovered:S.array(S.string()).optional(),agentAccuracy:S.array(S.object({agent:S.string(),rating:S.enum(["helpful","neutral","inaccurate"]),note:S.string().optional()})).optional(),issuesEncountered:S.array(S.string()).optional()}),sS=S.object({taskId:S.string(),title:S.string(),classification:Eo,startedAt:S.string(),completedAt:S.string(),subtaskCount:S.number(),subtaskSummaries:S.array(Ma),outcome:S.string(),branchName:S.string(),linearId:S.string().optional(),linearUuid:S.string().optional(),prUrl:S.string().optional(),feedback:nS.optional(),tokensIn:S.number().optional(),tokensOut:S.number().optional()}),rS=Kd.extend({workspaceId:S.string(),worktreePath:S.string().optional(),agentSessionId:S.string().optional(),jiraId:S.string().optional(),jiraUuid:S.string().optional(),dispatchedFrom:S.string().optional()}),Yd=S.object({currentTask:Kd.nullable(),previousTask:Jd.nullable().optional(),pausedTasks:S.array(Jd).optional(),taskHistory:S.array(sS).optional(),activeTasks:S.array(rS).optional(),lastUpdated:S.string()}),oS=S.object({id:S.string(),description:S.string(),body:S.string().optional(),priority:Zk,type:Eo,featureId:S.string().optional(),originFeature:S.string().optional(),completed:S.boolean(),completedAt:S.string().optional(),createdAt:S.string(),section:eS,agent:S.string().optional(),groupName:S.string().optional(),groupId:S.string().optional()}),Qd=S.object({tasks:S.array(oS),lastUpdated:S.string()})});var hr,La,An,Fa=h(()=>{"use strict";hr={idle:{transitions:["task"],prompt:"prjct task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"prjct status done Complete task | prjct status paused Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct task <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct task <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct task <description> Start new task",description:"Feature shipped"}},La=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){let n=null;if(t&&e?.activeTasks?.length&&(n=e.activeTasks.find(o=>o.workspaceId===t)),n||(n=e?.currentTask),!n)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof n.status=="string"?n.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return n?"working":"idle"}}canTransition(e,t){if(hr[e].transitions.includes(t))return{valid:!0};let r=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return hr[e]}getPrompt(e){return hr[e].prompt}getValidCommands(e){return hr[e].transitions}formatNextSteps(e){return hr[e].transitions.map(n=>{switch(n){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${n}`}})}},An=new La});import iS from"node:crypto";function Ie(){return iS.randomUUID()}var Bt=h(()=>{"use strict";c(Ie,"generateUUID")});var ep={};re(ep,{_resetPublishHelperCache:()=>pS,publishCRUD:()=>Zd,publishCRUDSync:()=>Ot});import aS from"node:crypto";function lS(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(uS(s)):JSON.stringify(s);return aS.createHash("sha256").update(e).digest("hex")}function uS(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function dS(){if(Po)return Po;try{let{default:s}=await Promise.resolve().then(()=>(ms(),$a)),e=s;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Po=t,t}return"unknown-device"}catch{return"unknown-device"}}function pS(){Po=null}async function Zd(s){try{let e=await dS(),t=lS(s.data),n={type:`${s.entityType}.${cS[s.eventType]}`,path:[s.entityType,s.entityId],data:s.data,timestamp:new Date().toISOString(),projectId:s.projectId,entityType:s.entityType,entityId:s.entityId,eventType:s.eventType,contentHash:t,deviceId:e,originDeviceId:s.originDeviceId??e,revisionCount:s.revisionCount??1};await $t.publish(n)}catch{}}function Ot(s){Zd(s)}var cS,Po,yr=h(()=>{"use strict";bo();cS={upsert:"updated",delete:"deleted"};c(lS,"hashPayload");c(uS,"sortKeys");Po=null;c(dS,"resolveDeviceId");c(pS,"_resetPublishHelperCache");c(Zd,"publishCRUD");c(Ot,"publishCRUDSync")});var Gt,Ua,mt,jn=h(()=>{"use strict";Bt();yr();ee();te();Gt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ua=class{static{c(this,"ArchiveStorage")}archive(e,t){let n=Ie(),r=k();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),Ot({projectId:e,entityType:"archives",entityId:n,eventType:"upsert",data:{id:n,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:r}}),n}archiveMany(e,t){if(t.length===0)return 0;let n=k();return A.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Ie(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},mt=new Ua});async function tp(s,e,t){let n=await s.read(e);if(!n.currentTask)return null;s.validateTransition(n,"pause");let r={...n.currentTask,status:"paused",pausedAt:k(),pauseReason:t},o=s.getPausedTasksFromState(n),i=[r,...o].slice(0,s.maxPausedTasks);return await s.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:k()})),await s.publish(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async function np(s,e,t){let n=await s.read(e),r=s.getPausedTasksFromState(n);if(r.length===0)return null;s.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,w)=>w!==o),{status:l,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:k(),sessionId:i.sessionId??Ie()};return await s.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:k()})),await s.publish(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}async function sp(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async function rp(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];mt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await s.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:k()}));for(let a of o)await s.publish(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}var op=h(()=>{"use strict";Bt();ee();jn();c(tp,"pauseTask");c(np,"resumeTask");c(sp,"getStalePausedTasks");c(rp,"archiveStalePausedTasks")});async function ip(s,e){await s.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:k()}))}async function ap(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async function cp(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)[0]||null}async function lp(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)}async function Wa(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)}async function up(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)[0]||null}async function dp(s,e,t){let n=await s.read(e);return s.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async function pp(s,e){let n=(await Wa(s,e)).filter(m=>m.feedback),r=[],o=[],i=[],a=[];for(let m of n){let g=m.feedback;Array.isArray(g.stackConfirmed)&&r.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let l=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}var mp=h(()=>{"use strict";ee();c(ip,"clearTask");c(ap,"hasTask");c(cp,"getPausedTask");c(lp,"getAllPausedTasks");c(Wa,"getTaskHistory");c(up,"getMostRecentTask");c(dp,"getTaskHistoryByType");c(pp,"getAggregatedFeedback")});async function gp(s,e,t){let n=await s.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?k():void 0,dependsOn:o.dependsOn||[]}));await s.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:k()})),await s.publish(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function fp(s,e,t){let n=qd.safeParse(t);if(!n.success){let w=n.error.issues.map(x=>`${x.path.join(".")}: ${x.message}`);throw new Error(`Subtask completion requires handoff data:
552
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,e,t.entityType??null,t.entityId??null,t.eventType??null,t.contentHash??null,r,n),{id:T.get(e,"SELECT last_insert_rowid() AS id")?.id??0,event:t,enqueuedAt:n}}list(e,t){let n=t?"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC LIMIT ?":"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC";return(t?T.query(e,n,e,t):T.query(e,n,e)).map(o=>this.rowToEntry(o))}count(e){return T.get(e,"SELECT COUNT(*) AS n FROM sync_pending WHERE project_id = ?",e)?.n??0}clearUpTo(e,t){if(t<=0)return 0;let n=this.count(e);return T.run(e,"DELETE FROM sync_pending WHERE project_id = ? AND id <= ?",e,t),n-this.count(e)}clearAll(e){T.run(e,"DELETE FROM sync_pending WHERE project_id = ?",e)}clearByIds(e,t){if(t.length===0)return;let n=t.map(()=>"?").join(",");T.run(e,`DELETE FROM sync_pending WHERE project_id = ? AND id IN (${n})`,e,...t)}rowToEntry(e){let t;try{t=JSON.parse(e.payload)}catch{t={type:"unknown.corrupt",path:[],data:null,timestamp:e.enqueued_at,projectId:e.project_id}}return{id:e.id,event:t,enqueuedAt:e.enqueued_at}}},xn=new _a});var Da,$t,bo=h(()=>{"use strict";De();Ud();ee();J();Da=class{static{c(this,"SyncEventBus")}async publish(e){xn.append(e.projectId,e)}async getPending(e){return xn.list(e).map(t=>t.event)}async clearPending(e){xn.clearAll(e)}async getPendingEntries(e){return xn.list(e)}async clearPendingUpTo(e,t){return xn.clearUpTo(e,t)}async clearPendingByIds(e,t){xn.clearByIds(e,t)}async updateLastSync(e){let t=D.getLastSyncPath(e),n={timestamp:k(),success:!0};await pe(t,n)}async getLastSync(e){let t=D.getLastSyncPath(e);return await Ae(t,null)}},$t=new Da});var $a={};re($a,{default:()=>Le});import Bk from"node:crypto";import Wd from"node:fs/promises";import Hd from"node:os";import Gk from"node:path";function Gd(){return Bk.randomUUID()}var Vd,Bd,Ia,Vk,Le,ms=h(()=>{"use strict";De();J();Vd="https://api.prjct.app",Bd={apiKey:null,apiUrl:Vd,userId:null,email:null,lastAuth:null};c(Gd,"freshDeviceId");Ia=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=D.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ae(this.configPath),t=e??{...Bd},n=!1;if(t.deviceId||(t.deviceId=Gd(),n=!0),t.hostname||(t.hostname=Hd.hostname(),n=!0),this.cachedConfig=t,n&&e)try{await pe(this.configPath,this.cachedConfig),await Wd.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Gd()}async getHostname(){return(await this.read()).hostname??Hd.hostname()}async write(e){let n={...await this.read(),...e,lastAuth:new Date().toISOString()};await At(Gk.dirname(this.configPath)),await pe(this.configPath,n),await Wd.chmod(this.configPath,384),this.cachedConfig=n}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Vd}async saveAuth(e,t,n){await this.write({apiKey:e,userId:t,email:n})}async clearAuth(){this.cachedConfig={...Bd},await pe(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},Vk=new Ia,Le=Vk});import Jk from"node:crypto";function qk(s){let[e,t]=s.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function Xk(s){if(!s||typeof s!="object")return;let e=s;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let n=e[t];if(typeof n=="string"&&n.length>0)return n}}function zk(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(Kk(s)):JSON.stringify(s);return Jk.createHash("sha256").update(e).digest("hex")}function Kk(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function Yk(){if(To)return To;try{let{default:s}=await Promise.resolve().then(()=>(ms(),$a)),e=s;return typeof e.getDeviceId=="function"?(To=await e.getDeviceId(),To):"unknown-device"}catch{return"unknown-device"}}var To,We,dn=h(()=>{"use strict";bo();ao();ee();te();c(qk,"deriveEntityShape");c(Xk,"entityIdOf");c(zk,"hashPayload");c(Kk,"sortKeys");To=null;c(Yk,"_resolveDeviceId");We=class{static{c(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new oo({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r=qk(t),o={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:k(),projectId:e,entityType:r.entityType,entityId:Xk(n),eventType:r.eventType,contentHash:zk(n),deviceId:await Yk(),revisionCount:1};await $t.publish(o)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:k()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Oa,Oe,pn=h(()=>{"use strict";Ld();fo();ee();vo();dn();Oa=class extends We{static{c(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};ja.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:k()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=k(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return ja.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=k();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:bd(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await Md(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return fr(JSON.stringify(t))}},Oe=new Oa});var Na,Qk,Qe,gs=h(()=>{"use strict";ee();te();Na=class{static{c(this,"LLMAnalysisStorage")}save(e,t){let n=A.getDb(e),r=k();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),n.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=A.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(n=>({id:n.id,status:n.status,commitHash:n.commit_hash,analyzedAt:n.analyzed_at,supersededAt:n.superseded_at,analysis:JSON.parse(n.analysis)}))}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},Qk=new Na,Qe=Qk});import{z as S}from"zod";var Zk,Eo,eS,tS,Ma,qd,Xd,zd,Kd,Jd,nS,sS,rS,Yd,oS,Qd,Co=h(()=>{"use strict";ro();Zk=S.enum(["low","medium","high","critical"]),Eo=S.enum(["feature","bug","improvement","chore"]),eS=S.enum(["active","backlog","previously_active"]),tS=S.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ma=S.object({title:S.string(),description:S.string(),filesChanged:S.array(S.object({path:S.string(),action:S.enum(["created","modified","deleted"])})),whatWasDone:S.array(S.string()).min(1),outputForNextAgent:S.string().min(1),notes:S.string().optional()}),qd=S.object({output:S.string().min(1,"Subtask output is required"),summary:Ma}),Xd=S.object({id:S.string(),description:S.string(),domain:S.string(),agent:S.string(),status:tS,dependsOn:S.array(S.string()),startedAt:S.string().optional(),completedAt:S.string().optional(),output:S.string().optional(),summary:Ma.optional(),skipReason:S.string().optional(),blockReason:S.string().optional(),estimatedPoints:S.number().optional(),estimatedMinutes:S.number().optional()}),zd=S.object({completed:S.number(),total:S.number(),percentage:S.number()}),Kd=S.object({id:S.string(),description:S.string(),type:Eo.optional(),startedAt:S.string(),sessionId:S.string(),featureId:S.string().optional(),subtasks:S.array(Xd).optional(),currentSubtaskIndex:S.number().optional(),subtaskProgress:zd.optional(),linearId:S.string().optional(),linearUuid:S.string().optional(),linkedSpecId:S.string().optional(),estimatedPoints:S.number().optional(),estimatedMinutes:S.number().optional(),modelMetadata:pr.optional(),tokensIn:S.number().optional(),tokensOut:S.number().optional(),parentDescription:S.string().optional(),branch:S.string().optional(),prUrl:S.string().optional()}),Jd=S.object({id:S.string(),description:S.string(),status:S.literal("paused"),startedAt:S.string(),pausedAt:S.string(),pauseReason:S.string().optional(),type:Eo.optional(),sessionId:S.string().optional(),featureId:S.string().optional(),subtasks:S.array(Xd).optional(),currentSubtaskIndex:S.number().optional(),subtaskProgress:zd.optional(),linearId:S.string().optional(),linearUuid:S.string().optional(),estimatedPoints:S.number().optional(),estimatedMinutes:S.number().optional(),modelMetadata:pr.optional(),tokensIn:S.number().optional(),tokensOut:S.number().optional()}),nS=S.object({stackConfirmed:S.array(S.string()).optional(),patternsDiscovered:S.array(S.string()).optional(),agentAccuracy:S.array(S.object({agent:S.string(),rating:S.enum(["helpful","neutral","inaccurate"]),note:S.string().optional()})).optional(),issuesEncountered:S.array(S.string()).optional()}),sS=S.object({taskId:S.string(),title:S.string(),classification:Eo,startedAt:S.string(),completedAt:S.string(),subtaskCount:S.number(),subtaskSummaries:S.array(Ma),outcome:S.string(),branchName:S.string(),linearId:S.string().optional(),linearUuid:S.string().optional(),prUrl:S.string().optional(),feedback:nS.optional(),tokensIn:S.number().optional(),tokensOut:S.number().optional()}),rS=Kd.extend({workspaceId:S.string(),worktreePath:S.string().optional(),agentSessionId:S.string().optional(),jiraId:S.string().optional(),jiraUuid:S.string().optional(),dispatchedFrom:S.string().optional()}),Yd=S.object({currentTask:Kd.nullable(),previousTask:Jd.nullable().optional(),pausedTasks:S.array(Jd).optional(),taskHistory:S.array(sS).optional(),activeTasks:S.array(rS).optional(),lastUpdated:S.string()}),oS=S.object({id:S.string(),description:S.string(),body:S.string().optional(),priority:Zk,type:Eo,featureId:S.string().optional(),originFeature:S.string().optional(),completed:S.boolean(),completedAt:S.string().optional(),createdAt:S.string(),section:eS,agent:S.string().optional(),groupName:S.string().optional(),groupId:S.string().optional()}),Qd=S.object({tasks:S.array(oS),lastUpdated:S.string()})});var hr,La,An,Fa=h(()=>{"use strict";hr={idle:{transitions:["task"],prompt:"prjct task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"prjct status done Complete task | prjct status paused Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct task <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct task <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct task <description> Start new task",description:"Feature shipped"}},La=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){let n=null;if(t&&e?.activeTasks?.length&&(n=e.activeTasks.find(o=>o.workspaceId===t)),n||(n=e?.currentTask),!n)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof n.status=="string"?n.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return n?"working":"idle"}}canTransition(e,t){if(hr[e].transitions.includes(t))return{valid:!0};let r=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return hr[e]}getPrompt(e){return hr[e].prompt}getValidCommands(e){return hr[e].transitions}formatNextSteps(e){return hr[e].transitions.map(n=>{switch(n){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${n}`}})}},An=new La});import iS from"node:crypto";function Ie(){return iS.randomUUID()}var Bt=h(()=>{"use strict";c(Ie,"generateUUID")});var ep={};re(ep,{_resetPublishHelperCache:()=>pS,publishCRUD:()=>Zd,publishCRUDSync:()=>Ot});import aS from"node:crypto";function lS(s){let e=s&&typeof s=="object"&&!Array.isArray(s)?JSON.stringify(uS(s)):JSON.stringify(s);return aS.createHash("sha256").update(e).digest("hex")}function uS(s){let e={};for(let t of Object.keys(s).sort())e[t]=s[t];return e}async function dS(){if(Po)return Po;try{let{default:s}=await Promise.resolve().then(()=>(ms(),$a)),e=s;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Po=t,t}return"unknown-device"}catch{return"unknown-device"}}function pS(){Po=null}async function Zd(s){try{let e=await dS(),t=lS(s.data),n={type:`${s.entityType}.${cS[s.eventType]}`,path:[s.entityType,s.entityId],data:s.data,timestamp:new Date().toISOString(),projectId:s.projectId,entityType:s.entityType,entityId:s.entityId,eventType:s.eventType,contentHash:t,deviceId:e,originDeviceId:s.originDeviceId??e,revisionCount:s.revisionCount??1};await $t.publish(n)}catch{}}function Ot(s){Zd(s)}var cS,Po,yr=h(()=>{"use strict";bo();cS={upsert:"updated",delete:"deleted"};c(lS,"hashPayload");c(uS,"sortKeys");Po=null;c(dS,"resolveDeviceId");c(pS,"_resetPublishHelperCache");c(Zd,"publishCRUD");c(Ot,"publishCRUDSync")});var Gt,Ua,mt,jn=h(()=>{"use strict";Bt();yr();ee();te();Gt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ua=class{static{c(this,"ArchiveStorage")}archive(e,t){let n=Ie(),r=k();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),Ot({projectId:e,entityType:"archives",entityId:n,eventType:"upsert",data:{id:n,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:r}}),n}archiveMany(e,t){if(t.length===0)return 0;let n=k();return A.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Ie(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},mt=new Ua});async function tp(s,e,t){let n=await s.read(e);if(!n.currentTask)return null;s.validateTransition(n,"pause");let r={...n.currentTask,status:"paused",pausedAt:k(),pauseReason:t},o=s.getPausedTasksFromState(n),i=[r,...o].slice(0,s.maxPausedTasks);return await s.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:k()})),await s.publish(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async function np(s,e,t){let n=await s.read(e),r=s.getPausedTasksFromState(n);if(r.length===0)return null;s.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,w)=>w!==o),{status:l,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:k(),sessionId:i.sessionId??Ie()};return await s.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:k()})),await s.publish(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}async function sp(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async function rp(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t),r=Date.now()-s.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];mt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await s.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:k()}));for(let a of o)await s.publish(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}var op=h(()=>{"use strict";Bt();ee();jn();c(tp,"pauseTask");c(np,"resumeTask");c(sp,"getStalePausedTasks");c(rp,"archiveStalePausedTasks")});async function ip(s,e){await s.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:k()}))}async function ap(s,e){let t=await s.read(e),n=s.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async function cp(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)[0]||null}async function lp(s,e){let t=await s.read(e);return s.getPausedTasksFromState(t)}async function Wa(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)}async function up(s,e){let t=await s.read(e);return s.getTaskHistoryFromState(t)[0]||null}async function dp(s,e,t){let n=await s.read(e);return s.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async function pp(s,e){let n=(await Wa(s,e)).filter(m=>m.feedback),r=[],o=[],i=[],a=[];for(let m of n){let g=m.feedback;Array.isArray(g.stackConfirmed)&&r.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let l=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}var mp=h(()=>{"use strict";ee();c(ip,"clearTask");c(ap,"hasTask");c(cp,"getPausedTask");c(lp,"getAllPausedTasks");c(Wa,"getTaskHistory");c(up,"getMostRecentTask");c(dp,"getTaskHistoryByType");c(pp,"getAggregatedFeedback")});async function gp(s,e,t){let n=await s.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?k():void 0,dependsOn:o.dependsOn||[]}));await s.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:k()})),await s.publish(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function fp(s,e,t){let n=qd.safeParse(t);if(!n.success){let w=n.error.issues.map(x=>`${x.path.join(".")}: ${x.message}`);throw new Error(`Subtask completion requires handoff data:
553
553
  ${w.join(`
554
554
  `)}`)}let{output:r,summary:o}=n.data,i=await s.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,l=i.currentTask.subtasks[a];if(!l)return null;let u=[...i.currentTask.subtasks];u[a]={...l,status:"completed",completedAt:k(),output:r,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:k()}),await s.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:k()})),await s.publish(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:l.id,description:l.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async function hp(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async function yp(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async function Ha(s,e){let t=await s.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async function wp(s,e){let t=await Ha(s,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function kp(s,e){return(await s.read(e)).currentTask?.subtasks||[]}async function Sp(s,e){return(await s.read(e)).currentTask?.subtaskProgress||null}async function vp(s,e){return((await s.read(e)).currentTask?.subtasks?.length||0)>0}async function bp(s,e){let t=await s.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async function Tp(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:k(),output:`Failed: ${t}`};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:k()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await s.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:k()})),await s.publish(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<l?i[a]:null}async function Ep(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:k(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:k()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await s.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:k()})),await s.publish(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<l?i[a]:null}async function Cp(s,e,t){let n=await s.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,l=i.length;return a<l&&(i[a]={...i[a],status:"in_progress",startedAt:k()}),await s.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r},lastUpdated:k()})),await s.publish(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<l?i[a]:null}var Pp=h(()=>{"use strict";Co();ee();c(gp,"createSubtasks");c(fp,"completeSubtask");c(hp,"getCurrentSubtask");c(yp,"getNextSubtask");c(Ha,"getPreviousSubtask");c(wp,"getPreviousHandoff");c(kp,"getSubtasks");c(Sp,"getSubtaskProgress");c(vp,"hasSubtasks");c(bp,"areAllSubtasksComplete");c(Tp,"failSubtask");c(Ep,"skipSubtask");c(Cp,"blockSubtask")});async function Rp(s,e,t,n){let r={...t,workspaceId:n,startedAt:k()};return await s.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],r],lastUpdated:k()})),await s.publish(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId,workspaceId:n}),r}async function xp(s,e,t){return((await s.read(e)).activeTasks||[]).find(r=>r.workspaceId===t)??null}async function Ap(s,e,t,n){let r=await s.read(e),i=(r.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=k(),l=s.createTaskHistoryEntry(i,a,n),u=s.getTaskHistoryFromState(r),d=[l,...u].slice(0,s.maxTaskHistory);return await s.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await s.publish(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async function jp(s,e){return(await s.read(e)).activeTasks||[]}async function _p(s,e){return((await s.read(e)).activeTasks||[]).length}async function Dp(s,e,t,n){let o=(await s.read(e)).activeTasks||[],i=o.findIndex(l=>l.workspaceId===t);if(i===-1)return null;let a={...o[i],...n,workspaceId:t};return await s.update(e,l=>{let u=[...l.activeTasks||[]];return u[i]=a,{...l,activeTasks:u,lastUpdated:k()}}),a}async function Ip(s,e,t,n){let r=await s.read(e);if(!r.currentTask)return null;let o=(r.currentTask.tokensIn||0)+t,i=(r.currentTask.tokensOut||0)+n;return await s.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:k()})),{tokensIn:o,tokensOut:i}}var $p=h(()=>{"use strict";ee();c(Rp,"startTaskInWorkspace");c(xp,"getCurrentTaskForWorkspace");c(Ap,"completeTaskInWorkspace");c(jp,"getActiveTasks");c(_p,"getActiveTaskCount");c(Dp,"updateWorkspaceTask");c(Ip,"addTokens")});var Ba,B,Ze=h(()=>{"use strict";Co();ee();Fa();op();mp();Pp();$p();dn();Ba=class extends We{static{c(this,"StateStorage")}constructor(){super("state.json",Yd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=An.getCurrentState(e),r=An.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async getPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:k()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:k()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:k()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=k(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),l=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=r.length>0?r.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:r,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return n&&(i.feedback=n),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;lifecycleBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),validateTransition:this.validateTransition.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),maxPausedTasks:this.maxPausedTasks,stalenessThresholdDays:this.stalenessThresholdDays}}async pauseTask(e,t){return tp(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return np(this.lifecycleBackend(),e,t)}getPausedTasksFromState(e){return Array.isArray(e.pausedTasks)&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){return sp(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return rp(this.lifecycleBackend(),e)}queryBackend(){return{read:this.read.bind(this),update:this.update.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this)}}async clearTask(e){return ip(this.queryBackend(),e)}async hasTask(e){return ap(this.queryBackend(),e)}async getPausedTask(e){return cp(this.queryBackend(),e)}async getAllPausedTasks(e){return lp(this.queryBackend(),e)}async getTaskHistory(e){return Wa(this.queryBackend(),e)}async getMostRecentTask(e){return up(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return dp(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return pp(this.queryBackend(),e)}workspaceBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),createTaskHistoryEntry:this.createTaskHistoryEntry.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this),maxTaskHistory:this.maxTaskHistory}}async startTaskInWorkspace(e,t,n){return Rp(this.workspaceBackend(),e,t,n)}async getCurrentTaskForWorkspace(e,t){return xp(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,n){return Ap(this.workspaceBackend(),e,t,n)}async getActiveTasks(e){return jp(this.workspaceBackend(),e)}async getActiveTaskCount(e){return _p(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,n){return Dp(this.workspaceBackend(),e,t,n)}async addTokens(e,t,n){return Ip(this.workspaceBackend(),e,t,n)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return gp(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return fp(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return hp(this.subtaskBackend(),e)}async getNextSubtask(e){return yp(this.subtaskBackend(),e)}async getPreviousSubtask(e){return Ha(this.subtaskBackend(),e)}async getPreviousHandoff(e){return wp(this.subtaskBackend(),e)}async getSubtasks(e){return kp(this.subtaskBackend(),e)}async getSubtaskProgress(e){return Sp(this.subtaskBackend(),e)}async hasSubtasks(e){return vp(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return bp(this.subtaskBackend(),e)}async failSubtask(e,t){return Tp(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return Ep(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return Cp(this.subtaskBackend(),e,t)}},B=new Ba});function wS(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if(yS.has(s)||s.includes("prjct"))return{level:fs.debug,name:"debug"};let e=fs[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function Ro(s,e,t){return Op>=s?(...n)=>console[t](e,...n):SS}var fs,yS,Op,kS,SS,vS,M,Nt=h(()=>{"use strict";fs={error:0,warn:1,info:2,debug:3},yS=new Set(["1","true","*"]);c(wS,"getLogLevel");({level:Op,name:kS}=wS()),SS=c(()=>{},"noop");c(Ro,"createLogMethod");vS={error:Ro(fs.error,"[prjct:error]","error"),warn:Ro(fs.warn,"[prjct:warn]","warn"),info:Ro(fs.info,"[prjct:info]","log"),debug:Ro(fs.debug,"[prjct:debug]","log"),isEnabled:c(()=>Op>=0,"isEnabled"),level:c(()=>kS,"level")},M=vS});import Np from"node:fs/promises";import Mp from"node:path";async function Va(s,e,t,n){let[r,o,i,a]=await Promise.all([ES(s,e,n),CS(s),PS(s),RS(s)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,bS).map(l=>({message:l.message,date:l.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:r,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function ES(s,e,t){let n=[],r=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Nd(s,r,Ga*2);for(let a of o){if(n.length>=Ga)break;try{let l=Mp.join(e,a.path),u=await Np.readFile(l,"utf-8");u.length>xo*3?n.push({path:a.path,content:`${u.slice(0,xo)}
555
555
  // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,xo),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=Ga)break;if(!n.some(l=>l.path===a))try{let l=Mp.join(e,a),u=await Np.readFile(l,"utf-8");n.push({path:a,content:u.slice(0,xo),reason:"entry point"})}catch{}}return n}async function CS(s){try{let e=await Oe.getActive(s);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function PS(s){try{return(await B.getTaskHistory(s)).slice(0,TS).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function RS(s){try{let e=Qe.getActiveSummary(s);return Promise.resolve(e)}catch(e){return M.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var xo,Ga,bS,TS,Lp=h(()=>{"use strict";So();pn();gs();Ze();Nt();xo=800,Ga=6,bS=8,TS=5;c(Va,"buildAnalysisPayload");c(ES,"selectCodeSamples");c(CS,"getExistingPatterns");c(PS,"getTaskHistory");c(RS,"getPreviousAnalysisSummary")});async function AS(s,e=100){try{let{stdout:t}=await N(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:s,maxBuffer:10485760}),n=[],r=null;for(let o of t.split(`
556
- `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=30&&n.push(r),r=new Set):i&&r&&jS(i)&&r.add(i)}return r&&r.size>0&&r.size<=30&&n.push(r),n}catch{return[]}}function jS(s){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(s)&&!s.includes("node_modules/")}async function _S(s,e=100){let t=await AS(s,e),n=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let l of a)n.set(l,(n.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=DS(a[l],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[l,u]=i.split("\0"),d=n.get(l)||0,p=n.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[l]||(o[l]={}),o[u]||(o[u]={}),o[l][u]=g,o[u][l]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function DS(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function IS(s,e){E.setDoc(s,Ja,e),Ao.delete(s)}function Wp(s){let e=E.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",Ja);if(!e)return Ao.delete(s),null;let t=Ao.get(s);if(t&&t.updatedAt===e.updated_at)return t.matrix;let n=E.getDoc(s,Ja);return n&&Ao.set(s,{matrix:n,updatedAt:e.updated_at}),n}async function Hp(s,e,t=100){let n=await _S(s,t);return IS(e,n),n}var Ja,Ao,qa=h(()=>{"use strict";Ta();te();Ue();c(AS,"parseGitLog");c(jS,"isSourceFile");c(_S,"buildMatrix");c(DS,"pairKey");Ja="cochange-index",Ao=new Map;c(IS,"saveMatrix");c(Wp,"loadMatrix");c(Hp,"indexCoChanges")});import Bp from"node:fs/promises";import hs from"node:path";function $S(s){let e=[],t,n=new RegExp(Bu.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function OS(s,e,t){let n;if(s.startsWith("@/"))n=hs.join(t,"src",s.slice(2));else{let r=hs.dirname(hs.join(t,e));n=hs.resolve(r,s)}for(let r of Hu){let o=n+r;try{if((await Bp.stat(o)).isFile())return hs.relative(t,o)}catch{}}return null}async function NS(s){let e=await tn(s),t={},n={},r=0,o=await rs(e,50,async i=>{try{let a=await Bp.readFile(hs.join(s,i),"utf-8"),l=$S(a),u=[];for(let d of l){let p=await OS(d,i,s);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,r+=a.length;for(let l of a)n[l]||(n[l]=[]),n[l].push(i)}return{forward:t,reverse:n,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function MS(s,e){E.setDoc(s,Xa,e),jo.delete(s)}function _o(s){let e=E.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",Xa);if(!e)return jo.delete(s),null;let t=jo.get(s);if(t&&t.updatedAt===e.updated_at)return t.graph;let n=E.getDoc(s,Xa);return n&&jo.set(s,{graph:n,updatedAt:e.updated_at}),n}async function Gp(s,e){let t=await NS(s);return MS(e,t),t}var Xa,jo,Do=h(()=>{"use strict";sa();te();J();c($S,"extractImportSources");c(OS,"resolveImport");c(NS,"buildGraph");Xa="import-graph",jo=new Map;c(MS,"saveGraph");c(_o,"loadGraph");c(Gp,"indexImports")});var Qa={};re(Qa,{default:()=>VS,getTemplateContent:()=>et,listTemplates:()=>Oo,resetBundle:()=>BS});import Ka from"node:fs";import LS from"node:fs/promises";import $o from"node:path";function Ya(){if(za)return Io;za=!0;let s=$o.join(dt,"dist","templates.json");try{let e=Ka.readFileSync(s,"utf-8");return Io=JSON.parse(e),Io}catch{return null}}function US(s){let e=_n.indexOf(s);e>-1&&_n.splice(e,1),_n.push(s)}function WS(){for(;ys.size>=FS&&_n.length>0;){let s=_n.shift();s&&ys.delete(s)}}function Vp(s){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=s.match(e);if(!t)return{frontmatter:{},content:s.trim()};let[,n,r]=t,o={};return n.split(`
556
+ `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=30&&n.push(r),r=new Set):i&&r&&jS(i)&&r.add(i)}return r&&r.size>0&&r.size<=30&&n.push(r),n}catch{return[]}}function jS(s){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(s)&&!s.includes("node_modules/")}async function _S(s,e=100){let t=await AS(s,e),n=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let l of a)n.set(l,(n.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=DS(a[l],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[l,u]=i.split("\0"),d=n.get(l)||0,p=n.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[l]||(o[l]={}),o[u]||(o[u]={}),o[l][u]=g,o[u][l]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function DS(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function IS(s,e){T.setDoc(s,Ja,e),Ao.delete(s)}function Wp(s){let e=T.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",Ja);if(!e)return Ao.delete(s),null;let t=Ao.get(s);if(t&&t.updatedAt===e.updated_at)return t.matrix;let n=T.getDoc(s,Ja);return n&&Ao.set(s,{matrix:n,updatedAt:e.updated_at}),n}async function Hp(s,e,t=100){let n=await _S(s,t);return IS(e,n),n}var Ja,Ao,qa=h(()=>{"use strict";Ta();te();Ue();c(AS,"parseGitLog");c(jS,"isSourceFile");c(_S,"buildMatrix");c(DS,"pairKey");Ja="cochange-index",Ao=new Map;c(IS,"saveMatrix");c(Wp,"loadMatrix");c(Hp,"indexCoChanges")});import Bp from"node:fs/promises";import hs from"node:path";function $S(s){let e=[],t,n=new RegExp(Bu.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function OS(s,e,t){let n;if(s.startsWith("@/"))n=hs.join(t,"src",s.slice(2));else{let r=hs.dirname(hs.join(t,e));n=hs.resolve(r,s)}for(let r of Hu){let o=n+r;try{if((await Bp.stat(o)).isFile())return hs.relative(t,o)}catch{}}return null}async function NS(s){let e=await tn(s),t={},n={},r=0,o=await rs(e,50,async i=>{try{let a=await Bp.readFile(hs.join(s,i),"utf-8"),l=$S(a),u=[];for(let d of l){let p=await OS(d,i,s);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,r+=a.length;for(let l of a)n[l]||(n[l]=[]),n[l].push(i)}return{forward:t,reverse:n,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function MS(s,e){T.setDoc(s,Xa,e),jo.delete(s)}function _o(s){let e=T.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",Xa);if(!e)return jo.delete(s),null;let t=jo.get(s);if(t&&t.updatedAt===e.updated_at)return t.graph;let n=T.getDoc(s,Xa);return n&&jo.set(s,{graph:n,updatedAt:e.updated_at}),n}async function Gp(s,e){let t=await NS(s);return MS(e,t),t}var Xa,jo,Do=h(()=>{"use strict";sa();te();J();c($S,"extractImportSources");c(OS,"resolveImport");c(NS,"buildGraph");Xa="import-graph",jo=new Map;c(MS,"saveGraph");c(_o,"loadGraph");c(Gp,"indexImports")});var Qa={};re(Qa,{default:()=>VS,getTemplateContent:()=>et,listTemplates:()=>Oo,resetBundle:()=>BS});import Ka from"node:fs";import LS from"node:fs/promises";import $o from"node:path";function Ya(){if(za)return Io;za=!0;let s=$o.join(dt,"dist","templates.json");try{let e=Ka.readFileSync(s,"utf-8");return Io=JSON.parse(e),Io}catch{return null}}function US(s){let e=_n.indexOf(s);e>-1&&_n.splice(e,1),_n.push(s)}function WS(){for(;ys.size>=FS&&_n.length>0;){let s=_n.shift();s&&ys.delete(s)}}function Vp(s){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=s.match(e);if(!t)return{frontmatter:{},content:s.trim()};let[,n,r]=t,o={};return n.split(`
557
557
  `).forEach(i=>{let[a,...l]=i.split(":");if(a&&l.length>0){let u=l.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:r.trim()}}async function Jp(s){if(ys.has(s))return US(s),ys.get(s);let e,t=Ya();if(t){let r=`commands/${s}.md`;e=t[r]}if(!e){let r=$o.join(dt,"templates","commands",`${s}.md`);try{e=await LS.readFile(r,"utf-8")}catch{throw Yr.notFound(s)}}let n=Vp(e);return WS(),ys.set(s,n),_n.push(s),n}async function HS(s){return(await Jp(s)).frontmatter["allowed-tools"]||[]}function qp(){ys.clear(),_n.length=0}function BS(){Io=null,za=!1,qp()}function et(s){let e=Ya();if(e?.[s])return e[s];let t=$o.join(dt,"templates",s);try{return Ka.readFileSync(t,"utf-8")}catch{return null}}function Oo(s){let e=Ya();if(e)return Object.keys(e).filter(n=>n.startsWith(s));let t=$o.join(dt,"templates",s);try{return Ka.readdirSync(t).map(r=>`${s}${r}`)}catch{return[]}}var FS,ys,_n,Io,za,GS,VS,Dn=h(()=>{"use strict";an();pt();FS=50,ys=new Map,_n=[],Io=null,za=!1;c(Ya,"loadBundle");c(US,"updateLruOrder");c(WS,"evictLru");c(Vp,"parseFrontmatter");c(Jp,"load");c(HS,"getAllowedTools");c(qp,"clearCache");c(BS,"resetBundle");c(et,"getTemplateContent");c(Oo,"listTemplates");GS={load:Jp,parseFrontmatter:Vp,getAllowedTools:HS,clearCache:qp,getTemplateContent:et,listTemplates:Oo},VS=GS});function ws(s,e,t,n){if(!s)return{content:e,action:"created"};if(!(s.includes(t)&&s.includes(n)))return{content:`${s}
558
558
 
559
559
  ${e}`,action:"appended"};let o=s.substring(0,s.indexOf(t)),i=s.substring(s.indexOf(n)+n.length),a;return e.includes(t)&&e.includes(n)?a=e.substring(e.indexOf(t),e.indexOf(n)+n.length):a=e,{content:o+a+i,action:"updated"}}var No=h(()=>{"use strict";c(ws,"mergeWithMarkers")});import Vt from"node:fs/promises";import JS from"node:os";import mn from"node:path";async function zp(){try{let s=mn.join(JS.homedir(),".prjct-cli","docs");await Vt.mkdir(s,{recursive:!0});let e=Oo("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=et(r);o&&await Vt.writeFile(mn.join(s,mn.basename(r)),o,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(pt(),wt(ca)),n=mn.join(t,"templates/global/docs");try{let r=await Vt.readdir(n);for(let o of r)if(o.endsWith(".md")){let i=await Vt.readFile(mn.join(n,o),"utf-8");await Vt.writeFile(mn.join(s,o),i,"utf-8")}}catch{}return{success:!0}}catch(s){return{success:!1,error:y(s)}}}async function Za(){let s=(Ye(),wt(It)),e=await s.getActiveProvider(),t=e.name;if(!(await s.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await Vt.mkdir(e.configDir,{recursive:!0});let r=mn.join(e.configDir,e.contextFile),o=Xp;if(t!=="claude"){let g=et(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(pt(),wt(ca)),x=mn.join(w,"templates","global",e.contextFile);try{o=await Vt.readFile(x,"utf-8")}catch{t==="gemini"&&(o=Xp.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Vt.readFile(r,"utf-8"),a=!0}catch(g){if(I(g))a=!1;else throw g}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let g=i.substring(0,i.indexOf(l)),w=i.substring(i.indexOf(u)+u.length);i=`${(g+w).replace(/\n{3,}/g,`
@@ -564,7 +564,7 @@ ${e}`,action:"appended"};let o=s.substring(0,s.indexOf(t)),i=s.substring(s.index
564
564
  ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Uo),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=ev(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Fo(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:Fo(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return om(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return om(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Fo(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?io(t,this.cacheTimeout)?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Wo=class extends Error{static{c(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},im=new ic});function Ss(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return tv[s]}var tv,St,Ho=h(()=>{"use strict";tv={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};c(Ss,"getTimeout");St={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80}});import ac from"node:fs/promises";import nv from"node:os";import cm from"node:path";var cc,sv,Bo,lc=h(()=>{"use strict";F();J();cc=class{static{c(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=nv.homedir(),this.configDir=cm.join(this.homeDir,".prjct-cli","config"),this.configFile=cm.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await ac.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await ac.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let r={version:e,provider:n,lastInstall:new Date().toISOString(),path:t};return await pe(this.configFile,r),!0}catch(r){return console.error("[editors-config] Error saving config:",y(r)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await pe(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){return b(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await ac.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},sv=new cc,Bo=sv});var dc={};re(dc,{installCodexSkill:()=>uc,verifyCodexPRouterReady:()=>Vo});import{execFileSync as rv}from"node:child_process";import q from"node:fs/promises";import On from"node:os";import ne from"node:path";import de from"chalk";async function ov(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!im.isAvailable("npm"))return console.log(`${de.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${de.dim(`Install ${s.displayName} using one of:`)}`),console.log(de.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(de.dim(` \u2022 Use Homebrew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(de.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(de.yellow(`\u{1F4E6} ${s.displayName} not found. Installing...`)),console.log(""),rv("npm",["install","-g",e],{stdio:"inherit",timeout:Ss("NPM_INSTALL")}),console.log(""),console.log(`${de.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(de.yellow(`\u26A0\uFE0F Installation timed out for ${s.displayName}`)),console.log(""),console.log(de.dim("The npm install took too long. Try:")),console.log(de.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(de.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(de.yellow(`\u26A0\uFE0F Failed to install ${s.displayName}: ${n.message}`)),console.log(""),console.log(de.dim("Alternative installation methods:")),console.log(de.dim(` \u2022 npm: npm install -g ${e}`)),console.log(de.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(de.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(de.dim(` \u2022 brew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function iv(){let s=await mr(),e=await wa(),t=Ht[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let l=Ht[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await ov(l))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${l.displayName} installation failed`);else continue;if(a==="claude"){if(await Pe.detectActiveProvider()){let m=await Pe.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let g=await Pe.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Pe.installDocs(),await mv(),await $n.ensureReady()}}else if(a==="gemini"){await av()&&(d.commandsAdded=1,n.commandsAdded+=1);let m=await cv();m.success&&(d.configAction=m.action)}n.providers.push(d)}if((await ya()).installed&&(await lv()).success&&console.log(` ${de.green("\u2713")} Antigravity skill installed`),(await Rn()).installed){if(!(await uc()).success)throw new Error("Codex skill installation failed");let l=await Vo({autoRepair:!0});if(!l.verified)throw new Error(l.message||"Codex p. router verification failed");console.log(` ${de.green("\u2713")} Codex skill installed`),console.log(` ${de.green("\u2713")} Codex p. router ready`)}await Bo.saveConfig(he,await Pe.getInstallPath(),e.provider),await pv();for(let a of n.providers)gv(a,Ht[a.provider]);return n}async function av(){try{let s=ne.join(On.homedir(),".gemini","commands"),e=ne.join(s,"p.toml");try{return await q.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(s){return M.warn(`Gemini router cleanup warning: ${y(s)}`),!1}}async function cv(){try{let s=ne.join(On.homedir(),".gemini"),e=ne.join(s,"GEMINI.md");await q.mkdir(s,{recursive:!0});let t=et("global/GEMINI.md");if(!t){let l=ne.join(dt,"templates","global","GEMINI.md");t=await q.readFile(l,"utf-8")}let n="",r=!1;try{n=await q.readFile(e,"utf-8"),r=!0}catch(l){if(I(l))r=!1;else throw l}let a=ws(r?n:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await q.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(s){return M.warn(`Gemini config warning: ${y(s)}`),{success:!1,action:null}}}async function lv(){try{let s=ne.join(On.homedir(),".gemini","antigravity","skills"),e=ne.join(s,"prjct"),t=ne.join(e,"SKILL.md");await q.mkdir(e,{recursive:!0});let n=await b(t),r=et("antigravity/SKILL.md");if(!r){let o=ne.join(dt,"templates","antigravity","SKILL.md");if(!await b(o))return M.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await q.readFile(o,"utf-8")}return await q.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return M.warn(`Antigravity skill warning: ${y(s)}`),{success:!1,action:null}}}function mm(){return ne.join(On.homedir(),".codex","skills","prjct","SKILL.md")}function uv(s){return`<!-- ${pm}: ${JSON.stringify({version:he,templateHash:s})} -->`}function lm(s){let e=s.match(new RegExp(`<!--\\s*${pm}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function dv(s){return fr(s)}async function gm(){let s=et("codex/SKILL.md");if(s)return s;let e=ne.join(dt,"templates","codex","SKILL.md");return await b(e)?q.readFile(e,"utf-8"):null}function fm(s){let e=s.trimEnd(),t=dv(e),n=uv(t);return{content:`${e}
565
565
 
566
566
  ${n}
567
- `,templateHash:t}}async function uc(){try{let s=mm(),e=ne.dirname(s);await q.mkdir(e,{recursive:!0});let t=await b(s),n=await gm();if(!n)return M.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=fm(n);return t&&await q.readFile(s,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await q.writeFile(s,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(s){return M.warn(`Codex skill warning: ${y(s)}`),{success:!1,action:null}}}async function Vo(s={}){let e=mm();if(!(await Rn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await gm();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let r=fm(n),o=c(async()=>s.autoRepair?(await uc()).success:!1,"maybeRepair"),i="";if(!await b(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await q.readFile(e,"utf-8").catch(()=>"");let a=lm(i);if(!(a?.version===he&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await q.readFile(e,"utf-8").catch(()=>""),a=lm(i),!(a?.version===he&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,message:"Codex p. router ready"}}async function pv(){try{let s=ne.join(On.homedir(),".prjct-cli","projects");if(!await b(s))return;let e=(await q.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let r=A.getDoc(n,"project");if(!r)continue;r.cliVersion!==he&&(r.cliVersion=he,A.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${he}`)}catch(s){I(s)||M.warn(`Migration warning: ${y(s)}`)}}async function um(s,e){let t={};if(await b(s))try{t=await Ae(s)??{}}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await pe(s,t)}async function mv(){try{let s=ne.join(On.homedir(),".claude"),e=ne.join(s,"settings.json"),t=ne.join(s,"prjct-statusline.sh"),n=ne.join(On.homedir(),".prjct-cli","statusline"),r=ne.join(n,"statusline.sh"),o=ne.join(n,"themes"),i=ne.join(n,"lib"),a=ne.join(n,"components"),l=ne.join(n,"config.json"),u=ne.join(dt,"assets","statusline"),d=ne.join(u,"statusline.sh"),p=ne.join(u,"themes"),m=ne.join(u,"lib"),g=ne.join(u,"components"),w=ne.join(u,"default-config.json");if(await b(s)||await q.mkdir(s,{recursive:!0}),await b(n)||await q.mkdir(n,{recursive:!0}),await b(o)||await q.mkdir(o,{recursive:!0}),await b(i)||await q.mkdir(i,{recursive:!0}),await b(a)||await q.mkdir(a,{recursive:!0}),await b(r)){let x=await q.readFile(r,"utf8");if(x.includes("CLI_VERSION=")){let C=x.match(/CLI_VERSION="([^"]*)"/);if(C&&C[1]!==he){let v=x.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${he}"`);await q.writeFile(r,v,{mode:493})}await Go(m,i),await Go(g,a),await dm(t,r),await um(e,t);return}}if(await b(d)){let x=await q.readFile(d,"utf8");if(x=x.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${he}"`),await q.writeFile(r,x,{mode:493}),await Go(m,i),await Go(g,a),await b(p)){let C=await q.readdir(p);for(let v of C){let j=ne.join(p,v),T=ne.join(o,v);await q.copyFile(j,T)}}!await b(l)&&await b(w)&&await q.copyFile(w,l)}else{let x=`#!/bin/bash
567
+ `,templateHash:t}}async function uc(){try{let s=mm(),e=ne.dirname(s);await q.mkdir(e,{recursive:!0});let t=await b(s),n=await gm();if(!n)return M.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=fm(n);return t&&await q.readFile(s,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await q.writeFile(s,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(s){return M.warn(`Codex skill warning: ${y(s)}`),{success:!1,action:null}}}async function Vo(s={}){let e=mm();if(!(await Rn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await gm();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let r=fm(n),o=c(async()=>s.autoRepair?(await uc()).success:!1,"maybeRepair"),i="";if(!await b(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await q.readFile(e,"utf-8").catch(()=>"");let a=lm(i);if(!(a?.version===he&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await q.readFile(e,"utf-8").catch(()=>""),a=lm(i),!(a?.version===he&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,message:"Codex p. router ready"}}async function pv(){try{let s=ne.join(On.homedir(),".prjct-cli","projects");if(!await b(s))return;let e=(await q.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let r=A.getDoc(n,"project");if(!r)continue;r.cliVersion!==he&&(r.cliVersion=he,A.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${he}`)}catch(s){I(s)||M.warn(`Migration warning: ${y(s)}`)}}async function um(s,e){let t={};if(await b(s))try{t=await Ae(s)??{}}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await pe(s,t)}async function mv(){try{let s=ne.join(On.homedir(),".claude"),e=ne.join(s,"settings.json"),t=ne.join(s,"prjct-statusline.sh"),n=ne.join(On.homedir(),".prjct-cli","statusline"),r=ne.join(n,"statusline.sh"),o=ne.join(n,"themes"),i=ne.join(n,"lib"),a=ne.join(n,"components"),l=ne.join(n,"config.json"),u=ne.join(dt,"assets","statusline"),d=ne.join(u,"statusline.sh"),p=ne.join(u,"themes"),m=ne.join(u,"lib"),g=ne.join(u,"components"),w=ne.join(u,"default-config.json");if(await b(s)||await q.mkdir(s,{recursive:!0}),await b(n)||await q.mkdir(n,{recursive:!0}),await b(o)||await q.mkdir(o,{recursive:!0}),await b(i)||await q.mkdir(i,{recursive:!0}),await b(a)||await q.mkdir(a,{recursive:!0}),await b(r)){let x=await q.readFile(r,"utf8");if(x.includes("CLI_VERSION=")){let C=x.match(/CLI_VERSION="([^"]*)"/);if(C&&C[1]!==he){let v=x.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${he}"`);await q.writeFile(r,v,{mode:493})}await Go(m,i),await Go(g,a),await dm(t,r),await um(e,t);return}}if(await b(d)){let x=await q.readFile(d,"utf8");if(x=x.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${he}"`),await q.writeFile(r,x,{mode:493}),await Go(m,i),await Go(g,a),await b(p)){let C=await q.readdir(p);for(let v of C){let j=ne.join(p,v),E=ne.join(o,v);await q.copyFile(j,E)}}!await b(l)&&await b(w)&&await q.copyFile(w,l)}else{let x=`#!/bin/bash
568
568
  # prjct Status Line for Claude Code
569
569
  CLI_VERSION="${he}"
570
570
  input=$(cat)
@@ -607,7 +607,7 @@ echo "prjct"
607
607
  INSERT OR IGNORE INTO sessions
608
608
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
609
609
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
610
- `),o=c(u=>{!u||!u.id||r.run(P(u.id),P(u.projectId)??s,P(u.task)??"",P(u.status)??"completed",P(u.startedAt)??new Date().toISOString(),P(u.pausedAt),P(u.completedAt),vt(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=fn.join(e,"current.json"),a=await tt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await nt.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let l=fn.join(e,"archive");try{let u=await nt.readdir(l);for(let p of u){let m=fn.join(l,p);try{if(!(await nt.stat(m)).isDirectory())continue;let w=await nt.readdir(m);for(let C of w){if(!C.endsWith(".json"))continue;let v=fn.join(m,C),j=await tt(v);if(j!==null)try{o(j),t.migratedFiles.push(`sessions/archive/${p}/${C}`),await nt.unlink(v).catch(()=>{})}catch(T){t.errors.push({file:`sessions/archive/${p}/${C}`,error:String(T)})}}(await nt.readdir(m)).length===0&&await nt.rmdir(m).catch(()=>{})}catch{}}(await nt.readdir(l).catch(()=>[])).length===0&&await nt.rmdir(l).catch(()=>{})}catch{}try{(await nt.readdir(e)).length===0&&await nt.rmdir(e).catch(()=>{})}catch{}}var Em=h(()=>{"use strict";F();te();Ko();c(km,"migrateChecksums");c(Sm,"migrateFileScores");c(vm,"migrateEventsJsonl");c(bm,"migrateLearningsJsonl");c(Tm,"migrateSessionFiles")});function mc(s,e,t){switch(e){case"state":Ev(s,t);break;case"queue":Cv(s,t);break;case"ideas":Pv(s,t);break;case"shipped":Rv(s,t);break;case"metrics":xv(s,t);break;case"analysis":Av(s,t);break}}function Ev(s,e){let t=A.getDb(s),n=t.prepare(`
610
+ `),o=c(u=>{!u||!u.id||r.run(P(u.id),P(u.projectId)??s,P(u.task)??"",P(u.status)??"completed",P(u.startedAt)??new Date().toISOString(),P(u.pausedAt),P(u.completedAt),vt(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=fn.join(e,"current.json"),a=await tt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await nt.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let l=fn.join(e,"archive");try{let u=await nt.readdir(l);for(let p of u){let m=fn.join(l,p);try{if(!(await nt.stat(m)).isDirectory())continue;let w=await nt.readdir(m);for(let C of w){if(!C.endsWith(".json"))continue;let v=fn.join(m,C),j=await tt(v);if(j!==null)try{o(j),t.migratedFiles.push(`sessions/archive/${p}/${C}`),await nt.unlink(v).catch(()=>{})}catch(E){t.errors.push({file:`sessions/archive/${p}/${C}`,error:String(E)})}}(await nt.readdir(m)).length===0&&await nt.rmdir(m).catch(()=>{})}catch{}}(await nt.readdir(l).catch(()=>[])).length===0&&await nt.rmdir(l).catch(()=>{})}catch{}try{(await nt.readdir(e)).length===0&&await nt.rmdir(e).catch(()=>{})}catch{}}var Em=h(()=>{"use strict";F();te();Ko();c(km,"migrateChecksums");c(Sm,"migrateFileScores");c(vm,"migrateEventsJsonl");c(bm,"migrateLearningsJsonl");c(Tm,"migrateSessionFiles")});function mc(s,e,t){switch(e){case"state":Ev(s,t);break;case"queue":Cv(s,t);break;case"ideas":Pv(s,t);break;case"shipped":Rv(s,t);break;case"metrics":xv(s,t);break;case"analysis":Av(s,t);break}}function Ev(s,e){let t=A.getDb(s),n=t.prepare(`
611
611
  INSERT OR REPLACE INTO tasks
612
612
  (id, description, type, status, parent_description, branch, linear_id,
613
613
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -644,11 +644,11 @@ echo "prjct"
644
644
  (path, categories, domain, score, size, mtime, language)
645
645
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
646
646
  `);for(let o of t){let i=P(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,P(o.primaryDomain),i)}}var Cm=h(()=>{"use strict";te();Ko();c(mc,"populateNormalized");c(Ev,"populateTasksFromState");c(Cv,"populateQueueTasks");c(Pv,"populateIdeas");c(Rv,"populateShippedFeatures");c(xv,"populateMetricsDaily");c(Av,"populateAnalysis");c(gc,"populateIndexTables");c(jv,"populateCategoriesIndex")});import we from"node:fs/promises";import oe from"node:path";async function Yo(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(s)&&A.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=D.getGlobalProjectPath(s),r=oe.join(n,"storage"),o=oe.join(n,"index"),i=oe.join(n,"memory");t.backupDir=await _v(r,o,i),A.getDb(s);for(let{filename:l,key:u}of Xo){let d=oe.join(r,l),p=await tt(d);if(p===null){t.skippedFiles.push(l);continue}try{A.setDoc(s,u,p),mc(s,u,p),t.migratedFiles.push(l)}catch(m){t.errors.push({file:l,error:String(m)})}}for(let{filename:l,key:u}of zo){let d=oe.join(o,l),p=await tt(d);if(p===null){t.skippedFiles.push(`index/${l}`);continue}try{A.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),gc(s,u,p),t.migratedFiles.push(`index/${l}`)}catch(m){t.errors.push({file:`index/${l}`,error:String(m)})}}await km(s,o,t),await Sm(s,o,t),await vm(s,i,t),await bm(s,i,t);let a=oe.join(n,"sessions");return await Tm(s,a,t),t.errors.length===0&&await Dv(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function _v(s,e,t){let n=oe.join(s,"backup");return await we.mkdir(n,{recursive:!0}),await we.mkdir(oe.join(n,"index"),{recursive:!0}),await we.mkdir(oe.join(n,"memory"),{recursive:!0}),await fc(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await fc(e,oe.join(n,"index")),await fc(t,oe.join(n,"memory")),n}async function fc(s,e,t){try{let n=await we.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=oe.join(s,r.name),i=oe.join(e,r.name);await we.copyFile(o,i)}}catch(n){if(!I(n))throw n}}async function Dv(s,e,t,n){let r=c(async(i,a)=>{try{await we.unlink(i)}catch(l){I(l)||n.errors.push({file:a,error:`cleanup: ${String(l)}`})}},"deleteFile");for(let{filename:i}of Xo)await r(oe.join(s,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(oe.join(e,i),`cleanup:index/${i}`);await r(oe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(oe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Qo(s){let e=D.getGlobalProjectPath(s),t=oe.join(e,"storage"),n=0;A.getDb(s);for(let{filename:w,key:x}of Xo){let C=oe.join(t,w),v=await tt(C);if(v!==null){A.setDoc(s,x,v),mc(s,x,v);try{await we.unlink(C)}catch{}n++}}let r=oe.join(e,"project.json"),o=await tt(r);if(o!==null){A.setDoc(s,"project",o);try{await we.unlink(r)}catch{}n++}let i=oe.join(e,"memory");for(let w of["events.jsonl","learnings.jsonl"]){let x=oe.join(i,w);try{let v=(await we.readFile(x,"utf-8")).split(`
647
- `).filter(T=>T.trim());if(v.length===0){await we.unlink(x),n++;continue}let j=A.getDb(s);if(w==="events.jsonl"){let T=j.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");j.transaction(()=>{for(let L of v)try{let R=JSON.parse(L);T.run(P(R.type??R.action)??"unknown",P(R.taskId??R.task_id),L,P(R.timestamp??R.ts)??new Date().toISOString())}catch{}})()}else{let T=j.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");j.transaction(()=>{for(let L of v)try{let R=JSON.parse(L),ue=`learning:${P(R.taskId??R.timestamp)??Date.now()}`,en=R.tags;T.run(ue,P(en?.[0]),L,1,P(R.timestamp)??new Date().toISOString())}catch{}})()}await we.unlink(x),n++}catch{}}let a=oe.join(e,"sessions"),l=c(w=>{if(!w||!w.id)return;A.getDb(s).prepare(`
647
+ `).filter(E=>E.trim());if(v.length===0){await we.unlink(x),n++;continue}let j=A.getDb(s);if(w==="events.jsonl"){let E=j.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");j.transaction(()=>{for(let L of v)try{let R=JSON.parse(L);E.run(P(R.type??R.action)??"unknown",P(R.taskId??R.task_id),L,P(R.timestamp??R.ts)??new Date().toISOString())}catch{}})()}else{let E=j.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");j.transaction(()=>{for(let L of v)try{let R=JSON.parse(L),ue=`learning:${P(R.taskId??R.timestamp)??Date.now()}`,en=R.tags;E.run(ue,P(en?.[0]),L,1,P(R.timestamp)??new Date().toISOString())}catch{}})()}await we.unlink(x),n++}catch{}}let a=oe.join(e,"sessions"),l=c(w=>{if(!w||!w.id)return;A.getDb(s).prepare(`
648
648
  INSERT OR IGNORE INTO sessions
649
649
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
650
650
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
651
- `).run(P(w.id),P(w.projectId)??s,P(w.task)??"",P(w.status)??"completed",P(w.startedAt)??new Date().toISOString(),P(w.pausedAt),P(w.completedAt),vt(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=oe.join(a,"current.json"),d=await tt(u);d!==null&&(l(d),await we.unlink(u).catch(()=>{}),n++);let p=oe.join(a,"archive");try{let w=await we.readdir(p);for(let C of w){let v=oe.join(p,C);try{if(!(await we.stat(v)).isDirectory())continue;let T=await we.readdir(v);for(let R of T){if(!R.endsWith(".json"))continue;let ue=await tt(oe.join(v,R));ue!==null&&(l(ue),await we.unlink(oe.join(v,R)).catch(()=>{}),n++)}(await we.readdir(v)).length===0&&await we.rmdir(v).catch(()=>{})}catch{}}(await we.readdir(p).catch(()=>[])).length===0&&await we.rmdir(p).catch(()=>{})}catch{}try{(await we.readdir(a)).length===0&&await we.rmdir(a).catch(()=>{})}catch{}let m=oe.join(e,"index"),g=[...zo.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let x=oe.join(m,w),C=await tt(x);if(C===null)continue;let v=zo.find(j=>j.filename===w);v&&(A.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",v.key,JSON.stringify(C),new Date().toISOString()),gc(s,v.key,C));try{await we.unlink(x)}catch{}n++}return n}var hc=h(()=>{"use strict";De();F();te();Ko();Em();Cm();c(Yo,"migrateJsonToSqlite");c(_v,"createBackup");c(fc,"copyFiles");c(Dv,"cleanupJsonFiles");c(Qo,"sweepLegacyJson")});function xm(s){return[...s].sort((e,t)=>{let n=Rm[e.section]-Rm[t.section];return n!==0?n:Pm[e.priority]-Pm[t.priority]})}function yc(s,e){let t=new Set;return s.filter(n=>{let r=e(n);return t.has(r)?!1:(t.add(r),!0)})}var Pm,Rm,wc=h(()=>{"use strict";Pm={critical:0,high:1,medium:2,low:3},Rm={active:0,previously_active:1,backlog:2};c(xm,"sortBySectionAndPriority");c(yc,"uniqueBy")});var Am={};re(Am,{default:()=>Iv,queueStorage:()=>Ve});var kc,Ve,Iv,Mn=h(()=>{"use strict";Bt();Co();wc();ee();jn();dn();kc=class extends We{static{c(this,"QueueStorage")}constructor(){super("queue.json",Qd)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return xm(t)[0]||null}async addTask(e,t){let n={...t,id:Ie(),createdAt:k(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:k()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=k(),r=t.map(o=>({...o,id:Ie(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:k()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async deleteByFeatureId(e,t){let n=0;return await this.update(e,r=>{let o=r.tasks.length,i=r.tasks.filter(a=>a.featureId!==t);return n=o-i.length,{tasks:i,lastUpdated:k()}}),n>0&&await this.publishEvent(e,"queue.tasks_removed_by_feature",{featureId:t,count:n}),n}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:k()},n):i),lastUpdated:k()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:k()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:k()}))}async getTask(e,t){return(await this.read(e)).tasks.find(r=>r.id===t)||null}async updateTask(e,t,n){let r=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(r={...i,...n},r):i),lastUpdated:k()})),r&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),r}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:k()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=as(Gt.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;mt.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:k()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},Ve=new kc,Iv=Ve});import{z as X}from"zod";var $v,jm,Ov,Nv,Mv,Lv,Fv,Uv,Wv,_m,Dm=h(()=>{"use strict";$v=X.enum(["feature","fix","improvement","refactor"]),jm=X.enum(["pass","warning","fail","skipped"]),Ov=X.enum(["added","changed","fixed","removed"]),Nv=X.object({hours:X.number(),minutes:X.number(),totalMinutes:X.number()}),Mv=X.object({filesChanged:X.number().nullable().optional(),linesAdded:X.number().nullable().optional(),linesRemoved:X.number().nullable().optional(),commits:X.number().nullable().optional()}),Lv=X.object({description:X.string(),type:Ov.optional()}),Fv=X.object({lintStatus:jm.nullable().optional(),lintDetails:X.string().optional(),testStatus:jm.nullable().optional(),testDetails:X.string().optional()}),Uv=X.object({hash:X.string().optional(),message:X.string().optional(),branch:X.string().optional()}),Wv=X.object({id:X.string(),name:X.string(),version:X.string().nullable().optional(),type:$v,agent:X.string().optional(),description:X.string().optional(),changes:X.array(Lv).optional(),codeSnippets:X.array(X.string()).optional(),commit:Uv.optional(),codeMetrics:Mv.optional(),qualityMetrics:Fv.optional(),quantitativeImpact:X.string().optional(),duration:Nv.optional(),tasksCompleted:X.number().nullable().optional(),shippedAt:X.string(),featureId:X.string().optional()}),_m=X.object({shipped:X.array(Wv),lastUpdated:X.string()})});var Sc,Ft,Im,vs=h(()=>{"use strict";Bt();Dm();ee();jn();dn();Sc=class extends We{static{c(this,"ShippedStorage")}constructor(){super("shipped.json",_m)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Ie(),shippedAt:k()};return await this.update(e,r=>({shipped:[n,...Array.isArray(r.shipped)?r.shipped:[]],lastUpdated:k()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-7*24*60*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=as(Gt.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;mt.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:k()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},Ft=new Sc,Im=Ft});import{z as le}from"zod";var Hv,Bv,$m,qD,XD,zD,Om,Nm=h(()=>{"use strict";Hv=le.enum(["improving","stable","declining"]),Bv=le.object({sprintNumber:le.number(),startDate:le.string(),endDate:le.string(),pointsCompleted:le.number(),tasksCompleted:le.number(),avgVariance:le.number(),estimationAccuracy:le.number()}),$m=le.object({category:le.string(),avgVariance:le.number(),taskCount:le.number()}),qD=le.object({totalPoints:le.number(),sprints:le.number(),estimatedDate:le.string()}),XD=le.object({sprints:le.array(Bv),averageVelocity:le.number(),velocityTrend:Hv,estimationAccuracy:le.number(),overEstimated:le.array($m),underEstimated:le.array($m),lastUpdated:le.string()}),zD=le.object({sprintLengthDays:le.number().min(1).max(90).default(7),startDay:le.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:le.number().min(1).max(52).default(6),accuracyTolerance:le.number().min(0).max(100).default(20)}),Om={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var vc,Mm,Lm=h(()=>{"use strict";Nm();dn();vc=class extends We{static{c(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Om,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},Mm=new vc});function Fm(s){return s.projectName?`# ${s.projectName}
651
+ `).run(P(w.id),P(w.projectId)??s,P(w.task)??"",P(w.status)??"completed",P(w.startedAt)??new Date().toISOString(),P(w.pausedAt),P(w.completedAt),vt(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=oe.join(a,"current.json"),d=await tt(u);d!==null&&(l(d),await we.unlink(u).catch(()=>{}),n++);let p=oe.join(a,"archive");try{let w=await we.readdir(p);for(let C of w){let v=oe.join(p,C);try{if(!(await we.stat(v)).isDirectory())continue;let E=await we.readdir(v);for(let R of E){if(!R.endsWith(".json"))continue;let ue=await tt(oe.join(v,R));ue!==null&&(l(ue),await we.unlink(oe.join(v,R)).catch(()=>{}),n++)}(await we.readdir(v)).length===0&&await we.rmdir(v).catch(()=>{})}catch{}}(await we.readdir(p).catch(()=>[])).length===0&&await we.rmdir(p).catch(()=>{})}catch{}try{(await we.readdir(a)).length===0&&await we.rmdir(a).catch(()=>{})}catch{}let m=oe.join(e,"index"),g=[...zo.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let x=oe.join(m,w),C=await tt(x);if(C===null)continue;let v=zo.find(j=>j.filename===w);v&&(A.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",v.key,JSON.stringify(C),new Date().toISOString()),gc(s,v.key,C));try{await we.unlink(x)}catch{}n++}return n}var hc=h(()=>{"use strict";De();F();te();Ko();Em();Cm();c(Yo,"migrateJsonToSqlite");c(_v,"createBackup");c(fc,"copyFiles");c(Dv,"cleanupJsonFiles");c(Qo,"sweepLegacyJson")});function xm(s){return[...s].sort((e,t)=>{let n=Rm[e.section]-Rm[t.section];return n!==0?n:Pm[e.priority]-Pm[t.priority]})}function yc(s,e){let t=new Set;return s.filter(n=>{let r=e(n);return t.has(r)?!1:(t.add(r),!0)})}var Pm,Rm,wc=h(()=>{"use strict";Pm={critical:0,high:1,medium:2,low:3},Rm={active:0,previously_active:1,backlog:2};c(xm,"sortBySectionAndPriority");c(yc,"uniqueBy")});var Am={};re(Am,{default:()=>Iv,queueStorage:()=>Ve});var kc,Ve,Iv,Mn=h(()=>{"use strict";Bt();Co();wc();ee();jn();dn();kc=class extends We{static{c(this,"QueueStorage")}constructor(){super("queue.json",Qd)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return xm(t)[0]||null}async addTask(e,t){let n={...t,id:Ie(),createdAt:k(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:k()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=k(),r=t.map(o=>({...o,id:Ie(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:k()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async deleteByFeatureId(e,t){let n=0;return await this.update(e,r=>{let o=r.tasks.length,i=r.tasks.filter(a=>a.featureId!==t);return n=o-i.length,{tasks:i,lastUpdated:k()}}),n>0&&await this.publishEvent(e,"queue.tasks_removed_by_feature",{featureId:t,count:n}),n}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:k()},n):i),lastUpdated:k()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:k()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:k()}))}async getTask(e,t){return(await this.read(e)).tasks.find(r=>r.id===t)||null}async updateTask(e,t,n){let r=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(r={...i,...n},r):i),lastUpdated:k()})),r&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),r}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:k()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=as(Gt.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;mt.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:k()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},Ve=new kc,Iv=Ve});import{z as X}from"zod";var $v,jm,Ov,Nv,Mv,Lv,Fv,Uv,Wv,_m,Dm=h(()=>{"use strict";$v=X.enum(["feature","fix","improvement","refactor"]),jm=X.enum(["pass","warning","fail","skipped"]),Ov=X.enum(["added","changed","fixed","removed"]),Nv=X.object({hours:X.number(),minutes:X.number(),totalMinutes:X.number()}),Mv=X.object({filesChanged:X.number().nullable().optional(),linesAdded:X.number().nullable().optional(),linesRemoved:X.number().nullable().optional(),commits:X.number().nullable().optional()}),Lv=X.object({description:X.string(),type:Ov.optional()}),Fv=X.object({lintStatus:jm.nullable().optional(),lintDetails:X.string().optional(),testStatus:jm.nullable().optional(),testDetails:X.string().optional()}),Uv=X.object({hash:X.string().optional(),message:X.string().optional(),branch:X.string().optional()}),Wv=X.object({id:X.string(),name:X.string(),version:X.string().nullable().optional(),type:$v,agent:X.string().optional(),description:X.string().optional(),changes:X.array(Lv).optional(),codeSnippets:X.array(X.string()).optional(),commit:Uv.optional(),codeMetrics:Mv.optional(),qualityMetrics:Fv.optional(),quantitativeImpact:X.string().optional(),duration:Nv.optional(),tasksCompleted:X.number().nullable().optional(),shippedAt:X.string(),featureId:X.string().optional()}),_m=X.object({shipped:X.array(Wv),lastUpdated:X.string()})});var Sc,Ft,Im,vs=h(()=>{"use strict";Bt();Dm();ee();jn();dn();Sc=class extends We{static{c(this,"ShippedStorage")}constructor(){super("shipped.json",_m)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Ie(),shippedAt:k()};return await this.update(e,r=>({shipped:[n,...Array.isArray(r.shipped)?r.shipped:[]],lastUpdated:k()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-7*24*60*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=as(Gt.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;mt.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:k()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},Ft=new Sc,Im=Ft});import{z as le}from"zod";var Hv,Bv,$m,qD,XD,zD,Om,Nm=h(()=>{"use strict";Hv=le.enum(["improving","stable","declining"]),Bv=le.object({sprintNumber:le.number(),startDate:le.string(),endDate:le.string(),pointsCompleted:le.number(),tasksCompleted:le.number(),avgVariance:le.number(),estimationAccuracy:le.number()}),$m=le.object({category:le.string(),avgVariance:le.number(),taskCount:le.number()}),qD=le.object({totalPoints:le.number(),sprints:le.number(),estimatedDate:le.string()}),XD=le.object({sprints:le.array(Bv),averageVelocity:le.number(),velocityTrend:Hv,estimationAccuracy:le.number(),overEstimated:le.array($m),underEstimated:le.array($m),lastUpdated:le.string()}),zD=le.object({sprintLengthDays:le.number().min(1).max(90).default(7),startDay:le.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:le.number().min(1).max(52).default(6),accuracyTolerance:le.number().min(0).max(100).default(20)}),Om={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var vc,Mm,Lm=h(()=>{"use strict";Nm();dn();vc=class extends We{static{c(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Om,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},Mm=new vc});function Fm(s){return s.projectName?`# ${s.projectName}
652
652
  ${s.stack} | ${s.fileCount} files | v${s.version} | Branch: ${s.branch}`:["This is the baseline `prjct` skill installed by the CLI on every invocation.","","No project has been initialized in this cwd yet (`.prjct/` missing). When the user","shows intent (start a task, capture a thought, ship), suggest `prjct init` ONCE","in one line, then run the verb. Don't gate routine captures on init.","","After `prjct sync` runs in an initialized project, this file is regenerated with","project-specific context (name, stack, velocity, active task, recent shipped,","known gotchas). The verb intent map below applies in both states."].join(`
653
653
  `)}function Gv(s){return s.patterns.length===0?"":`
654
654
  ## Patterns
@@ -690,14 +690,14 @@ allowed-tools: [${s.allowedTools.map(n=>`"${n}"`).join(", ")}]
690
690
  user-invocable: ${t}
691
691
  ---`}function eb(s,e){return`${Zv(s,e)}
692
692
 
693
- ${s.body(e)}`}var bc,Tc,Jm,qm=h(()=>{"use strict";an();Nt();Vm();bc=[{name:"prjct",description:Hm,allowedTools:[...Bm],condition:c(()=>!0,"condition"),body:c(s=>Gm(s),"body")}];c(Zv,"buildFrontmatter");c(eb,"buildSkillContent");Tc=class{static{c(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},n){let r={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:n?.version??e.stats.version??"0.0.0",fileCount:n?.fileCount??e.stats.fileCount??0,patterns:n?.patterns??[],antiPatterns:n?.antiPatterns??[],recentShipped:n?.recentShipped??[],velocity:n?.velocity??null,backlogCount:n?.backlogCount??t.backlogCount,completedTaskCount:n?.completedTaskCount??t.completedTaskCount,pausedTaskCount:n?.pausedTaskCount??t.pausedTaskCount,knownGotchas:n?.knownGotchas??[],hasActiveTask:n?.hasActiveTask??t.hasActiveTask,activeTaskDescription:n?.activeTaskDescription??"",pausedTasks:n?.pausedTasks??[],topBacklog:n?.topBacklog??[],ideasCount:n?.ideasCount??0,shippedCount:n?.shippedCount??0,userPatterns:n?.userPatterns??[]},i=Sr.join(Qv.homedir(),".claude","skills");for(let l of bc){if(!l.condition(t)){r.skipped.push({name:l.name,reason:"condition not met"}),await kr.rm(Sr.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=eb(l,o),d=Sr.join(i,l.name),p=Sr.join(d,"SKILL.md");await kr.mkdir(d,{recursive:!0}),await kr.writeFile(p,u,"utf-8"),r.generated.push({name:l.name,path:p})}catch(u){M.debug(`Failed to generate skill ${l.name}`,{error:je(u)}),r.skipped.push({name:l.name,reason:je(u)})}}let a=new Set(bc.map(l=>l.name));try{let l=await kr.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of l)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await kr.rm(Sr.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return r.generated.length>0&&M.info("Generated native workflow skills",{count:r.generated.length,skills:r.generated.map(l=>l.name)}),r}getDefinitions(){return bc}},Jm=new Tc});function Zo(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}function ei(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}function ti(){return{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"}}function ni(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}var Xm=h(()=>{"use strict";c(Zo,"emptyGitData");c(ei,"emptyStats");c(ti,"emptyCommands");c(ni,"emptyStack")});function zm(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=_o(e);if(o)for(let l of t){let u=o.reverse[l];if(u)for(let d of u)n.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:s.deleted,allAffected:a}}function Km(s){let e=new Set;for(let t of s){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var Ym=h(()=>{"use strict";Do();c(zm,"propagateChanges");c(Km,"affectedDomains")});import Qm from"node:fs/promises";import tb from"node:path";function nb(s){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(s).toString(36)}`;let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function sb(s){let e=await tn(s,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,n=await rs(e,100,async r=>{try{let o=tb.join(s,r),[i,a]=await Promise.all([Qm.readFile(o,"utf-8"),Qm.stat(o)]);return{path:r,hash:nb(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let r of n)t.set(r.path,r);return t}function rb(s,e){let t=[],n=[],r=[];for(let[i,a]of s){let l=e.get(i);l?l.hash!==a.hash?n.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())s.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:r}}function Ec(s,e){let t=E.getDb(s);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)n.run(r.path,r.hash,r.size,r.mtime)})(),E.setDoc(s,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function ob(s){let e=new Map;try{let t=E.query(s,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Cc(s,e){let[t,n]=await Promise.all([sb(s),Promise.resolve(ob(e))]);return{diff:rb(t,n),currentHashes:t}}function Zm(s){return E.hasDoc(s,"file-hashes-meta")}var eg=h(()=>{"use strict";te();J();c(nb,"hashContent");c(sb,"computeHashes");c(rb,"diffHashes");c(Ec,"saveHashes");c(ob,"loadHashes");c(Cc,"detectChanges");c(Zm,"hasHashRegistry")});async function tg(s){let{projectId:e,projectPath:t,isFullSync:n,changedFilesHint:r}=s,o=!0,i=new Set,a;if(!n&&Zm(e))try{let{diff:l,currentHashes:u}=await Cc(t,e),d=l.added.length+l.modified.length+l.deleted.length;if(d===0&&!r?.length)o=!1,a={isIncremental:!0,filesChanged:0,filesUnchanged:l.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let p=zm(l,e);i=Km(p.allAffected),o=p.allAffected.some(g=>{let w=g.substring(g.lastIndexOf("."));return ib.has(w)}),a={isIncremental:!0,filesChanged:d,filesUnchanged:l.unchanged.length,indexesRebuilt:o,affectedDomains:Array.from(i)}}Ec(e,u)}catch(l){M.debug("Incremental detection failed, falling back to full sync",{error:y(l)})}else try{let{currentHashes:l}=await Cc(t,e);Ec(e,l)}catch(l){M.debug("Hash computation failed (non-critical)",{error:y(l)})}return{shouldRebuildIndexes:o,changedDomains:i,incrementalInfo:a}}var ib,ng=h(()=>{"use strict";Ym();eg();F();Nt();ib=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);c(tg,"detectIncrementalChanges")});import{z as Re}from"zod";function ig(s,e="default"){let t=sg[e]||sg.default;return s/1e3*t}function si(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var ab,cb,rg,og,sg,ri=h(()=>{"use strict";ab=Re.object({date:Re.string(),tokensSaved:Re.number(),syncs:Re.number(),avgCompressionRate:Re.number(),totalDuration:Re.number()}),cb=Re.object({agentName:Re.string(),usageCount:Re.number(),tokensSaved:Re.number()}),rg=Re.object({totalTokensSaved:Re.number(),avgCompressionRate:Re.number(),syncCount:Re.number(),watchTriggers:Re.number(),avgSyncDuration:Re.number(),totalSyncDuration:Re.number(),agentUsage:Re.array(cb),dailyStats:Re.array(ab),firstSync:Re.string(),lastUpdated:Re.string()}),og={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},sg={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};c(ig,"estimateCostSaved");c(si,"formatCost")});var Pc,bs,Rc=h(()=>{"use strict";ri();ee();dn();Pc=class extends We{static{c(this,"MetricsStorage")}constructor(){super("metrics.json",rg)}getDefault(){return{...og}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,l=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,p=[...i.dailyStats],m=p.findIndex(v=>v.date===o);if(m>=0){let v=p[m];p[m]={...v,tokensSaved:v.tokensSaved+n,syncs:v.syncs+1,avgCompressionRate:(v.avgCompressionRate*v.syncs+r)/(v.syncs+1),totalDuration:v.totalDuration+t.duration}}else p.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],x=p.filter(v=>v.date>=w),C=[...i.agentUsage];if(t.agents)for(let v of t.agents){let j=C.findIndex(T=>T.agentName===v);j>=0?C[j]={...C[j],usageCount:C[j].usageCount+1,tokensSaved:C[j].tokensSaved+Math.floor(n/t.agents.length)}:C.push({agentName:v,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:C,dailyStats:x,firstSync:i.firstSync||k(),lastUpdated:k()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((l,u)=>l+u.tokensSaved,0),i=r.reduce((l,u)=>l+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:ig(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},bs=new Pc});var xc,Xe,Ln=h(()=>{"use strict";Ce();jn();te();xc=class{static{c(this,"MemoryService")}async log(e,t,n,r){try{let o=await W.getProjectId(e);if(!o)return;E.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await W.getProjectId(e);return n?E.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...l}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:l,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),l=JSON.stringify(i.data).toLowerCase().includes(o);return a||l}).slice(-n)}async getByAction(e,t,n=50){try{let r=await W.getProjectId(e);return r?E.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:l,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:l}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await W.getProjectId(e);if(!t)return;E.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return E.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=E.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Gt.MEMORY_MAX_ENTRIES)return 0;let r=n-Gt.MEMORY_MAX_ENTRIES,o=E.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);mt.archiveMany(e,o.map((a,l)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||l}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&E.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Xe=new xc});import lb from"node:path";function ub(s){return Fd(lb.resolve(s))}function vr(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"")}function db(s){return yc(s,e=>`${vr(e.name)}::${vr(e.source)}`)}function pb(s){return yc(s,e=>`${vr(e.issue)}::${vr(e.file)}::${vr(e.source)}`)}var Ac,mb,ag,cg=h(()=>{"use strict";te();wc();vo();c(ub,"repoHash");c(vr,"normalizeKey");c(db,"dedupePatterns");c(pb,"dedupeAntiPatterns");Ac=class{static{c(this,"PatternExtractor")}async extract(e){let t=ub(e.projectPath),n=[];if(e.context7Verified)for(let u of e.frameworks)n.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let r=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=db([...n,...r]),a=pb([...o]),l=`analysis:derived-rules:${t}`;return A.setDoc(e.projectId,l,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},mb=new Ac,ag=mb});async function lg(s,e,t){let n=0;try{let a=ko(s);if(a)for(let l of Object.values(a.documents))n+=l.length}catch(a){M.debug("Could not load BM25 index for metrics",{error:y(a)})}n===0&&(n=e.fileCount*gb);let r=0,o=n>0?Math.max(0,(n-r)/n):0;try{await bs.recordSync(s,{originalSize:n,filteredSize:r,duration:t,isWatch:!1})}catch(a){M.debug("Failed to record sync metrics",{error:y(a)})}let i={};try{let a=ko(s);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let l=_o(s);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=Wp(s);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){M.debug("Could not load index stats",{error:y(a)})}return{duration:t,originalSize:n,filteredSize:r,compressionRate:o,indexes:i}}async function ug(s,e,t,n,r,o){try{let i=t.recentCommits[0]?.hash||null,a=[],l=[],u;try{u=await B.getAggregatedFeedback(s),u.patternsDiscovered.length>0&&(a=u.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),u.knownGotchas.length>0&&(l=u.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let d=await ag.extract({projectId:s,projectPath:e,languages:n.languages,frameworks:Array.from(new Set([...n.frameworks,...r.frameworks])),feedback:u,context7Verified:o});a=d.patterns,l=d.antiPatterns,await Oe.saveDraft(s,{projectId:s,languages:n.languages,frameworks:n.frameworks,configFiles:[],fileCount:n.fileCount,patterns:a,antiPatterns:l,analyzedAt:k(),status:"draft",commitHash:i??void 0})}catch(i){M.debug("Failed to save draft analysis (non-critical)",{error:y(i)})}}async function dg(s){try{let[e,t,n,r,o]=await Promise.all([Ft.archiveOldShipped(s).catch(()=>0),Nn.markDormantIdeas(s).catch(()=>0),Ve.removeStaleCompleted(s).catch(()=>0),B.archiveStalePausedTasks(s).catch(()=>[]),Xe.capEntries(s).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){M.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=mt.getStats(s);M.debug("Archive stats",a)}}catch(e){M.debug("Archival failed (non-critical)",{error:y(e)})}}var gb,pg=h(()=>{"use strict";So();qa();Do();pn();jn();qo();Rc();Mn();vs();Ze();F();ee();Nt();Ln();cg();gb=200;c(lg,"recordSyncMetrics");c(ug,"saveDraftAnalysis");c(dg,"archiveStaleData")});import jc from"node:fs/promises";import oi from"node:path";var _c,Dc,mg,gg=h(()=>{"use strict";F();J();_c=".prjct/.prjct-state.md",Dc=class{static{c(this,"LocalStateGenerator")}async generate(e,t){let n=oi.join(e,_c);await jc.mkdir(oi.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await jc.writeFile(n,r,"utf-8")}async remove(e){try{await jc.unlink(oi.join(e,_c))}catch(t){if(!I(t))throw t}}async exists(e){let t=oi.join(e,_c);return b(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,l)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
693
+ ${s.body(e)}`}var bc,Tc,Jm,qm=h(()=>{"use strict";an();Nt();Vm();bc=[{name:"prjct",description:Hm,allowedTools:[...Bm],condition:c(()=>!0,"condition"),body:c(s=>Gm(s),"body")}];c(Zv,"buildFrontmatter");c(eb,"buildSkillContent");Tc=class{static{c(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},n){let r={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:n?.version??e.stats.version??"0.0.0",fileCount:n?.fileCount??e.stats.fileCount??0,patterns:n?.patterns??[],antiPatterns:n?.antiPatterns??[],recentShipped:n?.recentShipped??[],velocity:n?.velocity??null,backlogCount:n?.backlogCount??t.backlogCount,completedTaskCount:n?.completedTaskCount??t.completedTaskCount,pausedTaskCount:n?.pausedTaskCount??t.pausedTaskCount,knownGotchas:n?.knownGotchas??[],hasActiveTask:n?.hasActiveTask??t.hasActiveTask,activeTaskDescription:n?.activeTaskDescription??"",pausedTasks:n?.pausedTasks??[],topBacklog:n?.topBacklog??[],ideasCount:n?.ideasCount??0,shippedCount:n?.shippedCount??0,userPatterns:n?.userPatterns??[]},i=Sr.join(Qv.homedir(),".claude","skills");for(let l of bc){if(!l.condition(t)){r.skipped.push({name:l.name,reason:"condition not met"}),await kr.rm(Sr.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=eb(l,o),d=Sr.join(i,l.name),p=Sr.join(d,"SKILL.md");await kr.mkdir(d,{recursive:!0}),await kr.writeFile(p,u,"utf-8"),r.generated.push({name:l.name,path:p})}catch(u){M.debug(`Failed to generate skill ${l.name}`,{error:je(u)}),r.skipped.push({name:l.name,reason:je(u)})}}let a=new Set(bc.map(l=>l.name));try{let l=await kr.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of l)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await kr.rm(Sr.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return r.generated.length>0&&M.info("Generated native workflow skills",{count:r.generated.length,skills:r.generated.map(l=>l.name)}),r}getDefinitions(){return bc}},Jm=new Tc});function Zo(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}function ei(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}function ti(){return{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"}}function ni(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}var Xm=h(()=>{"use strict";c(Zo,"emptyGitData");c(ei,"emptyStats");c(ti,"emptyCommands");c(ni,"emptyStack")});function zm(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=_o(e);if(o)for(let l of t){let u=o.reverse[l];if(u)for(let d of u)n.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:s.deleted,allAffected:a}}function Km(s){let e=new Set;for(let t of s){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var Ym=h(()=>{"use strict";Do();c(zm,"propagateChanges");c(Km,"affectedDomains")});import Qm from"node:fs/promises";import tb from"node:path";function nb(s){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(s).toString(36)}`;let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function sb(s){let e=await tn(s,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,n=await rs(e,100,async r=>{try{let o=tb.join(s,r),[i,a]=await Promise.all([Qm.readFile(o,"utf-8"),Qm.stat(o)]);return{path:r,hash:nb(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let r of n)t.set(r.path,r);return t}function rb(s,e){let t=[],n=[],r=[];for(let[i,a]of s){let l=e.get(i);l?l.hash!==a.hash?n.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())s.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:r}}function Ec(s,e){let t=T.getDb(s);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)n.run(r.path,r.hash,r.size,r.mtime)})(),T.setDoc(s,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function ob(s){let e=new Map;try{let t=T.query(s,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Cc(s,e){let[t,n]=await Promise.all([sb(s),Promise.resolve(ob(e))]);return{diff:rb(t,n),currentHashes:t}}function Zm(s){return T.hasDoc(s,"file-hashes-meta")}var eg=h(()=>{"use strict";te();J();c(nb,"hashContent");c(sb,"computeHashes");c(rb,"diffHashes");c(Ec,"saveHashes");c(ob,"loadHashes");c(Cc,"detectChanges");c(Zm,"hasHashRegistry")});async function tg(s){let{projectId:e,projectPath:t,isFullSync:n,changedFilesHint:r}=s,o=!0,i=new Set,a;if(!n&&Zm(e))try{let{diff:l,currentHashes:u}=await Cc(t,e),d=l.added.length+l.modified.length+l.deleted.length;if(d===0&&!r?.length)o=!1,a={isIncremental:!0,filesChanged:0,filesUnchanged:l.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let p=zm(l,e);i=Km(p.allAffected),o=p.allAffected.some(g=>{let w=g.substring(g.lastIndexOf("."));return ib.has(w)}),a={isIncremental:!0,filesChanged:d,filesUnchanged:l.unchanged.length,indexesRebuilt:o,affectedDomains:Array.from(i)}}Ec(e,u)}catch(l){M.debug("Incremental detection failed, falling back to full sync",{error:y(l)})}else try{let{currentHashes:l}=await Cc(t,e);Ec(e,l)}catch(l){M.debug("Hash computation failed (non-critical)",{error:y(l)})}return{shouldRebuildIndexes:o,changedDomains:i,incrementalInfo:a}}var ib,ng=h(()=>{"use strict";Ym();eg();F();Nt();ib=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);c(tg,"detectIncrementalChanges")});import{z as Re}from"zod";function ig(s,e="default"){let t=sg[e]||sg.default;return s/1e3*t}function si(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var ab,cb,rg,og,sg,ri=h(()=>{"use strict";ab=Re.object({date:Re.string(),tokensSaved:Re.number(),syncs:Re.number(),avgCompressionRate:Re.number(),totalDuration:Re.number()}),cb=Re.object({agentName:Re.string(),usageCount:Re.number(),tokensSaved:Re.number()}),rg=Re.object({totalTokensSaved:Re.number(),avgCompressionRate:Re.number(),syncCount:Re.number(),watchTriggers:Re.number(),avgSyncDuration:Re.number(),totalSyncDuration:Re.number(),agentUsage:Re.array(cb),dailyStats:Re.array(ab),firstSync:Re.string(),lastUpdated:Re.string()}),og={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},sg={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};c(ig,"estimateCostSaved");c(si,"formatCost")});var Pc,bs,Rc=h(()=>{"use strict";ri();ee();dn();Pc=class extends We{static{c(this,"MetricsStorage")}constructor(){super("metrics.json",rg)}getDefault(){return{...og}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,l=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,p=[...i.dailyStats],m=p.findIndex(v=>v.date===o);if(m>=0){let v=p[m];p[m]={...v,tokensSaved:v.tokensSaved+n,syncs:v.syncs+1,avgCompressionRate:(v.avgCompressionRate*v.syncs+r)/(v.syncs+1),totalDuration:v.totalDuration+t.duration}}else p.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],x=p.filter(v=>v.date>=w),C=[...i.agentUsage];if(t.agents)for(let v of t.agents){let j=C.findIndex(E=>E.agentName===v);j>=0?C[j]={...C[j],usageCount:C[j].usageCount+1,tokensSaved:C[j].tokensSaved+Math.floor(n/t.agents.length)}:C.push({agentName:v,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:C,dailyStats:x,firstSync:i.firstSync||k(),lastUpdated:k()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((l,u)=>l+u.tokensSaved,0),i=r.reduce((l,u)=>l+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:ig(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},bs=new Pc});var xc,Xe,Ln=h(()=>{"use strict";Ce();jn();te();xc=class{static{c(this,"MemoryService")}async log(e,t,n,r){try{let o=await W.getProjectId(e);if(!o)return;T.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await W.getProjectId(e);return n?T.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...l}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:l,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),l=JSON.stringify(i.data).toLowerCase().includes(o);return a||l}).slice(-n)}async getByAction(e,t,n=50){try{let r=await W.getProjectId(e);return r?T.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:l,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:l}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await W.getProjectId(e);if(!t)return;T.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return T.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=T.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Gt.MEMORY_MAX_ENTRIES)return 0;let r=n-Gt.MEMORY_MAX_ENTRIES,o=T.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);mt.archiveMany(e,o.map((a,l)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||l}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&T.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Xe=new xc});import lb from"node:path";function ub(s){return Fd(lb.resolve(s))}function vr(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"")}function db(s){return yc(s,e=>`${vr(e.name)}::${vr(e.source)}`)}function pb(s){return yc(s,e=>`${vr(e.issue)}::${vr(e.file)}::${vr(e.source)}`)}var Ac,mb,ag,cg=h(()=>{"use strict";te();wc();vo();c(ub,"repoHash");c(vr,"normalizeKey");c(db,"dedupePatterns");c(pb,"dedupeAntiPatterns");Ac=class{static{c(this,"PatternExtractor")}async extract(e){let t=ub(e.projectPath),n=[];if(e.context7Verified)for(let u of e.frameworks)n.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let r=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=db([...n,...r]),a=pb([...o]),l=`analysis:derived-rules:${t}`;return A.setDoc(e.projectId,l,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},mb=new Ac,ag=mb});async function lg(s,e,t){let n=0;try{let a=ko(s);if(a)for(let l of Object.values(a.documents))n+=l.length}catch(a){M.debug("Could not load BM25 index for metrics",{error:y(a)})}n===0&&(n=e.fileCount*gb);let r=0,o=n>0?Math.max(0,(n-r)/n):0;try{await bs.recordSync(s,{originalSize:n,filteredSize:r,duration:t,isWatch:!1})}catch(a){M.debug("Failed to record sync metrics",{error:y(a)})}let i={};try{let a=ko(s);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let l=_o(s);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=Wp(s);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){M.debug("Could not load index stats",{error:y(a)})}return{duration:t,originalSize:n,filteredSize:r,compressionRate:o,indexes:i}}async function ug(s,e,t,n,r,o){try{let i=t.recentCommits[0]?.hash||null,a=[],l=[],u;try{u=await B.getAggregatedFeedback(s),u.patternsDiscovered.length>0&&(a=u.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),u.knownGotchas.length>0&&(l=u.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let d=await ag.extract({projectId:s,projectPath:e,languages:n.languages,frameworks:Array.from(new Set([...n.frameworks,...r.frameworks])),feedback:u,context7Verified:o});a=d.patterns,l=d.antiPatterns,await Oe.saveDraft(s,{projectId:s,languages:n.languages,frameworks:n.frameworks,configFiles:[],fileCount:n.fileCount,patterns:a,antiPatterns:l,analyzedAt:k(),status:"draft",commitHash:i??void 0})}catch(i){M.debug("Failed to save draft analysis (non-critical)",{error:y(i)})}}async function dg(s){try{let[e,t,n,r,o]=await Promise.all([Ft.archiveOldShipped(s).catch(()=>0),Nn.markDormantIdeas(s).catch(()=>0),Ve.removeStaleCompleted(s).catch(()=>0),B.archiveStalePausedTasks(s).catch(()=>[]),Xe.capEntries(s).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){M.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=mt.getStats(s);M.debug("Archive stats",a)}}catch(e){M.debug("Archival failed (non-critical)",{error:y(e)})}}var gb,pg=h(()=>{"use strict";So();qa();Do();pn();jn();qo();Rc();Mn();vs();Ze();F();ee();Nt();Ln();cg();gb=200;c(lg,"recordSyncMetrics");c(ug,"saveDraftAnalysis");c(dg,"archiveStaleData")});import jc from"node:fs/promises";import oi from"node:path";var _c,Dc,mg,gg=h(()=>{"use strict";F();J();_c=".prjct/.prjct-state.md",Dc=class{static{c(this,"LocalStateGenerator")}async generate(e,t){let n=oi.join(e,_c);await jc.mkdir(oi.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await jc.writeFile(n,r,"utf-8")}async remove(e){try{await jc.unlink(oi.join(e,_c))}catch(t){if(!I(t))throw t}}async exists(e){let t=oi.join(e,_c);return b(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,l)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
694
694
  `)}},mg=new Dc});import fb from"node:fs/promises";import hb from"node:path";async function fg(s){await Promise.all(yb.map(e=>fb.mkdir(hb.join(s,e),{recursive:!0})))}async function hg(s){let{projectId:e,projectPath:t,cliVersion:n,git:r,stats:o}=s,i=A.getDoc(e,"project")||{},a={...i,projectId:e,repoPath:t,name:o.name,version:o.version,cliVersion:n,techStack:o.frameworks,fileCount:o.fileCount,commitCount:r.commits,stack:o.ecosystem,currentBranch:r.branch,hasUncommittedChanges:r.hasChanges,createdAt:i.createdAt||k(),lastSync:k(),lastSyncCommit:r.recentCommits[0]?.hash||null,lastSyncBranch:r.branch};A.setDoc(e,"project",a)}async function yg(s){let{projectId:e,projectPath:t,stats:n,stack:r}=s,i={...await B.read(e)};i.projectId=e,i.stack={language:n.languages[0]||"Unknown",framework:n.frameworks[0]||null},i.domains={hasFrontend:r.hasFrontend,hasBackend:r.hasBackend,hasDatabase:r.hasDatabase,hasTesting:r.hasTesting,hasDocker:r.hasDocker},i.projectType=n.projectType,i.metrics={totalFiles:n.fileCount},i.lastSync=k(),i.lastUpdated=k(),i.context={...i.context||{},lastSession:k(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await B.write(e,i);try{await mg.generate(t,i)}catch(a){M.debug("Local state generation failed (optional)",{error:y(a)})}}function wg(s,e,t){A.appendEvent(s,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}var yb,kg=h(()=>{"use strict";te();Ze();F();ee();Nt();gg();yb=["storage","context","memory","analysis","config","sync"];c(fg,"ensureProjectDirectories");c(hg,"updateProjectDoc");c(yg,"updateStateDoc");c(wg,"logSyncEvent")});var Sg=h(()=>{"use strict"});import wb from"node:fs/promises";import vg from"node:path";var ii,bg=h(()=>{"use strict";J();ii=class{static{c(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=vg.join(this.projectPath,"package.json"),t=await wb.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return b(vg.join(this.projectPath,e))}}});import Ic from"node:path";async function Tg(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0},t={cwd:s},n=c(d=>d.catch(()=>null),"safe"),[r,o,i,a,l,u]=await Promise.all([n(N("git branch --show-current",t)),n(N("git rev-list --count HEAD",t)),n(N("git shortlog -sn --all",t)),n(N("git status --porcelain",t)),n(N('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',t)),n(N('git log --oneline --since="1 week ago"',t))]);if(r&&(e.branch=r.stdout.trim()||"main"),o&&(e.commits=parseInt(o.stdout.trim(),10)||0),i&&(e.contributors=i.stdout.split(`
695
695
  `).filter(d=>d.trim()).length),a){let d=a.stdout.trim().split(`
696
696
  `).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(`
697
697
  `).filter(Boolean).map(d=>{let[p,m,g]=d.split("|");return{hash:p,message:m,date:g}})),u&&(e.weeklyCommits=u.stdout.split(`
698
- `).filter(d=>d.trim()).length),!r&&!o&&!a&&M.debug("Git analysis failed (not a git repo?)"),e}async function bt(s,e){let t=await b(Ic.join(s,e));return t||M.debug("File not found",{filename:e}),t}async function Eg(s){let e={fileCount:0,version:"0.0.0",name:Ic.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await tn(s,{skipDotfiles:!0});e.fileCount=n.filter(r=>t.some(o=>r.endsWith(o))).length}catch(t){M.debug("File count failed",{path:s,error:je(t)}),e.fileCount=0}try{let t=Ic.join(s,"package.json"),n=await Ae(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 bt(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){M.debug("No package.json found",{path:s,error:je(t)})}return await bt(s,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await bt(s,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await bt(s,"requirements.txt")||await bt(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 Cg(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 bt(s,"bun.lockb")||await bt(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 bt(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 bt(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 bt(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 bt(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 Pg(s){return new ii(s).detect()}var Rg=h(()=>{"use strict";an();Sg();Ue();J();Nt();bg();c(Tg,"analyzeGit");c(bt,"fileExistsInProject");c(Eg,"gatherStats");c(Cg,"detectCommands");c(Pg,"detectStack")});import xg from"node:fs/promises";import $c from"node:path";var Ag,Oc,jg,_g=h(()=>{"use strict";Ze();F();Ue();Ag={async jsonFilesValid(s){let e=Date.now(),t=[],n=$c.basename(s);try{await B.read(n)}catch(r){I(r)||t.push(`state: ${y(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=$c.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 xg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await xg.readFile($c.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(!I(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(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}}},Oc=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[Ag.jsonFilesValid(t),Ag.noSensitiveData(t)];for(let m of l){let g=await m;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(w=>w.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 w=n.checks.slice(n.checks.indexOf(m)+1);a+=w.filter(x=>x.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}}}},jg=new Oc});import{z as ai}from"zod";function Sb(){let s=et(Dg);if(!s)throw new Error(`Missing bundled crew checkpoints template: ${Dg}`);return s}var ci,Dg,kb,Nc,vb,Ig,$g=h(()=>{"use strict";Dn();ee();te();ci="crew:checkpoints",Dg="crew/CHECKPOINTS.md",kb=ai.object({content:ai.string(),source:ai.enum(["default","user","migrated"]),updated_at:ai.string().min(1)});c(Sb,"getBundledDefault");Nc=class{static{c(this,"CheckpointsStorage")}get(e){let t=E.getDoc(e,ci);return t===null?{content:Sb(),source:"default",updated_at:k()}:kb.parse(t)}hasCustomization(e){return E.hasDoc(e,ci)}set(e,t,n="user"){let r={content:t,source:n,updated_at:k()};return E.setDoc(e,ci,r),r}reset(e){E.deleteDoc(e,ci)}},vb=new Nc,Ig=vb});var Og={};re(Og,{TEAM_ENROLLMENT_KEY:()=>li,TeamEnrollmentSchema:()=>Mc,default:()=>di,serializeCanonical:()=>ui,teamEnrollmentStorage:()=>Ts});import{z as br}from"zod";function ui(s){let e=Object.keys(s).sort(),t={};for(let n of e)t[n]=s[n];return JSON.stringify(t)}var li,Mc,Lc,Ts,di,pi=h(()=>{"use strict";te();li="team:enrollment",Mc=br.object({required:br.boolean(),minVersion:br.string().min(1),enrolledAt:br.string().min(1),enrolledBy:br.string().nullable().default(null)}),Lc=class{static{c(this,"TeamEnrollmentStorage")}get(e){let t=E.getDoc(e,li);return t===null?null:Mc.parse(t)}set(e,t){let n=Mc.parse(t);E.setDoc(e,li,n)}clear(e){E.deleteDoc(e,li)}};c(ui,"serializeCanonical");Ts=new Lc,di=Ts});var Ng,Fc,Uc,Mg,Es,mi=h(()=>{"use strict";Ng="memory.",Fc="remember.",Uc=`${Ng}${Fc}`,Mg=`${Ng}task.tagged`,Es="status.changed"});var Wc={};re(Wc,{BASE_MEMORY_TYPES:()=>Lg,MEMORY_TYPES:()=>Cs,formatMemoryMd:()=>Ps,projectMemory:()=>Ne});function Fg(s,e){try{return JSON.parse(s)}catch{return e}}function Cb(s){let e=s.type.slice(Uc.length),t=Fg(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 Pb(s){let e=s.data?Fg(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 Rb(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 xb(s,e){for(let[t,n]of Object.entries(e))if(s.tags[t]!==n)return!1;return!0}function Ab(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 Ps(s){if(s.length===0)return"> No matching memory entries.";let e=new Map;for(let a of s){let l=e.get(a.type)??[];l.push(a),e.set(a.type,l)}let t=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],n=[],r={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},o=c((a,l)=>{if(l.length!==0){n.push(`### ${a.toUpperCase()}`);for(let u of l){let d=Object.entries(u.tags).map(([g,w])=>`${g}=${w}`).join(" "),p=d?` _(${d})_`:"",m=r[u.provenance];n.push(`- \`${m}\` [${u.id}] ${u.content}${p}`)}n.push("")}},"renderGroup"),i=new Set;for(let a of t){let l=e.get(a);!l||l.length===0||(o(a,l),i.add(a))}for(let[a,l]of e)i.has(a)||o(a,l);return n.join(`
699
- `).trim()}var Lg,Cs,bb,Tb,Eb,Ne,gt=h(()=>{"use strict";Ln();te();mi();Lg=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],Cs=Lg,bb=25,Tb=4,Eb=100;c(Fg,"safeJson");c(Cb,"rowToEntry");c(Pb,"shippedRowToEntry");c(Rb,"matchesTopic");c(xb,"matchesTags");c(Ab,"dedupeLatestByKey");Ne={async remember(s,e){await Xe.log(s,`${Fc}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"});try{let{default:t}=await Promise.resolve().then(()=>(Ce(),ds)),r=(await t.readConfig(s))?.projectId;if(!r)return;let{publishCRUD:o}=await Promise.resolve().then(()=>(yr(),ep)),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??bb,n=Math.max(t*Tb,Eb),r=E.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${Uc}%`,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(Cb),...o.map(Pb)];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=>xb(a,e.tags??{}))),e.topic&&(i=i.filter(a=>Rb(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),e.dedupeByKey!==!1&&(i=Ab(i)),i.slice(0,t)},similar(s,e,t=10){let n=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return n.length===0?[]:Ne.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)}};c(Ps,"formatMemoryMd")});var Vg={};re(Vg,{legacyCrewSweep:()=>Ib});import Ug from"node:fs/promises";import Wg from"node:path";function jb(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)}
700
- `}async function Hg(s){try{return(await Ug.stat(s)).mtimeMs}catch{return null}}async function Bg(s){try{return await Ug.readFile(s,"utf-8")}catch{return null}}function Gg(s,e){return E.getDoc(s,e)}function fi(s,e,t){E.setDoc(s,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function hi(s,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>(gt(),Wc));await n.remember(s,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){M.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function _b(s,e,t){let n=Wg.join(s,Tr),r=await Hg(n);if(r===null)return;let o=Gg(e,Hc);if(o===null){let i=await Bg(n);if(i===null){t.errors.push({file:Tr,reason:"read failed"});return}try{Ig.set(e,i,"migrated"),fi(e,Hc,r),t.checkpointsMigrated=!0,await hi(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:Tr,reason:a instanceof Error?a.message:String(a)})}return}r>o.mtime_ms&&(await hi(s,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${Tr}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),fi(e,Hc,r),t.checkpointsHandEditWarned=!0)}async function Db(s,e,t){let n=Wg.join(s,gi),r=await Hg(n);if(r===null)return;let o=Gg(e,Bc),i=di.get(e);if(o===null){let a=await Bg(n);if(a===null){t.errors.push({file:gi,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};di.set(e,u),await os(n,jb(u)),t.teamMigrated=!0,await hi(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"})}fi(e,Bc,r)}catch(l){t.errors.push({file:gi,reason:l instanceof Error?l.message:String(l)})}return}r>o.mtime_ms&&(await hi(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"}),fi(e,Bc,r),t.teamHandEditWarned=!0)}async function Ib(s,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await _b(s,e,t).catch(n=>{t.errors.push({file:Tr,reason:n instanceof Error?n.message:String(n)})}),await Db(s,e,t).catch(n=>{t.errors.push({file:gi,reason:n instanceof Error?n.message:String(n)})}),t}var Tr,gi,Hc,Bc,Jg=h(()=>{"use strict";$g();te();pi();J();Nt();Tr=".prjct/CHECKPOINTS.md",gi=".prjct/team.json",Hc="migration:v2.19.8:last-flagged-checkpoints",Bc="migration:v2.19.8:last-flagged-team";c(jb,"renderMirror");c(Hg,"statMtimeMs");c(Bg,"tryReadFile");c(Gg,"readFlag");c(fi,"writeFlag");c(hi,"captureInboxWarning");c(_b,"sweepCheckpoints");c(Db,"sweepTeamJson");c(Ib,"legacyCrewSweep")});import $b from"node:fs/promises";import qg from"node:path";function Gc(s,e){return Promise.race([s,new Promise((t,n)=>setTimeout(()=>n(new Error(`sync phase '${e}' timed out after ${Xg}ms`)),Xg))])}async function ft(s,e){let t=Date.now();M.debug("sync phase start",{phase:s});try{let n=await e();return M.debug("sync phase done",{phase:s,ms:Date.now()-t}),n}catch(n){throw M.debug("sync phase failed",{phase:s,ms:Date.now()-t,error:je(n)}),n}}var Xg,Vc,Rs,Jc=h(()=>{"use strict";So();qa();Do();an();Ye();Lt();Ce();De();Jo();pn();qo();gs();hc();Mn();vs();Ze();Lm();J();Nt();Lo();qm();Xm();ng();pg();kg();Rg();_g();Xg=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(Gc,"withTimeout");c(ft,"phase");Vc=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 W.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:Zo(),stats:ei(),commands:ti(),stack:ni(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=D.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await $b.rm(qg.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Rn()).installed){let R=await Vo({autoRepair:!0});R.verified||M.warn(`Codex p. router not ready: ${R.message||"verification failed"}`)}try{r=await ft("context7",()=>$n.ensureReady())}catch(R){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:Zo(),stats:ei(),commands:ti(),stack:ni(),context7:{installed:r.installed,verified:!1,message:je(R)},error:`Context7 MCP is required but not ready: ${je(R)}. Run 'prjct start' to repair.`}}await fg(this.globalPath),await ft("migrate",()=>Gc(Yo(this.projectId),"migrate")),await ft("sweep",async()=>{try{let R=await Qo(this.projectId);R>0&&M.info("Swept legacy JSON files into SQLite",{swept:R})}catch(R){M.debug("Legacy JSON sweep failed (non-critical)",{error:je(R)})}}),await ft("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:R}=await Promise.resolve().then(()=>(Jg(),Vg)),ue=await R(this.projectPath,this.projectId);(ue.checkpointsMigrated||ue.teamMigrated||ue.checkpointsHandEditWarned||ue.teamHandEditWarned||ue.errors.length>0)&&M.info("Legacy crew sweep ran",{checkpointsMigrated:ue.checkpointsMigrated,teamMigrated:ue.teamMigrated,checkpointsHandEditWarned:ue.checkpointsHandEditWarned,teamHandEditWarned:ue.teamHandEditWarned,errors:ue.errors.length})}catch(R){M.debug("Legacy crew sweep failed (non-critical)",{error:je(R)})}});let[a,l,u,d]=await ft("gather",()=>Gc(Promise.all([Tg(this.projectPath),Eg(this.projectPath),Cg(this.projectPath),Pg(this.projectPath)]),"gather")),{shouldRebuildIndexes:p,changedDomains:m,incrementalInfo:g}=await ft("incremental",()=>tg({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));p&&await ft("index",async()=>{try{await Gc(Promise.all([Od(this.projectPath,this.projectId),Gp(this.projectPath,this.projectId),Hp(this.projectPath,this.projectId)]),"index")}catch(R){M.debug("File ranking index build failed (non-critical)",{error:je(R)})}});let w,x=Date.now();M.debug("sync phase start",{phase:"skills"});try{let[R,ue,en,Cn,es,sr,ts,qr,ns,rr,ea]=await Promise.all([Promise.resolve(Qe.getActive(this.projectId)).catch(()=>null),Oe.getActive(this.projectId).catch(()=>null),Ft.getRecent(this.projectId,3).catch(()=>[]),Mm.getMetrics(this.projectId).catch(()=>null),Ve.getBacklog(this.projectId).catch(()=>[]),B.getTaskHistory(this.projectId).catch(()=>[]),B.getAllPausedTasks(this.projectId).catch(()=>[]),B.getAggregatedFeedback(this.projectId).catch(()=>null),B.getCurrentTask(this.projectId).catch(()=>null),Nn.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Ft.getCount(this.projectId).catch(()=>0)]),or={backlogCount:es.length,completedTaskCount:sr.length,pausedTaskCount:ts.length,hasActiveTask:!!ns},ir=R?R.patterns.map(Y=>({name:Y.name,description:Y.description,location:Y.locations?.[0]})):(ue?.patterns??[]).filter(Y=>Y.source!=="repo").map(Y=>({name:Y.name,description:Y.description,location:Y.location})),Xr=R?R.antiPatterns.map(Y=>({issue:Y.issue,file:Y.files?.[0]??"multiple",suggestion:Y.suggestion,severity:Y.severity??"medium"})):(ue?.antiPatterns??[]).filter(Y=>Y.source!=="repo").map(Y=>({issue:Y.issue,file:Y.file,suggestion:Y.suggestion,severity:Y.severity??"medium"})),ss=R?.commands?{install:R.commands.install??u.install,run:u.run,test:R.commands.test??u.test,build:R.commands.build??u.build,dev:R.commands.dev??u.dev,lint:R.commands.lint??u.lint,format:R.commands.format??u.format}:u,ar={version:l.version,fileCount:l.fileCount,patterns:ir,antiPatterns:Xr,recentShipped:en.map(Y=>({name:Y.name,type:Y.type??"feature",duration:Y.duration,filesChanged:Y.changes?.length})),velocity:Cn?{avgPoints:Cn.averageVelocity,trend:Cn.velocityTrend,accuracy:Cn.estimationAccuracy}:null,backlogCount:es.length,completedTaskCount:sr.length,pausedTaskCount:ts.length,knownGotchas:qr?.knownGotchas??[],userPatterns:qr?.patternsDiscovered??[],hasActiveTask:!!ns,activeTaskDescription:ns?.description??"",pausedTasks:ts.map(Y=>({description:Y.description,pausedAt:Y.pausedAt??""})),topBacklog:es.slice(0,3).map(Y=>({description:Y.description,priority:Y.priority??"medium"})),ideasCount:rr?.pending??0,shippedCount:ea};w=await Jm.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:ss,stack:d},or,ar)}catch(R){M.debug("Native skill generation failed (non-critical)",{error:je(R)})}M.debug("sync phase done",{phase:"skills",ms:Date.now()-x}),await ft("update-files",()=>Promise.all([hg({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:a,stats:l}),yg({projectId:this.projectId,projectPath:this.projectPath,stats:l,stack:d}),Promise.resolve(wg(this.projectId,a,l)),ug(this.projectId,this.projectPath,a,l,d,r.verified)]));let C=await Oe.getActive(this.projectId),v={patterns:C?.patterns?.length||0,antiPatterns:C?.antiPatterns?.length||0,criticalAntiPatterns:C?.antiPatterns?.filter(R=>R.severity==="high").length||0},j=Date.now()-n,T=await ft("metrics",()=>lg(this.projectId,l,j));await ft("archive",()=>dg(this.projectId)),await ft("install-global",async()=>{await Pe.installGlobalConfig(),await Pe.syncCommands()});let L;return await ft("verify",async()=>{try{let R=await W.readConfig(this.projectPath);L=await jg.verify(this.projectPath,this.globalPath,R?.verification)}catch(R){M.debug("Verification failed (non-critical)",{error:je(R)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:u,stack:d,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:v,syncMetrics:T,verification:L,incremental:g,generatedSkills:w}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:Zo(),stats:ei(),commands:ti(),stack:ni(),context7:{installed:r.installed,verified:r.verified,message:r.message},error:je(o)}}}async getCliVersion(){try{let e=qg.join(__dirname,"..","..","package.json");return(await Ae(e))?.version||"0.0.0"}catch(e){return M.debug("Failed to read CLI version",{error:je(e)}),"0.0.0"}}},Rs=new Vc});import Fn from"chalk";var zg,Ob,Nb,Tt,Kg=h(()=>{"use strict";Ye();zg=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Ob=80,Nb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:zg,speed:Ob},cli:{header:c(()=>`${Fn.cyan.bold("\u26A1")} ${Fn.cyan("prjct")}`,"header"),footer:c(()=>Fn.dim("\u26A1 prjct"),"footer"),spin:c((s,e)=>`${Fn.cyan("\u26A1")} ${Fn.cyan("prjct")} ${Fn.cyan(zg[s%10])} ${Fn.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")=>uo(s).commitFooter,"getCommitFooter"),getSignature:c((s="claude")=>uo(s).signature,"getSignature")},Tt=Nb});import ie from"chalk";function Fb(){return Mb[Lb]}var oO,qc,Mb,Lb,Un,xs,Xc,st,hn,Ub,Wb,f,ke=h(()=>{"use strict";Kg();Ho();oc();oO=Tt.spinner.frames,qc=Tt.spinner.speed,Mb={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}},Lb="compact";c(Fb,"getTierConfig");Un={success:ie.green("\u2713"),fail:ie.red("\u2717"),warn:ie.yellow("\u26A0"),info:ie.blue("\u2139"),debug:ie.dim("\u{1F527}"),bullet:ie.dim("\u2022"),arrow:ie.dim("\u2192"),check:ie.green("\u2713"),cross:ie.red("\u2717"),spinner:ie.cyan("\u25D0")},xs=null,Xc=0,st=!1,hn=c((s,e)=>{let t=e??(Fb().maxCharsPerLine||St.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate"),Ub=c(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(St.CLEAR_WIDTH)}\r`):!0,"clear"),Wb={start(){return st||console.log(Tt.cli.header()),this},end(){return st||console.log(Tt.cli.footer()),this},spin(s){return st?this:(this.stop(),process.stdout.isTTY?(xs=setInterval(()=>{process.stdout.write(`\r${Tt.cli.spin(Xc++,hn(s,St.SPINNER_MSG))}`)},qc),this):(process.stdout.write(`${Tt.cli.spin(0,hn(s,St.SPINNER_MSG))}
698
+ `).filter(d=>d.trim()).length),!r&&!o&&!a&&M.debug("Git analysis failed (not a git repo?)"),e}async function bt(s,e){let t=await b(Ic.join(s,e));return t||M.debug("File not found",{filename:e}),t}async function Eg(s){let e={fileCount:0,version:"0.0.0",name:Ic.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await tn(s,{skipDotfiles:!0});e.fileCount=n.filter(r=>t.some(o=>r.endsWith(o))).length}catch(t){M.debug("File count failed",{path:s,error:je(t)}),e.fileCount=0}try{let t=Ic.join(s,"package.json"),n=await Ae(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 bt(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){M.debug("No package.json found",{path:s,error:je(t)})}return await bt(s,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await bt(s,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await bt(s,"requirements.txt")||await bt(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 Cg(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 bt(s,"bun.lockb")||await bt(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 bt(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 bt(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 bt(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 bt(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 Pg(s){return new ii(s).detect()}var Rg=h(()=>{"use strict";an();Sg();Ue();J();Nt();bg();c(Tg,"analyzeGit");c(bt,"fileExistsInProject");c(Eg,"gatherStats");c(Cg,"detectCommands");c(Pg,"detectStack")});import xg from"node:fs/promises";import $c from"node:path";var Ag,Oc,jg,_g=h(()=>{"use strict";Ze();F();Ue();Ag={async jsonFilesValid(s){let e=Date.now(),t=[],n=$c.basename(s);try{await B.read(n)}catch(r){I(r)||t.push(`state: ${y(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=$c.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 xg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await xg.readFile($c.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(!I(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(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}}},Oc=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[Ag.jsonFilesValid(t),Ag.noSensitiveData(t)];for(let m of l){let g=await m;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(w=>w.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 w=n.checks.slice(n.checks.indexOf(m)+1);a+=w.filter(x=>x.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}}}},jg=new Oc});import{z as ai}from"zod";function Sb(){let s=et(Dg);if(!s)throw new Error(`Missing bundled crew checkpoints template: ${Dg}`);return s}var ci,Dg,kb,Nc,vb,Ig,$g=h(()=>{"use strict";Dn();ee();te();ci="crew:checkpoints",Dg="crew/CHECKPOINTS.md",kb=ai.object({content:ai.string(),source:ai.enum(["default","user","migrated"]),updated_at:ai.string().min(1)});c(Sb,"getBundledDefault");Nc=class{static{c(this,"CheckpointsStorage")}get(e){let t=T.getDoc(e,ci);return t===null?{content:Sb(),source:"default",updated_at:k()}:kb.parse(t)}hasCustomization(e){return T.hasDoc(e,ci)}set(e,t,n="user"){let r={content:t,source:n,updated_at:k()};return T.setDoc(e,ci,r),r}reset(e){T.deleteDoc(e,ci)}},vb=new Nc,Ig=vb});var Og={};re(Og,{TEAM_ENROLLMENT_KEY:()=>li,TeamEnrollmentSchema:()=>Mc,default:()=>di,serializeCanonical:()=>ui,teamEnrollmentStorage:()=>Ts});import{z as br}from"zod";function ui(s){let e=Object.keys(s).sort(),t={};for(let n of e)t[n]=s[n];return JSON.stringify(t)}var li,Mc,Lc,Ts,di,pi=h(()=>{"use strict";te();li="team:enrollment",Mc=br.object({required:br.boolean(),minVersion:br.string().min(1),enrolledAt:br.string().min(1),enrolledBy:br.string().nullable().default(null)}),Lc=class{static{c(this,"TeamEnrollmentStorage")}get(e){let t=T.getDoc(e,li);return t===null?null:Mc.parse(t)}set(e,t){let n=Mc.parse(t);T.setDoc(e,li,n)}clear(e){T.deleteDoc(e,li)}};c(ui,"serializeCanonical");Ts=new Lc,di=Ts});var Ng,Fc,Uc,Mg,Es,mi=h(()=>{"use strict";Ng="memory.",Fc="remember.",Uc=`${Ng}${Fc}`,Mg=`${Ng}task.tagged`,Es="status.changed"});var Wc={};re(Wc,{BASE_MEMORY_TYPES:()=>Lg,MEMORY_TYPES:()=>Cs,formatMemoryMd:()=>Ps,projectMemory:()=>Ne});function Fg(s,e){try{return JSON.parse(s)}catch{return e}}function Cb(s){let e=s.type.slice(Uc.length),t=Fg(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 Pb(s){let e=s.data?Fg(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 Rb(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 xb(s,e){for(let[t,n]of Object.entries(e))if(s.tags[t]!==n)return!1;return!0}function Ab(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 Ps(s){if(s.length===0)return"> No matching memory entries.";let e=new Map;for(let a of s){let l=e.get(a.type)??[];l.push(a),e.set(a.type,l)}let t=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],n=[],r={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},o=c((a,l)=>{if(l.length!==0){n.push(`### ${a.toUpperCase()}`);for(let u of l){let d=Object.entries(u.tags).map(([g,w])=>`${g}=${w}`).join(" "),p=d?` _(${d})_`:"",m=r[u.provenance];n.push(`- \`${m}\` [${u.id}] ${u.content}${p}`)}n.push("")}},"renderGroup"),i=new Set;for(let a of t){let l=e.get(a);!l||l.length===0||(o(a,l),i.add(a))}for(let[a,l]of e)i.has(a)||o(a,l);return n.join(`
699
+ `).trim()}var Lg,Cs,bb,Tb,Eb,Ne,gt=h(()=>{"use strict";Ln();te();mi();Lg=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],Cs=Lg,bb=25,Tb=4,Eb=100;c(Fg,"safeJson");c(Cb,"rowToEntry");c(Pb,"shippedRowToEntry");c(Rb,"matchesTopic");c(xb,"matchesTags");c(Ab,"dedupeLatestByKey");Ne={async remember(s,e){await Xe.log(s,`${Fc}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"});try{let{default:t}=await Promise.resolve().then(()=>(Ce(),ds)),r=(await t.readConfig(s))?.projectId;if(!r)return;let{publishCRUD:o}=await Promise.resolve().then(()=>(yr(),ep)),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??bb,n=Math.max(t*Tb,Eb),r=T.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${Uc}%`,n),o=T.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",n),i=[...r.map(Cb),...o.map(Pb)];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=>xb(a,e.tags??{}))),e.topic&&(i=i.filter(a=>Rb(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),e.dedupeByKey!==!1&&(i=Ab(i)),i.slice(0,t)},similar(s,e,t=10){let n=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return n.length===0?[]:Ne.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)}};c(Ps,"formatMemoryMd")});var Vg={};re(Vg,{legacyCrewSweep:()=>Ib});import Ug from"node:fs/promises";import Wg from"node:path";function jb(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)}
700
+ `}async function Hg(s){try{return(await Ug.stat(s)).mtimeMs}catch{return null}}async function Bg(s){try{return await Ug.readFile(s,"utf-8")}catch{return null}}function Gg(s,e){return T.getDoc(s,e)}function fi(s,e,t){T.setDoc(s,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function hi(s,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>(gt(),Wc));await n.remember(s,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){M.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function _b(s,e,t){let n=Wg.join(s,Tr),r=await Hg(n);if(r===null)return;let o=Gg(e,Hc);if(o===null){let i=await Bg(n);if(i===null){t.errors.push({file:Tr,reason:"read failed"});return}try{Ig.set(e,i,"migrated"),fi(e,Hc,r),t.checkpointsMigrated=!0,await hi(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:Tr,reason:a instanceof Error?a.message:String(a)})}return}r>o.mtime_ms&&(await hi(s,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${Tr}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),fi(e,Hc,r),t.checkpointsHandEditWarned=!0)}async function Db(s,e,t){let n=Wg.join(s,gi),r=await Hg(n);if(r===null)return;let o=Gg(e,Bc),i=di.get(e);if(o===null){let a=await Bg(n);if(a===null){t.errors.push({file:gi,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};di.set(e,u),await os(n,jb(u)),t.teamMigrated=!0,await hi(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"})}fi(e,Bc,r)}catch(l){t.errors.push({file:gi,reason:l instanceof Error?l.message:String(l)})}return}r>o.mtime_ms&&(await hi(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"}),fi(e,Bc,r),t.teamHandEditWarned=!0)}async function Ib(s,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await _b(s,e,t).catch(n=>{t.errors.push({file:Tr,reason:n instanceof Error?n.message:String(n)})}),await Db(s,e,t).catch(n=>{t.errors.push({file:gi,reason:n instanceof Error?n.message:String(n)})}),t}var Tr,gi,Hc,Bc,Jg=h(()=>{"use strict";$g();te();pi();J();Nt();Tr=".prjct/CHECKPOINTS.md",gi=".prjct/team.json",Hc="migration:v2.19.8:last-flagged-checkpoints",Bc="migration:v2.19.8:last-flagged-team";c(jb,"renderMirror");c(Hg,"statMtimeMs");c(Bg,"tryReadFile");c(Gg,"readFlag");c(fi,"writeFlag");c(hi,"captureInboxWarning");c(_b,"sweepCheckpoints");c(Db,"sweepTeamJson");c(Ib,"legacyCrewSweep")});import $b from"node:fs/promises";import qg from"node:path";function Gc(s,e){return Promise.race([s,new Promise((t,n)=>setTimeout(()=>n(new Error(`sync phase '${e}' timed out after ${Xg}ms`)),Xg))])}async function ft(s,e){let t=Date.now();M.debug("sync phase start",{phase:s});try{let n=await e();return M.debug("sync phase done",{phase:s,ms:Date.now()-t}),n}catch(n){throw M.debug("sync phase failed",{phase:s,ms:Date.now()-t,error:je(n)}),n}}var Xg,Vc,Rs,Jc=h(()=>{"use strict";So();qa();Do();an();Ye();Lt();Ce();De();Jo();pn();qo();gs();hc();Mn();vs();Ze();Lm();J();Nt();Lo();qm();Xm();ng();pg();kg();Rg();_g();Xg=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(Gc,"withTimeout");c(ft,"phase");Vc=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 W.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:Zo(),stats:ei(),commands:ti(),stack:ni(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=D.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await $b.rm(qg.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Rn()).installed){let R=await Vo({autoRepair:!0});R.verified||M.warn(`Codex p. router not ready: ${R.message||"verification failed"}`)}try{r=await ft("context7",()=>$n.ensureReady())}catch(R){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:Zo(),stats:ei(),commands:ti(),stack:ni(),context7:{installed:r.installed,verified:!1,message:je(R)},error:`Context7 MCP is required but not ready: ${je(R)}. Run 'prjct start' to repair.`}}await fg(this.globalPath),await ft("migrate",()=>Gc(Yo(this.projectId),"migrate")),await ft("sweep",async()=>{try{let R=await Qo(this.projectId);R>0&&M.info("Swept legacy JSON files into SQLite",{swept:R})}catch(R){M.debug("Legacy JSON sweep failed (non-critical)",{error:je(R)})}}),await ft("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:R}=await Promise.resolve().then(()=>(Jg(),Vg)),ue=await R(this.projectPath,this.projectId);(ue.checkpointsMigrated||ue.teamMigrated||ue.checkpointsHandEditWarned||ue.teamHandEditWarned||ue.errors.length>0)&&M.info("Legacy crew sweep ran",{checkpointsMigrated:ue.checkpointsMigrated,teamMigrated:ue.teamMigrated,checkpointsHandEditWarned:ue.checkpointsHandEditWarned,teamHandEditWarned:ue.teamHandEditWarned,errors:ue.errors.length})}catch(R){M.debug("Legacy crew sweep failed (non-critical)",{error:je(R)})}});let[a,l,u,d]=await ft("gather",()=>Gc(Promise.all([Tg(this.projectPath),Eg(this.projectPath),Cg(this.projectPath),Pg(this.projectPath)]),"gather")),{shouldRebuildIndexes:p,changedDomains:m,incrementalInfo:g}=await ft("incremental",()=>tg({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));p&&await ft("index",async()=>{try{await Gc(Promise.all([Od(this.projectPath,this.projectId),Gp(this.projectPath,this.projectId),Hp(this.projectPath,this.projectId)]),"index")}catch(R){M.debug("File ranking index build failed (non-critical)",{error:je(R)})}});let w,x=Date.now();M.debug("sync phase start",{phase:"skills"});try{let[R,ue,en,Cn,es,sr,ts,qr,ns,rr,ea]=await Promise.all([Promise.resolve(Qe.getActive(this.projectId)).catch(()=>null),Oe.getActive(this.projectId).catch(()=>null),Ft.getRecent(this.projectId,3).catch(()=>[]),Mm.getMetrics(this.projectId).catch(()=>null),Ve.getBacklog(this.projectId).catch(()=>[]),B.getTaskHistory(this.projectId).catch(()=>[]),B.getAllPausedTasks(this.projectId).catch(()=>[]),B.getAggregatedFeedback(this.projectId).catch(()=>null),B.getCurrentTask(this.projectId).catch(()=>null),Nn.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Ft.getCount(this.projectId).catch(()=>0)]),or={backlogCount:es.length,completedTaskCount:sr.length,pausedTaskCount:ts.length,hasActiveTask:!!ns},ir=R?R.patterns.map(Y=>({name:Y.name,description:Y.description,location:Y.locations?.[0]})):(ue?.patterns??[]).filter(Y=>Y.source!=="repo").map(Y=>({name:Y.name,description:Y.description,location:Y.location})),Xr=R?R.antiPatterns.map(Y=>({issue:Y.issue,file:Y.files?.[0]??"multiple",suggestion:Y.suggestion,severity:Y.severity??"medium"})):(ue?.antiPatterns??[]).filter(Y=>Y.source!=="repo").map(Y=>({issue:Y.issue,file:Y.file,suggestion:Y.suggestion,severity:Y.severity??"medium"})),ss=R?.commands?{install:R.commands.install??u.install,run:u.run,test:R.commands.test??u.test,build:R.commands.build??u.build,dev:R.commands.dev??u.dev,lint:R.commands.lint??u.lint,format:R.commands.format??u.format}:u,ar={version:l.version,fileCount:l.fileCount,patterns:ir,antiPatterns:Xr,recentShipped:en.map(Y=>({name:Y.name,type:Y.type??"feature",duration:Y.duration,filesChanged:Y.changes?.length})),velocity:Cn?{avgPoints:Cn.averageVelocity,trend:Cn.velocityTrend,accuracy:Cn.estimationAccuracy}:null,backlogCount:es.length,completedTaskCount:sr.length,pausedTaskCount:ts.length,knownGotchas:qr?.knownGotchas??[],userPatterns:qr?.patternsDiscovered??[],hasActiveTask:!!ns,activeTaskDescription:ns?.description??"",pausedTasks:ts.map(Y=>({description:Y.description,pausedAt:Y.pausedAt??""})),topBacklog:es.slice(0,3).map(Y=>({description:Y.description,priority:Y.priority??"medium"})),ideasCount:rr?.pending??0,shippedCount:ea};w=await Jm.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:ss,stack:d},or,ar)}catch(R){M.debug("Native skill generation failed (non-critical)",{error:je(R)})}M.debug("sync phase done",{phase:"skills",ms:Date.now()-x}),await ft("update-files",()=>Promise.all([hg({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:a,stats:l}),yg({projectId:this.projectId,projectPath:this.projectPath,stats:l,stack:d}),Promise.resolve(wg(this.projectId,a,l)),ug(this.projectId,this.projectPath,a,l,d,r.verified)]));let C=await Oe.getActive(this.projectId),v={patterns:C?.patterns?.length||0,antiPatterns:C?.antiPatterns?.length||0,criticalAntiPatterns:C?.antiPatterns?.filter(R=>R.severity==="high").length||0},j=Date.now()-n,E=await ft("metrics",()=>lg(this.projectId,l,j));await ft("archive",()=>dg(this.projectId)),await ft("install-global",async()=>{await Pe.installGlobalConfig(),await Pe.syncCommands()});let L;return await ft("verify",async()=>{try{let R=await W.readConfig(this.projectPath);L=await jg.verify(this.projectPath,this.globalPath,R?.verification)}catch(R){M.debug("Verification failed (non-critical)",{error:je(R)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:u,stack:d,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:v,syncMetrics:E,verification:L,incremental:g,generatedSkills:w}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:Zo(),stats:ei(),commands:ti(),stack:ni(),context7:{installed:r.installed,verified:r.verified,message:r.message},error:je(o)}}}async getCliVersion(){try{let e=qg.join(__dirname,"..","..","package.json");return(await Ae(e))?.version||"0.0.0"}catch(e){return M.debug("Failed to read CLI version",{error:je(e)}),"0.0.0"}}},Rs=new Vc});import Fn from"chalk";var zg,Ob,Nb,Tt,Kg=h(()=>{"use strict";Ye();zg=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Ob=80,Nb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:zg,speed:Ob},cli:{header:c(()=>`${Fn.cyan.bold("\u26A1")} ${Fn.cyan("prjct")}`,"header"),footer:c(()=>Fn.dim("\u26A1 prjct"),"footer"),spin:c((s,e)=>`${Fn.cyan("\u26A1")} ${Fn.cyan("prjct")} ${Fn.cyan(zg[s%10])} ${Fn.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")=>uo(s).commitFooter,"getCommitFooter"),getSignature:c((s="claude")=>uo(s).signature,"getSignature")},Tt=Nb});import ie from"chalk";function Fb(){return Mb[Lb]}var oO,qc,Mb,Lb,Un,xs,Xc,st,hn,Ub,Wb,f,ke=h(()=>{"use strict";Kg();Ho();oc();oO=Tt.spinner.frames,qc=Tt.spinner.speed,Mb={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}},Lb="compact";c(Fb,"getTierConfig");Un={success:ie.green("\u2713"),fail:ie.red("\u2717"),warn:ie.yellow("\u26A0"),info:ie.blue("\u2139"),debug:ie.dim("\u{1F527}"),bullet:ie.dim("\u2022"),arrow:ie.dim("\u2192"),check:ie.green("\u2713"),cross:ie.red("\u2717"),spinner:ie.cyan("\u25D0")},xs=null,Xc=0,st=!1,hn=c((s,e)=>{let t=e??(Fb().maxCharsPerLine||St.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate"),Ub=c(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(St.CLEAR_WIDTH)}\r`):!0,"clear"),Wb={start(){return st||console.log(Tt.cli.header()),this},end(){return st||console.log(Tt.cli.footer()),this},spin(s){return st?this:(this.stop(),process.stdout.isTTY?(xs=setInterval(()=>{process.stdout.write(`\r${Tt.cli.spin(Xc++,hn(s,St.SPINNER_MSG))}`)},qc),this):(process.stdout.write(`${Tt.cli.spin(0,hn(s,St.SPINNER_MSG))}
701
701
  `),this))},done(s,e){if(this.stop(),!st){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=ie.dim(` [${n.join(" | ")}]`))}console.log(`${Un.success} ${hn(s,St.DONE_MSG)}${t}`)}return this},fail(s){return this.stop(),console.error(`${Un.fail} ${hn(s,St.FAIL_MSG)}`),this},failWithHint(s){this.stop();let e=typeof s=="string"?rm(s):s;return console.error(),console.error(`${Un.fail} ${e.message}`),e.file&&console.error(ie.dim(` File: ${e.file}`)),e.hint&&console.error(ie.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ie.dim(` Docs: ${e.docs}`)),console.error(),this},warn(s){return this.stop(),st||console.log(`${Un.warn} ${hn(s,St.WARN_MSG)}`),this},info(s){return this.stop(),st||console.log(`${Un.info} ${s}`),this},debug(s){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!st&&e&&console.log(`${Un.debug} ${ie.dim(s)}`),this},success(s,e){return this.done(s,e)},list(s,e={}){if(this.stop(),st)return this;let t=e.bullet||Un.bullet,n=" ".repeat(e.indent||0);for(let r of s)console.log(`${n}${t} ${r}`);return this},table(s,e={}){if(this.stop(),st||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(ie.dim(r)),console.log(ie.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(),st)return this;let t=e.split(`
702
702
  `),n=Math.max(s.length,...t.map(o=>o.length)),r="\u2500".repeat(n+2);console.log(ie.dim(`\u250C${r}\u2510`)),console.log(`${ie.dim("\u2502")} ${ie.bold(s.padEnd(n))} ${ie.dim("\u2502")}`),console.log(ie.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${ie.dim("\u2502")} ${o.padEnd(n)} ${ie.dim("\u2502")}`);return console.log(ie.dim(`\u2514${r}\u2518`)),this},section(s){return this.stop(),st?this:(console.log(`
703
703
  ${ie.bold(s)}`),console.log(ie.dim("\u2500".repeat(s.length))),this)},stop(){return xs&&(clearInterval(xs),xs=null,Ub()),this},step(s,e,t){if(st)return this;this.stop();let n=ie.dim(`[${s}/${e}]`);return process.stdout.isTTY?(xs=setInterval(()=>{process.stdout.write(`\r${Tt.cli.spin(Xc++,`${n} ${hn(t,St.STEP_MSG)}`)}`)},qc),this):(process.stdout.write(`${Tt.cli.spin(0,`${n} ${hn(t,St.STEP_MSG)}`)}
@@ -737,8 +737,8 @@ that travel with this project:
737
737
  When in doubt: capture is always safe; ship is never silent.`,qb=`${of}
738
738
  ${Jb}
739
739
  ${af}
740
- `;c(cf,"writeProjectClaudeMd")});var Qc,Je,Rr=h(()=>{"use strict";yr();te();Qc=class{static{c(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();E.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
741
- 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 Ot({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&&Ot({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),Ot({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}}},Je=new Qc});function Zc(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 el,Z,qt=h(()=>{"use strict";yr();Rr();te();c(Zc,"rowToRule");el=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)
740
+ `;c(cf,"writeProjectClaudeMd")});var Qc,Je,Rr=h(()=>{"use strict";yr();te();Qc=class{static{c(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();T.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
741
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let r=T.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return Ot({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=T.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 T.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),T.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a);let l=this.getWorkflow(e,t);return l&&Ot({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 T.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),Ot({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}}},Je=new Qc});function Zc(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 el,Z,qt=h(()=>{"use strict";yr();Rr();te();c(Zc,"rowToRule");el=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)
742
742
  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&&Ot({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),Ot({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?Zc(n):null}getRulesForCommand(e,t){let n=Je.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(Zc)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Zc)}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}},Z=new el});import He from"node:path";async function Xb(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 b(He.join(s,"pnpm-lock.yaml"))?"pnpm":await b(He.join(s,"yarn.lock"))?"yarn":await b(He.join(s,"bun.lockb"))||await b(He.join(s,"bun.lock"))?"bun":(await b(He.join(s,"package-lock.json")),"npm")}function uf(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function zb(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function js(s,e){for(let r of Kb)if(await b(He.join(s,r)))return r;let n=(e??await rn(s)).find(r=>r.endsWith(Yb));if(n)return n}async function Xt(s){for(let e of Qb)if(await b(He.join(s,e)))return e}async function wi(s){let e=He.join(s,"package.json"),t=await Ae(e,null);if(t){let a=await Xb(s,t),l=t.scripts||{},u={stack:"js",packageManager:a};return l.lint&&(u.lint={tool:a,command:uf(a,"lint")}),l.typecheck&&(u.typecheck={tool:a,command:uf(a,"typecheck")}),l.test&&(u.test={tool:a,command:zb(a)}),u.versionFile=await js(s),u.changelogFile=await Xt(s),u}if(await b(He.join(s,"pytest.ini"))){let a=await js(s),l=await Xt(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}let n=await lt(He.join(s,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await js(s),l=await Xt(s);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}if(await b(He.join(s,"Cargo.toml"))){let a=await Xt(s);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await b(He.join(s,"go.mod"))){let a=await js(s),l=await Xt(s);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:l}}let r=await rn(s);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await js(s,r),l=await Xt(s);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:l}}if(await b(He.join(s,"pom.xml"))){let a=await Xt(s);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await b(He.join(s,"gradlew"))&&(await b(He.join(s,"build.gradle"))||await b(He.join(s,"build.gradle.kts")))){let a=await Xt(s);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await js(s),i=await Xt(s);return{stack:"unknown",versionFile:o,changelogFile:i}}var Kb,Yb,Qb,tl=h(()=>{"use strict";J();c(Xb,"detectPackageManager");c(uf,"pmRun");c(zb,"pmTest");Kb=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Yb=".csproj",Qb=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];c(js,"detectVersionFile");c(Xt,"detectChangelogFile");c(wi,"detectProjectCommands")});import ki from"node:fs/promises";import nl from"node:os";import wn from"node:path";async function rl(s){try{let e=await ki.readdir(s);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=wn.join(s,"package.json"),n=JSON.parse(await ki.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 ol(s){let e=[];await sn(wn.join(nl.homedir(),".claude"))&&e.push("claude"),await b(wn.join(s,".cursorrules"))&&e.push("cursor"),await b(wn.join(s,".windsurfrules"))&&e.push("windsurf"),await b(wn.join(s,".github","copilot-instructions.md"))&&e.push("copilot"),await sn(wn.join(nl.homedir(),".gemini"))&&e.push("gemini");try{let{execAsync:t}=await Promise.resolve().then(()=>(Ue(),na));await t("which codex"),e.push("codex")}catch{await sn(wn.join(nl.homedir(),".codex"))&&e.push("codex")}return e.length>0?e:["claude"]}async function il(s){let e={language:"Unknown",technologies:[]};try{let t=await ki.readdir(s);if(t.includes("package.json")){let n=wn.join(s,"package.json"),r=JSON.parse(await ki.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 xr,sl,df=h(()=>{"use strict";J();xr=[{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."}],sl=[{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(rl,"detectProjectType");c(ol,"detectInstalledAgents");c(il,"detectStack")});import*as ae from"@clack/prompts";import Wn from"chalk";var Ar,pf=h(()=>{"use strict";ke();df();Ar=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(){ae.intro(Wn.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 ae.outro(Wn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await rl(this.projectPath),this.confirmedType=this.detectedType;let e=await ol(this.projectPath);return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await il(this.projectPath),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await rl(this.projectPath);let e=xr.findIndex(n=>n.value===this.detectedType),t=await ae.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:xr.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?xr[e].value:void 0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await ol(this.projectPath),t=await ae.multiselect({message:"Which AI agents do you use?",options:sl.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await il(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);ae.note(e,"Detected stack");let t=await ae.confirm({message:"Is this stack correct?",initialValue:!0});if(ae.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ae.group({language:c(()=>ae.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:c(()=>ae.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 ae.group({verbosity:c(()=>ae.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(()=>ae.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=[`${Wn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Wn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Wn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Wn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Wn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
743
743
  `);ae.note(e,"Configuration Summary");let t=await ae.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ae.isCancel(t)||!t?(ae.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,ae.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return xr.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return sl.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 Zb from"node:https";import mf from"node:os";import jr from"node:path";import kn from"chalk";function tT(s,e){let t=`Update available! ${s} \u2192 ${e}`,n="npm install -g prjct-cli@latest",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["",kn.yellow(o),kn.yellow(a("")),kn.yellow(`\u2502 ${kn.bold(t)}${" ".repeat(r-t.length-2)}\u2502`),kn.yellow(`\u2502 Run: ${kn.cyan(n)}${" ".repeat(r-n.length-7)}\u2502`),kn.yellow(a("")),kn.yellow(i),""].join(`
744
744
  `)}var al,Si,eT,tN,nN,cl=h(()=>{"use strict";F();J();pt();al=class{static{c(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=jr.join(mf.homedir(),".prjct-cli","config"),this.cacheFile=jr.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=jr.join(__dirname,"..","..","package.json");return(await Ae(e))?.version??null}catch(e){return console.error("Error reading package version:",y(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=Zb.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 b(this.cacheFile))return await Ae(this.cacheFile)}catch{}return null}async writeCache(e){try{await pe(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:tT(e.currentVersion,e.latestVersion)}},Si=al,eT=jr.join(mf.homedir(),".prjct-cli","config"),tN=jr.join(eT,"update-cache.json"),nN=24*60*60*1e3;c(tT,"formatUpdateBanner")});import gf from"node:path";async function rT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await b(gf.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await b(gf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function oT(){return{...nT}}function iT(){return{...sT}}async function ff(){return vi||(vi=await rT()?oT():iT(),vi)}var vi,nT,sT,hf=h(()=>{"use strict";J();vi=null,nT={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}},sT={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(rT,"isClaudeEnvironment");c(oT,"getClaudeAgent");c(iT,"getTerminalAgent");c(ff,"detect")});import bi from"node:fs/promises";var ll,yf,wf=h(()=>{"use strict";F();J();ll=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: ${y(t)}`)}return await bi.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: ${y(n)}`)}await bi.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: ${y(t)}`)}return await bi.readdir(e)}async fileExists(e){return b(e)}async createDirectory(e){await bi.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
@@ -809,18 +809,18 @@ ${e}`}formatKeepAChangelogEntry(e,t){let n=[`## [${e.version}] - ${t}`];if(n.pus
809
809
  `);break}}async writeJsonVersion(e,t){let n=await Ae(e,{});n&&(n.version=t,await pe(e,n))}async writeTomlVersion(e,t){let n=await lt(e,"");if(!n)return;let r=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await nn(e,r)}async writeXmlVersion(e,t){let n=await lt(e,"");if(!n)return;let r=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await nn(e,r)}};c(bl,"isSemver");c(_s,"bumpPatch");c(jf,"parseTomlVersion");c(_f,"parsePyprojectVersion");c(Df,"parseCsprojVersion")});async function Ri(s){try{let{stdout:e}=await N("git branch --show-current",{cwd:s});return e.trim()||void 0}catch{return}}var Tl=h(()=>{"use strict";Ue();c(Ri,"getGitBranch")});function fT(s){let e=s.split(/\s+/).map(n=>n.trim()).filter(Boolean),t=[];for(let n of e){let r=n.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(r){t.push({kind:"tags",key:r[1],op:r[2],value:r[3]});continue}let o=n.match(/^branch([=~])(.+)$/);if(o){t.push({kind:"branch",op:o[1],value:o[2]});continue}let i=n.match(/^files:(.+)$/);i&&t.push({kind:"files",op:"~",value:i[1]})}return t}function hT(s){let e=$f.get(s);if(e)return e;let t="";for(let r=0;r<s.length;r++){let o=s[r];o==="*"?s[r+1]==="*"?(t+=".*",r++):t+="[^/]*":/[.+^${}()|[\]\\]/.test(o)?t+=`\\${o}`:t+=o}let n=new RegExp(`^${t}$`);return $f.set(s,n),n}function yT(s,e){if(s.kind==="tags"){let t=e.tags[s.key??""]??"";return s.op==="="?t===s.value:t.toLowerCase().includes(s.value.toLowerCase())}if(s.kind==="branch")return s.op==="="?e.branch===s.value:e.branch.toLowerCase().includes(s.value.toLowerCase());if(s.kind==="files"){let t=hT(s.value);return e.filesChanged.some(n=>t.test(n))}return!0}function Of(s,e){if(!s||!s.trim())return!0;let t=fT(s);return t.length===0?!0:t.every(n=>yT(n,e))}var $f,Nf=h(()=>{"use strict";c(fT,"parseWhen");$f=new Map;c(hT,"globToRegex");c(yT,"matchCondition");c(Of,"evaluateWhen")});import{execSync as wT}from"node:child_process";import kT from"node:fs/promises";import El from"node:path";import ot from"chalk";async function TT(s,e,t){let n=await B.getCurrentTask(s);if(!n)throw new Error(`Cannot transition to '${t}': no active task`);await Xe.log(e,Es,{taskId:n.id,from:n.type??null,to:t,source:"workflow"})}async function ET(s,e){if(s.trustSource==="imported")throw new Error(`Refusing to run imported rule without approval: ${s.description||s.action}. Re-create the rule locally if you trust it.`);await N(s.action,{timeout:s.timeoutMs,cwd:e,env:{...process.env}})}async function CT(s,e,t){if(s.trustSource==="imported")throw new Error(`Refusing to run imported script rule without approval: ${s.description||s.action}.`);let n=s.action.slice(Ff.length).trim();if(!n)throw new Error(`Empty script path in action '${s.action}'`);let r=El.resolve(e,".prjct/workflows",n),o=El.resolve(e,".prjct/workflows");if(!r.startsWith(`${o}${El.sep}`)&&r!==o)throw new Error(`Script path escapes workflows dir: ${n}`);try{await kT.access(r)}catch{throw new Error(`Script not found: .prjct/workflows/${n}`)}await N(`bash ${JSON.stringify(r)}`,{timeout:s.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:t.branch,PRJCT_FILES_CHANGED:t.filesChanged.join(","),PRJCT_TAGS:Object.entries(t.tags).map(([i,a])=>`${i}=${a}`).join(",")}})}function PT(s){let e=s.action.slice(Uf.length).trim(),t=e.indexOf(":");if(t===-1)return`Call MCP tool ${JSON.stringify(e)} (server unspecified \u2014 re-author rule with format \`mcp:<server>:<tool>[:<args>]\`).`;let n=e.slice(0,t),r=e.slice(t+1),o=r.indexOf(":"),i=o===-1?r:r.slice(0,o),a=o===-1?"":r.slice(o+1),l=s.description?` (${s.description})`:"";return a?`Call MCP \`${n}.${i}\` with args ${a}${l}.`:`Call MCP \`${n}.${i}\`${l}.`}async function RT(s){try{let{default:e}=await Promise.resolve().then(()=>(Ce(),ds)),n=(await e.readConfig(s))?.persona;if(!n)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let r=[`You are **${n.role}** in this project.`];return n.focus&&r.push(`Focus: ${n.focus}.`),n.mcps&&n.mcps.length>0&&r.push(`MCPs available: ${n.mcps.join(", ")}.`),n.packs&&n.packs.length>0&&r.push(`Active packs: ${n.packs.join(", ")}.`),r.join(" ")}catch(e){return`Could not resolve persona: ${y(e)}`}}async function xT(s,e){let n=await new Pi(s).bump();e.version=n}async function AT(s,e){let t=typeof e.version=="string"?e.version:null,n=typeof e.feature=="string"?e.feature:null;if(!t)throw new Error("changelog:add requires a prior version:bump step (no version in runContext)");if(!n)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new Ci(s).addFeature(t,n)}function jT(s,e){return s.replace(/\$([A-Z_]+)/g,(t,n)=>{let r=n.toLowerCase(),o=e[r];return typeof o=="string"?o:""})}async function _T(s,e,t){let r=s.slice(Pl.length).replace(/^:/,"").trim()||(t.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),o=`${jT(r,t)}
810
810
 
811
811
  Generated with [p/](https://www.prjct.app/)`;await xt("git",["add","."],{cwd:e}),await xt("git",["commit","-m",o],{cwd:e})}async function DT(s){await xt("git",["push"],{cwd:s})}async function Cl(s,e,t,n,r,o){let i=s.action;if(i.startsWith(Mf)){let a=i.slice(Mf.length).trim();if(!a)throw new Error(`Empty status target in action '${i}'`);await TT(e,t,a);return}if(i.startsWith(Ff)){await CT(s,t,n);return}if(i.startsWith(Uf)){r.instructions.push(PT(s));return}if(i===ST){r.instructions.push(await RT(t));return}if(i===Lf||i.startsWith(`${Lf}:`)){await xT(t,o);return}if(i===vT){await AT(t,o);return}if(i===Pl||i.startsWith(`${Pl}:`)){await _T(i,t,o);return}if(i===bT){await DT(t);return}await ET(s,t)}async function IT(s,e){let[t,n,r]=await Promise.all([$T(e),OT(e),NT(s)]);return{branch:t,filesChanged:n,tags:r}}async function $T(s){try{return await Ri(s)||""}catch{return""}}async function OT(s){let e={cwd:s,encoding:"utf-8"},t=c(async o=>{try{return wT(o,e).split(`
812
- `).map(i=>i.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[n,r]=await Promise.all([t("git diff --cached --name-only"),t("git diff --name-only")]);return[...new Set([...n,...r])]}async function NT(s){try{let e=await B.getCurrentTask(s),t={};if(e?.type&&(t.type=e.type),!e)return t;let n=E.get(s,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 1",Mg);if(n)try{let r=JSON.parse(n.data);if(r.taskId===e.id&&r.tags)return{...t,...r.tags}}catch{}return t}catch{return{}}}async function vn(s,e,t,n={}){let r={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(n.skipRules)return r;let o=n.runContext??{},a=Z.getRulesForCommand(s,e).filter(T=>T.position===t),l=n.projectPath||process.cwd(),d=a.some(T=>T.whenExpr||T.type==="gate")?await IT(s,l):{branch:"",filesChanged:[],tags:{}},p=a.filter(T=>Of(T.whenExpr,d)),m=p.filter(T=>T.type==="gate");for(let T of m){let L=T.description||T.action;console.log(`
813
- ${ot.dim(`[gate] ${t}-${e}: ${T.action}`)}`);try{let R=Date.now();await Cl(T,s,l,d,r,o);let ue=Date.now()-R,en=ue>1e3?`${(ue/1e3).toFixed(1)}s`:`${ue}ms`;console.log(`${ot.green("\u2713")} ${ot.dim(`gate passed (${en})`)}`)}catch(R){return console.log(`${ot.red("\u2717")} gate failed: ${L}`),r.gatesFailed.push(L),r.success=!1,r.output+=`Gate failed: ${L}
812
+ `).map(i=>i.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[n,r]=await Promise.all([t("git diff --cached --name-only"),t("git diff --name-only")]);return[...new Set([...n,...r])]}async function NT(s){try{let e=await B.getCurrentTask(s),t={};if(e?.type&&(t.type=e.type),!e)return t;let n=T.get(s,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 1",Mg);if(n)try{let r=JSON.parse(n.data);if(r.taskId===e.id&&r.tags)return{...t,...r.tags}}catch{}return t}catch{return{}}}async function vn(s,e,t,n={}){let r={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(n.skipRules)return r;let o=n.runContext??{},a=Z.getRulesForCommand(s,e).filter(E=>E.position===t),l=n.projectPath||process.cwd(),d=a.some(E=>E.whenExpr||E.type==="gate")?await IT(s,l):{branch:"",filesChanged:[],tags:{}},p=a.filter(E=>Of(E.whenExpr,d)),m=p.filter(E=>E.type==="gate");for(let E of m){let L=E.description||E.action;console.log(`
813
+ ${ot.dim(`[gate] ${t}-${e}: ${E.action}`)}`);try{let R=Date.now();await Cl(E,s,l,d,r,o);let ue=Date.now()-R,en=ue>1e3?`${(ue/1e3).toFixed(1)}s`:`${ue}ms`;console.log(`${ot.green("\u2713")} ${ot.dim(`gate passed (${en})`)}`)}catch(R){return console.log(`${ot.red("\u2717")} gate failed: ${L}`),r.gatesFailed.push(L),r.success=!1,r.output+=`Gate failed: ${L}
814
814
  ${y(R)}
815
- `,r}}let g=p.filter(T=>T.type==="instruction");for(let T of g){let L=T.description||T.action;console.log(`
816
- ${ot.dim(`[instruction] ${t}-${e}: ${L}`)}`),r.instructions.push(T.action)}let w=p.filter(T=>T.type==="hook"),x=w.filter(T=>T.parallel===!1),C=w.filter(T=>T.parallel!==!1),v=c(async T=>{console.log(`
817
- ${ot.dim(`[hook] ${t}-${e}: ${T.action}`)}`);try{let L=Date.now();await Cl(T,s,l,d,r,o);let R=Date.now()-L,ue=R>1e3?`${(R/1e3).toFixed(1)}s`:`${R}ms`;console.log(`${ot.green("\u2713")} ${ot.dim(`(${ue})`)}`)}catch(L){console.log(`${ot.yellow("\u26A0")} hook failed (non-blocking): ${T.action}`),r.hooksFailed.push(T.description||T.action),r.output+=`Hook failed: ${T.action}
815
+ `,r}}let g=p.filter(E=>E.type==="instruction");for(let E of g){let L=E.description||E.action;console.log(`
816
+ ${ot.dim(`[instruction] ${t}-${e}: ${L}`)}`),r.instructions.push(E.action)}let w=p.filter(E=>E.type==="hook"),x=w.filter(E=>E.parallel===!1),C=w.filter(E=>E.parallel!==!1),v=c(async E=>{console.log(`
817
+ ${ot.dim(`[hook] ${t}-${e}: ${E.action}`)}`);try{let L=Date.now();await Cl(E,s,l,d,r,o);let R=Date.now()-L,ue=R>1e3?`${(R/1e3).toFixed(1)}s`:`${R}ms`;console.log(`${ot.green("\u2713")} ${ot.dim(`(${ue})`)}`)}catch(L){console.log(`${ot.yellow("\u26A0")} hook failed (non-blocking): ${E.action}`),r.hooksFailed.push(E.description||E.action),r.output+=`Hook failed: ${E.action}
818
818
  ${y(L)}
819
- `}},"runHook");for(let T of x)await v(T);C.length>0&&await Promise.all(C.map(v));let j=p.filter(T=>T.type==="step");for(let T of j){console.log(`
820
- ${ot.dim(`[step] ${e}: ${T.action}`)}`);try{let L=Date.now();await Cl(T,s,l,d,r,o);let R=Date.now()-L,ue=R>1e3?`${(R/1e3).toFixed(1)}s`:`${R}ms`;console.log(`${ot.green("\u2713")} ${ot.dim(`step passed (${ue})`)}`),r.stepsRun.push(T.description||T.action)}catch(L){return console.log(`${ot.red("\u2717")} step failed: ${T.action}`),r.gatesFailed.push(T.description||T.action),r.success=!1,r.output+=`Step failed: ${T.action}
819
+ `}},"runHook");for(let E of x)await v(E);C.length>0&&await Promise.all(C.map(v));let j=p.filter(E=>E.type==="step");for(let E of j){console.log(`
820
+ ${ot.dim(`[step] ${e}: ${E.action}`)}`);try{let L=Date.now();await Cl(E,s,l,d,r,o);let R=Date.now()-L,ue=R>1e3?`${(R/1e3).toFixed(1)}s`:`${R}ms`;console.log(`${ot.green("\u2713")} ${ot.dim(`step passed (${ue})`)}`),r.stepsRun.push(E.description||E.action)}catch(L){return console.log(`${ot.red("\u2717")} step failed: ${E.action}`),r.gatesFailed.push(E.description||E.action),r.success=!1,r.output+=`Step failed: ${E.action}
821
821
  ${y(L)}
822
- `,r}}return r}var Mf,Ff,Uf,ST,Lf,vT,Pl,bT,Rl=h(()=>{"use strict";mi();Af();Ln();If();Tl();te();Ze();qt();F();Ue();Nf();Mf="status:",Ff="script:",Uf="mcp:",ST="persona:context",Lf="version:bump",vT="changelog:add",Pl="git:commit",bT="git:push";c(TT,"runStatusTransition");c(ET,"runShellAction");c(CT,"runScriptAction");c(PT,"buildMcpInstruction");c(RT,"buildPersonaInstruction");c(xT,"runVersionBump");c(AT,"runChangelogAdd");c(jT,"expandTemplate");c(_T,"runGitCommit");c(DT,"runGitPush");c(Cl,"runRuleAction");c(IT,"buildWhenContext");c($T,"resolveBranch");c(OT,"resolveChangedFiles");c(NT,"resolveActiveTags");c(vn,"executeWorkflowRules")});import{z as ge}from"zod";var bn,Gn,xl,MT,Kt,_r=h(()=>{"use strict";bn=["draft","reviewed","in_progress","shipped","archived"],Gn=["strategic","architecture","design"],xl=ge.object({verdict:ge.enum(["pass","fail"]),notes:ge.string(),ts:ge.string()}),MT=ge.object({risk:ge.string().min(1),mitigation:ge.string().min(1)}),Kt=ge.object({goal:ge.string().min(1),eli10:ge.string().default(""),stakes:ge.string().default(""),acceptance_criteria:ge.array(ge.string().min(1)).default([]),scope:ge.array(ge.string()).default([]),out_of_scope:ge.array(ge.string()).default([]),risks:ge.array(MT).default([]),test_plan:ge.array(ge.string()).default([]),reviews:ge.object({strategic:xl.optional(),architecture:xl.optional(),design:xl.optional()}).optional(),linked_tasks:ge.array(ge.string()).default([]),notes:ge.string().default(""),tasks_created_at:ge.string().nullable().default(null)})});var Wf={};re(Wf,{specStorage:()=>Se});var Al,Se,Dr=h(()=>{"use strict";Bt();_r();ee();te();Al=class{static{c(this,"SpecStorage")}create(e,t){let n=Ie(),r=k(),o=Kt.parse(t.content);return E.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
823
- VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,r,r),{id:n,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:r,updatedAt:r,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(e,t){let n=E.get(e,"SELECT * FROM specs WHERE id = ?",t);return n?this.rowToSpec(n):null}list(e,t={}){let n="SELECT * FROM specs WHERE 1=1",r=[];return t.status&&(n+=" AND status = ?",r.push(t.status)),!t.includeArchived&&!t.status&&(n+=" AND status != 'archived'"),n+=" ORDER BY created_at DESC",E.query(e,n,...r).map(i=>this.rowToSpec(i))}search(e,t){let n=`%${t}%`;return E.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(o=>this.rowToSpec(o))}updateContent(e,t,n){let r=Kt.parse(n),o=k();return E.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(r),o,t),this.get(e,t)}casUpdate(e,t,n,r){let o=Kt.parse(n),i=k();return E.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(o),i,t,r).changes===1}setStatus(e,t,n){if(!bn.includes(n))throw new Error(`invalid spec status: ${n}`);let r=k(),o=[],i=[n,r];n==="shipped"&&(o.push("shipped_at = ?"),i.push(r)),n==="archived"&&(o.push("archived_at = ?"),i.push(r));let a=["status = ?","updated_at = ?",...o].join(", ");return i.push(t),E.run(e,`UPDATE specs SET ${a} WHERE id = ?`,...i),this.get(e,t)}setShippedPr(e,t,n){return E.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,k(),t),this.get(e,t)}setShippedSha(e,t,n){return E.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,k(),t),this.get(e,t)}linkTask(e,t,n){let r=this.get(e,t);if(!r)return null;if(r.content.linked_tasks.includes(n))return r;let o={...r.content,linked_tasks:[...r.content.linked_tasks,n]};return this.updateContent(e,t,o)}delete(e,t){return this.get(e,t)?(E.run(e,"DELETE FROM specs WHERE id = ?",t),!0):!1}count(e){let t=E.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),n={total:0,draft:0,shipped:0};for(let r of t)n.total+=r.n,r.status==="draft"&&(n.draft=r.n),r.status==="shipped"&&(n.shipped=r.n);return n}rowToSpec(e){return{id:e.id,title:e.title,status:bn.includes(e.status)?e.status:"draft",content:Kt.parse(JSON.parse(e.content)),tags:e.tags?JSON.parse(e.tags):{},createdAt:e.created_at,updatedAt:e.updated_at,shippedAt:e.shipped_at,shippedPr:e.shipped_pr,shippedSha:e.shipped_sha,archivedAt:e.archived_at}}},Se=new Al});var Hf,Bf,Gf,Vf,Jf=h(()=>{"use strict";Hf={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},Bf=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Gf=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]),Vf=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"])});import LT from"node:fs/promises";import xi from"node:path";async function qf(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=FT(s),l=await UT(e),u=await WT(e),d=[];for(let m of l){if(!i&&BT(m))continue;let g=HT(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,r);return{files:p,metrics:{filesScanned:l.length,filesReturned:p.length,scanDuration:Date.now()-n}}}function FT(s){return s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(t=>!Vf.has(t)&&t.length>2)}async function UT(s){let e=[];async function t(n,r=""){try{let o=await LT.readdir(n,{withFileTypes:!0});for(let i of o){let a=xi.join(n,i.name),l=xi.join(r,i.name);if(i.isDirectory()){if(Gf.has(i.name)||i.name.startsWith("."))continue;await t(a,l)}else if(i.isFile()){let u=xi.extname(i.name).toLowerCase();Bf.has(u)&&e.push(l)}}}catch(o){I(o)}}return c(t,"walk"),await t(s),e}async function WT(s){let e=new Map;try{let{stdout:t}=await N(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
822
+ `,r}}return r}var Mf,Ff,Uf,ST,Lf,vT,Pl,bT,Rl=h(()=>{"use strict";mi();Af();Ln();If();Tl();te();Ze();qt();F();Ue();Nf();Mf="status:",Ff="script:",Uf="mcp:",ST="persona:context",Lf="version:bump",vT="changelog:add",Pl="git:commit",bT="git:push";c(TT,"runStatusTransition");c(ET,"runShellAction");c(CT,"runScriptAction");c(PT,"buildMcpInstruction");c(RT,"buildPersonaInstruction");c(xT,"runVersionBump");c(AT,"runChangelogAdd");c(jT,"expandTemplate");c(_T,"runGitCommit");c(DT,"runGitPush");c(Cl,"runRuleAction");c(IT,"buildWhenContext");c($T,"resolveBranch");c(OT,"resolveChangedFiles");c(NT,"resolveActiveTags");c(vn,"executeWorkflowRules")});import{z as ge}from"zod";var bn,Gn,xl,MT,Kt,_r=h(()=>{"use strict";bn=["draft","reviewed","in_progress","shipped","archived"],Gn=["strategic","architecture","design"],xl=ge.object({verdict:ge.enum(["pass","fail"]),notes:ge.string(),ts:ge.string()}),MT=ge.object({risk:ge.string().min(1),mitigation:ge.string().min(1)}),Kt=ge.object({goal:ge.string().min(1),eli10:ge.string().default(""),stakes:ge.string().default(""),acceptance_criteria:ge.array(ge.string().min(1)).default([]),scope:ge.array(ge.string()).default([]),out_of_scope:ge.array(ge.string()).default([]),risks:ge.array(MT).default([]),test_plan:ge.array(ge.string()).default([]),reviews:ge.object({strategic:xl.optional(),architecture:xl.optional(),design:xl.optional()}).optional(),linked_tasks:ge.array(ge.string()).default([]),notes:ge.string().default(""),tasks_created_at:ge.string().nullable().default(null)})});var Wf={};re(Wf,{specStorage:()=>Se});var Al,Se,Dr=h(()=>{"use strict";Bt();_r();ee();te();Al=class{static{c(this,"SpecStorage")}nextUpdatedAt(e,t){let n=k(),o=T.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!o||n>o?n:new Date(new Date(o).getTime()+1).toISOString()}create(e,t){let n=Ie(),r=k(),o=Kt.parse(t.content);return T.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
823
+ VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,r,r),{id:n,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:r,updatedAt:r,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(e,t){let n=T.get(e,"SELECT * FROM specs WHERE id = ?",t);return n?this.rowToSpec(n):null}list(e,t={}){let n="SELECT * FROM specs WHERE 1=1",r=[];return t.status&&(n+=" AND status = ?",r.push(t.status)),!t.includeArchived&&!t.status&&(n+=" AND status != 'archived'"),n+=" ORDER BY created_at DESC",T.query(e,n,...r).map(i=>this.rowToSpec(i))}search(e,t){let n=`%${t}%`;return T.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(o=>this.rowToSpec(o))}updateContent(e,t,n){let r=Kt.parse(n),o=this.nextUpdatedAt(e,t);return T.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(r),o,t),this.get(e,t)}casUpdate(e,t,n,r){let o=Kt.parse(n),i=this.nextUpdatedAt(e,t);return T.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(o),i,t,r).changes===1}setStatus(e,t,n){if(!bn.includes(n))throw new Error(`invalid spec status: ${n}`);let r=this.nextUpdatedAt(e,t),o=[],i=[n,r];n==="shipped"&&(o.push("shipped_at = ?"),i.push(r)),n==="archived"&&(o.push("archived_at = ?"),i.push(r));let a=["status = ?","updated_at = ?",...o].join(", ");return i.push(t),T.run(e,`UPDATE specs SET ${a} WHERE id = ?`,...i),this.get(e,t)}setShippedPr(e,t,n){return T.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}setShippedSha(e,t,n){return T.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}linkTask(e,t,n){let r=this.get(e,t);if(!r)return null;if(r.content.linked_tasks.includes(n))return r;let o={...r.content,linked_tasks:[...r.content.linked_tasks,n]};return this.updateContent(e,t,o)}delete(e,t){return this.get(e,t)?(T.run(e,"DELETE FROM specs WHERE id = ?",t),!0):!1}count(e){let t=T.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),n={total:0,draft:0,shipped:0};for(let r of t)n.total+=r.n,r.status==="draft"&&(n.draft=r.n),r.status==="shipped"&&(n.shipped=r.n);return n}rowToSpec(e){return{id:e.id,title:e.title,status:bn.includes(e.status)?e.status:"draft",content:Kt.parse(JSON.parse(e.content)),tags:e.tags?JSON.parse(e.tags):{},createdAt:e.created_at,updatedAt:e.updated_at,shippedAt:e.shipped_at,shippedPr:e.shipped_pr,shippedSha:e.shipped_sha,archivedAt:e.archived_at}}},Se=new Al});var Hf,Bf,Gf,Vf,Jf=h(()=>{"use strict";Hf={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},Bf=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Gf=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]),Vf=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"])});import LT from"node:fs/promises";import xi from"node:path";async function qf(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=FT(s),l=await UT(e),u=await WT(e),d=[];for(let m of l){if(!i&&BT(m))continue;let g=HT(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,r);return{files:p,metrics:{filesScanned:l.length,filesReturned:p.length,scanDuration:Date.now()-n}}}function FT(s){return s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(t=>!Vf.has(t)&&t.length>2)}async function UT(s){let e=[];async function t(n,r=""){try{let o=await LT.readdir(n,{withFileTypes:!0});for(let i of o){let a=xi.join(n,i.name),l=xi.join(r,i.name);if(i.isDirectory()){if(Gf.has(i.name)||i.name.startsWith("."))continue;await t(a,l)}else if(i.isFile()){let u=xi.extname(i.name).toLowerCase();Bf.has(u)&&e.push(l)}}}catch(o){I(o)}}return c(t,"walk"),await t(s),e}async function WT(s){let e=new Map;try{let{stdout:t}=await N(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
824
824
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
825
825
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
826
826
  END { for (f in files) print files[f], lastmod[f], f }
@@ -918,7 +918,7 @@ ${Cs.map(s=>`- \`${s}\``).join(`
918
918
  - Secret-like content (API keys, JWTs) is refused unless you pass
919
919
  \`--force\` to \`prjct context wiki sync\`.
920
920
  - Files already in \`_ingested/\` are ignored.
921
- `;c(_h,"ensureWorkflowsReadme");IE='# Workflows (Obsidian dropzone)\n\nDrop a markdown file here to OVERRIDE a workflow\'s rules in SQLite. Format:\n\n```markdown\n---\nname: ship\n---\n\n## Gates\n- `git branch --show-current | grep -vE "^(main|master)$"` \u2014 Prevent shipping from main branch\n\n## Steps\n- `version:bump` \u2014 Bump version (stack-aware)\n- `changelog:add` \u2014 Append CHANGELOG entry\n- `git:commit` \u2014 Commit ship\n- `git:push` \u2014 Push to origin\n```\n\n## How it works\n\n1. You drop `workflows/<name>.md` here.\n2. Stop hook (or `prjct context wiki sync`) reads it.\n3. ALL existing rules for that workflow are deleted from SQLite.\n4. New rules from your file are inserted.\n5. Wiki regenerates \u2192 `_generated/workflows/<name>.md` reflects your edits.\n6. Your file moves to `_ingested/<timestamp>/` so this folder stays clean.\n\n## Schema\n\n- Frontmatter `name:` is required (the workflow command: ship, task, sync, \u2026)\n- Sections: `## Gates`, `## Steps`, `## Hooks`, `## Instructions` (any subset)\n- Each bullet: `- \\`<action>\\` \u2014 <description>` (description optional)\n- Order within a section is preserved as sortOrder\n\n## Notes\n\n- This is destructive: SQLite rules for the named workflow are REPLACED, not merged.\n- To restore a built-in workflow, run `prjct workflow reset <name>`.\n- `README.md` and `index.md` are ignored.\n- Files in `_ingested/` are ignored.\n'});var $h={};re($h,{CREW_RUN_KEY_PREFIX:()=>Gl,CrewRunSchema:()=>Hl,crewRunStorage:()=>Ih,default:()=>$E});import{z as Pt}from"zod";function Ii(s){return`${Gl}${s}`}var Gl,Hl,Bl,Ih,$E,Oh=h(()=>{"use strict";Bt();ee();te();Gl="crew-run:",Hl=Pt.object({id:Pt.string().min(1),spec_id:Pt.string().nullable().default(null),task_id:Pt.string().nullable().default(null),started_at:Pt.string().min(1),ended_at:Pt.string().min(1),implementer_summary:Pt.string().default(""),files_touched:Pt.array(Pt.string()).default([]),reviewer_verdict:Pt.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:Pt.string().nullable().default(null)});c(Ii,"keyFor");Bl=class{static{c(this,"CrewRunStorage")}record(e,t){let n=t.runId??Ie(),r=E.getDoc(e,Ii(n));if(r)return r;let o=k(),i=Hl.parse({id:n,spec_id:t.specId??null,task_id:t.taskId??null,started_at:t.startedAt??o,ended_at:t.endedAt??o,implementer_summary:t.implementerSummary,files_touched:t.filesTouched,reviewer_verdict:t.reviewerVerdict,reviewer_notes:t.reviewerNotes??null});return E.setDoc(e,Ii(n),i),i}get(e,t){return E.getDoc(e,Ii(t))}list(e){return E.listDocsByPrefix(e,Gl).map(n=>Hl.parse(n.data))}delete(e,t){E.deleteDoc(e,Ii(t))}},Ih=new Bl,$E=Ih});var Lr={};re(Lr,{generateWiki:()=>ql,regenerateWikiDeferred:()=>ME});import Vl from"node:fs/promises";import Jl from"node:path";function Nh(s,e,t){let n=Date.now();try{let r=e(),o=Date.now()-n;return console.log(JSON.stringify({builder:s,status:"ok",ms:o})),{result:r,ok:!0,ms:o}}catch(r){let o=Date.now()-n,i=r instanceof Error?r.message:String(r);return console.log(JSON.stringify({builder:s,status:"error",ms:o,error:i})),{result:t(r),ok:!1,ms:o}}}async function ql(s,e){let t=await Mr(s),n=Jl.join(t,$i);await Vl.mkdir(n,{recursive:!0});let r=Jl.join(n,Ml),o=await sh(s,e);if(await Vl.readFile(r,"utf-8").catch(()=>null)===o){let Q=await Fl(n);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(Q).length,filesRemoved:0}}let{specStorage:a}=await Promise.resolve().then(()=>(Dr(),Wf)),{queueStorage:l}=await Promise.resolve().then(()=>(Mn(),Am)),{default:u}=await Promise.resolve().then(()=>(Oh(),$h)),{teamEnrollmentStorage:d}=await Promise.resolve().then(()=>(pi(),Og)),[p,m,g,w,x,C,v]=await Promise.all([Im.getAll(e),Promise.resolve(Ne.recall(e,{limit:5e3})),Oe.getActive(e).catch(()=>null),Promise.resolve(Qe.getActive(e)).catch(()=>null),Promise.resolve(Z.getAllRules(e)).catch(()=>[]),Promise.resolve(a.list(e,{includeArchived:!0})).catch(()=>[]),l.getTasks(e).catch(()=>[])]),j=(()=>{try{return u.list(e)}catch{return[]}})(),T=(()=>{try{return d.get(e)}catch{return null}})(),L=m.filter(Q=>Q.type!=="shipped"),R=new Map;for(let Q of p)R.set(`ships/${ht(Q.name)}.md`,fh(Q));for(let[Q,ve]of hh(L))R.set(Q,ve);for(let[Q,ve]of yh(L))R.set(Q,ve);for(let[Q,ve]of vh(C,v))R.set(Q,ve);let ue=Nh("crew-runs",()=>OE(j),()=>new Map);for(let[Q,ve]of ue.result)R.set(Q,ve);let en=Nh("team",()=>NE(T),()=>null);en.result!==null&&R.set("team.md",en.result);let Cn=w?.patterns??g?.patterns??[],es=w?.antiPatterns??g?.antiPatterns??[],sr=ah(Cn,es);if(sr&&R.set("patterns.md",sr),w){let Q=ch(w);Q&&R.set("architecture.md",Q);let ve=lh(w);ve&&R.set("tech-debt.md",ve);let cr=uh(w);cr&&R.set("insights.md",cr)}let ts=Th(x);for(let[Q,ve]of ts.files)R.set(Q,ve);let qr=ts.commandCount,ns=Qe.getAllFull(e);for(let[Q,ve]of th(ns))R.set(Q,ve);let rr=await kh(s);for(let[Q,ve]of rr)R.set(Q,ve);let ea=rr.size>0?rr.size-1:0,or=new Map;for(let Q of L)or.set(Q.type,(or.get(Q.type)??0)+1);let ir=new Map;for(let Q of L)for(let ve of Object.keys(Q.tags))ir.set(ve,(ir.get(ve)??0)+1);R.set("index.md",oh({ships:p,memoryTypeCounts:or,tagKeyCounts:ir,patternsCount:Cn.length,antiPatternsCount:es.length,llmAnalysis:w,archiveCount:Nl(ns).size,releaseCount:ea,workflowCount:qr}));let Xr=await Fl(n),ss={},ar=0,Y=0,ta=0;for(let[Q,ve]of R){let cr=eh(ve);if(ss[Q]=cr,Xr[Q]===cr){Y++;continue}await Or(n,Q,ve),ar++}for(let Q of Object.keys(Xr))ss[Q]||(await ph(n,Q),ta++);let Vw=await mh(n,ss);ta+=Vw,await Or(n,Ll,`${JSON.stringify(ss,null,2)}
921
+ `;c(_h,"ensureWorkflowsReadme");IE='# Workflows (Obsidian dropzone)\n\nDrop a markdown file here to OVERRIDE a workflow\'s rules in SQLite. Format:\n\n```markdown\n---\nname: ship\n---\n\n## Gates\n- `git branch --show-current | grep -vE "^(main|master)$"` \u2014 Prevent shipping from main branch\n\n## Steps\n- `version:bump` \u2014 Bump version (stack-aware)\n- `changelog:add` \u2014 Append CHANGELOG entry\n- `git:commit` \u2014 Commit ship\n- `git:push` \u2014 Push to origin\n```\n\n## How it works\n\n1. You drop `workflows/<name>.md` here.\n2. Stop hook (or `prjct context wiki sync`) reads it.\n3. ALL existing rules for that workflow are deleted from SQLite.\n4. New rules from your file are inserted.\n5. Wiki regenerates \u2192 `_generated/workflows/<name>.md` reflects your edits.\n6. Your file moves to `_ingested/<timestamp>/` so this folder stays clean.\n\n## Schema\n\n- Frontmatter `name:` is required (the workflow command: ship, task, sync, \u2026)\n- Sections: `## Gates`, `## Steps`, `## Hooks`, `## Instructions` (any subset)\n- Each bullet: `- \\`<action>\\` \u2014 <description>` (description optional)\n- Order within a section is preserved as sortOrder\n\n## Notes\n\n- This is destructive: SQLite rules for the named workflow are REPLACED, not merged.\n- To restore a built-in workflow, run `prjct workflow reset <name>`.\n- `README.md` and `index.md` are ignored.\n- Files in `_ingested/` are ignored.\n'});var $h={};re($h,{CREW_RUN_KEY_PREFIX:()=>Gl,CrewRunSchema:()=>Hl,crewRunStorage:()=>Ih,default:()=>$E});import{z as Pt}from"zod";function Ii(s){return`${Gl}${s}`}var Gl,Hl,Bl,Ih,$E,Oh=h(()=>{"use strict";Bt();ee();te();Gl="crew-run:",Hl=Pt.object({id:Pt.string().min(1),spec_id:Pt.string().nullable().default(null),task_id:Pt.string().nullable().default(null),started_at:Pt.string().min(1),ended_at:Pt.string().min(1),implementer_summary:Pt.string().default(""),files_touched:Pt.array(Pt.string()).default([]),reviewer_verdict:Pt.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:Pt.string().nullable().default(null)});c(Ii,"keyFor");Bl=class{static{c(this,"CrewRunStorage")}record(e,t){let n=t.runId??Ie(),r=T.getDoc(e,Ii(n));if(r)return r;let o=k(),i=Hl.parse({id:n,spec_id:t.specId??null,task_id:t.taskId??null,started_at:t.startedAt??o,ended_at:t.endedAt??o,implementer_summary:t.implementerSummary,files_touched:t.filesTouched,reviewer_verdict:t.reviewerVerdict,reviewer_notes:t.reviewerNotes??null});return T.setDoc(e,Ii(n),i),i}get(e,t){return T.getDoc(e,Ii(t))}list(e){return T.listDocsByPrefix(e,Gl).map(n=>Hl.parse(n.data))}delete(e,t){T.deleteDoc(e,Ii(t))}},Ih=new Bl,$E=Ih});var Lr={};re(Lr,{generateWiki:()=>ql,regenerateWikiDeferred:()=>ME});import Vl from"node:fs/promises";import Jl from"node:path";function Nh(s,e,t){let n=Date.now();try{let r=e(),o=Date.now()-n;return console.log(JSON.stringify({builder:s,status:"ok",ms:o})),{result:r,ok:!0,ms:o}}catch(r){let o=Date.now()-n,i=r instanceof Error?r.message:String(r);return console.log(JSON.stringify({builder:s,status:"error",ms:o,error:i})),{result:t(r),ok:!1,ms:o}}}async function ql(s,e){let t=await Mr(s),n=Jl.join(t,$i);await Vl.mkdir(n,{recursive:!0});let r=Jl.join(n,Ml),o=await sh(s,e);if(await Vl.readFile(r,"utf-8").catch(()=>null)===o){let Q=await Fl(n);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(Q).length,filesRemoved:0}}let{specStorage:a}=await Promise.resolve().then(()=>(Dr(),Wf)),{queueStorage:l}=await Promise.resolve().then(()=>(Mn(),Am)),{default:u}=await Promise.resolve().then(()=>(Oh(),$h)),{teamEnrollmentStorage:d}=await Promise.resolve().then(()=>(pi(),Og)),[p,m,g,w,x,C,v]=await Promise.all([Im.getAll(e),Promise.resolve(Ne.recall(e,{limit:5e3})),Oe.getActive(e).catch(()=>null),Promise.resolve(Qe.getActive(e)).catch(()=>null),Promise.resolve(Z.getAllRules(e)).catch(()=>[]),Promise.resolve(a.list(e,{includeArchived:!0})).catch(()=>[]),l.getTasks(e).catch(()=>[])]),j=(()=>{try{return u.list(e)}catch{return[]}})(),E=(()=>{try{return d.get(e)}catch{return null}})(),L=m.filter(Q=>Q.type!=="shipped"),R=new Map;for(let Q of p)R.set(`ships/${ht(Q.name)}.md`,fh(Q));for(let[Q,ve]of hh(L))R.set(Q,ve);for(let[Q,ve]of yh(L))R.set(Q,ve);for(let[Q,ve]of vh(C,v))R.set(Q,ve);let ue=Nh("crew-runs",()=>OE(j),()=>new Map);for(let[Q,ve]of ue.result)R.set(Q,ve);let en=Nh("team",()=>NE(E),()=>null);en.result!==null&&R.set("team.md",en.result);let Cn=w?.patterns??g?.patterns??[],es=w?.antiPatterns??g?.antiPatterns??[],sr=ah(Cn,es);if(sr&&R.set("patterns.md",sr),w){let Q=ch(w);Q&&R.set("architecture.md",Q);let ve=lh(w);ve&&R.set("tech-debt.md",ve);let cr=uh(w);cr&&R.set("insights.md",cr)}let ts=Th(x);for(let[Q,ve]of ts.files)R.set(Q,ve);let qr=ts.commandCount,ns=Qe.getAllFull(e);for(let[Q,ve]of th(ns))R.set(Q,ve);let rr=await kh(s);for(let[Q,ve]of rr)R.set(Q,ve);let ea=rr.size>0?rr.size-1:0,or=new Map;for(let Q of L)or.set(Q.type,(or.get(Q.type)??0)+1);let ir=new Map;for(let Q of L)for(let ve of Object.keys(Q.tags))ir.set(ve,(ir.get(ve)??0)+1);R.set("index.md",oh({ships:p,memoryTypeCounts:or,tagKeyCounts:ir,patternsCount:Cn.length,antiPatternsCount:es.length,llmAnalysis:w,archiveCount:Nl(ns).size,releaseCount:ea,workflowCount:qr}));let Xr=await Fl(n),ss={},ar=0,Y=0,ta=0;for(let[Q,ve]of R){let cr=eh(ve);if(ss[Q]=cr,Xr[Q]===cr){Y++;continue}await Or(n,Q,ve),ar++}for(let Q of Object.keys(Xr))ss[Q]||(await ph(n,Q),ta++);let Vw=await mh(n,ss);ta+=Vw,await Or(n,Ll,`${JSON.stringify(ss,null,2)}
922
922
  `),await Or(n,Ml,o);let Jw=Jl.join(t,"README.md");return await Vl.stat(Jw).then(()=>!0,()=>!1)||(await Or(t,"README.md",`# Project Wiki
923
923
 
924
924
  Open this folder as an Obsidian vault to browse project memory.
@@ -931,8 +931,8 @@ Open this folder as an Obsidian vault to browse project memory.
931
931
  `);e.set(o,i)}return e}function NE(s){return s===null?null:["# Team enrollment","",`- **required**: ${s.required}`,`- **minVersion**: \`${s.minVersion}\``,`- **enrolledAt**: ${s.enrolledAt}`,`- **enrolledBy**: ${s.enrolledBy??"_(unspecified)_"}`,"",'Authoritative source: `kv_store["team:enrollment"]`. The `.prjct/team.json` file in the repo is a derived mirror written atomically by `prjct team` (the pre-commit hook reads it because it must work before prjct is installed). Do not hand-edit the mirror \u2014 run `prjct team check` to detect/heal drift.',""].join(`
932
932
  `)}async function ME(s,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{ql(s,e).catch(()=>{})});return}try{await ql(s,e)}catch{}}var $i,Fr=h(()=>{"use strict";gt();pn();gs();vs();qt();Zf();Ds();nh();rh();ih();dh();gh();wh();Sh();bh();Eh();Dh();Wl();$i="_generated";c(Nh,"runBuilder");c(ql,"generateWiki");c(OE,"buildCrewRunFiles");c(NE,"buildTeamFile");c(ME,"regenerateWikiDeferred")});var Uh={};re(Uh,{ShippingCommands:()=>Vn,seedCodeShipRules:()=>zl});import{existsSync as Mh}from"node:fs";import Lh from"node:path";function Fh(s){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>Mh(Lh.join(s,t)))}function Xl(s){return Mh(Lh.join(s,".git"))}async function zl(s,e){if(!Fh(e))return!1;let t=new Date().toISOString(),n=Z.getRulesForCommand(s,"ship"),r=new Set(n.map(d=>d.action)),i=n.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,a=[];Xl(e)&&a.push({action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",timeoutMs:5e3});let l=[{action:"version:bump",description:"Bump version (stack-aware)",timeoutMs:1e4},{action:"changelog:add",description:"Append CHANGELOG entry",timeoutMs:1e4}];Xl(e)&&(l.push({action:"git:commit",description:"Commit ship",timeoutMs:15e3}),l.push({action:"git:push",description:"Push to origin",timeoutMs:3e4}));let u=0;for(let d of a)r.has(d.action)||(Z.addRule(s,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)r.has(d.action)||(Z.addRule(s,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function LE(s,e,t,n){if(n.intent==="proceed"||n.intent==="register-only")return null;if(!t.some(a=>a.type==="step"&&a.position==="before"))return{question:"No `ship` workflow steps are configured for this project. What should ship do?",options:["register-only","seed-code-workflow","abort"],state:{rulesCount:t.length,looksLikeCode:Fh(e)}};if(await B.getCurrentTask(s))return null;let i=await UE(e);return i?{question:`No active task, and PR #${i.number} ("${i.title}") is OPEN for this branch. Continue ship anyway?`,options:["proceed","abort"],state:{openPr:i.number,branch:i.branch}}:null}function FE(s,e){if(e){let t=$(U("Clarification needed",s.question),U("Options",Te(s.options.map(n=>`\`prjct ship --intent=${n}\``))),s.state?U("State",Te(Object.entries(s.state).map(([n,r])=>`${n}: ${JSON.stringify(r)}`))):null);console.log(t);return}console.log(`
933
933
  \u26A0\uFE0F ${s.question}`),console.log(`
934
- Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}async function UE(s){if(!Xl(s))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Ue(),na)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:s,timeout:3e3}),n=t.toString().trim();if(!n)return null;let{stdout:r}=await e("gh",["pr","list","--head",n,"--state","open","--json","number,title","--limit","1"],{cwd:s,timeout:5e3}),o=JSON.parse(r.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:n}}catch{return null}}var Vn,Oi=h(()=>{"use strict";Jc();vs();Ze();qt();F();ee();xe();ze();Pr();ke();Rl();Be();Yt();Vn=class extends se{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let r=await fe(t);if(!r.ok)return r.result;let o=r.value,i=e,a=await B.getCurrentTask(o),l=a?.linkedSpecId;if(a&&(i||(i=a.description||"current work"),await B.completeTask(o)),i||(i="current work"),l&&!n.noSpecGate)try{let{specService:j}=await Promise.resolve().then(()=>(Ai(),Il)),T=await j.get(t,l);if(T&&T.content.acceptance_criteria.length>0){let L=[];L.push(""),L.push(`## Spec acceptance gate \u2014 \`${T.title}\` (${T.id.slice(0,8)})`),L.push(""),L.push("Walk each criterion. STOP if any is unmet."),L.push("");for(let R of T.content.acceptance_criteria)L.push(`- [ ] ${R}`);L.push(""),L.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),L.push(""),console.log(L.join(`
935
- `))}}catch{}let u=Z.getRulesForCommand(o,"ship");if(n.intent==="seed-code-workflow"){if(!await zl(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=Z.getRulesForCommand(o,"ship")}!u.some(j=>j.type==="step"&&j.position==="before")&&n.intent!=="register-only"&&await zl(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=Z.getRulesForCommand(o,"ship"));let p=await LE(o,t,u,n);if(p)return FE(p,n.md===!0),{success:!1,clarification:p};let m={feature:i},g=await vn(o,"ship","before",{projectPath:t,skipRules:n.skipHooks,runContext:m});if(!g.success)return{success:!1,error:`Ship blocked: ${g.gatesFailed.length>0?g.gatesFailed.join(", "):"unknown step"}`};let w=typeof m.version=="string"?m.version:"unversioned";await Ft.addShipped(o,{name:i,version:w}),await this.logToMemory(t,"feature_shipped",{feature:i,version:w,timestamp:k()});let x=await vn(o,"ship","after",{projectPath:t,skipRules:n.skipHooks,runContext:m}),C=[...g.instructions,...x.instructions];try{await Rs.sync(t)}catch(j){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(j))}try{let{regenerateWikiDeferred:j}=await Promise.resolve().then(()=>(Fr(),Lr));await j(t,o)}catch(j){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",y(j))}let v=g.stepsRun.length+x.stepsRun.length;if(n.md){let j=yi("ship",!0),T=$(me(`Shipped: ${i}`,`Version: ${w}`),U("Results",Te([`Version: ${w}`,`Workflow steps run: ${v>0?[...g.stepsRun,...x.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${g.hooksFailed.length+x.hooksFailed.length}`])),C.length>0?U("Agent Instructions",Te(C)):null,_e(j.map(L=>({label:L.desc,command:L.cmd}))));console.log(T)}else f.done(`v${w} shipped`),As("ship");return{success:!0,feature:i,version:w}}catch(r){return f.fail(y(r)),be(r)}}};c(Fh,"isCodeProject");c(Xl,"isGitRepo");c(zl,"seedCodeShipRules");c(LE,"buildClarification");c(FE,"renderClarification");c(UE,"findOpenPrForBranch")});var Bh={};re(Bh,{PlanningCommands:()=>Jn});import Wh from"node:fs/promises";import Hh from"node:path";async function WE(){if(!Kl){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(Mi(),Gh));Kl=new s}return Kl}var Kl,Jn,Ni=h(()=>{"use strict";to();Lt();Ce();De();lf();qt();F();xe();ke();tl();pf();Be();Kl=null;c(WE,"getAnalysisCommands");Jn=class extends se{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await W.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Ar(t).runNonInteractive());else if(a=await new Ar(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let l=await ls(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await W.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,n),f.step(2,4,"Creating structure..."),await D.ensureProjectStructure(p);let m=D.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
934
+ Options:`);for(let t of s.options)console.log(` prjct ship --intent=${t}`)}async function UE(s){if(!Xl(s))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Ue(),na)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:s,timeout:3e3}),n=t.toString().trim();if(!n)return null;let{stdout:r}=await e("gh",["pr","list","--head",n,"--state","open","--json","number,title","--limit","1"],{cwd:s,timeout:5e3}),o=JSON.parse(r.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:n}}catch{return null}}var Vn,Oi=h(()=>{"use strict";Jc();vs();Ze();qt();F();ee();xe();ze();Pr();ke();Rl();Be();Yt();Vn=class extends se{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let r=await fe(t);if(!r.ok)return r.result;let o=r.value,i=e,a=await B.getCurrentTask(o),l=a?.linkedSpecId;if(a&&(i||(i=a.description||"current work"),await B.completeTask(o)),i||(i="current work"),l&&!n.noSpecGate)try{let{specService:j}=await Promise.resolve().then(()=>(Ai(),Il)),E=await j.get(t,l);if(E&&E.content.acceptance_criteria.length>0){let L=[];L.push(""),L.push(`## Spec acceptance gate \u2014 \`${E.title}\` (${E.id.slice(0,8)})`),L.push(""),L.push("Walk each criterion. STOP if any is unmet."),L.push("");for(let R of E.content.acceptance_criteria)L.push(`- [ ] ${R}`);L.push(""),L.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),L.push(""),console.log(L.join(`
935
+ `))}}catch{}let u=Z.getRulesForCommand(o,"ship");if(n.intent==="seed-code-workflow"){if(!await zl(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=Z.getRulesForCommand(o,"ship")}!u.some(j=>j.type==="step"&&j.position==="before")&&n.intent!=="register-only"&&await zl(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=Z.getRulesForCommand(o,"ship"));let p=await LE(o,t,u,n);if(p)return FE(p,n.md===!0),{success:!1,clarification:p};let m={feature:i},g=await vn(o,"ship","before",{projectPath:t,skipRules:n.skipHooks,runContext:m});if(!g.success)return{success:!1,error:`Ship blocked: ${g.gatesFailed.length>0?g.gatesFailed.join(", "):"unknown step"}`};let w=typeof m.version=="string"?m.version:"unversioned";await Ft.addShipped(o,{name:i,version:w}),await this.logToMemory(t,"feature_shipped",{feature:i,version:w,timestamp:k()});let x=await vn(o,"ship","after",{projectPath:t,skipRules:n.skipHooks,runContext:m}),C=[...g.instructions,...x.instructions];try{await Rs.sync(t)}catch(j){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(j))}try{let{regenerateWikiDeferred:j}=await Promise.resolve().then(()=>(Fr(),Lr));await j(t,o)}catch(j){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",y(j))}let v=g.stepsRun.length+x.stepsRun.length;if(n.md){let j=yi("ship",!0),E=$(me(`Shipped: ${i}`,`Version: ${w}`),U("Results",Te([`Version: ${w}`,`Workflow steps run: ${v>0?[...g.stepsRun,...x.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${g.hooksFailed.length+x.hooksFailed.length}`])),C.length>0?U("Agent Instructions",Te(C)):null,_e(j.map(L=>({label:L.desc,command:L.cmd}))));console.log(E)}else f.done(`v${w} shipped`),As("ship");return{success:!0,feature:i,version:w}}catch(r){return f.fail(y(r)),be(r)}}};c(Fh,"isCodeProject");c(Xl,"isGitRepo");c(zl,"seedCodeShipRules");c(LE,"buildClarification");c(FE,"renderClarification");c(UE,"findOpenPrForBranch")});var Bh={};re(Bh,{PlanningCommands:()=>Jn});import Wh from"node:fs/promises";import Hh from"node:path";async function WE(){if(!Kl){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(Mi(),Gh));Kl=new s}return Kl}var Kl,Jn,Ni=h(()=>{"use strict";to();Lt();Ce();De();lf();qt();F();xe();ke();tl();pf();Be();Kl=null;c(WE,"getAnalysisCommands");Jn=class extends se{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await W.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Ar(t).runNonInteractive());else if(a=await new Ar(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let l=await ls(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await W.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,n),f.step(2,4,"Creating structure..."),await D.ensureProjectStructure(p);let m=D.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
936
936
 
937
937
  No current task. Use \`/p:now\` to set focus.
938
938
  `,"core/next.md":`# NEXT
@@ -1002,15 +1002,15 @@ Generated: ${new Date().toLocaleString()}
1002
1002
  | Files skipped | ${m.filesSkipped} |
1003
1003
  | Files removed | ${m.filesRemoved} |
1004
1004
  `):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...m})),{success:!0}}catch(n){return be(n)}}async saveLlmAnalysis(...e){return Yh(...e)}async getLlmAnalysis(...e){return Qh(...e)}async stats(...e){return oy(...e)}async diff(...e){return iy(...e)}async seal(...e){return Vh(...e)}async rollback(...e){return Jh(...e)}async verify(...e){return qh(...e)}async semanticVerify(...e){return Zl(...e)}}});var Sy={};re(Sy,{PRJCT_HOOKS:()=>Ur,install:()=>uu,status:()=>pu,uninstall:()=>du});import iu from"node:fs/promises";import iC from"node:os";import yy from"node:path";function Fs(){let s=process.env.HOME||iC.homedir();return yy.join(s,".claude","settings.json")}async function cu(){try{let s=await iu.readFile(Fs(),"utf-8"),e=JSON.parse(s);return e&&typeof e=="object"?e:{}}catch(s){if(s.code==="ENOENT")return{};throw s}}async function wy(s){await iu.mkdir(yy.dirname(Fs()),{recursive:!0}),await iu.writeFile(Fs(),`${JSON.stringify(s,null,2)}
1005
- `,"utf-8")}function ky(s){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${s} || exit 0`}function lu(s){return s[au]===!0}function aC(s){if(s[au]===!0)return!1;let e=s.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function hy(s){let e={type:"command",command:ky(s.subcommand),[au]:!0};return"ifClause"in s&&s.ifClause&&(e.if=s.ifClause),e}async function uu(){let s=await cu(),e=s.hooks??{},t=0,n=0;for(let r of Ur){let o=e[r.event]??[],i=ky(r.subcommand),a=o.find(p=>(p.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(p=>!aC(p));let u=l-a.hooks.length,d=a.hooks.find(p=>lu(p));if(d){let p=hy(r);d.command===p.command&&d.if===p.if&&u===0?n++:(d.command=p.command,d.if=p.if,t++)}else a.hooks.push(hy(r)),t++;e[r.event]=o}return s.hooks=e,await wy(s),{settingsPath:Fs(),hooksWritten:t,alreadyPresent:n}}async function du(){let s=await cu();if(!s.hooks)return{settingsPath:Fs(),hooksRemoved:0};let e=0;for(let[t,n]of Object.entries(s.hooks)){let r=[];for(let o of n){let i=o.hooks.filter(a=>lu(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?s.hooks[t]=r:delete s.hooks[t]}return Object.keys(s.hooks).length===0&&delete s.hooks,await wy(s),{settingsPath:Fs(),hooksRemoved:e}}async function pu(){let e=(await cu()).hooks??{},t=0;for(let n of Object.values(e))for(let r of n)for(let o of r.hooks)lu(o)&&t++;return{installed:t,expected:Ur.length}}var au,Ur,mu=h(()=>{"use strict";c(Fs,"settingsPath");au="_prjctManaged",Ur=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(cu,"readSettings");c(wy,"writeSettings");c(ky,"hookCommand");c(lu,"isPrjctHook");c(aC,"isLegacyPrjctHook");c(hy,"hookEntryFor");c(uu,"install");c(du,"uninstall");c(pu,"status")});var Ay={};re(Ay,{syncCursorStorage:()=>kC});var ku,kC,jy=h(()=>{"use strict";ee();te();ku=class{static{c(this,"SyncCursorStorage")}get(e,t=null,n=null){if(!n)return null;let r=E.get(e,`SELECT * FROM sync_cursors
1005
+ `,"utf-8")}function ky(s){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${s} || exit 0`}function lu(s){return s[au]===!0}function aC(s){if(s[au]===!0)return!1;let e=s.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function hy(s){let e={type:"command",command:ky(s.subcommand),[au]:!0};return"ifClause"in s&&s.ifClause&&(e.if=s.ifClause),e}async function uu(){let s=await cu(),e=s.hooks??{},t=0,n=0;for(let r of Ur){let o=e[r.event]??[],i=ky(r.subcommand),a=o.find(p=>(p.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(p=>!aC(p));let u=l-a.hooks.length,d=a.hooks.find(p=>lu(p));if(d){let p=hy(r);d.command===p.command&&d.if===p.if&&u===0?n++:(d.command=p.command,d.if=p.if,t++)}else a.hooks.push(hy(r)),t++;e[r.event]=o}return s.hooks=e,await wy(s),{settingsPath:Fs(),hooksWritten:t,alreadyPresent:n}}async function du(){let s=await cu();if(!s.hooks)return{settingsPath:Fs(),hooksRemoved:0};let e=0;for(let[t,n]of Object.entries(s.hooks)){let r=[];for(let o of n){let i=o.hooks.filter(a=>lu(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?s.hooks[t]=r:delete s.hooks[t]}return Object.keys(s.hooks).length===0&&delete s.hooks,await wy(s),{settingsPath:Fs(),hooksRemoved:e}}async function pu(){let e=(await cu()).hooks??{},t=0;for(let n of Object.values(e))for(let r of n)for(let o of r.hooks)lu(o)&&t++;return{installed:t,expected:Ur.length}}var au,Ur,mu=h(()=>{"use strict";c(Fs,"settingsPath");au="_prjctManaged",Ur=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(cu,"readSettings");c(wy,"writeSettings");c(ky,"hookCommand");c(lu,"isPrjctHook");c(aC,"isLegacyPrjctHook");c(hy,"hookEntryFor");c(uu,"install");c(du,"uninstall");c(pu,"status")});var Ay={};re(Ay,{syncCursorStorage:()=>kC});var ku,kC,jy=h(()=>{"use strict";ee();te();ku=class{static{c(this,"SyncCursorStorage")}get(e,t=null,n=null){if(!n)return null;let r=T.get(e,`SELECT * FROM sync_cursors
1006
1006
  WHERE project_id = ?
1007
1007
  AND device_id = ?
1008
- AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,n]:[e,n,t]);return r?this.rowToCursor(r):null}touch(e,t=null,n=null){if(!n)return;let r=k();this.upsert({userId:t,deviceId:n,projectId:e,lastEventId:this.getLastEventId(e,t,n),updatedAt:r})}advance(e,t,n={}){let r=n.userId??null,o=n.deviceId??null;if(!o)return;let i=this.getLastEventId(e,r,o);t<=i||this.upsert({userId:r,deviceId:o,projectId:e,lastEventId:t,updatedAt:k()})}getLastEventId(e,t,n){return E.get(e,`SELECT last_event_id FROM sync_cursors
1008
+ AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,n]:[e,n,t]);return r?this.rowToCursor(r):null}touch(e,t=null,n=null){if(!n)return;let r=k();this.upsert({userId:t,deviceId:n,projectId:e,lastEventId:this.getLastEventId(e,t,n),updatedAt:r})}advance(e,t,n={}){let r=n.userId??null,o=n.deviceId??null;if(!o)return;let i=this.getLastEventId(e,r,o);t<=i||this.upsert({userId:r,deviceId:o,projectId:e,lastEventId:t,updatedAt:k()})}getLastEventId(e,t,n){return T.get(e,`SELECT last_event_id FROM sync_cursors
1009
1009
  WHERE project_id = ?
1010
1010
  AND device_id = ?
1011
- AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,n]:[e,n,t])?.last_event_id??0}backfillUser(e,t,n){E.run(e,`UPDATE sync_cursors
1011
+ AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,n]:[e,n,t])?.last_event_id??0}backfillUser(e,t,n){T.run(e,`UPDATE sync_cursors
1012
1012
  SET user_id = ?, updated_at = ?
1013
- WHERE project_id = ? AND device_id = ? AND user_id IS NULL`,n,k(),e,t)}upsert(e){E.run(e.projectId,`INSERT INTO sync_cursors (user_id, device_id, project_id, last_event_id, updated_at)
1013
+ WHERE project_id = ? AND device_id = ? AND user_id IS NULL`,n,k(),e,t)}upsert(e){T.run(e.projectId,`INSERT INTO sync_cursors (user_id, device_id, project_id, last_event_id, updated_at)
1014
1014
  VALUES (?, ?, ?, ?, ?)
1015
1015
  ON CONFLICT(user_id, device_id, project_id)
1016
1016
  DO UPDATE SET last_event_id = excluded.last_event_id, updated_at = excluded.updated_at`,e.userId,e.deviceId,e.projectId,e.lastEventId,e.updatedAt)}rowToCursor(e){return{userId:e.user_id,deviceId:e.device_id,projectId:e.project_id,lastEventId:e.last_event_id,updatedAt:e.updated_at}}},kC=new ku});var Uy={};re(Uy,{buildInventory:()=>OC,renderInventoryMd:()=>WC});import{execFile as jC}from"node:child_process";import My from"node:fs/promises";import Js from"node:path";import{promisify as _C}from"node:util";async function OC(s,e){let t=Se.list(e,{includeArchived:!0}),n={};for(let d of t)n[d.status]=(n[d.status]??0)+1;let r=new Map,o=new Set;for(let d of t){let p=NC(d);if(!p)continue;o.add(p);let m=r.get(p)??[];m.push(d),r.set(p,m)}let i=await MC(s);for(let d of i)o.add(d);let a=[],l=[];for(let d of[...o].sort()){let p=r.get(d)??[],m=await LC(s,d),g=await FC(s,d,p),w=p.length>0?p.reduce((C,v)=>v.updatedAt>C?v.updatedAt:C,""):null,x=!1;for(let C of p.filter(v=>v.status==="shipped")){let v=await UC(s,C);l.push({specId:C.id,title:C.title,status:C.status,drift:v.drift,locChanged:v.locChanged,cosmeticOnly:v.cosmeticOnly}),v.drift===!0?x=!0:v.drift==="unknown"&&x===!1&&(x="unknown")}a.push({module:d,specCount:p.length,coveredFiles:g,totalFiles:m,coveredPct:m===0?null:Math.round(g/m*1e4)/100,lastUpdated:w||null,drift:x})}let u=a.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:s,totalSpecs:t.length,byStatus:n,modules:a,driftDetail:l,uncoveredModules:u}}function NC(s){let e=s.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let n=t[1].split("/").slice(0,2);return n.length===2?n.join("/"):null}async function MC(s){let e=Js.join(s,"core");try{return(await My.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")&&!n.name.startsWith("__")).map(n=>`core/${n.name}`)}catch{return[]}}async function LC(s,e){let t=Js.join(s,e),n=0;try{await Cu(t,async r=>{let o=Js.relative(s,r);Ly(o)||Fy(o)&&n++})}catch{}return n}async function FC(s,e,t){let n=Js.join(s,e),r=new Set;for(let i of t)for(let a of i.content.scope){let l=a.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&r.add(l[0])}let o=0;try{await Cu(n,async i=>{let a=Js.relative(s,i);if(!Ly(a)&&Fy(a)){for(let l of r)if(a===l||a.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function Cu(s,e){let t;try{t=await My.readdir(s,{withFileTypes:!0})}catch{return}for(let n of t){if(n.name.startsWith(".")||n.name==="node_modules"||n.name==="dist")continue;let r=Js.join(s,n.name);n.isDirectory()?await Cu(r,e):n.isFile()&&await e(r)}}function Ly(s){return $C.some(e=>e.test(s))}function Fy(s){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(s)}async function UC(s,e){if(!e.shippedSha)return{drift:"unknown"};let t=e.content.scope.map(o=>o.match(/[a-zA-Z0-9_./-]+\.[a-z]+/)?.[0]??o.match(/[a-zA-Z0-9_./-]+\//)?.[0]).filter(o=>!!o);if(t.length===0)return{drift:"unknown"};let n=0;try{let{stdout:o}=await Ny("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:s}),i=o.match(/(\d+) insertions?/),a=o.match(/(\d+) deletions?/);n=(i?Number.parseInt(i[1],10):0)+(a?Number.parseInt(a[1],10):0)}catch{return{drift:"unknown"}}if(n<=DC)return{drift:!1,locChanged:n,cosmeticOnly:!1};let r=!0;try{let{stdout:o}=await Ny("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:s}),i=o.split(`
@@ -1026,8 +1026,8 @@ Generated: ${new Date().toLocaleString()}
1026
1026
  - removed: ${r.hooksRemoved}
1027
1027
  - settings: \`${r.settingsPath}\`
1028
1028
  `):f.done(o),{success:!0,hooksRemoved:r.hooksRemoved}}catch(r){let o=y(r);return G(o)}}async status(e=null,t=process.cwd()){try{let n=await pu();return{success:!0,installed:n.installed,expected:n.expected}}catch(n){return be(n)}}};import*as Ke from"@clack/prompts";import Qt from"chalk";import gu from"node:fs";import cC from"node:os";import Fi from"node:path";var lC=[{name:"claude_ai_PostHog",displayName:"PostHog",description:"Product analytics, dashboards, feature flags, surveys",estimatedTools:280},{name:"claude_ai_Atlassian",displayName:"Atlassian (Jira + Confluence)",description:"Jira issues, Confluence pages, Compass components",estimatedTools:40},{name:"claude_ai_Supabase",displayName:"Supabase",description:"Postgres projects, migrations, edge functions, branches",estimatedTools:30},{name:"claude_ai_Google_Drive",displayName:"Google Drive",description:"Read files from your Drive (auth-gated)",estimatedTools:2},{name:"claude_ai_Linear",displayName:"Linear",description:"Issues, projects, comments",estimatedTools:25},{name:"claude_ai_GitHub",displayName:"GitHub",description:"Repos, PRs, issues (claude.ai integration, separate from gh CLI)",estimatedTools:35},{name:"claude_ai_Notion",displayName:"Notion",description:"Pages, databases, blocks",estimatedTools:20},{name:"claude_ai_Slack",displayName:"Slack",description:"Messages, channels, threads",estimatedTools:15}],fu=class{static{c(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),n=[];for(let i of lC)n.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let r=this.readJson(Fi.join(e,".mcp.json"));if(r?.mcpServers)for(let i of Object.keys(r.mcpServers))n.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(Fi.join(cC.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))n.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return n}async deny(e,t){let n=this.localSettingsPath(e),r=this.readJson(n)??{},o=r.deniedMcpServers??[];return o.some(a=>a.serverName===t)?{alreadyDenied:!0,settingsPath:n}:(r.deniedMcpServers=[...o,{serverName:t}],this.writeJson(n,r),{alreadyDenied:!1,settingsPath:n})}async allow(e,t){let n=this.localSettingsPath(e),r=this.readJson(n)??{},o=r.deniedMcpServers??[],i=o.filter(a=>a.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:n}:(i.length===0?delete r.deniedMcpServers:r.deniedMcpServers=i,this.writeJson(n,r),{wasDenied:!0,settingsPath:n})}async setEnabled(e,t,n){let r=this.localSettingsPath(e),o=this.readJson(r)??{},i=new Set((o.deniedMcpServers??[]).map(p=>p.serverName)),a=new Set(t),l=new Set(i);for(let p of n)a.has(p)?l.delete(p):l.add(p);let u=[],d=[];for(let p of n){let m=i.has(p),g=l.has(p);!m&&g?u.push(p):m&&!g&&d.push(p)}return u.length===0&&d.length===0?{nowDenied:u,nowAllowed:d,settingsPath:r}:(l.size===0?delete o.deniedMcpServers:o.deniedMcpServers=Array.from(l).map(p=>({serverName:p})),this.writeJson(r,o),{nowDenied:u,nowAllowed:d,settingsPath:r})}localSettingsPath(e){return Fi.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=gu.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){gu.mkdirSync(Fi.dirname(e),{recursive:!0}),gu.writeFileSync(e,`${JSON.stringify(t,null,2)}
1029
- `,"utf-8")}},zn=new fu;F();xe();ze();ke();Be();var Ws=class extends se{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??null,i=r[1]??null;if(o===null)return!n.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,n);switch(o){case"list":return this.list(t,n);case"status":return this.status(t,n);case"deny":return this.deny(i,t,n);case"allow":return this.allow(i,t,n);default:return f.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await zn.list(e);if(t.length===0)return f.info("No MCP servers detected for this project."),{success:!0,servers:[]};let n=c(v=>v.reduce((j,T)=>j+T.estimatedTools,0),"sumTools"),r=t.filter(v=>!v.denied),o=n(r),i=n(t),a=e.split("/").pop()??"this project";Ke.intro(Qt.cyan.bold(`MCP servers \u2014 ${a}`)),Ke.note([`${r.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,Qt.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1030
- `),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((v,j)=>{if(v.source!==j.source){let T=["cloud","project","global"];return T.indexOf(v.source)-T.indexOf(j.source)}return j.estimatedTools-v.estimatedTools}),d=await Ke.multiselect({message:"Keep enabled in this project:",options:u.map(v=>({value:v.name,label:this.optionLabel(v,l[v.source]),hint:v.description})),initialValues:u.filter(v=>!v.denied).map(v=>v.name),required:!1});if(Ke.isCancel(d))return Ke.cancel("No changes."),{success:!0,cancelled:!0};let p=d,m=await zn.setEnabled(e,p,t.map(v=>v.name)),g=n(t.filter(v=>p.includes(v.name))),w=g-o;if(m.nowDenied.length===0&&m.nowAllowed.length===0)return Ke.outro(Qt.dim("No changes.")),{success:!0,unchanged:!0};let x=[];m.nowDenied.length>0&&x.push(Qt.red(`\u2717 denied (${m.nowDenied.length}): ${m.nowDenied.join(", ")}`)),m.nowAllowed.length>0&&x.push(Qt.green(`\u2713 allowed (${m.nowAllowed.length}): ${m.nowAllowed.join(", ")}`));let C=w>0?"+":"";return x.push(""),x.push(`Tools loaded: ${o} \u2192 ${g} (${Qt.bold(`${C}${w}`)})`),Ke.note(x.join(`
1029
+ `,"utf-8")}},zn=new fu;F();xe();ze();ke();Be();var Ws=class extends se{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),n={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??null,i=r[1]??null;if(o===null)return!n.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,n);switch(o){case"list":return this.list(t,n);case"status":return this.status(t,n);case"deny":return this.deny(i,t,n);case"allow":return this.allow(i,t,n);default:return f.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await zn.list(e);if(t.length===0)return f.info("No MCP servers detected for this project."),{success:!0,servers:[]};let n=c(v=>v.reduce((j,E)=>j+E.estimatedTools,0),"sumTools"),r=t.filter(v=>!v.denied),o=n(r),i=n(t),a=e.split("/").pop()??"this project";Ke.intro(Qt.cyan.bold(`MCP servers \u2014 ${a}`)),Ke.note([`${r.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,Qt.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1030
+ `),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((v,j)=>{if(v.source!==j.source){let E=["cloud","project","global"];return E.indexOf(v.source)-E.indexOf(j.source)}return j.estimatedTools-v.estimatedTools}),d=await Ke.multiselect({message:"Keep enabled in this project:",options:u.map(v=>({value:v.name,label:this.optionLabel(v,l[v.source]),hint:v.description})),initialValues:u.filter(v=>!v.denied).map(v=>v.name),required:!1});if(Ke.isCancel(d))return Ke.cancel("No changes."),{success:!0,cancelled:!0};let p=d,m=await zn.setEnabled(e,p,t.map(v=>v.name)),g=n(t.filter(v=>p.includes(v.name))),w=g-o;if(m.nowDenied.length===0&&m.nowAllowed.length===0)return Ke.outro(Qt.dim("No changes.")),{success:!0,unchanged:!0};let x=[];m.nowDenied.length>0&&x.push(Qt.red(`\u2717 denied (${m.nowDenied.length}): ${m.nowDenied.join(", ")}`)),m.nowAllowed.length>0&&x.push(Qt.green(`\u2713 allowed (${m.nowAllowed.length}): ${m.nowAllowed.join(", ")}`));let C=w>0?"+":"";return x.push(""),x.push(`Tools loaded: ${o} \u2192 ${g} (${Qt.bold(`${C}${w}`)})`),Ke.note(x.join(`
1031
1031
  `),`Wrote ${this.relativeSettingsPath(m.settingsPath,e)}`),Ke.outro(Qt.yellow("Restart Claude Code to apply (MCP config is cached at session start).")),{success:!0,...m,beforeTools:o,afterTools:g}}catch(t){let n=y(t);return G(n)}}optionLabel(e,t){let n=e.estimatedTools>0?Qt.dim(` ~${e.estimatedTools} tools`):"";return`${Qt.dim(`[${t}]`)} ${e.displayName}${n}`}relativeSettingsPath(e,t){return e.startsWith(t)?e.slice(t.length+1):e}async list(e,t){try{let n=await zn.list(e);return t.md?console.log(this.formatMd(n,!1)):this.formatTerminal(n,!1),{success:!0,servers:n}}catch(n){let r=y(n);return G(r)}}async status(e,t){try{let r=(await zn.list(e)).filter(o=>o.denied);return t.md?console.log(this.formatMd(r,!0)):this.formatTerminal(r,!0),{success:!0,denied:r}}catch(n){let r=y(n);return G(r)}}async deny(e,t,n){if(!e)return f.fail("Usage: prjct mcp deny <serverName>"),{success:!1,error:"Missing serverName"};try{let r=await zn.deny(t,e),o=r.alreadyDenied?"already denied":"denied",i=`${e} ${o} in this project`;return n.md?console.log($(U("Done",i),U("What to do next",this.restartHint(r.settingsPath)))):(f.done(i),console.log(this.restartHint(r.settingsPath))),{success:!0,...r}}catch(r){let o=y(r);return G(o)}}async allow(e,t,n){if(!e)return f.fail("Usage: prjct mcp allow <serverName>"),{success:!1,error:"Missing serverName"};try{let r=await zn.allow(t,e),o=r.wasDenied?`${e} re-allowed in this project`:`${e} was not denied \u2014 nothing to change`;return n.md?console.log($(U("Done",o),r.wasDenied?U("What to do next",this.restartHint(r.settingsPath)):null)):(f.done(o),r.wasDenied&&console.log(this.restartHint(r.settingsPath))),{success:!0,...r}}catch(r){let o=y(r);return G(o)}}formatTerminal(e,t){if(e.length===0){t?f.info("No MCP servers denied in this project."):f.info("No MCP servers detected.");return}let n=e.filter(o=>o.denied).reduce((o,i)=>o+i.estimatedTools,0),r=e.filter(o=>!o.denied).reduce((o,i)=>o+i.estimatedTools,0);t||console.log(`
1032
1032
  MCP servers \u2014 this project (${process.cwd().split("/").pop()})
1033
1033
  `);for(let o of e){let i=o.denied?"\u2717 DENIED":"\u2713 active",a=o.estimatedTools>0?` ~${o.estimatedTools} tools`:"";console.log(` ${i.padEnd(10)} [${o.source}] ${o.displayName}${a}`),console.log(` ${o.description}`),console.log(` name: ${o.name}`)}t||(console.log(""),console.log(`Estimated tools loaded: ${r} (denied: ${n})`),console.log(""),console.log("Toggle in this project (does NOT affect other projects):"),console.log(" prjct mcp deny <name> # silence here, keep elsewhere"),console.log(" prjct mcp allow <name> # re-enable here"),console.log(""),console.log("Cloud MCPs come from your claude.ai connected apps. To see one"),console.log("here, it must already be connected in claude.ai. To disable it"),console.log("globally, disconnect it in claude.ai settings."))}formatMd(e,t){if(e.length===0)return`${t?"# MCP status \u2014 this project":"# MCP servers \u2014 this project"}
@@ -1039,11 +1039,11 @@ Nothing to show.
1039
1039
  Types: ${Cs.join(" | ")}`),{success:!1,error:"Missing args"};let o=mC(e);if(!o.ok)return G(o.error);let{type:i,content:a}=o,l=Nr(a);if(l.length>0&&!n.force){let g=l.join(", ");return f.fail(`refusing to store memory that looks like a secret (${g}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=pC(n.tags),d=await fe(t);if(!d.ok)return d.result;let p=await B.getCurrentTask(d.value);await Ne.remember(t,{type:i,content:a,tags:u,source:p?.id});let{regenerateWikiDeferred:m}=await Promise.resolve().then(()=>(Fr(),Lr));return await m(t,d.value),n.md?console.log(`\u2713 remembered ${i}: ${a}`):f.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:u}}catch(r){let o=y(r);return G(o)}}};function dC(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(dC,"parseTagPairs");function pC(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(pC,"parseFlagTags");function mC(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: ${Cs.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(mC,"parseRememberArgs");async function gC(s,e){try{let{default:t}=await Promise.resolve().then(()=>(te(),_d)),n=t.query(s,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${Es}`);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(gC,"readLastStatus");hl();vl();F();xe();ke();Be();var Bs=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>...]
1040
1040
  Available: ${fl.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await wl(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=y(r);return G(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 kl(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=y(r);return G(o)}}async list(e=null,t=process.cwd(),n={}){try{let r=await Sl(t);if(r.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${fl.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(`
1041
1041
  `))}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=y(r);return G(o)}}async suggest(e=null,t=process.cwd(),n={}){try{let r=await yl(t),o=r.map(i=>{let a=Hn[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(`
1042
- `))}else f.info(`Suggested: ${r.join(", ")}`),f.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=y(r);return G(o)}}};Lt();Ce();De();Lo();ms();import RC from"node:fs/promises";import xC from"node:http";import AC from"node:path";import z from"chalk";Ho();ms();var fC={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function hC(s){return s.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}c(hC,"camelToSnake");function yC(s){let e={};for(let[t,n]of Object.entries(s))e[hC(t)]=n;return e}c(yC,"snakeCaseKeys");function wC(s,e){let[t,n]=e.type.split("."),r=fC[t];if(!r)return null;let i=n==="deleted"?"delete":"upsert",a=e.data||{},l=yC(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(wC,"mapCliEventToWebFormat");function vy(s,e){return e.map(t=>wC(s,t)).filter(t=>t!==null)}c(vy,"mapCliEventsToWebFormat");var hu=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=vy(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(),Ss("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 Le.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Le.getApiUrl(),Le.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,n=0){let r=new AbortController,o=setTimeout(()=>r.abort(),Ss("API_REQUEST"));try{let i=await fetch(e,{...t,signal:r.signal});if(clearTimeout(o),i.status>=500&&n<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,n+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ss("API_REQUEST")}ms)`);if(n<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.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))}},Gs=new hu;bo();ms();qo();var by={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 Nn.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 Nn.update(s,n=>({...n,ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r)}))}};Mn();var Ty={async upsert(s,e){let t=e.id||"";if(!t){await Ve.addTask(s,{description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"});return}await Ve.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 Ve.update(s,n=>({...n,tasks:n.tasks.filter(r=>r.id!==t)}))}};vs();var yu={async upsert(s,e){await Ft.addShipped(s,{name:e.name||e.title||"",version:e.version||"",description:e.description||""})},async delete(s,e){}};Mn();Ze();var Ey={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.status||"";if(n==="completed"||n==="shipped"){await B.update(s,r=>r.currentTask?.id===t?{...r,currentTask:null}:r);return}if(n==="active"||e.started_at||e.startedAt){await B.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 Ve.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 B.update(s,n=>n.currentTask?.id===t?{...n,currentTask:null}:n)}};var wu={tasks:Ey,ideas:by,queue_tasks:Ty,shipped_items:yu,shipped_features:yu},rH=Object.keys(wu),Cy=new Set(["roadmap_features","projects","sessions","agents"]);te();ee();function Py(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(Py,"getApplied");function Ry(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)
1042
+ `))}else f.info(`Suggested: ${r.join(", ")}`),f.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=y(r);return G(o)}}};Lt();Ce();De();Lo();ms();import RC from"node:fs/promises";import xC from"node:http";import AC from"node:path";import z from"chalk";Ho();ms();var fC={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function hC(s){return s.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}c(hC,"camelToSnake");function yC(s){let e={};for(let[t,n]of Object.entries(s))e[hC(t)]=n;return e}c(yC,"snakeCaseKeys");function wC(s,e){let[t,n]=e.type.split("."),r=fC[t];if(!r)return null;let i=n==="deleted"?"delete":"upsert",a=e.data||{},l=yC(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(wC,"mapCliEventToWebFormat");function vy(s,e){return e.map(t=>wC(s,t)).filter(t=>t!==null)}c(vy,"mapCliEventsToWebFormat");var hu=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=vy(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(),Ss("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 Le.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Le.getApiUrl(),Le.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,n=0){let r=new AbortController,o=setTimeout(()=>r.abort(),Ss("API_REQUEST"));try{let i=await fetch(e,{...t,signal:r.signal});if(clearTimeout(o),i.status>=500&&n<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,n+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ss("API_REQUEST")}ms)`);if(n<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.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))}},Gs=new hu;bo();ms();qo();var by={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 Nn.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 Nn.update(s,n=>({...n,ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r)}))}};Mn();var Ty={async upsert(s,e){let t=e.id||"";if(!t){await Ve.addTask(s,{description:e.description||"",priority:e.priority||"medium",type:e.type||"feature",section:e.section||"backlog"});return}await Ve.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 Ve.update(s,n=>({...n,tasks:n.tasks.filter(r=>r.id!==t)}))}};vs();var yu={async upsert(s,e){await Ft.addShipped(s,{name:e.name||e.title||"",version:e.version||"",description:e.description||""})},async delete(s,e){}};Mn();Ze();var Ey={async upsert(s,e){let t=e.id||"";if(!t)return;let n=e.status||"";if(n==="completed"||n==="shipped"){await B.update(s,r=>r.currentTask?.id===t?{...r,currentTask:null}:r);return}if(n==="active"||e.started_at||e.startedAt){await B.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 Ve.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 B.update(s,n=>n.currentTask?.id===t?{...n,currentTask:null}:n)}};var wu={tasks:Ey,ideas:by,queue_tasks:Ty,shipped_items:yu,shipped_features:yu},rH=Object.keys(wu),Cy=new Set(["roadmap_features","projects","sessions","agents"]);te();ee();function Py(s,e,t){if(!e||!t)return null;try{return T.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(Py,"getApplied");function Ry(s,e,t,n){if(!(!e||!t||!n))try{T.run(s,`INSERT INTO sync_applied_hashes (entity_type, entity_id, content_hash, applied_at)
1043
1043
  VALUES (?, ?, ?, ?)
1044
1044
  ON CONFLICT(entity_type, entity_id) DO UPDATE SET
1045
1045
  content_hash = excluded.content_hash,
1046
- applied_at = excluded.applied_at`,e,t,n,k())}catch{}}c(Ry,"recordApplied");function xy(s,e,t){if(!(!e||!t))try{E.run(s,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}c(xy,"clearApplied");var _y=new Set;function SC(s){if(_y.has(s))return;_y.add(s);let t=Cy.has(s)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${s}' (${t}). code=no_local_handler`)}c(SC,"warnNoLocalHandler");function vC(s){let e=s.data??{},t=s.content_hash??s.contentHash;if(s.entity_type){let a=(s.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:s.entity_type,eventType:a,data:e,contentHash:t}}if(s.entityType){let a=s.eventType||"upsert";return{entityType:s.entityType,eventType:a==="delete"?"delete":"upsert",data:e,contentHash:t}}let[n,r]=(s.type||"").split("."),o={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"},i=r==="deleted"||r==="archived"||r==="removed";return{entityType:o[n]||n||"unknown",eventType:i?"delete":"upsert",data:e,contentHash:t}}c(vC,"normalizeEventShape");var Su=class{static{c(this,"SyncManager")}async hasAuth(){return await Le.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Gs.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},n=await this.push(e);n.success&&!n.skipped&&(t.pushed={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()});let r=await this.pull(e);return r.success&&!r.skipped&&(t.pulled={count:r.count||0,syncedAt:r.syncedAt||new Date().toISOString()}),(!n.success||!r.success)&&(t.success=!1,t.error=n.error||r.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await $t.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let n=await this.createProjectLinkEvent(e),r=n?[n,...t]:t,o=await Gs.pushEvents(e,r);if(o.success)return await $t.clearPending(e),await $t.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,l=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${l}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(jy(),Ay)),n=await Le.read(),r=n.deviceId??null,o=n.userId??null,a=(r?t.get(e,o,r):null)?.lastEventId??0,l=await Gs.pullEvents(e,a);if(l.events.length===0)return await $t.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=a;for(let p of l.events){let m=[p.event_id,p.eventId];for(let g of m)typeof g=="number"&&g>d&&(d=g)}return r&&d>a&&t.advance(e,d,{userId:o,deviceId:r}),await $t.updateLastSync(e),{success:!0,skipped:!1,count:l.events.length,applied:u,syncedAt:l.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let n=0;for(let r of t)try{await this.applyEvent(e,r),n++}catch(o){let i=r.entity_type||r.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return n}async applyEvent(e,t){let{entityType:n,eventType:r,data:o,contentHash:i}=vC(t),a=o.id??"",l=wu[n];if(!l){SC(n);return}if(r==="delete"){await l.delete(e,o),a&&xy(e,n,a);return}i&&this.alreadyApplied(e,n,a,i)||(await l.upsert(e,o),i&&a&&Ry(e,n,a,i))}alreadyApplied(e,t,n,r){if(!n)return!1;let o=Py(e,t,n);return o!==null&&o===r}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},bC=new Su,Dy=bC;F();Ue();J();F();J();import EC from"node:fs/promises";import $y from"node:os";import Wi from"node:path";Pa();import Iy from"node:fs";import Ui from"node:path";var vu=class{static{c(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ui.resolve(e):Ui.join(ct("node:os").homedir(),".prjct-cli");this.dbPath=Ui.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ui.dirname(this.dbPath);Iy.existsSync(e)||Iy.mkdirSync(e,{recursive:!0});let t=ho(this.dbPath);return t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
1046
+ applied_at = excluded.applied_at`,e,t,n,k())}catch{}}c(Ry,"recordApplied");function xy(s,e,t){if(!(!e||!t))try{T.run(s,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}c(xy,"clearApplied");var _y=new Set;function SC(s){if(_y.has(s))return;_y.add(s);let t=Cy.has(s)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${s}' (${t}). code=no_local_handler`)}c(SC,"warnNoLocalHandler");function vC(s){let e=s.data??{},t=s.content_hash??s.contentHash;if(s.entity_type){let a=(s.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:s.entity_type,eventType:a,data:e,contentHash:t}}if(s.entityType){let a=s.eventType||"upsert";return{entityType:s.entityType,eventType:a==="delete"?"delete":"upsert",data:e,contentHash:t}}let[n,r]=(s.type||"").split("."),o={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"},i=r==="deleted"||r==="archived"||r==="removed";return{entityType:o[n]||n||"unknown",eventType:i?"delete":"upsert",data:e,contentHash:t}}c(vC,"normalizeEventShape");var Su=class{static{c(this,"SyncManager")}async hasAuth(){return await Le.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Gs.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},n=await this.push(e);n.success&&!n.skipped&&(t.pushed={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()});let r=await this.pull(e);return r.success&&!r.skipped&&(t.pulled={count:r.count||0,syncedAt:r.syncedAt||new Date().toISOString()}),(!n.success||!r.success)&&(t.success=!1,t.error=n.error||r.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await $t.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let n=await this.createProjectLinkEvent(e),r=n?[n,...t]:t,o=await Gs.pushEvents(e,r);if(o.success)return await $t.clearPending(e),await $t.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,l=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${l}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(jy(),Ay)),n=await Le.read(),r=n.deviceId??null,o=n.userId??null,a=(r?t.get(e,o,r):null)?.lastEventId??0,l=await Gs.pullEvents(e,a);if(l.events.length===0)return await $t.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=a;for(let p of l.events){let m=[p.event_id,p.eventId];for(let g of m)typeof g=="number"&&g>d&&(d=g)}return r&&d>a&&t.advance(e,d,{userId:o,deviceId:r}),await $t.updateLastSync(e),{success:!0,skipped:!1,count:l.events.length,applied:u,syncedAt:l.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let n=0;for(let r of t)try{await this.applyEvent(e,r),n++}catch(o){let i=r.entity_type||r.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return n}async applyEvent(e,t){let{entityType:n,eventType:r,data:o,contentHash:i}=vC(t),a=o.id??"",l=wu[n];if(!l){SC(n);return}if(r==="delete"){await l.delete(e,o),a&&xy(e,n,a);return}i&&this.alreadyApplied(e,n,a,i)||(await l.upsert(e,o),i&&a&&Ry(e,n,a,i))}alreadyApplied(e,t,n,r){if(!n)return!1;let o=Py(e,t,n);return o!==null&&o===r}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},bC=new Su,Dy=bC;F();Ue();J();F();J();import EC from"node:fs/promises";import $y from"node:os";import Wi from"node:path";Pa();import Iy from"node:fs";import Ui from"node:path";var vu=class{static{c(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ui.resolve(e):Ui.join(ct("node:os").homedir(),".prjct-cli");this.dbPath=Ui.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ui.dirname(this.dbPath);Iy.existsSync(e)||Iy.mkdirSync(e,{recursive:!0});let t=ho(this.dbPath);return t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
1047
1047
  CREATE TABLE IF NOT EXISTS _system_migrations (
1048
1048
  version INTEGER PRIMARY KEY,
1049
1049
  name TEXT NOT NULL,
@@ -1247,7 +1247,7 @@ Each reviewer SHOULD use the Read tool on these paths (cap 10 per reviewer) to g
1247
1247
  ## Codebase paths
1248
1248
  _No path-shaped scope entries found. Reviewers judge the spec body alone._`;return[`# audit-spec dispatch \u2014 ${e}`,"",`Spec id: \`${s}\``,"","Run three review subagents IN PARALLEL via the Agent tool \u2014 one tool-use block per reviewer, all in the SAME message so they run concurrently. Each subagent reads the spec body, reads the relevant codebase paths, applies its rubric, then returns a structured verdict.",o,"","## Reviewer A \u2014 strategic (scope sanity)",'Subagent prompt: "Review this spec for strategic soundness. Does it solve a real problem? Is the goal worth the cost? Is out_of_scope coherent with goal? Is the spec OVER- or UNDER-scoped? Cross-reference relevant prior memory if available (decisions tagged by domain). Return verdict (pass|fail) and 2-4 sentence notes."',"","## Reviewer B \u2014 architecture (eng feasibility)",'Subagent prompt: "Review this spec for engineering feasibility. Read the codebase paths listed above (Read tool, cap 10 files). Can this be built ON TOP of what exists? Does the spec contradict an existing state machine, schema, or contract? What failure modes / dependencies / edge cases are missing? Include a short ASCII diagram + cite at least one concrete symbol from the codebase in notes when applicable. Return verdict (pass|fail) and 2-4 sentence notes."',"","## Reviewer C \u2014 design (UX/DX)",'Subagent prompt: "Review this spec for design quality. Rate 0-10 across {clarity, ergonomics, consistency, accessibility} for the user-facing or developer-facing surface. If scope touches existing UI/CLI patterns (read the listed paths), consistency must be judged against those \u2014 not against your priors. Return verdict (pass if all dimensions \u22656, fail otherwise) + the four scores."',"","## Spec body (verbatim, pass to each reviewer)","```json",n,"```","","## After dispatch","For each reviewer that returns:",` prjct spec record-review ${s} --reviewer <strategic|architecture|design> --verdict <pass|fail> --notes "<their notes>"`,"","When all three are recorded, the spec auto-promotes from `draft` \u2192 `reviewed`."].join(`
1249
1249
  `)}c(GC,"renderAuditDispatch");function VC(s){let e=[];for(let t of s){let n=t.match(/[a-zA-Z0-9_./-]+\.[a-zA-Z]+/)??t.match(/[a-zA-Z0-9_./-]+\//);if(n&&!e.includes(n[0])&&e.push(n[0]),e.length>=12)break}return e}c(VC,"extractScopePaths");Ce();gt();pi();F();J();xe();ze();ke();pt();Be();import{exec as JC}from"node:child_process";import Yn from"node:fs/promises";import Xs from"node:path";import{promisify as qC}from"node:util";var Pu=qC(JC),Hy="<!-- prjct-team:start - DO NOT REMOVE THIS MARKER -->",By="<!-- prjct-team:end - DO NOT REMOVE THIS MARKER -->";function Ru(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)}
1250
- `}c(Ru,"renderTeamMirror");var zs=class extends se{static{c(this,"TeamCommands")}async team(e=null,t=process.cwd(),n={}){if(e==="check")return this.check(t,n);try{let r={required:n.required===!0,minVersion:n.minVersion??he??"0.0.0",enrolledAt:new Date().toISOString(),enrolledBy:null},o=Xs.join(t,".prjct","team.json"),i=Xs.join(t,".claude","CLAUDE.md"),a=await this.ensureProjectInit(t);if(!a.success)return a;let l=await W.getProjectId(t);if(!l)return G("No prjct project. Run `prjct init` first.",n);Ts.set(l,r);try{await os(o,Ru(r))}catch(j){let T=y(j);await Ne.remember(t,{type:"inbox",content:`team.json mirror write failed: ${T}`,tags:{"mirror-drift":"1"},provenance:"declared"}).catch(()=>{})}await Yn.mkdir(Xs.dirname(i),{recursive:!0});let u=KC(r),d="";try{d=await Yn.readFile(i,"utf-8")}catch{}let p=YC(d,u,Hy,By);await Yn.writeFile(i,p,"utf-8");let m=!1,g=[o,i];try{await Pu("git rev-parse --show-toplevel",{cwd:t});let j=null;n.enforce===!0&&(j=Xs.join(t,".githooks","pre-commit"),await Yn.mkdir(Xs.dirname(j),{recursive:!0}),await Yn.writeFile(j,zC,"utf-8"),await Yn.chmod(j,493),await Pu("git config core.hooksPath .githooks",{cwd:t}),g.push(j)),await Pu(`git add ${g.map(T=>JSON.stringify(T)).join(" ")}`,{cwd:t}),m=!0}catch{}let w=n.enforce?" + pre-commit enforce":"",x=`${r.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${w} \u2014 minVersion ${r.minVersion}`,C=m?`Staged: ${g.map(j=>j.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",v=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...n.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
1250
+ `}c(Ru,"renderTeamMirror");var zs=class extends se{static{c(this,"TeamCommands")}async team(e=null,t=process.cwd(),n={}){if(e==="check")return this.check(t,n);try{let r={required:n.required===!0,minVersion:n.minVersion??he??"0.0.0",enrolledAt:new Date().toISOString(),enrolledBy:null},o=Xs.join(t,".prjct","team.json"),i=Xs.join(t,".claude","CLAUDE.md"),a=await this.ensureProjectInit(t);if(!a.success)return a;let l=await W.getProjectId(t);if(!l)return G("No prjct project. Run `prjct init` first.",n);Ts.set(l,r);try{await os(o,Ru(r))}catch(j){let E=y(j);await Ne.remember(t,{type:"inbox",content:`team.json mirror write failed: ${E}`,tags:{"mirror-drift":"1"},provenance:"declared"}).catch(()=>{})}await Yn.mkdir(Xs.dirname(i),{recursive:!0});let u=KC(r),d="";try{d=await Yn.readFile(i,"utf-8")}catch{}let p=YC(d,u,Hy,By);await Yn.writeFile(i,p,"utf-8");let m=!1,g=[o,i];try{await Pu("git rev-parse --show-toplevel",{cwd:t});let j=null;n.enforce===!0&&(j=Xs.join(t,".githooks","pre-commit"),await Yn.mkdir(Xs.dirname(j),{recursive:!0}),await Yn.writeFile(j,zC,"utf-8"),await Yn.chmod(j,493),await Pu("git config core.hooksPath .githooks",{cwd:t}),g.push(j)),await Pu(`git add ${g.map(E=>JSON.stringify(E)).join(" ")}`,{cwd:t}),m=!0}catch{}let w=n.enforce?" + pre-commit enforce":"",x=`${r.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${w} \u2014 minVersion ${r.minVersion}`,C=m?`Staged: ${g.map(j=>j.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",v=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...n.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
1251
1251
  `);return n.md?console.log($(U("Team mode enrolled",x),U("Files",C),U("Next",v))):(f.done(x),console.log(C),console.log(`
1252
1252
  Next steps:`),console.log(v)),{success:!0,teamConfig:r,staged:m,teamPath:o,claudeMdPath:i}}catch(r){let o=y(r);return G(o)}}async check(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await W.getProjectId(e);if(!r)return G("No prjct project. Run `prjct init` first.",t);let o=Xs.join(e,".prjct","team.json"),i=Ts.get(r),a=null;try{a=await Yn.readFile(o,"utf-8")}catch{a=null}if(i===null&&a!==null){let u;try{u=JSON.parse(a)}catch{return O(`cannot parse ${o} \u2014 fix or delete the file before running team check again`,t)}let d={required:typeof u.required=="boolean"?u.required:!1,minVersion:typeof u.minVersion=="string"?u.minVersion:he??"0.0.0",enrolledAt:typeof u.enrolledAt=="string"?u.enrolledAt:new Date().toISOString(),enrolledBy:typeof u.enrolledBy=="string"?u.enrolledBy:null};Ts.set(r,d),await os(o,Ru(d));let p="\u2713 team check: migrated disk \u2192 DB; mirror rewritten";return t.md?console.log(`> ${p}`):f.done(p),{success:!0,healed:!0,migrated:!0}}if(i!==null){let u=ui(i);if((a===null?null:XC(a,i))===u){let m="\u2713 team check: mirror in sync";return t.md?console.log(`> ${m}`):f.done(m),{success:!0,healed:!1}}await os(o,Ru(i));let p="\u2713 team check: drift detected; mirror rewritten from DB";return t.md?console.log(`> ${p}`):f.done(p),{success:!0,healed:!0}}let l="\u2713 team check: no enrollment configured";return t.md?console.log(`> ${l}`):f.done(l),{success:!0,healed:!1,empty:!0}}catch(n){return G(y(n),t)}}};function XC(s,e){let t;try{t=JSON.parse(s)}catch{return null}let n=t,r={required:n.required===!0,minVersion:typeof n.minVersion=="string"?n.minVersion:"",enrolledAt:typeof n.enrolledAt=="string"?n.enrolledAt:"",enrolledBy:typeof n.enrolledBy=="string"?n.enrolledBy:e.enrolledBy};return ui(r)}c(XC,"canonicalizeDiskTeamJson");var zC=`#!/usr/bin/env sh
1253
1253
  # prjct team enforce \u2014 blocks commits when team.json says required:true
@@ -1282,10 +1282,10 @@ exit 0
1282
1282
 
1283
1283
  ${e}
1284
1284
  `}c(YC,"upsertBetweenMarkers");Lt();lc();De();cl();hc();F();xe();ke();pt();Be();import{execSync as Zy}from"node:child_process";import ju from"node:fs/promises";import _u from"node:path";ke();import Ks from"chalk";function Gy(s,e){let t=s.phase1.success&&s.phase2.success,n=[...s.phase1.errors,...s.phase2.errors];console.log("");let r=[{label:"Package",result:s.phase1,fatal:!0},{label:"Cleanup",result:s.phase2,fatal:!0},{label:"Daemon",result:s.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of r){let l=i.success?Ks.green("\u2713"):a?Ks.red("\u2717"):Ks.yellow("\u26A0");console.log(` ${l} ${Ks.bold(o)}`);for(let u of i.details)console.log(` ${Ks.dim(u)}`);for(let u of i.errors)console.log(` ${Ks.yellow("\u26A0")} ${u}`)}return console.log(""),e?f.done("Dry run complete \u2014 no changes made"):t?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}c(Gy,"formatTerminalOutput");function Vy(s,e){let t=s.phase1.success&&s.phase2.success,n=[];n.push(e?"# Update (Dry Run)":"# System Update"),n.push("");let r=[{label:"Package Update",result:s.phase1,fatal:!0},{label:"Global Cleanup",result:s.phase2,fatal:!0},{label:"Daemon Restart",result:s.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of r){let l=i.success?"OK":a?"FAILED":"WARNING";n.push(`## ${o} (${l})`);for(let u of i.details)n.push(`- ${u}`);for(let u of i.errors)n.push(`- WARNING: ${u}`);n.push("")}return e||n.push(t?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1285
- `)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}c(Vy,"formatMdOutput");pt();import{execSync as Hr}from"node:child_process";import QC from"node:os";import Qn from"node:path";var ZC=QC.homedir(),Ut={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Hr("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Hr("pnpm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>Qn.join(ZC,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:c(()=>{try{let s=Hr("yarn global dir",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return Qn.join(s,"node_modules")}catch{return null}},"getInstallRoot")}};function xu(){try{return!!Hr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}c(xu,"isHomebrewInstall");function Hi(s){try{return Hr(`command -v ${s}`,{stdio:"pipe",shell:"/bin/sh"}),!0}catch{return!1}}c(Hi,"isOnPath");function eP(){let s=[process.argv[1],process.execPath].filter(Boolean);for(let e of s){let t=e;try{t=ct("node:fs").realpathSync(e)}catch{}if(t.includes("/.bun/install/global")||t.includes("/.bun/bin/"))return"bun";if(t.includes("/Library/pnpm/")||t.includes("/.pnpm/")||t.includes("/.local/share/pnpm/"))return"pnpm";if(t.includes("/.yarn/")||t.includes("/yarn/global"))return"yarn"}return null}c(eP,"detectInstallerFromRunningBinary");function Bi(){let s=eP();if(s&&Hi(s))return Ut[s];for(let e of["bun","pnpm","npm","yarn"])if(Hi(e))return Ut[e];throw new Error("No supported package manager found in PATH (tried npm, pnpm, bun, yarn). Install one and re-run, or upgrade manually: bun add -g prjct-cli@latest")}c(Bi,"selectPackageManager");function Au(){let s=[];for(let e of[Ut.bun,Ut.pnpm,Ut.npm,Ut.yarn]){let t=e.getInstallRoot();if(!t)continue;let n=Qn.join(t,"prjct-cli","package.json");try{let r=JSON.parse(ct("node:fs").readFileSync(n,"utf-8"));r?.name==="prjct-cli"&&typeof r.version=="string"&&s.push({pm:e,version:r.version})}catch{}}return s}c(Au,"getAllInstalledLocations");function Jy(){try{let{existsSync:s,realpathSync:e,readFileSync:t}=ct("node:fs"),n=(()=>{try{return e(Qn.resolve(__dirname,"..","..",".."))}catch{return""}})(),r=[Ut.bun.getInstallRoot(),Ut.pnpm.getInstallRoot(),Ut.npm.getInstallRoot(),Ut.yarn.getInstallRoot()].filter(o=>!!o);for(let o of r){let i=Qn.join(o,"prjct-cli"),a=Qn.join(i,"package.json");if(!s(a))continue;let l=i;try{l=e(i)}catch{}if(n&&l===n)continue;try{if(JSON.parse(t(Qn.join(l,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}aa(l);let{resetBundle:u}=(Dn(),wt(Qa));u();return}}catch{}}c(Jy,"redirectToInstalledPackage");var Qs=class extends se{static{c(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,r=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(r||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(n),r||f.stop(),!n&&o.phase1.success&&Jy(),r||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(n),r||f.stop(),r||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(n),r||f.stop(),!n){try{await Bo.updateVersion(he)}catch{}try{await new Si().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?Vy(o,n):Gy(o,n)}catch(i){return r||f.stop(),f.fail(y(i)),be(i)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=Au();if(e){if(xu()){let o;try{o=Bi().name}catch(i){o="<none-available>",t.errors.push(y(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(n.length===0){let o;try{o=Bi().name}catch(i){o="<none-available>",t.errors.push(y(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of n)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(xu())try{Zy("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;n.length>0?o=n.map(u=>u.pm):o=[Bi()];for(let u of o){if(!Hi(u.name)){t.errors.push(`${u.name} is not on PATH but has a prjct-cli install. Either install ${u.name} or remove that copy.`);continue}try{Zy([u.name,...u.installArgs].join(" "),{stdio:"pipe"}),t.details.push(`${u.name} install complete`)}catch(d){t.errors.push(`${u.name}: ${y(d)}`)}}let i=Au(),a=new Map(n.map(u=>[u.pm.name,u.version])),l=[];for(let{pm:u,version:d}of i){let p=a.get(u.name);p&&p!==d?l.push(`${u.name}: ${p} \u2192 ${d}`):p||l.push(`${u.name}: installed v${d}`)}if(l.length>1)for(let u of l)t.details.push(u);else l.length===1?t.details.push(l[0]):i.length>0&&t.details.push(`v${i[0].version} (already latest)`)}catch(r){t.success=!1,t.errors.push(y(r))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},n=await this.getAllProjectIds();if(n.length===0)t.details.push("No projects found");else{let r=0,o=0;for(let i of n)if(!e)try{let a=await Yo(i),l=await Qo(i);if(r+=a.migratedFiles.length,o+=l,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${n.length} project(s)`);else{let i=[`${n.length} project(s) checked`];r>0&&i.push(`${r} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Mt().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(r){t.errors.push(`Legacy cleanup: ${y(r)}`)}try{let o=await new Mt().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(r){t.errors.push(`Commands: ${y(r)}`)}try{await new Mt().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(r){t.errors.push(`Global config: ${y(r)}`)}try{let{detectAllProviders:r}=await Promise.resolve().then(()=>(Ye(),It)),o=await r(),i=_u.join(ct("node:os").homedir());if(o.gemini.installed){let a=_u.join(i,".gemini","GEMINI.md");try{let l=await ju.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(l.includes(u)&&l.includes(d)){let{getTemplateContent:p}=await Promise.resolve().then(()=>(Dn(),Qa)),m=p("global/GEMINI.md");if(m?.includes(u)&&m.includes(d)){let g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),w=l.substring(0,l.indexOf(u)),x=l.substring(l.indexOf(d)+d.length),C=w+g+x,v="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",j="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(C.includes(v)&&C.includes(j)){let T=C.substring(0,C.indexOf(v)),L=C.substring(C.indexOf(j)+j.length);C=`${(T+L).replace(/\n{3,}/g,`
1285
+ `)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}c(Vy,"formatMdOutput");pt();import{execSync as Hr}from"node:child_process";import QC from"node:os";import Qn from"node:path";var ZC=QC.homedir(),Ut={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Hr("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Hr("pnpm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>Qn.join(ZC,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:c(()=>{try{let s=Hr("yarn global dir",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return Qn.join(s,"node_modules")}catch{return null}},"getInstallRoot")}};function xu(){try{return!!Hr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}c(xu,"isHomebrewInstall");function Hi(s){try{return Hr(`command -v ${s}`,{stdio:"pipe",shell:"/bin/sh"}),!0}catch{return!1}}c(Hi,"isOnPath");function eP(){let s=[process.argv[1],process.execPath].filter(Boolean);for(let e of s){let t=e;try{t=ct("node:fs").realpathSync(e)}catch{}if(t.includes("/.bun/install/global")||t.includes("/.bun/bin/"))return"bun";if(t.includes("/Library/pnpm/")||t.includes("/.pnpm/")||t.includes("/.local/share/pnpm/"))return"pnpm";if(t.includes("/.yarn/")||t.includes("/yarn/global"))return"yarn"}return null}c(eP,"detectInstallerFromRunningBinary");function Bi(){let s=eP();if(s&&Hi(s))return Ut[s];for(let e of["bun","pnpm","npm","yarn"])if(Hi(e))return Ut[e];throw new Error("No supported package manager found in PATH (tried npm, pnpm, bun, yarn). Install one and re-run, or upgrade manually: bun add -g prjct-cli@latest")}c(Bi,"selectPackageManager");function Au(){let s=[];for(let e of[Ut.bun,Ut.pnpm,Ut.npm,Ut.yarn]){let t=e.getInstallRoot();if(!t)continue;let n=Qn.join(t,"prjct-cli","package.json");try{let r=JSON.parse(ct("node:fs").readFileSync(n,"utf-8"));r?.name==="prjct-cli"&&typeof r.version=="string"&&s.push({pm:e,version:r.version})}catch{}}return s}c(Au,"getAllInstalledLocations");function Jy(){try{let{existsSync:s,realpathSync:e,readFileSync:t}=ct("node:fs"),n=(()=>{try{return e(Qn.resolve(__dirname,"..","..",".."))}catch{return""}})(),r=[Ut.bun.getInstallRoot(),Ut.pnpm.getInstallRoot(),Ut.npm.getInstallRoot(),Ut.yarn.getInstallRoot()].filter(o=>!!o);for(let o of r){let i=Qn.join(o,"prjct-cli"),a=Qn.join(i,"package.json");if(!s(a))continue;let l=i;try{l=e(i)}catch{}if(n&&l===n)continue;try{if(JSON.parse(t(Qn.join(l,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}aa(l);let{resetBundle:u}=(Dn(),wt(Qa));u();return}}catch{}}c(Jy,"redirectToInstalledPackage");var Qs=class extends se{static{c(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,r=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(r||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(n),r||f.stop(),!n&&o.phase1.success&&Jy(),r||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(n),r||f.stop(),r||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(n),r||f.stop(),!n){try{await Bo.updateVersion(he)}catch{}try{await new Si().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?Vy(o,n):Gy(o,n)}catch(i){return r||f.stop(),f.fail(y(i)),be(i)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=Au();if(e){if(xu()){let o;try{o=Bi().name}catch(i){o="<none-available>",t.errors.push(y(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(n.length===0){let o;try{o=Bi().name}catch(i){o="<none-available>",t.errors.push(y(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of n)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(xu())try{Zy("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;n.length>0?o=n.map(u=>u.pm):o=[Bi()];for(let u of o){if(!Hi(u.name)){t.errors.push(`${u.name} is not on PATH but has a prjct-cli install. Either install ${u.name} or remove that copy.`);continue}try{Zy([u.name,...u.installArgs].join(" "),{stdio:"pipe"}),t.details.push(`${u.name} install complete`)}catch(d){t.errors.push(`${u.name}: ${y(d)}`)}}let i=Au(),a=new Map(n.map(u=>[u.pm.name,u.version])),l=[];for(let{pm:u,version:d}of i){let p=a.get(u.name);p&&p!==d?l.push(`${u.name}: ${p} \u2192 ${d}`):p||l.push(`${u.name}: installed v${d}`)}if(l.length>1)for(let u of l)t.details.push(u);else l.length===1?t.details.push(l[0]):i.length>0&&t.details.push(`v${i[0].version} (already latest)`)}catch(r){t.success=!1,t.errors.push(y(r))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},n=await this.getAllProjectIds();if(n.length===0)t.details.push("No projects found");else{let r=0,o=0;for(let i of n)if(!e)try{let a=await Yo(i),l=await Qo(i);if(r+=a.migratedFiles.length,o+=l,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${n.length} project(s)`);else{let i=[`${n.length} project(s) checked`];r>0&&i.push(`${r} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Mt().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(r){t.errors.push(`Legacy cleanup: ${y(r)}`)}try{let o=await new Mt().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(r){t.errors.push(`Commands: ${y(r)}`)}try{await new Mt().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(r){t.errors.push(`Global config: ${y(r)}`)}try{let{detectAllProviders:r}=await Promise.resolve().then(()=>(Ye(),It)),o=await r(),i=_u.join(ct("node:os").homedir());if(o.gemini.installed){let a=_u.join(i,".gemini","GEMINI.md");try{let l=await ju.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(l.includes(u)&&l.includes(d)){let{getTemplateContent:p}=await Promise.resolve().then(()=>(Dn(),Qa)),m=p("global/GEMINI.md");if(m?.includes(u)&&m.includes(d)){let g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),w=l.substring(0,l.indexOf(u)),x=l.substring(l.indexOf(d)+d.length),C=w+g+x,v="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",j="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(C.includes(v)&&C.includes(j)){let E=C.substring(0,C.indexOf(v)),L=C.substring(C.indexOf(j)+j.length);C=`${(E+L).replace(/\n{3,}/g,`
1286
1286
 
1287
1287
  `).trim()}
1288
- `}await ju.writeFile(a,C,"utf-8"),t.details.push("Gemini global config updated")}}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Qy(),Yy));await n()?(await r()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)"));let a=await i();t.details.push(a?"Daemon restarted":"Daemon will start automatically on next use")}catch(n){t.success=!1,t.errors.push(y(n))}return t}async getAllProjectIds(){let e=_u.join(D.getGlobalBasePath(),"projects");try{return(await ju.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};Bt();Tl();Rr();Ze();F();ee();xe();ze();Pr();ke();Rl();Be();Yt();var iP=[{type:"help",patterns:/^help\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}];function ew(s){let e=s.trim();for(let{type:t,patterns:n}of iP){let r=e.match(n);if(r){let o=r[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}c(ew,"detectIntent");function Ji(s){let e=s.trim();if(e.startsWith('"')){let n=e.indexOf('"',1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}if(e.startsWith("'")){let n=e.indexOf("'",1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}c(Ji,"parseAction");function tw(s,e){let t=e.toLowerCase();return s.filter(n=>n.action.toLowerCase().includes(t)||(n.description?.toLowerCase().includes(t)??!1)||n.command.toLowerCase().includes(t)||String(n.id)===t)}c(tw,"searchRules");qt();xe();ze();var En={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0};Yt();var Du=["task","done","ship","sync"],nw=["before","after"];function qi(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}c(qi,"newRuleDefaults");async function rw(s,e,t){let[n,r]=Ji(s);if(!n||!r)return O('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=r.split(/\s+/),i=o[0]?.toLowerCase(),a=o[1]?.toLowerCase();if(!i||!nw.includes(i))return O('Position must be "before" or "after"',t);let l=Li(e,a,t);if(!l.ok)return l.result;let u=Z.addRule(e,{type:"hook",command:l.value.name,position:i,action:n,timeoutMs:En.HOOK_DEFAULT_MS,...qi()});return t.md?console.log($(me("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${n}\``),_e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):rt(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${n}`),{success:!0,ruleId:u}}c(rw,"workflowAdd");async function ow(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=Li(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),[i]=Ji(o);if(!i)return O('Usage: prjct workflow gate <command> "shell command"',t);let a=Z.addRule(e,{type:"gate",command:r.value.name,position:"before",action:i,timeoutMs:En.GATE_DEFAULT_MS,...qi()});return t.md?console.log($(me("Gate Added",`#${a} [gate] before ${r.value.name} \u2192 \`${i}\``),_e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):rt(`gate #${a} added: before ${r.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}c(ow,"workflowGate");async function iw(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=Li(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return O('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let a=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=Ji(l);if(!u)return O('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=Z.addRule(e,{type:"instruction",command:r.value.name,position:a,action:u,timeoutMs:En.INSTRUCTION_MS,...qi()});return t.md?console.log($(me("Instruction Added",`#${d} [instruction] ${a} ${r.value.name} \u2192 \`${u}\``),_e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):rt(`instruction #${d} added: ${a} ${r.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}c(iw,"workflowInstruction");async function aw(s,e,t){let n=parseInt(s.trim(),10);return Number.isNaN(n)?O("Usage: prjct workflow rm <rule-id>",t):Z.removeRule(e,n)?(t.md?console.log($(me("Rule Removed",`Removed rule #${n}`))):rt(`removed rule #${n}`),{success:!0}):O(`Rule #${n} not found`,t)}c(aw,"workflowRm");async function cw(s,e){let t=Z.resetRules(s),n=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log($(me("Rules Reset",n))):rt(`reset: ${n.toLowerCase()}`),{success:!0,count:t}}c(cw,"workflowReset");async function lw(s,e,t){let n=s.trim(),r=parseInt(n,10);if(!Number.isNaN(r)){let d=Z.getRuleById(e,r);if(!d)return O(`Rule #${r} not found`,t);if(!d.enabled){let p=`Rule #${r} is already disabled`;return t.md?console.log(`> ${p}`):Jt(p),{success:!0,message:p}}return Z.updateRule(e,r,{enabled:!1}),t.md?console.log($(me("Rule Disabled",`#${r} [${d.type}] ${d.action}`),_e([{label:"Re-enable this rule",command:`prjct workflow enable ${r} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):rt(`disabled rule #${r}: ${d.action}`),{success:!0,ruleId:r}}let o=Z.getAllRules(e),i=tw(o,n);if(i.length===0)return O(`No rules matching "${n}"`,t);if(i.length===1){let d=i[0];return Z.updateRule(e,d.id,{enabled:!1}),t.md?console.log($(me("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):rt(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let a=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=a.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log($(U("Multiple matches",`${i.length} rules match "${n}"`),Te(d),_e(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{Jt(`${i.length} rules match "${n}" \u2014 specify an ID:`);for(let d of a)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}c(lw,"workflowDisable");qt();xe();ze();function uw(s,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),n=e.filter(m=>m.type==="instruction"&&m.position==="before"),r=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=c((m,g,w)=>{let x=g.map(T=>` ${T.enabled?w:"o"} #${T.id} ${T.action}`),C=[m,...x],j=Math.max(...C.map(T=>T.length))+2;u.push(`+${"-".repeat(j)}+`);for(let T of C)u.push(`| ${T.padEnd(j-1)}|`);u.push(`+${"-".repeat(j)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),n.length>0&&(d("INSTRUCTIONS (before)",n,"\u{1F4CB}"),p(u)),r.length>0&&(d("HOOKS (before)",r,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${s.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1288
+ `}await ju.writeFile(a,C,"utf-8"),t.details.push("Gemini global config updated")}}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Qy(),Yy));await n()?(await r()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)"));let a=await i();t.details.push(a?"Daemon restarted":"Daemon will start automatically on next use")}catch(n){t.success=!1,t.errors.push(y(n))}return t}async getAllProjectIds(){let e=_u.join(D.getGlobalBasePath(),"projects");try{return(await ju.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};Bt();Tl();Rr();Ze();F();ee();xe();ze();Pr();ke();Rl();Be();Yt();var iP=[{type:"help",patterns:/^help\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}];function ew(s){let e=s.trim();for(let{type:t,patterns:n}of iP){let r=e.match(n);if(r){let o=r[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}c(ew,"detectIntent");function Ji(s){let e=s.trim();if(e.startsWith('"')){let n=e.indexOf('"',1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}if(e.startsWith("'")){let n=e.indexOf("'",1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}c(Ji,"parseAction");function tw(s,e){let t=e.toLowerCase();return s.filter(n=>n.action.toLowerCase().includes(t)||(n.description?.toLowerCase().includes(t)??!1)||n.command.toLowerCase().includes(t)||String(n.id)===t)}c(tw,"searchRules");qt();xe();ze();var En={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0};Yt();var Du=["task","done","ship","sync"],nw=["before","after"];function qi(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}c(qi,"newRuleDefaults");async function rw(s,e,t){let[n,r]=Ji(s);if(!n||!r)return O('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=r.split(/\s+/),i=o[0]?.toLowerCase(),a=o[1]?.toLowerCase();if(!i||!nw.includes(i))return O('Position must be "before" or "after"',t);let l=Li(e,a,t);if(!l.ok)return l.result;let u=Z.addRule(e,{type:"hook",command:l.value.name,position:i,action:n,timeoutMs:En.HOOK_DEFAULT_MS,...qi()});return t.md?console.log($(me("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${n}\``),_e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):rt(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${n}`),{success:!0,ruleId:u}}c(rw,"workflowAdd");async function ow(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=Li(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),[i]=Ji(o);if(!i)return O('Usage: prjct workflow gate <command> "shell command"',t);let a=Z.addRule(e,{type:"gate",command:r.value.name,position:"before",action:i,timeoutMs:En.GATE_DEFAULT_MS,...qi()});return t.md?console.log($(me("Gate Added",`#${a} [gate] before ${r.value.name} \u2192 \`${i}\``),_e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):rt(`gate #${a} added: before ${r.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}c(ow,"workflowGate");async function iw(s,e,t){let n=s.trim().split(/\s+/)[0]?.toLowerCase(),r=Li(e,n,t);if(!r.ok)return r.result;let o=s.slice(s.indexOf(r.value.name)+r.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return O('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let a=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=Ji(l);if(!u)return O('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=Z.addRule(e,{type:"instruction",command:r.value.name,position:a,action:u,timeoutMs:En.INSTRUCTION_MS,...qi()});return t.md?console.log($(me("Instruction Added",`#${d} [instruction] ${a} ${r.value.name} \u2192 \`${u}\``),_e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):rt(`instruction #${d} added: ${a} ${r.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}c(iw,"workflowInstruction");async function aw(s,e,t){let n=parseInt(s.trim(),10);return Number.isNaN(n)?O("Usage: prjct workflow rm <rule-id>",t):Z.removeRule(e,n)?(t.md?console.log($(me("Rule Removed",`Removed rule #${n}`))):rt(`removed rule #${n}`),{success:!0}):O(`Rule #${n} not found`,t)}c(aw,"workflowRm");async function cw(s,e){let t=Z.resetRules(s),n=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log($(me("Rules Reset",n))):rt(`reset: ${n.toLowerCase()}`),{success:!0,count:t}}c(cw,"workflowReset");async function lw(s,e,t){let n=s.trim(),r=parseInt(n,10);if(!Number.isNaN(r)){let d=Z.getRuleById(e,r);if(!d)return O(`Rule #${r} not found`,t);if(!d.enabled){let p=`Rule #${r} is already disabled`;return t.md?console.log(`> ${p}`):Jt(p),{success:!0,message:p}}return Z.updateRule(e,r,{enabled:!1}),t.md?console.log($(me("Rule Disabled",`#${r} [${d.type}] ${d.action}`),_e([{label:"Re-enable this rule",command:`prjct workflow enable ${r} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):rt(`disabled rule #${r}: ${d.action}`),{success:!0,ruleId:r}}let o=Z.getAllRules(e),i=tw(o,n);if(i.length===0)return O(`No rules matching "${n}"`,t);if(i.length===1){let d=i[0];return Z.updateRule(e,d.id,{enabled:!1}),t.md?console.log($(me("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):rt(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let a=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=a.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log($(U("Multiple matches",`${i.length} rules match "${n}"`),Te(d),_e(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{Jt(`${i.length} rules match "${n}" \u2014 specify an ID:`);for(let d of a)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}c(lw,"workflowDisable");qt();xe();ze();function uw(s,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),n=e.filter(m=>m.type==="instruction"&&m.position==="before"),r=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=c((m,g,w)=>{let x=g.map(E=>` ${E.enabled?w:"o"} #${E.id} ${E.action}`),C=[m,...x],j=Math.max(...C.map(E=>E.length))+2;u.push(`+${"-".repeat(j)}+`);for(let E of C)u.push(`| ${E.padEnd(j-1)}|`);u.push(`+${"-".repeat(j)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),n.length>0&&(d("INSTRUCTIONS (before)",n,"\u{1F4CB}"),p(u)),r.length>0&&(d("HOOKS (before)",r,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${s.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1289
1289
  `)}c(uw,"buildFlowDiagram");async function dw(s){return s.md?console.log($(U("Workflow Help","Manage hooks, gates, and steps for your workflow"),U("Commands",Te(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),U("Natural Language (EN/ES)",Te(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}c(dw,"workflowHelp");async function Xi(s,e,t){let n=s!==null&&Du.includes(s),r=n?Z.getRulesForCommand(e,s):Z.getAllRules(e);if(r.length===0)return t.md?console.log($(U("Workflow Rules","No rules configured"),_e([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(Jt("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(t.md){let o=n?[s]:Du,i=[];for(let u of o){let d=r.filter(p=>p.command===u);d.length!==0&&i.push(uw(u,d))}let a=n?`Workflow: ${s}`:"Workflow Rules",l=`${r.length} rule${r.length!==1?"s":""}`;console.log($(U(a,l),i.length>0?Qg(i.join(`
1290
1290
 
1291
1291
  `),""):null,_e([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let o=n?`WORKFLOW RULES: ${s.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(o),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let i of r){let a=i.enabled?"":" (disabled)";console.log(` #${i.id} [${i.type}] ${i.position.padEnd(6)} ${i.command.padEnd(5)} \u2192 ${i.action}${a}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:r}}c(Xi,"workflowShow");F();J();import Iu from"node:fs/promises";import aP from"node:os";import zi from"node:path";var $u=class{static{c(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=zi.join(aP.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Iu.mkdir(this.commandsPath,{recursive:!0});let n=zi.join(this.commandsPath,`${e}.md`),r=this.buildTemplateContent(e,t);return await Iu.writeFile(n,r,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=zi.join(this.commandsPath,`${e}.md`);return await Iu.unlink(t),{success:!0}}catch(t){return I(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){let t=zi.join(this.commandsPath,`${e}.md`);return b(t)}buildTemplateContent(e,t){return`---
@@ -1338,6 +1338,6 @@ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};conso
1338
1338
  ${a.length} errors:`));for(let l of a)console.log(ye.red(` - ${l}`))}return console.log(""),console.log(ye.green("prjct has been uninstalled.")),console.log(ye.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}c(pP,"uninstall");var Zi=class extends se{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return pP(e,t)}};var mP={workflow:new Zs,planning:new Jn,shipping:new Vn,analysis:new qn,setup:new Vs,context:new Xn,primitives:new Hs,seed:new Bs,install:new Us,capture:new Ms,mcp:new Ws,team:new zs,config:new Ls,uninstall:new Zi,update:new Qs,spec:new qs};function gP(){for(let[s,e]of Object.entries(hw))yt.registerCategory(s,e)}c(gP,"registerCategories");function fP(){if(!yt.has("work")){gP();for(let s of yw){if(!s.routing)continue;let e=mP[s.routing.group];yt.registerMethod(s.name,e,s.routing.method,s)}}}c(fP,"registerAllCommands");fP();te();function xw(s){let e=yt.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=hP(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}c(xw,"findClosestCommand");function hP(s,e){let t=s.length,n=e.length,r=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=n;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)r[o][i]=s[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][n]}c(hP,"editDistance");var Aw={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};function jw(s){return Object.hasOwn(Aw,s)}c(jw,"isRemovedVerb");function _w(s){let e=Aw[s];return e?`'prjct ${s}' was removed in v2.
1339
1339
  \u2192 Use: ${e.replacement}
1340
1340
  ${e.note}`:null}c(_w,"migrationMessage");async function Dw(s,e){let t=e.args.join(" ")||null,n=e.options,r=n.md===!0;if(jw(e.command)&&!yt.getByName(e.command))return{success:!1,error:_w(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!yt.getByName(e.command)&&!(e.args.length===0&&xw(e.command)!==null)){let o=[e.command,...e.args.filter(i=>!i.startsWith("-"))].join(" ");return s.capture(o,e.cwd,{md:r,tags:n.tags?String(n.tags):void 0,force:n.force===!0})}switch(e.command){case"sync":return s.sync(e.cwd,{preview:n.preview===!0||n["dry-run"]===!0,yes:n.yes===!0,json:n.json===!0,md:r,package:n.package?String(n.package):void 0,full:n.full===!0});case"task":return s.task(t,e.cwd,{md:r,spec:n.spec?String(n.spec):void 0});case"ship":{let o=typeof n.intent=="string"?n.intent:void 0;return s.ship(t,e.cwd,{md:r,intent:o,skipHooks:n["skip-hooks"]===!0,noSpecGate:n["no-spec-gate"]===!0})}case"spec":return yP(s,e.args,n);case"audit-spec":return t?s.specAudit(t,e.cwd,{md:r}):{success:!1,error:"audit-spec requires a spec id"};case"workflow":return s.workflowPrefs(t,e.cwd,{md:r});case"analyze":return s.analyze(n,e.cwd);case"analysis-save-llm":return t?s.saveLlmAnalysis(t,e.cwd,{md:r}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return s.status(t,e.cwd,{md:r});case"tag":return s.tag(t,e.cwd,{md:r});case"remember":return s.remember(t,e.cwd,{md:r,tags:n.tags?String(n.tags):void 0});case"mcp":return s.mcp(t,e.cwd,{md:r});case"team":return s.team(t,e.cwd,{md:r,required:n.required===!0,minVersion:n["min-version"]?String(n["min-version"]):void 0,enforce:n.enforce===!0});case"config":return s.config(t,e.cwd,{md:r});default:return yt.execute(e.command,t,e.cwd)}}c(Dw,"executeCommand");async function yP(s,e,t){let n=t.md===!0,r=e[0],o=e.slice(1).join(" ")||null,i=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","inventory"]);if(r&&new Set(["draft","new","create"]).has(r))return s.spec(o,void 0,{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!r||!i.has(r)){let l=e.join(" ")||null;return s.spec(l,void 0,{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0})}switch(r){case"list":return s.specList(void 0,{md:n,status:t.status?String(t.status):void 0});case"show":return s.specShow(o,void 0,{md:n});case"update":return s.specUpdate(o,void 0,{md:n,json:t.json?String(t.json):void 0});case"set-status":return s.specSetStatus(o,void 0,{md:n,status:t.status?String(t.status):void 0});case"record-review":return s.specRecordReview(o,void 0,{md:n,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return s.specLinkTask(o,void 0,{md:n,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return s.specShip(o,void 0,{md:n,pr:t.pr?String(t.pr):void 0});case"audit":return s.specAudit(o,void 0,{md:n});case"breakdown":return s.specBreakdown(o,void 0,{md:n,force:t.force===!0});case"inventory":return s.specInventory(void 0,{md:n,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${r}`}}}c(yP,"routeSpecDaemon");Gi();Gi();import Rt from"node:fs";import wP from"node:os";import Wt from"node:path";function Iw(){let s=__dirname;for(let n=0;n<5;n++){if(Rt.existsSync(Wt.join(s,"package.json"))){let r=Wt.join(s,"dist","daemon","entry.mjs");if(Rt.existsSync(r))return r;break}s=Wt.dirname(s)}let e=[Wt.join(__dirname,"..","daemon","entry.mjs"),Wt.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of e)if(Rt.existsSync(n))return n;let t=process.argv[1];return t&&Rt.existsSync(t)?t:null}c(Iw,"resolveEntryPath");function Lu(s,e){if(!s||e===null)return!1;try{return Rt.statSync(s).mtimeMs!==e}catch{return!1}}c(Lu,"isCodeStale");function $w(){let s=__dirname;for(let e=0;e<6;e++){let t=Wt.join(s,"package.json");try{let r=JSON.parse(Rt.readFileSync(t,"utf-8"));if(r?.name==="prjct-cli"&&typeof r.version=="string")return r.version}catch{}let n=Wt.dirname(s);if(n===s)break;s=n}return null}c($w,"readOwnPackageVersion");function Ow(s){if(!s)return!1;let e=wP.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let n of t){let r;try{r=Rt.realpathSync(n)}catch{continue}let o=Wt.dirname(r);for(let i=0;i<6;i++){let a=Wt.join(o,"package.json");try{let u=JSON.parse(Rt.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==s}catch{}let l=Wt.dirname(o);if(l===o)break;o=l}}return!1}c(Ow,"isGlobalVersionDrifted");var kP=1024*1024;function Nw(){let s=Ee.log();try{if(Rt.statSync(s).size>kP){let t=`${s}.1`;try{Rt.unlinkSync(t)}catch{}Rt.renameSync(s,t)}}catch{}}c(Nw,"rotateLog");function Mw(s){try{return process.kill(s,0),!0}catch{return!1}}c(Mw,"isProcessRunning");var PP=50,RP=10,tr=null,Jr=null,K=null,Zn=null;async function Bw(s){process.env.PRJCT_IN_DAEMON="1";let e=Ee.socket(),t=Ee.pid(),n=Ee.runDir();if(at.mkdirSync(n,{recursive:!0}),at.existsSync(t)){let i=parseInt(at.readFileSync(t,"utf-8").trim(),10);Mw(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),at.unlinkSync(t)}at.existsSync(e)&&at.unlinkSync(e),Nw();let r=Iw(),o=null;if(r)try{o=at.statSync(r).mtimeMs}catch{}if(Zn=$w(),K={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:qy,idleTimer:null,entryPath:r,entryMtime:o,activeRequests:0,restartPending:!1},Zn)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Hw(),Ww));i(Zn)||await a(Zn)}catch{}if(Jr=new er,tr=CP(i=>xP(i)),tr.listen(e,()=>{at.chmodSync(e,384),at.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),Gw()}),tr.on("error",i=>{console.error("Daemon socket error:",i.message),nr(1)}),process.on("SIGTERM",()=>nr(0)),process.on("SIGINT",()=>nr(0)),process.on("SIGHUP",()=>{Jr=new er,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}c(Bw,"startDaemon");function xP(s){let e="";s.on("data",async t=>{if(e+=t.toString(),e.length>Xy){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};s.write(Ys(r)),s.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1341
- `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await AP(o);s.write(Ys(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(Ys(i))}}}),s.on("error",()=>{})}c(xP,"handleConnection");async function AP(s){if(!K||!Jr)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(K.restartPending)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};K.activeRequests++;try{return await jP(s)}finally{K.activeRequests--,K.restartPending&&K.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>nr(0)))}}c(AP,"handleRequest");async function jP(s){if(!K||!Jr)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Gw(),K.commandsServed++,K.lastActivity=Date.now(),K.commandsServed%PP===0&&E.checkpointAll(),!K.restartPending&&Lu(K.entryPath,K.entryMtime)&&(console.log("Build changed detected \u2014 daemon will restart after this request"),K.restartPending=!0),!K.restartPending&&Zn&&K.commandsServed%RP===0&&Ow(Zn)&&(console.log(`Version drift detected \u2014 daemon v${Zn} is stale; shutting down so the next request spawns fresh.`),K.restartPending=!0),s.command==="daemon")return _P(s);if(s.command==="__ping")return{id:s.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await Dw(Jr,s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1341
+ `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await AP(o);s.write(Ys(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(Ys(i))}}}),s.on("error",()=>{})}c(xP,"handleConnection");async function AP(s){if(!K||!Jr)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(K.restartPending)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};K.activeRequests++;try{return await jP(s)}finally{K.activeRequests--,K.restartPending&&K.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>nr(0)))}}c(AP,"handleRequest");async function jP(s){if(!K||!Jr)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Gw(),K.commandsServed++,K.lastActivity=Date.now(),K.commandsServed%PP===0&&T.checkpointAll(),!K.restartPending&&Lu(K.entryPath,K.entryMtime)&&(console.log("Build changed detected \u2014 daemon will restart after this request"),K.restartPending=!0),!K.restartPending&&Zn&&K.commandsServed%RP===0&&Ow(Zn)&&(console.log(`Version drift detected \u2014 daemon v${Zn} is stale; shutting down so the next request spawns fresh.`),K.restartPending=!0),s.command==="daemon")return _P(s);if(s.command==="__ping")return{id:s.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await Dw(Jr,s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1342
1342
  `)||o.message||void 0,stderr:t.join(`
1343
- `)||o.error||void 0,result:o}}finally{console.log=n,console.error=r}}catch(e){return{id:s.id,success:!1,exitCode:1,stderr:e.message}}}c(jP,"handleRequestInner");function _P(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ee.socket(),uptime:K?Date.now()-K.startedAt:0,commandsServed:K?.commandsServed??0,lastActivity:K?new Date(K.lastActivity).toISOString():null,registeredCommands:yt.list().length,stale:K?Lu(K.entryPath,K.entryMtime):!1}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>nr(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}c(_P,"handleDaemonCommand");function Gw(){K&&(K.idleTimer&&clearTimeout(K.idleTimer),K.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${K.idleTimeoutMs/1e3/60} minutes, shutting down`),nr(0)},K.idleTimeoutMs),K.idleTimer.unref&&K.idleTimer.unref())}c(Gw,"resetIdleTimer");function nr(s){console.log("Daemon shutting down..."),K?.idleTimer&&clearTimeout(K.idleTimer),tr&&(tr.close(),tr=null),E.close();let e=Ee.socket(),t=Ee.pid();try{at.existsSync(e)&&at.unlinkSync(e)}catch{}try{at.existsSync(t)&&at.unlinkSync(t)}catch{}process.exit(s)}c(nr,"shutdown");var DP=process.argv.slice(2),IP=DP.includes("--foreground");Bw({foreground:IP}).catch(s=>{console.error("Failed to start daemon:",s.message),process.exit(1)});
1343
+ `)||o.error||void 0,result:o}}finally{console.log=n,console.error=r}}catch(e){return{id:s.id,success:!1,exitCode:1,stderr:e.message}}}c(jP,"handleRequestInner");function _P(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ee.socket(),uptime:K?Date.now()-K.startedAt:0,commandsServed:K?.commandsServed??0,lastActivity:K?new Date(K.lastActivity).toISOString():null,registeredCommands:yt.list().length,stale:K?Lu(K.entryPath,K.entryMtime):!1}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>nr(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}c(_P,"handleDaemonCommand");function Gw(){K&&(K.idleTimer&&clearTimeout(K.idleTimer),K.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${K.idleTimeoutMs/1e3/60} minutes, shutting down`),nr(0)},K.idleTimeoutMs),K.idleTimer.unref&&K.idleTimer.unref())}c(Gw,"resetIdleTimer");function nr(s){console.log("Daemon shutting down..."),K?.idleTimer&&clearTimeout(K.idleTimer),tr&&(tr.close(),tr=null),T.close();let e=Ee.socket(),t=Ee.pid();try{at.existsSync(e)&&at.unlinkSync(e)}catch{}try{at.existsSync(t)&&at.unlinkSync(t)}catch{}process.exit(s)}c(nr,"shutdown");var DP=process.argv.slice(2),IP=DP.includes("--foreground");Bw({foreground:IP}).catch(s=>{console.error("Failed to start daemon:",s.message),process.exit(1)});