prjct-cli 1.42.2 → 1.42.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -1
- package/dist/bin/prjct-core.mjs +2 -2
- package/dist/daemon/entry.mjs +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.42.3] - 2026-02-15
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- state storage updates preserve existing state to prevent data loss (#201)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## [1.42.4] - 2026-02-15
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
- fix: state storage updates now preserve existing state to prevent data loss during task completion, pause, and resume operations
|
|
14
|
+
- test: add state storage integrity tests
|
|
15
|
+
|
|
3
16
|
## [1.42.2] - 2026-02-15
|
|
4
17
|
|
|
5
18
|
### Bug Fixes
|
|
6
19
|
|
|
7
20
|
- add update to daemon bypass commands (#200)
|
|
8
21
|
|
|
9
|
-
|
|
10
22
|
## [1.42.3] - 2026-02-15
|
|
11
23
|
|
|
12
24
|
### Bug Fixes
|
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -318,7 +318,7 @@ ${e.example}
|
|
|
318
318
|
|
|
319
319
|
Fields:
|
|
320
320
|
${bb(e.schema)}`:null}function bb(s){if(s instanceof nt.ZodObject){let e=s.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${pm(n)}`).join(`
|
|
321
|
-
`)}return"(see example above)"}function pm(s){return s instanceof nt.ZodString?"string":s instanceof nt.ZodNumber?"number":s instanceof nt.ZodEnum?`one of: ${s.options.join(", ")}`:s instanceof nt.ZodArray?`array of ${pm(s.element)}`:s instanceof nt.ZodObject?"object":"any"}var lm,um,dm,fi=y(()=>{"use strict";so();so();lm=nt.object({agentName:nt.string(),reasoning:nt.string(),confidence:nt.number().min(0).max(1)}),um=nt.object({subtasks:nt.array(nt.object({description:nt.string(),domain:gi,agent:nt.string(),dependsOn:nt.array(nt.number())})),effort:nt.enum(["low","medium","high"])}),dm={classification:{schema:zn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:lm,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:um,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(Bc,"renderSchemaForPrompt");l(bb,"describeSchema");l(pm,"describeField")});import{z as A}from"zod";var gm,vb,Cb,fm,xb,Pb,Tb,Eb,Ab,Ib,jb,hm,Rb,Db,r0,ym,wm,km,Sm,$b,hi,Jc=y(()=>{"use strict";gm=A.number().min(1).max(5),vb=A.enum(["exceeded","met","partial","failed"]),Cb=A.enum(["definitely","probably","maybe","no"]),fm=A.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),xb=A.object({estimated:A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),source:A.enum(["prd","manual","historical"]).optional()}),actual:A.object({hours:A.number(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional(),sessions:A.number().optional()}),variance:A.object({hours:A.number(),percentage:A.number(),reason:fm.optional(),explanation:A.string().optional()})}),Pb=A.object({name:A.string(),baseline:A.number().nullable(),target:A.number(),actual:A.number(),unit:A.string(),achieved:A.boolean(),percentOfTarget:A.number()}),Tb=A.object({criteria:A.string(),met:A.boolean(),notes:A.string().optional()}),Eb=A.object({metrics:A.array(Pb),acceptanceCriteria:A.array(Tb),overallSuccess:vb,successScore:A.number().min(0).max(100)}),Ab=A.object({category:A.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:A.string(),actionable:A.boolean(),action:A.string().optional()}),Ib=A.object({whatWorked:A.array(A.string()),whatDidnt:A.array(A.string()),surprises:A.array(A.string()),recommendations:A.array(Ab)}),jb=A.object({valueDelivered:A.number().min(1).max(10),userImpact:A.enum(["none","low","medium","high","critical"]),businessImpact:A.enum(["none","low","medium","high","critical"]),roiScore:A.number(),worthIt:Cb,worthItReason:A.string().optional(),alternativeConsidered:A.string().optional(),betterAlternativeExists:A.boolean().optional()}),hm=A.object({id:A.string(),taskId:A.string(),description:A.string(),estimatedMinutes:A.number().optional(),actualMinutes:A.number(),completedAsPlanned:A.boolean(),qualityScore:gm,blockers:A.array(A.string()),agentUsed:A.string().optional(),skillsUsed:A.array(A.string()).optional(),startedAt:A.string(),completedAt:A.string()}),Rb=A.object({id:A.string(),featureId:A.string(),featureName:A.string(),prdId:A.string().nullable(),version:A.string().optional(),branch:A.string().optional(),prUrl:A.string().optional(),effort:xb,success:Eb.optional(),learnings:Ib,roi:jb,rating:gm,taskOutcomes:A.array(hm).optional(),startedAt:A.string(),shippedAt:A.string(),reviewedAt:A.string().optional(),reviewedBy:A.string().optional(),legacy:A.boolean().optional()}),Db=A.object({totalFeatures:A.number(),averageEstimationAccuracy:A.number(),averageSuccessRate:A.number(),averageROI:A.number(),bySuccessLevel:A.object({exceeded:A.number(),met:A.number(),partial:A.number(),failed:A.number()}),variancePatterns:A.array(A.object({reason:fm,count:A.number(),averageVariance:A.number()})),topLearnings:A.array(A.object({insight:A.string(),frequency:A.number()}))}),r0=A.object({outcomes:A.array(Rb),taskOutcomes:A.array(hm).optional(),aggregates:Db.optional(),lastUpdated:A.string(),lastAggregated:A.string().optional()}),ym={outcomes:[],taskOutcomes:[],lastUpdated:""},wm=l((s,e)=>{let t=e-s,n=s>0?(e-s)/s*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),km=l((s,e)=>e<=0?s*10:Math.round(s*10/e*100)/100,"calculateROIScore"),Sm=l(s=>s>=100?"exceeded":s>=80?"met":s>=50?"partial":"failed","determineSuccessLevel"),$b=l(s=>Math.max(0,100-Math.abs(s)),"calculateEstimationAccuracy"),hi=l(s=>{if(s.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=s.map(d=>$b(d.effort.variance.percentage)),t=s.filter(d=>d.success).map(d=>d.success.successScore),n=s.map(d=>d.roi.roiScore),r={exceeded:s.filter(d=>d.success?.overallSuccess==="exceeded").length,met:s.filter(d=>d.success?.overallSuccess==="met").length,partial:s.filter(d=>d.success?.overallSuccess==="partial").length,failed:s.filter(d=>d.success?.overallSuccess==="failed").length},o=s.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=s.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:s.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Qe}from"zod";function Lb(){let s={};for(let e of Fb)s[e]="allow";for(let e of Nb)s[e]="ask";for(let e of _b)s[e]="deny";return{bash:s,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var yi,c0,Mb,qc,Ob,l0,Fb,Nb,_b,u0,bm=y(()=>{"use strict";yi=Qe.enum(["allow","deny","ask"]),c0=Qe.enum(["read","write","delete","create"]),Mb=Qe.record(Qe.string(),yi),qc=Qe.record(Qe.string(),yi),Ob=Qe.object({enabled:Qe.boolean().default(!0),allowedDomains:Qe.array(Qe.string()).optional(),blockedDomains:Qe.array(Qe.string()).optional()}),l0=Qe.object({bash:Mb.optional(),files:Qe.object({read:qc.optional(),write:qc.optional(),delete:qc.optional()}).optional(),web:Ob.optional(),skills:Qe.record(Qe.string(),yi).optional(),doomLoop:Qe.object({enabled:Qe.boolean().default(!0),maxRetries:Qe.number().default(3)}).optional(),externalDirectories:yi.default("ask")}),Fb=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Nb=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],_b=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Lb,"buildDefaultPermissions");u0=Lb()});import{z as vt}from"zod";var g0,f0,vm=y(()=>{"use strict";g0=vt.object({projectId:vt.string(),name:vt.string(),repoPath:vt.string(),description:vt.string().optional(),version:vt.string().optional(),cliVersion:vt.string().optional(),techStack:vt.array(vt.string()),fileCount:vt.number(),commitCount:vt.number(),createdAt:vt.string(),lastSync:vt.string(),lastSyncCommit:vt.string().optional(),lastSyncBranch:vt.string().optional()}),f0={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as j}from"zod";var Ub,Hb,Gb,Wb,zb,Vb,Bb,Jb,qb,Kb,Xb,Yb,Qb,Zb,ev,tv,nv,sv,k0,S0,Cm=y(()=>{"use strict";Ub=j.enum(["planned","active","completed","shipped"]),Hb=j.enum(["low","medium","high"]),Gb=j.enum(["feature","breaking_change","refactor","infrastructure"]),Wb=j.enum(["completed","active","planned"]),zb=j.enum(["planned","active","completed"]),Vb=j.enum(["git","git-branch","manual","prd"]),Bb=j.object({id:j.string(),description:j.string(),completed:j.boolean(),completedAt:j.string().optional()}),Jb=j.object({id:j.string(),name:j.string(),status:Wb,completedAt:j.string().optional()}),qb=j.object({goal:j.string(),phases:j.array(Jb),successMetrics:j.array(j.string()).optional()}),Kb=j.object({hours:j.number(),minutes:j.number(),totalMinutes:j.number(),display:j.string().optional()}),Xb=j.object({hash:j.string(),message:j.string(),date:j.string(),author:j.string().optional()}),Yb=j.object({hours:j.number(),confidence:j.enum(["low","medium","high"]).optional(),breakdown:j.array(j.object({area:j.string(),hours:j.number()})).optional()}),Qb=j.object({hours:j.number().optional(),commits:j.number().optional(),linesAdded:j.number().optional(),linesRemoved:j.number().optional()}),Zb=j.object({estimated:Yb.nullable(),actual:Qb.nullable()}),ev=j.object({totalHours:j.number(),allocatedHours:j.number(),bufferPercent:j.number().optional()}),tv=j.object({id:j.string(),name:j.string(),theme:j.string().optional(),goals:j.array(j.string()).optional(),features:j.array(j.string()),capacity:ev.optional(),status:zb,startDate:j.string().optional(),endDate:j.string().optional()}),nv=j.object({id:j.string(),name:j.string(),description:j.string().optional(),date:j.string(),status:Ub,impact:Hb,effort:j.string().optional(),progress:j.number(),type:Gb.optional(),roi:j.number().optional(),why:j.array(j.string()).optional(),technicalNotes:j.array(j.string()).optional(),compatibility:j.string().optional(),phase:j.string().optional(),tasks:j.array(Bb),createdAt:j.string(),shippedAt:j.string().optional(),version:j.string().optional(),duration:Kb.optional(),taskCount:j.number().optional(),agent:j.string().optional(),sprintName:j.string().optional(),completedDate:j.string().optional(),prdId:j.string().nullable().optional(),legacy:j.boolean().optional(),inferredFrom:Vb.optional(),quarter:j.string().nullable().optional(),dependencies:j.array(j.string()).optional(),blockedBy:j.array(j.string()).optional(),effortTracking:Zb.optional(),valueScore:j.number().optional(),commits:j.array(Xb).optional(),branch:j.string().optional(),commitsAhead:j.number().optional()}),sv=j.object({id:j.string(),title:j.string(),prdId:j.string().nullable().optional(),valueScore:j.number().optional(),effortEstimate:j.number().optional(),reason:j.string().optional()}),k0=j.object({strategy:qb.nullable().optional(),features:j.array(nv),backlog:j.array(j.union([j.string(),sv])),lastUpdated:j.string(),quarters:j.array(tv).optional(),generatedFrom:j.enum(["git-history","manual","prd"]).optional(),generatedAt:j.string().optional()}),S0={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import rv from"node:crypto";import{homedir as ov}from"node:os";import{join as iv}from"node:path";function ve(){return rv.randomUUID()}var av,xm=y(()=>{"use strict";l(ve,"generateUUID");av=iv(ov(),".prjct-cli","projects")});import{z as yt}from"zod";var I0,Pm=y(()=>{"use strict";I0=yt.object({sessionId:yt.string(),projectId:yt.string(),projectPath:yt.string(),projectName:yt.string().optional(),taskDescription:yt.string(),taskStatus:yt.enum(["active","paused"]),activeSubtaskIndex:yt.number().optional(),subtaskCount:yt.number().optional(),branch:yt.string().optional(),linearId:yt.string().optional(),filesModified:yt.array(yt.string()).optional(),durationWorkedSec:yt.number().optional(),timestamp:yt.string(),resumeHint:yt.string()})});import{z as te}from"zod";var cv,Tm,lv,uv,dv,pv,mv,gv,fv,Em,Kc=y(()=>{"use strict";cv=te.enum(["feature","fix","improvement","refactor"]),Tm=te.enum(["pass","warning","fail","skipped"]),lv=te.enum(["added","changed","fixed","removed"]),uv=te.object({hours:te.number(),minutes:te.number(),totalMinutes:te.number()}),dv=te.object({filesChanged:te.number().nullable().optional(),linesAdded:te.number().nullable().optional(),linesRemoved:te.number().nullable().optional(),commits:te.number().nullable().optional()}),pv=te.object({description:te.string(),type:lv.optional()}),mv=te.object({lintStatus:Tm.nullable().optional(),lintDetails:te.string().optional(),testStatus:Tm.nullable().optional(),testDetails:te.string().optional()}),gv=te.object({hash:te.string().optional(),message:te.string().optional(),branch:te.string().optional()}),fv=te.object({id:te.string(),name:te.string(),version:te.string().nullable().optional(),type:cv,agent:te.string().optional(),description:te.string().optional(),changes:te.array(pv).optional(),codeSnippets:te.array(te.string()).optional(),commit:gv.optional(),codeMetrics:dv.optional(),qualityMetrics:mv.optional(),quantitativeImpact:te.string().optional(),duration:uv.optional(),tasksCompleted:te.number().nullable().optional(),shippedAt:te.string(),featureId:te.string().optional()}),Em=te.object({shipped:te.array(fv),lastUpdated:te.string()})});import{z as T}from"zod";var hv,Xc,yv,wv,kv,Yc,Im,Sv,bv,jm,Am,vv,Cv,Rm,Dm,$m,xv,Pv,F0,wi=y(()=>{"use strict";Qr();hv=T.enum(["low","medium","high","critical"]),Xc=T.enum(["feature","bug","improvement","chore"]),yv=T.enum(["active","backlog","previously_active"]),wv=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),kv=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Yc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),Im=T.object({output:T.string().min(1,"Subtask output is required"),summary:Yc}),Sv=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:wv,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:Yc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),bv=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),jm=T.object({id:T.string(),description:T.string(),type:Xc.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Sv).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:bv.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:Yr.optional()}),Am=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),vv=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),Cv=T.object({taskId:T.string(),title:T.string(),classification:Xc,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(Yc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:vv.optional()}),Rm=T.object({currentTask:jm.nullable(),previousTask:Am.nullable().optional(),pausedTasks:T.array(Am).optional(),taskHistory:T.array(Cv).optional(),lastUpdated:T.string()}),Dm=T.object({id:T.string(),description:T.string(),priority:hv,type:Xc,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:yv,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),$m=T.object({tasks:T.array(Dm),lastUpdated:T.string()}),xv=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),Pv=T.object({type:kv,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),F0=T.object({projectId:T.string(),currentTask:jm.nullable(),queue:T.array(Dm),stats:xv,recentActivity:T.array(Pv),lastSync:T.string()})});import{z as pe}from"zod";var Tv,Ev,Mm,U0,H0,G0,Vn,Om,Ks=y(()=>{"use strict";Tv=pe.enum(["improving","stable","declining"]),Ev=pe.object({sprintNumber:pe.number(),startDate:pe.string(),endDate:pe.string(),pointsCompleted:pe.number(),tasksCompleted:pe.number(),avgVariance:pe.number(),estimationAccuracy:pe.number()}),Mm=pe.object({category:pe.string(),avgVariance:pe.number(),taskCount:pe.number()}),U0=pe.object({totalPoints:pe.number(),sprints:pe.number(),estimatedDate:pe.string()}),H0=pe.object({sprints:pe.array(Ev),averageVelocity:pe.number(),velocityTrend:Tv,estimationAccuracy:pe.number(),overEstimated:pe.array(Mm),underEstimated:pe.array(Mm),lastUpdated:pe.string()}),G0=pe.object({sprintLengthDays:pe.number().min(1).max(90).default(7),startDay:pe.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:pe.number().min(1).max(52).default(6),accuracyTolerance:pe.number().min(0).max(100).default(20)}),Vn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Om={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var qt=y(()=>{"use strict";nm();Gc();so();zc();Vc();fi();Qr();Jc();bm();vm();Cm();xm();Pm();Kc();wi();Ks()});var gn,Qc,$t,Bn=y(()=>{"use strict";qt();ce();le();gn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Qc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ve(),r=C();return I.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return I.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ve(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?I.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):I.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=I.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=I.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(I.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);I.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return I.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},$t=new Qc});var Fm=y(()=>{"use strict"});var ki,Nm=y(()=>{"use strict";ki={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Xs,Si=y(()=>{"use strict";Xs={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var _m=y(()=>{"use strict"});var Lm=y(()=>{"use strict";_m()});function bi(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var F,Um,Ys=y(()=>{"use strict";F={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Um=["frontend","backend","devops","docs","testing","database","general"];l(bi,"calculateConfidence")});var Zc=y(()=>{"use strict"});var el=y(()=>{"use strict";Fm();Nm();Si();_();Lm();Ys();Zc()});function Qs(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return Rv[s]}var ae,tl,nl,vi,Rv,Lt,Hm,Jn=y(()=>{"use strict";ae={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},tl=["feature","spec","design","refactor","migrate"],nl=["ship","cleanup","git","migrate"],vi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Rv={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Qs,"getTimeout");Lt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},Hm={HISTORY_MAX:100}});function $v(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if(Dv.has(s)||s.includes("prjct"))return{level:Zs.debug,name:"debug"};let e=Zs[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function Ci(s,e,t){return Gm>=s?(...n)=>console[t](e,...n):Ov}var Zs,Dv,Gm,Mv,Ov,Fv,G,qn=y(()=>{"use strict";Zs={error:0,warn:1,info:2,debug:3},Dv=new Set(["1","true","*"]);l($v,"getLogLevel");({level:Gm,name:Mv}=$v()),Ov=l(()=>{},"noop");l(Ci,"createLogMethod");Fv={error:Ci(Zs.error,"[prjct:error]","error"),warn:Ci(Zs.warn,"[prjct:warn]","warn"),info:Ci(Zs.info,"[prjct:info]","log"),debug:Ci(Zs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Gm>=0,"isEnabled"),level:l(()=>Mv,"level")},G=Fv});var xi,Nv,Wm=y(()=>{"use strict";An();le();el();Jn();qn();xi=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Hm.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),r={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).forEach(u=>{u.status==="rejected"&&G.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(ki.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let r=this.listeners.get(ki.ALL);r&&t.push(...r);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw G.error("Event callback error:",n),n}}async logEvent(e){try{I.appendEvent(this.projectId,e.type,e)}catch(t){G.debug("Failed to log event:",se(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(r=>r.type===t||r.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Nv=new xi});var Pi,Ti,zm=y(()=>{"use strict";Te();ce();Ie();Pi=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await dn(t,[])??[];n.push(e),await is(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await dn(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await is(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:C(),success:!0};await is(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await dn(t,null)}},Ti=new Pi});var sl=y(()=>{"use strict";Wm();zm()});var Kt,Ei=y(()=>{"use strict";Kt=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Ze,fn=y(()=>{"use strict";sl();Ei();ce();le();Ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Kt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=I.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){I.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Ti.publish(r)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:C()};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 rl,at,ro=y(()=>{"use strict";qt();zc();ce();Bn();fn();rl=class extends Ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",im)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:ve(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Gn(gn.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;$t.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},at=new rl});var ol,Ee,er=y(()=>{"use strict";qt();wi();ce();Bn();fn();ol=class extends Ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",$m)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ve(),createdAt:C(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),r=t.map(o=>({...o,id:ve(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Gn(gn.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;$t.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((r,o)=>{let i=n[r.section]-n[o.section];if(i!==0)return i;let a=t[r.priority]-t[o.priority];return a!==0?a:new Date(r.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Ee=new ol});var il,Et,oo=y(()=>{"use strict";qt();Kc();ce();Bn();fn();il=class extends Ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Em)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ve(),shippedAt:C()};return await this.update(e,r=>({shipped:[n,...r.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-10080*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Gn(gn.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;$t.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},Et=new il});var io,al,us,cl=y(()=>{"use strict";io={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},al=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=io[e];if(n.transitions.includes(t))return{valid:!0};let r=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return io[e]}getPrompt(e){return io[e].prompt}getValidCommands(e){return io[e].transitions}formatNextSteps(e){return io[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},us=new al});var ll,U,tr=y(()=>{"use strict";qt();wi();ce();cl();Bn();fn();ll=class extends Ze{static{l(this,"StateStorage")}constructor(){super("state.json",Rm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=us.getCurrentState(e),r=us.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:r.parentDescription||e.description,classification:r.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:r.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:r.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let r={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let n=await this.read(e),r=this.getPausedTasksFromState(n);if(r.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(u=>u.id===t),o===-1))return null;let i=r[o],a=r.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:ve()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){return e.pausedTasks||[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];$t.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&r.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Im.safeParse(t);if(!n.success){let h=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
321
|
+
`)}return"(see example above)"}function pm(s){return s instanceof nt.ZodString?"string":s instanceof nt.ZodNumber?"number":s instanceof nt.ZodEnum?`one of: ${s.options.join(", ")}`:s instanceof nt.ZodArray?`array of ${pm(s.element)}`:s instanceof nt.ZodObject?"object":"any"}var lm,um,dm,fi=y(()=>{"use strict";so();so();lm=nt.object({agentName:nt.string(),reasoning:nt.string(),confidence:nt.number().min(0).max(1)}),um=nt.object({subtasks:nt.array(nt.object({description:nt.string(),domain:gi,agent:nt.string(),dependsOn:nt.array(nt.number())})),effort:nt.enum(["low","medium","high"])}),dm={classification:{schema:zn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:lm,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:um,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(Bc,"renderSchemaForPrompt");l(bb,"describeSchema");l(pm,"describeField")});import{z as A}from"zod";var gm,vb,Cb,fm,xb,Pb,Tb,Eb,Ab,Ib,jb,hm,Rb,Db,r0,ym,wm,km,Sm,$b,hi,Jc=y(()=>{"use strict";gm=A.number().min(1).max(5),vb=A.enum(["exceeded","met","partial","failed"]),Cb=A.enum(["definitely","probably","maybe","no"]),fm=A.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),xb=A.object({estimated:A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),source:A.enum(["prd","manual","historical"]).optional()}),actual:A.object({hours:A.number(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional(),sessions:A.number().optional()}),variance:A.object({hours:A.number(),percentage:A.number(),reason:fm.optional(),explanation:A.string().optional()})}),Pb=A.object({name:A.string(),baseline:A.number().nullable(),target:A.number(),actual:A.number(),unit:A.string(),achieved:A.boolean(),percentOfTarget:A.number()}),Tb=A.object({criteria:A.string(),met:A.boolean(),notes:A.string().optional()}),Eb=A.object({metrics:A.array(Pb),acceptanceCriteria:A.array(Tb),overallSuccess:vb,successScore:A.number().min(0).max(100)}),Ab=A.object({category:A.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:A.string(),actionable:A.boolean(),action:A.string().optional()}),Ib=A.object({whatWorked:A.array(A.string()),whatDidnt:A.array(A.string()),surprises:A.array(A.string()),recommendations:A.array(Ab)}),jb=A.object({valueDelivered:A.number().min(1).max(10),userImpact:A.enum(["none","low","medium","high","critical"]),businessImpact:A.enum(["none","low","medium","high","critical"]),roiScore:A.number(),worthIt:Cb,worthItReason:A.string().optional(),alternativeConsidered:A.string().optional(),betterAlternativeExists:A.boolean().optional()}),hm=A.object({id:A.string(),taskId:A.string(),description:A.string(),estimatedMinutes:A.number().optional(),actualMinutes:A.number(),completedAsPlanned:A.boolean(),qualityScore:gm,blockers:A.array(A.string()),agentUsed:A.string().optional(),skillsUsed:A.array(A.string()).optional(),startedAt:A.string(),completedAt:A.string()}),Rb=A.object({id:A.string(),featureId:A.string(),featureName:A.string(),prdId:A.string().nullable(),version:A.string().optional(),branch:A.string().optional(),prUrl:A.string().optional(),effort:xb,success:Eb.optional(),learnings:Ib,roi:jb,rating:gm,taskOutcomes:A.array(hm).optional(),startedAt:A.string(),shippedAt:A.string(),reviewedAt:A.string().optional(),reviewedBy:A.string().optional(),legacy:A.boolean().optional()}),Db=A.object({totalFeatures:A.number(),averageEstimationAccuracy:A.number(),averageSuccessRate:A.number(),averageROI:A.number(),bySuccessLevel:A.object({exceeded:A.number(),met:A.number(),partial:A.number(),failed:A.number()}),variancePatterns:A.array(A.object({reason:fm,count:A.number(),averageVariance:A.number()})),topLearnings:A.array(A.object({insight:A.string(),frequency:A.number()}))}),r0=A.object({outcomes:A.array(Rb),taskOutcomes:A.array(hm).optional(),aggregates:Db.optional(),lastUpdated:A.string(),lastAggregated:A.string().optional()}),ym={outcomes:[],taskOutcomes:[],lastUpdated:""},wm=l((s,e)=>{let t=e-s,n=s>0?(e-s)/s*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),km=l((s,e)=>e<=0?s*10:Math.round(s*10/e*100)/100,"calculateROIScore"),Sm=l(s=>s>=100?"exceeded":s>=80?"met":s>=50?"partial":"failed","determineSuccessLevel"),$b=l(s=>Math.max(0,100-Math.abs(s)),"calculateEstimationAccuracy"),hi=l(s=>{if(s.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=s.map(d=>$b(d.effort.variance.percentage)),t=s.filter(d=>d.success).map(d=>d.success.successScore),n=s.map(d=>d.roi.roiScore),r={exceeded:s.filter(d=>d.success?.overallSuccess==="exceeded").length,met:s.filter(d=>d.success?.overallSuccess==="met").length,partial:s.filter(d=>d.success?.overallSuccess==="partial").length,failed:s.filter(d=>d.success?.overallSuccess==="failed").length},o=s.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=s.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:s.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Qe}from"zod";function Lb(){let s={};for(let e of Fb)s[e]="allow";for(let e of Nb)s[e]="ask";for(let e of _b)s[e]="deny";return{bash:s,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var yi,c0,Mb,qc,Ob,l0,Fb,Nb,_b,u0,bm=y(()=>{"use strict";yi=Qe.enum(["allow","deny","ask"]),c0=Qe.enum(["read","write","delete","create"]),Mb=Qe.record(Qe.string(),yi),qc=Qe.record(Qe.string(),yi),Ob=Qe.object({enabled:Qe.boolean().default(!0),allowedDomains:Qe.array(Qe.string()).optional(),blockedDomains:Qe.array(Qe.string()).optional()}),l0=Qe.object({bash:Mb.optional(),files:Qe.object({read:qc.optional(),write:qc.optional(),delete:qc.optional()}).optional(),web:Ob.optional(),skills:Qe.record(Qe.string(),yi).optional(),doomLoop:Qe.object({enabled:Qe.boolean().default(!0),maxRetries:Qe.number().default(3)}).optional(),externalDirectories:yi.default("ask")}),Fb=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Nb=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],_b=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Lb,"buildDefaultPermissions");u0=Lb()});import{z as vt}from"zod";var g0,f0,vm=y(()=>{"use strict";g0=vt.object({projectId:vt.string(),name:vt.string(),repoPath:vt.string(),description:vt.string().optional(),version:vt.string().optional(),cliVersion:vt.string().optional(),techStack:vt.array(vt.string()),fileCount:vt.number(),commitCount:vt.number(),createdAt:vt.string(),lastSync:vt.string(),lastSyncCommit:vt.string().optional(),lastSyncBranch:vt.string().optional()}),f0={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as j}from"zod";var Ub,Hb,Gb,Wb,zb,Vb,Bb,Jb,qb,Kb,Xb,Yb,Qb,Zb,ev,tv,nv,sv,k0,S0,Cm=y(()=>{"use strict";Ub=j.enum(["planned","active","completed","shipped"]),Hb=j.enum(["low","medium","high"]),Gb=j.enum(["feature","breaking_change","refactor","infrastructure"]),Wb=j.enum(["completed","active","planned"]),zb=j.enum(["planned","active","completed"]),Vb=j.enum(["git","git-branch","manual","prd"]),Bb=j.object({id:j.string(),description:j.string(),completed:j.boolean(),completedAt:j.string().optional()}),Jb=j.object({id:j.string(),name:j.string(),status:Wb,completedAt:j.string().optional()}),qb=j.object({goal:j.string(),phases:j.array(Jb),successMetrics:j.array(j.string()).optional()}),Kb=j.object({hours:j.number(),minutes:j.number(),totalMinutes:j.number(),display:j.string().optional()}),Xb=j.object({hash:j.string(),message:j.string(),date:j.string(),author:j.string().optional()}),Yb=j.object({hours:j.number(),confidence:j.enum(["low","medium","high"]).optional(),breakdown:j.array(j.object({area:j.string(),hours:j.number()})).optional()}),Qb=j.object({hours:j.number().optional(),commits:j.number().optional(),linesAdded:j.number().optional(),linesRemoved:j.number().optional()}),Zb=j.object({estimated:Yb.nullable(),actual:Qb.nullable()}),ev=j.object({totalHours:j.number(),allocatedHours:j.number(),bufferPercent:j.number().optional()}),tv=j.object({id:j.string(),name:j.string(),theme:j.string().optional(),goals:j.array(j.string()).optional(),features:j.array(j.string()),capacity:ev.optional(),status:zb,startDate:j.string().optional(),endDate:j.string().optional()}),nv=j.object({id:j.string(),name:j.string(),description:j.string().optional(),date:j.string(),status:Ub,impact:Hb,effort:j.string().optional(),progress:j.number(),type:Gb.optional(),roi:j.number().optional(),why:j.array(j.string()).optional(),technicalNotes:j.array(j.string()).optional(),compatibility:j.string().optional(),phase:j.string().optional(),tasks:j.array(Bb),createdAt:j.string(),shippedAt:j.string().optional(),version:j.string().optional(),duration:Kb.optional(),taskCount:j.number().optional(),agent:j.string().optional(),sprintName:j.string().optional(),completedDate:j.string().optional(),prdId:j.string().nullable().optional(),legacy:j.boolean().optional(),inferredFrom:Vb.optional(),quarter:j.string().nullable().optional(),dependencies:j.array(j.string()).optional(),blockedBy:j.array(j.string()).optional(),effortTracking:Zb.optional(),valueScore:j.number().optional(),commits:j.array(Xb).optional(),branch:j.string().optional(),commitsAhead:j.number().optional()}),sv=j.object({id:j.string(),title:j.string(),prdId:j.string().nullable().optional(),valueScore:j.number().optional(),effortEstimate:j.number().optional(),reason:j.string().optional()}),k0=j.object({strategy:qb.nullable().optional(),features:j.array(nv),backlog:j.array(j.union([j.string(),sv])),lastUpdated:j.string(),quarters:j.array(tv).optional(),generatedFrom:j.enum(["git-history","manual","prd"]).optional(),generatedAt:j.string().optional()}),S0={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import rv from"node:crypto";import{homedir as ov}from"node:os";import{join as iv}from"node:path";function ve(){return rv.randomUUID()}var av,xm=y(()=>{"use strict";l(ve,"generateUUID");av=iv(ov(),".prjct-cli","projects")});import{z as yt}from"zod";var I0,Pm=y(()=>{"use strict";I0=yt.object({sessionId:yt.string(),projectId:yt.string(),projectPath:yt.string(),projectName:yt.string().optional(),taskDescription:yt.string(),taskStatus:yt.enum(["active","paused"]),activeSubtaskIndex:yt.number().optional(),subtaskCount:yt.number().optional(),branch:yt.string().optional(),linearId:yt.string().optional(),filesModified:yt.array(yt.string()).optional(),durationWorkedSec:yt.number().optional(),timestamp:yt.string(),resumeHint:yt.string()})});import{z as te}from"zod";var cv,Tm,lv,uv,dv,pv,mv,gv,fv,Em,Kc=y(()=>{"use strict";cv=te.enum(["feature","fix","improvement","refactor"]),Tm=te.enum(["pass","warning","fail","skipped"]),lv=te.enum(["added","changed","fixed","removed"]),uv=te.object({hours:te.number(),minutes:te.number(),totalMinutes:te.number()}),dv=te.object({filesChanged:te.number().nullable().optional(),linesAdded:te.number().nullable().optional(),linesRemoved:te.number().nullable().optional(),commits:te.number().nullable().optional()}),pv=te.object({description:te.string(),type:lv.optional()}),mv=te.object({lintStatus:Tm.nullable().optional(),lintDetails:te.string().optional(),testStatus:Tm.nullable().optional(),testDetails:te.string().optional()}),gv=te.object({hash:te.string().optional(),message:te.string().optional(),branch:te.string().optional()}),fv=te.object({id:te.string(),name:te.string(),version:te.string().nullable().optional(),type:cv,agent:te.string().optional(),description:te.string().optional(),changes:te.array(pv).optional(),codeSnippets:te.array(te.string()).optional(),commit:gv.optional(),codeMetrics:dv.optional(),qualityMetrics:mv.optional(),quantitativeImpact:te.string().optional(),duration:uv.optional(),tasksCompleted:te.number().nullable().optional(),shippedAt:te.string(),featureId:te.string().optional()}),Em=te.object({shipped:te.array(fv),lastUpdated:te.string()})});import{z as T}from"zod";var hv,Xc,yv,wv,kv,Yc,Im,Sv,bv,jm,Am,vv,Cv,Rm,Dm,$m,xv,Pv,F0,wi=y(()=>{"use strict";Qr();hv=T.enum(["low","medium","high","critical"]),Xc=T.enum(["feature","bug","improvement","chore"]),yv=T.enum(["active","backlog","previously_active"]),wv=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),kv=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Yc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),Im=T.object({output:T.string().min(1,"Subtask output is required"),summary:Yc}),Sv=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:wv,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:Yc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),bv=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),jm=T.object({id:T.string(),description:T.string(),type:Xc.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Sv).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:bv.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:Yr.optional()}),Am=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),vv=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),Cv=T.object({taskId:T.string(),title:T.string(),classification:Xc,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(Yc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:vv.optional()}),Rm=T.object({currentTask:jm.nullable(),previousTask:Am.nullable().optional(),pausedTasks:T.array(Am).optional(),taskHistory:T.array(Cv).optional(),lastUpdated:T.string()}),Dm=T.object({id:T.string(),description:T.string(),priority:hv,type:Xc,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:yv,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),$m=T.object({tasks:T.array(Dm),lastUpdated:T.string()}),xv=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),Pv=T.object({type:kv,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),F0=T.object({projectId:T.string(),currentTask:jm.nullable(),queue:T.array(Dm),stats:xv,recentActivity:T.array(Pv),lastSync:T.string()})});import{z as pe}from"zod";var Tv,Ev,Mm,U0,H0,G0,Vn,Om,Ks=y(()=>{"use strict";Tv=pe.enum(["improving","stable","declining"]),Ev=pe.object({sprintNumber:pe.number(),startDate:pe.string(),endDate:pe.string(),pointsCompleted:pe.number(),tasksCompleted:pe.number(),avgVariance:pe.number(),estimationAccuracy:pe.number()}),Mm=pe.object({category:pe.string(),avgVariance:pe.number(),taskCount:pe.number()}),U0=pe.object({totalPoints:pe.number(),sprints:pe.number(),estimatedDate:pe.string()}),H0=pe.object({sprints:pe.array(Ev),averageVelocity:pe.number(),velocityTrend:Tv,estimationAccuracy:pe.number(),overEstimated:pe.array(Mm),underEstimated:pe.array(Mm),lastUpdated:pe.string()}),G0=pe.object({sprintLengthDays:pe.number().min(1).max(90).default(7),startDay:pe.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:pe.number().min(1).max(52).default(6),accuracyTolerance:pe.number().min(0).max(100).default(20)}),Vn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Om={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var qt=y(()=>{"use strict";nm();Gc();so();zc();Vc();fi();Qr();Jc();bm();vm();Cm();xm();Pm();Kc();wi();Ks()});var gn,Qc,$t,Bn=y(()=>{"use strict";qt();ce();le();gn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Qc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ve(),r=C();return I.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return I.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ve(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?I.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):I.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=I.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=I.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(I.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);I.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return I.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},$t=new Qc});var Fm=y(()=>{"use strict"});var ki,Nm=y(()=>{"use strict";ki={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Xs,Si=y(()=>{"use strict";Xs={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var _m=y(()=>{"use strict"});var Lm=y(()=>{"use strict";_m()});function bi(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var F,Um,Ys=y(()=>{"use strict";F={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Um=["frontend","backend","devops","docs","testing","database","general"];l(bi,"calculateConfidence")});var Zc=y(()=>{"use strict"});var el=y(()=>{"use strict";Fm();Nm();Si();_();Lm();Ys();Zc()});function Qs(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return Rv[s]}var ae,tl,nl,vi,Rv,Lt,Hm,Jn=y(()=>{"use strict";ae={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},tl=["feature","spec","design","refactor","migrate"],nl=["ship","cleanup","git","migrate"],vi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Rv={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Qs,"getTimeout");Lt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},Hm={HISTORY_MAX:100}});function $v(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if(Dv.has(s)||s.includes("prjct"))return{level:Zs.debug,name:"debug"};let e=Zs[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function Ci(s,e,t){return Gm>=s?(...n)=>console[t](e,...n):Ov}var Zs,Dv,Gm,Mv,Ov,Fv,G,qn=y(()=>{"use strict";Zs={error:0,warn:1,info:2,debug:3},Dv=new Set(["1","true","*"]);l($v,"getLogLevel");({level:Gm,name:Mv}=$v()),Ov=l(()=>{},"noop");l(Ci,"createLogMethod");Fv={error:Ci(Zs.error,"[prjct:error]","error"),warn:Ci(Zs.warn,"[prjct:warn]","warn"),info:Ci(Zs.info,"[prjct:info]","log"),debug:Ci(Zs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Gm>=0,"isEnabled"),level:l(()=>Mv,"level")},G=Fv});var xi,Nv,Wm=y(()=>{"use strict";An();le();el();Jn();qn();xi=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Hm.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),r={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).forEach(u=>{u.status==="rejected"&&G.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(ki.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let r=this.listeners.get(ki.ALL);r&&t.push(...r);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw G.error("Event callback error:",n),n}}async logEvent(e){try{I.appendEvent(this.projectId,e.type,e)}catch(t){G.debug("Failed to log event:",se(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(r=>r.type===t||r.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Nv=new xi});var Pi,Ti,zm=y(()=>{"use strict";Te();ce();Ie();Pi=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await dn(t,[])??[];n.push(e),await is(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await dn(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await is(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:C(),success:!0};await is(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await dn(t,null)}},Ti=new Pi});var sl=y(()=>{"use strict";Wm();zm()});var Kt,Ei=y(()=>{"use strict";Kt=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Ze,fn=y(()=>{"use strict";sl();Ei();ce();le();Ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Kt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=I.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){I.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Ti.publish(r)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:C()};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 rl,at,ro=y(()=>{"use strict";qt();zc();ce();Bn();fn();rl=class extends Ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",im)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:ve(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Gn(gn.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;$t.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},at=new rl});var ol,Ee,er=y(()=>{"use strict";qt();wi();ce();Bn();fn();ol=class extends Ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",$m)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ve(),createdAt:C(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),r=t.map(o=>({...o,id:ve(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Gn(gn.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;$t.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((r,o)=>{let i=n[r.section]-n[o.section];if(i!==0)return i;let a=t[r.priority]-t[o.priority];return a!==0?a:new Date(r.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Ee=new ol});var il,Et,oo=y(()=>{"use strict";qt();Kc();ce();Bn();fn();il=class extends Ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Em)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ve(),shippedAt:C()};return await this.update(e,r=>({shipped:[n,...r.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-10080*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Gn(gn.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;$t.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},Et=new il});var io,al,us,cl=y(()=>{"use strict";io={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},al=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=io[e];if(n.transitions.includes(t))return{valid:!0};let r=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return io[e]}getPrompt(e){return io[e].prompt}getValidCommands(e){return io[e].transitions}formatNextSteps(e){return io[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},us=new al});var ll,U,tr=y(()=>{"use strict";qt();wi();ce();cl();Bn();fn();ll=class extends Ze{static{l(this,"StateStorage")}constructor(){super("state.json",Rm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=us.getCurrentState(e),r=us.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:r.parentDescription||e.description,classification:r.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:r.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:r.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let r={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let n=await this.read(e),r=this.getPausedTasksFromState(n);if(r.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(u=>u.id===t),o===-1))return null;let i=r[o],a=r.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:ve()};return await this.update(e,u=>({...u,currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){return e.pausedTasks||[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];$t.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&r.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Im.safeParse(t);if(!n.success){let h=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
322
322
|
${h.join(`
|
|
323
323
|
`)}`)}let{output:r,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:r,summary:o};let d=u.filter(h=>h.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},U=new ll});import Lv from"node:fs/promises";import Uv from"node:path";import{Hono as Hv}from"hono";function Gv(s){return E.getGlobalProjectPath(s)}function Vm(s,e){let t=new Hv,n=Gv(s);return t.get("/state",async r=>{let o=await U.read(s);return r.json(o)}),t.get("/queue",async r=>{let o=await Ee.read(s);return r.json(o)}),t.get("/ideas",async r=>{let o=await at.read(s);return r.json(o)}),t.get("/roadmap",async r=>{let o=I.getDoc(s,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await Et.read(s);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([U.read(s),Ee.read(s),at.read(s),Et.read(s)]),u=I.getDoc(s,"roadmap");return r.json({projectId:s,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await U.write(s,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=Uv.join(n,"context",`${o}.md`),c=await Lv.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return x(a)||G.error(`Context read error: ${w(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}var Bm=y(()=>{"use strict";Te();le();ro();er();oo();tr();_();qn();l(Gv,"getProjectDataPath");l(Vm,"createRoutes")});import nr from"node:fs/promises";import Wv from"node:path";import{Hono as zv}from"hono";function Ai(s){return I.getDoc(s,"project")}async function ul(s){if(!s)return"";let e=new Date(s),n=new Date().getTime()-e.getTime(),r=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}function Jm(){let s=new zv;return s.get("/projects",async e=>{try{await nr.mkdir(sr,{recursive:!0});let n=(await nr.readdir(sr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(n.map(async o=>{let i=Ai(o),a=await U.read(o),c=await Ee.read(o),u=await at.read(o),d=await Et.read(o),m=a?.currentTask,p=await ul(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),s.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,r,o,i,a]=await Promise.all([Promise.resolve(Ai(t)),U.read(t),Ee.read(t),at.read(t),Et.read(t)]),c=I.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await ul(r.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=d)?.length||0,g=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:r||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(h=>!h.completed)?.length||0,ideasCount:i?.ideas?.filter(h=>h.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),s.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await U.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await U.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,o=await U.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:r},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await U.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await U.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await U.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:r}=n;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([U.read(t),Ee.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===r);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await U.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=n;if(!r)return e.json({success:!1,error:"text required"},400);let a=await at.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.get("/stats/global",async e=>{try{await nr.mkdir(sr,{recursive:!0});let n=(await nr.readdir(sr,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of n){let u=await U.read(c),d=await Ee.read(c),m=await at.read(c),p=await Et.read(c);u?.currentTask&&a++,r+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await nr.mkdir(sr,{recursive:!0});let r=(await nr.readdir(sr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Ai(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await U.read(d),p=Ai(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await ul(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s}var Vv,sr,qm=y(()=>{"use strict";Te();le();ro();er();oo();tr();Vv=E.getGlobalBasePath(),sr=Wv.join(Vv,"projects");l(Ai,"getProjectConfig");l(ul,"calculateDuration");l(Jm,"createExtendedRoutes")});import{streamSSE as Bv}from"hono/streaming";function Xm(){let s=new Map,e=null;function t(o){let i=s.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),s.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of s)o-new Date(a.client.connectedAt).getTime()>Km&&t(i)},Jv),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),n(),{handleConnection(o){return Bv(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},qv),p=setTimeout(()=>{t(a)},Km);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),s.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of s)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return s.size},shutdown(){r();for(let o of[...s.keys()])t(o)}}}var Km,Jv,qv,Ym=y(()=>{"use strict";Zc();Km=3600*1e3,Jv=300*1e3,qv=3e4;l(Xm,"createSSEManager")});var Qm={};xe(Qm,{DEFAULT_PORT:()=>ji,createServer:()=>Ii,startServer:()=>Qv});import{Hono as Kv}from"hono";import{cors as Xv}from"hono/cors";import{logger as Yv}from"hono/logger";function Ii(s){let e=new Kv,t=Xm();s.enableCors!==!1&&e.use("*",Xv({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),s.enableLogging!==!1&&e.use("*",Yv()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:ye,projectId:s.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Vm(s.projectId,s.projectPath);e.route("/api",n);let r=Jm();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=s.port,a=s.host||"0.0.0.0";if(to())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${s.projectId}`),console.log(` Runtime: ${to()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}async function Qv(s,e,t=ji){let n=Ii({port:t,projectId:s,projectPath:e});return await n.start(),n}var ji,dl=y(()=>{"use strict";Lc();ot();Bm();qm();Ym();l(Ii,"createServer");ji=3478;l(Qv,"startServer")});import ds from"chalk";var Zm,Zv,eC,Xt,eg=y(()=>{"use strict";ze();Zm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Zv=80,eC={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Zm,speed:Zv},cli:{header:l(()=>`${ds.cyan.bold("\u26A1")} ${ds.cyan("prjct")}`,"header"),footer:l(()=>ds.dim("\u26A1 prjct"),"footer"),spin:l((s,e)=>`${ds.cyan("\u26A1")} ${ds.cyan("prjct")} ${ds.cyan(Zm[s%10])} ${ds.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((s="claude")=>ri(s).commitFooter,"getCommitFooter"),getSignature:l((s="claude")=>ri(s).signature,"getSignature")},Xt=eC});function ps(s,e){return{...Xs[s],...e}}function ao(s,e,t){return{message:s,hint:e,...t}}var co=y(()=>{"use strict";Si();Si();l(ps,"getError");l(ao,"createError")});var ng={};xe(ng,{ERRORS:()=>Xs,ICONS:()=>Kn,OUTPUT_TIERS:()=>tg,createError:()=>ao,default:()=>f,formatForHuman:()=>oC,getError:()=>ps,getOutputTier:()=>nC,getTierConfig:()=>Di,isQuietMode:()=>rC,limitLines:()=>Ri,setOutputTier:()=>tC,setQuietMode:()=>sC});import re from"chalk";function tC(s){or=s}function nC(){return or}function Di(){return tg[or]}function sC(s){Ct=s}function rC(){return Ct}function Ri(s,e){let t=e??Di().maxLines;if(t===1/0||t===0)return s;let n=s.split(`
|
|
324
324
|
`);if(n.length<=t)return s;let r=n.slice(0,t),o=n.length-t;return`${r.join(`
|
|
@@ -1745,7 +1745,7 @@ ${Q.yellow(`Command '${s}' not found.`)}
|
|
|
1745
1745
|
|
|
1746
1746
|
Run 'prjct help' to see all available commands.
|
|
1747
1747
|
`}function bk(){let s=[];s.push(""),s.push(Q.cyan.bold("All Commands")),s.push("");let e=Object.entries(Jo).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let r=Nr.filter(o=>o.group===t);if(r.length!==0){s.push(`${Q.bold(n.title)} ${Q.dim(`(${r.length} commands)`)}`),s.push(Q.dim(n.description)),s.push("");for(let o of r){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;s.push(` ${i} ${a}`)}s.push("")}}return s.push(Q.dim("Run 'prjct help <command>' for detailed help on a specific command.")),s.push(""),s.join(`
|
|
1748
|
-
`)}function Wj(s){return s?s==="commands"||s==="all"?bk():Sk(s):yk()}var hk,Gj,Ck=y(()=>{"use strict";hp();ot();hk=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],Gj=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(yk,"formatMainHelp");l(wk,"formatTerminalCommandHelp");l(kk,"formatAgentCommandHelp");l(Sk,"formatCommandHelp");l(bk,"formatCommandList");l(Wj,"getHelp")});var xk=Ok((E3,zj)=>{zj.exports={name:"prjct-cli",version:"1.42.
|
|
1748
|
+
`)}function Wj(s){return s?s==="commands"||s==="all"?bk():Sk(s):yk()}var hk,Gj,Ck=y(()=>{"use strict";hp();ot();hk=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],Gj=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(yk,"formatMainHelp");l(wk,"formatTerminalCommandHelp");l(kk,"formatAgentCommandHelp");l(Sk,"formatCommandHelp");l(bk,"formatCommandList");l(Wj,"getHelp")});var xk=Ok((E3,zj)=>{zj.exports={name:"prjct-cli",version:"1.42.3",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var Qj={};import Pk from"node:os";import hc from"node:path";import He from"chalk";async function Vj(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let t=await Promise.resolve().then(()=>Fk(xk()));await Xj(t.version),process.exit(0)}["-h","--help",void 0].includes(s)&&(Yj(),process.exit(0)),f.start();try{let t=z.getByName(s);if(!t){let m=Jj(s),p=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(ps("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:p})),f.end(),process.exit(1)}if(t.deprecated){let m=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${s}' is deprecated`,hint:m}),f.end(),process.exit(1)}t.implemented||(f.failWithHint({message:`Command '${s}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),f.end(),process.exit(1));let{parsedArgs:n,options:r}=Kj(t,e),o=!process.stdin.isTTY||r.md===!0||r.json===!0;t.requiresLlm&&!o&&(f.failWithHint({message:`'prjct ${s}' requires an AI agent to process its output`,hint:`Use 'p. ${s}' inside Claude/Cursor, or add --md flag`}),f.end(),process.exit(1));let i=Bj(t,n);i&&(f.failWithHint(i),f.end(),process.exit(1));let a=null,c=Date.now();try{a=await M.getProjectId(process.cwd()),a&&(await Xn.expireIfStale(a),await Xn.touch(a))}catch{}let u=new Nn,d;if(s==="design"){let m=n.join(" ");d=await u.design(m,r)}else if(s==="analyze")d=await u.analyze(r);else if(s==="cleanup")d=await u.cleanup(r);else if(s==="setup")d=await u.setup(r);else if(s==="update")d=await u.update(r);else{let m=n.join(" ")||null,p=r.md===!0,h={task:l(k=>u.task(k,process.cwd(),{md:p}),"task"),done:l(()=>u.done(process.cwd(),{md:p}),"done"),next:l(()=>u.next(process.cwd(),{md:p}),"next"),pause:l(k=>u.pause(k||"",process.cwd(),{md:p}),"pause"),resume:l(k=>u.resume(k,process.cwd(),{md:p}),"resume"),init:l(k=>u.init(k),"init"),bug:l(k=>u.bug(k||"",process.cwd(),{md:p}),"bug"),idea:l(k=>u.idea(k||"",process.cwd(),{md:p}),"idea"),spec:l(k=>u.spec(k),"spec"),ship:l(k=>u.ship(k,process.cwd(),{md:p}),"ship"),workflow:l(k=>u.workflowPrefs(k,process.cwd(),{md:p}),"workflow"),sessions:l(()=>u.sessions(process.cwd(),{md:p,cleanup:r.cleanup===!0}),"sessions"),dash:l(k=>u.dash(k||"default",process.cwd(),{md:p}),"dash"),stats:l(()=>u.stats(process.cwd(),{json:r.json===!0,export:r.export===!0}),"stats"),status:l(()=>u.status(process.cwd(),{json:r.json===!0,md:p}),"status"),help:l(k=>u.help(k||""),"help"),perf:l(k=>u.perf(k||"7"),"perf"),velocity:l(k=>u.velocity(k||"0"),"velocity"),recover:l(()=>u.recover(),"recover"),undo:l(()=>u.undo(),"undo"),redo:l(()=>u.redo(),"redo"),history:l(()=>u.history(),"history"),sync:l(()=>u.sync(process.cwd(),{aiTools:r.agents?String(r.agents).split(","):void 0,preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:p,package:r.package?String(r.package):void 0,full:r.full===!0}),"sync"),diff:l(()=>u.diff(process.cwd(),{json:r.json===!0,md:p}),"diff"),seal:l(()=>u.seal(process.cwd(),{json:r.json===!0}),"seal"),rollback:l(()=>u.rollback(process.cwd(),{json:r.json===!0,md:p}),"rollback"),verify:l(()=>u.verify(process.cwd(),{json:r.json===!0,semantic:r.semantic===!0}),"verify"),"analysis-payload":l(()=>u.analysisPayload(process.cwd(),{json:r.json===!0,md:p}),"analysis-payload"),"analysis-save-llm":l(k=>u.saveLlmAnalysis(k||"",process.cwd(),{md:p}),"analysis-save-llm"),"analysis-llm":l(()=>u.getLlmAnalysis(process.cwd(),{json:r.json===!0,md:p}),"analysis-llm"),start:l(()=>u.start(),"start"),context:l(k=>u.context(k),"context")}[s];if(h)d=await h(m);else throw new Error(`Command '${s}' has no handler`)}if(a){let m=Date.now()-c;try{await Xn.trackCommand(a,s,m)}catch{}try{await ms.recordTiming(a,"command_duration",m,{command:s});let p=globalThis.__perfStartNs;if(p){let g=Number(process.hrtime.bigint()-p)/1e6;await ms.recordTiming(a,"startup_time",g)}await ms.recordMemory(a,{command:s})}catch{}}d?.message&&console.log(d.message),f.end(),process.exit(d?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(Zo(t)),f.end(),process.exit(1)}}function Bj(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return ps("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function Jj(s){let e=z.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=qj(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}function qj(s,e){let t=s.length,n=e.length,r=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=n;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)r[o][i]=s[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][n]}function Kj(s,e){let t=[],n={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function Xj(s){let e=await En(),t=hc.join(Pk.homedir(),".claude","commands","p.md"),n=hc.join(Pk.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([P(t),P(n),P(hc.join(process.cwd(),".cursor","commands","sync.md")),P(hc.join(process.cwd(),".cursor"))]),c=await Ws();if(console.log(`
|
|
1749
1749
|
${He.cyan("p/")} prjct v${s}
|
|
1750
1750
|
${He.dim("Context layer for AI coding agents")}
|
|
1751
1751
|
|
package/dist/daemon/entry.mjs
CHANGED
|
@@ -516,7 +516,7 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r
|
|
|
516
516
|
`);i.transaction(()=>{for(let c of o){let u=O(c.path);u&&a.run(u,Rs(c.score)??0,Rs(c.size),O(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Lb(r,e,t){let n=me.join(e,"events.jsonl");try{let o=(await pt.readFile(n,"utf-8")).split(`
|
|
517
517
|
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=O(u.type??u.action)??"unknown",m=O(u.taskId??u.task_id),p=O(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Ub(r,e,t){let n=me.join(e,"learnings.jsonl");try{let o=(await pt.readFile(n,"utf-8")).split(`
|
|
518
518
|
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${O(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,p=m&&m.length>0?O(m[0]):null;a.run(d,p,c,1,O(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){C(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Hb(r,e,t,n){let s=l(async(i,a)=>{try{await pt.unlink(i)}catch(c){C(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of zc)await s(me.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(me.join(e,i),`cleanup:index/${i}`);await s(me.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(me.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function O(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function Rs(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function qn(r){try{let e=await pt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function ri(r){let e=x.getGlobalProjectPath(r),t=me.join(e,"storage"),n=0;A.getDb(r);for(let{filename:u,key:d}of zc){let m=me.join(t,u),p=await qn(m);if(p!==null){A.setDoc(r,d,p),nm(r,d,p);try{await pt.unlink(m)}catch{}n++}}let s=me.join(e,"project.json"),o=await qn(s);if(o!==null){A.setDoc(r,"project",o);try{await pt.unlink(s)}catch{}n++}let i=me.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=me.join(i,u);try{let p=(await pt.readFile(d,"utf-8")).split(`
|
|
519
|
-
`).filter(f=>f.trim());if(p.length===0){await pt.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let k=JSON.parse(S);f.run(O(k.type??k.action)??"unknown",O(k.taskId??k.task_id),S,O(k.timestamp??k.ts)??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let k=JSON.parse(S),I=`learning:${O(k.taskId??k.timestamp)??Date.now()}`,R=k.tags;f.run(I,O(R?.[0]),S,1,O(k.timestamp)??new Date().toISOString())}catch{}})()}await pt.unlink(d),n++}catch{}}let a=me.join(e,"index"),c=[...Gc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=me.join(a,u),m=await qn(d);if(m===null)continue;let p=Gc.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),sm(r,p.key,m));try{await pt.unlink(d)}catch{}n++}return n}var zc,Gc,oi=w(()=>{"use strict";Se();_();te();zc=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],Gc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(jr,"migrateJsonToSqlite");l(Rb,"createBackup");l(Hc,"copyFiles");l(nm,"populateNormalized");l(Ib,"populateTasksFromState");l(Db,"populateQueueTasks");l(jb,"populateIdeas");l($b,"populateShippedFeatures");l(Mb,"populateMetricsDaily");l(Ob,"populateAnalysis");l(sm,"populateIndexTables");l(Fb,"populateCategoriesIndex");l(_b,"migrateChecksums");l(Nb,"migrateFileScores");l(Lb,"migrateEventsJsonl");l(Ub,"migrateLearningsJsonl");l(Hb,"cleanupJsonFiles");l(O,"toStr");l(Rs,"toNum");l(qn,"readJsonSafe");l(ri,"sweepLegacyJson")});var Wc,ye,Is=w(()=>{"use strict";Mt();So();re();Tn();Qt();Wc=class extends Ge{static{l(this,"QueueStorage")}constructor(){super("queue.json",np)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:fe(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:fe(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=wn(Yt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;Pt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},ye=new Wc});var Vc,ht,$r=w(()=>{"use strict";Mt();Ua();re();Tn();Qt();Vc=class extends Ge{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Xd)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:fe(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=wn(Yt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;Pt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},ht=new Vc});var Mr,Bc,Kn,Jc=w(()=>{"use strict";Mr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},Bc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Mr[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Mr[e]}getPrompt(e){return Mr[e].prompt}getValidCommands(e){return Mr[e].transitions}formatNextSteps(e){return Mr[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Kn=new Bc});var qc,N,Ds=w(()=>{"use strict";Mt();So();re();Jc();Tn();Qt();qc=class extends Ge{static{l(this,"StateStorage")}constructor(){super("state.json",ep)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Kn.getCurrentState(e),s=Kn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:fe()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){return e.pausedTasks||[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];Pt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Qd.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
519
|
+
`).filter(f=>f.trim());if(p.length===0){await pt.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let k=JSON.parse(S);f.run(O(k.type??k.action)??"unknown",O(k.taskId??k.task_id),S,O(k.timestamp??k.ts)??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let k=JSON.parse(S),I=`learning:${O(k.taskId??k.timestamp)??Date.now()}`,R=k.tags;f.run(I,O(R?.[0]),S,1,O(k.timestamp)??new Date().toISOString())}catch{}})()}await pt.unlink(d),n++}catch{}}let a=me.join(e,"index"),c=[...Gc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=me.join(a,u),m=await qn(d);if(m===null)continue;let p=Gc.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),sm(r,p.key,m));try{await pt.unlink(d)}catch{}n++}return n}var zc,Gc,oi=w(()=>{"use strict";Se();_();te();zc=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],Gc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(jr,"migrateJsonToSqlite");l(Rb,"createBackup");l(Hc,"copyFiles");l(nm,"populateNormalized");l(Ib,"populateTasksFromState");l(Db,"populateQueueTasks");l(jb,"populateIdeas");l($b,"populateShippedFeatures");l(Mb,"populateMetricsDaily");l(Ob,"populateAnalysis");l(sm,"populateIndexTables");l(Fb,"populateCategoriesIndex");l(_b,"migrateChecksums");l(Nb,"migrateFileScores");l(Lb,"migrateEventsJsonl");l(Ub,"migrateLearningsJsonl");l(Hb,"cleanupJsonFiles");l(O,"toStr");l(Rs,"toNum");l(qn,"readJsonSafe");l(ri,"sweepLegacyJson")});var Wc,ye,Is=w(()=>{"use strict";Mt();So();re();Tn();Qt();Wc=class extends Ge{static{l(this,"QueueStorage")}constructor(){super("queue.json",np)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:fe(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:fe(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=wn(Yt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;Pt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},ye=new Wc});var Vc,ht,$r=w(()=>{"use strict";Mt();Ua();re();Tn();Qt();Vc=class extends Ge{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Xd)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:fe(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=wn(Yt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;Pt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},ht=new Vc});var Mr,Bc,Kn,Jc=w(()=>{"use strict";Mr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},Bc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Mr[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Mr[e]}getPrompt(e){return Mr[e].prompt}getValidCommands(e){return Mr[e].transitions}formatNextSteps(e){return Mr[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Kn=new Bc});var qc,N,Ds=w(()=>{"use strict";Mt();So();re();Jc();Tn();Qt();qc=class extends Ge{static{l(this,"StateStorage")}constructor(){super("state.json",ep)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Kn.getCurrentState(e),s=Kn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:fe()};return await this.update(e,u=>({...u,currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){return e.pausedTasks||[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];Pt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Qd.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
520
520
|
${f.join(`
|
|
521
521
|
`)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},N=new qc});var rm=w(()=>{"use strict";_c();_()});var Kc,Xc,Yc=w(()=>{"use strict";hs();Qt();Kc=class extends Ge{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:rp,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},Xc=new Kc});var Qc,Qe,Zc=w(()=>{"use strict";te();Qc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();H.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
522
522
|
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let s=H.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!s)throw new Error(`Failed to create workflow: ${t.name}`);return s.id}getWorkflow(e,t){let n=H.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return H.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),H.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return H.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Qe=new Qc});function el(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var tl,ve,Or=w(()=>{"use strict";Zc();te();l(el,"rowToRule");tl=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=A.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(n?.m??-1)+1;return A.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|