akm-cli 0.8.2 → 0.9.0-beta.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 (316) hide show
  1. package/CHANGELOG.md +187 -0
  2. package/dist/assets/help/help-proposals.md +1 -2
  3. package/dist/assets/hints/cli-hints-full.md +34 -19
  4. package/dist/assets/hints/cli-hints-short.md +1 -1
  5. package/dist/assets/profiles/catchup.json +13 -0
  6. package/dist/assets/profiles/consolidate.json +13 -0
  7. package/dist/assets/profiles/frequent.json +13 -0
  8. package/dist/assets/tasks/core/backup.yml +4 -0
  9. package/dist/assets/tasks/core/extract.yml +4 -0
  10. package/dist/assets/tasks/core/improve.yml +4 -0
  11. package/dist/assets/tasks/core/index-refresh.yml +4 -0
  12. package/dist/assets/tasks/core/sync.yml +4 -0
  13. package/dist/assets/tasks/core/update-stashes.yml +4 -0
  14. package/dist/assets/tasks/core/version-check.yml +4 -0
  15. package/dist/cli/config-migrate.js +6 -6
  16. package/dist/cli/config-validate.js +4 -4
  17. package/dist/cli/confirm.js +3 -3
  18. package/dist/cli/parse-args.js +1 -1
  19. package/dist/cli/shared.js +51 -14
  20. package/dist/cli-node.mjs +26 -0
  21. package/dist/cli.js +171 -3862
  22. package/dist/commands/{agent-dispatch.js → agent/agent-dispatch.js} +6 -6
  23. package/dist/commands/{agent-support.js → agent/agent-support.js} +2 -2
  24. package/dist/commands/agent/contribute-cli.js +200 -0
  25. package/dist/commands/completions.js +1 -1
  26. package/dist/commands/config-cli.js +240 -3
  27. package/dist/commands/config-edit.js +344 -0
  28. package/dist/commands/db-cli.js +2 -2
  29. package/dist/commands/env/env-cli.js +529 -0
  30. package/dist/commands/env/env.js +410 -0
  31. package/dist/commands/env/secret-cli.js +259 -0
  32. package/dist/commands/{secret.js → env/secret.js} +6 -47
  33. package/dist/commands/events.js +4 -4
  34. package/dist/commands/feedback-cli.js +18 -34
  35. package/dist/commands/graph/graph-cli.js +132 -0
  36. package/dist/commands/{graph.js → graph/graph.js} +22 -16
  37. package/dist/commands/health/checks.js +279 -0
  38. package/dist/commands/health.js +94 -262
  39. package/dist/commands/{consolidate.js → improve/consolidate.js} +48 -36
  40. package/dist/commands/{distill-promotion-policy.js → improve/distill-promotion-policy.js} +3 -3
  41. package/dist/commands/{distill.js → improve/distill.js} +39 -18
  42. package/dist/commands/{eval-cases.js → improve/eval-cases.js} +1 -1
  43. package/dist/commands/{extract-cli.js → improve/extract-cli.js} +4 -4
  44. package/dist/commands/{extract-prompt.js → improve/extract-prompt.js} +2 -2
  45. package/dist/commands/{extract.js → improve/extract.js} +185 -26
  46. package/dist/commands/{improve-auto-accept.js → improve/improve-auto-accept.js} +4 -4
  47. package/dist/commands/{improve-cli.js → improve/improve-cli.js} +44 -22
  48. package/dist/commands/{improve-profiles.js → improve/improve-profiles.js} +13 -7
  49. package/dist/commands/{improve-result-file.js → improve/improve-result-file.js} +1 -1
  50. package/dist/commands/{improve.js → improve/improve.js} +509 -245
  51. package/dist/{core → commands/improve/memory}/memory-belief.js +2 -2
  52. package/dist/{core → commands/improve/memory}/memory-contradiction-detect.js +5 -5
  53. package/dist/{core → commands/improve/memory}/memory-improve.js +4 -4
  54. package/dist/commands/{reflect.js → improve/reflect.js} +33 -28
  55. package/dist/commands/improve/session-asset.js +248 -0
  56. package/dist/commands/lint/agent-linter.js +1 -1
  57. package/dist/commands/lint/base-linter.js +55 -37
  58. package/dist/commands/lint/command-linter.js +1 -1
  59. package/dist/commands/lint/default-linter.js +1 -1
  60. package/dist/commands/lint/env-key-rules.js +1 -1
  61. package/dist/commands/lint/index.js +19 -25
  62. package/dist/commands/lint/knowledge-linter.js +1 -1
  63. package/dist/commands/lint/memory-linter.js +1 -1
  64. package/dist/commands/lint/registry.js +8 -8
  65. package/dist/commands/lint/skill-linter.js +1 -1
  66. package/dist/commands/lint/task-linter.js +1 -1
  67. package/dist/commands/lint/workflow-linter.js +1 -1
  68. package/dist/commands/lint.js +1 -1
  69. package/dist/commands/observability-cli.js +244 -0
  70. package/dist/commands/proposal/drain-policies.js +3 -3
  71. package/dist/commands/proposal/drain.js +15 -10
  72. package/dist/commands/proposal/proposal-cli.js +478 -0
  73. package/dist/commands/{proposal.js → proposal/proposal.js} +5 -5
  74. package/dist/commands/{propose.js → proposal/propose.js} +11 -11
  75. package/dist/{core → commands/proposal/validators}/proposal-quality-validators.js +8 -3
  76. package/dist/{core → commands/proposal/validators}/proposal-validators.js +5 -5
  77. package/dist/{core → commands/proposal/validators}/proposals.js +13 -7
  78. package/dist/commands/{curate.js → read/curate.js} +7 -7
  79. package/dist/commands/{knowledge.js → read/knowledge.js} +22 -9
  80. package/dist/commands/{registry-search.js → read/registry-search.js} +5 -5
  81. package/dist/commands/{remember-cli.js → read/remember-cli.js} +15 -7
  82. package/dist/commands/read/search-cli.js +207 -0
  83. package/dist/commands/{search.js → read/search.js} +22 -27
  84. package/dist/commands/{show.js → read/show.js} +31 -45
  85. package/dist/commands/registry-cli.js +8 -8
  86. package/dist/commands/remember.js +8 -8
  87. package/dist/commands/sources/add-cli.js +293 -0
  88. package/dist/commands/{history.js → sources/history.js} +27 -25
  89. package/dist/commands/{info.js → sources/info.js} +6 -6
  90. package/dist/commands/{init.js → sources/init.js} +6 -6
  91. package/dist/commands/{installed-stashes.js → sources/installed-stashes.js} +12 -12
  92. package/dist/commands/{migration-help.js → sources/migration-help.js} +3 -2
  93. package/dist/commands/{schema-repair.js → sources/schema-repair.js} +8 -8
  94. package/dist/commands/{self-update.js → sources/self-update.js} +10 -9
  95. package/dist/commands/{source-add.js → sources/source-add.js} +10 -10
  96. package/dist/commands/{source-clone.js → sources/source-clone.js} +7 -7
  97. package/dist/commands/{source-manage.js → sources/source-manage.js} +4 -4
  98. package/dist/commands/sources/sources-cli.js +305 -0
  99. package/dist/commands/sources/stash-cli.js +219 -0
  100. package/dist/commands/{stash-skeleton.js → sources/stash-skeleton.js} +2 -1
  101. package/dist/commands/tasks/default-tasks.js +173 -0
  102. package/dist/commands/tasks/tasks-cli.js +210 -0
  103. package/dist/commands/{tasks.js → tasks/tasks.js} +14 -14
  104. package/dist/commands/wiki-cli.js +307 -0
  105. package/dist/commands/workflow-cli.js +329 -0
  106. package/dist/core/action-contributors.js +1 -1
  107. package/dist/core/assert.js +40 -0
  108. package/dist/core/asset/asset-create.js +54 -0
  109. package/dist/core/{asset-ref.js → asset/asset-ref.js} +21 -4
  110. package/dist/core/{asset-registry.js → asset/asset-registry.js} +3 -3
  111. package/dist/core/{asset-spec.js → asset/asset-spec.js} +17 -31
  112. package/dist/core/{markdown.js → asset/markdown.js} +1 -1
  113. package/dist/core/{stash-meta.js → asset/stash-meta.js} +1 -1
  114. package/dist/core/best-effort.js +64 -0
  115. package/dist/core/common.js +32 -18
  116. package/dist/core/{config-io.js → config/config-io.js} +29 -19
  117. package/dist/core/{config-migration.js → config/config-migration.js} +11 -9
  118. package/dist/core/{config-schema.js → config/config-schema.js} +45 -1
  119. package/dist/core/config/config-types.js +16 -0
  120. package/dist/core/{config-walker.js → config/config-walker.js} +2 -2
  121. package/dist/core/{config.js → config/config.js} +10 -8
  122. package/dist/core/env-secret-ref.js +90 -0
  123. package/dist/core/errors.js +13 -3
  124. package/dist/core/events.js +27 -4
  125. package/dist/core/file-lock.js +1 -1
  126. package/dist/core/improve-types.js +48 -0
  127. package/dist/core/lesson-lint.js +2 -2
  128. package/dist/core/paths.js +2 -2
  129. package/dist/core/ripgrep/install.js +2 -2
  130. package/dist/core/ripgrep/resolve.js +2 -2
  131. package/dist/core/state-db.js +88 -46
  132. package/dist/core/text-truncation.js +148 -0
  133. package/dist/core/time.js +1 -1
  134. package/dist/core/write-source.js +98 -85
  135. package/dist/indexer/{db-backup.js → db/db-backup.js} +9 -24
  136. package/dist/indexer/{db.js → db/db.js} +126 -116
  137. package/dist/indexer/{graph-db.js → db/graph-db.js} +9 -4
  138. package/dist/indexer/{llm-cache.js → db/llm-cache.js} +15 -12
  139. package/dist/indexer/ensure-index.js +4 -4
  140. package/dist/indexer/{graph-boost.js → graph/graph-boost.js} +1 -1
  141. package/dist/indexer/{graph-extraction.js → graph/graph-extraction.js} +55 -13
  142. package/dist/indexer/indexer.js +37 -30
  143. package/dist/indexer/init.js +54 -0
  144. package/dist/indexer/manifest.js +10 -10
  145. package/dist/indexer/{memory-inference.js → passes/memory-inference.js} +92 -23
  146. package/dist/indexer/{metadata-contributors.js → passes/metadata-contributors.js} +10 -8
  147. package/dist/indexer/{metadata.js → passes/metadata.js} +15 -19
  148. package/dist/indexer/{staleness-detect.js → passes/staleness-detect.js} +53 -12
  149. package/dist/indexer/{db-search.js → search/db-search.js} +28 -16
  150. package/dist/indexer/{ranking-contributors.js → search/ranking-contributors.js} +1 -1
  151. package/dist/indexer/{ranking.js → search/ranking.js} +2 -2
  152. package/dist/indexer/{search-hit-enrichers.js → search/search-hit-enrichers.js} +3 -3
  153. package/dist/indexer/{search-source.js → search/search-source.js} +8 -8
  154. package/dist/indexer/{semantic-status.js → search/semantic-status.js} +3 -3
  155. package/dist/indexer/usage/unmigrated-vaults-guard.js +94 -0
  156. package/dist/indexer/{usage-events.js → usage/usage-events.js} +32 -0
  157. package/dist/indexer/{file-context.js → walk/file-context.js} +10 -15
  158. package/dist/indexer/{matchers.js → walk/matchers.js} +13 -9
  159. package/dist/indexer/{path-resolver.js → walk/path-resolver.js} +6 -6
  160. package/dist/indexer/{project-context.js → walk/project-context.js} +1 -1
  161. package/dist/indexer/{walker.js → walk/walker.js} +4 -3
  162. package/dist/integrations/agent/builder-shared.js +39 -0
  163. package/dist/integrations/agent/builders.js +14 -81
  164. package/dist/integrations/agent/config.js +6 -4
  165. package/dist/integrations/agent/detect.js +1 -1
  166. package/dist/integrations/agent/index.js +23 -8
  167. package/dist/integrations/agent/prompts.js +2 -3
  168. package/dist/integrations/agent/runner.js +22 -3
  169. package/dist/integrations/agent/spawn.js +9 -10
  170. package/dist/integrations/harnesses/claude/agent-builder.js +48 -0
  171. package/dist/integrations/harnesses/claude/config-import.js +70 -0
  172. package/dist/integrations/harnesses/claude/index.js +64 -0
  173. package/dist/integrations/{session-logs/providers/claude-code.js → harnesses/claude/session-log.js} +16 -1
  174. package/dist/integrations/harnesses/index.js +144 -0
  175. package/dist/integrations/harnesses/opencode/agent-builder.js +43 -0
  176. package/dist/integrations/harnesses/opencode/config-import.js +82 -0
  177. package/dist/integrations/harnesses/opencode/index.js +59 -0
  178. package/dist/integrations/{session-logs/providers/opencode.js → harnesses/opencode/session-log.js} +1 -1
  179. package/dist/integrations/harnesses/opencode-sdk/index.js +49 -0
  180. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +234 -0
  181. package/dist/integrations/harnesses/types.js +43 -0
  182. package/dist/integrations/lockfile.js +7 -16
  183. package/dist/integrations/session-logs/index.js +82 -9
  184. package/dist/llm/call-ai.js +4 -4
  185. package/dist/llm/client.js +131 -6
  186. package/dist/llm/embedder.js +6 -6
  187. package/dist/llm/embedders/local.js +9 -22
  188. package/dist/llm/embedders/remote.js +2 -2
  189. package/dist/llm/embedders/types.js +1 -1
  190. package/dist/llm/graph-extract.js +31 -12
  191. package/dist/llm/index-passes.js +1 -1
  192. package/dist/llm/memory-infer.js +12 -5
  193. package/dist/llm/metadata-enhance.js +2 -2
  194. package/dist/output/context.js +6 -44
  195. package/dist/output/renderers.js +88 -58
  196. package/dist/output/shapes/curate.js +7 -3
  197. package/dist/output/shapes/distill.js +7 -3
  198. package/dist/output/shapes/env-list.js +18 -16
  199. package/dist/output/shapes/events.js +5 -4
  200. package/dist/output/shapes/helpers.js +2 -4
  201. package/dist/output/shapes/history.js +7 -3
  202. package/dist/output/shapes/passthrough.js +8 -11
  203. package/dist/output/shapes/{proposal-accept.js → proposal/accept.js} +7 -3
  204. package/dist/output/shapes/{proposal-diff.js → proposal/diff.js} +7 -3
  205. package/dist/output/shapes/{proposal-list.js → proposal/list.js} +7 -3
  206. package/dist/output/shapes/{proposal-producer.js → proposal/producer.js} +5 -4
  207. package/dist/output/shapes/{proposal-reject.js → proposal/reject.js} +7 -3
  208. package/dist/output/shapes/{proposal-show.js → proposal/show.js} +7 -3
  209. package/dist/output/shapes/registry-search.js +7 -3
  210. package/dist/output/shapes/registry.js +12 -0
  211. package/dist/output/shapes/search.js +7 -3
  212. package/dist/output/shapes/secret-list.js +18 -16
  213. package/dist/output/shapes/show.js +7 -3
  214. package/dist/output/shapes.js +55 -30
  215. package/dist/output/text/add.js +2 -3
  216. package/dist/output/text/clone.js +2 -3
  217. package/dist/output/text/config.js +2 -3
  218. package/dist/output/text/curate.js +4 -3
  219. package/dist/output/text/distill.js +2 -3
  220. package/dist/output/text/enable-disable.js +5 -4
  221. package/dist/output/text/env.js +13 -0
  222. package/dist/output/text/events.js +5 -4
  223. package/dist/output/text/feedback.js +4 -3
  224. package/dist/output/text/helpers.js +54 -39
  225. package/dist/output/text/history.js +2 -3
  226. package/dist/output/text/import.js +2 -3
  227. package/dist/output/text/index.js +2 -3
  228. package/dist/output/text/info.js +2 -3
  229. package/dist/output/text/init.js +2 -3
  230. package/dist/output/text/list.js +2 -3
  231. package/dist/output/text/proposal/producer.js +9 -0
  232. package/dist/output/text/proposal/proposal.js +13 -0
  233. package/dist/output/text/registry-commands.js +8 -7
  234. package/dist/output/text/registry.js +12 -0
  235. package/dist/output/text/remember.js +4 -3
  236. package/dist/output/text/remove.js +2 -3
  237. package/dist/output/text/save.js +2 -3
  238. package/dist/output/text/search.js +4 -3
  239. package/dist/output/text/show.js +4 -3
  240. package/dist/output/text/update.js +2 -3
  241. package/dist/output/text/upgrade.js +2 -3
  242. package/dist/output/text/wiki.js +12 -11
  243. package/dist/output/text/workflow.js +12 -10
  244. package/dist/output/text.js +66 -32
  245. package/dist/registry/build-index.js +11 -10
  246. package/dist/registry/factory.js +1 -1
  247. package/dist/registry/origin-resolve.js +1 -1
  248. package/dist/registry/providers/index.js +2 -2
  249. package/dist/registry/providers/skills-sh.js +91 -72
  250. package/dist/registry/providers/static-index.js +75 -52
  251. package/dist/registry/resolve.js +3 -3
  252. package/dist/runtime.js +242 -0
  253. package/dist/scripts/migrate-storage.js +1594 -673
  254. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +240 -166
  255. package/dist/setup/detect.js +311 -9
  256. package/dist/setup/harness-config-import.js +6 -120
  257. package/dist/setup/setup.js +454 -43
  258. package/dist/sources/include.js +1 -1
  259. package/dist/sources/provider-factory.js +2 -2
  260. package/dist/sources/providers/filesystem.js +3 -3
  261. package/dist/sources/providers/git.js +9 -9
  262. package/dist/sources/providers/index.js +4 -4
  263. package/dist/sources/providers/npm.js +6 -6
  264. package/dist/sources/providers/provider-utils.js +13 -20
  265. package/dist/sources/providers/sync-from-ref.js +5 -5
  266. package/dist/sources/providers/tar-utils.js +2 -2
  267. package/dist/sources/providers/website.js +2 -2
  268. package/dist/sources/resolve.js +5 -5
  269. package/dist/sources/website-ingest.js +5 -5
  270. package/dist/storage/database.js +102 -0
  271. package/dist/storage/engines/sqlite-migrations.js +42 -0
  272. package/dist/storage/locations.js +25 -0
  273. package/dist/storage/repositories/index-db.js +43 -0
  274. package/dist/storage/repositories/workflow-runs-repository.js +141 -0
  275. package/dist/tasks/backends/cron.js +4 -4
  276. package/dist/tasks/backends/exec-utils.js +32 -0
  277. package/dist/tasks/backends/index.js +3 -3
  278. package/dist/tasks/backends/launchd.js +7 -14
  279. package/dist/tasks/backends/schtasks.js +7 -16
  280. package/dist/tasks/embedded.js +71 -0
  281. package/dist/tasks/parser.js +2 -2
  282. package/dist/tasks/resolveAkmBin.js +1 -1
  283. package/dist/tasks/runner.js +28 -15
  284. package/dist/tasks/schedule.js +1 -1
  285. package/dist/tasks/validator.js +7 -7
  286. package/dist/text-import-hook.mjs +51 -0
  287. package/dist/version.js +2 -1
  288. package/dist/wiki/wiki.js +7 -7
  289. package/dist/workflows/{authoring.js → authoring/authoring.js} +6 -6
  290. package/dist/workflows/{scope-key.js → authoring/scope-key.js} +1 -1
  291. package/dist/workflows/cli.js +1 -1
  292. package/dist/workflows/db.js +50 -32
  293. package/dist/workflows/parser.js +4 -4
  294. package/dist/workflows/renderer.js +5 -5
  295. package/dist/workflows/runtime/agent-identity.js +56 -0
  296. package/dist/workflows/runtime/checkin.js +57 -0
  297. package/dist/workflows/{runs.js → runtime/runs.js} +197 -101
  298. package/dist/workflows/validate-summary.js +82 -0
  299. package/docs/README.md +1 -1
  300. package/docs/data-and-telemetry.md +6 -6
  301. package/package.json +16 -8
  302. package/dist/commands/add-cli.js +0 -279
  303. package/dist/commands/env.js +0 -213
  304. package/dist/integrations/agent/sdk-runner.js +0 -126
  305. package/dist/output/shapes/vault-list.js +0 -19
  306. package/dist/output/text/proposal-producer.js +0 -8
  307. package/dist/output/text/proposal.js +0 -12
  308. package/dist/output/text/vault.js +0 -16
  309. /package/dist/core/{asset-serialize.js → asset/asset-serialize.js} +0 -0
  310. /package/dist/core/{frontmatter.js → asset/frontmatter.js} +0 -0
  311. /package/dist/core/{config-sources.js → config/config-sources.js} +0 -0
  312. /package/dist/indexer/{graph-dedup.js → graph/graph-dedup.js} +0 -0
  313. /package/dist/{core/config-types.js → indexer/passes/pass-context.js} +0 -0
  314. /package/dist/indexer/{search-fields.js → search/search-fields.js} +0 -0
  315. /package/dist/indexer/{index-context.js → walk/index-context.js} +0 -0
  316. /package/dist/workflows/{document-cache.js → runtime/document-cache.js} +0 -0
@@ -8,40 +8,65 @@
8
8
  * Every function in this module is side-effect free and operates on plain
9
9
  * `Record<string, unknown>` shapes, which makes them trivial to unit test.
10
10
  *
11
- * Output shapes are registered via `registerOutputShape` see the per-command
12
- * modules in `src/output/shapes/` for individual registrations. The central
13
- * `shapeForCommand` dispatcher looks up the registry and throws for unknown
14
- * commands (v1 spec §9 — exhaustive registry, no silent fallback).
11
+ * Output shapes are assembled EXPLICITLY here: each per-command module under
12
+ * `src/output/shapes/` EXPORTS a pure `OutputShapeEntry[]` (no top-level
13
+ * side effect), and this barrel imports those exports and registers them in a
14
+ * single deterministic, order-independent pass (`BUILT_IN_OUTPUT_SHAPES`).
15
+ * Dropping a module from the assembly array is a COMPILE error, not a silent
16
+ * runtime gap. The central `shapeForCommand` dispatcher looks up the registry
17
+ * and throws for unknown commands (v1 spec §9 — exhaustive registry, no silent
18
+ * fallback).
15
19
  */
16
- import { UsageError } from "../core/errors";
17
- import { getOutputShapeHandler } from "./shapes/registry";
20
+ import { UsageError } from "../core/errors.js";
21
+ import { curateShapes } from "./shapes/curate.js";
22
+ import { distillShapes } from "./shapes/distill.js";
23
+ import { envListShapes } from "./shapes/env-list.js";
24
+ import { eventsShapes } from "./shapes/events.js";
25
+ import { historyShapes } from "./shapes/history.js";
26
+ import { passthroughShapes } from "./shapes/passthrough.js";
27
+ import { proposalAcceptShapes } from "./shapes/proposal/accept.js";
28
+ import { proposalDiffShapes } from "./shapes/proposal/diff.js";
29
+ import { proposalListShapes } from "./shapes/proposal/list.js";
30
+ import { proposalProducerShapes } from "./shapes/proposal/producer.js";
31
+ import { proposalRejectShapes } from "./shapes/proposal/reject.js";
32
+ import { proposalShowShapes } from "./shapes/proposal/show.js";
33
+ import { getOutputShapeHandler, registerOutputShapes } from "./shapes/registry.js";
34
+ import { registrySearchShapes } from "./shapes/registry-search.js";
35
+ import { searchShapes } from "./shapes/search.js";
36
+ import { secretListShapes } from "./shapes/secret-list.js";
37
+ import { showShapes } from "./shapes/show.js";
18
38
  // Re-export helpers so existing imports from `shapes.ts` keep working.
19
- export { capDescription, NORMAL_DESCRIPTION_LIMIT, pickFields, shapeAssetHit, shapeDistillOutput, shapeEventEntry, shapeEventsOutput, shapeHistoryEntry, shapeHistoryOutput, shapeProposalAcceptOutput, shapeProposalDiffOutput, shapeProposalEntry, shapeProposalListOutput, shapeProposalProducerOutput, shapeProposalRejectOutput, shapeProposalShowOutput, shapeRegistrySearchOutput, shapeSearchHit, shapeSearchHitForAgent, shapeSearchOutput, shapeShowOutput, truncateDescription, } from "./shapes/helpers";
39
+ export { capDescription, NORMAL_DESCRIPTION_LIMIT, pickFields, shapeAssetHit, shapeDistillOutput, shapeEventEntry, shapeEventsOutput, shapeHistoryEntry, shapeHistoryOutput, shapeProposalAcceptOutput, shapeProposalDiffOutput, shapeProposalEntry, shapeProposalListOutput, shapeProposalProducerOutput, shapeProposalRejectOutput, shapeProposalShowOutput, shapeRegistrySearchOutput, shapeSearchHit, shapeSearchHitForAgent, shapeSearchOutput, shapeShowOutput, truncateDescription, } from "./shapes/helpers.js";
20
40
  // Re-export registry API so callers can use this module as the single entry
21
41
  // point (backward compat).
22
- export { deregisterOutputShape, registerOutputShape } from "./shapes/registry";
23
- // ── Per-command shape modules (self-register at import time) ──────────────────
24
- // Importing these modules triggers their `registerOutputShape(...)` calls.
25
- // These imports must come AFTER the registry module has been loaded (guaranteed
26
- // by the import order above).
27
- import "./shapes/search";
28
- import "./shapes/curate";
29
- import "./shapes/registry-search";
30
- import "./shapes/show";
31
- import "./shapes/history";
32
- import "./shapes/events";
33
- import "./shapes/proposal-list";
34
- import "./shapes/proposal-show";
35
- import "./shapes/proposal-accept";
36
- import "./shapes/proposal-reject";
37
- import "./shapes/proposal-diff";
38
- import "./shapes/proposal-producer";
39
- import "./shapes/distill";
40
- import "./shapes/env-list";
41
- import "./shapes/vault-list";
42
- import "./shapes/secret-list";
43
- import "./shapes/passthrough";
44
- // ── Dispatcher ────────────────────────────────────────────────────────────────
42
+ export { deregisterOutputShape, registerOutputShape } from "./shapes/registry.js";
43
+ // ── Explicit built-in shape assembly ──────────────────────────────────────────
44
+ // Each entry below is a pure exported `OutputShapeEntry[]` from a per-command
45
+ // module. The set is registered ONCE, deterministically, with no reliance on
46
+ // import order. Removing a module from this list removes its registration —
47
+ // and because each name is referenced statically, a deleted export fails to
48
+ // compile instead of silently disappearing at runtime.
49
+ const BUILT_IN_OUTPUT_SHAPES = [
50
+ ...searchShapes,
51
+ ...curateShapes,
52
+ ...registrySearchShapes,
53
+ ...showShapes,
54
+ ...historyShapes,
55
+ ...eventsShapes,
56
+ ...proposalListShapes,
57
+ ...proposalShowShapes,
58
+ ...proposalAcceptShapes,
59
+ ...proposalRejectShapes,
60
+ ...proposalDiffShapes,
61
+ ...proposalProducerShapes,
62
+ ...distillShapes,
63
+ ...envListShapes,
64
+ ...secretListShapes,
65
+ // Passthrough commands are registered last so an explicit dedicated handler
66
+ // above always wins over the identity-stamp fallback for the same name.
67
+ ...passthroughShapes,
68
+ ];
69
+ registerOutputShapes(BUILT_IN_OUTPUT_SHAPES);
45
70
  /**
46
71
  * Commands whose shape handler implements the `summary` projection. For every
47
72
  * other command, `--shape summary` is a usage error (v1 §5 — honest rejection
@@ -1,6 +1,5 @@
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
- import { formatAddPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("add", (r) => formatAddPlain(r));
4
+ import { formatAddPlain } from "./helpers.js";
5
+ export const addFormatters = [{ command: "add", handler: (r) => formatAddPlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatClonePlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("clone", (r) => formatClonePlain(r));
4
+ import { formatClonePlain } from "./helpers.js";
5
+ export const cloneFormatters = [{ command: "clone", handler: (r) => formatClonePlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatConfigPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("config", (r) => formatConfigPlain(r));
4
+ import { formatConfigPlain } from "./helpers.js";
5
+ export const configFormatters = [{ command: "config", handler: (r) => formatConfigPlain(r) }];
@@ -1,6 +1,7 @@
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
- import { formatCuratePlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("curate", (r, detail) => formatCuratePlain(r, detail));
4
+ import { formatCuratePlain } from "./helpers.js";
5
+ export const curateFormatters = [
6
+ { command: "curate", handler: (r, detail) => formatCuratePlain(r, detail) },
7
+ ];
@@ -2,6 +2,5 @@
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 formatter for `akm distill <ref>` (#228).
5
- import { formatDistillPlain } from "./helpers";
6
- import { registerTextFormatter } from "./registry";
7
- registerTextFormatter("distill", (r) => formatDistillPlain(r));
5
+ import { formatDistillPlain } from "./helpers.js";
6
+ export const distillFormatters = [{ command: "distill", handler: (r) => formatDistillPlain(r) }];
@@ -1,7 +1,8 @@
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
- import { formatToggleComponentPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("enable", (r) => formatToggleComponentPlain("enable", r));
7
- registerTextFormatter("disable", (r) => formatToggleComponentPlain("disable", r));
4
+ import { formatToggleComponentPlain } from "./helpers.js";
5
+ export const enableDisableFormatters = [
6
+ { command: "enable", handler: (r) => formatToggleComponentPlain("enable", r) },
7
+ { command: "disable", handler: (r) => formatToggleComponentPlain("disable", r) },
8
+ ];
@@ -0,0 +1,13 @@
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
+ // Output text formatters for `akm env *` commands.
5
+ import { formatEnvCreatePlain, formatEnvExportPlain, formatEnvListPlain, formatEnvRemovePlain, formatEnvSetPlain, formatEnvUnsetPlain, } from "./helpers.js";
6
+ export const envFormatters = [
7
+ { command: "env-list", handler: (r) => formatEnvListPlain(r) },
8
+ { command: "env-create", handler: (r) => formatEnvCreatePlain(r) },
9
+ { command: "env-export", handler: (r) => formatEnvExportPlain(r) },
10
+ { command: "env-remove", handler: (r) => formatEnvRemovePlain(r) },
11
+ { command: "env-set", handler: (r) => formatEnvSetPlain(r) },
12
+ { command: "env-unset", handler: (r) => formatEnvUnsetPlain(r) },
13
+ ];
@@ -4,7 +4,8 @@
4
4
  // Output text formatters for `akm events list` / `akm events tail` (#204).
5
5
  // Both share a renderer; `events-tail` is also called per-event by the streaming
6
6
  // code path via `formatEventLine`.
7
- import { formatEventsPlain } from "./helpers";
8
- import { registerTextFormatter } from "./registry";
9
- registerTextFormatter("events-list", (r) => formatEventsPlain(r));
10
- registerTextFormatter("events-tail", (r) => formatEventsPlain(r));
7
+ import { formatEventsPlain } from "./helpers.js";
8
+ export const eventsFormatters = [
9
+ { command: "events-list", handler: (r) => formatEventsPlain(r) },
10
+ { command: "events-tail", handler: (r) => formatEventsPlain(r) },
11
+ ];
@@ -1,6 +1,7 @@
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
- import { formatFeedbackPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("feedback", (r) => formatFeedbackPlain(r));
4
+ import { formatFeedbackPlain } from "./helpers.js";
5
+ export const feedbackFormatters = [
6
+ { command: "feedback", handler: (r) => formatFeedbackPlain(r) },
7
+ ];
@@ -135,29 +135,6 @@ export function formatRegistryBuildIndexPlain(r) {
135
135
  const version = typeof r.version === "number" ? `v${r.version}` : "";
136
136
  return `Wrote registry index ${version} (${total} kits) → ${outPath}`.replace(/\s+/g, " ").trim();
137
137
  }
138
- export function formatVaultListPlain(r) {
139
- // Multi-vault listing: { vaults: [{ ref, path, keys }, ...] }
140
- const vaults = Array.isArray(r.vaults) ? r.vaults : [];
141
- if (vaults.length === 0) {
142
- return "No vaults. Create one with `akm vault create <name>` then `akm vault set vault:<name> KEY=VALUE`.";
143
- }
144
- const lines = [];
145
- for (const v of vaults) {
146
- const ref = String(v.ref ?? "?");
147
- const keys = Array.isArray(v.keys) ? v.keys.map(String) : [];
148
- if (lines.length > 0)
149
- lines.push("");
150
- lines.push(`## ${ref}`);
151
- if (keys.length === 0) {
152
- lines.push("- (no keys)");
153
- continue;
154
- }
155
- for (const key of keys) {
156
- lines.push(`- ${key}`);
157
- }
158
- }
159
- return lines.join("\n");
160
- }
161
138
  export function formatEnvListPlain(r) {
162
139
  // Multi-env listing: { envs: [{ ref, path, keys }, ...] }
163
140
  const envs = Array.isArray(r.envs) ? r.envs : [];
@@ -191,6 +168,20 @@ export function formatEnvRemovePlain(r) {
191
168
  const removed = r.removed === true;
192
169
  return removed ? `Removed env ${String(r.ref ?? "?")}` : `Env ${String(r.ref ?? "?")} was not present`;
193
170
  }
171
+ export function formatEnvSetPlain(r) {
172
+ return `Set ${String(r.key ?? "?")} in env ${String(r.ref ?? "?")} (value not displayed)`;
173
+ }
174
+ export function formatEnvUnsetPlain(r) {
175
+ const removed = Array.isArray(r.removed) ? r.removed.map(String) : [];
176
+ const missing = Array.isArray(r.missing) ? r.missing.map(String) : [];
177
+ const ref = String(r.ref ?? "?");
178
+ const parts = [];
179
+ if (removed.length > 0)
180
+ parts.push(`Removed ${removed.join(", ")} from env ${ref}`);
181
+ if (missing.length > 0)
182
+ parts.push(`Not present in env ${ref}: ${missing.join(", ")}`);
183
+ return parts.join("\n") || `No keys changed in env ${ref}`;
184
+ }
194
185
  export function formatWikiRegisterPlain(r) {
195
186
  const name = String(r.name ?? r.wiki ?? "?");
196
187
  const ref = String(r.ref ?? r.path ?? r.url ?? "?");
@@ -205,6 +196,25 @@ export function formatWorkflowValidatePlain(r) {
205
196
  const stepCount = typeof r.stepCount === "number" ? r.stepCount : 0;
206
197
  return `workflow validate: ok — ${title || pathValue} (${stepCount} step(s))`;
207
198
  }
199
+ /**
200
+ * Plain-text rendering for a step-completion that was rejected by the
201
+ * summary-validation gate (#506): the step stays pending and the agent gets
202
+ * corrective feedback on what to finish/fix.
203
+ */
204
+ export function formatWorkflowCompleteRejectedPlain(r) {
205
+ const stepId = String(r.stepId ?? "?");
206
+ const feedback = typeof r.feedback === "string" ? r.feedback : "";
207
+ const missing = Array.isArray(r.missing) ? r.missing.map((m) => String(m)) : [];
208
+ const lines = [`workflow complete: rejected — step "${stepId}" does not meet its completion criteria`];
209
+ if (feedback)
210
+ lines.push(` feedback: ${feedback}`);
211
+ if (missing.length > 0) {
212
+ lines.push(" outstanding:");
213
+ for (const m of missing)
214
+ lines.push(` - ${m}`);
215
+ }
216
+ return lines.join("\n");
217
+ }
208
218
  export function formatProposalProducerPlain(command, r) {
209
219
  if (r.ok === false) {
210
220
  const reason = String(r.reason ?? "unknown");
@@ -265,12 +275,29 @@ export function formatProposalShowPlain(r) {
265
275
  }
266
276
  const validation = r.validation;
267
277
  if (validation) {
268
- const ok = validation.ok === true;
269
278
  const findings = Array.isArray(validation.findings) ? validation.findings : [];
279
+ // Partition findings by severity. `severity: "warn"` findings are
280
+ // non-blocking (the validator reports `ok: true` for a warn-only proposal),
281
+ // so they must read as advisory — a distinct icon/label from blocking errors.
282
+ const warnings = findings.filter((f) => f.severity === "warn");
283
+ const errors = findings.filter((f) => f.severity !== "warn");
270
284
  lines.push("");
271
- lines.push(`validation: ${ok ? "ok" : `${findings.length} finding(s)`}`);
272
- for (const f of findings) {
273
- lines.push(` - [${String(f.kind)}] ${String(f.message)}`);
285
+ if (errors.length > 0) {
286
+ const warnSuffix = warnings.length > 0 ? `, ${warnings.length} warning(s)` : "";
287
+ lines.push(`✗ invalid (${errors.length} error(s)${warnSuffix})`);
288
+ }
289
+ else if (warnings.length > 0) {
290
+ lines.push(`✓ valid (${warnings.length} warning(s))`);
291
+ }
292
+ else {
293
+ lines.push("✓ valid");
294
+ }
295
+ // Errors first (blocking), then warnings (advisory, non-blocking).
296
+ for (const f of errors) {
297
+ lines.push(` ✗ error [${String(f.kind)}] ${String(f.message)}`);
298
+ }
299
+ for (const f of warnings) {
300
+ lines.push(` ⚠ warning [${String(f.kind)}] ${String(f.message)} (non-blocking)`);
274
301
  }
275
302
  }
276
303
  const payload = p.payload;
@@ -1035,18 +1062,6 @@ export function formatWorkflowCreatePlain(r) {
1035
1062
  }
1036
1063
  return null;
1037
1064
  }
1038
- export function formatVaultCreatePlain(r) {
1039
- return `Created vault ${String(r.ref ?? "?")} at ${String(r.path ?? "?")}`;
1040
- }
1041
- export function formatVaultSetPlain(r) {
1042
- return `Set ${String(r.key ?? "?")} in ${String(r.ref ?? "?")} (value not displayed)`;
1043
- }
1044
- export function formatVaultUnsetPlain(r) {
1045
- const removed = r.removed === true;
1046
- return removed
1047
- ? `Removed ${String(r.key ?? "?")} from ${String(r.ref ?? "?")}`
1048
- : `Key ${String(r.key ?? "?")} was not present in ${String(r.ref ?? "?")}`;
1049
- }
1050
1065
  export function formatWorkflowResumePlain(r) {
1051
1066
  return formatWorkflowStatusPlain(r) ?? `Resumed workflow run ${String(r.id ?? r.runId ?? "?")}`;
1052
1067
  }
@@ -2,6 +2,5 @@
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 formatter for `akm history` — paired with the shape in shapes/history.ts.
5
- import { formatHistoryPlain } from "./helpers";
6
- import { registerTextFormatter } from "./registry";
7
- registerTextFormatter("history", (r) => formatHistoryPlain(r));
5
+ import { formatHistoryPlain } from "./helpers.js";
6
+ export const historyFormatters = [{ command: "history", handler: (r) => formatHistoryPlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatImportPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("import", (r) => formatImportPlain(r));
4
+ import { formatImportPlain } from "./helpers.js";
5
+ export const importFormatters = [{ command: "import", handler: (r) => formatImportPlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatIndexPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("index", (r) => formatIndexPlain(r));
4
+ import { formatIndexPlain } from "./helpers.js";
5
+ export const indexFormatters = [{ command: "index", handler: (r) => formatIndexPlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatInfoPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("info", (r) => formatInfoPlain(r));
4
+ import { formatInfoPlain } from "./helpers.js";
5
+ export const infoFormatters = [{ command: "info", handler: (r) => formatInfoPlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatInitPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("init", (r) => formatInitPlain(r));
4
+ import { formatInitPlain } from "./helpers.js";
5
+ export const initFormatters = [{ command: "init", handler: (r) => formatInitPlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatListPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("list", (r) => formatListPlain(r));
4
+ import { formatListPlain } from "./helpers.js";
5
+ export const listFormatters = [{ command: "list", handler: (r) => formatListPlain(r) }];
@@ -0,0 +1,9 @@
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
+ // Output text formatters for `akm reflect` / `akm propose` (#226).
5
+ import { formatProposalProducerPlain } from "../helpers.js";
6
+ export const proposalProducerFormatters = [
7
+ { command: "reflect", handler: (r) => formatProposalProducerPlain("reflect", r) },
8
+ { command: "propose", handler: (r) => formatProposalProducerPlain("propose", r) },
9
+ ];
@@ -0,0 +1,13 @@
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
+ // Output text formatters for `akm proposal *` (#225).
5
+ import { formatProposalAcceptPlain, formatProposalDiffPlain, formatProposalDrainPlain, formatProposalListPlain, formatProposalRejectPlain, formatProposalShowPlain, } from "../helpers.js";
6
+ export const proposalFormatters = [
7
+ { command: "proposal-list", handler: (r) => formatProposalListPlain(r) },
8
+ { command: "proposal-show", handler: (r) => formatProposalShowPlain(r) },
9
+ { command: "proposal-accept", handler: (r) => formatProposalAcceptPlain(r) },
10
+ { command: "proposal-reject", handler: (r) => formatProposalRejectPlain(r) },
11
+ { command: "proposal-diff", handler: (r) => formatProposalDiffPlain(r) },
12
+ { command: "proposal-drain", handler: (r) => formatProposalDrainPlain(r) },
13
+ ];
@@ -2,10 +2,11 @@
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";
6
- import { registerTextFormatter } from "./registry";
7
- registerTextFormatter("registry-list", (r) => formatRegistryListPlain(r));
8
- registerTextFormatter("registry-add", (r) => formatRegistryAddPlain(r));
9
- registerTextFormatter("registry-remove", (r) => formatRegistryRemovePlain(r));
10
- registerTextFormatter("registry-search", (r, detail) => formatRegistrySearchPlain(r, detail));
11
- registerTextFormatter("registry-build-index", (r) => formatRegistryBuildIndexPlain(r));
5
+ import { formatRegistryAddPlain, formatRegistryBuildIndexPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, } from "./helpers.js";
6
+ export const registryCommandFormatters = [
7
+ { command: "registry-list", handler: (r) => formatRegistryListPlain(r) },
8
+ { command: "registry-add", handler: (r) => formatRegistryAddPlain(r) },
9
+ { command: "registry-remove", handler: (r) => formatRegistryRemovePlain(r) },
10
+ { command: "registry-search", handler: (r, detail) => formatRegistrySearchPlain(r, detail) },
11
+ { command: "registry-build-index", handler: (r) => formatRegistryBuildIndexPlain(r) },
12
+ ];
@@ -15,6 +15,18 @@ const TEXT_FORMATTER_REGISTRY = new Map();
15
15
  export function registerTextFormatter(command, handler) {
16
16
  TEXT_FORMATTER_REGISTRY.set(command, handler);
17
17
  }
18
+ /**
19
+ * Register a batch of {@link TextFormatterEntry} definitions in iteration order.
20
+ *
21
+ * This is the explicit-assembly entry point used by `text.ts`: the built-in
22
+ * formatter set is registered by iterating a single explicit list exactly once,
23
+ * with no reliance on module import order.
24
+ */
25
+ export function registerTextFormatters(entries) {
26
+ for (const { command, handler } of entries) {
27
+ TEXT_FORMATTER_REGISTRY.set(command, handler);
28
+ }
29
+ }
18
30
  /**
19
31
  * Remove a previously-registered text formatter. Test-only utility.
20
32
  */
@@ -1,6 +1,7 @@
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
- import { formatRememberPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("remember", (r) => formatRememberPlain(r));
4
+ import { formatRememberPlain } from "./helpers.js";
5
+ export const rememberFormatters = [
6
+ { command: "remember", handler: (r) => formatRememberPlain(r) },
7
+ ];
@@ -1,6 +1,5 @@
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
- import { formatRemovePlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("remove", (r) => formatRemovePlain(r));
4
+ import { formatRemovePlain } from "./helpers.js";
5
+ export const removeFormatters = [{ command: "remove", handler: (r) => formatRemovePlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatSavePlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("save", (r) => formatSavePlain(r));
4
+ import { formatSavePlain } from "./helpers.js";
5
+ export const saveFormatters = [{ command: "save", handler: (r) => formatSavePlain(r) }];
@@ -1,6 +1,7 @@
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
- import { formatSearchPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("search", (r, detail) => formatSearchPlain(r, detail));
4
+ import { formatSearchPlain } from "./helpers.js";
5
+ export const searchFormatters = [
6
+ { command: "search", handler: (r, detail) => formatSearchPlain(r, detail) },
7
+ ];
@@ -1,6 +1,7 @@
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
- import { formatShowPlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("show", (r, detail) => formatShowPlain(r, detail));
4
+ import { formatShowPlain } from "./helpers.js";
5
+ export const showFormatters = [
6
+ { command: "show", handler: (r, detail) => formatShowPlain(r, detail) },
7
+ ];
@@ -1,6 +1,5 @@
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
- import { formatUpdatePlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("update", (r) => formatUpdatePlain(r));
4
+ import { formatUpdatePlain } from "./helpers.js";
5
+ export const updateFormatters = [{ command: "update", handler: (r) => formatUpdatePlain(r) }];
@@ -1,6 +1,5 @@
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
- import { formatUpgradePlain } from "./helpers";
5
- import { registerTextFormatter } from "./registry";
6
- registerTextFormatter("upgrade", (r) => formatUpgradePlain(r));
4
+ import { formatUpgradePlain } from "./helpers.js";
5
+ export const upgradeFormatters = [{ command: "upgrade", handler: (r) => formatUpgradePlain(r) }];
@@ -2,14 +2,15 @@
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 all `akm wiki *` commands.
5
- import { formatWikiCreatePlain, formatWikiIngestPlain, formatWikiLintPlain, formatWikiListPlain, formatWikiPagesPlain, formatWikiRegisterPlain, formatWikiRemovePlain, formatWikiShowPlain, formatWikiStashPlain, } from "./helpers";
6
- import { registerTextFormatter } from "./registry";
7
- registerTextFormatter("wiki-list", (r) => formatWikiListPlain(r));
8
- registerTextFormatter("wiki-show", (r) => formatWikiShowPlain(r));
9
- registerTextFormatter("wiki-create", (r) => formatWikiCreatePlain(r));
10
- registerTextFormatter("wiki-remove", (r) => formatWikiRemovePlain(r));
11
- registerTextFormatter("wiki-pages", (r) => formatWikiPagesPlain(r));
12
- registerTextFormatter("wiki-stash", (r) => formatWikiStashPlain(r));
13
- registerTextFormatter("wiki-lint", (r) => formatWikiLintPlain(r));
14
- registerTextFormatter("wiki-ingest", (r) => formatWikiIngestPlain(r));
15
- registerTextFormatter("wiki-register", (r) => formatWikiRegisterPlain(r));
5
+ import { formatWikiCreatePlain, formatWikiIngestPlain, formatWikiLintPlain, formatWikiListPlain, formatWikiPagesPlain, formatWikiRegisterPlain, formatWikiRemovePlain, formatWikiShowPlain, formatWikiStashPlain, } from "./helpers.js";
6
+ export const wikiFormatters = [
7
+ { command: "wiki-list", handler: (r) => formatWikiListPlain(r) },
8
+ { command: "wiki-show", handler: (r) => formatWikiShowPlain(r) },
9
+ { command: "wiki-create", handler: (r) => formatWikiCreatePlain(r) },
10
+ { command: "wiki-remove", handler: (r) => formatWikiRemovePlain(r) },
11
+ { command: "wiki-pages", handler: (r) => formatWikiPagesPlain(r) },
12
+ { command: "wiki-stash", handler: (r) => formatWikiStashPlain(r) },
13
+ { command: "wiki-lint", handler: (r) => formatWikiLintPlain(r) },
14
+ { command: "wiki-ingest", handler: (r) => formatWikiIngestPlain(r) },
15
+ { command: "wiki-register", handler: (r) => formatWikiRegisterPlain(r) },
16
+ ];
@@ -2,13 +2,15 @@
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 all `akm workflow *` commands.
5
- import { formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./helpers";
6
- import { registerTextFormatter } from "./registry";
7
- registerTextFormatter("workflow-start", (r) => formatWorkflowStatusPlain(r));
8
- registerTextFormatter("workflow-status", (r) => formatWorkflowStatusPlain(r));
9
- registerTextFormatter("workflow-complete", (r) => formatWorkflowStatusPlain(r));
10
- registerTextFormatter("workflow-next", (r) => formatWorkflowNextPlain(r));
11
- registerTextFormatter("workflow-list", (r) => formatWorkflowListPlain(r));
12
- registerTextFormatter("workflow-create", (r) => formatWorkflowCreatePlain(r));
13
- registerTextFormatter("workflow-validate", (r) => formatWorkflowValidatePlain(r));
14
- registerTextFormatter("workflow-resume", (r) => formatWorkflowResumePlain(r));
5
+ import { formatWorkflowCompleteRejectedPlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./helpers.js";
6
+ export const workflowFormatters = [
7
+ { command: "workflow-start", handler: (r) => formatWorkflowStatusPlain(r) },
8
+ { command: "workflow-status", handler: (r) => formatWorkflowStatusPlain(r) },
9
+ { command: "workflow-complete", handler: (r) => formatWorkflowStatusPlain(r) },
10
+ { command: "workflow-complete-rejected", handler: (r) => formatWorkflowCompleteRejectedPlain(r) },
11
+ { command: "workflow-next", handler: (r) => formatWorkflowNextPlain(r) },
12
+ { command: "workflow-list", handler: (r) => formatWorkflowListPlain(r) },
13
+ { command: "workflow-create", handler: (r) => formatWorkflowCreatePlain(r) },
14
+ { command: "workflow-validate", handler: (r) => formatWorkflowValidatePlain(r) },
15
+ { command: "workflow-resume", handler: (r) => formatWorkflowResumePlain(r) },
16
+ ];