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
@@ -9,11 +9,13 @@
9
9
  * a bundle/adapter/concept id at all — it reads exactly the path it was
10
10
  * given and classifies it.
11
11
  *
12
- * Reuses the exact current-schema router `parseTaskSource`
13
- * (`src/tasks/source/parse-task-source.ts`) used by every other task-source
14
- * reader. Historical v2/v3 documents are deliberately rejected here and
15
- * point to `akm migrate apply`; validation does not embed a second legacy
16
- * parser or perform an in-memory migration.
12
+ * Reuses the exact version router `parseTaskSource`
13
+ * (`src/tasks/source/parse-task-source.ts`) every other task-source reader
14
+ * uses (`akm task sync`'s `compileTaskSources` included) — this module never
15
+ * forks a second parser. `readBoundedTaskSourceYaml` /
16
+ * `peekTaskSourceVersion` / `own` are the SAME front-end helpers the router
17
+ * calls first; they are used here only to recover the file's DECLARED schema
18
+ * version for the report and to tell `blocked` from `invalid`.
17
19
  *
18
20
  * Beyond parsing, this module also runs the SAME two per-source gates
19
21
  * `akm task sync`'s `compileTaskSources` runs before it ever installs a
@@ -41,16 +43,18 @@
41
43
  *
42
44
  * Outcome classification (mirrors `parse-task-source.ts`'s own routing
43
45
  * table in its header, extended for the two gates above):
44
- * - `valid` — parses as task source v4 directly (declared `version: 4`)
45
- * and passes both sync gates.
46
- * - `blocked` — declared `version: 2` or `3`; runtime does not accept
47
- * it and the explicit migrator must rewrite it first.
46
+ * - `valid` — parses as task source v4 and passes both sync gates.
47
+ * - `blocked` — declared `version: 2` or `3`, or a `version: 4`
48
+ * document still carrying the retired
49
+ * `schedule[].enabled`: what `akm migrate apply`
50
+ * rewrites. The runtime reads only v4 (#987), so the
51
+ * reason names that command.
48
52
  * - `invalid` — the document declares SOME version (`4`, or anything
49
53
  * other than 2/3/4) but fails to parse/validate, OR it
50
54
  * parsed but fails one of the two sync gates above, OR
51
- * the YAML itself does not parse at all
52
- * (a genuine syntax error, not merely a non-task
53
- * shape) — reported with the parser's own reason.
55
+ * the YAML itself does not parse at all (a genuine
56
+ * syntax error, not merely a non-task shape) — reported
57
+ * with the parser's own reason.
54
58
  * - `not-a-task` — the document parses as YAML but never declares a
55
59
  * `version:` field at all (or isn't a YAML mapping) —
56
60
  * the strongest signal available that the file was
@@ -62,7 +66,7 @@ import { UsageError } from "../../core/errors.js";
62
66
  import { backendNameForPlatform } from "../../tasks/backends/index.js";
63
67
  import { assertTaskScheduleCronValid, assertTaskScheduleInputsSatisfyContract } from "../../tasks/scheduler-sync.js";
64
68
  import { own, readBoundedTaskSourceYaml } from "../../tasks/source/bounded-document.js";
65
- import { parseTaskSource, peekTaskSourceVersion } from "../../tasks/source/parse-task-source.js";
69
+ import { parseTaskSource, peekTaskSourceVersion, v4ScheduleHasRetiredEnabledKey, } from "../../tasks/source/parse-task-source.js";
66
70
  /** True when `root` is a YAML mapping that itself declares a `version:` key, regardless of that key's type/value. */
67
71
  function declaresVersionKey(root) {
68
72
  return root !== null && typeof root === "object" && !Array.isArray(root) && own(root, "version");
@@ -126,14 +130,12 @@ export async function akmTaskValidate(filePath) {
126
130
  if (!(cause instanceof UsageError))
127
131
  throw cause;
128
132
  const reason = cause.message;
129
- if (declaredVersion === 2 || declaredVersion === 3) {
130
- return {
131
- ok: false,
132
- path: resolvedPath,
133
- sourceVersion: declaredVersion,
134
- outcome: "blocked",
135
- reason: `${reason} Run \`akm migrate apply --dry-run\`, review the plan, then run \`akm migrate apply\`.`,
136
- };
133
+ // What `akm migrate apply` rewrites is the only refusal for these
134
+ // shapes (`parse-task-source.ts`), so no message-text sniffing is needed.
135
+ if (declaredVersion === 2 ||
136
+ declaredVersion === 3 ||
137
+ (declaredVersion === 4 && v4ScheduleHasRetiredEnabledKey(root))) {
138
+ return { ok: false, path: resolvedPath, sourceVersion: declaredVersion, outcome: "blocked", reason };
137
139
  }
138
140
  if (peekFailed) {
139
141
  return { ok: false, path: resolvedPath, outcome: "invalid", reason };
@@ -150,10 +152,10 @@ export async function akmTaskValidate(filePath) {
150
152
  };
151
153
  }
152
154
  // Success is unreachable from any path that leaves `declaredVersion`
153
- // undefined — the router requires a numeric 2/3/4 version to reach here.
155
+ // undefined — the router requires a numeric version 4 to reach here.
154
156
  const sourceVersion = declaredVersion ?? 4;
155
- // The current document parsed; now run the two gates `compileTaskSources`
156
- // applies before accepting it.
157
+ // The document itself parsed — now the two gates `compileTaskSources`
158
+ // runs before accepting it. A violation here is `invalid`.
157
159
  try {
158
160
  assertTaskScheduleInputsSatisfyContract(parsed.v4, resolvedPath);
159
161
  assertTaskScheduleCronValid(parsed.v4, backend);
@@ -2,13 +2,11 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * `akm workflow plan <ref>` — compile + freeze WITHOUT publishing (P3b, spec
6
- * docs/plans/specs/p3b-child-executor.md §4.6). Zero durable writes, zero
7
- * usage/event rows (row B-48): this module calls exactly the same two
8
- * functions `startWorkflowRun` does to reach a frozen plan
9
- * (`loadWorkflowAsset`, `compileResolveFreezeWorkflowV4`) and NOTHING else —
10
- * never `publishWorkflowRunV4`, `startWorkflowRun`, `warn()`, `appendEvent`,
11
- * or `akmIndex`.
5
+ * `akm workflow plan <ref>` — compile + freeze WITHOUT publishing. Zero
6
+ * durable writes, zero usage/event rows: this module calls exactly the same
7
+ * two functions `startWorkflowRun` does to reach a frozen plan
8
+ * (`loadWorkflowAsset`, `freezeWorkflow`) and NOTHING else — never
9
+ * `publishWorkflowRunV4`, `startWorkflowRun`, `appendEvent`, or `akmIndex`.
12
10
  *
13
11
  * SECRET-FREE, by construction (§4.6's closed print list): a resolved
14
12
  * reference VALUE is never printed (references resolve at pre-attempt, not
@@ -20,9 +18,8 @@
20
18
  */
21
19
  import path from "node:path";
22
20
  import { loadConfig } from "../../core/config/config.js";
23
- import { lowerResolvedExecutionRequest } from "../../integrations/agent/execution-lowering.js";
24
- import { collectWorkflowWarnings } from "../../workflows/ir/compile.js";
25
- import { compileResolveFreezeWorkflowV4 } from "../../workflows/ir/freeze-v4.js";
21
+ import { buildExecutionFromWire } from "../../integrations/agent/execution.js";
22
+ import { freezeWorkflow } from "../../workflows/freeze/freeze.js";
26
23
  import { computePlanHash } from "../../workflows/ir/plan-hash.js";
27
24
  import { loadWorkflowAsset } from "../../workflows/runtime/workflow-asset-loader.js";
28
25
  /** The step's dispatch unit — the map template for a fan-out, else the root unit. Undefined for a route step. */
@@ -49,7 +46,7 @@ function childExportedOutputNames(frozenPlan) {
49
46
  }
50
47
  /**
51
48
  * A `child-workflow` target's `expansion`. Recurses into the embedded
52
- * plan's own steps in the identical shape (§4.6) — `sourceStepsById` is
49
+ * plan's own steps in the identical shape — `usesById` is
53
50
  * omitted for the recursive call because a nested child's own authored
54
51
  * source is not available here (only its already-frozen plan is), so a
55
52
  * task-wrapped step nested inside a child conservatively reports `via:
@@ -67,15 +64,15 @@ function childExpansion(target) {
67
64
  };
68
65
  }
69
66
  /** The task/child expansion boundary for one step (§4.6). */
70
- function stepExpansion(step, frozenTarget, sourceStepsById) {
67
+ function stepExpansion(step, frozenTarget, usesById) {
71
68
  if (frozenTarget?.kind === "child-workflow")
72
69
  return childExpansion(frozenTarget);
73
- const uses = sourceStepsById?.get(step.stepId)?.uses;
70
+ const uses = usesById?.get(step.stepId);
74
71
  if (uses?.startsWith("tasks/"))
75
72
  return { via: "task", taskRef: uses };
76
73
  return { via: "direct" };
77
74
  }
78
- function projectStep(step, sequenceIndex, sourceStepsById) {
75
+ function projectStep(step, sequenceIndex, usesById) {
79
76
  const unit = stepUnit(step);
80
77
  const frozenTarget = unit?.frozenTarget;
81
78
  const kind = step.route ? "route" : step.root?.kind === "map" ? "map" : "unit";
@@ -95,7 +92,7 @@ function projectStep(step, sequenceIndex, sourceStepsById) {
95
92
  judgeEngine: step.gate.frozenJudge ? step.gate.frozenJudge.request.engine.name : null,
96
93
  },
97
94
  ...(step.outputSchema !== undefined ? { outputSchema: step.outputSchema } : {}),
98
- expansion: stepExpansion(step, frozenTarget, sourceStepsById),
95
+ expansion: stepExpansion(step, frozenTarget, usesById),
99
96
  };
100
97
  }
101
98
  /**
@@ -103,30 +100,27 @@ function projectStep(step, sequenceIndex, sourceStepsById) {
103
100
  * from its own already-frozen `request` (the identical computation
104
101
  * `freeze/targets/command.ts`'s `commandResult` already performs at freeze
105
102
  * time and discards) — walked over the whole plan, including gate judges and
106
- * recursively into every embedded child plan. Read-only: `lowerResolvedExecutionRequest`
107
- * takes no config it could write through and dispatches nothing.
103
+ * recursively into every embedded child plan. Read-only: `buildExecutionFromWire`
104
+ * reads no config and dispatches nothing.
108
105
  */
109
106
  function collectLoweringNotices(plan, config) {
110
107
  const notices = [];
111
- const lower = (request) => {
112
- notices.push(...lowerResolvedExecutionRequest(request, config).notices);
108
+ const lower = (target) => {
109
+ notices.push(...buildExecutionFromWire(target).notices);
113
110
  };
114
111
  for (const step of plan.steps) {
115
112
  const unit = stepUnit(step);
116
113
  if (unit) {
117
114
  if (unit.frozenTarget.kind === "command")
118
- lower(unit.frozenTarget.request);
115
+ lower(unit.frozenTarget);
119
116
  else if (unit.frozenTarget.kind === "child-workflow")
120
117
  notices.push(...collectLoweringNotices(unit.frozenTarget.frozenPlan, config));
121
118
  }
122
119
  if (step.gate.frozenJudge)
123
- lower(step.gate.frozenJudge.request);
120
+ lower(step.gate.frozenJudge);
124
121
  }
125
122
  return notices;
126
123
  }
127
- function relativeSourceReadSet(plan) {
128
- return plan.sourceReadSet.map((snapshot) => snapshot.identity.file);
129
- }
130
124
  /**
131
125
  * Compile + freeze `ref` and project the frozen plan into the read-only
132
126
  * `akm workflow plan` envelope. Never publishes, never writes, never warns.
@@ -134,9 +128,9 @@ function relativeSourceReadSet(plan) {
134
128
  export async function akmWorkflowPlan(ref) {
135
129
  const asset = await loadWorkflowAsset(ref);
136
130
  const config = loadConfig();
137
- const frozen = await compileResolveFreezeWorkflowV4(asset, config);
131
+ const frozen = await freezeWorkflow(asset, config);
138
132
  const plan = frozen.plan;
139
- const sourceStepsById = new Map((asset.sourceIr.jobs[0]?.steps ?? []).map((step) => [step.id, step]));
133
+ const usesById = new Map(asset.plan.steps.map((step) => [step.stepId, step.spec?.uses]));
140
134
  const sourceFormat = path.extname(asset.path).toLowerCase() === ".md" ? "markdown" : "github-yaml";
141
135
  return {
142
136
  ok: true,
@@ -151,9 +145,8 @@ export async function akmWorkflowPlan(ref) {
151
145
  ...(plan.budget ? { budget: plan.budget } : {}),
152
146
  ...(plan.params ? { params: plan.params } : {}),
153
147
  ...(plan.outputs ? { outputs: plan.outputs } : {}),
154
- steps: plan.steps.map((step, index) => projectStep(step, index, sourceStepsById)),
155
- sourceReadSet: relativeSourceReadSet(plan),
148
+ steps: plan.steps.map((step, index) => projectStep(step, index, usesById)),
156
149
  notices: collectLoweringNotices(plan, config),
157
- warnings: collectWorkflowWarnings(asset.sourceIr).map((warning) => warning.message),
150
+ warnings: frozen.warnings.map((warning) => warning.message),
158
151
  };
159
152
  }
@@ -15,7 +15,7 @@ import { NotFoundError, TransientError, UsageError } from "../core/errors.js";
15
15
  import { warn } from "../core/warn.js";
16
16
  import { akmIndex } from "../indexer/indexer.js";
17
17
  import { assertWorkflowMarkdownName, createWorkflowAsset, getWorkflowTemplate } from "../workflows/authoring/authoring.js";
18
- import { WORKFLOW_MAX_TIMEOUT_MS } from "../workflows/ir/schema.js";
18
+ import { WORKFLOW_MAX_TIMEOUT_MS } from "../workflows/resource-limits.js";
19
19
  import { abandonWorkflowRun, getWorkflowStatus, listWorkflowRuns, resolveWorkflowRunTarget, resumeWorkflowRun, } from "../workflows/runtime/runs.js";
20
20
  import { akmWorkflowPlan } from "./workflow/plan.js";
21
21
  const workflowStatusCommand = defineJsonCommand({
@@ -174,8 +174,8 @@ const workflowCreateCommand = defineJsonCommand({
174
174
  * `--skip-if-locked` (#948) eligibility: only these two named, retryable
175
175
  * `TransientError` codes (#948 addendum — moved off UsageError, exit 75) turn
176
176
  * a `workflow run` failure into a graceful skip — `RUN_LEASE_HELD` (another
177
- * engine invocation is driving THIS run, `workflow-runs-repository.ts`'s
178
- * single-driver lease) and `STATE_DB_CONTENDED` (an unrelated akm process is
177
+ * live akm process holds THIS run's lock file, `exec/run-workflow.ts`) and
178
+ * `STATE_DB_CONTENDED` (an unrelated akm process is
179
179
  * writing state.db right now, `core/state-db.ts`'s BEGIN IMMEDIATE retry
180
180
  * exhaustion). Every other error — a bad flag, an unresolvable target —
181
181
  * still fails loudly.
@@ -202,7 +202,7 @@ const workflowRunCommand = defineJsonCommand({
202
202
  },
203
203
  "skip-if-locked": {
204
204
  type: "boolean",
205
- description: "If another akm process already holds this run's engine lease, or state.db is busy with another " +
205
+ description: "If another akm process is already driving this run, or state.db is busy with another " +
206
206
  "writer, skip gracefully (exit 0) instead of failing (exit 75). Use for high-frequency scheduled runs " +
207
207
  "so they don't pile up failures while a longer-running invocation is in progress.",
208
208
  default: false,
@@ -192,8 +192,9 @@ const DOCUMENT_JSON_CARRIED_FIELDS = [
192
192
  "cwd",
193
193
  "wikiRole",
194
194
  "sources",
195
- "generation",
196
195
  "evidenceSources",
196
+ // #935: a workflow's step targets and a task's target, read as declared links.
197
+ "uses",
197
198
  // D2 (#730): the OKF v0.2 provenance `promoteProposal` stamps onto AKM-native
198
199
  // writes (generated/verified/sources, namespaced — see `types.ts`'s
199
200
  // `OkfProvenance` doc). Carried so the akm adapter rereads what it wrote and
@@ -54,8 +54,7 @@ import path from "node:path";
54
54
  import { isDangerousEnvKey } from "../../../commands/lint/env-key-rules.js";
55
55
  import { parseTaskSource } from "../../../tasks/source/parse-task-source.js";
56
56
  import { taskSourceErrorDetail } from "../../../tasks/source-v3.js";
57
- import { compileWorkflowPlan } from "../../../workflows/ir/compile.js";
58
- import { compileWorkflowSource } from "../../../workflows/source-ir/compile.js";
57
+ import { checkWorkflowPlan, compileWorkflowSource } from "../../../workflows/compile.js";
59
58
  import { conceptIdForStashFile } from "../../asset/resolve-ref.js";
60
59
  import { isAkmRegistryCachePath, scanEnvKeyNames } from "../../common.js";
61
60
  /** Recommended `category` values for facts — `commands/lint/fact-linter.ts:9`. */
@@ -370,7 +369,7 @@ export function workflowFrontendDiagnostics(relPath, raw, parsePath) {
370
369
  }
371
370
  return { errors, warnings };
372
371
  }
373
- const compiled = compileWorkflowPlan(result.ir, path.basename(parsePath, path.extname(parsePath)));
372
+ const compiled = checkWorkflowPlan(result.plan);
374
373
  if (!compiled.ok) {
375
374
  for (const err of compiled.errors) {
376
375
  errors.push({
@@ -54,10 +54,10 @@
54
54
  * concern (Chunk 4/5), not recognition's. On the valid Chunk-0b fixture this
55
55
  * distinction never triggers.
56
56
  */
57
+ import { parseBuiltinCommandAction } from "../../../commands/command/builtin-action.js";
57
58
  import { scanEnvKeyNames } from "../../../commands/env/env.js";
58
59
  import { parseTaskSource } from "../../../tasks/source/parse-task-source.js";
59
- import { compileWorkflowSource } from "../../../workflows/source-ir/compile.js";
60
- import { sourceStepInstructions } from "../../../workflows/source-ir/program.js";
60
+ import { compileWorkflowSource, workflowStepInstructions } from "../../../workflows/compile.js";
61
61
  import { parseFrontmatter } from "../../asset/frontmatter.js";
62
62
  import { parseMarkdownToc } from "../../asset/markdown.js";
63
63
  import { nonEmptyString } from "./shared.js";
@@ -126,6 +126,25 @@ function applyFrontmatterDescriptionAndTags(fm, out) {
126
126
  }
127
127
  }
128
128
  }
129
+ /** The command a stored `akm/command` action runs; inline content names no asset. */
130
+ function storedCommandRef(action) {
131
+ return action?.kind === "stored" ? action.ref : undefined;
132
+ }
133
+ /** The asset a workflow step targets: its `uses:` ref, or the ref of a stored `akm/command`. Prose and `run:` steps target none. */
134
+ function workflowStepTarget(spec) {
135
+ if (!spec?.uses)
136
+ return undefined;
137
+ if (spec.uses !== "akm/command")
138
+ return spec.uses;
139
+ if (spec.commandMode !== "stored-ref")
140
+ return undefined;
141
+ try {
142
+ return storedCommandRef(parseBuiltinCommandAction(spec.with));
143
+ }
144
+ catch {
145
+ return undefined;
146
+ }
147
+ }
129
148
  /** Collect + finalize a searchHints set the way every contributor does (`Array.from(hints).filter(Boolean)`, assigned only when non-empty). */
130
149
  function finalizeHints(out, hints) {
131
150
  if (hints.size > 0)
@@ -246,6 +265,9 @@ export function foldRecognizedMetadata(rendererName, file) {
246
265
  hints.add(`prompt:${target.command.ref}`);
247
266
  else
248
267
  hints.add(`uses:${target.uses.ref}`);
268
+ const used = target.uses.kind !== "builtin-command" ? target.uses.ref : storedCommandRef(target.command);
269
+ if (used)
270
+ out.uses = [used];
249
271
  }
250
272
  else {
251
273
  hints.add(`run:${target.run}`);
@@ -320,19 +342,25 @@ export function foldRecognizedMetadata(rendererName, file) {
320
342
  const result = compileWorkflowSource(file.content(), { path: file.relPath, workspaceRoot: file.stashRoot });
321
343
  if (!result.ok)
322
344
  return out;
323
- const sourceIr = result.ir;
345
+ const plan = result.plan;
324
346
  const hints = new Set();
325
- if (sourceIr.preamble)
326
- hints.add(sourceIr.preamble);
327
- for (const step of sourceIr.jobs.flatMap((job) => job.steps)) {
328
- hints.add(step.id);
329
- hints.add(sourceStepInstructions(step));
330
- if (step.gate?.rubric)
331
- hints.add(step.gate.rubric);
347
+ const uses = new Set();
348
+ if (plan.preamble)
349
+ hints.add(plan.preamble);
350
+ for (const step of plan.steps) {
351
+ hints.add(step.stepId);
352
+ hints.add(workflowStepInstructions(step));
353
+ if (step.gate.criteria[0])
354
+ hints.add(step.gate.criteria[0]);
355
+ const used = workflowStepTarget(step.spec);
356
+ if (used)
357
+ uses.add(used);
332
358
  }
333
359
  out.searchHints = Array.from(hints).filter(Boolean);
334
- if (sourceIr.params) {
335
- const parameters = Object.entries(sourceIr.params).map(([name, schema]) => {
360
+ if (uses.size > 0)
361
+ out.uses = [...uses];
362
+ if (plan.paramSchemas) {
363
+ const parameters = Object.entries(plan.paramSchemas).map(([name, schema]) => {
336
364
  const description = schema.description;
337
365
  return { name, ...(typeof description === "string" && description ? { description } : {}) };
338
366
  });
@@ -396,4 +424,6 @@ export function applyFoldedMetadata(entry, folded) {
396
424
  entry.toc = folded.toc;
397
425
  if (folded.parameters)
398
426
  entry.parameters = folded.parameters;
427
+ if (folded.uses)
428
+ entry.uses = folded.uses;
399
429
  }
@@ -17,11 +17,9 @@
17
17
  * ── validate (spec §6 task validation column) ──
18
18
  *
19
19
  * Validation enters the canonical task source parser (`parseTaskSource`,
20
- * task source v4 native as of P4 — a `version: 3` or `version: 2` document
21
- * is auto-read through the in-memory migration shim in
22
- * `parse-task-source.ts`; only a version the shim's deterministic planners
23
- * cannot convert, or any other unsupported number, fails closed with
24
- * `TASK_SCHEMA_VERSION_UNSUPPORTED`). That parser owns the closed key sets,
20
+ * which reads only task source v4 — a `version: 2` or `version: 3`
21
+ * document fails closed with `TASK_SCHEMA_VERSION_UNSUPPORTED`, naming
22
+ * `akm migrate apply`, which converts it). That parser owns the closed key sets,
25
23
  * the executable-selector XOR, hostile YAML policy, the `akm/command`
26
24
  * builtin, bounds, and physical `working-directory` containment. The
27
25
  * adapter only translates a parser failure into the format-family
@@ -33,7 +31,8 @@
33
31
  */
34
32
  import fs from "node:fs";
35
33
  import path from "node:path";
36
- import { parseTaskSource } from "../../../tasks/source/parse-task-source.js";
34
+ import { readBoundedTaskSourceYaml } from "../../../tasks/source/bounded-document.js";
35
+ import { parseTaskSource, peekTaskSourceVersion } from "../../../tasks/source/parse-task-source.js";
37
36
  import { TASK_EXTENSION, TASK_NEAR_MISS_EXTENSION, taskExtensionDetail, taskSourceErrorDetail, } from "../../../tasks/source-v3.js";
38
37
  import { toPosix } from "../../common.js";
39
38
  import { hashContent } from "./shared.js";
@@ -125,8 +124,11 @@ export const akmTaskAdapter = {
125
124
  return ["."];
126
125
  },
127
126
  /**
128
- * Install-time probe (§1.2): a root holding a top-level, valid task-v3
129
- * `.yml` file. The full parser keeps this disjoint from unrelated YAML and
127
+ * Install-time probe (§1.2): a root holding a top-level, valid task source
128
+ * v4 `.yml` file, or a task v2/v3 file that `akm migrate apply` has yet to
129
+ * convert (the runtime refuses those, so without this the migrator and
130
+ * `akm task sync` would not find them in a bundle whose adapter config does
131
+ * not record). The full parser keeps this disjoint from unrelated YAML and
130
132
  * prevents probe semantics from drifting from validation semantics.
131
133
  */
132
134
  looksLikeRoot(root) {
@@ -152,9 +154,28 @@ export const akmTaskAdapter = {
152
154
  return true;
153
155
  }
154
156
  catch {
157
+ if (isLegacyTaskDocument(raw, entry.name))
158
+ return true;
155
159
  // Continue probing the remaining top-level .yml files.
156
160
  }
157
161
  }
158
162
  return false;
159
163
  },
160
164
  };
165
+ /** The executable keys each retired task schema version required one of. */
166
+ const LEGACY_TASK_TARGET_KEYS = {
167
+ 2: ["workflow", "prompt", "command"],
168
+ 3: ["uses", "run"],
169
+ };
170
+ /** A task v2/v3 document: its schema version, plus a target key that version used. */
171
+ function isLegacyTaskDocument(yaml, filePath) {
172
+ let root;
173
+ try {
174
+ root = readBoundedTaskSourceYaml({ yaml, filePath }, { sourceLabel: "task source" }).root;
175
+ }
176
+ catch {
177
+ return false;
178
+ }
179
+ const keys = LEGACY_TASK_TARGET_KEYS[peekTaskSourceVersion(root) ?? 0];
180
+ return keys !== undefined && keys.some((key) => Object.hasOwn(root, key));
181
+ }
@@ -21,7 +21,7 @@
21
21
  */
22
22
  import fs from "node:fs";
23
23
  import path from "node:path";
24
- import { looksLikeGithubWorkflowSource } from "../../../workflows/source-ir/compile.js";
24
+ import { looksLikeGithubWorkflowSource } from "../../../workflows/compile.js";
25
25
  import { parseFrontmatter } from "../../asset/frontmatter.js";
26
26
  import { toPosix } from "../../common.js";
27
27
  import { perTypeValidateChecks, workflowYamlSourceDiagnostics } from "./akm-lint.js";
@@ -4,7 +4,7 @@
4
4
  import { createHash } from "node:crypto";
5
5
  import { isMap, isScalar, parseDocument, visit } from "yaml";
6
6
  import { cloneExecutionJson, cloneExecutionJsonObject, } from "../../execution/json.js";
7
- import { assertSnapshotKeys, snapshotStrictRecord } from "../../execution/record.js";
7
+ import { snapshotStrictRecord } from "../../execution/record.js";
8
8
  import { cloneToolSelection, createAdapterRenderedExecutionSource, } from "../../execution/source.js";
9
9
  import { UsageError } from "../errors.js";
10
10
  import { warnOnce } from "../warn.js";
@@ -137,20 +137,16 @@ function nullableTimeout(value, path) {
137
137
  /** Adapter helper for the common frontmatter fields fixed by the 0.9.2 design. */
138
138
  export function executionDefaultsFromFrontmatter(data, options) {
139
139
  const frontmatter = snapshotStrictRecord(data, "frontmatter");
140
- const optionRecord = snapshotStrictRecord(options, "execution frontmatter projection options");
141
- assertSnapshotKeys(optionRecord, ["kind", "allowTopLevelEngine", "toolsKeys"], "execution frontmatter projection options");
142
- const kind = optionRecord.kind;
140
+ const kind = options.kind;
143
141
  if (kind !== "command" && kind !== "persona") {
144
142
  throw new TypeError("execution frontmatter projection options.kind is invalid");
145
143
  }
146
- const allowTopLevelEngine = Object.hasOwn(optionRecord, "allowTopLevelEngine")
147
- ? optionRecord.allowTopLevelEngine
148
- : false;
144
+ const allowTopLevelEngine = Object.hasOwn(options, "allowTopLevelEngine") ? options.allowTopLevelEngine : false;
149
145
  if (typeof allowTopLevelEngine !== "boolean") {
150
146
  throw new TypeError("execution frontmatter projection options.allowTopLevelEngine must be a boolean");
151
147
  }
152
- const configuredToolsKeys = Object.hasOwn(optionRecord, "toolsKeys")
153
- ? cloneExecutionJson(optionRecord.toolsKeys, "execution frontmatter projection options.toolsKeys")
148
+ const configuredToolsKeys = Object.hasOwn(options, "toolsKeys")
149
+ ? cloneExecutionJson(options.toolsKeys, "execution frontmatter projection options.toolsKeys")
154
150
  : ["tools"];
155
151
  if (!Array.isArray(configuredToolsKeys) || configuredToolsKeys.some((key) => typeof key !== "string" || !key)) {
156
152
  throw new TypeError("execution frontmatter projection options.toolsKeys must be an array of non-empty strings");
@@ -272,43 +268,35 @@ export function executionDefaultsFromFrontmatter(data, options) {
272
268
  }
273
269
  return out;
274
270
  }
275
- function snapshotRendererInput(input) {
276
- const inputSnapshot = snapshotStrictRecord(input, "adapter execution source");
277
- assertSnapshotKeys(inputSnapshot, ["kind", "raw", "identity", "defaults", "extensions"], "adapter execution source");
278
- const identity = snapshotStrictRecord(inputSnapshot.identity, "adapter execution source identity");
279
- assertSnapshotKeys(identity, ["ref", "bundle", "adapter", "file"], "adapter execution source identity");
280
- return { input: inputSnapshot, identity };
281
- }
282
271
  export function renderMarkdownExecutionSource(input) {
283
- const snapshots = snapshotRendererInput(input);
284
- const raw = snapshots.input.raw;
272
+ const raw = input.raw;
285
273
  if (typeof raw !== "string")
286
274
  throw new TypeError("adapter execution source.raw must be a string");
287
- const kind = snapshots.input.kind;
275
+ const kind = input.kind;
288
276
  if (kind !== "command" && kind !== "persona")
289
277
  throw new TypeError("adapter execution source.kind is invalid");
290
- const identityFile = snapshots.identity.file;
291
- const parsed = parseExecutionMarkdown(raw, typeof identityFile === "string" ? identityFile : undefined);
292
- const hasDefaults = Object.hasOwn(snapshots.input, "defaults");
293
- const defaultsProjection = snapshots.input.defaults;
278
+ const identity = input.identity;
279
+ const parsed = parseExecutionMarkdown(raw, identity.file);
280
+ const hasDefaults = Object.hasOwn(input, "defaults");
281
+ const defaultsProjection = input.defaults;
294
282
  const defaults = typeof defaultsProjection === "function" ? defaultsProjection(parsed.data) : defaultsProjection;
295
283
  if (hasDefaults && defaults === undefined) {
296
284
  throw new TypeError("adapter execution source defaults must be omitted or resolve to an object");
297
285
  }
298
- const extensionsProjection = snapshots.input.extensions;
286
+ const extensionsProjection = input.extensions;
299
287
  const extensionsAreProjected = typeof extensionsProjection === "function";
300
288
  const extensions = extensionsAreProjected ? extensionsProjection(parsed.data) : extensionsProjection;
301
- if (Object.hasOwn(snapshots.input, "extensions") && !extensionsAreProjected && extensions === undefined) {
289
+ if (Object.hasOwn(input, "extensions") && !extensionsAreProjected && extensions === undefined) {
302
290
  throw new TypeError("adapter execution source extensions must be omitted or be an adapter-owned extension object");
303
291
  }
304
292
  return createAdapterRenderedExecutionSource({
305
293
  kind,
306
294
  content: parsed.content,
307
295
  identity: {
308
- ref: snapshots.identity.ref,
309
- bundle: snapshots.identity.bundle,
310
- adapter: snapshots.identity.adapter,
311
- file: snapshots.identity.file,
296
+ ref: identity.ref,
297
+ bundle: identity.bundle,
298
+ adapter: identity.adapter,
299
+ file: identity.file,
312
300
  hash: createHash("sha256").update(raw, "utf8").digest("hex"),
313
301
  },
314
302
  ...(hasDefaults ? { defaults } : {}),
@@ -26,7 +26,7 @@
26
26
  import fs from "node:fs";
27
27
  import path from "node:path";
28
28
  import { toPosix } from "../common.js";
29
- import { DERIVED_SUFFIX, SCRIPT_EXTENSIONS, WORKFLOW_EXTENSIONS } from "../recognition-util.js";
29
+ import { SCRIPT_EXTENSIONS, WORKFLOW_EXTENSIONS } from "../recognition-util.js";
30
30
  const workflowSpec = {
31
31
  isRelevantFile: (fileName) => WORKFLOW_EXTENSIONS.includes(path.extname(fileName).toLowerCase()),
32
32
  toCanonicalName: (typeRoot, filePath) => {
@@ -245,21 +245,12 @@ export function assetPathForName(assetType, typeRoot, name) {
245
245
  * "default" alias is genuinely dual-owned: both `<dir>/.env` and
246
246
  * `<dir>/default.env` derive the same canonical name (`toCanonicalName`
247
247
  * above), so a physical-owner lookup must consider both without reading
248
- * either file. `memory` has a second, analogous duality (#882): a ref to
249
- * `<name>` may own either `<name>.md` or the LLM-inferred `<name>.derived.md`
250
- * twin — `.derived` is a provenance marker on the SAME identity, not part of
251
- * the name (see `resolveParentRef`/`isDerivedMemory` in
252
- * `commands/improve/memory/derived-ref.ts`, and the belief-edge identity
253
- * channel's own `memory:<name>.derived` refs). The plain `.md` file wins when
254
- * both exist, so it stays `primary` — first in the returned list — and every
255
- * caller here already prefers the first candidate that exists on disk. Every
256
- * other placement type has exactly one inverse spelling.
248
+ * either file. Every other placement type has exactly one inverse spelling —
249
+ * including `memory`: `<name>.derived.md` is a separate item that owns
250
+ * `<name>.derived`, never a second spelling of `<name>`.
257
251
  */
258
252
  export function assetPathCandidatesForName(assetType, typeRoot, name) {
259
253
  const primary = assetPathForName(assetType, typeRoot, name);
260
- if (assetType === "memory" && !name.endsWith(DERIVED_SUFFIX)) {
261
- return [primary, assetPathForName(assetType, typeRoot, `${name}${DERIVED_SUFFIX}`)];
262
- }
263
254
  if (assetType !== "env")
264
255
  return [primary];
265
256
  const base = name === "default" ? "" : name.endsWith("/default") ? name.slice(0, -"default".length) : undefined;