akm-cli 0.8.1 → 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 (318) hide show
  1. package/CHANGELOG.md +258 -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/stash-skeleton/README.md +76 -0
  9. package/dist/assets/tasks/core/backup.yml +4 -0
  10. package/dist/assets/tasks/core/extract.yml +4 -0
  11. package/dist/assets/tasks/core/improve.yml +4 -0
  12. package/dist/assets/tasks/core/index-refresh.yml +4 -0
  13. package/dist/assets/tasks/core/sync.yml +4 -0
  14. package/dist/assets/tasks/core/update-stashes.yml +4 -0
  15. package/dist/assets/tasks/core/version-check.yml +4 -0
  16. package/dist/cli/config-migrate.js +6 -6
  17. package/dist/cli/config-validate.js +4 -4
  18. package/dist/cli/confirm.js +3 -3
  19. package/dist/cli/parse-args.js +1 -1
  20. package/dist/cli/shared.js +51 -14
  21. package/dist/cli-node.mjs +26 -0
  22. package/dist/cli.js +171 -3857
  23. package/dist/commands/{agent-dispatch.js → agent/agent-dispatch.js} +6 -6
  24. package/dist/commands/{agent-support.js → agent/agent-support.js} +2 -2
  25. package/dist/commands/agent/contribute-cli.js +200 -0
  26. package/dist/commands/completions.js +1 -1
  27. package/dist/commands/config-cli.js +240 -3
  28. package/dist/commands/config-edit.js +344 -0
  29. package/dist/commands/db-cli.js +2 -2
  30. package/dist/commands/env/env-cli.js +529 -0
  31. package/dist/commands/env/env.js +410 -0
  32. package/dist/commands/env/secret-cli.js +259 -0
  33. package/dist/commands/{secret.js → env/secret.js} +6 -47
  34. package/dist/commands/events.js +4 -4
  35. package/dist/commands/feedback-cli.js +18 -34
  36. package/dist/commands/graph/graph-cli.js +132 -0
  37. package/dist/commands/{graph.js → graph/graph.js} +22 -16
  38. package/dist/commands/health/checks.js +279 -0
  39. package/dist/commands/health.js +101 -249
  40. package/dist/commands/{consolidate.js → improve/consolidate.js} +52 -40
  41. package/dist/commands/{distill-promotion-policy.js → improve/distill-promotion-policy.js} +3 -3
  42. package/dist/commands/{distill.js → improve/distill.js} +39 -18
  43. package/dist/commands/{eval-cases.js → improve/eval-cases.js} +1 -1
  44. package/dist/commands/{extract-cli.js → improve/extract-cli.js} +4 -4
  45. package/dist/commands/{extract-prompt.js → improve/extract-prompt.js} +2 -2
  46. package/dist/commands/{extract.js → improve/extract.js} +185 -26
  47. package/dist/commands/{improve-auto-accept.js → improve/improve-auto-accept.js} +4 -4
  48. package/dist/commands/{improve-cli.js → improve/improve-cli.js} +45 -23
  49. package/dist/commands/{improve-profiles.js → improve/improve-profiles.js} +13 -7
  50. package/dist/commands/{improve-result-file.js → improve/improve-result-file.js} +10 -5
  51. package/dist/commands/{improve.js → improve/improve.js} +536 -248
  52. package/dist/{core → commands/improve/memory}/memory-belief.js +2 -2
  53. package/dist/{core → commands/improve/memory}/memory-contradiction-detect.js +5 -5
  54. package/dist/{core → commands/improve/memory}/memory-improve.js +4 -4
  55. package/dist/commands/{reflect.js → improve/reflect.js} +33 -28
  56. package/dist/commands/improve/session-asset.js +248 -0
  57. package/dist/commands/lint/agent-linter.js +1 -1
  58. package/dist/commands/lint/base-linter.js +55 -37
  59. package/dist/commands/lint/command-linter.js +1 -1
  60. package/dist/commands/lint/default-linter.js +1 -1
  61. package/dist/commands/lint/env-key-rules.js +1 -1
  62. package/dist/commands/lint/index.js +19 -25
  63. package/dist/commands/lint/knowledge-linter.js +1 -1
  64. package/dist/commands/lint/memory-linter.js +1 -1
  65. package/dist/commands/lint/registry.js +8 -8
  66. package/dist/commands/lint/skill-linter.js +1 -1
  67. package/dist/commands/lint/task-linter.js +1 -1
  68. package/dist/commands/lint/workflow-linter.js +1 -1
  69. package/dist/commands/lint.js +1 -1
  70. package/dist/commands/observability-cli.js +244 -0
  71. package/dist/commands/{proposal-drain-policies.js → proposal/drain-policies.js} +3 -3
  72. package/dist/commands/{proposal-drain.js → proposal/drain.js} +15 -10
  73. package/dist/commands/proposal/proposal-cli.js +478 -0
  74. package/dist/commands/{proposal.js → proposal/proposal.js} +5 -5
  75. package/dist/commands/{propose.js → proposal/propose.js} +11 -11
  76. package/dist/{core → commands/proposal/validators}/proposal-quality-validators.js +8 -3
  77. package/dist/{core → commands/proposal/validators}/proposal-validators.js +5 -5
  78. package/dist/{core → commands/proposal/validators}/proposals.js +13 -7
  79. package/dist/commands/{curate.js → read/curate.js} +7 -7
  80. package/dist/commands/{knowledge.js → read/knowledge.js} +22 -9
  81. package/dist/commands/{registry-search.js → read/registry-search.js} +5 -5
  82. package/dist/commands/{remember-cli.js → read/remember-cli.js} +15 -7
  83. package/dist/commands/read/search-cli.js +207 -0
  84. package/dist/commands/{search.js → read/search.js} +22 -27
  85. package/dist/commands/{show.js → read/show.js} +77 -44
  86. package/dist/commands/registry-cli.js +8 -8
  87. package/dist/commands/remember.js +8 -8
  88. package/dist/commands/sources/add-cli.js +293 -0
  89. package/dist/commands/{history.js → sources/history.js} +27 -25
  90. package/dist/commands/{info.js → sources/info.js} +6 -6
  91. package/dist/commands/{init.js → sources/init.js} +10 -5
  92. package/dist/commands/{installed-stashes.js → sources/installed-stashes.js} +12 -12
  93. package/dist/commands/{migration-help.js → sources/migration-help.js} +3 -2
  94. package/dist/commands/{schema-repair.js → sources/schema-repair.js} +8 -8
  95. package/dist/commands/{self-update.js → sources/self-update.js} +10 -9
  96. package/dist/commands/{source-add.js → sources/source-add.js} +10 -10
  97. package/dist/commands/{source-clone.js → sources/source-clone.js} +7 -7
  98. package/dist/commands/{source-manage.js → sources/source-manage.js} +4 -4
  99. package/dist/commands/sources/sources-cli.js +305 -0
  100. package/dist/commands/sources/stash-cli.js +219 -0
  101. package/dist/commands/sources/stash-skeleton.js +79 -0
  102. package/dist/commands/tasks/default-tasks.js +173 -0
  103. package/dist/commands/tasks/tasks-cli.js +210 -0
  104. package/dist/commands/{tasks.js → tasks/tasks.js} +14 -14
  105. package/dist/commands/wiki-cli.js +307 -0
  106. package/dist/commands/workflow-cli.js +329 -0
  107. package/dist/core/action-contributors.js +1 -1
  108. package/dist/core/assert.js +40 -0
  109. package/dist/core/asset/asset-create.js +54 -0
  110. package/dist/core/{asset-ref.js → asset/asset-ref.js} +21 -4
  111. package/dist/core/{asset-registry.js → asset/asset-registry.js} +3 -3
  112. package/dist/core/{asset-spec.js → asset/asset-spec.js} +17 -31
  113. package/dist/core/{markdown.js → asset/markdown.js} +1 -1
  114. package/dist/core/asset/stash-meta.js +110 -0
  115. package/dist/core/best-effort.js +64 -0
  116. package/dist/core/common.js +32 -18
  117. package/dist/core/{config-io.js → config/config-io.js} +29 -19
  118. package/dist/core/{config-migration.js → config/config-migration.js} +11 -9
  119. package/dist/core/{config-schema.js → config/config-schema.js} +45 -1
  120. package/dist/core/config/config-types.js +16 -0
  121. package/dist/core/{config-walker.js → config/config-walker.js} +2 -2
  122. package/dist/core/{config.js → config/config.js} +10 -8
  123. package/dist/core/env-secret-ref.js +90 -0
  124. package/dist/core/errors.js +13 -3
  125. package/dist/core/events.js +27 -4
  126. package/dist/core/file-lock.js +1 -1
  127. package/dist/core/improve-types.js +48 -0
  128. package/dist/core/lesson-lint.js +2 -2
  129. package/dist/core/paths.js +2 -2
  130. package/dist/{setup/ripgrep-install.js → core/ripgrep/install.js} +2 -2
  131. package/dist/{setup/ripgrep-resolve.js → core/ripgrep/resolve.js} +2 -2
  132. package/dist/core/state-db.js +88 -46
  133. package/dist/core/text-truncation.js +148 -0
  134. package/dist/core/time.js +1 -1
  135. package/dist/core/write-source.js +98 -85
  136. package/dist/indexer/{db-backup.js → db/db-backup.js} +9 -24
  137. package/dist/indexer/{db.js → db/db.js} +126 -116
  138. package/dist/indexer/{graph-db.js → db/graph-db.js} +9 -4
  139. package/dist/indexer/{llm-cache.js → db/llm-cache.js} +15 -12
  140. package/dist/indexer/ensure-index.js +4 -4
  141. package/dist/indexer/{graph-boost.js → graph/graph-boost.js} +1 -1
  142. package/dist/indexer/{graph-extraction.js → graph/graph-extraction.js} +55 -13
  143. package/dist/indexer/indexer.js +37 -30
  144. package/dist/indexer/init.js +54 -0
  145. package/dist/indexer/manifest.js +10 -10
  146. package/dist/indexer/{memory-inference.js → passes/memory-inference.js} +92 -23
  147. package/dist/indexer/{metadata-contributors.js → passes/metadata-contributors.js} +10 -8
  148. package/dist/indexer/{metadata.js → passes/metadata.js} +15 -19
  149. package/dist/indexer/{staleness-detect.js → passes/staleness-detect.js} +53 -12
  150. package/dist/indexer/{db-search.js → search/db-search.js} +28 -16
  151. package/dist/indexer/{ranking-contributors.js → search/ranking-contributors.js} +1 -1
  152. package/dist/indexer/{ranking.js → search/ranking.js} +2 -2
  153. package/dist/indexer/{search-hit-enrichers.js → search/search-hit-enrichers.js} +3 -3
  154. package/dist/indexer/{search-source.js → search/search-source.js} +8 -8
  155. package/dist/indexer/{semantic-status.js → search/semantic-status.js} +3 -3
  156. package/dist/indexer/usage/unmigrated-vaults-guard.js +94 -0
  157. package/dist/indexer/{usage-events.js → usage/usage-events.js} +32 -0
  158. package/dist/indexer/{file-context.js → walk/file-context.js} +10 -15
  159. package/dist/indexer/{matchers.js → walk/matchers.js} +13 -9
  160. package/dist/indexer/{path-resolver.js → walk/path-resolver.js} +6 -6
  161. package/dist/indexer/{project-context.js → walk/project-context.js} +1 -1
  162. package/dist/indexer/{walker.js → walk/walker.js} +4 -3
  163. package/dist/integrations/agent/builder-shared.js +39 -0
  164. package/dist/integrations/agent/builders.js +14 -81
  165. package/dist/integrations/agent/config.js +6 -4
  166. package/dist/integrations/agent/detect.js +1 -1
  167. package/dist/integrations/agent/index.js +23 -8
  168. package/dist/integrations/agent/prompts.js +2 -3
  169. package/dist/integrations/agent/runner.js +22 -3
  170. package/dist/integrations/agent/spawn.js +9 -10
  171. package/dist/integrations/harnesses/claude/agent-builder.js +48 -0
  172. package/dist/integrations/harnesses/claude/config-import.js +70 -0
  173. package/dist/integrations/harnesses/claude/index.js +64 -0
  174. package/dist/integrations/{session-logs/providers/claude-code.js → harnesses/claude/session-log.js} +16 -1
  175. package/dist/integrations/harnesses/index.js +144 -0
  176. package/dist/integrations/harnesses/opencode/agent-builder.js +43 -0
  177. package/dist/integrations/harnesses/opencode/config-import.js +82 -0
  178. package/dist/integrations/harnesses/opencode/index.js +59 -0
  179. package/dist/integrations/{session-logs/providers/opencode.js → harnesses/opencode/session-log.js} +1 -1
  180. package/dist/integrations/harnesses/opencode-sdk/index.js +49 -0
  181. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +234 -0
  182. package/dist/integrations/harnesses/types.js +43 -0
  183. package/dist/integrations/lockfile.js +7 -16
  184. package/dist/integrations/session-logs/index.js +82 -9
  185. package/dist/llm/call-ai.js +4 -4
  186. package/dist/llm/client.js +131 -6
  187. package/dist/llm/embedder.js +6 -6
  188. package/dist/llm/embedders/local.js +9 -22
  189. package/dist/llm/embedders/remote.js +2 -2
  190. package/dist/llm/embedders/types.js +1 -1
  191. package/dist/llm/graph-extract.js +31 -12
  192. package/dist/llm/index-passes.js +1 -1
  193. package/dist/llm/memory-infer.js +12 -5
  194. package/dist/llm/metadata-enhance.js +2 -2
  195. package/dist/output/context.js +6 -44
  196. package/dist/output/renderers.js +88 -58
  197. package/dist/output/shapes/curate.js +7 -3
  198. package/dist/output/shapes/distill.js +7 -3
  199. package/dist/output/shapes/env-list.js +18 -16
  200. package/dist/output/shapes/events.js +5 -4
  201. package/dist/output/shapes/helpers.js +2 -4
  202. package/dist/output/shapes/history.js +7 -3
  203. package/dist/output/shapes/passthrough.js +8 -11
  204. package/dist/output/shapes/{proposal-accept.js → proposal/accept.js} +7 -3
  205. package/dist/output/shapes/{proposal-diff.js → proposal/diff.js} +7 -3
  206. package/dist/output/shapes/{proposal-list.js → proposal/list.js} +7 -3
  207. package/dist/output/shapes/{proposal-producer.js → proposal/producer.js} +5 -4
  208. package/dist/output/shapes/{proposal-reject.js → proposal/reject.js} +7 -3
  209. package/dist/output/shapes/{proposal-show.js → proposal/show.js} +7 -3
  210. package/dist/output/shapes/registry-search.js +7 -3
  211. package/dist/output/shapes/registry.js +12 -0
  212. package/dist/output/shapes/search.js +7 -3
  213. package/dist/output/shapes/secret-list.js +18 -16
  214. package/dist/output/shapes/show.js +7 -3
  215. package/dist/output/shapes.js +55 -30
  216. package/dist/output/text/add.js +2 -3
  217. package/dist/output/text/clone.js +2 -3
  218. package/dist/output/text/config.js +2 -3
  219. package/dist/output/text/curate.js +4 -3
  220. package/dist/output/text/distill.js +2 -3
  221. package/dist/output/text/enable-disable.js +5 -4
  222. package/dist/output/text/env.js +13 -0
  223. package/dist/output/text/events.js +5 -4
  224. package/dist/output/text/feedback.js +4 -3
  225. package/dist/output/text/helpers.js +54 -39
  226. package/dist/output/text/history.js +2 -3
  227. package/dist/output/text/import.js +2 -3
  228. package/dist/output/text/index.js +2 -3
  229. package/dist/output/text/info.js +2 -3
  230. package/dist/output/text/init.js +2 -3
  231. package/dist/output/text/list.js +2 -3
  232. package/dist/output/text/proposal/producer.js +9 -0
  233. package/dist/output/text/proposal/proposal.js +13 -0
  234. package/dist/output/text/registry-commands.js +8 -7
  235. package/dist/output/text/registry.js +12 -0
  236. package/dist/output/text/remember.js +4 -3
  237. package/dist/output/text/remove.js +2 -3
  238. package/dist/output/text/save.js +2 -3
  239. package/dist/output/text/search.js +4 -3
  240. package/dist/output/text/show.js +4 -3
  241. package/dist/output/text/update.js +2 -3
  242. package/dist/output/text/upgrade.js +2 -3
  243. package/dist/output/text/wiki.js +12 -11
  244. package/dist/output/text/workflow.js +12 -10
  245. package/dist/output/text.js +66 -32
  246. package/dist/registry/build-index.js +11 -10
  247. package/dist/registry/factory.js +1 -1
  248. package/dist/registry/origin-resolve.js +1 -1
  249. package/dist/registry/providers/index.js +2 -2
  250. package/dist/registry/providers/skills-sh.js +91 -72
  251. package/dist/registry/providers/static-index.js +75 -52
  252. package/dist/registry/resolve.js +3 -3
  253. package/dist/runtime.js +242 -0
  254. package/dist/scripts/migrate-storage.js +1594 -673
  255. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +240 -166
  256. package/dist/setup/detect.js +338 -9
  257. package/dist/setup/harness-config-import.js +56 -0
  258. package/dist/setup/registry-stash-loader.js +99 -0
  259. package/dist/setup/setup.js +664 -96
  260. package/dist/sources/include.js +1 -1
  261. package/dist/sources/provider-factory.js +2 -2
  262. package/dist/sources/providers/filesystem.js +3 -3
  263. package/dist/sources/providers/git.js +9 -9
  264. package/dist/sources/providers/index.js +4 -4
  265. package/dist/sources/providers/npm.js +6 -6
  266. package/dist/sources/providers/provider-utils.js +13 -20
  267. package/dist/sources/providers/sync-from-ref.js +5 -5
  268. package/dist/sources/providers/tar-utils.js +2 -2
  269. package/dist/sources/providers/website.js +2 -2
  270. package/dist/sources/resolve.js +5 -5
  271. package/dist/sources/website-ingest.js +5 -5
  272. package/dist/storage/database.js +102 -0
  273. package/dist/storage/engines/sqlite-migrations.js +42 -0
  274. package/dist/storage/locations.js +25 -0
  275. package/dist/storage/repositories/index-db.js +43 -0
  276. package/dist/storage/repositories/workflow-runs-repository.js +141 -0
  277. package/dist/tasks/backends/cron.js +4 -4
  278. package/dist/tasks/backends/exec-utils.js +32 -0
  279. package/dist/tasks/backends/index.js +3 -3
  280. package/dist/tasks/backends/launchd.js +7 -14
  281. package/dist/tasks/backends/schtasks.js +7 -16
  282. package/dist/tasks/embedded.js +71 -0
  283. package/dist/tasks/parser.js +2 -2
  284. package/dist/tasks/resolveAkmBin.js +1 -1
  285. package/dist/tasks/runner.js +28 -15
  286. package/dist/tasks/schedule.js +1 -1
  287. package/dist/tasks/validator.js +7 -7
  288. package/dist/text-import-hook.mjs +51 -0
  289. package/dist/version.js +2 -1
  290. package/dist/wiki/wiki.js +7 -7
  291. package/dist/workflows/{authoring.js → authoring/authoring.js} +6 -6
  292. package/dist/workflows/{scope-key.js → authoring/scope-key.js} +1 -1
  293. package/dist/workflows/cli.js +1 -1
  294. package/dist/workflows/db.js +50 -32
  295. package/dist/workflows/parser.js +4 -4
  296. package/dist/workflows/renderer.js +5 -5
  297. package/dist/workflows/runtime/agent-identity.js +56 -0
  298. package/dist/workflows/runtime/checkin.js +57 -0
  299. package/dist/workflows/{runs.js → runtime/runs.js} +197 -101
  300. package/dist/workflows/validate-summary.js +82 -0
  301. package/docs/README.md +1 -1
  302. package/docs/data-and-telemetry.md +6 -6
  303. package/package.json +16 -8
  304. package/dist/commands/add-cli.js +0 -279
  305. package/dist/commands/env.js +0 -213
  306. package/dist/integrations/agent/sdk-runner.js +0 -126
  307. package/dist/output/shapes/vault-list.js +0 -19
  308. package/dist/output/text/proposal-producer.js +0 -8
  309. package/dist/output/text/proposal.js +0 -12
  310. package/dist/output/text/vault.js +0 -16
  311. /package/dist/core/{asset-serialize.js → asset/asset-serialize.js} +0 -0
  312. /package/dist/core/{frontmatter.js → asset/frontmatter.js} +0 -0
  313. /package/dist/core/{config-sources.js → config/config-sources.js} +0 -0
  314. /package/dist/indexer/{graph-dedup.js → graph/graph-dedup.js} +0 -0
  315. /package/dist/{core/config-types.js → indexer/passes/pass-context.js} +0 -0
  316. /package/dist/indexer/{search-fields.js → search/search-fields.js} +0 -0
  317. /package/dist/indexer/{index-context.js → walk/index-context.js} +0 -0
  318. /package/dist/workflows/{document-cache.js → runtime/document-cache.js} +0 -0
@@ -11,14 +11,14 @@
11
11
  */
12
12
  import fs from "node:fs";
13
13
  import path from "node:path";
14
- import { listKeys as listVaultKeys } from "../commands/env";
15
- import { asNonEmptyString, hasErrnoCode } from "../core/common";
16
- import { parseFrontmatter } from "../core/frontmatter";
17
- import { extractFrontmatterOnly, extractLineRange, extractSection, formatToc, parseMarkdownToc, } from "../core/markdown";
18
- import { registerRenderer } from "../indexer/file-context";
19
- import { extractCommentMetadata, extractDescriptionFromComments } from "../indexer/metadata";
20
- import { registerMetadataContributor } from "../indexer/metadata-contributors";
21
- import { buildWorkflowAction, workflowMdRenderer } from "../workflows/renderer";
14
+ import { listKeys as listVaultKeys } from "../commands/env/env.js";
15
+ import { parseFrontmatter } from "../core/asset/frontmatter.js";
16
+ import { extractFrontmatterOnly, extractLineRange, extractSection, formatToc, parseMarkdownToc, } from "../core/asset/markdown.js";
17
+ import { asNonEmptyString, hasErrnoCode } from "../core/common.js";
18
+ import { extractCommentMetadata, extractDescriptionFromComments } from "../indexer/passes/metadata.js";
19
+ import { registerMetadataContributor } from "../indexer/passes/metadata-contributors.js";
20
+ import { registerRenderer } from "../indexer/walk/file-context.js";
21
+ import { buildWorkflowAction, workflowMdRenderer } from "../workflows/renderer.js";
22
22
  // ── Interpreter auto-detection map ───────────────────────────────────────────
23
23
  const INTERPRETER_MAP = {
24
24
  ".sh": "bash",
@@ -362,38 +362,11 @@ const scriptSourceRenderer = {
362
362
  }
363
363
  },
364
364
  };
365
- // ── 8. vault-env ─────────────────────────────────────────────────────────────
365
+ // ── 8. env-file ───────────────────────────────────────────────────────────────
366
366
  /**
367
- * Vault renderer. Returns ONLY key names and start-of-line comments — never
368
- * values. Deliberately omits content/template/prompt so vault values cannot
369
- * leak through `akm show`.
370
- */
371
- const vaultEnvRenderer = {
372
- name: "vault-env",
373
- buildShowResponse(ctx) {
374
- const name = deriveName(ctx);
375
- const { keys, comments } = listVaultKeys(ctx.absPath);
376
- return {
377
- type: "vault",
378
- name,
379
- path: ctx.absPath,
380
- action: 'Vault — keys + comments only. Use `source "$(akm vault path <ref>)"` to load values into the current shell, or `akm vault run <ref[/KEY]> -- <command>` to run with injected env. Values stay on disk and are never written to akm\'s stdout.',
381
- description: comments.length > 0 ? comments.join("\n") : undefined,
382
- keys,
383
- comments,
384
- };
385
- },
386
- enrichSearchHit(hit, _stashDir) {
387
- const { keys } = listVaultKeys(hit.path);
388
- if (keys.length > 0)
389
- hit.keys = keys;
390
- },
391
- };
392
- // ── 8b. env-file ───────────────────────────────────────────────────────────────
393
- /**
394
- * Env renderer. Like the (deprecated) vault renderer, returns ONLY key names
395
- * and start-of-line comments — never values. Deliberately omits
396
- * content/template/prompt so env values cannot leak through `akm show`.
367
+ * Env renderer. Returns ONLY key names and start-of-line comments — never
368
+ * values. Deliberately omits content/template/prompt so env values cannot leak
369
+ * through `akm show`.
397
370
  */
398
371
  const envFileRenderer = {
399
372
  name: "env-file",
@@ -449,6 +422,75 @@ const taskMdRenderer = {
449
422
  };
450
423
  },
451
424
  };
425
+ // ── 8. session-md (#561) ─────────────────────────────────────────────────────
426
+ /**
427
+ * Renderer for the `session` asset type (#561). A session asset is generated by
428
+ * the `extract` pass and carries `harness`, `started_at`/`ended_at`, `project`,
429
+ * `log_path`, and `access` frontmatter plus an LLM `## Summary` / `## Key topics`
430
+ * body. The renderer surfaces a human-readable one-liner (harness + date +
431
+ * project) and concrete `access` instructions rather than dumping raw
432
+ * frontmatter, so an agent can decide whether to open the raw log.
433
+ */
434
+ const sessionMdRenderer = {
435
+ name: "session-md",
436
+ buildShowResponse(ctx) {
437
+ const name = deriveName(ctx);
438
+ const parsed = parseFrontmatter(ctx.content());
439
+ const fm = parsed.data;
440
+ const harness = asNonEmptyString(fm.harness);
441
+ const project = asNonEmptyString(fm.project);
442
+ const startedAt = asNonEmptyString(fm.started_at);
443
+ const endedAt = asNonEmptyString(fm.ended_at);
444
+ const logPath = asNonEmptyString(fm.log_path);
445
+ const access = asNonEmptyString(fm.access);
446
+ const description = asNonEmptyString(fm.description);
447
+ const dateRange = startedAt ? (endedAt ? `${startedAt} – ${endedAt}` : startedAt) : undefined;
448
+ const headerParts = [
449
+ harness ? `harness: ${harness}` : undefined,
450
+ project ? `project: ${project}` : undefined,
451
+ dateRange,
452
+ ].filter((p) => !!p);
453
+ const accessLine = [logPath ? `log: ${logPath}` : undefined, access].filter((p) => !!p).join("\n");
454
+ const action = [
455
+ "Prior agent session — read the summary below.",
456
+ headerParts.length > 0 ? headerParts.join(" ") : undefined,
457
+ accessLine ? `Open the raw log:\n${accessLine}` : undefined,
458
+ ]
459
+ .filter((p) => !!p)
460
+ .join("\n");
461
+ return {
462
+ type: "session",
463
+ name,
464
+ path: ctx.absPath,
465
+ action,
466
+ description,
467
+ content: parsed.content,
468
+ };
469
+ },
470
+ };
471
+ function applySessionMetadata(entry, ctx) {
472
+ try {
473
+ const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
474
+ entry.tags = Array.from(new Set([...(entry.tags ?? []), "session"]));
475
+ const hints = new Set(entry.searchHints ?? []);
476
+ const harness = asNonEmptyString(fm.harness);
477
+ if (harness)
478
+ hints.add(`harness:${harness}`);
479
+ const project = asNonEmptyString(fm.project);
480
+ if (project)
481
+ hints.add(`project:${project}`);
482
+ // log_path is the durable correlation key — keep it discoverable as a hint
483
+ // so it survives in the index even when the body is re-derived.
484
+ const logPath = asNonEmptyString(fm.log_path);
485
+ if (logPath)
486
+ hints.add(`log_path:${logPath}`);
487
+ if (hints.size > 0)
488
+ entry.searchHints = Array.from(hints).filter(Boolean);
489
+ }
490
+ catch {
491
+ // Non-fatal: skip metadata extraction on parse error
492
+ }
493
+ }
452
494
  function applyTocMetadata(entry, ctx) {
453
495
  try {
454
496
  const toc = parseMarkdownToc(ctx.content());
@@ -538,18 +580,6 @@ function applyScriptMetadata(entry, ctx) {
538
580
  entry.confidence = 0.7;
539
581
  }
540
582
  }
541
- function applyVaultMetadata(entry, ctx) {
542
- const { keys, comments } = listVaultKeys(ctx.absPath);
543
- if (comments.length > 0 && !entry.description) {
544
- entry.description = comments.join(" ").slice(0, 500);
545
- entry.source = "comments";
546
- entry.confidence = 0.7;
547
- }
548
- if (keys.length > 0) {
549
- entry.searchHints = keys;
550
- }
551
- entry.tags = Array.from(new Set([...(entry.tags ?? []), "vault", "secrets"]));
552
- }
553
583
  function applyEnvMetadata(entry, ctx) {
554
584
  const { keys, comments } = listVaultKeys(ctx.absPath);
555
585
  if (comments.length > 0 && !entry.description) {
@@ -610,11 +640,6 @@ registerMetadataContributor({
610
640
  appliesTo: ({ rendererName }) => rendererName === "script-source",
611
641
  contribute: (entry, ctx) => applyScriptMetadata(entry, ctx.renderContext),
612
642
  });
613
- registerMetadataContributor({
614
- name: "vault-secret-metadata",
615
- appliesTo: ({ rendererName }) => rendererName === "vault-env",
616
- contribute: (entry, ctx) => applyVaultMetadata(entry, ctx.renderContext),
617
- });
618
643
  registerMetadataContributor({
619
644
  name: "env-file-metadata",
620
645
  appliesTo: ({ rendererName }) => rendererName === "env-file",
@@ -630,6 +655,11 @@ registerMetadataContributor({
630
655
  appliesTo: ({ rendererName }) => rendererName === "task-yaml",
631
656
  contribute: (entry, ctx) => applyTaskMetadata(entry, ctx.renderContext),
632
657
  });
658
+ registerMetadataContributor({
659
+ name: "session-md-metadata",
660
+ appliesTo: ({ rendererName }) => rendererName === "session-md",
661
+ contribute: (entry, ctx) => applySessionMetadata(entry, ctx.renderContext),
662
+ });
633
663
  // ── Registration ─────────────────────────────────────────────────────────────
634
664
  /** All built-in renderers. */
635
665
  const builtinRenderers = [
@@ -643,9 +673,9 @@ const builtinRenderers = [
643
673
  workflowMdRenderer,
644
674
  scriptSourceRenderer,
645
675
  envFileRenderer,
646
- vaultEnvRenderer,
647
676
  secretFileRenderer,
648
677
  taskMdRenderer,
678
+ sessionMdRenderer,
649
679
  ];
650
680
  /**
651
681
  * Register all built-in renderers with the file-context registry.
@@ -657,4 +687,4 @@ export function registerBuiltinRenderers() {
657
687
  }
658
688
  }
659
689
  // ── Named exports for testing ────────────────────────────────────────────────
660
- export { agentMdRenderer, commandMdRenderer, envFileRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, secretFileRenderer, skillMdRenderer, vaultEnvRenderer, wikiMdRenderer, workflowMdRenderer, };
690
+ export { agentMdRenderer, commandMdRenderer, envFileRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, secretFileRenderer, skillMdRenderer, wikiMdRenderer, workflowMdRenderer, };
@@ -1,8 +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 { capDescription, NORMAL_DESCRIPTION_LIMIT, pickFields } from "./helpers";
5
- import { registerOutputShape } from "./registry";
4
+ import { capDescription, NORMAL_DESCRIPTION_LIMIT, pickFields } from "./helpers.js";
6
5
  // Curation is a small, high-signal top-N. Even at `brief` we keep `followUp`
7
6
  // (the actionable `akm show <ref>` command) and `reason` (why this asset was
8
7
  // selected) — these are the point of curate, unlike a bulk search listing.
@@ -53,4 +52,9 @@ export function shapeCurateOutput(result, detail, shape) {
53
52
  };
54
53
  return base;
55
54
  }
56
- registerOutputShape("curate", (result, detail, shape) => shapeCurateOutput(result, detail, shape));
55
+ export const curateShapes = [
56
+ {
57
+ command: "curate",
58
+ handler: (result, detail, shape) => shapeCurateOutput(result, detail, shape),
59
+ },
60
+ ];
@@ -5,6 +5,10 @@
5
5
  // simple — outcome + ids + optional payload — so `brief` strips the full
6
6
  // proposal blob, `normal` keeps the headline fields, and `full` projects
7
7
  // everything for downstream automation.
8
- import { shapeDistillOutput } from "./helpers";
9
- import { registerOutputShape } from "./registry";
10
- registerOutputShape("distill", (result, detail) => shapeDistillOutput(result, detail));
8
+ import { shapeDistillOutput } from "./helpers.js";
9
+ export const distillShapes = [
10
+ {
11
+ command: "distill",
12
+ handler: (result, detail) => shapeDistillOutput(result, detail),
13
+ },
14
+ ];
@@ -1,19 +1,21 @@
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
- // env-list strips `path` from each env object (security: avoid leaking
5
- // absolute disk paths) then stamps the envelope.
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("env-list", (result) => {
8
- const r = result;
9
- const envs = Array.isArray(r.envs) ? r.envs : [];
10
- return {
11
- ...r,
12
- shape: r.shape ?? "env-list",
13
- schemaVersion: r.schemaVersion ?? 1,
14
- envs: envs.map((v) => {
15
- const { path: _path, ...rest } = v;
16
- return rest;
17
- }),
18
- };
19
- });
4
+ export const envListShapes = [
5
+ {
6
+ command: "env-list",
7
+ handler: (result) => {
8
+ const r = result;
9
+ const envs = Array.isArray(r.envs) ? r.envs : [];
10
+ return {
11
+ ...r,
12
+ shape: r.shape ?? "env-list",
13
+ schemaVersion: r.schemaVersion ?? 1,
14
+ envs: envs.map((v) => {
15
+ const { path: _path, ...rest } = v;
16
+ return rest;
17
+ }),
18
+ };
19
+ },
20
+ },
21
+ ];
@@ -4,8 +4,9 @@
4
4
  // Output shape registration for `akm events list` and `akm events tail` (#204).
5
5
  // Both share the same envelope; the renderer in text.ts uses distinct command
6
6
  // names so it can format streaming differently.
7
- import { shapeEventsOutput } from "./helpers";
8
- import { registerOutputShape } from "./registry";
7
+ import { shapeEventsOutput } from "./helpers.js";
9
8
  const handler = (result, detail) => shapeEventsOutput(result, detail);
10
- registerOutputShape("events-list", handler);
11
- registerOutputShape("events-tail", handler);
9
+ export const eventsShapes = [
10
+ { command: "events-list", handler },
11
+ { command: "events-tail", handler },
12
+ ];
@@ -297,7 +297,7 @@ export function shapeSearchHit(hit, detail) {
297
297
  }
298
298
  // Stash hit (local or remote)
299
299
  // `ref` is included at `brief` so agents can run `akm show <ref>` without
300
- // needing --detail full or --for-agent (REC-03).
300
+ // needing --detail full or --shape agent (REC-03).
301
301
  if (detail === "brief")
302
302
  return pickFields(hit, ["type", "name", "ref", "action", "estimatedTokens", "keys"]);
303
303
  if (detail === "normal") {
@@ -399,9 +399,7 @@ export function shapeShowOutput(result, detail, shape = "human") {
399
399
  "related",
400
400
  // path and editable are always projected so JSON consumers can locate and
401
401
  // edit the asset without needing --detail full (QA #7).
402
- // Exception: vault assets omit path to avoid leaking absolute disk paths
403
- // into structured JSON output (security fix M3).
404
- ...(result.type === "vault" ? [] : ["path"]),
402
+ "path",
405
403
  "editable",
406
404
  ]);
407
405
  if (detail !== "full") {
@@ -2,6 +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 shape registration for `akm history` — paired with the text renderer in text.ts.
5
- import { shapeHistoryOutput } from "./helpers";
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("history", (result, detail) => shapeHistoryOutput(result, detail));
5
+ import { shapeHistoryOutput } from "./helpers.js";
6
+ export const historyShapes = [
7
+ {
8
+ command: "history",
9
+ handler: (result, detail) => shapeHistoryOutput(result, detail),
10
+ },
11
+ ];
@@ -1,11 +1,6 @@
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
- // Identity-passthrough commands — registered here so the registry stays
5
- // exhaustive (v1 spec §9). Each result object is already shaped at the
6
- // command boundary; the registry just confirms there's no surprise
7
- // command name slipping through.
8
- import { registerOutputShape } from "./registry";
9
4
  // #484: stamp schemaVersion + shape discriminator on passthrough envelopes so
10
5
  // third-party consumers can pin a schema version and dispatch on shape uniformly.
11
6
  // Idempotent — never overwrites an existing schemaVersion or shape field.
@@ -34,6 +29,8 @@ const PASSTHROUGH_COMMANDS = [
34
29
  "env-create",
35
30
  "env-export",
36
31
  "env-remove",
32
+ "env-set",
33
+ "env-unset",
37
34
  "feedback",
38
35
  "graph-entities",
39
36
  "graph-entity",
@@ -72,6 +69,7 @@ const PASSTHROUGH_COMMANDS = [
72
69
  "tasks-doctor",
73
70
  "tasks-enable",
74
71
  "tasks-history",
72
+ "tasks-init",
75
73
  "tasks-list",
76
74
  "tasks-remove",
77
75
  "tasks-run",
@@ -79,9 +77,6 @@ const PASSTHROUGH_COMMANDS = [
79
77
  "tasks-sync",
80
78
  "update",
81
79
  "upgrade",
82
- "vault-create",
83
- "vault-set",
84
- "vault-unset",
85
80
  "wiki-create",
86
81
  "wiki-ingest",
87
82
  "wiki-lint",
@@ -92,6 +87,7 @@ const PASSTHROUGH_COMMANDS = [
92
87
  "wiki-show",
93
88
  "wiki-stash",
94
89
  "workflow-complete",
90
+ "workflow-complete-rejected",
95
91
  "workflow-create",
96
92
  "workflow-list",
97
93
  "workflow-next",
@@ -100,6 +96,7 @@ const PASSTHROUGH_COMMANDS = [
100
96
  "workflow-status",
101
97
  "workflow-validate",
102
98
  ];
103
- for (const command of PASSTHROUGH_COMMANDS) {
104
- registerOutputShape(command, makeStampHandler(command));
105
- }
99
+ export const passthroughShapes = PASSTHROUGH_COMMANDS.map((command) => ({
100
+ command,
101
+ handler: makeStampHandler(command),
102
+ }));
@@ -2,6 +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 shape registration for `akm proposal accept` (#225).
5
- import { shapeProposalAcceptOutput } from "./helpers";
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("proposal-accept", (result, detail) => shapeProposalAcceptOutput(result, detail));
5
+ import { shapeProposalAcceptOutput } from "../helpers.js";
6
+ export const proposalAcceptShapes = [
7
+ {
8
+ command: "proposal-accept",
9
+ handler: (result, detail) => shapeProposalAcceptOutput(result, detail),
10
+ },
11
+ ];
@@ -2,6 +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 shape registration for `akm proposal diff` (#225).
5
- import { shapeProposalDiffOutput } from "./helpers";
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("proposal-diff", (result, detail) => shapeProposalDiffOutput(result, detail));
5
+ import { shapeProposalDiffOutput } from "../helpers.js";
6
+ export const proposalDiffShapes = [
7
+ {
8
+ command: "proposal-diff",
9
+ handler: (result, detail) => shapeProposalDiffOutput(result, detail),
10
+ },
11
+ ];
@@ -2,6 +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 shape registration for `akm proposal list` (#225).
5
- import { shapeProposalListOutput } from "./helpers";
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("proposal-list", (result, detail) => shapeProposalListOutput(result, detail));
5
+ import { shapeProposalListOutput } from "../helpers.js";
6
+ export const proposalListShapes = [
7
+ {
8
+ command: "proposal-list",
9
+ handler: (result, detail) => shapeProposalListOutput(result, detail),
10
+ },
11
+ ];
@@ -4,8 +4,9 @@
4
4
  // Output shape registration for `akm reflect` and `akm propose` (#226).
5
5
  // Both share the proposal-producer envelope shape (success carries a proposal
6
6
  // entry; failure carries an AgentFailureReason discriminant).
7
- import { shapeProposalProducerOutput } from "./helpers";
8
- import { registerOutputShape } from "./registry";
7
+ import { shapeProposalProducerOutput } from "../helpers.js";
9
8
  const handler = (result, detail) => shapeProposalProducerOutput(result, detail);
10
- registerOutputShape("reflect", handler);
11
- registerOutputShape("propose", handler);
9
+ export const proposalProducerShapes = [
10
+ { command: "reflect", handler },
11
+ { command: "propose", handler },
12
+ ];
@@ -2,6 +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 shape registration for `akm proposal reject` (#225).
5
- import { shapeProposalRejectOutput } from "./helpers";
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("proposal-reject", (result, detail) => shapeProposalRejectOutput(result, detail));
5
+ import { shapeProposalRejectOutput } from "../helpers.js";
6
+ export const proposalRejectShapes = [
7
+ {
8
+ command: "proposal-reject",
9
+ handler: (result, detail) => shapeProposalRejectOutput(result, detail),
10
+ },
11
+ ];
@@ -2,6 +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 shape registration for `akm proposal show` (#225).
5
- import { shapeProposalShowOutput } from "./helpers";
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("proposal-show", (result, detail) => shapeProposalShowOutput(result, detail));
5
+ import { shapeProposalShowOutput } from "../helpers.js";
6
+ export const proposalShowShapes = [
7
+ {
8
+ command: "proposal-show",
9
+ handler: (result, detail) => shapeProposalShowOutput(result, detail),
10
+ },
11
+ ];
@@ -1,6 +1,10 @@
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 { shapeRegistrySearchOutput } from "./helpers";
5
- import { registerOutputShape } from "./registry";
6
- registerOutputShape("registry-search", (result, detail) => shapeRegistrySearchOutput(result, detail));
4
+ import { shapeRegistrySearchOutput } from "./helpers.js";
5
+ export const registrySearchShapes = [
6
+ {
7
+ command: "registry-search",
8
+ handler: (result, detail) => shapeRegistrySearchOutput(result, detail),
9
+ },
10
+ ];
@@ -15,6 +15,18 @@ const OUTPUT_SHAPE_REGISTRY = new Map();
15
15
  export function registerOutputShape(command, handler) {
16
16
  OUTPUT_SHAPE_REGISTRY.set(command, handler);
17
17
  }
18
+ /**
19
+ * Register a batch of {@link OutputShapeEntry} definitions in iteration order.
20
+ *
21
+ * This is the explicit-assembly entry point used by `shapes.ts`: the built-in
22
+ * shape set is registered by iterating a single explicit list exactly once,
23
+ * with no reliance on module import order.
24
+ */
25
+ export function registerOutputShapes(entries) {
26
+ for (const { command, handler } of entries) {
27
+ OUTPUT_SHAPE_REGISTRY.set(command, handler);
28
+ }
29
+ }
18
30
  /**
19
31
  * Remove a previously-registered output shape. Test-only utility.
20
32
  */
@@ -1,6 +1,10 @@
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 { shapeSearchOutput } from "./helpers";
5
- import { registerOutputShape } from "./registry";
6
- registerOutputShape("search", (result, detail, shape) => shapeSearchOutput(result, detail, shape));
4
+ import { shapeSearchOutput } from "./helpers.js";
5
+ export const searchShapes = [
6
+ {
7
+ command: "search",
8
+ handler: (result, detail, shape) => shapeSearchOutput(result, detail, shape),
9
+ },
10
+ ];
@@ -1,19 +1,21 @@
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
- // secret-list strips `path` from each secret object (same as vault-list: avoid
5
- // leaking absolute disk paths) then stamps the envelope.
6
- import { registerOutputShape } from "./registry";
7
- registerOutputShape("secret-list", (result) => {
8
- const r = result;
9
- const secrets = Array.isArray(r.secrets) ? r.secrets : [];
10
- return {
11
- ...r,
12
- shape: r.shape ?? "secret-list",
13
- schemaVersion: r.schemaVersion ?? 1,
14
- secrets: secrets.map((s) => {
15
- const { path: _path, ...rest } = s;
16
- return rest;
17
- }),
18
- };
19
- });
4
+ export const secretListShapes = [
5
+ {
6
+ command: "secret-list",
7
+ handler: (result) => {
8
+ const r = result;
9
+ const secrets = Array.isArray(r.secrets) ? r.secrets : [];
10
+ return {
11
+ ...r,
12
+ shape: r.shape ?? "secret-list",
13
+ schemaVersion: r.schemaVersion ?? 1,
14
+ secrets: secrets.map((s) => {
15
+ const { path: _path, ...rest } = s;
16
+ return rest;
17
+ }),
18
+ };
19
+ },
20
+ },
21
+ ];
@@ -1,6 +1,10 @@
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 { shapeShowOutput } from "./helpers";
5
- import { registerOutputShape } from "./registry";
6
- registerOutputShape("show", (result, detail, shape) => shapeShowOutput(result, detail, shape));
4
+ import { shapeShowOutput } from "./helpers.js";
5
+ export const showShapes = [
6
+ {
7
+ command: "show",
8
+ handler: (result, detail, shape) => shapeShowOutput(result, detail, shape),
9
+ },
10
+ ];