@winspan/claude-forge 9.2.0 → 9.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/DEVELOPMENT.md +80 -19
  2. package/README.md +13 -6
  3. package/dist/catalogs/agents.json +19 -24
  4. package/dist/catalogs/skills.json +139 -27
  5. package/dist/claudemd/templates/swarm-protocol.md +1 -1
  6. package/dist/cli/commands/agent.d.ts +169 -0
  7. package/dist/cli/commands/agent.d.ts.map +1 -0
  8. package/dist/cli/commands/agent.js +690 -0
  9. package/dist/cli/commands/agent.js.map +1 -0
  10. package/dist/cli/commands/codegraph.d.ts +17 -0
  11. package/dist/cli/commands/codegraph.d.ts.map +1 -0
  12. package/dist/cli/commands/codegraph.js +263 -0
  13. package/dist/cli/commands/codegraph.js.map +1 -0
  14. package/dist/cli/commands/decisions.d.ts.map +1 -1
  15. package/dist/cli/commands/decisions.js +46 -9
  16. package/dist/cli/commands/decisions.js.map +1 -1
  17. package/dist/cli/commands/executions.d.ts.map +1 -1
  18. package/dist/cli/commands/executions.js +2 -1
  19. package/dist/cli/commands/executions.js.map +1 -1
  20. package/dist/cli/commands/insights-goal-check.d.ts +5 -1
  21. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -1
  22. package/dist/cli/commands/insights-goal-check.js +15 -15
  23. package/dist/cli/commands/insights-goal-check.js.map +1 -1
  24. package/dist/cli/commands/knowledge.d.ts +51 -0
  25. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  26. package/dist/cli/commands/knowledge.js +202 -29
  27. package/dist/cli/commands/knowledge.js.map +1 -1
  28. package/dist/cli/commands/loop.d.ts +95 -0
  29. package/dist/cli/commands/loop.d.ts.map +1 -0
  30. package/dist/cli/commands/loop.js +408 -0
  31. package/dist/cli/commands/loop.js.map +1 -0
  32. package/dist/cli/commands/maintenance.d.ts +33 -0
  33. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  34. package/dist/cli/commands/maintenance.js +75 -0
  35. package/dist/cli/commands/maintenance.js.map +1 -0
  36. package/dist/cli/commands/mcp.d.ts +23 -0
  37. package/dist/cli/commands/mcp.d.ts.map +1 -1
  38. package/dist/cli/commands/mcp.js +82 -0
  39. package/dist/cli/commands/mcp.js.map +1 -1
  40. package/dist/cli/commands/skills.d.ts +131 -0
  41. package/dist/cli/commands/skills.d.ts.map +1 -1
  42. package/dist/cli/commands/skills.js +409 -9
  43. package/dist/cli/commands/skills.js.map +1 -1
  44. package/dist/cli/commands/stats.d.ts.map +1 -1
  45. package/dist/cli/commands/stats.js +9 -2
  46. package/dist/cli/commands/stats.js.map +1 -1
  47. package/dist/cli/index.js +8 -0
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/core/constants.d.ts +37 -0
  50. package/dist/core/constants.d.ts.map +1 -1
  51. package/dist/core/constants.js +43 -0
  52. package/dist/core/constants.js.map +1 -1
  53. package/dist/core/diagnostics/checks.d.ts.map +1 -1
  54. package/dist/core/diagnostics/checks.js +2 -1
  55. package/dist/core/diagnostics/checks.js.map +1 -1
  56. package/dist/core/diagnostics/daemon-status.d.ts +1 -1
  57. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -1
  58. package/dist/core/diagnostics/daemon-status.js +1 -1
  59. package/dist/core/diagnostics/daemon-status.js.map +1 -1
  60. package/dist/core/diagnostics/entropy-checks.d.ts +3 -2
  61. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -1
  62. package/dist/core/diagnostics/entropy-checks.js +10 -5
  63. package/dist/core/diagnostics/entropy-checks.js.map +1 -1
  64. package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
  65. package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
  66. package/dist/core/diagnostics/heartbeat-reader.js +50 -0
  67. package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
  68. package/dist/core/event-fields.d.ts +27 -0
  69. package/dist/core/event-fields.d.ts.map +1 -1
  70. package/dist/core/event-fields.js +43 -0
  71. package/dist/core/event-fields.js.map +1 -1
  72. package/dist/core/governance/global-inject.d.ts +34 -4
  73. package/dist/core/governance/global-inject.d.ts.map +1 -1
  74. package/dist/core/governance/global-inject.js +80 -25
  75. package/dist/core/governance/global-inject.js.map +1 -1
  76. package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
  77. package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
  78. package/dist/core/insights/agent-anchor-guard.js +119 -0
  79. package/dist/core/insights/agent-anchor-guard.js.map +1 -0
  80. package/dist/core/insights/agent-distill-context.d.ts +55 -0
  81. package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
  82. package/dist/core/insights/agent-distill-context.js +146 -0
  83. package/dist/core/insights/agent-distill-context.js.map +1 -0
  84. package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
  85. package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
  86. package/dist/core/insights/agent-distill-spawn.js +179 -0
  87. package/dist/core/insights/agent-distill-spawn.js.map +1 -0
  88. package/dist/core/insights/agent-drift.d.ts +66 -0
  89. package/dist/core/insights/agent-drift.d.ts.map +1 -0
  90. package/dist/core/insights/agent-drift.js +109 -0
  91. package/dist/core/insights/agent-drift.js.map +1 -0
  92. package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
  93. package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
  94. package/dist/core/insights/agent-evolution-sources.js +36 -0
  95. package/dist/core/insights/agent-evolution-sources.js.map +1 -0
  96. package/dist/core/insights/agent-health.d.ts +142 -0
  97. package/dist/core/insights/agent-health.d.ts.map +1 -0
  98. package/dist/core/insights/agent-health.js +296 -0
  99. package/dist/core/insights/agent-health.js.map +1 -0
  100. package/dist/core/insights/agent-patch-apply.d.ts +45 -0
  101. package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
  102. package/dist/core/insights/agent-patch-apply.js +165 -0
  103. package/dist/core/insights/agent-patch-apply.js.map +1 -0
  104. package/dist/core/insights/agent-suggest.d.ts +128 -0
  105. package/dist/core/insights/agent-suggest.d.ts.map +1 -0
  106. package/dist/core/insights/agent-suggest.js +284 -0
  107. package/dist/core/insights/agent-suggest.js.map +1 -0
  108. package/dist/core/insights/coverage-tiers.d.ts +46 -0
  109. package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
  110. package/dist/core/insights/coverage-tiers.js +95 -0
  111. package/dist/core/insights/coverage-tiers.js.map +1 -0
  112. package/dist/{daemon/services → core/insights}/experience-extractor.d.ts +0 -7
  113. package/dist/core/insights/experience-extractor.d.ts.map +1 -0
  114. package/dist/{daemon/services → core/insights}/experience-extractor.js +5 -9
  115. package/dist/core/insights/experience-extractor.js.map +1 -0
  116. package/dist/{daemon/services → core/insights}/violation-reporter.d.ts +20 -1
  117. package/dist/core/insights/violation-reporter.d.ts.map +1 -0
  118. package/dist/{daemon/services → core/insights}/violation-reporter.js +56 -4
  119. package/dist/core/insights/violation-reporter.js.map +1 -0
  120. package/dist/core/loop/loop-engine.d.ts +140 -0
  121. package/dist/core/loop/loop-engine.d.ts.map +1 -0
  122. package/dist/core/loop/loop-engine.js +266 -0
  123. package/dist/core/loop/loop-engine.js.map +1 -0
  124. package/dist/core/queue/index.d.ts.map +1 -1
  125. package/dist/core/queue/index.js +2 -1
  126. package/dist/core/queue/index.js.map +1 -1
  127. package/dist/core/storage/base.d.ts +159 -0
  128. package/dist/core/storage/base.d.ts.map +1 -1
  129. package/dist/core/storage/base.js +523 -0
  130. package/dist/core/storage/base.js.map +1 -1
  131. package/dist/core/storage/codegraph-types.d.ts +79 -0
  132. package/dist/core/storage/codegraph-types.d.ts.map +1 -0
  133. package/dist/core/storage/codegraph-types.js +14 -0
  134. package/dist/core/storage/codegraph-types.js.map +1 -0
  135. package/dist/core/storage/codegraph.d.ts +186 -0
  136. package/dist/core/storage/codegraph.d.ts.map +1 -0
  137. package/dist/core/storage/codegraph.js +452 -0
  138. package/dist/core/storage/codegraph.js.map +1 -0
  139. package/dist/core/storage/decisions.d.ts +30 -5
  140. package/dist/core/storage/decisions.d.ts.map +1 -1
  141. package/dist/core/storage/decisions.js +45 -13
  142. package/dist/core/storage/decisions.js.map +1 -1
  143. package/dist/core/storage/events.d.ts +127 -0
  144. package/dist/core/storage/events.d.ts.map +1 -1
  145. package/dist/core/storage/events.js +318 -3
  146. package/dist/core/storage/events.js.map +1 -1
  147. package/dist/core/storage/feedback.d.ts +3 -23
  148. package/dist/core/storage/feedback.d.ts.map +1 -1
  149. package/dist/core/storage/feedback.js +37 -38
  150. package/dist/core/storage/feedback.js.map +1 -1
  151. package/dist/core/storage/injections.d.ts +40 -0
  152. package/dist/core/storage/injections.d.ts.map +1 -1
  153. package/dist/core/storage/injections.js +69 -0
  154. package/dist/core/storage/injections.js.map +1 -1
  155. package/dist/core/storage/knowledge.d.ts +226 -0
  156. package/dist/core/storage/knowledge.d.ts.map +1 -1
  157. package/dist/core/storage/knowledge.js +391 -4
  158. package/dist/core/storage/knowledge.js.map +1 -1
  159. package/dist/core/storage/pipeline-rollup.d.ts +1 -7
  160. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -1
  161. package/dist/core/storage/pipeline-rollup.js +18 -57
  162. package/dist/core/storage/pipeline-rollup.js.map +1 -1
  163. package/dist/core/storage/routing.d.ts +34 -0
  164. package/dist/core/storage/routing.d.ts.map +1 -1
  165. package/dist/core/storage/routing.js +92 -2
  166. package/dist/core/storage/routing.js.map +1 -1
  167. package/dist/core/storage/rows.d.ts +5 -25
  168. package/dist/core/storage/rows.d.ts.map +1 -1
  169. package/dist/core/storage/schema.sql +92 -27
  170. package/dist/core/storage/sessions.d.ts.map +1 -1
  171. package/dist/core/storage/sessions.js +2 -1
  172. package/dist/core/storage/sessions.js.map +1 -1
  173. package/dist/core/storage/skills.d.ts +159 -0
  174. package/dist/core/storage/skills.d.ts.map +1 -1
  175. package/dist/core/storage/skills.js +350 -4
  176. package/dist/core/storage/skills.js.map +1 -1
  177. package/dist/core/storage/sqlite.d.ts +81 -25
  178. package/dist/core/storage/sqlite.d.ts.map +1 -1
  179. package/dist/core/storage/sqlite.js +143 -45
  180. package/dist/core/storage/sqlite.js.map +1 -1
  181. package/dist/core/storage/tasks.d.ts +270 -0
  182. package/dist/core/storage/tasks.d.ts.map +1 -1
  183. package/dist/core/storage/tasks.js +495 -16
  184. package/dist/core/storage/tasks.js.map +1 -1
  185. package/dist/core/storage/tool-intercepts.d.ts +1 -1
  186. package/dist/core/storage/tool-intercepts.js +1 -1
  187. package/dist/core/types.d.ts +26 -3
  188. package/dist/core/types.d.ts.map +1 -1
  189. package/dist/core/types.js +1 -3
  190. package/dist/core/types.js.map +1 -1
  191. package/dist/core/utils/binary-paths.d.ts +32 -0
  192. package/dist/core/utils/binary-paths.d.ts.map +1 -1
  193. package/dist/core/utils/binary-paths.js +52 -0
  194. package/dist/core/utils/binary-paths.js.map +1 -1
  195. package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
  196. package/dist/{skills/distill → core/utils}/claude-cli-resolver.js +1 -1
  197. package/dist/core/utils/claude-cli-resolver.js.map +1 -0
  198. package/dist/core/utils/claude-cli-spawn.d.ts +1 -1
  199. package/dist/core/utils/claude-cli-spawn.js +2 -2
  200. package/dist/core/utils/claude-cli-spawn.js.map +1 -1
  201. package/dist/core/utils/noise-prompt.d.ts +1 -1
  202. package/dist/core/utils/noise-prompt.js +1 -1
  203. package/dist/core/utils/time.d.ts +26 -0
  204. package/dist/core/utils/time.d.ts.map +1 -1
  205. package/dist/core/utils/time.js +33 -0
  206. package/dist/core/utils/time.js.map +1 -1
  207. package/dist/daemon/config-store.d.ts.map +1 -1
  208. package/dist/daemon/config-store.js +14 -5
  209. package/dist/daemon/config-store.js.map +1 -1
  210. package/dist/daemon/event-parser.d.ts.map +1 -1
  211. package/dist/daemon/event-parser.js +5 -0
  212. package/dist/daemon/event-parser.js.map +1 -1
  213. package/dist/daemon/handlers/post-tool-use.d.ts +24 -16
  214. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  215. package/dist/daemon/handlers/post-tool-use.js +76 -116
  216. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  217. package/dist/daemon/handlers/pre-tool-use.d.ts +35 -10
  218. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
  219. package/dist/daemon/handlers/pre-tool-use.js +71 -38
  220. package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
  221. package/dist/daemon/handlers/stop.d.ts +20 -0
  222. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  223. package/dist/daemon/handlers/stop.js +96 -8
  224. package/dist/daemon/handlers/stop.js.map +1 -1
  225. package/dist/daemon/handlers/user-prompt.d.ts +16 -1
  226. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  227. package/dist/daemon/handlers/user-prompt.js +97 -56
  228. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  229. package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
  230. package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
  231. package/dist/daemon/handlers/violation-content-backfill.js +167 -0
  232. package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
  233. package/dist/daemon/index.d.ts +19 -0
  234. package/dist/daemon/index.d.ts.map +1 -1
  235. package/dist/daemon/index.js +125 -200
  236. package/dist/daemon/index.js.map +1 -1
  237. package/dist/daemon/rules/defaults.d.ts.map +1 -1
  238. package/dist/daemon/rules/defaults.js +151 -64
  239. package/dist/daemon/rules/defaults.js.map +1 -1
  240. package/dist/daemon/rules/types.d.ts +28 -22
  241. package/dist/daemon/rules/types.d.ts.map +1 -1
  242. package/dist/daemon/rules/workflow-defaults.js +9 -9
  243. package/dist/daemon/rules/workflow-defaults.js.map +1 -1
  244. package/dist/daemon/services/codegraph-sync.d.ts +94 -0
  245. package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
  246. package/dist/daemon/services/codegraph-sync.js +159 -0
  247. package/dist/daemon/services/codegraph-sync.js.map +1 -0
  248. package/dist/daemon/services/decision-hint.d.ts +47 -10
  249. package/dist/daemon/services/decision-hint.d.ts.map +1 -1
  250. package/dist/daemon/services/decision-hint.js +99 -24
  251. package/dist/daemon/services/decision-hint.js.map +1 -1
  252. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -1
  253. package/dist/daemon/services/event-ttl-sweep.js +3 -2
  254. package/dist/daemon/services/event-ttl-sweep.js.map +1 -1
  255. package/dist/daemon/services/feedback-aggregator.d.ts +14 -26
  256. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -1
  257. package/dist/daemon/services/feedback-aggregator.js +23 -63
  258. package/dist/daemon/services/feedback-aggregator.js.map +1 -1
  259. package/dist/daemon/services/heartbeat-writer.d.ts +6 -15
  260. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -1
  261. package/dist/daemon/services/heartbeat-writer.js +7 -36
  262. package/dist/daemon/services/heartbeat-writer.js.map +1 -1
  263. package/dist/daemon/services/kb-injector.d.ts +1 -1
  264. package/dist/daemon/services/kb-injector.d.ts.map +1 -1
  265. package/dist/daemon/services/kb-injector.js +10 -2
  266. package/dist/daemon/services/kb-injector.js.map +1 -1
  267. package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
  268. package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
  269. package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
  270. package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
  271. package/dist/daemon/services/loop-hint.d.ts +139 -0
  272. package/dist/daemon/services/loop-hint.d.ts.map +1 -0
  273. package/dist/daemon/services/loop-hint.js +272 -0
  274. package/dist/daemon/services/loop-hint.js.map +1 -0
  275. package/dist/daemon/services/outcome-classification-service.js +1 -1
  276. package/dist/daemon/services/outcome-classification-service.js.map +1 -1
  277. package/dist/daemon/services/task-segmenter.d.ts +11 -0
  278. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  279. package/dist/daemon/services/task-segmenter.js +48 -2
  280. package/dist/daemon/services/task-segmenter.js.map +1 -1
  281. package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
  282. package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
  283. package/dist/daemon/startup/maintenance-schedulers.js +294 -0
  284. package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
  285. package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
  286. package/dist/daemon/templates/agents/claudemd-writer.md +1 -0
  287. package/dist/daemon/templates/agents/coder.md +165 -8
  288. package/dist/daemon/templates/agents/decision-maker.md +107 -21
  289. package/dist/daemon/templates/agents/doc-reviewer.md +4 -1
  290. package/dist/daemon/templates/agents/harness-debug-full.md +85 -3
  291. package/dist/daemon/templates/agents/knowledge-builder.md +1 -0
  292. package/dist/daemon/templates/agents/patch-applier.md +1 -0
  293. package/dist/daemon/templates/agents/planner.md +55 -3
  294. package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
  295. package/dist/daemon/templates/agents/skill-distiller.md +1 -0
  296. package/dist/daemon/templates/agents/task-boundary-classifier.md +1 -0
  297. package/dist/daemon/templates/agents/verify-agent.md +128 -5
  298. package/dist/hooks/stop.sh +7 -1
  299. package/dist/knowledge/builder.js +36 -7
  300. package/dist/knowledge/builder.js.map +1 -1
  301. package/dist/knowledge/constants.d.ts +10 -5
  302. package/dist/knowledge/constants.d.ts.map +1 -1
  303. package/dist/knowledge/constants.js +10 -5
  304. package/dist/knowledge/constants.js.map +1 -1
  305. package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
  306. package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
  307. package/dist/knowledge/graph/edge-extractor.js +242 -0
  308. package/dist/knowledge/graph/edge-extractor.js.map +1 -0
  309. package/dist/knowledge/graph/impact.d.ts +73 -0
  310. package/dist/knowledge/graph/impact.d.ts.map +1 -0
  311. package/dist/knowledge/graph/impact.js +94 -0
  312. package/dist/knowledge/graph/impact.js.map +1 -0
  313. package/dist/knowledge/graph/types.d.ts +22 -0
  314. package/dist/knowledge/graph/types.d.ts.map +1 -0
  315. package/dist/knowledge/graph/types.js +13 -0
  316. package/dist/knowledge/graph/types.js.map +1 -0
  317. package/dist/knowledge/prompt.d.ts +9 -0
  318. package/dist/knowledge/prompt.d.ts.map +1 -1
  319. package/dist/knowledge/prompt.js +17 -5
  320. package/dist/knowledge/prompt.js.map +1 -1
  321. package/dist/knowledge/query.d.ts +13 -0
  322. package/dist/knowledge/query.d.ts.map +1 -1
  323. package/dist/knowledge/query.js +107 -10
  324. package/dist/knowledge/query.js.map +1 -1
  325. package/dist/knowledge/repo-map.d.ts +11 -5
  326. package/dist/knowledge/repo-map.d.ts.map +1 -1
  327. package/dist/knowledge/repo-map.js +42 -3
  328. package/dist/knowledge/repo-map.js.map +1 -1
  329. package/dist/knowledge/validator.d.ts.map +1 -1
  330. package/dist/knowledge/validator.js +69 -2
  331. package/dist/knowledge/validator.js.map +1 -1
  332. package/dist/mcp/server.d.ts +64 -8
  333. package/dist/mcp/server.d.ts.map +1 -1
  334. package/dist/mcp/server.js +233 -18
  335. package/dist/mcp/server.js.map +1 -1
  336. package/dist/skills/distill/distiller.js +1 -1
  337. package/dist/skills/distill/distiller.js.map +1 -1
  338. package/dist/skills/distilled/distilled-api-design.md +4 -0
  339. package/dist/skills/distilled/distilled-brainstorming.md +79 -0
  340. package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
  341. package/dist/skills/distilled/distilled-canvas-design.md +128 -0
  342. package/dist/skills/distilled/distilled-claude-api.md +185 -0
  343. package/dist/skills/distilled/distilled-creator.md +5 -2
  344. package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
  345. package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
  346. package/dist/skills/distilled/distilled-docx.md +231 -0
  347. package/dist/skills/distilled/distilled-executing-plans.md +85 -50
  348. package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
  349. package/dist/skills/distilled/distilled-frontend-design.md +118 -0
  350. package/dist/skills/distilled/distilled-harness-engineering.md +1 -1
  351. package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
  352. package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
  353. package/dist/skills/distilled/distilled-systematic-debugging.md +108 -260
  354. package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
  355. package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
  356. package/dist/skills/distilled/distilled-verification-before-completion.md +88 -78
  357. package/dist/skills/distilled/distilled-writing-skills.md +175 -0
  358. package/dist/skills/registry.d.ts +10 -50
  359. package/dist/skills/registry.d.ts.map +1 -1
  360. package/dist/skills/registry.js +7 -118
  361. package/dist/skills/registry.js.map +1 -1
  362. package/dist/skills/tools/pipeline-suggest.js +2 -2
  363. package/dist/skills/tools/pipeline-suggest.js.map +1 -1
  364. package/dist/skills/tools/skill-invoke.d.ts +2 -1
  365. package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
  366. package/dist/skills/tools/skill-invoke.js +3 -1
  367. package/dist/skills/tools/skill-invoke.js.map +1 -1
  368. package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
  369. package/dist/web/analytics/anti-pattern-detector.js +6 -1
  370. package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
  371. package/dist/web/analytics/drift-detector.d.ts +6 -0
  372. package/dist/web/analytics/drift-detector.d.ts.map +1 -1
  373. package/dist/web/analytics/drift-detector.js +15 -8
  374. package/dist/web/analytics/drift-detector.js.map +1 -1
  375. package/dist/web/analytics/weekly-report.d.ts +13 -0
  376. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  377. package/dist/web/analytics/weekly-report.js +17 -3
  378. package/dist/web/analytics/weekly-report.js.map +1 -1
  379. package/dist/web/routes/_helpers.d.ts +31 -0
  380. package/dist/web/routes/_helpers.d.ts.map +1 -1
  381. package/dist/web/routes/_helpers.js +33 -0
  382. package/dist/web/routes/_helpers.js.map +1 -1
  383. package/dist/web/routes/agent-distill.d.ts +49 -0
  384. package/dist/web/routes/agent-distill.d.ts.map +1 -0
  385. package/dist/web/routes/agent-distill.js +526 -0
  386. package/dist/web/routes/agent-distill.js.map +1 -0
  387. package/dist/web/routes/config.d.ts +56 -0
  388. package/dist/web/routes/config.d.ts.map +1 -0
  389. package/dist/web/routes/config.js +243 -0
  390. package/dist/web/routes/config.js.map +1 -0
  391. package/dist/web/routes/decisions.js +1 -1
  392. package/dist/web/routes/decisions.js.map +1 -1
  393. package/dist/web/routes/error-handler.d.ts +0 -4
  394. package/dist/web/routes/error-handler.d.ts.map +1 -1
  395. package/dist/web/routes/error-handler.js +0 -8
  396. package/dist/web/routes/error-handler.js.map +1 -1
  397. package/dist/web/routes/events.d.ts.map +1 -1
  398. package/dist/web/routes/events.js +2 -1
  399. package/dist/web/routes/events.js.map +1 -1
  400. package/dist/web/routes/insights.d.ts.map +1 -1
  401. package/dist/web/routes/insights.js +0 -0
  402. package/dist/web/routes/insights.js.map +1 -1
  403. package/dist/web/routes/knowledge.d.ts +43 -2
  404. package/dist/web/routes/knowledge.d.ts.map +1 -1
  405. package/dist/web/routes/knowledge.js +117 -6
  406. package/dist/web/routes/knowledge.js.map +1 -1
  407. package/dist/web/routes/pipeline.d.ts +0 -9
  408. package/dist/web/routes/pipeline.d.ts.map +1 -1
  409. package/dist/web/routes/pipeline.js +0 -4
  410. package/dist/web/routes/pipeline.js.map +1 -1
  411. package/dist/web/routes/rules.d.ts.map +1 -1
  412. package/dist/web/routes/rules.js +20 -6
  413. package/dist/web/routes/rules.js.map +1 -1
  414. package/dist/web/routes/sessions.d.ts.map +1 -1
  415. package/dist/web/routes/sessions.js +8 -7
  416. package/dist/web/routes/sessions.js.map +1 -1
  417. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  418. package/dist/web/routes/skill-stats.js +153 -16
  419. package/dist/web/routes/skill-stats.js.map +1 -1
  420. package/dist/web/routes/skills-distill.js +1 -1
  421. package/dist/web/routes/skills-distill.js.map +1 -1
  422. package/dist/web/routes/stats.d.ts.map +1 -1
  423. package/dist/web/routes/stats.js +2 -1
  424. package/dist/web/routes/stats.js.map +1 -1
  425. package/dist/web/routes/task-timeline.d.ts +95 -19
  426. package/dist/web/routes/task-timeline.d.ts.map +1 -1
  427. package/dist/web/routes/task-timeline.js +344 -88
  428. package/dist/web/routes/task-timeline.js.map +1 -1
  429. package/dist/web/routes/tasks.d.ts.map +1 -1
  430. package/dist/web/routes/tasks.js +52 -30
  431. package/dist/web/routes/tasks.js.map +1 -1
  432. package/dist/web/routes/violations.d.ts +1 -1
  433. package/dist/web/routes/violations.d.ts.map +1 -1
  434. package/dist/web/routes/violations.js +3 -2
  435. package/dist/web/routes/violations.js.map +1 -1
  436. package/dist/web/server.d.ts.map +1 -1
  437. package/dist/web/server.js +20 -0
  438. package/dist/web/server.js.map +1 -1
  439. package/dist/web/services/agent-distill-manager.d.ts +122 -0
  440. package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
  441. package/dist/web/services/agent-distill-manager.js +397 -0
  442. package/dist/web/services/agent-distill-manager.js.map +1 -0
  443. package/dist/web/services/distill-manager.d.ts +47 -0
  444. package/dist/web/services/distill-manager.d.ts.map +1 -1
  445. package/dist/web/services/distill-manager.js +103 -0
  446. package/dist/web/services/distill-manager.js.map +1 -1
  447. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
  448. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
  449. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
  450. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
  451. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
  452. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
  453. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
  454. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
  455. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
  456. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
  457. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
  458. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
  459. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
  460. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
  461. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
  462. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
  463. package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
  464. package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
  465. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
  466. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
  467. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
  468. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
  469. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
  470. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
  471. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
  472. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
  473. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
  474. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
  475. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
  476. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
  477. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js → MarkdownRenderer-DlDQNihj.js} +2 -2
  478. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js.map → MarkdownRenderer-DlDQNihj.js.map} +1 -1
  479. package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
  480. package/dist/web/static/assets/{NotFound-BQPh0vaF.js.map → NotFound-LMzbP51V.js.map} +1 -1
  481. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
  482. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
  483. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
  484. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
  485. package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
  486. package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
  487. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
  488. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
  489. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
  490. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
  491. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
  492. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
  493. package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
  494. package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
  495. package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
  496. package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
  497. package/dist/web/static/assets/{index-7bl3kbcx.css → index-B_v_MKlb.css} +1 -1
  498. package/dist/web/static/assets/index-DileOOE4.js +4 -0
  499. package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
  500. package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
  501. package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
  502. package/dist/web/static/assets/{outcome-DUn1NjlC.js → outcome-BKGy9azt.js} +2 -2
  503. package/dist/web/static/assets/{outcome-DUn1NjlC.js.map → outcome-BKGy9azt.js.map} +1 -1
  504. package/dist/web/static/assets/{query-S6X1S7K9.js → query-CgCOpYWf.js} +2 -2
  505. package/dist/web/static/assets/{query-S6X1S7K9.js.map → query-CgCOpYWf.js.map} +1 -1
  506. package/dist/web/static/assets/{react-router-JVUrkhdd.js → react-router-Cxmg8RuL.js} +3 -3
  507. package/dist/web/static/assets/{react-router-JVUrkhdd.js.map → react-router-Cxmg8RuL.js.map} +1 -1
  508. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js → syntax-highlighter-BDYycNja.js} +3 -3
  509. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js.map → syntax-highlighter-BDYycNja.js.map} +1 -1
  510. package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
  511. package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
  512. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
  513. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
  514. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
  515. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
  516. package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
  517. package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
  518. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
  519. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
  520. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
  521. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
  522. package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
  523. package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
  524. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
  525. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
  526. package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
  527. package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
  528. package/dist/web/static/index.html +6 -6
  529. package/package.json +5 -3
  530. package/dist/core/storage/workflow-recommendations.d.ts +0 -124
  531. package/dist/core/storage/workflow-recommendations.d.ts.map +0 -1
  532. package/dist/core/storage/workflow-recommendations.js +0 -274
  533. package/dist/core/storage/workflow-recommendations.js.map +0 -1
  534. package/dist/daemon/services/experience-extractor.d.ts.map +0 -1
  535. package/dist/daemon/services/experience-extractor.js.map +0 -1
  536. package/dist/daemon/services/violation-reporter.d.ts.map +0 -1
  537. package/dist/daemon/services/violation-reporter.js.map +0 -1
  538. package/dist/daemon/templates/agents/harness-hotfix.md +0 -99
  539. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +0 -104
  540. package/dist/daemon/templates/agents/refactor-specialist.md +0 -98
  541. package/dist/skills/distill/claude-cli-resolver.d.ts.map +0 -1
  542. package/dist/skills/distill/claude-cli-resolver.js.map +0 -1
  543. package/dist/skills/distilled/distilled-defi-amm-security.md +0 -293
  544. package/dist/skills/keyword-score.d.ts +0 -29
  545. package/dist/skills/keyword-score.d.ts.map +0 -1
  546. package/dist/skills/keyword-score.js +0 -54
  547. package/dist/skills/keyword-score.js.map +0 -1
  548. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +0 -2
  549. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +0 -1
  550. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +0 -2
  551. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +0 -1
  552. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +0 -3
  553. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +0 -1
  554. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +0 -2
  555. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +0 -1
  556. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +0 -2
  557. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +0 -1
  558. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +0 -2
  559. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +0 -1
  560. package/dist/web/static/assets/DriftTab-DqpepOhI.js +0 -2
  561. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +0 -1
  562. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +0 -3
  563. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +0 -1
  564. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +0 -2
  565. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +0 -1
  566. package/dist/web/static/assets/NotFound-BQPh0vaF.js +0 -2
  567. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +0 -2
  568. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +0 -1
  569. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +0 -2
  570. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +0 -1
  571. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +0 -2
  572. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +0 -1
  573. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +0 -2
  574. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +0 -1
  575. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +0 -2
  576. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +0 -1
  577. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +0 -6
  578. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +0 -1
  579. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +0 -3
  580. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +0 -1
  581. package/dist/web/static/assets/arco-Bhi3a6Qp.js +0 -14
  582. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +0 -1
  583. package/dist/web/static/assets/charts-BuHQWDbQ.js +0 -37
  584. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +0 -1
  585. package/dist/web/static/assets/index-BIYnq1Dx.js +0 -4
  586. package/dist/web/static/assets/index-BIYnq1Dx.js.map +0 -1
  587. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +0 -2
  588. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +0 -1
  589. package/dist/web/static/assets/vendor-DWgdB1eY.js +0 -65
  590. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +0 -1
  591. /package/dist/{skills/distill → core/utils}/claude-cli-resolver.d.ts +0 -0
@@ -0,0 +1,165 @@
1
+ /**
2
+ * agent-patch-apply.ts — pure-JS unified-diff applier for agent-template
3
+ * adoption (decision 568a8c53, user Open-Q1).
4
+ *
5
+ * Why NOT `git apply`: the daemon runs under launchd with cwd=`/` (no working
6
+ * tree), so `git apply` fails there (same landmine documented in
7
+ * skills-distill.ts:559). The web adopt path needs a working tree-INDEPENDENT
8
+ * application that resolves the patch against the in-memory template text.
9
+ *
10
+ * Scope: this is a deliberately small, strict context-matching applier — NOT a
11
+ * full GNU patch / git-apply re-implementation. It handles the unified-diff
12
+ * shape the `agent-retro-distiller` emits:
13
+ * - one or more `@@ ... @@` hunks
14
+ * - context lines (leading space), additions (`+`), removals (`-`)
15
+ * - optional `--- a/...` / `+++ b/...` file headers (ignored)
16
+ *
17
+ * It is ATOMIC: if any hunk fails to match its context against the current text
18
+ * it throws `PatchApplyError` and returns NOTHING (no partial write). Callers
19
+ * map the throw to HTTP 422. Pure: no IO.
20
+ */
21
+ export class PatchApplyError extends Error {
22
+ /** Index (1-based) of the hunk that failed, when known. */
23
+ hunkIndex;
24
+ constructor(message, hunkIndex = null) {
25
+ super(`[agent-patch-apply] ${message}`);
26
+ this.name = 'PatchApplyError';
27
+ this.hunkIndex = hunkIndex;
28
+ }
29
+ }
30
+ /** Split a unified diff into hunks, dropping file headers + `@@` markers. */
31
+ function parseHunks(patch) {
32
+ const rawLines = patch.split('\n');
33
+ const hunks = [];
34
+ let current = null;
35
+ for (const line of rawLines) {
36
+ if (line.startsWith('--- ') || line.startsWith('+++ ')) {
37
+ // file header — ignored
38
+ continue;
39
+ }
40
+ if (line.startsWith('@@')) {
41
+ current = { lines: [] };
42
+ hunks.push(current);
43
+ continue;
44
+ }
45
+ if (current === null) {
46
+ // Lines before the first @@ that are not file headers: tolerate blank /
47
+ // stray lines (the distiller sometimes prefixes a fenced block).
48
+ if (line.trim() === '')
49
+ continue;
50
+ // A non-empty body line outside any hunk → malformed.
51
+ // Be lenient about a leading "diff --git" style line.
52
+ if (line.startsWith('diff ') || line.startsWith('index '))
53
+ continue;
54
+ continue;
55
+ }
56
+ current.lines.push(line);
57
+ }
58
+ return hunks;
59
+ }
60
+ /**
61
+ * The "old" (context + removed) side and "new" (context + added) side of a hunk,
62
+ * as arrays of full-line strings (markers stripped).
63
+ */
64
+ function hunkSides(hunk) {
65
+ const oldLines = [];
66
+ const newLines = [];
67
+ for (const l of hunk.lines) {
68
+ if (l.startsWith('+')) {
69
+ newLines.push(l.slice(1));
70
+ }
71
+ else if (l.startsWith('-')) {
72
+ oldLines.push(l.slice(1));
73
+ }
74
+ else if (l.startsWith(' ')) {
75
+ oldLines.push(l.slice(1));
76
+ newLines.push(l.slice(1));
77
+ }
78
+ else if (l === '') {
79
+ // An empty line in the hunk body == a context blank line.
80
+ oldLines.push('');
81
+ newLines.push('');
82
+ }
83
+ else if (l === '\') {
84
+ // ignore the GNU no-newline marker
85
+ }
86
+ else {
87
+ // Unknown marker — treat as context to be conservative.
88
+ oldLines.push(l);
89
+ newLines.push(l);
90
+ }
91
+ }
92
+ return { oldLines, newLines };
93
+ }
94
+ /** Find the single index where `needle` matches `hay` exactly. */
95
+ function findMatch(hay, needle, hunkIndex) {
96
+ if (needle.length === 0) {
97
+ // Pure-insertion hunk with no context — cannot anchor reliably. Reject.
98
+ throw new PatchApplyError(`hunk ${hunkIndex} has no context/removed lines to anchor against`, hunkIndex);
99
+ }
100
+ let found = -1;
101
+ for (let i = 0; i + needle.length <= hay.length; i++) {
102
+ let ok = true;
103
+ for (let j = 0; j < needle.length; j++) {
104
+ if (hay[i + j] !== needle[j]) {
105
+ ok = false;
106
+ break;
107
+ }
108
+ }
109
+ if (ok) {
110
+ if (found !== -1) {
111
+ throw new PatchApplyError(`hunk ${hunkIndex} context is ambiguous (matches at multiple locations)`, hunkIndex);
112
+ }
113
+ found = i;
114
+ }
115
+ }
116
+ if (found === -1) {
117
+ throw new PatchApplyError(`hunk ${hunkIndex} context did not match the current template`, hunkIndex);
118
+ }
119
+ return found;
120
+ }
121
+ /**
122
+ * Apply a unified-diff `patch` to `source` text, returning the new text.
123
+ *
124
+ * Atomic + strict: every hunk's context (+removed) side must match exactly once
125
+ * in the current text, else throw (no partial application). The trailing newline
126
+ * convention of `source` is preserved.
127
+ *
128
+ * Pure: no IO, no template writes.
129
+ */
130
+ export function applyUnifiedDiff(source, patch) {
131
+ const hunks = parseHunks(patch);
132
+ if (hunks.length === 0) {
133
+ throw new PatchApplyError('patch contains no hunks');
134
+ }
135
+ const hadTrailingNewline = source.endsWith('\n');
136
+ // Work on lines WITHOUT the trailing empty element a trailing \n produces.
137
+ let lines = source.split('\n');
138
+ if (hadTrailingNewline)
139
+ lines = lines.slice(0, -1);
140
+ hunks.forEach((hunk, idx) => {
141
+ const hunkIndex = idx + 1;
142
+ const { oldLines, newLines } = hunkSides(hunk);
143
+ const at = findMatch(lines, oldLines, hunkIndex);
144
+ lines = [...lines.slice(0, at), ...newLines, ...lines.slice(at + oldLines.length)];
145
+ });
146
+ return hadTrailingNewline ? lines.join('\n') + '\n' : lines.join('\n');
147
+ }
148
+ /**
149
+ * Mechanically set the `version:` line inside the leading YAML frontmatter to
150
+ * `targetVersion`. The anchor-guard forbids the distiller from touching the
151
+ * version line; adoption bumps it here, deterministically. Returns the new text.
152
+ *
153
+ * Throws if no frontmatter `version:` line is found (the template invariant
154
+ * requires one). Pure.
155
+ */
156
+ export function setFrontmatterVersion(template, targetVersion) {
157
+ const fenceEnd = template.indexOf('\n---', 4);
158
+ const head = fenceEnd > 0 ? template.slice(0, fenceEnd) : template;
159
+ if (!/^version:\s*[0-9]+\s*$/m.test(head)) {
160
+ throw new PatchApplyError('template has no frontmatter `version:` line to bump');
161
+ }
162
+ const headBumped = head.replace(/^version:\s*[0-9]+\s*$/m, `version: ${targetVersion}`);
163
+ return fenceEnd > 0 ? headBumped + template.slice(fenceEnd) : headBumped;
164
+ }
165
+ //# sourceMappingURL=agent-patch-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-patch-apply.js","sourceRoot":"","sources":["../../../src/core/insights/agent-patch-apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Agent suggestion ranker — the deterministic decision-end mirror of C1's
3
+ * `rankSkills` (decision c20c2d1f, C2).
4
+ *
5
+ * Given a task description's top skill matches plus read-only historical signals
6
+ * (agent×skill usefulness, agent health) and an optional coverage tier, produce a
7
+ * ranked, REASONED agent recommendation. Pure + deterministic — NO LLM, NO
8
+ * embedding, no DB access (the caller wires the storage signals). The LLM
9
+ * (decision-maker) treats the candidate set as input and makes the final call,
10
+ * exactly like C1's "ranker ranks, LLM picks 0-1".
11
+ *
12
+ * Four layered signals (spec §"skill→agent mapping"):
13
+ * Signal 1 (primary) — historical (agent×skill) actionable_rate via reason-prefix
14
+ * proxy key (agent_id is empirically all-NULL).
15
+ * Signal 2 (tie-break) — agent health success_rate / delegations.
16
+ * Signal 3 (cold-start)— a small nature→agent prior table when Signal 1 is
17
+ * under-sampled (the relocated governance §5 judgments,
18
+ * keyed on task NATURE not coverage).
19
+ * Signal 4 (backstop) — coverage demotion: coder→safety-net-implementer for a
20
+ * <50% module, applied only when a module tier is given.
21
+ *
22
+ * 不变量: READ-ONLY data transformer. Never mutates inputs, never touches the
23
+ * filesystem or DB, never spawns. The daemon never calls this.
24
+ */
25
+ import { REASON_PREFIX_TO_AGENT } from './agent-health.js';
26
+ import type { CoverageTier } from './coverage-tiers.js';
27
+ /**
28
+ * The spawnable IMPLEMENTATION agent pool — the recommendation universe.
29
+ * Excludes pipeline roles (verify / decision) which are not "the agent to spawn
30
+ * for the work". Order is stable for deterministic alphabetical tie-breaks.
31
+ */
32
+ export declare const IMPL_AGENT_POOL: readonly ["coder", "harness-debug-full", "planner", "safety-net-implementer"];
33
+ export type ImplAgent = (typeof IMPL_AGENT_POOL)[number];
34
+ /**
35
+ * Signal-3 cold-start prior — task NATURE → agent, relocated from the
36
+ * decision-maker.md Step 3 prose selection guide. Each nature carries the
37
+ * keywords that signal it (matched against the task tokens) and the agent it
38
+ * implies. NOT keyed on coverage — coverage enters only via Signal 4.
39
+ *
40
+ * Priority: when multiple natures match, the one with the most keyword hits wins;
41
+ * ties break by the array order below (most specific first). This is the
42
+ * irreducible floor that makes C2 ≈ the old guide before Signal-1 data accrues.
43
+ */
44
+ export interface NaturePrior {
45
+ nature: string;
46
+ agent: ImplAgent;
47
+ keywords: string[];
48
+ }
49
+ export declare const NATURE_PRIOR_TABLE: readonly NaturePrior[];
50
+ /** One skill match from rankSkills (C1). */
51
+ export interface SkillMatchInput {
52
+ id: string;
53
+ score: number;
54
+ }
55
+ /** One (agent×skill) usefulness row from aggregateSkillUsefulnessByAgent. */
56
+ export interface AgentSkillAffinityInput {
57
+ /** Reason-prefix proxy agent key (coder / safetynet / verify / ...). */
58
+ agent: string;
59
+ skill_id: string;
60
+ total_rated: number;
61
+ actionable_rate: number;
62
+ }
63
+ /** One agent-health row (subset of computeAgentHealth's AgentHealth). */
64
+ export interface AgentHealthInput {
65
+ /** Canonical agent template name (already mapped from reason prefix). */
66
+ agent: string;
67
+ success_rate: number | null;
68
+ delegations: number;
69
+ }
70
+ export interface SuggestAgentsInput {
71
+ taskDesc: string;
72
+ /** Top skill matches for the task (from rankSkills). */
73
+ skillMatches: SkillMatchInput[];
74
+ /** (agent×skill) usefulness rows (from aggregateSkillUsefulnessByAgent). */
75
+ skillByAgent: AgentSkillAffinityInput[];
76
+ /** Per-agent health rows (from computeAgentHealth). */
77
+ agentHealth: AgentHealthInput[];
78
+ /** Resolved coverage tier for --module (Signal 4); omit → backstop skipped. */
79
+ moduleCoverageTier?: CoverageTier;
80
+ /** Module path (for the coverage_note text only). */
81
+ modulePath?: string;
82
+ }
83
+ export interface AgentCandidate {
84
+ agent: string;
85
+ score: number;
86
+ reasons: string[];
87
+ /** Set when Signal-4 demoted this candidate (e.g. "coder"). */
88
+ demoted_from?: string;
89
+ /** Confidence label driven by Signal-1 evidence sufficiency. */
90
+ confidence: 'data-backed' | 'nature-prior';
91
+ }
92
+ export interface AgentSuggestResult {
93
+ task: string;
94
+ candidates: AgentCandidate[];
95
+ coverage_note: string;
96
+ }
97
+ /**
98
+ * Compute the Signal-3 nature prior for a task: the best-matching nature→agent
99
+ * and the keyword hit count. Deterministic: most keyword hits wins, ties by
100
+ * NATURE_PRIOR_TABLE order. Returns the default new-feature agent with 0 hits
101
+ * when nothing matches.
102
+ */
103
+ export declare function computeNaturePrior(taskDesc: string): {
104
+ agent: ImplAgent;
105
+ nature: string;
106
+ hits: number;
107
+ };
108
+ /**
109
+ * Apply the Signal-4 coverage backstop to a single candidate (pure). Demotes a
110
+ * `coder` recommendation to `safety-net-implementer` when the module tier is
111
+ * `low` (<50% lines). One-way safety filter — never promotes, never touches
112
+ * non-coder agents. Returns a (possibly) new candidate; never mutates input.
113
+ */
114
+ export declare function applyCoverageBackstop(candidate: AgentCandidate, tier: CoverageTier | undefined, modulePath?: string): AgentCandidate;
115
+ /**
116
+ * Rank implementation agents for a task. Pure + deterministic.
117
+ *
118
+ * Scoring口径 (per spec): for each agent in IMPL_AGENT_POOL,
119
+ * score = Σ over skillMatches of (skillMatch.score × affinity) where
120
+ * affinity = (agent,skill) actionable_rate when total_rated ≥ SUGGESTION_MIN_RATED
121
+ * (Signal 1, data-backed),
122
+ * else +1 for the agent picked by the nature prior (Signal 3, cold-start).
123
+ * Tie-break: success_rate desc → delegations desc → agent name asc (Signal 2 +
124
+ * determinism). Coverage backstop (Signal 4) is post-applied per candidate.
125
+ */
126
+ export declare function suggestAgents(input: SuggestAgentsInput): AgentSuggestResult;
127
+ export { REASON_PREFIX_TO_AGENT };
128
+ //# sourceMappingURL=agent-suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-suggest.d.ts","sourceRoot":"","sources":["../../../src/core/insights/agent-suggest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EACL,sBAAsB,EAGvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;GAIG;AACH,eAAO,MAAM,eAAe,+EAKlB,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAE,SAAS,WAAW,EA+BnD,CAAC;AAOH,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,4EAA4E;IAC5E,YAAY,EAAE,uBAAuB,EAAE,CAAC;IACxC,uDAAuD;IACvD,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAClC,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,UAAU,EAAE,aAAa,GAAG,cAAc,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAkBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmBvG;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAYhB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAsF3E;AAwED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Agent suggestion ranker — the deterministic decision-end mirror of C1's
3
+ * `rankSkills` (decision c20c2d1f, C2).
4
+ *
5
+ * Given a task description's top skill matches plus read-only historical signals
6
+ * (agent×skill usefulness, agent health) and an optional coverage tier, produce a
7
+ * ranked, REASONED agent recommendation. Pure + deterministic — NO LLM, NO
8
+ * embedding, no DB access (the caller wires the storage signals). The LLM
9
+ * (decision-maker) treats the candidate set as input and makes the final call,
10
+ * exactly like C1's "ranker ranks, LLM picks 0-1".
11
+ *
12
+ * Four layered signals (spec §"skill→agent mapping"):
13
+ * Signal 1 (primary) — historical (agent×skill) actionable_rate via reason-prefix
14
+ * proxy key (agent_id is empirically all-NULL).
15
+ * Signal 2 (tie-break) — agent health success_rate / delegations.
16
+ * Signal 3 (cold-start)— a small nature→agent prior table when Signal 1 is
17
+ * under-sampled (the relocated governance §5 judgments,
18
+ * keyed on task NATURE not coverage).
19
+ * Signal 4 (backstop) — coverage demotion: coder→safety-net-implementer for a
20
+ * <50% module, applied only when a module tier is given.
21
+ *
22
+ * 不变量: READ-ONLY data transformer. Never mutates inputs, never touches the
23
+ * filesystem or DB, never spawns. The daemon never calls this.
24
+ */
25
+ import { REASON_PREFIX_TO_AGENT, agentForReasonPrefix, SUGGESTION_MIN_RATED, } from './agent-health.js';
26
+ import { isLowCoverageTier } from './coverage-tiers.js';
27
+ /**
28
+ * The spawnable IMPLEMENTATION agent pool — the recommendation universe.
29
+ * Excludes pipeline roles (verify / decision) which are not "the agent to spawn
30
+ * for the work". Order is stable for deterministic alphabetical tie-breaks.
31
+ */
32
+ export const IMPL_AGENT_POOL = [
33
+ 'coder',
34
+ 'harness-debug-full',
35
+ 'planner',
36
+ 'safety-net-implementer',
37
+ ];
38
+ export const NATURE_PRIOR_TABLE = Object.freeze([
39
+ // unknown / intermittent bug → harness-debug-full (check BEFORE plain "bug")
40
+ {
41
+ nature: 'unknown-bug',
42
+ agent: 'harness-debug-full',
43
+ keywords: ['intermittent', 'flaky', 'unknown', 'sometimes', 'heisenbug', 'race', '时好时坏', '偶发', '间歇'],
44
+ },
45
+ // known bug fix → safety-net-implementer (hotfix)
46
+ {
47
+ nature: 'bug',
48
+ agent: 'safety-net-implementer',
49
+ keywords: ['bug', 'fix', 'hotfix', 'broken', 'regression', 'null-deref', 'crash', 'defect', '修复', '报错'],
50
+ },
51
+ // refactor / restructure → safety-net-implementer (refactor)
52
+ {
53
+ nature: 'refactor',
54
+ agent: 'safety-net-implementer',
55
+ keywords: ['refactor', 'restructure', 'extract', 'rename', 'cleanup', 'reorganize', 'split', '重构', '拆分'],
56
+ },
57
+ // architecture planning → planner
58
+ {
59
+ nature: 'planning',
60
+ agent: 'planner',
61
+ keywords: ['plan', 'planning', 'architecture', 'design', 'roadmap', 'spec', 'scope', '规划', '设计'],
62
+ },
63
+ // new feature → coder (the default for additive work)
64
+ {
65
+ nature: 'new-feature',
66
+ agent: 'coder',
67
+ keywords: ['add', 'feature', 'new', 'implement', 'build', 'create', 'support', '新增', '功能', '实现'],
68
+ },
69
+ ]);
70
+ /** Default new-feature fallback when no nature keyword matches at all. */
71
+ const DEFAULT_NATURE_AGENT = 'coder';
72
+ // ── Core口径 ────────────────────────────────────────────────────────────────
73
+ /** Tokenize free text into lowercase alphanumeric (+CJK) tokens. Mirror C1. */
74
+ function tokenize(text) {
75
+ return text
76
+ .toLowerCase()
77
+ .split(/[^a-z0-9一-鿿]+/u)
78
+ .filter((t) => t.length > 0);
79
+ }
80
+ /** Map a reason-prefix proxy key to a canonical template name, pool-filtered. */
81
+ function canonicalImplAgent(reasonPrefix) {
82
+ const name = agentForReasonPrefix(reasonPrefix);
83
+ return IMPL_AGENT_POOL.includes(name) ? name : undefined;
84
+ }
85
+ /**
86
+ * Compute the Signal-3 nature prior for a task: the best-matching nature→agent
87
+ * and the keyword hit count. Deterministic: most keyword hits wins, ties by
88
+ * NATURE_PRIOR_TABLE order. Returns the default new-feature agent with 0 hits
89
+ * when nothing matches.
90
+ */
91
+ export function computeNaturePrior(taskDesc) {
92
+ const tokens = new Set(tokenize(taskDesc));
93
+ let best;
94
+ for (const entry of NATURE_PRIOR_TABLE) {
95
+ let hits = 0;
96
+ for (const kw of entry.keywords) {
97
+ // keyword may itself be multi-token (rare) — count if any token overlaps.
98
+ for (const t of tokenize(kw)) {
99
+ if (tokens.has(t)) {
100
+ hits += 1;
101
+ break;
102
+ }
103
+ }
104
+ }
105
+ if (hits > 0 && (!best || hits > best.hits)) {
106
+ best = { agent: entry.agent, nature: entry.nature, hits };
107
+ }
108
+ }
109
+ return best ?? { agent: DEFAULT_NATURE_AGENT, nature: 'new-feature', hits: 0 };
110
+ }
111
+ /**
112
+ * Apply the Signal-4 coverage backstop to a single candidate (pure). Demotes a
113
+ * `coder` recommendation to `safety-net-implementer` when the module tier is
114
+ * `low` (<50% lines). One-way safety filter — never promotes, never touches
115
+ * non-coder agents. Returns a (possibly) new candidate; never mutates input.
116
+ */
117
+ export function applyCoverageBackstop(candidate, tier, modulePath) {
118
+ if (candidate.agent !== 'coder' || !isLowCoverageTier(tier))
119
+ return candidate;
120
+ const where = modulePath ? ` (${modulePath} is <50% lines)` : ' (module is <50% lines)';
121
+ return {
122
+ ...candidate,
123
+ agent: 'safety-net-implementer',
124
+ demoted_from: 'coder',
125
+ reasons: [
126
+ ...candidate.reasons,
127
+ `coverage backstop: demoted coder → safety-net-implementer${where}`,
128
+ ],
129
+ };
130
+ }
131
+ /**
132
+ * Rank implementation agents for a task. Pure + deterministic.
133
+ *
134
+ * Scoring口径 (per spec): for each agent in IMPL_AGENT_POOL,
135
+ * score = Σ over skillMatches of (skillMatch.score × affinity) where
136
+ * affinity = (agent,skill) actionable_rate when total_rated ≥ SUGGESTION_MIN_RATED
137
+ * (Signal 1, data-backed),
138
+ * else +1 for the agent picked by the nature prior (Signal 3, cold-start).
139
+ * Tie-break: success_rate desc → delegations desc → agent name asc (Signal 2 +
140
+ * determinism). Coverage backstop (Signal 4) is post-applied per candidate.
141
+ */
142
+ export function suggestAgents(input) {
143
+ const task = (input.taskDesc ?? '').trim();
144
+ // Index (agent×skill) affinity by `${agent}::${skill_id}` for fast lookup,
145
+ // keyed on the canonical impl-agent name (drops verify/decision/unknown).
146
+ const affinity = new Map();
147
+ for (const row of input.skillByAgent) {
148
+ const canon = canonicalImplAgent(row.agent);
149
+ if (!canon)
150
+ continue;
151
+ affinity.set(`${canon}::${row.skill_id}`, row);
152
+ }
153
+ const healthByAgent = new Map();
154
+ for (const h of input.agentHealth)
155
+ healthByAgent.set(h.agent, h);
156
+ const naturePrior = computeNaturePrior(task);
157
+ const candidates = [];
158
+ for (const agent of IMPL_AGENT_POOL) {
159
+ let score = 0;
160
+ const reasons = [];
161
+ let dataBacked = false;
162
+ for (const m of input.skillMatches) {
163
+ const aff = affinity.get(`${agent}::${m.id}`);
164
+ if (aff && aff.total_rated >= SUGGESTION_MIN_RATED) {
165
+ const contribution = m.score * aff.actionable_rate;
166
+ score += contribution;
167
+ dataBacked = true;
168
+ reasons.push(`Signal1: pulled ${m.id} with actionable_rate ${(aff.actionable_rate * 100).toFixed(0)}% ` +
169
+ `(n=${aff.total_rated}) → +${contribution.toFixed(2)}`);
170
+ }
171
+ }
172
+ // Signal 3 — cold-start nature prior. Adds a small flat boost to the agent
173
+ // the task nature implies, so under-sampled tasks still rank sensibly.
174
+ if (agent === naturePrior.agent) {
175
+ score += 1;
176
+ reasons.push(naturePrior.hits > 0
177
+ ? `Signal3 (nature prior): task looks like "${naturePrior.nature}" → ${agent} → +1`
178
+ : `Signal3 (nature prior): no nature keyword matched → default new-feature → ${agent} → +1`);
179
+ }
180
+ const health = healthByAgent.get(agent);
181
+ if (health && health.success_rate !== null) {
182
+ reasons.push(`Signal2 (health): success_rate ${(health.success_rate * 100).toFixed(0)}% over ${health.delegations} delegations (tie-break)`);
183
+ }
184
+ candidates.push({
185
+ agent,
186
+ score: Math.round(score * 1000) / 1000,
187
+ reasons,
188
+ confidence: dataBacked ? 'data-backed' : 'nature-prior',
189
+ });
190
+ }
191
+ // Sort: score desc → success_rate desc → delegations desc → name asc.
192
+ candidates.sort((a, b) => {
193
+ if (b.score !== a.score)
194
+ return b.score - a.score;
195
+ const ha = healthByAgent.get(a.agent);
196
+ const hb = healthByAgent.get(b.agent);
197
+ const sra = ha?.success_rate ?? -1;
198
+ const srb = hb?.success_rate ?? -1;
199
+ if (srb !== sra)
200
+ return srb - sra;
201
+ const da = ha?.delegations ?? 0;
202
+ const db = hb?.delegations ?? 0;
203
+ if (db !== da)
204
+ return db - da;
205
+ return a.agent.localeCompare(b.agent);
206
+ });
207
+ // Signal 4 — coverage backstop, applied per candidate after ranking, then
208
+ // de-duplicated: a demoted coder collapses into the existing same-named entry
209
+ // (e.g. the pool's native safety-net-implementer) so no agent appears twice.
210
+ const tier = input.moduleCoverageTier;
211
+ const demoted = candidates.map((c) => applyCoverageBackstop(c, tier, input.modulePath));
212
+ const finalCandidates = dedupCandidates(demoted);
213
+ const coverage_note = buildCoverageNote(tier, input.modulePath);
214
+ return { task, candidates: finalCandidates, coverage_note };
215
+ }
216
+ /**
217
+ * Collapse candidates that share an agent name after the coverage backstop
218
+ * (a demoted coder lands on safety-net-implementer, which is already in the
219
+ * pool). Keeps the first-seen position (preserving the post-sort rank), merges
220
+ * into the higher-scored entry, and propagates `demoted_from` so the merged row
221
+ * still records the provenance. Display/dedup only — never changes ranking
222
+ * logic or demotion judgment. Pure: returns a new array.
223
+ */
224
+ function dedupCandidates(candidates) {
225
+ const byAgent = new Map();
226
+ const order = [];
227
+ for (const c of candidates) {
228
+ const existing = byAgent.get(c.agent);
229
+ if (!existing) {
230
+ byAgent.set(c.agent, c);
231
+ order.push(c.agent);
232
+ continue;
233
+ }
234
+ // Merge: keep the higher score; preserve demotion provenance + its reasons
235
+ // from whichever entry actually carries the backstop, and keep a stable,
236
+ // de-duplicated union of reasons.
237
+ const winner = c.score > existing.score ? c : existing;
238
+ const loser = winner === c ? existing : c;
239
+ const merged = {
240
+ ...winner,
241
+ demoted_from: winner.demoted_from ?? loser.demoted_from,
242
+ reasons: dedupStrings([...winner.reasons, ...loser.reasons]),
243
+ };
244
+ byAgent.set(c.agent, merged);
245
+ }
246
+ return order.map((name) => byAgent.get(name));
247
+ }
248
+ /** Stable de-duplication of a string list (first occurrence wins). */
249
+ function dedupStrings(items) {
250
+ const seen = new Set();
251
+ const out = [];
252
+ for (const s of items) {
253
+ if (!seen.has(s)) {
254
+ seen.add(s);
255
+ out.push(s);
256
+ }
257
+ }
258
+ return out;
259
+ }
260
+ /**
261
+ * Build the three-state coverage backstop note for display + --json:
262
+ * ① no --module given — backstop skipped entirely;
263
+ * ② --module given, tier unknown — no matching coverage tier, no demotion;
264
+ * ③ --module given, tier known — inactive (≥50%) or ACTIVE (<50%) demotion.
265
+ * Text-only; mirrors the actual (unchanged) demotion behavior.
266
+ */
267
+ function buildCoverageNote(tier, modulePath) {
268
+ const hasModule = !!(modulePath && modulePath.trim());
269
+ if (tier === undefined) {
270
+ // ② --module given but it resolved to no known coverage tier (no demotion).
271
+ if (hasModule) {
272
+ return `coverage backstop not applied: ${modulePath} given but no known coverage tier matched (no demotion)`;
273
+ }
274
+ // ① no --module given at all.
275
+ return 'coverage backstop not applied (no --module given)';
276
+ }
277
+ const where = modulePath ?? '<module>';
278
+ if (isLowCoverageTier(tier)) {
279
+ return `coverage backstop ACTIVE: ${where} is low (<50% lines) → coder demoted to safety-net-implementer`;
280
+ }
281
+ return `coverage backstop inactive: ${where} is ${tier} (≥50% lines) → coder allowed`;
282
+ }
283
+ export { REASON_PREFIX_TO_AGENT };
284
+ //# sourceMappingURL=agent-suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-suggest.js","sourceRoot":"","sources":["../../../src/core/insights/agent-suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Module coverage tiers — the Signal-4 backstop source for `cf agent suggest`
3
+ * (decision c20c2d1f, C2).
4
+ *
5
+ * The CLAUDE.md「项目模块覆盖现状」table is human-readable prose, not machine
6
+ * parseable. This module relocates its *coverage tier* judgments into a small,
7
+ * coarse constant map keyed by top-level module directory, so the deterministic
8
+ * coverage demotion (荐 coder 但模块 <50% lines → 降级 safety-net-implementer)
9
+ * can run without parsing Markdown.
10
+ *
11
+ * ⚠️ MANUAL-SYNC CONVENTION (R2): this map is hand-maintained against the
12
+ * CLAUDE.md「项目模块覆盖现状」table (source of truth). When that table's真实
13
+ * line-coverage numbers move a module across the 50% line, update this map too.
14
+ * The same manual-sync convention the table itself already uses applies here
15
+ * until a `cf coverage` lint can auto-derive it (Open Q3). Keep the map COARSE
16
+ * (one tier per top-level module dir, not per file).
17
+ *
18
+ * Tier口径 (matches CLAUDE.md judgment threshold, 真实 line coverage):
19
+ * - `low` : < 50% lines → coder recommendations get demoted (Signal 4)
20
+ * - `mid` : 50%–~75% → no demotion (≥50% line clears the red line)
21
+ * - `high` : > ~75% lines → no demotion
22
+ *
23
+ * Only `low` triggers the backstop. `mid`/`high` are distinguished for
24
+ * informativeness (the coverage_note) but behave identically for demotion.
25
+ */
26
+ export type CoverageTier = 'high' | 'mid' | 'low';
27
+ /**
28
+ * Module-path-prefix → coverage tier. Seeded 2026-06-15 from the CLAUDE.md
29
+ * 「项目模块覆盖现状」table (basis 2026-06-10 R8 + 2026-06-11 174f649a新模块行).
30
+ * Longest-prefix wins (see resolveCoverageTier), so a more specific subdir can
31
+ * override its parent (e.g. `src/daemon/handlers/` high vs `src/daemon/` low).
32
+ */
33
+ export declare const MODULE_COVERAGE_TIERS: Readonly<Record<string, CoverageTier>>;
34
+ /**
35
+ * Resolve a module path to its coverage tier by LONGEST-prefix match against
36
+ * MODULE_COVERAGE_TIERS. Returns `undefined` when no prefix matches (caller
37
+ * treats unknown as "no backstop applied" — never demotes on unknown).
38
+ *
39
+ * Pure + deterministic. Normalizes leading `./` and trims; matching is on the
40
+ * normalized path so both `src/cli/commands` and `src/cli/commands/agent.ts`
41
+ * resolve via the `src/cli/commands/` key.
42
+ */
43
+ export declare function resolveCoverageTier(modulePath: string): CoverageTier | undefined;
44
+ /** Whether a tier triggers the coder→safety-net coverage demotion (Signal 4). */
45
+ export declare function isLowCoverageTier(tier: CoverageTier | undefined): boolean;
46
+ //# sourceMappingURL=coverage-tiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-tiers.d.ts","sourceRoot":"","sources":["../../../src/core/insights/coverage-tiers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CA4BvE,CAAC;AAEH;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAahF;AAYD,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAEzE"}