prjct-cli 3.91.0 → 3.92.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.
Files changed (92) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/bin/hook-chunks/{agent-switch-IQ5KSRKD.mjs → agent-switch-XMFUTNNV.mjs} +1 -1
  3. package/dist/bin/hook-chunks/{analysis-LBYZSJKT.mjs → analysis-PFGKPYWQ.mjs} +6 -6
  4. package/dist/bin/hook-chunks/auto-flush-QZ3YIQP6.mjs +8 -0
  5. package/dist/bin/hook-chunks/{capture-gate-BQCNMHUC.mjs → capture-gate-2FXYVHNF.mjs} +1 -1
  6. package/dist/bin/hook-chunks/{chunk-6AFM6WRB.mjs → chunk-2HTDCLZD.mjs} +2 -2
  7. package/dist/bin/hook-chunks/{chunk-LGJUQEAU.mjs → chunk-2WPR5GFT.mjs} +1 -1
  8. package/dist/bin/hook-chunks/{chunk-LPB3HUJ2.mjs → chunk-3X7TBM4A.mjs} +1 -1
  9. package/dist/bin/hook-chunks/{chunk-LJLUP4FF.mjs → chunk-5PEHJEFE.mjs} +1 -1
  10. package/dist/bin/hook-chunks/{chunk-B7GMU46T.mjs → chunk-7JE6VTLN.mjs} +3 -3
  11. package/dist/bin/hook-chunks/{chunk-EHBEHLYN.mjs → chunk-AWD2AQVJ.mjs} +1 -1
  12. package/dist/bin/hook-chunks/{chunk-IKUGYUAI.mjs → chunk-BZ5UR7G3.mjs} +1 -1
  13. package/dist/bin/hook-chunks/{chunk-HBLR7BVG.mjs → chunk-CDCCAU22.mjs} +1 -1
  14. package/dist/bin/hook-chunks/{chunk-YKMJI6TF.mjs → chunk-CPHUFXD2.mjs} +2 -2
  15. package/dist/bin/hook-chunks/{chunk-PSP56GGF.mjs → chunk-CQUG6SO2.mjs} +1 -1
  16. package/dist/bin/hook-chunks/{chunk-RRWPDRYR.mjs → chunk-DGBDMUBL.mjs} +2 -2
  17. package/dist/bin/hook-chunks/{chunk-UQVJQME2.mjs → chunk-DVBBB5BS.mjs} +1 -1
  18. package/dist/bin/hook-chunks/{chunk-XEFIIDHM.mjs → chunk-GELCZWKW.mjs} +1 -1
  19. package/dist/bin/hook-chunks/{chunk-AW25AWN5.mjs → chunk-HIFIDMH5.mjs} +1 -1
  20. package/dist/bin/hook-chunks/{chunk-UHW35BPE.mjs → chunk-HX42HFII.mjs} +4 -4
  21. package/dist/bin/hook-chunks/{chunk-QZSJSXJV.mjs → chunk-I5BDN25C.mjs} +1 -1
  22. package/dist/bin/hook-chunks/{chunk-RJ2BRRMH.mjs → chunk-KB3P6XTL.mjs} +2 -2
  23. package/dist/bin/hook-chunks/{chunk-TFGJVT6F.mjs → chunk-MAHTF6JG.mjs} +1 -1
  24. package/dist/bin/hook-chunks/{chunk-FEH4IPIC.mjs → chunk-MQVVNX63.mjs} +1 -1
  25. package/dist/bin/hook-chunks/{chunk-3WKDMAS7.mjs → chunk-NLDL3N6R.mjs} +1 -1
  26. package/dist/bin/hook-chunks/chunk-OGOCHZ3S.mjs +13 -0
  27. package/dist/bin/hook-chunks/{chunk-M3ZOJVPA.mjs → chunk-OL6ITIAZ.mjs} +2 -2
  28. package/dist/bin/hook-chunks/{chunk-W5OWBOLH.mjs → chunk-OLKNK2HB.mjs} +1 -1
  29. package/dist/bin/hook-chunks/{chunk-DGQYQSUK.mjs → chunk-OP467HW6.mjs} +2 -2
  30. package/dist/bin/hook-chunks/{chunk-PXJKXBTM.mjs → chunk-S4TB2OFJ.mjs} +1 -1
  31. package/dist/bin/hook-chunks/{chunk-AEYONUUY.mjs → chunk-SY2FRLJF.mjs} +1 -1
  32. package/dist/bin/hook-chunks/{chunk-RAHFKGM6.mjs → chunk-TBM7736J.mjs} +1 -1
  33. package/dist/bin/hook-chunks/{chunk-A5MUSARI.mjs → chunk-WSFHSXBZ.mjs} +1 -1
  34. package/dist/bin/hook-chunks/{chunk-D6KT763C.mjs → chunk-XHDNPEAN.mjs} +1 -1
  35. package/dist/bin/hook-chunks/{chunk-YG7KBQYJ.mjs → chunk-Y7CKMFNW.mjs} +1 -1
  36. package/dist/bin/hook-chunks/{chunk-OIEZAHLC.mjs → chunk-ZNQXFWSI.mjs} +1 -1
  37. package/dist/bin/hook-chunks/{chunk-D4S3IRD3.mjs → chunk-ZX6BC2EB.mjs} +1 -1
  38. package/dist/bin/hook-chunks/{codex-skill-7IURPY6B.mjs → codex-skill-2N6656SR.mjs} +1 -1
  39. package/dist/bin/hook-chunks/{command-installer-BVHQUSL4.mjs → command-installer-XSKQS3IS.mjs} +1 -1
  40. package/dist/bin/hook-chunks/{config-manager-KYC7WUOS.mjs → config-manager-YZANYLPV.mjs} +1 -1
  41. package/dist/bin/hook-chunks/{cwd-changed-56X7BNS6.mjs → cwd-changed-NJ6RYVOJ.mjs} +1 -1
  42. package/dist/bin/hook-chunks/{distill-6C6YIFOE.mjs → distill-IABVRW2U.mjs} +1 -1
  43. package/dist/bin/hook-chunks/{enriched-recall-6ZZNKAJZ.mjs → enriched-recall-NDASPZXZ.mjs} +1 -1
  44. package/dist/bin/hook-chunks/{format-YOYMJSLY.mjs → format-NIBVWBGR.mjs} +1 -1
  45. package/dist/bin/hook-chunks/{judgment-receipt-2U7D6HS4.mjs → judgment-receipt-HTNEOJLT.mjs} +1 -1
  46. package/dist/bin/hook-chunks/{land-cue-SS23JBAX.mjs → land-cue-FNLP4IAB.mjs} +1 -1
  47. package/dist/bin/hook-chunks/{land-synthesis-OATL5BNP.mjs → land-synthesis-HBPIXP5S.mjs} +1 -1
  48. package/dist/bin/hook-chunks/{legacy-crew-sweep-NH5EWEXF.mjs → legacy-crew-sweep-2MLYPNQR.mjs} +2 -2
  49. package/dist/bin/hook-chunks/{memory-index-677MUBCZ.mjs → memory-index-MQCHZFUE.mjs} +1 -1
  50. package/dist/bin/hook-chunks/{notification-S2IJJ6JW.mjs → notification-VQM2AMNS.mjs} +1 -1
  51. package/dist/bin/hook-chunks/{pack-integrity-L3BL7CGO.mjs → pack-integrity-BKLDNYE5.mjs} +1 -1
  52. package/dist/bin/hook-chunks/{pack-manager-SU53HCKK.mjs → pack-manager-ASWLKYGP.mjs} +1 -1
  53. package/dist/bin/hook-chunks/{planning-ZYFCFU7N.mjs → planning-QBSY272P.mjs} +2 -2
  54. package/dist/bin/hook-chunks/{post-edit-JD7YFEBZ.mjs → post-edit-VTLDHWI3.mjs} +1 -1
  55. package/dist/bin/hook-chunks/{pre-bash-VIABNO5E.mjs → pre-bash-JR6257XO.mjs} +1 -1
  56. package/dist/bin/hook-chunks/{pre-commit-NVQVXHZQ.mjs → pre-commit-BYUFDN2N.mjs} +1 -1
  57. package/dist/bin/hook-chunks/{pre-edit-V4RD45C4.mjs → pre-edit-MHROFDS3.mjs} +1 -1
  58. package/dist/bin/hook-chunks/{pre-package-KFJZXI5T.mjs → pre-package-P7CLTJJV.mjs} +1 -1
  59. package/dist/bin/hook-chunks/{pre-search-7KRU5D2O.mjs → pre-search-BCQHPE46.mjs} +1 -1
  60. package/dist/bin/hook-chunks/{prjct-md-FMCPUMQT.mjs → prjct-md-WE6WFVL3.mjs} +1 -1
  61. package/dist/bin/hook-chunks/{project-agent-surfaces-TD7BHI25.mjs → project-agent-surfaces-A6HGZPAL.mjs} +1 -1
  62. package/dist/bin/hook-chunks/{project-memory-ZVZSLPB5.mjs → project-memory-ON54KZEM.mjs} +1 -1
  63. package/dist/bin/hook-chunks/{project-style-evolution-7JS75AUP.mjs → project-style-evolution-T27I5N65.mjs} +1 -1
  64. package/dist/bin/hook-chunks/{prompt-S4MMIXH5.mjs → prompt-JIOMJCGV.mjs} +2 -2
  65. package/dist/bin/hook-chunks/{purge-BDREPWEE.mjs → purge-QQ6XILZD.mjs} +1 -1
  66. package/dist/bin/hook-chunks/{retention-D2MVQLOF.mjs → retention-E7WGFL47.mjs} +1 -1
  67. package/dist/bin/hook-chunks/{sdd-ZO4DP23G.mjs → sdd-PV6KWXE4.mjs} +1 -1
  68. package/dist/bin/hook-chunks/{session-continuity-FNNUMOXB.mjs → session-continuity-5CLT5YBL.mjs} +1 -1
  69. package/dist/bin/hook-chunks/{session-start-HA7IRBFX.mjs → session-start-ATYLOUKB.mjs} +1 -1
  70. package/dist/bin/hook-chunks/{setup-7L3NXNRH.mjs → setup-VL7YXVE5.mjs} +2 -2
  71. package/dist/bin/hook-chunks/{shipping-GX4HFYJ3.mjs → shipping-LVTFVSWJ.mjs} +4 -4
  72. package/dist/bin/hook-chunks/{spec-context-inference-KER2R3F3.mjs → spec-context-inference-U6BGGB2Q.mjs} +2 -2
  73. package/dist/bin/hook-chunks/spec-service-2DVDFOR7.mjs +11 -0
  74. package/dist/bin/hook-chunks/spec-task-breakdown-MPNRRTNZ.mjs +8 -0
  75. package/dist/bin/hook-chunks/{stop-HPZCLDPM.mjs → stop-GBUGB5OE.mjs} +2 -2
  76. package/dist/bin/hook-chunks/{subagent-start-7KZUTKV5.mjs → subagent-start-HURF2GI7.mjs} +1 -1
  77. package/dist/bin/hook-chunks/{subagent-stop-7C72RWGO.mjs → subagent-stop-WJECHEXI.mjs} +1 -1
  78. package/dist/bin/hook-chunks/{surface-attribution-PDYR6DVA.mjs → surface-attribution-BDKFYUOJ.mjs} +1 -1
  79. package/dist/bin/hook-chunks/{task-service-RRFG5P7N.mjs → task-service-BM2JQXMS.mjs} +1 -1
  80. package/dist/bin/hook-chunks/{tdd-XQUU4C23.mjs → tdd-UJDJUJ3E.mjs} +1 -1
  81. package/dist/bin/hook-chunks/{template-loader-4QMIMOBY.mjs → template-loader-BFTLPG2W.mjs} +1 -1
  82. package/dist/bin/hook-chunks/{weak-model-mode-M6D23IIM.mjs → weak-model-mode-GLXXHG32.mjs} +1 -1
  83. package/dist/bin/hook-chunks/{work-scope-6FG6PSAV.mjs → work-scope-VTF6SKLY.mjs} +1 -1
  84. package/dist/bin/prjct-core.mjs +686 -682
  85. package/dist/bin/prjct-hooks.mjs +1 -1
  86. package/dist/daemon/entry.mjs +589 -585
  87. package/dist/mcp/server.mjs +299 -296
  88. package/package.json +1 -1
  89. package/dist/bin/hook-chunks/auto-flush-GW3FP763.mjs +0 -8
  90. package/dist/bin/hook-chunks/chunk-LWCHQIJ7.mjs +0 -11
  91. package/dist/bin/hook-chunks/spec-service-G3RLCJ2G.mjs +0 -11
  92. package/dist/bin/hook-chunks/spec-task-breakdown-YPJ76OWR.mjs +0 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "3.91.0",
3
+ "version": "3.92.0",
4
4
  "description": "The agentic harness for AI coding agents — work cycles, bounded RAG context, persistent memory, guardrails, and performance evals.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __createRequire } from 'module';
3
- import { fileURLToPath as __fileURLToPath } from 'url';
4
- import { dirname as __pathDirname } from 'path';
5
- const require = __createRequire(import.meta.url);
6
- const __filename = __fileURLToPath(import.meta.url);
7
- const __dirname = __pathDirname(__filename);
8
- import{a as n}from"./chunk-AW25AWN5.mjs";import"./chunk-HZIORCPO.mjs";import"./chunk-WDGDFXSB.mjs";import"./chunk-NWY5M34K.mjs";import"./chunk-LWCHQIJ7.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-3JUE6MNF.mjs";import"./chunk-3FBCOCPD.mjs";import"./chunk-YUOTOCKK.mjs";import"./chunk-BISPGBNN.mjs";import"./chunk-LT5WSSQO.mjs";import"./chunk-HJ4HEI45.mjs";import"./chunk-3LG3ACQV.mjs";import"./chunk-AOPJ4Z6O.mjs";import"./chunk-AUUWQH3S.mjs";import"./chunk-MEQS4VPO.mjs";import"./chunk-HDHVBB6Q.mjs";import"./chunk-CE4RCNC7.mjs";import"./chunk-AKIN5WSQ.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-SVZHJZ5T.mjs";import"./chunk-CTWZQ7YI.mjs";import"./chunk-BUDZL4DW.mjs";import{a as t}from"./chunk-E66B27AL.mjs";async function c(u,o){try{let e=o??await import("./config-manager-KYC7WUOS.mjs").then(({default:a})=>a.readConfig(u).catch(()=>null));if(!e?.projectId||!e.cloud?.enabled||e.cloud.paused)return{ran:!1};if(!await n.hasAuth())return{ran:!1};let r=await n.sync(e.projectId,{include:e.cloud.include??{}});return{ran:!0,pushed:r.pushed?.count??0,pulled:r.pulled?.count??0,error:r.success?void 0:r.error}}catch{return{ran:!1}}}t(c,"flushIfLinked");export{c as flushIfLinked};
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __createRequire } from 'module';
3
- import { fileURLToPath as __fileURLToPath } from 'url';
4
- import { dirname as __pathDirname } from 'path';
5
- const require = __createRequire(import.meta.url);
6
- const __filename = __fileURLToPath(import.meta.url);
7
- const __dirname = __pathDirname(__filename);
8
- import{a as _}from"./chunk-3LG3ACQV.mjs";import{c as R}from"./chunk-AOPJ4Z6O.mjs";import{e as a,g as m}from"./chunk-HDHVBB6Q.mjs";import{b as g,e as y}from"./chunk-AKIN5WSQ.mjs";import{a as l}from"./chunk-E66B27AL.mjs";import{z as i}from"zod";var S=["draft","reviewed","in_progress","shipped","archived"];var T=i.object({verdict:i.enum(["pass","fail"]),notes:i.string(),ts:i.string(),candidateHash:i.string().optional()}),v=i.object({risk:i.string().min(1),mitigation:i.string().min(1)}),u=i.object({goal:i.string().min(1),eli10:i.string().default(""),stakes:i.string().default(""),acceptance_criteria:i.array(i.string().min(1)).default([]),scope:i.array(i.string()).default([]),out_of_scope:i.array(i.string()).default([]),risks:i.array(v).default([]),test_plan:i.array(i.string()).default([]),reviews:i.record(i.string(),T).optional(),selected_reviewers:i.array(i.string()).default([]),linked_tasks:i.array(i.string()).default([]),notes:i.string().default(""),tasks_created_at:i.string().nullable().default(null),audit_candidate_hash:i.string().nullable().default(null)});y();m();function h(d,e,t){try{a.run(d,"DELETE FROM spec_review WHERE spec_id = ?",e),a.run(d,"DELETE FROM spec_selected_reviewer WHERE spec_id = ?",e);for(let[s,n]of Object.entries(t.reviews??{}))a.run(d,"INSERT INTO spec_review (id, spec_id, lens, verdict, notes, created_at) VALUES (?, ?, ?, ?, ?, ?)",`${e}-rev-${s}`,e,s,n.verdict,n.notes??null,Date.now());for(let s of t.selected_reviewers)a.run(d,"INSERT OR IGNORE INTO spec_selected_reviewer (spec_id, lens) VALUES (?, ?)",e,s)}catch{}}l(h,"projectSpecRelational");var E=class{static{l(this,"SpecStorage")}nextUpdatedAt(e,t){let s=g(),r=a.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!r||s>r?s:new Date(new Date(r).getTime()+1).toISOString()}create(e,t){let s=_(),n=g(),r=u.parse(t.content);a.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
9
- VALUES (?, ?, 'draft', ?, ?, ?, ?)`,s,t.title,JSON.stringify(r),t.tags?JSON.stringify(t.tags):null,n,n),h(e,s,r);let p={id:s,title:t.title,status:"draft",content:r,tags:t.tags??{},createdAt:n,updatedAt:n,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null};return this.publishSync(e,p),p}get(e,t){let s=a.get(e,"SELECT * FROM specs WHERE id = ?",t);return s?this.rowToSpec(s):null}list(e,t={}){let s=[];t.status&&s.push(t.status);let r=`SELECT * FROM specs WHERE 1=1${t.status?" AND status = ?":t.includeArchived?"":" AND status != 'archived'"} ORDER BY created_at DESC`;return a.query(e,r,...s).map(o=>this.rowToSpec(o))}search(e,t){let s=`%${t}%`;return a.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",s,s).map(r=>this.rowToSpec(r))}updateContent(e,t,s){let n=u.parse(s),r=this.nextUpdatedAt(e,t);a.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(n),r,t),h(e,t,n);let p=this.get(e,t);return p&&this.publishSync(e,p),p}casUpdate(e,t,s,n){let r=u.parse(s),p=this.nextUpdatedAt(e,t),c=a.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(r),p,t,n).changes===1;if(c){h(e,t,r);let f=this.get(e,t);f&&this.publishSync(e,f)}return c}setStatus(e,t,s){if(!S.includes(s))throw new Error(`invalid spec status: ${s}`);let n=this.nextUpdatedAt(e,t),r=[],p=[s,n];s==="shipped"&&(r.push("shipped_at = ?"),p.push(n)),s==="archived"&&(r.push("archived_at = ?"),p.push(n));let o=["status = ?","updated_at = ?",...r].join(", ");p.push(t),a.run(e,`UPDATE specs SET ${o} WHERE id = ?`,...p);let c=this.get(e,t);return c&&this.publishSync(e,c),c}setShippedPr(e,t,s){a.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",s,this.nextUpdatedAt(e,t),t);let n=this.get(e,t);return n&&this.publishSync(e,n),n}setShippedSha(e,t,s){a.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",s,this.nextUpdatedAt(e,t),t);let n=this.get(e,t);return n&&this.publishSync(e,n),n}linkTask(e,t,s){let n=this.get(e,t);if(!n)return null;if(n.content.linked_tasks.includes(s))return n;let r={...n.content,linked_tasks:[...n.content.linked_tasks,s]};return this.updateContent(e,t,r)}delete(e,t){let s=this.get(e,t);return s?(a.run(e,"DELETE FROM specs WHERE id = ?",t),this.publishSync(e,s,"delete"),!0):!1}applyRemote(e,t){if(!t.id)return;let s=typeof t.content=="string"?t.content:JSON.stringify(t.content??{}),n=S.includes(t.status)?t.status:"draft",r=t.tags==null?null:typeof t.tags=="string"?t.tags:JSON.stringify(t.tags),p=g();if(a.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
10
- VALUES (?, ?, ?, ?, ?, ?, ?)
11
- ON CONFLICT(id) DO NOTHING`,t.id,t.title??"",n,s,r,t.created_at||p,t.updated_at||p).changes>0)try{let c=u.parse(JSON.parse(s));h(e,t.id,c)}catch{}}count(e){let t=a.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),s={total:0,draft:0,shipped:0};for(let n of t)s.total+=n.n,n.status==="draft"&&(s.draft=n.n),n.status==="shipped"&&(s.shipped=n.n);return s}publishSync(e,t,s="upsert"){R({projectId:e,entityType:"specs",entityId:t.id,eventType:s,data:{id:t.id,title:t.title,status:t.status,content:t.content,tags:t.tags,created_at:t.createdAt,updated_at:t.updatedAt,shipped_at:t.shippedAt,shipped_pr:t.shippedPr,shipped_sha:t.shippedSha,archived_at:t.archivedAt}})}rowToSpec(e){return{id:e.id,title:e.title,status:S.includes(e.status)?e.status:"draft",content:u.parse(JSON.parse(e.content)),tags:e.tags?JSON.parse(e.tags):{},createdAt:e.created_at,updatedAt:e.updated_at,shippedAt:e.shipped_at,shippedPr:e.shipped_pr,shippedSha:e.shipped_sha,archivedAt:e.archived_at}}},x=new E;export{u as a,x as b};
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __createRequire } from 'module';
3
- import { fileURLToPath as __fileURLToPath } from 'url';
4
- import { dirname as __pathDirname } from 'path';
5
- const require = __createRequire(import.meta.url);
6
- const __filename = __fileURLToPath(import.meta.url);
7
- const __dirname = __pathDirname(__filename);
8
- import{a as R,b as a}from"./chunk-LWCHQIJ7.mjs";import"./chunk-7SI6X3Z7.mjs";import{a as v}from"./chunk-RRWPDRYR.mjs";import"./chunk-GAOQHD5S.mjs";import"./chunk-UQVJQME2.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-3LG3ACQV.mjs";import"./chunk-AOPJ4Z6O.mjs";import"./chunk-AUUWQH3S.mjs";import{b as y}from"./chunk-W5OWBOLH.mjs";import"./chunk-MEQS4VPO.mjs";import{e as S,g as T}from"./chunk-HDHVBB6Q.mjs";import"./chunk-CE4RCNC7.mjs";import{b as j,e as $}from"./chunk-AKIN5WSQ.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-SVZHJZ5T.mjs";import{b as C,o as P}from"./chunk-CTWZQ7YI.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-D4S3IRD3.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import{a as g}from"./chunk-E66B27AL.mjs";$();P();T();import{createHash as x}from"node:crypto";function w(c){let t={goal:c.goal,eli10:c.eli10,stakes:c.stakes,acceptance_criteria:c.acceptance_criteria,scope:c.scope,out_of_scope:c.out_of_scope,risks:c.risks,test_plan:c.test_plan};return x("sha256").update(JSON.stringify(t)).digest("hex")}g(w,"computeAuditCandidateHash");function E(c,t){let e=S.get(c,"SELECT content FROM specs WHERE id = ?",t),n=(()=>{if(!e?.content)return null;try{return JSON.parse(e.content)}catch{return null}})(),r=S.query(c,"SELECT lens FROM spec_selected_reviewer WHERE spec_id = ?",t).map(o=>o.lens),s=new Set(S.query(c,"SELECT lens FROM spec_review WHERE spec_id = ? AND verdict = 'pass'",t).map(o=>o.lens));if(!(r.length>0?r.every(o=>s.has(o)):s.has("strategic")&&s.has("architecture")&&s.has("design")))return!1;let u=n?.audit_candidate_hash;if(!u)return!0;if(w(n)!==u)return!1;let p=n?.reviews??{};for(let o of r.length>0?r:Object.keys(p)){let d=p[o];if(!(!d||d.verdict!=="pass")&&d.candidateHash!==u)return!1}for(let o of r.length>0?r:["strategic","architecture","design"]){if(!s.has(o))continue;let d=p[o];if(!d||d.candidateHash!==u)return!1}return!0}g(E,"reviewsGatePassedRelational");async function A(c){try{let{stdout:t}=await C("git",["rev-parse","HEAD"],{cwd:c}),e=t.trim();return/^[0-9a-f]{7,40}$/.test(e)?e:null}catch{return null}}g(A,"readGitHead");var _=class{static{g(this,"SpecService")}async create(t,e){let n=await this.requireProjectId(t),{classifySpecCreate:r,shouldMirrorSpecToMemory:s}=await import("./precision-classifier-IVVAXE26.mjs"),l=r(e.title,e.content.goal);if(l.action==="refuse")throw new Error(`Cannot create empty spec (${l.reasonCode}): ${l.reason}`);let u=e.autoContext!==!1,p=e.content.notes??"",o=u&&!p.trim()?await import("./spec-context-inference-KER2R3F3.mjs").then(async({inferSpecContext:h,warnNoContextMatch:m})=>{let f=await h(e.title,n,t);return f.empty&&m(e.title),f.empty?p:f.notesBlock}):p,d=R.parse({goal:e.content.goal,eli10:e.content.eli10??"",stakes:e.content.stakes??"",acceptance_criteria:e.content.acceptance_criteria??[],scope:e.content.scope??[],out_of_scope:e.content.out_of_scope??[],risks:e.content.risks??[],test_plan:e.content.test_plan??[],reviews:e.content.reviews,linked_tasks:e.content.linked_tasks??[],notes:o}),i=a.create(n,{title:e.title,content:d,tags:e.tags});return s(i.title,i.content.goal)&&await v.remember(t,{type:"spec",content:`${i.title}
9
-
10
- Goal: ${i.content.goal}`,tags:{...e.tags??{},spec_id:i.id,status:i.status},source:i.id,provenance:"declared"}),i}async get(t,e){let n=await this.requireProjectId(t);return a.get(n,e)}async list(t,e={}){let n=await this.requireProjectId(t);return a.list(n,e)}async setStatus(t,e,n){let r=await this.requireProjectId(t),s=a.setStatus(r,e,n);return s&&await v.remember(t,{type:"spec",content:`Spec status \u2192 ${n}: ${s.title}`,tags:{spec_id:e,status:n,event:"status_change"},source:e}),s}async update(t,e,n){let r=await this.requireProjectId(t),s=a.get(r,e);if(!s)return null;let l=w(s.content),u=w(n),p=l!==u,o=p?{...n,reviews:{},selected_reviewers:[],audit_candidate_hash:null}:n;return p&&(s.status==="reviewed"||s.status==="in_progress")&&a.setStatus(r,e,"draft"),a.updateContent(r,e,o)}async recordReview(t,e,n,r){let s=await this.requireProjectId(t),l=3,u=50,p=g(async d=>{let i=a.get(s,e);if(!i)return null;let h=i.content.audit_candidate_hash??w(i.content);if(i.content.audit_candidate_hash&&w(i.content)!==i.content.audit_candidate_hash)throw new Error(`SPEC_CANDIDATE_DRIFT: body no longer matches audit_candidate_hash. Re-run \`prjct spec audit ${e}\` then re-record reviews.`);let m={...r,ts:j(),candidateHash:h},f={...i.content,audit_candidate_hash:h,reviews:{...i.content.reviews??{},[n]:m}};if(a.casUpdate(s,e,f,i.updatedAt))return a.get(s,e);if(d+1>=l)throw new Error(`SPEC_RECORD_REVIEW_CONFLICT_RETRY_EXHAUSTED: ${l} retries failed for spec ${e}`);return await new Promise(k=>setTimeout(k,u)),p(d+1)},"attemptReview"),o=await p(0);if(o&&E(s,e)&&o.status==="draft"){let{assessAcceptanceCriteria:d}=await import("./nyquist-lite-GE7OAFLC.mjs"),i=d(o.content.acceptance_criteria??[]);if(!i.ok&&i.message){let m=await y.readConfig(t).catch(()=>null),f=m?.tdd?.mode==="strict",b=m?.sdd?.mode==="strict";if(f||b)throw new Error(`NYQUIST_LITE_BLOCK: ${i.message}
11
- Rewrite acceptance criteria with verifiable signals, then re-record the last review.`);try{await v.remember(t,{type:"improvement-signal",content:i.message,tags:{source:"nyquist-lite",spec:e},provenance:"extracted",projectId:s})}catch{}}let h=a.setStatus(s,e,"reviewed");if(h){let{breakdownSpecToTasks:m}=await import("./spec-task-breakdown-YPJ76OWR.mjs");return await m(s,t,h),a.get(s,e)}return h}return o}async linkTask(t,e,n){let r=await this.requireProjectId(t);return a.linkTask(r,e,n)}async ship(t,e,n){let r=await this.requireProjectId(t);n!==void 0&&a.setShippedPr(r,e,n);let s=await A(t);return s&&a.setShippedSha(r,e,s),a.setStatus(r,e,"shipped")}unmetCriteria(t,e=new Set){return t.content.acceptance_criteria.filter(n=>!e.has(n))}async setSelectedReviewers(t,e,n){let r=await this.requireProjectId(t),s=a.get(r,e);if(!s)return null;let l=w(s.content);return a.updateContent(r,e,{...s.content,selected_reviewers:n,audit_candidate_hash:l,reviews:{}})}async requireProjectId(t){let e=await y.readConfig(t);if(!e?.projectId)throw new Error("not a prjct project (run `prjct init` first)");return e.projectId}},Q=new _;export{Q as specService};
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __createRequire } from 'module';
3
- import { fileURLToPath as __fileURLToPath } from 'url';
4
- import { dirname as __pathDirname } from 'path';
5
- const require = __createRequire(import.meta.url);
6
- const __filename = __fileURLToPath(import.meta.url);
7
- const __dirname = __pathDirname(__filename);
8
- import{b as d}from"./chunk-NWY5M34K.mjs";import{b as a}from"./chunk-LWCHQIJ7.mjs";import{a as m}from"./chunk-RRWPDRYR.mjs";import"./chunk-GAOQHD5S.mjs";import"./chunk-UQVJQME2.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-LT5WSSQO.mjs";import"./chunk-HJ4HEI45.mjs";import"./chunk-3LG3ACQV.mjs";import"./chunk-AOPJ4Z6O.mjs";import"./chunk-AUUWQH3S.mjs";import"./chunk-W5OWBOLH.mjs";import"./chunk-MEQS4VPO.mjs";import"./chunk-HDHVBB6Q.mjs";import"./chunk-CE4RCNC7.mjs";import{b as l,e as u}from"./chunk-AKIN5WSQ.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-SVZHJZ5T.mjs";import"./chunk-CTWZQ7YI.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-D4S3IRD3.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import{a as s}from"./chunk-E66B27AL.mjs";u();async function y(r,n,t){let c=t.content.acceptance_criteria;if(c.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(t.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let o=t.content.linked_tasks.length>0;if(o){await d.deleteByFeatureId(r,t.id);let e={...t.content,linked_tasks:[]};a.updateContent(r,t.id,e)}let i=await d.addTasks(r,c.map(e=>({description:p(e),body:e,priority:"medium",type:"feature",section:"backlog",featureId:t.id,groupId:t.id,groupName:t.title})));for(let e of i)a.linkTask(r,t.id,e.id);let k=a.get(r,t.id);if(k){let e={...k.content,tasks_created_at:l()};a.updateContent(r,t.id,e)}return await m.remember(n,{type:"spec",content:`Auto-breakdown: ${i.length} tasks created from ${t.title}${o?" (recovered from partial)":""}`,tags:{spec_id:t.id,event:"auto_breakdown",task_count:String(i.length),...o?{recovered:"partial"}:{}},source:t.id}),{taskIds:i.map(e=>e.id),...o?{recoveredFromPartial:!0}:{}}}s(y,"breakdownSpecToTasks");function p(r){let n=r.replace(/\s+/g," ").trim();return n.length<=140?n:`${n.slice(0,137)}\u2026`}s(p,"truncateForDescription");export{y as breakdownSpecToTasks};