akm-cli 0.9.1 → 0.9.2-alpha.2

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 (350) hide show
  1. package/CHANGELOG.md +103 -28
  2. package/README.md +3 -1
  3. package/SECURITY.md +1 -1
  4. package/STABILITY.md +1 -1
  5. package/dist/akm +2 -2
  6. package/dist/akm-migrate +2 -2
  7. package/dist/assets/hints/cli-hints-full.md +14 -9
  8. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
  9. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  10. package/dist/assets/models.json +35 -0
  11. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
  12. package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
  13. package/dist/assets/tasks/core/extract.yml +6 -5
  14. package/dist/assets/tasks/core/improve.yml +6 -5
  15. package/dist/assets/tasks/core/index-refresh.yml +6 -5
  16. package/dist/assets/tasks/core/sync.yml +6 -5
  17. package/dist/assets/tasks/core/version-check.yml +6 -5
  18. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
  19. package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
  20. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
  21. package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
  22. package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
  23. package/dist/cli/confirm.js +2 -2
  24. package/dist/cli/parse-args.js +3 -24
  25. package/dist/cli/retired-commands.js +1 -1
  26. package/dist/cli/shared.js +2 -2
  27. package/dist/cli.js +11 -9
  28. package/dist/commands/agent/agent-dispatch.js +55 -89
  29. package/dist/commands/agent/contribute-cli.js +12 -45
  30. package/dist/commands/command/builtin-action.js +32 -0
  31. package/dist/commands/command/command-cli.js +99 -0
  32. package/dist/commands/command/command-execution.js +308 -0
  33. package/dist/commands/command/execution-source-loader.js +176 -0
  34. package/dist/commands/command/portable-template.js +60 -0
  35. package/dist/commands/config-cli.js +10 -4
  36. package/dist/commands/env/env.js +4 -2
  37. package/dist/commands/feedback-cli.js +1 -1
  38. package/dist/commands/health/checks.js +241 -29
  39. package/dist/commands/health/html-report.js +0 -14
  40. package/dist/commands/health/report-view-model.js +0 -1
  41. package/dist/commands/health/surfaces.js +6 -7
  42. package/dist/commands/health/types.js +0 -2
  43. package/dist/commands/health.js +63 -18
  44. package/dist/commands/improve/collapse-detector.js +5 -6
  45. package/dist/commands/improve/consolidate.js +251 -214
  46. package/dist/commands/improve/distill/promote-memory.js +71 -34
  47. package/dist/commands/improve/distill/quality-gate.js +17 -5
  48. package/dist/commands/improve/distill.js +232 -155
  49. package/dist/commands/improve/eligibility.js +112 -79
  50. package/dist/commands/improve/execution.js +57 -0
  51. package/dist/commands/improve/extract-cli.js +5 -5
  52. package/dist/commands/improve/extract-prompt.js +64 -22
  53. package/dist/commands/improve/extract.js +608 -360
  54. package/dist/commands/improve/improve-strategies.js +43 -14
  55. package/dist/commands/improve/improve.js +249 -29
  56. package/dist/commands/improve/loop-stages.js +11 -17
  57. package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
  58. package/dist/commands/improve/outcome-loop.js +22 -38
  59. package/dist/commands/improve/planner.js +134 -0
  60. package/dist/commands/improve/preparation.js +730 -409
  61. package/dist/commands/improve/reflect.js +386 -223
  62. package/dist/commands/improve/run-context.js +3 -4
  63. package/dist/commands/improve/salience.js +6 -58
  64. package/dist/commands/improve/session-asset.js +12 -12
  65. package/dist/commands/lint/index.js +101 -29
  66. package/dist/commands/migrate-cli.js +11 -69
  67. package/dist/commands/migration-tool.js +6 -9
  68. package/dist/commands/models-cli.js +27 -0
  69. package/dist/commands/proposal/drain.js +258 -186
  70. package/dist/commands/proposal/proposal-cli.js +32 -10
  71. package/dist/commands/proposal/proposal.js +2 -5
  72. package/dist/commands/proposal/propose.js +192 -172
  73. package/dist/commands/proposal/repository.js +54 -91
  74. package/dist/commands/proposal/validators/proposal-validators.js +9 -7
  75. package/dist/commands/read/curate.js +53 -22
  76. package/dist/commands/read/registry-search.js +25 -9
  77. package/dist/commands/read/remember-cli.js +14 -2
  78. package/dist/commands/read/search.js +10 -4
  79. package/dist/commands/read/show.js +139 -153
  80. package/dist/commands/registry-cli.js +16 -7
  81. package/dist/commands/remember.js +33 -18
  82. package/dist/commands/sources/add-cli.js +19 -178
  83. package/dist/commands/sources/bundle-cli.js +15 -3
  84. package/dist/commands/sources/dangerous-env-audit.js +135 -0
  85. package/dist/commands/sources/info.js +2 -1
  86. package/dist/commands/sources/installed-stashes.js +901 -177
  87. package/dist/commands/sources/schema-repair.js +174 -95
  88. package/dist/commands/sources/self-update.js +30 -74
  89. package/dist/commands/sources/source-add.js +3 -5
  90. package/dist/commands/sources/sources-cli.js +2 -15
  91. package/dist/commands/sources/update-transaction.js +220 -0
  92. package/dist/commands/tasks/tasks-cli.js +3 -3
  93. package/dist/commands/tasks/tasks.js +736 -317
  94. package/dist/commands/workflow-cli.js +2 -2
  95. package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
  96. package/dist/core/adapter/adapters/akm-adapter.js +85 -35
  97. package/dist/core/adapter/adapters/akm-lint.js +54 -39
  98. package/dist/core/adapter/adapters/akm-metadata.js +45 -45
  99. package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
  100. package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
  101. package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
  102. package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
  103. package/dist/core/adapter/adapters/index.js +0 -9
  104. package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
  105. package/dist/core/adapter/adapters/okf-adapter.js +4 -0
  106. package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
  107. package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
  108. package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
  109. package/dist/core/adapter/execution-source.js +308 -0
  110. package/dist/core/adapter/recognize-match.js +36 -13
  111. package/dist/core/adapter/registry.js +0 -9
  112. package/dist/core/asset/stash-meta.js +94 -4
  113. package/dist/core/common.js +6 -11
  114. package/dist/core/config/config-io.js +3 -3
  115. package/dist/core/config/config-schema.js +18 -40
  116. package/dist/core/config/config-sources.js +11 -21
  117. package/dist/core/config/config-walker.js +31 -13
  118. package/dist/core/config/config.js +23 -26
  119. package/dist/core/config/schema/engines.js +8 -7
  120. package/dist/core/config/schema/improve-processes.js +29 -5
  121. package/dist/core/config/schema/index-config.js +0 -27
  122. package/dist/core/config/schema/primitives.js +1 -23
  123. package/dist/core/config/schema/sources-bundles.js +13 -16
  124. package/dist/core/errors.js +2 -0
  125. package/dist/core/events.js +68 -32
  126. package/dist/core/extra-params.js +1 -0
  127. package/dist/core/improve-result.js +315 -0
  128. package/dist/core/lesson-lint.js +0 -6
  129. package/dist/core/maintenance-barrier.js +4 -4
  130. package/dist/core/network-policy.js +152 -0
  131. package/dist/core/paths.js +1 -1
  132. package/dist/core/recognition-util.js +4 -4
  133. package/dist/core/registry-url.js +456 -0
  134. package/dist/core/state/migrations.js +161 -47
  135. package/dist/core/state-db.js +453 -80
  136. package/dist/core/system-error.js +32 -0
  137. package/dist/core/time.js +2 -12
  138. package/dist/core/write-source.js +0 -18
  139. package/dist/execution/directory-identity.js +52 -0
  140. package/dist/execution/executable-identity.js +107 -0
  141. package/dist/execution/guarded-source.js +398 -0
  142. package/dist/execution/json.js +95 -0
  143. package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
  144. package/dist/execution/record.js +55 -0
  145. package/dist/execution/resolved-request.js +730 -0
  146. package/dist/execution/source.js +320 -0
  147. package/dist/indexer/bundle-identity-guard.js +5 -4
  148. package/dist/indexer/db/graph-db.js +33 -0
  149. package/dist/indexer/graph/graph-boost.js +3 -4
  150. package/dist/indexer/graph/graph-extraction.js +562 -373
  151. package/dist/indexer/index-written-assets.js +78 -39
  152. package/dist/indexer/indexer.js +471 -432
  153. package/dist/indexer/installations.js +6 -0
  154. package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
  155. package/dist/indexer/materialize-embeddings.js +155 -0
  156. package/dist/indexer/passes/memory-inference.js +227 -174
  157. package/dist/indexer/passes/metadata.js +263 -118
  158. package/dist/indexer/scan/doc-to-entry.js +7 -10
  159. package/dist/indexer/scan/drain-dir.js +51 -23
  160. package/dist/indexer/search/db-search.js +156 -50
  161. package/dist/indexer/search/fts-query.js +40 -40
  162. package/dist/indexer/search/ranking.js +36 -1
  163. package/dist/indexer/search/search-attribution.js +3 -1
  164. package/dist/indexer/search/search-fields.js +23 -14
  165. package/dist/indexer/search/search-hit-enrichers.js +1 -1
  166. package/dist/indexer/search/search-source.js +7 -16
  167. package/dist/indexer/search/semantic-status.js +10 -1
  168. package/dist/indexer/usage/show-usage.js +105 -0
  169. package/dist/indexer/usage/usage-events.js +7 -2
  170. package/dist/indexer/walk/matchers.js +40 -10
  171. package/dist/indexer/walk/path-resolver.js +5 -2
  172. package/dist/indexer/walk/walker.js +20 -2
  173. package/dist/integrations/agent/builder-shared.js +3 -6
  174. package/dist/integrations/agent/conversation-fallback.js +16 -0
  175. package/dist/integrations/agent/engine-resolution.js +87 -87
  176. package/dist/integrations/agent/execution-cascade.js +566 -0
  177. package/dist/integrations/agent/execution-definitions.js +211 -0
  178. package/dist/integrations/agent/execution-lowering.js +811 -0
  179. package/dist/integrations/agent/execution-preparation.js +67 -0
  180. package/dist/integrations/agent/index.js +0 -2
  181. package/dist/integrations/agent/inline-execution.js +74 -0
  182. package/dist/integrations/agent/model-map.js +515 -0
  183. package/dist/integrations/agent/persona-fallback.js +30 -0
  184. package/dist/integrations/agent/request-lowering.js +186 -0
  185. package/dist/integrations/agent/runner-dispatch.js +230 -37
  186. package/dist/integrations/agent/runner.js +12 -83
  187. package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
  188. package/dist/integrations/harnesses/aider/index.js +0 -1
  189. package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
  190. package/dist/integrations/harnesses/amazonq/index.js +0 -1
  191. package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
  192. package/dist/integrations/harnesses/claude/index.js +1 -5
  193. package/dist/integrations/harnesses/claude/session-log.js +3 -33
  194. package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
  195. package/dist/integrations/harnesses/codex/index.js +0 -1
  196. package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
  197. package/dist/integrations/harnesses/copilot/index.js +0 -1
  198. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
  199. package/dist/integrations/harnesses/gemini/index.js +0 -1
  200. package/dist/integrations/harnesses/index.js +4 -44
  201. package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
  202. package/dist/integrations/harnesses/opencode/index.js +0 -2
  203. package/dist/integrations/harnesses/opencode/session-log.js +14 -204
  204. package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
  205. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
  206. package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
  207. package/dist/integrations/harnesses/openhands/index.js +0 -1
  208. package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
  209. package/dist/integrations/harnesses/pi/index.js +0 -1
  210. package/dist/integrations/harnesses/shared.js +0 -1
  211. package/dist/integrations/harnesses/types.js +1 -3
  212. package/dist/integrations/lockfile.js +82 -79
  213. package/dist/integrations/session-logs/index.js +6 -17
  214. package/dist/integrations/session-logs/provider-base.js +1 -29
  215. package/dist/llm/client.js +10 -5
  216. package/dist/llm/embedder.js +6 -7
  217. package/dist/llm/embedders/local.js +37 -88
  218. package/dist/llm/embedders/types.js +1 -1
  219. package/dist/llm/graph-extract.js +75 -50
  220. package/dist/llm/index-passes.js +43 -5
  221. package/dist/llm/memory-infer.js +8 -6
  222. package/dist/llm/metadata-enhance.js +5 -3
  223. package/dist/llm/structured-call.js +122 -25
  224. package/dist/output/format-exempt.js +1 -1
  225. package/dist/output/render-registry.js +0 -16
  226. package/dist/output/renderers.js +12 -7
  227. package/dist/output/shapes/curate.js +1 -0
  228. package/dist/output/shapes/helpers.js +10 -2
  229. package/dist/output/shapes/passthrough.js +2 -0
  230. package/dist/output/text/command-format.js +31 -33
  231. package/dist/output/text/health-format.js +1 -29
  232. package/dist/output/text/migrate.js +6 -56
  233. package/dist/output/text/proposal-format.js +16 -1
  234. package/dist/output/text/workflow-format.js +16 -0
  235. package/dist/registry/network.js +279 -0
  236. package/dist/registry/pinned-request-helper.js +247 -0
  237. package/dist/registry/pinned-transport.js +717 -0
  238. package/dist/registry/providers/skills-sh.js +18 -6
  239. package/dist/registry/providers/static-index.js +20 -7
  240. package/dist/registry/resolve.js +53 -28
  241. package/dist/scripts/akm-migrate-node.js +19334 -52269
  242. package/dist/scripts/akm-migrate.js +19270 -51612
  243. package/dist/setup/registry-stash-loader.js +64 -20
  244. package/dist/setup/semantic-assets.js +9 -34
  245. package/dist/setup/setup.js +12 -30
  246. package/dist/setup/source-identity.js +17 -0
  247. package/dist/setup/steps/sources.js +36 -15
  248. package/dist/setup/steps/tasks.js +39 -11
  249. package/dist/sources/providers/git-provider.js +3 -3
  250. package/dist/sources/providers/npm.js +2 -2
  251. package/dist/sources/providers/provider-utils.js +4 -3
  252. package/dist/sources/providers/website.js +11 -7
  253. package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
  254. package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
  255. package/dist/sources/website-url.js +73 -0
  256. package/dist/storage/engines/sqlite-migrations.js +81 -26
  257. package/dist/storage/managed-db.js +27 -24
  258. package/dist/storage/repositories/events-repository.js +3 -0
  259. package/dist/storage/repositories/index-connection.js +42 -10
  260. package/dist/storage/repositories/index-entries-repository.js +203 -229
  261. package/dist/storage/repositories/index-entry-mapper.js +8 -12
  262. package/dist/storage/repositories/index-entry-schema.js +255 -0
  263. package/dist/storage/repositories/index-fts-repository.js +64 -71
  264. package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
  265. package/dist/storage/repositories/index-meta-repository.js +0 -11
  266. package/dist/storage/repositories/index-schema.js +74 -350
  267. package/dist/storage/repositories/index-utility-repository.js +12 -17
  268. package/dist/storage/repositories/index-vec-repository.js +56 -7
  269. package/dist/storage/repositories/proposals-repository.js +4 -127
  270. package/dist/storage/repositories/registry-cache.js +2 -1
  271. package/dist/storage/repositories/task-history-repository.js +20 -40
  272. package/dist/storage/repositories/workflow-runs-repository.js +228 -129
  273. package/dist/storage/sqlite-read-snapshot.js +148 -0
  274. package/dist/tasks/backends/cron.js +170 -42
  275. package/dist/tasks/backends/index.js +1 -1
  276. package/dist/tasks/backends/launchd.js +787 -202
  277. package/dist/tasks/backends/schtasks.js +282 -83
  278. package/dist/tasks/embedded.js +7 -7
  279. package/dist/tasks/frozen-script.js +50 -0
  280. package/dist/tasks/resolve-akm-bin.js +5 -1
  281. package/dist/tasks/runner.js +239 -251
  282. package/dist/tasks/runtime-v3.js +281 -0
  283. package/dist/tasks/scheduler-binding.js +272 -0
  284. package/dist/tasks/scheduler-invocation.js +57 -43
  285. package/dist/tasks/scheduler-sync.js +654 -0
  286. package/dist/tasks/source-v3.js +752 -0
  287. package/dist/tasks/standalone-script-entry.js +5 -0
  288. package/dist/tasks/task-id.js +29 -0
  289. package/dist/workflows/authoring/authoring.js +15 -32
  290. package/dist/workflows/exec/dispatch-redaction.js +14 -8
  291. package/dist/workflows/exec/exec-unit.js +7 -28
  292. package/dist/workflows/exec/frozen-judge.js +57 -89
  293. package/dist/workflows/exec/lowering-notices.js +23 -0
  294. package/dist/workflows/exec/native-executor.js +301 -458
  295. package/dist/workflows/exec/param-secrets.js +4 -3
  296. package/dist/workflows/exec/run-workflow.js +26 -32
  297. package/dist/workflows/exec/step-work.js +105 -109
  298. package/dist/workflows/exec/unit-dispatch.js +103 -27
  299. package/dist/workflows/exec/unit-writer.js +3 -3
  300. package/dist/workflows/exec/worktree.js +2 -2
  301. package/dist/workflows/ir/compile.js +86 -72
  302. package/dist/workflows/ir/environment-v4.js +328 -0
  303. package/dist/workflows/ir/freeze-v4.js +122 -0
  304. package/dist/workflows/ir/plan-hash.js +13 -7
  305. package/dist/workflows/ir/schema-v4.js +525 -0
  306. package/dist/workflows/ir/schema.js +25 -284
  307. package/dist/workflows/ir/source-freeze-v4.js +506 -0
  308. package/dist/workflows/parser.js +27 -24
  309. package/dist/workflows/program/schema.js +1 -2
  310. package/dist/workflows/renderer.js +42 -29
  311. package/dist/workflows/resource-limits.js +4 -5
  312. package/dist/workflows/runtime/agent-identity.js +11 -13
  313. package/dist/workflows/runtime/plan-classifier.js +8 -8
  314. package/dist/workflows/runtime/runs.js +27 -43
  315. package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
  316. package/dist/workflows/source-files.js +373 -0
  317. package/dist/workflows/source-ir/compile.js +196 -0
  318. package/dist/workflows/source-ir/github-yaml.js +577 -0
  319. package/dist/workflows/source-ir/ordering.js +38 -0
  320. package/dist/workflows/source-ir/program.js +50 -0
  321. package/dist/workflows/source-ir/result.js +26 -0
  322. package/dist/workflows/source-ir/schema.js +772 -0
  323. package/dist/workflows/source-ir/semantics.js +242 -0
  324. package/dist/workflows/source-ir/uses.js +14 -0
  325. package/docs/README.md +2 -0
  326. package/docs/migration/README.md +3 -1
  327. package/docs/migration/release-notes/0.9.2.md +55 -0
  328. package/docs/migration/release-notes/README.md +5 -0
  329. package/docs/migration/v0.8-to-v0.9.md +76 -1077
  330. package/docs/migration/v0.9.0-troubleshooting.md +104 -516
  331. package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
  332. package/docs/reference/README.md +1 -0
  333. package/docs/reference/cli.md +230 -98
  334. package/docs/reference/configuration.md +159 -36
  335. package/docs/reference/data-and-telemetry.md +19 -1
  336. package/docs/reference/supported-formats.md +23 -3
  337. package/docs/reference/tasks.md +182 -0
  338. package/docs/reference/workflow-schema.md +91 -40
  339. package/docs/reference/workflows.md +33 -6
  340. package/package.json +10 -6
  341. package/schemas/akm-config.json +372 -224
  342. package/schemas/akm-task.json +324 -80
  343. package/schemas/akm-workflow.json +6 -9
  344. package/dist/core/migration-operation.js +0 -75
  345. package/dist/integrations/agent/model-aliases.js +0 -74
  346. package/dist/tasks/parser.js +0 -380
  347. package/dist/tasks/schema.js +0 -123
  348. package/dist/tasks/validator.js +0 -80
  349. package/dist/workflows/ir/freeze.js +0 -320
  350. package/dist/workflows/runtime/document-cache.js +0 -13
@@ -181,6 +181,9 @@ const commandMdRenderer = {
181
181
  const parsedMd = parseFrontmatter(ctx.content());
182
182
  const template = parsedMd.content;
183
183
  const tags = readFrontmatterTags(parsedMd.data.tags);
184
+ const modelHint = typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined;
185
+ const agent = asNonEmptyString(parsedMd.data.agent);
186
+ const parameters = extractParameters(template);
184
187
  return {
185
188
  type: "command",
186
189
  name,
@@ -189,9 +192,9 @@ const commandMdRenderer = {
189
192
  description: asNonEmptyString(parsedMd.data.description),
190
193
  ...(tags ? { tags } : {}),
191
194
  template,
192
- modelHint: typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined,
193
- agent: asNonEmptyString(parsedMd.data.agent),
194
- parameters: extractParameters(template),
195
+ ...(modelHint !== undefined ? { modelHint } : {}),
196
+ ...(agent !== undefined ? { agent } : {}),
197
+ ...(parameters !== undefined ? { parameters } : {}),
195
198
  };
196
199
  },
197
200
  };
@@ -201,6 +204,8 @@ const agentMdRenderer = {
201
204
  buildShowResponse(ctx) {
202
205
  const name = deriveName(ctx);
203
206
  const parsedMd = parseFrontmatter(ctx.content());
207
+ const toolPolicy = parsedMd.data.tools;
208
+ const modelHint = typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined;
204
209
  return {
205
210
  type: "agent",
206
211
  name,
@@ -212,8 +217,8 @@ const agentMdRenderer = {
212
217
  // whether this self-declared policy is honoured is applied at the show
213
218
  // layer (`akmShowUnified`), which knows whether the source is the operator's
214
219
  // own writable stash vs a read-only third-party source (07 P1-D).
215
- toolPolicy: parsedMd.data.tools,
216
- modelHint: typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined,
220
+ ...(toolPolicy !== undefined ? { toolPolicy } : {}),
221
+ ...(modelHint !== undefined ? { modelHint } : {}),
217
222
  };
218
223
  },
219
224
  };
@@ -296,8 +301,8 @@ const scriptSourceRenderer = {
296
301
  path: ctx.absPath,
297
302
  action: "Execute the run command below",
298
303
  run: hints.run,
299
- setup: hints.setup,
300
- cwd: hints.cwd,
304
+ ...(hints.setup !== undefined ? { setup: hints.setup } : {}),
305
+ ...(hints.cwd !== undefined ? { cwd: hints.cwd } : {}),
301
306
  };
302
307
  }
303
308
  }
@@ -68,6 +68,7 @@ export function shapeCurateOutput(result, detail, shape) {
68
68
  query: result.query,
69
69
  summary: result.summary,
70
70
  items: shapedItems,
71
+ ...(typeof result.searchMode === "string" ? { searchMode: result.searchMode } : {}),
71
72
  ...(Array.isArray(result.warnings) && result.warnings.length > 0 ? { warnings: result.warnings } : {}),
72
73
  ...(result.tip ? { tip: result.tip } : {}),
73
74
  };
@@ -13,6 +13,7 @@ export function shapeProposalProducerOutput(result, detail) {
13
13
  ...(result.name !== undefined ? { name: result.name } : {}),
14
14
  ...(result.engine !== undefined ? { engine: result.engine } : {}),
15
15
  ...(result.exitCode !== undefined ? { exitCode: result.exitCode } : {}),
16
+ ...(Array.isArray(result.notices) ? { notices: result.notices } : {}),
16
17
  };
17
18
  if (detail === "full") {
18
19
  return {
@@ -30,6 +31,7 @@ export function shapeProposalProducerOutput(result, detail) {
30
31
  ref: result.ref,
31
32
  ...(result.engine !== undefined ? { engine: result.engine } : {}),
32
33
  ...(typeof result.durationMs === "number" ? { durationMs: result.durationMs } : {}),
34
+ ...(Array.isArray(result.notices) ? { notices: result.notices } : {}),
33
35
  proposal: shapeProposalEntry(proposal, detail === "brief" ? "normal" : detail),
34
36
  };
35
37
  if (detail === "full") {
@@ -185,10 +187,14 @@ export function shapeSearchOutput(result, detail, shape = "human") {
185
187
  const shapedRegistryHits = forAgent
186
188
  ? registryHits.map((hit) => shapeSearchHitForAgent(hit))
187
189
  : registryHits.map((hit) => shapeSearchHit(hit, detail));
190
+ const searchMode = typeof result.searchMode === "string" ? result.searchMode : undefined;
191
+ const warnings = Array.isArray(result.warnings) && result.warnings.length > 0 ? result.warnings : undefined;
188
192
  if (forAgent) {
189
193
  return {
190
194
  hits: shapedHits,
191
195
  ...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
196
+ ...(searchMode ? { searchMode } : {}),
197
+ ...(warnings ? { warnings } : {}),
192
198
  ...(result.tip ? { tip: result.tip } : {}),
193
199
  };
194
200
  }
@@ -200,14 +206,16 @@ export function shapeSearchOutput(result, detail, shape = "human") {
200
206
  hits: shapedHits,
201
207
  ...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
202
208
  ...(result.tip ? { tip: result.tip } : {}),
203
- ...(result.warnings ? { warnings: result.warnings } : {}),
209
+ ...(searchMode ? { searchMode } : {}),
210
+ ...(warnings ? { warnings } : {}),
204
211
  ...(result.timing ? { timing: result.timing } : {}),
205
212
  };
206
213
  }
207
214
  return {
208
215
  hits: shapedHits,
209
216
  ...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
210
- ...(Array.isArray(result.warnings) && result.warnings.length > 0 ? { warnings: result.warnings } : {}),
217
+ ...(searchMode ? { searchMode } : {}),
218
+ ...(warnings ? { warnings } : {}),
211
219
  ...(result.tip ? { tip: result.tip } : {}),
212
220
  };
213
221
  }
@@ -24,6 +24,7 @@ const PASSTHROUGH_COMMANDS = [
24
24
  "bundle-create",
25
25
  "bundle-show",
26
26
  "clone",
27
+ "command-dry-run",
27
28
  "config",
28
29
  "env-create",
29
30
  "env-export",
@@ -37,6 +38,7 @@ const PASSTHROUGH_COMMANDS = [
37
38
  "info",
38
39
  "lint",
39
40
  "list",
41
+ "models",
40
42
  "proposal-accept-batch",
41
43
  "proposal-drain",
42
44
  "proposal-reject-batch",
@@ -2,21 +2,20 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * `akm info`'s real result (`InfoResponse`, `src/sources/types.ts`) carries
6
- * `defaultBundle`/`assetTypes`/`searchModes`/`semanticSearch`/`registries`/
7
- * `sourceProviders`/`indexStats` this formatter used to check for
8
- * `configPath`/`cacheDir`/`dbPath`/`capabilities`/`index` instead, none of
9
- * which `InfoResponse` has ever had, so every one of those `if` guards was
10
- * always false and those five real fields silently never appeared in
11
- * `--format text` output (the plain fallthrough JSON check three lines below
12
- * papered over it: `lines` was never empty because `version`/`bundleDir`
13
- * always matched, so the "render everything" escape hatch never fired
14
- * either same class of bug as `akm health`/`akm lint`'s raw-JSON-array
15
- * dump: `--format text` claiming to render a shape it wasn't actually
16
- * rendering). The legacy field checks stay (harmless no-ops on the current
17
- * shape) in case another producer still emits them; the real fields are
18
- * added alongside.
5
+ * Plain-text renderers for the remaining leaf `akm` commands: info/config/
6
+ * feedback/remember/import/save/enable/disable, registry, env, wiki,
7
+ * events/history, search/curate, and the stash-lifecycle verbs (init,
8
+ * index, list, add, remove, update, upgrade, clone).
9
+ *
10
+ * Split out of `helpers.ts` (formerly 1418 lines / 59 fns) as its own
11
+ * sibling module: unlike `show`/`workflow`/`proposal` (each a stateful,
12
+ * multi-branch renderer with its own module), these are flat
13
+ * field-extraction formatters with no shared state beyond
14
+ * `formatRegistrySearchPlain` delegating to `formatSearchPlain` in this
15
+ * same file.
19
16
  */
17
+ import { formatRegistryUrl } from "../../core/registry-url.js";
18
+ /** Render the current `InfoResponse` shape. */
20
19
  export function formatInfoPlain(r) {
21
20
  const lines = [];
22
21
  if (r.version)
@@ -26,12 +25,6 @@ export function formatInfoPlain(r) {
26
25
  if (r.defaultBundle !== undefined) {
27
26
  lines.push(`defaultBundle: ${r.defaultBundle === null ? "(none)" : String(r.defaultBundle)}`);
28
27
  }
29
- if (r.configPath)
30
- lines.push(`configPath: ${String(r.configPath)}`);
31
- if (r.cacheDir)
32
- lines.push(`cacheDir: ${String(r.cacheDir)}`);
33
- if (r.dbPath)
34
- lines.push(`dbPath: ${String(r.dbPath)}`);
35
28
  if (Array.isArray(r.assetTypes) && r.assetTypes.length > 0) {
36
29
  lines.push(`assetTypes: ${r.assetTypes.join(", ")}`);
37
30
  }
@@ -52,7 +45,8 @@ export function formatInfoPlain(r) {
52
45
  const name = typeof reg.name === "string" ? `${reg.name}: ` : "";
53
46
  const provider = typeof reg.provider === "string" ? ` (${reg.provider})` : "";
54
47
  const disabled = reg.enabled === false ? " [disabled]" : "";
55
- lines.push(` ${name}${String(reg.url ?? "?")}${provider}${disabled}`);
48
+ const url = typeof reg.url === "string" ? formatRegistryUrl(reg.url) : "?";
49
+ lines.push(` ${name}${url}${provider}${disabled}`);
56
50
  }
57
51
  }
58
52
  const sourceProviders = Array.isArray(r.sourceProviders)
@@ -66,14 +60,7 @@ export function formatInfoPlain(r) {
66
60
  lines.push(` [${String(source.type ?? "?")}] ${String(label)}${disabled}`);
67
61
  }
68
62
  }
69
- const capabilities = r.capabilities;
70
- if (capabilities) {
71
- lines.push("capabilities:");
72
- for (const [k, v] of Object.entries(capabilities)) {
73
- lines.push(` ${k}: ${typeof v === "object" && v !== null ? JSON.stringify(v) : String(v)}`);
74
- }
75
- }
76
- const indexStats = (r.indexStats ?? r.index);
63
+ const indexStats = r.indexStats;
77
64
  if (indexStats) {
78
65
  lines.push("indexStats:");
79
66
  for (const [k, v] of Object.entries(indexStats)) {
@@ -101,7 +88,8 @@ export function formatConfigPlain(r) {
101
88
  walk(v, path);
102
89
  }
103
90
  else {
104
- lines.push(`${path}=${String(v)}`);
91
+ const rendered = typeof v === "string" && /^registries\.\d+\.url$/u.test(path) ? formatRegistryUrl(v) : String(v);
92
+ lines.push(`${path}=${rendered}`);
105
93
  }
106
94
  }
107
95
  };
@@ -148,7 +136,7 @@ export function formatRegistryListPlain(r) {
148
136
  }
149
137
  const lines = [];
150
138
  for (const reg of registries) {
151
- const url = String(reg.url ?? "?");
139
+ const url = typeof reg.url === "string" ? formatRegistryUrl(reg.url) : "?";
152
140
  const name = typeof reg.name === "string" ? reg.name : "";
153
141
  const provider = typeof reg.provider === "string" ? ` (${reg.provider})` : "";
154
142
  const enabled = reg.enabled === false ? " [disabled]" : "";
@@ -169,7 +157,7 @@ export function formatRegistryRemovePlain(r) {
169
157
  return typeof r.message === "string" ? r.message : "No matching registry found.";
170
158
  }
171
159
  const entry = r.entry;
172
- const url = entry ? String(entry.url ?? entry.name ?? "?") : "?";
160
+ const url = entry ? (typeof entry.url === "string" ? formatRegistryUrl(entry.url) : String(entry.name ?? "?")) : "?";
173
161
  return `Removed registry ${url}`;
174
162
  }
175
163
  export function formatRegistrySearchPlain(r, detail) {
@@ -437,6 +425,14 @@ export function formatIndexPlain(r) {
437
425
  for (const message of warnings)
438
426
  out += `\n - ${String(message)}`;
439
427
  }
428
+ const notices = Array.isArray(indexResult.notices) ? indexResult.notices : [];
429
+ for (const notice of notices) {
430
+ const severity = notice.severity === "info" ? "info" : "warning";
431
+ const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
432
+ out +=
433
+ `\n notice[${severity}] ${notice.code} adapter=${notice.adapter}${field}` +
434
+ (notice.message ? `: ${notice.message}` : "");
435
+ }
440
436
  const verification = indexResult.verification;
441
437
  if (verification?.ok === false && verification.message) {
442
438
  out += `\nVerification: ${String(verification.message)}`;
@@ -586,7 +582,9 @@ export function formatUpdatePlain(r) {
586
582
  }
587
583
  }
588
584
  for (const item of plainSynced ?? []) {
589
- lines.push(`update: ${item.id} synced (${item.kind})`);
585
+ lines.push(item.kind === "filesystem"
586
+ ? `update: ${item.id} reconciled (filesystem)`
587
+ : `update: ${item.id} synced (${item.kind})`);
590
588
  }
591
589
  for (const item of skipped ?? []) {
592
590
  lines.push(`update: ${item.id} skipped — ${item.reason}`);
@@ -39,30 +39,8 @@ function renderCheckSection(title, checks, detail) {
39
39
  const header = `${title} (${checks.length}${summary ? ` — ${summary}` : ""})`;
40
40
  return [header, ...renderStatusEntries(checks.map((check) => checkStatusEntry(check, detail)))];
41
41
  }
42
- function sessionAdvisoryEntry(advisory) {
43
- const isFailure = advisory.isFailurePattern === true;
44
- return {
45
- severityRank: isFailure ? 0 : 1,
46
- glyph: (isFailure ? STATUS_GLYPH.warn : STATUS_GLYPH.pass) ?? "?",
47
- headline: `${advisory.topic ?? "?"} (x${advisory.frequency ?? 0}, source: ${advisory.source ?? "?"})`,
48
- };
49
- }
50
- function renderSessionLogAdvisories(advisories) {
51
- if (advisories.length === 0)
52
- return [];
53
- return [`sessionLogAdvisories (${advisories.length})`, ...renderStatusEntries(advisories.map(sessionAdvisoryEntry))];
54
- }
55
42
  /** Fields already rendered explicitly above — everything else in `r` falls to the `flattenForText` sweep below. */
56
- const HANDLED_KEYS = new Set([
57
- "ok",
58
- "status",
59
- "since",
60
- "hardChecks",
61
- "advisories",
62
- "sessionLogAdvisories",
63
- "shape",
64
- "schemaVersion",
65
- ]);
43
+ const HANDLED_KEYS = new Set(["ok", "status", "since", "hardChecks", "advisories", "shape", "schemaVersion"]);
66
44
  export function formatHealthPlain(r, detail) {
67
45
  if (r === null || typeof r !== "object")
68
46
  return null;
@@ -75,14 +53,8 @@ export function formatHealthPlain(r, detail) {
75
53
  lines.push(`since: ${r.since}`);
76
54
  const hardChecks = Array.isArray(r.hardChecks) ? r.hardChecks : [];
77
55
  const advisories = Array.isArray(r.advisories) ? r.advisories : [];
78
- const sessionLogAdvisories = Array.isArray(r.sessionLogAdvisories)
79
- ? r.sessionLogAdvisories
80
- : [];
81
56
  lines.push("", ...renderCheckSection("hardChecks", hardChecks, detail));
82
57
  lines.push("", ...renderCheckSection("advisories", advisories, detail));
83
- const sessionLines = renderSessionLogAdvisories(sessionLogAdvisories);
84
- if (sessionLines.length > 0)
85
- lines.push("", ...sessionLines);
86
58
  if (detail === "brief" &&
87
59
  [...hardChecks, ...advisories].some((c) => c.evidence && Object.keys(c.evidence).length > 0)) {
88
60
  lines.push("", "(evidence omitted at --detail brief; re-run with --detail normal or --detail full to see it)");
@@ -1,37 +1,12 @@
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 { renderStatusEntries } from "./status-list.js";
5
- const ARTIFACT_ORDER = ["config", "state", "workflow", "index"];
6
- const ARTIFACT_LABEL = {
7
- config: "config.json",
8
- state: "state.db",
9
- workflow: "workflow.db",
10
- index: "index.db",
11
- };
12
- /** Lower rank sorts first (worse-first) via `renderStatusEntries`. */
13
- function artifactSeverity(status) {
14
- switch (status) {
15
- case "corrupt":
16
- case "inconsistent":
17
- case "newer":
18
- return { rank: 0, glyph: "✗" };
19
- case "old":
20
- return { rank: 1, glyph: "⚠" };
21
- case "missing":
22
- return { rank: 2, glyph: "?" };
23
- default: // "current"
24
- return { rank: 3, glyph: "✓" };
25
- }
26
- }
27
4
  function planGlyph(status) {
28
5
  switch (status) {
29
6
  case "current":
30
7
  return "✓";
31
8
  case "ready":
32
9
  return "⚠";
33
- case "not-applicable":
34
- return "·";
35
10
  default: // "blocked"
36
11
  return "✗";
37
12
  }
@@ -43,43 +18,18 @@ export function formatMigratePlain(result) {
43
18
  if (typeof plan.status !== "string")
44
19
  return null;
45
20
  const lines = [`${planGlyph(plan.status)} ${plan.status}`];
46
- if (plan.message)
47
- lines.push(` ${plan.message}`);
48
- if (plan.activeOperation) {
49
- lines.push(` in-flight ${plan.activeOperation.kind} at ${plan.activeOperation.sentinelPath}`);
50
- }
51
- if (plan.artifacts) {
52
- const entries = ARTIFACT_ORDER.filter((name) => plan.artifacts?.[name]).map((name) => {
53
- const artifact = plan.artifacts?.[name];
54
- const { rank, glyph } = artifactSeverity(artifact.status);
55
- const detailLines = [];
56
- if (artifact.detail)
57
- detailLines.push(artifact.detail);
58
- if (artifact.migrationIds?.length)
59
- detailLines.push(`migrations applied: ${artifact.migrationIds.length}`);
60
- return { severityRank: rank, glyph, headline: `${ARTIFACT_LABEL[name]}: ${artifact.status}`, detailLines };
61
- });
62
- lines.push("", "artifacts:", ...renderStatusEntries(entries).map((line) => ` ${line}`));
63
- }
64
- if (plan.targetConfig) {
65
- const target = plan.targetConfig;
66
- lines.push("", `target config: ${target.status} (source: ${target.source}${target.path ? `, ${target.path}` : ""})`);
67
- if (target.detail)
68
- lines.push(` ${target.detail}`);
69
- }
70
- if (plan.generatedConfig) {
71
- const generated = plan.generatedConfig;
72
- lines.push("", `generated config: ${generated.status} at ${generated.path}`);
73
- if (generated.droppedKeys.length > 0) {
74
- lines.push(` drops (add engines/defaults yourself if needed): ${generated.droppedKeys.join(", ")}`);
75
- }
21
+ if (plan.taskV3Migration) {
22
+ const tasks = plan.taskV3Migration;
23
+ lines.push(` tasks: ${tasks.changed} change, ${tasks.skipped} current, ${tasks.blocked} blocked`);
76
24
  }
77
25
  if (plan.blockers?.length) {
78
26
  lines.push("", "blockers:", ...plan.blockers.map((blocker) => ` - ${blocker}`));
79
27
  }
80
28
  if (plan.backupPath) {
81
- lines.push("", `backup: ${plan.backupPath}${plan.backupRunId ? ` (run ${plan.backupRunId})` : ""}`);
29
+ lines.push("", `backup: ${plan.backupPath}`);
82
30
  }
31
+ if (plan.applied !== undefined)
32
+ lines.push(`applied: ${plan.applied}`);
83
33
  return lines.join("\n");
84
34
  }
85
35
  export const migrateFormatters = [
@@ -10,6 +10,17 @@
10
10
  * plain-text renderer, `formatDistillPlain`, was dead code; removed per
11
11
  * R-063/B5.)
12
12
  */
13
+ function appendLoweringNotices(lines, result) {
14
+ const notices = Array.isArray(result.notices) ? result.notices : [];
15
+ for (const notice of notices) {
16
+ const severity = notice.severity === "info" ? "info" : "warning";
17
+ const code = typeof notice.code === "string" ? notice.code : "lowering-notice";
18
+ const adapter = typeof notice.adapter === "string" ? ` adapter=${notice.adapter}` : "";
19
+ const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
20
+ const message = typeof notice.message === "string" ? `: ${notice.message}` : "";
21
+ lines.push(` notice[${severity}] ${code}${adapter}${field}${message}`);
22
+ }
23
+ }
13
24
  export function formatProposalProducerPlain(command, r) {
14
25
  if (r.ok === false) {
15
26
  const reason = String(r.reason);
@@ -22,13 +33,16 @@ export function formatProposalProducerPlain(command, r) {
22
33
  if (r.exitCode !== undefined && r.exitCode !== null) {
23
34
  lines.push(` exitCode: ${String(r.exitCode)}`);
24
35
  }
36
+ appendLoweringNotices(lines, r);
25
37
  return lines.join("\n");
26
38
  }
27
39
  const proposal = r.proposal;
28
40
  const id = String(proposal.id);
29
41
  const ref = String(r.ref);
30
42
  const status = String(proposal.status);
31
- return `${command}: queued proposal ${id} (${ref}) [${status}]`;
43
+ const lines = [`${command}: queued proposal ${id} (${ref}) [${status}]`];
44
+ appendLoweringNotices(lines, r);
45
+ return lines.join("\n");
32
46
  }
33
47
  /**
34
48
  * Render a one-line gate-decision summary for the proposal list / show surfaces
@@ -189,6 +203,7 @@ export function formatProposalDrainPlain(r) {
189
203
  for (const d of deferred) {
190
204
  lines.push(` - ${String(d.id ?? "?")} (${String(d.reason ?? "?")})`);
191
205
  }
206
+ appendLoweringNotices(lines, r);
192
207
  return lines.join("\n").trimEnd();
193
208
  }
194
209
  export function formatProposalDiffPlain(r) {
@@ -118,6 +118,22 @@ export function formatWorkflowRunPlain(result) {
118
118
  // hide the announcement from the DEFAULT output mode — where it matters most.
119
119
  for (const warning of Array.isArray(result.warnings) ? result.warnings : [])
120
120
  lines.push(`! ${String(warning)}`);
121
+ // Live-only common-lowerer diagnostics are already sanitized and deduped by
122
+ // the workflow engine. Render their typed headline (not opaque details) so
123
+ // default text output has the same observability as JSON without widening a
124
+ // durable workflow schema.
125
+ for (const value of Array.isArray(result.notices) ? result.notices : []) {
126
+ if (typeof value !== "object" || value === null)
127
+ continue;
128
+ const notice = value;
129
+ if (typeof notice.code !== "string" ||
130
+ typeof notice.severity !== "string" ||
131
+ typeof notice.adapter !== "string" ||
132
+ typeof notice.message !== "string")
133
+ continue;
134
+ const field = typeof notice.field === "string" && notice.field ? `; ${notice.field}` : "";
135
+ lines.push(`! lowering[${notice.severity}] ${notice.code} (${notice.adapter}${field}): ${notice.message}`);
136
+ }
121
137
  const executed = Array.isArray(result.executed) ? result.executed : [];
122
138
  if (executed.length === 0) {
123
139
  lines.push("executed: (no steps — run was already done or blocked)");