prjct-cli 3.87.0 → 3.89.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 (219) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/bin/prjct +9 -2
  3. package/dist/bin/hook-chunks/agent-identity-45BYQBU2.mjs +8 -0
  4. package/dist/bin/hook-chunks/agent-switch-FBQDHWAO.mjs +22 -0
  5. package/dist/bin/hook-chunks/analysis-NRRZYJ6G.mjs +42 -0
  6. package/dist/bin/hook-chunks/auth-config-WNUARXTJ.mjs +8 -0
  7. package/dist/bin/hook-chunks/auto-flush-D3X3U4CP.mjs +8 -0
  8. package/dist/bin/hook-chunks/auto-updater-EHRRMCYY.mjs +9 -0
  9. package/dist/bin/hook-chunks/capture-gate-BFOABO2Y.mjs +8 -0
  10. package/dist/bin/hook-chunks/chunk-2H57GV2T.mjs +38 -0
  11. package/dist/bin/hook-chunks/chunk-2NMSEZTQ.mjs +8 -0
  12. package/dist/bin/hook-chunks/chunk-2OU2MKNS.mjs +8 -0
  13. package/dist/bin/hook-chunks/chunk-2UC4DTDO.mjs +9 -0
  14. package/dist/bin/hook-chunks/chunk-3FBCOCPD.mjs +8 -0
  15. package/dist/bin/hook-chunks/chunk-3HDIQJ55.mjs +19 -0
  16. package/dist/bin/hook-chunks/chunk-3JUE6MNF.mjs +8 -0
  17. package/dist/bin/hook-chunks/chunk-3LG3ACQV.mjs +8 -0
  18. package/dist/bin/hook-chunks/chunk-45I2C2UB.mjs +25 -0
  19. package/dist/bin/hook-chunks/chunk-4DDCWMI6.mjs +8 -0
  20. package/dist/bin/hook-chunks/chunk-4KY2EHXS.mjs +9 -0
  21. package/dist/bin/hook-chunks/chunk-4WHS7CO7.mjs +8 -0
  22. package/dist/bin/hook-chunks/chunk-54LH63LM.mjs +7 -0
  23. package/dist/bin/hook-chunks/chunk-5T5PZKHW.mjs +16 -0
  24. package/dist/bin/hook-chunks/chunk-5TBQNW2G.mjs +17 -0
  25. package/dist/bin/hook-chunks/chunk-5WAONIPX.mjs +8 -0
  26. package/dist/bin/hook-chunks/chunk-6EWGHM32.mjs +9 -0
  27. package/dist/bin/hook-chunks/chunk-6IKHMK2U.mjs +10 -0
  28. package/dist/bin/hook-chunks/chunk-75UJIVMO.mjs +10 -0
  29. package/dist/bin/hook-chunks/chunk-7OZDWT6C.mjs +9 -0
  30. package/dist/bin/hook-chunks/chunk-7SI6X3Z7.mjs +8 -0
  31. package/dist/bin/hook-chunks/chunk-A4OFZ2SK.mjs +19 -0
  32. package/dist/bin/hook-chunks/chunk-A5RNWWTH.mjs +9 -0
  33. package/dist/bin/hook-chunks/chunk-AKIN5WSQ.mjs +9 -0
  34. package/dist/bin/hook-chunks/chunk-AOPJ4Z6O.mjs +8 -0
  35. package/dist/bin/hook-chunks/chunk-AUUWQH3S.mjs +14 -0
  36. package/dist/bin/hook-chunks/chunk-AW25AWN5.mjs +31 -0
  37. package/dist/bin/hook-chunks/chunk-BISPGBNN.mjs +35 -0
  38. package/dist/bin/hook-chunks/chunk-BUDZL4DW.mjs +8 -0
  39. package/dist/bin/hook-chunks/chunk-CE4RCNC7.mjs +8 -0
  40. package/dist/bin/hook-chunks/chunk-CQHPIYNM.mjs +8 -0
  41. package/dist/bin/hook-chunks/chunk-CREPUNOS.mjs +24 -0
  42. package/dist/bin/hook-chunks/chunk-CTWZQ7YI.mjs +8 -0
  43. package/dist/bin/hook-chunks/chunk-CULYIJJZ.mjs +16 -0
  44. package/dist/bin/hook-chunks/chunk-D7TRY3CO.mjs +8 -0
  45. package/dist/bin/hook-chunks/chunk-DAOC3T5G.mjs +43 -0
  46. package/dist/bin/hook-chunks/chunk-DMXFGLZE.mjs +21 -0
  47. package/dist/bin/hook-chunks/chunk-DXQMKW2B.mjs +10 -0
  48. package/dist/bin/hook-chunks/chunk-DYHYDHCW.mjs +8 -0
  49. package/dist/bin/hook-chunks/chunk-E66B27AL.mjs +8 -0
  50. package/dist/bin/hook-chunks/chunk-EM6ZDJAK.mjs +45 -0
  51. package/dist/bin/hook-chunks/chunk-F652GI4F.mjs +15 -0
  52. package/dist/bin/hook-chunks/chunk-FGQZ62ZP.mjs +47 -0
  53. package/dist/bin/hook-chunks/chunk-GAOQHD5S.mjs +8 -0
  54. package/dist/bin/hook-chunks/chunk-GCKILEXJ.mjs +8 -0
  55. package/dist/bin/hook-chunks/chunk-GHBGBP2M.mjs +31 -0
  56. package/dist/bin/hook-chunks/chunk-GJFWVCTS.mjs +19 -0
  57. package/dist/bin/hook-chunks/chunk-GSMDQ7VM.mjs +16 -0
  58. package/dist/bin/hook-chunks/chunk-GVJZPOG2.mjs +13 -0
  59. package/dist/bin/hook-chunks/chunk-GVNMXVVA.mjs +8 -0
  60. package/dist/bin/hook-chunks/chunk-H6KVNDQD.mjs +71 -0
  61. package/dist/bin/hook-chunks/chunk-HDHVBB6Q.mjs +1260 -0
  62. package/dist/bin/hook-chunks/chunk-HDSS6UB3.mjs +8 -0
  63. package/dist/bin/hook-chunks/chunk-HE5RSIHG.mjs +8 -0
  64. package/dist/bin/hook-chunks/chunk-HJ4HEI45.mjs +8 -0
  65. package/dist/bin/hook-chunks/chunk-HZIORCPO.mjs +16 -0
  66. package/dist/bin/hook-chunks/chunk-HZXDF2TQ.mjs +8 -0
  67. package/dist/bin/hook-chunks/chunk-J6JZ4PQA.mjs +18 -0
  68. package/dist/bin/hook-chunks/chunk-JQE2F2RK.mjs +8 -0
  69. package/dist/bin/hook-chunks/chunk-JQLJM4BK.mjs +9 -0
  70. package/dist/bin/hook-chunks/chunk-KEJ5RMAI.mjs +9 -0
  71. package/dist/bin/hook-chunks/chunk-L4COZ7ZH.mjs +13 -0
  72. package/dist/bin/hook-chunks/chunk-LLQUB6YR.mjs +11 -0
  73. package/dist/bin/hook-chunks/chunk-LT5WSSQO.mjs +8 -0
  74. package/dist/bin/hook-chunks/chunk-LWCHQIJ7.mjs +11 -0
  75. package/dist/bin/hook-chunks/chunk-MECJJJ7R.mjs +10 -0
  76. package/dist/bin/hook-chunks/chunk-MEQS4VPO.mjs +8 -0
  77. package/dist/bin/hook-chunks/chunk-MXHX44WF.mjs +9 -0
  78. package/dist/bin/hook-chunks/chunk-N5WOHG36.mjs +8 -0
  79. package/dist/bin/hook-chunks/chunk-NJAMZSHM.mjs +26 -0
  80. package/dist/bin/hook-chunks/chunk-NLG2EW6M.mjs +8 -0
  81. package/dist/bin/hook-chunks/chunk-NN65WGGN.mjs +8 -0
  82. package/dist/bin/hook-chunks/chunk-NWY5M34K.mjs +12 -0
  83. package/dist/bin/hook-chunks/chunk-ODWWIFSN.mjs +9 -0
  84. package/dist/bin/hook-chunks/chunk-OFVLGJ76.mjs +8 -0
  85. package/dist/bin/hook-chunks/chunk-OVR6RUUZ.mjs +13 -0
  86. package/dist/bin/hook-chunks/chunk-P43HDWI5.mjs +14 -0
  87. package/dist/bin/hook-chunks/chunk-PKDYFXMI.mjs +8 -0
  88. package/dist/bin/hook-chunks/chunk-PSSR7LSW.mjs +8 -0
  89. package/dist/bin/hook-chunks/chunk-PTVXWPQH.mjs +8 -0
  90. package/dist/bin/hook-chunks/chunk-PW3KYKVS.mjs +9 -0
  91. package/dist/bin/hook-chunks/chunk-Q5I2UPD6.mjs +9 -0
  92. package/dist/bin/hook-chunks/chunk-QDQ7DTDV.mjs +8 -0
  93. package/dist/bin/hook-chunks/chunk-QSAA6LZF.mjs +8 -0
  94. package/dist/bin/hook-chunks/chunk-R77TXXPP.mjs +53 -0
  95. package/dist/bin/hook-chunks/chunk-RNCLLUMK.mjs +18 -0
  96. package/dist/bin/hook-chunks/chunk-SJ75V4WG.mjs +9 -0
  97. package/dist/bin/hook-chunks/chunk-SN224ILI.mjs +9 -0
  98. package/dist/bin/hook-chunks/chunk-SNISJ7HR.mjs +15 -0
  99. package/dist/bin/hook-chunks/chunk-SOPRYWUY.mjs +11 -0
  100. package/dist/bin/hook-chunks/chunk-SVZHJZ5T.mjs +9 -0
  101. package/dist/bin/hook-chunks/chunk-SYHDEUVU.mjs +10 -0
  102. package/dist/bin/hook-chunks/chunk-TPESWBA7.mjs +8 -0
  103. package/dist/bin/hook-chunks/chunk-TRMBRDKH.mjs +8 -0
  104. package/dist/bin/hook-chunks/chunk-TXJT3G53.mjs +10 -0
  105. package/dist/bin/hook-chunks/chunk-UDUUEZD3.mjs +11 -0
  106. package/dist/bin/hook-chunks/chunk-UUULLTQV.mjs +8 -0
  107. package/dist/bin/hook-chunks/chunk-V37VTXDW.mjs +10 -0
  108. package/dist/bin/hook-chunks/chunk-VAXQ5IDD.mjs +8 -0
  109. package/dist/bin/hook-chunks/chunk-WDGDFXSB.mjs +10 -0
  110. package/dist/bin/hook-chunks/chunk-WUHGODSQ.mjs +8 -0
  111. package/dist/bin/hook-chunks/chunk-X5RDLFPM.mjs +8 -0
  112. package/dist/bin/hook-chunks/chunk-XGYCAVB2.mjs +8 -0
  113. package/dist/bin/hook-chunks/chunk-Y5NQV46G.mjs +9 -0
  114. package/dist/bin/hook-chunks/chunk-YGHIPTJN.mjs +13 -0
  115. package/dist/bin/hook-chunks/chunk-YJMWY4Y6.mjs +8 -0
  116. package/dist/bin/hook-chunks/chunk-YORSHLFH.mjs +11 -0
  117. package/dist/bin/hook-chunks/chunk-YUOTOCKK.mjs +103 -0
  118. package/dist/bin/hook-chunks/chunk-ZTZTVBAZ.mjs +12 -0
  119. package/dist/bin/hook-chunks/chunk-ZX2KFQV5.mjs +11 -0
  120. package/dist/bin/hook-chunks/chunk-ZZ65CN5F.mjs +20 -0
  121. package/dist/bin/hook-chunks/client-SKFMAUI5.mjs +10 -0
  122. package/dist/bin/hook-chunks/code-graph-cloud-65GCWNII.mjs +8 -0
  123. package/dist/bin/hook-chunks/codex-skill-MNY46575.mjs +8 -0
  124. package/dist/bin/hook-chunks/command-installer-ZOQQLRCI.mjs +8 -0
  125. package/dist/bin/hook-chunks/config-manager-KJCMN7PV.mjs +8 -0
  126. package/dist/bin/hook-chunks/content-bound-stamp-72EQVZLP.mjs +10 -0
  127. package/dist/bin/hook-chunks/context-pressure-OUN5PFMN.mjs +8 -0
  128. package/dist/bin/hook-chunks/context7-service-4C6VNJUS.mjs +8 -0
  129. package/dist/bin/hook-chunks/custom-workflow-storage-M77INP6Z.mjs +8 -0
  130. package/dist/bin/hook-chunks/cwd-changed-KXOCN55N.mjs +8 -0
  131. package/dist/bin/hook-chunks/cycle-budget-card-O5WAGNGC.mjs +9 -0
  132. package/dist/bin/hook-chunks/database-SLDTQXWG.mjs +8 -0
  133. package/dist/bin/hook-chunks/delivery-geometry-VHCURJ7E.mjs +8 -0
  134. package/dist/bin/hook-chunks/detect-changes-6N4DCWXQ.mjs +17 -0
  135. package/dist/bin/hook-chunks/detection-MEYHME4X.mjs +8 -0
  136. package/dist/bin/hook-chunks/developer-evolution-R5BXQH6G.mjs +12 -0
  137. package/dist/bin/hook-chunks/discuss-lock-55GER2LR.mjs +8 -0
  138. package/dist/bin/hook-chunks/distill-R477XZE3.mjs +8 -0
  139. package/dist/bin/hook-chunks/drift-refresh-TD3PYPJN.mjs +8 -0
  140. package/dist/bin/hook-chunks/editors-config-3N6VREZR.mjs +8 -0
  141. package/dist/bin/hook-chunks/enriched-recall-65X44HBM.mjs +8 -0
  142. package/dist/bin/hook-chunks/exec-I7XE7NMD.mjs +8 -0
  143. package/dist/bin/hook-chunks/format-UF2TLTKX.mjs +8 -0
  144. package/dist/bin/hook-chunks/git-helpers-6JLP2OJZ.mjs +8 -0
  145. package/dist/bin/hook-chunks/infer-memory-file-PIAZ542H.mjs +8 -0
  146. package/dist/bin/hook-chunks/judgment-ledger-storage-UKROWRVA.mjs +8 -0
  147. package/dist/bin/hook-chunks/judgment-orchestrator-UFGNBTEK.mjs +8 -0
  148. package/dist/bin/hook-chunks/judgment-receipt-NXL5Q4CE.mjs +8 -0
  149. package/dist/bin/hook-chunks/land-cue-SRIIDHMN.mjs +9 -0
  150. package/dist/bin/hook-chunks/land-synthesis-ANVOY7AM.mjs +8 -0
  151. package/dist/bin/hook-chunks/legacy-crew-sweep-PSJCO5UP.mjs +24 -0
  152. package/dist/bin/hook-chunks/memory-index-7LM2BMWZ.mjs +10 -0
  153. package/dist/bin/hook-chunks/notification-2TZO3WRM.mjs +8 -0
  154. package/dist/bin/hook-chunks/nyquist-lite-GE7OAFLC.mjs +10 -0
  155. package/dist/bin/hook-chunks/pack-integrity-6VKUAISJ.mjs +10 -0
  156. package/dist/bin/hook-chunks/pack-manager-KQBNP6XR.mjs +8 -0
  157. package/dist/bin/hook-chunks/package-legitimacy-HXC4L73B.mjs +8 -0
  158. package/dist/bin/hook-chunks/path-manager-F2HE2GGK.mjs +8 -0
  159. package/dist/bin/hook-chunks/planning-ZQNNDOEL.mjs +9 -0
  160. package/dist/bin/hook-chunks/post-edit-AEFFZFPO.mjs +8 -0
  161. package/dist/bin/hook-chunks/pr-convention-7UGI7TFA.mjs +8 -0
  162. package/dist/bin/hook-chunks/pre-bash-3FACZOB5.mjs +11 -0
  163. package/dist/bin/hook-chunks/pre-commit-MDFDQ5QZ.mjs +8 -0
  164. package/dist/bin/hook-chunks/pre-edit-ORX656T5.mjs +11 -0
  165. package/dist/bin/hook-chunks/pre-package-ITHMLNGN.mjs +8 -0
  166. package/dist/bin/hook-chunks/pre-search-UFS2Z5VJ.mjs +9 -0
  167. package/dist/bin/hook-chunks/pre-secrets-IE5NX5X5.mjs +8 -0
  168. package/dist/bin/hook-chunks/precision-classifier-IVVAXE26.mjs +8 -0
  169. package/dist/bin/hook-chunks/precision-judgment-WPTCNTGV.mjs +8 -0
  170. package/dist/bin/hook-chunks/prjct-md-IKUVPUGT.mjs +8 -0
  171. package/dist/bin/hook-chunks/project-agent-surfaces-VCOI4GHT.mjs +8 -0
  172. package/dist/bin/hook-chunks/project-file-inventory-ZAPKPKY6.mjs +8 -0
  173. package/dist/bin/hook-chunks/project-memory-KRA3BH7A.mjs +8 -0
  174. package/dist/bin/hook-chunks/project-style-evolution-363CLE32.mjs +8 -0
  175. package/dist/bin/hook-chunks/prompt-6L7B546V.mjs +22 -0
  176. package/dist/bin/hook-chunks/publish-helper-I37V4L7U.mjs +8 -0
  177. package/dist/bin/hook-chunks/purge-IPK4NJN6.mjs +8 -0
  178. package/dist/bin/hook-chunks/retention-S2GGTVY2.mjs +8 -0
  179. package/dist/bin/hook-chunks/sdd-JIPV7QJP.mjs +10 -0
  180. package/dist/bin/hook-chunks/session-continuity-DABISZYM.mjs +11 -0
  181. package/dist/bin/hook-chunks/session-start-GJPAQ3GL.mjs +8 -0
  182. package/dist/bin/hook-chunks/settings-installer-QDM3GB6J.mjs +9 -0
  183. package/dist/bin/hook-chunks/setup-TG5O5TKD.mjs +142 -0
  184. package/dist/bin/hook-chunks/shipping-VCLQS7GP.mjs +13 -0
  185. package/dist/bin/hook-chunks/skill-index-OOVAXHYJ.mjs +12 -0
  186. package/dist/bin/hook-chunks/spec-context-inference-MOOQL2VC.mjs +15 -0
  187. package/dist/bin/hook-chunks/spec-service-33UDKWXT.mjs +11 -0
  188. package/dist/bin/hook-chunks/spec-task-breakdown-FES465AB.mjs +8 -0
  189. package/dist/bin/hook-chunks/state-storage-KNGP2CQV.mjs +8 -0
  190. package/dist/bin/hook-chunks/stop-IWI5SQG6.mjs +17 -0
  191. package/dist/bin/hook-chunks/subagent-start-NJZOWV2P.mjs +8 -0
  192. package/dist/bin/hook-chunks/subagent-stop-R6HIIVWQ.mjs +8 -0
  193. package/dist/bin/hook-chunks/surface-attribution-JYE6VDZR.mjs +8 -0
  194. package/dist/bin/hook-chunks/symbol-graph-LZM4RZXZ.mjs +8 -0
  195. package/dist/bin/hook-chunks/sync-analyzer-FKC57RTV.mjs +8 -0
  196. package/dist/bin/hook-chunks/sync-client-DJWOG2ZQ.mjs +8 -0
  197. package/dist/bin/hook-chunks/sync-cursor-storage-2VKG757H.mjs +19 -0
  198. package/dist/bin/hook-chunks/task-orchestration-MLOCR7GA.mjs +8 -0
  199. package/dist/bin/hook-chunks/task-overview-6ZQKJGSH.mjs +8 -0
  200. package/dist/bin/hook-chunks/task-service-NSS5SVJE.mjs +8 -0
  201. package/dist/bin/hook-chunks/tdd-AKXWUK2Y.mjs +10 -0
  202. package/dist/bin/hook-chunks/template-loader-KLKEG7XM.mjs +8 -0
  203. package/dist/bin/hook-chunks/transcript-jsonl-6X4DDD6R.mjs +8 -0
  204. package/dist/bin/hook-chunks/trust-boundary-ERMDF2C5.mjs +8 -0
  205. package/dist/bin/hook-chunks/usefulness-253CZLNY.mjs +8 -0
  206. package/dist/bin/hook-chunks/vault-retire-notice-GRT3QRLZ.mjs +9 -0
  207. package/dist/bin/hook-chunks/velocity-storage-UPW6TLK6.mjs +8 -0
  208. package/dist/bin/hook-chunks/weak-model-mode-JQ23PTXN.mjs +8 -0
  209. package/dist/bin/hook-chunks/work-graph-QJGNBVIP.mjs +49 -0
  210. package/dist/bin/hook-chunks/work-scope-C7BJX6QE.mjs +8 -0
  211. package/dist/bin/hook-chunks/workspace-occupancy-UVIRHY5Z.mjs +8 -0
  212. package/dist/bin/hook-chunks/worktree-service-XGRN5TTE.mjs +12 -0
  213. package/dist/bin/hook-fast-linux-x64 +0 -0
  214. package/dist/bin/prjct-core.mjs +625 -624
  215. package/dist/bin/prjct-hooks.mjs +3 -2282
  216. package/dist/bin/prjct.mjs +17 -2
  217. package/dist/daemon/entry.mjs +555 -554
  218. package/dist/mcp/server.mjs +196 -195
  219. package/package.json +1 -1
@@ -0,0 +1,8 @@
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 r,o}from"./chunk-CTWZQ7YI.mjs";import{a as i}from"./chunk-E66B27AL.mjs";o();import{existsSync as u}from"node:fs";import a from"node:path";var l=[".github/pull_request_template.md",".github/PULL_REQUEST_TEMPLATE.md",".github/PULL_REQUEST_TEMPLATE/default.md","docs/pull_request_template.md",".gitlab/merge_request_templates/default.md"];function m(t){for(let n of l)if(u(a.join(t,n)))return n;return null}i(m,"findPrTemplate");async function g(t){try{let{stdout:n}=await r("git",["remote","get-url","origin"],{cwd:t,timeout:3e3}),e=n.toString().trim();return e?/(^|[./@])github\.com([/:]|$)/.test(e)?"github":"other":null}catch{return null}}i(g,"getRemoteHost");async function f(t){let n=m(t);if(n)return{kind:"template",templatePath:n};let e=await g(t);return e==="github"?{kind:"github-ambiguous"}:e==="other"?{kind:"non-github"}:{kind:"no-remote"}}i(f,"detectPrConventionSignal");function h(t){return t.kind==="non-github"||t.kind==="no-remote"?"manual":"auto"}i(h,"defaultPrConventionFor");export{f as a,h as b};
@@ -0,0 +1,24 @@
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 g}from"./chunk-QDQ7DTDV.mjs";import{d,g as C}from"./chunk-HDHVBB6Q.mjs";import{b as f,e as E}from"./chunk-AKIN5WSQ.mjs";import{e as _,o as q}from"./chunk-CTWZQ7YI.mjs";import{a as s}from"./chunk-E66B27AL.mjs";E();C();function m(e){return{projectId:e.project_id,taskId:e.task_id,workspaceId:e.workspace_id,classification:e.classification,station:e.station,requiresSpec:e.requires_spec===1,requiresTestsFirst:e.requires_tests_first===1,reason:e.reason,linkedSpecId:e.linked_spec_id,createdAt:e.created_at,updatedAt:e.updated_at}}s(m,"toState");function y(e,t){let i=f(),r=d.query(e,`INSERT INTO task_pipeline_state (
9
+ project_id, task_id, workspace_id, classification, station,
10
+ requires_spec, requires_tests_first, reason, linked_spec_id,
11
+ created_at, updated_at
12
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
13
+ ON CONFLICT(project_id, task_id, workspace_id) DO UPDATE SET
14
+ classification = excluded.classification,
15
+ station = excluded.station,
16
+ requires_spec = excluded.requires_spec,
17
+ requires_tests_first = excluded.requires_tests_first,
18
+ reason = excluded.reason,
19
+ linked_spec_id = excluded.linked_spec_id,
20
+ updated_at = excluded.updated_at
21
+ RETURNING *`,e,t.taskId,t.workspaceId,t.classification,t.station,t.requiresSpec?1:0,t.requiresTestsFirst?1:0,t.reason,t.linkedSpecId??null,i,i)[0];if(!r)throw new Error("Task pipeline state upsert returned no row");return m(r)}s(y,"upsertTaskPipelineState");function N(e,t,i){let r=d.query(e,`SELECT * FROM task_pipeline_state
22
+ WHERE project_id = ? AND task_id = ? AND workspace_id = ?
23
+ LIMIT 1`,e,t,i)[0];return r?m(r):null}s(N,"getTaskPipelineState");q();import A from"node:fs/promises";import T from"node:path";var a="main";async function I(e){try{return await A.realpath(e)}catch{return e}}s(I,"safeRealpath");function l(e,t){return`${e} \xB7 ${t??"(detached)"}`}s(l,"buildLabel");var P=new Map,D=5e3;async function U(e){let t=Date.now(),i=P.get(e);if(i&&t-i.at<D)return i.ctx;let n=await R(e);return P.set(e,{ctx:n,at:t}),n}s(U,"deriveWorkspace");async function R(e){let t=await _(["rev-parse","--show-toplevel","--git-dir","--git-common-dir","--abbrev-ref","HEAD"],{cwd:e});if(!t.ok){let b=await I(e);return{workspaceId:a,worktreePath:b,shortId:a,isMain:!0,label:l(a),...t.kind==="exit"?{}:{gitError:t.kind}}}let[i="",n="",r="",c=""]=t.stdout.trim().split(`
24
+ `),S=i.trim(),w=n.trim(),x=r.trim(),o=c.trim()&&c.trim()!=="HEAD"?c.trim():void 0,h=T.resolve(e,w)===T.resolve(e,x),p=await I(S||e);if(h)return{workspaceId:a,worktreePath:p,shortId:a,branch:o,isMain:!0,label:l(a,o)};let u=g(p),k=u.slice(0,6);return{workspaceId:u,worktreePath:p,shortId:k,branch:o,isMain:!1,label:l(k,o)}}s(R,"computeWorkspace");export{y as a,N as b,a as c,U as d};
@@ -0,0 +1,8 @@
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 t,c as L}from"./chunk-E66B27AL.mjs";import{exec as A,execFile as O,spawn as h}from"node:child_process";import{promisify as M}from"node:util";function B(r){try{process.platform==="win32"?r.pid!==void 0&&h("taskkill",["/pid",String(r.pid),"/T","/F"],{stdio:"ignore"}).unref():r.pid!==void 0&&process.kill(-r.pid,"SIGKILL")}catch{}try{r.kill("SIGKILL")}catch{}}function y(r,e){if(r.length===0)return"";let o=Buffer.concat(r);return(o.length>e?o.subarray(0,e):o).toString("utf8")}function N(r){let e=r.code;return typeof e=="string"?e:void 0}function D(r,e,o={}){let s=o.timeoutMs??_,u=o.maxBuffer??U,b=u,T=o.spawnFn??h,d=[r,...e],$=Date.now(),f=t(()=>Date.now()-$,"duration");return o.signal?.aborted?Promise.resolve({ok:!1,kind:"timeout",budgetMs:0,budgetSource:"abort",args:d,stdout:"",stderr:"",durationMs:0}):new Promise(I=>{let w=[],P=[],i={settled:!1,overflow:!1,outBytes:0,errBytes:0},c=T(r,e,{cwd:o.cwd,env:o.env,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"]}),l=t(n=>{i.settled||(i.settled=!0,clearTimeout(F),o.signal?.removeEventListener("abort",E),I(n))},"finish"),k=t(()=>({stdout:y(w,b),stderr:y(P,b)}),"partials"),v=t((n,a)=>{B(c);let{stdout:p,stderr:m}=k();l({ok:!1,kind:"timeout",budgetMs:a,budgetSource:n,args:d,stdout:p,stderr:m,durationMs:f()})},"finishTimeout"),C=t(()=>{B(c);let{stdout:n,stderr:a}=k();l({ok:!1,kind:"overflow",maxBuffer:u,args:d,stdout:n,stderr:a||`maxBuffer exceeded (${u} bytes)`,durationMs:f()})},"finishOverflow"),F=setTimeout(()=>v("timeout",s),s),E=t(()=>v("abort",s),"onAbort");o.signal?.addEventListener("abort",E,{once:!0});let S=t((n,a)=>{i.settled||(a?(P.push(n),i.errBytes+=n.length):(w.push(n),i.outBytes+=n.length),!i.overflow&&i.outBytes+i.errBytes>u&&(i.overflow=!0,C()))},"onChunk");c.stdout?.on("data",n=>S(n,!1)),c.stderr?.on("data",n=>S(n,!0)),c.on("error",n=>{l({ok:!1,kind:"spawn",cause:n,code:N(n),args:d,durationMs:f()})}),c.on("close",(n,a)=>{if(i.settled)return;let{stdout:p,stderr:m}=k();l(n===0?{ok:!0,stdout:p,stderr:m,durationMs:f()}:{ok:!1,kind:"exit",code:n??-1,signal:a,stdout:p,stderr:m.trim(),args:d,durationMs:f()})})})}function G(r,e={}){return D("git",r,e)}function q(r){return!r.ok&&(r.kind==="timeout"||r.kind==="spawn"||r.kind==="overflow")}function H(r,e){return!Number.isInteger(e)||e<0?!1:!r.ok&&r.kind==="exit"&&r.code===e}function x(r,e=K){let s=r.replace(/[\r\n\t]+/g," ").replace(/\s+/g," ").trim().replace(/(?:[A-Za-z]:)?(?:\/|\\)(?:Users|home|tmp|var|private|Users)(?:\/|\\)[^\s]*/gi,"\u2026").replace(/\/(?:Users|home|tmp|var|private)\/[^\s]*/gi,"\u2026");return s.length<=e?s:`${s.slice(0,Math.max(0,e-1))}\u2026`}function R(r){return r.ok||r.kind==="exit"?null:r.kind==="timeout"?new g("timeout",r.args,r.budgetSource==="abort"?"aborted by caller signal":`exceeded ${r.budgetMs}ms`,{budgetSource:r.budgetSource}):r.kind==="overflow"?new g("overflow",r.args,`maxBuffer ${r.maxBuffer} bytes`):new g("spawn",r.args,r.cause.message)}function J(r){if(r.ok)return null;if(r.kind==="exit"){let e=r.stderr?` \u2014 ${x(r.stderr,120)}`:"",o=r.signal?` signal=${r.signal}`:"";return new Error(x(`command failed (exit ${r.code}${o}): ${r.args.join(" ")}${e}`))}return R(r)}function Q(r){throw r.ok?new Error("throwProc called on ok result"):J(r)??new Error(`process failed (${r.kind})`)}function W(r,e){if(r.ok)return e.ok(r);switch(r.kind){case"exit":return e.exit(r);case"timeout":return e.timeout(r);case"spawn":return e.spawn(r);case"overflow":return e.overflow(r);default:return r}}async function Y(r,e,o={}){let s=await G(e,{...o,cwd:r});if(s.ok)return s.stdout.trim();let u=R(s);if(u)throw u;return null}var V,Z,_,U,K,g,j=L(()=>{V=M(A),Z=M(O),_=1e4,U=1024*1024,K=240;t(B,"killProcessTree");t(y,"joinChunks");t(N,"nodeErrorCode");t(D,"runProc");t(G,"runGit");t(q,"isProcInfra");t(H,"exitCodeMeans");t(x,"sanitizeProcEnvelope");g=class extends Error{static{t(this,"GitInfraError")}kind;args;detail;budgetSource;constructor(e,o,s,u){super(x(`git ${e} failure (${o.join(" ")}): ${s}`)),this.name="GitInfraError",this.kind=e,this.args=o,this.detail=s,this.budgetSource=u?.budgetSource}};t(R,"gitInfraErrorOf");t(J,"procErrorOf");t(Q,"throwProc");t(W,"matchProc");t(Y,"gitStdout")});export{V as a,Z as b,K as c,D as d,G as e,q as f,H as g,x as h,g as i,R as j,J as k,Q as l,W as m,Y as n,j as o};
@@ -0,0 +1,16 @@
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 y}from"./chunk-DAOC3T5G.mjs";import{d as p,g as w}from"./chunk-HDHVBB6Q.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import{execFileSync as E}from"node:child_process";w();var f="land-auto",j="session-close";async function C(t){let n=S(t);if(!n)return{wrote:!1,content:null,reason:"nothing-to-land"};try{return await y.remember(t.projectPath,{type:"context",content:n,tags:{source:f,topic:j,capture:"land-v2",context_schema:"living-v2",synthesis:"deterministic"},provenance:"extracted",projectId:t.projectId}),{wrote:!0,content:n}}catch(e){return{wrote:!1,content:n,reason:`remember-failed: ${e.message}`}}}i(C,"synthesizeLandHandoff");function S(t){let n=t.cycleDescription?.trim()||null,e=L(t.projectId,t.cycleId),h=x(t.projectPath),a=k(t.projectId);if(!n&&e.length===0&&h.length===0&&a.length===0)return null;let o=[];n?o.push(`Session close: Work cycle "${c(n,120)}" still open or just closed.`):o.push("Session close: no open work cycle \u2014 landed repo + capture signals only."),o.push("Context synthesis: Passive land hand-off from durable signals (cycle, journal, commits, auto-captures). Not a model essay."),o.push(`Key data: source=${f}; topic=${j}; capture=land-v2`);let l=[];if(n&&l.push(`cycle="${c(n,100)}"`),e.length>0&&l.push(`journal: ${e.map(s=>c(s,70)).join(" \xB7 ")}`),l.length>0&&o.push(`What happened: ${l.join("; ")}`),e.length>0&&o.push(`Why it mattered: Journal trail shows progression \u2014 ${e.slice(0,2).map(s=>c(s,80)).join(" \xB7 ")}`),a.length>0){let s=a.filter(r=>r.type==="learning"||r.type==="decision"||r.type==="fact").slice(0,4),u=a.filter(r=>r.type==="gotcha"||r.type==="anti-pattern").slice(0,3);s.length>0&&o.push(`Learned this session: ${s.map(r=>`[${r.type}] ${c(r.content,100)}`).join(" \xB7 ")}`),u.length>0&&o.push(`Decision/trap: ${u.map(r=>`[${r.type}] ${c(r.content,100)}`).join(" \xB7 ")}`);let I=new Set([...s,...u]),g=a.filter(r=>!I.has(r)).slice(0,3);g.length>0&&s.length===0&&u.length===0&&o.push(`Decision/trap: ${g.map(r=>`[${r.type}] ${c(r.content,100)}`).join(" \xB7 ")}`)}h.length>0&&o.push(`Outcome: Recent commits: ${h.join("; ")}`),t.author&&o.push(`Who/author: ${t.author}`),t.model&&o.push(`Model: ${t.model}`);let m=t.tokensIn,d=t.tokensOut;if(m!=null||d!=null){let s=(m??0)+(d??0);o.push(`Token usage: in=${m??0} out=${d??0} total=${s} (compound judgment \u2014 not a fresh-window thrash loop)`)}o.push("Feature/domain: session-close"),o.push("Pattern: land auto-synthesis without agent remember"),o.push("Anti-pattern: relying on the model to remember to remember at session end"),o.push("Competitive: next window must `prjct prime` \u2014 act as this developer with SQLite judgment, not re-research from zero (GSD tax).");let $=n!=null?"Finish or pause the open cycle (`prjct status done` / `prjct pause`); next agent should `prjct work --md` or `prjct prime`.":"Next agent: `prjct prime` then pick from `prjct next --md`.";return o.push(`Next implication: ${$}`),o.join(" \xB7 ")}i(S,"buildLandHandoffContent");function L(t,n){try{return n?p.query(t,"SELECT content FROM task_log WHERE task_id = ? ORDER BY id DESC LIMIT 5",n).map(e=>e.content):p.query(t,"SELECT content FROM task_log ORDER BY id DESC LIMIT 5").map(e=>e.content)}catch{return[]}}i(L,"recentJournal");function x(t){try{return E("git",["log","-5","--oneline","--no-decorate"],{cwd:t,encoding:"utf-8",timeout:3e3,stdio:["ignore","pipe","ignore"]}).split(`
9
+ `).map(e=>e.trim()).filter(Boolean)}catch{return[]}}i(x,"recentCommits");function k(t){try{return p.query(t,`SELECT me.type, me.content
10
+ FROM memory_entries me
11
+ JOIN memory_entry_tags t ON t.entry_id = me.id
12
+ WHERE me.deleted_at IS NULL
13
+ AND t.key = 'source'
14
+ AND t.value IN ('transcript-auto', 'land-auto')
15
+ ORDER BY me.created_at DESC
16
+ LIMIT 8`).map(e=>({type:e.type,content:e.content}))}catch{return[]}}i(k,"recentAutoCaptures");function c(t,n){let e=t.replace(/\s+/g," ").trim();return e.length>n?`${e.slice(0,n-1)}\u2026`:e}i(c,"truncate");export{C as a,S as b};
@@ -0,0 +1,8 @@
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 l,c as f,d as u}from"./chunk-TPESWBA7.mjs";import{a as c}from"./chunk-LLQUB6YR.mjs";import{a as o}from"./chunk-E66B27AL.mjs";var m={none:0,frame:1,reviewed:2},y={none:0,after:1,first:2},p=o((e,n)=>m[e]>=m[n]?e:n,"maxSpec"),g=o((e,n)=>y[e]>=y[n]?e:n,"maxTest");function x(e){return e!=="docs"&&e!=="chore"}o(x,"isCodeKind");function E(e,n,t){let r=x(n);if(n==="research")return{model:"balanced",effort:"medium",spec:"none",tests:"none",fanout:"parallel",quality:"none",expectedPoints:2,directive:"",cast:[]};switch(e){case"H0":return{model:"fast",effort:"low",spec:"none",tests:"none",fanout:"direct",quality:"none",expectedPoints:1,directive:"",cast:[]};case"H1":return{model:"balanced",effort:"medium",spec:"none",tests:r?"after":"none",fanout:"direct",quality:r?"standard":"none",expectedPoints:2,directive:"",cast:[]};case"H2":return{model:"frontier",effort:"medium",spec:r?"frame":"none",tests:r?"first":"none",fanout:"parallel",quality:r?"standard":"none",expectedPoints:5,directive:"",cast:[]};default:return{model:"frontier",effort:t==="high"?"high":"medium",spec:r?"reviewed":"none",tests:r?"first":"none",fanout:"crew",quality:n==="security"||t==="high"||r?"full":"none",expectedPoints:8,directive:"",cast:[]}}}o(E,"baseline");function H(e,n,t,r){if(!x(n))return e;let s=t==="strict"?p(e.spec,"reviewed"):p(e.spec,t==="advisory"?"frame":"none"),a=r==="strict"?g(e.tests,"first"):g(e.tests,r==="assist"?"after":"none");return{...e,spec:s,tests:a}}o(H,"applyModeFloors");var h={none:"no spec",frame:'frame a lightweight spec (`prjct spec "<title>"`)',reviewed:'reviewed spec + audit panel (`prjct spec "<title>"` \u2192 `prjct spec audit <id>`)'},T={none:"no test ceremony",after:"leave a regression test behind",first:"tests BEFORE implementation"},w={direct:"do it yourself \u2014 no subagents",parallel:"DEFAULT multi-agent geometry: explore (fast) \u2192 implement (frontier) \u2192 review (balanced dual-blind); set EACH subagent model explicitly (they inherit yours otherwise: mem_3432). Stay single-thread only for a truly atomic one-file fix",crew:"DEFAULT crew geometry (`prjct crew`): leader + implementer + review lenses. Set EACH subagent model (Explore\u2192fast, implementer\u2192frontier, reviewers\u2192balanced) \u2014 they inherit your expensive model unless you fix it"},v={none:"no judgment tax (trivial)",standard:"quality auto: ledger opened; follow injected `prjct judgment next` card (one review + batch challenge)",full:"quality auto: ledger opened; follow injected next card (RED+BLUE dual-blind + batch refuters)"},S={fast:"fast/cheap model (e.g. haiku)",balanced:"balanced model (e.g. sonnet)",frontier:"frontier model (e.g. opus)"},O="Before implementing, forecast the diff size: if it will exceed ~400 changed lines, decide the delivery strategy NOW (split into stacked PRs / ship a first slice) instead of producing one unreviewable diff.";function P(e,n,t){let r=t.effort==="high"?", HIGH effort":t.effort==="low"?", low effort":"";if(e==="H0")return`Orchestrate (${e} ${n}): trivial \u2014 do it directly on a ${S[t.model]}${r}. ${h[t.spec]}, ${T[t.tests]}, ${w[t.fanout]}. ${v[t.quality]}. Don\u2019t burn frontier tokens on this. ${c}`;let s=e==="H2"||e==="H3"?` ${O}`:"",a=t.fanout==="parallel"||t.fanout==="crew"?" Multi-agent is the DEFAULT geometry for this harness class \u2014 do not collapse to a single-thread monologue unless the change is truly atomic.":"",i=t.cast.length>0?` ${l(t.cast)}. ${f(t.cast)}`:"";return`Orchestrate (${e} ${n}/${t.model}${r}): ${h[t.spec]}; ${T[t.tests]}; ${w[t.fanout]}; ${v[t.quality]}.${s}${a}${i} ${c}`}o(P,"renderDirective");function q(e){return e<50?1:e<150?2:e<400?5:8}o(q,"pointsFromDiffLines");function A(e){return e>=8?`\u26A0 Delegation trigger: ${e} files edited this cycle. This is no longer one change \u2014 split the remainder into its own cycle/PR and run a FRESH-context review of what's already written before \`prjct status done\`.`:e>=4?`\u21B3 Delegation trigger: ${e} files edited this cycle. Keep ONE writer thread; before closing, review the full diff with fresh eyes (subagent or re-read) \u2014 multi-file changes hide cross-file breaks.`:null}o(A,"renderDelegationTrigger");function D(e,n="off",t="off",r="off",s){let a=E(e.level,e.kind,e.risk),i=H(a,e.kind,n,t),b=r==="on"&&i.quality==="none"?"standard":r==="on"&&i.quality==="standard"?"full":i.quality,$=(s??`${e.level}:${e.kind}:${e.risk}`).trim(),C=u(i.fanout,$),d={...i,quality:b,cast:C};return{...d,directive:P(e.level,e.kind,d)}}o(D,"orchestrationFor");export{q as a,A as b,D as c};
@@ -0,0 +1,43 @@
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 A}from"./chunk-GAOQHD5S.mjs";import{a as O}from"./chunk-OFVLGJ76.mjs";import{a as w,b as I,h as B}from"./chunk-UUULLTQV.mjs";import{a as D,b as W,e as u,g as k}from"./chunk-HDHVBB6Q.mjs";import{c as S,d as T,e as v,f as N,g as M}from"./chunk-GCKILEXJ.mjs";import{a as h}from"./chunk-E66B27AL.mjs";k();W();B();var H=25,$=4,q=100,C=["supersedes","duplicates","superseded-by"];function L(r,e,t){let n=r.get(e);if(n!==void 0)return n;let i=t();return r.set(e,i),i}h(L,"getOrCreateMapValue");function U(r){try{let e=C.map(()=>"?").join(","),t=u.query(r,`SELECT t.entry_id, t.key, t.value
9
+ FROM memory_entry_tags t
10
+ JOIN memory_entries m ON m.id = t.entry_id
11
+ WHERE m.deleted_at IS NULL
12
+ AND t.is_machine = 0
13
+ AND t.key IN (${e})`,...C),n=new Map;for(let o of t){let a=L(n,o.entry_id,()=>({}));a[o.key]=o.value}let i=[...n.entries()].map(([o,a])=>({id:o,tags:a}));return M(i)}catch{return new Set}}h(U,"collectMirrorSupersededIds");function b(r,e){let t=new Map;if(e.length===0)return t;let n=e.map(()=>"?").join(","),i=u.query(r,`SELECT entry_id, key, value FROM memory_entry_tags WHERE entry_id IN (${n})`,...e);for(let o of i){let a=L(t,o.entry_id,()=>({}));a[o.key]=o.value}return t}h(b,"batchTagsByEntryId");function _(r,e,...t){let n=u.query(r,`SELECT id, type, content, provenance, created_at
14
+ FROM memory_entries
15
+ WHERE deleted_at IS NULL ${e}`,...t);if(n.length===0)return[];let i=b(r,n.map(o=>o.id));return n.map(o=>({id:o.id,type:o.type,content:o.content,tags:i.get(o.id)??{},rememberedAt:new Date(o.created_at).toISOString(),provenance:o.provenance??"declared"}))}h(_,"loadV2Entries");function x(r,e,t){if(t&&t.length>0){let n=t.map(()=>"?").join(",");return _(r,`AND type IN (${n}) ORDER BY created_at DESC, rowid DESC LIMIT ?`,...t,e)}return _(r,"ORDER BY created_at DESC, rowid DESC LIMIT ?",e)}h(x,"recallEntriesFromV2");var Y={applyTopicSupersession(r,e,t,n){try{let i=u.get(r,`SELECT COUNT(*) AS c FROM memory_entries
16
+ WHERE project_id = ? AND type = ? AND content_hash != ?
17
+ AND (topic_key = ? OR id IN (
18
+ SELECT entry_id FROM memory_entry_tags WHERE key IN ('topic', 'key') AND value = ?
19
+ ))`,r,e,t,n,n)?.c??0;u.run(r,`UPDATE memory_entries SET topic_key = ?, revision_count = ?
20
+ WHERE project_id = ? AND type = ? AND content_hash = ? AND deleted_at IS NULL`,n,i,r,e,t),u.run(r,`UPDATE memory_entries SET deleted_at = ?
21
+ WHERE project_id = ? AND type = ? AND deleted_at IS NULL AND content_hash != ?
22
+ AND (topic_key = ? OR id IN (
23
+ SELECT entry_id FROM memory_entry_tags WHERE key IN ('topic', 'key') AND value = ?
24
+ ))`,Date.now(),r,e,t,n,n)}catch{}},async remember(r,e){let t={...e.tags??{}},n=e.provenance??"declared",i=D(e.content);{let c=await import("./trust-boundary-ERMDF2C5.mjs").then(l=>l.evaluateMemoryContent).catch(()=>null);if(c){let l=c(e.content,{force:e.force});if(!l.allow){if(e.requireWrite)throw new Error(l.denyMessage);return}}}let{classifyCapturePrecision:o}=await import("./precision-classifier-IVVAXE26.mjs"),a=o(e.content,e.type,{force:e.force===!0});if(a.action==="refuse"){if(e.requireWrite)throw new Error(`precision refuse (${a.reasonCode}): ${a.reason}`);return}a.action==="demote"&&a.demoteTo&&(t.shape_demoted="true",t.original_type=e.type,t.precision_reason=a.reasonCode),e.force&&(t["precision:force"]="true");let m=a.action==="demote"&&a.demoteTo?a.demoteTo:e.type,d=e.projectId??await(async()=>{try{let{default:c}=await import("./config-manager-KJCMN7PV.mjs");return(await c.readConfig(r))?.projectId}catch{return}})();if(!t.file)try{let{inferMemoryFileTag:c}=await import("./infer-memory-file-PIAZ542H.mjs"),l=d?await(async()=>{try{let{stateStorage:E}=await import("./state-storage-KNGP2CQV.mjs"),p=(await E.getCurrentTask(d))?.likelyFiles;return Array.isArray(p)?p.map(f=>typeof f=="string"?f:f?.path).filter(f=>typeof f=="string"&&f.length>0):null}catch{return null}})():null,R=c({content:e.content,tags:t,projectPath:r,cycleFiles:l});R&&(t.file=R,t.file_source="inferred")}catch{}let y=t.topic??t.key;if(d){try{if(u.get(d,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",i,m)){y&&this.applyTopicSupersession(d,m,i,y);return}}catch{}try{let{captureGate:c}=await import("./capture-gate-BFOABO2Y.mjs"),l=c(d,m,e.content,t);if(!l.accept){if(e.requireWrite)throw new Error(`capture refused: ${l.reason}`);return}}catch(c){if(e.requireWrite&&c instanceof Error&&c.message.startsWith("capture refused"))throw c}}let s=await O.log(r,`${w}${m}`,{content:e.content,tags:t,source:e.source,provenance:n,content_hash:i,...d?{project_id:d}:{}},void 0,d||e.requireWrite?{...d?{projectId:d}:{},required:e.requireWrite}:void 0),g=d??s?.projectId;if(g&&y&&s?.eventId!=null&&this.applyTopicSupersession(g,m,i,y),s?.projectId)try{let{usefulnessService:c}=await import("./usefulness-253CZLNY.mjs");c.recordReferences(s.projectId,e.content,t),c.recordCorrection(s.projectId,t)}catch{}if(g)try{let{publishCRUD:c}=await import("./publish-helper-I37V4L7U.mjs"),l=t.spec_id??t.task_id??t.id??e.source??`mem-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await c({projectId:g,entityType:"memories",entityId:l,eventType:"upsert",data:{id:l,type:m,content:e.content,tags:t,source:e.source??null,provenance:n,created_at:new Date().toISOString(),rememberedAt:new Date().toISOString()}})}catch{}},searchFts(r,e,t){if(e.length===0||t<=0)return[];let n=e.map(s=>A(s).replace(/[^a-z0-9-]/gi,"")).filter(s=>s.length>=2);if(n.length===0)return[];let i=n.map(s=>`"${s}"*`).join(" OR "),o=(()=>{try{return u.query(r,`SELECT m.id, m.content, m.type, m.provenance, m.created_at
25
+ FROM memory_entries_fts ft
26
+ JOIN memory_entries m ON m.rowid = ft.rowid
27
+ WHERE memory_entries_fts MATCH ?
28
+ AND m.deleted_at IS NULL
29
+ ORDER BY bm25(memory_entries_fts) ASC, m.created_at DESC
30
+ LIMIT ?`,i,t*2)}catch{return[]}})();if(o.length===0)return[];let a=b(r,o.map(s=>s.id)),m=o.map(s=>({id:s.id,type:s.type??"fact",content:s.content,tags:a.get(s.id)??{},rememberedAt:new Date(s.created_at).toISOString(),provenance:s.provenance??"declared"})),d=U(r);return(d.size>0?m.filter(s=>!d.has(s.id)):m).slice(0,t)},recall(r,e={}){let t=e.limit??H,n=Math.max(t*$,q),i=e.types&&e.types.length>0?new Set(e.types):null,o=i?i.has("shipped"):!0,a=i?[...i].some(p=>p!=="shipped"):!0,m=i?[...i].filter(p=>p!=="shipped"):void 0,d=a?x(r,n,m):[],y=o?u.query(r,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",n):[],s=[...d,...y.map(S)],g=i?s.filter(p=>i.has(p.type)):s,c=e.tags?g.filter(p=>v(p,e.tags??{})):g,R=[...e.topic?c.filter(p=>T(p,e.topic)):c].sort((p,f)=>f.rememberedAt.localeCompare(p.rememberedAt)),E=e.dedupeByKey!==!1?N(R):R;return(()=>{if(e.pruneSuperseded===!1)return E;let p=M(E);return p.size>0?E.filter(f=>!p.has(f.id)):E})().slice(0,t)},recallForFile(r,e,t=3,n={}){if(!e)return[];let i=e.split("/").pop()??e,o=h(c=>c.type==="gotcha"||c.type==="red-herring"||c.type==="anti-pattern"||c.tags?.pattern==="recurring-bug","isPreventive"),a=Math.max(t*5,15),m=(()=>{try{return _(r,`AND file IS NOT NULL
31
+ AND (file = ? OR ? LIKE '%/' || file OR file = ? OR file LIKE '%/' || ?)
32
+ ORDER BY created_at DESC, rowid DESC
33
+ LIMIT ?`,e,e,i,i,a).filter(o)}catch{return[]}})(),d=n.preventiveOnly?[]:(()=>{try{return _(r,"AND type = ? ORDER BY created_at DESC, rowid DESC LIMIT 200","context").filter(l=>(l.tags?.files??"").split(",").map(E=>E.trim()).some(E=>E===e||E===i||E.endsWith(`/${i}`)))}catch{return[]}})(),y=[...m,...d],s=M(y);return(s.size>0?y.filter(c=>!s.has(c.id)):y).slice(0,t)},getById(r,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;try{return _(r,"AND id = ?",`mem_${t[1]}`)[0]??null}catch{return null}},countByType(r,e){try{return u.get(r,"SELECT COUNT(*) AS n FROM memory_entries WHERE project_id IN (?, 'local') AND type = ? AND deleted_at IS NULL",r,e)?.n??0}catch{return 0}},recallByType(r,e,t){if(t<=0)return[];try{return _(r,"AND type = ? ORDER BY created_at DESC, rowid DESC LIMIT ?",e,t)}catch{return[]}},forget(r,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return!1;let n=Number(t[1]),i=`mem_${n}`,o=(()=>{try{return u.get(r,"SELECT id FROM events WHERE id = ? AND type LIKE ?",n,`${I}%`)?(u.run(r,"DELETE FROM events WHERE id = ?",n),!0):!1}catch{return!1}})();try{u.run(r,"DELETE FROM memory_embeddings WHERE memory_id = ?",i)}catch{}let a=(()=>{try{return u.run(r,"UPDATE memory_entries SET deleted_at = ? WHERE id = ? AND deleted_at IS NULL",Date.now(),i).changes>0}catch{return!1}})();return o||a},expandWithLinks(r,e,t=5){if(e.length===0||t<=0)return[];let n=/\bmem[_-](\d+)\b/g,i=["resolves","relates","supersedes","superseded-by","duplicates","spec"],o=new Set(e.map(m=>m.id)),a=[];for(let m of e){if(a.length>=t)break;let d=new Set;for(let y of i){let s=m.tags?.[y];if(s)for(let g of String(s).matchAll(n))d.add(`mem_${g[1]}`)}for(let y of m.content.matchAll(n))d.add(`mem_${y[1]}`);for(let y of d){if(a.length>=t)break;if(o.has(y))continue;o.add(y);let s=Y.getById(r,y);s&&a.push(s)}}return a},unembeddedEntriesForIndex(r,e){try{let t=_(r,`AND type != ?
34
+ AND NOT EXISTS (
35
+ SELECT 1 FROM memory_embeddings me
36
+ WHERE me.memory_id = memory_entries.id AND me.model = ?
37
+ )
38
+ ORDER BY created_at DESC, rowid DESC`,"improvement-signal",e),n=u.query(r,`SELECT s.id, s.name, s.type, s.shipped_at, s.data FROM shipped_features s
39
+ WHERE NOT EXISTS (
40
+ SELECT 1 FROM memory_embeddings me
41
+ WHERE me.memory_id = 'ship_' || s.id AND me.model = ?
42
+ )
43
+ ORDER BY s.shipped_at DESC`,e);return[...t,...n.map(S)]}catch{return[]}},allEntriesForIndex(r){try{let e=_(r,"ORDER BY created_at DESC, rowid DESC"),t=u.query(r,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e,...t.map(S)]}catch{return[]}}};export{Y as a};
@@ -0,0 +1,21 @@
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 C}from"./chunk-HJ4HEI45.mjs";import{d as l,g as A}from"./chunk-HDHVBB6Q.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as t}from"zod";var O=t.enum(["improving","stable","declining"]),R=t.object({sprintNumber:t.number(),startDate:t.string(),endDate:t.string(),pointsCompleted:t.number(),tasksCompleted:t.number(),avgVariance:t.number(),estimationAccuracy:t.number()}),D=t.object({category:t.string(),avgVariance:t.number(),taskCount:t.number()}),I=t.object({totalPoints:t.number(),sprints:t.number(),estimatedDate:t.string()}),P=t.object({sprints:t.array(R),averageVelocity:t.number(),velocityTrend:O,estimationAccuracy:t.number(),overEstimated:t.array(D),underEstimated:t.array(D),lastUpdated:t.string()}),U=t.object({sprintLengthDays:t.number().min(1).max(90).default(7),startDay:t.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:t.number().min(1).max(52).default(6),accuracyTolerance:t.number().min(0).max(100).default(20)});var f={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""};A();var h=10080*60*1e3;function M(m){let r=new Date(m).getTime();return Number.isFinite(r)?Math.floor(r/h):null}d(M,"epochWeek");function k(m){return new Date(m*h).toISOString()}d(k,"weekStartIso");function w(m){return new Date((m+1)*h-1).toISOString()}d(w,"weekEndIso");var E=class extends C{static{d(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:f,lastUpdated:""}}getEventType(r){return`velocity.${r}d`}async recompute(r){let o=l.query(r,"SELECT completed_at FROM tasks WHERE completed_at IS NOT NULL"),_=l.query(r,"SELECT shipped_at FROM shipped_features"),c=new Map;for(let a of o){let n=M(a.completed_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.tasks++,c.set(n,p)}for(let a of _){let n=M(a.shipped_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.ships++,c.set(n,p)}for(let[a,n]of c)l.run(r,`INSERT INTO velocity_sprints
9
+ (sprint_number, points_completed, tasks_completed, estimation_accuracy, avg_variance, started_at, ended_at)
10
+ VALUES (?, ?, ?, 0, 0, ?, ?)
11
+ ON CONFLICT(sprint_number) DO UPDATE SET
12
+ points_completed = excluded.points_completed,
13
+ tasks_completed = excluded.tasks_completed,
14
+ started_at = excluded.started_at,
15
+ ended_at = excluded.ended_at`,a,n.ships+n.tasks,n.tasks,k(a),w(a));let y=await this.getMetrics(r);await this.publishEntityEvent(r,"velocity","updated",{averageVelocity:y.averageVelocity,trend:y.velocityTrend,sprintCount:y.sprints.length})}async getMetrics(r){let o=l.query(r,"SELECT * FROM velocity_sprints ORDER BY sprint_number DESC LIMIT 12");if(o.length===0)return f;let _=o.slice().reverse().map(e=>({sprintNumber:e.sprint_number,startDate:e.started_at??k(e.sprint_number),endDate:e.ended_at??w(e.sprint_number),pointsCompleted:e.points_completed,tasksCompleted:e.tasks_completed,avgVariance:e.avg_variance,estimationAccuracy:e.estimation_accuracy})),c=o.slice(0,6),y=c.reduce((e,u)=>e+u.points_completed,0)/Math.max(1,c.length),a=o.slice(0,3).reduce((e,u)=>e+u.points_completed,0),n=o.slice(3,6).reduce((e,u)=>e+u.points_completed,0),p=o.length<6?"stable":a>n*1.15?"improving":a<n*.85?"declining":"stable",T=[],v=[],L=(()=>{try{let e=l.query(r,`SELECT type,
16
+ CAST(json_extract(data, '$.expectedPoints') AS REAL) AS expected,
17
+ CAST(json_extract(data, '$.actualPoints') AS REAL) AS actual
18
+ FROM tasks
19
+ WHERE status = 'completed'
20
+ AND json_extract(data, '$.expectedPoints') IS NOT NULL
21
+ AND json_extract(data, '$.actualPoints') IS NOT NULL`);if(e.length>0){let u=[1,2,5,8],V=d(i=>u.findIndex(s=>s>=i),"step"),x=e.reduce((i,s)=>{let g=V(s.actual)-V(s.expected);Math.abs(g)<=1&&i.accurate++;let b=s.type??"unknown",S=i.byType.get(b)??{sum:0,n:0};return S.sum+=(s.actual-s.expected)/s.expected*100,S.n++,i.byType.set(b,S),i},{accurate:0,byType:new Map});for(let[i,s]of x.byType){let g=Math.round(s.sum/s.n),b={category:i,avgVariance:g,taskCount:s.n};g<=-20?T.push(b):g>=20&&v.push(b)}return Math.round(x.accurate/e.length*100)}return 0}catch{return 0}})();return{sprints:_,averageVelocity:y,velocityTrend:p,estimationAccuracy:L,overEstimated:T,underEstimated:v,lastUpdated:new Date().toISOString()}}},$=new E;export{M as a,$ as b};
@@ -0,0 +1,10 @@
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 o}from"./chunk-E66B27AL.mjs";var k=/^(current work|wip|todo|misc|n\/a|none|latest|unreleased|changelog|ok|yes|no|test|asdf|xxx|foo|bar|baz|null|undefined)$/i,w=/^(todo_write|todo_read|judgment status|judgment next|mem get|memory get|spec_get|analysis-get|prjct (work|ship|sync|land|prime|status|help)|p\.\s*\w+)$/i,y=/^(mem[_-]?\d+|mem get mem[_-]?\d+)$/i,R=new Set(["inbox","todo","idea","question"]);function _(r,e){let t=r.trim().replace(/\s+/g," ");if(t.length===0)return{junk:!0,reason:"empty content"};if(k.test(t))return{junk:!0,reason:"noise phrase"};if(w.test(t))return{junk:!0,reason:"tool/command dump"};if(y.test(t))return{junk:!0,reason:"bare mem id dump"};let n=!e||R.has(e);if(n&&t.length<=12)return{junk:!0,reason:"too short (\u226412 chars)"};if(!/[\s.:;,—–\-/?!]/.test(t)&&t.length<40){if(t.includes("_")&&/^[a-z][a-z0-9_]*$/i.test(t))return{junk:!0,reason:"single-token dump / tool name"};if(n&&/^[a-z][a-z0-9_]*$/i.test(t)&&t.length<=24)return{junk:!0,reason:"single-token dump / tool name"}}if(n){let a=t.split(" ");if(a.length<=3&&t.length<=32&&/^[a-z0-9_ -]+$/i.test(t)){let s=a[0]?.toLowerCase()??"";if(["todo","judgment","insights","workflow","spec","analysis","harness","memory","prjct"].includes(s))return{junk:!0,reason:"short command-like dump"}}}return{junk:!1,reason:"ok"}}o(_,"isJunkCaptureContent");var C=new Set(["inbox","todo","idea","question"]),g=/^(?:get\s+)?[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$|^[0-9a-f]{16,64}$|^[a-z]*[_-]?[0-9a-f]{8,}$/i,d=/\b(add|build|create|fix|implement|migrate|refactor|remove|replace|ship|support|enable|disable|update|upgrade|design|audit|verify|ensure|prevent|allow|block|wire|integrate|document|test|measure|reduce|increase|hacer|agregar|crear|arreglar|implementar|migrar|eliminar|actualizar|soportar|permitir|bloquear|integrar|documentar|verificar|evitar)\b/i,c=/\b(was|were|wasn't|weren't|had been|used to|era|eran|fue|fueron|estaba|estaban|fixed|fix:|resolved|root cause|because|caused|broke|broken|failed|failure|don't|do not|never|always|must not|must never|sin\s+eso|no era|no fue|no es rls|wasn't|instead|rather than|anti-pattern|gotcha:|trap:)\b/i,x=/^(reviso|revisando|voy a|estoy|vamos a|i('ll| will)|i am |i'm |checking|looking at|let me |need to |tengo que |hay que |todo:|wip:)/i,E=/\b(no era necesario|no era necesaria|no fue necesario|wasn't hard|was not hard|wasn't easy|was not easy|wasn't difficult|no fue difícil|wasn't necessary|was not necessary)\b/i,S=/\b(no era rls|no fue rls|no es rls|not the cause|red herring|false lead|not an? rls\b|not a(?:n)? rls\b|is not (?:an? )?rls(?:\s+bug)?|was not (?:an? )?rls(?:\s+bug)?|this is not (?:an? )?(?:rls|auth)|is not the bottleneck|not the bottleneck)\b/i,j=/\b(?:no era|no fue)\s+(?!necesario|necesaria|difícil|facil|fácil)([a-z][\w-]{1,40})\b/i,v=/\b(?:wasn't|was not|weren't|were not)\s+(?!hard|easy|difficult|necessary|needed)((?:an?\s+)?[a-z][\w-]{1,40})\b/i,T=/\b(causa real|root cause|fix:|real cause|was correct|were correct|estaban (?:perfectas|correctas|bien)|already (?:wraps|wrapped)|declare|volatile|instead|en realidad|coincidencia|misleading|actually|policies (?:were|estaban)|can_access_company)\b/i;function m(r){return r.trim().replace(/\s+/g," ").toLowerCase()}o(m,"normalize");function h(r){return r.replace(/^goal:\s*/i,"").trim()}o(h,"stripGoalPrefix");function p(r){let e=r.trim().match(/^([\s\S]*?)\n\nGoal:\s*([\s\S]+)$/i);return e?{title:e[1].trim(),goal:e[2].trim()}:null}o(p,"parseSpecMirrorContent");function u(r,e){let t=m(r),n=m(h(e));return!!(!t||!n||t===n||t.replace(/^get\s+/i,"")===n.replace(/^get\s+/i,"")&&g.test(n.replace(/^get\s+/i,"")))}o(u,"isEmptySpecMirror");function l(r){let e=m(h(r));if(!e||g.test(e))return!0;if(/^(get|show|open|fetch|load|ver|obtener)\s+\S+$/i.test(e)&&!d.test(e)){let t=e.replace(/^(get|show|open|fetch|load|ver|obtener)\s+/i,"");if(g.test(t)||/^[a-z0-9_-]{8,}$/i.test(t))return!0}return!1}o(l,"isBareIdBody");function $(r){let e=r.trim();if(!e)return!0;let t=e.replace(/\s+/g," ");return!!(/:\s*$/.test(t)&&!c.test(t)||x.test(t)&&!c.test(t)||!c.test(t)&&t.length<80&&/^(reviso|checking|looking)\b/i.test(t))}o($,"isOpenGotchaNarration");function N(r){let e=r.trim().replace(/\s+/g," ");return!e||E.test(e)||/\bno es\s+[\w-]+-related\b/i.test(e)&&!/\b(causa real|root cause|fix:|was correct|were correct|policies)\b/i.test(e)||!(S.test(e)||j.test(e)||v.test(e)&&!/\bwasn't hard\b/i.test(e))?!1:/\b(no era rls|no fue rls|not the cause|red herring|false lead|not an? rls\b|is not (?:an? )?rls(?:\s+bug)?|this is not (?:an? )?rls)\b/i.test(e)?!0:T.test(e)||c.test(e)}o(N,"looksLikeRedHerring");function O(r){let e=r.trim().replace(/\s+/g," ");if(e.length<12)return!0;let t=e.split(" ").filter(s=>s.length>1);if(t.length<2)return!0;let n=new Set(["the","a","an","to","for","and","or","of","in","on","it","this","that","el","la","de","en","y","o","un","una","por","para"]);return t.filter(s=>!n.has(s.toLowerCase())).length<2}o(O,"lacksInboxSubstance");function P(r,e,t={}){let n=(r??"").trim();if(!n)return{action:"refuse",reasonCode:"empty_content",reason:"empty content"};if(t.force)return{action:"accept",reasonCode:"forced",reason:"force override"};let a=_(n,e);if(a.junk)return{action:"refuse",reasonCode:"junk",reason:`junk capture: ${a.reason}`};if(e==="spec"){let s=t.title??p(n)?.title??"",f=t.goal??p(n)?.goal??n;if(s&&f&&u(s,f))return{action:"refuse",reasonCode:"empty_spec_mirror",reason:"empty spec: goal identical to title (lookup, not a goal)"};let i=p(n);if(i&&u(i.title,i.goal))return{action:"refuse",reasonCode:"empty_spec_mirror",reason:"empty spec: goal identical to title (lookup, not a goal)"};let b=i?.goal??f??n;if(l(b)&&!d.test(b))return{action:"refuse",reasonCode:"bare_id_body",reason:"empty spec: body is an id/lookup without an action verb"}}if(t.title!==void 0&&t.goal,e==="gotcha"){if($(n))return{action:"demote",reasonCode:"gotcha_open_narration",reason:"open narration is not a gotcha \u2014 demote to context",demoteTo:"context"};if(N(n))return{action:"demote",reasonCode:"gotcha_is_red_herring",reason:"negative knowledge (not-the-cause) \u2014 store as red-herring",demoteTo:"red-herring"}}return e&&C.has(e)&&O(n)?{action:"refuse",reasonCode:"inbox_no_substance",reason:"sub-substance low-stakes capture \u2014 keep out of brief"}:{action:"accept",reasonCode:"ok",reason:"ok"}}o(P,"classifyCapturePrecision");function D(r,e){let t=r.trim(),n=e.trim();return!t||!n?{action:"refuse",reasonCode:"empty_content",reason:"empty title or goal"}:l(n)&&!d.test(n)?{action:"refuse",reasonCode:"bare_id_body",reason:"empty spec: goal is an id/lookup without an action verb"}:u(t,n)&&l(t)?{action:"refuse",reasonCode:"empty_spec_mirror",reason:"empty spec: goal identical to title (lookup, not a goal)"}:{action:"accept",reasonCode:"ok",reason:"ok"}}o(D,"classifySpecCreate");function H(r,e){return u(r,e)||l(e)&&!d.test(e)?!1:P(`${r}
9
+
10
+ Goal: ${e}`,"spec",{title:r,goal:e}).action==="accept"}o(H,"shouldMirrorSpecToMemory");function G(r){return r&&r.replace(/^Context synthesis:\s*/i,"").replace(/(\s*[·|]\s*)Context synthesis:\s*/gi,"$1").replace(/^\s*[·|]\s*/,"").trim()}o(G,"stripPipelineLabelsForHuman");export{_ as a,p as b,u as c,l as d,$ as e,N as f,O as g,P as h,D as i,H as j,G as k};
@@ -0,0 +1,8 @@
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}from"./chunk-E66B27AL.mjs";var n={error:0,warn:1,info:2,debug:3},u=new Set(["1","true","*"]);function a(){let e=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!e)return{level:-1,name:"disabled"};if(u.has(e)||e.includes("prjct"))return{level:n.debug,name:"debug"};let o=n[e]??-1,t=o>=0?e:"disabled";return{level:o,name:t}}r(a,"getLogLevel");var{level:g,name:s}=a(),L=r(()=>{},"noop");function l(e,o,t){return g>=e?(...c)=>console[t](o,...c):L}r(l,"createLogMethod");var v={error:l(n.error,"[prjct:error]","error"),warn:l(n.warn,"[prjct:warn]","warn"),info:l(n.info,"[prjct:info]","log"),debug:l(n.debug,"[prjct:debug]","log"),isEnabled:r(()=>g>=0,"isEnabled"),level:r(()=>s,"level")},d=v;export{d as a};
@@ -0,0 +1,8 @@
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
+ var f=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var k=(a,b)=>f(a,"name",{value:b,configurable:!0}),l=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var m=(a,b,c)=>()=>{if(c)throw c[0];try{return a&&(b=a(a=0)),b}catch(d){throw c=[d],d}};var n=(a,b)=>{for(var c in b)f(a,c,{get:b[c],enumerable:!0})},j=(a,b,c,d)=>{if(b&&typeof b=="object"||typeof b=="function")for(let e of h(b))!i.call(a,e)&&e!==c&&f(a,e,{get:()=>b[e],enumerable:!(d=g(b,e))||d.enumerable});return a};var o=a=>j(f({},"__esModule",{value:!0}),a);export{k as a,l as b,m as c,n as d,o as e};
@@ -0,0 +1,45 @@
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{d as o,g as y}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";import{createHash as f}from"node:crypto";import{z as u}from"zod";var d=u.string().trim().min(1).max(200),v=u.string().trim().min(1).max(2e3),T=u.enum(["open","resolved","false_positive"]),g=u.object({source:d,runtime:d,model:d,sessionId:d.nullish(),taskId:d.nullish(),category:d,expectedBehavior:v,observedBehavior:v,relatedRuleId:d.nullish(),occurredAt:u.string().datetime().optional()}).strict(),N=g.omit({occurredAt:!0}).extend({id:u.string().min(1),projectId:u.string().min(1),dedupKey:u.string().length(64),disposition:T,occurredAt:u.string().datetime(),createdAt:u.string().datetime()}).strict();y();var b="instruction.guidance.activated",D=90,A=m(t=>t.normalize("NFKC").trim().replace(/\s+/g," ").toLocaleLowerCase("en-US"),"normalizedBehavior"),C=m(t=>f("sha256").update(JSON.stringify([t.source,t.sessionId??"",t.category,A(t.expectedBehavior),A(t.observedBehavior),t.relatedRuleId??""])).digest("hex"),"dedupKeyFor"),S=m(t=>N.parse({id:t.id,projectId:t.project_id,dedupKey:t.dedup_key,source:t.source,runtime:t.runtime,model:t.model,sessionId:t.session_id,taskId:t.task_id,category:t.category,expectedBehavior:t.expected_behavior,observedBehavior:t.observed_behavior,relatedRuleId:t.related_rule_id,disposition:t.disposition,occurredAt:t.occurred_at,createdAt:t.created_at}),"rowToFailure"),I=class{static{m(this,"InstructionFailureStorage")}record(i,n){let e=g.parse(n),c=C(e),a=`if_${c.slice(0,24)}`,E=new Date().toISOString(),_=e.occurredAt??E,l=o.query(i,`INSERT OR IGNORE INTO instruction_failures
9
+ (id, project_id, dedup_key, source, runtime, model, session_id, task_id, category,
10
+ expected_behavior, observed_behavior, related_rule_id, disposition, occurred_at, created_at)
11
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'open', ?, ?)
12
+ RETURNING *`,a,i,c,e.source,e.runtime,e.model,e.sessionId??null,e.taskId??null,e.category,e.expectedBehavior,e.observedBehavior,e.relatedRuleId??null,_,E);if(l[0])return{inserted:!0,failure:S(l[0])};let s=o.get(i,"SELECT * FROM instruction_failures WHERE dedup_key = ?",c);if(!s)throw new Error("Instruction failure insert did not produce a readable row");let p=s.runtime==="unknown"&&e.runtime!=="unknown",r=s.model==="unknown"&&e.model!=="unknown",R=p||r?o.query(i,"UPDATE instruction_failures SET runtime = ?, model = ? WHERE id = ? RETURNING *",p?e.runtime:s.runtime,r?e.model:s.model,s.id)[0]??s:s;return{inserted:!1,failure:S(R)}}getById(i,n){let e=o.get(i,"SELECT * FROM instruction_failures WHERE id = ?",n);return e?S(e):null}setDisposition(i,n,e){return o.run(i,"UPDATE instruction_failures SET disposition = ? WHERE id = ?",e,n).changes===1}recordGuidanceActivation(i,n){return o.appendEvent(i,b,{sessionId:n.sessionId??null,ruleId:n.ruleId??null},n.taskId??void 0)}getWindowStats(i,n){let e=n.toISOString(),c=n.getTime(),a=o.get(i,`SELECT COUNT(*) AS total,
13
+ COALESCE(SUM(CASE WHEN runtime <> 'unknown' AND model <> 'unknown' THEN 1 ELSE 0 END), 0) AS attributed,
14
+ COALESCE(SUM(CASE WHEN disposition = 'open' THEN 1 ELSE 0 END), 0) AS open_count,
15
+ COALESCE(SUM(CASE WHEN disposition = 'resolved' THEN 1 ELSE 0 END), 0) AS resolved_count,
16
+ COALESCE(SUM(CASE WHEN disposition = 'false_positive' THEN 1 ELSE 0 END), 0) AS false_positive_count
17
+ FROM instruction_failures
18
+ WHERE project_id = ? AND occurred_at >= ?`,i,e),E=o.query(i,`SELECT runtime, model, category, COUNT(*) AS total,
19
+ SUM(CASE WHEN disposition = 'open' THEN 1 ELSE 0 END) AS open_count,
20
+ SUM(CASE WHEN disposition = 'resolved' THEN 1 ELSE 0 END) AS resolved_count,
21
+ SUM(CASE WHEN disposition = 'false_positive' THEN 1 ELSE 0 END) AS false_positive_count
22
+ FROM instruction_failures
23
+ WHERE project_id = ? AND occurred_at >= ?
24
+ GROUP BY runtime, model, category
25
+ ORDER BY total DESC, runtime ASC, model ASC, category ASC`,i,e).map(r=>({runtime:r.runtime,model:r.model,category:r.category,total:r.total,open:r.open_count,resolved:r.resolved_count,falsePositive:r.false_positive_count})),_=o.query(i,`SELECT * FROM instruction_failures
26
+ WHERE project_id = ? AND disposition = 'open' AND occurred_at >= ?
27
+ ORDER BY occurred_at DESC, id ASC LIMIT 20`,i,e).map(r=>({id:r.id,runtime:r.runtime,model:r.model,category:r.category,observedBehavior:r.observed_behavior,relatedRuleId:r.related_rule_id,occurredAt:r.occurred_at})),l=o.get(i,`SELECT COUNT(*) AS total,
28
+ COALESCE(SUM(CASE WHEN runtime <> 'unknown' AND model <> 'unknown' THEN 1 ELSE 0 END), 0) AS attributed
29
+ FROM agent_sessions WHERE project_id = ? AND started_at >= ?`,i,e)??{total:0,attributed:0},s=o.get(i,`SELECT COUNT(DISTINCT me.id) AS value
30
+ FROM memory_entries me
31
+ INNER JOIN memory_entry_tags met ON met.entry_id = me.id
32
+ WHERE me.project_id = ? AND me.type = 'improvement-signal'
33
+ AND me.deleted_at IS NULL AND me.created_at >= ?
34
+ AND met.key = 'source'
35
+ AND met.value IN ('friction-detector', 'skill-miss-detector')
36
+ AND (NOT EXISTS (
37
+ SELECT 1 FROM memory_entry_tags attribution
38
+ WHERE attribution.entry_id = me.id
39
+ AND attribution.key = 'runtime'
40
+ ) OR NOT EXISTS (
41
+ SELECT 1 FROM memory_entry_tags attribution
42
+ WHERE attribution.entry_id = me.id
43
+ AND attribution.key = 'model'
44
+ ))`,i,c)?.value??0,p=o.get(i,"SELECT COUNT(*) AS value FROM events WHERE type = ? AND timestamp >= ?",b,e)?.value??0;return{total:a?.total??0,attributed:a?.attributed??0,open:a?.open_count??0,resolved:a?.resolved_count??0,falsePositive:a?.false_positive_count??0,observedSessions:l.total,attributedSessions:l.attributed,legacyUnattributedInputs:s,guidanceActivations:p,groups:E,unresolved:_}}pruneRetained(i,n=new Date){let e=new Date(n.getTime()-D*864e5);return o.run(i,`DELETE FROM instruction_failures
45
+ WHERE project_id = ? AND disposition IN ('resolved', 'false_positive') AND occurred_at < ?`,i,e.toISOString()).changes}},U=new I;export{U as a};
@@ -0,0 +1,15 @@
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{c as j}from"./chunk-SNISJ7HR.mjs";import{k as w}from"./chunk-AKIN5WSQ.mjs";import{c as C}from"./chunk-JQE2F2RK.mjs";import{j as r,n as u}from"./chunk-SVZHJZ5T.mjs";import{c as A}from"./chunk-GSMDQ7VM.mjs";import{b as l,c,d as h,e as d}from"./chunk-SYHDEUVU.mjs";import{c as R,e as G}from"./chunk-HE5RSIHG.mjs";import{a as s}from"./chunk-E66B27AL.mjs";u();import a from"node:path";var b=`${h}
9
+ - project facts (stack/commands): see \`PRJCT.md\``,P=`${l}
10
+ ${b}
11
+ ${c}
12
+ `;async function T(e){return d(e,"AGENTS.md",P)}s(T,"writeProjectAgentsMd");var D="@PRJCT.md",I=`${l}
13
+ ${D}
14
+ ${c}
15
+ `;async function N(e){return d(e,"CLAUDE.md",I)}s(N,"writeProjectClaudeMd");import g from"node:fs/promises";import p from"node:path";u();w();C();import m from"node:path";var F=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Claude Code + Opus frontier. CLAUDE.md, skills, hooks, MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Codex + GPT-5.x (TB leader). AGENTS.md, config.toml MCP (native), hooks opt-in (planned installer)."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.gemini/settings.json mcpServers",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Gemini CLI + Pro/Flash. GEMINI.md; prjct install writes MCP+hooks to ~/.gemini/settings.json."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[m.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"~/.config/opencode/opencode.json mcp.prjct",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Benchmark-tier open-source CLI (2026-07): most-starred multi-provider agent. AGENTS.md + prjct install writes mcp.prjct; Claude skill/CLAUDE.md compat."},{id:"pi",displayName:"Pi",kind:"cli",status:"stable",detectsBy:{homeDirs:[".pi",m.join(".pi","agent")],projectDirs:[".pi"],commands:["pi"]},contextFiles:["AGENTS.md","CLAUDE.md","SYSTEM.md","APPEND_SYSTEM.md"],supports:{agentsMd:!0,mcp:!1,skills:!0,hooks:!1,acp:!1,projectRules:!1},notes:"Benchmark-tier minimal harness (2026-07): AGENTS.md + prjct skill at ~/.pi/agent/skills/prjct. MCP only via optional extensions \u2014 do not require it."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.kimi/mcp.json",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"grok",displayName:"xAI Grok Build",kind:"cli",status:"stable",detectsBy:{homeDirs:[".grok"],commands:["grok"]},contextFiles:["AGENTS.md","CLAUDE.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.grok/config.toml",writable:!0},{format:"claude-json",pathHint:"~/.claude/mcp.json (Grok Claude-compat fallback)",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Grok Build. Native MCP + skill via prjct install (~/.grok/config.toml + ~/.grok/skills/prjct). Hooks still Claude-compat. See harness-surfaces."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier AI IDE (2026-07): agent mode + CLI. Rules under .cursor/rules; prjct install writes ~/.cursor/hooks.json."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"Benchmark-tier open agent (2026-07): VS Code + multi-model. AGENTS.md, rules, skills, hooks, MCP, ACP."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[m.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"GitHub Copilot coding agent / Copilot CLI (2026-07 benchmark field). Repo AGENTS.md + .github instructions + MCP."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];function y(){return F.flatMap(e=>e.projectRuleTargets??[])}s(y,"listProjectRuleTargets");u();G();async function B(e){let t=A(e);return t||g.readFile(p.join(R,"templates",e),"utf-8")}s(B,"loadTemplate");async function v(e,t,n){let o=p.join(e,t);await g.mkdir(p.dirname(o),{recursive:!0}),await g.writeFile(o,await B(n),"utf-8")}s(v,"writeRule");async function E(e,t={}){let n=new Set(t.agents??[]),o=[];for(let i of y())(n.has(i.relativePath.split("/")[0].replace(/^\./,""))||i.detectPath&&await r(p.join(e,i.detectPath)))&&(await v(e,i.relativePath,i.templateKey),o.push(i.relativePath));return{written:o}}s(E,"writeProjectIdeRules");async function L(e){let[t,n,o]=await Promise.all([r(a.join(e,"PRJCT.md")),r(a.join(e,"AGENTS.md")),r(a.join(e,"CLAUDE.md"))]);return t||n||o}s(L,"hasAdoptedSurfaces");async function ge(e,t={}){if(!(t.explicit||t.refreshIfAdopted&&await L(e)))return{prjctMd:{action:"unchanged",path:a.join(e,"PRJCT.md")},agentsMd:{action:"unchanged",path:a.join(e,"AGENTS.md")},ideRules:[]};let o=new Set(t.agents??[]),i=await r(a.join(e,"CLAUDE.md")),f=o.has("claude")||i,[M,S,k,x]=await Promise.all([j(e),T(e),f?N(e):void 0,E(e,t)]);return{prjctMd:M,agentsMd:S,...k?{claudeMd:k}:{},ideRules:x.written}}s(ge,"writeProjectAgentSurfaces");export{ge as a};
@@ -0,0 +1,47 @@
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 H}from"./chunk-AOPJ4Z6O.mjs";import{e as k,g as G}from"./chunk-HDHVBB6Q.mjs";import{a as c}from"./chunk-E66B27AL.mjs";G();var X="memory.task_tokens",_=1e7;function ae(e,n,t,r,s){if(!n||t+r<=0)return;let i=5e7;if(t>i||r>i)return;let a=t>_||r>_,u=Math.min(Math.round(t),_),d=Math.min(Math.round(r),_);a&&(s={...s,isEstimated:!0});try{k.appendEvent(e,X,{taskId:n,tokensIn:u,tokensOut:d,...s?.description?{description:s.description}:{},...s?.agent?{agent:s.agent}:{},...s?.model?{model:s.model}:{},...s?.runtime?{runtime:s.runtime}:{},...s?.isEstimated!==void 0?{isEstimated:s.isEstimated}:{},...s?.source?{source:s.source}:{}},n)}catch{}if(u>=0&&u<=_&&d>=0&&d<=_)try{k.run(e,"UPDATE tasks SET tokens_in = ?, tokens_out = ? WHERE id = ?",u,d,n)}catch{}try{let E=s?.source??"cli",T=`${n}:${E}`,S=Date.now();k.run(e,`INSERT INTO token_usage
9
+ (id, work_cycle_id, event_key, source, is_estimated, input_tokens, output_tokens, model_id, description, measured_at, created_at)
10
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
11
+ ON CONFLICT(event_key) DO UPDATE SET
12
+ input_tokens = excluded.input_tokens,
13
+ output_tokens = excluded.output_tokens,
14
+ is_estimated = excluded.is_estimated,
15
+ model_id = excluded.model_id,
16
+ description = COALESCE(excluded.description, token_usage.description),
17
+ measured_at = excluded.measured_at`,T,n,T,E,s?.isEstimated?1:0,u,d,s?.model??null,s?.description??null,S,S)}catch{}}c(ae,"recordTaskTokenUsage");function B(e,n){let t=Date.parse(n),r=y(e,`SELECT work_cycle_id, input_tokens, output_tokens, is_estimated, description
18
+ FROM token_usage
19
+ WHERE measured_at >= ?
20
+ ORDER BY measured_at DESC`,Number.isFinite(t)?t:0),s=new Map;for(let i of r){let a=i.work_cycle_id;if(!a||s.has(a))continue;let u=b(i.input_tokens)??0,d=b(i.output_tokens)??0;u+d<=0||s.set(a,{id:a,description:i.description??a,status:i.is_estimated?"estimated":"measured",tokensIn:u,tokensOut:d,tokensTotal:u+d,minutes:null})}return s}c(B,"measuredCyclesFromTokenUsage");function Z(e,n){let t=se(n),r=new Date().toISOString(),s=y(e,`SELECT id, description, status, started_at, completed_at, shipped_at, tokens_in, tokens_out
21
+ FROM tasks
22
+ WHERE COALESCE(completed_at, shipped_at, started_at) >= ?
23
+ ORDER BY COALESCE(completed_at, shipped_at, started_at) DESC`,t),i=new Map;for(let o of s.map(j))o&&i.set(o.id,o);for(let[o,m]of B(e,t)){let h=i.get(o);i.set(o,{...m,description:h?.description??m.description,minutes:h?.minutes??m.minutes})}let a=[...i.values()].sort((o,m)=>m.tokensTotal-o.tokensTotal),u=g(e,"memory.task_started",t),d=g(e,"memory.status.changed",t),R=g(e,"memory.feature_shipped",t),E=g(e,"sync",t),T=l(e,"SELECT COUNT(*) AS value FROM events WHERE type >= ? AND type < ? AND timestamp >= ?","memory.","memory/",t),S=g(e,"memory.post_edit",t),q=l(e,"SELECT COUNT(*) AS value FROM agent_sessions WHERE started_at >= ?",t),I=(()=>{try{return l(e,"SELECT COUNT(*) AS value FROM cli_sessions WHERE created_at >= ?",t)}catch{return 0}})(),A=q+I,w=l(e,"SELECT COUNT(DISTINCT memory_id) AS value FROM memory_surface_log WHERE created_at >= ?",t),K=l(e,`SELECT COUNT(DISTINCT s.memory_id) AS value
24
+ FROM memory_surface_log s
25
+ INNER JOIN memory_usefulness u ON u.memory_id = s.memory_id
26
+ WHERE s.created_at >= ?
27
+ AND u.score > 0`,t),Y=(()=>{try{return l(e,`SELECT COUNT(DISTINCT t.id) AS value
28
+ FROM tasks t
29
+ INNER JOIN agent_sessions a ON a.task_id = t.id
30
+ WHERE (t.completed_at IS NOT NULL OR t.shipped_at IS NOT NULL)
31
+ AND COALESCE(t.completed_at, t.shipped_at, t.started_at) >= ?`,t)}catch{return 0}})(),$=l(e,"SELECT COUNT(*) AS value FROM context_zone_events WHERE timestamp >= ?",t),z=l(e,"SELECT COUNT(*) AS value FROM context_compactions WHERE timestamp >= ?",t),D=P(e,"command_duration",t),x=P(e,"startup_time",t),N=ee(e,t),W=a.reduce((o,m)=>o+m.tokensIn,0),L=a.reduce((o,m)=>o+m.tokensOut,0),C=Math.max(s.length,u,R),f=s.filter(o=>o.completed_at||o.shipped_at),O=new Set(B(e,t).keys()),J=(()=>{try{return new Set(k.query(e,`SELECT DISTINCT task_id AS task_id FROM agent_sessions
32
+ WHERE task_id IS NOT NULL AND started_at >= ?`,t).map(o=>o.task_id).filter(Boolean))}catch{return new Set}})(),M=f.filter(o=>{let m=Number(o.tokens_in??0),h=Number(o.tokens_out??0);return m+h>0||O.has(o.id)}).length,U=f.filter(o=>Number(o.tokens_in??0)+Number(o.tokens_out??0)>0||O.has(o.id)||J.has(o.id)).length,v=U>0?U:f.length>0?f.length:s.length>0?s.length:C,F=Math.max(M,a.length),p=[];C===0?p.push("No work cycles were found in tasks or historical events for this window."):s.length===0&&p.push("Work history was rescued from events, but normalized task rows are missing."),v>0&&M===0&&F===0&&p.push("Work cycles exist, but none have exact token totals. Capture exact or estimated usage at task close."),A===0&&p.push("No agent sessions were recorded. Session-level model/runtime/cost cannot be attributed yet."),w===0&&p.push("No surfaced context was logged in this window, so reuse and re-exploration waste cannot be proven.");let V=(()=>{try{return k.query(e,`SELECT COALESCE(model_id, 'unknown') AS model,
33
+ SUM(input_tokens) AS t_in, SUM(output_tokens) AS t_out
34
+ FROM token_usage
35
+ WHERE model_id IS NOT NULL AND measured_at >= ?
36
+ GROUP BY COALESCE(model_id, 'unknown')
37
+ ORDER BY t_in + t_out DESC`,Date.parse(t)).map(o=>({model:o.model,tokensIn:o.t_in,tokensOut:o.t_out}))}catch{return[]}})();return{id:`work-cost-${n}d`,windowDays:n,generatedAt:r,workCycles:s.length>0?s.length:C,knownTokenCycles:F,tokensIn:W,tokensOut:L,tokensTotal:W+L,tokenCoveragePercent:v===0?0:Math.min(100,Math.round(Math.max(M,a.filter(o=>O.has(o.id)||o.tokensTotal>0).length)/v*100)),measuredSessions:Math.max(A,Y),surfacedContext:w,usefulContext:K,contextZoneEvents:$,compactions:z,commandSamples:D.samples,commandMs:Math.round(D.total??0),avgStartupMs:x.average===null?null:Math.round(x.average),mostExpensive:a.slice(0,8),byModel:V,historicalRescue:{inferredWorkCycles:C,taskTableCycles:s.length,eventWorkStarts:u,eventStatusChanges:d,eventShips:R,syncRuns:E,memoryEvents:T,postEditEvents:S,declaredTokenMentions:N.length,declaredTokensTotal:N.reduce((o,m)=>o+m.tokens,0),topDeclaredTokenMentions:N.slice(0,5)},gaps:p}}c(Z,"buildWorkCostSnapshot");async function ue(e,n=[7,30,90]){let t=n.map(r=>Z(e,r));for(let r of t)await H({projectId:e,entityType:"work_cost_snapshots",entityId:r.id,eventType:"upsert",data:Q(r)});return t}c(ue,"publishWorkCostSnapshots");function Q(e){return{...e,mostExpensive:e.mostExpensive.map(n=>({...n,description:"[redacted]"})),historicalRescue:{...e.historicalRescue,topDeclaredTokenMentions:e.historicalRescue.topDeclaredTokenMentions.map(n=>({tokens:n.tokens,sourceType:n.sourceType,occurredAt:n.occurredAt,summary:"[redacted]"}))}}}c(Q,"redactSnapshotForCloud");function j(e){let n=b(e.tokens_in)??0,t=b(e.tokens_out)??0,r=n+t;return r<=0?null:{id:e.id,description:e.description,status:e.status,tokensIn:n,tokensOut:t,tokensTotal:r,minutes:oe(e.started_at,e.completed_at??e.shipped_at)}}c(j,"toCostTask");function ee(e,n){let t=y(e,`SELECT type, data, timestamp
38
+ FROM events
39
+ WHERE timestamp >= ?
40
+ AND type >= ?
41
+ AND type < ?
42
+ AND json_valid(data)
43
+ AND json_extract(data, '$.content') LIKE '%token%'
44
+ ORDER BY timestamp DESC
45
+ LIMIT 200`,n,"memory.remember.","memory.remember/"),r=[];for(let s of t){let i=(()=>{try{let u=JSON.parse(s.data);return typeof u.content=="string"?u.content:""}catch{return""}})();if(!i)continue;let a=te(i);for(let u of a)r.push({tokens:u,sourceType:s.type,occurredAt:s.timestamp,summary:ne(i)})}return r.sort((s,i)=>i.tokens-s.tokens)}c(ee,"declaredTokenMentions");function te(e){let n=[],t=/\b(\d+(?:\.\d+)?)\s*([kKmM])?\s*(?:tokens?|tok)\b/g;for(let r of e.matchAll(t)){let s=Number.parseFloat(r[1]??"0"),i=r[2]?.toLowerCase();if(!Number.isFinite(s)||s<=0)continue;let a=i==="m"?1e6:i==="k"?1e3:1;n.push(Math.round(s*a))}return n}c(te,"extractTokenCounts");function ne(e){let n=e.replace(/\s+/g," ").trim();return n.length<=140?n:`${n.slice(0,137)}...`}c(ne,"summarize");function g(e,n,t){return l(e,"SELECT COUNT(*) AS value FROM events WHERE type = ? AND timestamp >= ?",n,t)}c(g,"eventCount");function P(e,n,t){return y(e,`SELECT COUNT(*) AS samples, COALESCE(SUM(value), 0) AS total, AVG(value) AS average
46
+ FROM perf_samples
47
+ WHERE metric = ? AND timestamp >= ?`,n,t)[0]??{samples:0,total:0,average:null}}c(P,"aggregatePerf");function l(e,n,...t){try{return Number(k.get(e,n,...t)?.value??0)}catch{return 0}}c(l,"count");function y(e,n,...t){try{return k.query(e,n,...t)}catch{return[]}}c(y,"query");function se(e){let n=new Date;return n.setDate(n.getDate()-e),n.toISOString()}c(se,"sinceIso");function b(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}c(b,"nullableNumber");function oe(e,n){if(!e||!n)return null;let t=Date.parse(e),r=Date.parse(n);return!Number.isFinite(t)||!Number.isFinite(r)||r<t?null:Math.round((r-t)/6e4)}c(oe,"durationMinutes");export{ae as a,ue as b};
@@ -0,0 +1,8 @@
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}from"./chunk-E66B27AL.mjs";function n(e){return e.normalize("NFD").replace(/[̀-ͯ]/g,"")}r(n,"deburr");export{n as a};
@@ -0,0 +1,8 @@
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 o}from"./chunk-E66B27AL.mjs";var a=["identity","voice","glossary","framework"],d=["fact","decision","learning","gotcha","red-herring","pattern","anti-pattern","shipped","example",...a,"context","inbox","todo","idea","insight","question","source","person","spec"];function g(e){return!(e.type==="improvement-signal"||e.tags?.pattern==="hot-file")}o(g,"isModelMemory");function c(e,t){try{return JSON.parse(e)}catch{return t}}o(c,"safeJson");function u(e){let t=e.data?c(e.data,{}):{},r=t.tags??{};return e.type&&(r.type=e.type),{id:`ship_${e.id}`,type:"shipped",content:e.name,tags:r,rememberedAt:e.shipped_at,source:t.taskId,provenance:"extracted"}}o(u,"shippedRowToEntry");function y(e,t){let r=t.toLowerCase();if(e.content.toLowerCase().includes(r))return!0;for(let n of Object.values(e.tags))if(n.toLowerCase().includes(r))return!0;return!1}o(y,"matchesTopic");function f(e,t){for(let[r,n]of Object.entries(t))if(e.tags[r]!==n)return!1;return!0}o(f,"matchesTags");function m(e){let t=new Set,r=[];for(let n of e){let s=n.tags.key;if(!s){r.push(n);continue}let i=`${n.type}::${s}`;t.has(i)||(t.add(i),r.push(n))}return r}o(m,"dedupeLatestByKey");var p=/\bmem[_-](\d+)\b/g;function l(e){let t=new Set;for(let r of e){r.tags["superseded-by"]&&t.add(r.id);for(let n of["supersedes","duplicates"]){let s=r.tags[n];if(s)for(let i of String(s).matchAll(p))t.add(`mem_${i[1]}`)}}return t}o(l,"collectSupersededIds");export{a,g as b,u as c,y as d,f as e,m as f,l as g};
@@ -0,0 +1,31 @@
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 h}from"./chunk-DAOC3T5G.mjs";import{d as a,g as E}from"./chunk-HDHVBB6Q.mjs";import{a as c}from"./chunk-E66B27AL.mjs";E();var I="land-receipt",_="judgment-receipt",g="receipt-v1";function D(e){let r=e.trapsSurfaced??[],t=e.decisions??[],n=(e.journal??[]).filter(s=>s.trim()),o=(e.openRisksNext??[]).filter(s=>s.trim()),l=e.cycleDescription?.trim()||null,y=e.tokensIn!=null||e.tokensOut!=null||!!e.model;if(!l&&r.length===0&&t.length===0&&n.length===0&&o.length===0&&!y)return null;let i=["# Judgment Receipt",""],m=[];if(l&&m.push(`cycle: "${u(l,100)}"`),n.length>0&&m.push(`journal: ${n.slice(0,4).map(s=>u(s,70)).join(" \xB7 ")}`),m.length>0&&i.push("## Applied judgment",...m.map(s=>`- ${s}`),""),r.length>0&&i.push("## Traps re-surfaced",...r.slice(0,8).map(s=>`- **[${s.type}]** ${u(s.title,100)} \`${s.id}\``),""),t.length>0&&i.push("## Decisions contested or honored",...t.slice(0,8).map(s=>`- **${s.status}** [${s.type}] ${u(s.title,100)} \`${s.id}\``),""),o.length>0||l){let s=o.length>0?o.slice(0,5).map(d=>`- ${u(d,120)}`):["- Finish or pause open cycle; next agent: `prjct prime` / `prjct work --md`."];i.push("## Open risks / next",...s,"")}if(y){let s=[];if(e.tokensIn!=null||e.tokensOut!=null){let d=e.tokensIn??0,f=e.tokensOut??0;s.push(`tokens in=${d} out=${f} total=${d+f}`)}e.model&&s.push(`model=${e.model}`),e.author&&s.push(`author=${e.author}`),i.push("## Session economics",`- ${s.join(" \xB7 ")}`,"")}return i.push("_Closed-loop judgment continuity \u2014 not bulk memory. Proof of traps prevented and decisions applied._"),i.join(`
9
+ `).trim()}c(D,"buildJudgmentReceipt");function R(e){if(!e)return null;let r=(e.match(/## Traps re-surfaced/g)||[]).length,t=p(e,"Traps re-surfaced"),n=p(e,"Decisions contested or honored"),o=[];return t>0&&o.push(`${t} trap(s) re-surfaced`),n>0&&o.push(`${n} decision(s) tracked`),o.length===0&&o.push("session judgment landed"),`Judgment receipt: ${o.join(", ")}`}c(R,"summarizeJudgmentReceipt");function p(e,r){let t=new RegExp(`## ${r}\\n([\\s\\S]*?)(?=\\n## |\\n_|$)`),n=e.match(t);return n?(n[1].match(/^- /gm)||[]).length:0}c(p,"countSectionBullets");async function k(e,r,t){let n=D(t);if(!n)return{wrote:!1,content:null,summary:null,reason:"nothing-to-receipt"};try{return await h.remember(e,{type:"context",content:n,tags:{source:I,topic:_,capture:g,synthesis:"deterministic"},provenance:"extracted",projectId:r}),{wrote:!0,content:n,summary:R(n)}}catch(o){return{wrote:!1,content:n,summary:R(n),reason:`remember-failed: ${o.message}`}}}c(k,"persistJudgmentReceipt");async function C(e){let r=S(e.projectId,e.cycleId),t=O(e.projectId),n=$(e.projectId);return k(e.projectPath,e.projectId,{cycleDescription:e.cycleDescription,cycleId:e.cycleId,journal:r,trapsSurfaced:t,decisions:n,tokensIn:e.tokensIn,tokensOut:e.tokensOut,model:e.model,author:e.author,openRisksNext:e.cycleDescription?["Open cycle still needs finish or pause before context dies."]:[]})}c(C,"synthesizeJudgmentReceipt");function T(e){try{let r=Date.now()-864e5,n=a.query(e,`SELECT me.id, me.content
10
+ FROM memory_entries me
11
+ JOIN memory_entry_tags t ON t.entry_id = me.id
12
+ WHERE me.deleted_at IS NULL
13
+ AND me.created_at >= ?
14
+ AND t.key = 'capture' AND t.value = ?
15
+ ORDER BY me.created_at DESC
16
+ LIMIT 1`,r,g)[0];return n?{id:n.id,content:n.content,trapCount:p(n.content,"Traps re-surfaced")}:null}catch{return null}}c(T,"latestJudgmentReceipt24h");function x(e,r){try{let t=r??0;return a.get(e,`SELECT COUNT(*) AS c
17
+ FROM memory_entries me
18
+ JOIN memory_entry_tags t ON t.entry_id = me.id
19
+ WHERE me.deleted_at IS NULL
20
+ AND me.created_at >= ?
21
+ AND t.key = 'capture' AND t.value = ?`,t,g)?.c??0}catch{return 0}}c(x,"countReceiptsWritten");function S(e,r){try{return r?a.query(e,"SELECT content FROM task_log WHERE task_id = ? ORDER BY id DESC LIMIT 5",r).map(t=>t.content):a.query(e,"SELECT content FROM task_log ORDER BY id DESC LIMIT 5").map(t=>t.content)}catch{return[]}}c(S,"recentJournal");function O(e){try{return a.query(e,`SELECT id, type, content FROM memory_entries
22
+ WHERE deleted_at IS NULL
23
+ AND type IN ('gotcha', 'anti-pattern')
24
+ ORDER BY created_at DESC
25
+ LIMIT 5`).map(t=>({id:t.id,type:t.type,title:t.content.replace(/\s+/g," ").trim().slice(0,120)}))}catch{return[]}}c(O,"recentSurfacedTraps");function $(e){try{return a.query(e,`SELECT me.id, me.type, me.content, t.value AS action
26
+ FROM memory_entries me
27
+ JOIN memory_entry_tags t ON t.entry_id = me.id AND t.key = 'conflict_action'
28
+ WHERE me.deleted_at IS NULL
29
+ AND me.created_at >= ?
30
+ ORDER BY me.created_at DESC
31
+ LIMIT 8`,Date.now()-864e5).map(t=>({id:t.id,type:t.type,title:t.content.replace(/\s+/g," ").trim().slice(0,120),status:t.action==="deny"||t.action==="warn"?"contested":"honored"}))}catch{return[]}}c($,"recentConflictDecisions");function u(e,r){let t=e.replace(/\s+/g," ").trim();return t.length>r?`${t.slice(0,r-1)}\u2026`:t}c(u,"truncate");export{I as a,_ as b,g as c,D as d,R as e,k as f,C as g,T as h,x as i};
@@ -0,0 +1,19 @@
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 j,b as f,d as x,e as D}from"./chunk-7OZDWT6C.mjs";import{b as A}from"./chunk-YJMWY4Y6.mjs";import{e as C,f as M,g as w,h as E,m as R}from"./chunk-NJAMZSHM.mjs";import{a as b}from"./chunk-DAOC3T5G.mjs";import{a as S,b as J,d as m,g as K}from"./chunk-HDHVBB6Q.mjs";import{a as l}from"./chunk-E66B27AL.mjs";J();import g from"node:fs/promises";import d from"node:path";K();var U=/^(main|index|app|server|cli|handler|router|bootstrap|init|start|run|default)$/i;function I(t){let e=M(t);if(!C(t))return{ready:!1,builtAt:e?.builtAt??null,symbols:0,edges:0,files:0,languages:[],kinds:[],routes:[],hotspots:[],entryCandidates:[],packages:[],note:"No symbol index. Run `prjct sync` or `prjct code reindex`."};let r=w(t),s=new Map,a=new Map,o=new Map,p=[],c=[];for(let i of r){s.set(i.kind,(s.get(i.kind)??0)+1),a.set(i.file,(a.get(i.file)??0)+1);let u=i.file.includes(".")?i.file.slice(i.file.lastIndexOf(".")):"(none)";o.set(u,(o.get(u)??0)+1),i.kind==="route"&&p.push({name:i.name,file:i.file,line:i.startLine}),i.exported&&U.test(i.name)&&(i.kind==="function"||i.kind==="class")&&!/__tests__|\.test\.|\.spec\.|fixtures?\//i.test(i.file)&&c.push({name:i.name,file:i.file,kind:i.kind})}let y=[...a.keys()],h=[],W=R(t),Y=y.length>400?y.slice(0,400):y;for(let i of Y){let u=W.get(i)??0;u>0&&h.push({file:i,fanIn:u,symbolCount:a.get(i)??0})}h.sort((i,u)=>u.fanIn-i.fanIn);let k=new Set,v=A(t);if(v)for(let i of Object.keys(v.forward).slice(0,2e3)){let u=i.includes("/")?i.slice(0,i.indexOf("/")):i;u&&!u.startsWith(".")&&k.add(u)}for(let i of y.slice(0,2e3)){let u=i.includes("/")?i.slice(0,i.indexOf("/")):".";u&&u!=="."&&k.add(u)}if(c.length<8)for(let i of r){if(c.length>=12)break;i.exported&&i.kind==="class"&&!c.some(u=>u.file===i.file)&&c.push({name:i.name,file:i.file,kind:i.kind})}return{ready:!0,builtAt:e?.builtAt??null,symbols:e?.symbolCount??r.length,edges:e?.edgeCount??0,files:e?.fileCount??a.size,languages:[...o.entries()].map(([i,u])=>({ext:i,count:u})).sort((i,u)=>u.count-i.count).slice(0,12),kinds:[...s.entries()].map(([i,u])=>({kind:i,count:u})).sort((i,u)=>u.count-i.count),routes:p.slice(0,30),hotspots:h.slice(0,15),entryCandidates:c.slice(0,15),packages:[...k].sort().slice(0,40),note:"Structural only (symbol + import graphs). Narrative architecture lives in prjct analysis / memory decisions."}}l(I,"buildArchitectureSnapshot");function T(t,e){let n=[];if(!t)return{hasChanges:!0,items:[{field:"Project style",type:"added",after:e.summary}],summary:{added:1,removed:0,changed:0},beforeCommit:null,afterCommit:e.commitHash};let r=t.payload,s=e.payload;r.stack.ecosystem!==s.stack.ecosystem&&n.push({field:"Ecosystem",type:"changed",before:r.stack.ecosystem,after:s.stack.ecosystem}),(r.stack.packageManager??"")!==(s.stack.packageManager??"")&&n.push({field:"Package manager",type:"changed",before:r.stack.packageManager??"(none)",after:s.stack.packageManager??"(none)"}),P("Languages",r.stack.languages,s.stack.languages,n),P("Frameworks",r.stack.frameworks,s.stack.frameworks,n),P("Key libraries",r.stack.keyLibraries,s.stack.keyLibraries,n),r.stack.hasTests!==s.stack.hasTests&&n.push({field:"Has tests",type:"changed",before:String(r.stack.hasTests),after:String(s.stack.hasTests)}),_("Pattern",r.patterns.map(c=>[c.key,c.name]),s.patterns.map(c=>[c.key,c.name]),n),_("Anti-pattern",r.antiPatterns.map(c=>[c.key,c.issue]),s.antiPatterns.map(c=>[c.key,c.issue]),n),_("Convention",r.conventions.map(c=>[c.key,c.rule]),s.conventions.map(c=>[c.key,c.rule]),n),r.structural.symbols!==s.structural.symbols&&(r.structural.symbols>0||s.structural.symbols>0)&&n.push({field:"Symbols",type:"changed",before:String(r.structural.symbols),after:String(s.structural.symbols)}),r.structural.files!==s.structural.files&&n.push({field:"Files",type:"changed",before:String(r.structural.files),after:String(s.structural.files)});let a=n.filter(c=>c.type==="added").length,o=n.filter(c=>c.type==="removed").length,p=n.filter(c=>c.type==="changed").length;return{hasChanges:n.length>0,items:n,summary:{added:a,removed:o,changed:p},beforeCommit:t.commitHash,afterCommit:e.commitHash}}l(T,"generateProjectStyleDiff");function O(t){if(!t.hasChanges)return`## Project evolution
9
+
10
+ No style changes since last sync.`;let e=["## Project evolution (this sync)"];(t.beforeCommit||t.afterCommit)&&e.push(`> \`${L(t.beforeCommit)}\` \u2192 \`${L(t.afterCommit)}\``),e.push(""),e.push(`+${t.summary.added} \xB7 \u2212${t.summary.removed} \xB7 ~${t.summary.changed}`),e.push("");for(let n of t.items.slice(0,20)){let r=n.type==="added"?"+":n.type==="removed"?"\u2212":"~";n.type==="changed"?e.push(`- ${r} **${n.field}**: ${n.before} \u2192 ${n.after}`):n.type==="added"?e.push(`- ${r} **${n.field}**: ${n.after}`):e.push(`- ${r} **${n.field}**: ${n.before}`)}return e.join(`
11
+ `)}l(O,"formatProjectStyleDiffMd");function L(t){return t?t.length>7?t.slice(0,7):t:"(none)"}l(L,"short");function P(t,e,n,r){let s=new Set(e.map(o=>o.toLowerCase())),a=new Set(n.map(o=>o.toLowerCase()));for(let o of n)s.has(o.toLowerCase())||r.push({field:t,type:"added",after:o});for(let o of e)a.has(o.toLowerCase())||r.push({field:t,type:"removed",before:o})}l(P,"diffStringArray");function _(t,e,n,r){let s=new Map(e),a=new Map(n);for(let[o,p]of a)s.has(o)?s.get(o)!==p&&r.push({field:t,type:"changed",before:s.get(o),after:p}):r.push({field:t,type:"added",after:p});for(let[o,p]of s)a.has(o)||r.push({field:t,type:"removed",before:p})}l(_,"diffKeyed");var F=50;function B(t){let e=(()=>{try{return JSON.parse(t.payload_json)}catch{return q()}})();return{id:t.id,capturedAt:t.captured_at,commitHash:t.commit_hash,source:t.source||"sync-mechanical",patternCount:t.pattern_count,antiPatternCount:t.anti_pattern_count,conventionCount:t.convention_count,frameworkCount:t.framework_count,symbolCount:t.symbol_count,fileCount:t.file_count,summary:t.summary,payload:e}}l(B,"rowToSnapshot");function q(){return{payloadVersion:1,stack:{ecosystem:"unknown",languages:[],frameworks:[],keyLibraries:[],hasTests:!1,hasDocker:!1},commands:{},conventions:[],patterns:[],antiPatterns:[],structural:{symbols:0,files:0,packages:[]},metrics:{}}}l(q,"emptyPayload");function H(t){try{let e=m.get(t,"SELECT * FROM project_style_snapshots WHERE is_active = 1 ORDER BY captured_at DESC LIMIT 1");return e?B(e):null}catch{return null}}l(H,"getActiveProjectStyle");function G(t,e=12){try{return m.query(t,"SELECT * FROM project_style_snapshots ORDER BY captured_at DESC LIMIT ?",e).map(B)}catch{return[]}}l(G,"getProjectEvolution");function St(t,e=6){let n=G(t,e);if(n.length===0)return null;let r=["## Project evolution"];if(n.length>=2){let s=n[0],a=n[n.length-1],o=s.patternCount-a.patternCount,p=s.conventionCount-a.conventionCount,c=s.fileCount-a.fileCount;r.push(`Over ${n.length} snapshots: patterns ${$(o)}, conventions ${$(p)}, files ${$(c)}.`)}for(let s of n)r.push(`- ${s.capturedAt.slice(0,10)} \u2014 ${s.summary}`);return r.join(`
12
+ `)}l(St,"renderProjectEvolution");function $(t){return t>=0?`+${t}`:`${t}`}l($,"fmtDelta");function V(t,e){m.transaction(t,n=>{n.prepare("UPDATE project_style_snapshots SET is_active = 0 WHERE is_active = 1").run(),n.prepare(`INSERT INTO project_style_snapshots (
13
+ id, captured_at, commit_hash, source,
14
+ pattern_count, anti_pattern_count, convention_count, framework_count,
15
+ symbol_count, file_count, summary, payload_json, is_active
16
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`).run(e.id,e.capturedAt,e.commitHash,e.source,e.patternCount,e.antiPatternCount,e.conventionCount,e.frameworkCount,e.symbolCount,e.fileCount,e.summary,JSON.stringify(e.payload));let r=n.prepare("SELECT id FROM project_style_snapshots ORDER BY captured_at DESC").all();if(r.length>F){let s=r.slice(F),a=n.prepare("DELETE FROM project_style_snapshots WHERE id = ?");for(let o of s)a.run(o.id)}})}l(V,"persistProjectStyleSnapshot");async function bt(t){let e=H(t.projectId),n=Q(t.projectId),r=await tt(t.projectPath),s=X(t.projectId),a=Z(t.projectId),o=x({stats:t.stats,stack:t.stack,commands:t.commands,packageDeps:r.deps,packageManager:r.packageManager,llmAnalysis:n,memoryPatterns:a.patterns,memoryAntiPatterns:a.antiPatterns,memoryConventions:a.conventions,structural:s,commitHash:t.commitHash??null,source:t.source??"sync-mechanical"});o.payload.metrics.styleCoverage=z(o),o.payload.metrics.hasRichAnalysis=f(n)?1:0;let p=T(e,o),c=e===null;(c||p.hasChanges)&&V(t.projectId,o);let y=H(t.projectId)??o;return t.bridgeMemory!==!1&&await nt(t.projectPath,t.projectId,y).catch(()=>{}),await st(t.projectId,y).catch(()=>{}),{snapshot:y,delta:p,isFirst:c}}l(bt,"recomputeProjectStyle");function z(t){let e=(t.payload.stack.ecosystem!=="unknown"?25:0)+(t.payload.stack.frameworks.length>0||t.payload.stack.keyLibraries.length>0?20:0)+(t.payload.stack.hasTests?10:0)+Math.min(25,t.conventionCount*5)+Math.min(15,t.patternCount*3)+Math.min(5,t.antiPatternCount);return Math.min(100,e)}l(z,"computeStyleCoverage");function Q(t){try{let e=j.getActive(t);if(f(e))return e;try{let n=j.getAllFull(t);for(let r of n)if(f(r.analysis))return r.analysis}catch{}return e}catch{return null}}l(Q,"pickBestAnalysis");function X(t){try{let e=I(t);return e.ready?{symbols:e.symbols,files:e.files,packages:e.packages.slice(0,20)}:{symbols:0,files:0,packages:[]}}catch{return{symbols:0,files:0,packages:[]}}}l(X,"loadStructural");function Z(t){let e=[],n=[],r=[];try{let s=b.recall(t,{types:["pattern","anti-pattern","decision"],limit:40});for(let a of s){let o=a.tags?.topic??"";!o.startsWith("style:")&&a.type!=="pattern"&&a.type!=="anti-pattern"||(a.type==="pattern"||o.startsWith("style:pattern:")?e.push({name:a.tags?.name||o.replace(/^style:pattern:/,"")||"pattern",description:a.content.slice(0,400)}):a.type==="anti-pattern"||o.startsWith("style:anti:")?n.push({issue:a.tags?.name||o.replace(/^style:anti:/,"")||"anti-pattern",suggestion:a.content.slice(0,400)}):o.startsWith("style:convention:")&&r.push({rule:a.content.slice(0,400),category:a.tags?.category}))}}catch{}return{patterns:e,antiPatterns:n,conventions:r}}l(Z,"loadMemoryStyle");async function tt(t){try{let e=await g.readFile(d.join(t,"package.json"),"utf-8"),n=JSON.parse(e),r={...n.dependencies??{},...n.devDependencies??{}},s=n.packageManager?n.packageManager.split("@")[0]??null:await(async()=>{let a=[["bun.lockb","bun"],["bun.lock","bun"],["pnpm-lock.yaml","pnpm"],["yarn.lock","yarn"],["package-lock.json","npm"]];for(let[o,p]of a)try{return await g.access(d.join(t,o)),p}catch{}return null})();return{deps:r,packageManager:s}}catch{return{deps:{},packageManager:null}}}l(tt,"readPackageMeta");function et(t){let e=t.payload,n=[...e.conventions.slice(0,25).map(s=>({type:"decision",content:s.rule,tags:{topic:`style:convention:${s.key}`,category:s.category??"convention",source:"project-style"}})),...e.patterns.slice(0,25).map(s=>({type:"pattern",content:`${s.name}: ${s.description}`,tags:{topic:`style:pattern:${s.key}`,name:s.name,source:"project-style",...s.category?{category:s.category}:{}}})),...e.antiPatterns.slice(0,25).map(s=>({type:"anti-pattern",content:`${s.issue}. Suggestion: ${s.suggestion}`,tags:{topic:`style:anti:${s.key}`,name:s.issue,source:"project-style",...s.severity?{severity:s.severity}:{}}}))],r=new Set;return n.filter(s=>{let a=`${s.type}\0${S(s.content)}`;return r.has(a)?!1:(r.add(a),!0)})}l(et,"desiredStyleBridgeEntries");function N(t,e,n){return`${t}\0${e}\0${n}`}l(N,"styleBridgeIdentity");async function nt(t,e,n){let r=et(n);if(r.length===0)return 0;let s=(()=>{try{let o=[...new Set(r.map(y=>y.tags.topic))],p=o.map(()=>"?").join(","),c=m.query(e,`SELECT type, topic_key, content_hash
17
+ FROM memory_entries
18
+ WHERE project_id = ? AND deleted_at IS NULL
19
+ AND topic_key IN (${p})`,e,...o);return new Set(c.map(y=>N(y.type,y.topic_key,y.content_hash)))}catch{return null}})(),a=[];for(let o of r){let p=o.tags.topic,c=N(o.type,p,S(o.content));s?.has(c)||(await b.remember(t,{...o,projectId:e,provenance:"extracted"}),a.push(o))}return a.length}l(nt,"bridgeStyleToMemory");async function st(t,e){let{default:n}=await import("./path-manager-F2HE2GGK.mjs"),r=n.getGlobalProjectPath(t),s=d.join(r,"analysis");await g.mkdir(s,{recursive:!0});let a=e.payload.stack,o={ecosystem:a.ecosystem,frameworks:a.frameworks,hasTests:a.hasTests,technologies:[...a.languages,...a.frameworks,...a.keyLibraries].filter((p,c,y)=>y.indexOf(p)===c),packageManager:a.packageManager??null,updatedAt:e.capturedAt,styleSummary:e.summary};await g.writeFile(d.join(s,"repo-analysis.json"),JSON.stringify(o,null,2),"utf-8")}l(st,"writeRepoAnalysisArtifact");function jt(t){let e=t.delta.hasChanges||t.isFirst?O(t.delta):null,n=D(t.snapshot,{maxConventions:4,maxPatterns:3,maxAnti:2});return{evolutionMd:e,digestMd:n,delta:t.delta}}l(jt,"formatProjectStyleForSync");export{H as a,G as b,St as c,V as d,bt as e,nt as f,jt as g};
@@ -0,0 +1,16 @@
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{d as b}from"./chunk-SYHDEUVU.mjs";import{a as j}from"./chunk-GCKILEXJ.mjs";import{c as p,e as A}from"./chunk-HE5RSIHG.mjs";import{b as w}from"./chunk-PKDYFXMI.mjs";import{a as e}from"./chunk-E66B27AL.mjs";import g from"node:fs";import H from"node:fs/promises";import m from"node:path";var I=j.join("/"),R="Generated with [p/](https://www.prjct.app/)",P="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",L="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'Tasks \u2192 `prjct work "\u2026"`. Known cmds (`sync`/`search`/`remember`/\u2026) \u2192 `prjct <cmd>` \u2014 never work-wrap.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${I}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};function S(){return`${["---","name: prjct","description: prjct work cycles + memory; run prjct verbs, do not preload context.","---","","# prjct","","Run `prjct <cmd> --md` and follow it.","",`- ${n.rag}`,`- ${n.entrypoint}`,`- ${n.pull}`,`- ${n.remember}`,`- ${n.kb}`,`- ${n.ship}`,`- ${n.loop}`,`- ${n.identity}`,"",`Commit footer: \`${R}\``].join(`
9
+ `)}
10
+ `}e(S,"buildCompactSkill");var M=S,_=S;function O(t){return`${["<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","# p/ \u2014 Context layer for AI agents","","Skills auto-activate for: work, intent, ship, sync, guard, remember, search, insights, performance","Other commands: run `prjct <command> --md` and follow CLI output","","Flow: known verbs run as `prjct <cmd> --md` (sync, search, remember, ship, guard, land, prime\u2026).",'`prjct work` is only for task/work cycles \u2014 never wrap a bare verb as work "sync".',"Substantive implementation follows the persisted work-cycle station from `prjct work --md`:","reviewed intent, evidence, tests when required, then code.","Sync analysis: prefer schema v1 JSON via `prjct analysis-save-llm` (markdown = thin notes only).","","Data:","- Persist everything (memories, context, intents) in ENGLISH, whatever language the user speaks",`- ${n.rag}`,`- ${n.entrypoint}`,`- ${n.pull}`,`- Sovereign knowledge base \u2014 ${n.kb}`,`- ${n.remember}`,`- ${n.loop}`,"- On close, save synthesized context; raw quotes, counters, detector rows, and transcript chunks are inputs, not final memory","- prjct remembers and shows the path; the agent decides how to execute with its own native tools","- Treat prjct output as signals, not a prescriptive harness",`- Commit footer: \`${R}\``,"- Path resolution: `.prjct/prjct.config.json` \u2192 `~/.prjct-cli/projects/{projectId}`","- Storage: `prjct` CLI (SQLite internally)","- Worktree hygiene: if working in a git worktree, remove it AFTER its PR merges \u2014 `git worktree remove` from the main worktree; never with uncommitted/unpushed work, never `--force`","",`Crew (opt-in via \`prjct crew install\`): Leader (blue) \xB7 Implementer (purple) \xB7 Reviewer (pink). Subagent dispatch is Claude-Code-only; in ${t}, identify the role you are playing explicitly.`,"","**Auto-managed by prjct-cli** | https://prjct.app","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"].join(`
11
+ `)}
12
+ `}e(O,"buildGlobalConfig");var F=e(()=>O("Gemini"),"buildGeminiConfig"),K=e(()=>O("Antigravity"),"buildAntigravityConfig");function D(t){return`${["---",t,"---","",P,b,"","**Auto-managed by prjct-cli** | https://prjct.app",L].join(`
13
+ `)}
14
+ `}e(D,"buildIdePointer");var G=e(()=>D(`description: "prjct \u2014 pull project memory + workflow on demand"
15
+ alwaysApply: true`),"buildCursorRule"),T={"codex/SKILL.md":M,"antigravity/SKILL.md":_,"global/GEMINI.md":F,"global/ANTIGRAVITY.md":K,"global/CURSOR.mdc":G},Q=Object.freeze(Object.keys(T));function k(t){return T[t]?.()??null}e(k,"buildEditorSurface");A();var N=50,l=new Map,a=[],s={templates:null,loaded:!1};function h(){if(s.loaded)return s.templates;s.loaded=!0;let t=m.join(p,"dist","templates.json");try{let r=g.readFileSync(t,"utf-8");return s.templates=JSON.parse(r),s.templates}catch{return null}}e(h,"loadBundle");function B(t){let r=a.indexOf(t);r>-1&&a.splice(r,1),a.push(t)}e(B,"updateLruOrder");function U(){for(;l.size>=N&&a.length>0;){let t=a.shift();t&&l.delete(t)}}e(U,"evictLru");function v(t){let r=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,o=t.match(r);if(!o)return{frontmatter:{},content:t.trim()};let[,i,c]=o,u={};return i.split(`
16
+ `).forEach(C=>{let[f,...y]=C.split(":");if(f&&y.length>0){let d=y.join(":").trim();d.startsWith("[")&&d.endsWith("]")?u[f.trim()]=d.slice(1,-1).split(",").map($=>$.trim()):u[f.trim()]=d.replace(/^["']|["']$/g,"")}}),{frontmatter:u,content:c.trim()}}e(v,"parseFrontmatter");async function E(t){if(l.has(t))return B(t),l.get(t);let i=h()?.[`commands/${t}.md`]??await H.readFile(m.join(p,"templates","commands",`${t}.md`),"utf-8").catch(()=>{throw w.notFound(t)}),c=v(i);return U(),l.set(t,c),a.push(t),c}e(E,"load");async function V(t){return(await E(t)).frontmatter["allowed-tools"]||[]}e(V,"getAllowedTools");function x(){l.clear(),a.length=0}e(x,"clearCache");function st(){s.templates=null,s.loaded=!1,x()}e(st,"resetBundle");function z(t){let r=h();if(r?.[t])return r[t];let o=k(t);if(o)return o;let i=m.join(p,"templates",t);try{return g.readFileSync(i,"utf-8")}catch{return null}}e(z,"getTemplateContent");function W(t){let r=h();if(r)return Object.keys(r).filter(i=>i.startsWith(t));let o=m.join(p,"templates",t);try{return g.readdirSync(o).map(c=>`${t}${c}`)}catch{return[]}}e(W,"listTemplates");var Y={load:E,parseFrontmatter:v,getAllowedTools:V,clearCache:x,getTemplateContent:z,listTemplates:W},at=Y;export{S as a,st as b,z as c,W as d,at as e};
@@ -0,0 +1,13 @@
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{d as p}from"./chunk-JQLJM4BK.mjs";import{e as f}from"./chunk-3HDIQJ55.mjs";import{a as g}from"./chunk-DAOC3T5G.mjs";import{e as m,g as _}from"./chunk-HDHVBB6Q.mjs";import{a as l}from"./chunk-E66B27AL.mjs";_();var S=8,y=140;function h(d,r){if(r.length===0)return 0;let n=[];try{m.transaction(d,s=>{let i=s.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),c=s.prepare("DELETE FROM memory_entries WHERE id = ?"),t=s.prepare("DELETE FROM events WHERE id = ? AND type LIKE 'memory.remember.%'");for(let e of r){try{i.run(e)}catch{}c.run(e).changes&&n.push(e);let a=e.match(/^mem_(\d+)$/);if(a)try{t.run(Number(a[1]))}catch{}}})}catch{return n.length}return n.length}l(h,"hardDeleteEntries");function w(d,r,n){let s=new Map;for(let e of r)s.set(e.type,(s.get(e.type)??0)+1);let i=[...s.entries()].sort((e,o)=>o[1]-e[1]).map(([e,o])=>`${e}\xD7${o}`).join(", "),c=r.map(e=>p(e).replace(/\s+/g," ").trim()).filter(e=>e.length>20).slice(0,S).map(e=>`- ${e.length>y?`${e.slice(0,y-1)}\u2026`:e}`),t=[`Distill of discarded auto-history (${d}).`,`Context synthesis: ${r.length} low-value rows collapsed \u2014 raw history deleted; only this digest remains for the project model.`,`Key data: source=retention-distill; discarded=${r.length}; types=${i}; at=${n}`,"What happened: purged auto-generated / redundant captures that added no excess vs the reference model.","Why it mattered: prevent vault bloat; agents must not re-read detector noise.",`Outcome: ${r.length} raw entries hard-deleted after distillation.`,"Next implication: prefer high-excess judgment; re-run detectors only when code/model changes."];return c.length>0&&t.push(`Sample cues (not full bodies):
9
+ ${c.join(`
10
+ `)}`),t.join(" ")}l(w,"buildDistillContent");async function A(d,r,n,s,i){if(s.length<=i)return{discarded:0,digested:!1};let t=[...s].sort((u,b)=>b.rememberedAt.localeCompare(u.rememberedAt)).slice(i);if(t.length===0)return{discarded:0,digested:!1};let e=new Date().toISOString(),o=`auto-distill:${n}`,a=w(n,t,e),E=await g.remember(d,{type:"learning",content:a,tags:{source:"retention-distill",topic:o,capture:"distill-discard-v1",context_schema:"living-v2",synthesis:"deterministic",discarded_count:String(t.length),auto_source:n},provenance:"inferred",projectId:r}).then(()=>!0).catch(()=>!1),D=t.map(u=>u.id);return{discarded:h(r,D),digested:E,digestTopic:o}}l(A,"distillAndDiscardAutoSource");async function v(d,r,n){let s=g.allEntriesForIndex(r),i=new Map;for(let t of s){let e=t.tags?.source;if(!f(e)||e==="retention-distill"||t.tags?.source==="retention-distill")continue;let o=i.get(e)??[];o.push(t),i.set(e,o)}let c=[];for(let[t,e]of i){if(e.length<=n)continue;let o=await A(d,r,t,e,n);c.push(o)}return{discarded:c.reduce((t,e)=>t+e.discarded,0),digests:c.filter(t=>t.digested).length}}l(v,"distillAndDiscardAllAutoSources");function x(d,r,n=1e3){let s=Date.now()-r*864e5;try{let i=m.query(d,`SELECT id, type, content FROM memory_entries
11
+ WHERE deleted_at IS NOT NULL AND deleted_at < ?
12
+ ORDER BY deleted_at ASC
13
+ LIMIT ?`,s,n);return i.length===0?{purged:0,digested:!1}:{purged:h(d,i.map(t=>t.id)),digested:!1}}catch{return{purged:0,digested:!1}}}l(x,"eliminateSoftDeletedNoValue");export{h as a,w as b,A as c,v as d,x as e};