prjct-cli 2.34.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/bin/prjct-core.mjs +410 -409
- package/dist/daemon/entry.mjs +214 -213
- package/dist/mcp/server.mjs +1 -1
- package/package.json +1 -1
package/dist/mcp/server.mjs
CHANGED
|
@@ -608,7 +608,7 @@ CREATE TABLE velocity_sprints (
|
|
|
608
608
|
WHERE memories_fts MATCH ?
|
|
609
609
|
AND m.deleted_at IS NULL
|
|
610
610
|
ORDER BY bm25(memories_fts) ASC, m.created_at DESC
|
|
611
|
-
LIMIT ?`,n,e)}catch{return[]}return i.map(o=>{let a={};if(o.tags)try{let u=JSON.parse(o.tags);u&&typeof u=="object"&&(a=u)}catch{}return{id:o.id,type:o.type??"fact",content:o.content,tags:a,rememberedAt:o.created_at,provenance:o.provenance??"declared"}})},recall(s,t={}){let e=t.limit??na,r=Math.max(e*ia,oa),n=t.types&&t.types.length>0?new Set(t.types):null,i=n?n.has("shipped"):!0,a=(n?[...n].some(d=>d!=="shipped"):!0)?h.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${Rt}%`,r):[],u=i?h.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r):[],l=[...a.map(er),...u.map($n)];if(n&&(l=l.filter(d=>n.has(d.type))),t.tags&&(l=l.filter(d=>ca(d,t.tags??{}))),t.topic&&(l=l.filter(d=>aa(d,t.topic))),l.sort((d,p)=>p.rememberedAt.localeCompare(d.rememberedAt)),t.dedupeByKey!==!1&&(l=ua(l)),t.pruneSuperseded!==!1){let d=pa(l);d.size>0&&(l=l.filter(p=>!d.has(p.id)))}return l.slice(0,e)},getById(s,t){let e=String(t).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!e)return null;let r=Number(e[1]);try{let n=h.get(s,"SELECT id, type, data, timestamp FROM events WHERE id = ? AND type LIKE ?",r,`${Rt}%`);return n?er(n):null}catch{return null}},expandWithLinks(s,t,e=5){if(t.length===0||e<=0)return[];let r=/\bmem[_-](\d+)\b/g,n=["resolves","relates","supersedes","superseded-by","duplicates","spec"],i=new Set(t.map(a=>a.id)),o=[];for(let a of t){if(o.length>=e)break;let u=new Set;for(let l of n){let d=a.tags?.[l];if(d)for(let p of String(d).matchAll(r))u.add(`mem_${p[1]}`)}for(let l of a.content.matchAll(r))u.add(`mem_${l[1]}`);for(let l of u){if(o.length>=e)break;if(i.has(l))continue;i.add(l);let d=O.getById(s,l);d&&o.push(d)}}return o},allEntriesForIndex(s){try{let t=h.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC",`${Rt}%`),e=h.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...t.map(er),...e.map($n)]}catch{return[]}},similar(s,t,e=10){let r=t.toLowerCase().split(/[^a-z0-9]+/).filter(o=>o.length>3);return r.length===0?[]:O.recall(s,{limit:200}).map(o=>{let a=`${o.content} ${Object.values(o.tags).join(" ")}`.toLowerCase(),u=r.reduce((l,d)=>a.includes(d)?l+1:l,0);return{entry:o,hits:u}}).filter(o=>o.hits>0).sort((o,a)=>a.hits-o.hits).slice(0,e).map(o=>o.entry)}};c(da,"linkLabel");c(Xn,"linkifyMemRefs");c(xt,"formatMemoryMd")});function Vn(s){return[...s].sort((t,e)=>{let r=Kn[t.section]-Kn[e.section];return r!==0?r:zn[t.priority]-zn[e.priority]})}var zn,Kn,Qn=E(()=>{"use strict";zn={critical:0,high:1,medium:2,low:3},Kn={active:0,previously_active:1,backlog:2};c(Vn,"sortBySectionAndPriority")});var sr,Pt,nr=E(()=>{"use strict";_t();Ht();Qn();N();Gt();qe();sr=class extends lt{static{c(this,"QueueStorage")}constructor(){super("queue.json",Is)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(t){return`queue.${t}d`}async getTasks(t){return(await this.read(t)).tasks}async getActiveTasks(t){return(await this.read(t)).tasks.filter(r=>r.section==="active"&&!r.completed)}async getBacklog(t){return(await this.read(t)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(t){let e=await this.getActiveTasks(t);return Vn(e)[0]||null}async addTask(t,e){let r={...e,id:H(),createdAt:f(),completed:!1};return await this.update(t,n=>({tasks:[...n.tasks,r],lastUpdated:f()})),await this.publishEvent(t,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(t,e){let r=f(),n=e.map(i=>({...i,id:H(),createdAt:r,completed:!1}));return await this.update(t,i=>({tasks:[...i.tasks,...n],lastUpdated:r})),await this.publishEvent(t,"queue.tasks_added",{count:n.length,tasks:n.map(i=>({id:i.id,description:i.description}))}),n}async removeTask(t,e){await this.update(t,r=>({tasks:r.tasks.filter(n=>n.id!==e),lastUpdated:f()})),await this.publishEvent(t,"queue.task_removed",{taskId:e})}async deleteByFeatureId(t,e){let r=0;return await this.update(t,n=>{let i=n.tasks.length,o=n.tasks.filter(a=>a.featureId!==e);return r=i-o.length,{tasks:o,lastUpdated:f()}}),r>0&&await this.publishEvent(t,"queue.tasks_removed_by_feature",{featureId:e,count:r}),r}async completeTask(t,e){let r=null;if(await this.update(t,n=>({tasks:n.tasks.map(o=>o.id===e?(r={...o,completed:!0,completedAt:f()},r):o),lastUpdated:f()})),r){let n=r;await this.publishEvent(t,"queue.task_completed",{taskId:e,description:n.description,completedAt:n.completedAt})}return r}async moveToSection(t,e,r){await this.update(t,n=>({tasks:n.tasks.map(i=>i.id===e?{...i,section:r}:i),lastUpdated:f()}))}async setPriority(t,e,r){await this.update(t,n=>({tasks:n.tasks.map(i=>i.id===e?{...i,priority:r}:i),lastUpdated:f()}))}async getTask(t,e){return(await this.read(t)).tasks.find(n=>n.id===e)||null}async updateTask(t,e,r){let n=null;return await this.update(t,i=>({tasks:i.tasks.map(o=>o.id===e?(n={...o,...r},n):o),lastUpdated:f()})),n&&await this.publishEvent(t,"queue.task_updated",{taskId:e}),n}async clearCompleted(t){let r=(await this.read(t)).tasks.filter(n=>n.completed).length;return await this.update(t,n=>({tasks:n.tasks.filter(i=>!i.completed),lastUpdated:f()})),r}async removeStaleCompleted(t){let e=await this.read(t),r=kr(vt.QUEUE_COMPLETED_DAYS),n=e.tasks.filter(o=>o.completed&&o.completedAt&&new Date(o.completedAt)<r);if(n.length===0)return 0;ut.archiveMany(t,n.map(o=>({entityType:"queue_task",entityId:o.id,entityData:o,summary:o.description,reason:"age"})));let i=new Set(n.map(o=>o.id));return await this.update(t,o=>({tasks:o.tasks.filter(a=>!i.has(a.id)),lastUpdated:f()})),await this.publishEvent(t,"queue.stale_removed",{count:n.length}),n.length}},Pt=new sr});import{z as _}from"zod";var gt,ar,or,ga,Y,Vt=E(()=>{"use strict";gt=["draft","reviewed","in_progress","shipped","archived"],ar=["strategic","architecture","design"],or=_.object({verdict:_.enum(["pass","fail"]),notes:_.string(),ts:_.string()}),ga=_.object({risk:_.string().min(1),mitigation:_.string().min(1)}),Y=_.object({goal:_.string().min(1),eli10:_.string().default(""),stakes:_.string().default(""),acceptance_criteria:_.array(_.string().min(1)).default([]),scope:_.array(_.string()).default([]),out_of_scope:_.array(_.string()).default([]),risks:_.array(ga).default([]),test_plan:_.array(_.string()).default([]),reviews:_.object({strategic:or.optional(),architecture:or.optional(),design:or.optional()}).optional(),linked_tasks:_.array(_.string()).default([]),notes:_.string().default(""),tasks_created_at:_.string().nullable().default(null)})});var cr,R,Qt=E(()=>{"use strict";_t();Vt();N();j();cr=class{static{c(this,"SpecStorage")}nextUpdatedAt(t,e){let r=f(),i=h.get(t,"SELECT updated_at FROM specs WHERE id = ?",e)?.updated_at;return!i||r>i?r:new Date(new Date(i).getTime()+1).toISOString()}create(t,e){let r=H(),n=f(),i=Y.parse(e.content);return h.run(t,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
|
|
611
|
+
LIMIT ?`,n,e)}catch{return[]}return i.map(o=>{let a={};if(o.tags)try{let u=JSON.parse(o.tags);u&&typeof u=="object"&&(a=u)}catch{}return{id:o.id,type:o.type??"fact",content:o.content,tags:a,rememberedAt:o.created_at,provenance:o.provenance??"declared"}})},recall(s,t={}){let e=t.limit??na,r=Math.max(e*ia,oa),n=t.types&&t.types.length>0?new Set(t.types):null,i=n?n.has("shipped"):!0,a=(n?[...n].some(d=>d!=="shipped"):!0)?h.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${Rt}%`,r):[],u=i?h.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r):[],l=[...a.map(er),...u.map($n)];if(n&&(l=l.filter(d=>n.has(d.type))),t.tags&&(l=l.filter(d=>ca(d,t.tags??{}))),t.topic&&(l=l.filter(d=>aa(d,t.topic))),l.sort((d,p)=>p.rememberedAt.localeCompare(d.rememberedAt)),t.dedupeByKey!==!1&&(l=ua(l)),t.pruneSuperseded!==!1){let d=pa(l);d.size>0&&(l=l.filter(p=>!d.has(p.id)))}return l.slice(0,e)},recallForFile(s,t,e=3){if(!t)return[];let r=t.split("/").pop()??t,n=c(a=>a.type==="gotcha"||a.type==="anti-pattern"||a.tags?.pattern==="recurring-bug","isPreventive"),i;try{i=this.recall(s,{limit:500})}catch{return[]}return i.filter(a=>{let u=a.tags?.file;return u?(t===u||t.endsWith(`/${u}`)||(u.split("/").pop()??u)===r)&&n(a):!1}).slice(0,e)},getById(s,t){let e=String(t).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!e)return null;let r=Number(e[1]);try{let n=h.get(s,"SELECT id, type, data, timestamp FROM events WHERE id = ? AND type LIKE ?",r,`${Rt}%`);return n?er(n):null}catch{return null}},expandWithLinks(s,t,e=5){if(t.length===0||e<=0)return[];let r=/\bmem[_-](\d+)\b/g,n=["resolves","relates","supersedes","superseded-by","duplicates","spec"],i=new Set(t.map(a=>a.id)),o=[];for(let a of t){if(o.length>=e)break;let u=new Set;for(let l of n){let d=a.tags?.[l];if(d)for(let p of String(d).matchAll(r))u.add(`mem_${p[1]}`)}for(let l of a.content.matchAll(r))u.add(`mem_${l[1]}`);for(let l of u){if(o.length>=e)break;if(i.has(l))continue;i.add(l);let d=O.getById(s,l);d&&o.push(d)}}return o},allEntriesForIndex(s){try{let t=h.query(s,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC",`${Rt}%`),e=h.query(s,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...t.map(er),...e.map($n)]}catch{return[]}},similar(s,t,e=10){let r=t.toLowerCase().split(/[^a-z0-9]+/).filter(o=>o.length>3);return r.length===0?[]:O.recall(s,{limit:200}).map(o=>{let a=`${o.content} ${Object.values(o.tags).join(" ")}`.toLowerCase(),u=r.reduce((l,d)=>a.includes(d)?l+1:l,0);return{entry:o,hits:u}}).filter(o=>o.hits>0).sort((o,a)=>a.hits-o.hits).slice(0,e).map(o=>o.entry)}};c(da,"linkLabel");c(Xn,"linkifyMemRefs");c(xt,"formatMemoryMd")});function Vn(s){return[...s].sort((t,e)=>{let r=Kn[t.section]-Kn[e.section];return r!==0?r:zn[t.priority]-zn[e.priority]})}var zn,Kn,Qn=E(()=>{"use strict";zn={critical:0,high:1,medium:2,low:3},Kn={active:0,previously_active:1,backlog:2};c(Vn,"sortBySectionAndPriority")});var sr,Pt,nr=E(()=>{"use strict";_t();Ht();Qn();N();Gt();qe();sr=class extends lt{static{c(this,"QueueStorage")}constructor(){super("queue.json",Is)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(t){return`queue.${t}d`}async getTasks(t){return(await this.read(t)).tasks}async getActiveTasks(t){return(await this.read(t)).tasks.filter(r=>r.section==="active"&&!r.completed)}async getBacklog(t){return(await this.read(t)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(t){let e=await this.getActiveTasks(t);return Vn(e)[0]||null}async addTask(t,e){let r={...e,id:H(),createdAt:f(),completed:!1};return await this.update(t,n=>({tasks:[...n.tasks,r],lastUpdated:f()})),await this.publishEvent(t,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(t,e){let r=f(),n=e.map(i=>({...i,id:H(),createdAt:r,completed:!1}));return await this.update(t,i=>({tasks:[...i.tasks,...n],lastUpdated:r})),await this.publishEvent(t,"queue.tasks_added",{count:n.length,tasks:n.map(i=>({id:i.id,description:i.description}))}),n}async removeTask(t,e){await this.update(t,r=>({tasks:r.tasks.filter(n=>n.id!==e),lastUpdated:f()})),await this.publishEvent(t,"queue.task_removed",{taskId:e})}async deleteByFeatureId(t,e){let r=0;return await this.update(t,n=>{let i=n.tasks.length,o=n.tasks.filter(a=>a.featureId!==e);return r=i-o.length,{tasks:o,lastUpdated:f()}}),r>0&&await this.publishEvent(t,"queue.tasks_removed_by_feature",{featureId:e,count:r}),r}async completeTask(t,e){let r=null;if(await this.update(t,n=>({tasks:n.tasks.map(o=>o.id===e?(r={...o,completed:!0,completedAt:f()},r):o),lastUpdated:f()})),r){let n=r;await this.publishEvent(t,"queue.task_completed",{taskId:e,description:n.description,completedAt:n.completedAt})}return r}async moveToSection(t,e,r){await this.update(t,n=>({tasks:n.tasks.map(i=>i.id===e?{...i,section:r}:i),lastUpdated:f()}))}async setPriority(t,e,r){await this.update(t,n=>({tasks:n.tasks.map(i=>i.id===e?{...i,priority:r}:i),lastUpdated:f()}))}async getTask(t,e){return(await this.read(t)).tasks.find(n=>n.id===e)||null}async updateTask(t,e,r){let n=null;return await this.update(t,i=>({tasks:i.tasks.map(o=>o.id===e?(n={...o,...r},n):o),lastUpdated:f()})),n&&await this.publishEvent(t,"queue.task_updated",{taskId:e}),n}async clearCompleted(t){let r=(await this.read(t)).tasks.filter(n=>n.completed).length;return await this.update(t,n=>({tasks:n.tasks.filter(i=>!i.completed),lastUpdated:f()})),r}async removeStaleCompleted(t){let e=await this.read(t),r=kr(vt.QUEUE_COMPLETED_DAYS),n=e.tasks.filter(o=>o.completed&&o.completedAt&&new Date(o.completedAt)<r);if(n.length===0)return 0;ut.archiveMany(t,n.map(o=>({entityType:"queue_task",entityId:o.id,entityData:o,summary:o.description,reason:"age"})));let i=new Set(n.map(o=>o.id));return await this.update(t,o=>({tasks:o.tasks.filter(a=>!i.has(a.id)),lastUpdated:f()})),await this.publishEvent(t,"queue.stale_removed",{count:n.length}),n.length}},Pt=new sr});import{z as _}from"zod";var gt,ar,or,ga,Y,Vt=E(()=>{"use strict";gt=["draft","reviewed","in_progress","shipped","archived"],ar=["strategic","architecture","design"],or=_.object({verdict:_.enum(["pass","fail"]),notes:_.string(),ts:_.string()}),ga=_.object({risk:_.string().min(1),mitigation:_.string().min(1)}),Y=_.object({goal:_.string().min(1),eli10:_.string().default(""),stakes:_.string().default(""),acceptance_criteria:_.array(_.string().min(1)).default([]),scope:_.array(_.string()).default([]),out_of_scope:_.array(_.string()).default([]),risks:_.array(ga).default([]),test_plan:_.array(_.string()).default([]),reviews:_.object({strategic:or.optional(),architecture:or.optional(),design:or.optional()}).optional(),linked_tasks:_.array(_.string()).default([]),notes:_.string().default(""),tasks_created_at:_.string().nullable().default(null)})});var cr,R,Qt=E(()=>{"use strict";_t();Vt();N();j();cr=class{static{c(this,"SpecStorage")}nextUpdatedAt(t,e){let r=f(),i=h.get(t,"SELECT updated_at FROM specs WHERE id = ?",e)?.updated_at;return!i||r>i?r:new Date(new Date(i).getTime()+1).toISOString()}create(t,e){let r=H(),n=f(),i=Y.parse(e.content);return h.run(t,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
|
|
612
612
|
VALUES (?, ?, 'draft', ?, ?, ?, ?)`,r,e.title,JSON.stringify(i),e.tags?JSON.stringify(e.tags):null,n,n),{id:r,title:e.title,status:"draft",content:i,tags:e.tags??{},createdAt:n,updatedAt:n,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(t,e){let r=h.get(t,"SELECT * FROM specs WHERE id = ?",e);return r?this.rowToSpec(r):null}list(t,e={}){let r="SELECT * FROM specs WHERE 1=1",n=[];return e.status&&(r+=" AND status = ?",n.push(e.status)),!e.includeArchived&&!e.status&&(r+=" AND status != 'archived'"),r+=" ORDER BY created_at DESC",h.query(t,r,...n).map(o=>this.rowToSpec(o))}search(t,e){let r=`%${e}%`;return h.query(t,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",r,r).map(i=>this.rowToSpec(i))}updateContent(t,e,r){let n=Y.parse(r),i=this.nextUpdatedAt(t,e);return h.run(t,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(n),i,e),this.get(t,e)}casUpdate(t,e,r,n){let i=Y.parse(r),o=this.nextUpdatedAt(t,e);return h.run(t,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(i),o,e,n).changes===1}setStatus(t,e,r){if(!gt.includes(r))throw new Error(`invalid spec status: ${r}`);let n=this.nextUpdatedAt(t,e),i=[],o=[r,n];r==="shipped"&&(i.push("shipped_at = ?"),o.push(n)),r==="archived"&&(i.push("archived_at = ?"),o.push(n));let a=["status = ?","updated_at = ?",...i].join(", ");return o.push(e),h.run(t,`UPDATE specs SET ${a} WHERE id = ?`,...o),this.get(t,e)}setShippedPr(t,e,r){return h.run(t,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",r,this.nextUpdatedAt(t,e),e),this.get(t,e)}setShippedSha(t,e,r){return h.run(t,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",r,this.nextUpdatedAt(t,e),e),this.get(t,e)}linkTask(t,e,r){let n=this.get(t,e);if(!n)return null;if(n.content.linked_tasks.includes(r))return n;let i={...n.content,linked_tasks:[...n.content.linked_tasks,r]};return this.updateContent(t,e,i)}delete(t,e){return this.get(t,e)?(h.run(t,"DELETE FROM specs WHERE id = ?",e),!0):!1}count(t){let e=h.query(t,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),r={total:0,draft:0,shipped:0};for(let n of e)r.total+=n.n,n.status==="draft"&&(r.draft=n.n),n.status==="shipped"&&(r.shipped=n.n);return r}rowToSpec(t){return{id:t.id,title:t.title,status:gt.includes(t.status)?t.status:"draft",content:Y.parse(JSON.parse(t.content)),tags:t.tags?JSON.parse(t.tags):{},createdAt:t.created_at,updatedAt:t.updated_at,shippedAt:t.shipped_at,shippedPr:t.shipped_pr,shippedSha:t.shipped_sha,archivedAt:t.archived_at}}},R=new cr});var ei={};K(ei,{inferSpecContext:()=>ya,warnNoContextMatch:()=>ka});async function ya(s,t,e){let[r,n]=await Promise.all([zt(s,e,{maxFiles:ti*4,minScore:ha}).catch(()=>({files:[]})),Promise.resolve(O.recall(t,{topic:s,limit:fa})).catch(()=>[])]),i=Ta(r.files.map(u=>u.path),ti);return i.length===0&&n.length===0?{notesBlock:"",paths:[],memoryHits:0,empty:!0}:{notesBlock:Ea(s,i,n),paths:i,memoryHits:n.length,empty:!1}}function Ta(s,t){let e=new Set,r=[];for(let n of s){let i=n.split("/").slice(0,2).join("/");if(!e.has(i)&&(e.add(i),r.push(n),r.length>=t))break}return r}function Ea(s,t,e){let r=[];if(r.push("<!-- auto-context:tentative -->"),r.push("## Existing context (auto-inferred)"),r.push(""),r.push(`_Inferred from title "${s}". Validate before audit \u2014 entries tagged tentative._`),r.push(""),t.length>0){r.push("### Likely paths");for(let n of t)r.push(`- \`${n}\``);r.push("")}if(e.length>0){r.push("### Relevant prior memory");for(let n of e){let i=n.content.length>140?`${n.content.slice(0,137)}\u2026`:n.content,o=Object.entries(n.tags).map(([a,u])=>`${a}:${u}`).join(" ");r.push(`- **${n.type}**${o?` _(${o})_`:""} \u2014 ${i}`)}r.push("")}return r.push("<!-- /auto-context -->"),r.join(`
|
|
613
613
|
`)}function ka(s,t){let e={level:"warn",code:"no_context_match",message:`No codebase or memory context matched "${s}"`,suggestion:t??"Fill spec.notes manually or run with `--skip-context` next time."};process.stderr.write(`${JSON.stringify(e)}
|
|
614
614
|
`)}var ti,fa,ha,ri=E(()=>{"use strict";mt();Ye();ti=5,fa=8,ha=.15;c(ya,"inferSpecContext");c(Ta,"dedupeTopDirs");c(Ea,"buildNotesBlock");c(ka,"warnNoContextMatch")});var si={};K(si,{breakdownSpecToTasks:()=>Sa});async function Sa(s,t,e){let r=e.content.acceptance_criteria;if(r.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(e.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let n=!1;if(e.content.linked_tasks.length>0){n=!0,await Pt.deleteByFeatureId(s,e.id);let a={...e.content,linked_tasks:[]};R.updateContent(s,e.id,a)}let i=await Pt.addTasks(s,r.map(a=>({description:wa(a),body:a,priority:"medium",type:"feature",section:"backlog",featureId:e.id,groupId:e.id,groupName:e.title})));for(let a of i)R.linkTask(s,e.id,a.id);let o=R.get(s,e.id);if(o){let a={...o.content,tasks_created_at:f()};R.updateContent(s,e.id,a)}return await O.remember(t,{type:"spec",content:`Auto-breakdown: ${i.length} tasks created from ${e.title}${n?" (recovered from partial)":""}`,tags:{spec_id:e.id,event:"auto_breakdown",task_count:String(i.length),...n?{recovered:"partial"}:{}},source:e.id}),{taskIds:i.map(a=>a.id),...n?{recoveredFromPartial:!0}:{}}}function wa(s){let t=s.replace(/\s+/g," ").trim();return t.length<=140?t:`${t.slice(0,137)}\u2026`}var ni=E(()=>{"use strict";mt();nr();Qt();N();c(Sa,"breakdownSpecToTasks");c(wa,"truncateForDescription")});import{StdioServerTransport as Ia}from"@modelcontextprotocol/sdk/server/stdio.js";import{McpServer as Aa}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as L}from"zod";re();j();U();import us from"node:fs/promises";import at from"node:path";function ji(s){let t=[],e,r=new RegExp(Tr.source,"g");for(;(e=r.exec(s))!==null;){let n=e[1];(n.startsWith(".")||n.startsWith("@/"))&&t.push(n)}return t}c(ji,"extractImportSources");async function Fi(s,t,e){let r;if(s.startsWith("@/"))r=at.join(e,"src",s.slice(2));else{let n=at.dirname(at.join(e,t));r=at.resolve(n,s)}for(let n of yr){let i=r+n;try{if((await us.stat(i)).isFile())return at.relative(e,i)}catch{}}return null}c(Fi,"resolveImport");async function Ui(s){let t=await xr(s),e={},r={},n=0,i=await Pr(t,50,async o=>{try{let a=await us.readFile(at.join(s,o),"utf-8"),u=ji(a),l=[];for(let d of u){let p=await Fi(d,o,s);p&&p!==o&&l.push(p)}return l.length>0?{filePath:o,imports:l}:null}catch{return null}});for(let{filePath:o,imports:a}of i){e[o]=a,n+=a.length;for(let u of a)r[u]||(r[u]=[]),r[u].push(o)}return{forward:e,reverse:r,fileCount:t.length,edgeCount:n,builtAt:new Date().toISOString()}}c(Ui,"buildGraph");function ls(s,t,e=2){let r=new Set(s),n=new Map,i=[];for(let o of s){let a=t.forward[o]||[],u=t.reverse[o]||[];for(let l of[...a,...u])r.has(l)||i.push({file:l,depth:1})}for(;i.length>0;){let{file:o,depth:a}=i.shift();if(a>e)continue;let u=1/(a+1),l=n.get(o);if(l){u>l.score&&n.set(o,{score:u,depth:a});continue}if(n.set(o,{score:u,depth:a}),a<e){let d=t.forward[o]||[],p=t.reverse[o]||[];for(let g of[...d,...p])!r.has(g)&&!n.has(g)&&i.push({file:g,depth:a+1})}}return Array.from(n.entries()).map(([o,{score:a,depth:u}])=>({path:o,score:a,depth:u})).sort((o,a)=>a.score-o.score)}c(ls,"scoreFromSeeds");var we="import-graph",Ft=new Map;function $i(s,t){h.setDoc(s,we,t),Ft.delete(s)}c($i,"saveGraph");function Et(s){let t=h.get(s,"SELECT updated_at FROM kv_store WHERE key = ?",we);if(!t)return Ft.delete(s),null;let e=Ft.get(s);if(e&&e.updatedAt===t.updated_at)return e.graph;let r=h.getDoc(s,we);return r&&Ft.set(s,{graph:r,updatedAt:t.updated_at}),r}c(Et,"loadGraph");async function ps(s,t){let e=await Ui(s);return $i(t,e),e}c(ps,"indexImports");function ds(s,t){let e=[...s.added,...s.modified],r=new Set(e),n=new Set,i=Et(t);if(i)for(let u of e){let l=i.reverse[u];if(l)for(let d of l)r.has(d)||n.add(d)}let o=Array.from(n),a=[...e,...o];return{directlyChanged:e,affectedByImports:o,deleted:s.deleted,allAffected:a}}c(ds,"propagateChanges");function ms(s){let t=new Set;for(let e of s){let r=e.toLowerCase();(r.endsWith(".tsx")||r.endsWith(".jsx")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".vue")||r.endsWith(".svelte")||r.includes("/components/")||r.includes("/pages/")||r.includes("/app/"))&&(t.add("frontend"),t.add("uxui")),(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("/test/"))&&t.add("testing"),(r.includes("dockerfile")||r.includes("docker-compose")||r.includes(".dockerignore")||r.includes(".github/")||r.includes("ci/")||r.includes("cd/"))&&t.add("devops"),(r.endsWith(".sql")||r.includes("prisma")||r.includes("drizzle")||r.includes("migration")||r.includes("/db/"))&&t.add("database"),(r.endsWith(".ts")||r.endsWith(".js"))&&!r.includes(".test.")&&!r.includes(".spec.")&&!r.endsWith(".d.ts")&&t.add("backend")}return t}c(ms,"affectedDomains");j();it();async function Wi(s,t=100){try{let{stdout:e}=await b(`git log --name-only --pretty=format:'---COMMIT---' -${t}`,{cwd:s,maxBuffer:10485760}),r=[],n=null;for(let i of e.split(`
|