prjct-cli 2.57.0 → 2.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -617,7 +617,7 @@ CREATE TABLE velocity_sprints (
617
617
  applied_at TEXT NOT NULL
618
618
  )
619
619
  `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=Xu.filter(i=>!r.has(i.version));if(s.length!==0){if(t&&r.size>0)try{let i=`${t}.pre-migrate.bak`;Ur.existsSync(i)&&Ur.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)qo(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},T=new Ls,y=T});import td from"node:fs/promises";import zn from"node:path";function hk(n){let e=[],t,r=new RegExp(cu.source,"g");for(;(t=r.exec(n))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function yk(n,e,t){let r;if(n.startsWith("@/"))r=zn.join(t,"src",n.slice(2));else{let s=zn.dirname(zn.join(t,e));r=zn.resolve(s,n)}for(let s of au){let i=r+s;try{if((await td.stat(i)).isFile())return zn.relative(t,i)}catch{}}return null}async function wk(n){let e=await Wt(n),t={},r={},s=0,i=await Xn(e,50,async o=>{try{let a=await td.readFile(zn.join(n,o),"utf-8"),l=hk(a),u=[];for(let d of l){let p=await yk(d,o,n);p&&p!==o&&u.push(p)}return u.length>0?{filePath:o,imports:u}:null}catch{return null}});for(let{filePath:o,imports:a}of i){t[o]=a,s+=a.length;for(let l of a)r[l]||(r[l]=[]),r[l].push(o)}return{forward:t,reverse:r,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function nd(n,e,t=2){let r=new Set(n),s=new Map,i=[];for(let o of n){let a=e.forward[o]||[],l=e.reverse[o]||[];for(let u of[...a,...l])r.has(u)||i.push({file:u,depth:1})}for(;i.length>0;){let{file:o,depth:a}=i.shift();if(a>t)continue;let l=1/(a+1),u=s.get(o);if(u){l>u.score&&s.set(o,{score:l,depth:a});continue}if(s.set(o,{score:l,depth:a}),a<t){let d=e.forward[o]||[],p=e.reverse[o]||[];for(let m of[...d,...p])!r.has(m)&&!s.has(m)&&i.push({file:m,depth:a+1})}}return Array.from(s.entries()).map(([o,{score:a,depth:l}])=>({path:o,score:a,depth:l})).sort((o,a)=>a.score-o.score)}function kk(n,e){y.setDoc(n,Jo,e),Fs.delete(n)}function fn(n){let e=y.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Jo);if(!e)return Fs.delete(n),null;let t=Fs.get(n);if(t&&t.updatedAt===e.updated_at)return t.graph;let r=y.getDoc(n,Jo);return r&&Fs.set(n,{graph:r,updatedAt:e.updated_at}),r}async function Us(n,e){let t=await wk(n);return kk(e,t),t}var Jo,Fs,Hr=f(()=>{"use strict";No();X();J();c(hk,"extractImportSources");c(yk,"resolveImport");c(wk,"buildGraph");c(nd,"scoreFromSeeds");Jo="import-graph",Fs=new Map;c(kk,"saveGraph");c(fn,"loadGraph");c(Us,"indexImports")});function Hs(n,e){let t=[...n.added,...n.modified],r=new Set(t),s=new Set,i=fn(e);if(i)for(let l of t){let u=i.reverse[l];if(u)for(let d of u)r.has(d)||s.add(d)}let o=Array.from(s),a=[...t,...o];return{directlyChanged:t,affectedByImports:o,deleted:n.deleted,allAffected:a}}function Ws(n){let e=new Set;for(let t of n){let r=t.toLowerCase();(r.endsWith(".tsx")||r.endsWith(".jsx")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".vue")||r.endsWith(".svelte")||r.includes("/components/")||r.includes("/pages/")||r.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("/test/"))&&e.add("testing"),(r.includes("dockerfile")||r.includes("docker-compose")||r.includes(".dockerignore")||r.includes(".github/")||r.includes("ci/")||r.includes("cd/"))&&e.add("devops"),(r.endsWith(".sql")||r.includes("prisma")||r.includes("drizzle")||r.includes("migration")||r.includes("/db/"))&&e.add("database"),(r.endsWith(".ts")||r.endsWith(".js"))&&!r.includes(".test.")&&!r.includes(".spec.")&&!r.endsWith(".d.ts")&&e.add("backend")}return e}var zo=f(()=>{"use strict";Hr();c(Hs,"propagateChanges");c(Ws,"affectedDomains")});var Ko=f(()=>{"use strict"});async function Ek(n,e=100){try{let{stdout:t}=await O(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),r=[],s=null;for(let i of t.split(`
620
- `)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&bk(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function bk(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}async function vk(n,e=100){let t=await Ek(n,e),r=new Map,s=new Map;for(let o of t){let a=Array.from(o);for(let l of a)r.set(l,(r.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=Tk(a[l],a[u]);s.set(d,(s.get(d)||0)+1)}}let i={};for(let[o,a]of s){let[l,u]=o.split("\0"),d=r.get(l)||0,p=r.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(i[l]||(i[l]={}),i[u]||(i[u]={}),i[l][u]=g,i[u][l]=g)}return{matrix:i,commitsAnalyzed:t.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}function Tk(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function Qo(n,e){let t=new Set(n),r=new Map;for(let s of n){let i=e.matrix[s];if(i)for(let[o,a]of Object.entries(i)){if(t.has(o))continue;let l=r.get(o)||0;a>l&&r.set(o,a)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}function xk(n,e){y.setDoc(n,Yo,e),Gs.delete(n)}function Wr(n){let e=y.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Yo);if(!e)return Gs.delete(n),null;let t=Gs.get(n);if(t&&t.updatedAt===e.updated_at)return t.matrix;let r=y.getDoc(n,Yo);return r&&Gs.set(n,{matrix:r,updatedAt:e.updated_at}),r}async function Bs(n,e,t=100){let r=await vk(n,t);return xk(e,r),r}var Yo,Gs,Vs=f(()=>{"use strict";Ko();X();ge();c(Ek,"parseGitLog");c(bk,"isSourceFile");c(vk,"buildMatrix");c(Tk,"pairKey");c(Qo,"scoreFromSeeds");Yo="cochange-index",Gs=new Map;c(xk,"saveMatrix");c(Wr,"loadMatrix");c(Bs,"indexCoChanges")});function Rk(n){return n instanceof Gr}function we(n){return Rk(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Gr,Xs,Br,Kt=f(()=>{"use strict";Gr=class extends Error{static{c(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Xs=class n extends Gr{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Br=class n extends Gr{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(Rk,"isPrjctError");c(we,"getErrorMessage")});var ta={};ee(ta,{PACKAGE_ROOT:()=>St,VERSION:()=>kt,getPackageRoot:()=>ea,getVersion:()=>Js,resetPackageRoot:()=>_k});import Zo from"node:fs";import qs from"node:path";function ea(){if(Kn)return Kn;let n=__dirname;for(let e=0;e<5;e++){let t=qs.join(n,"package.json");if(Zo.existsSync(t))try{if(JSON.parse(Zo.readFileSync(t,"utf-8")).name==="prjct-cli")return Kn=n,n}catch{}n=qs.dirname(n)}return Kn=qs.join(__dirname,"..","..",".."),Kn}function Js(){if(hn)return hn;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return hn=n,hn;try{let e=qs.join(ea(),"package.json");return hn=JSON.parse(Zo.readFileSync(e,"utf-8")).version,hn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function _k(n){Kn=n,hn=null}var hn,Kn,kt,St,Et=f(()=>{"use strict";q();hn=null,Kn=null;c(ea,"getPackageRoot");c(Js,"getVersion");c(_k,"resetPackageRoot");kt=Js(),St=ea()});async function zs(n){try{let{stdout:e}=await O(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Ck(){let n=await zs("gh api user --jq .login");return n.success&&n.output||(n=await zs("git config --global github.user"),n.success&&n.output)?n.output:null}async function Ak(){let n=await zs("git config user.name");return n.success&&n.output?n.output:null}async function Pk(){let n=await zs("git config user.email");return n.success&&n.output?n.output:null}async function Yn(){let[n,e,t]=await Promise.all([Ck(),Ak(),Pk()]);return{github:n,email:t,name:e||n||"Unknown"}}var Ks=f(()=>{"use strict";ge();c(zs,"execCommand");c(Ck,"detectGitHubUsername");c(Ak,"detectGitName");c(Pk,"detectGitEmail");c(Yn,"detect")});var Qn={};ee(Qn,{default:()=>$});import ra from"node:fs/promises";import jk from"node:path";import*as Ys from"jsonc-parser";function id(n){let e=[],t=Ys.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${Ys.printParseErrorCode(r.error)}`)}return t}var sa,Dk,$,fe=f(()=>{"use strict";Kt();q();Y();J();Et();Ks();De();c(id,"parseJsonc");sa=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=L.getLocalConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read config at ${e}: ${we(t)}`),null}}async writeConfig(e,t){let r=L.getLocalConfigPath(e);await Se(r,t)}async readGlobalConfig(e){try{let t=L.getGlobalProjectConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read global config for ${e}: ${we(t)}`),null}}async writeGlobalConfig(e,t){let r=L.getGlobalProjectConfigPath(e);await Se(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=k();t={projectId:e,authors:[],version:kt,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=L.generateProjectId(e),s=L.getGlobalProjectPath(r),i=L.getDisplayPath(s),o=k(),a={projectId:r,dataPath:i,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}],version:kt,created:o,lastSync:o};return await this.writeGlobalConfig(r,l),a}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=k(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await L.hasLegacyStructure(e))return!1;if(!await L.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let i=L.getGlobalProjectPath(s.projectId);try{return(await ra.readdir(jk.join(i,"core"))).length===0}catch(o){return M(o),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(Ds(),js));if(await r.detect(e)){let i=await r.getMainWorktree(e);if(i!==e){let o=await this.readConfig(i);if(o?.projectId)return o.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(o=>o.github===t.github))return;let i=k();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}),r.lastSync=i,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(i=>i.github===t);s&&(s.lastActivity=k(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await Yn(),r=await this.getProjectId(e);return await this.addAuthor(r,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=L.generateProjectId(e);return{projectId:r,dataPath:L.getDisplayPath(L.getGlobalProjectPath(r))}}},Dk=new sa,$=Dk});import{z as w}from"zod";var Nk,Qs,Mk,Ok,ia,cd,ld,ud,dd,ad,$k,Lk,Fk,pd,Uk,md,Zs=f(()=>{"use strict";Fr();Nk=w.enum(["low","medium","high","critical"]),Qs=w.enum(["feature","bug","improvement","chore"]),Mk=w.enum(["active","backlog","previously_active"]),Ok=w.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ia=w.object({title:w.string(),description:w.string(),filesChanged:w.array(w.object({path:w.string(),action:w.enum(["created","modified","deleted"])})),whatWasDone:w.array(w.string()).min(1),outputForNextAgent:w.string().min(1),notes:w.string().optional()}),cd=w.object({output:w.string().min(1,"Subtask output is required"),summary:ia}),ld=w.object({id:w.string(),description:w.string(),domain:w.string(),agent:w.string(),status:Ok,dependsOn:w.array(w.string()),startedAt:w.string().optional(),completedAt:w.string().optional(),output:w.string().optional(),summary:ia.optional(),skipReason:w.string().optional(),blockReason:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional()}),ud=w.object({completed:w.number(),total:w.number(),percentage:w.number()}),dd=w.object({id:w.string(),description:w.string(),type:Qs.optional(),startedAt:w.string(),sessionId:w.string(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),linkedSpecId:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional(),parentDescription:w.string().optional(),branch:w.string().optional(),prUrl:w.string().optional()}),ad=w.object({id:w.string(),description:w.string(),status:w.literal("paused"),startedAt:w.string(),pausedAt:w.string(),pauseReason:w.string().optional(),type:Qs.optional(),sessionId:w.string().optional(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),$k=w.object({stackConfirmed:w.array(w.string()).optional(),patternsDiscovered:w.array(w.string()).optional(),agentAccuracy:w.array(w.object({agent:w.string(),rating:w.enum(["helpful","neutral","inaccurate"]),note:w.string().optional()})).optional(),issuesEncountered:w.array(w.string()).optional()}),Lk=w.object({taskId:w.string(),title:w.string(),classification:Qs,startedAt:w.string(),completedAt:w.string(),subtaskCount:w.number(),subtaskSummaries:w.array(ia),outcome:w.string(),branchName:w.string(),linearId:w.string().optional(),linearUuid:w.string().optional(),prUrl:w.string().optional(),feedback:$k.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),Fk=dd.extend({workspaceId:w.string(),worktreePath:w.string().optional(),agentSessionId:w.string().optional(),jiraId:w.string().optional(),jiraUuid:w.string().optional(),dispatchedFrom:w.string().optional()}),pd=w.object({currentTask:dd.nullable(),previousTask:ad.nullable().optional(),pausedTasks:w.array(ad).optional(),taskHistory:w.array(Lk).optional(),activeTasks:w.array(Fk).optional(),lastUpdated:w.string()}),Uk=w.object({id:w.string(),description:w.string(),body:w.string().optional(),priority:Nk,type:Qs,featureId:w.string().optional(),originFeature:w.string().optional(),completed:w.boolean(),completedAt:w.string().optional(),createdAt:w.string(),section:Mk,agent:w.string().optional(),groupName:w.string().optional(),groupId:w.string().optional()}),md=w.object({tasks:w.array(Uk),lastUpdated:w.string()})});var Vr,oa,Zn,aa=f(()=>{"use strict";Vr={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"}},oa=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(i=>i.workspaceId===t);return s?this.statusToState(s):"idle"}let r=e?.currentTask;return r?this.statusToState(r):(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle"}statusToState(e){switch((typeof e.status=="string"?e.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"working"}}canTransition(e,t){if(Vr[e].transitions.includes(t))return{valid:!0};let s=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${s}`}}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 Vr[e]}getPrompt(e){return Vr[e].prompt}getValidCommands(e){return Vr[e].transitions}formatNextSteps(e){return Vr[e].transitions.map(r=>{switch(r){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 ${r}`}})}},Zn=new oa});import Hk from"node:crypto";function Ee(){return Hk.randomUUID()}var It=f(()=>{"use strict";c(Ee,"generateUUID")});var ca,yn,gd=f(()=>{"use strict";Y();X();ca=class{static{c(this,"SyncPendingStorage")}append(e,t){let r=k(),s=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&y.run(e,`DELETE FROM sync_pending
620
+ `)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&bk(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function bk(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}async function vk(n,e=100){let t=await Ek(n,e),r=new Map,s=new Map;for(let o of t){let a=Array.from(o);for(let l of a)r.set(l,(r.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=Tk(a[l],a[u]);s.set(d,(s.get(d)||0)+1)}}let i={};for(let[o,a]of s){let[l,u]=o.split("\0"),d=r.get(l)||0,p=r.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(i[l]||(i[l]={}),i[u]||(i[u]={}),i[l][u]=g,i[u][l]=g)}return{matrix:i,commitsAnalyzed:t.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}function Tk(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function Qo(n,e){let t=new Set(n),r=new Map;for(let s of n){let i=e.matrix[s];if(i)for(let[o,a]of Object.entries(i)){if(t.has(o))continue;let l=r.get(o)||0;a>l&&r.set(o,a)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}function xk(n,e){y.setDoc(n,Yo,e),Gs.delete(n)}function Wr(n){let e=y.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Yo);if(!e)return Gs.delete(n),null;let t=Gs.get(n);if(t&&t.updatedAt===e.updated_at)return t.matrix;let r=y.getDoc(n,Yo);return r&&Gs.set(n,{matrix:r,updatedAt:e.updated_at}),r}async function Bs(n,e,t=100){let r=await vk(n,t);return xk(e,r),r}var Yo,Gs,Vs=f(()=>{"use strict";Ko();X();ge();c(Ek,"parseGitLog");c(bk,"isSourceFile");c(vk,"buildMatrix");c(Tk,"pairKey");c(Qo,"scoreFromSeeds");Yo="cochange-index",Gs=new Map;c(xk,"saveMatrix");c(Wr,"loadMatrix");c(Bs,"indexCoChanges")});function Rk(n){return n instanceof Gr}function we(n){return Rk(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Gr,Xs,Br,Kt=f(()=>{"use strict";Gr=class extends Error{static{c(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Xs=class n extends Gr{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Br=class n extends Gr{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(Rk,"isPrjctError");c(we,"getErrorMessage")});var ta={};ee(ta,{PACKAGE_ROOT:()=>St,VERSION:()=>kt,getPackageRoot:()=>ea,getVersion:()=>Js,resetPackageRoot:()=>_k});import Zo from"node:fs";import qs from"node:path";function ea(){if(Kn)return Kn;let n=__dirname;for(let e=0;e<5;e++){let t=qs.join(n,"package.json");if(Zo.existsSync(t))try{if(JSON.parse(Zo.readFileSync(t,"utf-8")).name==="prjct-cli")return Kn=n,n}catch{}n=qs.dirname(n)}return Kn=qs.join(__dirname,"..","..",".."),Kn}function Js(){if(hn)return hn;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return hn=n,hn;try{let e=qs.join(ea(),"package.json");return hn=JSON.parse(Zo.readFileSync(e,"utf-8")).version,hn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function _k(n){Kn=n,hn=null}var hn,Kn,kt,St,Et=f(()=>{"use strict";q();hn=null,Kn=null;c(ea,"getPackageRoot");c(Js,"getVersion");c(_k,"resetPackageRoot");kt=Js(),St=ea()});async function zs(n){try{let{stdout:e}=await O(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Ck(){let n=await zs("gh api user --jq .login");return n.success&&n.output||(n=await zs("git config --global github.user"),n.success&&n.output)?n.output:null}async function Ak(){let n=await zs("git config user.name");return n.success&&n.output?n.output:null}async function Pk(){let n=await zs("git config user.email");return n.success&&n.output?n.output:null}async function Yn(){let[n,e,t]=await Promise.all([Ck(),Ak(),Pk()]);return{github:n,email:t,name:e||n||"Unknown"}}var Ks=f(()=>{"use strict";ge();c(zs,"execCommand");c(Ck,"detectGitHubUsername");c(Ak,"detectGitName");c(Pk,"detectGitEmail");c(Yn,"detect")});var Qn={};ee(Qn,{default:()=>$});import ra from"node:fs/promises";import jk from"node:path";import*as Ys from"jsonc-parser";function id(n){let e=[],t=Ys.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${Ys.printParseErrorCode(r.error)}`)}return t}var sa,Dk,$,fe=f(()=>{"use strict";Kt();q();Y();J();Et();Ks();De();c(id,"parseJsonc");sa=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=L.getLocalConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read config at ${e}: ${we(t)}`),null}}async writeConfig(e,t){let r=L.getLocalConfigPath(e);await Se(r,t)}async readGlobalConfig(e){try{let t=L.getGlobalProjectConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read global config for ${e}: ${we(t)}`),null}}async writeGlobalConfig(e,t){let r=L.getGlobalProjectConfigPath(e);await Se(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=k();t={projectId:e,authors:[],version:kt,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=L.generateProjectId(e),s=L.getGlobalProjectPath(r),i=L.getDisplayPath(s),o=k(),a={projectId:r,dataPath:i,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}],version:kt,created:o,lastSync:o};return await this.writeGlobalConfig(r,l),a}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=k(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await L.hasLegacyStructure(e))return!1;if(!await L.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let i=L.getGlobalProjectPath(s.projectId);try{return(await ra.readdir(jk.join(i,"core"))).length===0}catch(o){return M(o),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(Ds(),js));if(await r.detect(e)){let i=await r.getMainWorktree(e);if(i!==e){let o=await this.readConfig(i);if(o?.projectId)return o.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(o=>o.github===t.github))return;let i=k();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}),r.lastSync=i,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(i=>i.github===t);s&&(s.lastActivity=k(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await Yn(),r=await this.getProjectId(e);return await this.addAuthor(r,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=L.generateProjectId(e);return{projectId:r,dataPath:L.getDisplayPath(L.getGlobalProjectPath(r))}}},Dk=new sa,$=Dk});import{z as w}from"zod";var Nk,Qs,Mk,Ok,ia,cd,ld,ud,dd,ad,$k,Lk,Fk,pd,Uk,md,Zs=f(()=>{"use strict";Fr();Nk=w.enum(["low","medium","high","critical"]),Qs=w.enum(["feature","bug","improvement","chore"]),Mk=w.enum(["active","backlog","previously_active"]),Ok=w.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ia=w.object({title:w.string(),description:w.string(),filesChanged:w.array(w.object({path:w.string(),action:w.enum(["created","modified","deleted"])})),whatWasDone:w.array(w.string()).min(1),outputForNextAgent:w.string().min(1),notes:w.string().optional()}),cd=w.object({output:w.string().min(1,"Subtask output is required"),summary:ia}),ld=w.object({id:w.string(),description:w.string(),domain:w.string(),agent:w.string(),status:Ok,dependsOn:w.array(w.string()),startedAt:w.string().optional(),completedAt:w.string().optional(),output:w.string().optional(),summary:ia.optional(),skipReason:w.string().optional(),blockReason:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional()}),ud=w.object({completed:w.number(),total:w.number(),percentage:w.number()}),dd=w.object({id:w.string(),description:w.string(),type:Qs.optional(),startedAt:w.string(),sessionId:w.string(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),linkedSpecId:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional(),parentDescription:w.string().optional(),branch:w.string().optional(),prUrl:w.string().optional()}),ad=w.object({id:w.string(),description:w.string(),status:w.literal("paused"),startedAt:w.string(),pausedAt:w.string(),pauseReason:w.string().optional(),type:Qs.optional(),sessionId:w.string().optional(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),$k=w.object({stackConfirmed:w.array(w.string()).optional(),patternsDiscovered:w.array(w.string()).optional(),agentAccuracy:w.array(w.object({agent:w.string(),rating:w.enum(["helpful","neutral","inaccurate"]),note:w.string().optional()})).optional(),issuesEncountered:w.array(w.string()).optional()}),Lk=w.object({taskId:w.string(),title:w.string(),classification:Qs,startedAt:w.string(),completedAt:w.string(),subtaskCount:w.number(),subtaskSummaries:w.array(ia),outcome:w.string(),branchName:w.string(),linearId:w.string().optional(),linearUuid:w.string().optional(),prUrl:w.string().optional(),feedback:$k.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),Fk=dd.extend({workspaceId:w.string(),worktreePath:w.string().optional(),agentSessionId:w.string().optional(),jiraId:w.string().optional(),jiraUuid:w.string().optional(),dispatchedFrom:w.string().optional()}),pd=w.object({currentTask:dd.nullable(),previousTask:ad.nullable().optional(),pausedTasks:w.array(ad).optional(),taskHistory:w.array(Lk).optional(),activeTasks:w.array(Fk).optional(),lastUpdated:w.string()}),Uk=w.object({id:w.string(),description:w.string(),body:w.string().optional(),priority:Nk,type:Qs,featureId:w.string().optional(),originFeature:w.string().optional(),completed:w.boolean(),completedAt:w.string().optional(),createdAt:w.string(),section:Mk,agent:w.string().optional(),groupName:w.string().optional(),groupId:w.string().optional()}),md=w.object({tasks:w.array(Uk),lastUpdated:w.string()})});var Vr,oa,Zn,aa=f(()=>{"use strict";Vr={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"}},oa=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(i=>i.workspaceId===t);return s?this.statusToState(s):"idle"}let r=e?.currentTask;return r?this.statusToState(r):(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle"}statusToState(e){switch((typeof e.status=="string"?e.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"working"}}canTransition(e,t){if(Vr[e].transitions.includes(t))return{valid:!0};let s=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${s}`}}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 Vr[e]}getPrompt(e){return Vr[e].prompt}getValidCommands(e){return Vr[e].transitions}formatNextSteps(e){return Vr[e].transitions.map(r=>{switch(r){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 ${r}`}})}},Zn=new oa});import Hk from"node:crypto";function Ee(){return Hk.randomUUID()}var It=f(()=>{"use strict";c(Ee,"generateUUID")});var ca,yn,gd=f(()=>{"use strict";Y();X();ca=class{static{c(this,"SyncPendingStorage")}append(e,t){let r=k(),s=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&y.run(e,`DELETE FROM sync_pending
621
621
  WHERE project_id = ?
622
622
  AND entity_type = ?
623
623
  AND entity_id = ?
@@ -1076,13 +1076,13 @@ ${JSON.stringify(r.value,null,2)}`,e)}return ly(t,e)}function lR(n){try{return{o
1076
1076
  `),t.push(`- **Total Commits**: ${i?.totalCommits||0}`),t.push(`- **Contributors**: ${i?.contributors||0}`),t.push(`- **Age**: ${i?.age||"unknown"}`),t.push(""),n.gitLog&&(t.push(`## Recent Activity
1077
1077
  `),n.gitLog.split(`
1078
1078
  `).slice(0,5).forEach(a=>{if(a.trim()){let[l,,u,d]=a.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1079
- `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1080
- `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1079
+ `),t.push("Based on detected stack, consider generating specialized agents using `p. sync`.\n"),t.push(`---
1080
+ `),t.push("*This analysis was generated automatically. For updated information, run `p. analyze` again.*\n"),t.join(`
1081
1081
  `)}var Tl=f(()=>{"use strict";Si();Zi();Tn();Y();mo();He();c(my,"showSyncResult");c(gy,"getSessionActivity");c(Cr,"formatTokens");c(vl,"formatDuration");c(fy,"generateSparkline");c(hy,"generateStatsMarkdown");c(yy,"generateAnalysisSummary")});async function wy(n=process.cwd(),e={}){try{let t=await xe(n);if(!t.ok)return t.result;let r=t.value,s=await kr.getSummary(r),i=await kr.getDailyStats(r,30),o=await gy(r),a={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:o,patterns:a,totalTokensSaved:s.totalTokensSaved,estimatedCostSaved:s.estimatedCostSaved,compressionRate:s.compressionRate,syncCount:s.syncCount,avgSyncDuration:s.avgSyncDuration,topAgents:s.topAgents.slice(0,5),last30DaysTokens:s.last30DaysTokens,trend:s.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=T.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await kr.read(r),d=u.firstSync?new Date(u.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${l.padEnd(20).slice(0,20)} | Since: ${d.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),o.sessionDuration&&console.log(` Duration: ${o.sessionDuration}`),console.log(` Tasks completed: ${o.tasksCompleted}`),console.log(` Features shipped: ${o.featuresShipped}`),o.agentsUsed.length>0){let p=o.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(a.decisions>0||a.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${a.learnedDecisions} confirmed (${a.decisions} total)`),console.log(` Preferences: ${a.preferences} saved`),console.log(` Workflows: ${a.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Cr(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Qi(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vl(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,g)=>m+g.usageCount,0);for(let m of s.topAgents){let g=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${g}% (${m.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=fy(i);if(console.log(` ${p} ${Cr(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",g=s.trend>0?"+":"";console.log(` ${m} ${g}${s.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),e.export){let p=hy(s,i,l,d,o,a);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:o,patterns:a}}}catch(t){return console.error("\u274C Error:",x(t)),$e(t)}}async function ky(n=process.cwd(),e={}){try{let t=await xe(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Te.diff(r);if(!s){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:i})):e.md?console.log(Q("## Analysis Diff",`> ${i}`)):A.warn(i),{success:!1,error:i}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(Q(Mi(s))),{success:!0,data:s};if(!s.hasChanges)A.done("No changes between draft and sealed analysis");else{A.section("Analysis Diff"),console.log(Um(s)),console.log("");let i=[];s.summary.added>0&&i.push(`${s.summary.added} added`),s.summary.removed>0&&i.push(`${s.summary.removed} removed`),s.summary.changed>0&&i.push(`${s.summary.changed} changed`),A.done(i.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=x(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(Q("## Diff Failed",`> ${r}`)):A.fail(r),{success:!1,error:r}}}var Sy=f(()=>{"use strict";Zi();Oi();an();X();Lc();q();Ct();un();He();Tl();br();c(wy,"stats");c(ky,"diff")});var vy={};ee(vy,{AnalysisCommands:()=>xl});import Ey from"node:fs/promises";var by,xl,Ty=f(()=>{"use strict";Lm();fe();De();Oi();Km();el();an();On();q();Y();Ct();un();mo();He();ah();py();Sy();Tl();dr();br();by=["> Review this project data and save concise notes for future AI agents.","> Focus on architecture, conventions, risks, and gotchas. Markdown/text is fine; JSON is optional.","> Most compatible save path: write notes to a temp file, then run `prjct analysis-save-llm <file> --md`."].join(`
1082
1082
  `),xl=class extends ze{static{c(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1083
1083
  `),ve.init(t);let r={packageJson:await ve.readPackageJson(),cargoToml:await ve.readCargoToml(),goMod:await ve.readGoMod(),requirements:await ve.readRequirements(),directories:await ve.listDirectories(),fileCount:await ve.countFiles(),gitStats:await ve.getGitStats(),gitLog:await ve.getGitLog(20),hasDockerfile:await ve.fileExists("Dockerfile"),hasDockerCompose:await ve.fileExists("docker-compose.yml"),hasReadme:await ve.fileExists("README.md"),hasTsconfig:await ve.fileExists("tsconfig.json"),hasViteConfig:await ve.fileExists("vite.config.ts")||await ve.fileExists("vite.config.js"),hasNextConfig:await ve.fileExists("next.config.js")||await ve.fileExists("next.config.mjs")},s=yy(r,t),i=await $.readConfig(t).catch(()=>null),o=await L.getWikiPath(t,i?.vaultPath),a=`${o}/_generated/analysis/repo-summary.md`;return await Ey.mkdir(`${o}/_generated/analysis`,{recursive:!0}),await Ey.writeFile(a,s,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:k(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
1084
1084
  `),console.log(`\u{1F4C4} Full report: ${L.getDisplayPath(a)}
1085
- `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:r}}catch(r){return console.error("\u274C Error:",x(r)),$e(r)}}async sync(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=Date.now();if(t.package){let a=await L.detectMonorepo(e);if(!a.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=a.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=a.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Sr.sync(e,{packagePath:l.path,packageName:l.name});return t.json?console.log(JSON.stringify({success:u.success,package:l.name,path:l.relativePath})):t.md?console.log(Q(ut(`Synced package: ${l.name}`))):A.done(`Synced package: ${l.name}`),{success:u.success}}t.md||A.spin("Syncing project...");let o=await Sr.sync(e,{full:t.full});if(!o.success)return t.md?console.log(Q("## Sync Failed",`> ${o.error||"Unknown error"}`)):A.fail(o.error||"Sync failed"),{success:!1,error:o.error};if(t.md||A.stop(),t.md){let a=Date.now()-i,l=o.generatedSkills?.generated?.length??0,u=null;try{let v=await Te.diff(s);v?.hasChanges&&(u=Mi(v))}catch{}let d=o.git.recentCommits[0]?.hash??null,p=d&&Me.isCurrent(s,d),m=null;if(!p)try{let v=await gc(s,e,o.git,o.stats);m=["## Analysis Payload",by,"### Data","```json",JSON.stringify(v),"```"].join(`
1085
+ `),console.log("Next steps:"),console.log("\u2022 p. sync \u2192 Generate agents based on stack"),console.log("\u2022 p. feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:r}}catch(r){return console.error("\u274C Error:",x(r)),$e(r)}}async sync(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=Date.now();if(t.package){let a=await L.detectMonorepo(e);if(!a.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=a.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=a.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Sr.sync(e,{packagePath:l.path,packageName:l.name});return t.json?console.log(JSON.stringify({success:u.success,package:l.name,path:l.relativePath})):t.md?console.log(Q(ut(`Synced package: ${l.name}`))):A.done(`Synced package: ${l.name}`),{success:u.success}}t.md||A.spin("Syncing project...");let o=await Sr.sync(e,{full:t.full});if(!o.success)return t.md?console.log(Q("## Sync Failed",`> ${o.error||"Unknown error"}`)):A.fail(o.error||"Sync failed"),{success:!1,error:o.error};if(t.md||A.stop(),t.md){let a=Date.now()-i,l=o.generatedSkills?.generated?.length??0,u=null;try{let v=await Te.diff(s);v?.hasChanges&&(u=Mi(v))}catch{}let d=o.git.recentCommits[0]?.hash??null,p=d&&Me.isCurrent(s,d),m=null;if(!p)try{let v=await gc(s,e,o.git,o.stats);m=["## Analysis Payload",by,"### Data","```json",JSON.stringify(v),"```"].join(`
1086
1086
  `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let g=po("sync",!0),h=o.syncMetrics?.indexes,R={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":o.stats.fileCount};if(h?.bm25Files){let v=h.bm25Files*(h.bm25AvgTokens||0);R["Tokens indexed"]=`${Math.round(v/1e3)}K`,R["Import edges"]=h.importEdges||0,R["Co-change commits"]=h.cochangeCommits||0}let E=Q(ut("Sync Complete"),Er(R),u,o.git.hasChanges?th("Uncommitted changes detected"):null,m,lo(g.map(v=>({label:v.desc,command:v.cmd}))));return console.log(E),{success:!0,data:o,metrics:{elapsed:a,skillCount:l,fileCount:o.stats.fileCount}}}return my(o,i)}catch(r){return t.md?console.log(Q("## Sync Failed",`> ${x(r)}`)):A.fail(x(r)),$e(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=await Sr.sync(e);if(!i.success)return{success:!1,error:i.error||"Failed to gather project data"};let o=i.git.recentCommits[0]?.hash??null;if(o&&Me.isCurrent(s,o))return t.md?console.log(Q(ut("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await gc(s,e,i.git,i.stats);return t.md?console.log(Q("## Analysis Payload",by,"### Data","```json",JSON.stringify(a),"```")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(r){return $e(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=await import("node:fs/promises"),o=(await Promise.resolve().then(()=>(De(),Gu))).default,l=await(await Promise.resolve().then(()=>(fe(),Qn))).default.readConfig(e).catch(()=>null),d=`${await o.getWikiPath(e,l?.vaultPath)}/_generated`;await i.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(To(),vo)),m=await p(e,s);return t.md?console.log(`---
1087
1087
 
1088
1088
  ## Vault regenerated
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.57.0",
3
+ "version": "2.59.0",
4
4
  "description": "Project memory and workflow context for AI coding agents.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {
7
- "prjct": "bin/prjct"
7
+ "prjct": "bin/prjct.cjs"
8
8
  },
9
9
  "publishConfig": {
10
10
  "access": "public",
@@ -92,6 +92,7 @@
92
92
  "files": [
93
93
  "assets/",
94
94
  "bin/prjct",
95
+ "bin/prjct.cjs",
95
96
  "dist/",
96
97
  "templates/",
97
98
  "scripts/install.sh",