@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,146 @@
1
+ /**
2
+ * agent-distill-context.ts — Phase 3 retro-distill prompt assembly (decision
3
+ * 234f1ad4). Pure function: turns the read-only health/drift/failure signals
4
+ * into the structured prompt fed to the `agent-retro-distiller` template, plus a
5
+ * human-readable signal summary used by `--dry-run` (which never spawns the LLM).
6
+ *
7
+ * READ-ONLY: takes already-aggregated data + the template text, returns strings.
8
+ * No IO, no spawn, no template writes.
9
+ */
10
+ import { MIN_DELEGATIONS_FOR_SIGNAL, SUGGESTION_MIN_RATED } from './agent-health.js';
11
+ /**
12
+ * Command-level gate (门槛 1, spec §数据稀薄退化): below this delegation count we
13
+ * do NOT spawn the LLM — there is not enough usage signal to draft a confident
14
+ * change. = MIN_DELEGATIONS_FOR_SIGNAL × 5 (spec recommendation ≈ 15).
15
+ */
16
+ export const DISTILL_MIN_DELEGATIONS = MIN_DELEGATIONS_FOR_SIGNAL * 5;
17
+ /**
18
+ * Build the distill context (gates + maturity + summary + prompt + proposed
19
+ * change types) from read-only signals. Pure.
20
+ */
21
+ export function buildDistillContext(input) {
22
+ const delegations = input.health?.delegations ?? 0;
23
+ const maturity = `delegations=${delegations} rated_pairs=${input.ratedPairs} window_days=${input.windowDays}`;
24
+ // ── Gate (门槛 1): not enough delegations to trust the signal. ──────────────
25
+ let enoughSignal = true;
26
+ let insufficientReason = null;
27
+ if (delegations < DISTILL_MIN_DELEGATIONS) {
28
+ enoughSignal = false;
29
+ insufficientReason =
30
+ `数据不足(delegations=${delegations} < 阈值 ${DISTILL_MIN_DELEGATIONS}),建议先观测,未产改进草案。`;
31
+ }
32
+ // ── Collect the change types the evidence would support (门槛 2 per-pair). ──
33
+ const proposedChangeTypes = [];
34
+ const dead = [];
35
+ const weak = [];
36
+ if (input.health) {
37
+ for (const r of input.health.recommended_skills) {
38
+ // 门槛 2: a pair must clear SUGGESTION_MIN_RATED to drive a change.
39
+ if (r.recommendation_health === 'dead' && r.total_rated >= SUGGESTION_MIN_RATED) {
40
+ dead.push(`${r.skill_id} (${r.pulls} pull / actionable ${(r.actionable_rate * 100).toFixed(1)}%)`);
41
+ }
42
+ }
43
+ for (const w of input.health.weak_skills) {
44
+ // dead pairs are already surfaced above — don't double-count.
45
+ const rec = input.health.recommended_skills.find((r) => r.skill_id === w.skill_id);
46
+ if (rec?.recommendation_health === 'dead')
47
+ continue;
48
+ weak.push(`${w.skill_id} (actionable ${(w.actionable_rate * 100).toFixed(1)}%, sample ${w.total_rated})`);
49
+ }
50
+ }
51
+ if (dead.length > 0) {
52
+ proposedChangeTypes.push(`skill-discovery 段降权死推荐: ${dead.join('; ')}`);
53
+ }
54
+ if (weak.length > 0) {
55
+ proposedChangeTypes.push(`复核弱推荐 pull 步: ${weak.join('; ')}`);
56
+ }
57
+ for (const d of input.drift) {
58
+ if (d.kind === 'dangling-ref')
59
+ proposedChangeTypes.push(`删/换悬空引用: ${d.skill_id}`);
60
+ else if (d.kind === 'orphan-skill')
61
+ proposedChangeTypes.push(`提示孤儿高分 skill: ${d.skill_id}`);
62
+ else if (d.kind === 'no-pull')
63
+ proposedChangeTypes.push(`核查声明但零 pull 的步骤 (${d.agent})`);
64
+ }
65
+ if (input.failureSamples.length > 0) {
66
+ proposedChangeTypes.push(`据 ${input.failureSamples.length} 条 failed 执行补防线说明`);
67
+ }
68
+ // ── Human-readable summary (the --dry-run payload). ────────────────────────
69
+ const summaryLines = [];
70
+ summaryLines.push(`# Agent distill 信号摘要: ${input.agent}`);
71
+ summaryLines.push(`> 当前 version: ${input.currentVersion} | 信号成熟度: ${maturity}`);
72
+ summaryLines.push('');
73
+ if (!enoughSignal) {
74
+ summaryLines.push(`⚠ ${insufficientReason}`);
75
+ summaryLines.push('');
76
+ }
77
+ summaryLines.push('## 死/弱推荐信号');
78
+ if (input.health && input.health.recommended_skills.length > 0) {
79
+ for (const r of input.health.recommended_skills) {
80
+ const flag = r.recommendation_health === 'dead' ? ' ⚠ 死推荐' : '';
81
+ summaryLines.push(`- ${r.skill_id}: ${r.pulls} pull / actionable ${(r.actionable_rate * 100).toFixed(1)}% [${r.recommendation_health}]${flag}`);
82
+ }
83
+ }
84
+ else {
85
+ summaryLines.push('- (无推荐 skill 信号)');
86
+ }
87
+ summaryLines.push('');
88
+ summaryLines.push('## drift');
89
+ if (input.drift.length > 0) {
90
+ for (const d of input.drift)
91
+ summaryLines.push(`- [${d.kind}] ${d.message}`);
92
+ }
93
+ else {
94
+ summaryLines.push('- (无)');
95
+ }
96
+ summaryLines.push('');
97
+ summaryLines.push('## failed 执行样本');
98
+ if (input.failureSamples.length > 0) {
99
+ for (const f of input.failureSamples) {
100
+ summaryLines.push(`- ${f.title} (session ${f.session_id})`);
101
+ }
102
+ }
103
+ else {
104
+ summaryLines.push('- (无 failed 样本)');
105
+ }
106
+ summaryLines.push('');
107
+ summaryLines.push('## 拟改动类型(会喂给 distiller)');
108
+ if (proposedChangeTypes.length > 0) {
109
+ for (const t of proposedChangeTypes)
110
+ summaryLines.push(`- ${t}`);
111
+ }
112
+ else {
113
+ summaryLines.push('- (无足够信号支撑改动,distiller 预期产 NOOP)');
114
+ }
115
+ const summary = summaryLines.join('\n');
116
+ // ── Structured prompt for the distiller (real spawn only). ─────────────────
117
+ const healthJson = input.health
118
+ ? JSON.stringify({
119
+ recommended_skills: input.health.recommended_skills,
120
+ weak_skills: input.health.weak_skills,
121
+ suggestions: input.health.suggestions,
122
+ }, null, 2)
123
+ : '{}';
124
+ const driftJson = JSON.stringify(input.drift, null, 2);
125
+ const failuresText = input.failureSamples.length > 0
126
+ ? input.failureSamples.map((f) => `- ${f.title} (session ${f.session_id})`).join('\n')
127
+ : '(none)';
128
+ const prompt = [
129
+ `<agent_name>${input.agent}</agent_name>`,
130
+ `<current_version>${input.currentVersion}</current_version>`,
131
+ `<current_template>\n${input.currentTemplate}\n</current_template>`,
132
+ `<health_signals>\n${healthJson}\n</health_signals>`,
133
+ `<drift>\n${driftJson}\n</drift>`,
134
+ `<failure_samples>\n${failuresText}\n</failure_samples>`,
135
+ `<maturity>${maturity}</maturity>`,
136
+ ].join('\n\n');
137
+ return {
138
+ enoughSignal,
139
+ insufficientReason,
140
+ maturity,
141
+ summary,
142
+ prompt,
143
+ proposedChangeTypes,
144
+ };
145
+ }
146
+ //# sourceMappingURL=agent-distill-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-distill-context.js","sourceRoot":"","sources":["../../../src/core/insights/agent-distill-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * agent-distill-spawn.ts — Phase 3 retro-distiller headless spawn + envelope
3
+ * parsing (decision 234f1ad4). A near-copy of the proven skill-distiller spawn
4
+ * chain (`src/skills/distill/distiller.ts spawnSkillDistillerAgent`), retargeted
5
+ * at the `agent-retro-distiller` template.
6
+ *
7
+ * 红线: this module is invoked ONLY from `cf agent distill` (a human-typed CLI
8
+ * command), never from the daemon. It spawns `claude -p --agent
9
+ * agent-retro-distiller` headless (same OAuth-via-subscription path as the skill
10
+ * distiller, NO `--bare`), with `CLAUDE_FORGE_DISTILL_SPAWN=1` so the hook
11
+ * entry-points short-circuit and no fan-out loop forms.
12
+ *
13
+ * The distiller emits ONE envelope:
14
+ * - `---AGENT-PATCH---...---END---` (target_version + unified diff + rationale)
15
+ * - `---NOOP---...---END---` (signals too thin to draft a confident change)
16
+ */
17
+ export declare class ClaudeCliMissingError extends Error {
18
+ constructor();
19
+ }
20
+ export interface AgentDistillSpawnOptions {
21
+ cancelSignal?: AbortSignal;
22
+ timeoutMs?: number;
23
+ }
24
+ /**
25
+ * Spawn `claude -p --agent agent-retro-distiller --output-format stream-json
26
+ * --verbose --include-partial-messages --input-format text` with the prompt on
27
+ * stdin. Accumulates assistant text and returns it raw (pre-envelope-parse).
28
+ *
29
+ * Exported for testing — but the real LLM call is NEVER exercised by automated
30
+ * tests (cost). Tests inject a fake spawn via the `runDistill` deps.
31
+ */
32
+ export declare function spawnAgentRetroDistiller(prompt: string, opts?: AgentDistillSpawnOptions): Promise<string>;
33
+ export interface AgentPatchEnvelope {
34
+ kind: 'patch';
35
+ /** target_version field from the envelope (informational; adoption bumps it). */
36
+ targetVersion: number | null;
37
+ /** The unified-diff / patch body. */
38
+ patch: string;
39
+ /** Free-form rationale block (everything that is not target_version/patch). */
40
+ rationale: string;
41
+ }
42
+ export interface AgentNoopEnvelope {
43
+ kind: 'noop';
44
+ rationale: string;
45
+ }
46
+ export type ParsedAgentEnvelope = AgentPatchEnvelope | AgentNoopEnvelope;
47
+ /**
48
+ * Parse the distiller's single envelope. Returns:
49
+ * - { kind: 'patch', ... } for `---AGENT-PATCH---...---END---`
50
+ * - { kind: 'noop', ... } for `---NOOP---...---END---`
51
+ * - null if neither envelope is present (caller treats as a spawn error).
52
+ *
53
+ * Tolerant to surrounding chatter (mirrors parseSkillBlock/parseSkipBlock).
54
+ */
55
+ export declare function parseAgentPatchEnvelope(raw: string): ParsedAgentEnvelope | null;
56
+ //# sourceMappingURL=agent-distill-spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-distill-spawn.d.ts","sourceRoot":"","sources":["../../../src/core/insights/agent-distill-spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,qBAAa,qBAAsB,SAAQ,KAAK;;CAO/C;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,MAAM,CAAC,CAoGjB;AAID,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,iFAAiF;IACjF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEzE;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CA8B/E"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * agent-distill-spawn.ts — Phase 3 retro-distiller headless spawn + envelope
3
+ * parsing (decision 234f1ad4). A near-copy of the proven skill-distiller spawn
4
+ * chain (`src/skills/distill/distiller.ts spawnSkillDistillerAgent`), retargeted
5
+ * at the `agent-retro-distiller` template.
6
+ *
7
+ * 红线: this module is invoked ONLY from `cf agent distill` (a human-typed CLI
8
+ * command), never from the daemon. It spawns `claude -p --agent
9
+ * agent-retro-distiller` headless (same OAuth-via-subscription path as the skill
10
+ * distiller, NO `--bare`), with `CLAUDE_FORGE_DISTILL_SPAWN=1` so the hook
11
+ * entry-points short-circuit and no fan-out loop forms.
12
+ *
13
+ * The distiller emits ONE envelope:
14
+ * - `---AGENT-PATCH---...---END---` (target_version + unified diff + rationale)
15
+ * - `---NOOP---...---END---` (signals too thin to draft a confident change)
16
+ */
17
+ import { spawn } from 'node:child_process';
18
+ import { findClaudeBin } from '../utils/claude-cli-resolver.js';
19
+ const DEFAULT_TIMEOUT_MS = 600_000;
20
+ export class ClaudeCliMissingError extends Error {
21
+ constructor() {
22
+ super('[agent-distill] claude CLI not found on PATH. Install via `brew install claude` or `npm i -g @anthropic-ai/claude-code`.');
23
+ this.name = 'ClaudeCliMissingError';
24
+ }
25
+ }
26
+ /**
27
+ * Spawn `claude -p --agent agent-retro-distiller --output-format stream-json
28
+ * --verbose --include-partial-messages --input-format text` with the prompt on
29
+ * stdin. Accumulates assistant text and returns it raw (pre-envelope-parse).
30
+ *
31
+ * Exported for testing — but the real LLM call is NEVER exercised by automated
32
+ * tests (cost). Tests inject a fake spawn via the `runDistill` deps.
33
+ */
34
+ export async function spawnAgentRetroDistiller(prompt, opts = {}) {
35
+ const claudeBin = findClaudeBin();
36
+ if (!claudeBin)
37
+ throw new ClaudeCliMissingError();
38
+ const args = [
39
+ '-p',
40
+ '--agent', 'agent-retro-distiller',
41
+ '--output-format', 'stream-json',
42
+ '--verbose',
43
+ '--include-partial-messages',
44
+ '--input-format', 'text',
45
+ ];
46
+ return new Promise((resolve, reject) => {
47
+ const child = spawn(claudeBin, args, {
48
+ stdio: ['pipe', 'pipe', 'pipe'],
49
+ env: { ...process.env, CLAUDE_FORGE_DISTILL_SPAWN: '1' },
50
+ });
51
+ let assistantText = '';
52
+ let stderr = '';
53
+ let buffer = '';
54
+ let settled = false;
55
+ const settle = (fn) => {
56
+ if (settled)
57
+ return;
58
+ settled = true;
59
+ fn();
60
+ };
61
+ const cancelHandler = () => {
62
+ try {
63
+ child.kill('SIGTERM');
64
+ }
65
+ catch { /* ignore */ }
66
+ settle(() => reject(new Error('[agent-distill] cancelled by user')));
67
+ };
68
+ opts.cancelSignal?.addEventListener('abort', cancelHandler);
69
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
70
+ const timeoutId = setTimeout(() => {
71
+ try {
72
+ child.kill('SIGTERM');
73
+ }
74
+ catch { /* ignore */ }
75
+ settle(() => reject(new Error(`[agent-distill] claude CLI timeout after ${timeoutMs}ms`)));
76
+ }, timeoutMs);
77
+ child.stdout.on('data', (chunk) => {
78
+ buffer += chunk.toString('utf-8');
79
+ let nl;
80
+ while ((nl = buffer.indexOf('\n')) >= 0) {
81
+ const line = buffer.slice(0, nl).trim();
82
+ buffer = buffer.slice(nl + 1);
83
+ if (!line)
84
+ continue;
85
+ try {
86
+ const ev = JSON.parse(line);
87
+ if (ev.type === 'assistant' || ev.type === 'assistant_message') {
88
+ const content = ev.content;
89
+ if (Array.isArray(content)) {
90
+ for (const c of content) {
91
+ if (c && typeof c === 'object' && typeof c.text === 'string') {
92
+ assistantText += c.text;
93
+ }
94
+ }
95
+ }
96
+ else if (typeof ev.text === 'string') {
97
+ assistantText += ev.text;
98
+ }
99
+ }
100
+ else if (ev.type === 'content_block_delta') {
101
+ const delta = ev.delta;
102
+ if (delta && typeof delta.text === 'string')
103
+ assistantText += delta.text;
104
+ }
105
+ else if (ev.type === 'message_delta' || ev.type === 'text_delta') {
106
+ const delta = ev.delta;
107
+ if (typeof delta === 'string')
108
+ assistantText += delta;
109
+ }
110
+ else if (ev.type === 'result') {
111
+ const result = ev.result;
112
+ if (typeof result === 'string' && !assistantText)
113
+ assistantText = result;
114
+ }
115
+ }
116
+ catch {
117
+ // ignore non-JSON lines
118
+ }
119
+ }
120
+ });
121
+ child.stderr.on('data', (chunk) => {
122
+ stderr += chunk.toString('utf-8');
123
+ });
124
+ child.on('close', (code) => {
125
+ clearTimeout(timeoutId);
126
+ opts.cancelSignal?.removeEventListener('abort', cancelHandler);
127
+ if (code === 0) {
128
+ settle(() => resolve(assistantText));
129
+ }
130
+ else {
131
+ settle(() => reject(new Error(`[agent-distill] claude CLI exited ${code}: ${stderr.slice(0, 500)}`)));
132
+ }
133
+ });
134
+ child.on('error', (err) => {
135
+ clearTimeout(timeoutId);
136
+ opts.cancelSignal?.removeEventListener('abort', cancelHandler);
137
+ settle(() => reject(new Error(`[agent-distill] claude CLI spawn error: ${err.message}`)));
138
+ });
139
+ child.stdin.write(prompt);
140
+ child.stdin.end();
141
+ });
142
+ }
143
+ /**
144
+ * Parse the distiller's single envelope. Returns:
145
+ * - { kind: 'patch', ... } for `---AGENT-PATCH---...---END---`
146
+ * - { kind: 'noop', ... } for `---NOOP---...---END---`
147
+ * - null if neither envelope is present (caller treats as a spawn error).
148
+ *
149
+ * Tolerant to surrounding chatter (mirrors parseSkillBlock/parseSkipBlock).
150
+ */
151
+ export function parseAgentPatchEnvelope(raw) {
152
+ const noop = raw.match(/---NOOP---\s*([\s\S]*?)\s*---END---/);
153
+ if (noop) {
154
+ return { kind: 'noop', rationale: noop[1].trim() || '(no rationale)' };
155
+ }
156
+ const m = raw.match(/---AGENT-PATCH---\s*([\s\S]*?)\s*---END---/);
157
+ if (!m)
158
+ return null;
159
+ const inner = m[1];
160
+ // target_version: <N>
161
+ const tvMatch = inner.match(/target_version:\s*([0-9]+)/);
162
+ const targetVersion = tvMatch ? Number(tvMatch[1]) : null;
163
+ // The patch body is delimited by a fenced ```diff block when present,
164
+ // otherwise everything after a `patch:` marker. Fall back to the whole inner.
165
+ let patch = '';
166
+ const fence = inner.match(/```(?:diff|patch)?\s*\n([\s\S]*?)```/);
167
+ if (fence) {
168
+ patch = fence[1].trimEnd();
169
+ }
170
+ else {
171
+ const patchMarker = inner.match(/patch:\s*\n([\s\S]+)/);
172
+ patch = (patchMarker ? patchMarker[1] : inner).trimEnd();
173
+ }
174
+ // Rationale = lines that look like rationale, else the inner minus the patch.
175
+ const ratMatch = inner.match(/rationale:\s*([\s\S]+?)(?:\n```|\npatch:|\ntarget_version:|$)/i);
176
+ const rationale = ratMatch ? ratMatch[1].trim() : '(no rationale)';
177
+ return { kind: 'patch', targetVersion, patch, rationale };
178
+ }
179
+ //# sourceMappingURL=agent-distill-spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-distill-spawn.js","sourceRoot":"","sources":["../../../src/core/insights/agent-distill-spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Agent↔Skill 双向 drift 检测 (decision 234f1ad4, Phase 1 / P1-5).
3
+ *
4
+ * 三条规则(全部 READ-ONLY,只产 nudge / 报告行,绝不自动改模板):
5
+ * ① 行为 drift:模板声明「必 pull skill」但窗口内对该 agent 零 pull(委托量≥阈值)。
6
+ * ② trigger → skill 悬空引用:模板 trigger table 引用的 skill_id 在 skill 目录已不存在/改名。
7
+ * ③ skill → agent 悬空 skill:高 actionable_rate skill 没有任何 agent trigger table 引用。
8
+ *
9
+ * 检测口径:正则 `cf skill invoke (distilled-[a-z-]+)` 从 templates/agents/*.md 抽引用集合;
10
+ * 与 (a) 已知 skill_id 集合做差集(②),(b) aggregateSkillUsefulness 结果做差集(③)。
11
+ *
12
+ * 不变量:扫模板只读、产建议/nudge,绝不自动改模板。
13
+ */
14
+ export interface TriggerRefs {
15
+ /** agent template name (basename without .md) → set of referenced skill_ids. */
16
+ byAgent: Map<string, Set<string>>;
17
+ /** Union of all referenced skill_ids across all agent templates. */
18
+ all: Set<string>;
19
+ }
20
+ /**
21
+ * Scan agent template markdown for `cf skill invoke distilled-*` trigger rows.
22
+ * READ-ONLY. Returns per-agent referenced skill_id sets + their union.
23
+ *
24
+ * @param templatesDir directory holding `*.md` agent templates (source of truth).
25
+ */
26
+ export declare function extractTriggerRefs(templatesDir: string): TriggerRefs;
27
+ export type DriftKind = 'no-pull' | 'dangling-ref' | 'orphan-skill';
28
+ export interface DriftNudge {
29
+ kind: DriftKind;
30
+ agent?: string;
31
+ skill_id?: string;
32
+ message: string;
33
+ }
34
+ /** Min total_rated + helped ratio for a skill to count as "high usefulness" (③). */
35
+ export declare const ORPHAN_MIN_RATED = 10;
36
+ export declare const ORPHAN_MIN_ACTIONABLE_RATE = 0.5;
37
+ /** Min delegations for a "声明 pull 但零 pull" (①) drift to fire. */
38
+ export declare const NO_PULL_MIN_DELEGATIONS = 3;
39
+ export interface DetectAgentDriftInput {
40
+ /** Trigger refs scanned from templates (extractTriggerRefs). */
41
+ triggerRefs: TriggerRefs;
42
+ /** Set of skill_ids that currently EXIST (skill dir + builtin distilled). */
43
+ knownSkillIds: Set<string>;
44
+ /**
45
+ * Skill usefulness rows (aggregateSkillUsefulness) — used for ③ orphan-skill.
46
+ * Each row: skill_id + total_rated + actionable_rate.
47
+ */
48
+ skillUsefulness: Array<{
49
+ skill_id: string;
50
+ total_rated: number;
51
+ actionable_rate: number;
52
+ }>;
53
+ /**
54
+ * Per-agent observed pull counts (reason-prefix proxy → distinct skill pulls)
55
+ * for ① no-pull. Map agent-template-name → set of skill_ids actually pulled
56
+ * in window. Optional — when omitted, rule ① is skipped.
57
+ */
58
+ pulledByAgent?: Map<string, Set<string>>;
59
+ /** Per-agent delegation count (for ① threshold). Optional. */
60
+ delegationsByAgent?: Map<string, number>;
61
+ }
62
+ /**
63
+ * Run all three drift rules. Pure: no IO (callers pass scanned inputs).
64
+ */
65
+ export declare function detectAgentDrift(input: DetectAgentDriftInput): DriftNudge[];
66
+ //# sourceMappingURL=agent-drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-drift.d.ts","sourceRoot":"","sources":["../../../src/core/insights/agent-drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,oEAAoE;IACpE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW,CA2BpE;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,cAAc,GAAG,cAAc,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,iEAAiE;AACjE,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,WAAW,EAAE,WAAW,CAAC;IACzB,6EAA6E;IAC7E,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B;;;OAGG;IACH,eAAe,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F;;;;OAIG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,UAAU,EAAE,CA8C3E"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Agent↔Skill 双向 drift 检测 (decision 234f1ad4, Phase 1 / P1-5).
3
+ *
4
+ * 三条规则(全部 READ-ONLY,只产 nudge / 报告行,绝不自动改模板):
5
+ * ① 行为 drift:模板声明「必 pull skill」但窗口内对该 agent 零 pull(委托量≥阈值)。
6
+ * ② trigger → skill 悬空引用:模板 trigger table 引用的 skill_id 在 skill 目录已不存在/改名。
7
+ * ③ skill → agent 悬空 skill:高 actionable_rate skill 没有任何 agent trigger table 引用。
8
+ *
9
+ * 检测口径:正则 `cf skill invoke (distilled-[a-z-]+)` 从 templates/agents/*.md 抽引用集合;
10
+ * 与 (a) 已知 skill_id 集合做差集(②),(b) aggregateSkillUsefulness 结果做差集(③)。
11
+ *
12
+ * 不变量:扫模板只读、产建议/nudge,绝不自动改模板。
13
+ */
14
+ import { readdirSync, readFileSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ const SKILL_INVOKE_RE = /cf skill invoke\s+(distilled-[a-z0-9-]+)/g;
17
+ /**
18
+ * Scan agent template markdown for `cf skill invoke distilled-*` trigger rows.
19
+ * READ-ONLY. Returns per-agent referenced skill_id sets + their union.
20
+ *
21
+ * @param templatesDir directory holding `*.md` agent templates (source of truth).
22
+ */
23
+ export function extractTriggerRefs(templatesDir) {
24
+ const byAgent = new Map();
25
+ const all = new Set();
26
+ let files;
27
+ try {
28
+ files = readdirSync(templatesDir).filter((f) => f.endsWith('.md'));
29
+ }
30
+ catch {
31
+ return { byAgent, all };
32
+ }
33
+ for (const file of files) {
34
+ const agent = file.replace(/\.md$/, '');
35
+ let content;
36
+ try {
37
+ content = readFileSync(join(templatesDir, file), 'utf-8');
38
+ }
39
+ catch {
40
+ continue;
41
+ }
42
+ const refs = new Set();
43
+ SKILL_INVOKE_RE.lastIndex = 0;
44
+ let m;
45
+ while ((m = SKILL_INVOKE_RE.exec(content)) !== null) {
46
+ refs.add(m[1]);
47
+ all.add(m[1]);
48
+ }
49
+ if (refs.size > 0)
50
+ byAgent.set(agent, refs);
51
+ }
52
+ return { byAgent, all };
53
+ }
54
+ /** Min total_rated + helped ratio for a skill to count as "high usefulness" (③). */
55
+ export const ORPHAN_MIN_RATED = 10;
56
+ export const ORPHAN_MIN_ACTIONABLE_RATE = 0.5;
57
+ /** Min delegations for a "声明 pull 但零 pull" (①) drift to fire. */
58
+ export const NO_PULL_MIN_DELEGATIONS = 3;
59
+ /**
60
+ * Run all three drift rules. Pure: no IO (callers pass scanned inputs).
61
+ */
62
+ export function detectAgentDrift(input) {
63
+ const nudges = [];
64
+ // ② trigger → skill 悬空引用:引用了不存在的 skill_id。
65
+ for (const [agent, refs] of input.triggerRefs.byAgent) {
66
+ for (const skillId of refs) {
67
+ if (!input.knownSkillIds.has(skillId)) {
68
+ nudges.push({
69
+ kind: 'dangling-ref',
70
+ agent,
71
+ skill_id: skillId,
72
+ message: `agent ${agent} 的 trigger table 指向死/改名 skill「${skillId}」(skill 目录中不存在),建议更新引用。`,
73
+ });
74
+ }
75
+ }
76
+ }
77
+ // ③ skill → agent 悬空 skill:高 usefulness 但无任何 agent 引用。
78
+ for (const row of input.skillUsefulness) {
79
+ if (row.total_rated < ORPHAN_MIN_RATED)
80
+ continue;
81
+ if (row.actionable_rate < ORPHAN_MIN_ACTIONABLE_RATE)
82
+ continue;
83
+ if (input.triggerRefs.all.has(row.skill_id))
84
+ continue;
85
+ nudges.push({
86
+ kind: 'orphan-skill',
87
+ skill_id: row.skill_id,
88
+ message: `skill「${row.skill_id}」实测高 usefulness(actionable_rate ${(row.actionable_rate * 100).toFixed(0)}%,样本 ${row.total_rated})但无任何 agent trigger table 引用,建议某 agent 纳入推荐。`,
89
+ });
90
+ }
91
+ // ① 行为 drift:模板声明 pull 但窗口内零 pull(委托量≥阈值)。
92
+ if (input.pulledByAgent && input.delegationsByAgent) {
93
+ for (const [agent, refs] of input.triggerRefs.byAgent) {
94
+ const delegations = input.delegationsByAgent.get(agent) ?? 0;
95
+ if (delegations < NO_PULL_MIN_DELEGATIONS)
96
+ continue;
97
+ const pulled = input.pulledByAgent.get(agent) ?? new Set();
98
+ if (pulled.size === 0) {
99
+ nudges.push({
100
+ kind: 'no-pull',
101
+ agent,
102
+ message: `agent ${agent} 模板声明了 skill 推荐(${refs.size} 个),但窗口内被委托 ${delegations} 次却零对应 skill pull——行为 drift,建议核查 pull 步是否被忽略。`,
103
+ });
104
+ }
105
+ }
106
+ }
107
+ return nudges;
108
+ }
109
+ //# sourceMappingURL=agent-drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-drift.js","sourceRoot":"","sources":["../../../src/core/insights/agent-drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared source resolvers for Agent 体检 / drift (decision 234f1ad4, Phase 1).
3
+ *
4
+ * Resolves the agent-template source-of-truth directory and the set of known
5
+ * skill_ids, so both the web endpoint and `cf agent retro` build identical
6
+ * trigger-ref / drift inputs without duplicating resolution logic.
7
+ *
8
+ * READ-ONLY: only reads template/skill files; never mutates them.
9
+ */
10
+ import { type TriggerRefs } from './agent-drift.js';
11
+ /**
12
+ * Resolve the agent template source-of-truth directory.
13
+ * Compiled: dist/core/insights/*.js → dist/daemon/templates/agents
14
+ * Dev (vitest): src/core/insights/*.ts → src/daemon/templates/agents
15
+ */
16
+ export declare function resolveAgentTemplatesDir(): string;
17
+ /** All skill_ids that currently exist (built-in distilled + user skills). */
18
+ export declare function loadKnownSkillIds(): Set<string>;
19
+ /** Scan the source-of-truth templates dir for trigger refs (convenience). */
20
+ export declare function loadTriggerRefs(templatesDir?: string): TriggerRefs;
21
+ //# sourceMappingURL=agent-evolution-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-evolution-sources.d.ts","sourceRoot":"","sources":["../../../src/core/insights/agent-evolution-sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,CAAC,CAO/C;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CAElE"}