@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
@@ -17,12 +17,12 @@
17
17
  * wiring and existing test files stay valid.
18
18
  */
19
19
  import { logger } from '../../core/utils/logger.js';
20
- import { randomUUID } from 'node:crypto';
21
- import { truncateString } from '../../core/utils/format.js';
20
+ import { classifyPromptKind } from '../../core/utils/noise-prompt.js';
22
21
  import { ContextInjector } from '../services/context-injector.js';
23
22
  import { KbInjector } from '../services/kb-injector.js';
24
23
  import { SpecGate } from '../services/spec-gate.js';
25
24
  import { emitDecisionHintSimple, resolveTriggerLen } from '../services/decision-hint.js';
25
+ import { emitLoopHintSimple } from '../services/loop-hint.js';
26
26
  import { OutcomeNudgeService } from '../services/outcome-nudge.js';
27
27
  export class UserPromptHandler {
28
28
  resume;
@@ -40,7 +40,15 @@ export class UserPromptHandler {
40
40
  * reference. Public so StopHandler can reach it without new ctor wiring.
41
41
  */
42
42
  outcomeNudge = new OutcomeNudgeService();
43
- constructor(resume = null, conventionExtractor = null, storage = null, skillRegistry = null,
43
+ constructor(resume = null, conventionExtractor = null, storage = null,
44
+ /**
45
+ * @deprecated Skill push routing was removed (skills are pull-only via
46
+ * MCP `skill-list` / `skill-invoke`); this handler never reads the
47
+ * registry anymore. The positional parameter is kept only for API
48
+ * compatibility with existing daemon/index.ts wiring and tests
49
+ * (decision ed98c8e8, 2026-06-10).
50
+ */
51
+ skillRegistry = null,
44
52
  /**
45
53
  * v9.x Phase 2b — backing store for approve-token short-circuit (step 0).
46
54
  * When null, step 0 is skipped (`approve <token>` falls through).
@@ -79,8 +87,19 @@ export class UserPromptHandler {
79
87
  // 1. Resume + convention (once per session, owned by ContextInjector).
80
88
  this.contextInjector.injectOnce(event, sessionKey, contextParts);
81
89
  // 2. KB injection — keyword query against .forge-knowledge/.
90
+ //
91
+ // Eligibility gate (decision d08da374): KB inject previously ran BEFORE
92
+ // any noise/length check (unlike the skill path which had its own
93
+ // isAgentCallbackPrompt guard), so it fired on `<task-notification>`
94
+ // envelopes, sub-8-char prompts, and bare acks — exactly the rows the
95
+ // web "eligible" denominator (SKILL_WORTHY_SQL in routing.ts) excludes.
96
+ // Mirroring that predicate here aligns the injection numerator with the
97
+ // metric denominator: KB only injects on a code-relevant prompt.
98
+ //
82
99
  // Failure modes (silently skipped, never break the prompt path).
83
- const kbResult = await this.kbInjector.inject(event, prompt, []);
100
+ const kbResult = isKbEligiblePrompt(prompt)
101
+ ? await this.kbInjector.inject(event, prompt, [])
102
+ : { block: null, hits: [] };
84
103
  if (kbResult.block) {
85
104
  contextParts.unshift(kbResult.block);
86
105
  logger.info(`[UserPrompt] Injected KB context: ${kbResult.hits.length} page(s), scores=[${kbResult.hits
@@ -125,6 +144,31 @@ export class UserPromptHandler {
125
144
  catch (err) {
126
145
  logger.warn(`[UserPrompt] Decision hint failed (skipped): ${err}`);
127
146
  }
147
+ // 3.4. Loop hint (decision e7d13697, Option C — advisory only).
148
+ // When the prompt looks like one of the 3 whitelisted loop-suitable
149
+ // scenarios (bug-fix / test-lint green / spec impl with a clean PASS
150
+ // criterion), mint an ADVISORY [LOOP HINT] suggesting the loop-until-
151
+ // verify-PASS pattern. ADDITIVE + SECONDARY to the decision hint above:
152
+ // both can fire for the same prompt; the loop hint never suppresses /
153
+ // replaces the decision hint. Zero auto-execution — the daemon NEVER
154
+ // calls `cf loop run`; the main thread still gates with a human review.
155
+ // Gated behind `loop.hint_enabled` (default true); telemetry row written
156
+ // on mint so adoption can later be measured (see services/loop-hint.ts).
157
+ try {
158
+ const loopHint = emitLoopHintSimple(prompt, this.storage, {
159
+ session_id: event.session_id,
160
+ project_path: event.project_path,
161
+ event_id: event.event_id,
162
+ timestamp: event.timestamp,
163
+ });
164
+ if (loopHint) {
165
+ systemParts.push(loopHint.message);
166
+ logger.info(`[UserPrompt] Loop hint emitted: scenario=${loopHint.scenario}`);
167
+ }
168
+ }
169
+ catch (err) {
170
+ logger.warn(`[UserPrompt] Loop hint failed (skipped): ${err}`);
171
+ }
128
172
  // 3.5. outcome-backfill soft-gate (decision 1ac6fc31). Independent
129
173
  // `[OUTCOME NUDGE]` section (NOT merged into the decision hint) reminding
130
174
  // the main thread / implementing agent to back-fill outcomes for resolved
@@ -142,51 +186,16 @@ export class UserPromptHandler {
142
186
  catch (err) {
143
187
  logger.warn(`[UserPrompt] Outcome nudge failed (skipped): ${err}`);
144
188
  }
145
- // 4. Skill injection — basic matching, no skill-pairing directive.
146
- // (Skill injection physically follows decision hint; numbering is
147
- // pipeline-order, not execution-priority.)
148
- // Skill invocations are recorded so skill_invocations table stays populated.
149
- if (this.skillRegistry) {
150
- try {
151
- const skillMatchResult = await this.skillRegistry.matchWithConfidence(prompt, []);
152
- if (skillMatchResult) {
153
- const { skill, source } = skillMatchResult;
154
- systemParts.push(formatSkillDirective(skill.name, skill.content));
155
- logger.info(`[UserPrompt] Skill matched: ${skill.id} (${source})`);
156
- if (this.storage) {
157
- try {
158
- this.storage.writeSkillInvocation({
159
- id: randomUUID(),
160
- route_request_id: null,
161
- session_id: event.session_id,
162
- agent_id: null,
163
- skill_id: skill.id,
164
- invocation_type: 'dynamic',
165
- reason: `Auto-matched by ${source} matching`,
166
- workflow: null,
167
- phase: null,
168
- feature_slug: null,
169
- artifact_path: null,
170
- depth: 0,
171
- success: 1,
172
- error: null,
173
- timestamp: Date.now(),
174
- });
175
- logger.debug(`[UserPrompt] Recorded skill invocation: ${skill.id}`);
176
- }
177
- catch (err) {
178
- logger.warn(`[UserPrompt] Failed to record skill invocation: ${err}`);
179
- }
180
- }
181
- }
182
- else {
183
- logger.debug(`[UserPrompt] No skill matched for prompt: "${truncateString(prompt, 80)}"`);
184
- }
185
- }
186
- catch (err) {
187
- logger.warn(`[UserPrompt] Skill matching failed: ${err}`);
188
- }
189
- }
189
+ // 4. Skill injection — REMOVED (decision d08da374).
190
+ //
191
+ // The main-thread UserPromptSubmit auto-match skill injection was retired:
192
+ // live evidence showed 515 injections vs 7 genuine Skill invocations in
193
+ // all history, 0 in the last 13 days, and a 1.3% follow-through — it is
194
+ // redundant with the agent-delegation protocol (agents invoke `Skill` on
195
+ // demand via mcp__claude-forge__skill_invoke, which is the ONLY path that
196
+ // still records skill_invocations — see src/skills/tools/skill-invoke.ts).
197
+ // The inject-time `writeSkillInvocation({ recorded_at_inject: 1 })` call
198
+ // and `formatSkillDirective` systemMessage are gone with it.
190
199
  const result = { allow: true };
191
200
  if (contextParts.length > 0)
192
201
  result.additionalContext = contextParts.join('\n\n');
@@ -239,13 +248,45 @@ export class UserPromptHandler {
239
248
  }
240
249
  // ── Module-private helpers ────────────────────────────────────────────────
241
250
  /**
242
- * Format skill injection directive.
251
+ * ACK / continuation keywords mirroring task-segmenter.ts ACK_CONTINUE_KEYWORDS
252
+ * and the routing.ts SKILL_WORTHY_SQL predicate. Kept in sync manually (the
253
+ * SQL form cannot import TS); when either list changes, update both.
243
254
  */
244
- function formatSkillDirective(skillName, skillContent) {
245
- return [
246
- `[SKILL: ${skillName}] [AUTO_MATCHED]`,
247
- '',
248
- skillContent,
249
- ].join('\n');
255
+ const ACK_CONTINUE_KEYWORDS = [
256
+ '继续', '然后', '还有', '另外', '好的', '可以', '是的', '批准', '同意',
257
+ 'ok', 'yes', 'continue',
258
+ ];
259
+ /** Max trimmed length for a prompt to count as a pure ack (mirrors ACK_MAX_LEN). */
260
+ const ACK_MAX_LEN = 16;
261
+ /** Min trimmed length for a prompt to be "skill-worthy" (mirrors SKILL_WORTHY_SQL). */
262
+ const MIN_ELIGIBLE_LEN = 8;
263
+ /**
264
+ * KB-injection eligibility gate (decision d08da374).
265
+ *
266
+ * Returns false for prompts the web "eligible" denominator excludes
267
+ * (SKILL_WORTHY_SQL in core/storage/routing.ts), so the KB-injection numerator
268
+ * lines up with that denominator. A prompt is INELIGIBLE when it is:
269
+ * 1. a framework / agent-callback envelope (classifyPromptKind !== 'user') —
270
+ * `<task-notification>`, `<system-reminder>`, `[Image #N]`, etc.;
271
+ * 2. too short — trimmed length < 8 (chit-chat / single token);
272
+ * 3. a pure ack / continuation — trimmed length ≤ 16 AND contains an
273
+ * ACK_CONTINUE keyword ("好的" / "继续" / "批准" / "ok" / "yes" / …).
274
+ *
275
+ * Mirrors routing.ts's SQL predicate so the injection path and the metric stay
276
+ * on the same definition of "code-relevant prompt".
277
+ */
278
+ function isKbEligiblePrompt(prompt) {
279
+ if (classifyPromptKind(prompt) !== 'user')
280
+ return false;
281
+ const trimmed = prompt.trim();
282
+ if (trimmed.length < MIN_ELIGIBLE_LEN)
283
+ return false;
284
+ if (trimmed.length <= ACK_MAX_LEN) {
285
+ const lower = trimmed.toLowerCase();
286
+ if (ACK_CONTINUE_KEYWORDS.some((kw) => lower.includes(kw.toLowerCase()))) {
287
+ return false;
288
+ }
289
+ }
290
+ return true;
250
291
  }
251
292
  //# sourceMappingURL=user-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Violation-content backfill (spec 1446 / decision 0df5271f).
3
+ *
4
+ * When the main thread VIOLATES (inline Edit/Write that should have spawned an
5
+ * agent), its tool ACTIONS are already in the events table but its natural-
6
+ * language output (reasoning / inline content) was never recorded. At Stop we
7
+ * read the session transcript JSONL, extract the assistant text generated DURING
8
+ * violation windows, and backfill it (PLAIN TEXT) into `events.ai_response` on
9
+ * the earliest inline-edit row of each window.
10
+ *
11
+ * Core-belief invariant (core-beliefs.md): this is PURELY passive recording.
12
+ * daemon / classifiers / loop NEVER read ai_response to auto-mint rules, change
13
+ * routing, or add intercepts.
14
+ *
15
+ * Transcript JSONL schema (verified against a real Claude Code transcript,
16
+ * 2026-06-17 — file ~/.claude/projects/<...>/<session>.jsonl):
17
+ * - top-level `type === 'assistant'`
18
+ * - `timestamp` — ISO string (e.g. "2026-06-17T01:47:40.838Z")
19
+ * - `isSidechain` — true for subagent (Task) turns; we SKIP those so
20
+ * only MAIN-THREAD assistant text is captured
21
+ * (subagent output is recorded separately).
22
+ * - `message.content[]` — array of blocks; we keep only `type === 'text'`
23
+ * `.text` (skip `thinking` / `tool_use` /
24
+ * `tool_result`).
25
+ * Parsing is DEFENSIVE: any missing/mistyped field → skip that line, never throw.
26
+ */
27
+ import type { Violation } from '../../core/insights/violation-reporter.js';
28
+ /** Merge violations whose timestamps are within this many minutes into one window. */
29
+ export declare const WINDOW_GAP_MIN = 10;
30
+ /** Padding (seconds) on each side of a window to tolerate hook↔transcript ts skew. */
31
+ export declare const PRE_PAD_SEC = 60;
32
+ export declare const POST_PAD_SEC = 60;
33
+ /** Cumulative byte ceiling read from the transcript before bailing out. */
34
+ export declare const MAX_TRANSCRIPT_BYTES: number;
35
+ /** Separator between assistant turns when joining a window's text. */
36
+ export declare const TURN_SEPARATOR = "\n\n---\n\n";
37
+ export interface ViolationWindow {
38
+ /** ISO lower bound (already padded). */
39
+ startIso: string;
40
+ /** ISO upper bound (already padded). */
41
+ endIso: string;
42
+ /** Unpadded earliest violation ts (for locating the inline-edit row). */
43
+ rawStartIso: string;
44
+ /** Unpadded latest violation ts. */
45
+ rawEndIso: string;
46
+ }
47
+ /**
48
+ * Merge a violation list's timestamps into padded time windows. Violations
49
+ * within WINDOW_GAP_MIN of each other collapse into one window. PRE/POST
50
+ * padding is applied to the merged bounds for transcript-turn alignment.
51
+ */
52
+ export declare function mergeViolationWindows(violations: Violation[]): ViolationWindow[];
53
+ /** One extracted main-thread assistant turn from the transcript. */
54
+ export interface AssistantTurn {
55
+ ts: number;
56
+ text: string;
57
+ }
58
+ /**
59
+ * Defensively extract a main-thread assistant text turn from one parsed JSONL
60
+ * object, or null if the line is not a usable main-thread assistant text turn.
61
+ * Exported for unit testing of the defensive-parse contract.
62
+ */
63
+ export declare function extractAssistantTurn(obj: unknown): AssistantTurn | null;
64
+ /**
65
+ * Stream-read a transcript JSONL file and return main-thread assistant turns
66
+ * whose timestamp falls within ANY of the given windows. Streaming + byte cap
67
+ * guard against pathologically large transcripts. Never throws — file/parse
68
+ * errors resolve to whatever was collected so far (possibly empty).
69
+ */
70
+ export declare function readAssistantTurnsInWindows(transcriptPath: string, windows: ViolationWindow[]): Promise<AssistantTurn[]>;
71
+ /**
72
+ * Join a window's assistant turns into the single ai_response string written to
73
+ * the window's earliest inline-edit row. Preserves time order, separates turns.
74
+ */
75
+ export declare function joinWindowText(turns: AssistantTurn[]): string;
76
+ //# sourceMappingURL=violation-content-backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"violation-content-backfill.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/violation-content-backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAE3E,sFAAsF;AACtF,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,sFAAsF;AACtF,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,QAAkB,CAAC;AACpD,sEAAsE;AACtE,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CA6BhF;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA2BvE;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,eAAe,EAAE,GACzB,OAAO,CAAC,aAAa,EAAE,CAAC,CA2C1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Violation-content backfill (spec 1446 / decision 0df5271f).
3
+ *
4
+ * When the main thread VIOLATES (inline Edit/Write that should have spawned an
5
+ * agent), its tool ACTIONS are already in the events table but its natural-
6
+ * language output (reasoning / inline content) was never recorded. At Stop we
7
+ * read the session transcript JSONL, extract the assistant text generated DURING
8
+ * violation windows, and backfill it (PLAIN TEXT) into `events.ai_response` on
9
+ * the earliest inline-edit row of each window.
10
+ *
11
+ * Core-belief invariant (core-beliefs.md): this is PURELY passive recording.
12
+ * daemon / classifiers / loop NEVER read ai_response to auto-mint rules, change
13
+ * routing, or add intercepts.
14
+ *
15
+ * Transcript JSONL schema (verified against a real Claude Code transcript,
16
+ * 2026-06-17 — file ~/.claude/projects/<...>/<session>.jsonl):
17
+ * - top-level `type === 'assistant'`
18
+ * - `timestamp` — ISO string (e.g. "2026-06-17T01:47:40.838Z")
19
+ * - `isSidechain` — true for subagent (Task) turns; we SKIP those so
20
+ * only MAIN-THREAD assistant text is captured
21
+ * (subagent output is recorded separately).
22
+ * - `message.content[]` — array of blocks; we keep only `type === 'text'`
23
+ * `.text` (skip `thinking` / `tool_use` /
24
+ * `tool_result`).
25
+ * Parsing is DEFENSIVE: any missing/mistyped field → skip that line, never throw.
26
+ */
27
+ import { createReadStream } from 'node:fs';
28
+ import { createInterface } from 'node:readline';
29
+ /** Merge violations whose timestamps are within this many minutes into one window. */
30
+ export const WINDOW_GAP_MIN = 10;
31
+ /** Padding (seconds) on each side of a window to tolerate hook↔transcript ts skew. */
32
+ export const PRE_PAD_SEC = 60;
33
+ export const POST_PAD_SEC = 60;
34
+ /** Cumulative byte ceiling read from the transcript before bailing out. */
35
+ export const MAX_TRANSCRIPT_BYTES = 5 * 1024 * 1024;
36
+ /** Separator between assistant turns when joining a window's text. */
37
+ export const TURN_SEPARATOR = '\n\n---\n\n';
38
+ /**
39
+ * Merge a violation list's timestamps into padded time windows. Violations
40
+ * within WINDOW_GAP_MIN of each other collapse into one window. PRE/POST
41
+ * padding is applied to the merged bounds for transcript-turn alignment.
42
+ */
43
+ export function mergeViolationWindows(violations) {
44
+ const tsList = violations
45
+ .map((v) => new Date(v.timestamp).getTime())
46
+ .filter((t) => Number.isFinite(t))
47
+ .sort((a, b) => a - b);
48
+ if (tsList.length === 0)
49
+ return [];
50
+ const gapMs = WINDOW_GAP_MIN * 60_000;
51
+ const windows = [];
52
+ let curStart = tsList[0];
53
+ let curEnd = tsList[0];
54
+ for (let i = 1; i < tsList.length; i++) {
55
+ const t = tsList[i];
56
+ if (t - curEnd <= gapMs) {
57
+ curEnd = t;
58
+ }
59
+ else {
60
+ windows.push({ start: curStart, end: curEnd });
61
+ curStart = t;
62
+ curEnd = t;
63
+ }
64
+ }
65
+ windows.push({ start: curStart, end: curEnd });
66
+ return windows.map((w) => ({
67
+ startIso: new Date(w.start - PRE_PAD_SEC * 1000).toISOString(),
68
+ endIso: new Date(w.end + POST_PAD_SEC * 1000).toISOString(),
69
+ rawStartIso: new Date(w.start).toISOString(),
70
+ rawEndIso: new Date(w.end).toISOString(),
71
+ }));
72
+ }
73
+ /**
74
+ * Defensively extract a main-thread assistant text turn from one parsed JSONL
75
+ * object, or null if the line is not a usable main-thread assistant text turn.
76
+ * Exported for unit testing of the defensive-parse contract.
77
+ */
78
+ export function extractAssistantTurn(obj) {
79
+ if (!obj || typeof obj !== 'object')
80
+ return null;
81
+ const o = obj;
82
+ if (o.type !== 'assistant')
83
+ return null;
84
+ // Skip subagent (sidechain) turns — only main-thread content is in scope.
85
+ if (o.isSidechain === true)
86
+ return null;
87
+ const tsRaw = o.timestamp;
88
+ if (typeof tsRaw !== 'string')
89
+ return null;
90
+ const ts = new Date(tsRaw).getTime();
91
+ if (!Number.isFinite(ts))
92
+ return null;
93
+ const message = o.message;
94
+ if (!message || typeof message !== 'object')
95
+ return null;
96
+ const content = message.content;
97
+ if (!Array.isArray(content))
98
+ return null;
99
+ const parts = [];
100
+ for (const block of content) {
101
+ if (!block || typeof block !== 'object')
102
+ continue;
103
+ const b = block;
104
+ if (b.type === 'text' && typeof b.text === 'string' && b.text.trim().length > 0) {
105
+ parts.push(b.text);
106
+ }
107
+ }
108
+ if (parts.length === 0)
109
+ return null;
110
+ return { ts, text: parts.join('\n') };
111
+ }
112
+ /**
113
+ * Stream-read a transcript JSONL file and return main-thread assistant turns
114
+ * whose timestamp falls within ANY of the given windows. Streaming + byte cap
115
+ * guard against pathologically large transcripts. Never throws — file/parse
116
+ * errors resolve to whatever was collected so far (possibly empty).
117
+ */
118
+ export async function readAssistantTurnsInWindows(transcriptPath, windows) {
119
+ if (windows.length === 0)
120
+ return [];
121
+ const ranges = windows.map((w) => ({
122
+ start: new Date(w.startIso).getTime(),
123
+ end: new Date(w.endIso).getTime(),
124
+ }));
125
+ const inAnyWindow = (ts) => ranges.some((r) => ts >= r.start && ts <= r.end);
126
+ const turns = [];
127
+ try {
128
+ const stream = createReadStream(transcriptPath, { encoding: 'utf-8' });
129
+ const rl = createInterface({ input: stream, crlfDelay: Infinity });
130
+ let bytes = 0;
131
+ for await (const line of rl) {
132
+ bytes += Buffer.byteLength(line, 'utf-8') + 1; // +1 for the stripped newline
133
+ if (bytes > MAX_TRANSCRIPT_BYTES) {
134
+ rl.close();
135
+ stream.destroy();
136
+ break;
137
+ }
138
+ if (!line.trim())
139
+ continue;
140
+ let obj;
141
+ try {
142
+ obj = JSON.parse(line);
143
+ }
144
+ catch {
145
+ continue; // malformed line — skip, never crash
146
+ }
147
+ const turn = extractAssistantTurn(obj);
148
+ if (turn && inAnyWindow(turn.ts)) {
149
+ turns.push(turn);
150
+ }
151
+ }
152
+ }
153
+ catch {
154
+ // file missing / read error — return whatever we have (possibly empty)
155
+ return turns;
156
+ }
157
+ turns.sort((a, b) => a.ts - b.ts);
158
+ return turns;
159
+ }
160
+ /**
161
+ * Join a window's assistant turns into the single ai_response string written to
162
+ * the window's earliest inline-edit row. Preserves time order, separates turns.
163
+ */
164
+ export function joinWindowText(turns) {
165
+ return turns.map((t) => t.text).join(TURN_SEPARATOR);
166
+ }
167
+ //# sourceMappingURL=violation-content-backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"violation-content-backfill.js","sourceRoot":"","sources":["../../../src/daemon/handlers/violation-content-backfill.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,28 @@
8
8
  * 4. Create event handlers and start socket server
9
9
  * 5. Handle graceful shutdown
10
10
  */
11
+ import { SQLiteStorage } from '../core/storage/sqlite.js';
11
12
  export interface DaemonOptions {
12
13
  /** Whether to enable the web server (default: use config value) */
13
14
  web?: boolean;
14
15
  }
15
16
  export declare function startDaemon(foreground?: boolean, options?: DaemonOptions): Promise<void>;
17
+ /**
18
+ * P2 dedup helper (audit e888352d).
19
+ *
20
+ * The merged UserPromptSubmit `additionalContext` recorded under the generic
21
+ * `<hook>Handler` source_handler often re-contains the KB block, which
22
+ * UserPromptHandler already recorded as its own `UserPromptSubmitHandler:kb`
23
+ * injection row. That double-count inflated injection metrics ~15%.
24
+ *
25
+ * Given the full merged additionalContext, this removes any sibling `:kb`
26
+ * injection content already recorded for the same `event_id`, returning the
27
+ * remaining context (resume/convention) to record under the generic handler.
28
+ * Returns null when nothing meaningful remains (→ caller skips the write, the
29
+ * `:kb` row being the sole record).
30
+ *
31
+ * Storage failures degrade gracefully to "record the full merged content"
32
+ * (no worse than the pre-fix behaviour).
33
+ */
34
+ export declare function stripAlreadyRecordedKb(storage: SQLiteStorage, eventId: string | undefined, merged: string): string | null;
16
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiEH,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAQD,wBAAsB,WAAW,CAAC,UAAU,GAAE,OAAe,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2rBzG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA4C1D,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAMD,wBAAsB,WAAW,CAAC,UAAU,GAAE,OAAe,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqkBzG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CA0Bf"}