akm-cli 0.9.0-rc.8 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -0,0 +1,88 @@
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 { renderStatusEntries } from "./status-list.js";
5
+ const ARTIFACT_ORDER = ["config", "state", "workflow", "index"];
6
+ const ARTIFACT_LABEL = {
7
+ config: "config.json",
8
+ state: "state.db",
9
+ workflow: "workflow.db",
10
+ index: "index.db",
11
+ };
12
+ /** Lower rank sorts first (worse-first) via `renderStatusEntries`. */
13
+ function artifactSeverity(status) {
14
+ switch (status) {
15
+ case "corrupt":
16
+ case "inconsistent":
17
+ case "newer":
18
+ return { rank: 0, glyph: "✗" };
19
+ case "old":
20
+ return { rank: 1, glyph: "⚠" };
21
+ case "missing":
22
+ return { rank: 2, glyph: "?" };
23
+ default: // "current"
24
+ return { rank: 3, glyph: "✓" };
25
+ }
26
+ }
27
+ function planGlyph(status) {
28
+ switch (status) {
29
+ case "current":
30
+ return "✓";
31
+ case "ready":
32
+ return "⚠";
33
+ case "not-applicable":
34
+ return "·";
35
+ default: // "blocked"
36
+ return "✗";
37
+ }
38
+ }
39
+ export function formatMigratePlain(result) {
40
+ if (!result || typeof result !== "object")
41
+ return null;
42
+ const plan = result;
43
+ if (typeof plan.status !== "string")
44
+ return null;
45
+ const lines = [`${planGlyph(plan.status)} ${plan.status}`];
46
+ if (plan.message)
47
+ lines.push(` ${plan.message}`);
48
+ if (plan.activeOperation) {
49
+ lines.push(` in-flight ${plan.activeOperation.kind} at ${plan.activeOperation.sentinelPath}`);
50
+ }
51
+ if (plan.artifacts) {
52
+ const entries = ARTIFACT_ORDER.filter((name) => plan.artifacts?.[name]).map((name) => {
53
+ const artifact = plan.artifacts?.[name];
54
+ const { rank, glyph } = artifactSeverity(artifact.status);
55
+ const detailLines = [];
56
+ if (artifact.detail)
57
+ detailLines.push(artifact.detail);
58
+ if (artifact.migrationIds?.length)
59
+ detailLines.push(`migrations applied: ${artifact.migrationIds.length}`);
60
+ return { severityRank: rank, glyph, headline: `${ARTIFACT_LABEL[name]}: ${artifact.status}`, detailLines };
61
+ });
62
+ lines.push("", "artifacts:", ...renderStatusEntries(entries).map((line) => ` ${line}`));
63
+ }
64
+ if (plan.targetConfig) {
65
+ const target = plan.targetConfig;
66
+ lines.push("", `target config: ${target.status} (source: ${target.source}${target.path ? `, ${target.path}` : ""})`);
67
+ if (target.detail)
68
+ lines.push(` ${target.detail}`);
69
+ }
70
+ if (plan.generatedConfig) {
71
+ const generated = plan.generatedConfig;
72
+ lines.push("", `generated config: ${generated.status} at ${generated.path}`);
73
+ if (generated.droppedKeys.length > 0) {
74
+ lines.push(` drops (add engines/defaults yourself if needed): ${generated.droppedKeys.join(", ")}`);
75
+ }
76
+ }
77
+ if (plan.blockers?.length) {
78
+ lines.push("", "blockers:", ...plan.blockers.map((blocker) => ` - ${blocker}`));
79
+ }
80
+ if (plan.backupPath) {
81
+ lines.push("", `backup: ${plan.backupPath}${plan.backupRunId ? ` (run ${plan.backupRunId})` : ""}`);
82
+ }
83
+ return lines.join("\n");
84
+ }
85
+ export const migrateFormatters = [
86
+ { command: "migrate-status", handler: (r) => formatMigratePlain(r) },
87
+ { command: "migrate-apply", handler: (r) => formatMigratePlain(r) },
88
+ ];
@@ -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
  ];
@@ -2,16 +2,17 @@
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
  /**
5
- * Plain-text renderers for `akm proposal *` and `akm distill` commands.
5
+ * Plain-text renderers for `akm proposal *` commands.
6
6
  *
7
7
  * Split out of `helpers.ts` (formerly 1418 lines / 59 fns) as its own
8
8
  * sibling module: proposal listing/show share the gate-decision summary
9
- * helpers, and distill is the producer of proposals, so the cluster stays
10
- * together.
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.)
11
12
  */
12
13
  export function formatProposalProducerPlain(command, r) {
13
14
  if (r.ok === false) {
14
- const reason = String(r.reason ?? "unknown");
15
+ const reason = String(r.reason);
15
16
  const error = typeof r.error === "string" ? r.error : "";
16
17
  const lines = [`${command}: failed (${reason})`];
17
18
  if (error)
@@ -23,16 +24,16 @@ export function formatProposalProducerPlain(command, r) {
23
24
  }
24
25
  return lines.join("\n");
25
26
  }
26
- const proposal = r.proposal ?? {};
27
- const id = String(proposal.id ?? "?");
28
- const ref = String(r.ref ?? proposal.ref ?? "?");
29
- const status = String(proposal.status ?? "pending");
27
+ const proposal = r.proposal;
28
+ const id = String(proposal.id);
29
+ const ref = String(r.ref);
30
+ const status = String(proposal.status);
30
31
  return `${command}: queued proposal ${id} (${ref}) [${status}]`;
31
32
  }
32
33
  /**
33
34
  * Render a one-line gate-decision summary for the proposal list / show surfaces
34
- * (#577), e.g. `gate=deferred:below-threshold (0.72 < 0.90)`. Returns the empty
35
- * string for a missing or malformed decision so legacy proposals render cleanly.
35
+ * (#577), e.g. `gate=deferred:max-diff-lines (210 > 200)`. Returns the empty
36
+ * string when no well-formed decision is present.
36
37
  */
37
38
  export function formatGateDecisionSummary(raw) {
38
39
  if (typeof raw !== "object" || raw === null)
@@ -46,48 +47,43 @@ export function formatGateDecisionSummary(raw) {
46
47
  return `gate=${outcome}${reason}${cmp ? ` (${cmp})` : ""}`;
47
48
  }
48
49
  /**
49
- * Reconstruct the threshold comparison the gate applied, when both sides are
50
- * present (e.g. confidence 0.72 vs. autoAccept 0.90 → "0.72 < 0.90"). Returns
51
- * the empty string when the decision lacks the operands.
50
+ * Reconstruct the drain threshold comparison when both operands are present.
51
+ * Returns the empty string when the decision lacks either operand.
52
52
  */
53
53
  function formatGateThresholdComparison(d) {
54
54
  const thresholds = (typeof d.thresholds === "object" && d.thresholds !== null ? d.thresholds : {});
55
- const confidence = typeof d.confidence === "number" ? d.confidence : undefined;
56
- const autoAccept = typeof thresholds.autoAccept === "number" ? thresholds.autoAccept : undefined;
57
- if (confidence !== undefined && autoAccept !== undefined) {
58
- const op = confidence >= autoAccept ? ">=" : "<";
59
- return `${confidence.toFixed(2)} ${op} ${autoAccept.toFixed(2)}`;
60
- }
61
- // Drain bands: when the measured value is present, render the full comparison
62
- // ("210 > 200" / "1 < 5"); otherwise fall back to the bound alone (#577).
63
55
  const measured = typeof d.measured === "number" ? d.measured : undefined;
56
+ if (measured === undefined)
57
+ return "";
64
58
  if (typeof thresholds.maxDiffLines === "number") {
65
- return measured !== undefined
66
- ? `${measured} > ${thresholds.maxDiffLines}`
67
- : `maxDiffLines=${thresholds.maxDiffLines}`;
59
+ return `${measured} > ${thresholds.maxDiffLines}`;
68
60
  }
69
61
  if (typeof thresholds.minContentLines === "number") {
70
- return measured !== undefined
71
- ? `${measured} < ${thresholds.minContentLines}`
72
- : `minContentLines=${thresholds.minContentLines}`;
62
+ return `${measured} < ${thresholds.minContentLines}`;
73
63
  }
74
64
  return "";
75
65
  }
76
66
  export function formatProposalListPlain(r) {
77
- const proposals = Array.isArray(r.proposals) ? r.proposals : [];
78
- const total = typeof r.totalCount === "number" ? r.totalCount : proposals.length;
67
+ const proposals = r.proposals;
68
+ const total = r.totalCount;
79
69
  if (proposals.length === 0) {
80
- return `${total} proposal(s).\nNo proposals.\nGenerate one with \`akm reflect <ref>\`, \`akm propose <type> <name> --task ...\`, or \`akm distill <ref>\`.`;
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 ...\`.`;
81
78
  }
82
79
  const lines = [`${total} proposal(s)`, ""];
83
80
  for (const p of proposals) {
84
- const id = String(p.id ?? "?");
85
- const ref = String(p.ref ?? "?");
86
- const status = String(p.status ?? "?");
87
- const source = String(p.source ?? "?");
88
- const created = String(p.createdAt ?? "?");
89
- // #577: surface the gate verdict inline so the queue explains itself
90
- // ("deferred: below-threshold"). Legacy proposals carry no gateDecision.
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.
91
87
  const gate = formatGateDecisionSummary(p.gateDecision);
92
88
  const gateSuffix = gate ? ` ${gate}` : "";
93
89
  lines.push(`${id} [${status}] ${ref} source=${source} ${created}${gateSuffix}`);
@@ -95,12 +91,12 @@ export function formatProposalListPlain(r) {
95
91
  return lines.join("\n").trimEnd();
96
92
  }
97
93
  export function formatProposalShowPlain(r) {
98
- const p = r.proposal ?? {};
94
+ const p = r.proposal;
99
95
  const lines = [];
100
- lines.push(`# proposal ${String(p.id ?? "?")}`);
101
- lines.push(`ref: ${String(p.ref ?? "?")}`);
102
- lines.push(`status: ${String(p.status ?? "?")}`);
103
- lines.push(`source: ${String(p.source ?? "?")}`);
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)}`);
104
100
  if (p.sourceRun)
105
101
  lines.push(`sourceRun: ${String(p.sourceRun)}`);
106
102
  if (p.createdAt)
@@ -110,12 +106,11 @@ export function formatProposalShowPlain(r) {
110
106
  if (typeof p.confidence === "number")
111
107
  lines.push(`confidence: ${p.confidence.toFixed(2)}`);
112
108
  // #577: gate decision (auto-accepted / deferred / auto-rejected + reason +
113
- // thresholds). Absent on legacy proposals — render "unknown" so the field is
114
- // always present and the operator never sees a silent gap.
109
+ // thresholds), when this proposal has passed through a gate.
115
110
  const gate = p.gateDecision;
116
111
  if (gate && typeof gate.outcome === "string") {
117
112
  lines.push(`gate.decision: ${String(gate.outcome)}`);
118
- lines.push(`gate.reason: ${gate.reason ? String(gate.reason) : "unknown"}`);
113
+ lines.push(`gate.reason: ${String(gate.reason)}`);
119
114
  const cmp = formatGateThresholdComparison(gate);
120
115
  if (cmp)
121
116
  lines.push(`gate.thresholds: ${cmp}`);
@@ -124,9 +119,6 @@ export function formatProposalShowPlain(r) {
124
119
  if (gate.decidedAt)
125
120
  lines.push(`gate.decidedAt: ${String(gate.decidedAt)}`);
126
121
  }
127
- else {
128
- lines.push("gate.decision: unknown");
129
- }
130
122
  const review = p.review;
131
123
  if (review) {
132
124
  lines.push(`review.outcome: ${String(review.outcome ?? "?")}`);
@@ -171,11 +163,11 @@ export function formatProposalShowPlain(r) {
171
163
  return lines.join("\n").trimEnd();
172
164
  }
173
165
  export function formatProposalAcceptPlain(r) {
174
- return `Accepted proposal ${String(r.id ?? "?")} → ${String(r.ref ?? "?")} at ${String(r.assetPath ?? "?")}`;
166
+ return `Accepted proposal ${String(r.id)} → ${String(r.ref)} at ${String(r.assetPath)}`;
175
167
  }
176
168
  export function formatProposalRejectPlain(r) {
177
169
  const reason = r.reason ? ` (${String(r.reason)})` : "";
178
- return `Rejected proposal ${String(r.id ?? "?")} (${String(r.ref ?? "?")})${reason}`;
170
+ return `Rejected proposal ${String(r.id)} (${String(r.ref)})${reason}`;
179
171
  }
180
172
  export function formatProposalDrainPlain(r) {
181
173
  const policy = String(r.policy ?? "?");
@@ -199,30 +191,10 @@ export function formatProposalDrainPlain(r) {
199
191
  }
200
192
  return lines.join("\n").trimEnd();
201
193
  }
202
- export function formatDistillPlain(r) {
203
- const outcome = String(r.outcome ?? "unknown");
204
- const inputRef = String(r.inputRef ?? "?");
205
- const lessonRef = String(r.lessonRef ?? "?");
206
- if (outcome === "queued") {
207
- const id = String(r.proposalId ?? "?");
208
- return `Distilled ${inputRef} → proposal ${id} (${lessonRef}). Run \`akm proposal show ${id}\` to review.`;
209
- }
210
- if (outcome === "validation_failed") {
211
- const findings = Array.isArray(r.findings) ? r.findings : [];
212
- const lines = [`Distillation produced an invalid lesson for ${inputRef}; no proposal queued.`];
213
- for (const f of findings) {
214
- lines.push(` - ${String(f.message ?? f.kind ?? "validation finding")}`);
215
- }
216
- return lines.join("\n");
217
- }
218
- // skipped
219
- const message = typeof r.message === "string" ? r.message : "feature disabled or LLM unavailable";
220
- return `Distill skipped for ${inputRef}: ${message}`;
221
- }
222
194
  export function formatProposalDiffPlain(r) {
223
195
  const header = r.isNew
224
- ? `# proposal ${String(r.id ?? "?")} (new asset: ${String(r.ref ?? "?")})`
225
- : `# proposal ${String(r.id ?? "?")} (update: ${String(r.ref ?? "?")})`;
196
+ ? `# proposal ${String(r.id)} (new asset: ${String(r.ref)})`
197
+ : `# proposal ${String(r.id)} (update: ${String(r.ref)})`;
226
198
  const unified = typeof r.unified === "string" ? r.unified : "";
227
199
  if (!unified)
228
200
  return `${header}\n(no changes)`;
@@ -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
  ];
@@ -11,6 +11,7 @@
11
11
  * Directive strings are byte-identical to the pre-extraction version —
12
12
  * only the seam moved.
13
13
  */
14
+ import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
14
15
  /**
15
16
  * Append the type-specific agent directive block to an in-progress
16
17
  * `formatShowPlain` render. Mutates `lines` in place (matches the original
@@ -21,7 +22,16 @@ export function appendShowDirectives(lines, r) {
21
22
  // REC-01 / REC-09: Append a type-specific directive so agents apply the
22
23
  // content rather than substituting training-data approximations.
23
24
  const assetType = typeof r.type === "string" ? r.type : null;
24
- const assetRef = typeof r.name === "string" && assetType ? `${assetType}:${r.name}` : 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;
25
35
  // Show-loop detection: if the agent has shown this asset 3+ times without
26
36
  // writing anything, surface a warning so it stops cycling and acts.
27
37
  const showLoopCount = typeof r.showLoopWarning === "number" ? r.showLoopWarning : 0;
@@ -35,9 +45,7 @@ export function appendShowDirectives(lines, r) {
35
45
  if (assetType === "skill" || assetType === "knowledge") {
36
46
  const activeRun = r.activeRun;
37
47
  if (activeRun) {
38
- // Active workflow: redirect agent to workflow commands instead of direct apply
39
- lines.unshift(` akm workflow complete '${activeRun.runId}'${activeRun.stepId ? ` --step '${activeRun.stepId}'` : ""}`);
40
- lines.unshift("Read this schema, then follow your workflow step's instructions to edit the workspace file. When done, mark the step complete:");
48
+ lines.unshift("Read this reference, follow the active unit's instructions, and return the result to the workflow runner. Step completion is automatic.");
41
49
  lines.unshift(`WORKFLOW ACTIVE — schema shown as reference (run: ${activeRun.runId})`);
42
50
  lines.unshift("---");
43
51
  lines.unshift("");
@@ -78,14 +86,14 @@ export function appendShowDirectives(lines, r) {
78
86
  const insertIdx = separatorIdx >= 0 ? separatorIdx + 1 : r.type || r.name ? 1 : 0;
79
87
  const actionDirective = [
80
88
  `ACTION REQUIRED: Do not execute steps manually from this output.`,
81
- `Run \`akm workflow next '${workflowRef}'\` to get your current step with exact instructions.`,
89
+ `Run \`akm workflow run '${workflowRef}'\` to execute the workflow through its declared gates.`,
82
90
  "---",
83
91
  ];
84
92
  lines.splice(insertIdx, 0, "", ...actionDirective);
85
93
  lines.push("");
86
94
  lines.push("---");
87
- lines.push(`NEXT STEP: Run \`akm workflow next '${workflowRef}'\` to see the current workflow step.`);
88
- lines.push("Do not edit workspace files before completing each step with `akm workflow complete`.");
95
+ lines.push(`NEXT STEP: Run \`akm workflow run '${workflowRef}'\` to execute the workflow.`);
96
+ lines.push("Inspect the workflow first; the runner dispatches and completes each step automatically.");
89
97
  }
90
98
  }
91
99
  /**
@@ -0,0 +1,32 @@
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
+ * Render entries worst-first (by `severityRank`, ties keep original order),
6
+ * each as a glyph-prefixed headline with its optional indented detail lines.
7
+ */
8
+ export function renderStatusEntries(entries) {
9
+ const ordered = entries
10
+ .map((entry, index) => ({ entry, index }))
11
+ .sort((a, b) => a.entry.severityRank - b.entry.severityRank || a.index - b.index)
12
+ .map(({ entry }) => entry);
13
+ const lines = [];
14
+ for (const entry of ordered) {
15
+ lines.push(`${entry.glyph} ${entry.headline}`);
16
+ for (const detail of entry.detailLines ?? []) {
17
+ lines.push(` ${detail}`);
18
+ }
19
+ }
20
+ return lines;
21
+ }
22
+ /**
23
+ * Render a status→count map as `"2 fail, 1 warn, 5 pass"`, in `order` (worst
24
+ * first) with zero counts omitted. Shared by any section header that wants a
25
+ * one-line "what's in here" summary before the per-row detail.
26
+ */
27
+ export function summarizeCounts(counts, order) {
28
+ return order
29
+ .filter((status) => (counts[status] ?? 0) > 0)
30
+ .map((status) => `${counts[status]} ${status}`)
31
+ .join(", ");
32
+ }
@@ -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) }];