peaks-loop 4.1.1 → 4.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1066) hide show
  1. package/.claude-plugin/marketplace.json +136 -47
  2. package/CHANGELOG.md +106 -0
  3. package/README-en.md +4 -4
  4. package/README.md +25 -4
  5. package/bin/node-floor.mjs +59 -0
  6. package/bin/peaks.js +13 -0
  7. package/config/eslint/tsconfig.lint.json +2 -1
  8. package/contracts/readonly-argv-whitelist.json +211 -0
  9. package/dist/cli/cli-helpers.d.ts +0 -1
  10. package/dist/cli/cli-helpers.js +0 -1
  11. package/dist/cli/commands/_cli-error-envelope.js +0 -3
  12. package/dist/cli/commands/adapter-commands-s2a.d.ts +0 -1
  13. package/dist/cli/commands/adapter-commands.d.ts +0 -1
  14. package/dist/cli/commands/api-diff-commands.d.ts +0 -1
  15. package/dist/cli/commands/api-diff-commands.js +0 -1
  16. package/dist/cli/commands/audit-artifact-runners.d.ts +16 -0
  17. package/dist/cli/commands/audit-artifact-runners.js +170 -0
  18. package/dist/cli/commands/audit-command-shared.d.ts +97 -0
  19. package/dist/cli/commands/audit-command-shared.js +60 -0
  20. package/dist/cli/commands/audit-commands.d.ts +7 -31
  21. package/dist/cli/commands/audit-commands.js +65 -477
  22. package/dist/cli/commands/audit-goal-runners.d.ts +17 -0
  23. package/dist/cli/commands/audit-goal-runners.js +114 -0
  24. package/dist/cli/commands/audit-red-lines-runners.d.ts +11 -0
  25. package/dist/cli/commands/audit-red-lines-runners.js +43 -0
  26. package/dist/cli/commands/audit-refusal-data.d.ts +23 -0
  27. package/dist/cli/commands/audit-refusal-data.js +69 -0
  28. package/dist/cli/commands/audit-static-runners.d.ts +13 -0
  29. package/dist/cli/commands/audit-static-runners.js +139 -0
  30. package/dist/cli/commands/autonomous-swarm-commands.js +0 -1
  31. package/dist/cli/commands/await-runners.d.ts +11 -0
  32. package/dist/cli/commands/await-runners.js +148 -0
  33. package/dist/cli/commands/bee-commands.d.ts +0 -2
  34. package/dist/cli/commands/bee-commands.js +0 -2
  35. package/dist/cli/commands/best-practice-scan-command.d.ts +0 -1
  36. package/dist/cli/commands/best-practice-scan-helpers.js +0 -1
  37. package/dist/cli/commands/changeset-commands.d.ts +0 -2
  38. package/dist/cli/commands/changeset-commands.js +0 -2
  39. package/dist/cli/commands/code-auto-compact-command.d.ts +3 -0
  40. package/dist/cli/commands/code-auto-compact-command.js +124 -0
  41. package/dist/cli/commands/code-auto-compact-envelope.d.ts +22 -0
  42. package/dist/cli/commands/code-auto-compact-envelope.js +39 -0
  43. package/dist/cli/commands/code-commands.d.ts +0 -3
  44. package/dist/cli/commands/code-commands.js +0 -3
  45. package/dist/cli/commands/code-context-audit-command.d.ts +3 -0
  46. package/dist/cli/commands/code-context-audit-command.js +68 -0
  47. package/dist/cli/commands/code-context-now-command.d.ts +3 -0
  48. package/dist/cli/commands/code-context-now-command.js +124 -0
  49. package/dist/cli/commands/code-context-now-envelope.d.ts +66 -0
  50. package/dist/cli/commands/code-context-now-envelope.js +136 -0
  51. package/dist/cli/commands/code-context-now-mapping.d.ts +27 -0
  52. package/dist/cli/commands/code-context-now-mapping.js +43 -0
  53. package/dist/cli/commands/code-emit-handoff-command.d.ts +3 -0
  54. package/dist/cli/commands/code-emit-handoff-command.js +99 -0
  55. package/dist/cli/commands/code-gate-command.d.ts +0 -1
  56. package/dist/cli/commands/code-gate-command.js +0 -1
  57. package/dist/cli/commands/code-gate-step-08-command.d.ts +3 -0
  58. package/dist/cli/commands/code-gate-step-08-command.js +139 -0
  59. package/dist/cli/commands/code-job-shape-commands-read-job-shape.d.ts +0 -1
  60. package/dist/cli/commands/code-job-shape-commands-read-job-shape.js +0 -1
  61. package/dist/cli/commands/code-job-shape-commands.d.ts +0 -2
  62. package/dist/cli/commands/code-job-shape-commands.js +0 -3
  63. package/dist/cli/commands/code-mode-gate-commands.d.ts +0 -2
  64. package/dist/cli/commands/code-mode-gate-commands.js +0 -3
  65. package/dist/cli/commands/code-mode-gate-should-pause-command.js +0 -4
  66. package/dist/cli/commands/code-mode-gate-should-pause-envelope.d.ts +0 -1
  67. package/dist/cli/commands/code-mode-gate-should-pause-envelope.js +0 -2
  68. package/dist/cli/commands/code-mode-status-command.d.ts +0 -1
  69. package/dist/cli/commands/code-mode-status-command.js +0 -1
  70. package/dist/cli/commands/code-orchestrator-can-do.d.ts +0 -1
  71. package/dist/cli/commands/code-orchestrator-can-do.js +0 -1
  72. package/dist/cli/commands/code-post-compact-detect-command.d.ts +3 -0
  73. package/dist/cli/commands/code-post-compact-detect-command.js +50 -0
  74. package/dist/cli/commands/code-run-command.js +0 -1
  75. package/dist/cli/commands/code-runtime-commands.d.ts +9 -46
  76. package/dist/cli/commands/code-runtime-commands.js +20 -687
  77. package/dist/cli/commands/code-runtime-session.d.ts +1 -0
  78. package/dist/cli/commands/code-runtime-session.js +15 -0
  79. package/dist/cli/commands/codegraph-command-runtime.d.ts +6 -0
  80. package/dist/cli/commands/codegraph-command-runtime.js +19 -7
  81. package/dist/cli/commands/codegraph-commands.js +20 -193
  82. package/dist/cli/commands/codegraph-init-command.d.ts +8 -0
  83. package/dist/cli/commands/codegraph-init-command.js +162 -0
  84. package/dist/cli/commands/codegraph-status-command.js +5 -6
  85. package/dist/cli/commands/compact-command.d.ts +6 -3
  86. package/dist/cli/commands/compact-command.js +12 -563
  87. package/dist/cli/commands/compact-dry-run-command.d.ts +3 -0
  88. package/dist/cli/commands/compact-dry-run-command.js +87 -0
  89. package/dist/cli/commands/compact-force-command.d.ts +3 -0
  90. package/dist/cli/commands/compact-force-command.js +98 -0
  91. package/dist/cli/commands/compact-harness-window-command.d.ts +3 -0
  92. package/dist/cli/commands/compact-harness-window-command.js +174 -0
  93. package/dist/cli/commands/compact-history-command.d.ts +3 -0
  94. package/dist/cli/commands/compact-history-command.js +89 -0
  95. package/dist/cli/commands/compact-read-commands.d.ts +3 -0
  96. package/dist/cli/commands/compact-read-commands.js +123 -0
  97. package/dist/cli/commands/compact-settle-command.d.ts +3 -0
  98. package/dist/cli/commands/compact-settle-command.js +130 -0
  99. package/dist/cli/commands/compact-shared.d.ts +9 -0
  100. package/dist/cli/commands/compact-shared.js +26 -0
  101. package/dist/cli/commands/container-commands.d.ts +0 -1
  102. package/dist/cli/commands/container-commands.js +0 -1
  103. package/dist/cli/commands/context-commands.d.ts +0 -1
  104. package/dist/cli/commands/context-commands.js +0 -1
  105. package/dist/cli/commands/core/doctor-command.d.ts +0 -1
  106. package/dist/cli/commands/core/doctor-command.js +0 -9
  107. package/dist/cli/commands/core/memory-command.js +0 -1
  108. package/dist/cli/commands/core/session-command.js +0 -14
  109. package/dist/cli/commands/core/skill-command.d.ts +1 -44
  110. package/dist/cli/commands/core/skill-command.js +13 -550
  111. package/dist/cli/commands/core/skill-context-verdict.d.ts +38 -0
  112. package/dist/cli/commands/core/skill-context-verdict.js +63 -0
  113. package/dist/cli/commands/core/skill-generated-config-notice.d.ts +41 -0
  114. package/dist/cli/commands/core/skill-generated-config-notice.js +75 -0
  115. package/dist/cli/commands/core/skill-heartbeat-commands.d.ts +3 -0
  116. package/dist/cli/commands/core/skill-heartbeat-commands.js +50 -0
  117. package/dist/cli/commands/core/skill-presence-commands.d.ts +3 -0
  118. package/dist/cli/commands/core/skill-presence-commands.js +123 -0
  119. package/dist/cli/commands/core/skill-presence-housekeeping-commands.d.ts +3 -0
  120. package/dist/cli/commands/core/skill-presence-housekeeping-commands.js +165 -0
  121. package/dist/cli/commands/core/skill-registry-commands.d.ts +3 -0
  122. package/dist/cli/commands/core/skill-registry-commands.js +117 -0
  123. package/dist/cli/commands/core/skill-runbook-command.d.ts +3 -0
  124. package/dist/cli/commands/core/skill-runbook-command.js +29 -0
  125. package/dist/cli/commands/core-artifact-commands.d.ts +0 -1
  126. package/dist/cli/commands/core-artifact-commands.js +0 -1
  127. package/dist/cli/commands/cron-commands-actions.d.ts +0 -1
  128. package/dist/cli/commands/cron-commands-actions.js +0 -2
  129. package/dist/cli/commands/cron-commands-schedule.d.ts +0 -3
  130. package/dist/cli/commands/cron-commands-schedule.js +0 -1
  131. package/dist/cli/commands/cron-commands.d.ts +0 -1
  132. package/dist/cli/commands/cron-commands.js +0 -2
  133. package/dist/cli/commands/cron-scheduler-commands.d.ts +0 -1
  134. package/dist/cli/commands/cron-scheduler-commands.js +0 -1
  135. package/dist/cli/commands/cron-scheduler-persist.d.ts +0 -5
  136. package/dist/cli/commands/cron-scheduler-persist.js +0 -5
  137. package/dist/cli/commands/dashboard-summary.d.ts +0 -1
  138. package/dist/cli/commands/dispatch-command-spec.d.ts +2 -0
  139. package/dist/cli/commands/dispatch-command-spec.js +62 -0
  140. package/dist/cli/commands/dispatch-commands.d.ts +0 -1
  141. package/dist/cli/commands/dispatch-commands.js +159 -802
  142. package/dist/cli/commands/dispatch-detached-branch.d.ts +3 -0
  143. package/dist/cli/commands/dispatch-detached-branch.js +58 -0
  144. package/dist/cli/commands/dispatch-envelope.d.ts +36 -0
  145. package/dist/cli/commands/dispatch-envelope.js +104 -0
  146. package/dist/cli/commands/dispatch-from-dag.js +0 -4
  147. package/dist/cli/commands/dispatch-isolation-lease.d.ts +17 -0
  148. package/dist/cli/commands/dispatch-isolation-lease.js +149 -0
  149. package/dist/cli/commands/dispatch-preflight.d.ts +7 -0
  150. package/dist/cli/commands/dispatch-preflight.js +105 -0
  151. package/dist/cli/commands/dispatch-prompt-blocks.d.ts +10 -0
  152. package/dist/cli/commands/dispatch-prompt-blocks.js +56 -0
  153. package/dist/cli/commands/dispatch-prompt-composition.d.ts +30 -0
  154. package/dist/cli/commands/dispatch-prompt-composition.js +171 -0
  155. package/dist/cli/commands/dispatch-record-write.d.ts +24 -0
  156. package/dist/cli/commands/dispatch-record-write.js +96 -0
  157. package/dist/cli/commands/dispatch-tool-call.d.ts +15 -0
  158. package/dist/cli/commands/dispatch-tool-call.js +128 -0
  159. package/dist/cli/commands/doctor/invoke-from-code.js +0 -1
  160. package/dist/cli/commands/e2e-verify.d.ts +0 -1
  161. package/dist/cli/commands/ecc-commands.d.ts +0 -1
  162. package/dist/cli/commands/evolution-command-shared.d.ts +78 -0
  163. package/dist/cli/commands/evolution-command-shared.js +107 -0
  164. package/dist/cli/commands/evolution-commands.d.ts +11 -2
  165. package/dist/cli/commands/evolution-commands.js +19 -351
  166. package/dist/cli/commands/evolution-evaluate-command.d.ts +24 -0
  167. package/dist/cli/commands/evolution-evaluate-command.js +138 -0
  168. package/dist/cli/commands/evolution-propose-command.d.ts +23 -0
  169. package/dist/cli/commands/evolution-propose-command.js +145 -0
  170. package/dist/cli/commands/evolution-status-command.d.ts +17 -0
  171. package/dist/cli/commands/evolution-status-command.js +41 -0
  172. package/dist/cli/commands/evolution-verdict-commands.d.ts +30 -0
  173. package/dist/cli/commands/evolution-verdict-commands.js +100 -0
  174. package/dist/cli/commands/feedback-commands.d.ts +0 -1
  175. package/dist/cli/commands/feedback-commands.js +0 -2
  176. package/dist/cli/commands/finalize-accumulator.d.ts +44 -0
  177. package/dist/cli/commands/finalize-accumulator.js +55 -0
  178. package/dist/cli/commands/finalize-branches.d.ts +34 -0
  179. package/dist/cli/commands/finalize-branches.js +119 -0
  180. package/dist/cli/commands/finalize-runners.d.ts +3 -0
  181. package/dist/cli/commands/finalize-runners.js +92 -0
  182. package/dist/cli/commands/finalize-selection.d.ts +65 -0
  183. package/dist/cli/commands/finalize-selection.js +35 -0
  184. package/dist/cli/commands/fixture-commands.d.ts +0 -2
  185. package/dist/cli/commands/fresh-context-commands.d.ts +0 -1
  186. package/dist/cli/commands/gate-commands-enforce.d.ts +0 -3
  187. package/dist/cli/commands/gate-commands-enforce.js +0 -4
  188. package/dist/cli/commands/gate-commands.js +26 -10
  189. package/dist/cli/commands/governance-classify-contract-commands.d.ts +0 -3
  190. package/dist/cli/commands/governance-classify-contract-commands.js +0 -4
  191. package/dist/cli/commands/heartbeat-commands-action.js +0 -6
  192. package/dist/cli/commands/heartbeat-commands-validation.d.ts +0 -2
  193. package/dist/cli/commands/heartbeat-commands-validation.js +0 -2
  194. package/dist/cli/commands/heartbeat-commands.d.ts +0 -1
  195. package/dist/cli/commands/heartbeat-commands.js +0 -1
  196. package/dist/cli/commands/hooks-commands.js +0 -11
  197. package/dist/cli/commands/ide-commands.d.ts +0 -1
  198. package/dist/cli/commands/job-add-slice-command.d.ts +0 -2
  199. package/dist/cli/commands/job-add-slice-command.js +0 -2
  200. package/dist/cli/commands/job-checkpoint-commands.d.ts +3 -0
  201. package/dist/cli/commands/job-checkpoint-commands.js +157 -0
  202. package/dist/cli/commands/job-command-shared.d.ts +109 -0
  203. package/dist/cli/commands/job-command-shared.js +72 -0
  204. package/dist/cli/commands/job-commands.d.ts +4 -64
  205. package/dist/cli/commands/job-commands.js +42 -556
  206. package/dist/cli/commands/job-cost-check-command.d.ts +3 -0
  207. package/dist/cli/commands/job-cost-check-command.js +41 -0
  208. package/dist/cli/commands/job-init-status-commands.d.ts +3 -0
  209. package/dist/cli/commands/job-init-status-commands.js +149 -0
  210. package/dist/cli/commands/job-run-commands.d.ts +3 -0
  211. package/dist/cli/commands/job-run-commands.js +97 -0
  212. package/dist/cli/commands/job-state-root.d.ts +35 -0
  213. package/dist/cli/commands/job-state-root.js +76 -0
  214. package/dist/cli/commands/lease-metrics-commands.d.ts +0 -1
  215. package/dist/cli/commands/lease-metrics-commands.js +0 -1
  216. package/dist/cli/commands/lease-stats-commands.d.ts +0 -1
  217. package/dist/cli/commands/lease-stats-commands.js +0 -1
  218. package/dist/cli/commands/log-commands.d.ts +0 -2
  219. package/dist/cli/commands/log-commands.js +0 -3
  220. package/dist/cli/commands/loop-eval-capture-index.d.ts +4 -0
  221. package/dist/cli/commands/loop-eval-capture-index.js +44 -0
  222. package/dist/cli/commands/loop-eval-commands.d.ts +8 -5
  223. package/dist/cli/commands/loop-eval-commands.js +12 -629
  224. package/dist/cli/commands/loop-eval-eval-command.d.ts +3 -0
  225. package/dist/cli/commands/loop-eval-eval-command.js +168 -0
  226. package/dist/cli/commands/loop-eval-monotonic-command.d.ts +3 -0
  227. package/dist/cli/commands/loop-eval-monotonic-command.js +90 -0
  228. package/dist/cli/commands/loop-eval-parents.d.ts +7 -0
  229. package/dist/cli/commands/loop-eval-parents.js +20 -0
  230. package/dist/cli/commands/loop-eval-run-code.d.ts +7 -0
  231. package/dist/cli/commands/loop-eval-run-code.js +40 -0
  232. package/dist/cli/commands/loop-eval-run-command.d.ts +3 -0
  233. package/dist/cli/commands/loop-eval-run-command.js +113 -0
  234. package/dist/cli/commands/loop-eval-spec-commands.d.ts +3 -0
  235. package/dist/cli/commands/loop-eval-spec-commands.js +165 -0
  236. package/dist/cli/commands/loop-eval-spec-lint-command.d.ts +3 -0
  237. package/dist/cli/commands/loop-eval-spec-lint-command.js +42 -0
  238. package/dist/cli/commands/loop-eval-workflow-commands.d.ts +3 -0
  239. package/dist/cli/commands/loop-eval-workflow-commands.js +141 -0
  240. package/dist/cli/commands/mcp-commands.d.ts +10 -0
  241. package/dist/cli/commands/mcp-commands.js +157 -0
  242. package/dist/cli/commands/memory-commands.d.ts +0 -1
  243. package/dist/cli/commands/memory-commands.js +0 -1
  244. package/dist/cli/commands/observability-commands.d.ts +0 -6
  245. package/dist/cli/commands/observability-commands.js +0 -6
  246. package/dist/cli/commands/outer-cache-commands.js +0 -2
  247. package/dist/cli/commands/playwright-commands.d.ts +0 -1
  248. package/dist/cli/commands/playwright-commands.js +0 -1
  249. package/dist/cli/commands/polyrepo-commands.d.ts +0 -1
  250. package/dist/cli/commands/prd-commands.d.ts +0 -1
  251. package/dist/cli/commands/prd-commands.js +0 -2
  252. package/dist/cli/commands/preferences-commands.js +0 -2
  253. package/dist/cli/commands/primer-command.d.ts +0 -1
  254. package/dist/cli/commands/primer-command.js +0 -1
  255. package/dist/cli/commands/project-commands.js +0 -1
  256. package/dist/cli/commands/qa-commands.d.ts +0 -1
  257. package/dist/cli/commands/qa-commands.js +0 -2
  258. package/dist/cli/commands/release-commands.js +0 -9
  259. package/dist/cli/commands/request-command-options.d.ts +49 -0
  260. package/dist/cli/commands/request-command-options.js +1 -0
  261. package/dist/cli/commands/request-commands.d.ts +3 -10
  262. package/dist/cli/commands/request-commands.js +17 -532
  263. package/dist/cli/commands/request-format-helpers.d.ts +0 -1
  264. package/dist/cli/commands/request-format-helpers.js +0 -2
  265. package/dist/cli/commands/request-init-command.d.ts +3 -0
  266. package/dist/cli/commands/request-init-command.js +100 -0
  267. package/dist/cli/commands/request-lint-command.d.ts +3 -0
  268. package/dist/cli/commands/request-lint-command.js +50 -0
  269. package/dist/cli/commands/request-list-command.d.ts +10 -0
  270. package/dist/cli/commands/request-list-command.js +53 -0
  271. package/dist/cli/commands/request-repair-status-command.d.ts +3 -0
  272. package/dist/cli/commands/request-repair-status-command.js +61 -0
  273. package/dist/cli/commands/request-show-command.d.ts +3 -0
  274. package/dist/cli/commands/request-show-command.js +56 -0
  275. package/dist/cli/commands/request-transition-command.d.ts +3 -0
  276. package/dist/cli/commands/request-transition-command.js +122 -0
  277. package/dist/cli/commands/request-transition-failures.d.ts +8 -0
  278. package/dist/cli/commands/request-transition-failures.js +90 -0
  279. package/dist/cli/commands/request-transition-hooks.d.ts +50 -0
  280. package/dist/cli/commands/request-transition-hooks.js +115 -0
  281. package/dist/cli/commands/request-transition-preflight.d.ts +10 -0
  282. package/dist/cli/commands/request-transition-preflight.js +107 -0
  283. package/dist/cli/commands/runtime-commands.d.ts +0 -1
  284. package/dist/cli/commands/sc-commands.js +0 -1
  285. package/dist/cli/commands/scan-command-shared.d.ts +96 -0
  286. package/dist/cli/commands/scan-command-shared.js +83 -0
  287. package/dist/cli/commands/scan-commands.d.ts +3 -2
  288. package/dist/cli/commands/scan-commands.js +23 -463
  289. package/dist/cli/commands/scan-inventory-commands.d.ts +3 -0
  290. package/dist/cli/commands/scan-inventory-commands.js +96 -0
  291. package/dist/cli/commands/scan-project-commands.d.ts +3 -0
  292. package/dist/cli/commands/scan-project-commands.js +65 -0
  293. package/dist/cli/commands/scan-scope-commands.d.ts +3 -0
  294. package/dist/cli/commands/scan-scope-commands.js +149 -0
  295. package/dist/cli/commands/scan-scope-helpers.d.ts +8 -0
  296. package/dist/cli/commands/scan-scope-helpers.js +54 -0
  297. package/dist/cli/commands/scan-structural-commands.d.ts +3 -0
  298. package/dist/cli/commands/scan-structural-commands.js +113 -0
  299. package/dist/cli/commands/session-24h-mode.d.ts +0 -1
  300. package/dist/cli/commands/session-24h-mode.js +0 -2
  301. package/dist/cli/commands/session-checkpoint-command.d.ts +0 -1
  302. package/dist/cli/commands/session-checkpoint-command.js +0 -1
  303. package/dist/cli/commands/session-resume-command.d.ts +0 -1
  304. package/dist/cli/commands/session-resume-command.js +0 -1
  305. package/dist/cli/commands/shadcn-commands.js +0 -2
  306. package/dist/cli/commands/share-commands.d.ts +12 -71
  307. package/dist/cli/commands/share-commands.js +47 -569
  308. package/dist/cli/commands/share-error-hints.d.ts +14 -0
  309. package/dist/cli/commands/share-error-hints.js +38 -0
  310. package/dist/cli/commands/share-identity.d.ts +13 -0
  311. package/dist/cli/commands/share-identity.js +22 -0
  312. package/dist/cli/commands/share-record-paths.d.ts +37 -0
  313. package/dist/cli/commands/share-record-paths.js +68 -0
  314. package/dist/cli/commands/share-runners.d.ts +3 -0
  315. package/dist/cli/commands/share-runners.js +158 -0
  316. package/dist/cli/commands/shared-read-runners.d.ts +3 -0
  317. package/dist/cli/commands/shared-read-runners.js +51 -0
  318. package/dist/cli/commands/skill-search-commands.d.ts +0 -2
  319. package/dist/cli/commands/slice-check-command.d.ts +3 -0
  320. package/dist/cli/commands/slice-check-command.js +54 -0
  321. package/dist/cli/commands/slice-commands.d.ts +2 -22
  322. package/dist/cli/commands/slice-commands.js +18 -519
  323. package/dist/cli/commands/slice-decompose-artifacts.d.ts +18 -0
  324. package/dist/cli/commands/slice-decompose-artifacts.js +79 -0
  325. package/dist/cli/commands/slice-decompose-command.d.ts +3 -0
  326. package/dist/cli/commands/slice-decompose-command.js +123 -0
  327. package/dist/cli/commands/slice-integrate-commands.js +0 -1
  328. package/dist/cli/commands/slice-list-commands.d.ts +3 -0
  329. package/dist/cli/commands/slice-list-commands.js +182 -0
  330. package/dist/cli/commands/slice-pick-command.d.ts +3 -0
  331. package/dist/cli/commands/slice-pick-command.js +60 -0
  332. package/dist/cli/commands/slice-plan-command.d.ts +24 -0
  333. package/dist/cli/commands/slice-plan-command.js +111 -0
  334. package/dist/cli/commands/spill-demo-command.d.ts +0 -1
  335. package/dist/cli/commands/statusline-commands.js +0 -4
  336. package/dist/cli/commands/sub-agent/detached.js +0 -2
  337. package/dist/cli/commands/sub-agent-commands.d.ts +0 -3
  338. package/dist/cli/commands/sub-agent-shared.d.ts +0 -8
  339. package/dist/cli/commands/sub-agent-shared.js +0 -5
  340. package/dist/cli/commands/sub-agent-shutdown-commands.d.ts +0 -1
  341. package/dist/cli/commands/tech-commands.d.ts +0 -4
  342. package/dist/cli/commands/tech-commands.js +0 -4
  343. package/dist/cli/commands/vendor-detect.d.ts +0 -3
  344. package/dist/cli/commands/vendor-detect.js +0 -2
  345. package/dist/cli/commands/verdict-aggregate-command.d.ts +0 -1
  346. package/dist/cli/commands/verdict-aggregate-command.js +0 -7
  347. package/dist/cli/commands/vm-commands.d.ts +0 -1
  348. package/dist/cli/commands/vm-commands.js +5 -29
  349. package/dist/cli/commands/vm-hypervisor-probe.d.ts +27 -0
  350. package/dist/cli/commands/vm-hypervisor-probe.js +78 -0
  351. package/dist/cli/commands/vm-status-command.d.ts +3 -0
  352. package/dist/cli/commands/vm-status-command.js +50 -0
  353. package/dist/cli/commands/wave-plan-commands.d.ts +0 -1
  354. package/dist/cli/commands/web-lifecycle-commands.d.ts +0 -1
  355. package/dist/cli/commands/workflow-commands.d.ts +10 -1
  356. package/dist/cli/commands/workflow-commands.js +6 -608
  357. package/dist/cli/commands/workflow-gate-commands.d.ts +3 -0
  358. package/dist/cli/commands/workflow-gate-commands.js +116 -0
  359. package/dist/cli/commands/workflow-plan-commands-actions.js +0 -2
  360. package/dist/cli/commands/workflow-plan-commands-session.js +0 -2
  361. package/dist/cli/commands/workflow-plan-commands.d.ts +0 -1
  362. package/dist/cli/commands/workflow-plan-helpers.d.ts +48 -0
  363. package/dist/cli/commands/workflow-plan-helpers.js +103 -0
  364. package/dist/cli/commands/workflow-planning-commands.d.ts +3 -0
  365. package/dist/cli/commands/workflow-planning-commands.js +56 -0
  366. package/dist/cli/commands/workflow-swarm-actions.d.ts +7 -0
  367. package/dist/cli/commands/workflow-swarm-actions.js +109 -0
  368. package/dist/cli/commands/workflow-swarm-commands.d.ts +3 -0
  369. package/dist/cli/commands/workflow-swarm-commands.js +138 -0
  370. package/dist/cli/commands/workflow-tech-actions.d.ts +10 -0
  371. package/dist/cli/commands/workflow-tech-actions.js +150 -0
  372. package/dist/cli/commands/workspace/clean-command.d.ts +0 -1
  373. package/dist/cli/commands/workspace/clean-command.js +0 -1
  374. package/dist/cli/commands/workspace/helpers.d.ts +0 -1
  375. package/dist/cli/commands/workspace/helpers.js +0 -1
  376. package/dist/cli/commands/workspace/init-actions.d.ts +10 -0
  377. package/dist/cli/commands/workspace/init-actions.js +199 -0
  378. package/dist/cli/commands/workspace/init-codegraph-stake.d.ts +10 -0
  379. package/dist/cli/commands/workspace/init-codegraph-stake.js +54 -0
  380. package/dist/cli/commands/workspace/init-command.d.ts +8 -130
  381. package/dist/cli/commands/workspace/init-command.js +59 -640
  382. package/dist/cli/commands/workspace/init-context.d.ts +58 -0
  383. package/dist/cli/commands/workspace/init-context.js +121 -0
  384. package/dist/cli/commands/workspace/init-envelope.d.ts +3 -0
  385. package/dist/cli/commands/workspace/init-envelope.js +34 -0
  386. package/dist/cli/commands/workspace/init-failures.d.ts +3 -0
  387. package/dist/cli/commands/workspace/init-failures.js +84 -0
  388. package/dist/cli/commands/workspace/init-hooks-decision.d.ts +24 -0
  389. package/dist/cli/commands/workspace/init-hooks-decision.js +189 -0
  390. package/dist/cli/commands/workspace/init-options.d.ts +102 -0
  391. package/dist/cli/commands/workspace/init-options.js +1 -0
  392. package/dist/cli/commands/workspace/migrate-command.d.ts +0 -2
  393. package/dist/cli/commands/workspace/migrate-command.js +0 -2
  394. package/dist/cli/commands/workspace/reconcile-command.d.ts +0 -2
  395. package/dist/cli/commands/workspace/reconcile-command.js +0 -3
  396. package/dist/cli/commands/workspace-commands.d.ts +0 -2
  397. package/dist/cli/commands/workspace-commands.js +0 -4
  398. package/dist/cli/commands/worktree-auth-commands.d.ts +0 -1
  399. package/dist/cli/commands/worktree-auth-commands.js +0 -1
  400. package/dist/cli/commands/worktree-auth-grant-command.d.ts +0 -1
  401. package/dist/cli/commands/worktree-auth-grant-command.js +0 -1
  402. package/dist/cli/commands/worktree-auth-manage-commands.d.ts +0 -1
  403. package/dist/cli/commands/worktree-auth-manage-commands.js +0 -1
  404. package/dist/cli/commands/worktree-lease-commands.d.ts +10 -6
  405. package/dist/cli/commands/worktree-lease-commands.js +42 -513
  406. package/dist/cli/commands/worktree-lease-gc-command.d.ts +12 -0
  407. package/dist/cli/commands/worktree-lease-gc-command.js +117 -0
  408. package/dist/cli/commands/worktree-lease-git.d.ts +22 -0
  409. package/dist/cli/commands/worktree-lease-git.js +48 -0
  410. package/dist/cli/commands/worktree-lease-list-command.d.ts +12 -0
  411. package/dist/cli/commands/worktree-lease-list-command.js +100 -0
  412. package/dist/cli/commands/worktree-lease-load.d.ts +37 -0
  413. package/dist/cli/commands/worktree-lease-load.js +28 -0
  414. package/dist/cli/commands/worktree-lease-release-command.d.ts +13 -0
  415. package/dist/cli/commands/worktree-lease-release-command.js +105 -0
  416. package/dist/cli/commands/worktree-lease-renew-command.d.ts +11 -0
  417. package/dist/cli/commands/worktree-lease-renew-command.js +99 -0
  418. package/dist/cli/commands/worktree-lease-session.d.ts +22 -0
  419. package/dist/cli/commands/worktree-lease-session.js +29 -0
  420. package/dist/cli/commands/worktree-lease-spawn-command.d.ts +11 -0
  421. package/dist/cli/commands/worktree-lease-spawn-command.js +119 -0
  422. package/dist/cli/commands/worktree-lease-status-command.d.ts +11 -0
  423. package/dist/cli/commands/worktree-lease-status-command.js +86 -0
  424. package/dist/cli/commands/worktree-lease-store.d.ts +19 -0
  425. package/dist/cli/commands/worktree-lease-store.js +24 -0
  426. package/dist/cli/program.js +5 -7
  427. package/dist/reporters/bdd-reporter.js +0 -1
  428. package/dist/services/24h-mode/auto-engage.d.ts +0 -1
  429. package/dist/services/24h-mode/auto-engage.js +0 -1
  430. package/dist/services/24h-mode/decider.d.ts +0 -3
  431. package/dist/services/24h-mode/decider.js +0 -3
  432. package/dist/services/24h-mode/index.d.ts +0 -2
  433. package/dist/services/24h-mode/index.js +0 -2
  434. package/dist/services/24h-mode/state.d.ts +0 -1
  435. package/dist/services/24h-mode/state.js +0 -1
  436. package/dist/services/24h-mode/store.d.ts +0 -1
  437. package/dist/services/24h-mode/store.js +0 -1
  438. package/dist/services/adapter/adapter-registry.js +0 -1
  439. package/dist/services/artifacts/artifact-prerequisites.d.ts +0 -5
  440. package/dist/services/artifacts/artifact-prerequisites.js +0 -19
  441. package/dist/services/artifacts/artifact-templates.d.ts +0 -1
  442. package/dist/services/artifacts/artifact-templates.js +0 -1
  443. package/dist/services/artifacts/request-artifact-service.d.ts +0 -5
  444. package/dist/services/artifacts/request-artifact-service.js +0 -12
  445. package/dist/services/artifacts/request-artifact-state-helpers.d.ts +0 -1
  446. package/dist/services/artifacts/request-artifact-state-helpers.js +0 -1
  447. package/dist/services/audit/artifact-writer.d.ts +0 -1
  448. package/dist/services/audit/artifact-writer.js +0 -1
  449. package/dist/services/audit/decision-writer.js +3 -1
  450. package/dist/services/audit/enforcer-liveness.js +0 -1
  451. package/dist/services/audit/enforcers/active-skill-resolver.d.ts +0 -2
  452. package/dist/services/audit/enforcers/active-skill-resolver.js +0 -2
  453. package/dist/services/audit/red-line-audit-input.d.ts +11 -0
  454. package/dist/services/audit/red-line-audit-input.js +103 -0
  455. package/dist/services/audit/red-line-catalog-p2-a-bee-runtime.d.ts +0 -1
  456. package/dist/services/audit/red-line-catalog-p2-a.js +0 -9
  457. package/dist/services/audit/types.d.ts +0 -2
  458. package/dist/services/audit/types.js +0 -2
  459. package/dist/services/audit-independent/perf-audit-service.d.ts +0 -2
  460. package/dist/services/audit-independent/security-audit-service.d.ts +0 -5
  461. package/dist/services/audit-independent/security-audit-service.js +0 -2
  462. package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +0 -5
  463. package/dist/services/autonomous-swarm/autonomous-swarm-service.js +0 -5
  464. package/dist/services/best-practice/language-detector.js +0 -1
  465. package/dist/services/best-practice/output-formatter.d.ts +0 -1
  466. package/dist/services/best-practice/scan-orchestrator.d.ts +0 -1
  467. package/dist/services/capability-audit-service/types.d.ts +1 -3
  468. package/dist/services/capability-guard-runner/contracts/J08.js +2 -2
  469. package/dist/services/changeset/changeset-check-service.d.ts +0 -3
  470. package/dist/services/changeset/changeset-check-service.js +0 -3
  471. package/dist/services/classify/classify-service.d.ts +0 -1
  472. package/dist/services/classify/classify-service.js +0 -1
  473. package/dist/services/classify/classify-types.d.ts +0 -1
  474. package/dist/services/classify/classify-types.js +0 -1
  475. package/dist/services/code/auto-compact-lifecycle.d.ts +0 -11
  476. package/dist/services/code/auto-compact-lifecycle.js +0 -10
  477. package/dist/services/code/auto-compact-modes.d.ts +0 -3
  478. package/dist/services/code/auto-compact-modes.js +0 -3
  479. package/dist/services/code/auto-compact-orchestrator.d.ts +0 -9
  480. package/dist/services/code/auto-compact-orchestrator.js +0 -29
  481. package/dist/services/code/batch-heartbeat-poller.js +0 -1
  482. package/dist/services/code/compact-event-settle.js +0 -1
  483. package/dist/services/code/dag-orchestrator.d.ts +0 -1
  484. package/dist/services/code/dag-orchestrator.js +0 -1
  485. package/dist/services/code/mode-gate-types.d.ts +0 -2
  486. package/dist/services/code/mode-gate-types.js +0 -1
  487. package/dist/services/code/mode-gate.d.ts +0 -5
  488. package/dist/services/code/mode-gate.js +0 -5
  489. package/dist/services/code/orchestrator-can-do-advisories.d.ts +0 -2
  490. package/dist/services/code/orchestrator-can-do-advisories.js +0 -5
  491. package/dist/services/code/orchestrator-can-do.d.ts +0 -4
  492. package/dist/services/code/orchestrator-can-do.js +0 -3
  493. package/dist/services/code/status-line-renderer.js +0 -1
  494. package/dist/services/code-review/ecc-bridge.d.ts +0 -1
  495. package/dist/services/codegraph/codegraph-autorefresh.js +6 -4
  496. package/dist/services/codegraph/codegraph-backend-advice.d.ts +26 -0
  497. package/dist/services/codegraph/codegraph-backend-advice.js +166 -0
  498. package/dist/services/codegraph/codegraph-config-repair-writer.d.ts +0 -24
  499. package/dist/services/codegraph/codegraph-config-repair-writer.js +32 -73
  500. package/dist/services/codegraph/codegraph-exclude-integrity.d.ts +14 -6
  501. package/dist/services/codegraph/codegraph-exclude-integrity.js +24 -14
  502. package/dist/services/codegraph/codegraph-exclude-reconciler.d.ts +9 -2
  503. package/dist/services/codegraph/codegraph-exclude-reconciler.js +87 -18
  504. package/dist/services/codegraph/codegraph-exclude-repair.d.ts +9 -61
  505. package/dist/services/codegraph/codegraph-exclude-repair.js +67 -139
  506. package/dist/services/codegraph/codegraph-foreign-removal.d.ts +21 -0
  507. package/dist/services/codegraph/codegraph-foreign-removal.js +77 -0
  508. package/dist/services/codegraph/codegraph-index-integrity.d.ts +12 -25
  509. package/dist/services/codegraph/codegraph-index-integrity.js +84 -23
  510. package/dist/services/codegraph/codegraph-preflight-service.js +15 -6
  511. package/dist/services/codegraph/codegraph-project-config.d.ts +35 -0
  512. package/dist/services/codegraph/codegraph-project-config.js +90 -0
  513. package/dist/services/codegraph/codegraph-service.d.ts +1 -2
  514. package/dist/services/codegraph/codegraph-service.js +11 -11
  515. package/dist/services/codegraph/codegraph-upstream-layout.d.ts +24 -0
  516. package/dist/services/codegraph/codegraph-upstream-layout.js +85 -0
  517. package/dist/services/comments/comment-audit.d.ts +15 -4
  518. package/dist/services/comments/comment-audit.js +25 -4
  519. package/dist/services/comments/comment-citations.d.ts +8 -2
  520. package/dist/services/comments/comment-citations.js +31 -33
  521. package/dist/services/comments/comment-hygiene.d.ts +29 -3
  522. package/dist/services/comments/comment-hygiene.js +40 -3
  523. package/dist/services/comments/comment-prune.js +52 -4
  524. package/dist/services/comments/comment-spans.d.ts +30 -0
  525. package/dist/services/comments/comment-spans.js +266 -0
  526. package/dist/services/comments/prune-apply.d.ts +22 -0
  527. package/dist/services/comments/prune-apply.js +69 -2
  528. package/dist/services/compact/decision-tables.d.ts +0 -2
  529. package/dist/services/compact/decision-tables.js +0 -2
  530. package/dist/services/compact/request-transition-hook.js +0 -2
  531. package/dist/services/compact-history/compact-history-service.d.ts +0 -2
  532. package/dist/services/compact-history/compact-history-service.js +0 -1
  533. package/dist/services/compact-statusline/compact-lifecycle-store.js +0 -2
  534. package/dist/services/compact-statusline/compact-lifecycle-types.d.ts +0 -1
  535. package/dist/services/compact-statusline/compact-statusline-service.js +0 -4
  536. package/dist/services/config/config-rollback.js +0 -1
  537. package/dist/services/config/config-safety.d.ts +0 -1
  538. package/dist/services/config/config-safety.js +0 -1
  539. package/dist/services/config/config-service.d.ts +0 -1
  540. package/dist/services/config/config-service.js +0 -1
  541. package/dist/services/config/model-routing.d.ts +0 -3
  542. package/dist/services/config/model-routing.js +0 -5
  543. package/dist/services/container/container-lease.d.ts +0 -1
  544. package/dist/services/container/container-lease.js +0 -1
  545. package/dist/services/context/artifact-meta.js +0 -1
  546. package/dist/services/context/auto-compact-dispatcher-input.d.ts +0 -3
  547. package/dist/services/context/auto-compact-dispatcher.js +0 -14
  548. package/dist/services/context/auto-compact-reader-input.d.ts +0 -1
  549. package/dist/services/context/auto-compact-reader.d.ts +0 -2
  550. package/dist/services/context/auto-compact-reader.js +0 -7
  551. package/dist/services/context/auto-compact-types.d.ts +0 -11
  552. package/dist/services/context/auto-compact-types.js +0 -1
  553. package/dist/services/context/build-dispatch-system-prompt.d.ts +11 -29
  554. package/dist/services/context/build-dispatch-system-prompt.js +8 -27
  555. package/dist/services/context/codegraph-unavailable-block.d.ts +38 -0
  556. package/dist/services/context/codegraph-unavailable-block.js +77 -0
  557. package/dist/services/context/context-audit-hint.d.ts +0 -1
  558. package/dist/services/context/context-audit-hint.js +0 -1
  559. package/dist/services/context/context-audit.d.ts +0 -1
  560. package/dist/services/context/context-audit.js +0 -1
  561. package/dist/services/context/harness-window-config.d.ts +0 -4
  562. package/dist/services/context/harness-window-config.js +0 -4
  563. package/dist/services/context/main-session-monitor.d.ts +0 -2
  564. package/dist/services/context/main-session-monitor.js +0 -2
  565. package/dist/services/context/memory-index-reader.d.ts +0 -2
  566. package/dist/services/context/memory-index-reader.js +0 -1
  567. package/dist/services/context/memory-preflight-config.d.ts +0 -1
  568. package/dist/services/context/memory-preflight-service.d.ts +0 -1
  569. package/dist/services/context/memory-preflight-service.js +0 -3
  570. package/dist/services/context/memory-preflight-support.d.ts +0 -5
  571. package/dist/services/context/post-compact-reinjection.d.ts +0 -1
  572. package/dist/services/context/post-compact-reinjection.js +0 -1
  573. package/dist/services/context/summary-view.d.ts +0 -1
  574. package/dist/services/context/summary-view.js +0 -1
  575. package/dist/services/crystallization/crystallization-service.d.ts +5 -11
  576. package/dist/services/crystallization/crystallization-service.js +3 -11
  577. package/dist/services/crystallization/crystallization-store.d.ts +6 -6
  578. package/dist/services/dispatch/await-batch-helpers.js +0 -3
  579. package/dist/services/dispatch/await-batch.d.ts +0 -1
  580. package/dist/services/dispatch/await-batch.js +0 -4
  581. package/dist/services/dispatch/batch-counter.js +0 -1
  582. package/dist/services/dispatch/conflict-replay.d.ts +0 -1
  583. package/dist/services/dispatch/conflict-replay.js +0 -1
  584. package/dist/services/dispatch/contract-store.d.ts +0 -2
  585. package/dist/services/dispatch/contract-store.js +0 -2
  586. package/dist/services/dispatch/dispatch-record-input-types.d.ts +0 -2
  587. package/dist/services/dispatch/dispatch-record-types.d.ts +0 -10
  588. package/dist/services/dispatch/dispatch-record-upgrade-fields.js +0 -7
  589. package/dist/services/dispatch/dispatch-record-upgrade-guards.js +0 -2
  590. package/dist/services/dispatch/dispatch-record-writer.d.ts +0 -5
  591. package/dist/services/dispatch/dispatch-record-writer.js +0 -21
  592. package/dist/services/dispatch/dispatch-sub-agent.d.ts +0 -1
  593. package/dist/services/dispatch/dispatch-sub-agent.js +0 -1
  594. package/dist/services/dispatch/e2e-fixtures.js +0 -1
  595. package/dist/services/dispatch/file-overlap-wave-planner.d.ts +0 -1
  596. package/dist/services/dispatch/file-overlap-wave-planner.js +0 -1
  597. package/dist/services/dispatch/isolation-lease.d.ts +0 -2
  598. package/dist/services/dispatch/isolation-lease.js +0 -2
  599. package/dist/services/dispatch/service-shutdown.js +0 -1
  600. package/dist/services/dispatch/session-capsule.js +0 -1
  601. package/dist/services/dispatch/slice-dag-types.d.ts +0 -1
  602. package/dist/services/dispatch/slice-dag.js +0 -2
  603. package/dist/services/dispatch/stage-enum.d.ts +0 -1
  604. package/dist/services/dispatch/stage-enum.js +0 -1
  605. package/dist/services/dispatch/startup-timeout.d.ts +0 -1
  606. package/dist/services/dispatch/sub-agent-batch-await.js +0 -3
  607. package/dist/services/dispatch/sub-agent-dispatcher-types.d.ts +0 -1
  608. package/dist/services/dispatch/sub-agent-dispatcher.js +0 -2
  609. package/dist/services/dispatch/test-tool-detection.d.ts +0 -3
  610. package/dist/services/dispatch/test-tool-detection.js +0 -2
  611. package/dist/services/distribution/mcp-install-runner.d.ts +21 -0
  612. package/dist/services/distribution/mcp-install-runner.js +59 -0
  613. package/dist/services/distribution/mcp-install.d.ts +95 -0
  614. package/dist/services/distribution/mcp-install.js +179 -0
  615. package/dist/services/distribution/plugin-manifest.d.ts +97 -0
  616. package/dist/services/distribution/plugin-manifest.js +126 -0
  617. package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +19 -12
  618. package/dist/services/doctor/doctor-service/checks/codegraph-index-integrity.js +1 -2
  619. package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +0 -2
  620. package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +0 -2
  621. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +0 -1
  622. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +0 -1
  623. package/dist/services/doctor/doctor-service/checks/multi-binary-drift.d.ts +0 -1
  624. package/dist/services/doctor/doctor-service/checks/multi-binary-drift.js +0 -3
  625. package/dist/services/doctor/doctor-service/checks/workspace-layout.js +0 -2
  626. package/dist/services/doctor/doctor-service/index.d.ts +0 -1
  627. package/dist/services/doctor/doctor-service/index.js +0 -1
  628. package/dist/services/doctor/doctor-service/plugin-registry.d.ts +0 -2
  629. package/dist/services/doctor/doctor-service/plugin-registry.js +0 -2
  630. package/dist/services/doctor/doctor-service/probe-types.d.ts +0 -4
  631. package/dist/services/doctor/doctor-service/report/final-summary.d.ts +0 -1
  632. package/dist/services/doctor/doctor-service/report/final-summary.js +0 -1
  633. package/dist/services/doctor/doctor-service/types.d.ts +0 -5
  634. package/dist/services/doctor/doctor-service/types.js +0 -1
  635. package/dist/services/doctor/doctor-service.d.ts +0 -1
  636. package/dist/services/doctor/doctor-service.js +0 -2
  637. package/dist/services/env/shell-probe.js +0 -1
  638. package/dist/services/evidence/evidence-generator.js +0 -8
  639. package/dist/services/evolution/evolution-constraints.d.ts +0 -2
  640. package/dist/services/evolution/evolution-constraints.js +0 -2
  641. package/dist/services/evolution/evolution-service.d.ts +2 -12
  642. package/dist/services/evolution/evolution-service.js +0 -9
  643. package/dist/services/evolution/evolution-store.d.ts +6 -8
  644. package/dist/services/evolution/evolution-store.js +1 -3
  645. package/dist/services/evolution/evolution-types.d.ts +0 -2
  646. package/dist/services/evolution/evolution-types.js +0 -6
  647. package/dist/services/evolution/independent-evaluator-runner.d.ts +0 -3
  648. package/dist/services/evolution/independent-evaluator-runner.js +0 -1
  649. package/dist/services/evolution/regression-skeptic-runner.d.ts +0 -1
  650. package/dist/services/feedback/feedback-promotion-service.d.ts +0 -8
  651. package/dist/services/feedback/feedback-promotion-service.js +0 -10
  652. package/dist/services/feedback/promotion-artifact-evidence.d.ts +0 -1
  653. package/dist/services/feedback/promotion-artifact-evidence.js +0 -1
  654. package/dist/services/final-review/final-review-evidence-budget.d.ts +0 -3
  655. package/dist/services/final-review/final-review-evidence-budget.js +0 -5
  656. package/dist/services/final-review/final-review-evidence-sources.d.ts +0 -1
  657. package/dist/services/final-review/final-review-evidence-sources.js +0 -1
  658. package/dist/services/final-review/final-review-output-budget.d.ts +0 -1
  659. package/dist/services/final-review/final-review-output-budget.js +0 -3
  660. package/dist/services/final-review/final-review-service.d.ts +0 -1
  661. package/dist/services/final-review/final-review-service.js +0 -1
  662. package/dist/services/fixture/fixture-capture-service.js +0 -1
  663. package/dist/services/fixture/fixture-sanitize-service.d.ts +0 -3
  664. package/dist/services/fixture/fixture-sanitize-service.js +0 -3
  665. package/dist/services/fresh-context/config.js +0 -1
  666. package/dist/services/fresh-context/fresh-context-block.js +0 -1
  667. package/dist/services/fresh-context/trigger-scan.d.ts +0 -1
  668. package/dist/services/fresh-context/trigger-scan.js +0 -1
  669. package/dist/services/fuzzy-matching/fzf-pick-service.d.ts +0 -1
  670. package/dist/services/fuzzy-matching/fzf-pick-service.js +0 -1
  671. package/dist/services/handoff/handoff-parser.d.ts +0 -1
  672. package/dist/services/handoff/handoff-parser.js +0 -1
  673. package/dist/services/handoff/handoff-types.d.ts +0 -1
  674. package/dist/services/handoff/handoff-types.js +0 -1
  675. package/dist/services/handoff/handoff-writer.d.ts +0 -1
  676. package/dist/services/handoff/handoff-writer.js +0 -1
  677. package/dist/services/hooks/auto-compact-hook-install.d.ts +0 -1
  678. package/dist/services/hooks/auto-compact-hook-install.js +0 -1
  679. package/dist/services/hooks/mcp-surface-gate.d.ts +19 -0
  680. package/dist/services/hooks/mcp-surface-gate.js +87 -0
  681. package/dist/services/hooks/output.d.ts +0 -1
  682. package/dist/services/hooks/output.js +0 -1
  683. package/dist/services/hooks/pre-tool-code-gate.d.ts +0 -1
  684. package/dist/services/hooks/pre-tool-code-gate.js +0 -1
  685. package/dist/services/hooks/presence-marker-detector.js +0 -1
  686. package/dist/services/hooks/worktree-authorization-gate.d.ts +0 -3
  687. package/dist/services/hooks/worktree-authorization-gate.js +0 -1
  688. package/dist/services/ide/adapters/claude-code-adapter.d.ts +4 -40
  689. package/dist/services/ide/adapters/claude-code-adapter.js +48 -182
  690. package/dist/services/ide/adapters/claude-code-local-state.d.ts +28 -0
  691. package/dist/services/ide/adapters/claude-code-local-state.js +112 -0
  692. package/dist/services/ide/adapters/claude-code-model-window.d.ts +37 -0
  693. package/dist/services/ide/adapters/claude-code-model-window.js +113 -0
  694. package/dist/services/ide/adapters/qoder-adapter.d.ts +0 -3
  695. package/dist/services/ide/adapters/qoder-adapter.js +0 -5
  696. package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +0 -2
  697. package/dist/services/ide/adapters/tongyi-lingma-adapter.js +0 -2
  698. package/dist/services/ide/adapters/trae-adapter.d.ts +0 -3
  699. package/dist/services/ide/adapters/trae-adapter.js +3 -6
  700. package/dist/services/ide/adapters/zcode-adapter.js +0 -2
  701. package/dist/services/ide/current-model-detector.js +0 -1
  702. package/dist/services/ide/hook-protocol.d.ts +0 -2
  703. package/dist/services/ide/hook-protocol.js +0 -2
  704. package/dist/services/ide/ide-compact-types.d.ts +0 -7
  705. package/dist/services/ide/ide-mcp-install-types.d.ts +78 -0
  706. package/dist/services/ide/ide-mcp-install-types.js +104 -0
  707. package/dist/services/ide/ide-types.d.ts +45 -13
  708. package/dist/services/ide/mcp-tool-matcher.d.ts +34 -0
  709. package/dist/services/ide/mcp-tool-matcher.js +84 -0
  710. package/dist/services/ide/resource-profile.d.ts +0 -1
  711. package/dist/services/job/job-commit-verification.d.ts +0 -2
  712. package/dist/services/job/job-commit-verification.js +0 -2
  713. package/dist/services/job/job-orchestrator.d.ts +0 -1
  714. package/dist/services/job/job-orchestrator.js +0 -1
  715. package/dist/services/job/job-progress-store.d.ts +0 -2
  716. package/dist/services/job/job-progress-store.js +0 -3
  717. package/dist/services/job/job-types.js +0 -1
  718. package/dist/services/job-snapshot/snapshot.js +0 -1
  719. package/dist/services/karpathy-cost/karpathy-cost-check-service.js +0 -1
  720. package/dist/services/legacy/legacy-detector.js +0 -1
  721. package/dist/services/lint/npx-resolver.js +7 -0
  722. package/dist/services/log/log-commands-service.d.ts +0 -2
  723. package/dist/services/log/log-commands-service.js +0 -2
  724. package/dist/services/log/logger.d.ts +0 -1
  725. package/dist/services/log/logger.js +0 -1
  726. package/dist/services/log/redact.d.ts +0 -1
  727. package/dist/services/log/redact.js +0 -1
  728. package/dist/services/log/retention.d.ts +0 -1
  729. package/dist/services/log/retention.js +0 -1
  730. package/dist/services/loop/loop-bee-relation-service.d.ts +3 -3
  731. package/dist/services/loop/loop-bee-relation-service.js +14 -13
  732. package/dist/services/loop/loop-bee-relation-store.d.ts +9 -10
  733. package/dist/services/loop/loop-bee-relation-store.js +1 -2
  734. package/dist/services/loop/loop-bee-relation-types.d.ts +1 -1
  735. package/dist/services/loop/loop-bee-relation-types.js +1 -1
  736. package/dist/services/loop/loop-release-service.d.ts +3 -3
  737. package/dist/services/loop/loop-release-service.js +1 -1
  738. package/dist/services/loop/loop-release-store.d.ts +6 -7
  739. package/dist/services/loop/loop-release-store.js +0 -1
  740. package/dist/services/loop/monotonic-guard.d.ts +0 -1
  741. package/dist/services/loop/monotonic-guard.js +0 -1
  742. package/dist/services/mcp/cli-executor.d.ts +36 -0
  743. package/dist/services/mcp/cli-executor.js +97 -0
  744. package/dist/services/mcp/json-rpc.d.ts +81 -0
  745. package/dist/services/mcp/json-rpc.js +116 -0
  746. package/dist/services/mcp/memory-tool.d.ts +3 -0
  747. package/dist/services/mcp/memory-tool.js +62 -0
  748. package/dist/services/mcp/server-main.d.ts +1 -0
  749. package/dist/services/mcp/server-main.js +66 -0
  750. package/dist/services/mcp/server.d.ts +22 -0
  751. package/dist/services/mcp/server.js +152 -0
  752. package/dist/services/mcp/surface.d.ts +62 -0
  753. package/dist/services/mcp/surface.js +198 -0
  754. package/dist/services/mcp/tool-core.d.ts +42 -0
  755. package/dist/services/mcp/tool-core.js +137 -0
  756. package/dist/services/mcp/tools.d.ts +13 -0
  757. package/dist/services/mcp/tools.js +58 -0
  758. package/dist/services/memory/memory-ingest-service.js +0 -1
  759. package/dist/services/memory/project-context-service.d.ts +0 -1
  760. package/dist/services/memory/project-context-service.js +0 -1
  761. package/dist/services/memory/project-memory-service/index/reindex.d.ts +0 -2
  762. package/dist/services/memory/project-memory-service/index/reindex.js +0 -1
  763. package/dist/services/memory/project-memory-service/index/search.d.ts +0 -1
  764. package/dist/services/memory/project-memory-service/index/search.js +0 -1
  765. package/dist/services/memory/project-memory-service/memory-kinds.d.ts +0 -1
  766. package/dist/services/memory/project-memory-service/memory-kinds.js +0 -1
  767. package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +0 -1
  768. package/dist/services/memory/project-memory-service/parsers/frontmatter.js +0 -1
  769. package/dist/services/memory/project-memory-service.js +0 -1
  770. package/dist/services/mode/mode-enforcement.js +0 -1
  771. package/dist/services/mode/mode-status-service.d.ts +0 -2
  772. package/dist/services/mode/mode-status-service.js +0 -2
  773. package/dist/services/observability/aggregation.d.ts +0 -4
  774. package/dist/services/observability/aggregation.js +0 -6
  775. package/dist/services/observability/observability-schema.js +0 -1
  776. package/dist/services/observability/observability-service.d.ts +0 -5
  777. package/dist/services/observability/observability-service.js +0 -4
  778. package/dist/services/observability/report-formatter.d.ts +0 -2
  779. package/dist/services/observability/report-formatter.js +0 -2
  780. package/dist/services/openspec/artifact-boundary.d.ts +0 -4
  781. package/dist/services/openspec/artifact-boundary.js +0 -4
  782. package/dist/services/openspec/coverage-evidence-reader.d.ts +0 -1
  783. package/dist/services/openspec/coverage-evidence-reader.js +0 -1
  784. package/dist/services/polyrepo/polyrepo-dispatcher.js +0 -1
  785. package/dist/services/polyrepo/polyrepo-scanner.js +0 -1
  786. package/dist/services/polyrepo/polyrepo-service.js +0 -1
  787. package/dist/services/polyrepo/polyrepo-types.d.ts +0 -1
  788. package/dist/services/prd/best-practice-auto-trigger.d.ts +0 -2
  789. package/dist/services/prd/best-practice-auto-trigger.js +0 -2
  790. package/dist/services/prd/gate-evidence-derivation.d.ts +0 -4
  791. package/dist/services/prd/gate-evidence-derivation.js +0 -5
  792. package/dist/services/prd/handoff-auto-regen.js +0 -5
  793. package/dist/services/prd/handoff-frontmatter-shape.d.ts +0 -2
  794. package/dist/services/prd/handoff-frontmatter-shape.js +0 -2
  795. package/dist/services/prd/handoff-frontmatter.d.ts +0 -1
  796. package/dist/services/prd/handoff-frontmatter.js +0 -2
  797. package/dist/services/prd/handoff-gate-evidence.d.ts +0 -1
  798. package/dist/services/prd/handoff-gate-evidence.js +0 -4
  799. package/dist/services/prd/handoff-path-resolution.d.ts +0 -7
  800. package/dist/services/prd/handoff-path-resolution.js +0 -10
  801. package/dist/services/prd/handoff-service.d.ts +0 -2
  802. package/dist/services/prd/handoff-service.js +0 -2
  803. package/dist/services/prd/handoff-types.d.ts +0 -2
  804. package/dist/services/prd/handoff-types.js +0 -1
  805. package/dist/services/prd/project-scan-bootstrap-service.d.ts +0 -1
  806. package/dist/services/prd/project-scan-bootstrap-service.js +0 -4
  807. package/dist/services/prd/project-scan-types.d.ts +0 -1
  808. package/dist/services/prd/project-scan-types.js +0 -1
  809. package/dist/services/preferences/preferences-service.d.ts +0 -1
  810. package/dist/services/preferences/preferences-service.js +0 -5
  811. package/dist/services/preferences/preferences-types.d.ts +0 -14
  812. package/dist/services/preferences/preferences-types.js +0 -4
  813. package/dist/services/progress/progress-service.js +0 -1
  814. package/dist/services/qa/bdd-test-style-verifier.d.ts +0 -1
  815. package/dist/services/qa/bdd-test-style-verifier.js +0 -1
  816. package/dist/services/qa/browser-event-logger.d.ts +0 -1
  817. package/dist/services/qa/browser-event-logger.js +0 -1
  818. package/dist/services/qa/browser-restart-detector.d.ts +0 -1
  819. package/dist/services/qa/browser-restart-detector.js +0 -1
  820. package/dist/services/qa/browser-reuse-hint.d.ts +0 -1
  821. package/dist/services/qa/browser-reuse-hint.js +0 -1
  822. package/dist/services/qa/qa-business-review-state.js +0 -2
  823. package/dist/services/qa/screenshot-archive-service.d.ts +0 -1
  824. package/dist/services/qa/screenshot-archive-service.js +0 -1
  825. package/dist/services/rd/impl.js +0 -1
  826. package/dist/services/rd/rd-service.d.ts +0 -5
  827. package/dist/services/rd/rd-service.js +0 -5
  828. package/dist/services/rd/reviewer-dispatch-policy.d.ts +0 -4
  829. package/dist/services/rd/reviewer-dispatch-policy.js +0 -4
  830. package/dist/services/rd/standards-diagnostic.js +0 -1
  831. package/dist/services/rd/tactical-stage.js +0 -1
  832. package/dist/services/rd-swarm/rd-swarm-types.d.ts +0 -1
  833. package/dist/services/rd-swarm/rd-swarm-types.js +0 -1
  834. package/dist/services/readonly-surface/argv-guard.d.ts +32 -0
  835. package/dist/services/readonly-surface/argv-guard.js +164 -0
  836. package/dist/services/readonly-surface/readonly-whitelist.d.ts +147 -0
  837. package/dist/services/readonly-surface/readonly-whitelist.js +107 -0
  838. package/dist/services/readonly-surface/whitelist-generator.d.ts +64 -0
  839. package/dist/services/readonly-surface/whitelist-generator.js +212 -0
  840. package/dist/services/recommendations/installed-capability-detector.d.ts +0 -1
  841. package/dist/services/recommendations/installed-capability-detector.js +0 -1
  842. package/dist/services/release/version-precheck-service.d.ts +0 -2
  843. package/dist/services/release/version-precheck-service.js +0 -3
  844. package/dist/services/retrospective/retrospective-index.d.ts +0 -1
  845. package/dist/services/retrospective/retrospective-index.js +0 -1
  846. package/dist/services/retrospective/retrospective-show.d.ts +0 -1
  847. package/dist/services/retrospective/retrospective-show.js +0 -1
  848. package/dist/services/reviewer/model-family.js +0 -1
  849. package/dist/services/reviewer/reviewer-config.js +0 -1
  850. package/dist/services/reviewer/reviewer-service.d.ts +0 -1
  851. package/dist/services/reviewer/reviewer-service.js +0 -3
  852. package/dist/services/reviewer/selection-strategies.js +0 -1
  853. package/dist/services/runtime/runtime-detector.js +0 -1
  854. package/dist/services/runtime/runtime-service.d.ts +0 -2
  855. package/dist/services/runtime/vendor-adapter.d.ts +0 -7
  856. package/dist/services/runtime/vendors/claude-code.js +0 -1
  857. package/dist/services/runtime/vendors/codex.js +0 -1
  858. package/dist/services/runtime/vendors/copilot.js +0 -1
  859. package/dist/services/sc/sc-service.js +0 -6
  860. package/dist/services/scan/acceptance-coverage-service.js +0 -2
  861. package/dist/services/scan/api-diff-recorded.d.ts +0 -1
  862. package/dist/services/scan/api-diff-recorded.js +0 -1
  863. package/dist/services/scan/api-diff-service.d.ts +0 -1
  864. package/dist/services/scan/api-diff-service.js +0 -1
  865. package/dist/services/scan/api-diff-types.d.ts +0 -1
  866. package/dist/services/scan/api-diff-types.js +0 -1
  867. package/dist/services/scan/archetype-service.js +0 -1
  868. package/dist/services/scan/file-size-policy.d.ts +0 -1
  869. package/dist/services/scan/file-size-policy.js +0 -5
  870. package/dist/services/scan/file-size-scan.d.ts +0 -1
  871. package/dist/services/security/safe-settings-path.js +0 -1
  872. package/dist/services/session/binding-store.d.ts +0 -4
  873. package/dist/services/session/binding-store.js +0 -7
  874. package/dist/services/session/caller-binding-service.d.ts +0 -6
  875. package/dist/services/session/caller-binding-service.js +0 -4
  876. package/dist/services/session/caller-id-types.d.ts +0 -3
  877. package/dist/services/session/caller-id-types.js +0 -2
  878. package/dist/services/session/getSessionDir.js +0 -1
  879. package/dist/services/session/index.js +0 -1
  880. package/dist/services/session/platform-fallbacks.d.ts +0 -3
  881. package/dist/services/session/platform-fallbacks.js +0 -3
  882. package/dist/services/session/resolve-caller-id.d.ts +0 -2
  883. package/dist/services/session/resolve-caller-id.js +0 -2
  884. package/dist/services/session/session-binding-bridge.d.ts +0 -2
  885. package/dist/services/session/session-binding-bridge.js +0 -15
  886. package/dist/services/session/session-checkpoint-service.d.ts +0 -1
  887. package/dist/services/session/session-checkpoint-service.js +0 -1
  888. package/dist/services/session/session-manager.d.ts +0 -8
  889. package/dist/services/session/session-manager.js +0 -19
  890. package/dist/services/session/session-resume-service.d.ts +0 -1
  891. package/dist/services/session/session-resume-service.js +0 -1
  892. package/dist/services/share/bundle-reader.d.ts +2 -5
  893. package/dist/services/share/bundle-reader.js +6 -8
  894. package/dist/services/share/bundle-writer.d.ts +2 -2
  895. package/dist/services/skill/resume-detector.js +0 -3
  896. package/dist/services/skill/skill-scheduler.d.ts +0 -1
  897. package/dist/services/skill/skill-scheduler.js +0 -1
  898. package/dist/services/skill/skill-search-service.d.ts +0 -2
  899. package/dist/services/skill/skill-search-service.js +0 -2
  900. package/dist/services/skillhub/release-diff.d.ts +2 -2
  901. package/dist/services/skillhub/release-export.d.ts +2 -2
  902. package/dist/services/skillhub/release-gc-blobs.d.ts +2 -2
  903. package/dist/services/skillhub/release-import.d.ts +2 -2
  904. package/dist/services/skillhub/release-import.js +2 -1
  905. package/dist/services/skillhub/release-retain.d.ts +2 -2
  906. package/dist/services/skillhub/release-retain.js +2 -1
  907. package/dist/services/skillhub/sqlite-store.d.ts +3 -3
  908. package/dist/services/skillhub/sqlite-store.js +4 -5
  909. package/dist/services/skills/hooks-codegate-superpowers.d.ts +1 -3
  910. package/dist/services/skills/hooks-codegate-superpowers.js +26 -14
  911. package/dist/services/skills/hooks-settings-service.d.ts +0 -2
  912. package/dist/services/skills/hooks-settings-service.js +10 -8
  913. package/dist/services/skills/presence-lease-service.d.ts +0 -1
  914. package/dist/services/skills/presence-lease-service.js +0 -1
  915. package/dist/services/skills/session-start-hook-constants.d.ts +0 -4
  916. package/dist/services/skills/session-start-hook-constants.js +0 -4
  917. package/dist/services/skills/skill-presence-service.d.ts +0 -8
  918. package/dist/services/skills/skill-presence-service.js +0 -13
  919. package/dist/services/skills/skill-statusline-model.d.ts +0 -6
  920. package/dist/services/skills/skill-statusline-model.js +1 -4
  921. package/dist/services/skills/skill-statusline-renderer.d.ts +0 -1
  922. package/dist/services/skills/skill-statusline-renderer.js +0 -12
  923. package/dist/services/skills/skill-statusline-service.js +0 -6
  924. package/dist/services/skills/skill-statusline-sid-suffix.d.ts +0 -2
  925. package/dist/services/skills/skill-statusline-sid-suffix.js +0 -2
  926. package/dist/services/skills/statusline-palette.d.ts +0 -2
  927. package/dist/services/skills/statusline-palette.js +0 -3
  928. package/dist/services/slice/slice-archive-service.js +0 -1
  929. package/dist/services/slice/slice-benchmark-service.d.ts +0 -1
  930. package/dist/services/slice/slice-benchmark-service.js +0 -1
  931. package/dist/services/slice/slice-check-service.js +0 -6
  932. package/dist/services/slice/slice-check-types.d.ts +0 -1
  933. package/dist/services/slice/slice-pick-service.d.ts +0 -1
  934. package/dist/services/slice/slice-pick-service.js +0 -1
  935. package/dist/services/slice/slice-review-state.js +0 -2
  936. package/dist/services/sqlite/sqlite-driver.d.ts +118 -0
  937. package/dist/services/sqlite/sqlite-driver.js +159 -0
  938. package/dist/services/standards/ide-aware-standards-service.d.ts +0 -2
  939. package/dist/services/standards/ide-aware-standards-service.js +0 -1
  940. package/dist/services/standards/loop-engineering-readiness-lint.d.ts +0 -1
  941. package/dist/services/standards/loop-engineering-readiness-lint.js +0 -1
  942. package/dist/services/standards/migrate-claude-rules-service.js +0 -3
  943. package/dist/services/standards/migrate-service.d.ts +0 -1
  944. package/dist/services/standards/migrate-service.js +0 -1
  945. package/dist/services/standards/missing-standards-detector.d.ts +0 -2
  946. package/dist/services/standards/missing-standards-detector.js +0 -3
  947. package/dist/services/standards/project-standards-service.d.ts +0 -1
  948. package/dist/services/standards/project-standards-service.js +0 -1
  949. package/dist/services/standards/standards-render.d.ts +0 -1
  950. package/dist/services/standards/standards-render.js +0 -1
  951. package/dist/services/standards/ui-library-dispatch-block.d.ts +0 -1
  952. package/dist/services/standards/ui-library-dispatch-block.js +0 -1
  953. package/dist/services/tech/tech-change-id-service.d.ts +0 -7
  954. package/dist/services/tech/tech-change-id-service.js +0 -7
  955. package/dist/services/tech/tech-service.js +0 -5
  956. package/dist/services/verdict/envelope-parsers.d.ts +0 -2
  957. package/dist/services/verdict/envelope-parsers.js +0 -2
  958. package/dist/services/verdict/envelopes.d.ts +0 -1
  959. package/dist/services/vm/vm-lease.js +0 -1
  960. package/dist/services/web/aria-node.d.ts +0 -1
  961. package/dist/services/web/bounded-output.d.ts +0 -1
  962. package/dist/services/web/bounded-output.js +0 -1
  963. package/dist/services/web/browser-acquire.js +0 -1
  964. package/dist/services/web/browser-cache-probe.js +0 -1
  965. package/dist/services/web/browser-session-manager.js +0 -1
  966. package/dist/services/web/daemon-entry.js +0 -1
  967. package/dist/services/web/daemon-registry.js +0 -1
  968. package/dist/services/web/daemon-supervisor.d.ts +4 -3
  969. package/dist/services/web/daemon-supervisor.js +4 -4
  970. package/dist/services/web/playwright-loader.js +0 -1
  971. package/dist/services/web/playwright-types.d.ts +0 -1
  972. package/dist/services/web/snapshot-pruner.js +0 -1
  973. package/dist/services/web/untrusted-envelope.d.ts +0 -1
  974. package/dist/services/web/web-artifact-paths.js +0 -1
  975. package/dist/services/web/web-client.d.ts +0 -1
  976. package/dist/services/web/web-daemon-service.js +0 -1
  977. package/dist/services/web/web-fallback.d.ts +0 -1
  978. package/dist/services/web/web-fallback.js +0 -1
  979. package/dist/services/web/web-install-service.js +0 -1
  980. package/dist/services/web/web-login-profile.js +0 -1
  981. package/dist/services/web/web-protocol.d.ts +0 -1
  982. package/dist/services/web/web-protocol.js +0 -1
  983. package/dist/services/web/web-status-report.js +0 -1
  984. package/dist/services/workflow/artifact-paths.js +0 -3
  985. package/dist/services/workflow/autonomous-resume-writer.js +0 -2
  986. package/dist/services/workflow/pipeline-verify-gate-support.d.ts +0 -5
  987. package/dist/services/workflow/pipeline-verify-gate-support.js +0 -11
  988. package/dist/services/workflow/pipeline-verify-service.d.ts +0 -2
  989. package/dist/services/workflow/pipeline-verify-service.js +0 -15
  990. package/dist/services/workflow/pipeline-verify-types.d.ts +0 -10
  991. package/dist/services/workflow/pipeline-verify-types.js +0 -2
  992. package/dist/services/workflow/plan-reader.d.ts +0 -1
  993. package/dist/services/workflow/plan-reader.js +0 -5
  994. package/dist/services/workflow/plan-refresher.js +0 -2
  995. package/dist/services/workflow/plan-trigger-detector.d.ts +0 -2
  996. package/dist/services/workflow/plan-trigger-detector.js +0 -3
  997. package/dist/services/workflow/workflow-autonomous-resume-helpers.js +0 -5
  998. package/dist/services/workflow/workflow-autonomous-service.js +0 -2
  999. package/dist/services/workflow/workflow-autonomous-types.d.ts +0 -2
  1000. package/dist/services/workflow/workflow-autonomous-types.js +0 -2
  1001. package/dist/services/workflow/workflow-graph-types.d.ts +0 -1
  1002. package/dist/services/workflow/workflow-graph-types.js +0 -1
  1003. package/dist/services/workflow/workflow-router-service.js +0 -4
  1004. package/dist/services/workflow/workflow-skip-service.d.ts +0 -1
  1005. package/dist/services/workflow/workflow-skip-service.js +0 -1
  1006. package/dist/services/workflow/workflow-spec-lint.d.ts +0 -2
  1007. package/dist/services/workflow/workflow-spec-lint.js +0 -2
  1008. package/dist/services/workflow/workflow-spec-types.d.ts +0 -1
  1009. package/dist/services/workflow/workflow-spec-types.js +0 -1
  1010. package/dist/services/workflow/workflow-spec-yaml.d.ts +0 -2
  1011. package/dist/services/workflow/workflow-spec-yaml.js +0 -2
  1012. package/dist/services/workflow/workflow-spec.js +0 -1
  1013. package/dist/services/workflow/workflow-state-store.js +0 -1
  1014. package/dist/services/workspace/claude-settings-template.d.ts +0 -4
  1015. package/dist/services/workspace/claude-settings-template.js +0 -4
  1016. package/dist/services/workspace/migrate-1-4-1-service.d.ts +0 -1
  1017. package/dist/services/workspace/migrate-1-4-1-service.js +0 -1
  1018. package/dist/services/workspace/migrate-service.js +0 -8
  1019. package/dist/services/workspace/migrate-types.d.ts +0 -4
  1020. package/dist/services/workspace/migrate-types.js +0 -1
  1021. package/dist/services/workspace/reconcile-migrate.d.ts +0 -3
  1022. package/dist/services/workspace/reconcile-migrate.js +0 -5
  1023. package/dist/services/workspace/reconcile-service.d.ts +0 -3
  1024. package/dist/services/workspace/reconcile-service.js +0 -7
  1025. package/dist/services/workspace/reconcile-types.d.ts +0 -5
  1026. package/dist/services/workspace/sid-naming-guard.d.ts +0 -1
  1027. package/dist/services/workspace/sid-naming-guard.js +0 -1
  1028. package/dist/services/workspace/templates/project-scan/index.d.ts +0 -3
  1029. package/dist/services/workspace/templates/project-scan/index.js +0 -3
  1030. package/dist/services/workspace/workspace-claude-settings-materializer.d.ts +0 -1
  1031. package/dist/services/workspace/workspace-claude-settings-materializer.js +0 -4
  1032. package/dist/services/workspace/workspace-service.d.ts +0 -7
  1033. package/dist/services/workspace/workspace-service.js +0 -16
  1034. package/dist/services/worktree/playwright-profile.js +0 -1
  1035. package/dist/services/worktree/worktree-lease-types.d.ts +0 -1
  1036. package/dist/services/worktree/worktree-lease-types.js +0 -1
  1037. package/dist/services/worktree/worktree-lease.d.ts +0 -2
  1038. package/dist/services/worktree/worktree-lease.js +0 -2
  1039. package/dist/shared/format-md-compact.d.ts +0 -2
  1040. package/dist/shared/format-md-compact.js +0 -2
  1041. package/dist/shared/incrementing-number.d.ts +0 -1
  1042. package/dist/shared/incrementing-number.js +0 -1
  1043. package/dist/shared/path-utils.d.ts +0 -1
  1044. package/dist/shared/path-utils.js +0 -1
  1045. package/dist/shared/runtime-root.d.ts +0 -1
  1046. package/dist/shared/runtime-root.js +0 -1
  1047. package/dist/shared/stale-policy.d.ts +0 -1
  1048. package/dist/shared/stale-policy.js +0 -1
  1049. package/package.json +24 -11
  1050. package/scripts/canonical-store-link.mjs +296 -0
  1051. package/scripts/canonical-store-prune.mjs +131 -0
  1052. package/scripts/canonical-store.mjs +298 -0
  1053. package/scripts/install-skills-bundles.mjs +233 -0
  1054. package/scripts/install-skills-fs.mjs +148 -0
  1055. package/scripts/install-skills-ide.mjs +279 -0
  1056. package/scripts/install-skills-output-style-default.mjs +196 -0
  1057. package/scripts/install-skills-output-styles.mjs +121 -0
  1058. package/scripts/install-skills-report.mjs +42 -0
  1059. package/scripts/install-skills-user-config.mjs +198 -0
  1060. package/scripts/install-skills.mjs +41 -1279
  1061. package/scripts/watch-tree.mjs +140 -0
  1062. package/scripts/watch.mjs +4 -126
  1063. package/skills/peaks-audit/SKILL.md +3 -3
  1064. package/skills/peaks-status/SKILL.md +31 -13
  1065. package/dist/services/codegraph/codegraph-include-reconciler.d.ts +0 -10
  1066. package/dist/services/codegraph/codegraph-include-reconciler.js +0 -160
@@ -1,1283 +1,41 @@
1
- #!/usr/bin/env node
2
- import {
3
- closeSync,
4
- constants,
5
- existsSync,
6
- fchmodSync,
7
- fstatSync,
8
- lstatSync,
9
- mkdirSync,
10
- openSync,
11
- readFileSync,
12
- readlinkSync,
13
- realpathSync,
14
- readdirSync,
15
- renameSync,
16
- symlinkSync,
17
- unlinkSync,
18
- writeFileSync
19
- } from 'node:fs';
20
- import { createHash, randomUUID } from 'node:crypto';
1
+ // scripts/install-skills.mjs
2
+ //
3
+ // The npm postinstall entry. What stays HERE, and why it cannot move:
4
+ //
5
+ // 1. The two per-platform fan-outs. Their `ideId === 'claude-code'` branches are the
6
+ // env-var override the 1.x-compat contract is written on, and they are pinned BY
7
+ // FILE NAME by `tests/unit/runtime/vendor-neutral-identity-guard.test.ts` — moving
8
+ // them would either drop a pinned decision or add one to a file the ratchet does
9
+ // not know about. Their bodies are unchanged.
10
+ // 2. The CLI entry block. It identifies its own path (`import.meta.url` against
11
+ // `process.argv[1]`), which is exactly what the module's own location means, so it
12
+ // cannot live anywhere else.
13
+ //
14
+ // Everything else moved to a sibling by responsibility; the public surface below is a
15
+ // re-export, so no importer changes.
16
+ //
21
17
  import { homedir } from 'node:os';
22
- import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
23
- import { fileURLToPath, pathToFileURL } from 'node:url';
24
-
25
- function getPathStats(path) {
26
- try {
27
- return lstatSync(path);
28
- } catch {
29
- return null;
30
- }
31
- }
32
-
33
- function isBrokenSymlink(stats, targetPath) {
34
- return stats.isSymbolicLink() && !existsSync(targetPath);
35
- }
36
-
37
- function validateManagedMarkerPath(markerPath) {
38
- const markerStats = getPathStats(markerPath);
39
- if (!markerStats) return;
40
- if (markerStats.isSymbolicLink()) {
41
- throw new Error('Peaks managed marker path must not be a symlink');
42
- }
43
- if (!markerStats.isFile()) {
44
- throw new Error('Peaks managed marker path must be a file');
45
- }
46
- if (markerStats.nlink !== 1) {
47
- throw new Error('Peaks managed marker path must not be hardlinked');
48
- }
49
- }
50
-
51
- function validateOpenFile(fd, path, errorMessage) {
52
- const fdStats = fstatSync(fd);
53
- const pathStats = lstatSync(path);
54
- if (
55
- !fdStats.isFile() ||
56
- !pathStats.isFile() ||
57
- fdStats.dev !== pathStats.dev ||
58
- fdStats.ino !== pathStats.ino
59
- ) {
60
- throw new Error(errorMessage);
61
- }
62
- if (fdStats.nlink !== 1 || pathStats.nlink !== 1) {
63
- throw new Error(`${errorMessage}: hardlinked file`);
64
- }
65
- }
66
-
67
- function createFileIdentity(path) {
68
- const stats = lstatSync(path);
69
- if (!stats.isFile() || stats.isSymbolicLink() || stats.nlink !== 1) {
70
- return null;
71
- }
72
- return { dev: stats.dev, ino: stats.ino };
73
- }
74
-
75
- function isSameFileIdentity(path, identity) {
76
- if (identity === null) return false;
77
- const stats = getPathStats(path);
78
- return Boolean(
79
- stats?.isFile() &&
80
- !stats.isSymbolicLink() &&
81
- stats.nlink === 1 &&
82
- stats.dev === identity.dev &&
83
- stats.ino === identity.ino
84
- );
85
- }
86
-
87
- function getSafeReadOpenFlags() {
88
- return typeof constants.O_NOFOLLOW === 'number'
89
- ? constants.O_RDONLY | constants.O_NOFOLLOW
90
- : constants.O_RDONLY;
91
- }
92
-
93
- function readFileSafely(path, errorMessage) {
94
- const fd = openSync(path, getSafeReadOpenFlags());
95
- try {
96
- validateOpenFile(fd, path, errorMessage);
97
- return readFileSync(fd, 'utf8');
98
- } finally {
99
- closeSync(fd);
100
- }
101
- }
102
-
103
- function getManagedTarget(targetPath) {
104
- const markerPath = `${targetPath}.peaks-managed`;
105
- validateManagedMarkerPath(markerPath);
106
- if (!existsSync(markerPath)) {
107
- return null;
108
- }
109
- return readFileSafely(markerPath, 'Peaks managed marker path changed during read').trim();
110
- }
111
-
112
- function markManagedPeaksLink(targetPath, sourcePath) {
113
- const markerPath = `${targetPath}.peaks-managed`;
114
- validateManagedMarkerPath(markerPath);
115
- writeFileAtomically(
116
- markerPath,
117
- `${sourcePath}\n`,
118
- 'Peaks managed marker path changed during write',
119
- () => validateManagedMarkerPath(markerPath)
120
- );
121
- }
122
-
123
- function readPackageSourceFile(path) {
124
- const stats = lstatSync(path);
125
- if (!stats.isFile() || stats.isSymbolicLink()) {
126
- throw new Error('Peaks package source path must be a file');
127
- }
128
- return readFileSync(path, 'utf8');
129
- }
130
-
131
- function hashContent(content) {
132
- return createHash('sha256').update(content).digest('hex');
133
- }
134
-
135
- function hashFileContent(path) {
136
- return hashContent(readFileSafely(path, 'Peaks managed file path changed during read'));
137
- }
138
-
139
- function createManagedOutputStyleMarker(sourcePath, outputStyleName) {
140
- const content = readPackageSourceFile(sourcePath);
141
- return `${JSON.stringify({ version: 1, kind: 'output-style', outputStyleName, sourcePath, contentSha256: hashContent(content) })}\n`;
142
- }
143
-
144
- function parseManagedOutputStyleMarker(managedTarget) {
145
- if (managedTarget === null) return null;
146
- try {
147
- const marker = JSON.parse(managedTarget);
148
- if (
149
- marker?.version !== 1 ||
150
- marker?.kind !== 'output-style' ||
151
- typeof marker.outputStyleName !== 'string' ||
152
- typeof marker.sourcePath !== 'string' ||
153
- typeof marker.contentSha256 !== 'string'
154
- ) {
155
- return null;
156
- }
157
- return marker;
158
- } catch {
159
- return null;
160
- }
161
- }
162
-
163
- function isTrustedOutputStyleSource(marker, sourcePath, outputStyleName) {
164
- return (
165
- marker.outputStyleName === outputStyleName &&
166
- resolve(marker.sourcePath) === resolve(sourcePath) &&
167
- basename(resolve(marker.sourcePath)) === outputStyleName
168
- );
169
- }
170
-
171
- function getManagedPeaksOutputStyleIdentity(
172
- managedTarget,
173
- targetPath,
174
- sourcePath,
175
- outputStyleName
176
- ) {
177
- const marker = parseManagedOutputStyleMarker(managedTarget);
178
- const sourceHash = hashContent(readPackageSourceFile(sourcePath));
179
- if (
180
- marker === null ||
181
- !isTrustedOutputStyleSource(marker, sourcePath, outputStyleName) ||
182
- !existsSync(targetPath) ||
183
- hashFileContent(targetPath) !== sourceHash ||
184
- marker.contentSha256 !== sourceHash
185
- ) {
186
- return null;
187
- }
188
- return createFileIdentity(targetPath);
189
- }
190
-
191
- function validateInstallRoot(targetRoot, label) {
192
- const rootStats = lstatSync(targetRoot);
193
- if (rootStats.isSymbolicLink()) {
194
- throw new Error(`${label} install root must not be a symlink`);
195
- }
196
- if (!rootStats.isDirectory()) {
197
- throw new Error(`${label} install root must be a directory`);
198
- }
199
- return rootStats;
200
- }
201
-
202
- function createInstallRootValidator(targetRoot, label) {
203
- const expectedStats = validateInstallRoot(targetRoot, label);
204
- return () => {
205
- const rootStats = validateInstallRoot(targetRoot, label);
206
- if (rootStats.dev !== expectedStats.dev || rootStats.ino !== expectedStats.ino) {
207
- throw new Error(`${label} install root changed during write`);
208
- }
209
- };
210
- }
211
-
212
- function createInstallResult() {
213
- return { installed: [], skipped: [] };
214
- }
215
-
216
- function resolvePackageRoot(options = {}) {
217
- return resolve(options.packageRoot ?? join(dirname(fileURLToPath(import.meta.url)), '..'));
218
- }
219
-
220
- function readPackageVersion(packageRoot = resolvePackageRoot()) {
221
- const packageJson = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'));
222
- if (typeof packageJson.version !== 'string' || packageJson.version.length === 0) {
223
- throw new Error('package.json version must be a non-empty string');
224
- }
225
-
226
- return packageJson.version;
227
- }
228
-
229
- function createConfigDefaults(packageRoot) {
230
- return {
231
- version: readPackageVersion(packageRoot),
232
- currentWorkspace: null,
233
- workspaces: [],
234
- language: 'en',
235
- economyMode: true,
236
- swarmMode: true,
237
- tokens: {},
238
- proxy: {}
239
- };
240
- }
241
-
242
- function createConfigResult(overrides = {}) {
243
- return { created: false, updated: false, skipped: false, ...overrides };
244
- }
245
-
246
- function isInsidePath(childPath, parentPath) {
247
- const relativePath = relative(parentPath, childPath);
248
- return relativePath === '' || (!relativePath.startsWith('..') && !isAbsolute(relativePath));
249
- }
250
-
251
- function isPlainObject(value) {
252
- return value !== null && typeof value === 'object' && !Array.isArray(value);
253
- }
254
-
255
- function mergeMissingConfigValues(existing, defaults) {
256
- return Object.entries(defaults).reduce(
257
- (next, [key, defaultValue]) => {
258
- if (!(key in next)) {
259
- return { ...next, [key]: defaultValue };
260
- }
261
-
262
- const existingValue = next[key];
263
- if (isPlainObject(existingValue) && isPlainObject(defaultValue)) {
264
- return { ...next, [key]: mergeMissingConfigValues(existingValue, defaultValue) };
265
- }
266
-
267
- return next;
268
- },
269
- { ...existing }
270
- );
271
- }
272
-
273
- function readConfigFile(configPath, label) {
274
- if (!existsSync(configPath)) {
275
- return null;
276
- }
277
-
278
- try {
279
- const parsed = JSON.parse(
280
- readFileSafely(configPath, `${label} config path changed during read`)
281
- );
282
- if (!isPlainObject(parsed)) {
283
- throw new Error(`${label} config must contain a JSON object`);
284
- }
285
-
286
- return parsed;
287
- } catch (error) {
288
- const message =
289
- error instanceof SyntaxError
290
- ? `${label} config must contain valid JSON`
291
- : error instanceof Error
292
- ? error.message
293
- : String(error);
294
- throw new Error(message);
295
- }
296
- }
297
-
298
- function validateConfigPath(root, peaksRoot, configPath, label) {
299
- const rootReal = realpathSync(root);
300
- const peaksStats = lstatSync(peaksRoot);
301
- const peaksReal = realpathSync(peaksRoot);
302
- if (
303
- !peaksStats.isDirectory() ||
304
- peaksStats.isSymbolicLink() ||
305
- peaksReal !== resolve(rootReal, '.peaks')
306
- ) {
307
- throw new Error(`${label} config path must stay inside the ${label.toLowerCase()} root`);
308
- }
309
-
310
- const configStats = getPathStats(configPath);
311
- if (configStats?.isSymbolicLink()) {
312
- throw new Error(`${label} config path must not be a symlink`);
313
- }
314
- if (configStats && !configStats.isFile()) {
315
- throw new Error(`${label} config path must be a file`);
316
- }
317
- if (configStats) {
318
- if (configStats.nlink !== 1) {
319
- throw new Error(`${label} config path must not be hardlinked`);
320
- }
321
- const configReal = realpathSync(configPath);
322
- if (!isInsidePath(configReal, rootReal) || !isInsidePath(configReal, peaksReal)) {
323
- throw new Error(`${label} config path must stay inside the ${label.toLowerCase()} root`);
324
- }
325
- }
326
- }
327
-
328
- function validateUserConfigPaths(userRoot, peaksRoot, configPath) {
329
- validateConfigPath(userRoot, peaksRoot, configPath, 'User');
330
- }
331
-
332
- function getSafeTempOpenFlags() {
333
- const baseFlags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL;
334
- return typeof constants.O_NOFOLLOW === 'number' ? baseFlags | constants.O_NOFOLLOW : baseFlags;
335
- }
336
-
337
- function writeFileExclusively(path, content, errorMessage, validateBeforeWrite) {
338
- validateBeforeWrite();
339
- let fd = openSync(path, getSafeTempOpenFlags(), 0o600);
340
- let closeError = null;
341
- let identity = null;
342
- try {
343
- validateOpenFile(fd, path, errorMessage);
344
- validateBeforeWrite();
345
- validateOpenFile(fd, path, errorMessage);
346
- identity = createFileIdentity(path);
347
- if (identity === null) {
348
- throw new Error(errorMessage);
349
- }
350
- fchmodSync(fd, 0o600);
351
- writeFileSync(fd, content, 'utf8');
352
- const writeFd = fd;
353
- fd = null;
354
- closeSync(writeFd);
355
- return identity;
356
- } finally {
357
- if (fd !== null) {
358
- try {
359
- closeSync(fd);
360
- } catch (error) {
361
- closeError = error;
362
- }
363
- }
364
- if (closeError) {
365
- throw closeError;
366
- }
367
- }
368
- }
369
-
370
- function writeFileAtomically(configPath, content, errorMessage, validateBeforeWrite) {
371
- validateBeforeWrite();
372
-
373
- const tempPath = `${configPath}.${process.pid}.${randomUUID()}.tmp`;
374
- let fd = openSync(tempPath, getSafeTempOpenFlags(), 0o600);
375
- let renamed = false;
376
- let closeError = null;
377
- try {
378
- validateOpenFile(fd, tempPath, errorMessage);
379
- fchmodSync(fd, 0o600);
380
- writeFileSync(fd, content, 'utf8');
381
- const writeFd = fd;
382
- fd = null;
383
- closeSync(writeFd);
384
- validateBeforeWrite();
385
- const readFd = openSync(tempPath, getSafeReadOpenFlags());
386
- try {
387
- validateOpenFile(readFd, tempPath, errorMessage);
388
- } finally {
389
- closeSync(readFd);
390
- }
391
- renameSync(tempPath, configPath);
392
- renamed = true;
393
- } finally {
394
- if (fd !== null) {
395
- try {
396
- closeSync(fd);
397
- } catch (error) {
398
- closeError = error;
399
- }
400
- }
401
- try {
402
- if (!renamed && existsSync(tempPath)) {
403
- unlinkSync(tempPath);
404
- }
405
- } finally {
406
- if (closeError) {
407
- throw closeError;
408
- }
409
- }
410
- }
411
- }
412
-
413
- function writeUserConfig(userRoot, peaksRoot, configPath, content) {
414
- writeFileAtomically(configPath, content, 'User config path changed during write', () =>
415
- validateUserConfigPaths(userRoot, peaksRoot, configPath)
416
- );
417
- }
418
-
419
- function resolveProjectRoot(options) {
420
- const projectRoot = options.projectRoot ?? process.env.PEAKS_PROJECT_ROOT ?? process.env.INIT_CWD;
421
- return projectRoot ? resolve(projectRoot) : null;
422
- }
423
-
424
- /**
425
- * Slice #011: Detect the installed IDE for the postinstall dispatch layer.
426
- *
427
- * Mirrors `src/services/ide/ide-detector.ts:detectInstalledIde` (cwd heuristic)
428
- * but inlined here because `install-skills.mjs` is a plain `.mjs` script and
429
- * cannot import the TS service at runtime. The dispatch:
430
- * - Look for `.claude`, `.trae`, `.codex`, `.cursor`, `.qoder`,
431
- * `.tongyi-lingma` in the project root in that insertion order
432
- * (matches the registry's adapter order in `src/services/ide/ide-registry.ts`).
433
- * - Returns the first match, or `null` if no adapter's directory is present.
434
- *
435
- * If the resolved IDE has no `skillInstall` declared (Trae in slice 1.3.2),
436
- * the caller falls back to the legacy `~/.claude/{skills,output-styles}` path
437
- * + emits a stderr warning. The dispatch is conservative: the env-var
438
- * overrides `PEAKS_CLAUDE_SKILLS_DIR` / `PEAKS_CLAUDE_OUTPUT_STYLES_DIR`
439
- * continue to work, and the legacy default is preserved.
440
- *
441
- * 2026-09-15 (D12 fix): `hermes` and `openclaw` have install profiles in
442
- * `IDE_SKILL_INSTALL_PROFILES` but were absent from this table. A profile
443
- * that no detector can ever return is reachable only through the
444
- * every-platform fan-out — i.e. it is installed for users who do NOT have
445
- * the tool and skipped for nobody. Both are listed here now, so detection
446
- * and installation answer the same question with the same table.
447
- *
448
- * This table is ALSO the presence oracle for `isPlatformPresent` below: a
449
- * directory here in the project root means the user has that tool.
450
- */
451
- export const IDE_DETECTION_DIRS = [
452
- { id: 'claude-code', dir: '.claude' },
453
- { id: 'trae', dir: '.trae' },
454
- { id: 'trae-cn', dir: '.trae-cn' },
455
- { id: 'codex', dir: '.codex' },
456
- { id: 'cursor', dir: '.cursor' },
457
- { id: 'qoder', dir: '.qoder' },
458
- { id: 'tongyi-lingma', dir: '.tongyi-lingma' },
459
- { id: 'zcode', dir: '.zcode' },
460
- { id: 'hermes', dir: '.hermes' },
461
- { id: 'openclaw', dir: '.openclaw' }
462
- ];
463
-
464
- /**
465
- * Per-IDE skill install paths. Per peaks-loop tenet
466
- * "minimal-user-operation" (2026-06-11), the user should
467
- * never have to run a per-platform install command — the
468
- * `npm i -g peaks-loop` postinstall iterates the platforms
469
- * the user HAS and symlinks the peaks-* skill family into each
470
- * (see `isPlatformPresent`; D9/2026-09-15 made "has" load-bearing).
471
- *
472
- * 1.x had only `claude-code` (the other 5 entries were
473
- * `null`); real Trae users reported the Trae skill
474
- * directory was never populated. 2.0 fixes this by giving
475
- * every platform a canonical install path.
476
- */
477
- export const IDE_SKILL_INSTALL_PROFILES = {
478
- 'claude-code': {
479
- // `alwaysPresent` — see `isPlatformPresent`. Declared HERE, in the
480
- // vendor's own row, rather than as an `ideId === 'claude-code'` branch in
481
- // the consumer: the guard at
482
- // `tests/unit/runtime/vendor-neutral-identity-guard.test.ts` pins identity
483
- // DECISIONS to the vendor declarations, and a comparison in the consumer
484
- // is exactly the re-injection shape it exists to catch. A future vendor
485
- // opts into the same policy by setting this field.
486
- alwaysPresent: true,
487
- skillsDir: join(homedir(), '.claude', 'skills'),
488
- outputStylesDir: join(homedir(), '.claude', 'output-styles'),
489
- agentsDir: join(homedir(), '.claude', 'agents'),
490
- envVar: 'PEAKS_CLAUDE_SKILLS_DIR',
491
- outputStylesEnvVar: 'PEAKS_CLAUDE_OUTPUT_STYLES_DIR',
492
- agentsEnvVar: 'PEAKS_CLAUDE_AGENTS_DIR'
493
- },
494
- trae: {
495
- skillsDir: join(homedir(), '.trae', 'skills'),
496
- outputStylesDir: join(homedir(), '.trae', 'output-styles'),
497
- agentsDir: join(homedir(), '.trae', 'agents'),
498
- envVar: 'PEAKS_TRAE_SKILLS_DIR',
499
- outputStylesEnvVar: 'PEAKS_TRAE_OUTPUT_STYLES_DIR',
500
- agentsEnvVar: 'PEAKS_TRAE_AGENTS_DIR'
501
- },
502
- 'trae-cn': {
503
- skillsDir: join(homedir(), '.trae-cn', 'skills'),
504
- outputStylesDir: join(homedir(), '.trae-cn', 'output-styles'),
505
- agentsDir: join(homedir(), '.trae-cn', 'agents'),
506
- envVar: 'PEAKS_TRAE_CN_SKILLS_DIR',
507
- outputStylesEnvVar: 'PEAKS_TRAE_CN_OUTPUT_STYLES_DIR',
508
- agentsEnvVar: 'PEAKS_TRAE_CN_AGENTS_DIR'
509
- },
510
- codex: {
511
- skillsDir: join(homedir(), '.codex', 'skills'),
512
- outputStylesDir: join(homedir(), '.codex', 'output-styles'),
513
- agentsDir: join(homedir(), '.codex', 'agents'),
514
- envVar: 'PEAKS_CODEX_SKILLS_DIR',
515
- outputStylesEnvVar: 'PEAKS_CODEX_OUTPUT_STYLES_DIR',
516
- agentsEnvVar: 'PEAKS_CODEX_AGENTS_DIR'
517
- },
518
- cursor: {
519
- skillsDir: join(homedir(), '.cursor', 'skills'),
520
- outputStylesDir: join(homedir(), '.cursor', 'output-styles'),
521
- agentsDir: join(homedir(), '.cursor', 'agents'),
522
- envVar: 'PEAKS_CURSOR_SKILLS_DIR',
523
- outputStylesEnvVar: 'PEAKS_CURSOR_OUTPUT_STYLES_DIR',
524
- agentsEnvVar: 'PEAKS_CURSOR_AGENTS_DIR'
525
- },
526
- qoder: {
527
- skillsDir: join(homedir(), '.qoder', 'skills'),
528
- outputStylesDir: join(homedir(), '.qoder', 'output-styles'),
529
- envVar: 'PEAKS_QODER_SKILLS_DIR',
530
- outputStylesEnvVar: 'PEAKS_QODER_OUTPUT_STYLES_DIR'
531
- },
532
- 'tongyi-lingma': {
533
- skillsDir: join(homedir(), '.tongyi-lingma', 'skills'),
534
- outputStylesDir: join(homedir(), '.tongyi-lingma', 'output-styles'),
535
- envVar: 'PEAKS_TONGYI_SKILLS_DIR',
536
- outputStylesEnvVar: 'PEAKS_TONGYI_OUTPUT_STYLES_DIR'
537
- },
538
- hermes: {
539
- skillsDir: join(homedir(), '.hermes', 'skills'),
540
- outputStylesDir: join(homedir(), '.hermes', 'output-styles'),
541
- envVar: 'PEAKS_HERMES_SKILLS_DIR',
542
- outputStylesEnvVar: 'PEAKS_HERMES_OUTPUT_STYLES_DIR'
543
- },
544
- openclaw: {
545
- skillsDir: join(homedir(), '.openclaw', 'skills'),
546
- outputStylesDir: join(homedir(), '.openclaw', 'output-styles'),
547
- envVar: 'PEAKS_OPENCLAW_SKILLS_DIR',
548
- outputStylesEnvVar: 'PEAKS_OPENCLAW_OUTPUT_STYLES_DIR'
549
- },
550
- zcode: {
551
- skillsDir: join(homedir(), '.zcode', 'skills'),
552
- outputStylesDir: join(homedir(), '.zcode', 'output-styles'),
553
- agentsDir: join(homedir(), '.zcode', 'agents'),
554
- envVar: 'PEAKS_ZCODE_SKILLS_DIR',
555
- outputStylesEnvVar: 'PEAKS_ZCODE_OUTPUT_STYLES_DIR',
556
- agentsEnvVar: 'PEAKS_ZCODE_AGENTS_DIR'
557
- }
558
- };
559
-
560
- function detectInstalledIdeId(projectRoot) {
561
- if (!projectRoot) return null;
562
- for (const { id, dir } of IDE_DETECTION_DIRS) {
563
- if (existsSync(join(projectRoot, dir))) {
564
- return id;
565
- }
566
- }
567
- return null;
568
- }
569
-
570
- function resolveIdeSkillInstallProfile(ideId) {
571
- if (ideId === null) return null;
572
- return IDE_SKILL_INSTALL_PROFILES[ideId] ?? null;
573
- }
574
-
575
- /**
576
- * Is this platform actually installed FOR? (D9 fix, 2026-09-15.)
577
- *
578
- * Before this gate, the postinstall ran `mkdirSync(targetRoot, {recursive:
579
- * true})` for ALL 10 profiles unconditionally, so `npm i -g peaks-loop` created
580
- * `~/.hermes`, `~/.openclaw`, `~/.qoder`, `~/.tongyi-lingma` and `~/.zcode` in
581
- * the home of a user who has never installed those tools. The peaks-loop tenet
582
- * is "the user never has to run a per-platform install command" — it is NOT
583
- * "peaks-loop guesses which tools you have". Creating a directory for a tool
584
- * the user does not own is the tenet misread, and it is visible on disk.
585
- *
586
- * Present means EITHER:
587
- * - the tool's marker directory exists in the project root (the same
588
- * directory `detectInstalledIdeId` consults above), OR
589
- * - the tool's own home directory (`~/.<tool>`, derived from its profile)
590
- * already exists on this machine.
591
- *
592
- * `claude-code` is unconditionally present: it is peaks-loop's primary runtime
593
- * and the documented legacy install target, so a machine with no `~/.claude`
594
- * yet still gets the trees the user is installing peaks-loop for. That fact is
595
- * declared as `alwaysPresent: true` IN THE VENDOR'S OWN PROFILE ROW — not as an
596
- * `ideId === 'claude-code'` branch here. This file sits outside the adapter
597
- * layer, so an identity comparison in it is the re-injection shape
598
- * `tests/unit/runtime/vendor-neutral-identity-guard.test.ts` pins; reading the
599
- * vendor's declaration keeps the policy in one place and vendor-neutral.
600
- *
601
- * A named target bypasses this gate entirely — `options.targetRoot`,
602
- * `options.ideId`, and the `PEAKS_<TOOL>_SKILLS_DIR` env vars are callers who
603
- * have already said which platform they mean; guessing a second time there
604
- * would break the 1.x back-compat contract that slice 2026-06-12 restored.
605
- */
606
- function isPlatformPresent(ideId, profile, projectRoot) {
607
- if (profile.alwaysPresent === true) return true;
608
- const detection = IDE_DETECTION_DIRS.find((entry) => entry.id === ideId);
609
- if (
610
- detection !== undefined &&
611
- projectRoot !== null &&
612
- existsSync(join(projectRoot, detection.dir))
613
- ) {
614
- return true;
615
- }
616
- return existsSync(dirname(profile.skillsDir));
617
- }
618
-
619
- function warnUnverifiedIde(ideId, projectRoot) {
620
- process.stderr.write(
621
- `peaks install-skills: IDE '${ideId}' has no skillInstall profile declared; ` +
622
- `falling back to the legacy Claude Code path (~/.claude/skills + ~/.claude/output-styles) ` +
623
- `for project '${projectRoot}'. This is a slice #011 follow-up gap; ` +
624
- `see .peaks/memory/ide-adapter-resource-profile-framework.md.\n`
625
- );
626
- }
627
-
628
- function warnNoIdeDetected(projectRoot) {
629
- process.stderr.write(
630
- `peaks install-skills: no IDE detected in '${projectRoot ?? '(project root unknown)'}'; ` +
631
- `installing to the legacy Claude Code path (~/.claude/skills + ~/.claude/output-styles). ` +
632
- `Set PEAKS_CLAUDE_SKILLS_DIR / PEAKS_CLAUDE_OUTPUT_STYLES_DIR to override.\n`
633
- );
634
- }
635
-
636
- function writeMergedConfig(configPath, label, defaults, writeConfig) {
637
- const existing = readConfigFile(configPath, label);
638
- const next = {
639
- ...(existing === null ? defaults : mergeMissingConfigValues(existing, defaults)),
640
- version: defaults.version
641
- };
642
- const currentJson = existing === null ? null : `${JSON.stringify(existing, null, 2)}\n`;
643
- const nextJson = `${JSON.stringify(next, null, 2)}\n`;
644
-
645
- if (currentJson === nextJson) {
646
- return createConfigResult();
647
- }
648
-
649
- writeConfig(nextJson);
650
- return createConfigResult(existing === null ? { created: true } : { updated: true });
651
- }
652
-
653
- export function installUserConfig(options = {}) {
654
- if (
655
- process.env.PEAKS_SKIP_SKILL_INSTALL === '1' ||
656
- process.env.PEAKS_SKIP_USER_CONFIG_INSTALL === '1'
657
- ) {
658
- return createConfigResult({ skipped: true });
659
- }
660
-
661
- const userRoot = resolve(options.userRoot ?? homedir());
662
- const peaksRoot = resolve(userRoot, '.peaks');
663
- const configPath = resolve(peaksRoot, 'config.json');
664
- if (!isInsidePath(configPath, userRoot)) {
665
- throw new Error('User config path must stay inside the user root');
666
- }
667
-
668
- if (!existsSync(peaksRoot)) {
669
- mkdirSync(peaksRoot, { recursive: true });
670
- }
671
- validateUserConfigPaths(userRoot, peaksRoot, configPath);
672
-
673
- return writeMergedConfig(
674
- configPath,
675
- 'User',
676
- createConfigDefaults(options.packageRoot),
677
- (content) => writeUserConfig(userRoot, peaksRoot, configPath, content)
678
- );
679
- }
680
-
681
- /*
682
- * D11 (2026-09-15): `installProjectConfig` — plus its two private helpers
683
- * `writeProjectConfig` and `validateProjectConfigPaths` — was DELETED here.
684
- *
685
- * It was dead: definition + `export`, and zero call sites in the whole repo
686
- * (verified by a repo-wide grep for the identifier, excluding node_modules
687
- * and dist). The `PEAKS_SKIP_PROJECT_CONFIG_INSTALL` env var existed only to
688
- * disable it.
689
- *
690
- * Deleted rather than wired, because wiring it would be the bigger defect:
691
- * `npm i -g peaks-loop` executed from inside a user's repo would write
692
- * `<project>/.peaks/config.json` as a side effect of a GLOBAL install. The
693
- * project-level config is owned by `peaks workspace init` and the config
694
- * service at runtime; a postinstall reaching into the current working
695
- * directory to create project state is the opposite of the "minimal user
696
- * operation" tenet — an operation the user never asked for.
697
- *
698
- * The user-config sibling (`installUserConfig`, below) is live and is what
699
- * the postinstall actually calls.
700
- */
701
-
702
- export function installBundledSkills(options = {}) {
703
- const packageRoot = resolvePackageRoot(options);
704
- const skillsRoot = join(packageRoot, 'skills');
18
+ import { join, resolve } from 'node:path';
19
+ import { pathToFileURL } from 'node:url';
705
20
 
706
- if (process.env.PEAKS_SKIP_SKILL_INSTALL === '1' || !existsSync(skillsRoot)) {
707
- return createInstallResult();
708
- }
709
-
710
- // Slice #011: IDE-aware dispatch. Precedence (highest first):
711
- // 1. explicit options.targetRoot (test / hook override)
712
- // 2. options.ideId skillInstall.skillsDir (per-IDE dispatch)
713
- // 3. PEAKS_CLAUDE_SKILLS_DIR env var (legacy back-compat)
714
- // 4. detected IDE's skillInstall.skillsDir (auto-detect from projectRoot)
715
- // 5. legacy default (~/.claude/skills) (no-IDE fallback)
716
- const projectRoot = resolveProjectRoot(options);
717
- const detectedIdeId = detectInstalledIdeId(projectRoot);
718
- const detectedProfile = resolveIdeSkillInstallProfile(detectedIdeId);
719
-
720
- if (
721
- options.targetRoot === undefined &&
722
- options.ideId === undefined &&
723
- detectedProfile === null &&
724
- detectedIdeId !== null
725
- ) {
726
- warnUnverifiedIde(detectedIdeId, projectRoot ?? '(project root unknown)');
727
- }
728
- if (
729
- options.targetRoot === undefined &&
730
- options.ideId === undefined &&
731
- detectedIdeId === null &&
732
- projectRoot !== null
733
- ) {
734
- warnNoIdeDetected(projectRoot);
735
- }
736
-
737
- const profileSkillsDir = detectedProfile?.skillsDir ?? null;
738
- const targetRoot = resolve(
739
- options.targetRoot ??
740
- (options.ideId !== undefined
741
- ? (resolveIdeSkillInstallProfile(options.ideId)?.skillsDir ?? null)
742
- : null) ??
743
- process.env.PEAKS_CLAUDE_SKILLS_DIR ??
744
- profileSkillsDir ??
745
- join(homedir(), '.claude', 'skills')
746
- );
747
-
748
- const installed = [];
749
- const skipped = [];
750
- mkdirSync(targetRoot, { recursive: true });
751
- const validateSkillsRoot = createInstallRootValidator(targetRoot, 'Peaks skills');
752
-
753
- // After the v2.13.0 bee-demote (commit de0872b), the role skills
754
- // (peaks-prd, peaks-rd, peaks-qa, peaks-ui, peaks-sc, peaks-txt)
755
- // moved under `skills/bee/<role>/` while user-facing helpers stayed
756
- // at `skills/<name>/`. Build the install candidate list by walking
757
- // top-level entries (user-facing helpers) AND `skills/bee/<role>`
758
- // (demoted role skills). Each candidate is installed under its
759
- // basename so the postinstall links `~/.claude/skills/peaks-rd`
760
- // to `skills/bee/peaks-rd` (rather than `skills/bee`).
761
- const beeRoot = join(skillsRoot, 'bee');
762
- /** @type {Array<{ skillName: string, sourcePath: string }>} */
763
- const candidates = [];
764
- for (const skillName of readdirSync(skillsRoot)) {
765
- if (skillName === 'bee') continue;
766
- const sourcePath = join(skillsRoot, skillName);
767
- const skillFile = join(sourcePath, 'SKILL.md');
768
- if (!lstatSync(sourcePath).isDirectory() || !existsSync(skillFile)) continue;
769
- candidates.push({ skillName, sourcePath });
770
- }
771
- if (existsSync(beeRoot) && lstatSync(beeRoot).isDirectory()) {
772
- for (const skillName of readdirSync(beeRoot)) {
773
- const sourcePath = join(beeRoot, skillName);
774
- const skillFile = join(sourcePath, 'SKILL.md');
775
- if (!lstatSync(sourcePath).isDirectory() || !existsSync(skillFile)) continue;
776
- // De-dupe: a top-level helper with the same name wins (preserves
777
- // the existing install contract for any helper that shares a name
778
- // with a demoted role skill, e.g. legacy overlap).
779
- if (candidates.some((c) => c.skillName === skillName)) continue;
780
- candidates.push({ skillName, sourcePath });
781
- }
782
- }
783
-
784
- for (const { skillName, sourcePath } of candidates) {
785
- const targetPath = join(targetRoot, skillName);
786
-
787
- const current = getPathStats(targetPath);
788
- if (current) {
789
- const managedTarget = getManagedTarget(targetPath);
790
- const linkTarget = current.isSymbolicLink() ? readlinkSync(targetPath) : null;
791
- const linkTargetExists = typeof linkTarget === 'string' && existsSync(linkTarget);
792
- if (linkTarget === sourcePath && linkTargetExists) {
793
- installed.push(skillName);
794
- continue;
795
- }
796
- // Managed Junctions may point into an ephemeral host worktree. If that
797
- // worktree was removed, Windows keeps the Junction entry but its target
798
- // no longer resolves. Repair only when reconciliation was explicitly
799
- // requested; normal postinstall keeps its existing ownership behavior.
800
- if (
801
- (current.isSymbolicLink() || isBrokenSymlink(current, targetPath)) &&
802
- (managedTarget === linkTarget ||
803
- (options.reconcileJunctions === true && managedTarget !== null && !linkTargetExists))
804
- ) {
805
- validateSkillsRoot();
806
- unlinkSync(targetPath);
807
- validateSkillsRoot();
808
- unlinkSync(`${targetPath}.peaks-managed`);
809
- } else {
810
- skipped.push(skillName);
811
- continue;
812
- }
813
- }
814
-
815
- validateSkillsRoot();
816
- symlinkSync(sourcePath, targetPath, process.platform === 'win32' ? 'junction' : 'dir');
817
- try {
818
- validateSkillsRoot();
819
- markManagedPeaksLink(targetPath, sourcePath);
820
- } catch (error) {
821
- validateSkillsRoot();
822
- const created = getPathStats(targetPath);
823
- if (created?.isSymbolicLink() && readlinkSync(targetPath) === sourcePath) {
824
- unlinkSync(targetPath);
825
- }
826
- throw error;
827
- }
828
- installed.push(skillName);
829
- }
830
-
831
- return { installed, skipped };
832
- }
833
-
834
- /**
835
- * DISPATCH STRATEGY — the three paths in this file, and why they differ
836
- * (D10, written down 2026-09-15).
837
- *
838
- * This script installs three kinds of asset, and each one resolves its target
839
- * by a different rule. That was undocumented and untested; it is now
840
- * documented here and each rule is stated with its reason.
841
- *
842
- * 1. SKILLS (`installBundledSkillsForAllPlatforms`)
843
- * Fan out to every platform the user HAS (`isPlatformPresent`).
844
- * Reason: a skill directory is per-tool; the same skill is legitimately
845
- * wanted in several tools at once, and peaks cannot know which tool the
846
- * user will open next. Fan-out is the tenet; presence is the licence.
847
- *
848
- * 2. AGENTS (`installBundledAgentsForAllPlatforms`)
849
- * Fan out to present platforms, INTERSECTED with the profiles that
850
- * declare `agentsDir`. Reason: sub-agent loaders are not a universal
851
- * concept — only 6 of 10 profiles have one. The intersection is the fan
852
- * of (1) with a capability filter, not a third rule.
853
- *
854
- * 3. OUTPUT STYLES (`installBundledOutputStyles`, this function)
855
- * ONE target: the IDE detected in the project root, else the legacy
856
- * `~/.claude/output-styles`. Reason: an output style is not a
857
- * per-tool asset — it is registered as THE active style for the
858
- * session by writing a single `outputStyle` key into
859
- * `~/.claude/settings.json` (`installBundledOutputStyleDefault`). A
860
- * second copy in `~/.trae/output-styles` would be a file nothing reads
861
- * and a setting no one consults; fanning it out would be storing the
862
- * same answer in ten places and reading it from one.
863
- *
864
- * So: (1) and (2) share one predicate and differ only by capability; (3) is
865
- * deliberately single-target, and this comment is the reason the brief asked
866
- * for. If a future platform needs a different rule, state it here.
867
- */
868
- export function installBundledOutputStyles(options = {}) {
869
- const packageRoot = resolvePackageRoot(options);
870
- const outputStylesRoot = join(packageRoot, 'output-styles');
871
-
872
- if (process.env.PEAKS_SKIP_SKILL_INSTALL === '1' || !existsSync(outputStylesRoot)) {
873
- return createInstallResult();
874
- }
875
-
876
- // Slice #011: IDE-aware dispatch. Same precedence as installBundledSkills.
877
- const projectRoot = resolveProjectRoot(options);
878
- const detectedIdeId = detectInstalledIdeId(projectRoot);
879
- const detectedProfile = resolveIdeSkillInstallProfile(detectedIdeId);
880
-
881
- const profileOutputStylesDir = detectedProfile?.outputStylesDir ?? null;
882
- const targetRoot = resolve(
883
- options.targetRoot ??
884
- (options.ideId !== undefined
885
- ? (resolveIdeSkillInstallProfile(options.ideId)?.outputStylesDir ?? null)
886
- : null) ??
887
- process.env.PEAKS_CLAUDE_OUTPUT_STYLES_DIR ??
888
- profileOutputStylesDir ??
889
- join(homedir(), '.claude', 'output-styles')
890
- );
891
-
892
- const installed = [];
893
- const skipped = [];
894
- mkdirSync(targetRoot, { recursive: true });
895
- const validateOutputStylesRoot = createInstallRootValidator(targetRoot, 'Peaks output styles');
896
-
897
- for (const outputStyleName of readdirSync(outputStylesRoot)) {
898
- const sourcePath = join(outputStylesRoot, outputStyleName);
899
- const targetPath = join(targetRoot, outputStyleName);
900
-
901
- if (!lstatSync(sourcePath).isFile() || !outputStyleName.endsWith('.md')) {
902
- continue;
903
- }
904
-
905
- const current = getPathStats(targetPath);
906
- if (current) {
907
- const managedTarget = getManagedTarget(targetPath);
908
- const managedTargetIdentity = getManagedPeaksOutputStyleIdentity(
909
- managedTarget,
910
- targetPath,
911
- sourcePath,
912
- outputStyleName
913
- );
914
- if (isSameFileIdentity(targetPath, managedTargetIdentity)) {
915
- validateOutputStylesRoot();
916
- if (!isSameFileIdentity(targetPath, managedTargetIdentity)) {
917
- throw new Error('Peaks output style path changed during unlink');
918
- }
919
- unlinkSync(targetPath);
920
- validateOutputStylesRoot();
921
- unlinkSync(`${targetPath}.peaks-managed`);
922
- } else {
923
- skipped.push(outputStyleName);
924
- continue;
925
- }
926
- }
927
-
928
- const markerPath = `${targetPath}.peaks-managed`;
929
- validateManagedMarkerPath(markerPath);
930
- if (!current && existsSync(markerPath)) {
931
- validateOutputStylesRoot();
932
- unlinkSync(markerPath);
933
- }
934
- const createdTargetIdentity = writeFileExclusively(
935
- targetPath,
936
- readPackageSourceFile(sourcePath),
937
- 'Peaks output style path changed during write',
938
- validateOutputStylesRoot
939
- );
940
- try {
941
- writeFileExclusively(
942
- markerPath,
943
- createManagedOutputStyleMarker(sourcePath, outputStyleName),
944
- 'Peaks managed marker path changed during write',
945
- () => {
946
- validateOutputStylesRoot();
947
- validateManagedMarkerPath(markerPath);
948
- }
949
- );
950
- } catch (error) {
951
- validateOutputStylesRoot();
952
- if (isSameFileIdentity(targetPath, createdTargetIdentity)) {
953
- unlinkSync(targetPath);
954
- }
955
- throw error;
956
- }
957
- installed.push(outputStyleName);
958
- }
959
-
960
- return { installed, skipped };
961
- }
962
-
963
- /**
964
- * Slice 2026-08-02 — auto-register bundled output style.
965
- *
966
- * Real user feedback (2026-08-02): `npm i -g peaks-loop@latest` on a
967
- * fresh 0-1 project copied `peaks-skill-swarm.md` into
968
- * `~/.claude/output-styles/` but never wrote
969
- * `outputStyle: 'peaks-skill-swarm'` into `~/.claude/settings.json`.
970
- * Result: Claude Code loaded no Peaks output style in new sessions.
971
- *
972
- * The fix: when `peaks-skill-swarm.md` is present in the bundled output
973
- * styles directory AND `~/.claude/settings.json` does NOT yet declare
974
- * `outputStyle`, merge in `outputStyle: 'peaks-skill-swarm'` while
975
- * preserving every other key. If the user already set `outputStyle`,
976
- * leave it alone — the user is the source of truth.
977
- *
978
- * Resolution precedence:
979
- * 1. options.settingsFile (explicit override / test hook)
980
- * 2. PEAKS_CLAUDE_SETTINGS_FILE env var (CI override)
981
- * 3. homedir-relative `<homedir>/.claude/settings.json` (default)
982
- *
983
- * Soft-fail contract: every error path (missing file, malformed JSON,
984
- * missing bundled style file, permission denied) is logged to stderr
985
- * and returns `{ skipped: true, ... }` instead of throwing. The
986
- * postinstall must never fail on this step because the bundled file
987
- * itself was already written successfully.
988
- */
989
- function resolveSettingsFilePath(options = {}) {
990
- if (typeof options.settingsFile === 'string' && options.settingsFile.length > 0) {
991
- return resolve(options.settingsFile);
992
- }
993
- const envOverride = process.env.PEAKS_CLAUDE_SETTINGS_FILE;
994
- if (typeof envOverride === 'string' && envOverride.length > 0) {
995
- return resolve(envOverride);
996
- }
997
- return resolve(homedir(), '.claude', 'settings.json');
998
- }
999
-
1000
- export function installBundledOutputStyleDefault(options = {}) {
1001
- if (
1002
- process.env.PEAKS_SKIP_SKILL_INSTALL === '1' ||
1003
- process.env.PEAKS_SKIP_OUTPUT_STYLE_DEFAULT === '1'
1004
- ) {
1005
- return { skipped: true, reason: 'PEAKS_SKIP_OUTPUT_STYLE_DEFAULT=1' };
1006
- }
1007
-
1008
- const bundledStylesDir = resolve(
1009
- options.targetRoot ??
1010
- process.env.PEAKS_CLAUDE_OUTPUT_STYLES_DIR ??
1011
- join(homedir(), '.claude', 'output-styles')
1012
- );
1013
- const settingsPath = resolveSettingsFilePath(options);
1014
- const bundledStyleName = 'peaks-skill-swarm.md';
1015
- const bundledStylePath = join(bundledStylesDir, bundledStyleName);
1016
-
1017
- // Read the existing settings.json (if any) FIRST so a malformed file
1018
- // surfaces as a parse error (more actionable to the user than the
1019
- // generic "bundled style not present" message). Malformed JSON is a
1020
- // user-authored file we MUST NOT clobber — log and skip.
1021
- let existing = null;
1022
- if (existsSync(settingsPath)) {
1023
- const stats = getPathStats(settingsPath);
1024
- if (!stats || !stats.isFile() || stats.isSymbolicLink() || stats.nlink !== 1) {
1025
- process.stderr.write(
1026
- `peaks install-skills: refusing to overwrite non-regular settings.json at ${settingsPath}\n`
1027
- );
1028
- return { skipped: true, reason: 'settings.json is not a regular file' };
1029
- }
1030
- try {
1031
- const raw = readFileSafely(settingsPath, 'Claude settings.json path changed during read');
1032
- const parsed = JSON.parse(raw);
1033
- if (!isPlainObject(parsed)) {
1034
- process.stderr.write(
1035
- `peaks install-skills: refusing to overwrite settings.json that is not a JSON object at ${settingsPath}\n`
1036
- );
1037
- return { skipped: true, reason: 'settings.json is not a JSON object' };
1038
- }
1039
- existing = parsed;
1040
- } catch (error) {
1041
- const message = error instanceof Error ? error.message : String(error);
1042
- process.stderr.write(
1043
- `peaks install-skills: failed to parse settings.json at ${settingsPath}: ${message}; leaving untouched\n`
1044
- );
1045
- return { skipped: true, reason: 'settings.json parse error' };
1046
- }
1047
- }
1048
-
1049
- // Pre-condition: the bundled style file must be present in the
1050
- // dispatched target. If it's not, we MUST NOT inject
1051
- // `outputStyle: 'peaks-skill-swarm'` — Claude Code would then fail
1052
- // to load the style and fall back to default anyway, leaving the
1053
- // user with broken state. Skipping is the safe default.
1054
- if (!existsSync(bundledStylePath)) {
1055
- return { skipped: true, reason: `bundled output style not present at ${bundledStylePath}` };
1056
- }
1057
-
1058
- // User-authored outputStyle wins — never overwrite.
1059
- if (
1060
- existing !== null &&
1061
- typeof existing.outputStyle === 'string' &&
1062
- existing.outputStyle.length > 0
1063
- ) {
1064
- return {
1065
- skipped: true,
1066
- reason: `user-defined outputStyle already set: ${existing.outputStyle}`
1067
- };
1068
- }
1069
-
1070
- const next =
1071
- existing === null
1072
- ? { outputStyle: 'peaks-skill-swarm' }
1073
- : { ...existing, outputStyle: 'peaks-skill-swarm' };
1074
-
1075
- const existingJson = existing === null ? null : `${JSON.stringify(existing, null, 2)}\n`;
1076
- const nextJson = `${JSON.stringify(next, null, 2)}\n`;
1077
- if (existingJson === nextJson) {
1078
- return { skipped: true, reason: 'no change' };
1079
- }
1080
-
1081
- try {
1082
- writeFileAtomically(
1083
- settingsPath,
1084
- nextJson,
1085
- 'Claude settings.json path changed during write',
1086
- () => {
1087
- if (!existsSync(settingsPath)) return;
1088
- const stats = getPathStats(settingsPath);
1089
- if (!stats || !stats.isFile() || stats.isSymbolicLink() || stats.nlink !== 1) {
1090
- throw new Error('Claude settings.json path is not a regular file');
1091
- }
1092
- }
1093
- );
1094
- } catch (error) {
1095
- const message = error instanceof Error ? error.message : String(error);
1096
- process.stderr.write(
1097
- `peaks install-skills: failed to write settings.json at ${settingsPath}: ${message}\n`
1098
- );
1099
- return { skipped: true, reason: 'write error', error: message };
1100
- }
1101
-
1102
- return {
1103
- installed: true,
1104
- created: existing === null,
1105
- updated: existing !== null,
1106
- settingsPath,
1107
- outputStyle: 'peaks-skill-swarm'
1108
- };
1109
- }
1110
-
1111
- /**
1112
- * Slice 7/7 — bundled agents (Claude Code sub-agent prompts).
1113
- *
1114
- * Mirrors `installBundledOutputStyles` but writes to
1115
- * `~/.claude/agents/` (Claude Code's sub-agent loader directory). Each
1116
- * agent file ships under `agents/*.md` in the peaks-loop tarball and is
1117
- * copied on `npm i -g peaks-loop@latest` with content-hash drift detection
1118
- * via a `.peaks-managed` marker (SHA-256 of the source content).
1119
- *
1120
- * Drift policy (mirrors output-styles):
1121
- * - file missing, marker missing → install (write file + marker)
1122
- * - file missing, marker present → install (replace stale marker)
1123
- * - file present, marker present,
1124
- * SHA matches, sourcePath matches → skip (idempotent re-install)
1125
- * - file present, marker present,
1126
- * SHA matches, sourcePath differs → skip (stale package path;
1127
- * preserve user's local file)
1128
- * - file present, marker present,
1129
- * SHA differs → overwrite (package upgrade)
1130
- * - file present, no marker → skip (user-authored file;
1131
- * preserve)
1132
- */
1133
- function createManagedAgentMarker(sourcePath, agentName) {
1134
- const content = readPackageSourceFile(sourcePath);
1135
- return `${JSON.stringify({ version: 1, kind: 'agent', agentName, sourcePath, contentSha256: hashContent(content) })}\n`;
1136
- }
1137
-
1138
- function parseManagedAgentMarker(managedTarget) {
1139
- if (managedTarget === null) return null;
1140
- try {
1141
- const marker = JSON.parse(managedTarget);
1142
- if (
1143
- marker?.version !== 1 ||
1144
- marker?.kind !== 'agent' ||
1145
- typeof marker.agentName !== 'string' ||
1146
- typeof marker.sourcePath !== 'string' ||
1147
- typeof marker.contentSha256 !== 'string'
1148
- ) {
1149
- return null;
1150
- }
1151
- return marker;
1152
- } catch {
1153
- return null;
1154
- }
1155
- }
1156
-
1157
- function isTrustedAgentSource(marker, sourcePath, agentName) {
1158
- return (
1159
- marker.agentName === agentName &&
1160
- resolve(marker.sourcePath) === resolve(sourcePath) &&
1161
- basename(resolve(marker.sourcePath)) === agentName
1162
- );
1163
- }
1164
-
1165
- function getManagedPeaksAgentIdentity(managedTarget, targetPath, sourcePath, agentName) {
1166
- const marker = parseManagedAgentMarker(managedTarget);
1167
- const sourceHash = hashContent(readPackageSourceFile(sourcePath));
1168
- if (
1169
- marker === null ||
1170
- !isTrustedAgentSource(marker, sourcePath, agentName) ||
1171
- !existsSync(targetPath) ||
1172
- hashFileContent(targetPath) !== sourceHash ||
1173
- marker.contentSha256 !== sourceHash
1174
- ) {
1175
- return null;
1176
- }
1177
- return createFileIdentity(targetPath);
1178
- }
1179
-
1180
- export function installBundledAgents(options = {}) {
1181
- const packageRoot = resolvePackageRoot(options);
1182
- const agentsRoot = join(packageRoot, 'agents');
1183
-
1184
- // Per-IDE env-var override (claude-code only today): PEAKS_CLAUDE_AGENTS_DIR.
1185
- // Universal escape hatch: PEAKS_SKIP_AGENT_INSTALL=1 (parallel to
1186
- // PEAKS_SKIP_SKILL_INSTALL).
1187
- if (
1188
- process.env.PEAKS_SKIP_SKILL_INSTALL === '1' ||
1189
- process.env.PEAKS_SKIP_AGENT_INSTALL === '1' ||
1190
- !existsSync(agentsRoot)
1191
- ) {
1192
- return createInstallResult();
1193
- }
1194
-
1195
- // Slice #011: IDE-aware dispatch. Same precedence as installBundledOutputStyles.
1196
- const projectRoot = resolveProjectRoot(options);
1197
- const detectedIdeId = detectInstalledIdeId(projectRoot);
1198
- const detectedProfile = resolveIdeSkillInstallProfile(detectedIdeId);
1199
-
1200
- const profileAgentsDir = detectedProfile?.agentsDir ?? null;
1201
- const targetRoot = resolve(
1202
- options.targetRoot ??
1203
- (options.ideId !== undefined
1204
- ? (resolveIdeSkillInstallProfile(options.ideId)?.agentsDir ?? null)
1205
- : null) ??
1206
- process.env.PEAKS_CLAUDE_AGENTS_DIR ??
1207
- profileAgentsDir ??
1208
- join(homedir(), '.claude', 'agents')
1209
- );
1210
-
1211
- const installed = [];
1212
- const skipped = [];
1213
- mkdirSync(targetRoot, { recursive: true });
1214
- const validateAgentsRoot = createInstallRootValidator(targetRoot, 'Peaks agents');
1215
-
1216
- for (const agentFileName of readdirSync(agentsRoot)) {
1217
- const sourcePath = join(agentsRoot, agentFileName);
1218
- const targetPath = join(targetRoot, agentFileName);
1219
-
1220
- if (!lstatSync(sourcePath).isFile() || !agentFileName.endsWith('.md')) {
1221
- continue;
1222
- }
1223
-
1224
- const current = getPathStats(targetPath);
1225
- if (current) {
1226
- const managedTarget = getManagedTarget(targetPath);
1227
- const managedTargetIdentity = getManagedPeaksAgentIdentity(
1228
- managedTarget,
1229
- targetPath,
1230
- sourcePath,
1231
- agentFileName
1232
- );
1233
- if (isSameFileIdentity(targetPath, managedTargetIdentity)) {
1234
- validateAgentsRoot();
1235
- if (!isSameFileIdentity(targetPath, managedTargetIdentity)) {
1236
- throw new Error('Peaks agent path changed during unlink');
1237
- }
1238
- unlinkSync(targetPath);
1239
- validateAgentsRoot();
1240
- unlinkSync(`${targetPath}.peaks-managed`);
1241
- } else {
1242
- skipped.push(agentFileName);
1243
- continue;
1244
- }
1245
- }
1246
-
1247
- const markerPath = `${targetPath}.peaks-managed`;
1248
- validateManagedMarkerPath(markerPath);
1249
- if (!current && existsSync(markerPath)) {
1250
- validateAgentsRoot();
1251
- unlinkSync(markerPath);
1252
- }
1253
- const createdTargetIdentity = writeFileExclusively(
1254
- targetPath,
1255
- readPackageSourceFile(sourcePath),
1256
- 'Peaks agent path changed during write',
1257
- validateAgentsRoot
1258
- );
1259
- try {
1260
- writeFileExclusively(
1261
- markerPath,
1262
- createManagedAgentMarker(sourcePath, agentFileName),
1263
- 'Peaks managed marker path changed during write',
1264
- () => {
1265
- validateAgentsRoot();
1266
- validateManagedMarkerPath(markerPath);
1267
- }
1268
- );
1269
- } catch (error) {
1270
- validateAgentsRoot();
1271
- if (isSameFileIdentity(targetPath, createdTargetIdentity)) {
1272
- unlinkSync(targetPath);
1273
- }
1274
- throw error;
1275
- }
1276
- installed.push(agentFileName);
1277
- }
1278
-
1279
- return { installed, skipped };
1280
- }
21
+ import { installBundledAgents, installBundledSkills } from './install-skills-bundles.mjs';
22
+ import {
23
+ IDE_SKILL_INSTALL_PROFILES,
24
+ isPlatformPresent,
25
+ resolveProjectRoot
26
+ } from './install-skills-ide.mjs';
27
+ import { installBundledOutputStyles } from './install-skills-output-styles.mjs';
28
+ import { installBundledOutputStyleDefault } from './install-skills-output-style-default.mjs';
29
+ import { reportCopyFallbacks, reportLeftAlone } from './install-skills-report.mjs';
30
+ import { createConfigResult, installUserConfig } from './install-skills-user-config.mjs';
31
+
32
+ // THE PUBLIC SURFACE, re-exported so no importer changes. IDE_DETECTION_DIRS is
33
+ // not read here, so it is re-exported without a local binding.
34
+ export { IDE_DETECTION_DIRS } from './install-skills-ide.mjs';
35
+ export { IDE_SKILL_INSTALL_PROFILES };
36
+ export { installBundledSkills, installBundledAgents };
37
+ export { installUserConfig };
38
+ export { installBundledOutputStyles, installBundledOutputStyleDefault };
1281
39
 
1282
40
  /**
1283
41
  * Per-platform fan-out — iterate the platforms the user HAS and call
@@ -1320,11 +78,14 @@ export function installBundledAgentsForAllPlatforms(options = {}) {
1320
78
  ? { ...options, ideId, targetRoot: options.targetRoot }
1321
79
  : { ...options, ideId };
1322
80
  const result = installBundledAgents(platformOpts);
81
+ reportCopyFallbacks(`agents in ${profile.agentsDir}`, result.fallbacks);
82
+ reportLeftAlone(`agents in ${profile.agentsDir}`, result.skipped);
1323
83
  perPlatform.push({
1324
84
  ideId,
1325
85
  agentsDir: profile.agentsDir,
1326
86
  installed: result.installed,
1327
- skipped: result.skipped
87
+ skipped: result.skipped,
88
+ fallbacks: result.fallbacks
1328
89
  });
1329
90
  } catch (err) {
1330
91
  const message = err instanceof Error ? err.message : String(err);
@@ -1465,6 +226,7 @@ if (
1465
226
  `Peaks output styles skipped because local files already exist: ${outputStylesResult.skipped.join(', ')}\n`
1466
227
  );
1467
228
  }
229
+ reportCopyFallbacks('output styles', outputStylesResult.fallbacks);
1468
230
 
1469
231
  // Slice 2026-08-02 — auto-register bundled output style.
1470
232
  //