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,25 @@
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{e as d,g as r}from"./chunk-HDHVBB6Q.mjs";import{a as o}from"./chunk-E66B27AL.mjs";r();function t(e,s=500){let n=e?.replace(/\s+/g," ").trim();return n?n.length<=s?n:`${n.slice(0,s-3)}...`:null}o(t,"cleanText");function i(e){let s=[];return e.agent&&s.push(`agent=${e.agent}`),(e.tokensIn??0)+(e.tokensOut??0)>0&&(s.push(`tokens_in=${Math.round(e.tokensIn??0)}`),s.push(`tokens_out=${Math.round(e.tokensOut??0)}`)),e.filesTouched&&e.filesTouched.length>0&&s.push(`files_touched=${e.filesTouched.length}`),s.length===0?null:s.join(" ")}o(i,"summary");function a(e){if(!e.sessionId)return;let s=new Date().toISOString();try{d.run(e.projectId,`INSERT INTO agent_sessions
9
+ (id, project_id, directory, task_id, goal, started_at, created_at)
10
+ VALUES (?, ?, ?, ?, ?, ?, ?)
11
+ ON CONFLICT(id) DO UPDATE SET
12
+ directory = COALESCE(excluded.directory, agent_sessions.directory),
13
+ task_id = COALESCE(excluded.task_id, agent_sessions.task_id),
14
+ goal = COALESCE(excluded.goal, agent_sessions.goal)`,e.sessionId,e.projectId,t(e.directory),t(e.taskId),t(e.goal),s,s)}catch{}}o(a,"recordAgentSessionStart");function c(e){if(!e.sessionId)return;let s=new Date().toISOString(),n=e.filesTouched&&e.filesTouched.length>0?JSON.stringify(e.filesTouched.slice(0,100)):null;try{d.run(e.projectId,`INSERT INTO agent_sessions
15
+ (id, project_id, directory, task_id, goal, started_at, ended_at, summary, files_touched, runtime, model, created_at)
16
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
17
+ ON CONFLICT(id) DO UPDATE SET
18
+ directory = COALESCE(excluded.directory, agent_sessions.directory),
19
+ task_id = COALESCE(excluded.task_id, agent_sessions.task_id),
20
+ goal = COALESCE(excluded.goal, agent_sessions.goal),
21
+ ended_at = excluded.ended_at,
22
+ summary = COALESCE(excluded.summary, agent_sessions.summary),
23
+ files_touched = COALESCE(excluded.files_touched, agent_sessions.files_touched),
24
+ runtime = excluded.runtime,
25
+ model = CASE WHEN excluded.model = 'unknown' THEN agent_sessions.model ELSE excluded.model END`,e.sessionId,e.projectId,t(e.directory),t(e.taskId),t(e.goal),s,s,i(e),n,t(e.agent,32)??"unknown",t(e.model,120)??"unknown",s)}catch{}}o(c,"recordAgentSessionEnd");export{a,c 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{e as g,g as A}from"./chunk-HDHVBB6Q.mjs";import{d as b,e as I,n as L}from"./chunk-SVZHJZ5T.mjs";import{a as l}from"./chunk-E66B27AL.mjs";import v from"node:fs/promises";import S from"node:path";A();L();var w=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);function p(t){return t.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(n=>n.length>1)}l(p,"splitIdentifier");function D(t,n){let e=[],o=n.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let i of o)e.push(...p(i));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let i of r)for(let s of t.matchAll(i))s[1]&&e.push(...p(s[1]));let a=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let i of a)for(let s of t.matchAll(i))s[1]&&e.push(...p(s[1]));let d=/(?:from|import)\s+['"]([^'"]+)['"]/g;for(let i of t.matchAll(d)){let s=i[1];if(s.startsWith(".")||s.startsWith("@/"))e.push(...p(s));else{let f=s.startsWith("@")?s.split("/").slice(0,2).join("/"):s.split("/")[0];e.push(...p(f))}}let c=/\/\/\s*(.+)/g;for(let i of t.matchAll(c)){let s=i[1].toLowerCase().split(/\s+/).filter(f=>f.length>2);e.push(...s)}let u=/\/\*\*?([\s\S]*?)\*\//g;for(let i of t.matchAll(u)){let s=i[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(f=>f.length>2&&/^[a-z]+$/.test(f));e.push(...s)}return e.filter(i=>i.length>1&&!w.has(i)&&/^[a-z][a-z0-9]*$/.test(i))}l(D,"tokenizeFile");function T(t){return t.split(/\s+/).flatMap(n=>p(n)).filter(n=>n.length>1&&!w.has(n)&&/^[a-z][a-z0-9]*$/.test(n))}l(T,"tokenizeQuery");function x(){return Object.create(null)}l(x,"emptyInvertedIndex");async function R(t){let n=await b(t),e={},o=x(),r=await I(n,50,async c=>{try{let u=await v.readFile(S.join(t,c),"utf-8"),i=D(u,c);return i.length>0?{filePath:c,tokens:i}:null}catch{return null}});for(let{filePath:c,tokens:u}of r){e[c]={tokens:u,length:u.length};for(let[i,s]of M(u))o[i]||(o[i]=[]),o[i].push({path:c,tf:s})}let a=r.reduce((c,u)=>c+u.tokens.length,0),d=Object.keys(e).length;return{documents:e,invertedIndex:o,avgDocLength:d>0?a/d:0,totalDocs:d,builtAt:new Date().toISOString()}}l(R,"buildIndex");function C(t,n){return Math.log((n-t+.5)/(t+.5)+1)}l(C,"idf");function N(t,n){let e=T(t);if(e.length===0)return[];let o=new Map;for(let r of e){let a=n.invertedIndex[r];if(!a)continue;let d=C(a.length,n.totalDocs);for(let{path:c,tf:u}of a){let i=n.documents[c];if(!i)continue;let s=u*(1.2+1),f=u+1.2*(1-.75+.75*(i.length/n.avgDocLength)),O=d*(s/f);o.set(c,(o.get(c)||0)+O)}}return Array.from(o.entries()).map(([r,a])=>({path:r,score:a})).sort((r,a)=>a.score-r.score)}l(N,"score");var h="bm25-index";function M(t){let n=new Map;for(let e of t)n.set(e,(n.get(e)||0)+1);return n}l(M,"termFrequencies");function F(t,n){let e=t.documents[n];if(!e)return;delete t.documents[n];let o=new Set(e.tokens),r=o.size>0?o:new Set(Object.keys(t.invertedIndex));for(let a of r){let d=t.invertedIndex[a];if(!d)continue;let c=d.filter(u=>u.path!==n);c.length===0?delete t.invertedIndex[a]:t.invertedIndex[a]=c}}l(F,"removeDocument");function P(t,n,e){if(e.length!==0){t.documents[n]={tokens:e,length:e.length};for(let[o,r]of M(e))t.invertedIndex[o]||(t.invertedIndex[o]=[]),t.invertedIndex[o].push({path:n,tf:r})}}l(P,"addDocument");function z(t){let n=Object.values(t.documents).map(o=>o.length),e=n.reduce((o,r)=>o+r,0);t.totalDocs=n.length,t.avgDocLength=n.length>0?e/n.length:0,t.builtAt=new Date().toISOString()}l(z,"recalculateStats");var m=new Map;function B(t){return{schemaVersion:2,avgDocLength:t.avgDocLength,totalDocs:t.totalDocs,builtAt:t.builtAt,docLengths:Object.fromEntries(Object.entries(t.documents).map(([n,e])=>[n,e.length]))}}l(B,"indexMetadata");function _(t,n,e,o,r){if(o.length!==0){t.run(e,JSON.stringify(o),o.length,r);for(let[a,d]of M(o))n.run(a,e,d)}}l(_,"writeDocumentRows");function q(t,n){try{g.transaction(t,e=>{e.prepare("DELETE FROM bm25_terms").run(),e.prepare("DELETE FROM bm25_documents").run();let o=new Date().toISOString(),r=e.prepare("INSERT INTO bm25_documents (path, tokens, length, updated_at) VALUES (?, ?, ?, ?)"),a=e.prepare("INSERT INTO bm25_terms (token, path, tf) VALUES (?, ?, ?)");for(let[d,c]of Object.entries(n.documents))_(r,a,d,c.tokens,o)})}catch{}}l(q,"replacePerFileTables");function W(t,n,e,o){try{g.transaction(t,r=>{let a=r.prepare("DELETE FROM bm25_terms WHERE path = ?"),d=r.prepare("DELETE FROM bm25_documents WHERE path = ?"),c=r.prepare("INSERT INTO bm25_documents (path, tokens, length, updated_at) VALUES (?, ?, ?, ?)"),u=r.prepare("INSERT INTO bm25_terms (token, path, tf) VALUES (?, ?, ?)"),i=new Date().toISOString();for(let s of new Set([...e,...o]))a.run(s),d.run(s);for(let s of e){let f=n.documents[s];f&&_(c,u,s,f.tokens,i)}})}catch{}}l(W,"updatePerFileTables");function $(t,n){g.setDoc(t,h,B(n)),q(t,n),m.delete(t)}l($,"saveIndex");function H(t,n,e,o){g.setDoc(t,h,B(n)),W(t,n,e,o),m.delete(t)}l(H,"saveIndexUpdate");function U(t,n,e){try{let o=g.query(t,"SELECT path, length FROM bm25_documents ORDER BY path");if(o.length===0){if(e?.totalDocs===0){let s={documents:{},invertedIndex:x(),avgDocLength:0,totalDocs:0,builtAt:e.builtAt};return m.set(t,{index:s,updatedAt:n}),s}return null}let r={},a=x();for(let s of o)r[s.path]={tokens:[],length:s.length};let d=o.reduce((s,f)=>s+f.length,0),c=g.query(t,"SELECT token, path, tf FROM bm25_terms ORDER BY token, path");for(let s of c)a[s.token]||(a[s.token]=[]),a[s.token].push({path:s.path,tf:s.tf});let u=o.length,i={documents:r,invertedIndex:a,avgDocLength:u>0?d/u:0,totalDocs:u,builtAt:e?.builtAt??n};return m.set(t,{index:i,updatedAt:n}),i}catch{return null}}l(U,"loadIndexFromPerFileTables");function J(t){try{return g.get(t,"SELECT key AS k FROM kv_store WHERE key = ? LIMIT 1",h)!=null}catch{return!1}}l(J,"hasIndex");function k(t){let n=g.get(t,"SELECT updated_at FROM kv_store WHERE key = ?",h);if(!n)return m.delete(t),null;let e=m.get(t);if(e&&e.updatedAt===n.updated_at)return e.index;let o=g.getDoc(t,h),r=U(t,n.updated_at,o);if(r)return r;if(!o?.invertedIndex)return null;let a={};for(let[c,u]of Object.entries(o.docLengths))a[c]={tokens:[],length:u};let d={documents:a,invertedIndex:Object.assign(x(),o.invertedIndex),avgDocLength:o.avgDocLength,totalDocs:o.totalDocs,builtAt:o.builtAt};return m.set(t,{index:d,updatedAt:n.updated_at}),d}l(k,"loadIndex");async function V(t,n){let e=await R(t);return $(n,e),e}l(V,"indexProject");async function Q(t,n,e,o=[]){let r=k(n);if(!r)return V(t,n);let a=new Set([...e,...o]);for(let c of a)F(r,c);let d=await I(e,50,async c=>{try{let u=await v.readFile(S.join(t,c),"utf-8"),i=D(u,c);return{filePath:c,tokens:i}}catch{return null}});for(let{filePath:c,tokens:u}of d)P(r,c,u);return z(r),H(n,r,e,o),r}l(Q,"updateProjectIndex");function tt(t,n,e=15){let o=k(t);return o?N(n,o).slice(0,e):[]}l(tt,"queryFiles");export{J as a,k as b,V as c,Q as d,tt as e};
@@ -0,0 +1,9 @@
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 i}from"./chunk-E66B27AL.mjs";var p=6;function E(e,n=p){let s=[],o=new Set,f=i((r,t,l)=>{let c=h(r);if(!c||c.length<12)return;let u=c.toLowerCase();o.has(u)||(o.add(u),s.push({rule:c,sourceId:t,kind:l}))},"push");for(let r of e.filter(t=>t.type==="feedback")){if(s.length>=n)break;f(r.content,r.id,"preference")}for(let r of e.filter(t=>t.type==="improvement-signal"&&t.tags?.source==="friction-detector")){if(s.length>=n)break;let t=a(r.content)??g(r.content);t&&f(t,r.id,"friction")}return s}i(E,"extractDeveloperRules");function h(e){return e.replace(/\s+/g," ").trim().replace(/^[-*•]\s+/,"")}i(h,"normalizeRule");function a(e){return e.match(/^Next action:\s*(.+)$/im)?.[1]?.trim()||null}i(a,"extractNextAction");function g(e){let n=e.split(`
9
+ `).map(o=>o.trim())[0]??"",s=n.match(/^\[[^\]]+\]\s+Lesson:\s*(.+)$/i);return s?.[1]?s[1].trim():/^\[[^\]]+\]/.test(n)&&n.length>20?n:null}i(g,"extractLesson");export{E 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{c as r}from"./chunk-L4COZ7ZH.mjs";import{b as t}from"./chunk-SOPRYWUY.mjs";import{a as e}from"./chunk-E66B27AL.mjs";function u(o){let n=t(o);return n.allow?null:{deny:n.denyMessage}}e(u,"decideSecrets");function l(o=process.cwd(),n){return r({event:"PreToolUse",projectPath:o,decide:e(async c=>{try{return u(c)}catch{return null}},"decide")},n)}e(l,"runPreSecretsHook");var p={decideSecrets:u};export{u as a,l as b,p as c};
@@ -0,0 +1,7 @@
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);
@@ -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 u,e as c}from"./chunk-HE5RSIHG.mjs";import{a as r}from"./chunk-E66B27AL.mjs";c();function g(){return"---"}r(g,"mdHeader");function a(){return`---
9
+ prjct v${u()}`}r(a,"mdFooter");function f(...n){return m(g(),...n.filter(Boolean),a())}r(f,"mdOutput");function d(n,t){let i=`| ${n.join(" | ")} |`,e=`|${n.map(()=>"---").join("|")}|`,o=t.map(s=>`| ${s.join(" | ")} |`);return[i,e,...o].join(`
10
+ `)}r(d,"mdTable");function l(n,t,i=3){return`### ${n}
11
+ ${t}`}r(l,"mdSection");function $(n,t=!1){return n.map((i,e)=>t?`${e+1}. ${i}`:`- ${i}`).join(`
12
+ `)}r($,"mdList");function h(n){let t=["Command","Action"],i=n.map(e=>[`\`${e.command}\``,e.label]);return`### Next
13
+ ${d(t,i)}`}r(h,"mdNextSteps");function x(n){let t=Object.entries(n).filter(([,o])=>o!=null);if(t.length===0)return"";let i=["Metric","Value"],e=t.map(([o,s])=>[o,String(s)]);return d(i,e)}r(x,"mdStats");function b(n,t){return t?`## ${n}
14
+ > ${t}`:`## ${n}`}r(b,"mdDone");function j(n){return`> **WARNING:** ${n}`}r(j,"mdWarn");function m(...n){return n.filter(Boolean).join(`
15
+
16
+ `)}r(m,"mdJoin");export{f as a,l as b,$ as c,h as d,x as e,b as f,j as g};
@@ -0,0 +1,17 @@
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 i}from"./chunk-E66B27AL.mjs";function a(e,r){let n=r?.turnCount??0,o=e?.maxTurnsPerCycle&&e.maxTurnsPerCycle>0?e.maxTurnsPerCycle:15,c=o>0?n/o:0;if(!r||n<=0)return{level:"ok",cue:null,turns:n,limit:o,ratio:0};let s=e?.maxTokensPerCycle??0,l=(r.tokensIn??0)+(r.tokensOut??0),u=s>0?l/s:0,t=Math.max(c,u);return t>=.7?{level:"critical",turns:n,limit:o,ratio:t,cue:`# prjct: context density (high ~${Math.round(t*100)}%)
9
+ Session continues \u2014 do NOT force land/clear just because the cycle is long.
10
+ Protect the window: no broad Grep/Glob thrash, no re-research from zero, pull memory by id (\`prjct context memory mem_N\`), prefer compact format.
11
+ Persist durable signal with \`prjct remember\` / land when YOU choose hygiene \u2014 not as a kill switch.
12
+ Host "Context 100%" is the real window limit; until then keep working with high-signal tools only.`}:t>=.6?{level:"warn",turns:n,limit:o,ratio:t,cue:`# prjct: context density (~${Math.round(t*100)}%)
13
+ Keep the chat \u2014 prefer high-signal tools only:
14
+ 1. Finish the current slice (no new rabbit holes)
15
+ 2. Recall compact / by-id \u2014 do not re-index the tree
16
+ 3. Optional hygiene later: \`prjct land\` then \`prjct prime\` if the HOST context is actually full
17
+ Do not treat this as "session must end".`}:{level:"ok",cue:null,turns:n,limit:o,ratio:t}}i(a,"contextPressureVerdict");function h(e,r){return r?.contextPressure?.hardBlockShip===!0&&e.level==="critical"}i(h,"contextPressureBlocksExpansion");function p(e){return e.level==="critical"?`ctx:${Math.round(e.ratio*100)}% density \u2014 compact tools only`:e.level==="warn"?`ctx:${Math.round(e.ratio*100)}% density \u2014 prefer compact`:""}i(p,"contextPressureStatusLine");function x(e){return e.level==="warn"||e.level==="critical"}i(x,"contextPressureRequiresCompactPath");export{a,h as b,p as c,x 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 r}from"./chunk-E66B27AL.mjs";function p(c,t){let o=c?.maxTurnsPerCycle??0,e=t?.turnCount??0,s=!!t?.turnLimitAcknowledgedAt,n=o>0&&!!t&&e>=o&&!s,i=t?.description??"this cycle",l=n?`\u26D4 prjct hard stop: ${e} turns on cycle "${i}" (limit ${o}). You are looping \u2014 STOP. Re-plan, split it, or ship the slice that already works, then \`prjct status done\`. To consciously continue THIS cycle: \`prjct work --extend\`.`:"";return{stopped:n,turns:e,limit:o,message:l}}r(p,"loopGuardVerdict");export{p as a};
@@ -0,0 +1,9 @@
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 d}from"./chunk-AOPJ4Z6O.mjs";import{e as r,g as f}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";f();var u=class{static{m(this,"CustomWorkflowStorage")}createWorkflow(t,e){let n=new Date().toISOString();r.run(t,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
9
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,e.name,e.description??null,n,n,e.metadata?JSON.stringify(e.metadata):null);let o=r.get(t,"SELECT id FROM custom_workflows WHERE name = ?",e.name);if(!o)throw new Error(`Failed to create workflow: ${e.name}`);return d({projectId:t,entityType:"custom_workflows",entityId:String(o.id),eventType:"upsert",data:{id:o.id,name:e.name,description:e.description??null,metadata:e.metadata??null,created_at:n,updated_at:n,is_builtin:0,enabled:1}}),o.id}getWorkflow(t,e){let n=r.get(t,"SELECT * FROM custom_workflows WHERE name = ?",e);return n?this.rowToWorkflow(n):null}getAllWorkflows(t,e=!1){let n=e?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return r.query(t,n).map(l=>this.rowToWorkflow(l))}updateWorkflow(t,e,n){if(!this.getWorkflow(t,e))return!1;let l=new Date().toISOString(),s=[],a=[];if(n.description!==void 0&&(s.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(s.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(s.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),s.length===0)return!1;s.push("updated_at = ?"),a.push(l),a.push(e),r.run(t,`UPDATE custom_workflows SET ${s.join(", ")} WHERE name = ?`,...a);let i=this.getWorkflow(t,e);return i&&d({projectId:t,entityType:"custom_workflows",entityId:String(i.id),eventType:"upsert",data:{id:i.id,name:i.name,description:i.description??null,enabled:i.enabled?1:0,metadata:i.metadata??null,updated_at:l}}),!0}deleteWorkflow(t,e){let n=this.getWorkflow(t,e);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${e}`);return r.run(t,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",e),d({projectId:t,entityType:"custom_workflows",entityId:String(n.id),eventType:"delete",data:{id:n.id,name:e}}),!0}isBuiltin(t,e){return this.getWorkflow(t,e)?.isBuiltin??!1}isReservedName(t){let e=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return e.includes(t)||n.includes(t)}isValidName(t){return/^[a-z0-9-]+$/.test(t)}rowToWorkflow(t){return{id:t.id,name:t.name,description:t.description,createdAt:t.created_at,updatedAt:t.updated_at,isBuiltin:t.is_builtin===1,enabled:t.enabled===1,metadata:t.metadata?JSON.parse(t.metadata):null}}},p=new u;export{p as a};
@@ -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 y}from"./chunk-QSAA6LZF.mjs";import{e as O}from"./chunk-75UJIVMO.mjs";import{a as s}from"./chunk-E66B27AL.mjs";var q=/(^|\/)(auth|security|crypto|migration|migrations|password|oauth|payment|billing|secret|token|session|rbac|acl)(\/|\.|$)/i;function T(e){return e?.length?e.some(n=>q.test(n)):!1}s(T,"isHotPath");function X(e,n={}){return n.harnessLevel==="H3"||n.harnessKind==="security"||T(n.paths)?"full":e==="trivial"?"skip":e==="normal"?"standard":"full"}s(X,"routeIntensity");function ge(e,n={}){let t=O(e);return{tier:t,intensity:X(t,n)}}s(ge,"intensityFromChangeset");function b(e){let n=e.title.toLowerCase().replace(/[^a-z0-9\s]/g," ").replace(/\s+/g," ").trim().slice(0,120),t=(e.file??"").toLowerCase().replace(/\\/g,"/"),i=e.line&&e.line>0?String(Math.floor(e.line/5)*5):"";return`dna:${Y(`${n}|${t}|${i}`)}`}s(b,"findingDna");function Y(e){return(e.split("").reduce((t,i)=>Math.imul(t^i.charCodeAt(0),16777619),2166136261)>>>0).toString(16).padStart(8,"0")}s(Y,"hash32");function F(e){let n=!!e.file?.trim(),t=typeof e.line=="number"&&e.line>0,i=!!(e.evidence&&e.evidence.trim().length>=12);return n&&t&&i?3:n&&t?2:n?1:0}s(F,"evidenceScore");function _(e){let n=F(e),t=e.severity,i=t==="blocker"&&n<2?"critical":t==="critical"&&n===0?"warning":t,r=i==="warning"||i==="suggestion"?"info":e.status==="info"?"candidate":e.status;return{...e,severity:i,status:r,evidenceScore:n,dna:e.dna??b(e),blast:e.blast??S({...e,severity:i,evidenceScore:n})}}s(_,"applyEvidenceTax");var Q=/\b(prefer[- ]const|use const|should be const|can be const|const instead|instead of let|never reassigned|not reassigned|let\s*→\s*const|change let to const|let is unnecessary|why let|por qu[eé] let)\b/i;function Z(e){return Q.test(e)}s(Z,"isPreferConstClaim");function fe(e){let n=`${e.title}
9
+ ${e.evidence??""}`;if(!Z(n))return e;if(F(e)<3){let i="[CONST-ONLY TAX: include file:line + snippet and propose an immutable rewrite; title-only findings are noise]";return _({...e,severity:"suggestion",status:"info",evidence:e.evidence?`${e.evidence}
10
+ ${i}`:i})}return e}s(fe,"applyMechanicalStyleRefute");var R={blocker:100,critical:70,warning:20,suggestion:5};function S(e){return(R[e.severity]??0)+(e.evidenceScore??0)*5+(e.file&&T([e.file])?25:0)+(e.status==="stands"?10:0)+(e.status==="open"?15:0)}s(S,"blastRank");function N(e,n){return[...e].filter(t=>f(t.severity)&&(t.status==="stands"||t.status==="candidate"||t.status==="open"||t.status==="fixed")&&A(t.file,n)).sort((t,i)=>(i.blast??S(i))-(t.blast??S(t)))}s(N,"rankFindingsForFix");function f(e){return e==="blocker"||e==="critical"}s(f,"isActionableSeverity");function j(e){let n=_(e);return f(n.severity)?n.status==="info"?{...n,status:"candidate"}:n:{...n,status:"info"}}s(j,"applySeverityFloor");function pe(e){return e.map(j)}s(pe,"applySeverityFloorAll");function ee(e,n,t,i){let r=n.dna;return r?{ghosts:(e.ghosts.find(d=>d.dna===r)?e.ghosts.map(d=>d.dna===r?{...d,times:d.times+1,lastSeenAt:t,lastReason:i??d.lastReason,title:n.title||d.title}:d):[...e.ghosts,{dna:r,title:n.title,times:1,lastSeenAt:t,lastReason:i}]).sort((d,p)=>p.times-d.times).slice(0,200),updatedAt:t}:e}s(ee,"markGhost");function me(e,n,t){return n.reduce((i,r)=>r.status==="refuted"&&r.dna?ee(i,r,t,"refuted by panel"):i,e)}s(me,"recordRefutedAsGhosts");function he(e,n){if(!n?.ghosts.length)return e;let t=new Map(n.ghosts.map(i=>[i.dna,i]));return e.map(i=>{let r=i.dna??b(i),o=t.get(r);return o?{...i,dna:r,knownFalsePositive:!0,evidence:i.evidence?`${i.evidence} [GHOST: refuted ${o.times}\xD7 in this project]`:`[GHOST: refuted ${o.times}\xD7 here \u2014 challenge hard]`}:{...i,dna:r}})}s(he,"applyGhostFilter");function ve(e,n,t=se){let i=new Map,r=s(c=>{for(let m of c.findings){let h=b(m),v=i.get(h)??[];v.push({role:c.role,raw:m}),i.set(h,v)}},"ingest");r({...e,role:"red"}),r({...n,role:"blue"});let o=[...i].map(([c,m])=>{let h=new Set(m.map(l=>l.role)),v=h.has("red"),P=h.has("blue"),H=m.filter(l=>l.role==="red"),V=m.filter(l=>l.role==="blue"),x=[...m].sort((l,B)=>{let W=R[l.raw.severity]+F(l.raw)*5;return R[B.raw.severity]+F(B.raw)*5-W})[0].raw,z=[...h],M=H.some(l=>f(l.raw.severity)),U=V.some(l=>f(l.raw.severity)),K=v&&P?M!==U?"contradicted":"agreed":v?"onlyRed":"onlyBlue";return{finding:j({id:t(),severity:x.severity,status:"candidate",title:x.title,file:x.file,line:x.line,evidence:x.evidence,judge:x.judge??[...h].join("+"),role:v&&P?void 0:v?"red":"blue",dna:c,agreedBy:z}),outcome:K}}),a=o.map(({finding:c})=>c),u=o.filter(({outcome:c})=>c==="agreed").length,d=o.filter(({outcome:c})=>c==="onlyRed").length,p=o.filter(({outcome:c})=>c==="onlyBlue").length,g=o.filter(({outcome:c})=>c==="contradicted").length,C=g>0;return{findings:a,agreed:u,onlyRed:d,onlyBlue:p,contradicted:g,shouldEscalate:C,escalateReason:C?`${g} dual-blind contradiction(s): red says actionable, blue says not (or reverse). Do not tie-break \u2014 escalate to user.`:""}}s(ve,"mergeDualJudges");function D(e){return e==="full"?3:1}s(D,"refutePanelSize");function te(e,n){let t=e??[];if(t.length===0)return"stands";if(n===1)return t[0]==="refuted"?"refuted":"stands";let i=[...t];for(;i.length<3;)i.push("stands");return i.slice(0,3).filter(o=>o==="refuted").length>=2?"refuted":"stands"}s(te,"resolveRefuteVotes");function xe(e,n,t){let i=D(t);return e.map(r=>{if(r.status==="info"||r.status==="refuted"||r.status==="verified")return r;if(!f(r.severity))return{...r,status:"info"};if(r.status!=="candidate"&&r.status!=="stands")return r;let o=n[r.id],a=te(o,i);return{...r,status:a,refuteVotes:o??r.refuteVotes}})}s(xe,"applyBatchRefutation");function k(e){return e.filter(n=>f(n.severity)&&(n.status==="stands"||n.status==="candidate"||n.status==="open"))}s(k,"actionableOpen");function ye(e){return k(e.findings).length===0?{ok:!1,reason:"no actionable open findings"}:e.fixRound>=e.maxFixRounds?{ok:!1,reason:`convergence budget exhausted (${e.fixRound}/${e.maxFixRounds}) \u2014 leftover stays open; do not start round 3`}:{ok:!0,reason:""}}s(ye,"canStartFixRound");function be(e,n){let t=e.fixRound+1;return t>e.maxFixRounds?ne(e,n):{...e,fixRound:t,updatedAt:n,verdict:"in_progress"}}s(be,"advanceFixRound");function ne(e,n){let t=e.findings.map(r=>f(r.severity)&&(r.status==="stands"||r.status==="candidate")?{...r,status:"open"}:r),i=k(t).length>0||t.some(r=>r.status==="open");return{...e,findings:t,fixRound:e.maxFixRounds,updatedAt:n,verdict:i?"blocked":"approved",precisionHint:E(t)}}s(ne,"markLeftoversOpen");function Re(e,n,t,i){let r=new Set(n),o=e.findings.map(a=>!r.has(a.id)||(t==="fixed"||t==="verified")&&!G(a,e.scopePaths)?a:{...a,status:t});return{...e,findings:o,updatedAt:i,precisionHint:E(o)}}s(Re,"markFindings");function Fe(e,n,t){if(t!=="fixed"&&t!=="verified")return[];let i=new Set(n);return e.findings.filter(r=>i.has(r.id)&&!G(r,e.scopePaths)).map(r=>r.id)}s(Fe,"markFindingsSkippedByScope");function E(e){let n=e.filter(r=>r.status==="verified").length,t=e.filter(r=>r.status==="refuted").length,i=n+t;if(i!==0)return Math.round(n/i*1e3)/1e3}s(E,"computePrecisionHint");function L(e){if(e.verdict==="escalated")return"escalated";if(e.verdict==="approved")return"approved";if(e.findings.length===0)return"in_progress";let n=k(e.findings),t=e.findings.some(r=>r.status==="open");return n.length>0||t?"blocked":e.findings.some(r=>f(r.severity)&&r.status==="candidate")?"in_progress":"approved"}s(L,"computeVerdict");function je(e,n){let t=L(e);return{...e,verdict:t,updatedAt:n,precisionHint:E(e.findings)}}s(je,"finalizeLedger");function ke(e){let t=N(e.findings.filter(i=>f(i.severity)&&(i.status==="fixed"||i.status==="stands"||i.status==="open")),e.scopePaths).map(({id:i,severity:r,status:o,title:a,file:u,line:d,blast:p,dna:g})=>({id:i,severity:r,status:o,title:a,file:u,line:d,blast:p,dna:g}));return{intensity:e.intensity,fixRound:e.fixRound,maxFixRounds:e.maxFixRounds,findings:t,fixOrder:t.map(i=>i.id),scope:(()=>{let i=e.scopePaths??[];return`Re-judge ONLY the persisted ledger findings below plus the fix-diff for those items. Confirm each fixed finding is actually resolved; report regressions on those lines only. Fix order is blast-ranked \u2014 do not reorder by preference.${i.length>0?` Frozen scope (${i.length} paths): ${i.slice(0,12).join(", ")}${i.length>12?"\u2026":""}.`:""}`})(),outOfScope:"Do NOT reopen the original full PR diff. Do NOT invent new WARNING/SUGGESTION loops. Findings whose file is outside the frozen git scope are follow-up only (info) \u2014 they do not enter fix loops. New BLOCKER/CRITICAL on in-scope fix-diff may be added as candidates (evidence tax + severity floor + challenge still apply)."}}s(ke,"buildReReviewBrief");var w="RED (attack): assume the change is hostile. Hunt production killers \u2014 races, auth holes, data loss, silent fail. Prefer over-calling; blue + refuters will kill FPs. Output severity + file:line + 1-line repro. Enforce const-only bindings with a concrete immutable rewrite when reassignment exists.",J="BLUE (defense): assume the author is competent. Only report defects you can reproduce from the code. Challenge red overclaims. Same schema: severity + file:line + evidence. For const-only findings, require a viable immutable rewrite rather than a keyword-only suggestion.";function Se(e,n){if(n==="skip"&&!e)return{kind:"skip_ship",directive:"Intensity skip \u2014 ship without judgment tax.",steps:["prjct ship"],intensity:n,fixRound:0,maxFixRounds:0,counts:$(),rankedFixIds:[]};if(!e)return{kind:"open_ledger",directive:`Open a judgment ledger (intensity=${n}).`,steps:["prjct judgment open","prjct judgment next"],intensity:n,fixRound:0,maxFixRounds:y,counts:$(),rankedFixIds:[],judgeCharters:n==="full"?{red:w,blue:J}:void 0};let t=ie(e.findings),i=N(e.findings),r={intensity:e.intensity,fixRound:e.fixRound,maxFixRounds:e.maxFixRounds,counts:t,rankedFixIds:i.map(o=>o.id),judgeCharters:e.intensity==="full"?{red:w,blue:J}:void 0};if(e.verdict==="escalated")return{...r,kind:"escalate",directive:`ESCALATED: ${e.escalateReason??"judges contradict"}. Surface to user.`,steps:["Present both judge verdicts to the user","Do not ship"]};if(e.verdict==="approved")return{...r,kind:"approve",directive:"Ledger APPROVED \u2014 ship is clear for judgment gate.",steps:["prjct ship"]};if(e.findings.length===0)return{...r,kind:"dispatch_reviewers",directive:e.intensity==="full"?"Dispatch RED + BLUE judges in parallel (blind). Then prjct judgment merge. If both find nothing: prjct judgment approve.":"Dispatch ONE focused reviewer. Record findings with prjct judgment add (or approve if truly clean).",steps:e.intensity==="full"?["Spawn RED judge (attack charter) + BLUE judge (defense charter) in parallel","prjct judgment merge --red '[...]' --blue '[...]'","prjct judgment next"]:["Spawn one fresh-context reviewer (model: sonnet)","prjct judgment add --severity \u2026 --title \u2026 --file \u2026 --line \u2026","prjct judgment challenge --verdicts \u2026"]};if(t.candidates>0&&t.stands===0&&t.fixed===0)return{...r,kind:"dispatch_refuters",directive:`Batch-challenge ${t.candidates} candidate(s). Ceiling: ${D(e.intensity)} vote(s) total \u2014 never per-finding tasks.`,steps:["Spawn ONE batched refuter (or 3-lens panel on full) over ALL candidates","prjct judgment challenge --verdicts id:stands|refuted[,\u2026]","prjct judgment next"]};if(t.stands>0||t.open>0){if(e.fixRound>=e.maxFixRounds)return{...r,kind:"blocked_budget",directive:"Convergence budget exhausted with leftovers \u2014 report open, no round 3.",steps:["prjct judgment fix-round # marks leftovers open","Surface open findings to user or escalate"]};let o=i.slice(0,5).map(a=>`${a.id}(${a.severity})`).join(", ");return{...r,kind:"fix_ranked",directive:`Fix blast-ranked stands (${t.stands} open). Top: ${o||"\u2014"}`,steps:["prjct judgment fix-round",`Implementer fixes ONLY stands \u2014 order: ${r.rankedFixIds.join(" \u2192 ")||"\u2014"}`,`prjct judgment fixed ${r.rankedFixIds.join(" ")}`,"prjct judgment brief # scoped re-judge",`prjct judgment verify ${r.rankedFixIds.join(" ")}`]}}return t.fixed>0?{...r,kind:"rejudge_scoped",directive:`Re-judge ${t.fixed} fixed finding(s) with scoped brief only.`,steps:["prjct judgment brief","Fresh judge on ledger+fix-diff only","prjct judgment verify <ids>","prjct judgment approve"]}:L(e)==="approved"?{...r,kind:"approve",directive:"Clean ledger \u2014 approve and ship.",steps:["prjct judgment approve","prjct ship"]}:{...r,kind:"idle",directive:"Ledger in progress \u2014 run prjct judgment status.",steps:["prjct judgment status","prjct judgment next"]}}s(Se,"buildNextAction");function $(){return{candidates:0,stands:0,refuted:0,fixed:0,verified:0,info:0,open:0,ghosts:0}}s($,"emptyCounts");function ie(e){let n=$();for(let t of e)t.status==="candidate"?n.candidates++:t.status==="stands"?n.stands++:t.status==="refuted"?n.refuted++:t.status==="fixed"?n.fixed++:t.status==="verified"?n.verified++:t.status==="info"?n.info++:t.status==="open"&&n.open++,t.knownFalsePositive&&n.ghosts++;return n}s(ie,"countStatuses");function we(e){switch(e){case"skip":return{intensity:e,reviewers:"none \u2014 trivial/docs-only changeset",refuters:"none",severityFloor:"n/a",evidenceTax:"n/a",maxFixRounds:0,shipExpectation:"ship without judgment ledger"};case"standard":return{intensity:e,reviewers:"exactly ONE focused review pass (fresh-context subagent)",refuters:"exactly ONE batched refuter over all BLOCKER/CRITICAL candidates",severityFloor:"only verified BLOCKER/CRITICAL enter fix loops; WARNING/SUGGESTION = info once",evidenceTax:"blocker without file:line demoted to critical; title-only critical \u2192 info",maxFixRounds:y,shipExpectation:"ledger verdict approved (or --no-spec-gate override)"};case"full":return{intensity:e,reviewers:"dual-blind RED (attack) + BLUE (defense) in parallel \u2014 merge via prjct judgment merge",refuters:"exactly THREE batched refuter votes (correctness/impact/repro); 2-of-3 kills; fail-closed stands",severityFloor:"only verified BLOCKER/CRITICAL enter fix loops; WARNING/SUGGESTION = info once",evidenceTax:"blocker without file:line demoted to critical; title-only critical \u2192 info",maxFixRounds:y,shipExpectation:"ledger verdict approved after \u22642 fix rounds (or escalate)",redCharter:w,blueCharter:J}}}s(we,"intensityProtocol");function Je(e){let{codeStrict:n,intensity:t,ledger:i,override:r}=e;if(r)return{blocked:!1,mode:"none",message:"",reason:"override"};if(t==="skip")return{blocked:!1,mode:"none",message:"",reason:"skip-intensity"};if(!i){let d=`Precision judgment required (intensity=${t}): run \`prjct judgment plan\` \u2192 \`prjct judgment open\` \u2192 follow \`prjct judgment next\`.${t==="full"?" Dual-blind RED+BLUE required (code-strict default).":""} Override only with explicit consent: \`prjct ship --no-judgment-gate\`.`;return n?{blocked:!0,mode:"hard",message:d,reason:"missing-ledger"}:{blocked:!1,mode:"soft",message:`\u2696\uFE0F ${d}`,reason:"soft-reminder"}}let o=L(i);if(o==="approved"){let u=i.precisionHint!==void 0?`, precision\u2248${Math.round(i.precisionHint*100)}%`:"";return{blocked:!1,mode:"none",message:`\u2696\uFE0F judgment ${i.id.slice(0,8)} \u2192 APPROVED (intensity=${i.intensity}, rounds=${i.fixRound}/${i.maxFixRounds}${u})`,reason:"approved"}}if(o==="escalated"){let u=`Judgment escalated: ${i.escalateReason??"judges contradict"}. Resolve with the user before ship.`;return n?{blocked:!0,mode:"hard",message:u,reason:"escalated"}:{blocked:!1,mode:"soft",message:`\u2696\uFE0F ${u}`,reason:"escalated"}}if(o==="blocked"){let u=[...k(i.findings),...i.findings.filter(g=>g.status==="open")],d=u.slice(0,5).map(g=>`${g.severity}:${g.title}`).join("; "),p=`Judgment blocked \u2014 open actionable (${u.length}): ${d||"see ledger"}. Fix blast-ranked + re-judge (\u2264${y} rounds) or escalate. \u2192 \`prjct judgment next\``;return n?{blocked:!0,mode:"hard",message:p,reason:"blocked-findings"}:{blocked:!1,mode:"soft",message:`\u2696\uFE0F ${p}`,reason:"blocked-findings"}}let a=`Judgment in progress (round ${i.fixRound}/${i.maxFixRounds}, ${i.findings.length} findings). \u2192 \`prjct judgment next\``;return n?{blocked:!0,mode:"hard",message:a,reason:"in-progress"}:{blocked:!1,mode:"soft",message:`\u2696\uFE0F ${a}`,reason:"in-progress"}}s(Je,"judgmentShipVerdict");function $e(e,n){let t=j(n),i=t.dna??b(t),r=e.findIndex(d=>(d.dna??b(d))===i);if(r<0){let d={...t,dna:i};return{findings:[...e,d],finding:d,deduped:!1}}let o=e[r],a=j({...o,severity:R[t.severity]>R[o.severity]?t.severity:o.severity,title:t.title.length>=o.title.length?t.title:o.title,file:t.file??o.file,line:t.line??o.line,evidence:(t.evidence?.length??0)>(o.evidence?.length??0)?t.evidence:o.evidence,judge:[o.judge,t.judge].filter(Boolean).join("+")||o.judge,agreedBy:[...new Set([...o.agreedBy??[],...t.agreedBy??[],t.judge].filter(Boolean))],dna:i}),u=[...e];return u[r]=a,{findings:u,finding:a,deduped:!0}}s($e,"upsertFinding");function I(e){return e.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/+/g,"/").replace(/\/$/,"").trim()}s(I,"normalizeScopePath");function A(e,n){if(!n||n.length===0||!e||!e.trim())return!0;let t=I(e);if(!t)return!0;for(let i of n){let r=I(i);if(r&&(t===r||t.startsWith(`${r}/`)))return!0}return!1}s(A,"pathInScope");function re(e,n){return A(e.file,n)||e.status==="info"||e.status==="refuted"?e:{...e,status:"info",evidence:(e.evidence?`${e.evidence} \xB7 `:"")+"out of frozen review scope (follow-up only; does not enter fix loops or block ship)"}}s(re,"applyScopeFreeze");function Ie(e,n){return e.map(t=>re(t,n))}s(Ie,"applyScopeFreezeAll");function G(e,n){return e.status==="info"||e.status==="refuted"?!1:A(e.file,n)}s(G,"findingInFixScope");function se(){return`jf_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}s(se,"newFindingId");function oe(){return`jl_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}s(oe,"newLedgerId");function Ee(e){let n=e.scopePaths&&e.scopePaths.length>0?[...new Set(e.scopePaths.map(I).filter(Boolean))]:void 0;return{id:oe(),target:e.target,intensity:e.intensity,maxFixRounds:y,fixRound:0,findings:[],verdict:"in_progress",createdAt:e.now,updatedAt:e.now,baseSha:e.baseSha,headSha:e.headSha,deliveryTier:e.deliveryTier,scopePaths:n,scopeFrozenAt:n?e.now:void 0}}s(Ee,"createLedger");export{q as a,T as b,X as c,ge as d,b as e,F as f,_ as g,Q as h,Z as i,fe as j,S as k,N as l,f as m,j as n,pe as o,ee as p,me as q,he as r,ve as s,D as t,te as u,xe as v,k as w,ye as x,be as y,ne as z,Re as A,Fe as B,E as C,L as D,je as E,ke as F,Se as G,we as H,Je as I,$e as J,I as K,A as L,re as M,Ie as N,G as O,se as P,oe as Q,Ee as R};
@@ -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{n as y,o as h}from"./chunk-CTWZQ7YI.mjs";import{a as o}from"./chunk-E66B27AL.mjs";h();var b=2,v=20,p=10,u=400;function k(e){return e.files<=b&&e.loc<=v?"trivial":e.files<=p&&e.loc<=u?"normal":"large"}o(k,"tierOf");function x(e){return e==="trivial"?"direct":e==="normal"?"single":"split"}o(x,"geometryOf");async function l(e,r){return y(e,r)}o(l,"safeGit");function d(e){let r=e.match(/(\d+) files? changed/),t=e.match(/(\d+) insertions?/),s=e.match(/(\d+) deletions?/),i=r?Number.parseInt(r[1],10):0,n=(t?Number.parseInt(t[1],10):0)+(s?Number.parseInt(s[1],10):0);return{files:i,loc:n}}o(d,"parseShortstat");async function G(e){let r=await l(e,["rev-parse","--abbrev-ref","origin/HEAD"]),t=r&&r!=="origin/HEAD"?r:await(async()=>{for(let c of["main","master"])if(await l(e,["rev-parse","--verify","--quiet",c])!==null)return c;return""})();if(!t)return null;let s=await l(e,["merge-base",t,"HEAD"]);if(!s)return null;let i=await l(e,["rev-parse","HEAD"]);if(!i||i===s)return null;let n=await l(e,["diff","--shortstat",`${s}..HEAD`]);if(n===null)return null;let{files:a,loc:m}=d(n),f=await l(e,["diff","--name-only",`${s}..HEAD`])??"",g=[...new Set(f.split(`
9
+ `).filter(Boolean).map(c=>c.includes("/")?c.slice(0,c.indexOf("/")):"."))].sort();return{base:s.slice(0,7),files:a,loc:m,dirs:g,source:"committed"}}o(G,"computeCommittedChangeset");async function w(e){let r=await l(e,["diff","--shortstat","HEAD"]),t=await l(e,["diff","--shortstat","--cached"]);if(r===null&&t===null)return null;let s=d(r??""),i=d(t??""),n=Math.max(s.files,i.files),a=s.loc+i.loc;if(n===0&&a===0)return null;let m=await l(e,["diff","--name-only","HEAD"])??await l(e,["diff","--name-only","--cached"])??"",f=[...new Set(m.split(`
10
+ `).filter(Boolean).map(g=>g.includes("/")?g.slice(0,g.indexOf("/")):"."))].sort();return{base:"HEAD",files:n,loc:a,dirs:f,source:"working-tree"}}o(w,"computeWorkingTreeChangeset");function L(e,r){let t=e.dirs.length>1?` Natural split lines: ${e.dirs.slice(0,6).join(", ")}.`:"";return`Delivery geometry gate: ${e.loc} LOC / ${e.files} files (${e.source}) \u2192 suggested \`${r}\`.${t} Decide explicitly: \`prjct work "<intent>" --geometry split|single|direct\` or split the tree before continuing. (Relax: \`prjct config\` deliveryGeometry off.)`}o(L,"geometryBlockMessage");function $(e){let r=e.harnessLevel,t=e.harnessRisk==="high",s=r==="H3"||r==="H2"&&t,i=!!e.treeLarge||s,n=r==="H3"||t||e.treeLarge?"split":"single";if(e.explicitGeometry)return{blocked:!1,message:null,reason:"has-geometry",geometry:e.explicitGeometry};if(!i)return{blocked:!1,message:null,reason:"not-large",geometry:"direct"};let a=`Delivery geometry (intent): ${r}`+(t?" high-risk":"")+(e.treeLarge?" + large working tree":"")+` \u2192 plan as \`${n}\` before coding. Pass \`prjct work "<intent>" --geometry split|single|direct\` (or stamp geometry on the linked intent/spec). Dynasty: geometry is first-class plan, not only a ship-time afterthought.`;return e.mode==="strict"?{blocked:!0,message:a,reason:e.treeLarge?"tree-strict":"h2-intent-strict",geometry:n}:{blocked:!1,message:`\u26A0\uFE0F ${a}`,reason:"h2-intent-advisory",geometry:n}}o($,"intentGeometryVerdict");function A(e){if(e.mode==="off"||!e.changeset)return{blocked:!1,message:null,tier:"trivial",geometry:"direct",reason:"none"};let r=e.locThreshold??u,t=k(e.changeset),s=x(t);if(e.changeset.loc<r&&t!=="large")return{blocked:!1,message:null,tier:t,geometry:s,reason:"ok-small"};if(e.explicitGeometry)return{blocked:!1,message:null,tier:t,geometry:e.explicitGeometry,reason:"override"};let i=e.changeset.dirs&&e.changeset.dirs.length>1?` Natural split lines: ${e.changeset.dirs.slice(0,6).join(", ")}.`:"",n=`Delivery geometry (ship): ${e.changeset.loc} LOC / ${e.changeset.files} files (${e.changeset.source}) \u2192 suggested \`${s}\`.${i} Decide with \`prjct ship --geometry split|single|direct\` before publishing. (SUPERIOR to silent large PRs \u2014 gentle-ai forecast with teeth.)`;return e.mode==="strict"?{blocked:!0,message:n,tier:t,geometry:s,reason:"strict-block"}:{blocked:!1,message:`\u26A0\uFE0F ${n}`,tier:t,geometry:s,reason:"advisory"}}o(A,"shipGeometryVerdict");export{b as a,v as b,p as c,u as d,k as e,x as f,G as g,w as h,L as i,$ as j,A as k};
@@ -0,0 +1,9 @@
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 u,g as L}from"./chunk-HDHVBB6Q.mjs";import{b as f,e as P}from"./chunk-AKIN5WSQ.mjs";import{a as c}from"./chunk-E66B27AL.mjs";P();L();function b(t,e,n){let s=t.prepare("INSERT INTO analysis_finding (id, analysis_id, kind, title, detail, severity, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?)"),o=[],i=c((a,m,p,j)=>{if(!m)return;let k=o.length,S=`${e}-f${k}`;s.run(S,e,a,m,p,j,k),o.push(S)},"addFinding");for(let a of n.patterns??[])i("pattern",a.name,a.description,null);for(let a of n.antiPatterns??[])i("anti_pattern",a.issue,a.suggestion,a.severity);for(let a of n.techDebt??[])i("tech_debt",a.description,`${a.area}: ${a.impact}`,a.priority);for(let a of n.riskAreas??[])i("risk_area",a.path,`${a.reason} \u2014 ${a.risk}`,a.severity);for(let a of n.refactorSuggestions??[])i("refactor",a.description,a.benefit,null);for(let a of n.projectInsights??[])i("insight",a,null,null);for(let a of n.architecture?.insights??[])i("insight",a,null,null);let l=t.prepare("INSERT INTO analysis_convention (id, analysis_id, rule, sort_order) VALUES (?, ?, ?, ?)");(n.conventions??[]).forEach((a,m)=>{l.run(`${e}-c${m}`,e,a.rule,m)});let g=t.prepare("INSERT INTO analysis_stack_item (id, analysis_id, kind, name) VALUES (?, ?, ?, ?)");[...(n.stack?.languages??[]).map(a=>({kind:"language",name:a})),...(n.stack?.frameworks??[]).map(a=>({kind:"framework",name:a}))].forEach((a,m)=>{g.run(`${e}-s${m}`,e,a.kind,a.name)});let d=t.prepare("INSERT INTO analysis_command (id, analysis_id, name, command, purpose) VALUES (?, ?, ?, ?, ?)");Object.entries(n.commands??{}).filter(a=>!!a[1]).forEach(([a,m],p)=>{d.run(`${e}-cmd${p}`,e,a,m,null)});let v=t.prepare("INSERT INTO analysis_domain (id, analysis_id, name, paths) VALUES (?, ?, ?, ?)");(n.architecture?.domains??[]).forEach((a,m)=>{v.run(`${e}-d${m}`,e,a,null)})}c(b,"writeAnalysisChildren");var h=class{static{c(this,"LLMAnalysisStorage")}save(e,n){let s=u.getDb(e),o=f();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(o);let i=s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(n.commitHash??null,"active",JSON.stringify(n),n.analyzedAt);b(s,String(i.lastInsertRowid),n)})()}getActiveRelational(e){let n=u.get(e,"SELECT id FROM llm_analysis WHERE status = 'active' LIMIT 1");if(!n)return null;let s=String(n.id),o=u.query(e,"SELECT kind, title, detail FROM analysis_finding WHERE analysis_id = ? ORDER BY kind, sort_order",s),i=u.query(e,"SELECT rule FROM analysis_convention WHERE analysis_id = ? ORDER BY sort_order",s).map(d=>d.rule),l=u.query(e,"SELECT kind, name FROM analysis_stack_item WHERE analysis_id = ?",s),g=u.query(e,"SELECT name FROM analysis_domain WHERE analysis_id = ?",s).map(d=>d.name),r=u.query(e,"SELECT name, command FROM analysis_command WHERE analysis_id = ?",s);return o.length===0&&i.length===0&&l.length===0?null:{findings:o,conventions:i,stack:l,domains:g,commands:r}}getActive(e){let n=u.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return n?JSON.parse(n.analysis):null}getActiveSummary(e){let n=this.getActive(e);return n?{commitHash:n.commitHash,architectureStyle:n.architecture.style,patternCount:n.patterns.length,antiPatternCount:n.antiPatterns.length,analyzedAt:n.analyzedAt}:null}isCurrent(e,n){return n?u.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===n:!1}getAllFull(e){return u.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(s=>({id:s.id,status:s.status,commitHash:s.commit_hash,analyzedAt:s.analyzed_at,supersededAt:s.superseded_at,analysis:JSON.parse(s.analysis)}))}getHistory(e,n=10){return u.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",n).map(o=>{let i=JSON.parse(o.analysis);return{id:o.id,commitHash:o.commit_hash,status:o.status,analyzedAt:o.analyzed_at,patternCount:i.patterns.length}})}},C=new h,B=C;P();var R=["zod","better-sqlite3","@modelcontextprotocol/sdk","@modelcontextprotocol/client","@modelcontextprotocol/server","chalk","chokidar","commander","express","fastify","hono","react","next","vue","vitest","jest","typescript","biome","lefthook","drizzle-orm","prisma","@prisma/client"];function y(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"item"}c(y,"stableStyleKey");function _(t){return t?!!(t.architecture?.style&&t.architecture.style!=="unknown"||(t.patterns?.length??0)>0||(t.conventions?.length??0)>0||(t.antiPatterns?.length??0)>0||(t.stack?.frameworks?.length??0)>0||(t.stack?.languages?.length??0)>0):!1}c(_,"isRichLlmAnalysis");function W(t){return!_(t)}c(W,"isThinLlmAnalysis");function M(t){let e=T(t),n=w(t.commands),s=_(t.llmAnalysis)?t.llmAnalysis:null,o=z(s?.conventions?.map(r=>({key:y(r.category?`${r.category}-${r.rule}`:r.rule),rule:r.rule,category:r.category}))??[],t.memoryConventions?.map(r=>({key:y(r.category?`${r.category}-${r.rule}`:r.rule),rule:r.rule,category:r.category}))??[]),i=D(s?.patterns?.map(r=>({key:y(r.name),name:r.name,description:r.description,locations:r.locations,category:r.category}))??[],t.memoryPatterns?.map(r=>({key:y(r.name),name:r.name,description:r.description}))??[]),l=N(s?.antiPatterns?.map(r=>({key:y(r.issue),issue:r.issue,suggestion:r.suggestion,severity:r.severity}))??[],t.memoryAntiPatterns?.map(r=>({key:y(r.issue),issue:r.issue,suggestion:r.suggestion}))??[]);if(s?.stack?.languages?.length)for(let r of s.stack.languages)e.languages.includes(r)||e.languages.push(r);if(s?.stack?.frameworks?.length)for(let r of s.stack.frameworks)e.frameworks.includes(r)||e.frameworks.push(r);s?.stack?.packageManager&&!e.packageManager&&(e.packageManager=s.stack.packageManager);let g={symbols:t.structural?.symbols??0,files:t.structural?.files??t.stats.fileCount??0,packages:t.structural?.packages??[]};return{payloadVersion:1,stack:e,commands:n,conventions:o,patterns:i,antiPatterns:l,structural:g,metrics:{...t.metrics??{}}}}c(M,"buildProjectStylePayload");function J(t){let e=M(t),n=t.capturedAt??f();return{id:t.id??`style_${n.replace(/[^0-9]/g,"").slice(0,14)}_${Math.random().toString(36).slice(2,8)}`,capturedAt:n,commitHash:t.commitHash??null,source:t.source??"sync-mechanical",patternCount:e.patterns.length,antiPatternCount:e.antiPatterns.length,conventionCount:e.conventions.length,frameworkCount:e.stack.frameworks.length,symbolCount:e.structural.symbols,fileCount:e.structural.files,summary:$(e),payload:e}}c(J,"buildProjectStyleSnapshot");function $(t){let e=[t.stack.ecosystem!=="unknown"?t.stack.ecosystem:null,t.stack.languages.slice(0,2).join("+")||null,t.stack.frameworks.slice(0,3).join(", ")||null].filter(Boolean);return`${e.length>0?e.join(" \xB7 "):"stack unknown"}; ${t.patterns.length} patterns, ${t.antiPatterns.length} anti-patterns, ${t.conventions.length} conventions; ${t.structural.files} files`+(t.structural.symbols>0?`, ${t.structural.symbols} symbols`:"")}c($,"buildStyleSummary");function T(t){let e=A([...t.stack.frameworks??[],...t.stats.frameworks??[]]),n=A([...t.stats.languages??[]]),s=x(t.packageDeps??{}),o=t.packageDeps??{};for(let l of s)["Hono","Express","Fastify","React","Next.js","Vue","NestJS"].includes(l)&&!e.includes(l)&&e.push(l);let i=t.stack.hasTesting===!0||!!(o.vitest||o.jest||o.mocha||o["bun-types"]||o["@types/bun"]||s.includes("Vitest")||s.includes("Jest"))||!!(t.commands?.test&&/test/i.test(t.commands.test));return{ecosystem:t.stats.ecosystem||"unknown",languages:n,frameworks:e,packageManager:t.packageManager??void 0,keyLibraries:s,hasTests:i,hasDocker:t.stack.hasDocker===!0}}c(T,"buildStack");function w(t){return t?{test:t.test,lint:t.lint,build:t.build,dev:t.dev,install:t.install,format:t.format}:{}}c(w,"buildCommands");function x(t){let e=new Set;for(let n of R)t[n]&&e.add(O(n));return[...e].slice(0,16)}c(x,"collectKeyLibraries");function O(t){return{hono:"Hono",express:"Express",fastify:"Fastify",react:"React",next:"Next.js",vue:"Vue",vitest:"Vitest",jest:"Jest",typescript:"TypeScript",zod:"Zod","better-sqlite3":"better-sqlite3","@modelcontextprotocol/sdk":"MCP SDK","@modelcontextprotocol/client":"MCP SDK","@modelcontextprotocol/server":"MCP SDK",biome:"Biome",lefthook:"Lefthook","drizzle-orm":"Drizzle",prisma:"Prisma","@prisma/client":"Prisma"}[t]??t}c(O,"displayLibName");function z(t,e){let n=new Map;for(let s of[...t,...e])n.has(s.key)||n.set(s.key,s);return[...n.values()].slice(0,40)}c(z,"mergeConventions");function D(t,e){let n=new Map;for(let s of[...t,...e])n.has(s.key)||n.set(s.key,s);return[...n.values()].slice(0,40)}c(D,"mergePatterns");function N(t,e){let n=new Map;for(let s of[...t,...e])n.has(s.key)||n.set(s.key,s);return[...n.values()].slice(0,40)}c(N,"mergeAntiPatterns");function A(t){let e=[],n=new Set;for(let s of t){let o=s.trim();if(!o)continue;let i=o.toLowerCase();n.has(i)||(n.add(i),e.push(o))}return e}c(A,"unique");function U(t,e={}){if(!t)return null;let n=e.maxConventions??5,s=e.maxPatterns??4,o=e.maxAnti??3,i=t.payload,l=["## How this repo works (project style)",""],g=[i.stack.ecosystem!=="unknown"?i.stack.ecosystem:null,i.stack.languages.join(", ")||null,i.stack.frameworks.join(", ")||null,i.stack.keyLibraries.slice(0,6).join(", ")||null].filter(Boolean);if(g.length>0&&l.push(`**Stack:** ${g.join(" \xB7 ")}`),i.conventions.length>0){l.push("","**Conventions (match):**");for(let r of i.conventions.slice(0,n))l.push(`- ${r.rule}`)}if(i.patterns.length>0){l.push("","**Patterns (match):**");for(let r of i.patterns.slice(0,s))l.push(`- **${r.name}** \u2014 ${E(r.description,120)}`)}if(i.antiPatterns.length>0){l.push("","**Anti-patterns (avoid):**");for(let r of i.antiPatterns.slice(0,o))l.push(`- ${r.issue}${r.suggestion?` \u2192 ${E(r.suggestion,80)}`:""}`)}return i.conventions.length===0&&i.patterns.length===0&&i.antiPatterns.length===0&&l.push("","_No durable house patterns yet \u2014 open a neighbor file and match local idiom. Prefer `prjct sync` + structured analysis-save-llm JSON to enrich._"),l.push("",`_${t.summary}_`),l.join(`
9
+ `)}c(U,"formatProjectStyleDigest");function E(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}c(E,"truncate");export{B as a,_ as b,W as c,J as d,U as e};
@@ -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{r as t}from"./chunk-AKIN5WSQ.mjs";import{f as e}from"./chunk-HDSS6UB3.mjs";t();e();var m=[{name:"leader",role:"orchestrator",kind:"orchestrate"},{name:"implementer",role:"implementer",kind:"implement"},{name:"reviewer",role:"reviewer",kind:"review"}];export{m as a};
@@ -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 p}from"./chunk-DAOC3T5G.mjs";import{d as g,g as M}from"./chunk-HDHVBB6Q.mjs";import{a as o}from"./chunk-E66B27AL.mjs";M();var h=300,x=3;function v(t){let e=t?.judgment?.conflictMode;if(e==="off"||e==="advisory"||e==="strict")return e;let n=t?.persona?.packs??[];return n.includes("code-strict")?"strict":n.includes("code")?"advisory":"off"}o(v,"effectiveConflictMode");function N(t){let e={action:"none",memoryIds:[],reason:"",recovery:"",message:""};if(t.mode==="off")return e;let n=new Set(t.overriddenIds??[]),r=t.candidates.filter(c=>c.id&&!n.has(c.id));if(r.length===0)return e;let i=r.filter(c=>c.confidence==="high"),l=r.filter(c=>c.confidence==="low"),s=i[0]??l[0];if(!s)return e;let f=r.map(c=>c.id),u=t.fileLabel?` on \`${t.fileLabel}\``:"",a=`Edit may contradict [${s.type}] ${m(s.content,80)} (\`${s.id}\`)${u}`,d='To supersede: `prjct remember decision "\u2026why supersede\u2026" --tags supersedes:'+s.id+'`. To lift deny for this memory: `prjct remember feedback "override conflict '+s.id+': <why>" --tags conflict:override,memory:'+s.id+"`.";return i.length===0?{action:"warn",memoryIds:f,reason:`Low-confidence preventive signal${u}: ${m(s.content,80)}`,recovery:d,message:y(a,d,f,!1)}:t.mode==="strict"?{action:"deny",memoryIds:i.map(c=>c.id),reason:a,recovery:d,message:_(a,d,i.map(c=>c.id))}:{action:"warn",memoryIds:f,reason:a,recovery:d,message:y(a,d,f,!0)}}o(N,"decisionConflictVerdict");function y(t,e,n,r){return[r?"# prjct: CONFLICT \u2014 decision/gotcha may block this path":"# prjct: heads-up \u2014 weak preventive signal","",t,"",`Memory: ${n.map(l=>`\`${l}\``).join(", ")}`,"",e,"",r?"> Not a soft nudge. Revise the edit or supersede the decision with rationale before proceeding.":"> Apply if it still holds; proceed if not."].join(`
9
+ `)}o(y,"formatWarnMessage");function _(t,e,n){return[`\u26D4 prjct conflict deny: ${t}`,`Memories: ${n.join(", ")}`,e,"Host will block Edit|Write until override or supersede. Fail-open only on hook errors, not on intentional deny."].join(" ")}o(_,"formatDenyMessage");function E(t){let e=new Set;try{let n=Date.now()-6048e5,r=g.query(t,`SELECT t.value AS value
10
+ FROM memory_entry_tags t
11
+ JOIN memory_entries me ON me.id = t.entry_id
12
+ WHERE me.deleted_at IS NULL
13
+ AND me.created_at >= ?
14
+ AND t.key = 'memory'
15
+ AND EXISTS (
16
+ SELECT 1 FROM memory_entry_tags t2
17
+ WHERE t2.entry_id = me.id AND t2.key = 'conflict' AND t2.value = 'override'
18
+ )`,n);for(let i of r)i.value&&e.add(i.value.startsWith("mem_")?i.value:`mem_${i.value}`)}catch{}return e}o(E,"loadConflictOverrides");async function k(t,e,n,r,i){if(n==="deny")try{await p.remember(t,{type:"fact",content:`conflict-gate ${n}: ${m(i,200)}`,tags:{source:"conflict-gate",conflict_action:n,memory:r[0]??""},provenance:"extracted",projectId:e})}catch{}}o(k,"recordConflictEvent");function b(t){return t.map(e=>{let n=e.type==="gotcha"||e.type==="anti-pattern"||e.type==="decision"||e.tags?.pattern==="recurring-bug",r=(e.content?.trim().length??0)>=20;return{id:e.id,type:e.type,content:e.content,confidence:n&&r?"high":"low"}})}o(b,"candidatesFromPreventive");function j(t,e=h){return Date.now()-t>e}o(j,"budgetExceeded");function m(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}o(m,"truncate");function C(t){return t?.judgment?.weakModelMode==="on"?"on":"off"}o(C,"effectiveWeakModelMode");function W(t){return t?.judgment?.conflictMode==="off"?"off":C(t)==="on"?"strict":v(t)}o(W,"conflictModeWithWeakModel");function O(t,e){return(e==="on"||e==="off"?e:C(e))!=="on"?t:t==="none"?"standard":t==="standard"?"full":t}o(O,"qualityFloorWithWeakModel");function $(){return["# prjct: WEAK-MODEL PRODUCT MODE","Harness intensified: conflict gate \u2192 strict (unless conflictMode=off), quality ceremony elevated, lean on SQLite judgment (receipts/gotchas/decisions) over model instinct.","North star: weak-model + prjct \u2265 good-model alone on cadence + quality."].join(`
19
+ `)}o($,"weakModelBanner");function S(){return"Weak-model product mode ON \u2014 strict conflict + elevated quality; compound judgment over thrash."}o(S,"weakModelOneLiner");export{h as a,x as b,N as c,E as d,k as e,b as f,j as g,C as h,W as i,O as j,$ as k,S as l};
@@ -0,0 +1,9 @@
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 i,b as g,c,d as p,e as m,f as u,i as l}from"./chunk-J6JZ4PQA.mjs";import{o as d,p as f,r as M}from"./chunk-AKIN5WSQ.mjs";import{b as s,c as j}from"./chunk-JQE2F2RK.mjs";import{e as n,f as y}from"./chunk-BUDZL4DW.mjs";import{a as r}from"./chunk-E66B27AL.mjs";M();y();j();function v(){return process.env.PRJCT_TEST_MODE==="1"?s(".prjct-tests","kimi","mcp.json"):s(".kimi","mcp.json")}r(v,"getKimiMcpConfigPath");async function C(t=v()){let e=await c("context7",i.context7,t),o=await c("prjct",i.prjct,t);return{path:t,changed:e.changed||o.changed}}r(C,"ensureKimiMcpServer");var h=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];async function b(t={}){t.silent||console.log(`
9
+ \u{1F50C} Configuring MCP servers...`);try{await l.install();let e=t.verifyContext7===!1?null:await l.verify();t.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){t.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of h)try{let o=g(),a=await p(e.name,o),x=await c(e.name,i[e.name],o);a&&!x.changed?t.silent||console.log(e.ready):t.silent||console.log(e.added)}catch(o){t.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${n(o)}`),console.log(e.manual))}try{if((await d()).installed){let o=await m(),a=await u();t.silent||(o.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):o.changed||a.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}try{if((await f()).installed){let o=await C();t.silent||console.log(o.changed?"\u2705 prjct Kimi config updated in ~/.kimi/mcp.json":"\u2705 prjct Kimi config already ready")}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Kimi config setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}}r(b,"setupMcpServers");export{b as a};
@@ -0,0 +1,9 @@
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 y,d as D,e as Q,f as vt}from"./chunk-HDSS6UB3.mjs";import{a as Y,b as m,c as q,d as wt}from"./chunk-JQE2F2RK.mjs";import{a as W,b as Dt}from"./chunk-WUHGODSQ.mjs";import{g as K,j as u,k as R,l as P,n as C}from"./chunk-SVZHJZ5T.mjs";import{a as z,b as F,o as J}from"./chunk-CTWZQ7YI.mjs";import{a as i,c as h,d as yt,e as A}from"./chunk-E66B27AL.mjs";function Ot(e){let t=e.getFullYear(),r=(e.getMonth()+1).toString().padStart(2,"0"),n=e.getDate().toString().padStart(2,"0");return`${t}-${r}-${n}`}function X(e){return{year:e.getFullYear().toString(),month:(e.getMonth()+1).toString().padStart(2,"0"),day:e.getDate().toString().padStart(2,"0")}}function $t(){return new Date().toISOString()}function _t(e){let t=new Date;return t.setDate(t.getDate()-e),t}function Bt(e){let t=Math.floor(e/1e3),r=Math.floor(t/60),n=Math.floor(r/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${r%60}m`:r>0?`${r}m`:`${t}s`}var Ut,Z=h(()=>{"use strict";i(Ot,"formatDate");i(X,"getYearMonthDay");i($t,"getTimestamp");i(_t,"getDaysAgo");i(Bt,"formatDuration");Ut=new Intl.RelativeTimeFormat("en",{numeric:"always"})});import St from"node:fs";import w from"node:fs/promises";import l from"node:path";async function T(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},r=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of r)if(await u(l.join(e,n.file))){t.isMonorepo=!0,t.type=n.type;break}if(!t.isMonorepo){let n=l.join(e,"package.json");if(await u(n))try{JSON.parse(await w.readFile(n,"utf-8")).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await E(e,t.type)),t}async function E(e,t){let r=[];try{let n=await(async()=>{if(t==="pnpm"){let g=(await w.readFile(l.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);return g?g[1].split(`
9
+ `).map(c=>c.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean):[]}if(t==="npm"||t==="lerna"){let a=l.join(e,"package.json"),g=JSON.parse(await w.readFile(a,"utf-8")),c=Array.isArray(g.workspaces)?g.workspaces:g.workspaces?.packages??[];if(t==="lerna"){let d=l.join(e,"lerna.json");if(await u(d)){let p=JSON.parse(await w.readFile(d,"utf-8"));if(p.packages)return p.packages}}return c}if(t==="nx")return["apps/*","libs/*","packages/*"];if(t==="turborepo"){let a=JSON.parse(await w.readFile(l.join(e,"package.json"),"utf-8"));return Array.isArray(a.workspaces)?a.workspaces:[]}return[]})(),s=n.length>0?n:["packages/*","apps/*","libs/*"];for(let a of s){if(a.startsWith("!"))continue;let g=Ct(a,{cwd:e});for(let c of g){let d=l.join(e,c),p=l.join(d,"package.json");if(await u(p))try{let f=JSON.parse(await w.readFile(p,"utf-8")),j=l.join(d,"PRJCT.md");r.push({name:f.name||l.basename(c),path:d,relativePath:c,hasPrjctMd:await u(j)})}catch{}}}}catch{}return r}async function tt(e,t){if(!t.isMonorepo)return null;let r=l.resolve(e);for(let n of t.packages){let s=l.resolve(n.path);if(r.startsWith(s))return n}return null}async function N(e){let t=l.resolve(e),r=l.parse(t).root;return t===r?null:(await T(t)).isMonorepo?t:N(l.dirname(t))}var Ct,et=h(()=>{"use strict";C();Ct=St.globSync;i(T,"detectMonorepo");i(E,"discoverMonorepoPackages");i(tt,"findContainingPackage");i(N,"findMonorepoRoot")});function nt(e,t){let r=typeof e=="string"?new Date(e).getTime():e;return Date.now()-r>t}var rt,it=h(()=>{"use strict";i(nt,"isExpired");rt=class{static{i(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(t={}){this.ttl=t.ttl??5e3,this.maxSize=t.maxSize??50}isValid(t){let r=this.cache.get(t);return r?Date.now()-r.timestamp<this.ttl:!1}get(t){let r=this.cache.get(t);return r?this.isValid(t)?r.data:(this.cache.delete(t),null):null}set(t,r){this.cache.set(t,{data:r,timestamp:Date.now()}),this.evictOldEntries()}delete(t){this.cache.delete(t)}clear(){this.cache.clear()}has(t){return this.cache.has(t)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let r=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of r)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let t=[...this.cache.keys()].filter(r=>!this.isValid(r));for(let r of t)this.cache.delete(r);return t.length}}});import bt from"node:fs/promises";import kt from"node:path";async function st(){try{let e=await bt.readFile(ot(),"utf-8"),t=JSON.parse(e);return!t.timestamp||!t.detection||!t.detection.claude||!t.detection.gemini||!t.detection.codex||nt(t.timestamp,Mt)?null:t.detection}catch{return null}}async function at(e){let t={timestamp:new Date().toISOString(),detection:e};await K(ot(),t)}var ot,Mt,ct=h(()=>{"use strict";ut();it();C();ot=i(()=>kt.join(lt.getCachePath(),"providers.json"),"cacheFile"),Mt=600*1e3;i(st,"readProviderCache");i(at,"writeProviderCache")});import{execFileSync as G}from"node:child_process";function x(e){for(let t of e.split(/\r?\n/)){let r=t.trim();if(r)return r}return null}function gt(e){if(!e||e.includes("\0"))return null;try{if(process.platform==="win32"){let t=G("where.exe",[e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0});return x(t)}try{let t=G("which",[e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return x(t)}catch{let t=G("/bin/sh",["-c",`command -v ${JSON.stringify(e)}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return x(t)}}catch{return null}}async function H(e){if(!e||e.includes("\0"))return null;try{if(process.platform==="win32"){let{stdout:t}=await F("where.exe",[e],{encoding:"utf-8",windowsHide:!0});return x(String(t))}try{let{stdout:t}=await F("which",[e]);return x(String(t))}catch{return gt(e)}}catch{return null}}function se(e){return gt(e)!==null}var mt=h(()=>{"use strict";J();i(x,"firstNonEmptyLine");i(gt,"whichSync");i(H,"whichAsync");i(se,"commandOnPath")});var k={};yt(k,{ClaudeProvider:()=>b,CursorProvider:()=>pt,GeminiProvider:()=>_,Providers:()=>v,detectAllProviders:()=>L,detectAntigravity:()=>Tt,detectCodex:()=>ht,detectKimi:()=>Et,detectProvider:()=>$,getActiveProvider:()=>Ft,getProviderBranding:()=>Rt,selectProvider:()=>Nt,validateCliVersion:()=>ft});import O from"node:path";async function U(e){let t=await H(e);return t||(process.platform==="win32"?H(`${e}.cmd`):null)}async function At(e){try{let{stdout:t}=await z(`${e} --version`,{timeout:2e3}),r=t.match(/\d+\.\d+\.\d+/);return r?r[0]:t.trim()}catch{return null}}async function $(e){let t=v[e];if(!t.cliCommand)return{installed:!1};let r=await U(t.cliCommand);if(!r)return{installed:!1};let n=await At(t.cliCommand),s=ft(e,n||void 0);return{installed:!0,version:n||void 0,path:r,versionWarning:s||void 0}}function ft(e,t){let r=v[e];return!r.minCliVersion||!t?null:Q(t,r.minCliVersion)<0?`\u26A0\uFE0F ${r.displayName} v${t} is below minimum v${r.minCliVersion}. Some features may not work correctly.`:null}async function L(e=!1){if(!e){let g=await st();if(g)return g}let[t,r,n]=await Promise.all([$("claude"),$("gemini"),ht()]),s={installed:n.installed},a={claude:t,gemini:r,codex:s};return await at(a).catch(()=>{}),a}async function Ft(e){if(e&&v[e])return v[e];let t=await L(),r=[t.claude.installed?"claude":null,t.gemini.installed?"gemini":null,t.codex.installed?"codex":null].filter(Boolean);return r.length===1?v[r[0]]:t.claude.installed?b:t.gemini.installed?_:t.codex.installed?B:b}function Rt(e){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",codex:"\u26A1 prjct + Codex"}[e]||"\u26A1 prjct"}}async function Tt(){let e=dt.configDir;if(!e)return{installed:!1,skillInstalled:!1};let t=O.join(e,"skills","prjct","SKILL.md"),[r,n]=await Promise.all([u(e),u(t)]);return{installed:r,skillInstalled:n,configPath:r?e:void 0}}async function ht(){let e=B.configDir;if(!e)return{installed:!1,skillInstalled:!1};let t=await U("codex"),r=O.join(e,"skills","prjct","SKILL.md"),n=await u(r),s=!!t||await u(O.join(e,"auth.json"));return{installed:s,skillInstalled:n,configPath:s?e:void 0}}async function Et(){let e=m(".kimi"),[t,r]=await Promise.all([U("kimi"),u(e)]),n=!!t||r;return{installed:n,configPath:n?e:void 0}}async function Nt(){let e=await L();return{provider:e.claude.installed?"claude":e.gemini.installed?"gemini":e.codex.installed?"codex":"claude",detection:e}}var b,_,dt,pt,B,v,M=h(()=>{"use strict";wt();vt();J();C();ct();mt();q();b={name:"claude",displayName:"Claude Code",cliCommand:"claude",get configDir(){return m(".claude")},contextFile:"CLAUDE.md",get skillsDir(){return m(".claude","skills")},commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:"1.0.0"},_={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",get configDir(){return m(".gemini")},contextFile:"GEMINI.md",get skillsDir(){return m(".gemini","skills")},commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:"1.0.0"},dt={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,get configDir(){return m(".gemini","antigravity")},contextFile:"ANTIGRAVITY.md",get skillsDir(){return m(".gemini","antigravity","global_skills")},commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},pt={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},B={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",get configDir(){return m(".codex")},contextFile:"AGENTS.md",get skillsDir(){return m(".codex","skills")},commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},v={claude:b,gemini:_,cursor:pt,antigravity:dt,codex:B};i(U,"whichCommand");i(At,"getCliVersion");i($,"detectProvider");i(ft,"validateCliVersion");i(L,"detectAllProviders");i(Ft,"getActiveProvider");i(Rt,"getProviderBranding");i(Tt,"detectAntigravity");i(ht,"detectCodex");i(Et,"detectKimi");i(Nt,"selectProvider")});import Gt from"node:crypto";import I from"node:fs/promises";import o from"node:path";var V,Ht,lt,ut=h(()=>{Z();C();Dt();et();q();V=class{static{i(this,"PathManager")}globalBaseDir;globalConfigDir;constructor(){this.globalBaseDir=W(),this.globalConfigDir=o.join(this.globalBaseDir,"config")}get globalProjectsDir(){let t=process.env.PRJCT_PROJECTS_DIR;return t?o.resolve(t):o.join(this.globalBaseDir,"projects")}setGlobalBaseDir(t){this.globalBaseDir=o.resolve(t),this.globalConfigDir=o.join(this.globalBaseDir,"config")}generateProjectId(t){return Gt.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(t){return o.join(this.globalProjectsDir,t)}getLocalConfigPath(t){return o.join(t,".prjct","prjct.config.json")}getGlobalProjectConfigPath(t){return o.join(this.getGlobalProjectPath(t),"project.json")}getLegacyPrjctPath(t){return o.join(t,".prjct")}async hasLegacyStructure(t){return await R(this.getLegacyPrjctPath(t))}async hasConfig(t){return await u(this.getLocalConfigPath(t))}async ensureGlobalStructure(){await P(this.globalBaseDir),await P(this.globalProjectsDir),await P(this.globalConfigDir)}async ensureProjectStructure(t){await this.ensureGlobalStructure();let r=this.getGlobalProjectPath(t),n=["analysis","memory"];for(let s of n)await P(o.join(r,s));return await P(o.join(r,"sessions")),r}getSessionPath(t,r=new Date){let{year:n,month:s,day:a}=X(r);return o.join(this.getGlobalProjectPath(t),"sessions",n,s,a)}getCurrentSessionPath(t){return this.getSessionPath(t,new Date)}async ensureSessionPath(t,r=new Date){let n=this.getSessionPath(t,r);return await P(n),n}async listSessions(t,r=null,n=null){let s=o.join(this.getGlobalProjectPath(t),"sessions"),a=[];try{let g=await I.readdir(s,{withFileTypes:!0});for(let c of g){if(!c.isDirectory()||r&&c.name!==r.toString())continue;let d=o.join(s,c.name),p=await I.readdir(d,{withFileTypes:!0});for(let f of p){if(!f.isDirectory()||n&&f.name!==n.toString().padStart(2,"0"))continue;let j=o.join(d,f.name),Pt=await I.readdir(j,{withFileTypes:!0});for(let S of Pt)S.isDirectory()&&a.push({year:c.name,month:f.name,day:S.name,path:o.join(j,S.name),date:new Date(`${c.name}-${f.name}-${S.name}`)})}}return a.sort((c,d)=>d.date.getTime()-c.date.getTime()),a}catch{return[]}}async getSessionsInRange(t,r,n=new Date){return(await this.listSessions(t)).filter(a=>a.date>=r&&a.date<=n)}getFilePath(t,r,n){return o.join(this.getGlobalProjectPath(t),r,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await I.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name)}catch{return[]}}async projectExists(t){return await R(this.getGlobalProjectPath(t))}getDisplayPath(t){let r=Y();return t.startsWith(r)?t.replace(r,"~"):t}getAuthConfigPath(){return o.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(t){return o.join(this.getGlobalProjectPath(t),"sync","pending.json")}getLastSyncPath(t){return o.join(this.getGlobalProjectPath(t),"sync","last-sync.json")}getRunningStatusPath(){return o.join(this.globalBaseDir,".running")}getCachePath(){return o.join(this.globalBaseDir,"cache")}getStatePath(){return o.join(this.globalBaseDir,"state")}getStatusLinePath(){return o.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(M(),A(k)).getActiveProvider()).configDir}async getAgentSettingsPath(){let t=await(M(),A(k)).getActiveProvider();return(M(),A(k)).getGlobalSettingsPath(t.name)}getClaudeDir(){return m(".claude")}getClaudeSettingsPath(){return o.join(this.getClaudeDir(),"settings.json")}getStoragePath(t,r){return o.join(this.getGlobalProjectPath(t),"storage",r)}getContextPath(t){return o.join(this.getGlobalProjectPath(t),"context")}async detectMonorepo(t){return T(t)}async discoverMonorepoPackages(t,r){return E(t,r)}async findContainingPackage(t,r){return tt(t,r)}async findMonorepoRoot(t){return N(t)}},Ht=new V,lt=Ht});export{Ot as a,$t as b,_t as c,Bt as d,Z as e,nt as f,rt as g,it as h,H as i,se as j,mt as k,v as l,Ft as m,Rt as n,ht as o,Et as p,k as q,M as r,lt as s,ut as t};
@@ -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-AUUWQH3S.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import s from"node:crypto";var u={upsert:"updated",delete:"deleted"};function d(e){let t=e&&typeof e=="object"&&!Array.isArray(e)?JSON.stringify(y(e)):JSON.stringify(e);return s.createHash("sha256").update(t).digest("hex")}i(d,"hashPayload");function y(e){let t={};for(let n of Object.keys(e).sort())t[n]=e[n];return t}i(y,"sortKeys");var o={value:null};async function p(){if(o.value)return o.value;try{let{default:e}=await import("./auth-config-WNUARXTJ.mjs"),t=e;if(typeof t.getDeviceId=="function"){let n=await t.getDeviceId();return o.value=n,n}return"unknown-device"}catch{return"unknown-device"}}i(p,"resolveDeviceId");async function v(e){try{let t=await p(),n=d(e.data),c={type:`${e.entityType}.${u[e.eventType]}`,path:[e.entityType,e.entityId],data:e.data,timestamp:new Date().toISOString(),projectId:e.projectId,entityType:e.entityType,entityId:e.entityId,eventType:e.eventType,contentHash:n,deviceId:t,originDeviceId:e.originDeviceId??t,revisionCount:e.revisionCount??1};await r.publish(c)}catch{}}i(v,"publishCRUD");function f(e){v(e)}i(f,"publishCRUDSync");export{d as a,v as b,f as c};
@@ -0,0 +1,14 @@
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{e as r,g as S}from"./chunk-HDHVBB6Q.mjs";import{b as o,e as p,s as a,t as _}from"./chunk-AKIN5WSQ.mjs";import{f as g,g as l,n as m}from"./chunk-SVZHJZ5T.mjs";import{a as s}from"./chunk-E66B27AL.mjs";_();p();S();var c=class{static{s(this,"SyncPendingStorage")}append(n,e){let t=o(),u=JSON.stringify(e);return e.entityType&&e.entityId&&e.contentHash&&r.run(n,`DELETE FROM sync_pending
9
+ WHERE project_id = ?
10
+ AND entity_type = ?
11
+ AND entity_id = ?
12
+ AND content_hash = ?`,n,e.entityType,e.entityId,e.contentHash),r.run(n,`INSERT INTO sync_pending
13
+ (project_id, entity_type, entity_id, event_type, content_hash, payload, enqueued_at)
14
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,n,e.entityType??null,e.entityId??null,e.eventType??null,e.contentHash??null,u,t),{id:r.get(n,"SELECT last_insert_rowid() AS id")?.id??0,event:e,enqueuedAt:t}}list(n,e){let t=e?"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC LIMIT ?":"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC";return(e?r.query(n,t,n,e):r.query(n,t,n)).map(d=>this.rowToEntry(d))}count(n){return r.get(n,"SELECT COUNT(*) AS n FROM sync_pending WHERE project_id = ?",n)?.n??0}clearUpTo(n,e){if(e<=0)return 0;let t=this.count(n);return r.run(n,"DELETE FROM sync_pending WHERE project_id = ? AND id <= ?",n,e),t-this.count(n)}clearAll(n){r.run(n,"DELETE FROM sync_pending WHERE project_id = ?",n)}clearByIds(n,e){if(e.length===0)return;let t=e.map(()=>"?").join(",");r.run(n,`DELETE FROM sync_pending WHERE project_id = ? AND id IN (${t})`,n,...e)}rowToEntry(n){let e=(()=>{try{return JSON.parse(n.payload)}catch{return{type:"unknown.corrupt",path:[],data:null,timestamp:n.enqueued_at,projectId:n.project_id}}})();return{id:n.id,event:e,enqueuedAt:n.enqueued_at}}},i=new c;p();m();var y=class{static{s(this,"SyncEventBus")}async publish(n){i.append(n.projectId,n)}async getPending(n){return i.list(n).map(e=>e.event)}async clearPending(n){i.clearAll(n)}async getPendingEntries(n){return i.list(n)}async clearPendingUpTo(n,e){return i.clearUpTo(n,e)}async clearPendingByIds(n,e){i.clearByIds(n,e)}async updateLastSync(n){let e=a.getLastSyncPath(n),t={timestamp:o(),success:!0};await l(e,t)}async getLastSync(n){let e=a.getLastSyncPath(n);return await g(e,null)}},L=new y;export{L as a};
@@ -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 O}from"./chunk-HZIORCPO.mjs";import{a as A}from"./chunk-WDGDFXSB.mjs";import{b as h}from"./chunk-NWY5M34K.mjs";import{b as I}from"./chunk-LWCHQIJ7.mjs";import{a as P,h as tt}from"./chunk-UUULLTQV.mjs";import{a as w,b,c as S}from"./chunk-3JUE6MNF.mjs";import{c as E}from"./chunk-YUOTOCKK.mjs";import{b as R}from"./chunk-BISPGBNN.mjs";import{a as x}from"./chunk-AOPJ4Z6O.mjs";import{a as m}from"./chunk-AUUWQH3S.mjs";import{b as N}from"./chunk-MEQS4VPO.mjs";import{a as T,b as j,e as p,g as _}from"./chunk-HDHVBB6Q.mjs";import{b as D,e as Z}from"./chunk-AKIN5WSQ.mjs";import{a as d}from"./chunk-E66B27AL.mjs";_();function g(e,t,n){return e[t]??e[n]??""}d(g,"str");var L={async upsert(e,t){let n=g(t,"id","id"),r=g(t,"entity_type","entityType"),s=g(t,"entity_id","entityId");if(!n||!r||!s||p.get(e,"SELECT id FROM archives WHERE entity_type = ? AND entity_id = ? LIMIT 1",r,s))return;let c=typeof t.entity_data=="string"?t.entity_data:t.entity_data!=null?JSON.stringify(t.entity_data):"{}",o=g(t,"archived_at","archivedAt")||g(t,"created_at","createdAt")||new Date().toISOString(),a=t.summary??null,u=g(t,"reason","reason")||"sync";try{p.run(e,`INSERT OR IGNORE INTO archives
9
+ (id, entity_type, entity_id, entity_data, summary, archived_at, reason)
10
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,n,r,s,c,a,o,u)}catch{}},async delete(e,t){}};_();var C={async upsert(e,t){let n=t.name||"";if(!n)return;let r=t.description??null,s=et(t.metadata),i=new Date().toISOString(),c=p.get(e,"SELECT id, is_builtin FROM custom_workflows WHERE name = ?",n);if(c){if(c.is_builtin===1)return;p.run(e,"UPDATE custom_workflows SET description = ?, metadata = ?, updated_at = ? WHERE name = ? AND is_builtin = 0",r,s,i,n);return}p.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
11
+ VALUES (?, ?, ?, ?, 0, 0, ?)`,n,r,t.created_at||i,i,s)},async delete(e,t){}};function et(e){if(e==null)return null;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return null}}d(et,"serializeMetadata");var M={async upsert(e,t){let n=t.id||"";if(!n)return;let r=t.title||t.text||"";if(!r.trim())return;let s=t.priority||"medium",i=t.status||"active";await O.upsertIdea(e,{id:n,text:r,priority:s,status:i==="archived"?"archived":"pending",addedAt:t.created_at??t.addedAt??new Date().toISOString()})},async delete(e,t){}};j();tt();_();function nt(e){if(!e)return{};if(typeof e=="string")try{return JSON.parse(e)}catch{return{}}return typeof e=="object"?e:{}}d(nt,"asTags");function f(e,t,n){return e[t]??e[n]??""}d(f,"field");var W={async upsert(e,t){let n=f(t,"content","content"),r=f(t,"type","type");if(!n||!r)return;let s=nt(t.tags),i=f(t,"provenance","provenance")||"declared",c=t.source??null,o=T(n);if(p.get(e,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",o,r))return;let u=t.created_at||t.createdAt||new Date().toISOString();p.appendEvent(e,`memory.${P}${r}`,{content:n,tags:s,source:c,provenance:i,content_hash:o,project_id:e,created_at:u})},async delete(e,t){let n=f(t,"id","id"),r=f(t,"content","content"),s=f(t,"type","type"),i=[];if(/^mem_\d+$/.test(n)&&i.push(n),r&&s){let o=T(r),a=p.query(e,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL",o,s);i.push(...a.map(u=>u.id))}let c=[...new Set(i)];for(let o of c){let a=o.match(/^mem_(\d+)$/)?.[1];a&&p.run(e,"UPDATE events SET type = ? WHERE id = ?","memory.deleted.context-quality",Number(a)),p.run(e,"UPDATE memory_entries SET deleted_at = ? WHERE id = ?",Date.now(),o),p.run(e,"DELETE FROM memory_embeddings WHERE memory_id = ?",o)}}};var F={async upsert(e,t){let n=t.description||"";if(!n.trim())return;let r=t.id||"";if(!r){await h.addTask(e,{description:n,priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"});return}await h.upsertTask(e,{id:r,description:n,...t.priority?{priority:t.priority}:{},...t.type?{type:t.type}:{},...t.section?{section:t.section}:{}})},async delete(e,t){}};var k={async upsert(e,t){await A.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""},t.created_at||t.shippedAt||t.shipped_at)},async delete(e,t){}};var U={async upsert(e,t){let n=t.id||"";n&&I.applyRemote(e,{id:n,title:t.title,status:t.status,content:t.content??{},tags:t.tags,created_at:t.created_at,updated_at:t.updated_at})},async delete(e,t){}};var $={async upsert(e,t){let n=t.id||"";if(!n)return;let r=t.status||"";if(r==="completed"||r==="shipped"){await R.update(e,s=>s.currentTask?.id===n?{...s,currentTask:null}:s);return}if(r==="active"||t.started_at||t.startedAt){await R.update(e,s=>({...s,currentTask:{id:n,description:t.description,startedAt:t.started_at||t.startedAt||new Date().toISOString(),sessionId:t.session_id||t.sessionId||""}}));return}(t.description||"").trim()&&await h.upsertTask(e,{id:n,description:t.description,...t.priority?{priority:t.priority}:{},...t.type?{type:t.type}:{}})},async delete(e,t){}};_();var q={async upsert(e,t){let n=Number(t.id);if(!Number.isSafeInteger(n)||n<=0)return;let r=-n;p.transaction(e,s=>{s.prepare(`INSERT INTO workflow_rules
12
+ (id, type, command, position, action, description, enabled, timeout_ms,
13
+ created_at, sort_order, when_expr, parallel, trust_source)
14
+ VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, 'imported')
15
+ ON CONFLICT(id) DO UPDATE SET
16
+ type = excluded.type,
17
+ command = excluded.command,
18
+ position = excluded.position,
19
+ action = excluded.action,
20
+ description = excluded.description,
21
+ enabled = 0,
22
+ timeout_ms = excluded.timeout_ms,
23
+ sort_order = excluded.sort_order,
24
+ when_expr = excluded.when_expr,
25
+ parallel = excluded.parallel,
26
+ trust_source = 'imported'`).run(r,t.type||"step",t.command||"",t.position||"",t.action||"",t.description??null,typeof t.timeout_ms=="number"?t.timeout_ms:0,t.created_at||new Date().toISOString(),typeof t.sort_order=="number"?t.sort_order:0,t.when_expr??null,t.parallel===0?0:1),s.prepare("DELETE FROM workflow_rules WHERE id = ? AND trust_source = 'imported'").run(n)})},async delete(e,t){}};var v={memories:W,tasks:$,ideas:M,queue_tasks:F,shipped_items:k,shipped_features:k,custom_workflows:C,workflow_rules:q,specs:U,archives:L},Ut=Object.keys(v),Y=new Set(["roadmap_features","projects","sessions","agents","subtasks","metrics_daily","work_cost_snapshots","velocity_sprints","analysis"]);_();Z();function z(e,t,n){if(!t||!n)return null;try{return p.get(e,"SELECT content_hash, applied_at FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",t,n)?.content_hash??null}catch{return null}}d(z,"getApplied");function B(e,t,n,r,s){if(!(!t||!n||!r))try{p.run(e,`INSERT INTO sync_applied_hashes (entity_type, entity_id, content_hash, applied_at, created_at)
27
+ VALUES (?, ?, ?, ?, ?)
28
+ ON CONFLICT(entity_type, entity_id) DO UPDATE SET
29
+ content_hash = excluded.content_hash,
30
+ applied_at = excluded.applied_at,
31
+ created_at = COALESCE(excluded.created_at, sync_applied_hashes.created_at)`,t,n,r,D(),s??null)}catch{}}d(B,"recordApplied");function V(e,t,n){if(!(!t||!n))try{p.run(e,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",t,n)}catch{}}d(V,"clearApplied");var G=new Set;function rt(e){if(G.has(e))return;G.add(e);let n=Y.has(e)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${e}' (${n}). code=no_local_handler`)}d(rt,"warnNoLocalHandler");var J=new Set;function st(e){J.has(e)||(J.add(e),console.warn(`[sync] inbound '${e}' event has no created_at \u2014 origin chronology cannot be preserved. The producer should include created_at in its payload. code=missing_origin_created_at`))}d(st,"warnMissingCreatedAt");function it(e){let t=e.data??{},n=e.content_hash??e.contentHash;if(e.entity_type){let c=(e.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:e.entity_type,eventType:c,data:t,contentHash:n}}if(e.entityType){let c=e.eventType||"upsert";return{entityType:e.entityType,eventType:c==="delete"?"delete":"upsert",data:t,contentHash:n}}let[r,s]=(e.type||"").split("."),i=s==="deleted"||s==="archived"||s==="removed";return{entityType:w(r)||r||"unknown",eventType:i?"delete":"upsert",data:t,contentHash:n}}d(it,"normalizeEventShape");function K(e){return e instanceof Error?e.message:e&&typeof e=="object"&&"message"in e?String(e.message):"Unknown error"}d(K,"errorMessage");function X(e){if(e&&typeof e=="object"&&"code"in e)return e.code}d(X,"errorCode");var H=class{static{d(this,"SyncManager")}async hasAuth(){return await E.hasAuth()}async getStatus(t){if(!await this.hasAuth())return null;try{return await S.getStatus(t)}catch{return null}}async sync(t,n){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1};try{await A.republishShips(t)}catch{}let s=await this.push(t,n);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let i=await this.pull(t);return i.success&&!i.skipped&&(r.pulled={count:i.count||0,syncedAt:i.syncedAt||new Date().toISOString()}),(!s.success||!i.success)&&(r.success=!1,r.error=s.error||i.error,r.code=s.code||i.code),r}async push(t,n){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await m.getPending(t),s=n?.include?r.filter(a=>{let u=w(a.entityType)??w(a.type?.split(".")[0]);return u?b(u,n.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let i=await this.createProjectLinkEvent(t),c=i?[i,...s]:s,o=await S.pushEvents(t,c);if(o.success)return await m.clearPending(t),await m.updateLastSync(t),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let a=o.processed,u=o.errors.length,l=o.errors.map(y=>y.error).join(", ");return{success:!1,skipped:!1,count:a,syncedAt:o.syncedAt,error:`${u} events failed: ${l}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:K(r),code:X(r)}}}async pull(t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:n}=await import("./sync-cursor-storage-2VKG757H.mjs"),r=await E.read(),s=r.deviceId??null,i=r.userId??null,o=(s?n.get(t,i,s):null)?.lastEventId??0,a=await S.pullEvents(t,o);if(a.events.length===0)return await m.updateLastSync(t),{success:!0,skipped:!1,count:0,applied:0,syncedAt:a.syncedAt};let u=await this.applyPulledEvents(t,a.events),l=a.events.flatMap(y=>[y.event_id,y.eventId]).filter(y=>typeof y=="number").reduce((y,Q)=>Math.max(y,Q),o);return s&&l>o&&n.advance(t,l,{userId:i,deviceId:s}),await m.updateLastSync(t),{success:!0,skipped:!1,count:a.events.length,applied:u,syncedAt:a.syncedAt}}catch(n){return{success:!1,skipped:!1,reason:"error",error:K(n),code:X(n)}}}async applyPulledEvents(t,n){let r=[];for(let s of n)try{await this.applyEvent(t,s),r.push(s)}catch(i){let c=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${c}:`,i)}return r.length}async applyRealtimeEvent(t,n){try{let r=await E.read(),s=r.deviceId??null,i=n.origin_device_id??n.originDeviceId;if(s&&i&&i===s)return!1;await this.applyEvent(t,n);let c=typeof n.event_id=="number"?n.event_id:typeof n.eventId=="number"?n.eventId:null;if(c!==null){let{syncCursorStorage:o}=await import("./sync-cursor-storage-2VKG757H.mjs"),a=r.userId??null,u=r.deviceId??null;if(u){let l=o.get(t,a,u);(!l||c>l.lastEventId)&&o.advance(t,c,{userId:a,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(t,n){let{entityType:r,eventType:s,data:i,contentHash:c}=it(n),o=i.id??"",a=v[r];if(!a){rt(r);return}if(s==="delete"){await a.delete(t,i),o&&V(t,r,o);return}if(!(c&&this.alreadyApplied(t,r,o,c))&&(await a.upsert(t,i),o)){let u=i.created_at??i.createdAt??null;u||st(r);let l=c??x(i);B(t,r,o,l,u)}}alreadyApplied(t,n,r,s){if(!r)return!1;let i=z(t,n,r);return i!==null&&i===s}async createProjectLinkEvent(t){try{let n=await N(t).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:t,cli_project_id:t,meta:n},timestamp:new Date().toISOString(),projectId:t}}catch{return null}}},ot=new H,ee=ot;export{ee as a};
@@ -0,0 +1,35 @@
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 W,b as R}from"./chunk-LT5WSSQO.mjs";import{a as I}from"./chunk-HJ4HEI45.mjs";import{a as _,c as B}from"./chunk-3LG3ACQV.mjs";import{d as x,e as b,g as E}from"./chunk-HDHVBB6Q.mjs";import{b as d,e as g}from"./chunk-AKIN5WSQ.mjs";import{a as u}from"./chunk-E66B27AL.mjs";g();var f={idle:{transitions:["task"],prompt:"prjct work <intent> Start working",description:"No active work cycle"},working:{transitions:["done","pause"],prompt:"prjct status done Complete work | prjct status paused Switch context",description:"Work in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct work <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct work <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct work <intent> Start new work cycle",description:"Feature shipped"}},h=class{static{u(this,"WorkflowStateMachine")}getCurrentState(t,s){if(s){let a=(t?.activeTasks??[]).find(n=>n.workspaceId===s);return a?this.statusToState(a):"idle"}let e=t?.currentTask;return e?this.statusToState(e):(t?.pausedTasks?.length||0)>0||t?.previousTask?.status==="paused"?"paused":"idle"}statusToState(t){switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return"working"}}canTransition(t,s){if(f[t].transitions.includes(s))return{valid:!0};let a=this.formatNextSteps(t).join(" | ");return{valid:!1,error:`Cannot transition to '${s}' from '${t}' state`,suggestion:`Valid next steps: ${a}`}}getNextState(t,s){switch(s){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return t}}getStateInfo(t){return f[t]}getPrompt(t){return f[t].prompt}getValidCommands(t){return f[t].transitions}formatNextSteps(t){return f[t].transitions.map(e=>{switch(e){case"task":return"prjct work <intent> Start new work cycle";case"done":return"prjct status done Complete current work";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${e}`}})}},S=new h;E();g();async function H(r,t,s){let e={pausedCount:0};if(await r.update(t,n=>{if(!n.currentTask)return n;r.validateTransition(n,"pause"),e.pausedTask={...n.currentTask,status:"paused",pausedAt:d(),pauseReason:s};let i=[e.pausedTask,...r.getPausedTasksFromState(n)].slice(0,r.maxPausedTasks);return e.pausedCount=i.length,{...n,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:d()}}),!e.pausedTask)return null;let a=e.pausedTask;return await r.publish(t,"task.paused",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:s,pausedCount:e.pausedCount}),a}u(H,"pauseTask");async function O(r,t,s){let e={remainingPaused:0};if(await r.update(t,n=>{let i=r.getPausedTasksFromState(n);if(i.length===0)return n;r.validateTransition(n,"resume");let o=s?i.findIndex(A=>A.id===s):0;if(o===-1)return n;let c=i[o],k=i.filter((A,lt)=>lt!==o),{status:l,pausedAt:T,pauseReason:p,...m}=c;return e.currentTask={...m,startedAt:d(),sessionId:c.sessionId??_()},e.remainingPaused=k.length,{...n,currentTask:e.currentTask,previousTask:null,pausedTasks:k,lastUpdated:d()}}),!e.currentTask)return null;let a=e.currentTask;return await r.publish(t,"task.resumed",{taskId:a.id,description:a.description,resumedAt:a.startedAt,remainingPaused:e.remainingPaused}),a}u(O,"resumeTask");async function D(r,t){let s=await r.read(t),e=r.getPausedTasksFromState(s),a=Date.now()-r.stalenessThresholdDays*24*60*60*1e3;return e.filter(n=>new Date(n.pausedAt).getTime()<a)}u(D,"getStalePausedTasks");async function F(r,t){let s=Date.now()-r.stalenessThresholdDays*24*60*60*1e3,e=[];await r.update(t,n=>{let i=r.getPausedTasksFromState(n),o=i.filter(k=>new Date(k.pausedAt).getTime()<s);if(e.push(o),o.length===0)return n;let c=i.filter(k=>new Date(k.pausedAt).getTime()>=s);return{...n,pausedTasks:c,previousTask:null,lastUpdated:d()}});let a=e[0]??[];if(a.length===0)return[];B.archiveMany(t,a.map(n=>({entityType:"paused_task",entityId:n.id,entityData:n,summary:n.description,reason:"staleness"})));for(let n of a)await r.publish(t,"task.archived",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:"staleness"});return a}u(F,"archiveStalePausedTasks");g();E();var mt=20;function Tt(r){let t=(()=>{if(!r.data)return{};try{return JSON.parse(r.data)}catch{return{}}})(),s={taskId:r.id,title:t.title??r.description,classification:r.type??"improvement",startedAt:r.started_at,completedAt:r.completed_at,subtaskCount:t.subtaskCount??0,subtaskSummaries:t.subtaskSummaries??[],outcome:t.outcome??"Task completed",branchName:r.branch??"unknown"};return r.linear_id!=null&&(s.linearId=r.linear_id),t.linearUuid!=null&&(s.linearUuid=t.linearUuid),r.pr_url!=null&&(s.prUrl=r.pr_url),t.feedback&&(s.feedback=t.feedback),t.harness&&(s.harness=t.harness),r.tokens_in&&(s.tokensIn=r.tokens_in),r.tokens_out&&(s.tokensOut=r.tokens_out),s}u(Tt,"rowToHistoryEntry");function w(r,t="",...s){try{return x.query(r,`SELECT id, description, type, branch, linear_id, pr_url, started_at, completed_at, tokens_in, tokens_out, data
9
+ FROM tasks
10
+ WHERE status = 'completed' AND completed_at IS NOT NULL ${t}
11
+ ORDER BY completed_at DESC, rowid DESC LIMIT ${mt}`,...s).map(Tt)}catch{return[]}}u(w,"queryHistory");async function N(r,t){await r.update(t,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:d()}))}u(N,"clearTask");async function U(r,t){let s=await r.read(t),e=r.getPausedTasksFromState(s);return s.currentTask!==null||e.length>0}u(U,"hasTask");async function J(r,t){let s=await r.read(t);return r.getPausedTasksFromState(s)[0]||null}u(J,"getPausedTask");async function L(r,t){let s=await r.read(t);return r.getPausedTasksFromState(s)}u(L,"getAllPausedTasks");async function P(r,t){return w(t)}u(P,"getTaskHistory");async function q(r,t){return w(t)[0]||null}u(q,"getMostRecentTask");async function M(r,t,s){return w(t,"AND type = ?",s)}u(M,"getTaskHistoryByType");async function $(r,t){let e=(await P(r,t)).filter(p=>p.feedback),a=[],n=[],i=[],o=[];for(let p of e){let m=p.feedback;Array.isArray(m.stackConfirmed)&&a.push(...m.stackConfirmed),Array.isArray(m.patternsDiscovered)&&n.push(...m.patternsDiscovered),Array.isArray(m.agentAccuracy)&&i.push(...m.agentAccuracy),Array.isArray(m.issuesEncountered)&&o.push(...m.issuesEncountered)}let c=[...new Set(a)],k=[...new Set(n)],l=new Map;for(let p of o)l.set(p,(l.get(p)||0)+1);let T=[...l.entries()].filter(([p,m])=>m>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:k,agentAccuracy:i,issuesEncountered:[...new Set(o)],knownGotchas:T}}u($,"getAggregatedFeedback");g();var ft=u(r=>r.filter(t=>t.status==="completed").length,"countCompleted"),j=u(r=>r.filter(t=>t.status==="completed"||t.status==="failed"||t.status==="skipped").length,"countResolved");async function y(r,t,s,e){let a={};return await r.update(t,n=>{if(!n.currentTask?.subtasks)return n;let i=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[i];if(!o)return n;let c=[...n.currentTask.subtasks];c[i]=s(o);let k=i+1,l=c.length;k<l&&(c[k]={...c[k],status:"in_progress",startedAt:d()});let T=k<l?c[k]:null,p=e?Q(e(c),l):void 0;return a.value={taskId:n.currentTask.id,current:c[i],next:T,...p?{progress:p}:{}},{...n,currentTask:{...n.currentTask,subtasks:c,currentSubtaskIndex:k<l?k:i,...p?{subtaskProgress:p}:{}},lastUpdated:d()}}),a.value??null}u(y,"mutateCurrentSubtask");function Q(r,t){return{completed:r,total:t,percentage:t>0?Math.round(r/t*100):0}}u(Q,"progressFrom");async function V(r,t,s){let e=await r.update(t,i=>{if(!i.currentTask)return i;let o=s.map((c,k)=>({...c,status:k===0?"in_progress":"pending",startedAt:k===0?d():void 0,dependsOn:c.dependsOn||[]}));return{...i,currentTask:{...i.currentTask,subtasks:o,currentSubtaskIndex:0,subtaskProgress:Q(0,o.length)},lastUpdated:d()}}),a=e.currentTask?.id??null,n=e.currentTask?.subtasks??[];a&&await r.publish(t,"subtasks.created",{taskId:a,subtaskCount:n.length,subtasks:n.map(i=>({id:i.id,description:i.description,domain:i.domain}))})}u(V,"createSubtasks");async function G(r,t,s){let e=W.safeParse(s);if(!e.success){let o=e.error.issues.map(c=>`${c.path.join(".")}: ${c.message}`);throw new Error(`Subtask completion requires handoff data:
12
+ ${o.join(`
13
+ `)}`)}let{output:a,summary:n}=e.data,i=await y(r,t,o=>({...o,status:"completed",completedAt:d(),output:a,summary:n}),ft);return i?(await r.publish(t,"subtask.completed",{taskId:i.taskId,subtaskId:i.current.id,description:i.current.description,output:a,handoff:n.outputForNextAgent,filesChanged:n.filesChanged.length,progress:i.progress}),i.next):null}u(G,"completeSubtask");async function Y(r,t){let s=await r.read(t);if(!s.currentTask?.subtasks)return null;let e=s.currentTask.currentSubtaskIndex||0;return s.currentTask.subtasks[e]||null}u(Y,"getCurrentSubtask");async function K(r,t){let s=await r.read(t);if(!s.currentTask?.subtasks)return null;let e=(s.currentTask.currentSubtaskIndex||0)+1;return s.currentTask.subtasks[e]||null}u(K,"getNextSubtask");async function v(r,t){let s=await r.read(t);if(!s.currentTask?.subtasks)return null;let e=(s.currentTask.currentSubtaskIndex||0)-1;return e<0?null:s.currentTask.subtasks[e]||null}u(v,"getPreviousSubtask");async function z(r,t){let s=await v(r,t);return s?.summary?.outputForNextAgent?{fromSubtask:s.description,outputForNextAgent:s.summary.outputForNextAgent,filesChanged:s.summary.filesChanged,whatWasDone:s.summary.whatWasDone}:null}u(z,"getPreviousHandoff");async function X(r,t){return(await r.read(t)).currentTask?.subtasks||[]}u(X,"getSubtasks");async function Z(r,t){return(await r.read(t)).currentTask?.subtaskProgress||null}u(Z,"getSubtaskProgress");async function tt(r,t){return((await r.read(t)).currentTask?.subtasks?.length||0)>0}u(tt,"hasSubtasks");async function st(r,t){let s=await r.read(t);return s.currentTask?.subtasks?s.currentTask.subtasks.every(e=>e.status==="completed"||e.status==="failed"||e.status==="skipped"):!0}u(st,"areAllSubtasksComplete");async function et(r,t,s){let e=await y(r,t,a=>({...a,status:"failed",completedAt:d(),output:`Failed: ${s}`}),j);return e?(await r.publish(t,"subtask.failed",{taskId:e.taskId,subtaskId:e.current.id,description:e.current.description,error:s}),e.next):null}u(et,"failSubtask");async function rt(r,t,s){let e=await y(r,t,a=>({...a,status:"skipped",completedAt:d(),output:`Skipped: ${s}`,skipReason:s}),j);return e?(await r.publish(t,"subtask.skipped",{taskId:e.taskId,subtaskId:e.current.id,description:e.current.description,reason:s}),e.next):null}u(rt,"skipSubtask");async function at(r,t,s){let e=await y(r,t,a=>({...a,status:"blocked",output:`Blocked: ${s}`,blockReason:s}));return e?(await r.publish(t,"subtask.blocked",{taskId:e.taskId,subtaskId:e.current.id,description:e.current.description,blocker:s}),e.next):null}u(at,"blockSubtask");g();async function nt(r,t,s,e){let a={...s,workspaceId:e,startedAt:d()};return await r.update(t,n=>{if((n.activeTasks||[]).some(i=>i.workspaceId===e))throw new Error("A task is already active in this workspace");return{...n,activeTasks:[...n.activeTasks||[],a],lastUpdated:d()}}),await r.publish(t,"task.started",{taskId:a.id,description:a.description,startedAt:a.startedAt,sessionId:a.sessionId,workspaceId:e}),a}u(nt,"startTaskInWorkspace");async function it(r,t,s){return((await r.read(t)).activeTasks||[]).find(a=>a.workspaceId===s)??null}u(it,"getCurrentTaskForWorkspace");async function ut(r,t,s,e){let n=((await r.read(t)).activeTasks||[]).find(c=>c.workspaceId===s);if(!n)return null;let i=d(),o=[];return await r.update(t,c=>(o.push((c.activeTasks||[]).find(k=>k.workspaceId===s)??n),{...c,activeTasks:(c.activeTasks||[]).filter(k=>k.workspaceId!==s),lastUpdated:i})),r.persistHistoryEntry(t,r.createTaskHistoryEntry(o.at(-1)??n,i,e)),await r.publish(t,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:i,workspaceId:s}),n}u(ut,"completeTaskInWorkspace");async function ot(r,t){return(await r.read(t)).activeTasks||[]}u(ot,"getActiveTasks");async function ct(r,t){return((await r.read(t)).activeTasks||[]).length}u(ct,"getActiveTaskCount");async function kt(r,t,s,e){let n=((await r.read(t)).activeTasks||[]).find(c=>c.workspaceId===s);if(!n)return null;let i=u(c=>{let k={...c};for(let[l,T]of Object.entries(e))T===null?delete k[l]:T!==void 0&&(k[l]=T);return k.workspaceId=s,k},"merge"),o=[];return await r.update(t,c=>({...c,activeTasks:(c.activeTasks||[]).map(k=>{if(k.workspaceId!==s)return k;let l=i(k);return o.push(l),l}),lastUpdated:d()})),o.at(-1)??n}u(kt,"updateWorkspaceTask");async function dt(r,t,s,e,a){let n=await r.read(t);if(a){if(!(n.activeTasks||[]).some(c=>c.workspaceId===a))return null;let o=[];return await r.update(t,c=>({...c,activeTasks:(c.activeTasks||[]).map(k=>{if(k.workspaceId!==a)return k;let l=(k.tokensIn||0)+s,T=(k.tokensOut||0)+e;return o.push({tokensIn:l,tokensOut:T}),{...k,tokensIn:l,tokensOut:T}}),lastUpdated:d()})),o.at(-1)??null}if(!n.currentTask)return null;let i=[];return await r.update(t,o=>{if(!o.currentTask)return o;let c=(o.currentTask.tokensIn||0)+s,k=(o.currentTask.tokensOut||0)+e;return i.push({tokensIn:c,tokensOut:k}),{...o,currentTask:{...o.currentTask,tokensIn:c,tokensOut:k},lastUpdated:d()}}),i.at(-1)??null}u(dt,"addTokens");var C=class extends I{static{u(this,"StateStorage")}constructor(){super("state.json",R)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(t){return`state.${t}d`}validateTransition(t,s,e){let a=S.getCurrentState(t,e),n=S.canTransition(a,s);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(t){return(await this.read(t)).currentTask}async getTaskSnapshot(t){let s=await this.read(t);return{currentTask:s.currentTask,activeTasks:s.activeTasks||[]}}async bumpTurnCount(t){let s={count:0,task:null};return await this.update(t,e=>{if(!e.currentTask)return e;let a=(e.currentTask.turnCount??0)+1,n={...e.currentTask,turnCount:a};return s.count=a,s.task=n,{...e,currentTask:n}}),s}async acknowledgeTurnLimit(t,s){let e={ok:!1};return await this.update(t,a=>a.currentTask?(e.ok=!0,{...a,currentTask:{...a.currentTask,turnLimitAcknowledgedAt:s}}):a),e.ok}async getPausedTasks(t){let s=await this.read(t);return this.getPausedTasksFromState(s)}async startTask(t,s){let e={};if(await this.update(t,n=>(this.validateTransition(n,"task"),e.currentTask={...s,startedAt:d()},{...n,currentTask:e.currentTask,lastUpdated:d()})),!e.currentTask)throw new Error("Failed to start task");let a=e.currentTask;return this.mirrorTaskRow(t,a,"in_progress"),await this.publishEvent(t,"task.started",{taskId:a.id,description:a.description,startedAt:a.startedAt,sessionId:a.sessionId}),a}mirrorTaskRow(t,s,e,a={}){try{b.run(t,`INSERT INTO tasks (id, description, type, status, branch, linked_spec_id, session_id, feature_id, started_at, completed_at, paused_at, pause_reason)
14
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
15
+ ON CONFLICT(id) DO UPDATE SET
16
+ description = excluded.description,
17
+ status = excluded.status,
18
+ branch = COALESCE(excluded.branch, tasks.branch),
19
+ linked_spec_id = COALESCE(excluded.linked_spec_id, tasks.linked_spec_id),
20
+ completed_at = COALESCE(excluded.completed_at, tasks.completed_at),
21
+ paused_at = excluded.paused_at,
22
+ pause_reason = excluded.pause_reason`,s.id,s.description,s.type??null,e,s.branch??null,s.linkedSpecId??null,s.sessionId??null,s.featureId??null,s.startedAt??null,a.completedAt??null,a.pausedAt??null,a.pauseReason??null)}catch{}}mirrorHistoryEntry(t,s){try{let e=JSON.stringify({title:s.title,outcome:s.outcome,subtaskCount:s.subtaskCount,subtaskSummaries:s.subtaskSummaries,feedback:s.feedback,harness:s.harness,linearUuid:s.linearUuid});b.run(t,`INSERT INTO tasks (id, description, type, status, branch, linear_id, pr_url, started_at, completed_at, tokens_in, tokens_out, data)
23
+ VALUES (?, ?, ?, 'completed', ?, ?, ?, ?, ?, ?, ?, ?)
24
+ ON CONFLICT(id) DO UPDATE SET
25
+ description = excluded.description,
26
+ type = excluded.type,
27
+ status = 'completed',
28
+ branch = COALESCE(excluded.branch, tasks.branch),
29
+ linear_id = COALESCE(excluded.linear_id, tasks.linear_id),
30
+ started_at = COALESCE(excluded.started_at, tasks.started_at),
31
+ completed_at = excluded.completed_at,
32
+ pr_url = COALESCE(excluded.pr_url, tasks.pr_url),
33
+ tokens_in = CASE WHEN excluded.tokens_in > 0 THEN excluded.tokens_in ELSE tasks.tokens_in END,
34
+ tokens_out = CASE WHEN excluded.tokens_out > 0 THEN excluded.tokens_out ELSE tasks.tokens_out END,
35
+ data = excluded.data`,s.taskId,s.title,s.classification,s.branchName==="unknown"?null:s.branchName,s.linearId??null,s.prUrl??null,s.startedAt,s.completedAt,s.tokensIn??0,s.tokensOut??0,e)}catch{}}async updateCurrentTask(t,s){return(await this.update(t,a=>{if(!a.currentTask)return a;let n={...a.currentTask};for(let[o,c]of Object.entries(s))c===null?delete n[o]:c!==void 0&&(n[o]=c);return{...a,currentTask:n,lastUpdated:d()}})).currentTask}async completeTask(t,s){let e=d(),a={};if(await this.update(t,i=>i.currentTask?(this.validateTransition(i,"done"),a.completedTask=i.currentTask,{...i,currentTask:null,previousTask:null,lastUpdated:e}):i),!a.completedTask)return null;let n=a.completedTask;return this.mirrorTaskRow(t,n,"completed",{completedAt:e}),this.mirrorHistoryEntry(t,this.createTaskHistoryEntry(n,e,s)),await this.publishEvent(t,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:e}),n}createTaskHistoryEntry(t,s,e){let a=(t.subtasks||[]).filter(o=>o.status==="completed"&&o.summary).map(o=>o.summary),n=a.length>0?a.map(o=>o.title).join(", "):"Task completed",i={taskId:t.id,title:t.parentDescription||t.description,classification:t.type||"improvement",startedAt:t.startedAt,completedAt:s,subtaskCount:t.subtasks?.length||0,subtaskSummaries:a,outcome:n,branchName:t.branch||"unknown",linearId:t.linearId,linearUuid:t.linearUuid,prUrl:t.prUrl,harness:t.harness};return e&&(i.feedback=e),t.tokensIn&&(i.tokensIn=t.tokensIn),t.tokensOut&&(i.tokensOut=t.tokensOut),i}maxPausedTasks=5;stalenessThresholdDays=30;lifecycleBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),validateTransition:this.validateTransition.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),maxPausedTasks:this.maxPausedTasks,stalenessThresholdDays:this.stalenessThresholdDays}}async pauseTask(t,s){let e=await H(this.lifecycleBackend(),t,s);return e&&this.mirrorTaskRow(t,e,"paused",{pausedAt:e.pausedAt,pauseReason:e.pauseReason}),e}async resumeTask(t,s){let e=await O(this.lifecycleBackend(),t,s);return e&&this.mirrorTaskRow(t,e,"in_progress"),e}getPausedTasksFromState(t){return Array.isArray(t.pausedTasks)&&t.pausedTasks.length>0?t.pausedTasks:t.previousTask?[t.previousTask]:[]}async getStalePausedTasks(t){return D(this.lifecycleBackend(),t)}async archiveStalePausedTasks(t){return F(this.lifecycleBackend(),t)}queryBackend(){return{read:this.read.bind(this),update:this.update.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this)}}async clearTask(t){return N(this.queryBackend(),t)}async hasTask(t){return U(this.queryBackend(),t)}async getPausedTask(t){return J(this.queryBackend(),t)}async getAllPausedTasks(t){return L(this.queryBackend(),t)}async getTaskHistory(t){return P(this.queryBackend(),t)}async getMostRecentTask(t){return q(this.queryBackend(),t)}async getTaskHistoryByType(t,s){return M(this.queryBackend(),t,s)}async getAggregatedFeedback(t){return $(this.queryBackend(),t)}workspaceBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),createTaskHistoryEntry:this.createTaskHistoryEntry.bind(this),persistHistoryEntry:this.mirrorHistoryEntry.bind(this)}}async startTaskInWorkspace(t,s,e){let a=await this.read(t);this.validateTransition(a,"task",e);let n=await nt(this.workspaceBackend(),t,s,e);return this.mirrorTaskRow(t,n,"in_progress"),n}async getCurrentTaskForWorkspace(t,s){return it(this.workspaceBackend(),t,s)}async completeTaskInWorkspace(t,s,e){let a=await ut(this.workspaceBackend(),t,s,e);return a&&this.mirrorTaskRow(t,a,"completed",{completedAt:d()}),a}async getActiveTasks(t){return ot(this.workspaceBackend(),t)}async getActiveTaskCount(t){return ct(this.workspaceBackend(),t)}async updateWorkspaceTask(t,s,e){return kt(this.workspaceBackend(),t,s,e)}async addTokens(t,s,e,a){return dt(this.workspaceBackend(),t,s,e,a)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(t,s){return V(this.subtaskBackend(),t,s)}async completeSubtask(t,s){return G(this.subtaskBackend(),t,s)}async getCurrentSubtask(t){return Y(this.subtaskBackend(),t)}async getNextSubtask(t){return K(this.subtaskBackend(),t)}async getPreviousSubtask(t){return v(this.subtaskBackend(),t)}async getPreviousHandoff(t){return z(this.subtaskBackend(),t)}async getSubtasks(t){return X(this.subtaskBackend(),t)}async getSubtaskProgress(t){return Z(this.subtaskBackend(),t)}async hasSubtasks(t){return tt(this.subtaskBackend(),t)}async areAllSubtasksComplete(t){return st(this.subtaskBackend(),t)}async failSubtask(t,s){return et(this.subtaskBackend(),t,s)}async skipSubtask(t,s){return rt(this.subtaskBackend(),t,s)}async blockSubtask(t,s){return at(this.subtaskBackend(),t,s)}},Ut=new C;export{S as a,Ut 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 e,c}from"./chunk-E66B27AL.mjs";function t(n){return n instanceof Error&&"code"in n}function f(n){return t(n)&&n.code==="ENOENT"}function a(n){return t(n)&&(n.code==="EACCES"||n.code==="EPERM")}function d(n){let o=t(n)?n.code:void 0;return o==="EROFS"||o==="SQLITE_READONLY"?!0:/readonly|read-only/i.test(i(n))}function l(n,o,r="file"){let s=i(n);if(d(n)||a(n)){let u=t(n)&&n.code||"read-only";return`prjct can't write its ${r} at ${o} (${u}). This usually means a sandboxed or read-only environment. Re-run with write access to that path \u2014 some agents (e.g. Codex) run commands in a restricted sandbox, so approve filesystem/write access for prjct.`}return`Failed to write ${r} at ${o}: ${s}`}function i(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var E=c(()=>{"use strict";e(t,"isNodeError");e(f,"isNotFoundError");e(a,"isPermissionError");e(d,"isReadonlyError");e(l,"describeFsWriteError");e(i,"getErrorMessage")});export{f as a,a as b,d as c,l as d,i as e,E as f};
@@ -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 n,b as u,c as t}from"./chunk-E66B27AL.mjs";function r(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function i(){return r()==="bun"}function b(){if(r()==="bun")return!0;try{let{execFileSync:e}=u("node:child_process");return e("bun",["--version"],{stdio:"ignore"}),!0}catch{return!1}}var o=t(()=>{"use strict";n(r,"detectRuntime");n(i,"isBun");n(b,"isBunAvailable")});export{i as a,b,o as c};