akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -1,9 +1,11 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- // Output text formatters for `akm reflect` / `akm propose` (#226).
4
+ // Output text formatters for `akm reflect` / `akm proposal new` (#226; the
5
+ // latter formerly the top-level `akm propose`, moved in the 0.9 CLI
6
+ // overhaul, S8).
5
7
  import { formatProposalProducerPlain } from "../helpers.js";
6
8
  export const proposalProducerFormatters = [
7
9
  { command: "reflect", handler: (r) => formatProposalProducerPlain("reflect", r) },
8
- { command: "propose", handler: (r) => formatProposalProducerPlain("propose", r) },
10
+ { command: "proposal-new", handler: (r) => formatProposalProducerPlain("proposal new", r) },
9
11
  ];
@@ -0,0 +1,202 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Plain-text renderers for `akm proposal *` commands.
6
+ *
7
+ * Split out of `helpers.ts` (formerly 1418 lines / 59 fns) as its own
8
+ * sibling module: proposal listing/show share the gate-decision summary
9
+ * helpers. (`akm distill` has no registered top-level command — its former
10
+ * plain-text renderer, `formatDistillPlain`, was dead code; removed per
11
+ * R-063/B5.)
12
+ */
13
+ export function formatProposalProducerPlain(command, r) {
14
+ if (r.ok === false) {
15
+ const reason = String(r.reason);
16
+ const error = typeof r.error === "string" ? r.error : "";
17
+ const lines = [`${command}: failed (${reason})`];
18
+ if (error)
19
+ lines.push(` error: ${error}`);
20
+ if (r.ref)
21
+ lines.push(` ref: ${String(r.ref)}`);
22
+ if (r.exitCode !== undefined && r.exitCode !== null) {
23
+ lines.push(` exitCode: ${String(r.exitCode)}`);
24
+ }
25
+ return lines.join("\n");
26
+ }
27
+ const proposal = r.proposal;
28
+ const id = String(proposal.id);
29
+ const ref = String(r.ref);
30
+ const status = String(proposal.status);
31
+ return `${command}: queued proposal ${id} (${ref}) [${status}]`;
32
+ }
33
+ /**
34
+ * Render a one-line gate-decision summary for the proposal list / show surfaces
35
+ * (#577), e.g. `gate=deferred:max-diff-lines (210 > 200)`. Returns the empty
36
+ * string when no well-formed decision is present.
37
+ */
38
+ export function formatGateDecisionSummary(raw) {
39
+ if (typeof raw !== "object" || raw === null)
40
+ return "";
41
+ const d = raw;
42
+ const outcome = typeof d.outcome === "string" ? d.outcome : undefined;
43
+ if (!outcome)
44
+ return "";
45
+ const reason = typeof d.reason === "string" && d.reason.length > 0 ? `:${d.reason}` : "";
46
+ const cmp = formatGateThresholdComparison(d);
47
+ return `gate=${outcome}${reason}${cmp ? ` (${cmp})` : ""}`;
48
+ }
49
+ /**
50
+ * Reconstruct the drain threshold comparison when both operands are present.
51
+ * Returns the empty string when the decision lacks either operand.
52
+ */
53
+ function formatGateThresholdComparison(d) {
54
+ const thresholds = (typeof d.thresholds === "object" && d.thresholds !== null ? d.thresholds : {});
55
+ const measured = typeof d.measured === "number" ? d.measured : undefined;
56
+ if (measured === undefined)
57
+ return "";
58
+ if (typeof thresholds.maxDiffLines === "number") {
59
+ return `${measured} > ${thresholds.maxDiffLines}`;
60
+ }
61
+ if (typeof thresholds.minContentLines === "number") {
62
+ return `${measured} < ${thresholds.minContentLines}`;
63
+ }
64
+ return "";
65
+ }
66
+ export function formatProposalListPlain(r) {
67
+ const proposals = r.proposals;
68
+ const total = r.totalCount;
69
+ if (proposals.length === 0) {
70
+ // NEW-1: `akm reflect` and `akm distill` are internal improve-pipeline
71
+ // process names (src/commands/improve/{reflect,distill}.ts), not
72
+ // registered top-level commands (see the subCommands map in src/cli.ts) —
73
+ // an agent following this hint would run a command that does not exist.
74
+ // The real ways to queue a proposal are `akm improve <ref>` (which runs
75
+ // the reflect/distill/consolidate pipeline internally) and
76
+ // `akm proposal new`.
77
+ return `${total} proposal(s).\nNo proposals.\nGenerate one with \`akm improve <ref>\` or \`akm proposal new <type> <name> --task ...\`.`;
78
+ }
79
+ const lines = [`${total} proposal(s)`, ""];
80
+ for (const p of proposals) {
81
+ const id = String(p.id);
82
+ const ref = String(p.ref);
83
+ const status = String(p.status);
84
+ const source = String(p.source);
85
+ const created = String(p.createdAt);
86
+ // #577: surface the gate verdict inline so the queue explains itself.
87
+ const gate = formatGateDecisionSummary(p.gateDecision);
88
+ const gateSuffix = gate ? ` ${gate}` : "";
89
+ lines.push(`${id} [${status}] ${ref} source=${source} ${created}${gateSuffix}`);
90
+ }
91
+ return lines.join("\n").trimEnd();
92
+ }
93
+ export function formatProposalShowPlain(r) {
94
+ const p = r.proposal;
95
+ const lines = [];
96
+ lines.push(`# proposal ${String(p.id)}`);
97
+ lines.push(`ref: ${String(p.ref)}`);
98
+ lines.push(`status: ${String(p.status)}`);
99
+ lines.push(`source: ${String(p.source)}`);
100
+ if (p.sourceRun)
101
+ lines.push(`sourceRun: ${String(p.sourceRun)}`);
102
+ if (p.createdAt)
103
+ lines.push(`createdAt: ${String(p.createdAt)}`);
104
+ if (p.updatedAt)
105
+ lines.push(`updatedAt: ${String(p.updatedAt)}`);
106
+ if (typeof p.confidence === "number")
107
+ lines.push(`confidence: ${p.confidence.toFixed(2)}`);
108
+ // #577: gate decision (auto-accepted / deferred / auto-rejected + reason +
109
+ // thresholds), when this proposal has passed through a gate.
110
+ const gate = p.gateDecision;
111
+ if (gate && typeof gate.outcome === "string") {
112
+ lines.push(`gate.decision: ${String(gate.outcome)}`);
113
+ lines.push(`gate.reason: ${String(gate.reason)}`);
114
+ const cmp = formatGateThresholdComparison(gate);
115
+ if (cmp)
116
+ lines.push(`gate.thresholds: ${cmp}`);
117
+ if (gate.gate)
118
+ lines.push(`gate.by: ${String(gate.gate)}`);
119
+ if (gate.decidedAt)
120
+ lines.push(`gate.decidedAt: ${String(gate.decidedAt)}`);
121
+ }
122
+ const review = p.review;
123
+ if (review) {
124
+ lines.push(`review.outcome: ${String(review.outcome ?? "?")}`);
125
+ if (review.reason)
126
+ lines.push(`review.reason: ${String(review.reason)}`);
127
+ if (review.decidedAt)
128
+ lines.push(`review.decidedAt: ${String(review.decidedAt)}`);
129
+ }
130
+ const validation = r.validation;
131
+ if (validation) {
132
+ const findings = Array.isArray(validation.findings) ? validation.findings : [];
133
+ // Partition findings by severity. `severity: "warn"` findings are
134
+ // non-blocking (the validator reports `ok: true` for a warn-only proposal),
135
+ // so they must read as advisory — a distinct icon/label from blocking errors.
136
+ const warnings = findings.filter((f) => f.severity === "warn");
137
+ const errors = findings.filter((f) => f.severity !== "warn");
138
+ lines.push("");
139
+ if (errors.length > 0) {
140
+ const warnSuffix = warnings.length > 0 ? `, ${warnings.length} warning(s)` : "";
141
+ lines.push(`✗ invalid (${errors.length} error(s)${warnSuffix})`);
142
+ }
143
+ else if (warnings.length > 0) {
144
+ lines.push(`✓ valid (${warnings.length} warning(s))`);
145
+ }
146
+ else {
147
+ lines.push("✓ valid");
148
+ }
149
+ // Errors first (blocking), then warnings (advisory, non-blocking).
150
+ for (const f of errors) {
151
+ lines.push(` ✗ error [${String(f.kind)}] ${String(f.message)}`);
152
+ }
153
+ for (const f of warnings) {
154
+ lines.push(` ⚠ warning [${String(f.kind)}] ${String(f.message)} (non-blocking)`);
155
+ }
156
+ }
157
+ const payload = p.payload;
158
+ if (payload && typeof payload.content === "string") {
159
+ lines.push("");
160
+ lines.push("payload:");
161
+ lines.push(payload.content);
162
+ }
163
+ return lines.join("\n").trimEnd();
164
+ }
165
+ export function formatProposalAcceptPlain(r) {
166
+ return `Accepted proposal ${String(r.id)} → ${String(r.ref)} at ${String(r.assetPath)}`;
167
+ }
168
+ export function formatProposalRejectPlain(r) {
169
+ const reason = r.reason ? ` (${String(r.reason)})` : "";
170
+ return `Rejected proposal ${String(r.id)} (${String(r.ref)})${reason}`;
171
+ }
172
+ export function formatProposalDrainPlain(r) {
173
+ const policy = String(r.policy ?? "?");
174
+ const applyMode = String(r.applyMode ?? "queue");
175
+ const promoted = Array.isArray(r.promoted) ? r.promoted : [];
176
+ const rejected = Array.isArray(r.rejected) ? r.rejected : [];
177
+ const deferred = Array.isArray(r.deferred) ? r.deferred : [];
178
+ const skippedByCap = Array.isArray(r.skippedByCap) ? r.skippedByCap : [];
179
+ const staged = Array.isArray(r.staged) ? r.staged : [];
180
+ const prefix = r.dryRun === true ? "[dry-run] " : "";
181
+ const lines = [
182
+ `${prefix}Drained proposal queue (strategy=${String(r.strategy ?? "?")}, policy=${policy}, applyMode=${applyMode})`,
183
+ ` promoted: ${promoted.length}`,
184
+ ` rejected: ${rejected.length}`,
185
+ ` deferred: ${deferred.length}`,
186
+ ` skippedByCap: ${skippedByCap.length}`,
187
+ ` staged: ${staged.length}`,
188
+ ];
189
+ for (const d of deferred) {
190
+ lines.push(` - ${String(d.id ?? "?")} (${String(d.reason ?? "?")})`);
191
+ }
192
+ return lines.join("\n").trimEnd();
193
+ }
194
+ export function formatProposalDiffPlain(r) {
195
+ const header = r.isNew
196
+ ? `# proposal ${String(r.id)} (new asset: ${String(r.ref)})`
197
+ : `# proposal ${String(r.id)} (update: ${String(r.ref)})`;
198
+ const unified = typeof r.unified === "string" ? r.unified : "";
199
+ if (!unified)
200
+ return `${header}\n(no changes)`;
201
+ return `${header}\n${unified}`;
202
+ }
@@ -2,11 +2,10 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  // Output text formatters for `akm registry *` commands.
5
- import { formatRegistryAddPlain, formatRegistryBuildIndexPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, } from "./helpers.js";
5
+ import { formatRegistryAddPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, } from "./helpers.js";
6
6
  export const registryCommandFormatters = [
7
7
  { command: "registry-list", handler: (r) => formatRegistryListPlain(r) },
8
8
  { command: "registry-add", handler: (r) => formatRegistryAddPlain(r) },
9
9
  { command: "registry-remove", handler: (r) => formatRegistryRemovePlain(r) },
10
10
  { command: "registry-search", handler: (r, detail) => formatRegistrySearchPlain(r, detail) },
11
- { command: "registry-build-index", handler: (r) => formatRegistryBuildIndexPlain(r) },
12
11
  ];
@@ -1,7 +1,15 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- const TEXT_FORMATTER_REGISTRY = new Map();
4
+ /**
5
+ * Plain-text formatter registry.
6
+ *
7
+ * Separated from `text.ts` so per-command formatter modules can import
8
+ * `registerTextFormatter` without creating a circular dependency back into
9
+ * the main text module.
10
+ */
11
+ import { createCommandRegistry } from "../command-registry.js";
12
+ const TEXT_FORMATTER_REGISTRY = createCommandRegistry();
5
13
  /**
6
14
  * Register a plain-text formatter for a command name.
7
15
  *
@@ -13,7 +21,7 @@ const TEXT_FORMATTER_REGISTRY = new Map();
13
21
  * ```
14
22
  */
15
23
  export function registerTextFormatter(command, handler) {
16
- TEXT_FORMATTER_REGISTRY.set(command, handler);
24
+ TEXT_FORMATTER_REGISTRY.register(command, handler);
17
25
  }
18
26
  /**
19
27
  * Register a batch of {@link TextFormatterEntry} definitions in iteration order.
@@ -23,15 +31,13 @@ export function registerTextFormatter(command, handler) {
23
31
  * with no reliance on module import order.
24
32
  */
25
33
  export function registerTextFormatters(entries) {
26
- for (const { command, handler } of entries) {
27
- TEXT_FORMATTER_REGISTRY.set(command, handler);
28
- }
34
+ TEXT_FORMATTER_REGISTRY.registerAll(entries);
29
35
  }
30
36
  /**
31
37
  * Remove a previously-registered text formatter. Test-only utility.
32
38
  */
33
39
  export function deregisterTextFormatter(command) {
34
- TEXT_FORMATTER_REGISTRY.delete(command);
40
+ TEXT_FORMATTER_REGISTRY.deregister(command);
35
41
  }
36
42
  /**
37
43
  * Look up a registered text formatter by command name.
@@ -0,0 +1,117 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `akm show` agent-directive emission.
6
+ *
7
+ * Extracted from `formatShowPlain` (formerly the largest function in
8
+ * `helpers.ts`): once the base show content is assembled, this module
9
+ * appends the REC-01/REC-09 APPLY / show-loop / workflow-active directive
10
+ * blocks that tell the calling agent how to act on the rendered asset.
11
+ * Directive strings are byte-identical to the pre-extraction version —
12
+ * only the seam moved.
13
+ */
14
+ import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
15
+ /**
16
+ * Append the type-specific agent directive block to an in-progress
17
+ * `formatShowPlain` render. Mutates `lines` in place (matches the original
18
+ * inline behavior — push/unshift/splice all operate on the same array the
19
+ * caller continues to join afterward).
20
+ */
21
+ export function appendShowDirectives(lines, r) {
22
+ // REC-01 / REC-09: Append a type-specific directive so agents apply the
23
+ // content rather than substituting training-data approximations.
24
+ const assetType = typeof r.type === "string" ? r.type : null;
25
+ // 0.9.0 (Q-02 / R-002): the retired `type:name` colon grammar is gone —
26
+ // build the slash conceptId the same way the workflow branch below does
27
+ // (`workflows/${name}`), via the entry's own already-computed `ref` when
28
+ // present (it carries correct bundle-qualification), falling back to a
29
+ // type-derived conceptId for callers that don't set `ref`.
30
+ const assetRef = typeof r.ref === "string"
31
+ ? r.ref
32
+ : typeof r.name === "string" && assetType
33
+ ? conceptIdFromTypeName(assetType, r.name)
34
+ : null;
35
+ // Show-loop detection: if the agent has shown this asset 3+ times without
36
+ // writing anything, surface a warning so it stops cycling and acts.
37
+ const showLoopCount = typeof r.showLoopWarning === "number" ? r.showLoopWarning : 0;
38
+ if (showLoopCount >= 3) {
39
+ lines.push("");
40
+ lines.push(`WARNING: You have shown this asset ${showLoopCount} times without completing the task.`);
41
+ lines.push("Stop re-reading — you have the information you need. Act on it now:");
42
+ lines.push(" - Write your output file using the content above.");
43
+ lines.push(` - If this asset does not contain what you need, run \`akm feedback '${assetRef ?? "<ref>"}' --negative\` and search for a different asset.`);
44
+ }
45
+ if (assetType === "skill" || assetType === "knowledge") {
46
+ const activeRun = r.activeRun;
47
+ if (activeRun) {
48
+ // Active workflow: redirect agent to workflow commands instead of direct apply
49
+ lines.unshift(` akm workflow complete '${activeRun.runId}'${activeRun.stepId ? ` --step '${activeRun.stepId}'` : ""}`);
50
+ lines.unshift("Read this schema, then follow your workflow step's instructions to edit the workspace file. When done, mark the step complete:");
51
+ lines.unshift(`WORKFLOW ACTIVE — schema shown as reference (run: ${activeRun.runId})`);
52
+ lines.unshift("---");
53
+ lines.unshift("");
54
+ // Still show feedback line at the end but skip the APPLY directive
55
+ lines.push("");
56
+ lines.push(`Run \`akm feedback ${assetRef ? `'${assetRef}'` : "<ref>"} --positive\` if the step succeeds, or \`--negative\` if this schema did not help.`);
57
+ }
58
+ else {
59
+ // No active workflow: show the APPLY directive. Branch on whether this
60
+ // skill primarily teaches CLI commands (shell output) vs YAML schema.
61
+ const preApplyLines = [...lines];
62
+ lines.push("");
63
+ lines.push("---");
64
+ if (isCommandOutputSkill(preApplyLines)) {
65
+ lines.push("APPLY (only if no workflow step is required for this task):");
66
+ lines.push(" 1. Identify the output file from README.md (typically commands.txt).");
67
+ lines.push(" 2. Write the exact command syntax from the code blocks above — replace every placeholder (`<name>`, `<value>`) with a real, concrete value from your task context. Do not write placeholder text.");
68
+ lines.push(" 3. Each command should be on a single line (no backslash line continuation unless the verifier expects it).");
69
+ lines.push(`Run \`akm feedback ${assetRef ? `'${assetRef}'` : "<ref>"} --positive\` after the task succeeds, or \`--negative\` if this reference did not contain the needed command syntax.`);
70
+ }
71
+ else {
72
+ lines.push("APPLY (only if no workflow step is required for this task):");
73
+ lines.push(" 1. Identify the target file from README.md — write or edit it. If the file does not yet exist, CREATE it with the full structure from this schema.");
74
+ lines.push(" 2. Add/edit the fields shown above using the exact field names from this schema.");
75
+ lines.push(" 3. COPY the exact YAML structure and field names from the code blocks above — do not substitute synonyms or invent nesting. Replace every placeholder value with a real, concrete value from your task context. Do not leave any field as null, empty, or a placeholder.");
76
+ lines.push(`Run \`akm feedback ${assetRef ? `'${assetRef}'` : "<ref>"} --positive\` after the task succeeds, or \`--negative\` if the task fails after following this guidance.`);
77
+ }
78
+ }
79
+ }
80
+ else if (assetType === "workflow") {
81
+ const workflowName = typeof r.name === "string" ? r.name : null;
82
+ const workflowRef = workflowName ? `workflows/${workflowName}` : "<ref>";
83
+ // Insert action directive BEFORE the workflow content by prepending to lines at the
84
+ // separator position. We find where the header ends and insert after the first `---`.
85
+ // Since lines already contain the full content at this point, we locate the insertion
86
+ // index: right after the first `---` separator if present, otherwise after the header.
87
+ const separatorIdx = lines.indexOf("---");
88
+ const insertIdx = separatorIdx >= 0 ? separatorIdx + 1 : r.type || r.name ? 1 : 0;
89
+ const actionDirective = [
90
+ `ACTION REQUIRED: Do not execute steps manually from this output.`,
91
+ `Run \`akm workflow next '${workflowRef}'\` to get your current step with exact instructions.`,
92
+ "---",
93
+ ];
94
+ lines.splice(insertIdx, 0, "", ...actionDirective);
95
+ lines.push("");
96
+ lines.push("---");
97
+ lines.push(`NEXT STEP: Run \`akm workflow next '${workflowRef}'\` to see the current workflow step.`);
98
+ lines.push("Do not edit workspace files before completing each step with `akm workflow complete`.");
99
+ }
100
+ }
101
+ /**
102
+ * Detect whether a skill's rendered content primarily teaches CLI commands
103
+ * rather than YAML schema. Used to select the right APPLY directive variant.
104
+ *
105
+ * Heuristic: count code-block lines that start with known shell command
106
+ * prefixes vs lines that look like YAML key-value pairs. If CLI lines
107
+ * outnumber YAML lines (and there is at least one CLI line), treat the
108
+ * skill as command-output.
109
+ */
110
+ function isCommandOutputSkill(lines) {
111
+ const codeLines = lines.filter((l) => l.startsWith(" ") || l.startsWith("\t") || /^`/.test(l));
112
+ const cliPattern = /^(az |kubectl |docker |git |helm |terraform |aws |gcloud )/;
113
+ const yamlPattern = /^\s+\w+:/;
114
+ const cliCount = codeLines.filter((l) => cliPattern.test(l.trim())).length;
115
+ const yamlCount = codeLines.filter((l) => yamlPattern.test(l)).length;
116
+ return cliCount > yamlCount && cliCount > 0;
117
+ }
@@ -0,0 +1,103 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { appendShowDirectives } from "./show-directives.js";
5
+ export function formatShowPlain(r, detail) {
6
+ const lines = [];
7
+ if (r.type || r.name) {
8
+ lines.push(`# ${String(r.type ?? "asset")}: ${String(r.name ?? "unknown")}`);
9
+ }
10
+ if (r.path && r.editable !== false) {
11
+ lines.push(`file: ${String(r.path)}`);
12
+ }
13
+ if (r.origin !== undefined)
14
+ lines.push(`# origin: ${String(r.origin)}`);
15
+ if (r.action)
16
+ lines.push(`# ${String(r.action)}`);
17
+ if (r.description)
18
+ lines.push(`description: ${String(r.description)}`);
19
+ if (r.workflowTitle)
20
+ lines.push(`workflowTitle: ${String(r.workflowTitle)}`);
21
+ if (r.agent)
22
+ lines.push(`agent: ${String(r.agent)}`);
23
+ if (Array.isArray(r.parameters) && r.parameters.length > 0)
24
+ lines.push(`parameters: ${r.parameters.join(", ")}`);
25
+ if (Array.isArray(r.workflowParameters) && r.workflowParameters.length > 0) {
26
+ lines.push("workflowParameters:");
27
+ for (const parameter of r.workflowParameters) {
28
+ const name = typeof parameter.name === "string" ? parameter.name : "unknown";
29
+ const description = typeof parameter.description === "string" && parameter.description.trim() ? `: ${parameter.description}` : "";
30
+ lines.push(` - ${name}${description}`);
31
+ }
32
+ }
33
+ if (r.modelHint != null)
34
+ lines.push(`modelHint: ${String(r.modelHint)}`);
35
+ if (r.toolPolicy != null)
36
+ lines.push(`toolPolicy: ${JSON.stringify(r.toolPolicy)}`);
37
+ if (r.run)
38
+ lines.push(`run: ${String(r.run)}`);
39
+ if (r.setup)
40
+ lines.push(`setup: ${String(r.setup)}`);
41
+ if (r.cwd)
42
+ lines.push(`cwd: ${String(r.cwd)}`);
43
+ if (detail === "full") {
44
+ if (r.path)
45
+ lines.push(`path: ${String(r.path)}`);
46
+ if (r.editable !== undefined)
47
+ lines.push(`editable: ${String(r.editable)}`);
48
+ if (r.editHint)
49
+ lines.push(`editHint: ${String(r.editHint)}`);
50
+ if (r.schemaVersion !== undefined)
51
+ lines.push(`schemaVersion: ${String(r.schemaVersion)}`);
52
+ }
53
+ const related = typeof r.related === "object" && r.related !== null ? r.related : undefined;
54
+ const relatedHits = related && Array.isArray(related.hits) ? related.hits : [];
55
+ if (related) {
56
+ lines.push("");
57
+ lines.push(`related: ${String(related.total ?? relatedHits.length)}`);
58
+ for (const hit of relatedHits) {
59
+ lines.push(` - ${String(hit.type ?? "?")}: ${formatRelatedLabel(hit)}`);
60
+ const shared = Array.isArray(hit.sharedEntities) ? hit.sharedEntities.map(String) : [];
61
+ if (shared.length > 0)
62
+ lines.push(` shared: ${shared.join(", ")}`);
63
+ lines.push(` relationCount: ${String(hit.relationCount ?? 0)}`);
64
+ }
65
+ }
66
+ const payloads = [r.content, r.template, r.prompt].filter((value) => value != null).map(String);
67
+ if (Array.isArray(r.steps) && r.steps.length > 0) {
68
+ if (lines.length > 0)
69
+ lines.push("");
70
+ lines.push("steps:");
71
+ for (const [index, step] of r.steps.entries()) {
72
+ const title = typeof step.title === "string" ? step.title : "Untitled step";
73
+ const id = typeof step.id === "string" ? step.id : "unknown";
74
+ lines.push(` ${index + 1}. ${title} [${id}]`);
75
+ if (typeof step.instructions === "string" && step.instructions.trim()) {
76
+ const instrLines = step.instructions.trim().split("\n");
77
+ lines.push(` instructions: ${instrLines[0]}`);
78
+ for (const instrLine of instrLines.slice(1))
79
+ lines.push(` ${instrLine}`);
80
+ }
81
+ if (Array.isArray(step.completionCriteria) && step.completionCriteria.length > 0) {
82
+ lines.push(" completion:");
83
+ for (const criterion of step.completionCriteria) {
84
+ lines.push(` - ${String(criterion)}`);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ if (payloads.length > 0) {
90
+ if (lines.length > 0)
91
+ lines.push("");
92
+ lines.push(...payloads);
93
+ }
94
+ appendShowDirectives(lines, r);
95
+ return lines.length > 0 ? lines.join("\n") : null;
96
+ }
97
+ function formatRelatedLabel(hit) {
98
+ const ref = typeof hit.ref === "string" ? hit.ref : undefined;
99
+ if (ref)
100
+ return ref;
101
+ const pathValue = typeof hit.path === "string" ? hit.path : "?";
102
+ return pathValue.split("/").pop() ?? pathValue;
103
+ }
@@ -0,0 +1,5 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { formatSyncPlain } from "./helpers.js";
5
+ export const syncFormatters = [{ command: "sync", handler: (r) => formatSyncPlain(r) }];