prjct-cli 2.71.0 → 2.72.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.
@@ -774,7 +774,7 @@ public static class PrjctCredentialManager {
774
774
  CredDelete(target, CRED_TYPE_GENERIC, 0);
775
775
  }
776
776
  }
777
- `;a(xu,"powershellArgs");a(Pu,"windowsCommand");a(Ty,"readWindowsCredentialManager");a(yA,"writeWindowsCredentialManager");a(wA,"clearWindowsCredentialManager");a(kA,"platformGet");a(bA,"platformSet");a(vA,"platformClear");a(SA,"platformLocation");a(Au,"activeStore");a(ia,"getAuthToken");a(_u,"setAuthToken");a(ju,"clearAuthToken")});var Mu={};L(Mu,{default:()=>ae});import EA from"node:crypto";import Iu from"node:fs/promises";import Ry from"node:os";import xy from"node:path";function Ay(){return EA.randomUUID()}function Du(n){return{...n,apiKey:null}}var _y,Py,$u,TA,ae,En=h(()=>{"use strict";Te();ee();Cy();_y="https://cli-api.prjct.app",Py={apiKey:null,apiUrl:_y,userId:null,email:null,lastAuth:null};a(Ay,"freshDeviceId");a(Du,"metadataOnly");$u=class{static{a(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=j.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await We(this.configPath),t=await ia(),r={...e??Py,apiKey:t},s=!1;if(!t&&e?.apiKey&&(await _u(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Ay(),s=!0),r.hostname||(r.hostname=Ry.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await Ee(this.configPath,Du(this.cachedConfig)),await Iu.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Ay()}async getHostname(){return(await this.read()).hostname??Ry.hostname()}async write(e){let t=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await _u(e.apiKey):await ju());let r={...t,...e,apiKey:await ia(),lastAuth:new Date().toISOString()};await Rt(xy.dirname(this.configPath)),await Ee(this.configPath,Du(r)),await Iu.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await ia()}async getApiUrl(){return(await this.read()).apiUrl||_y}async saveAuth(e,t,r){await this.write({apiKey:e,userId:t,email:r})}async clearAuth(){await ju(),this.cachedConfig={...Py},await Rt(xy.dirname(this.configPath)),await Ee(this.configPath,Du(this.cachedConfig)),await Iu.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},TA=new $u,ae=TA});var Iy={};L(Iy,{publishCRUD:()=>jy,publishCRUDSync:()=>dn});import CA from"node:crypto";function xA(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(PA(n)):JSON.stringify(n);return CA.createHash("sha256").update(e).digest("hex")}function PA(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function AA(){if(Nu)return Nu;try{let{default:n}=await Promise.resolve().then(()=>(En(),Mu)),e=n;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Nu=t,t}return"unknown-device"}catch{return"unknown-device"}}async function jy(n){try{let e=await AA(),t=xA(n.data),r={type:`${n.entityType}.${RA[n.eventType]}`,path:[n.entityType,n.entityId],data:n.data,timestamp:new Date().toISOString(),projectId:n.projectId,entityType:n.entityType,entityId:n.entityId,eventType:n.eventType,contentHash:t,deviceId:e,originDeviceId:n.originDeviceId??e,revisionCount:n.revisionCount??1};await At.publish(r)}catch{}}function dn(n){jy(n)}var RA,Nu,Eo=h(()=>{"use strict";So();RA={upsert:"updated",delete:"deleted"};a(xA,"hashPayload");a(PA,"sortKeys");Nu=null;a(AA,"resolveDeviceId");a(jy,"publishCRUD");a(dn,"publishCRUDSync")});var Tn,Ou,ft,nr=h(()=>{"use strict";vn();Eo();ie();X();Tn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ou=class{static{a(this,"ArchiveStorage")}archive(e,t){let r=Xe(),s=E();return I.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),dn({projectId:e,entityType:"archives",entityId:r,eventType:"upsert",data:{id:r,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:s}}),r}archiveMany(e,t){if(t.length===0)return 0;let r=E();return I.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Xe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,r,i.reason)}),t.length}getArchived(e,t,r=50){return t?I.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,r):I.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(e){let t=I.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in r&&(r[o]=s.count),r.total+=s.count}return r}restore(e,t){let r=I.get(e,"SELECT * FROM archives WHERE id = ?",t);return r?(I.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(r.entity_data)):null}pruneOldArchives(e,t){let r=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);I.run(e,"DELETE FROM archives WHERE archived_at < ?",r);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return I.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ft=new Ou});async function Dy(n,e,t){let r={pausedCount:0};if(await n.update(e,o=>{if(!o.currentTask)return o;n.validateTransition(o,"pause"),r.pausedTask={...o.currentTask,status:"paused",pausedAt:E(),pauseReason:t};let i=[r.pausedTask,...n.getPausedTasksFromState(o)].slice(0,n.maxPausedTasks);return r.pausedCount=i.length,{...o,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:E()}}),!r.pausedTask)return null;let s=r.pausedTask;return await n.publish(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:r.pausedCount}),s}async function $y(n,e,t){let r={remainingPaused:0};if(await n.update(e,o=>{let i=n.getPausedTasksFromState(o);if(i.length===0)return o;n.validateTransition(o,"resume");let c=t?i.findIndex(y=>y.id===t):0;if(c===-1)return o;let l=i[c],u=i.filter((y,x)=>x!==c),{status:d,pausedAt:p,pauseReason:m,...f}=l;return r.currentTask={...f,startedAt:E(),sessionId:l.sessionId??Xe()},r.remainingPaused=u.length,{...o,currentTask:r.currentTask,previousTask:null,pausedTasks:u,lastUpdated:E()}}),!r.currentTask)return null;let s=r.currentTask;return await n.publish(e,"task.resumed",{taskId:s.id,description:s.description,resumedAt:s.startedAt,remainingPaused:r.remainingPaused}),s}async function My(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t),s=Date.now()-n.stalenessThresholdDays*24*60*60*1e3;return r.filter(o=>new Date(o.pausedAt).getTime()<s)}async function Ny(n,e){let t=Date.now()-n.stalenessThresholdDays*24*60*60*1e3,r=[];if(await n.update(e,s=>{let o=n.getPausedTasksFromState(s);if(r=o.filter(c=>new Date(c.pausedAt).getTime()<t),r.length===0)return s;let i=o.filter(c=>new Date(c.pausedAt).getTime()>=t);return{...s,pausedTasks:i,previousTask:null,lastUpdated:E()}}),r.length===0)return[];ft.archiveMany(e,r.map(s=>({entityType:"paused_task",entityId:s.id,entityData:s,summary:s.description,reason:"staleness"})));for(let s of r)await n.publish(e,"task.archived",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:"staleness"});return r}var Oy=h(()=>{"use strict";vn();ie();nr();a(Dy,"pauseTask");a($y,"resumeTask");a(My,"getStalePausedTasks");a(Ny,"archiveStalePausedTasks")});async function Ly(n,e){await n.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:E()}))}async function Fy(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t);return t.currentTask!==null||r.length>0}async function Hy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)[0]||null}async function Uy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)}async function Lu(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)}async function Gy(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)[0]||null}async function Wy(n,e,t){let r=await n.read(e);return n.getTaskHistoryFromState(r).filter(o=>o.classification===t)}async function By(n,e){let r=(await Lu(n,e)).filter(m=>m.feedback),s=[],o=[],i=[],c=[];for(let m of r){let f=m.feedback;Array.isArray(f.stackConfirmed)&&s.push(...f.stackConfirmed),Array.isArray(f.patternsDiscovered)&&o.push(...f.patternsDiscovered),Array.isArray(f.agentAccuracy)&&i.push(...f.agentAccuracy),Array.isArray(f.issuesEncountered)&&c.push(...f.issuesEncountered)}let l=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let m of c)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,f])=>f>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(c)],knownGotchas:p}}var qy=h(()=>{"use strict";ie();a(Ly,"clearTask");a(Fy,"hasTask");a(Hy,"getPausedTask");a(Uy,"getAllPausedTasks");a(Lu,"getTaskHistory");a(Gy,"getMostRecentTask");a(Wy,"getTaskHistoryByType");a(By,"getAggregatedFeedback")});async function aa(n,e,t,r){let s={};return await n.update(e,o=>{if(!o.currentTask?.subtasks)return o;let i=o.currentTask.currentSubtaskIndex||0,c=o.currentTask.subtasks[i];if(!c)return o;let l=[...o.currentTask.subtasks];l[i]=t(c);let u=i+1,d=l.length;u<d&&(l[u]={...l[u],status:"in_progress",startedAt:E()});let p=u<d?l[u]:null,m=r?Jy(r(l),d):void 0;return s.value={taskId:o.currentTask.id,current:l[i],next:p,...m?{progress:m}:{}},{...o,currentTask:{...o.currentTask,subtasks:l,currentSubtaskIndex:u<d?u:i,...m?{subtaskProgress:m}:{}},lastUpdated:E()}}),s.value??null}function Jy(n,e){return{completed:n,total:e,percentage:e>0?Math.round(n/e*100):0}}async function Xy(n,e,t){let r=null,s=[];await n.update(e,o=>o.currentTask?(r=o.currentTask.id,s=t.map((i,c)=>({...i,status:c===0?"in_progress":"pending",startedAt:c===0?E():void 0,dependsOn:i.dependsOn||[]})),{...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:Jy(0,s.length)},lastUpdated:E()}):o),r&&await n.publish(e,"subtasks.created",{taskId:r,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function zy(n,e,t){let r=yh.safeParse(t);if(!r.success){let c=r.error.issues.map(l=>`${l.path.join(".")}: ${l.message}`);throw new Error(`Subtask completion requires handoff data:
777
+ `;a(xu,"powershellArgs");a(Pu,"windowsCommand");a(Ty,"readWindowsCredentialManager");a(yA,"writeWindowsCredentialManager");a(wA,"clearWindowsCredentialManager");a(kA,"platformGet");a(bA,"platformSet");a(vA,"platformClear");a(SA,"platformLocation");a(Au,"activeStore");a(ia,"getAuthToken");a(_u,"setAuthToken");a(ju,"clearAuthToken")});var Mu={};L(Mu,{default:()=>ce});import EA from"node:crypto";import Iu from"node:fs/promises";import Ry from"node:os";import xy from"node:path";function Ay(){return EA.randomUUID()}function Du(n){return{...n,apiKey:null}}var _y,Py,$u,TA,ce,En=h(()=>{"use strict";Te();ee();Cy();_y="https://cli-api.prjct.app",Py={apiKey:null,apiUrl:_y,userId:null,email:null,lastAuth:null};a(Ay,"freshDeviceId");a(Du,"metadataOnly");$u=class{static{a(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=j.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await We(this.configPath),t=await ia(),r={...e??Py,apiKey:t},s=!1;if(!t&&e?.apiKey&&(await _u(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Ay(),s=!0),r.hostname||(r.hostname=Ry.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await Ee(this.configPath,Du(this.cachedConfig)),await Iu.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Ay()}async getHostname(){return(await this.read()).hostname??Ry.hostname()}async write(e){let t=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await _u(e.apiKey):await ju());let r={...t,...e,apiKey:await ia(),lastAuth:new Date().toISOString()};await Rt(xy.dirname(this.configPath)),await Ee(this.configPath,Du(r)),await Iu.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await ia()}async getApiUrl(){return(await this.read()).apiUrl||_y}async saveAuth(e,t,r){await this.write({apiKey:e,userId:t,email:r})}async clearAuth(){await ju(),this.cachedConfig={...Py},await Rt(xy.dirname(this.configPath)),await Ee(this.configPath,Du(this.cachedConfig)),await Iu.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},TA=new $u,ce=TA});var Iy={};L(Iy,{publishCRUD:()=>jy,publishCRUDSync:()=>dn});import CA from"node:crypto";function xA(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(PA(n)):JSON.stringify(n);return CA.createHash("sha256").update(e).digest("hex")}function PA(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function AA(){if(Nu)return Nu;try{let{default:n}=await Promise.resolve().then(()=>(En(),Mu)),e=n;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Nu=t,t}return"unknown-device"}catch{return"unknown-device"}}async function jy(n){try{let e=await AA(),t=xA(n.data),r={type:`${n.entityType}.${RA[n.eventType]}`,path:[n.entityType,n.entityId],data:n.data,timestamp:new Date().toISOString(),projectId:n.projectId,entityType:n.entityType,entityId:n.entityId,eventType:n.eventType,contentHash:t,deviceId:e,originDeviceId:n.originDeviceId??e,revisionCount:n.revisionCount??1};await At.publish(r)}catch{}}function dn(n){jy(n)}var RA,Nu,Eo=h(()=>{"use strict";So();RA={upsert:"updated",delete:"deleted"};a(xA,"hashPayload");a(PA,"sortKeys");Nu=null;a(AA,"resolveDeviceId");a(jy,"publishCRUD");a(dn,"publishCRUDSync")});var Tn,Ou,ft,nr=h(()=>{"use strict";vn();Eo();ie();X();Tn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ou=class{static{a(this,"ArchiveStorage")}archive(e,t){let r=Xe(),s=E();return I.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),dn({projectId:e,entityType:"archives",entityId:r,eventType:"upsert",data:{id:r,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:s}}),r}archiveMany(e,t){if(t.length===0)return 0;let r=E();return I.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Xe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,r,i.reason)}),t.length}getArchived(e,t,r=50){return t?I.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,r):I.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(e){let t=I.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in r&&(r[o]=s.count),r.total+=s.count}return r}restore(e,t){let r=I.get(e,"SELECT * FROM archives WHERE id = ?",t);return r?(I.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(r.entity_data)):null}pruneOldArchives(e,t){let r=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);I.run(e,"DELETE FROM archives WHERE archived_at < ?",r);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return I.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ft=new Ou});async function Dy(n,e,t){let r={pausedCount:0};if(await n.update(e,o=>{if(!o.currentTask)return o;n.validateTransition(o,"pause"),r.pausedTask={...o.currentTask,status:"paused",pausedAt:E(),pauseReason:t};let i=[r.pausedTask,...n.getPausedTasksFromState(o)].slice(0,n.maxPausedTasks);return r.pausedCount=i.length,{...o,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:E()}}),!r.pausedTask)return null;let s=r.pausedTask;return await n.publish(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:r.pausedCount}),s}async function $y(n,e,t){let r={remainingPaused:0};if(await n.update(e,o=>{let i=n.getPausedTasksFromState(o);if(i.length===0)return o;n.validateTransition(o,"resume");let c=t?i.findIndex(y=>y.id===t):0;if(c===-1)return o;let l=i[c],u=i.filter((y,x)=>x!==c),{status:d,pausedAt:p,pauseReason:m,...f}=l;return r.currentTask={...f,startedAt:E(),sessionId:l.sessionId??Xe()},r.remainingPaused=u.length,{...o,currentTask:r.currentTask,previousTask:null,pausedTasks:u,lastUpdated:E()}}),!r.currentTask)return null;let s=r.currentTask;return await n.publish(e,"task.resumed",{taskId:s.id,description:s.description,resumedAt:s.startedAt,remainingPaused:r.remainingPaused}),s}async function My(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t),s=Date.now()-n.stalenessThresholdDays*24*60*60*1e3;return r.filter(o=>new Date(o.pausedAt).getTime()<s)}async function Ny(n,e){let t=Date.now()-n.stalenessThresholdDays*24*60*60*1e3,r=[];if(await n.update(e,s=>{let o=n.getPausedTasksFromState(s);if(r=o.filter(c=>new Date(c.pausedAt).getTime()<t),r.length===0)return s;let i=o.filter(c=>new Date(c.pausedAt).getTime()>=t);return{...s,pausedTasks:i,previousTask:null,lastUpdated:E()}}),r.length===0)return[];ft.archiveMany(e,r.map(s=>({entityType:"paused_task",entityId:s.id,entityData:s,summary:s.description,reason:"staleness"})));for(let s of r)await n.publish(e,"task.archived",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:"staleness"});return r}var Oy=h(()=>{"use strict";vn();ie();nr();a(Dy,"pauseTask");a($y,"resumeTask");a(My,"getStalePausedTasks");a(Ny,"archiveStalePausedTasks")});async function Ly(n,e){await n.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:E()}))}async function Fy(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t);return t.currentTask!==null||r.length>0}async function Hy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)[0]||null}async function Uy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)}async function Lu(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)}async function Gy(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)[0]||null}async function Wy(n,e,t){let r=await n.read(e);return n.getTaskHistoryFromState(r).filter(o=>o.classification===t)}async function By(n,e){let r=(await Lu(n,e)).filter(m=>m.feedback),s=[],o=[],i=[],c=[];for(let m of r){let f=m.feedback;Array.isArray(f.stackConfirmed)&&s.push(...f.stackConfirmed),Array.isArray(f.patternsDiscovered)&&o.push(...f.patternsDiscovered),Array.isArray(f.agentAccuracy)&&i.push(...f.agentAccuracy),Array.isArray(f.issuesEncountered)&&c.push(...f.issuesEncountered)}let l=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let m of c)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,f])=>f>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(c)],knownGotchas:p}}var qy=h(()=>{"use strict";ie();a(Ly,"clearTask");a(Fy,"hasTask");a(Hy,"getPausedTask");a(Uy,"getAllPausedTasks");a(Lu,"getTaskHistory");a(Gy,"getMostRecentTask");a(Wy,"getTaskHistoryByType");a(By,"getAggregatedFeedback")});async function aa(n,e,t,r){let s={};return await n.update(e,o=>{if(!o.currentTask?.subtasks)return o;let i=o.currentTask.currentSubtaskIndex||0,c=o.currentTask.subtasks[i];if(!c)return o;let l=[...o.currentTask.subtasks];l[i]=t(c);let u=i+1,d=l.length;u<d&&(l[u]={...l[u],status:"in_progress",startedAt:E()});let p=u<d?l[u]:null,m=r?Jy(r(l),d):void 0;return s.value={taskId:o.currentTask.id,current:l[i],next:p,...m?{progress:m}:{}},{...o,currentTask:{...o.currentTask,subtasks:l,currentSubtaskIndex:u<d?u:i,...m?{subtaskProgress:m}:{}},lastUpdated:E()}}),s.value??null}function Jy(n,e){return{completed:n,total:e,percentage:e>0?Math.round(n/e*100):0}}async function Xy(n,e,t){let r=null,s=[];await n.update(e,o=>o.currentTask?(r=o.currentTask.id,s=t.map((i,c)=>({...i,status:c===0?"in_progress":"pending",startedAt:c===0?E():void 0,dependsOn:i.dependsOn||[]})),{...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:Jy(0,s.length)},lastUpdated:E()}):o),r&&await n.publish(e,"subtasks.created",{taskId:r,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function zy(n,e,t){let r=yh.safeParse(t);if(!r.success){let c=r.error.issues.map(l=>`${l.path.join(".")}: ${l.message}`);throw new Error(`Subtask completion requires handoff data:
778
778
  ${c.join(`
779
779
  `)}`)}let{output:s,summary:o}=r.data,i=await aa(n,e,c=>({...c,status:"completed",completedAt:E(),output:s,summary:o}),IA);return i?(await n.publish(e,"subtask.completed",{taskId:i.taskId,subtaskId:i.current.id,description:i.current.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:i.progress}),i.next):null}async function Ky(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[r]||null}async function Yy(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[r]||null}async function Fu(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)-1;return r<0?null:t.currentTask.subtasks[r]||null}async function Qy(n,e){let t=await Fu(n,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function Zy(n,e){return(await n.read(e)).currentTask?.subtasks||[]}async function ew(n,e){return(await n.read(e)).currentTask?.subtaskProgress||null}async function tw(n,e){return((await n.read(e)).currentTask?.subtasks?.length||0)>0}async function nw(n,e){let t=await n.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(r=>r.status==="completed"||r.status==="failed"||r.status==="skipped"):!0}async function rw(n,e,t){let r=await aa(n,e,s=>({...s,status:"failed",completedAt:E(),output:`Failed: ${t}`}),Vy);return r?(await n.publish(e,"subtask.failed",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,error:t}),r.next):null}async function sw(n,e,t){let r=await aa(n,e,s=>({...s,status:"skipped",completedAt:E(),output:`Skipped: ${t}`,skipReason:t}),Vy);return r?(await n.publish(e,"subtask.skipped",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,reason:t}),r.next):null}async function ow(n,e,t){let r=await aa(n,e,s=>({...s,status:"blocked",output:`Blocked: ${t}`,blockReason:t}));return r?(await n.publish(e,"subtask.blocked",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,blocker:t}),r.next):null}var IA,Vy,iw=h(()=>{"use strict";Ui();ie();IA=a(n=>n.filter(e=>e.status==="completed").length,"countCompleted"),Vy=a(n=>n.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="skipped").length,"countResolved");a(aa,"mutateCurrentSubtask");a(Jy,"progressFrom");a(Xy,"createSubtasks");a(zy,"completeSubtask");a(Ky,"getCurrentSubtask");a(Yy,"getNextSubtask");a(Fu,"getPreviousSubtask");a(Qy,"getPreviousHandoff");a(Zy,"getSubtasks");a(ew,"getSubtaskProgress");a(tw,"hasSubtasks");a(nw,"areAllSubtasksComplete");a(rw,"failSubtask");a(sw,"skipSubtask");a(ow,"blockSubtask")});async function aw(n,e,t,r){let s={...t,workspaceId:r,startedAt:E()};return await n.update(e,o=>{if((o.activeTasks||[]).some(i=>i.workspaceId===r))throw new Error("A task is already active in this workspace");return{...o,activeTasks:[...o.activeTasks||[],s],lastUpdated:E()}}),await n.publish(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId,workspaceId:r}),s}async function cw(n,e,t){return((await n.read(e)).activeTasks||[]).find(s=>s.workspaceId===t)??null}async function lw(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(c=>c.workspaceId===t);if(!o)return null;let i=E();return await n.update(e,c=>{let l=(c.activeTasks||[]).find(p=>p.workspaceId===t)??o,d=[n.createTaskHistoryEntry(l,i,r),...n.getTaskHistoryFromState(c)].slice(0,n.maxTaskHistory);return{...c,activeTasks:(c.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:i}}),await n.publish(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:i,workspaceId:t}),o}async function uw(n,e){return(await n.read(e)).activeTasks||[]}async function dw(n,e){return((await n.read(e)).activeTasks||[]).length}async function pw(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(i=>i.workspaceId===t);return o?(await n.update(e,i=>({...i,activeTasks:(i.activeTasks||[]).map(c=>c.workspaceId===t?{...c,...r,workspaceId:t}:c),lastUpdated:E()})),{...o,...r,workspaceId:t}):null}async function mw(n,e,t,r,s){let o=await n.read(e);if(s){if(!(o.activeTasks||[]).some(l=>l.workspaceId===s))return null;let c=null;return await n.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>{if(u.workspaceId!==s)return u;let d=(u.tokensIn||0)+t,p=(u.tokensOut||0)+r;return c={tokensIn:d,tokensOut:p},{...u,tokensIn:d,tokensOut:p}}),lastUpdated:E()})),c}if(!o.currentTask)return null;let i=null;return await n.update(e,c=>{if(!c.currentTask)return c;let l=(c.currentTask.tokensIn||0)+t,u=(c.currentTask.tokensOut||0)+r;return i={tokensIn:l,tokensOut:u},{...c,currentTask:{...c.currentTask,tokensIn:l,tokensOut:u},lastUpdated:E()}}),i}var fw=h(()=>{"use strict";ie();a(aw,"startTaskInWorkspace");a(cw,"getCurrentTaskForWorkspace");a(lw,"completeTaskInWorkspace");a(uw,"getActiveTasks");a(dw,"getActiveTaskCount");a(pw,"updateWorkspaceTask");a(mw,"addTokens")});import MA from"node:crypto";function NA(n){let[e,t]=n.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function OA(n){if(!n||typeof n!="object")return;let e=n;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let r=e[t];if(typeof r=="string"&&r.length>0)return r}}function LA(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(FA(n)):JSON.stringify(n);return MA.createHash("sha256").update(e).digest("hex")}function FA(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function HA(){if(ca)return ca;try{let{default:n}=await Promise.resolve().then(()=>(En(),Mu)),e=n;return typeof e.getDeviceId=="function"?(ca=await e.getDeviceId(),ca):"unknown-device"}catch{return"unknown-device"}}var ca,at,rr=h(()=>{"use strict";So();pu();ie();X();a(NA,"deriveEntityShape");a(OA,"entityIdOf");a(LA,"hashPayload");a(FA,"sortKeys");ca=null;a(HA,"_resolveDeviceId");at=class{static{a(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ki({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let r=this.cache.get(e);if(r!==null)return r}try{let r=I.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,t){I.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let r=this.getStoreKey(),s=I.updateDoc(e,r,t,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,t,r){let s=NA(t),o={type:t,path:[this.filename.replace(".json","")],data:r,timestamp:E(),projectId:e,entityType:s.entityType,entityId:OA(r),eventType:s.eventType,contentHash:LA(r),deviceId:await HA(),revisionCount:1};await At.publish(o)}async publishEntityEvent(e,t,r,s){let o=`${t}.${r}`,i={...s,timestamp:E()};await this.publishEvent(e,o,i)}async exists(e){try{return I.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Hu,J,_t=h(()=>{"use strict";Ui();ie();Ql();Oy();qy();iw();fw();rr();Hu=class extends at{static{a(this,"StateStorage")}constructor(){super("state.json",vh)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t,r){let s=Pr.getCurrentState(e,r),o=Pr.canTransition(s,t);if(!o.valid)throw new Error(`${o.error}. ${o.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 r={};if(await this.update(e,o=>(this.validateTransition(o,"task"),r.currentTask={...t,startedAt:E()},{...o,currentTask:r.currentTask,lastUpdated:E()})),!r.currentTask)throw new Error("Failed to start task");let s=r.currentTask;return await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let r=null;return await this.update(e,s=>s.currentTask?(r={...s.currentTask,...t},{...s,currentTask:r,lastUpdated:E()}):s),r}async completeTask(e,t){let r=E(),s={};if(await this.update(e,i=>{if(!i.currentTask)return i;this.validateTransition(i,"done"),s.completedTask=i.currentTask;let l=[this.createTaskHistoryEntry(s.completedTask,r,t),...this.getTaskHistoryFromState(i)].slice(0,this.maxTaskHistory);return{...i,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:r}}),!s.completedTask)return null;let o=s.completedTask;return await this.publishEvent(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:r}),o}createTaskHistoryEntry(e,t,r){let s=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),o=s.length>0?s.map(c=>c.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:s,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl,harness:e.harness};return r&&(i.feedback=r),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 Dy(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return $y(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 My(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return Ny(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 Ly(this.queryBackend(),e)}async hasTask(e){return Fy(this.queryBackend(),e)}async getPausedTask(e){return Hy(this.queryBackend(),e)}async getAllPausedTasks(e){return Uy(this.queryBackend(),e)}async getTaskHistory(e){return Lu(this.queryBackend(),e)}async getMostRecentTask(e){return Gy(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return Wy(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return By(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,r){let s=await this.read(e);return this.validateTransition(s,"task",r),aw(this.workspaceBackend(),e,t,r)}async getCurrentTaskForWorkspace(e,t){return cw(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,r){return lw(this.workspaceBackend(),e,t,r)}async getActiveTasks(e){return uw(this.workspaceBackend(),e)}async getActiveTaskCount(e){return dw(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,r){return pw(this.workspaceBackend(),e,t,r)}async addTokens(e,t,r,s){return mw(this.workspaceBackend(),e,t,r,s)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return Xy(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return zy(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return Ky(this.subtaskBackend(),e)}async getNextSubtask(e){return Yy(this.subtaskBackend(),e)}async getPreviousSubtask(e){return Fu(this.subtaskBackend(),e)}async getPreviousHandoff(e){return Qy(this.subtaskBackend(),e)}async getSubtasks(e){return Zy(this.subtaskBackend(),e)}async getSubtaskProgress(e){return ew(this.subtaskBackend(),e)}async hasSubtasks(e){return tw(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return nw(this.subtaskBackend(),e)}async failSubtask(e,t){return rw(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return sw(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return ow(this.subtaskBackend(),e,t)}},J=new Hu});function UA(n){return{projectId:n.project_id,taskId:n.task_id,workspaceId:n.workspace_id,classification:n.classification,station:n.station,requiresSpec:n.requires_spec===1,requiresTestsFirst:n.requires_tests_first===1,reason:n.reason,linkedSpecId:n.linked_spec_id,createdAt:n.created_at,updatedAt:n.updated_at}}function gw(n,e){let t=To(n,e.taskId,e.workspaceId),r=E(),s=t?.createdAt??r;return I.run(n,`INSERT INTO task_pipeline_state (
780
780
  project_id, task_id, workspace_id, classification, station,
@@ -1138,7 +1138,7 @@ ${tS(e,t)}`}function Ot(n){let e=Object.entries(n).filter(([,s])=>s!=null);if(e.
1138
1138
 
1139
1139
  `)}function sS(n,e,t,r){let s=e.replace(/_/g," "),o=[`> **${n}**: ${s}`];if(r)for(let[i,c]of Object.entries(r))o.push(`> ${i}: ${c}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
1140
1140
  `))}var Ue=h(()=>{"use strict";et();a(S$,"mdHeader");a(E$,"mdFooter");a(P,"mdOutput");a(tS,"mdTable");a(nS,"mdCodeBlock");a(Np,"mdBadge");a(F,"mdSection");a(Pe,"mdList");a(Jo,"mdTaskHeader");a(qe,"mdNextSteps");a(Ot,"mdStats");a(Ae,"mdDone");a(rS,"mdWarn");a(Op,"mdJoin");a(sS,"mdActionRequired")});import Xo from"chalk";function Hs(n,e={}){if(e.quiet)return;let t=iS[n]||"idle",r=Pr.getValidCommands(t);if(r.length===0)return;let s=r.map(o=>({cmd:`p. ${o}`,desc:oS[o]||o}));console.log(Xo.dim(`
1141
- Next:`));for(let o of s){let i=Xo.cyan(o.cmd.padEnd(12));console.log(Xo.dim(` ${i} \u2192 ${o.desc}`))}}function Ac(n,e=!1){let t=iS[n]||"idle";return Pr.getValidCommands(t).map(s=>({cmd:e?`prjct ${s} --md`:`p. ${s}`,desc:oS[s]||s}))}function aS(n){let e=Pr.getStateInfo(n);console.log(Xo.dim(`\u{1F4CD} State: ${Xo.white(n.toUpperCase())} - ${e.description}`))}var oS,iS,zo=h(()=>{"use strict";Ql();oS={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},iS={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};a(Hs,"showNextSteps");a(Ac,"getNextSteps");a(aS,"showStateInfo")});async function T$(n,e={}){let t=await R.getProjectId(n);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function ce(n,e={}){let t=await fn.ensureInit(n);return t.success?T$(n,e):{ok:!1,result:t}}async function _c(n,e={},t=process.cwd()){let r=await vt(n,t);return r?{ok:!0,value:r}:{ok:!1,result:N('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function jc(n,e,t={}){if(e&&gt.getWorkflow(n,e)?.enabled)return{ok:!0,value:{name:e}};let s=gt.getAllWorkflows(n).map(o=>o.name).join(", ");return{ok:!1,result:N(`Workflow '${e??""}' not found. Available: ${s}`,t)}}var qt=h(()=>{"use strict";K();Ua();Fn();Ao();we();fe();a(T$,"requireProjectId");a(ce,"requireProject");a(_c,"requireActiveTask");a(jc,"requireWorkflow")});async function cS(n=process.cwd(),e={}){try{let t=await ce(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 Ye.seal(r);return e.json?(console.log(JSON.stringify({success:s.success,signature:s.signature,error:s.error})),{success:s.success,error:s.error}):s.success?(g.done("Analysis sealed"),console.log(` Signature: ${s.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:s.signature}}):(g.fail(s.error||"Seal failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async function lS(n=process.cwd(),e={}){try{let t=await ce(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 Ye.rollback(r);return e.json?(console.log(JSON.stringify({success:s.success,restoredSignature:s.restoredSignature,error:s.error})),{success:s.success,error:s.error}):e.md?s.success?(console.log(P(Ae("Analysis Rolled Back"),Ot({"Restored signature":`${s.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:s.restoredSignature}}):(console.log(P("## Rollback Failed",`> ${s.error}`)),{success:!1,error:s.error}):s.success?(g.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${s.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:s.restoredSignature}}):(g.fail(s.error||"Rollback failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async function uS(n=process.cwd(),e={}){if(e.semantic)return Lp(n,e);try{let t=await ce(n);if(!t.ok)return t.result;let r=t.value,s=await Ye.verify(r);return e.json?(console.log(JSON.stringify(s)),{success:s.valid}):(s.valid?g.done(s.message):g.fail(s.message),console.log(""),{success:s.valid,data:s})}catch(t){let r=w(t);return D(r)}}async function Lp(n=process.cwd(),e={}){try{let t=await ce(n);if(!t.ok)return e.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),t.result;let r=t.value,s=n;try{s=I.getDoc(r,"project")?.repoPath||n}catch{}let o=await Ye.semanticVerify(r,s);if(e.json)return console.log(JSON.stringify(o)),{success:o.passed,data:o};console.log(""),o.passed?(g.done("Semantic verification passed"),console.log(` ${o.passedCount}/${o.checks.length} checks passed (${o.totalMs}ms)`)):(g.fail("Semantic verification failed"),console.log(` ${o.failedCount}/${o.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let i of o.checks){let c=i.passed?"\u2713":"\u2717",l=i.passed?`${i.output} (${i.durationMs}ms)`:i.error||"Failed";console.log(` ${c} ${i.name}: ${l}`)}return console.log(""),{success:o.passed,data:o}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}var dS=h(()=>{"use strict";mr();X();W();we();Ue();fe();qt();a(cS,"seal");a(lS,"rollback");a(uS,"verify");a(Lp,"semanticVerifyCommand")});import{z as O}from"zod";function pS(n){let e=$$.safeParse(n);return e.success?{ok:!0,value:e.data}:{ok:!1,error:e.error.issues.map(r=>`${r.path.length>0?r.path.join("."):"<root>"}: ${r.message}`).join("; ")}}var C$,R$,x$,P$,A$,_$,j$,I$,D$,$$,mS=h(()=>{"use strict";C$=O.object({style:O.string(),insights:O.array(O.string()),domains:O.array(O.string())}),R$=O.object({name:O.string(),description:O.string(),locations:O.array(O.string()),confidence:O.number().min(0).max(1),category:O.string()}),x$=O.object({issue:O.string(),reasoning:O.string(),files:O.array(O.string()),suggestion:O.string(),severity:O.enum(["low","medium","high"]),confidence:O.number().min(0).max(1)}),P$=O.object({description:O.string(),area:O.string(),effort:O.enum(["small","medium","large"]),impact:O.string(),priority:O.enum(["low","medium","high"])}),A$=O.object({path:O.string(),reason:O.string(),risk:O.string(),severity:O.enum(["low","medium","high"])}),_$=O.object({description:O.string(),files:O.array(O.string()),benefit:O.string(),effort:O.enum(["small","medium","large"])}),j$=O.object({category:O.string(),rule:O.string(),example:O.string().optional()}),I$=O.object({build:O.string().optional(),test:O.string().optional(),lint:O.string().optional(),dev:O.string().optional(),format:O.string().optional(),install:O.string().optional()}),D$=O.object({languages:O.array(O.string()),frameworks:O.array(O.string()),packageManager:O.string().optional()}),$$=O.object({version:O.literal(1),commitHash:O.string().nullable(),analyzedAt:O.string(),architecture:C$,patterns:O.array(R$),antiPatterns:O.array(x$),techDebt:O.array(P$),riskAreas:O.array(A$),refactorSuggestions:O.array(_$),projectInsights:O.array(O.string()),conventions:O.array(j$),commands:I$.optional(),stack:D$.optional()});a(pS,"parseLlmAnalysis")});import M$ from"node:crypto";import Ko from"node:fs/promises";import N$ from"node:os";import en from"node:path";async function fS(n){let e=await L$(n),t=en.basename(n),r=`obsidian://open?vault=${encodeURIComponent(t)}`,s=O$();if(!s)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:r,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await F$(s,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:r,obsidianConfigFound:!0,alreadyRegistered:i}}function O$(){let n=N$.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=en.join(n,"Library","Application Support","obsidian");break;case"win32":e=en.join(process.env.APPDATA||en.join(n,"AppData","Roaming"),"obsidian");break;default:e=en.join(process.env.XDG_CONFIG_HOME||en.join(n,".config"),"obsidian");break}try{if(!rt("node:fs").existsSync(e))return null}catch{return null}return en.join(e,"obsidian.json")}async function L$(n){let e=en.join(n,".obsidian"),t=en.join(e,"app.json");try{return await Ko.stat(t),!1}catch{}return await Ko.mkdir(e,{recursive:!0}),await Ko.writeFile(t,`${JSON.stringify({},null,2)}
1141
+ Next:`));for(let o of s){let i=Xo.cyan(o.cmd.padEnd(12));console.log(Xo.dim(` ${i} \u2192 ${o.desc}`))}}function Ac(n,e=!1){let t=iS[n]||"idle";return Pr.getValidCommands(t).map(s=>({cmd:e?`prjct ${s} --md`:`p. ${s}`,desc:oS[s]||s}))}function aS(n){let e=Pr.getStateInfo(n);console.log(Xo.dim(`\u{1F4CD} State: ${Xo.white(n.toUpperCase())} - ${e.description}`))}var oS,iS,zo=h(()=>{"use strict";Ql();oS={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},iS={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};a(Hs,"showNextSteps");a(Ac,"getNextSteps");a(aS,"showStateInfo")});async function T$(n,e={}){let t=await R.getProjectId(n);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function ae(n,e={}){let t=await fn.ensureInit(n);return t.success?T$(n,e):{ok:!1,result:t}}async function _c(n,e={},t=process.cwd()){let r=await vt(n,t);return r?{ok:!0,value:r}:{ok:!1,result:N('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function jc(n,e,t={}){if(e&&gt.getWorkflow(n,e)?.enabled)return{ok:!0,value:{name:e}};let s=gt.getAllWorkflows(n).map(o=>o.name).join(", ");return{ok:!1,result:N(`Workflow '${e??""}' not found. Available: ${s}`,t)}}var qt=h(()=>{"use strict";K();Ua();Fn();Ao();we();fe();a(T$,"requireProjectId");a(ae,"requireProject");a(_c,"requireActiveTask");a(jc,"requireWorkflow")});async function cS(n=process.cwd(),e={}){try{let t=await ae(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 Ye.seal(r);return e.json?(console.log(JSON.stringify({success:s.success,signature:s.signature,error:s.error})),{success:s.success,error:s.error}):s.success?(g.done("Analysis sealed"),console.log(` Signature: ${s.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:s.signature}}):(g.fail(s.error||"Seal failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async function lS(n=process.cwd(),e={}){try{let t=await ae(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 Ye.rollback(r);return e.json?(console.log(JSON.stringify({success:s.success,restoredSignature:s.restoredSignature,error:s.error})),{success:s.success,error:s.error}):e.md?s.success?(console.log(P(Ae("Analysis Rolled Back"),Ot({"Restored signature":`${s.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:s.restoredSignature}}):(console.log(P("## Rollback Failed",`> ${s.error}`)),{success:!1,error:s.error}):s.success?(g.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${s.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:s.restoredSignature}}):(g.fail(s.error||"Rollback failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async function uS(n=process.cwd(),e={}){if(e.semantic)return Lp(n,e);try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=await Ye.verify(r);return e.json?(console.log(JSON.stringify(s)),{success:s.valid}):(s.valid?g.done(s.message):g.fail(s.message),console.log(""),{success:s.valid,data:s})}catch(t){let r=w(t);return D(r)}}async function Lp(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),t.result;let r=t.value,s=n;try{s=I.getDoc(r,"project")?.repoPath||n}catch{}let o=await Ye.semanticVerify(r,s);if(e.json)return console.log(JSON.stringify(o)),{success:o.passed,data:o};console.log(""),o.passed?(g.done("Semantic verification passed"),console.log(` ${o.passedCount}/${o.checks.length} checks passed (${o.totalMs}ms)`)):(g.fail("Semantic verification failed"),console.log(` ${o.failedCount}/${o.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let i of o.checks){let c=i.passed?"\u2713":"\u2717",l=i.passed?`${i.output} (${i.durationMs}ms)`:i.error||"Failed";console.log(` ${c} ${i.name}: ${l}`)}return console.log(""),{success:o.passed,data:o}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}var dS=h(()=>{"use strict";mr();X();W();we();Ue();fe();qt();a(cS,"seal");a(lS,"rollback");a(uS,"verify");a(Lp,"semanticVerifyCommand")});import{z as O}from"zod";function pS(n){let e=$$.safeParse(n);return e.success?{ok:!0,value:e.data}:{ok:!1,error:e.error.issues.map(r=>`${r.path.length>0?r.path.join("."):"<root>"}: ${r.message}`).join("; ")}}var C$,R$,x$,P$,A$,_$,j$,I$,D$,$$,mS=h(()=>{"use strict";C$=O.object({style:O.string(),insights:O.array(O.string()),domains:O.array(O.string())}),R$=O.object({name:O.string(),description:O.string(),locations:O.array(O.string()),confidence:O.number().min(0).max(1),category:O.string()}),x$=O.object({issue:O.string(),reasoning:O.string(),files:O.array(O.string()),suggestion:O.string(),severity:O.enum(["low","medium","high"]),confidence:O.number().min(0).max(1)}),P$=O.object({description:O.string(),area:O.string(),effort:O.enum(["small","medium","large"]),impact:O.string(),priority:O.enum(["low","medium","high"])}),A$=O.object({path:O.string(),reason:O.string(),risk:O.string(),severity:O.enum(["low","medium","high"])}),_$=O.object({description:O.string(),files:O.array(O.string()),benefit:O.string(),effort:O.enum(["small","medium","large"])}),j$=O.object({category:O.string(),rule:O.string(),example:O.string().optional()}),I$=O.object({build:O.string().optional(),test:O.string().optional(),lint:O.string().optional(),dev:O.string().optional(),format:O.string().optional(),install:O.string().optional()}),D$=O.object({languages:O.array(O.string()),frameworks:O.array(O.string()),packageManager:O.string().optional()}),$$=O.object({version:O.literal(1),commitHash:O.string().nullable(),analyzedAt:O.string(),architecture:C$,patterns:O.array(R$),antiPatterns:O.array(x$),techDebt:O.array(P$),riskAreas:O.array(A$),refactorSuggestions:O.array(_$),projectInsights:O.array(O.string()),conventions:O.array(j$),commands:I$.optional(),stack:D$.optional()});a(pS,"parseLlmAnalysis")});import M$ from"node:crypto";import Ko from"node:fs/promises";import N$ from"node:os";import en from"node:path";async function fS(n){let e=await L$(n),t=en.basename(n),r=`obsidian://open?vault=${encodeURIComponent(t)}`,s=O$();if(!s)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:r,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await F$(s,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:r,obsidianConfigFound:!0,alreadyRegistered:i}}function O$(){let n=N$.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=en.join(n,"Library","Application Support","obsidian");break;case"win32":e=en.join(process.env.APPDATA||en.join(n,"AppData","Roaming"),"obsidian");break;default:e=en.join(process.env.XDG_CONFIG_HOME||en.join(n,".config"),"obsidian");break}try{if(!rt("node:fs").existsSync(e))return null}catch{return null}return en.join(e,"obsidian.json")}async function L$(n){let e=en.join(n,".obsidian"),t=en.join(e,"app.json");try{return await Ko.stat(t),!1}catch{}return await Ko.mkdir(e,{recursive:!0}),await Ko.writeFile(t,`${JSON.stringify({},null,2)}
1142
1142
  `,"utf-8"),!0}async function F$(n,e){let t={};try{let c=await Ko.readFile(n,"utf-8");t=JSON.parse(c)}catch{}let r=t.vaults??{},s=en.resolve(e);for(let c of Object.values(r))if(en.resolve(c.path)===s)return{registered:!1,alreadyRegistered:!0};let o=M$.randomBytes(8).toString("hex");r[o]={path:s,ts:Date.now()};let i={...t,vaults:r};try{return await Ko.writeFile(n,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var gS=h(()=>{"use strict";a(fS,"ensureObsidianVault");a(O$,"resolveObsidianConfigPath");a(L$,"bootstrapObsidianDir");a(F$,"registerVaultInObsidianConfig")});import H$ from"node:crypto";function dt(n,e=60){let t=Ns(n).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");if(t.length>e){let r=t.lastIndexOf("-",e);t=t.slice(0,r>e/2?r:e).replace(/-+$/,"")}return t||"unnamed"}function hS(n){return H$.createHash("sha256").update(n).digest("hex").slice(0,16)}function tn(n,e){return n.length>e?`${n.slice(0,e-1)}\u2026`:n}function yS(n,e=U$){if(n.length<=e)return[n];let t=[];for(let r=0;r<n.length;r+=e)t.push(n.slice(r,r+e));return t}function Fp(n,e){return`${n}::${e.trim().toLowerCase()}`}function Ic(n){let e=(n.analyzedAt||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:"undated"}var U$,Yo,gn=h(()=>{"use strict";vc();U$=50,Yo={pattern:"patterns","anti-pattern":"anti-patterns","tech-debt":"tech-debt","risk-area":"risk-areas",refactor:"refactors",insight:"insights"};a(dt,"slugify");a(hS,"sha256");a(tn,"truncate");a(yS,"chunkEntries");a(Fp,"conceptKey");a(Ic,"analysisDateOnly")});function Us(n){let e=[];for(let{name:t,re:r}of wS)r.test(n)&&e.push(t);return e}function kS(n){return n.replace(/[`*_[\](){}<>\\]/g,e=>`\\${e}`)}var wS,F5,Qo=h(()=>{"use strict";wS=[{name:"instruction-override",re:/\b(ignore|disregard|override|forget)\b[^.]{0,40}\b(previous|prior|above|system|prompt|instructions?|rules?|constraints?)\b/i},{name:"role-play-injection",re:/\b(you\s+are\s+now|act\s+as|pretend\s+to\s+be|roleplay\s+as|assume\s+the\s+role)\b[^.]{0,40}\b(system|admin|root|developer|operator|jailbreak)\b/i},{name:"jailbreak-phrase",re:/\b(DAN\s+mode|do\s+anything\s+now|without\s+restrictions?|bypass\s+(?:safety|filters?|guidelines?)|jailbreak\s+mode)\b/i},{name:"fake-system-tag",re:/<\s*(?:system|assistant|tool[_-]?call|function[_-]?call)\s*>/i}],F5=wS.map(n=>n.name);a(Us,"scanForPromptInjection");a(kS,"escapeMarkdownInline")});function G$(n){return n.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function Kr(n){return n.type==="gotcha"?"gotcha":n.tags?.pattern==="recurring-bug"?"recurring-bug":n.type}function gr(n,e=220){let t=n.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function je(n){let e=(n.content??"").trim();e=e.replace(/^(?:[-*•]\s+|\s+)+/,""),e=e.replace(/^(?:\[\[[^\]]*\]\]|mem[_-]\d+)[\s:,-]*/i,"").trim();let t=e.length;for(let o of[/\n/,/\.\s/,/:\s/,/;\s/,/\s—\s/,/\s\(/]){let i=e.match(o);i&&i.index!==void 0&&i.index>4&&i.index<t&&(t=i.index)}let r=e.slice(0,t).replace(/\s+/g," ").trim();if(r=r.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),r.length>bS){let o=r.slice(0,bS),i=o.lastIndexOf(" ");r=`${(i>40?o.slice(0,i):o).trim()}\u2026`}r.length<6&&(r=`${n.type} ${n.id}`);let s=n.tags?.pr;return s&&!new RegExp(`\\b#?${s}\\b`).test(r)&&(r=`${r} (PR #${s})`),r}function hn(n,e){return n.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,r)=>{let s=`mem_${r}`,o=e?.idTypeIndex?.get(s),i=e?.idTitleIndex?.get(s),c=e?.idSlugIndex?.get(s),l=i?G$(i):s;return e?.signalIds?.has(s)?`[[signals#^mem-${r}|${l}]]`:c&&o&&e?.perEntryTypes?.has(o)?`[[${c}|${l}]]`:o?`[[${o}#^mem-${r}|${l}]]`:i?`[[${s}|${l}]]`:`\`${s}\``})}function hr(n,e){if(n.length===0)return"> No matching memory entries.";let t=new Map;for(let u of n){let d=t.get(u.type)??[];d.push(u),t.set(u.type,d)}let r=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],s=[],o={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=e?.boundary==="llm",c=a((u,d)=>{if(d.length!==0){s.push(`### ${u.toUpperCase()}`);for(let p of d){let m=Object.entries(p.tags).filter(([T])=>!e?.vault||!Dc.has(T)).map(([T,H])=>`${T}=${i?kS(H):H}`).join(" "),f=o[p.provenance],y=e?.vault?hn(p.content,e):p.content,x=m?` _(${e?.vault?hn(m,e):m})_`:"",b=p.id.replace(/^mem[_-]/,""),S=e?.vault?` ^mem-${b}`:"",C=`- \`${f}\` [${p.id} \xB7 ${p.type}] ${y}${x}${S}`;i?(s.push(`<user_content id="${p.id}" type="${p.type}">`),s.push(C),s.push("</user_content>")):s.push(C)}s.push("")}},"renderGroup"),l=new Set;for(let u of r){let d=t.get(u);!d||d.length===0||(c(u,d),l.add(u))}for(let[u,d]of t)l.has(u)||c(u,d);return s.join(`
1143
1143
  `).trim()}var Dc,bS,Lt=h(()=>{"use strict";Qo();Dc=new Set(["source","session","window_days","window-days","touches","occurrences","phrase","slug","hash","content-hash","content_hash","key","kind","spec-id","spec_id"]),bS=72;a(G$,"linkLabel");a(Kr,"preventiveLabel");a(gr,"flatDetail");a(je,"deriveTitle");a(hn,"linkifyMemRefs");a(hr,"formatMemoryMd")});function W$(n){return tn(n.replace(/\s+/g," ").trim(),200)}function SS(n){return`- **${je(n)}** \u2014 ${W$(n.content)} \`${n.id}\``}function ES(n){let e=n.filter(s=>s.type==="decision").slice(0,vS),t=n.filter(s=>s.type==="gotcha").slice(0,vS);if(e.length===0&&t.length===0)return null;let r=["# Architecture",""];if(r.push("> Synthesized from project memory \u2014 the decisions and gotchas the project recorded.","> Read this before re-reading source. The full knowledge graph is under `memory/`.",""),e.length>0){r.push("## Key decisions \u2014 the *why*","");for(let s of e)r.push(SS(s));r.push("")}if(t.length>0){r.push("## Known gotchas \u2014 traps to avoid","");for(let s of t)r.push(SS(s));r.push("")}return r.push("---","","See also: [project wiki](index.md)",""),`${r.join(`
1144
1144
  `)}
@@ -1271,9 +1271,9 @@ Open this folder as an Obsidian vault to browse project memory.
1271
1271
  `),ql++),await em(n),await nm(n),await fS(t).catch(()=>{}),{wikiRoot:t,filesWritten:ql,filesSkipped:fh,filesRemoved:Vl}}function UM(n){let e=new Map;for(let t of n){let r=t.spec_id??t.task_id??t.id,s=t.started_at.replace(/[:.]/g,"-"),o=`crew-runs/${r}-${s}.md`,i=[`# Crew run \u2014 ${r}`,"",`- **run-id**: \`${t.id}\``,`- **spec**: ${t.spec_id?`\`${t.spec_id}\``:"_(none)_"}`,`- **task**: ${t.task_id?`\`${t.task_id}\``:"_(none)_"}`,`- **started**: ${t.started_at}`,`- **ended**: ${t.ended_at}`,`- **verdict**: **${t.reviewer_verdict}**`,"","## Implementer summary","",t.implementer_summary,"","## Files touched","",t.files_touched.length===0?"_(none recorded)_":t.files_touched.map(c=>`- \`${c}\``).join(`
1272
1272
  `),...t.reviewer_notes?["","## Reviewer notes","",t.reviewer_notes]:[],""].join(`
1273
1273
  `);e.set(o,i)}return e}function GM(n){return n===null?null:["# Team enrollment","",`- **required**: ${n.required}`,`- **minVersion**: \`${n.minVersion}\``,`- **enrolledAt**: ${n.enrolledAt}`,`- **enrolledBy**: ${n.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(`
1274
- `)}async function ni(n,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{um(n,e).catch(()=>{})});return}try{await um(n,e)}catch{}}var Bc,yn=h(()=>{"use strict";ve();mr();Gr();Xr();Pn();gS();gn();TS();RS();PS();_S();DS();LS();US();JS();zS();Wp();YS();ZS();Hc();zp();Bc="_generated";a(SE,"runBuilder");a(um,"generateWiki");a(UM,"buildCrewRunFiles");a(GM,"buildTeamFile");a(ni,"regenerateWikiDeferred")});import EE from"node:fs/promises";import TE from"node:path";async function RE(n,e=process.cwd(),t={}){try{let r=await ce(e);if(!r.ok)return r.result;let s=r.value,o=await WM(n,e),i=await BM(o.content,e);ht.save(s,i);let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(yn(),kr));return await c(e,s),t.md?console.log(P(Ae("LLM Analysis Saved"),Ot({Input:o.source,Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",input:o.source,stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return Ne(r)}}async function WM(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm requires analysis text, JSON, or a file path");let r=TE.isAbsolute(t)?t:TE.resolve(e,t);try{if((await EE.stat(r)).isFile())return{content:await EE.readFile(r,"utf-8"),source:"file"}}catch{}return{content:n,source:"inline"}}async function BM(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm received an empty analysis");let r=qM(t);if(r.ok){let s=pS(r.value);return s.ok?s.value:CE(`Structured analysis did not match the legacy schema; preserved as LLM notes.
1274
+ `)}async function ni(n,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{um(n,e).catch(()=>{})});return}try{await um(n,e)}catch{}}var Bc,yn=h(()=>{"use strict";ve();mr();Gr();Xr();Pn();gS();gn();TS();RS();PS();_S();DS();LS();US();JS();zS();Wp();YS();ZS();Hc();zp();Bc="_generated";a(SE,"runBuilder");a(um,"generateWiki");a(UM,"buildCrewRunFiles");a(GM,"buildTeamFile");a(ni,"regenerateWikiDeferred")});import EE from"node:fs/promises";import TE from"node:path";async function RE(n,e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await WM(n,e),i=await BM(o.content,e);ht.save(s,i);let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(yn(),kr));return await c(e,s),t.md?console.log(P(Ae("LLM Analysis Saved"),Ot({Input:o.source,Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",input:o.source,stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return Ne(r)}}async function WM(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm requires analysis text, JSON, or a file path");let r=TE.isAbsolute(t)?t:TE.resolve(e,t);try{if((await EE.stat(r)).isFile())return{content:await EE.readFile(r,"utf-8"),source:"file"}}catch{}return{content:n,source:"inline"}}async function BM(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm received an empty analysis");let r=qM(t);if(r.ok){let s=pS(r.value);return s.ok?s.value:CE(`Structured analysis did not match the legacy schema; preserved as LLM notes.
1275
1275
 
1276
- ${JSON.stringify(r.value,null,2)}`,e)}return CE(t,e)}function qM(n){try{return{ok:!0,value:JSON.parse(n)}}catch{return{ok:!1}}}async function CE(n,e){let t=VM(n);return{version:1,commitHash:await XM(e),analyzedAt:E(),architecture:{style:"unknown",insights:t.slice(0,8),domains:[]},patterns:[],antiPatterns:[],techDebt:[],riskAreas:[],refactorSuggestions:[],projectInsights:t,conventions:[]}}function VM(n){let e=n.split(/\r?\n/).map(s=>s.replace(/^\s{0,3}#{1,6}\s+/,"").replace(/^\s*[-*]\s+\[[ xX]\]\s+/,"").replace(/^\s*[-*]\s+/,"").replace(/^\s*\d+[.)]\s+/,"").trim()).filter(JM),t=[],r=new Set;for(let s of e){let o=s.toLowerCase();if(!r.has(o)&&(r.add(o),t.push(s),t.length>=40))break}return t.length>0?t:[n.slice(0,2e3)]}function JM(n){if(!n||!/[\p{L}\p{N}]/u.test(n))return!1;let e=n.toLowerCase().replace(/\s+/g," ").trim();return!(["current work","wip","misc","todo","n/a","none","latest","unreleased","changelog"].includes(e)||/^[-=_]{3,}$/.test(e)||/^(added|changed|fixed|removed)$/i.test(e)||/^v?\d+\.\d+\.\d+(?:-[\w.-]+)?$/i.test(e))}async function XM(n){try{let{stdout:e}=await G("git",["rev-parse","HEAD"],{cwd:n});return e.trim()||null}catch{return null}}async function xE(n=process.cwd(),e={}){try{let t=await ce(n);if(!t.ok)return t.result;let r=t.value,s=ht.getActive(r);if(!s)return e.md?console.log(P("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(e.md){let o=[Ae(`LLM Analysis (${s.architecture.style})`),""];if(s.architecture.insights.length>0&&o.push(F("Architecture Insights",Pe(s.architecture.insights.slice(0,5)))),s.patterns.length>0){let i=s.patterns.slice(0,8);o.push(F(`Patterns (${s.patterns.length})`,Pe(i.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(s.antiPatterns.length>0){let i=s.antiPatterns.slice(0,5);o.push(F(`Anti-Patterns (${s.antiPatterns.length})`,Pe(i.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(s.techDebt.length>0){let i=s.techDebt.slice(0,5);o.push(F(`Tech Debt (${s.techDebt.length})`,Pe(i.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}s.conventions.length>0&&o.push(F("Conventions",Pe(s.conventions.slice(0,5).map(i=>`**${i.category}**: ${i.rule}`)))),console.log(P(...o))}else{let o={...s,patterns:s.patterns.slice(0,10),antiPatterns:s.antiPatterns.slice(0,6),techDebt:s.techDebt.slice(0,6),conventions:s.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:o}))}return{success:!0,data:s}}catch(t){return Ne(t)}}var PE=h(()=>{"use strict";mS();Gr();ie();pe();we();Ue();qt();a(RE,"saveLlmAnalysis");a(WM,"resolveAnalysisInput");a(BM,"normalizeAnalysis");a(qM,"tryParseJson");a(CE,"analysisFromText");a(VM,"textToInsights");a(JM,"isUsefulInsight");a(XM,"resolveCurrentCommit");a(xE,"getLlmAnalysis")});import zM from"node:path";async function AE(n,e){let t=Date.now()-e;await tt.installGlobalConfig(),g.done(`Synced ${n.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let r=n.stats.frameworks.length>0?` (${n.stats.frameworks[0]})`:"",s=n.syncMetrics?.indexes,o=[`${n.stats.fileCount} files indexed`,`Stack: ${n.stats.ecosystem}${r} | Branch: ${n.git.branch}`];if(s?.bm25Files){let c=s.bm25Files*(s.bm25AvgTokens||0);o.push(`Index: ${Vs(c)} tokens | ${s.bm25VocabSize||0} terms | ${s.importEdges||0} imports`)}g.box("Sync Summary",o.join(`
1276
+ ${JSON.stringify(r.value,null,2)}`,e)}return CE(t,e)}function qM(n){try{return{ok:!0,value:JSON.parse(n)}}catch{return{ok:!1}}}async function CE(n,e){let t=VM(n);return{version:1,commitHash:await XM(e),analyzedAt:E(),architecture:{style:"unknown",insights:t.slice(0,8),domains:[]},patterns:[],antiPatterns:[],techDebt:[],riskAreas:[],refactorSuggestions:[],projectInsights:t,conventions:[]}}function VM(n){let e=n.split(/\r?\n/).map(s=>s.replace(/^\s{0,3}#{1,6}\s+/,"").replace(/^\s*[-*]\s+\[[ xX]\]\s+/,"").replace(/^\s*[-*]\s+/,"").replace(/^\s*\d+[.)]\s+/,"").trim()).filter(JM),t=[],r=new Set;for(let s of e){let o=s.toLowerCase();if(!r.has(o)&&(r.add(o),t.push(s),t.length>=40))break}return t.length>0?t:[n.slice(0,2e3)]}function JM(n){if(!n||!/[\p{L}\p{N}]/u.test(n))return!1;let e=n.toLowerCase().replace(/\s+/g," ").trim();return!(["current work","wip","misc","todo","n/a","none","latest","unreleased","changelog"].includes(e)||/^[-=_]{3,}$/.test(e)||/^(added|changed|fixed|removed)$/i.test(e)||/^v?\d+\.\d+\.\d+(?:-[\w.-]+)?$/i.test(e))}async function XM(n){try{let{stdout:e}=await G("git",["rev-parse","HEAD"],{cwd:n});return e.trim()||null}catch{return null}}async function xE(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=ht.getActive(r);if(!s)return e.md?console.log(P("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(e.md){let o=[Ae(`LLM Analysis (${s.architecture.style})`),""];if(s.architecture.insights.length>0&&o.push(F("Architecture Insights",Pe(s.architecture.insights.slice(0,5)))),s.patterns.length>0){let i=s.patterns.slice(0,8);o.push(F(`Patterns (${s.patterns.length})`,Pe(i.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(s.antiPatterns.length>0){let i=s.antiPatterns.slice(0,5);o.push(F(`Anti-Patterns (${s.antiPatterns.length})`,Pe(i.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(s.techDebt.length>0){let i=s.techDebt.slice(0,5);o.push(F(`Tech Debt (${s.techDebt.length})`,Pe(i.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}s.conventions.length>0&&o.push(F("Conventions",Pe(s.conventions.slice(0,5).map(i=>`**${i.category}**: ${i.rule}`)))),console.log(P(...o))}else{let o={...s,patterns:s.patterns.slice(0,10),antiPatterns:s.antiPatterns.slice(0,6),techDebt:s.techDebt.slice(0,6),conventions:s.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:o}))}return{success:!0,data:s}}catch(t){return Ne(t)}}var PE=h(()=>{"use strict";mS();Gr();ie();pe();we();Ue();qt();a(RE,"saveLlmAnalysis");a(WM,"resolveAnalysisInput");a(BM,"normalizeAnalysis");a(qM,"tryParseJson");a(CE,"analysisFromText");a(VM,"textToInsights");a(JM,"isUsefulInsight");a(XM,"resolveCurrentCommit");a(xE,"getLlmAnalysis")});import zM from"node:path";async function AE(n,e){let t=Date.now()-e;await tt.installGlobalConfig(),g.done(`Synced ${n.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let r=n.stats.frameworks.length>0?` (${n.stats.frameworks[0]})`:"",s=n.syncMetrics?.indexes,o=[`${n.stats.fileCount} files indexed`,`Stack: ${n.stats.ecosystem}${r} | Branch: ${n.git.branch}`];if(s?.bm25Files){let c=s.bm25Files*(s.bm25AvgTokens||0);o.push(`Index: ${Vs(c)} tokens | ${s.bm25VocabSize||0} terms | ${s.importEdges||0} imports`)}g.box("Sync Summary",o.join(`
1277
1277
  `));let i=[];if(n.generatedSkills?.generated&&n.generatedSkills.generated.length>0){let c=n.generatedSkills.generated.length,l=c===1?"skill":"skills";i.push(`${c} ${l} generated`)}if(n.context7&&i.push(`Context7: ${n.context7.verified?"verified":`not ready${n.context7.message?` (${n.context7.message})`:""}`}`),n.analysisSummary&&i.push(`Analysis: ${n.analysisSummary.patterns} patterns | ${n.analysisSummary.antiPatterns} anti-patterns (${n.analysisSummary.criticalAntiPatterns} critical)`),g.section("Generated"),g.list(i,{bullet:"\u2713"}),console.log(""),n.git.hasChanges&&(g.warn("Uncommitted changes detected"),console.log("")),n.verification){let c=n.verification;if(c.passed){let l=c.checks.map(u=>`${u.name} (${u.durationMs}ms)`);g.section("Verified"),g.list(l,{bullet:"\u2713"})}else{g.section("Verification");let l=c.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);g.list(l),c.skippedCount>0&&g.warn(`${c.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Hs("sync"),{success:!0,data:n,metrics:{elapsed:t,fileCount:n.stats.fileCount}}}async function _E(n){try{let e=await ze.getRecentEvents(n,100),t=new Date().toISOString().split("T")[0],r=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(r.length>=2){let u=r.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];s=Ch(d)}}let o=r.filter(u=>u.action==="task_completed").length,i=r.filter(u=>u.action==="feature_shipped").length,c=new Map;for(let u of r)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)c.set(d,(c.get(d)||0)+1);let l=Array.from(c.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:l}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Vs(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:n.toLocaleString()}function dm(n){return n<1e3?`${Math.round(n)}ms`:`${(n/1e3).toFixed(1)}s`}function jE(n){if(n.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=n.map(s=>s.tokensSaved),r=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/r*(e.length-1)),e.length-1);return e[o]}).join("")}function IE(n,e,t,r,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${r}_`),i.push(""),s){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let c=s.agentsUsed.slice(0,3).map(l=>`${l.name} (${l.count}\xD7)`).join(", ");i.push(`| Agents used | ${c} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${Vs(n.totalTokensSaved)} |`),i.push(`| Compression | ${(n.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${dc(n.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${n.syncCount} |`),i.push(`| Avg time | ${dm(n.avgSyncDuration)} |`),i.push(""),n.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let c=n.topAgents.reduce((l,u)=>l+u.usageCount,0);for(let l of n.topAgents){let u=c>0?(l.usageCount/c*100).toFixed(0):0;i.push(`| ${l.agentName} | ${u}% (${l.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${Vs(n.last30DaysTokens)}`),n.trend!==0){let c=n.trend>0?"+":"";i.push(`- Trend: ${c}${n.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
1278
1278
  `)}function DE(n,e){let t=[];t.push(`# Repository Analysis
1279
1279
  `),t.push(`Generated: ${new Date().toLocaleString()}
@@ -1293,12 +1293,12 @@ ${JSON.stringify(r.value,null,2)}`,e)}return CE(t,e)}function qM(n){try{return{o
1293
1293
  `).slice(0,5).forEach(c=>{if(c.trim()){let[l,,u,d]=c.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1294
1294
  `),t.push("Based on detected stack, consider generating specialized agents using `p. sync`.\n"),t.push(`---
1295
1295
  `),t.push("*This analysis was generated automatically. For updated information, run `p. analyze` again.*\n"),t.join(`
1296
- `)}var pm=h(()=>{"use strict";Dn();pc();xn();ie();zo();fe();a(AE,"showSyncResult");a(_E,"getSessionActivity");a(Vs,"formatTokens");a(dm,"formatDuration");a(jE,"generateSparkline");a(IE,"generateStatsMarkdown");a(DE,"generateAnalysisSummary")});async function $E(n=process.cwd(),e={}){try{let t=await ce(n);if(!t.ok)return t.result;let r=t.value,s=await $s.getSummary(r),o=await $s.getDailyStats(r,30),i=await _E(r),c={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:c,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:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=I.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await $s.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"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Vs(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${dc(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${dm(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,f)=>m+f.usageCount,0);for(let m of s.topAgents){let f=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${f}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=jE(o);if(console.log(` ${p} ${Vs(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",f=s.trend>0?"+":"";console.log(` ${m} ${f}${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=IE(s,o,l,d,i,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:c}}}catch(t){return console.error("\u274C Error:",w(t)),Ne(t)}}async function ME(n=process.cwd(),e={}){try{let t=await ce(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 Ye.diff(r);if(!s){let o="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:o})):e.md?console.log(P("## Analysis Diff",`> ${o}`)):g.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(P(Ga(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(Rk(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var NE=h(()=>{"use strict";pc();Wa();mr();X();yp();W();we();Ue();fe();pm();qt();a($E,"stats");a(ME,"diff")});var qc={};L(qc,{AnalysisCommands:()=>mm});import OE from"node:fs/promises";var LE,mm,Vc=h(()=>{"use strict";Tk();K();Te();Wa();Gk();Mp();mr();Gr();W();ie();we();Ue();zo();fe();dS();PE();NE();pm();Ce();qt();LE=["> 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(`
1296
+ `)}var pm=h(()=>{"use strict";Dn();pc();xn();ie();zo();fe();a(AE,"showSyncResult");a(_E,"getSessionActivity");a(Vs,"formatTokens");a(dm,"formatDuration");a(jE,"generateSparkline");a(IE,"generateStatsMarkdown");a(DE,"generateAnalysisSummary")});async function $E(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=await $s.getSummary(r),o=await $s.getDailyStats(r,30),i=await _E(r),c={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:c,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:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=I.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await $s.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"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Vs(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${dc(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${dm(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,f)=>m+f.usageCount,0);for(let m of s.topAgents){let f=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${f}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=jE(o);if(console.log(` ${p} ${Vs(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",f=s.trend>0?"+":"";console.log(` ${m} ${f}${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=IE(s,o,l,d,i,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:c}}}catch(t){return console.error("\u274C Error:",w(t)),Ne(t)}}async function ME(n=process.cwd(),e={}){try{let t=await ae(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 Ye.diff(r);if(!s){let o="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:o})):e.md?console.log(P("## Analysis Diff",`> ${o}`)):g.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(P(Ga(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(Rk(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var NE=h(()=>{"use strict";pc();Wa();mr();X();yp();W();we();Ue();fe();pm();qt();a($E,"stats");a(ME,"diff")});var qc={};L(qc,{AnalysisCommands:()=>mm});import OE from"node:fs/promises";var LE,mm,Vc=h(()=>{"use strict";Tk();K();Te();Wa();Gk();Mp();mr();Gr();W();ie();we();Ue();zo();fe();dS();PE();NE();pm();Ce();qt();LE=["> 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(`
1297
1297
  `),mm=class extends V{static{a(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1298
1298
  `),Ke.init(t);let r={packageJson:await Ke.readPackageJson(),cargoToml:await Ke.readCargoToml(),goMod:await Ke.readGoMod(),requirements:await Ke.readRequirements(),directories:await Ke.listDirectories(),fileCount:await Ke.countFiles(),gitStats:await Ke.getGitStats(),gitLog:await Ke.getGitLog(20),hasDockerfile:await Ke.fileExists("Dockerfile"),hasDockerCompose:await Ke.fileExists("docker-compose.yml"),hasReadme:await Ke.fileExists("README.md"),hasTsconfig:await Ke.fileExists("tsconfig.json"),hasViteConfig:await Ke.fileExists("vite.config.ts")||await Ke.fileExists("vite.config.js"),hasNextConfig:await Ke.fileExists("next.config.js")||await Ke.fileExists("next.config.mjs")},s=DE(r,t),o=await R.readConfig(t).catch(()=>null),i=await j.getWikiPath(t,o?.vaultPath),c=`${i}/_generated/analysis/repo-summary.md`;return await OE.mkdir(`${i}/_generated/analysis`,{recursive:!0}),await OE.writeFile(c,s,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:E(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
1299
1299
  `),console.log(`\u{1F4C4} Full report: ${j.getDisplayPath(c)}
1300
- `),console.log("Next steps:"),console.log("\u2022 p. sync \u2192 Generate agents based on stack"),console.log('\u2022 p. task "<description>" \u2192 Start tracked work'),{success:!0,summaryPath:c,data:r}}catch(r){return console.error("\u274C Error:",w(r)),Ne(r)}}async sync(e=process.cwd(),t={}){try{let r=await ce(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let c=await j.detectMonorepo(e);if(!c.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=c.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=c.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Fs.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(P(Ae(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await Fs.sync(e,{full:t.full});if(!i.success)return t.md?console.log(P("## Sync Failed",`> ${i.error||"Unknown error"}`)):g.fail(i.error||"Sync failed"),{success:!1,error:i.error};if(t.md||g.stop(),t.md){let c=Date.now()-o,l=i.generatedSkills?.generated?.length??0,u=null;try{let S=await Ye.diff(s);S?.hasChanges&&(u=Ga(S))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&ht.isCurrent(s,d),m=null;if(!p)try{let S=await $d(s,e,i.git,i.stats);m=["## Analysis Payload",LE,"### Data","```json",JSON.stringify(S),"```"].join(`
1301
- `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let f=Ac("sync",!0),y=i.syncMetrics?.indexes,x={Duration:`${(c/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(y?.bm25Files){let S=y.bm25Files*(y.bm25AvgTokens||0);x["Tokens indexed"]=`${Math.round(S/1e3)}K`,x["Import edges"]=y.importEdges||0,x["Co-change commits"]=y.cochangeCommits||0}let b=P(Ae("Sync Complete"),Ot(x),u,i.git.hasChanges?rS("Uncommitted changes detected"):null,m,qe(f.map(S=>({label:S.desc,command:S.cmd}))));return console.log(b),{success:!0,data:i,metrics:{elapsed:c,skillCount:l,fileCount:i.stats.fileCount}}}return AE(i,o)}catch(r){return t.md?console.log(P("## Sync Failed",`> ${w(r)}`)):g.fail(w(r)),Ne(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await ce(e);if(!r.ok)return r.result;let s=r.value,o=await Fs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&ht.isCurrent(s,i))return t.md?console.log(P(Ae("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 c=await $d(s,e,o.git,o.stats);return t.md?console.log(P("## Analysis Payload",LE,"### Data","```json",JSON.stringify(c),"```")):console.log(JSON.stringify({success:!0,payload:c})),{success:!0,data:c}}catch(r){return Ne(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await ce(e);if(!r.ok)return r.result;let s=r.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(Te(),cy))).default,l=await(await Promise.resolve().then(()=>(K(),sr))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(yn(),kr)),m=await p(e,s);return t.md?console.log(`---
1300
+ `),console.log("Next steps:"),console.log("\u2022 p. sync \u2192 Generate agents based on stack"),console.log('\u2022 p. task "<description>" \u2192 Start tracked work'),{success:!0,summaryPath:c,data:r}}catch(r){return console.error("\u274C Error:",w(r)),Ne(r)}}async sync(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let c=await j.detectMonorepo(e);if(!c.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=c.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=c.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Fs.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(P(Ae(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await Fs.sync(e,{full:t.full});if(!i.success)return t.md?console.log(P("## Sync Failed",`> ${i.error||"Unknown error"}`)):g.fail(i.error||"Sync failed"),{success:!1,error:i.error};if(t.md||g.stop(),t.md){let c=Date.now()-o,l=i.generatedSkills?.generated?.length??0,u=null;try{let S=await Ye.diff(s);S?.hasChanges&&(u=Ga(S))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&ht.isCurrent(s,d),m=null;if(!p)try{let S=await $d(s,e,i.git,i.stats);m=["## Analysis Payload",LE,"### Data","```json",JSON.stringify(S),"```"].join(`
1301
+ `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let f=Ac("sync",!0),y=i.syncMetrics?.indexes,x={Duration:`${(c/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(y?.bm25Files){let S=y.bm25Files*(y.bm25AvgTokens||0);x["Tokens indexed"]=`${Math.round(S/1e3)}K`,x["Import edges"]=y.importEdges||0,x["Co-change commits"]=y.cochangeCommits||0}let b=P(Ae("Sync Complete"),Ot(x),u,i.git.hasChanges?rS("Uncommitted changes detected"):null,m,qe(f.map(S=>({label:S.desc,command:S.cmd}))));return console.log(b),{success:!0,data:i,metrics:{elapsed:c,skillCount:l,fileCount:i.stats.fileCount}}}return AE(i,o)}catch(r){return t.md?console.log(P("## Sync Failed",`> ${w(r)}`)):g.fail(w(r)),Ne(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await Fs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&ht.isCurrent(s,i))return t.md?console.log(P(Ae("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 c=await $d(s,e,o.git,o.stats);return t.md?console.log(P("## Analysis Payload",LE,"### Data","```json",JSON.stringify(c),"```")):console.log(JSON.stringify({success:!0,payload:c})),{success:!0,data:c}}catch(r){return Ne(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(Te(),cy))).default,l=await(await Promise.resolve().then(()=>(K(),sr))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(yn(),kr)),m=await p(e,s);return t.md?console.log(`---
1302
1302
 
1303
1303
  ## Vault regenerated
1304
1304
 
@@ -1343,7 +1343,7 @@ Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},sourc
1343
1343
  VALUES (?, ?, ?, ?)
1344
1344
  ON CONFLICT(entity_type, entity_id) DO UPDATE SET
1345
1345
  content_hash = excluded.content_hash,
1346
- applied_at = excluded.applied_at`,e,t,r,E())}catch{}}function wT(n,e,t){if(!(!e||!t))try{k.run(n,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var kT=h(()=>{"use strict";X();ie();a(hT,"getApplied");a(yT,"recordApplied");a(wT,"clearApplied")});function RN(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function xN(n){let e={};for(let[t,r]of Object.entries(n))e[RN(t)]=r;return e}function PN(n,e){let[t,r]=e.type.split("."),s=Zr(e.entityType)??Zr(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=xN(c),u=e.entityId||l.id||c.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};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}function bT(n,e){return e.map(t=>PN(n,t)).filter(t=>t!==null)}var vT=h(()=>{"use strict";Qc();a(RN,"camelToSnake");a(xN,"snakeCaseKeys");a(PN,"mapCliEventToWebFormat");a(bT,"mapCliEventsToWebFormat")});var Nm,es,Zc,ai=h(()=>{"use strict";od();En();vT();Nm=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=bT(e,t),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof t=="number"&&t>0&&(c.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),va("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await ae.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await ae.hasAuth()}async getAuthHeaders(){let[e,t,r]=await Promise.all([ae.getApiUrl(),ae.getApiKey(),ae.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:r}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,r=0){let s=new AbortController,o=setTimeout(()=>s.abort(),va("API_REQUEST")),i=(t.method??"GET").toUpperCase(),c=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${va("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),r=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await ae.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await ae.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,r){return{code:e,message:t,status:r}}sleep(e){return new Promise(t=>setTimeout(t,e))}},es=new Nm,Zc=es});var Lm={};L(Lm,{syncCursorStorage:()=>AN});var Om,AN,Fm=h(()=>{"use strict";ie();X();Om=class{static{a(this,"SyncCursorStorage")}get(e,t=null,r=null){if(!r)return null;let s=k.get(e,`SELECT * FROM sync_cursors
1346
+ applied_at = excluded.applied_at`,e,t,r,E())}catch{}}function wT(n,e,t){if(!(!e||!t))try{k.run(n,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var kT=h(()=>{"use strict";X();ie();a(hT,"getApplied");a(yT,"recordApplied");a(wT,"clearApplied")});function RN(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function xN(n){let e={};for(let[t,r]of Object.entries(n))e[RN(t)]=r;return e}function PN(n,e){let[t,r]=e.type.split("."),s=Zr(e.entityType)??Zr(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=xN(c),u=e.entityId||l.id||c.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};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}function bT(n,e){return e.map(t=>PN(n,t)).filter(t=>t!==null)}var vT=h(()=>{"use strict";Qc();a(RN,"camelToSnake");a(xN,"snakeCaseKeys");a(PN,"mapCliEventToWebFormat");a(bT,"mapCliEventsToWebFormat")});var Nm,es,Zc,ai=h(()=>{"use strict";od();En();vT();Nm=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=bT(e,t),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof t=="number"&&t>0&&(c.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),va("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await ce.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await ce.hasAuth()}async getAuthHeaders(){let[e,t,r]=await Promise.all([ce.getApiUrl(),ce.getApiKey(),ce.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:r}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,r=0){let s=new AbortController,o=setTimeout(()=>s.abort(),va("API_REQUEST")),i=(t.method??"GET").toUpperCase(),c=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${va("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),r=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await ce.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await ce.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,r){return{code:e,message:t,status:r}}sleep(e){return new Promise(t=>setTimeout(t,e))}},es=new Nm,Zc=es});var Lm={};L(Lm,{syncCursorStorage:()=>AN});var Om,AN,Fm=h(()=>{"use strict";ie();X();Om=class{static{a(this,"SyncCursorStorage")}get(e,t=null,r=null){if(!r)return null;let s=k.get(e,`SELECT * FROM sync_cursors
1347
1347
  WHERE project_id = ?
1348
1348
  AND device_id = ?
1349
1349
  AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,r]:[e,r,t]);return s?this.rowToCursor(s):null}touch(e,t=null,r=null){if(!r)return;let s=E();this.upsert({userId:t,deviceId:r,projectId:e,lastEventId:this.getLastEventId(e,t,r),updatedAt:s})}advance(e,t,r={}){let s=r.userId??null,o=r.deviceId??null;if(!o)return;let i=this.getLastEventId(e,s,o);t<=i||this.upsert({userId:s,deviceId:o,projectId:e,lastEventId:t,updatedAt:E()})}getLastEventId(e,t,r){return k.get(e,`SELECT last_event_id FROM sync_cursors
@@ -1354,9 +1354,9 @@ Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},sourc
1354
1354
  WHERE project_id = ? AND device_id = ? AND user_id IS NULL`,r,E(),e,t)}upsert(e){k.run(e.projectId,`INSERT INTO sync_cursors (user_id, device_id, project_id, last_event_id, updated_at)
1355
1355
  VALUES (?, ?, ?, ?, ?)
1356
1356
  ON CONFLICT(user_id, device_id, project_id)
1357
- 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}}},AN=new Om});function _N(n){if(ST.has(n))return;ST.add(n);let t=mT.has(n)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${n}' (${t}). code=no_local_handler`)}function jN(n){let e=n.data??{},t=n.content_hash??n.contentHash;if(n.entity_type){let i=(n.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:n.entity_type,eventType:i,data:e,contentHash:t}}if(n.entityType){let i=n.eventType||"upsert";return{entityType:n.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[r,s]=(n.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:Zr(r)||r||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function ET(n){return n instanceof Error?n.message:n&&typeof n=="object"&&"message"in n?String(n.message):"Unknown error"}function TT(n){if(n&&typeof n=="object"&&"code"in n)return n.code}var ST,Hm,IN,on,ci=h(()=>{"use strict";So();Dm();En();fT();Qc();kT();ai();ST=new Set;a(_N,"warnNoLocalHandler");a(jN,"normalizeEventShape");a(ET,"errorMessage");a(TT,"errorCode");Hm=class{static{a(this,"SyncManager")}async hasAuth(){return await ae.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await es.getStatus(e)}catch{return null}}async sync(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1},s=await this.push(e,t);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let o=await this.pull(e);return o.success&&!o.skipped&&(r.pulled={count:o.count||0,syncedAt:o.syncedAt||new Date().toISOString()}),(!s.success||!o.success)&&(r.success=!1,r.error=s.error||o.error,r.code=s.code||o.code),r}async push(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await At.getPending(e),s=t?.include?r.filter(l=>{let u=Zr(l.entityType)??Zr(l.type?.split(".")[0]);return u?gT(u,t.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let o=await this.createProjectLinkEvent(e),i=o?[o,...s]:s,c=await es.pushEvents(e,i);if(c.success)return await At.clearPending(e),await At.updateLastSync(e),{success:!0,skipped:!1,count:c.processed,syncedAt:c.syncedAt};{let l=c.processed,u=c.errors.length,d=c.errors.map(p=>p.error).join(", ");return{success:!1,skipped:!1,count:l,syncedAt:c.syncedAt,error:`${u} events failed: ${d}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:ET(r),code:TT(r)}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(Fm(),Lm)),r=await ae.read(),s=r.deviceId??null,o=r.userId??null,c=(s?t.get(e,o,s):null)?.lastEventId??0,l=await es.pullEvents(e,c);if(l.events.length===0)return await At.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=c;for(let p of l.events){let m=[p.event_id,p.eventId];for(let f of m)typeof f=="number"&&f>d&&(d=f)}return s&&d>c&&t.advance(e,d,{userId:o,deviceId:s}),await At.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:ET(t),code:TT(t)}}}async applyPulledEvents(e,t){let r=0;for(let s of t)try{await this.applyEvent(e,s),r++}catch(o){let i=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return r}async applyRealtimeEvent(e,t){try{let r=await ae.read(),s=r.deviceId??null,o=t.origin_device_id??t.originDeviceId;if(s&&o&&o===s)return!1;await this.applyEvent(e,t);let i=typeof t.event_id=="number"?t.event_id:typeof t.eventId=="number"?t.eventId:null;if(i!==null){let{syncCursorStorage:c}=await Promise.resolve().then(()=>(Fm(),Lm)),l=r.userId??null,u=r.deviceId??null;if(u){let d=c.get(e,l,u);(!d||i>d.lastEventId)&&c.advance(e,i,{userId:l,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(e,t){let{entityType:r,eventType:s,data:o,contentHash:i}=jN(t),c=o.id??"",l=Mm[r];if(!l){_N(r);return}if(s==="delete"){await l.delete(e,o),c&&wT(e,r,c);return}i&&this.alreadyApplied(e,r,c,i)||(await l.upsert(e,o),i&&c&&yT(e,r,c,i))}alreadyApplied(e,t,r,s){if(!r)return!1;let o=hT(e,t,r);return o!==null&&o===s}async createProjectLinkEvent(e){try{let t=await Kc(e).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e,meta:t},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},IN=new Hm,on=IN});var Um={};L(Um,{flushIfLinked:()=>DN});async function DN(n,e){try{let t=e??null;if(!t){let{default:s}=await Promise.resolve().then(()=>(K(),sr));t=await s.readConfig(n).catch(()=>null)}if(!t?.projectId||!t.cloud?.enabled||t.cloud.paused)return{ran:!1};if(!await on.hasAuth())return{ran:!1};let r=await on.sync(t.projectId,{include:t.cloud.include??{}});return{ran:!0,pushed:r.pushed?.count??0,pulled:r.pulled?.count??0,error:r.success?void 0:r.error}}catch{return{ran:!1}}}var Gm=h(()=>{"use strict";ci();a(DN,"flushIfLinked")});var tl={};L(tl,{ShippingCommands:()=>Wm,seedCodeShipRules:()=>qm});import{existsSync as RT}from"node:fs";import xT from"node:path";function CT(n){let e=n?.trim();return e||null}async function $N(n){let e=await bs(n);if(!e)return null;let t=e.replace(/^refs\/heads\//,"").trim();if(!t||/^(main|master|develop|development|dev|trunk)$/i.test(t))return null;let r=t.split("/").filter(Boolean).at(-1)??t;if(!r||/^\d+(?:\.\d+)*$/.test(r))return null;let s=r.replace(/^[a-z]+-\d+[-_]/i,"").replace(/[_-]+/g," ").replace(/[^\p{L}\p{N} ]+/gu," ").replace(/\s+/g," ").trim();return s.length>=3?s:null}function PT(n){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>RT(xT.join(n,t)))}function Bm(n){return RT(xT.join(n,".git"))}async function qm(n,e){if(!PT(e))return!1;let t=new Date().toISOString(),r=re.getRulesForCommand(n,"ship"),s=new Set(r.map(d=>d.action)),i=r.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,c=[];Bm(e)&&c.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}];Bm(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 c)s.has(d.action)||(re.addRule(n,{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)s.has(d.action)||(re.addRule(n,{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 MN(n,e,t,r){if(r.intent==="proceed"||r.intent==="register-only")return null;if(!t.some(c=>c.type==="step"&&c.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:PT(e)}};if(await vt(n,e))return null;let i=await ON(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 NN(n,e){if(e){let t=P(F("Clarification needed",n.question),F("Options",Pe(n.options.map(r=>`\`prjct ship --intent=${r}\``))),n.state?F("State",Pe(Object.entries(n.state).map(([r,s])=>`${r}: ${JSON.stringify(s)}`))):null);console.log(t);return}console.log(`
1357
+ 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}}},AN=new Om});function _N(n){if(ST.has(n))return;ST.add(n);let t=mT.has(n)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${n}' (${t}). code=no_local_handler`)}function jN(n){let e=n.data??{},t=n.content_hash??n.contentHash;if(n.entity_type){let i=(n.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:n.entity_type,eventType:i,data:e,contentHash:t}}if(n.entityType){let i=n.eventType||"upsert";return{entityType:n.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[r,s]=(n.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:Zr(r)||r||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function ET(n){return n instanceof Error?n.message:n&&typeof n=="object"&&"message"in n?String(n.message):"Unknown error"}function TT(n){if(n&&typeof n=="object"&&"code"in n)return n.code}var ST,Hm,IN,on,ci=h(()=>{"use strict";So();Dm();En();fT();Qc();kT();ai();ST=new Set;a(_N,"warnNoLocalHandler");a(jN,"normalizeEventShape");a(ET,"errorMessage");a(TT,"errorCode");Hm=class{static{a(this,"SyncManager")}async hasAuth(){return await ce.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await es.getStatus(e)}catch{return null}}async sync(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1},s=await this.push(e,t);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let o=await this.pull(e);return o.success&&!o.skipped&&(r.pulled={count:o.count||0,syncedAt:o.syncedAt||new Date().toISOString()}),(!s.success||!o.success)&&(r.success=!1,r.error=s.error||o.error,r.code=s.code||o.code),r}async push(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await At.getPending(e),s=t?.include?r.filter(l=>{let u=Zr(l.entityType)??Zr(l.type?.split(".")[0]);return u?gT(u,t.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let o=await this.createProjectLinkEvent(e),i=o?[o,...s]:s,c=await es.pushEvents(e,i);if(c.success)return await At.clearPending(e),await At.updateLastSync(e),{success:!0,skipped:!1,count:c.processed,syncedAt:c.syncedAt};{let l=c.processed,u=c.errors.length,d=c.errors.map(p=>p.error).join(", ");return{success:!1,skipped:!1,count:l,syncedAt:c.syncedAt,error:`${u} events failed: ${d}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:ET(r),code:TT(r)}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(Fm(),Lm)),r=await ce.read(),s=r.deviceId??null,o=r.userId??null,c=(s?t.get(e,o,s):null)?.lastEventId??0,l=await es.pullEvents(e,c);if(l.events.length===0)return await At.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=c;for(let p of l.events){let m=[p.event_id,p.eventId];for(let f of m)typeof f=="number"&&f>d&&(d=f)}return s&&d>c&&t.advance(e,d,{userId:o,deviceId:s}),await At.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:ET(t),code:TT(t)}}}async applyPulledEvents(e,t){let r=0;for(let s of t)try{await this.applyEvent(e,s),r++}catch(o){let i=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return r}async applyRealtimeEvent(e,t){try{let r=await ce.read(),s=r.deviceId??null,o=t.origin_device_id??t.originDeviceId;if(s&&o&&o===s)return!1;await this.applyEvent(e,t);let i=typeof t.event_id=="number"?t.event_id:typeof t.eventId=="number"?t.eventId:null;if(i!==null){let{syncCursorStorage:c}=await Promise.resolve().then(()=>(Fm(),Lm)),l=r.userId??null,u=r.deviceId??null;if(u){let d=c.get(e,l,u);(!d||i>d.lastEventId)&&c.advance(e,i,{userId:l,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(e,t){let{entityType:r,eventType:s,data:o,contentHash:i}=jN(t),c=o.id??"",l=Mm[r];if(!l){_N(r);return}if(s==="delete"){await l.delete(e,o),c&&wT(e,r,c);return}i&&this.alreadyApplied(e,r,c,i)||(await l.upsert(e,o),i&&c&&yT(e,r,c,i))}alreadyApplied(e,t,r,s){if(!r)return!1;let o=hT(e,t,r);return o!==null&&o===s}async createProjectLinkEvent(e){try{let t=await Kc(e).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e,meta:t},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},IN=new Hm,on=IN});var Um={};L(Um,{flushIfLinked:()=>DN});async function DN(n,e){try{let t=e??null;if(!t){let{default:s}=await Promise.resolve().then(()=>(K(),sr));t=await s.readConfig(n).catch(()=>null)}if(!t?.projectId||!t.cloud?.enabled||t.cloud.paused)return{ran:!1};if(!await on.hasAuth())return{ran:!1};let r=await on.sync(t.projectId,{include:t.cloud.include??{}});return{ran:!0,pushed:r.pushed?.count??0,pulled:r.pulled?.count??0,error:r.success?void 0:r.error}}catch{return{ran:!1}}}var Gm=h(()=>{"use strict";ci();a(DN,"flushIfLinked")});var tl={};L(tl,{ShippingCommands:()=>Wm,seedCodeShipRules:()=>qm});import{existsSync as RT}from"node:fs";import xT from"node:path";function CT(n){let e=n?.trim();return e||null}async function $N(n){let e=await bs(n);if(!e)return null;let t=e.replace(/^refs\/heads\//,"").trim();if(!t||/^(main|master|develop|development|dev|trunk)$/i.test(t))return null;let r=t.split("/").filter(Boolean).at(-1)??t;if(!r||/^\d+(?:\.\d+)*$/.test(r))return null;let s=r.replace(/^[a-z]+-\d+[-_]/i,"").replace(/[_-]+/g," ").replace(/[^\p{L}\p{N} ]+/gu," ").replace(/\s+/g," ").trim();return s.length>=3?s:null}function PT(n){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>RT(xT.join(n,t)))}function Bm(n){return RT(xT.join(n,".git"))}async function qm(n,e){if(!PT(e))return!1;let t=new Date().toISOString(),r=re.getRulesForCommand(n,"ship"),s=new Set(r.map(d=>d.action)),i=r.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,c=[];Bm(e)&&c.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}];Bm(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 c)s.has(d.action)||(re.addRule(n,{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)s.has(d.action)||(re.addRule(n,{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 MN(n,e,t,r){if(r.intent==="proceed"||r.intent==="register-only")return null;if(!t.some(c=>c.type==="step"&&c.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:PT(e)}};if(await vt(n,e))return null;let i=await ON(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 NN(n,e){if(e){let t=P(F("Clarification needed",n.question),F("Options",Pe(n.options.map(r=>`\`prjct ship --intent=${r}\``))),n.state?F("State",Pe(Object.entries(n.state).map(([r,s])=>`${r}: ${JSON.stringify(s)}`))):null);console.log(t);return}console.log(`
1358
1358
  \u26A0\uFE0F ${n.question}`),console.log(`
1359
- Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function ON(n){if(!Bm(n))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(pe(),cu)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:n,timeout:3e3}),r=t.toString().trim();if(!r)return null;let{stdout:s}=await e("gh",["pr","list","--head",r,"--state","open","--json","number,title","--limit","1"],{cwd:n,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:r}}catch{return null}}var el,Wm,nl=h(()=>{"use strict";K();Mp();Fn();Po();X();Xr();Pn();W();ie();we();Ue();zo();fe();$o();ba();Ce();qt();el="ship:in_progress",Wm=class extends V{static{a(this,"ShippingCommands")}async ship(e,t=process.cwd(),r={}){try{let s=await ce(t);if(!s.ok)return s.result;let o=s.value;try{let C=I.getDoc(o,el);C?.version&&(await bt.getByVersion(o,C.version)||(await bt.addShipped(o,{name:C.feature,version:C.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${C.feature} (v${C.version})`)),I.deleteDoc(o,el))}catch{}let i=CT(e),c=await vt(o,t),l=c?.linkedSpecId;if(c&&(i||(i=CT(c.description)),await Vm(o,t)),!r.noSpecGate&&!l)try{let C=await R.readConfig(t).catch(()=>null),{effectiveSddMode:T}=await Promise.resolve().then(()=>(zc(),Xc));if(T(C)==="strict")return{success:!1,error:"Strict SDD: this work has no linked spec. Start it via `prjct spec` \u2192 `audit-spec` \u2192 `prjct task --spec <id>`, or override with `prjct ship --no-spec-gate`."}}catch{}if(l&&!r.noSpecGate)try{let{specService:C}=await Promise.resolve().then(()=>(Js(),ri)),T=await C.get(t,l);if(T&&T.content.acceptance_criteria.length>0){let H=[];H.push(""),H.push(`## Spec acceptance gate \u2014 \`${T.title}\` (${T.id.slice(0,8)})`),H.push(""),H.push("Walk each criterion. STOP if any is unmet."),H.push("");for(let Q of T.content.acceptance_criteria)H.push(`- [ ] ${Q}`);H.push(""),H.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),H.push(""),console.log(H.join(`
1359
+ Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function ON(n){if(!Bm(n))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(pe(),cu)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:n,timeout:3e3}),r=t.toString().trim();if(!r)return null;let{stdout:s}=await e("gh",["pr","list","--head",r,"--state","open","--json","number,title","--limit","1"],{cwd:n,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:r}}catch{return null}}var el,Wm,nl=h(()=>{"use strict";K();Mp();Fn();Po();X();Xr();Pn();W();ie();we();Ue();zo();fe();$o();ba();Ce();qt();el="ship:in_progress",Wm=class extends V{static{a(this,"ShippingCommands")}async ship(e,t=process.cwd(),r={}){try{let s=await ae(t);if(!s.ok)return s.result;let o=s.value;try{let C=I.getDoc(o,el);C?.version&&(await bt.getByVersion(o,C.version)||(await bt.addShipped(o,{name:C.feature,version:C.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${C.feature} (v${C.version})`)),I.deleteDoc(o,el))}catch{}let i=CT(e),c=await vt(o,t),l=c?.linkedSpecId;if(c&&(i||(i=CT(c.description)),await Vm(o,t)),!r.noSpecGate&&!l)try{let C=await R.readConfig(t).catch(()=>null),{effectiveSddMode:T}=await Promise.resolve().then(()=>(zc(),Xc));if(T(C)==="strict")return{success:!1,error:"Strict SDD: this work has no linked spec. Start it via `prjct spec` \u2192 `audit-spec` \u2192 `prjct task --spec <id>`, or override with `prjct ship --no-spec-gate`."}}catch{}if(l&&!r.noSpecGate)try{let{specService:C}=await Promise.resolve().then(()=>(Js(),ri)),T=await C.get(t,l);if(T&&T.content.acceptance_criteria.length>0){let H=[];H.push(""),H.push(`## Spec acceptance gate \u2014 \`${T.title}\` (${T.id.slice(0,8)})`),H.push(""),H.push("Walk each criterion. STOP if any is unmet."),H.push("");for(let Q of T.content.acceptance_criteria)H.push(`- [ ] ${Q}`);H.push(""),H.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),H.push(""),console.log(H.join(`
1360
1360
  `))}}catch{}if(!r.noTestGate)try{let{effectiveTddMode:C}=await Promise.resolve().then(()=>(Im(),jm)),T=await R.readConfig(t).catch(()=>null),H=C(T);if(H!=="off"){let me=(await Mn(t).catch(()=>null))?.test?.command,ne=[""];H==="strict"?(ne.push("## TDD gate (strict) \u2014 tests must be green before ship"),ne.push(""),ne.push(me?`Run \`prjct tdd check\` (\`${me}\`). STOP and fix if RED.`:"No test command detected \u2014 add tests (strict TDD expects them)."),ne.push("Override (only with explicit user consent): `prjct ship --no-test-gate`.")):(ne.push("## TDD reminder (assist)"),ne.push(""),ne.push(me?`Did the change ship with tests? Verify green: \`prjct tdd check\` (\`${me}\`).`:"Consider adding a test for this change.")),ne.push(""),console.log(ne.join(`
1361
1361
  `))}}catch{}let u=re.getRulesForCommand(o,"ship");if(r.intent==="seed-code-workflow"){if(!await qm(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=re.getRulesForCommand(o,"ship")}!u.some(C=>C.type==="step"&&C.position==="before")&&r.intent!=="register-only"&&await qm(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=re.getRulesForCommand(o,"ship"));let p=await MN(o,t,u,r);if(p)return NN(p,r.md===!0),{success:!1,clarification:p};if(i=i??await $N(t),!i)return{success:!1,error:'Ship needs a release description. Pass one explicitly, e.g. `prjct ship "add universal agent compatibility"`, or ship from a named feature branch.'};let m={feature:i},f=await An(o,"ship","before",{projectPath:t,skipRules:r.skipHooks,runContext:m});if(!f.success)return{success:!1,error:`Ship blocked: ${f.gatesFailed.length>0?f.gatesFailed.join(", "):"unknown step"}`};let y=typeof m.version=="string"?m.version:"unversioned";try{I.setDoc(o,el,{feature:i,version:y,startedAt:E()})}catch{}await bt.addShipped(o,{name:i,version:y});try{I.deleteDoc(o,el)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:E()});let x=await An(o,"ship","after",{projectPath:t,skipRules:r.skipHooks,runContext:m}),b=[...f.instructions,...x.instructions];try{await Fs.sync(t)}catch(C){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(C))}try{let{regenerateWikiDeferred:C}=await Promise.resolve().then(()=>(yn(),kr));await C(t,o)}catch(C){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(C))}let S=f.stepsRun.length+x.stepsRun.length;if(r.md){let C=Ac("ship",!0),T=P(Ae(`Shipped: ${i}`,`Version: ${y}`),F("Results",Pe([`Version: ${y}`,`Workflow steps run: ${S>0?[...f.stepsRun,...x.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+x.hooksFailed.length}`])),b.length>0?F("Agent Instructions",Pe(b)):null,qe(C.map(H=>({label:H.desc,command:H.cmd}))));console.log(T)}else g.done(`v${y} shipped`),Hs("ship");if(c?.id)try{let{usefulnessService:C}=await Promise.resolve().then(()=>(Ln(),jp));C.creditShippedTask(o,c.id)}catch{}return(async()=>{try{let{flushIfLinked:C}=await Promise.resolve().then(()=>(Gm(),Um));await C(t)}catch{}})(),{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Ne(s)}}};a(CT,"normalizeShipFeature");a($N,"inferShipFeatureFromBranch");a(PT,"isCodeProject");a(Bm,"isGitRepo");a(qm,"seedCodeShipRules");a(MN,"buildClarification");a(NN,"renderClarification");a(ON,"findOpenPrForBranch")});var rl={};L(rl,{PlanningCommands:()=>Xm});async function LN(){if(!Jm){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(Vc(),qc));Jm=new n}return Jm}var Jm,Xm,sl=h(()=>{"use strict";ga();Dn();K();Te();Es();Pn();W();we();fe();$o();uk();Ce();Jm=null;a(LN,"getAnalysisCommands");Xm=class extends V{static{a(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let r={};if(typeof e=="string"||e===null?r={idea:e}:r=e,await this.initializeAgent(),await R.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=r.yes||!o||process.env.CI==="true",c=null;if(i)o&&r.yes&&(c=await new Mo(t).runNonInteractive());else if(c=await new Mo(t).run(),c.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await ys(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await R.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,r),g.step(2,4,"Creating structure..."),await j.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),f=await this._detectExistingCode(t);if(f||!m){g.step(3,4,"Analyzing project...");let b=await LN();if((await b.analyze({},t)).success){g.step(4,4,"Generating agents..."),await b.sync(t);let C=await Gt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,C??void 0),{success:!0,mode:"existing",projectId:p,wizard:c}}}let y=r.idea;if(m&&!f){if(!y){await tt.installGlobalConfig();let C=await Gt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("blank project - provide idea for architect mode"),this._printNextSteps(c,C??void 0),{success:!0,mode:"blank_no_idea",projectId:p,wizard:c}}g.spin("architect mode...");let{projectMemory:b}=await Promise.resolve().then(()=>(ve(),Cc));await b.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await tt.installGlobalConfig();let S=await Gt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("architect mode ready"),this._printNextSteps(c,S??void 0),{success:!0,mode:"architect",projectId:p,idea:y,wizard:c}}await tt.installGlobalConfig();let x=await Gt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,x??void 0),{success:!0,projectId:p,wizard:c}}catch(r){return g.fail(w(r)),Ne(r)}}_printNextSteps(e,t){console.log(""),console.log(" \u2713 global prjct router refreshed where supported"),t?.claudeMd&&console.log(" \u2713 project CLAUDE.md updated with routing block"),t?.agentsMd&&console.log(" \u2713 project AGENTS.md updated with universal routing block"),(t?.ideRules.length??0)>0&&console.log(` \u2713 project IDE rules updated: ${t?.ideRules.join(", ")}`),console.log(""),console.log(" You don't run prjct commands. Your AI coding agent does."),console.log(""),console.log(" Just describe what you're doing \u2014 the agent reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e&&e.agents.length>0&&(console.log(` Detected agents: ${e.agents.join(", ")}`),console.log("")),console.log(" Docs: https://prjct.app/docs"),console.log("")}async _agentSelections(e,t){if(e)return e.agents;try{let{detectInstalledAgents:r}=await Promise.resolve().then(()=>(Na(),yd));return r(t)}catch{return[]}}async _applyInitialPacksAndPersona(e,t){let{activatePacks:r,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(bm(),HE)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await r(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(K(),sr))).default,c=await i.readConfig(e);if(c){let l=c.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...c,persona:l})}}}async _seedShipWorkflow(e,t){let r=await Mn(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(nl(),tl));await o(e,t),s=re.getRulesForCommand(e,"ship").reduce((i,c)=>Math.max(i,c.sortOrder??0),0)+1,re.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),r.lint&&re.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),r.test&&re.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var zm,fn,AT,Ua=h(()=>{"use strict";Rn();ga();K();Te();W();ee();fe();zm=class{static{a(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(zi(),Xi));if(await o.detect(e)){let c=await o.getMainWorktree(e);if(c&&c!==e&&await R.isConfigured(c))return await o.setup(e,c),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(sl(),rl)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw ua.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await j.ensureProjectStructure(t),j.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ys();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await Xn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return B(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Xn(e)).some(s=>t.includes(s))}catch(t){return B(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},fn=new zm,AT=fn});function _T(n){let e=n.toLowerCase(),t=UN(e),r=FN.some(d=>e.includes(d)),s=br(e,["security","seguridad","auth","permission","secret","migration","sqlite","database","arquitectura","architecture","must","critical","critico","cr\xEDtico"]),o=GN(t,e,s),i=WN(o,s),c=BN(t,o,r),l=qN(o),u=JN(n);return{level:o,kind:t,risk:i,expectedEvidence:c,scopeHints:u,gates:l,rationale:VN(o,t,i),createdAt:E()}}async function Km(n,e){let t=e.harness;if(!t||t.level==="H0")return{changedFiles:[],observedEvidence:[],warnings:[]};let r=await QN(n),s=XN(r),o=[];t.expectedEvidence.includes("regression-test")&&!s.includes("tests-changed")&&o.push(`${t.level} expects a regression test; no test file changed in the diff.`),t.expectedEvidence.includes("docs-if-public-behavior")&&YN(r)&&!s.includes("docs-changed")&&o.push("Public-facing files changed; no README/docs/changelog file changed.");let i=await ZN(n);return i>400&&o.push(`Diff is ${i} changed lines; consider splitting or justify the scope.`),{changedFiles:r,observedEvidence:s,warnings:o}}function UN(n){return br(n,["security","seguridad","auth","permission","secret"])?"security":br(n,["bug","fix","falla","fallo","error","broken","regression","no se"])?"bug":br(n,["refactor","cleanup","split","restructure"])?"refactor":br(n,["doc","readme","changelog","typo"])?"docs":br(n,["chore","format","lint"])?"chore":br(n,["add","agrega","crear","implement","implementa","feature","mejora"])?"feature":"unknown"}function GN(n,e,t){return n==="docs"||n==="chore"?"H0":n==="security"||t&&br(e,["migration","sqlite","database","architecture","arquitectura"])?"H3":n==="feature"||n==="refactor"?"H2":"H1"}function WN(n,e){return n==="H3"||e?"high":n==="H2"||n==="H1"?"medium":"low"}function BN(n,e,t){let r=new Set;return n==="bug"&&(r.add("regression-test"),r.add("focused-tests"),r.add("edge-cases")),(n==="feature"||n==="refactor")&&(r.add("focused-tests"),r.add("scope-check")),t&&r.add("docs-if-public-behavior"),(e==="H2"||e==="H3")&&r.add("spec-or-design"),e==="H3"&&r.add("config-preservation"),[...r]}function qN(n){return n==="H0"?[]:n==="H1"?["verify-before-done"]:n==="H2"?["verify-before-done","scope-check"]:["spec-before-implementation","verify-before-done","scope-check","review-before-ship"]}function VN(n,e,t){return n==="H0"?`Low-risk ${e}; keep the task direct and low-friction.`:`${n} ${e}/${t}; define expected evidence up front and verify before closure.`}function JN(n){let e=n.toLowerCase().normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").split(/[^a-z0-9_.-]+/u).filter(t=>t.length>=3&&!HN.has(t));return[...new Set(e)].slice(0,8)}function br(n,e){return e.some(t=>n.includes(t))}function XN(n){let e=new Set;return n.some(zN)&&e.add("tests-changed"),n.some(KN)&&e.add("docs-changed"),[...e]}function zN(n){return/(^|\/)(__tests__|tests?|specs?)\//.test(n)||/\.(test|spec)\.[cm]?[tj]sx?$/.test(n)}function KN(n){return/(^|\/)(README|CHANGELOG|docs\/)/i.test(n)}function YN(n){return n.some(e=>e.startsWith("core/commands/")||e.startsWith("core/mcp/")||e.startsWith("templates/")||e==="README.md")}async function QN(n){let e=new Set;try{let{stdout:t}=await G("git",["diff","--name-only","HEAD"],{cwd:n});for(let r of t.split(`
1362
1362
  `)){let s=r.trim();s&&e.add(s)}}catch{return[]}try{let{stdout:t}=await G("git",["ls-files","--others","--exclude-standard"],{cwd:n});for(let r of t.split(`
@@ -1404,28 +1404,28 @@ Run with: p. ${o}`)),{success:!0,workflowId:c,name:o,templatePath:l.path}):(gt.d
1404
1404
  `))),s.length>0&&i.push(F("Custom Workflows",s.map(o).join(`
1405
1405
  `))),console.log(P(...i,qe([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if($t(`${t.length} workflow${t.length!==1?"s":""}`),r.length>0){console.log(`
1406
1406
  Built-in:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}if(s.length>0){console.log(`
1407
- Custom:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function eC(n,e,t){let r=n.trim();if(!r)return N("Usage: prjct workflow delete <name>",t);try{return gt.deleteWorkflow(e,r)?(await af.deleteWorkflowTemplate(r),t.md?console.log(P(Ae("Workflow Deleted",`Deleted workflow: ${r}`))):$t(`deleted workflow: ${r}`),{success:!0}):N(`Workflow '${r}' not found`,t)}catch(s){return N(w(s),t)}}var tC=h(()=>{"use strict";KT();Ao();Pn();W();we();Ue();$o();tf();a(YT,"workflowInit");a(QT,"workflowCreate");a(ZT,"workflowList");a(eC,"workflowDelete")});var lf={};L(lf,{WorkflowCommands:()=>cf});var cf,uf=h(()=>{"use strict";fs();Fn();Ao();W();we();Ue();zo();fe();ba();Ce();qt();ef();qT();zT();tC();cf=class extends V{static{a(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),r={}){try{let s=await ce(t);if(!s.ok)return s.result;let o=s.value;if(!e)return this._showActiveTask(o,t,r);let i=await Ym(o,t,e,{skipHooks:r.skipHooks,spec:r.spec});if(!i.ok)return{success:!1,error:i.blocked??"Task start blocked"};let c=i.description??e,l=i.taskId??"",u=i.linearId,d=i.branch??"",p=i.instructions??[],m=i.pipeline,f=i.harness;return r.md?console.log(P(Jo({description:c,status:"active"}),F("State",Pe([`Task: \`${l}\``,d?`Branch: \`${d}\``:null,u?`Linear: \`${u}\``:null,f?`Harness: ${f.level} ${f.kind}/${f.risk}`:null,f?.expectedEvidence.length?`Evidence: ${f.expectedEvidence.join(", ")}`:null,p.length>0?`Agent instructions: ${p.length}`:null].filter(y=>y!==null))),m?F("Task Pipeline",Pe([`Classification: \`${m.classification}\``,`Station: \`${m.station}\``,`Requires spec: ${m.requiresSpec?"yes":"no"}`,`Tests first: ${m.requiresTestsFirst?"yes":"no"}`,`Next action: ${m.nextAction}`])):null,p.length>0?F("Agent Instructions",Pe(p)):null,qe([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(g.done(`Task: ${c}`),f&&(g.info(`Harness: ${f.level} ${f.kind}/${f.risk}`),f.expectedEvidence.length>0&&g.info(`Evidence: ${f.expectedEvidence.join(", ")}`)),aS("working"),Hs("task")),{success:!0,task:c,taskId:l,harness:f}}catch(s){let o=w(s);return r.md?console.log(`> ${o}`):g.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t,r){let s=await Cn(e,t),o=s.current,i=s.all.filter(c=>!c.isCurrent);if(!o){let c='no active task. `prjct task "<description>"` to start one.',l=i.length>0?`
1407
+ Custom:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function eC(n,e,t){let r=n.trim();if(!r)return N("Usage: prjct workflow delete <name>",t);try{return gt.deleteWorkflow(e,r)?(await af.deleteWorkflowTemplate(r),t.md?console.log(P(Ae("Workflow Deleted",`Deleted workflow: ${r}`))):$t(`deleted workflow: ${r}`),{success:!0}):N(`Workflow '${r}' not found`,t)}catch(s){return N(w(s),t)}}var tC=h(()=>{"use strict";KT();Ao();Pn();W();we();Ue();$o();tf();a(YT,"workflowInit");a(QT,"workflowCreate");a(ZT,"workflowList");a(eC,"workflowDelete")});var lf={};L(lf,{WorkflowCommands:()=>cf});var cf,uf=h(()=>{"use strict";fs();Fn();Ao();W();we();Ue();zo();fe();ba();Ce();qt();ef();qT();zT();tC();cf=class extends V{static{a(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),r={}){try{let s=await ae(t);if(!s.ok)return s.result;let o=s.value;if(!e)return this._showActiveTask(o,t,r);let i=await Ym(o,t,e,{skipHooks:r.skipHooks,spec:r.spec});if(!i.ok)return{success:!1,error:i.blocked??"Task start blocked"};let c=i.description??e,l=i.taskId??"",u=i.linearId,d=i.branch??"",p=i.instructions??[],m=i.pipeline,f=i.harness;return r.md?console.log(P(Jo({description:c,status:"active"}),F("State",Pe([`Task: \`${l}\``,d?`Branch: \`${d}\``:null,u?`Linear: \`${u}\``:null,f?`Harness: ${f.level} ${f.kind}/${f.risk}`:null,f?.expectedEvidence.length?`Evidence: ${f.expectedEvidence.join(", ")}`:null,p.length>0?`Agent instructions: ${p.length}`:null].filter(y=>y!==null))),m?F("Task Pipeline",Pe([`Classification: \`${m.classification}\``,`Station: \`${m.station}\``,`Requires spec: ${m.requiresSpec?"yes":"no"}`,`Tests first: ${m.requiresTestsFirst?"yes":"no"}`,`Next action: ${m.nextAction}`])):null,p.length>0?F("Agent Instructions",Pe(p)):null,qe([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(g.done(`Task: ${c}`),f&&(g.info(`Harness: ${f.level} ${f.kind}/${f.risk}`),f.expectedEvidence.length>0&&g.info(`Evidence: ${f.expectedEvidence.join(", ")}`)),aS("working"),Hs("task")),{success:!0,task:c,taskId:l,harness:f}}catch(s){let o=w(s);return r.md?console.log(`> ${o}`):g.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t,r){let s=await Cn(e,t),o=s.current,i=s.all.filter(c=>!c.isCurrent);if(!o){let c='no active task. `prjct task "<description>"` to start one.',l=i.length>0?`
1408
1408
  ${i.length} active in other workspace(s):
1409
1409
  ${i.map(d=>` ${d.label} ${d.description}`).join(`
1410
- `)}`:"",u=c+l;return r.md?console.log(`> ${u}`):g.info(u),{success:!0,message:"no active task"}}if(r.md)console.log(P(Jo({description:o.description,status:"active"}),F("State",Pe([`Task: \`${o.id}\``,`Workspace: \`${o.label}\``,o.branch?`Branch: \`${o.branch}\``:null,o.linearId?`Linear: \`${o.linearId}\``:null,`Started: ${o.startedAt}`,o.pipeline?`Pipeline: \`${o.pipeline.station}\``:null,o.harness?`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`:null,i.length>0?`Other active workspaces: ${i.length}`:null].filter(c=>c!==null))),o.pipeline?F("Next Action",Pe([o.pipeline.requiresTestsFirst?"Write tests before implementation for substantive work.":"Proceed directly for this trivial task."])):null,i.length>0?F("Other Active Workspaces",Pe(i.map(c=>`${c.label} \u2014 ${c.description}`))):null));else{g.info(`Active: ${o.description}`),g.info(`Workspace: ${o.label}`),o.pipeline&&g.info(`Pipeline: ${o.pipeline.station}`),o.harness&&g.info(`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`);for(let c of i)g.info(` other: ${c.label} \u2014 ${c.description}`)}return{success:!0,currentTask:o}}async workflow(e=null,t=process.cwd(),r={}){try{let s=await ce(t,r);if(!s.ok)return s.result;let o=s.value,i=e?.trim()??"";if(!i)return al(null,o,r);let c=MT(i);switch(c.type){case"add":return FT(c.args,o,r);case"gate":return HT(c.args,o,r);case"instruction":return UT(c.args,o,r);case"remove":return GT(c.args,o,r);case"disable":return BT(c.args,o,r);case"reset":return WT(o,r);case"init":return YT(o,t,r);case"help":return XT(r);case"create":return QT(c.args,o,t,r);case"list":return ZT(o,r);case"delete":return eC(c.args,o,r);case"run":return this.run(c.args,t,r);case"view":return al(c.args||null,o,r);default:return al(i.split(/\s+/)[0]?.toLowerCase()||null,o,r)}}catch(s){return r.md?console.log(`> Error: ${w(s)}`):g.fail(w(s)),Ne(s)}}async run(e,t=process.cwd(),r={}){try{let s=await ce(t,r);if(!s.ok)return s.result;let o=s.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let c=gt.getWorkflow(o,i);if(!c||!c.enabled){let u=`Workflow '${i}' not found`;return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let l=await An(o,i,"before",{projectPath:t});if(!l.success){if(r.md)sS("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(g.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await An(o,i,"after",{projectPath:t}),r.md?console.log(P(Ae(`Workflow: ${i}`,c.description||""),qe([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):g.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=w(s);return r.md?console.log(`> Error: ${o}`):g.fail(o),{success:!1,error:o}}}}});var nC={};L(nC,{default:()=>mf});import df from"node:fs/promises";import i0 from"node:path";var pf,a0,mf,ff=h(()=>{"use strict";W();ee();Te();pf=class{static{a(this,"EditorsConfig")}get configDir(){return j.globalConfigDir}get configFile(){return i0.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await df.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await df.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,r="claude"){try{await this.ensureConfigDir();let s={version:e,provider:r,lastInstall:new Date().toISOString(),path:t};return await Ee(this.configFile,s),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!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 Ee(this.configFile,t),!0):!1}catch(t){return!1}}async configExists(){return A(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await df.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},a0=new pf,mf=a0});var hf={};L(hf,{SetupCommands:()=>gf});import ll from"node:fs/promises";import c0 from"node:http";import ui from"node:path";import l0 from"node:readline";import ue from"chalk";var gf,yf=h(()=>{"use strict";Dn();K();Te();Ji();En();ai();ci();W();pe();ee();we();fe();et();Ce();Bd();gf=class extends V{static{a(this,"SetupCommands")}async auth(e=null,t={}){switch(e?.split(" ")[0]||"status"){case"login":return t.md||g.fail("Manual token login is not supported. Run prjct login."),{success:!1,message:t.md?"## Error\nManual token login is not supported. Run `prjct login`.":""};case"logout":return await ae.clearAuth(),t.md||g.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1411
- - **Status**: Logged out`:""};default:{let s=await ae.getStatus();return t.md?{success:!0,message:s.authenticated?`## Auth Status
1410
+ `)}`:"",u=c+l;return r.md?console.log(`> ${u}`):g.info(u),{success:!0,message:"no active task"}}if(r.md)console.log(P(Jo({description:o.description,status:"active"}),F("State",Pe([`Task: \`${o.id}\``,`Workspace: \`${o.label}\``,o.branch?`Branch: \`${o.branch}\``:null,o.linearId?`Linear: \`${o.linearId}\``:null,`Started: ${o.startedAt}`,o.pipeline?`Pipeline: \`${o.pipeline.station}\``:null,o.harness?`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`:null,i.length>0?`Other active workspaces: ${i.length}`:null].filter(c=>c!==null))),o.pipeline?F("Next Action",Pe([o.pipeline.requiresTestsFirst?"Write tests before implementation for substantive work.":"Proceed directly for this trivial task."])):null,i.length>0?F("Other Active Workspaces",Pe(i.map(c=>`${c.label} \u2014 ${c.description}`))):null));else{g.info(`Active: ${o.description}`),g.info(`Workspace: ${o.label}`),o.pipeline&&g.info(`Pipeline: ${o.pipeline.station}`),o.harness&&g.info(`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`);for(let c of i)g.info(` other: ${c.label} \u2014 ${c.description}`)}return{success:!0,currentTask:o}}async workflow(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=s.value,i=e?.trim()??"";if(!i)return al(null,o,r);let c=MT(i);switch(c.type){case"add":return FT(c.args,o,r);case"gate":return HT(c.args,o,r);case"instruction":return UT(c.args,o,r);case"remove":return GT(c.args,o,r);case"disable":return BT(c.args,o,r);case"reset":return WT(o,r);case"init":return YT(o,t,r);case"help":return XT(r);case"create":return QT(c.args,o,t,r);case"list":return ZT(o,r);case"delete":return eC(c.args,o,r);case"run":return this.run(c.args,t,r);case"view":return al(c.args||null,o,r);default:return al(i.split(/\s+/)[0]?.toLowerCase()||null,o,r)}}catch(s){return r.md?console.log(`> Error: ${w(s)}`):g.fail(w(s)),Ne(s)}}async run(e,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=s.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let c=gt.getWorkflow(o,i);if(!c||!c.enabled){let u=`Workflow '${i}' not found`;return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let l=await An(o,i,"before",{projectPath:t});if(!l.success){if(r.md)sS("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(g.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await An(o,i,"after",{projectPath:t}),r.md?console.log(P(Ae(`Workflow: ${i}`,c.description||""),qe([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):g.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=w(s);return r.md?console.log(`> Error: ${o}`):g.fail(o),{success:!1,error:o}}}}});var nC={};L(nC,{default:()=>mf});import df from"node:fs/promises";import i0 from"node:path";var pf,a0,mf,ff=h(()=>{"use strict";W();ee();Te();pf=class{static{a(this,"EditorsConfig")}get configDir(){return j.globalConfigDir}get configFile(){return i0.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await df.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await df.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,r="claude"){try{await this.ensureConfigDir();let s={version:e,provider:r,lastInstall:new Date().toISOString(),path:t};return await Ee(this.configFile,s),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!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 Ee(this.configFile,t),!0):!1}catch(t){return!1}}async configExists(){return A(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await df.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},a0=new pf,mf=a0});var hf={};L(hf,{SetupCommands:()=>gf});import ll from"node:fs/promises";import c0 from"node:http";import ui from"node:path";import l0 from"node:readline";import ue from"chalk";var gf,yf=h(()=>{"use strict";Dn();K();Te();Ji();En();ai();ci();W();pe();ee();we();fe();et();Ce();Bd();gf=class extends V{static{a(this,"SetupCommands")}async auth(e=null,t={}){switch(e?.split(" ")[0]||"status"){case"login":return t.md||g.fail("Manual token login is not supported. Run prjct login."),{success:!1,message:t.md?"## Error\nManual token login is not supported. Run `prjct login`.":""};case"logout":return await ce.clearAuth(),t.md||g.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1411
+ - **Status**: Logged out`:""};default:{let s=await ce.getStatus();return t.md?{success:!0,message:s.authenticated?`## Auth Status
1412
1412
  - **Authenticated**: Yes
1413
1413
  - **Email**: ${s.email||"N/A"}
1414
1414
  - **Token**: stored securely
1415
1415
  - **Last auth**: ${s.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(s.authenticated?g.box("Auth Status",`Email: ${s.email||"N/A"}
1416
1416
  Token: stored securely
1417
- Since: ${s.lastAuth||"N/A"}`):(g.info("Not authenticated"),g.info(`Run ${ue.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await ae.getStatus();if(t.authenticated)return e.md||(g.box("Already Authenticated",`Email: ${t.email}
1417
+ Since: ${s.lastAuth||"N/A"}`):(g.info("Not authenticated"),g.info(`Run ${ue.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await ce.getStatus();if(t.authenticated)return e.md||(g.box("Already Authenticated",`Email: ${t.email}
1418
1418
  Token: stored securely`),g.info(`Run ${ue.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1419
1419
  - **Email**: ${t.email}
1420
1420
  - **Token**: stored securely
1421
1421
 
1422
- Run \`prjct logout\` first to re-authenticate.`:""};let r="https://cli.prjct.app",s="https://cli-api.prjct.app";return new Promise(o=>{let i=c0.createServer(async(c,l)=>{let u=new URL(c.url||"/","http://127.0.0.1");if(u.pathname==="/callback"){let d=u.searchParams.get("key"),p=u.searchParams.get("email"),m=u.searchParams.get("user_id"),f=!1,y="No API key received";if(d)try{await ae.saveAuth(d,m||"",p||""),await ae.write({apiUrl:s}),f=await es.testConnection(),f||(y="Could not verify credentials with prjct Cloud",await ae.clearAuth())}catch(x){y=x instanceof Error?x.message:"Could not store credentials securely",await ae.clearAuth()}f?(l.writeHead(200,{"Content-Type":"text/html"}),l.end(this.buildSuccessPage(p||""))):(l.writeHead(d?401:400,{"Content-Type":"text/html"}),l.end(this.buildErrorPage(y))),i.close(),f&&d?(e.md||(g.step(3,3,"Connected"),g.stop(),g.box("Authentication Complete",`Email: ${p}
1422
+ Run \`prjct logout\` first to re-authenticate.`:""};let r="https://cli.prjct.app",s="https://cli-api.prjct.app";return new Promise(o=>{let i=c0.createServer(async(c,l)=>{let u=new URL(c.url||"/","http://127.0.0.1");if(u.pathname==="/callback"){let d=u.searchParams.get("key"),p=u.searchParams.get("email"),m=u.searchParams.get("user_id"),f=!1,y="No API key received";if(d)try{await ce.saveAuth(d,m||"",p||""),await ce.write({apiUrl:s}),f=await es.testConnection(),f||(y="Could not verify credentials with prjct Cloud",await ce.clearAuth())}catch(x){y=x instanceof Error?x.message:"Could not store credentials securely",await ce.clearAuth()}f?(l.writeHead(200,{"Content-Type":"text/html"}),l.end(this.buildSuccessPage(p||""))):(l.writeHead(d?401:400,{"Content-Type":"text/html"}),l.end(this.buildErrorPage(y))),i.close(),f&&d?(e.md||(g.step(3,3,"Connected"),g.stop(),g.box("Authentication Complete",`Email: ${p}
1423
1423
  Token: stored securely
1424
1424
  Status: Connected`)),await this.autoSync(),o({success:!0,message:e.md?`## Authenticated
1425
1425
  - **Email**: ${p}
1426
1426
  - **Token**: stored securely`:""})):(e.md||g.fail(`Authentication failed: ${y}`),o({success:!1,message:e.md?`## Error
1427
1427
  Authentication failed: ${y}`:""}));return}l.writeHead(404),l.end("Not found")});i.listen(0,"127.0.0.1",async()=>{let c=i.address();if(!c||typeof c=="string"){i.close(),e.md||g.fail("Failed to start callback server"),o({success:!1,message:e.md?`## Error
1428
- Failed to start callback server`:""});return}let l=c.port,u=await ae.getDeviceId(),d=await ae.getHostname(),p=new URLSearchParams({port:String(l),device_id:u,hostname:d}),m=`${r}/auth/cli?${p.toString()}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(ue.dim(m));let f=process.platform,y=f==="darwin"?`open "${m}"`:f==="win32"?`start "${m}"`:`xdg-open "${m}"`;try{await q(y)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${m}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{i.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${ue.cyan("prjct login")} to try again`)),o({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await ae.getStatus()).authenticated?(await ae.clearAuth(),g.done("Logged out"),{success:!0,message:""}):(g.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await R.readConfig(process.cwd()).catch(()=>null),t=e?.projectId;if(!t||!e.cloud?.enabled||e.cloud.paused)return;g.spin("Syncing project...");let r=await on.sync(t,{include:e.cloud.include??{}});if(g.stop(),r.success&&!r.skipped){let s=r.pushed?.count||0,o=r.pulled?.count||0;s>0||o>0?g.done(`Synced (${s} pushed, ${o} pulled)`):g.done("Synced \u2014 everything up to date")}}catch{g.stop()}}buildSuccessPage(e){return`<!DOCTYPE html>
1428
+ Failed to start callback server`:""});return}let l=c.port,u=await ce.getDeviceId(),d=await ce.getHostname(),p=new URLSearchParams({port:String(l),device_id:u,hostname:d}),m=`${r}/auth/cli?${p.toString()}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(ue.dim(m));let f=process.platform,y=f==="darwin"?`open "${m}"`:f==="win32"?`start "${m}"`:`xdg-open "${m}"`;try{await q(y)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${m}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{i.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${ue.cyan("prjct login")} to try again`)),o({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return await ce.clearAuth(),g.done("Logged out"),{success:!0,message:""}}async autoSync(){try{let e=await R.readConfig(process.cwd()).catch(()=>null),t=e?.projectId;if(!t||!e.cloud?.enabled||e.cloud.paused)return;g.spin("Syncing project...");let r=await on.sync(t,{include:e.cloud.include??{}});if(g.stop(),r.success&&!r.skipped){let s=r.pushed?.count||0,o=r.pulled?.count||0;s>0||o>0?g.done(`Synced (${s} pushed, ${o} pulled)`):g.done("Synced \u2014 everything up to date")}}catch{g.stop()}}buildSuccessPage(e){return`<!DOCTYPE html>
1429
1429
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
1430
1430
  <title>prjct CLI Connected</title>
1431
1431
  <style>
@@ -1589,10 +1589,10 @@ summary) were removed in alpha.12 \u2014 Claude has Glob/Grep/Read/git
1589
1589
  natively and re-implementing them in prjct was harness. The
1590
1590
  underlying functions still exist for the orchestrator + MCP surface.
1591
1591
  `.trim()}var _C=h(()=>{"use strict";K();xC();Lt();ve();Ln();W();a(L0,"runContextTool");a(F0,"runWikiTool");a(H0,"runWikiSyncTool");a(PC,"runMemoryTool");a(U0,"getHelpText")});var Vf={};L(Vf,{ContextCommands:()=>bl,contextCommands:()=>jC,default:()=>B0});import G0 from"node:fs/promises";import W0 from"node:path";var bl,jC,B0,Jf=h(()=>{"use strict";K();Te();_t();W();Ue();bl=class{static{a(this,"ContextCommands")}async context(e=null,t=process.cwd(),r={}){try{let s=await R.readConfig(t);if(!s||!s.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=s.projectId,i=j.getGlobalProjectPath(o),c=await J.read(o),l=c?.currentTask?{id:c.currentTask.id,description:c.currentTask.description,startedAt:c.currentTask.startedAt,subtasks:c.currentTask.subtasks?.map(p=>({id:p.id,description:p.description,status:p.status,domain:p.domain})),currentSubtaskIndex:c.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return r.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(s){return{success:!1,message:`Context error: ${w(s)}`}}}async search(e=null,t=process.cwd(),r={}){let s=await R.getProjectId(t);if(!s)return{success:!1,message:"No prjct project. Run `prjct init` first."};let o=(e??"").trim();if(!o)return{success:!1,message:"search requires a query"};let{runContextTool:i}=await Promise.resolve().then(()=>(_C(),AC)),c=await i(["memory",o],s,t),l=c.tool!=="error",u=r.md?c.result.markdown??"":JSON.stringify(c,null,2);return{success:l,message:u}}formatContextMd(e){let t=[];if(t.push(F("Project",Op(Np("ID",e.projectId),Np("Path",e.globalPath)))),e.currentTask){let r=e.currentTask;if(t.push(Jo({description:r.description,status:"in-progress"})),r.subtasks&&r.subtasks.length>0){let s=r.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(s.join(`
1592
- `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(F("Stack",Ot({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),P(...t)}async loadRepoAnalysis(e){try{let t=W0.join(e,"analysis","repo-analysis.json"),r=await G0.readFile(t,"utf-8"),s=JSON.parse(r);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return B(t),null}}},jC=new bl,B0=jC});var zf={};L(zf,{PrimitiveCommands:()=>Xf});function V0(n){let e=n.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let r=t.indexOf(":");return r<=0?null:[t.slice(0,r),t.slice(r+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function J0(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}function X0(n){let e=n.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let r=e.slice(0,t).toLowerCase().trim();if(!r||!/^[a-z][a-z0-9-]*$/.test(r))return{ok:!1,error:`invalid type '${r}'. Lowercase letters + dashes only. Base types: ${Os.join(", ")}`};let s=r,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:s,content:o}:{ok:!1,error:"content is required"}}var q0,Xf,Kf=h(()=>{"use strict";Ls();ve();xn();Fn();_t();W();we();fe();Qo();Lc();Ce();qt();q0=["feature","bug","improvement","chore"],Xf=class extends V{static{a(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),r={}){try{let s=await ce(t);if(!s.ok)return s.result;if(e){let p=await Qm(s.value,t,e);if(!p.ok){if(p.reason==="unsupported")return r.md?console.log(`> ${p.message}`):g.fail(p.message),{success:!1,error:p.message};let y=await _c(s.value,r,t);return y.ok?{success:!1,error:"No active task"}:y.result}let m=`status \u2192 ${e}`;r.md?console.log(`\u2713 ${m}`):g.done(m);let f=p.verificationWarnings??[];if(f.length>0)if(r.md){console.log(`
1592
+ `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(F("Stack",Ot({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),P(...t)}async loadRepoAnalysis(e){try{let t=W0.join(e,"analysis","repo-analysis.json"),r=await G0.readFile(t,"utf-8"),s=JSON.parse(r);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return B(t),null}}},jC=new bl,B0=jC});var zf={};L(zf,{PrimitiveCommands:()=>Xf});function V0(n){let e=n.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let r=t.indexOf(":");return r<=0?null:[t.slice(0,r),t.slice(r+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function J0(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}function X0(n){let e=n.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let r=e.slice(0,t).toLowerCase().trim();if(!r||!/^[a-z][a-z0-9-]*$/.test(r))return{ok:!1,error:`invalid type '${r}'. Lowercase letters + dashes only. Base types: ${Os.join(", ")}`};let s=r,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:s,content:o}:{ok:!1,error:"content is required"}}var q0,Xf,Kf=h(()=>{"use strict";Ls();ve();xn();Fn();_t();W();we();fe();Qo();Lc();Ce();qt();q0=["feature","bug","improvement","chore"],Xf=class extends V{static{a(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),r={}){try{let s=await ae(t);if(!s.ok)return s.result;if(e){let p=await Qm(s.value,t,e);if(!p.ok){if(p.reason==="unsupported")return r.md?console.log(`> ${p.message}`):g.fail(p.message),{success:!1,error:p.message};let y=await _c(s.value,r,t);return y.ok?{success:!1,error:"No active task"}:y.result}let m=`status \u2192 ${e}`;r.md?console.log(`\u2713 ${m}`):g.done(m);let f=p.verificationWarnings??[];if(f.length>0)if(r.md){console.log(`
1593
1593
  ## Harness warnings`);for(let y of f)console.log(`- ${y}`)}else for(let y of f)g.warn(`Harness: ${y}`);return{success:!0,taskId:p.taskId,status:e}}if(!await vt(s.value,t)){let p=await J.getPausedTasks(s.value);if(p.length>0){let m=p[0],f=`Task: ${m.id} | Type: ${m.type??"unset"} | Status: paused`;return r.md?console.log(f):g.info(f),{success:!0,taskId:m.id,status:"paused"}}}let i=await _c(s.value,r,t);if(!i.ok)return i.result;let c=i.value,l=await li(s.value,c.id),u=`Task: ${c.id} | Type: ${c.type??"unset"} | Status: ${l??"active"}`,d=c.harness?`Harness: ${c.harness.level} ${c.harness.kind}/${c.harness.risk}`:null;return r.md?console.log(d?`${u}
1594
- ${d}`:u):(g.info(u),d&&g.info(d)),{success:!0,taskId:c.id,status:l??"active",harness:d}}catch(s){let o=w(s);return D(o)}}async tag(e=null,t=process.cwd(),r={}){try{let s=await ce(t);if(!s.ok)return s.result;let o=await _c(s.value,r,t);if(!o.ok)return o.result;if(!e)return g.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let i=V0(e);if(Object.keys(i).length===0)return g.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let c=i.type;c&&q0.includes(c)&&await J.updateCurrentTask(s.value,{type:c}),await ze.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return r.md?console.log(`\u2713 tagged ${l}`):g.done(`tagged ${l}`),{success:!0,taskId:o.value.id,tags:i}}catch(s){let o=w(s);return D(o)}}async remember(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return g.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
1595
- Types: ${Os.join(" | ")}`),{success:!1,error:"Missing args"};let o=X0(e);if(!o.ok)return D(o.error);let{type:i,content:c}=o,l=Bs(c);if(l.length>0&&!r.force){let y=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${y}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Us(c);if(u.length>0&&!r.force)return g.fail(`refusing to store memory that looks like prompt injection (${u.join(", ")}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let d=J0(r.tags),p=await ce(t);if(!p.ok)return p.result;let m=await vt(p.value,t);await M.remember(t,{type:i,content:c,tags:d,source:m?.id});let{regenerateWikiDeferred:f}=await Promise.resolve().then(()=>(yn(),kr));return await f(t,p.value),r.md?console.log(`\u2713 remembered ${i}: ${c}`):g.done(`remembered ${i}`),{success:!0,type:i,content:c,tags:d}}catch(s){let o=w(s);return D(o)}}async forget(e=null,t=process.cwd(),r={}){try{let s=(e??"").trim();if(!s)return g.info("Usage: prjct forget <id> (e.g. prjct forget mem_1234)"),{success:!1,error:"Missing id"};let o=await ce(t);if(!o.ok)return o.result;if(!M.forget(o.value,s))return r.md?console.log(`\u2717 no memory entry matched ${s}`):g.fail(`no memory entry matched ${s}`),{success:!1,error:`No memory entry matched ${s}`};let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(yn(),kr));return await c(t,o.value),r.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return D(o)}}};a(V0,"parseTagPairs");a(J0,"parseFlagTags");a(X0,"parseRememberArgs")});var Qf={};L(Qf,{SeedCommands:()=>Yf});var Yf,Zf=h(()=>{"use strict";gm();bm();W();we();fe();Ce();Yf=class extends V{static{a(this,"SeedCommands")}async seed(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list",i=s.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,r);case"remove":return this.remove(i||null,t,r);case"list":return this.list(null,t,r);case"suggest":return this.suggest(null,t,r);default:return g.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),r={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
1594
+ ${d}`:u):(g.info(u),d&&g.info(d)),{success:!0,taskId:c.id,status:l??"active",harness:d}}catch(s){let o=w(s);return D(o)}}async tag(e=null,t=process.cwd(),r={}){try{let s=await ae(t);if(!s.ok)return s.result;let o=await _c(s.value,r,t);if(!o.ok)return o.result;if(!e)return g.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let i=V0(e);if(Object.keys(i).length===0)return g.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let c=i.type;c&&q0.includes(c)&&await J.updateCurrentTask(s.value,{type:c}),await ze.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return r.md?console.log(`\u2713 tagged ${l}`):g.done(`tagged ${l}`),{success:!0,taskId:o.value.id,tags:i}}catch(s){let o=w(s);return D(o)}}async remember(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return g.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
1595
+ Types: ${Os.join(" | ")}`),{success:!1,error:"Missing args"};let o=X0(e);if(!o.ok)return D(o.error);let{type:i,content:c}=o,l=Bs(c);if(l.length>0&&!r.force){let y=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${y}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Us(c);if(u.length>0&&!r.force)return g.fail(`refusing to store memory that looks like prompt injection (${u.join(", ")}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let d=J0(r.tags),p=await ae(t);if(!p.ok)return p.result;let m=await vt(p.value,t);await M.remember(t,{type:i,content:c,tags:d,source:m?.id});let{regenerateWikiDeferred:f}=await Promise.resolve().then(()=>(yn(),kr));return await f(t,p.value),r.md?console.log(`\u2713 remembered ${i}: ${c}`):g.done(`remembered ${i}`),{success:!0,type:i,content:c,tags:d}}catch(s){let o=w(s);return D(o)}}async forget(e=null,t=process.cwd(),r={}){try{let s=(e??"").trim();if(!s)return g.info("Usage: prjct forget <id> (e.g. prjct forget mem_1234)"),{success:!1,error:"Missing id"};let o=await ae(t);if(!o.ok)return o.result;if(!M.forget(o.value,s))return r.md?console.log(`\u2717 no memory entry matched ${s}`):g.fail(`no memory entry matched ${s}`),{success:!1,error:`No memory entry matched ${s}`};let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(yn(),kr));return await c(t,o.value),r.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return D(o)}}};a(V0,"parseTagPairs");a(J0,"parseFlagTags");a(X0,"parseRememberArgs")});var Qf={};L(Qf,{SeedCommands:()=>Yf});var Yf,Zf=h(()=>{"use strict";gm();bm();W();we();fe();Ce();Yf=class extends V{static{a(this,"SeedCommands")}async seed(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list",i=s.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,r);case"remove":return this.remove(i||null,t,r);case"list":return this.list(null,t,r);case"suggest":return this.suggest(null,t,r);default:return g.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),r={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
1596
1596
  Available: ${fm.join(", ")}`),{success:!1,error:"No pack given"};let s=e.split(",").map(c=>c.trim()).filter(Boolean),o=await ym(t,s,{suggestPersona:r.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return r.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return D(o)}}async remove(e=null,t=process.cwd(),r={}){try{if(!e)return g.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let s=e.split(",").map(c=>c.trim()).filter(Boolean),o=await wm(t,s),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return r.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return D(o)}}async list(e=null,t=process.cwd(),r={}){try{let s=await km(t);if(s.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${fm.join(", ")}`;return r.md?console.log(`> ${o}`):g.info(o),{success:!0,active:[]}}if(r.md){let o=["# Active packs",""];for(let i of s)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(`
1597
1597
  `))}else for(let o of s)g.info(`${o.name}: ${o.description}`),g.info(` memory: ${o.memoryTypes.join(", ")||"\u2014"}`),g.info(` slots: ${o.slots.join(", ")||"\u2014"}`);return{success:!0,active:s}}catch(s){let o=w(s);return D(o)}}async suggest(e=null,t=process.cwd(),r={}){try{let s=await hm(t),o=s.map(i=>{let c=Yr[i];return{name:i,description:c?.description??""}});if(r.md){let i=["# Suggested packs for this project",""];for(let c of o)i.push(`- **${c.name}** \u2014 ${c.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${s.join(",")}\``),console.log(i.join(`
1598
1598
  `))}else g.info(`Suggested: ${s.join(", ")}`),g.info(`Activate: prjct seed add ${s.join(",")}`);return{success:!0,suggested:s}}catch(s){let o=w(s);return D(o)}}}});var NC={};L(NC,{PRJCT_HOOKS:()=>Qs,install:()=>rg,status:()=>og,uninstall:()=>sg});import eg from"node:fs/promises";import z0 from"node:os";import DC from"node:path";function Ys(){let n=process.env.HOME||z0.homedir();return DC.join(n,".claude","settings.json")}function K0(n){let e=n.command?.match(/\bhook\s+(\S+)/);return e?e[1]:null}function Y0(n){let e=new Set(Qs.map(r=>r.subcommand)),t=0;for(let r of Object.keys(n)){let s=n[r],o=[];for(let i of s)i.hooks=i.hooks.filter(c=>{if(!vl(c))return!0;let l=K0(c);return l&&!e.has(l)?(t++,!1):!0}),i.hooks.length>0&&o.push(i);o.length>0?n[r]=o:delete n[r]}return t}async function ng(){try{let n=await eg.readFile(Ys(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function $C(n){await eg.mkdir(DC.dirname(Ys()),{recursive:!0}),await eg.writeFile(Ys(),`${JSON.stringify(n,null,2)}
@@ -1647,7 +1647,7 @@ fi
1647
1647
 
1648
1648
  exit 0
1649
1649
  `;a(iO,"teamClaudeMdBlock");a(aO,"upsertBetweenMarkers")});var Tg={};L(Tg,{ConfigCommands:()=>Eg});function cO(n){let e=n.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(n);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(n)?t:n}var Eg,Cg=h(()=>{"use strict";bo();Ue();fe();Ce();Eg=class extends V{static{a(this,"ConfigCommands")}async config(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list";switch(o){case"list":return this.list(r);case"get":return this.get(s[1],r);case"set":return this.set(s[1],s.slice(2).join(" "),r);case"unset":return this.unset(s[1],r);default:return g.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=Gh(),r=Object.keys(t).sort();if(e.md){let s=r.length===0?"_No global config set._":r.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
1650
- `);console.log(P(F("Global config",s),F("Path",`\`${Wh()}\``)))}else if(r.length===0)g.info("No global config set.");else for(let s of r)console.log(` ${s} = ${JSON.stringify(t[s])}`);return{success:!0,config:t}}get(e,t){if(!e)return g.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let r=it(e);return t.md?console.log(P(F(e,r===void 0?"_(unset)_":`\`${JSON.stringify(r)}\``))):r===void 0?g.info("(unset)"):console.log(JSON.stringify(r)),{success:!0,key:e,value:r}}set(e,t,r){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=cO(t);xe(e,s);let o=`${e} = ${JSON.stringify(s)}`;return r.md?console.log(P(F("Set",o))):g.done(o),{success:!0,key:e,value:s}}unset(e,t){if(!e)return g.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};su(e);let r=`Removed ${e}`;return t.md?console.log(P(F("Unset",r))):g.done(r),{success:!0,key:e}}};a(cO,"parseValue")});var xg={};L(xg,{EmbeddingsCommands:()=>Rg});function lO(n){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(n))return"The endpoint rejected the key (401). The base URL must match the key's provider \u2014 e.g. an OpenRouter key (sk-or-\u2026) needs `--base-url https://openrouter.ai/api/v1`, not OpenAI's. Re-set with: prjct embeddings set --key <api-key> --base-url <url>";if(/\b404\b|not found/i.test(n))return"No /embeddings route at that base URL (404). Check the base URL is the provider's OpenAI-compatible root (e.g. https://openrouter.ai/api/v1, https://api.openai.com/v1).";if(/ENOTFOUND|ECONNREFUSED|fetch failed|getaddrinfo|ETIMEDOUT/i.test(n))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function Tr(n,e){let t=n.indexOf(`--${e}`);if(t>=0&&n[t+1])return n[t+1];let r=n.find(s=>s.startsWith(`--${e}=`));return r?r.slice(e.length+3):void 0}function uO(n){if(!n?.trim())return;let e={};for(let t of n.split(",")){let r=t.indexOf("=");if(r<=0)continue;let s=t.slice(0,r).trim(),o=t.slice(r+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var Rg,Pg=h(()=>{"use strict";kl();hl();W();we();Ue();fe();Ce();a(lO,"embeddingsFailureHint");a(Tr,"flag");a(uO,"parseHeaderPairs");Rg=class extends V{static{a(this,"EmbeddingsCommands")}async embeddings(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"status";switch(o){case"set":return this.set(s.slice(1),r);case"status":return this.status(r);case"test":return this.test(r);case"clear":return this.clear(r);default:return D(`Unknown subcommand '${o}'. Use: set --key <K> [--model <M>] [--base-url <U>] | status | test | clear`,r)}}async set(e,t){let r=t.key??Tr(e,"key"),s=t.model??Tr(e,"model"),o=t.baseUrl??Tr(e,"base-url")??Tr(e,"baseUrl"),i;if(!o&&r){let y=If(r);y&&(o=y.baseUrl,i=y.provider)}let c=t.authHeader??Tr(e,"auth-header"),l=t.authScheme??Tr(e,"auth-scheme"),u=l===void 0?void 0:/^none$/i.test(l)?"":l,d=uO(t.headers??Tr(e,"headers")),p=t.query??Tr(e,"query");if(!r&&!s&&!o&&c===void 0&&u===void 0&&!d&&p===void 0)return D('Nothing to set. Usage: prjct embeddings set --key <api-key> [--model <id>] [--base-url <url>] [--auth-header <h>] [--auth-scheme <s|none>] [--headers "k=v,..."] [--query <qs>]');let m;if(r)try{m=await EC(r)}catch(y){return D(`Could not store the key securely: ${w(y)}`)}let f=Lf({model:s,baseUrl:o,authHeader:c,authScheme:u,extraHeaders:d,query:p});return t.md?(console.log(P(F("Embeddings configured","Global embeddings now apply to all projects."),Ot({provider:f.provider,model:f.model,"base URL":f.baseUrl,detected:i,"auth header":f.authHeader,auth:f.authScheme===void 0?void 0:f.authScheme||"(raw key, no scheme)",query:f.query,headers:f.extraHeaders?Object.keys(f.extraHeaders).join(", "):void 0,"api key":m?`stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`:void 0}),F("Next","Run `prjct embeddings test --md` to validate now."))),{success:!0}):(g.done("Global embeddings configured (applies to all projects)"),i&&g.info(`detected: ${i} (from key prefix)`),g.info(`provider: ${f.provider}`),g.info(`model: ${f.model}`),g.info(`base URL: ${f.baseUrl}`),f.authHeader&&g.info(`auth hdr: ${f.authHeader}`),f.authScheme!==void 0&&g.info(`auth: ${f.authScheme?f.authScheme:"(raw key, no scheme)"}`),f.query&&g.info(`query: ${f.query}`),f.extraHeaders&&g.info(`headers: ${Object.keys(f.extraHeaders).join(", ")}`),m&&g.info(`api key: stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`),g.info("Each project re-vectorizes on its next session (Stop hook). Run `prjct embeddings test` to validate now."),{success:!0})}async status(e){let t=rs(),r=await SC();return t?e.md?(console.log(P(F("Embeddings","Global embeddings are configured."),Ot({provider:t.provider,model:t.model,"base URL":t.baseUrl,"auth header":t.authHeader,auth:t.authScheme===void 0?void 0:t.authScheme||"(raw key, no scheme)",query:t.query,headers:t.extraHeaders?Object.keys(t.extraHeaders).join(", "):void 0,"api key":r==="none"?"MISSING - set with `prjct embeddings set --key <api-key>`":`present (${r})`}))),{success:!0,configured:!0}):(g.done("Global embeddings: configured"),g.info(`provider: ${t.provider}`),g.info(`model: ${t.model}`),g.info(`base URL: ${t.baseUrl}`),t.authHeader&&g.info(`auth hdr: ${t.authHeader}`),t.authScheme!==void 0&&g.info(`auth: ${t.authScheme?t.authScheme:"(raw key, no scheme)"}`),t.query&&g.info(`query: ${t.query}`),t.extraHeaders&&g.info(`headers: ${Object.keys(t.extraHeaders).join(", ")}`),g.info(`api key: ${r==="none"?"MISSING \u2014 set with `prjct embeddings set --key <api-key>`":`present (${r})`}`),{success:!0,configured:!0}):e.md?(console.log(P(F("Embeddings","Global embeddings are not configured. Recall uses the built-in local subword embedder."),Ot({"api key":r==="none"?"none":`present (${r})`}),F("Next","Set one with `prjct embeddings set --key <api-key> --md`."))),{success:!0,configured:!1}):(g.info("Global embeddings: not configured \u2014 using the built-in local subword embedder."),g.info(`api key: ${r==="none"?"none":`present (${r})`}`),g.info("Set one with: prjct embeddings set --key <api-key>"),{success:!0,configured:!1})}async test(e){let t=wl(null);try{let[r]=await t.embed(["prjct embeddings connectivity probe"]);return!r||r.length===0?D(`Provider '${t.model}' returned an empty vector.`,e):e.md?(console.log(P(F("Embeddings test",`Provider '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal?F("Next","This is the local embedder. Set a key to upgrade: `prjct embeddings set --key <api-key> --md`."):null)),{success:!0,model:t.model,dims:r.length}):(g.done(`OK \u2014 '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal&&g.info("This is the local embedder. Set a key to upgrade: prjct embeddings set --key <api-key>"),{success:!0,model:t.model,dims:r.length})}catch(r){let s=w(r);Kt(`Embedding test failed for '${t.model}'.`,e),hd(s,e);let o=lO(s);return o&&hd(o,e),{success:!1,error:s}}}async clear(e){return await TC(),Ff(),e.md?(console.log(P(F("Embeddings cleared","Semantic recall now falls back to the local embedder."),Ot({"default model":gi}))),{success:!0}):(g.done("Cleared global embeddings \u2014 semantic recall falls back to the local embedder."),g.info(`(Default model when you reconfigure: ${gi}.)`),{success:!0})}}});async function eo(n,e,t){if(t.length!==0)try{let{resolveActiveTask:r}=await Promise.resolve().then(()=>(Fn(),Zm)),s=await r(n,e);s?.id&&ut.recordSurfaced(n,t,s.id)}catch{}}var El=h(()=>{"use strict";Ln();a(eo,"recordSurfacedForActiveTask")});var _g={};L(_g,{GuardCommands:()=>Ag});var Ag,jg=h(()=>{"use strict";Lt();ve();El();fe();Ce();qt();Ag=class extends V{static{a(this,"GuardCommands")}async guard(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean)[0];if(!s){let u="Usage: prjct guard <file> \u2014 surfaces preventive memory before you edit it.";return r.md?console.log(`> ${u}`):g.fail(u),{success:!1,error:"Missing file argument"}}let o=await ce(t,r);if(!o.ok)return o.result;let i=typeof r.limit=="number"&&r.limit>0?r.limit:3,c;try{c=M.recallForFile(o.value,s,i)}catch{c=[]}eo(o.value,t,c.map(u=>u.id));let l=s.split("/").pop()??s;if(c.length===0){let u=`No preventive memory recorded against \`${l}\` \u2014 clear to edit.`;return r.md?console.log(`> ${u}`):g.done(`No preventive memory for ${l} \u2014 clear to edit.`),{success:!0,file:s,hits:0}}if(r.md){let u=[`# prjct: heads up before editing \`${l}\``,"","Preventive memory recorded against this file \u2014 check before you change it:",""];for(let d of c)u.push(`- **[${Kr(d)}] ${je(d)}** \u2014 ${gr(d.content)} \`${d.id}\``);u.push("","> Surfaced as prevention. Apply if relevant; ignore if not."),console.log(u.join(`
1650
+ `);console.log(P(F("Global config",s),F("Path",`\`${Wh()}\``)))}else if(r.length===0)g.info("No global config set.");else for(let s of r)console.log(` ${s} = ${JSON.stringify(t[s])}`);return{success:!0,config:t}}get(e,t){if(!e)return g.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let r=it(e);return t.md?console.log(P(F(e,r===void 0?"_(unset)_":`\`${JSON.stringify(r)}\``))):r===void 0?g.info("(unset)"):console.log(JSON.stringify(r)),{success:!0,key:e,value:r}}set(e,t,r){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=cO(t);xe(e,s);let o=`${e} = ${JSON.stringify(s)}`;return r.md?console.log(P(F("Set",o))):g.done(o),{success:!0,key:e,value:s}}unset(e,t){if(!e)return g.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};su(e);let r=`Removed ${e}`;return t.md?console.log(P(F("Unset",r))):g.done(r),{success:!0,key:e}}};a(cO,"parseValue")});var xg={};L(xg,{EmbeddingsCommands:()=>Rg});function lO(n){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(n))return"The endpoint rejected the key (401). The base URL must match the key's provider \u2014 e.g. an OpenRouter key (sk-or-\u2026) needs `--base-url https://openrouter.ai/api/v1`, not OpenAI's. Re-set with: prjct embeddings set --key <api-key> --base-url <url>";if(/\b404\b|not found/i.test(n))return"No /embeddings route at that base URL (404). Check the base URL is the provider's OpenAI-compatible root (e.g. https://openrouter.ai/api/v1, https://api.openai.com/v1).";if(/ENOTFOUND|ECONNREFUSED|fetch failed|getaddrinfo|ETIMEDOUT/i.test(n))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function Tr(n,e){let t=n.indexOf(`--${e}`);if(t>=0&&n[t+1])return n[t+1];let r=n.find(s=>s.startsWith(`--${e}=`));return r?r.slice(e.length+3):void 0}function uO(n){if(!n?.trim())return;let e={};for(let t of n.split(",")){let r=t.indexOf("=");if(r<=0)continue;let s=t.slice(0,r).trim(),o=t.slice(r+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var Rg,Pg=h(()=>{"use strict";kl();hl();W();we();Ue();fe();Ce();a(lO,"embeddingsFailureHint");a(Tr,"flag");a(uO,"parseHeaderPairs");Rg=class extends V{static{a(this,"EmbeddingsCommands")}async embeddings(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"status";switch(o){case"set":return this.set(s.slice(1),r);case"status":return this.status(r);case"test":return this.test(r);case"clear":return this.clear(r);default:return D(`Unknown subcommand '${o}'. Use: set --key <K> [--model <M>] [--base-url <U>] | status | test | clear`,r)}}async set(e,t){let r=t.key??Tr(e,"key"),s=t.model??Tr(e,"model"),o=t.baseUrl??Tr(e,"base-url")??Tr(e,"baseUrl"),i;if(!o&&r){let y=If(r);y&&(o=y.baseUrl,i=y.provider)}let c=t.authHeader??Tr(e,"auth-header"),l=t.authScheme??Tr(e,"auth-scheme"),u=l===void 0?void 0:/^none$/i.test(l)?"":l,d=uO(t.headers??Tr(e,"headers")),p=t.query??Tr(e,"query");if(!r&&!s&&!o&&c===void 0&&u===void 0&&!d&&p===void 0)return D('Nothing to set. Usage: prjct embeddings set --key <api-key> [--model <id>] [--base-url <url>] [--auth-header <h>] [--auth-scheme <s|none>] [--headers "k=v,..."] [--query <qs>]');let m;if(r)try{m=await EC(r)}catch(y){return D(`Could not store the key securely: ${w(y)}`)}let f=Lf({model:s,baseUrl:o,authHeader:c,authScheme:u,extraHeaders:d,query:p});return t.md?(console.log(P(F("Embeddings configured","Global embeddings now apply to all projects."),Ot({provider:f.provider,model:f.model,"base URL":f.baseUrl,detected:i,"auth header":f.authHeader,auth:f.authScheme===void 0?void 0:f.authScheme||"(raw key, no scheme)",query:f.query,headers:f.extraHeaders?Object.keys(f.extraHeaders).join(", "):void 0,"api key":m?`stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`:void 0}),F("Next","Run `prjct embeddings test --md` to validate now."))),{success:!0}):(g.done("Global embeddings configured (applies to all projects)"),i&&g.info(`detected: ${i} (from key prefix)`),g.info(`provider: ${f.provider}`),g.info(`model: ${f.model}`),g.info(`base URL: ${f.baseUrl}`),f.authHeader&&g.info(`auth hdr: ${f.authHeader}`),f.authScheme!==void 0&&g.info(`auth: ${f.authScheme?f.authScheme:"(raw key, no scheme)"}`),f.query&&g.info(`query: ${f.query}`),f.extraHeaders&&g.info(`headers: ${Object.keys(f.extraHeaders).join(", ")}`),m&&g.info(`api key: stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`),g.info("Each project re-vectorizes on its next session (Stop hook). Run `prjct embeddings test` to validate now."),{success:!0})}async status(e){let t=rs(),r=await SC();return t?e.md?(console.log(P(F("Embeddings","Global embeddings are configured."),Ot({provider:t.provider,model:t.model,"base URL":t.baseUrl,"auth header":t.authHeader,auth:t.authScheme===void 0?void 0:t.authScheme||"(raw key, no scheme)",query:t.query,headers:t.extraHeaders?Object.keys(t.extraHeaders).join(", "):void 0,"api key":r==="none"?"MISSING - set with `prjct embeddings set --key <api-key>`":`present (${r})`}))),{success:!0,configured:!0}):(g.done("Global embeddings: configured"),g.info(`provider: ${t.provider}`),g.info(`model: ${t.model}`),g.info(`base URL: ${t.baseUrl}`),t.authHeader&&g.info(`auth hdr: ${t.authHeader}`),t.authScheme!==void 0&&g.info(`auth: ${t.authScheme?t.authScheme:"(raw key, no scheme)"}`),t.query&&g.info(`query: ${t.query}`),t.extraHeaders&&g.info(`headers: ${Object.keys(t.extraHeaders).join(", ")}`),g.info(`api key: ${r==="none"?"MISSING \u2014 set with `prjct embeddings set --key <api-key>`":`present (${r})`}`),{success:!0,configured:!0}):e.md?(console.log(P(F("Embeddings","Global embeddings are not configured. Recall uses the built-in local subword embedder."),Ot({"api key":r==="none"?"none":`present (${r})`}),F("Next","Set one with `prjct embeddings set --key <api-key> --md`."))),{success:!0,configured:!1}):(g.info("Global embeddings: not configured \u2014 using the built-in local subword embedder."),g.info(`api key: ${r==="none"?"none":`present (${r})`}`),g.info("Set one with: prjct embeddings set --key <api-key>"),{success:!0,configured:!1})}async test(e){let t=wl(null);try{let[r]=await t.embed(["prjct embeddings connectivity probe"]);return!r||r.length===0?D(`Provider '${t.model}' returned an empty vector.`,e):e.md?(console.log(P(F("Embeddings test",`Provider '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal?F("Next","This is the local embedder. Set a key to upgrade: `prjct embeddings set --key <api-key> --md`."):null)),{success:!0,model:t.model,dims:r.length}):(g.done(`OK \u2014 '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal&&g.info("This is the local embedder. Set a key to upgrade: prjct embeddings set --key <api-key>"),{success:!0,model:t.model,dims:r.length})}catch(r){let s=w(r);Kt(`Embedding test failed for '${t.model}'.`,e),hd(s,e);let o=lO(s);return o&&hd(o,e),{success:!1,error:s}}}async clear(e){return await TC(),Ff(),e.md?(console.log(P(F("Embeddings cleared","Semantic recall now falls back to the local embedder."),Ot({"default model":gi}))),{success:!0}):(g.done("Cleared global embeddings \u2014 semantic recall falls back to the local embedder."),g.info(`(Default model when you reconfigure: ${gi}.)`),{success:!0})}}});async function eo(n,e,t){if(t.length!==0)try{let{resolveActiveTask:r}=await Promise.resolve().then(()=>(Fn(),Zm)),s=await r(n,e);s?.id&&ut.recordSurfaced(n,t,s.id)}catch{}}var El=h(()=>{"use strict";Ln();a(eo,"recordSurfacedForActiveTask")});var _g={};L(_g,{GuardCommands:()=>Ag});var Ag,jg=h(()=>{"use strict";Lt();ve();El();fe();Ce();qt();Ag=class extends V{static{a(this,"GuardCommands")}async guard(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean)[0];if(!s){let u="Usage: prjct guard <file> \u2014 surfaces preventive memory before you edit it.";return r.md?console.log(`> ${u}`):g.fail(u),{success:!1,error:"Missing file argument"}}let o=await ae(t,r);if(!o.ok)return o.result;let i=typeof r.limit=="number"&&r.limit>0?r.limit:3,c;try{c=M.recallForFile(o.value,s,i)}catch{c=[]}eo(o.value,t,c.map(u=>u.id));let l=s.split("/").pop()??s;if(c.length===0){let u=`No preventive memory recorded against \`${l}\` \u2014 clear to edit.`;return r.md?console.log(`> ${u}`):g.done(`No preventive memory for ${l} \u2014 clear to edit.`),{success:!0,file:s,hits:0}}if(r.md){let u=[`# prjct: heads up before editing \`${l}\``,"","Preventive memory recorded against this file \u2014 check before you change it:",""];for(let d of c)u.push(`- **[${Kr(d)}] ${je(d)}** \u2014 ${gr(d.content)} \`${d.id}\``);u.push("","> Surfaced as prevention. Apply if relevant; ignore if not."),console.log(u.join(`
1651
1651
  `))}else{g.info(`\u26A0 ${c.length} preventive memory entr${c.length===1?"y":"ies"} for ${l}:`);for(let u of c)g.info(` \u2022 [${Kr(u)}] ${je(u)} \u2014 ${gr(u.content,120)} (${u.id})`)}return{success:!0,file:s,hits:c.length}}}});var WC={};L(WC,{buildInventory:()=>fO,renderInventoryMd:()=>bO});import HC from"node:fs/promises";import to from"node:path";async function fO(n,e){let t=_e.list(e,{includeArchived:!0}),r={};for(let d of t)r[d.status]=(r[d.status]??0)+1;let s=new Map,o=new Set;for(let d of t){let p=gO(d);if(!p)continue;o.add(p);let m=s.get(p)??[];m.push(d),s.set(p,m)}let i=await hO(n);for(let d of i)o.add(d);let c=[],l=[];for(let d of[...o].sort()){let p=s.get(d)??[],m=await yO(n,d),f=await wO(n,d,p),y=p.length>0?p.reduce((b,S)=>S.updatedAt>b?S.updatedAt:b,""):null,x=!1;for(let b of p.filter(S=>S.status==="shipped")){let S=await kO(n,b);l.push({specId:b.id,title:b.title,status:b.status,drift:S.drift,locChanged:S.locChanged,cosmeticOnly:S.cosmeticOnly}),S.drift===!0?x=!0:S.drift==="unknown"&&x===!1&&(x="unknown")}c.push({module:d,specCount:p.length,coveredFiles:f,totalFiles:m,coveredPct:m===0?null:Math.round(f/m*1e4)/100,lastUpdated:y||null,drift:x})}let u=c.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:n,totalSpecs:t.length,byStatus:r,modules:c,driftDetail:l,uncoveredModules:u}}function gO(n){let e=n.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let r=t[1].split("/").slice(0,2);return r.length===2?r.join("/"):null}async function hO(n){let e=to.join(n,"core");try{return(await HC.readdir(e,{withFileTypes:!0})).filter(r=>r.isDirectory()&&!r.name.startsWith(".")&&!r.name.startsWith("__")).map(r=>`core/${r.name}`)}catch{return[]}}async function yO(n,e){let t=to.join(n,e),r=0;try{await Ig(t,async s=>{let o=to.relative(n,s);UC(o)||GC(o)&&r++})}catch{}return r}async function wO(n,e,t){let r=to.join(n,e),s=new Set;for(let i of t)for(let c of i.content.scope){let l=c.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&s.add(l[0])}let o=0;try{await Ig(r,async i=>{let c=to.relative(n,i);if(!UC(c)&&GC(c)){for(let l of s)if(c===l||c.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function Ig(n,e){let t;try{t=await HC.readdir(n,{withFileTypes:!0})}catch{return}for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="dist")continue;let s=to.join(n,r.name);r.isDirectory()?await Ig(s,e):r.isFile()&&await e(s)}}function UC(n){return mO.some(e=>e.test(n))}function GC(n){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(n)}async function kO(n,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 r=0;try{let{stdout:o}=await G("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.match(/(\d+) insertions?/),c=o.match(/(\d+) deletions?/);r=(i?Number.parseInt(i[1],10):0)+(c?Number.parseInt(c[1],10):0)}catch{return{drift:"unknown"}}if(r<=dO)return{drift:!1,locChanged:r,cosmeticOnly:!1};let s=!0;try{let{stdout:o}=await G("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.split(`
1652
1652
  `).filter(Boolean);if(i.length===0)return{drift:!1,locChanged:r,cosmeticOnly:!0};s=i.every(c=>pO.test(c))}catch{s=!1}return{drift:!s,locChanged:r,cosmeticOnly:s}}function bO(n){let e=[];if(e.push("# Spec inventory"),e.push(""),e.push(`_${n.totalSpecs} specs across ${n.modules.length} modules \xB7 generated ${n.generatedAt}_`),e.push(""),Object.keys(n.byStatus).length>0){e.push("## By status");for(let[t,r]of Object.entries(n.byStatus))e.push(`- ${t}: ${r}`);e.push("")}e.push("## Coverage by module"),e.push(""),e.push("| Module | Specs | Files | Covered | % | Drift | Last updated |"),e.push("|---|---|---|---|---|---|---|");for(let t of n.modules){let r=t.coveredPct===null?"n/a":`${t.coveredPct}%`,s=t.drift===!0?"\u26A0\uFE0F yes":t.drift==="unknown"?"\u2754":"\u2713",o=t.lastUpdated?t.lastUpdated.slice(0,10):"\u2014";e.push(`| \`${t.module}\` | ${t.specCount} | ${t.totalFiles} | ${t.coveredFiles} | ${r} | ${s} | ${o} |`)}if(n.uncoveredModules.length>0){e.push(""),e.push("## Modules with NO specs");for(let t of n.uncoveredModules)e.push(`- \`${t}\``)}return e.join(`
1653
1653
  `)}var dO,pO,mO,BC=h(()=>{"use strict";ti();pe();dO=5,pO=/^(chore|style|format|fmt|docs|typo)(\(|:|!)/i,mO=[/(^|\/)types\.ts$/,/(^|\/)types\//,/\/__tests__\//,/\.d\.ts$/,/(^|\/)index\.ts$/,/\.test\.ts$/,/\.spec\.ts$/];a(fO,"buildInventory");a(gO,"inferModule");a(hO,"listTopLevelModules");a(yO,"countModuleFiles");a(wO,"countCoveredFiles");a(Ig,"walk");a(UC,"excluded");a(GC,"isCodeFile");a(kO,"driftForSpec");a(bO,"renderInventoryMd")});var $g={};L($g,{SpecCommands:()=>Dg,renderAuditDispatch:()=>Sm});function vO(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}function SO(n){let e=n.content,t=[`# ${n.title}`,"",`**id:** \`${n.id}\` \xB7 **status:** ${n.status} \xB7 **created:** ${n.createdAt}`,"","## Goal",e.goal];if(e.eli10&&t.push("","## ELI10",e.eli10),e.stakes&&t.push("","## Stakes",e.stakes),e.acceptance_criteria.length>0){t.push("","## Acceptance criteria");for(let r of e.acceptance_criteria)t.push(`- [ ] ${r}`)}if(e.scope.length>0){t.push("","## Scope");for(let r of e.scope)t.push(`- ${r}`)}if(e.out_of_scope.length>0){t.push("","## Out of scope");for(let r of e.out_of_scope)t.push(`- ${r}`)}if(e.risks.length>0){t.push("","## Risks");for(let r of e.risks)t.push(`- **${r.risk}** \u2014 ${r.mitigation}`)}if(e.test_plan.length>0){t.push("","## Test plan");for(let r of e.test_plan)t.push(`- ${r}`)}if(e.reviews&&Object.keys(e.reviews).length>0){t.push("","## Reviews");for(let[r,s]of Object.entries(e.reviews))t.push(`- **${r}:** ${s.verdict} \u2014 ${s.notes} _(${s.ts})_`)}return e.linked_tasks.length>0&&t.push("","## Linked tasks",...e.linked_tasks.map(r=>`- ${r}`)),e.notes&&t.push("","## Notes",e.notes),t.join(`
@@ -1702,13 +1702,13 @@ ${s.map(l=>`- ${l.content.split(`
1702
1702
  > none logged.`,c=o.length>0?`### \`lean:\` markers in source (${o.length})
1703
1703
  ${o.map(l=>`- \`${l}\``).join(`
1704
1704
  `)}`:"### `lean:` markers in source\n> none found.";console.log(P("## Lean debt",i,c))}else{g.info(`Lean debt \u2014 ${s.length} logged, ${o.length} \`lean:\` markers in source`);for(let i of s)g.info(` \u2022 ${i.content.split(`
1705
- `)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(r){return D(w(r),t)}}};a(uR,"effectiveMode");a(no,"safeGit");a(AO,"resolveBase");a(_O,"collectReviewDiff");a(jO,"scanLeanMarkers");IO=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,dR=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;a(pR,"emptySmells");a(mR,"scanDiffSmells");a(fR,"leanFlags");a(aR,"formatSmells");DO={effectiveMode:uR,scanDiffSmells:mR,leanFlags:fR,LEAN_MODES:Ei,MANY_NEW_FILES:lR,OVER_ENGINEERING_RE:dR}});import $O from"node:path";function Ug(){return $O.join(j.getStatePath(),"cloud-linked.json")}async function Pl(){let n=await We(Ug(),[]);return Array.isArray(n)?n.filter(e=>e?.projectId&&e?.projectPath):[]}async function yR(n,e){let r=(await Pl()).filter(s=>s.projectId!==n);r.push({projectId:n,projectPath:e}),await Rt(j.getStatePath()),await Ee(Ug(),r)}async function wR(n){let e=await Pl();await Rt(j.getStatePath()),await Ee(Ug(),e.filter(t=>t.projectId!==n))}var Gg=h(()=>{"use strict";Te();ee();a(Ug,"registryPath");a(Pl,"listLinkedProjects");a(yR,"addLinkedProject");a(wR,"removeLinkedProject")});function kR(){return typeof globalThis.WebSocket=="function"}function MO(n,e,t,r){let s=n.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:r,project:e});return`${s}/ws?${o.toString()}`}function NO(n,e,t){let r=Math.min(t,e*2**n);return Math.round(Math.random()*r)}var Al,bR=h(()=>{"use strict";a(kR,"hasGlobalWebSocket");a(MO,"buildRealtimeUrl");a(NO,"backoffDelay");Al=class{static{a(this,"RealtimeClient")}opts;ws=null;_state="idle";attempt=0;stopped=!1;reconnectTimer=null;constructor(e){this.opts={...e,wsFactory:e.wsFactory??(t=>new globalThis.WebSocket(t)),baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??3e4}}get state(){return this._state}start(){this.stopped||this._state==="connecting"||this._state==="open"||this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.closeSocket(),this._state="closed"}connect(){this._state=this.attempt===0?"connecting":"reconnecting";let e=MO(this.opts.apiUrl,this.opts.projectId,this.opts.apiKey,this.opts.deviceId),t;try{t=this.opts.wsFactory(e)}catch{this.scheduleReconnect();return}this.ws=t,t.onopen=()=>{this._state="open",this.attempt=0},t.onmessage=r=>{this.handleMessage(r?.data)},t.onerror=()=>{},t.onclose=()=>{this.stopped||this.scheduleReconnect()}}async handleMessage(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return}if(!t||typeof t!="object")return;let r=t;if(r.type==="event"&&r.event&&typeof r.event=="object")try{await this.opts.apply(this.opts.projectId,r.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=NO(this.attempt,this.opts.baseDelayMs,this.opts.maxDelayMs);this.attempt+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.stopped||this.connect()},e),this.reconnectTimer?.unref?.()}closeSocket(){if(!this.ws)return;let e=this.ws;e.onopen=null,e.onmessage=null,e.onclose=null,e.onerror=null;try{e.close()}catch{}this.ws=null}}});var Wg,_l,is,Bg=h(()=>{"use strict";En();Gg();bR();ci();Wg=class{static{a(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&kR()}async startAll(){if(!this.available())return;let e=await Pl();for(let t of e)try{await this.start(t.projectId,t.projectPath)}catch{}}async start(e,t){if(!this.available()||this.clients.has(e))return;let{default:r}=await Promise.resolve().then(()=>(K(),sr)),s=await r.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await ae.read();if(!o.apiKey)return;let[i,c]=await Promise.all([ae.getApiUrl(),ae.getDeviceId()]),l=new Al({projectId:e,apiUrl:i,apiKey:o.apiKey,deviceId:c,apply:a((u,d)=>on.applyRealtimeEvent(u,d),"apply")});this.clients.set(e,l),l.start()}stop(e){let t=this.clients.get(e);t&&(t.stop(),this.clients.delete(e))}stopAll(){for(let e of this.clients.values())e.stop();this.clients.clear()}status(e){return this.clients.get(e)?.state??"disabled"}},_l=new Wg,is=_l});var vR={};L(vR,{CloudCommands:()=>qg});import OO from"node:path";var LO,qg,SR=h(()=>{"use strict";So();K();Dm();En();Gg();Qc();Bg();ai();ci();W();we();Ue();fe();Ce();LO=["link","unlink","status","sync","pull","pause","resume"],qg=class extends V{static{a(this,"CloudCommands")}async cloud(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.status(t,r);switch(o){case"link":return this.link(t,r);case"unlink":return this.unlink(t,r);case"sync":return this.runSync(t,r);case"pull":return this.runPull(t,r);case"pause":return this.setPaused(!0,t,r);case"resume":return this.setPaused(!1,t,r);default:return N(`Unknown cloud subcommand "${o}". Use: ${LO.join(", ")}.`,r)}}async readProject(e){let t=await R.readConfig(e).catch(()=>null);return t?.projectId?t:null}async link(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!await ae.hasAuth())return D("Not authenticated. Run `prjct login`, then `prjct cloud link`.",t);let s={enabled:!0,paused:!1,linkedAt:r.cloud?.linkedAt??new Date().toISOString(),include:r.cloud?.include},o=await Kc(r.projectId).catch(()=>{}),i=await Zc.linkProject(r.projectId,OO.basename(e),o);if(r.cloud=s,await R.writeConfig(e,r),i.syncStatus==="active"){await yR(r.projectId,e),await is.start(r.projectId,e).catch(()=>{});let c=await on.sync(r.projectId,{include:r.cloud.include??{}});return this.reportSync("Linked",c,t,{extra:"Project is now linked. It will also sync on `prjct ship` and at session end."})}return this.subscriptionRequired(i.message,t,{title:i.syncStatus==="payment_pending"?"Cloud sync waiting for payment":"Cloud sync waiting for subscription",prefix:`Repo linked to your prjct account. Billing: ${i.billingUrl}`})}async unlink(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!r.cloud?.enabled){let o="Already local-only \u2014 nothing to unlink.";return console.log(t.md?P("## Cloud",`> ${o}`):o),{success:!0,linked:!1}}r.cloud={...r.cloud,enabled:!1,paused:!1},await R.writeConfig(e,r),is.stop(r.projectId),await wR(r.projectId);let s="Unlinked \u2014 this project is local-only again. Local data was not touched.";return t.md?console.log(P("## Cloud",`> ${s}`)):g.done(s),{success:!0,linked:!1}}async runSync(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;let o=await on.sync(r.projectId,{include:r.cloud?.include??{}});return this.reportSync("Synced",o,t)}async runPull(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;try{let o=await on.pull(r.projectId);if(!o.success)return o.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(o.error,t):N(`Pull failed: ${o.error??"unknown error"}`,t);let i=`Pulled ${o.count??0} change(s) (${o.applied??0} applied).`;return t.md?console.log(P("## Cloud pull",`> ${i}`)):g.done(i),{success:!0,pulled:o.count??0,applied:o.applied??0}}catch(o){return D(w(o),t)}}async setPaused(e,t,r){let s=await this.readProject(t);if(!s)return D("No prjct project here \u2014 run `prjct init` first.",r);if(!s.cloud?.enabled)return N("Not linked \u2014 nothing to pause/resume. Run `prjct cloud link` first.",r);s.cloud={...s.cloud,paused:e},await R.writeConfig(t,s),e?is.stop(s.projectId):await is.start(s.projectId,t).catch(()=>{});let o=e?"Cloud sync paused. Resume with `prjct cloud resume`.":"Cloud sync resumed.";return r.md?console.log(P("## Cloud",`> ${o}`)):g.done(o),{success:!0,paused:e}}async status(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=await ae.hasAuth(),o=r.cloud,i=!!o?.enabled,c=!!o?.paused,l=(await At.getPending(r.projectId)).length,u=await At.getLastSync(r.projectId),d={...Yc,...o?.include??{}},p=Object.entries(d).filter(([,y])=>y).map(([y])=>y),m=s?i?c?"linked, paused":"linked, active":"local-only (run `prjct cloud link`)":"not authenticated (run `prjct login`)",f=i?is.available()?is.status(r.projectId):"requires daemon":"n/a";return t.md?console.log(P("## Cloud status",`> **State**: ${m}`,[`- Authenticated: ${s?"yes":"no"}`,`- Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,`- Realtime: ${f}`,`- Pending events: ${l}`,`- Last sync: ${u?.timestamp??"never"}`,`- Syncing groups: ${p.join(", ")}`].join(`
1705
+ `)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(r){return D(w(r),t)}}};a(uR,"effectiveMode");a(no,"safeGit");a(AO,"resolveBase");a(_O,"collectReviewDiff");a(jO,"scanLeanMarkers");IO=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,dR=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;a(pR,"emptySmells");a(mR,"scanDiffSmells");a(fR,"leanFlags");a(aR,"formatSmells");DO={effectiveMode:uR,scanDiffSmells:mR,leanFlags:fR,LEAN_MODES:Ei,MANY_NEW_FILES:lR,OVER_ENGINEERING_RE:dR}});import $O from"node:path";function Ug(){return $O.join(j.getStatePath(),"cloud-linked.json")}async function Pl(){let n=await We(Ug(),[]);return Array.isArray(n)?n.filter(e=>e?.projectId&&e?.projectPath):[]}async function yR(n,e){let r=(await Pl()).filter(s=>s.projectId!==n);r.push({projectId:n,projectPath:e}),await Rt(j.getStatePath()),await Ee(Ug(),r)}async function wR(n){let e=await Pl();await Rt(j.getStatePath()),await Ee(Ug(),e.filter(t=>t.projectId!==n))}var Gg=h(()=>{"use strict";Te();ee();a(Ug,"registryPath");a(Pl,"listLinkedProjects");a(yR,"addLinkedProject");a(wR,"removeLinkedProject")});function kR(){return typeof globalThis.WebSocket=="function"}function MO(n,e,t,r){let s=n.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:r,project:e});return`${s}/ws?${o.toString()}`}function NO(n,e,t){let r=Math.min(t,e*2**n);return Math.round(Math.random()*r)}var Al,bR=h(()=>{"use strict";a(kR,"hasGlobalWebSocket");a(MO,"buildRealtimeUrl");a(NO,"backoffDelay");Al=class{static{a(this,"RealtimeClient")}opts;ws=null;_state="idle";attempt=0;stopped=!1;reconnectTimer=null;constructor(e){this.opts={...e,wsFactory:e.wsFactory??(t=>new globalThis.WebSocket(t)),baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??3e4}}get state(){return this._state}start(){this.stopped||this._state==="connecting"||this._state==="open"||this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.closeSocket(),this._state="closed"}connect(){this._state=this.attempt===0?"connecting":"reconnecting";let e=MO(this.opts.apiUrl,this.opts.projectId,this.opts.apiKey,this.opts.deviceId),t;try{t=this.opts.wsFactory(e)}catch{this.scheduleReconnect();return}this.ws=t,t.onopen=()=>{this._state="open",this.attempt=0},t.onmessage=r=>{this.handleMessage(r?.data)},t.onerror=()=>{},t.onclose=()=>{this.stopped||this.scheduleReconnect()}}async handleMessage(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return}if(!t||typeof t!="object")return;let r=t;if(r.type==="event"&&r.event&&typeof r.event=="object")try{await this.opts.apply(this.opts.projectId,r.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=NO(this.attempt,this.opts.baseDelayMs,this.opts.maxDelayMs);this.attempt+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.stopped||this.connect()},e),this.reconnectTimer?.unref?.()}closeSocket(){if(!this.ws)return;let e=this.ws;e.onopen=null,e.onmessage=null,e.onclose=null,e.onerror=null;try{e.close()}catch{}this.ws=null}}});var Wg,_l,is,Bg=h(()=>{"use strict";En();Gg();bR();ci();Wg=class{static{a(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&kR()}async startAll(){if(!this.available())return;let e=await Pl();for(let t of e)try{await this.start(t.projectId,t.projectPath)}catch{}}async start(e,t){if(!this.available()||this.clients.has(e))return;let{default:r}=await Promise.resolve().then(()=>(K(),sr)),s=await r.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await ce.read();if(!o.apiKey)return;let[i,c]=await Promise.all([ce.getApiUrl(),ce.getDeviceId()]),l=new Al({projectId:e,apiUrl:i,apiKey:o.apiKey,deviceId:c,apply:a((u,d)=>on.applyRealtimeEvent(u,d),"apply")});this.clients.set(e,l),l.start()}stop(e){let t=this.clients.get(e);t&&(t.stop(),this.clients.delete(e))}stopAll(){for(let e of this.clients.values())e.stop();this.clients.clear()}status(e){return this.clients.get(e)?.state??"disabled"}},_l=new Wg,is=_l});var vR={};L(vR,{CloudCommands:()=>qg});import OO from"node:path";var LO,qg,SR=h(()=>{"use strict";So();K();Dm();En();Gg();Qc();Bg();ai();ci();W();we();Ue();fe();Ce();LO=["link","unlink","status","sync","pull","pause","resume"],qg=class extends V{static{a(this,"CloudCommands")}async cloud(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.status(t,r);switch(o){case"link":return this.link(t,r);case"unlink":return this.unlink(t,r);case"sync":return this.runSync(t,r);case"pull":return this.runPull(t,r);case"pause":return this.setPaused(!0,t,r);case"resume":return this.setPaused(!1,t,r);default:return N(`Unknown cloud subcommand "${o}". Use: ${LO.join(", ")}.`,r)}}async readProject(e){let t=await R.readConfig(e).catch(()=>null);return t?.projectId?t:null}async link(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!await ce.hasAuth())return D("Not authenticated. Run `prjct login`, then `prjct cloud link`.",t);let s={enabled:!0,paused:!1,linkedAt:r.cloud?.linkedAt??new Date().toISOString(),include:r.cloud?.include},o=await Kc(r.projectId).catch(()=>{}),i=await Zc.linkProject(r.projectId,OO.basename(e),o);if(r.cloud=s,await R.writeConfig(e,r),i.syncStatus==="active"){await yR(r.projectId,e),await is.start(r.projectId,e).catch(()=>{});let c=await on.sync(r.projectId,{include:r.cloud.include??{}});return this.reportSync("Linked",c,t,{extra:"Project is now linked. It will also sync on `prjct ship` and at session end."})}return this.subscriptionRequired(i.message,t,{title:i.syncStatus==="payment_pending"?"Cloud sync waiting for payment":"Cloud sync waiting for subscription",prefix:`Repo linked to your prjct account. Billing: ${i.billingUrl}`})}async unlink(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!r.cloud?.enabled){let o="Already local-only \u2014 nothing to unlink.";return console.log(t.md?P("## Cloud",`> ${o}`):o),{success:!0,linked:!1}}r.cloud={...r.cloud,enabled:!1,paused:!1},await R.writeConfig(e,r),is.stop(r.projectId),await wR(r.projectId);let s="Unlinked \u2014 this project is local-only again. Local data was not touched.";return t.md?console.log(P("## Cloud",`> ${s}`)):g.done(s),{success:!0,linked:!1}}async runSync(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;let o=await on.sync(r.projectId,{include:r.cloud?.include??{}});return this.reportSync("Synced",o,t)}async runPull(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;try{let o=await on.pull(r.projectId);if(!o.success)return o.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(o.error,t):N(`Pull failed: ${o.error??"unknown error"}`,t);let i=`Pulled ${o.count??0} change(s) (${o.applied??0} applied).`;return t.md?console.log(P("## Cloud pull",`> ${i}`)):g.done(i),{success:!0,pulled:o.count??0,applied:o.applied??0}}catch(o){return D(w(o),t)}}async setPaused(e,t,r){let s=await this.readProject(t);if(!s)return D("No prjct project here \u2014 run `prjct init` first.",r);if(!s.cloud?.enabled)return N("Not linked \u2014 nothing to pause/resume. Run `prjct cloud link` first.",r);s.cloud={...s.cloud,paused:e},await R.writeConfig(t,s),e?is.stop(s.projectId):await is.start(s.projectId,t).catch(()=>{});let o=e?"Cloud sync paused. Resume with `prjct cloud resume`.":"Cloud sync resumed.";return r.md?console.log(P("## Cloud",`> ${o}`)):g.done(o),{success:!0,paused:e}}async status(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=await ce.hasAuth(),o=r.cloud,i=!!o?.enabled,c=!!o?.paused,l=(await At.getPending(r.projectId)).length,u=await At.getLastSync(r.projectId),d={...Yc,...o?.include??{}},p=Object.entries(d).filter(([,y])=>y).map(([y])=>y),m=s?i?c?"linked, paused":"linked, active":"local-only (run `prjct cloud link`)":"not authenticated (run `prjct login`)",f=i?is.available()?is.status(r.projectId):"requires daemon":"n/a";return t.md?console.log(P("## Cloud status",`> **State**: ${m}`,[`- Authenticated: ${s?"yes":"no"}`,`- Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,`- Realtime: ${f}`,`- Pending events: ${l}`,`- Last sync: ${u?.timestamp??"never"}`,`- Syncing groups: ${p.join(", ")}`].join(`
1706
1706
  `))):g.info([`Cloud \u2014 ${m}`,` Authenticated: ${s?"yes":"no"}`,` Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,` Realtime: ${f}`,` Pending events: ${l}`,` Last sync: ${u?.timestamp??"never"}`,` Syncing groups: ${p.join(", ")}`].join(`
1707
1707
  `)),{success:!0,linked:i,paused:c,authed:s,pending:l,realtime:f}}gate(e,t){return e.cloud?.enabled?e.cloud.paused?N("Cloud sync is paused. Run `prjct cloud resume` first.",t):null:N("This project is not linked. Run `prjct cloud link` first.",t)}subscriptionRequired(e,t,r){let s=e??"Cloud sync needs an active prjct subscription. Your local data is safe \u2014 only cloud backup is paused.";return t.md?console.log(P(`## ${r?.title??"Subscription required"}`,`> \u{1F4B3} ${r?.prefix?`${r.prefix}
1708
1708
 
1709
1709
  ${s}`:s}`)):(g.warn(r?.title??"Cloud backup paused \u2014 subscription required"),r?.prefix&&g.info(r.prefix),g.info(s)),{success:!1,paymentRequired:!0,message:s}}reportSync(e,t,r,s){if(!t.success)return t.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(t.error,r):N(`${e} with errors: ${t.error??"unknown error"}`,r);let o=t.pushed?.count??0,i=t.pulled?.count??0,c=`${e} \u2014 ${o} pushed, ${i} pulled.`;return r.md?console.log(P("## Cloud",`> ${c}`,...s?.extra?[s.extra]:[])):(g.done(c),s?.extra&&g.info(s.extra)),{success:!0,pushed:o,pulled:i}}}});function ro(n){let e=n?.notify?.mode;if(e==="on"||e==="off")return e;let t=process.env.PRJCT_NOTIFY_MODE?.toLowerCase();return t==="on"||t==="off"?t:"on"}function ER(n){return n.replace(/["\\]/g,"").replace(/[\r\n]+/g," ").trim().slice(0,180)}async function jl(n,e){try{let t=ER(n)||"prjct",r=ER(e);process.platform==="darwin"?await G("osascript",["-e",`display notification "${r}" with title "${t}"`]):process.platform==="linux"&&await G("notify-send",[t,r])}catch{}}var Vg,Il=h(()=>{"use strict";pe();Vg=["on","off"];a(ro,"effectiveNotifyMode");a(ER,"sanitize");a(jl,"notifyDesktop")});var TR={};L(TR,{NotifyCommands:()=>Jg});var Jg,CR=h(()=>{"use strict";K();we();Ue();Il();fe();Ce();Jg=class extends V{static{a(this,"NotifyCommands")}async notify(e=null,t=process.cwd(),r={}){let s=(e??"").trim().toLowerCase().split(/\s+/).filter(Boolean)[0]??"";return!s||s==="status"||s==="show"?this.showStatus(t,r):Vg.includes(s)?this.setMode(s,t,r):N(`Unknown notify subcommand "${s}". Use: ${Vg.join("|")}.`,r)}async showStatus(e,t){let r=await R.readConfig(e).catch(()=>null);if(!r?.projectId)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=ro(r),o=[`Mode: ${s}${s==="on"?" (default)":""}`,"Fires on: Claude waiting for input \xB7 a subagent finishing","Set: prjct notify on|off"];return t.md?console.log(P("## Notify",`> **Mode**: \`${s}\``,o.slice(1).join(`
1710
1710
  `))):g.info(`Notify \u2014 ${o.join(`
1711
- `)}`),{success:!0,mode:s}}async setMode(e,t,r){let s=await R.readConfig(t).catch(()=>null);if(!s?.projectId)return D("No prjct project here \u2014 run `prjct init` first.",r);s.notify={mode:e},await R.writeConfig(t,s);let o=e==="on"?"Desktop notifications ON \u2014 pings on Claude-waiting + subagent-finished.":"Desktop notifications OFF \u2014 silenced (the per-prompt work-state block stays).";return r.md?console.log(P("## Notify",`> ${o}`)):g.done(o),{success:!0,mode:e}}}});var RR={};L(RR,{AgentsCommands:()=>Xg});async function FO(n,e){let t=await ce(n,e);if(!t.ok)return t.result;let r=await Gt(n);return{success:!0,agentsMd:r.agentsMd.action,ideRules:r.ideRules}}function HO(n){return n.success===!0&&typeof n.agentsMd=="string"&&Array.isArray(n.ideRules)}function UO(n,e=null){let t=["# Agent Compatibility","","| Agent | Detected | Level | AGENTS.md | MCP | Skills | Hooks | ACP | Rules | Evidence |","|---|---:|---|---:|---:|---:|---:|---:|---:|---|"];for(let r of n){let{runtime:s}=r,o=[s.displayName,r.detected?"yes":"no",r.supportLevel,so(s.supports.agentsMd),so(s.supports.mcp),so(s.supports.skills),so(s.supports.hooks),so(s.supports.acp),so(s.supports.projectRules),r.detectedSignals.join(", ")||s.notes].join(" | ");t.push(`| ${o} |`)}return e?.success&&t.push("","## Repair","",`- AGENTS.md: ${e.agentsMd}`,`- IDE rule adapters: ${e.ideRules.length>0?e.ideRules.join(", "):"none needed"}`),t.push("","Support levels:","- `full`: prjct-maintained native hooks plus MCP/skills or equivalent deep integration.","- `good`: AGENTS.md plus MCP-capable runtime.","- `baseline`: repo instructions only; agents can still run `prjct --md`.","- `hosted`: repo instructions are the portable layer; external platform config may be manual."),t.join(`
1711
+ `)}`),{success:!0,mode:s}}async setMode(e,t,r){let s=await R.readConfig(t).catch(()=>null);if(!s?.projectId)return D("No prjct project here \u2014 run `prjct init` first.",r);s.notify={mode:e},await R.writeConfig(t,s);let o=e==="on"?"Desktop notifications ON \u2014 pings on Claude-waiting + subagent-finished.":"Desktop notifications OFF \u2014 silenced (the per-prompt work-state block stays).";return r.md?console.log(P("## Notify",`> ${o}`)):g.done(o),{success:!0,mode:e}}}});var RR={};L(RR,{AgentsCommands:()=>Xg});async function FO(n,e){let t=await ae(n,e);if(!t.ok)return t.result;let r=await Gt(n);return{success:!0,agentsMd:r.agentsMd.action,ideRules:r.ideRules}}function HO(n){return n.success===!0&&typeof n.agentsMd=="string"&&Array.isArray(n.ideRules)}function UO(n,e=null){let t=["# Agent Compatibility","","| Agent | Detected | Level | AGENTS.md | MCP | Skills | Hooks | ACP | Rules | Evidence |","|---|---:|---|---:|---:|---:|---:|---:|---:|---|"];for(let r of n){let{runtime:s}=r,o=[s.displayName,r.detected?"yes":"no",r.supportLevel,so(s.supports.agentsMd),so(s.supports.mcp),so(s.supports.skills),so(s.supports.hooks),so(s.supports.acp),so(s.supports.projectRules),r.detectedSignals.join(", ")||s.notes].join(" | ");t.push(`| ${o} |`)}return e?.success&&t.push("","## Repair","",`- AGENTS.md: ${e.agentsMd}`,`- IDE rule adapters: ${e.ideRules.length>0?e.ideRules.join(", "):"none needed"}`),t.push("","Support levels:","- `full`: prjct-maintained native hooks plus MCP/skills or equivalent deep integration.","- `good`: AGENTS.md plus MCP-capable runtime.","- `baseline`: repo instructions only; agents can still run `prjct --md`.","- `hosted`: repo instructions are the portable layer; external platform config may be manual."),t.join(`
1712
1712
  `)}function GO(n,e=null){let t=n.filter(s=>s.detected),r=["Agent compatibility",""];e?.success&&r.push(`repair: AGENTS.md ${e.agentsMd}; adapters ${e.ideRules.length>0?e.ideRules.join(", "):"none needed"}`,"");for(let s of n){let o=s.detected?"yes":"no ",i=[s.runtime.supports.agentsMd?"AGENTS.md":null,s.runtime.supports.mcp?"MCP":null,s.runtime.supports.skills?"skills":null,s.runtime.supports.hooks?"hooks":null,s.runtime.supports.acp?"ACP":null,s.runtime.supports.projectRules?"rules":null].filter(Boolean).join(", ");r.push(`${o} ${s.runtime.displayName} [${s.supportLevel}] ${i||"manual"}`),s.detectedSignals.length>0&&r.push(` evidence: ${s.detectedSignals.join(", ")}`)}return r.push("",`${t.length}/${n.length} runtimes detected.`),r.join(`
1713
1713
  `)}function so(n){return n?"yes":"no"}var Xg,xR=h(()=>{"use strict";Do();Es();W();we();Ce();qt();Xg=class extends V{static{a(this,"AgentsCommands")}async agents(e=null,t=process.cwd(),r={}){let s=(e??"").trim().toLowerCase().split(/\s+/).filter(Boolean)[0]??"doctor";if(s!=="doctor"&&s!=="status"&&s!=="list")return D("Unknown agents subcommand. Use: prjct agents doctor",r);try{let o=r.fix?await FO(t,r):null;if(o&&!HO(o))return o;let i=await Fr(t);return r.md?console.log(UO(i,o)):console.log(GO(i,o)),{success:!0,runtimes:i.length,detected:i.filter(c=>c.detected).length,fixed:!!o}}catch(o){return D(w(o),r)}}};a(FO,"repairAgentSurfaces");a(HO,"isAgentRepairResult");a(UO,"formatMarkdown");a(GO,"formatText");a(so,"yes")});var _R={};L(_R,{ProductCommands:()=>zg});async function AR(n,e){let t=await Fr(e),r={detected:t.filter(c=>c.detected).length,full:t.filter(c=>c.supportLevel==="full").length,good:t.filter(c=>c.supportLevel==="good").length,baseline:t.filter(c=>c.supportLevel==="baseline").length,hosted:t.filter(c=>c.supportLevel==="hosted").length},s={live:pt(n,"SELECT COUNT(*) AS value FROM memories WHERE deleted_at IS NULL"),preventive:pt(n,`SELECT COUNT(*) AS value FROM memories
1714
1714
  WHERE deleted_at IS NULL AND type IN ('gotcha', 'anti-pattern', 'learning')`),useful:pt(n,"SELECT COUNT(*) AS value FROM memory_usefulness WHERE score > 0"),surfaced:pt(n,"SELECT COUNT(*) AS value FROM memory_surface_log"),inbox:pt(n,"SELECT COUNT(*) AS value FROM memories WHERE deleted_at IS NULL AND type = 'inbox'")},o={tasks:pt(n,"SELECT COUNT(*) AS value FROM tasks"),completed:pt(n,"SELECT COUNT(*) AS value FROM tasks WHERE status IN ('done', 'completed')"),shippedTasks:pt(n,"SELECT COUNT(*) AS value FROM tasks WHERE shipped_at IS NOT NULL"),shippedFeatures:pt(n,"SELECT COUNT(*) AS value FROM shipped_features"),specs:pt(n,"SELECT COUNT(*) AS value FROM specs"),shippedSpecs:pt(n,"SELECT COUNT(*) AS value FROM specs WHERE status = 'shipped'")},i={syncs:pt(n,"SELECT COALESCE(SUM(syncs), 0) AS value FROM metrics_daily"),tokensSaved:pt(n,"SELECT COALESCE(SUM(tokens_saved), 0) AS value FROM metrics_daily")};return{memories:s,workflow:o,sync:i,agents:r,score:KO(s,o,i,r)}}function qO(n){let e=Ti(n,`SELECT COALESCE(type, 'unknown') AS type, COUNT(*) AS value
@@ -1753,7 +1753,7 @@ ${s}`:s}`)):(g.warn(r?.title??"Cloud backup paused \u2014 subscription required"
1753
1753
  `):"- No runtime-specific signals detected; AGENTS.md remains the baseline.","","## Context to preserve"];return Kg(e,n.memories),e.join(`
1754
1754
  `)}function aL(n){return[`Handoff for ${n.target}`,`Active: ${n.active?.description??"none"}`,"Run: prjct status --md; prjct value --md; prjct guardrails --md",`Context entries: ${n.memories.length}`].join(`
1755
1755
  `)}function cL(n){let e=["# Risk Guardrails",""];if(e.push(`Changed files checked: ${n.files.length}`),n.hits.length>0){e.push("","## File-specific warnings");for(let t of n.hits)e.push(`- \`${t.file}\`: **[${Kr(t.entry)}] ${je(t.entry)}** \u2014 ${gr(t.entry.content)} \`${t.entry.id}\``)}else e.push("","No file-specific preventive memory matched the current changeset."),n.fallback.length>0&&(e.push("","## General project traps"),Kg(e,n.fallback));return e.push("","_Advisory only. This command does not block or mutate anything._"),e.join(`
1756
- `)}function lL(n){return n.hits.length===0?`Risk guardrails: ${n.files.length} files checked, no file-specific hits.`:`Risk guardrails: ${n.hits.length} warning(s) across ${n.files.length} changed file(s).`}function Kg(n,e){if(e.length===0){n.push("- None recorded yet.");return}for(let t of e)n.push(`- **[${t.type}] ${je(t)}** \u2014 ${gr(t.content)} \`${t.id}\``)}function PR(n,e,t){if(n.push("",`### ${e}`),t.length===0){n.push("- None.");return}for(let r of t)n.push(`- **${r.type??"unknown"}** ${r.title??r.content.slice(0,80)} \`${r.id}\``)}var WO,BO,zg,jR=h(()=>{"use strict";Do();Lt();ve();Fn();X();W();pe();we();Ce();qt();WO=["gotcha","anti-pattern","learning"],BO=/^(current work|wip|todo|misc|n\/a|none|latest|unreleased|changelog)$/i,zg=class extends V{static{a(this,"ProductCommands")}async value(e=null,t=process.cwd(),r={}){try{let s=await ce(t,r);if(!s.ok)return s.result;let o=await AR(s.value,t);return console.log(r.md?eL(o):tL(o)),{success:!0,...o}}catch(s){return D(w(s),r)}}async memoryDoctor(e=null,t=process.cwd(),r={}){try{let s=await ce(t,r);if(!s.ok)return s.result;let o=qO(s.value);return console.log(r.md?nL(o):rL(o)),{success:!0,score:o.score,issues:o.issues.length}}catch(s){return D(w(s),r)}}async report(e=null,t=process.cwd(),r={}){try{let s=await ce(t,r);if(!s.ok)return s.result;let o=YO(e,r.days,7),i=await VO(s.value,t,o);return console.log(r.md?sL(i):oL(i)),{success:!0,days:o,ships:i.ships.length,completed:i.completed.length}}catch(s){return D(w(s),r)}}async handoff(e=null,t=process.cwd(),r={}){try{let s=await ce(t,r);if(!s.ok)return s.result;let o=(e??"").trim().split(/\s+/).filter(Boolean)[0]??"next agent",i=await JO(s.value,t,o);return console.log(r.md?iL(i):aL(i)),{success:!0,target:o,memories:i.memories.length}}catch(s){return D(w(s),r)}}async guardrails(e=null,t=process.cwd(),r={}){try{let s=await ce(t,r);if(!s.ok)return s.result;let o=await XO(s.value,t);return console.log(r.md?cL(o):lL(o)),{success:!0,files:o.files.length,hits:o.hits.length}}catch(s){return D(w(s),r)}}};a(AR,"buildValueSnapshot");a(qO,"buildMemoryDoctor");a(VO,"buildHumanReport");a(JO,"buildHandoff");a(XO,"buildGuardrails");a(zO,"changedFiles");a(pt,"count");a(Ti,"query");a(KO,"valueScore");a(YO,"pickDays");a(QO,"sinceIso");a(ZO,"isNoise");a(eL,"formatValueMd");a(tL,"formatValueText");a(nL,"formatMemoryDoctorMd");a(rL,"formatMemoryDoctorText");a(sL,"formatReportMd");a(oL,"formatReportText");a(iL,"formatHandoffMd");a(aL,"formatHandoffText");a(cL,"formatGuardrailsMd");a(lL,"formatGuardrailsText");a(Kg,"appendEntries");a(PR,"appendMemoryRows")});import{z as $}from"zod";var IR,uL,Yg,DR,$R=h(()=>{"use strict";IR=$.object({severity:$.enum(["info","warning","blocking"]),title:$.string(),recommendation:$.string(),files:$.array($.string()).optional(),command:$.string().optional()}),uL=$.object({id:$.string(),name:$.string(),status:$.enum(["pass","warn","fail"]),score:$.number().min(0).max(100),durationMs:$.number().nonnegative(),metrics:$.record($.union([$.string(),$.number(),$.boolean()])),actionables:$.array(IR)}),Yg=$.object({schemaVersion:$.literal(1),runId:$.string(),createdAt:$.string(),runner:$.object({source:$.enum(["local","ci","agent"]),user:$.string().optional(),platform:$.string(),node:$.string(),bun:$.string().optional()}),project:$.object({repo:$.string(),branch:$.string().optional(),commit:$.string().optional(),dirty:$.boolean()}),versions:$.object({current:$.string(),baseline:$.string().optional(),candidate:$.string().optional()}),scenarios:$.array(uL),summary:$.object({score:$.number().min(0).max(100),pass:$.number().nonnegative(),warn:$.number().nonnegative(),fail:$.number().nonnegative(),improvements:$.number().nonnegative(),regressions:$.number().nonnegative(),actionables:$.number().nonnegative()}),artifacts:$.object({jsonPath:$.string().optional(),reportPath:$.string().optional()}).optional()}),DR=$.object({schemaVersion:$.literal(1),comparisonId:$.string(),createdAt:$.string(),baselineRunId:$.string().optional(),candidateRunId:$.string().optional(),baselineVersion:$.string().optional(),candidateVersion:$.string().optional(),summary:$.object({baselineScore:$.number().optional(),candidateScore:$.number().optional(),delta:$.number().optional(),regressions:$.number().nonnegative(),improvements:$.number().nonnegative(),actionables:$.number().nonnegative()}),artifacts:$.object({jsonPath:$.string().optional(),reportPath:$.string().optional()}).optional(),scenarios:$.array($.object({id:$.string(),baselineScore:$.number().optional(),candidateScore:$.number().optional(),delta:$.number().optional(),status:$.enum(["improved","regressed","unchanged","missing-baseline","missing-candidate"]),actionables:$.array(IR)}))})});import OR from"node:crypto";import Ct from"node:fs/promises";import Ve from"node:path";async function LR(n,e={}){let t=new Date().toISOString(),r=await Ai(n),o=await fL({projectPath:n,git:r}),i=mL(o),c={schemaVersion:Dl,runId:RL(t),createdAt:t,runner:{source:e.source??PL(),user:await AL(n),platform:`${process.platform}-${process.arch}`,node:process.version,bun:await _L()},project:{repo:r.repo,branch:r.branch,commit:r.commit,dirty:r.dirty},versions:{current:Dr(),baseline:e.baseline,candidate:e.candidate??Dr()},scenarios:o,summary:i};return bL(c)}async function xi(n){let e=Ve.join($l(await Ai(n)),"latest.json");return eh(e)}async function MR(n,e){if(!e)return xi(n);let t=Ve.join($l(await Ai(n)),"runs"),r=[];try{r=await Ct.readdir(t)}catch{return null}return(await Promise.all(r.filter(o=>o.endsWith(".json")).map(o=>eh(Ve.join(t,o))))).filter(o=>!!o).filter(o=>o.versions.current===e||o.versions.candidate===e).sort((o,i)=>i.createdAt.localeCompare(o.createdAt))[0]??null}async function FR(n,e={}){let t=await MR(n,e.baseline),r=e.candidate?await MR(n,e.candidate):await xi(n),o=[...new Set([...t?.scenarios.map(m=>m.id)??[],...r?.scenarios.map(m=>m.id)??[]])].sort().map(m=>{let f=t?.scenarios.find(C=>C.id===m),y=r?.scenarios.find(C=>C.id===m),x=f&&y?Math.round((y.score-f.score)*10)/10:void 0,b=[],S="unchanged";return f?y?(x??0)<=dL?(S="regressed",b.push({severity:"blocking",title:`${m} regressed by ${Math.abs(x??0)} points`,recommendation:IL(m)})):(x??0)>=pL?(S="improved",b.push({severity:"info",title:`${m} improved by ${x} points`,recommendation:"Keep this scenario in PR checks so the improvement is protected."})):f&&y&&b.push({severity:"info",title:`${m} stayed within the regression threshold`,recommendation:"Keep collecting this scenario so future optimizations have a stable baseline."}):(S="missing-candidate",b.push({severity:"blocking",title:`No candidate result for ${m}`,recommendation:"Run `prjct eval run` for the candidate version before publishing a comparison."})):(S="missing-baseline",b.push({severity:"warning",title:`No baseline result for ${m}`,recommendation:"Run `prjct eval run --candidate <baseline-version>` before comparing releases."})),{id:m,baselineScore:f?.score,candidateScore:y?.score,delta:x,status:S,actionables:b}}),i=o.filter(m=>m.status==="regressed").length,c=o.filter(m=>m.status==="improved").length,l=new Date().toISOString(),u=t?.versions.candidate??t?.versions.current??e.baseline,d=r?.versions.candidate??r?.versions.current??e.candidate,p={schemaVersion:Dl,comparisonId:xL(l,u,d),createdAt:l,baselineRunId:t?.runId,candidateRunId:r?.runId,baselineVersion:u,candidateVersion:d,summary:{baselineScore:t?.summary.score,candidateScore:r?.summary.score,delta:t&&r?Math.round((r.summary.score-t.summary.score)*10)/10:void 0,regressions:i,improvements:c,actionables:o.reduce((m,f)=>m+f.actionables.length,0)},scenarios:o};return vL(n,p)}async function Zg(n,e={}){let t=GR(e.target),r=e.file?await SL(e.file):await EL(n),s=await WR(n,e.dryRun===!0),o={schemaVersion:Dl,artifactType:"run",artifactId:r.runId,repo:r.project.repo,createdAt:r.createdAt,run:r,reportMarkdown:oo(r)};return BR(s.projectId,t,e.dryRun===!0,o,{artifactType:"run",artifactId:r.runId,runId:r.runId})}async function HR(n,e,t={}){let r=GR(t.target),s=await WR(n,t.dryRun===!0),o=await Ai(n),i={schemaVersion:Dl,artifactType:"comparison",artifactId:e.comparisonId,repo:o.repo,createdAt:e.createdAt,comparison:e,reportMarkdown:Pi(e)};return BR(s.projectId,r,t.dryRun===!0,i,{artifactType:"comparison",artifactId:e.comparisonId,comparisonId:e.comparisonId})}function oo(n){let e=n.scenarios.flatMap(s=>s.actionables.map(o=>({scenario:s.id,actionable:o}))),t=n.scenarios.map(s=>`| \`${s.id}\` | ${s.status} | ${s.score} | ${s.actionables.length} |`).join(`
1756
+ `)}function lL(n){return n.hits.length===0?`Risk guardrails: ${n.files.length} files checked, no file-specific hits.`:`Risk guardrails: ${n.hits.length} warning(s) across ${n.files.length} changed file(s).`}function Kg(n,e){if(e.length===0){n.push("- None recorded yet.");return}for(let t of e)n.push(`- **[${t.type}] ${je(t)}** \u2014 ${gr(t.content)} \`${t.id}\``)}function PR(n,e,t){if(n.push("",`### ${e}`),t.length===0){n.push("- None.");return}for(let r of t)n.push(`- **${r.type??"unknown"}** ${r.title??r.content.slice(0,80)} \`${r.id}\``)}var WO,BO,zg,jR=h(()=>{"use strict";Do();Lt();ve();Fn();X();W();pe();we();Ce();qt();WO=["gotcha","anti-pattern","learning"],BO=/^(current work|wip|todo|misc|n\/a|none|latest|unreleased|changelog)$/i,zg=class extends V{static{a(this,"ProductCommands")}async value(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=await AR(s.value,t);return console.log(r.md?eL(o):tL(o)),{success:!0,...o}}catch(s){return D(w(s),r)}}async memoryDoctor(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=qO(s.value);return console.log(r.md?nL(o):rL(o)),{success:!0,score:o.score,issues:o.issues.length}}catch(s){return D(w(s),r)}}async report(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=YO(e,r.days,7),i=await VO(s.value,t,o);return console.log(r.md?sL(i):oL(i)),{success:!0,days:o,ships:i.ships.length,completed:i.completed.length}}catch(s){return D(w(s),r)}}async handoff(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=(e??"").trim().split(/\s+/).filter(Boolean)[0]??"next agent",i=await JO(s.value,t,o);return console.log(r.md?iL(i):aL(i)),{success:!0,target:o,memories:i.memories.length}}catch(s){return D(w(s),r)}}async guardrails(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=await XO(s.value,t);return console.log(r.md?cL(o):lL(o)),{success:!0,files:o.files.length,hits:o.hits.length}}catch(s){return D(w(s),r)}}};a(AR,"buildValueSnapshot");a(qO,"buildMemoryDoctor");a(VO,"buildHumanReport");a(JO,"buildHandoff");a(XO,"buildGuardrails");a(zO,"changedFiles");a(pt,"count");a(Ti,"query");a(KO,"valueScore");a(YO,"pickDays");a(QO,"sinceIso");a(ZO,"isNoise");a(eL,"formatValueMd");a(tL,"formatValueText");a(nL,"formatMemoryDoctorMd");a(rL,"formatMemoryDoctorText");a(sL,"formatReportMd");a(oL,"formatReportText");a(iL,"formatHandoffMd");a(aL,"formatHandoffText");a(cL,"formatGuardrailsMd");a(lL,"formatGuardrailsText");a(Kg,"appendEntries");a(PR,"appendMemoryRows")});import{z as $}from"zod";var IR,uL,Yg,DR,$R=h(()=>{"use strict";IR=$.object({severity:$.enum(["info","warning","blocking"]),title:$.string(),recommendation:$.string(),files:$.array($.string()).optional(),command:$.string().optional()}),uL=$.object({id:$.string(),name:$.string(),status:$.enum(["pass","warn","fail"]),score:$.number().min(0).max(100),durationMs:$.number().nonnegative(),metrics:$.record($.union([$.string(),$.number(),$.boolean()])),actionables:$.array(IR)}),Yg=$.object({schemaVersion:$.literal(1),runId:$.string(),createdAt:$.string(),runner:$.object({source:$.enum(["local","ci","agent"]),user:$.string().optional(),platform:$.string(),node:$.string(),bun:$.string().optional()}),project:$.object({repo:$.string(),branch:$.string().optional(),commit:$.string().optional(),dirty:$.boolean()}),versions:$.object({current:$.string(),baseline:$.string().optional(),candidate:$.string().optional()}),scenarios:$.array(uL),summary:$.object({score:$.number().min(0).max(100),pass:$.number().nonnegative(),warn:$.number().nonnegative(),fail:$.number().nonnegative(),improvements:$.number().nonnegative(),regressions:$.number().nonnegative(),actionables:$.number().nonnegative()}),artifacts:$.object({jsonPath:$.string().optional(),reportPath:$.string().optional()}).optional()}),DR=$.object({schemaVersion:$.literal(1),comparisonId:$.string(),createdAt:$.string(),baselineRunId:$.string().optional(),candidateRunId:$.string().optional(),baselineVersion:$.string().optional(),candidateVersion:$.string().optional(),summary:$.object({baselineScore:$.number().optional(),candidateScore:$.number().optional(),delta:$.number().optional(),regressions:$.number().nonnegative(),improvements:$.number().nonnegative(),actionables:$.number().nonnegative()}),artifacts:$.object({jsonPath:$.string().optional(),reportPath:$.string().optional()}).optional(),scenarios:$.array($.object({id:$.string(),baselineScore:$.number().optional(),candidateScore:$.number().optional(),delta:$.number().optional(),status:$.enum(["improved","regressed","unchanged","missing-baseline","missing-candidate"]),actionables:$.array(IR)}))})});import OR from"node:crypto";import Ct from"node:fs/promises";import Ve from"node:path";async function LR(n,e={}){let t=new Date().toISOString(),r=await Ai(n),o=await fL({projectPath:n,git:r}),i=mL(o),c={schemaVersion:Dl,runId:RL(t),createdAt:t,runner:{source:e.source??PL(),user:await AL(n),platform:`${process.platform}-${process.arch}`,node:process.version,bun:await _L()},project:{repo:r.repo,branch:r.branch,commit:r.commit,dirty:r.dirty},versions:{current:Dr(),baseline:e.baseline,candidate:e.candidate??Dr()},scenarios:o,summary:i};return bL(c)}async function xi(n){let e=Ve.join($l(await Ai(n)),"latest.json");return eh(e)}async function MR(n,e){if(!e)return xi(n);let t=Ve.join($l(await Ai(n)),"runs"),r=[];try{r=await Ct.readdir(t)}catch{return null}return(await Promise.all(r.filter(o=>o.endsWith(".json")).map(o=>eh(Ve.join(t,o))))).filter(o=>!!o).filter(o=>o.versions.current===e||o.versions.candidate===e).sort((o,i)=>i.createdAt.localeCompare(o.createdAt))[0]??null}async function FR(n,e={}){let t=await MR(n,e.baseline),r=e.candidate?await MR(n,e.candidate):await xi(n),o=[...new Set([...t?.scenarios.map(m=>m.id)??[],...r?.scenarios.map(m=>m.id)??[]])].sort().map(m=>{let f=t?.scenarios.find(C=>C.id===m),y=r?.scenarios.find(C=>C.id===m),x=f&&y?Math.round((y.score-f.score)*10)/10:void 0,b=[],S="unchanged";return f?y?(x??0)<=dL?(S="regressed",b.push({severity:"blocking",title:`${m} regressed by ${Math.abs(x??0)} points`,recommendation:IL(m)})):(x??0)>=pL?(S="improved",b.push({severity:"info",title:`${m} improved by ${x} points`,recommendation:"Keep this scenario in PR checks so the improvement is protected."})):f&&y&&b.push({severity:"info",title:`${m} stayed within the regression threshold`,recommendation:"Keep collecting this scenario so future optimizations have a stable baseline."}):(S="missing-candidate",b.push({severity:"blocking",title:`No candidate result for ${m}`,recommendation:"Run `prjct eval run` for the candidate version before publishing a comparison."})):(S="missing-baseline",b.push({severity:"warning",title:`No baseline result for ${m}`,recommendation:"Run `prjct eval run --candidate <baseline-version>` before comparing releases."})),{id:m,baselineScore:f?.score,candidateScore:y?.score,delta:x,status:S,actionables:b}}),i=o.filter(m=>m.status==="regressed").length,c=o.filter(m=>m.status==="improved").length,l=new Date().toISOString(),u=t?.versions.candidate??t?.versions.current??e.baseline,d=r?.versions.candidate??r?.versions.current??e.candidate,p={schemaVersion:Dl,comparisonId:xL(l,u,d),createdAt:l,baselineRunId:t?.runId,candidateRunId:r?.runId,baselineVersion:u,candidateVersion:d,summary:{baselineScore:t?.summary.score,candidateScore:r?.summary.score,delta:t&&r?Math.round((r.summary.score-t.summary.score)*10)/10:void 0,regressions:i,improvements:c,actionables:o.reduce((m,f)=>m+f.actionables.length,0)},scenarios:o};return vL(n,p)}async function Zg(n,e={}){let t=GR(e.target),r=e.file?await SL(e.file):await EL(n),s=await WR(n,e.dryRun===!0),o={schemaVersion:Dl,artifactType:"run",artifactId:r.runId,repo:r.project.repo,createdAt:r.createdAt,run:r,reportMarkdown:oo(r)};return BR(s.projectId,t,e.dryRun===!0,o,{artifactType:"run",artifactId:r.runId,runId:r.runId})}async function HR(n,e,t={}){let r=GR(t.target),s=await WR(n,t.dryRun===!0),o=await Ai(n),i={schemaVersion:Dl,artifactType:"comparison",artifactId:e.comparisonId,repo:o.repo,createdAt:e.createdAt,comparison:e,reportMarkdown:Pi(e)};return BR(s.projectId,r,t.dryRun===!0,i,{artifactType:"comparison",artifactId:e.comparisonId,comparisonId:e.comparisonId})}function oo(n){let e=n.scenarios.flatMap(s=>s.actionables.map(o=>({scenario:s.id,actionable:o}))),t=n.scenarios.map(s=>`| \`${s.id}\` | ${s.status} | ${s.score} | ${s.actionables.length} |`).join(`
1757
1757
  `),r=e.length===0?"_No actionables._":e.map(({scenario:s,actionable:o})=>`- **${o.severity}** \`${s}\`: ${o.title}. ${o.recommendation}`).join(`
1758
1758
  `);return`# prjct eval run
1759
1759
 
@@ -1809,11 +1809,11 @@ ${e||"| _none_ | - | - | - | - |"}
1809
1809
 
1810
1810
  ${t.length>0?t.join(`
1811
1811
  `):"_No actionables._"}
1812
- `}function mL(n){return{score:n.length===0?0:Math.round(n.reduce((t,r)=>t+r.score,0)/n.length),pass:n.filter(t=>t.status==="pass").length,warn:n.filter(t=>t.status==="warn").length,fail:n.filter(t=>t.status==="fail").length,improvements:0,regressions:n.filter(t=>t.status==="fail").length,actionables:n.reduce((t,r)=>t+r.actionables.length,0)}}async function fL(n){return Promise.all([Ci("agent-surface-readiness","Agent surface readiness",()=>gL(n.projectPath)),Ci("project-sync-readiness","Project sync readiness",()=>hL(n.projectPath)),Ci("stale-command-guidance","Stale command guidance",()=>yL(n.projectPath)),Ci("quality-command-readiness","Quality command readiness",()=>wL(n.projectPath)),Ci("cloud-benchmark-readiness","Cloud benchmark readiness",()=>kL(n.projectPath))])}async function Ci(n,e,t){let r=Date.now(),s=await t();return{id:n,name:e,durationMs:Date.now()-r,...s}}async function gL(n){let e=await Qg(Ve.join(n,"AGENTS.md")),t=await Qg(Ve.join(n,"CLAUDE.md")),r=e?100:t?70:20;return{status:r>=90?"pass":"warn",score:r,metrics:{agentsMd:e,claudeMd:t},actionables:r>=90?[{severity:"info",title:"Portable agent surface is present",recommendation:"Keep `prjct agents doctor --fix` in release smoke checks.",command:"prjct agents doctor --fix"}]:[{severity:"warning",title:"Portable AGENTS.md surface is missing",recommendation:"Run `prjct agents doctor --fix` so future agents start with the same project contract.",command:"prjct agents doctor --fix"}]}}async function hL(n){let e=await Qg(Ve.join(n,".prjct","prjct.config.json"));return{status:e?"pass":"warn",score:e?100:40,metrics:{projectConfig:e},actionables:[e?{severity:"info",title:"Project has a prjct identity",recommendation:"Use `prjct sync --md` in eval smoke runs to keep generated context measurable.",command:"prjct sync --md"}:{severity:"warning",title:"Project is not registered with prjct",recommendation:"Run `prjct sync` before comparing eval runs so metrics map to a stable project id.",command:"prjct sync"}]}}async function yL(n){let e=await jL(n,250),t=/\/p:\s*[a-z][a-z0-9-]*/i,r=[];return await Promise.all(e.map(async s=>{let o=await Ct.readFile(Ve.join(n,s),"utf-8").catch(()=>"");t.test(o)&&r.push(s)})),{status:r.length===0?"pass":"warn",score:r.length===0?100:Math.max(20,100-r.length*10),metrics:{scannedFiles:e.length,staleHits:r.length},actionables:r.length===0?[{severity:"info",title:"No stale `/p:` command guidance found",recommendation:"Keep this scan in evals to prevent user-facing command drift."}]:[{severity:"warning",title:`Found ${r.length} stale command guidance file(s)`,recommendation:"Replace stale `/p:` examples with `p. <verb>` or `prjct <verb>`.",files:r.slice(0,10)}]}}async function wL(n){let e=Ve.join(n,"package.json"),t={};try{t=JSON.parse(await Ct.readFile(e,"utf-8")).scripts??{}}catch{}let r=typeof t.test=="string",s=typeof t.check=="string"||typeof t.lint=="string",o=(r?50:0)+(s?50:0);return{status:o>=100?"pass":"warn",score:o,metrics:{hasTest:r,hasCheck:s},actionables:o>=100?[{severity:"info",title:"Quality commands are discoverable",recommendation:"Use these commands as eval scenario gates before publishing results."}]:[{severity:"warning",title:"Quality commands are incomplete",recommendation:"Expose `test` and `check`/`lint` scripts so eval reports can tie regressions to real verification.",files:["package.json"]}]}}async function kL(n){let e=await R.readConfig(n),t=await ae.hasAuth(),r=!!e?.projectId,s=!!e?.cloud?.enabled,o=s&&!e?.cloud?.paused,i=(r?34:0)+(t?33:0)+(o?33:0);return{status:i>=100?"pass":"warn",score:i,metrics:{hasProject:r,authenticated:t,cloudLinked:s,cloudActive:o},actionables:i>=100?[{severity:"info",title:"Cloud benchmark publishing is active",recommendation:"Run `prjct eval publish --target cloud` after release evals to store shared benchmark history.",command:"prjct eval publish --target cloud"}]:[{severity:"warning",title:"Cloud benchmark publishing is not active",recommendation:"Run `prjct init`, `prjct login`, and `prjct cloud link` before publishing benchmark results.",command:"prjct cloud status"}]}}async function bL(n){let e=$l({repo:n.project.repo}),t=Ve.join(e,"runs");await Ct.mkdir(t,{recursive:!0});let r=Ve.join(t,`${n.runId}.json`),s=Ve.join(t,`${n.runId}.md`),o={...n,artifacts:{jsonPath:r,reportPath:s}};return Yg.parse(o),await Ct.writeFile(r,`${JSON.stringify(o,null,2)}
1812
+ `}function mL(n){return{score:n.length===0?0:Math.round(n.reduce((t,r)=>t+r.score,0)/n.length),pass:n.filter(t=>t.status==="pass").length,warn:n.filter(t=>t.status==="warn").length,fail:n.filter(t=>t.status==="fail").length,improvements:0,regressions:n.filter(t=>t.status==="fail").length,actionables:n.reduce((t,r)=>t+r.actionables.length,0)}}async function fL(n){return Promise.all([Ci("agent-surface-readiness","Agent surface readiness",()=>gL(n.projectPath)),Ci("project-sync-readiness","Project sync readiness",()=>hL(n.projectPath)),Ci("stale-command-guidance","Stale command guidance",()=>yL(n.projectPath)),Ci("quality-command-readiness","Quality command readiness",()=>wL(n.projectPath)),Ci("cloud-benchmark-readiness","Cloud benchmark readiness",()=>kL(n.projectPath))])}async function Ci(n,e,t){let r=Date.now(),s=await t();return{id:n,name:e,durationMs:Date.now()-r,...s}}async function gL(n){let e=await Qg(Ve.join(n,"AGENTS.md")),t=await Qg(Ve.join(n,"CLAUDE.md")),r=e?100:t?70:20;return{status:r>=90?"pass":"warn",score:r,metrics:{agentsMd:e,claudeMd:t},actionables:r>=90?[{severity:"info",title:"Portable agent surface is present",recommendation:"Keep `prjct agents doctor --fix` in release smoke checks.",command:"prjct agents doctor --fix"}]:[{severity:"warning",title:"Portable AGENTS.md surface is missing",recommendation:"Run `prjct agents doctor --fix` so future agents start with the same project contract.",command:"prjct agents doctor --fix"}]}}async function hL(n){let e=await Qg(Ve.join(n,".prjct","prjct.config.json"));return{status:e?"pass":"warn",score:e?100:40,metrics:{projectConfig:e},actionables:[e?{severity:"info",title:"Project has a prjct identity",recommendation:"Use `prjct sync --md` in eval smoke runs to keep generated context measurable.",command:"prjct sync --md"}:{severity:"warning",title:"Project is not registered with prjct",recommendation:"Run `prjct sync` before comparing eval runs so metrics map to a stable project id.",command:"prjct sync"}]}}async function yL(n){let e=await jL(n,250),t=/\/p:\s*[a-z][a-z0-9-]*/i,r=[];return await Promise.all(e.map(async s=>{let o=await Ct.readFile(Ve.join(n,s),"utf-8").catch(()=>"");t.test(o)&&r.push(s)})),{status:r.length===0?"pass":"warn",score:r.length===0?100:Math.max(20,100-r.length*10),metrics:{scannedFiles:e.length,staleHits:r.length},actionables:r.length===0?[{severity:"info",title:"No stale `/p:` command guidance found",recommendation:"Keep this scan in evals to prevent user-facing command drift."}]:[{severity:"warning",title:`Found ${r.length} stale command guidance file(s)`,recommendation:"Replace stale `/p:` examples with `p. <verb>` or `prjct <verb>`.",files:r.slice(0,10)}]}}async function wL(n){let e=Ve.join(n,"package.json"),t={};try{t=JSON.parse(await Ct.readFile(e,"utf-8")).scripts??{}}catch{}let r=typeof t.test=="string",s=typeof t.check=="string"||typeof t.lint=="string",o=(r?50:0)+(s?50:0);return{status:o>=100?"pass":"warn",score:o,metrics:{hasTest:r,hasCheck:s},actionables:o>=100?[{severity:"info",title:"Quality commands are discoverable",recommendation:"Use these commands as eval scenario gates before publishing results."}]:[{severity:"warning",title:"Quality commands are incomplete",recommendation:"Expose `test` and `check`/`lint` scripts so eval reports can tie regressions to real verification.",files:["package.json"]}]}}async function kL(n){let e=await R.readConfig(n),t=await ce.hasAuth(),r=!!e?.projectId,s=!!e?.cloud?.enabled,o=s&&!e?.cloud?.paused,i=(r?34:0)+(t?33:0)+(o?33:0);return{status:i>=100?"pass":"warn",score:i,metrics:{hasProject:r,authenticated:t,cloudLinked:s,cloudActive:o},actionables:i>=100?[{severity:"info",title:"Cloud benchmark publishing is active",recommendation:"Run `prjct eval publish --target cloud` after release evals to store shared benchmark history.",command:"prjct eval publish --target cloud"}]:[{severity:"warning",title:"Cloud benchmark publishing is not active",recommendation:"Run `prjct init`, `prjct login`, and `prjct cloud link` before publishing benchmark results.",command:"prjct cloud status"}]}}async function bL(n){let e=$l({repo:n.project.repo}),t=Ve.join(e,"runs");await Ct.mkdir(t,{recursive:!0});let r=Ve.join(t,`${n.runId}.json`),s=Ve.join(t,`${n.runId}.md`),o={...n,artifacts:{jsonPath:r,reportPath:s}};return Yg.parse(o),await Ct.writeFile(r,`${JSON.stringify(o,null,2)}
1813
1813
  `,"utf-8"),await Ct.writeFile(s,oo(o),"utf-8"),await Ct.writeFile(Ve.join(e,"latest.json"),`${JSON.stringify(o,null,2)}
1814
1814
  `,"utf-8"),o}async function vL(n,e){let t=$l(await Ai(n)),r=Ve.join(t,"comparisons");await Ct.mkdir(r,{recursive:!0});let s=Ve.join(r,`${e.comparisonId}.json`),o=Ve.join(r,`${e.comparisonId}.md`),i={...e,artifacts:{jsonPath:s,reportPath:o}};return DR.parse(i),await Ct.writeFile(s,`${JSON.stringify(i,null,2)}
1815
1815
  `,"utf-8"),await Ct.writeFile(o,Pi(i),"utf-8"),await Ct.writeFile(Ve.join(t,"latest-comparison.json"),`${JSON.stringify(i,null,2)}
1816
- `,"utf-8"),i}function $l(n){let e=n.repo.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown";return Ve.join(ot(),"evals",e)}async function eh(n){try{return Yg.parse(JSON.parse(await Ct.readFile(n,"utf-8")))}catch{return null}}async function SL(n){let e=await eh(n);if(!e)throw new Error(`Invalid or missing eval run file: ${n}`);return e}async function EL(n){let e=await xi(n);if(!e)throw new Error("No eval run found. Run `prjct eval run` first.");return e}async function Ai(n){let[e,t,r,s]=await Promise.all([Ri(n,["branch","--show-current"]),Ri(n,["rev-parse","HEAD"]),Ri(n,["config","--get","remote.origin.url"]),Ri(n,["status","--porcelain"])]),o=TL(r);return{repo:o??CL(n),ownerRepo:o,branch:e||void 0,commit:t||void 0,dirty:s.trim().length>0}}async function Ri(n,e){try{let{stdout:t}=await G("git",e,{cwd:n});return String(t).trim()}catch{return""}}function TL(n){let t=n.trim().match(/github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?$/);if(t)return`${t[1]}/${t[2]}`}function CL(n){return`local-${OR.createHash("sha256").update(Ve.resolve(n)).digest("hex").slice(0,12)}`}function RL(n){return`eval_${n.replace(/[-:.TZ]/g,"").slice(0,14)}_${OR.randomBytes(4).toString("hex")}`}function xL(n,e,t){let r=n.replace(/[-:.TZ]/g,"").slice(0,14),s=NR(e??"missing-baseline"),o=NR(t??"missing-candidate");return`comparison_${r}_${s}_to_${o}`}function NR(n){return n.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"unknown"}function PL(){return process.env.GITHUB_ACTIONS==="true"||process.env.CI==="true"?"ci":process.env.CODEX_SANDBOX||process.env.CLAUDECODE?"agent":"local"}async function AL(n){let e=await UR("gh",["api","user","--jq",".login"],n);if(e)return`github:${e}`;let t=await Ri(n,["config","user.email"]);return t?`git:${t}`:void 0}async function _L(){return UR("bun",["--version"],process.cwd())}async function UR(n,e,t){try{let{stdout:r}=await G(n,e,{cwd:t});return String(r).trim()||void 0}catch{return}}async function Qg(n){try{return await Ct.access(n),!0}catch{return!1}}async function jL(n,e){let t=[],r=new Set([".git","node_modules","dist","build","coverage",".prjct","__tests__","__fixtures__","fixtures"]);async function s(o){if(t.length>=e)return;let i=await Ct.readdir(o,{withFileTypes:!0}).catch(()=>[]);for(let c of i){if(t.length>=e)break;if(r.has(c.name))continue;let l=Ve.join(o,c.name);c.isDirectory()?await s(l):c.isFile()&&!c.name.includes(".test.")&&!c.name.includes(".spec.")&&/\.(md|mdc|txt|toml|json|ya?ml|sh|ts|tsx|js|jsx)$/.test(c.name)&&t.push(Ve.relative(n,l))}}return a(s,"walk"),await s(n),t}function IL(n){return n.includes("sync")?"Inspect sync incrementality and generated context freshness before shipping.":n.includes("cloud")?"Check cloud auth/link status and benchmark publisher setup.":n.includes("command")?"Audit user-facing command copy and generated templates for stale instructions.":"Open the latest eval report, inspect scenario metrics, and add a focused regression test."}function GR(n){let e=n??"cloud";if(e==="github")throw new Error("GitHub eval publishing was removed. Use `prjct eval publish --target cloud` after `prjct login` and `prjct cloud link`.");if(e!=="cloud")throw new Error(`Unsupported eval publish target: ${e}. Use --target cloud.`);return"cloud"}async function WR(n,e){let t=await R.readConfig(n);if(!t?.projectId)throw new Error("Cloud benchmark publish requires a prjct project. Run `prjct init` first.");if(e)return{projectId:t.projectId};if(!await ae.hasAuth())throw new Error("Cloud benchmark publish requires authentication. Run `prjct login`, then `prjct cloud link`.");if(!t.cloud?.enabled)throw new Error("Cloud benchmark publish requires cloud to be active. Run `prjct cloud link`.");if(t.cloud.paused)throw new Error("Cloud sync is paused. Run `prjct cloud resume` before publishing benchmarks.");return{projectId:t.projectId}}async function BR(n,e,t,r,s){let i=`${await ae.getApiUrl()}/benchmarks/evals`,c={projectId:n,...r},l=Buffer.byteLength(JSON.stringify(c),"utf-8");if(t)return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l};try{let u=await Zc.publishBenchmark(n,r);return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l,remoteId:u.benchmarkId,publishedAt:u.publishedAt??new Date().toISOString(),url:u.url}}catch(u){throw new Error(DL(u))}}function DL(n){if(n instanceof Error)return n.message;if(n&&typeof n=="object"&&"message"in n){let e=n;return e.code==="PAYMENT_REQUIRED"?`${e.message} Run \`prjct cloud status\` for account details.`:e.message}return"Cloud benchmark publish failed."}var Dl,dL,pL,qR=h(()=>{"use strict";zn();K();$R();En();ai();pe();et();Dl=1,dL=-5,pL=5;a(LR,"runEval");a(xi,"loadLatestEvalRun");a(MR,"loadEvalRunByVersion");a(FR,"compareEvalRuns");a(Zg,"publishEvalRun");a(HR,"publishEvalComparison");a(oo,"formatEvalRunMarkdown");a(Pi,"formatEvalComparisonMarkdown");a(mL,"summarizeScenarios");a(fL,"runScenarios");a(Ci,"scenario");a(gL,"evalAgentSurface");a(hL,"evalProjectSyncReadiness");a(yL,"evalStaleCommandGuidance");a(wL,"evalQualityCommandReadiness");a(kL,"evalCloudBenchmarkReadiness");a(bL,"saveEvalRun");a(vL,"saveEvalComparison");a($l,"evalProjectDir");a(eh,"readRunFile");a(SL,"readRequiredRunFile");a(EL,"loadLatestRequired");a(Ai,"detectGit");a(Ri,"git");a(TL,"parseGitHubOwnerRepo");a(CL,"hashedRepo");a(RL,"runId");a(xL,"comparisonId");a(NR,"slugPart");a(PL,"detectSource");a(AL,"detectRunnerUser");a(_L,"detectBunVersion");a(UR,"execFileMaybe");a(Qg,"exists");a(jL,"collectTextFiles");a(IL,"regressionRecommendation");a(GR,"normalizePublishTarget");a(WR,"resolveBenchmarkProject");a(BR,"publishBenchmarkPayload");a(DL,"cloudPublishErrorMessage")});var VR={};L(VR,{EvalCommands:()=>th});var th,JR=h(()=>{"use strict";qR();W();Ue();fe();Ce();th=class extends V{static{a(this,"EvalCommands")}async eval(e=null,t=process.cwd(),r={}){let[s="run"]=(e??"").trim().split(/\s+/).filter(Boolean);try{switch(s){case"run":return this.run(t,r);case"compare":return this.compare(t,r);case"report":return this.report(t,r);case"publish":return this.publish(t,r);default:return this.unknown(s,r)}}catch(o){let i=w(o);return r.md?console.log(P(F("Eval failed",i))):g.fail(i),{success:!1,error:i}}}async run(e,t){let r=await LR(e,t);if(t.publish){let s=await Zg(e,{target:t.target,dryRun:t.dryRun,file:r.artifacts?.jsonPath});return t.json?console.log(JSON.stringify({run:r,publish:s},null,2)):t.md?console.log(P(oo(r),F("Published",`Target: \`${s.target}\`
1816
+ `,"utf-8"),i}function $l(n){let e=n.repo.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown";return Ve.join(ot(),"evals",e)}async function eh(n){try{return Yg.parse(JSON.parse(await Ct.readFile(n,"utf-8")))}catch{return null}}async function SL(n){let e=await eh(n);if(!e)throw new Error(`Invalid or missing eval run file: ${n}`);return e}async function EL(n){let e=await xi(n);if(!e)throw new Error("No eval run found. Run `prjct eval run` first.");return e}async function Ai(n){let[e,t,r,s]=await Promise.all([Ri(n,["branch","--show-current"]),Ri(n,["rev-parse","HEAD"]),Ri(n,["config","--get","remote.origin.url"]),Ri(n,["status","--porcelain"])]),o=TL(r);return{repo:o??CL(n),ownerRepo:o,branch:e||void 0,commit:t||void 0,dirty:s.trim().length>0}}async function Ri(n,e){try{let{stdout:t}=await G("git",e,{cwd:n});return String(t).trim()}catch{return""}}function TL(n){let t=n.trim().match(/github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?$/);if(t)return`${t[1]}/${t[2]}`}function CL(n){return`local-${OR.createHash("sha256").update(Ve.resolve(n)).digest("hex").slice(0,12)}`}function RL(n){return`eval_${n.replace(/[-:.TZ]/g,"").slice(0,14)}_${OR.randomBytes(4).toString("hex")}`}function xL(n,e,t){let r=n.replace(/[-:.TZ]/g,"").slice(0,14),s=NR(e??"missing-baseline"),o=NR(t??"missing-candidate");return`comparison_${r}_${s}_to_${o}`}function NR(n){return n.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"unknown"}function PL(){return process.env.GITHUB_ACTIONS==="true"||process.env.CI==="true"?"ci":process.env.CODEX_SANDBOX||process.env.CLAUDECODE?"agent":"local"}async function AL(n){let e=await UR("gh",["api","user","--jq",".login"],n);if(e)return`github:${e}`;let t=await Ri(n,["config","user.email"]);return t?`git:${t}`:void 0}async function _L(){return UR("bun",["--version"],process.cwd())}async function UR(n,e,t){try{let{stdout:r}=await G(n,e,{cwd:t});return String(r).trim()||void 0}catch{return}}async function Qg(n){try{return await Ct.access(n),!0}catch{return!1}}async function jL(n,e){let t=[],r=new Set([".git","node_modules","dist","build","coverage",".prjct","__tests__","__fixtures__","fixtures"]);async function s(o){if(t.length>=e)return;let i=await Ct.readdir(o,{withFileTypes:!0}).catch(()=>[]);for(let c of i){if(t.length>=e)break;if(r.has(c.name))continue;let l=Ve.join(o,c.name);c.isDirectory()?await s(l):c.isFile()&&!c.name.includes(".test.")&&!c.name.includes(".spec.")&&/\.(md|mdc|txt|toml|json|ya?ml|sh|ts|tsx|js|jsx)$/.test(c.name)&&t.push(Ve.relative(n,l))}}return a(s,"walk"),await s(n),t}function IL(n){return n.includes("sync")?"Inspect sync incrementality and generated context freshness before shipping.":n.includes("cloud")?"Check cloud auth/link status and benchmark publisher setup.":n.includes("command")?"Audit user-facing command copy and generated templates for stale instructions.":"Open the latest eval report, inspect scenario metrics, and add a focused regression test."}function GR(n){let e=n??"cloud";if(e==="github")throw new Error("GitHub eval publishing was removed. Use `prjct eval publish --target cloud` after `prjct login` and `prjct cloud link`.");if(e!=="cloud")throw new Error(`Unsupported eval publish target: ${e}. Use --target cloud.`);return"cloud"}async function WR(n,e){let t=await R.readConfig(n);if(!t?.projectId)throw new Error("Cloud benchmark publish requires a prjct project. Run `prjct init` first.");if(e)return{projectId:t.projectId};if(!await ce.hasAuth())throw new Error("Cloud benchmark publish requires authentication. Run `prjct login`, then `prjct cloud link`.");if(!t.cloud?.enabled)throw new Error("Cloud benchmark publish requires cloud to be active. Run `prjct cloud link`.");if(t.cloud.paused)throw new Error("Cloud sync is paused. Run `prjct cloud resume` before publishing benchmarks.");return{projectId:t.projectId}}async function BR(n,e,t,r,s){let i=`${await ce.getApiUrl()}/benchmarks/evals`,c={projectId:n,...r},l=Buffer.byteLength(JSON.stringify(c),"utf-8");if(t)return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l};try{let u=await Zc.publishBenchmark(n,r);return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l,remoteId:u.benchmarkId,publishedAt:u.publishedAt??new Date().toISOString(),url:u.url}}catch(u){throw new Error(DL(u))}}function DL(n){if(n instanceof Error)return n.message;if(n&&typeof n=="object"&&"message"in n){let e=n;return e.code==="PAYMENT_REQUIRED"?`${e.message} Run \`prjct cloud status\` for account details.`:e.message}return"Cloud benchmark publish failed."}var Dl,dL,pL,qR=h(()=>{"use strict";zn();K();$R();En();ai();pe();et();Dl=1,dL=-5,pL=5;a(LR,"runEval");a(xi,"loadLatestEvalRun");a(MR,"loadEvalRunByVersion");a(FR,"compareEvalRuns");a(Zg,"publishEvalRun");a(HR,"publishEvalComparison");a(oo,"formatEvalRunMarkdown");a(Pi,"formatEvalComparisonMarkdown");a(mL,"summarizeScenarios");a(fL,"runScenarios");a(Ci,"scenario");a(gL,"evalAgentSurface");a(hL,"evalProjectSyncReadiness");a(yL,"evalStaleCommandGuidance");a(wL,"evalQualityCommandReadiness");a(kL,"evalCloudBenchmarkReadiness");a(bL,"saveEvalRun");a(vL,"saveEvalComparison");a($l,"evalProjectDir");a(eh,"readRunFile");a(SL,"readRequiredRunFile");a(EL,"loadLatestRequired");a(Ai,"detectGit");a(Ri,"git");a(TL,"parseGitHubOwnerRepo");a(CL,"hashedRepo");a(RL,"runId");a(xL,"comparisonId");a(NR,"slugPart");a(PL,"detectSource");a(AL,"detectRunnerUser");a(_L,"detectBunVersion");a(UR,"execFileMaybe");a(Qg,"exists");a(jL,"collectTextFiles");a(IL,"regressionRecommendation");a(GR,"normalizePublishTarget");a(WR,"resolveBenchmarkProject");a(BR,"publishBenchmarkPayload");a(DL,"cloudPublishErrorMessage")});var VR={};L(VR,{EvalCommands:()=>th});var th,JR=h(()=>{"use strict";qR();W();Ue();fe();Ce();th=class extends V{static{a(this,"EvalCommands")}async eval(e=null,t=process.cwd(),r={}){let[s="run"]=(e??"").trim().split(/\s+/).filter(Boolean);try{switch(s){case"run":return this.run(t,r);case"compare":return this.compare(t,r);case"report":return this.report(t,r);case"publish":return this.publish(t,r);default:return this.unknown(s,r)}}catch(o){let i=w(o);return r.md?console.log(P(F("Eval failed",i))):g.fail(i),{success:!1,error:i}}}async run(e,t){let r=await LR(e,t);if(t.publish){let s=await Zg(e,{target:t.target,dryRun:t.dryRun,file:r.artifacts?.jsonPath});return t.json?console.log(JSON.stringify({run:r,publish:s},null,2)):t.md?console.log(P(oo(r),F("Published",`Target: \`${s.target}\`
1817
1817
  Project: \`${s.projectId}\`
1818
1818
  URL: ${s.url??"-"}`))):g.done(`eval run ${r.runId} saved and published to ${s.target}`),{success:!0,runId:r.runId,score:r.summary.score,publish:s}}return t.json?console.log(JSON.stringify(r,null,2)):t.md?console.log(P(oo(r))):g.done(`eval run ${r.runId} saved \u2014 score ${r.summary.score}/100`),{success:!0,runId:r.runId,score:r.summary.score}}async compare(e,t){let r=await FR(e,t);if(t.publish){let s=await HR(e,r,{target:t.target,dryRun:t.dryRun});if(t.json)console.log(JSON.stringify({comparison:r,publish:s},null,2));else if(t.md)console.log(P(Pi(r),F("Published",`Target: \`${s.target}\`
1819
1819
  Project: \`${s.projectId}\`
@@ -1823,7 +1823,7 @@ Repo: \`${r.repo}\`
1823
1823
  Endpoint: \`${r.endpoint}\`
1824
1824
  Payload: ${r.payloadBytes} bytes
1825
1825
  URL: ${r.url??"-"}`))):g.done(r.dryRun?`eval publish dry run prepared cloud benchmark payload (${r.payloadBytes} bytes)`:`eval benchmark ${r.artifactId} published to cloud`),{success:!0,...r}}unknown(e,t){let r=`Unknown eval subcommand: ${e}. Use run, compare, report, publish.`;return t.md?console.log(P(F("Unknown eval subcommand",r))):g.fail(r),{success:!1,error:r}}}});var tx={};L(tx,{isSyncCurrent:()=>oh,runSelfHeal:()=>ih});import sh from"node:fs";import UL from"node:path";function GL(){try{return sh.readFileSync(ex(),"utf-8").trim()}catch{return null}}function WL(n){try{sh.mkdirSync(ZR(),{recursive:!0}),sh.writeFileSync(ex(),n,"utf-8")}catch{}}function oh(n){return n?GL()===n:!0}async function ih(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(Dn(),Qw));await e()}catch{}try{await(await Promise.resolve().then(()=>(ig(),NC))).install()}catch{}WL(n)}}var ZR,ex,ah=h(()=>{"use strict";Te();ZR=a(()=>j.getStatePath(),"stampDir"),ex=a(()=>UL.join(ZR(),"installed-version"),"stampPath");a(GL,"readStamp");a(WL,"writeStamp");a(oh,"isSyncCurrent");a(ih,"runSelfHeal")});var ix={};L(ix,{_internal:()=>QL,maybeAutoUpdate:()=>zL,runBackgroundCheck:()=>KL});import{execFile as BL,spawn as qL}from"node:child_process";import io from"node:fs";import _i from"node:path";import{promisify as VL}from"node:util";function zL(n){if(!n||process.env.PRJCT_NO_AUTO_UPDATE==="1"||it("auto-update")!=="on")return;let e=it("auto-update-last-check");if(e&&Date.now()-Date.parse(e)<rx)return;xe("auto-update-last-check",new Date().toISOString()),qL(process.execPath,[process.argv[1],"__internal-auto-update",n],{detached:!0,stdio:"ignore"}).unref()}async function KL(n){try{let e=await sx();if(!e)return;if(yo(e,n)<=0){Ml(`current ${n} >= latest ${e}, no-op`);return}let t=ox();Ml(`upgrade available: ${n} \u2192 ${e} (source: ${t})`),await YL(t,e),Ml(`upgrade complete: ${n} \u2192 ${e}`)}catch(e){Ml(`auto-update failed: ${e.message}`)}}async function sx(){try{let n=new AbortController,e=setTimeout(()=>n.abort(),6e3),t=await fetch(XL,{signal:n.signal});if(clearTimeout(e),!t.ok)return null;let r=await t.json();return typeof r.version=="string"?r.version:null}catch{return null}}function ox(){let n=_i.join(ot(),"bin","prjct");if(io.existsSync(n))try{if(io.statSync(n).size>1024*1024)return"binary"}catch{}try{let e=String(rt("node:child_process").execSync("npm root -g")).trim();if(e&&io.existsSync(_i.join(e,"prjct-cli")))return"npm"}catch{}try{let e=String(rt("node:child_process").execSync("bun pm bin -g")).trim();if(e&&io.existsSync(_i.join(e,"prjct")))return"bun"}catch{}return"unknown"}async function YL(n,e){if(n==="binary"){await ch("bash",["-c","curl -sSL 'https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh' | bash"],{timeout:12e4,maxBuffer:4*1024*1024});return}if(n==="bun"){await ch("bun",["install","-g","prjct-cli@latest"],{timeout:12e4});return}if(n==="npm"||n==="unknown"){await ch("npm",["install","-g","prjct-cli@latest"],{timeout:12e4});return}}function Ml(n){try{io.mkdirSync(nx(),{recursive:!0}),io.appendFileSync(JL(),`${new Date().toISOString()} ${n}
1826
- `)}catch{}}var ch,nx,JL,rx,XL,QL,ax=h(()=>{"use strict";zn();cs();bo();ch=VL(BL),nx=a(()=>_i.join(ot(),"state"),"stateDir"),JL=a(()=>_i.join(nx(),"auto-update.log"),"logPath"),rx=3600*1e3,XL="https://registry.npmjs.org/prjct-cli/latest";a(zL,"maybeAutoUpdate");a(KL,"runBackgroundCheck");a(sx,"fetchLatestVersion");a(ox,"detectInstallSource");a(YL,"applyUpgrade");a(Ml,"log");QL={fetchLatestVersion:sx,detectInstallSource:ox,compareSemver:yo,THROTTLE_MS:rx}});import Ht from"node:fs";import{createServer as KH}from"node:net";var bi=class{static{a(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(uf(),lf)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(sl(),rl)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(nl(),tl)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(Vc(),qc)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(yf(),hf)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(Af(),Pf)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(Jf(),Vf)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(Kf(),zf)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(Zf(),Qf)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(lg(),cg)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(pg(),dg)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(yg(),hg)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(Sg(),vg)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(Cg(),Tg)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Pg(),xg)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(jg(),_g)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Mg(),$g)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}};var qC={core:{title:"Core Workflow",description:"Essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Tl=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'p. init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},description:"Register a task, auto-classify its harness, or show the active one",usage:{claude:'p. task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"p. regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"eval",group:"optional",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{name:"status",group:"core",routing:{group:"primitives",method:"status"},optionSchema:{},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"p. status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",routing:{group:"primitives",method:"tag"},optionSchema:{},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"p. tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'p. remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'p. capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"p. analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"p. agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"p. value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"p. memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"p. report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"p. handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"p. guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup [--vault-root <path>]"},params:"[--force] [--vault-root <path>] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'p. search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"core",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"p. team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"p. embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"p. guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"p. config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'p. spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to <vault-root>/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"p. audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e,t])=>({name:n,group:"setup",description:e,routing:t,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],EO={"-h":"help","--help":"help","-v":"version","--version":"version"},nre=new Set([...Tl.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(EO).filter(([,n])=>Tl.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)]);K();Te();W();ie();var Ng=class{static{a(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=a(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),c=a(async(l,u)=>{let{instance:d,method:p}=await i();return l!=null?p.call(d,l,u.projectPath):p.call(d,u.projectPath)},"wrapper");this.handlerFns.set(e,c),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(c=>c.name),s=r.filter((c,l)=>r.indexOf(c)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(c=>c.hasTemplate&&!c.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(c=>c.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let c=t.filter(l=>!i.includes(l.group));c.length>0&&e.push(`Invalid categories: ${c.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run p. init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:E()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:E()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let c=this.handlerFns.get(e);return c?c(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(c){return{success:!1,error:w(c)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:E()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,globalPath:"",timestamp:E()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},wt=new Ng;var XR=[];function zR(){for(let n of XR)n()}a(zR,"resetGroupLoaders");function Re(n){let e;return XR.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}a(Re,"lazy");var $L={workflow:Re(async()=>new(await Promise.resolve().then(()=>(uf(),lf))).WorkflowCommands),planning:Re(async()=>new(await Promise.resolve().then(()=>(sl(),rl))).PlanningCommands),shipping:Re(async()=>new(await Promise.resolve().then(()=>(nl(),tl))).ShippingCommands),analysis:Re(async()=>new(await Promise.resolve().then(()=>(Vc(),qc))).AnalysisCommands),setup:Re(async()=>new(await Promise.resolve().then(()=>(yf(),hf))).SetupCommands),context:Re(async()=>new(await Promise.resolve().then(()=>(Jf(),Vf))).ContextCommands),primitives:Re(async()=>new(await Promise.resolve().then(()=>(Kf(),zf))).PrimitiveCommands),seed:Re(async()=>new(await Promise.resolve().then(()=>(Zf(),Qf))).SeedCommands),install:Re(async()=>new(await Promise.resolve().then(()=>(lg(),cg))).InstallCommands),capture:Re(async()=>new(await Promise.resolve().then(()=>(pg(),dg))).CaptureCommands),mcp:Re(async()=>new(await Promise.resolve().then(()=>(yg(),hg))).McpCommands),team:Re(async()=>new(await Promise.resolve().then(()=>(Sg(),vg))).TeamCommands),config:Re(async()=>new(await Promise.resolve().then(()=>(Cg(),Tg))).ConfigCommands),uninstall:Re(async()=>new(await Promise.resolve().then(()=>(oR(),sR))).UninstallCommands),update:Re(async()=>new(await Promise.resolve().then(()=>(Af(),Pf))).UpdateCommands),spec:Re(async()=>new(await Promise.resolve().then(()=>(Mg(),$g))).SpecCommands),embeddings:Re(async()=>new(await Promise.resolve().then(()=>(Pg(),xg))).EmbeddingsCommands),guard:Re(async()=>new(await Promise.resolve().then(()=>(jg(),_g))).GuardCommands),lean:Re(async()=>new(await Promise.resolve().then(()=>(hR(),gR))).LeanCommands),cloud:Re(async()=>new(await Promise.resolve().then(()=>(SR(),vR))).CloudCommands),tdd:Re(async()=>new(await Promise.resolve().then(()=>(Im(),jm))).TddCommands),sdd:Re(async()=>new(await Promise.resolve().then(()=>(zc(),Xc))).SddCommands),notify:Re(async()=>new(await Promise.resolve().then(()=>(CR(),TR))).NotifyCommands),agents:Re(async()=>new(await Promise.resolve().then(()=>(xR(),RR))).AgentsCommands),product:Re(async()=>new(await Promise.resolve().then(()=>(jR(),_R))).ProductCommands),eval:Re(async()=>new(await Promise.resolve().then(()=>(JR(),VR))).EvalCommands)};function ML(){for(let[n,e]of Object.entries(qC))wt.registerCategory(n,e)}a(ML,"registerCategories");function NL(){if(!wt.has("work")){ML();for(let n of Tl)n.routing&&wt.registerLazyMethod(n.name,$L[n.routing.group],n.routing.method,n)}}a(NL,"registerAllCommands");NL();vc();var OL=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);async function KR(){return process.stdin.isTTY?{}:new Promise(n=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return n({});n(JSON.parse(t))}catch{n({})}}),process.stdin.on("error",()=>n({})),setTimeout(()=>n({}),200)})}a(KR,"readStdinSafe");function nh(n){process.stdout.write(`${JSON.stringify(n)}
1826
+ `)}catch{}}var ch,nx,JL,rx,XL,QL,ax=h(()=>{"use strict";zn();cs();bo();ch=VL(BL),nx=a(()=>_i.join(ot(),"state"),"stateDir"),JL=a(()=>_i.join(nx(),"auto-update.log"),"logPath"),rx=3600*1e3,XL="https://registry.npmjs.org/prjct-cli/latest";a(zL,"maybeAutoUpdate");a(KL,"runBackgroundCheck");a(sx,"fetchLatestVersion");a(ox,"detectInstallSource");a(YL,"applyUpgrade");a(Ml,"log");QL={fetchLatestVersion:sx,detectInstallSource:ox,compareSemver:yo,THROTTLE_MS:rx}});import Ht from"node:fs";import{createServer as KH}from"node:net";var bi=class{static{a(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(uf(),lf)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(sl(),rl)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(nl(),tl)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(Vc(),qc)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(yf(),hf)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(Af(),Pf)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(Jf(),Vf)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(Kf(),zf)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(Zf(),Qf)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(lg(),cg)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(pg(),dg)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(yg(),hg)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(Sg(),vg)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(Cg(),Tg)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Pg(),xg)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(jg(),_g)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Mg(),$g)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}};var qC={core:{title:"Core Workflow",description:"Essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Tl=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'p. init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},description:"Register a task, auto-classify its harness, or show the active one",usage:{claude:'p. task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"p. regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"eval",group:"optional",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{name:"status",group:"core",routing:{group:"primitives",method:"status"},optionSchema:{},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"p. status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",routing:{group:"primitives",method:"tag"},optionSchema:{},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"p. tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'p. remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'p. capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"p. analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"p. agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"p. value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"p. memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"p. report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"p. handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"p. guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup [--vault-root <path>]"},params:"[--force] [--vault-root <path>] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"context",group:"setup",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'p. search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"core",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"p. team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"p. embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"p. guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"p. config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'p. spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to <vault-root>/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"p. audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e,t])=>({name:n,group:"setup",description:e,routing:t,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],EO={"-h":"help","--help":"help","-v":"version","--version":"version"},nre=new Set([...Tl.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(EO).filter(([,n])=>Tl.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)]);K();Te();W();ie();var Ng=class{static{a(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=a(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),c=a(async(l,u)=>{let{instance:d,method:p}=await i();return l!=null?p.call(d,l,u.projectPath):p.call(d,u.projectPath)},"wrapper");this.handlerFns.set(e,c),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(c=>c.name),s=r.filter((c,l)=>r.indexOf(c)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(c=>c.hasTemplate&&!c.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(c=>c.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let c=t.filter(l=>!i.includes(l.group));c.length>0&&e.push(`Invalid categories: ${c.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run p. init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:E()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:E()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let c=this.handlerFns.get(e);return c?c(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(c){return{success:!1,error:w(c)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:E()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,globalPath:"",timestamp:E()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},wt=new Ng;var XR=[];function zR(){for(let n of XR)n()}a(zR,"resetGroupLoaders");function Re(n){let e;return XR.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}a(Re,"lazy");var $L={workflow:Re(async()=>new(await Promise.resolve().then(()=>(uf(),lf))).WorkflowCommands),planning:Re(async()=>new(await Promise.resolve().then(()=>(sl(),rl))).PlanningCommands),shipping:Re(async()=>new(await Promise.resolve().then(()=>(nl(),tl))).ShippingCommands),analysis:Re(async()=>new(await Promise.resolve().then(()=>(Vc(),qc))).AnalysisCommands),setup:Re(async()=>new(await Promise.resolve().then(()=>(yf(),hf))).SetupCommands),context:Re(async()=>new(await Promise.resolve().then(()=>(Jf(),Vf))).ContextCommands),primitives:Re(async()=>new(await Promise.resolve().then(()=>(Kf(),zf))).PrimitiveCommands),seed:Re(async()=>new(await Promise.resolve().then(()=>(Zf(),Qf))).SeedCommands),install:Re(async()=>new(await Promise.resolve().then(()=>(lg(),cg))).InstallCommands),capture:Re(async()=>new(await Promise.resolve().then(()=>(pg(),dg))).CaptureCommands),mcp:Re(async()=>new(await Promise.resolve().then(()=>(yg(),hg))).McpCommands),team:Re(async()=>new(await Promise.resolve().then(()=>(Sg(),vg))).TeamCommands),config:Re(async()=>new(await Promise.resolve().then(()=>(Cg(),Tg))).ConfigCommands),uninstall:Re(async()=>new(await Promise.resolve().then(()=>(oR(),sR))).UninstallCommands),update:Re(async()=>new(await Promise.resolve().then(()=>(Af(),Pf))).UpdateCommands),spec:Re(async()=>new(await Promise.resolve().then(()=>(Mg(),$g))).SpecCommands),embeddings:Re(async()=>new(await Promise.resolve().then(()=>(Pg(),xg))).EmbeddingsCommands),guard:Re(async()=>new(await Promise.resolve().then(()=>(jg(),_g))).GuardCommands),lean:Re(async()=>new(await Promise.resolve().then(()=>(hR(),gR))).LeanCommands),cloud:Re(async()=>new(await Promise.resolve().then(()=>(SR(),vR))).CloudCommands),tdd:Re(async()=>new(await Promise.resolve().then(()=>(Im(),jm))).TddCommands),sdd:Re(async()=>new(await Promise.resolve().then(()=>(zc(),Xc))).SddCommands),notify:Re(async()=>new(await Promise.resolve().then(()=>(CR(),TR))).NotifyCommands),agents:Re(async()=>new(await Promise.resolve().then(()=>(xR(),RR))).AgentsCommands),product:Re(async()=>new(await Promise.resolve().then(()=>(jR(),_R))).ProductCommands),eval:Re(async()=>new(await Promise.resolve().then(()=>(JR(),VR))).EvalCommands)};function ML(){for(let[n,e]of Object.entries(qC))wt.registerCategory(n,e)}a(ML,"registerCategories");function NL(){if(!wt.has("work")){ML();for(let n of Tl)n.routing&&wt.registerLazyMethod(n.name,$L[n.routing.group],n.routing.method,n)}}a(NL,"registerAllCommands");NL();vc();var OL=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);async function KR(){return process.stdin.isTTY?{}:new Promise(n=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return n({});n(JSON.parse(t))}catch{n({})}}),process.stdin.on("error",()=>n({})),setTimeout(()=>n({}),200)})}a(KR,"readStdinSafe");function nh(n){process.stdout.write(`${JSON.stringify(n)}
1827
1827
  `)}a(nh,"emit");function LL(){nh({})}a(LL,"emitEmpty");async function YR(n){try{await n()}catch{LL()}}a(YR,"safeRun");var FL=new Set(["this","that","with","from","have","your","please","would","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their","que","como","cuando","donde","porque","para","pero","por","con","sin","los","las","del","una","uno","unos","unas","este","esta","esto","estos","estas","eso","esos","esas","mas","muy","todo","toda","todos","todas","sobre","entre","hasta","desde","hace","hacer","tiene","tienen","debe","deben","puede","pueden","estan","ser","son","algo","ahora","aqui","bien","cada","dale"]);function QR(n,e=8){let t=Ns(n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2")).toLowerCase(),r=new Set,s=[];for(let o of t.split(/[^\p{L}\p{N}]+/u))if(!(o.length<3)&&!FL.has(o)&&!r.has(o)&&(r.add(o),s.push(o),s.length>=e))break;return s}a(QR,"extractKeywords");function HL(n){return n.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}a(HL,"stripLoneSurrogates");function Wn(n,e,t=`
1828
1828
  \u2026 [truncated]`){if(n.length<=e)return n;let r=Math.max(0,e-t.length),s=n.charCodeAt(r-1);return s>=55296&&s<=56319&&(r-=1),n.slice(0,Math.max(0,r))+t}a(Wn,"safeTruncate");function rh(n,e){if(!e)return{};let t=HL(e);return OL.has(n)?{hookSpecificOutput:{hookEventName:n,additionalContext:t}}:{systemMessage:t}}a(rh,"buildHookOutput");async function Je(n,e){let t=n.projectPath??process.cwd();if(e){try{let r=e.input,s=n.build?await n.build(r,t):null;e.sink(`${JSON.stringify(rh(n.event,s))}
1829
1829
  `),n.afterEmit&&e.detachAfterEmit(()=>n.afterEmit(r,t))}catch{e.sink(`{}
@@ -1849,7 +1849,7 @@ ${c}`:i,gF)},"build")},e)}a(wx,"runPromptHook");K();kl();import UH from"node:fs/
1849
1849
  `)}a(CH,"formatSkillMiss");function RH(n,e){let t=`${n}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return dH.createHash("sha256").update(t).digest("hex")}a(RH,"hashKey");function xH(n,e){let t=M.recall(n,{types:[...gH],limit:120}),r=Date.now()-hH,s=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>r||e&&o.tags.session===e||s.push({id:o.id,type:o.type,content:o.content,fileTag:o.tags.file??"",rememberedAt:o.rememberedAt,provenance:o.provenance,session:o.tags.session??""}));return s}a(xH,"recallCandidates");function PH(n){try{let e=M.recall(n,{types:["improvement-signal"],tags:{source:Nx},limit:100,dedupeByKey:!1}),t=new Set;for(let r of e)r.tags.key&&t.add(r.tags.key);return t}catch{return new Set}}a(PH,"existingSkillMissKeys");function AH(n){try{let e=rt("node:fs"),r=rt("node:path").join(n,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(r,"utf-8")).projectId??null}catch{return null}}a(AH,"projectIdFromPath");K();ve();import _H from"node:crypto";import jH from"node:fs/promises";var Gx="transcript-auto",Wx=80,Hx=1500,IH=12,DH=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];async function Bx(n,e,t,r={}){let s={scanned:0,ingested:0,skipped:[],errors:[]},o=r.preloadedConfig!==void 0?r.preloadedConfig:await R.readConfig(n).catch(()=>null);if(!o?.projectId)return s.errors.push("no project config"),s;let i;if(r.preloadedLines)i=r.preloadedLines;else{let p;try{p=await jH.readFile(e,"utf-8")}catch(m){return s.errors.push(`transcript read failed: ${m.message}`),s}i=Cr(p)}let c=$H(i);if(s.scanned=c.length,c.length===0)return s;let l=OH(c);if(l.length===0)return s;let u=HH(o.projectId),d=t?t.slice(0,12):"unknown";for(let p of l){if(u.has(p.hash)){s.skipped.push({reason:"duplicate",phrase:p.matchedPhrase});continue}try{await M.remember(n,{type:p.type,content:p.content,tags:{source:Gx,session:d,hash:p.hash,phrase:p.matchedPhrase},provenance:"inferred",projectId:o.projectId}),s.ingested+=1}catch(m){s.errors.push(`remember failed: ${m.message}`)}}return s}a(Bx,"ingestTranscript");function $H(n){let e=[];for(let t of n){let r=MH(t);if(r!=="assistant")continue;let s=NH(t);!s||s.length<Wx||e.push({role:r,text:s})}return e}a($H,"projectMessages");function MH(n){let e=n.role;if(typeof e=="string")return Ux(e);let t=n.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return Ux(s)}let r=n.type;return r==="assistant"||r==="user"||r==="system"?r:null}a(MH,"inferRole");function Ux(n){let e=n.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}a(Ux,"normalizeRole");function NH(n){let e=n.content;if(e===void 0&&n.message&&typeof n.message=="object"&&(e=n.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let r of e){if(!r||typeof r!="object")continue;let s=r;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
1850
1850
  `).trim()}return""}a(NH,"extractText");function OH(n){let e=[],t=new Set;for(let r of n){let s=LH(r.text);for(let o of s){if(e.length>=IH)return e;if(o.length<Wx)continue;let i=o.toLowerCase(),c=DH.find(d=>i.includes(d.phrase));if(!c)continue;let l=o.length>Hx?`${o.slice(0,Hx)}\u2026`:o,u=FH(l);t.has(u)||(t.add(u),e.push({type:c.type,content:l,hash:u,matchedPhrase:c.phrase}))}}return e}a(OH,"extractCandidates");function LH(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}a(LH,"splitParagraphs");function FH(n){return _H.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}a(FH,"hashContent");function HH(n){let e=new Set;try{let{prjctDb:t}=(X(),st(tr)),{REMEMBER_EVENT_RANGE:r}=(ar(),st(Tw)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==Gx)continue;let l=c.hash;typeof l=="string"&&e.add(l)}}catch{}return e}a(HH,"collectExistingAutoHashes");Ln();yn();Hc();function qx(n=process.cwd(),e){return Je({event:"Stop",projectPath:n,afterEmit:a(async(t,r)=>{let s=await R.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await UH.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Cr(i))}try{await Zp(r)}catch{}try{await tm(r,s)}catch{}if(t.transcript_path)try{await Bx(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await _x(r,s)}catch{}try{await Cx(r,s)}catch{}try{let i=await Ix(s.projectId);await Dx(s.projectId,i)}catch{}if(t.transcript_path)try{if((await vx(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:c}=await Promise.resolve().then(()=>(fs(),vw)),u=(await c(s.projectId,r)).current?.id;u&&ut.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await Fx(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await ki.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(Gm(),Um));await i(r,s)}catch{}await ni(r,s.projectId).catch(()=>{})},"afterEmit")},e)}a(qx,"runStopHook");function Vx(n=process.cwd(),e){return Je({event:"SubagentStart",projectPath:n,build:a((t,r)=>ux(r),"build")},e)}a(Vx,"runSubagentStartHook");K();fs();On();Il();function Jx(n=process.cwd(),e){return Je({event:"SubagentStop",projectPath:n,build:a(async(t,r)=>{let s=await R.readConfig(r).catch(()=>null);if(!s?.projectId||ro(s)==="off")return null;let o=[];try{let i=await Cn(s.projectId,r);i.current&&o.push(`active: ${i.current.description}`)}catch{}try{let i=await Qe.getActiveTasks(s.projectId);i.length>0&&o.push(`pending: ${i.length}`)}catch{}return await jl("prjct \u2014 subagent finished",o.join(" \xB7 ")||"A subagent finished"),null},"build")},e)}a(Jx,"runSubagentStopHook");var GH={"session-start":dx,prompt:wx,"pre-commit":gx,"pre-edit":hx,"post-edit":fx,stop:qx,"subagent-start":Vx,"subagent-stop":Jx,notification:mx,"cwd-changed":px};function Xx(n){return n?GH[n]:void 0}a(Xx,"getHookRunner");X();Bg();function zx(n){let e=wt.getAll().map(s=>s.name),t=null,r=1/0;for(let s of e){let o=WH(n.toLowerCase(),s.toLowerCase());o<r&&(r=o,t=s)}return r<=2?t:null}a(zx,"findClosestCommand");function WH(n,e){let t=n.length,r=e.length,s=Array.from({length:t+1},()=>Array(r+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=r;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=r;i++)s[o][i]=n[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][r]}a(WH,"editDistance");function BH(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}a(BH,"kebab");function Kx(n,e){let t=a(s=>n[s]!==void 0?n[s]:n[BH(s)],"pick"),r={md:n.md===!0};for(let s of e.booleans??[])r[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);r[s]=o!=null&&o!==!1&&o!==""?String(o):void 0}for(let s of e.numbers??[]){let o=t(s),i=o!=null&&o!==!1&&o!==""?Number(o):Number.NaN;r[s]=Number.isNaN(i)?void 0:i}return r}a(Kx,"mapOptions");var Yx={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 Qx(n){return Object.hasOwn(Yx,n)}a(Qx,"isRemovedVerb");function Zx(n){let e=Yx[n];return e?`'prjct ${n}' was removed in v2.
1851
1851
  \u2192 Use: ${e.replacement}
1852
- ${e.note}`:null}a(Zx,"migrationMessage");var qH=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),VH=new Set(["draft","new","create"]);async function eP(n,e,t,r){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,c=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&VH.has(o))return n.spec(i,r,l);if(!o||!qH.has(o))return n.spec(c,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,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 n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}a(eP,"routeSpec");async function tP(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(Qx(e.command)&&!wt.getByName(e.command))return{success:!1,error:Zx(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!wt.getByName(e.command)&&!(e.args.length===0&&zx(e.command)!==null)){let i=[e.command,...e.args.filter(c=>!c.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=wt.getByName(e.command);if(o?.optionSchema)return wt.executeWithOptions(e.command,t,e.cwd,Kx(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return eP(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});case"login":return n.login({md:s});case"logout":return n.logout();case"auth":return n.auth(t,{md:s});default:return wt.execute(e.command,t,e.cwd)}}a(tP,"executeCommand");pl();var uh=class{static{a(this,"RequestJournal")}ttlMs;maxEntries;now;entries=new Map;constructor(e={}){this.ttlMs=e.ttlMs??12e4,this.maxEntries=e.maxEntries??512,this.now=e.now??Date.now}run(e,t){let r=this.now();this.prune(r);let s=JH(e),o=this.entries.get(e.id);if(o){if(o.fingerprint!==s)return Promise.resolve({id:e.id,success:!1,exitCode:1,stderr:"Duplicate daemon request id reused with different payload"});if(o.response)return Promise.resolve(Ul(o.response));if(o.promise)return o.promise.then(Ul)}let i={createdAt:r,fingerprint:s},c=t().then(l=>(i.response=Ul(l),i.promise=void 0,Ul(l))).catch(l=>{throw this.entries.delete(e.id),l});return i.promise=c,this.entries.set(e.id,i),this.enforceMaxEntries(),c}clear(){this.entries.clear()}size(){return this.entries.size}prune(e){for(let[t,r]of this.entries)e-r.createdAt>this.ttlMs&&this.entries.delete(t)}enforceMaxEntries(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(!e)break;this.entries.delete(e)}}};function JH(n){return dh({command:n.command,args:n.args,options:n.options,cwd:n.cwd,stdin:n.stdin})}a(JH,"requestFingerprint");function dh(n){return Array.isArray(n)?`[${n.map(dh).join(",")}]`:n&&typeof n=="object"?`{${Object.entries(n).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${dh(r)}`).join(",")}}`:JSON.stringify(n)}a(dh,"stableStringify");function Ul(n){return{...n}}a(Ul,"cloneResponse");var nP=new uh;pl();import an from"node:fs";import XH from"node:os";import kn from"node:path";function rP(){let n=__dirname;for(let r=0;r<5;r++){if(an.existsSync(kn.join(n,"package.json"))){let s=kn.join(n,"dist","daemon","entry.mjs");if(an.existsSync(s))return s;break}n=kn.dirname(n)}let e=[kn.join(__dirname,"..","daemon","entry.mjs"),kn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(an.existsSync(r))return r;let t=process.argv[1];return t&&an.existsSync(t)?t:null}a(rP,"resolveEntryPath");function sP(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}a(sP,"decideRestart");function ph(n,e){if(!n||e===null)return!1;try{return an.statSync(n).mtimeMs!==e}catch{return!1}}a(ph,"isCodeStale");function oP(){let n=__dirname;for(let e=0;e<6;e++){let t=kn.join(n,"package.json");try{let s=JSON.parse(an.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=kn.dirname(n);if(r===n)break;n=r}return null}a(oP,"readOwnPackageVersion");function iP(n){if(!n)return!1;let e=XH.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 r of t){let s;try{s=an.realpathSync(r)}catch{continue}let o=kn.dirname(s);for(let i=0;i<6;i++){let c=kn.join(o,"package.json");try{let u=JSON.parse(an.readFileSync(c,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=kn.dirname(o);if(l===o)break;o=l}}return!1}a(iP,"isGlobalVersionDrifted");var zH=1024*1024;function aP(){let n=Ge.log();try{if(an.statSync(n).size>zH){let t=`${n}.1`;try{an.unlinkSync(t)}catch{}an.renameSync(n,t)}}catch{}}a(aP,"rotateLog");function cP(n){try{return process.kill(n,0),!0}catch{return!1}}a(cP,"isProcessRunning");var YH=50,QH=1e3,co=null,Ii=null,le=null,ao=null,lP=0,uP=Promise.resolve();async function pP(n){process.env.PRJCT_IN_DAEMON="1";let e=Ge.socket(),t=Ge.pid(),r=Ge.runDir(),s=Sr(e);if(Ht.mkdirSync(r,{recursive:!0}),Ht.existsSync(t)){let c=parseInt(Ht.readFileSync(t,"utf-8").trim(),10);cP(c)&&(console.error(`Daemon already running (PID ${c})`),process.exit(1)),Ht.unlinkSync(t)}!s&&Ht.existsSync(e)&&Ht.unlinkSync(e),aP();let o=rP(),i=null;if(o)try{i=Ht.statSync(o).mtimeMs}catch{}if(ao=oP(),le={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:fC,idleTimer:null,entryPath:o,entryMtime:i,activeRequests:0,restartPending:!1},ao)try{let{isSyncCurrent:c,runSelfHeal:l}=await Promise.resolve().then(()=>(ah(),tx));c(ao)||await l(ao)}catch{}if(Ii=new bi,co=KH(c=>ZH(c)),co.listen(e,()=>{s||Ht.chmodSync(e,384),Ht.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),o&&console.log(` Watching: ${o}`),mP(),_l.startAll().catch(()=>{})}),co.on("error",c=>{console.error("Daemon socket error:",c.message),as(1)}),process.on("SIGTERM",()=>as(0)),process.on("SIGINT",()=>as(0)),process.on("SIGHUP",()=>{Ii=new bi,zR(),wt.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}a(pP,"startDaemon");function ZH(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>gC){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(zs(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1852
+ ${e.note}`:null}a(Zx,"migrationMessage");var qH=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),VH=new Set(["draft","new","create"]);async function eP(n,e,t,r){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,c=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&VH.has(o))return n.spec(i,r,l);if(!o||!qH.has(o))return n.spec(c,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,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 n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}a(eP,"routeSpec");async function tP(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(Qx(e.command)&&!wt.getByName(e.command))return{success:!1,error:Zx(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!wt.getByName(e.command)&&!(e.args.length===0&&zx(e.command)!==null)){let i=[e.command,...e.args.filter(c=>!c.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=wt.getByName(e.command);if(o?.optionSchema)return wt.executeWithOptions(e.command,t,e.cwd,Kx(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return eP(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});default:return wt.execute(e.command,t,e.cwd)}}a(tP,"executeCommand");pl();var uh=class{static{a(this,"RequestJournal")}ttlMs;maxEntries;now;entries=new Map;constructor(e={}){this.ttlMs=e.ttlMs??12e4,this.maxEntries=e.maxEntries??512,this.now=e.now??Date.now}run(e,t){let r=this.now();this.prune(r);let s=JH(e),o=this.entries.get(e.id);if(o){if(o.fingerprint!==s)return Promise.resolve({id:e.id,success:!1,exitCode:1,stderr:"Duplicate daemon request id reused with different payload"});if(o.response)return Promise.resolve(Ul(o.response));if(o.promise)return o.promise.then(Ul)}let i={createdAt:r,fingerprint:s},c=t().then(l=>(i.response=Ul(l),i.promise=void 0,Ul(l))).catch(l=>{throw this.entries.delete(e.id),l});return i.promise=c,this.entries.set(e.id,i),this.enforceMaxEntries(),c}clear(){this.entries.clear()}size(){return this.entries.size}prune(e){for(let[t,r]of this.entries)e-r.createdAt>this.ttlMs&&this.entries.delete(t)}enforceMaxEntries(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(!e)break;this.entries.delete(e)}}};function JH(n){return dh({command:n.command,args:n.args,options:n.options,cwd:n.cwd,stdin:n.stdin})}a(JH,"requestFingerprint");function dh(n){return Array.isArray(n)?`[${n.map(dh).join(",")}]`:n&&typeof n=="object"?`{${Object.entries(n).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${dh(r)}`).join(",")}}`:JSON.stringify(n)}a(dh,"stableStringify");function Ul(n){return{...n}}a(Ul,"cloneResponse");var nP=new uh;pl();import an from"node:fs";import XH from"node:os";import kn from"node:path";function rP(){let n=__dirname;for(let r=0;r<5;r++){if(an.existsSync(kn.join(n,"package.json"))){let s=kn.join(n,"dist","daemon","entry.mjs");if(an.existsSync(s))return s;break}n=kn.dirname(n)}let e=[kn.join(__dirname,"..","daemon","entry.mjs"),kn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(an.existsSync(r))return r;let t=process.argv[1];return t&&an.existsSync(t)?t:null}a(rP,"resolveEntryPath");function sP(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}a(sP,"decideRestart");function ph(n,e){if(!n||e===null)return!1;try{return an.statSync(n).mtimeMs!==e}catch{return!1}}a(ph,"isCodeStale");function oP(){let n=__dirname;for(let e=0;e<6;e++){let t=kn.join(n,"package.json");try{let s=JSON.parse(an.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=kn.dirname(n);if(r===n)break;n=r}return null}a(oP,"readOwnPackageVersion");function iP(n){if(!n)return!1;let e=XH.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 r of t){let s;try{s=an.realpathSync(r)}catch{continue}let o=kn.dirname(s);for(let i=0;i<6;i++){let c=kn.join(o,"package.json");try{let u=JSON.parse(an.readFileSync(c,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=kn.dirname(o);if(l===o)break;o=l}}return!1}a(iP,"isGlobalVersionDrifted");var zH=1024*1024;function aP(){let n=Ge.log();try{if(an.statSync(n).size>zH){let t=`${n}.1`;try{an.unlinkSync(t)}catch{}an.renameSync(n,t)}}catch{}}a(aP,"rotateLog");function cP(n){try{return process.kill(n,0),!0}catch{return!1}}a(cP,"isProcessRunning");var YH=50,QH=1e3,co=null,Ii=null,le=null,ao=null,lP=0,uP=Promise.resolve();async function pP(n){process.env.PRJCT_IN_DAEMON="1";let e=Ge.socket(),t=Ge.pid(),r=Ge.runDir(),s=Sr(e);if(Ht.mkdirSync(r,{recursive:!0}),Ht.existsSync(t)){let c=parseInt(Ht.readFileSync(t,"utf-8").trim(),10);cP(c)&&(console.error(`Daemon already running (PID ${c})`),process.exit(1)),Ht.unlinkSync(t)}!s&&Ht.existsSync(e)&&Ht.unlinkSync(e),aP();let o=rP(),i=null;if(o)try{i=Ht.statSync(o).mtimeMs}catch{}if(ao=oP(),le={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:fC,idleTimer:null,entryPath:o,entryMtime:i,activeRequests:0,restartPending:!1},ao)try{let{isSyncCurrent:c,runSelfHeal:l}=await Promise.resolve().then(()=>(ah(),tx));c(ao)||await l(ao)}catch{}if(Ii=new bi,co=KH(c=>ZH(c)),co.listen(e,()=>{s||Ht.chmodSync(e,384),Ht.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),o&&console.log(` Watching: ${o}`),mP(),_l.startAll().catch(()=>{})}),co.on("error",c=>{console.error("Daemon socket error:",c.message),as(1)}),process.on("SIGTERM",()=>as(0)),process.on("SIGINT",()=>as(0)),process.on("SIGHUP",()=>{Ii=new bi,zR(),wt.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}a(pP,"startDaemon");function ZH(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>gC){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(zs(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1853
1853
  `))!==-1;){let s=e.slice(0,r);if(e=e.slice(r+1),!!s.trim())try{let o=JSON.parse(s),i=await tU(o);n.write(zs(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(zs(i))}}}),n.on("error",()=>{})}a(ZH,"handleConnection");function eU(n){if(!le||le.restartPending)return;let e=ph(le.entryPath,le.entryMtime),t=sP({codeStale:e,command:n,ownVersion:ao,now:Date.now(),lastDriftCheckMs:lP,driftMinIntervalMs:QH,checkDrift:iP});lP=t.lastDriftCheckMs,t.restart&&(le.restartPending=!0,console.log(e?"Build change detected \u2014 daemon will restart; request runs on fresh code.":`Version drift detected \u2014 daemon v${ao} is stale; request runs on fresh code.`))}a(eU,"markStaleIfNeeded");async function tU(n){return!le||!Ii?{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"}:(eU(n.command),le.restartPending&&n.command!=="daemon"&&n.command!=="__ping"?(le.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>as(0))),{id:n.id,success:!1,exitCode:1,retry:!0,stderr:"daemon code is stale \u2014 running directly"}):nP.run(n,async()=>{le.activeRequests++;try{let e=uP.then(()=>dP(n),()=>dP(n));return uP=e.then(()=>{},()=>{}),await e}finally{le.activeRequests--,le.restartPending&&le.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>as(0)))}}))}a(tU,"handleRequest");async function dP(n){if(!le||!Ii)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(mP(),le.commandsServed++,le.lastActivity=Date.now(),le.commandsServed%YH===0&&k.checkpointAll(),n.command==="daemon")return rU(n);if(n.command==="hook")return nU(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],r=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await tP(Ii,n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1854
1854
  `)||o.message||void 0,stderr:t.join(`
1855
1855
  `)||o.error||void 0,result:o}}finally{console.log=r,console.error=s}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}a(dP,"handleRequestInner");async function nU(n){let e=Xx(n.args[0]);if(!e)return{id:n.id,success:!0,exitCode:0,stdout:`{}