akm-cli 0.9.16 → 0.9.17-alpha.10

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 (403) hide show
  1. package/CHANGELOG.md +2101 -0
  2. package/STABILITY.md +11 -10
  3. package/dist/akm +124 -193
  4. package/dist/akm-migrate +38 -19
  5. package/dist/assets/hints/cli-hints-full.md +6 -7
  6. package/dist/assets/improve-strategies/catchup.json +0 -3
  7. package/dist/assets/improve-strategies/consolidate.json +0 -1
  8. package/dist/assets/improve-strategies/default.json +1 -2
  9. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
  10. package/dist/assets/improve-strategies/quick.json +1 -2
  11. package/dist/assets/improve-strategies/reflect-distill.json +1 -2
  12. package/dist/assets/improve-strategies/thorough.json +0 -3
  13. package/dist/assets/prompts/consolidate-pair.md +20 -0
  14. package/dist/assets/prompts/consolidate-system.md +4 -11
  15. package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
  17. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
  18. package/dist/assets/templates/html/health.html +3 -5
  19. package/dist/cli/retired-commands.js +1 -1
  20. package/dist/cli/shared.js +6 -2
  21. package/dist/cli/unknown-flags.js +24 -1
  22. package/dist/cli.js +68 -10
  23. package/dist/commands/agent/agent-dispatch.js +1 -1
  24. package/dist/commands/command/command-execution.js +24 -62
  25. package/dist/commands/feedback-cli.js +0 -1
  26. package/dist/commands/health/accept-rate.js +6 -0
  27. package/dist/commands/health/archive-usage.js +92 -0
  28. package/dist/commands/health/checks.js +83 -74
  29. package/dist/commands/health/config-skew.js +38 -0
  30. package/dist/commands/health/data-dir-usage.js +25 -13
  31. package/dist/commands/health/egress.js +54 -0
  32. package/dist/commands/health/html-report.js +1 -42
  33. package/dist/commands/health/improve-metrics.js +136 -591
  34. package/dist/commands/health/md-report.js +1 -6
  35. package/dist/commands/health/plugin-staleness.js +53 -3
  36. package/dist/commands/health/renderers.js +12 -4
  37. package/dist/commands/health/report-view-model.js +14 -120
  38. package/dist/commands/health/types-improve.js +4 -19
  39. package/dist/commands/health/windows.js +64 -74
  40. package/dist/commands/health.js +145 -143
  41. package/dist/commands/improve/consolidate/chunking.js +26 -117
  42. package/dist/commands/improve/consolidate/continuity-check.js +137 -0
  43. package/dist/commands/improve/consolidate/pair-pass.js +791 -0
  44. package/dist/commands/improve/consolidate/sanitize.js +54 -149
  45. package/dist/commands/improve/consolidate.js +589 -1127
  46. package/dist/commands/improve/content-hash.js +16 -24
  47. package/dist/commands/improve/distill/content-repair.js +18 -100
  48. package/dist/commands/improve/distill-guards.js +20 -81
  49. package/dist/commands/improve/distill-promotion-policy.js +23 -243
  50. package/dist/commands/improve/distill.js +608 -1041
  51. package/dist/commands/improve/eligibility.js +126 -390
  52. package/dist/commands/improve/execution.js +8 -10
  53. package/dist/commands/improve/extract-prompt.js +1 -2
  54. package/dist/commands/improve/extract.js +487 -1046
  55. package/dist/commands/improve/feedback-valence.js +0 -25
  56. package/dist/commands/improve/improve-cli.js +75 -169
  57. package/dist/commands/improve/improve-result-file.js +10 -66
  58. package/dist/commands/improve/improve-strategies.js +52 -4
  59. package/dist/commands/improve/improve-usage-report.js +18 -64
  60. package/dist/commands/improve/improve.js +480 -1074
  61. package/dist/commands/improve/ledger.js +119 -0
  62. package/dist/commands/improve/locks.js +2 -8
  63. package/dist/commands/improve/loop-stages.js +415 -1073
  64. package/dist/commands/improve/memory/derived-ref.js +12 -77
  65. package/dist/commands/improve/memory/memory-belief.js +16 -118
  66. package/dist/commands/improve/memory/memory-improve.js +266 -14
  67. package/dist/commands/improve/outcome-loop.js +28 -156
  68. package/dist/commands/improve/planner.js +5 -15
  69. package/dist/commands/improve/preparation.js +779 -2319
  70. package/dist/commands/improve/proactive-maintenance.js +34 -101
  71. package/dist/commands/improve/reflect-noise.js +104 -280
  72. package/dist/commands/improve/reflect.js +642 -1353
  73. package/dist/commands/improve/retrieval-gate.js +127 -0
  74. package/dist/commands/improve/retrieval-scope.js +92 -0
  75. package/dist/commands/improve/salience.js +41 -240
  76. package/dist/commands/improve/session-asset.js +19 -100
  77. package/dist/commands/improve/stage.js +322 -0
  78. package/dist/commands/lint/base-linter.js +37 -15
  79. package/dist/commands/proposal/drain.js +261 -578
  80. package/dist/commands/proposal/proposal-cli.js +19 -20
  81. package/dist/commands/proposal/proposal-types.js +31 -24
  82. package/dist/commands/proposal/proposal.js +38 -8
  83. package/dist/commands/proposal/propose.js +134 -160
  84. package/dist/commands/proposal/repository.js +1097 -1394
  85. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  86. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  87. package/dist/commands/proposal/validators/proposals.js +22 -89
  88. package/dist/commands/read/curate.js +105 -462
  89. package/dist/commands/read/knowledge.js +3 -2
  90. package/dist/commands/read/search-cli.js +16 -33
  91. package/dist/commands/read/search.js +17 -23
  92. package/dist/commands/read/show.js +57 -108
  93. package/dist/commands/sources/bundle-cli.js +25 -2
  94. package/dist/commands/sources/bundle-config-ops.js +4 -0
  95. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  96. package/dist/commands/sources/info.js +127 -29
  97. package/dist/commands/sources/installed-stashes.js +197 -746
  98. package/dist/commands/sources/schema-repair.js +98 -129
  99. package/dist/commands/sources/source-add.js +62 -12
  100. package/dist/commands/sources/source-manage.js +9 -2
  101. package/dist/commands/sources/stash-cli.js +24 -4
  102. package/dist/commands/tasks/explain.js +10 -13
  103. package/dist/commands/tasks/tasks-cli.js +12 -13
  104. package/dist/commands/tasks/tasks.js +350 -936
  105. package/dist/commands/tasks/validate.js +26 -24
  106. package/dist/commands/workflow/plan.js +22 -29
  107. package/dist/commands/workflow-cli.js +4 -4
  108. package/dist/core/adapter/adapters/akm-adapter.js +2 -1
  109. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  110. package/dist/core/adapter/adapters/akm-metadata.js +42 -12
  111. package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
  112. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  113. package/dist/core/adapter/execution-source.js +17 -29
  114. package/dist/core/asset/asset-placement.js +4 -13
  115. package/dist/core/asset/frontmatter.js +106 -1
  116. package/dist/core/asset/resolve-ref.js +1 -1
  117. package/dist/core/bundle-id.js +42 -5
  118. package/dist/core/bundle-rename.js +285 -0
  119. package/dist/core/config/config-io.js +1 -2
  120. package/dist/core/config/config-schema.js +9 -34
  121. package/dist/core/config/config-walker.js +1 -1
  122. package/dist/core/config/config.js +184 -111
  123. package/dist/core/config/engine-semantics.js +0 -2
  124. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  125. package/dist/core/config/schema/embedding.js +20 -5
  126. package/dist/core/config/schema/engines.js +5 -0
  127. package/dist/core/config/schema/execution.js +1 -1
  128. package/dist/core/config/schema/experimental.js +1 -1
  129. package/dist/core/config/schema/improve-processes.js +54 -125
  130. package/dist/core/config/schema/improve.js +4 -42
  131. package/dist/core/config/schema/index-config.js +9 -48
  132. package/dist/core/config/schema/scheduler.js +12 -12
  133. package/dist/core/config/schema/search.js +6 -22
  134. package/dist/core/env-secret-ref.js +0 -1
  135. package/dist/core/errors.js +8 -9
  136. package/dist/core/file-change.js +13 -5
  137. package/dist/core/file-lock.js +76 -173
  138. package/dist/core/improve-result.js +35 -7
  139. package/dist/core/improve-types.js +0 -1
  140. package/dist/core/logs-db.js +2 -2
  141. package/dist/core/loopback.js +7 -12
  142. package/dist/core/non-task-input.js +20 -0
  143. package/dist/core/parse.js +13 -16
  144. package/dist/core/paths.js +0 -24
  145. package/dist/core/redaction.js +109 -2
  146. package/dist/core/run-lock.js +2 -5
  147. package/dist/core/spawn-env.js +1 -1
  148. package/dist/core/state/migrations.js +123 -61
  149. package/dist/core/state-db-scope.js +2 -4
  150. package/dist/core/state-db.js +126 -692
  151. package/dist/core/time.js +0 -20
  152. package/dist/core/type-presentation.js +1 -9
  153. package/dist/core/write-source.js +294 -1005
  154. package/dist/execution/input-contract.js +1 -1
  155. package/dist/execution/resolved-request.js +135 -689
  156. package/dist/execution/source.js +63 -257
  157. package/dist/execution/target-ref.js +1 -1
  158. package/dist/indexer/bundle-identity-guard.js +2 -2
  159. package/dist/indexer/db/llm-cache.js +2 -2
  160. package/dist/indexer/ensure-index.js +77 -73
  161. package/dist/indexer/index-rebuild-lock.js +3 -11
  162. package/dist/indexer/index-writer-lock.js +8 -17
  163. package/dist/indexer/index-written-assets.js +141 -154
  164. package/dist/indexer/indexer.js +400 -1124
  165. package/dist/indexer/links/declared-links.js +90 -0
  166. package/dist/indexer/materialize-embeddings.js +60 -397
  167. package/dist/indexer/passes/memory-inference.js +96 -90
  168. package/dist/indexer/passes/metadata.js +132 -219
  169. package/dist/indexer/read-preflight.js +0 -7
  170. package/dist/indexer/scan/doc-to-entry.js +2 -3
  171. package/dist/indexer/scan/drain-dir.js +1 -1
  172. package/dist/indexer/search/db-search.js +190 -590
  173. package/dist/indexer/search/fts-query.js +30 -41
  174. package/dist/indexer/search/ranking.js +28 -154
  175. package/dist/indexer/search/search-attribution.js +12 -32
  176. package/dist/indexer/search/search-fields.js +11 -15
  177. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  178. package/dist/indexer/search/search-source.js +1 -4
  179. package/dist/indexer/usage/usage-events.js +36 -7
  180. package/dist/indexer/walk/walker.js +3 -4
  181. package/dist/integrations/agent/engine-fallback.js +23 -40
  182. package/dist/integrations/agent/engine-resolution.js +93 -183
  183. package/dist/integrations/agent/execution.js +507 -0
  184. package/dist/integrations/agent/model-map.js +28 -156
  185. package/dist/integrations/agent/request-lowering.js +66 -141
  186. package/dist/integrations/agent/runner-dispatch.js +143 -321
  187. package/dist/integrations/agent/runner.js +54 -14
  188. package/dist/integrations/lockfile.js +53 -101
  189. package/dist/llm/client.js +18 -6
  190. package/dist/llm/embedders/deterministic.js +2 -3
  191. package/dist/llm/embedders/profile.js +71 -0
  192. package/dist/llm/embedders/remote.js +11 -17
  193. package/dist/llm/feature-gate.js +0 -8
  194. package/dist/llm/index-passes.js +3 -5
  195. package/dist/llm/memory-infer.js +1 -2
  196. package/dist/llm/structured-call.js +5 -24
  197. package/dist/output/generic-render.js +23 -11
  198. package/dist/output/html-render.js +13 -10
  199. package/dist/output/render-registry.js +3 -32
  200. package/dist/output/shapes/helpers.js +25 -38
  201. package/dist/output/shapes/passthrough.js +1 -9
  202. package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
  203. package/dist/output/text/command-format.js +69 -31
  204. package/dist/output/text/helpers.js +1 -1
  205. package/dist/output/text/migrate.js +5 -14
  206. package/dist/output/text/proposal-format.js +48 -3
  207. package/dist/output/text/show-format.js +13 -17
  208. package/dist/output/text/workflow-format.js +0 -32
  209. package/dist/output/text.js +2 -0
  210. package/dist/registry/factory.js +4 -19
  211. package/dist/registry/network.js +66 -220
  212. package/dist/registry/providers/index.js +0 -2
  213. package/dist/registry/providers/skills-sh.js +3 -14
  214. package/dist/registry/providers/static-index.js +24 -26
  215. package/dist/registry/resolve.js +55 -131
  216. package/dist/scripts/akm-migrate-node.js +42948 -92369
  217. package/dist/scripts/akm-migrate.js +42935 -92354
  218. package/dist/setup/registry-stash-loader.js +4 -13
  219. package/dist/setup/semantic-assets.js +3 -44
  220. package/dist/setup/setup.js +1 -1
  221. package/dist/setup/steps/connection.js +5 -6
  222. package/dist/setup/steps/platforms.js +2 -2
  223. package/dist/setup/steps/tasks.js +25 -15
  224. package/dist/sources/provider-factory.js +17 -18
  225. package/dist/sources/providers/filesystem.js +2 -3
  226. package/dist/sources/providers/git-install.js +7 -1
  227. package/dist/sources/providers/git-provider.js +0 -3
  228. package/dist/sources/providers/git-stash.js +83 -21
  229. package/dist/sources/providers/npm.js +2 -4
  230. package/dist/sources/providers/provider-utils.js +5 -10
  231. package/dist/sources/providers/website.js +0 -2
  232. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  233. package/dist/sources/website-url.js +2 -2
  234. package/dist/storage/database.js +9 -35
  235. package/dist/storage/repositories/improve-ledger-repository.js +209 -0
  236. package/dist/storage/repositories/index-connection.js +39 -72
  237. package/dist/storage/repositories/index-entries-repository.js +131 -129
  238. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  239. package/dist/storage/repositories/index-entry-schema.js +101 -268
  240. package/dist/storage/repositories/index-fts-repository.js +86 -256
  241. package/dist/storage/repositories/index-links-repository.js +143 -0
  242. package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
  243. package/dist/storage/repositories/index-meta-repository.js +6 -4
  244. package/dist/storage/repositories/index-schema.js +257 -325
  245. package/dist/storage/repositories/index-utility-repository.js +8 -29
  246. package/dist/storage/repositories/index-vec-repository.js +133 -414
  247. package/dist/storage/repositories/outcome-repository.js +2 -1
  248. package/dist/storage/repositories/proposals-repository.js +104 -1
  249. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  250. package/dist/storage/repositories/salience-repository.js +1 -19
  251. package/dist/storage/repositories/task-history-repository.js +26 -4
  252. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  253. package/dist/storage/sqlite-migrations.js +136 -0
  254. package/dist/storage/sqlite-pragmas.js +11 -9
  255. package/dist/storage/sqlite-transaction.js +170 -0
  256. package/dist/storage/state-db-integrity.js +130 -0
  257. package/dist/tasks/activation-config.js +134 -62
  258. package/dist/tasks/backends/cron.js +191 -302
  259. package/dist/tasks/backends/exec-utils.js +2 -5
  260. package/dist/tasks/backends/launchd.js +141 -748
  261. package/dist/tasks/backends/schtasks.js +119 -623
  262. package/dist/tasks/prepare/prepare-support.js +5 -15
  263. package/dist/tasks/prepare/prepare.js +0 -2
  264. package/dist/tasks/resolve-akm-bin.js +20 -79
  265. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  266. package/dist/tasks/run/load-task.js +1 -1
  267. package/dist/tasks/scheduler-binding.js +20 -238
  268. package/dist/tasks/scheduler-invocation.js +136 -244
  269. package/dist/tasks/scheduler-lock.js +53 -0
  270. package/dist/tasks/scheduler-sync.js +368 -679
  271. package/dist/tasks/source/parse-task-source.js +55 -9
  272. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  273. package/dist/tasks/source/task-to-v4.js +464 -88
  274. package/dist/workflows/authoring/authoring.js +3 -12
  275. package/dist/workflows/compile.js +211 -0
  276. package/dist/workflows/concurrency-policy.js +13 -74
  277. package/dist/workflows/exec/child-invocation.js +3 -17
  278. package/dist/workflows/exec/child-workflow.js +32 -141
  279. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  280. package/dist/workflows/exec/environment.js +98 -0
  281. package/dist/workflows/exec/exec-unit.js +33 -140
  282. package/dist/workflows/exec/frozen-judge.js +7 -59
  283. package/dist/workflows/exec/native-executor.js +82 -341
  284. package/dist/workflows/exec/param-secrets.js +29 -47
  285. package/dist/workflows/exec/run-workflow.js +154 -387
  286. package/dist/workflows/exec/scheduler.js +9 -36
  287. package/dist/workflows/exec/step-work.js +127 -430
  288. package/dist/workflows/exec/unit-dispatch.js +11 -63
  289. package/dist/workflows/exec/unit-writer.js +8 -52
  290. package/dist/workflows/exec/worktree.js +39 -273
  291. package/dist/workflows/freeze/child-output-references.js +4 -15
  292. package/dist/workflows/freeze/environment.js +99 -92
  293. package/dist/workflows/freeze/freeze.js +172 -0
  294. package/dist/workflows/freeze/step-values.js +19 -21
  295. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  296. package/dist/workflows/freeze/targets/command.js +10 -33
  297. package/dist/workflows/freeze/targets/script.js +5 -12
  298. package/dist/workflows/freeze/targets/shell.js +3 -6
  299. package/dist/workflows/freeze/targets/task.js +25 -80
  300. package/dist/workflows/freeze/task-bindings.js +20 -67
  301. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  302. package/dist/workflows/ir/params.js +6 -51
  303. package/dist/workflows/ir/plan-hash.js +2 -34
  304. package/dist/workflows/parser.js +140 -43
  305. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  306. package/dist/workflows/renderer.js +36 -69
  307. package/dist/workflows/resource-limits.js +12 -120
  308. package/dist/workflows/runtime/agent-identity.js +8 -40
  309. package/dist/workflows/runtime/run-outputs.js +3 -6
  310. package/dist/workflows/runtime/run-plan.js +316 -0
  311. package/dist/workflows/runtime/runs.js +48 -200
  312. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  313. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  314. package/dist/workflows/validate-summary.js +2 -7
  315. package/docs/integration/bundling-akm.md +49 -42
  316. package/docs/migration/README.md +1 -0
  317. package/docs/migration/release-notes/0.9.17.md +43 -0
  318. package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
  319. package/docs/reference/cli.md +232 -135
  320. package/docs/reference/configuration.md +71 -57
  321. package/docs/reference/data-and-telemetry.md +20 -21
  322. package/docs/reference/tasks.md +105 -39
  323. package/docs/reference/workflow-schema.md +14 -18
  324. package/docs/reference/workflows.md +6 -9
  325. package/package.json +1 -1
  326. package/schemas/akm-config.json +115 -738
  327. package/schemas/akm-workflow.json +1 -0
  328. package/dist/assets/improve-strategies/graph-refresh.json +0 -15
  329. package/dist/assets/prompts/contradiction-judge.md +0 -33
  330. package/dist/assets/prompts/graph-extract-system.md +0 -1
  331. package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
  332. package/dist/assets/prompts/metadata-enhance-system.md +0 -1
  333. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
  334. package/dist/commands/health/advisories.js +0 -150
  335. package/dist/commands/health/metrics.js +0 -329
  336. package/dist/commands/health/surfaces.js +0 -102
  337. package/dist/commands/improve/anti-collapse.js +0 -83
  338. package/dist/commands/improve/collapse-detector.js +0 -432
  339. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  340. package/dist/commands/improve/consolidate/merge.js +0 -149
  341. package/dist/commands/improve/distill/promote-memory.js +0 -291
  342. package/dist/commands/improve/distill/quality-gate.js +0 -337
  343. package/dist/commands/improve/eval-cases.js +0 -52
  344. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  345. package/dist/commands/improve/proposal-envelope.js +0 -31
  346. package/dist/commands/improve/run-context.js +0 -123
  347. package/dist/commands/improve/shared.js +0 -31
  348. package/dist/commands/improve/source-identity.js +0 -28
  349. package/dist/commands/improve/triage.js +0 -96
  350. package/dist/commands/proposal/drain-policies.js +0 -151
  351. package/dist/commands/sources/update-transaction.js +0 -220
  352. package/dist/core/action-contributors.js +0 -28
  353. package/dist/core/config/config-version-shim.js +0 -101
  354. package/dist/core/fs-txn.js +0 -405
  355. package/dist/core/lexical-score.js +0 -25
  356. package/dist/core/maintenance-barrier.js +0 -167
  357. package/dist/execution/executable-identity.js +0 -105
  358. package/dist/execution/guarded-source.js +0 -427
  359. package/dist/indexer/db/graph-db.js +0 -444
  360. package/dist/indexer/graph/graph-boost.js +0 -427
  361. package/dist/indexer/graph/graph-dedup.js +0 -95
  362. package/dist/indexer/graph/graph-extraction.js +0 -1108
  363. package/dist/indexer/search/name-match.js +0 -35
  364. package/dist/indexer/search/ranking-contributors.js +0 -515
  365. package/dist/indexer/search/ranking-types.js +0 -4
  366. package/dist/indexer/walk/project-context.js +0 -192
  367. package/dist/integrations/agent/execution-cascade.js +0 -566
  368. package/dist/integrations/agent/execution-definitions.js +0 -202
  369. package/dist/integrations/agent/execution-lowering.js +0 -841
  370. package/dist/integrations/agent/execution-preparation.js +0 -98
  371. package/dist/integrations/agent/inline-execution.js +0 -74
  372. package/dist/llm/graph-extract.js +0 -728
  373. package/dist/llm/metadata-enhance.js +0 -96
  374. package/dist/registry/create-provider-registry.js +0 -29
  375. package/dist/registry/pinned-request-helper.js +0 -247
  376. package/dist/registry/pinned-transport.js +0 -717
  377. package/dist/sources/providers/index.js +0 -14
  378. package/dist/storage/engines/sqlite-migrations.js +0 -271
  379. package/dist/storage/repositories/canaries-repository.js +0 -107
  380. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  381. package/dist/storage/repositories/registry-cache.js +0 -113
  382. package/dist/tasks/scheduler-sync-preview.js +0 -52
  383. package/dist/tasks/source/task-to-v3.js +0 -507
  384. package/dist/workflows/freeze/resolve-steps.js +0 -86
  385. package/dist/workflows/freeze/source-freeze.js +0 -64
  386. package/dist/workflows/ir/compile.js +0 -321
  387. package/dist/workflows/ir/environment-v4.js +0 -330
  388. package/dist/workflows/ir/freeze-v4.js +0 -153
  389. package/dist/workflows/ir/schema-v4.js +0 -745
  390. package/dist/workflows/ir/schema.js +0 -354
  391. package/dist/workflows/program/schema.js +0 -77
  392. package/dist/workflows/runtime/checkin.js +0 -57
  393. package/dist/workflows/runtime/plan-classifier.js +0 -196
  394. package/dist/workflows/runtime/unit-checkin.js +0 -45
  395. package/dist/workflows/runtime/unit-phases.js +0 -20
  396. package/dist/workflows/schema.js +0 -4
  397. package/dist/workflows/source-ir/compile.js +0 -200
  398. package/dist/workflows/source-ir/program.js +0 -50
  399. package/dist/workflows/source-ir/result.js +0 -26
  400. package/dist/workflows/source-ir/schema.js +0 -786
  401. package/dist/workflows/source-ir/triggers.js +0 -79
  402. package/dist/workflows/source-ir/uses.js +0 -40
  403. package/dist/workflows/validator.js +0 -60
@@ -5,12 +5,14 @@
5
5
  * `--format html` rendering primitives (#582).
6
6
  *
7
7
  * Templates live in `src/assets/templates/html/` (mirrored to
8
- * `dist/assets/templates/html/` by `scripts/copy-assets.ts`). `--format html`
9
- * is health-only (chunk-9 WI-9.4c / Decision 4): `akm health` ships the sole
10
- * bespoke `<command>.html` template; every other command rejects `--format
11
- * html` with a `UsageError` before reaching this module (see
12
- * `src/cli/shared.ts`'s `output()`). Substitution is plain `%%TOKEN%%` string
13
- * replacement — no template engine, by design.
8
+ * `dist/assets/templates/html/` by `scripts/copy-assets.ts`). `akm health` is
9
+ * the only command with a bespoke `<command>.html` template (substituted here
10
+ * via plain `%%TOKEN%%` string replacement — no template engine, by design);
11
+ * `src/cli/shared.ts`'s `output()` calls it directly for `command === "health"`
12
+ * and every other command falls back to `renderGenericHtml` (`./generic-render`).
13
+ * `--format html` therefore works for every command (D7) — this module's
14
+ * template path is just health's opt-in bespoke rendering, not a format-wide
15
+ * gate.
14
16
  */
15
17
  import fs from "node:fs";
16
18
  import path from "node:path";
@@ -81,10 +83,11 @@ function readTemplate(templatePath) {
81
83
  }
82
84
  }
83
85
  /**
84
- * Minimal HTML entity escaping for text interpolated into templates. Escapes
85
- * the single quote as well as the double quote so escaped values are safe in
86
- * both `"…"` and `'…'` attribute contexts, not only the double-quoted
87
- * attributes the bundled templates use today.
86
+ * Minimal HTML entity escaping for text interpolated into a document — a
87
+ * template substitution here, or a value placed into `generic-render.ts`'s
88
+ * envelope rendering. Escapes the single quote as well as the double quote so
89
+ * escaped values are safe in both `"…"` and `'…'` attribute contexts, not only
90
+ * the double-quoted attributes the bundled templates use today.
88
91
  */
89
92
  export function escapeHtml(value) {
90
93
  return value
@@ -1,41 +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
- /**
5
- * Per-command `md` / `html` renderer registries (D7).
6
- *
7
- * Mirrors `src/output/text/registry.ts`: a command may register a bespoke
8
- * renderer for a document format, and anything unregistered falls back to the
9
- * generic rendering of its shaped envelope (`./generic-render`). The fallback
10
- * is what makes all six `--format` values universal; the registry is what lets
11
- * a command that has something better to say — `akm health` and its report
12
- * templates — say it without the output pipeline knowing that command exists.
13
- *
14
- * Kept separate from the module that dispatches through it so per-command
15
- * renderer modules can import `registerMdRenderer` / `registerHtmlRenderer`
16
- * without a cycle back into the pipeline, exactly as the text registry does.
17
- *
18
- * Returning `null` from a handler means "I have nothing special for this
19
- * payload" and falls through to the generic renderer — `akm health` uses that
20
- * to keep its bespoke tables for the shapes that have them while still
21
- * rendering everything else.
22
- */
23
- import { createCommandRegistry } from "./command-registry.js";
24
- const MD_RENDERER_REGISTRY = createCommandRegistry();
25
- const HTML_RENDERER_REGISTRY = createCommandRegistry();
4
+ const mdRenderers = new Map();
26
5
  /** Register a Markdown renderer for a command name. */
27
6
  export function registerMdRenderer(command, handler) {
28
- MD_RENDERER_REGISTRY.register(command, handler);
7
+ mdRenderers.set(command, handler);
29
8
  }
30
9
  /** Look up a registered Markdown renderer, or `undefined` when unregistered. */
31
10
  export function getMdRendererHandler(command) {
32
- return MD_RENDERER_REGISTRY.get(command);
33
- }
34
- /** Register an HTML renderer for a command name. */
35
- export function registerHtmlRenderer(command, handler) {
36
- HTML_RENDERER_REGISTRY.register(command, handler);
37
- }
38
- /** Look up a registered HTML renderer, or `undefined` when unregistered. */
39
- export function getHtmlRendererHandler(command) {
40
- return HTML_RENDERER_REGISTRY.get(command);
11
+ return mdRenderers.get(command);
41
12
  }
@@ -56,11 +56,25 @@ export function shapeProposalProducerOutput(result, detail) {
56
56
  }
57
57
  export function shapeProposalEntry(entry, detail) {
58
58
  if (detail === "brief") {
59
- return pickFields(entry, ["id", "ref", "status", "source", "createdAt"]);
59
+ // `proposal list`'s default detail level IS "brief" (no `--detail` flag
60
+ // given projects here, not "normal") — `retirement` itself is not
61
+ // projected until "normal", so a flagged retire proposal's risk would
62
+ // otherwise be invisible by default. A minimal boolean marker, not the
63
+ // full risk object, keeps brief's shape small while still letting a
64
+ // reviewer see it without an extra flag.
65
+ const retirement = entry.retirement;
66
+ return {
67
+ ...pickFields(entry, ["id", "ref", "status", "source", "createdAt"]),
68
+ ...(retirement?.continuityRisk ? { continuityRisk: true } : {}),
69
+ };
60
70
  }
61
71
  if (detail === "normal") {
62
72
  // `confidence` and `gateDecision` (#577) explain why a proposal is pending,
63
73
  // so they are projected at `normal` for `akm proposal list/show` when present.
74
+ // `retirement` (alpha.9) is the same kind of field for a consolidate
75
+ // `retire` proposal: without it, "list/show" carries no reason a reviewer
76
+ // could act on (its `payload.content` is empty by design — a retire
77
+ // proposal deletes, it does not write).
64
78
  return pickFields(entry, [
65
79
  "id",
66
80
  "ref",
@@ -72,6 +86,7 @@ export function shapeProposalEntry(entry, detail) {
72
86
  "confidence",
73
87
  "gateDecision",
74
88
  "review",
89
+ "retirement",
75
90
  ]);
76
91
  }
77
92
  // full: project everything including the payload.
@@ -87,6 +102,10 @@ export function shapeProposalEntry(entry, detail) {
87
102
  "gateDecision",
88
103
  "payload",
89
104
  "review",
105
+ "retirement",
106
+ "retiredArchive",
107
+ "promotionSource",
108
+ "promotionSourceHash",
90
109
  ]);
91
110
  }
92
111
  export function shapeProposalListOutput(result, detail) {
@@ -284,40 +303,14 @@ export function shapeSearchHit(hit, detail) {
284
303
  // `ref` is included at `brief` so agents can run `akm show <ref>` without
285
304
  // needing --detail full or --shape agent (REC-03).
286
305
  if (detail === "brief") {
287
- return pickFields(hit, [
288
- "type",
289
- "name",
290
- "ref",
291
- "action",
292
- "estimatedTokens",
293
- "keys",
294
- "selectedRef",
295
- "parentRef",
296
- "fragmentOrdinal",
297
- "fragmentCount",
298
- "parentEstimatedTokens",
299
- ]);
306
+ return pickFields(hit, ["type", "name", "ref", "action", "estimatedTokens", "keys"]);
300
307
  }
301
308
  if (detail === "normal") {
302
309
  // `warnings` is projected at `normal` so non-fatal hit-level issues are
303
310
  // visible without forcing callers up to `--detail full`. Optional
304
311
  // `quality` (v1 spec §4.2) is also surfaced when present so callers
305
312
  // can see why a `proposed` entry showed up under `--include-proposed`.
306
- // `matchStage` (issue #856) surfaces which stage of the progressive
307
- // AND->OR lexical ladder produced the hit; cheap compact enum, worth
308
- // showing without requiring `--detail full`.
309
- const shaped = capDescription(pickFields(hit, [
310
- "type",
311
- "name",
312
- "description",
313
- "action",
314
- "score",
315
- "estimatedTokens",
316
- "warnings",
317
- "quality",
318
- "matchStage",
319
- ...FRAGMENT_PROVENANCE_FIELDS,
320
- ]), NORMAL_DESCRIPTION_LIMIT);
313
+ const shaped = capDescription(pickFields(hit, ["type", "name", "description", "action", "score", "estimatedTokens", "warnings", "quality"]), NORMAL_DESCRIPTION_LIMIT);
321
314
  if (Array.isArray(hit.keys) && hit.keys.length > 0)
322
315
  shaped.keys = hit.keys;
323
316
  return shaped;
@@ -338,12 +331,6 @@ export function shapeSearchHitForAgent(hit) {
338
331
  "score",
339
332
  "estimatedTokens",
340
333
  "keys",
341
- // Issue #856: which stage of the progressive AND->OR lexical ladder
342
- // produced this hit. Agents need this to gauge how much to trust a
343
- // hit (a strict-AND match is stronger signal than an OR-fallback
344
- // recovery match) without going to `--detail full`.
345
- "matchStage",
346
- ...FRAGMENT_PROVENANCE_FIELDS,
347
334
  ]);
348
335
  if (picked.editable !== false)
349
336
  delete picked.editHint;
@@ -389,7 +376,7 @@ export function shapeShowOutput(result, detail, shape = "human") {
389
376
  "workflowParameters",
390
377
  "steps",
391
378
  "keys",
392
- "related",
379
+ "links",
393
380
  ...FRAGMENT_PROVENANCE_FIELDS,
394
381
  ...FRAGMENT_CONTEXT_FIELDS,
395
382
  ]);
@@ -413,7 +400,7 @@ export function shapeShowOutput(result, detail, shape = "human") {
413
400
  "run",
414
401
  "origin",
415
402
  "keys",
416
- "related",
403
+ "links",
417
404
  ...FRAGMENT_PROVENANCE_FIELDS,
418
405
  ...FRAGMENT_CONTEXT_FIELDS,
419
406
  ]);
@@ -442,7 +429,7 @@ export function shapeShowOutput(result, detail, shape = "human") {
442
429
  "cwd",
443
430
  "activeRun",
444
431
  "keys",
445
- "related",
432
+ "links",
446
433
  ...FRAGMENT_PROVENANCE_FIELDS,
447
434
  ...FRAGMENT_CONTEXT_FIELDS,
448
435
  // ref, path, and editable are always projected — at every --detail level,
@@ -8,15 +8,6 @@
8
8
  // envelope. Never overwrites an existing `shape`, `schemaVersion`, or `ok`;
9
9
  // a command whose exit code grades the outcome emits through
10
10
  // `outputWithExitCode` (src/cli/shared.ts), which sets `ok` from that code.
11
- //
12
- // Builds a shallow copy rather than mutating `result` in place: several
13
- // command results (e.g. `akm task sync --dry-run`'s `SchedulerPlanPreview`,
14
- // see src/tasks/scheduler-sync-preview.ts) are deliberately `Object.freeze`d
15
- // by their producer as an immutability guarantee, and an in-place `obj.shape
16
- // = …` assignment throws ("Attempting to define property on object that is
17
- // not extensible") the moment it hits one. Copying tolerates both frozen and
18
- // mutable inputs uniformly, and `output()` never uses the result's identity
19
- // past this call, so a copy is safe here.
20
11
  function makeStampHandler(command) {
21
12
  return (result) => {
22
13
  if (result === null || result === undefined)
@@ -39,6 +30,7 @@ const PASSTHROUGH_COMMANDS = [
39
30
  "add",
40
31
  "agent-result",
41
32
  "bundle-create",
33
+ "bundle-rename",
42
34
  "bundle-show",
43
35
  "clone",
44
36
  "command-dry-run",
@@ -1,4 +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
- export {};
4
+ import { formatBundleRenamePlain } from "./helpers.js";
5
+ export const bundleRenameFormatters = [
6
+ { command: "bundle-rename", handler: (r) => formatBundleRenamePlain(r) },
7
+ ];
@@ -20,11 +20,20 @@ export function formatInfoPlain(r) {
20
20
  const lines = [];
21
21
  if (r.version)
22
22
  lines.push(`version: ${String(r.version)}`);
23
+ // Only present in infoCommand's own last-resort fallback (stash-cli.ts),
24
+ // when assembleInfo() itself threw — every field below it belongs to the
25
+ // normal shape and is absent there.
26
+ if (typeof r.error === "string")
27
+ lines.push(`error: ${r.error}`);
23
28
  if (r.bundleDir)
24
29
  lines.push(`bundleDir: ${String(r.bundleDir)}`);
25
30
  if (r.defaultBundle !== undefined) {
26
31
  lines.push(`defaultBundle: ${r.defaultBundle === null ? "(none)" : String(r.defaultBundle)}`);
27
32
  }
33
+ if (typeof r.configError === "string")
34
+ lines.push(`configError: ${r.configError}`);
35
+ if (typeof r.bundleDirError === "string")
36
+ lines.push(`bundleDirError: ${r.bundleDirError}`);
28
37
  if (Array.isArray(r.assetTypes) && r.assetTypes.length > 0) {
29
38
  lines.push(`assetTypes: ${r.assetTypes.join(", ")}`);
30
39
  }
@@ -270,32 +279,10 @@ export function formatSearchPlain(r, detail) {
270
279
  // Optional v1 spec §4.2 quality marker (e.g. "curated" / "proposed").
271
280
  if (typeof hit.quality === "string" && hit.quality)
272
281
  lines.push(` quality: ${hit.quality}`);
273
- // Issue #856: which stage of the progressive AND->OR lexical ladder
274
- // produced this hit ("exact" | "prefix" | "relaxed").
275
- if (typeof hit.matchStage === "string" && hit.matchStage)
276
- lines.push(` matchStage: ${hit.matchStage}`);
277
282
  // Surface optional hit-level warnings (v1 spec §4.2).
278
283
  if (Array.isArray(hit.warnings) && hit.warnings.length > 0) {
279
284
  lines.push(` warnings: ${hit.warnings.join("; ")}`);
280
285
  }
281
- const graph = typeof hit.graph === "object" && hit.graph !== null ? hit.graph : undefined;
282
- if (graph) {
283
- const entities = Array.isArray(graph.entities) ? graph.entities : [];
284
- if (entities.length > 0) {
285
- const matched = entities
286
- .filter((entity) => String(entity.kind ?? "") === "matched")
287
- .map((entity) => String(entity.name ?? "?"));
288
- const neighbors = entities
289
- .filter((entity) => String(entity.kind ?? "") !== "matched")
290
- .map((entity) => String(entity.name ?? "?"));
291
- lines.push(` graph: ${[
292
- matched.length > 0 ? `query match=${matched.join(", ")}` : undefined,
293
- neighbors.length > 0 ? `neighbors=${neighbors.join(", ")}` : undefined,
294
- ]
295
- .filter(Boolean)
296
- .join("; ")}`);
297
- }
298
- }
299
286
  if (detail === "full") {
300
287
  if (hit.path)
301
288
  lines.push(` path: ${String(hit.path)}`);
@@ -429,14 +416,6 @@ export function formatIndexPlain(r) {
429
416
  for (const message of warnings)
430
417
  out += `\n - ${String(message)}`;
431
418
  }
432
- const notices = Array.isArray(indexResult.notices) ? indexResult.notices : [];
433
- for (const notice of notices) {
434
- const severity = notice.severity === "info" ? "info" : "warning";
435
- const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
436
- out +=
437
- `\n notice[${severity}] ${notice.code} adapter=${notice.adapter}${field}` +
438
- (notice.message ? `: ${notice.message}` : "");
439
- }
440
419
  const verification = indexResult.verification;
441
420
  if (verification?.ok === false && verification.message) {
442
421
  out += `\nVerification: ${String(verification.message)}`;
@@ -556,7 +535,8 @@ export function formatAddPlain(r) {
556
535
  const index = r.index;
557
536
  const scanned = index?.directoriesScanned ?? 0;
558
537
  const total = index?.totalEntries ?? 0;
559
- const lines = [`Installed ${r.ref} (${scanned} directories scanned, ${total} total assets indexed)`];
538
+ const bundleSuffix = typeof r.bundleId === "string" && r.bundleId.length > 0 ? ` as bundle "${r.bundleId}"` : "";
539
+ const lines = [`Installed ${r.ref}${bundleSuffix} (${scanned} directories scanned, ${total} total assets indexed)`];
560
540
  const warnings = index?.warnings;
561
541
  if (Array.isArray(warnings) && warnings.length > 0) {
562
542
  lines.push(`Warnings (${warnings.length}):`);
@@ -589,6 +569,64 @@ export function formatRemovePlain(r) {
589
569
  const ok = r.ok !== false ? "OK" : "FAILED";
590
570
  return `remove: ${target} ${ok}`;
591
571
  }
572
+ export function formatBundleRenamePlain(r) {
573
+ const oldId = String(r.oldId ?? "?");
574
+ const newId = String(r.newId ?? "?");
575
+ const applied = r.applied === true;
576
+ const config = r.config ?? {};
577
+ const state = r.state ?? {};
578
+ const index = r.index ?? {};
579
+ const schedulerRefs = Array.isArray(config.schedulerRefs) ? config.schedulerRefs.length : 0;
580
+ const proposalRefs = Number(state.proposalRefs ?? 0);
581
+ const proposalTargets = Number(state.proposalTargets ?? 0);
582
+ const taskHistoryRefs = Number(state.taskHistoryRefs ?? 0);
583
+ const entries = Number(index.entries ?? 0);
584
+ const contentRefs = Array.isArray(r.contentRefs) ? r.contentRefs : [];
585
+ const nativeSchedulerRows = Array.isArray(r.nativeSchedulerRows) ? r.nativeSchedulerRows : [];
586
+ const verb = applied ? "Renamed" : "Would rename";
587
+ const lines = [
588
+ `${verb} bundle "${oldId}" to "${newId}" (${entries} index entries, ${schedulerRefs} scheduler ref(s), ` +
589
+ `${proposalRefs + proposalTargets} proposal reference(s), ${taskHistoryRefs} task-history row(s)).`,
590
+ ];
591
+ if (!applied) {
592
+ lines.push("Re-run without --dry-run to apply. It also re-syncs native scheduler bindings under the new name.");
593
+ if (nativeSchedulerRows.length > 0) {
594
+ lines.push(`Native scheduler rows naming "${oldId}//" that the sync would replace:`);
595
+ for (const row of nativeSchedulerRows)
596
+ lines.push(` - ${String(row)}`);
597
+ }
598
+ }
599
+ else {
600
+ const taskSync = r.taskSync;
601
+ const syncResult = taskSync?.result;
602
+ if (syncResult) {
603
+ const installed = Array.isArray(syncResult.installed) ? syncResult.installed.length : 0;
604
+ const updated = Array.isArray(syncResult.updated) ? syncResult.updated.length : 0;
605
+ const removed = Array.isArray(syncResult.removed) ? syncResult.removed.length : 0;
606
+ const failures = Array.isArray(syncResult.failures)
607
+ ? syncResult.failures
608
+ : [];
609
+ if (failures.length === 0) {
610
+ lines.push(`Native scheduler bindings re-synced under the new name (${installed} installed, ${updated} updated, ${removed} removed).`);
611
+ }
612
+ else {
613
+ lines.push(`Native scheduler sync after rename: ${installed} installed, ${updated} updated, ${removed} removed, ${failures.length} failed.`);
614
+ for (const failure of failures)
615
+ lines.push(` - ${failure.ref ?? failure.path}: ${failure.reason}`);
616
+ lines.push("Run `akm task sync` to retry.");
617
+ }
618
+ }
619
+ else if (taskSync?.ok === false && taskSync.error) {
620
+ lines.push(`Re-syncing native scheduler bindings failed: ${taskSync.error}. Run \`akm task sync\` to retry.`);
621
+ }
622
+ }
623
+ if (contentRefs.length > 0) {
624
+ lines.push(`Content still spelling "${oldId}//" (not rewritten — edit these by hand):`);
625
+ for (const file of contentRefs)
626
+ lines.push(` - ${String(file)}`);
627
+ }
628
+ return lines.join("\n");
629
+ }
592
630
  export function formatUpdatePlain(r) {
593
631
  // R-015: `processed` alone conflated three cases into one empty array —
594
632
  // a true no-op (--all with nothing configured), a source this call flatly
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * No registry imports — no circular dependencies.
17
17
  */
18
- export { formatAddPlain, formatBundleShowPlain, formatClonePlain, formatConfigPlain, formatCuratePlain, formatEnvCreatePlain, formatEnvExportPlain, formatEnvListPlain, formatEnvRemovePlain, formatEventLine, formatEventsPlain, formatFeedbackPlain, formatImportPlain, formatIndexPlain, formatInfoPlain, formatInitPlain, formatListPlain, formatModelsListPlain, formatRegistryAddPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, formatRememberPlain, formatRemovePlain, formatSearchPlain, formatSyncPlain, formatUpdatePlain, formatUpgradePlain, } from "./command-format.js";
18
+ export { formatAddPlain, formatBundleRenamePlain, formatBundleShowPlain, formatClonePlain, formatConfigPlain, formatCuratePlain, formatEnvCreatePlain, formatEnvExportPlain, formatEnvListPlain, formatEnvRemovePlain, formatEventLine, formatEventsPlain, formatFeedbackPlain, formatImportPlain, formatIndexPlain, formatInfoPlain, formatInitPlain, formatListPlain, formatModelsListPlain, formatRegistryAddPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, formatRememberPlain, formatRemovePlain, formatSearchPlain, formatSyncPlain, formatUpdatePlain, formatUpgradePlain, } from "./command-format.js";
19
19
  export { formatHealthPlain } from "./health-format.js";
20
20
  export { formatLintPlain } from "./lint-format.js";
21
21
  export { formatGateDecisionSummary, formatProposalAcceptPlain, formatProposalDiffPlain, formatProposalDrainPlain, formatProposalListPlain, formatProposalProducerPlain, formatProposalRejectPlain, formatProposalShowPlain, } from "./proposal-format.js";
@@ -18,27 +18,18 @@ export function formatMigratePlain(result) {
18
18
  if (typeof plan.status !== "string")
19
19
  return null;
20
20
  const lines = [`${planGlyph(plan.status)} ${plan.status}`];
21
- if (plan.taskV3Migration) {
22
- const tasks = plan.taskV3Migration;
23
- lines.push(` task-v2->v3: ${tasks.changed} change, ${tasks.skipped} current, ${tasks.blocked} blocked`);
24
- }
25
- if (plan.taskV4Migration) {
26
- const tasks = plan.taskV4Migration;
27
- lines.push(` task-v3->v4: ${tasks.changed} change, ${tasks.skipped} current, ${tasks.blocked} blocked`);
21
+ if (plan.taskFiles) {
22
+ const tasks = plan.taskFiles;
23
+ lines.push(` task files: ${tasks.changed} change, ${tasks.skipped} current, ${tasks.blocked} blocked`);
28
24
  }
29
25
  if (plan.blockers?.length) {
30
26
  lines.push("", "blockers:", ...plan.blockers.map((blocker) => ` - ${blocker}`));
31
27
  }
32
28
  if (plan.backupPath) {
33
- lines.push("", `backup (v2->v3): ${plan.backupPath}`);
29
+ lines.push("", `backup: ${plan.backupPath}`);
34
30
  }
35
31
  if (plan.applied !== undefined)
36
- lines.push(`applied (v2->v3): ${plan.applied}`);
37
- if (plan.taskV4BackupPath) {
38
- lines.push(`backup (v3->v4): ${plan.taskV4BackupPath}`);
39
- }
40
- if (plan.taskV4Applied !== undefined)
41
- lines.push(`applied (v3->v4): ${plan.taskV4Applied}`);
32
+ lines.push(`applied: ${plan.applied}`);
42
33
  return lines.join("\n");
43
34
  }
44
35
  export const migrateFormatters = [
@@ -100,7 +100,16 @@ export function formatProposalListPlain(r) {
100
100
  // #577: surface the gate verdict inline so the queue explains itself.
101
101
  const gate = formatGateDecisionSummary(p.gateDecision);
102
102
  const gateSuffix = gate ? ` ${gate}` : "";
103
- lines.push(`${id} [${status}] ${ref} source=${source} ${created}${gateSuffix}`);
103
+ // A retire proposal's continuityRisk excludes it from bulk accept —
104
+ // visible in the default list, not just `proposal show`, since the owner
105
+ // reviews the backlog list-first. `list`'s default (brief) shape
106
+ // projects a `continuityRisk: true` marker instead of the full
107
+ // `retirement` object (only present from `--detail normal` up), so both
108
+ // shapes are checked here.
109
+ const retirement = p.retirement;
110
+ const flagged = p.continuityRisk === true || Boolean(retirement?.continuityRisk);
111
+ const continuitySuffix = flagged ? " ⚠ continuity-risk" : "";
112
+ lines.push(`${id} [${status}] ${ref} source=${source} ${created}${gateSuffix}${continuitySuffix}`);
104
113
  }
105
114
  return lines.join("\n").trimEnd();
106
115
  }
@@ -141,6 +150,43 @@ export function formatProposalShowPlain(r) {
141
150
  if (review.decidedAt)
142
151
  lines.push(`review.decidedAt: ${String(review.decidedAt)}`);
143
152
  }
153
+ // alpha.9: a consolidate retire proposal writes no content (`payload.content`
154
+ // is empty by design) — this is the reason a reviewer needs instead. `diff`
155
+ // shows the body being retired.
156
+ const retirement = p.retirement;
157
+ if (retirement) {
158
+ lines.push(`retire: ${String(retirement.retiredRef)} -> ${String(retirement.successorRef)}`);
159
+ lines.push(`retire.label: ${String(retirement.judgeLabel)} (cosine=${String(retirement.cosine)})`);
160
+ lines.push(`retire.reason: ${String(retirement.judgeReason)}`);
161
+ // Item 1 (continuity check): flagged, but still minted — never swept by a
162
+ // bulk accept, only acceptable by id, so a reviewer must see it here.
163
+ const continuityRisk = retirement.continuityRisk;
164
+ if (continuityRisk) {
165
+ const failingQueries = typeof continuityRisk.failingQueries === "number" ? continuityRisk.failingQueries : 0;
166
+ const unverifiedQueries = typeof continuityRisk.unverifiedQueries === "number" ? continuityRisk.unverifiedQueries : 0;
167
+ const summary = [];
168
+ if (failingQueries > 0) {
169
+ summary.push(`${failingQueries} of the retired asset's own quer${failingQueries === 1 ? "y" : "ies"} would not have found the successor top 10`);
170
+ }
171
+ // S2: a query the search call never ran, or that fell back to
172
+ // keyword-only ranking, is never silently trusted OR silently
173
+ // dropped — it excludes the proposal from bulk accept on its own.
174
+ if (unverifiedQueries > 0) {
175
+ summary.push(`${unverifiedQueries} quer${unverifiedQueries === 1 ? "y" : "ies"} unverified (search failed or used the keyword-only fallback)`);
176
+ }
177
+ lines.push(`retire.continuityRisk: ${summary.join("; ")} — excluded from bulk accept`);
178
+ // N3 / S4: the actual failing query text, not just the count — a
179
+ // reviewer deciding whether to accept by id needs to see what would
180
+ // stop resolving, not just how many queries.
181
+ const ranks = Array.isArray(continuityRisk.ranks) ? continuityRisk.ranks : [];
182
+ for (const rank of ranks) {
183
+ const successorRank = rank.successorRank === null || rank.successorRank === undefined
184
+ ? "absent from top 10"
185
+ : `#${String(rank.successorRank)}`;
186
+ lines.push(` - "${String(rank.query)}": retired #${String(rank.retiredRank)}, successor ${successorRank}`);
187
+ }
188
+ }
189
+ }
144
190
  const validation = r.validation;
145
191
  if (validation) {
146
192
  const findings = Array.isArray(validation.findings) ? validation.findings : [];
@@ -184,7 +230,6 @@ export function formatProposalRejectPlain(r) {
184
230
  return `Rejected proposal ${String(r.id)} (${String(r.ref)})${reason}`;
185
231
  }
186
232
  export function formatProposalDrainPlain(r) {
187
- const policy = String(r.policy ?? "?");
188
233
  const applyMode = String(r.applyMode ?? "queue");
189
234
  const promoted = Array.isArray(r.promoted) ? r.promoted : [];
190
235
  const rejected = Array.isArray(r.rejected) ? r.rejected : [];
@@ -194,7 +239,7 @@ export function formatProposalDrainPlain(r) {
194
239
  const failed = Array.isArray(r.failed) ? r.failed : [];
195
240
  const prefix = r.dryRun === true ? "[dry-run] " : "";
196
241
  const lines = [
197
- `${prefix}Drained proposal queue (strategy=${String(r.strategy ?? "?")}, policy=${policy}, applyMode=${applyMode})`,
242
+ `${prefix}Drained proposal queue (strategy=${String(r.strategy ?? "?")}, applyMode=${applyMode})`,
198
243
  ` promoted: ${promoted.length}`,
199
244
  ` rejected: ${rejected.length}`,
200
245
  ` deferred: ${deferred.length}`,
@@ -54,17 +54,20 @@ export function formatShowPlain(r, detail) {
54
54
  if (r.schemaVersion !== undefined)
55
55
  lines.push(`schemaVersion: ${String(r.schemaVersion)}`);
56
56
  }
57
- const related = typeof r.related === "object" && r.related !== null ? r.related : undefined;
58
- const relatedHits = related && Array.isArray(related.hits) ? related.hits : [];
59
- if (related) {
57
+ const links = typeof r.links === "object" && r.links !== null ? r.links : undefined;
58
+ if (links) {
60
59
  lines.push("");
61
- lines.push(`related: ${String(related.total ?? relatedHits.length)}`);
62
- for (const hit of relatedHits) {
63
- lines.push(` - ${String(hit.type ?? "?")}: ${formatRelatedLabel(hit)}`);
64
- const shared = Array.isArray(hit.sharedEntities) ? hit.sharedEntities.map(String) : [];
65
- if (shared.length > 0)
66
- lines.push(` shared: ${shared.join(", ")}`);
67
- lines.push(` relationCount: ${String(hit.relationCount ?? 0)}`);
60
+ lines.push("links:");
61
+ for (const part of ["outgoing", "incoming", "unresolved"]) {
62
+ const groups = links[part];
63
+ if (typeof groups !== "object" || groups === null)
64
+ continue;
65
+ lines.push(` ${part}:`);
66
+ for (const [kind, group] of Object.entries(groups)) {
67
+ const refs = Array.isArray(group.refs) ? group.refs.map(String) : [];
68
+ const more = (group.total ?? refs.length) > refs.length ? ` (+${(group.total ?? 0) - refs.length} more)` : "";
69
+ lines.push(` ${kind}: ${refs.join(", ")}${more}`);
70
+ }
68
71
  }
69
72
  }
70
73
  const payloads = [r.content, r.template, r.prompt].filter((value) => value != null).map(String);
@@ -98,10 +101,3 @@ export function formatShowPlain(r, detail) {
98
101
  appendShowDirectives(lines, r);
99
102
  return lines.length > 0 ? lines.join("\n") : null;
100
103
  }
101
- function formatRelatedLabel(hit) {
102
- const ref = typeof hit.ref === "string" ? hit.ref : undefined;
103
- if (ref)
104
- return ref;
105
- const pathValue = typeof hit.path === "string" ? hit.path : "?";
106
- return pathValue.split("/").pop() ?? pathValue;
107
- }
@@ -108,13 +108,6 @@ export function formatWorkflowStatusPlain(result) {
108
108
  const attempts = typeof unit.attempts === "number" ? unit.attempts : undefined;
109
109
  const suffix = attempts !== undefined && attempts > 1 ? `, attempt ${attempts}` : "";
110
110
  lines.push(` - ${id} [${node}] (${status}${suffix})`);
111
- // Codex round-3 finding B: a `running` claim gone silent past the check-in
112
- // window — the process holding it likely died. Surface it (with the claim
113
- // holder) so a human can reclaim/re-run the unit.
114
- if (unit.stale === true) {
115
- const holder = typeof unit.claimHolder === "string" && unit.claimHolder.trim() ? ` claimed by ${unit.claimHolder}` : "";
116
- lines.push(` stale: claim went silent past the check-in window${holder} — its driver may have died`);
117
- }
118
111
  if (typeof unit.failureReason === "string" && unit.failureReason.trim()) {
119
112
  lines.push(` failure_reason: ${unit.failureReason}`);
120
113
  }
@@ -126,27 +119,8 @@ export function formatWorkflowStatusPlain(result) {
126
119
  }
127
120
  }
128
121
  }
129
- // Review C2: the check-in `continue` directive must survive plain-text
130
- // rendering — JSON consumers saw `checkin` but the text path dropped it.
131
- const checkinLine = formatWorkflowCheckinLine(result);
132
- if (checkinLine) {
133
- lines.push("");
134
- lines.push(checkinLine);
135
- }
136
122
  return lines.join("\n");
137
123
  }
138
- /**
139
- * Render the stalled-run check-in directive (#506) when present on a
140
- * workflow-status result. Returns null when the run is healthy.
141
- */
142
- function formatWorkflowCheckinLine(result) {
143
- const checkin = typeof result.checkin === "object" && result.checkin !== null
144
- ? result.checkin
145
- : undefined;
146
- if (!checkin || typeof checkin.directive !== "string" || !checkin.directive.trim())
147
- return null;
148
- return checkin.directive.trim();
149
- }
150
124
  /**
151
125
  * One `! lowering[<severity>] <code> (<adapter>[; <field>]): <message>` line
152
126
  * from a `{code, severity, adapter, field?, message}` lowering notice, or
@@ -346,12 +320,6 @@ export function formatWorkflowPlanPlain(result) {
346
320
  for (const [index, step] of steps.entries()) {
347
321
  renderPlanStepLines(step, index + 1, lines);
348
322
  }
349
- const sourceReadSet = Array.isArray(result.sourceReadSet) ? result.sourceReadSet : [];
350
- if (sourceReadSet.length > 0) {
351
- lines.push("read set:");
352
- for (const entry of sourceReadSet)
353
- lines.push(` ${String(entry)}`);
354
- }
355
323
  const notices = Array.isArray(result.notices) ? result.notices : [];
356
324
  if (notices.length > 0) {
357
325
  lines.push("notices:");
@@ -4,6 +4,7 @@
4
4
  import { writeStdout } from "./stdout.js";
5
5
  import { addFormatters } from "./text/add.js";
6
6
  import { bundleCreateFormatters } from "./text/bundle-create.js";
7
+ import { bundleRenameFormatters } from "./text/bundle-rename.js";
7
8
  import { bundleShowFormatters } from "./text/bundle-show.js";
8
9
  import { cloneFormatters } from "./text/clone.js";
9
10
  import { configFormatters } from "./text/config.js";
@@ -40,6 +41,7 @@ import { workflowFormatters } from "./text/workflow.js";
40
41
  // compile instead of silently disappearing at runtime.
41
42
  const BUILT_IN_TEXT_FORMATTERS = [
42
43
  ...bundleCreateFormatters,
44
+ ...bundleRenameFormatters,
43
45
  ...bundleShowFormatters,
44
46
  ...indexFormatters,
45
47
  ...showFormatters,