akm-cli 0.9.0-rc.0 → 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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  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/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /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) }];