akm-cli 0.9.1 → 0.9.2-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/CHANGELOG.md +103 -28
  2. package/README.md +3 -1
  3. package/SECURITY.md +1 -1
  4. package/STABILITY.md +1 -1
  5. package/dist/akm +2 -2
  6. package/dist/akm-migrate +2 -2
  7. package/dist/assets/hints/cli-hints-full.md +14 -9
  8. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
  9. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  10. package/dist/assets/models.json +35 -0
  11. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
  12. package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
  13. package/dist/assets/tasks/core/extract.yml +6 -5
  14. package/dist/assets/tasks/core/improve.yml +6 -5
  15. package/dist/assets/tasks/core/index-refresh.yml +6 -5
  16. package/dist/assets/tasks/core/sync.yml +6 -5
  17. package/dist/assets/tasks/core/version-check.yml +6 -5
  18. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
  19. package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
  20. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
  21. package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
  22. package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
  23. package/dist/cli/confirm.js +2 -2
  24. package/dist/cli/parse-args.js +3 -24
  25. package/dist/cli/retired-commands.js +1 -1
  26. package/dist/cli/shared.js +2 -2
  27. package/dist/cli.js +11 -9
  28. package/dist/commands/agent/agent-dispatch.js +55 -89
  29. package/dist/commands/agent/contribute-cli.js +12 -45
  30. package/dist/commands/command/builtin-action.js +32 -0
  31. package/dist/commands/command/command-cli.js +99 -0
  32. package/dist/commands/command/command-execution.js +308 -0
  33. package/dist/commands/command/execution-source-loader.js +176 -0
  34. package/dist/commands/command/portable-template.js +60 -0
  35. package/dist/commands/config-cli.js +10 -4
  36. package/dist/commands/env/env.js +4 -2
  37. package/dist/commands/feedback-cli.js +1 -1
  38. package/dist/commands/health/checks.js +241 -29
  39. package/dist/commands/health/html-report.js +0 -14
  40. package/dist/commands/health/report-view-model.js +0 -1
  41. package/dist/commands/health/surfaces.js +6 -7
  42. package/dist/commands/health/types.js +0 -2
  43. package/dist/commands/health.js +63 -18
  44. package/dist/commands/improve/collapse-detector.js +5 -6
  45. package/dist/commands/improve/consolidate.js +251 -214
  46. package/dist/commands/improve/distill/promote-memory.js +71 -34
  47. package/dist/commands/improve/distill/quality-gate.js +17 -5
  48. package/dist/commands/improve/distill.js +232 -155
  49. package/dist/commands/improve/eligibility.js +112 -79
  50. package/dist/commands/improve/execution.js +57 -0
  51. package/dist/commands/improve/extract-cli.js +5 -5
  52. package/dist/commands/improve/extract-prompt.js +64 -22
  53. package/dist/commands/improve/extract.js +608 -360
  54. package/dist/commands/improve/improve-strategies.js +43 -14
  55. package/dist/commands/improve/improve.js +249 -29
  56. package/dist/commands/improve/loop-stages.js +11 -17
  57. package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
  58. package/dist/commands/improve/outcome-loop.js +22 -38
  59. package/dist/commands/improve/planner.js +134 -0
  60. package/dist/commands/improve/preparation.js +730 -409
  61. package/dist/commands/improve/reflect.js +386 -223
  62. package/dist/commands/improve/run-context.js +3 -4
  63. package/dist/commands/improve/salience.js +6 -58
  64. package/dist/commands/improve/session-asset.js +12 -12
  65. package/dist/commands/lint/index.js +101 -29
  66. package/dist/commands/migrate-cli.js +11 -69
  67. package/dist/commands/migration-tool.js +6 -9
  68. package/dist/commands/models-cli.js +27 -0
  69. package/dist/commands/proposal/drain.js +258 -186
  70. package/dist/commands/proposal/proposal-cli.js +32 -10
  71. package/dist/commands/proposal/proposal.js +2 -5
  72. package/dist/commands/proposal/propose.js +192 -172
  73. package/dist/commands/proposal/repository.js +54 -91
  74. package/dist/commands/proposal/validators/proposal-validators.js +9 -7
  75. package/dist/commands/read/curate.js +53 -22
  76. package/dist/commands/read/registry-search.js +25 -9
  77. package/dist/commands/read/remember-cli.js +14 -2
  78. package/dist/commands/read/search.js +10 -4
  79. package/dist/commands/read/show.js +139 -153
  80. package/dist/commands/registry-cli.js +16 -7
  81. package/dist/commands/remember.js +33 -18
  82. package/dist/commands/sources/add-cli.js +19 -178
  83. package/dist/commands/sources/bundle-cli.js +15 -3
  84. package/dist/commands/sources/dangerous-env-audit.js +135 -0
  85. package/dist/commands/sources/info.js +2 -1
  86. package/dist/commands/sources/installed-stashes.js +901 -177
  87. package/dist/commands/sources/schema-repair.js +174 -95
  88. package/dist/commands/sources/self-update.js +30 -74
  89. package/dist/commands/sources/source-add.js +3 -5
  90. package/dist/commands/sources/sources-cli.js +2 -15
  91. package/dist/commands/sources/update-transaction.js +220 -0
  92. package/dist/commands/tasks/tasks-cli.js +3 -3
  93. package/dist/commands/tasks/tasks.js +736 -317
  94. package/dist/commands/workflow-cli.js +2 -2
  95. package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
  96. package/dist/core/adapter/adapters/akm-adapter.js +85 -35
  97. package/dist/core/adapter/adapters/akm-lint.js +54 -39
  98. package/dist/core/adapter/adapters/akm-metadata.js +45 -45
  99. package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
  100. package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
  101. package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
  102. package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
  103. package/dist/core/adapter/adapters/index.js +0 -9
  104. package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
  105. package/dist/core/adapter/adapters/okf-adapter.js +4 -0
  106. package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
  107. package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
  108. package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
  109. package/dist/core/adapter/execution-source.js +308 -0
  110. package/dist/core/adapter/recognize-match.js +36 -13
  111. package/dist/core/adapter/registry.js +0 -9
  112. package/dist/core/asset/stash-meta.js +94 -4
  113. package/dist/core/common.js +6 -11
  114. package/dist/core/config/config-io.js +3 -3
  115. package/dist/core/config/config-schema.js +18 -40
  116. package/dist/core/config/config-sources.js +11 -21
  117. package/dist/core/config/config-walker.js +31 -13
  118. package/dist/core/config/config.js +23 -26
  119. package/dist/core/config/schema/engines.js +8 -7
  120. package/dist/core/config/schema/improve-processes.js +29 -5
  121. package/dist/core/config/schema/index-config.js +0 -27
  122. package/dist/core/config/schema/primitives.js +1 -23
  123. package/dist/core/config/schema/sources-bundles.js +13 -16
  124. package/dist/core/errors.js +2 -0
  125. package/dist/core/events.js +68 -32
  126. package/dist/core/extra-params.js +1 -0
  127. package/dist/core/improve-result.js +315 -0
  128. package/dist/core/lesson-lint.js +0 -6
  129. package/dist/core/maintenance-barrier.js +4 -4
  130. package/dist/core/network-policy.js +152 -0
  131. package/dist/core/paths.js +1 -1
  132. package/dist/core/recognition-util.js +4 -4
  133. package/dist/core/registry-url.js +456 -0
  134. package/dist/core/state/migrations.js +161 -47
  135. package/dist/core/state-db.js +453 -80
  136. package/dist/core/system-error.js +32 -0
  137. package/dist/core/time.js +2 -12
  138. package/dist/core/write-source.js +0 -18
  139. package/dist/execution/directory-identity.js +52 -0
  140. package/dist/execution/executable-identity.js +107 -0
  141. package/dist/execution/guarded-source.js +398 -0
  142. package/dist/execution/json.js +95 -0
  143. package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
  144. package/dist/execution/record.js +55 -0
  145. package/dist/execution/resolved-request.js +730 -0
  146. package/dist/execution/source.js +320 -0
  147. package/dist/indexer/bundle-identity-guard.js +5 -4
  148. package/dist/indexer/db/graph-db.js +33 -0
  149. package/dist/indexer/graph/graph-boost.js +3 -4
  150. package/dist/indexer/graph/graph-extraction.js +562 -373
  151. package/dist/indexer/index-written-assets.js +78 -39
  152. package/dist/indexer/indexer.js +471 -432
  153. package/dist/indexer/installations.js +6 -0
  154. package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
  155. package/dist/indexer/materialize-embeddings.js +155 -0
  156. package/dist/indexer/passes/memory-inference.js +227 -174
  157. package/dist/indexer/passes/metadata.js +263 -118
  158. package/dist/indexer/scan/doc-to-entry.js +7 -10
  159. package/dist/indexer/scan/drain-dir.js +51 -23
  160. package/dist/indexer/search/db-search.js +156 -50
  161. package/dist/indexer/search/fts-query.js +40 -40
  162. package/dist/indexer/search/ranking.js +36 -1
  163. package/dist/indexer/search/search-attribution.js +3 -1
  164. package/dist/indexer/search/search-fields.js +23 -14
  165. package/dist/indexer/search/search-hit-enrichers.js +1 -1
  166. package/dist/indexer/search/search-source.js +7 -16
  167. package/dist/indexer/search/semantic-status.js +10 -1
  168. package/dist/indexer/usage/show-usage.js +105 -0
  169. package/dist/indexer/usage/usage-events.js +7 -2
  170. package/dist/indexer/walk/matchers.js +40 -10
  171. package/dist/indexer/walk/path-resolver.js +5 -2
  172. package/dist/indexer/walk/walker.js +20 -2
  173. package/dist/integrations/agent/builder-shared.js +3 -6
  174. package/dist/integrations/agent/conversation-fallback.js +16 -0
  175. package/dist/integrations/agent/engine-resolution.js +87 -87
  176. package/dist/integrations/agent/execution-cascade.js +566 -0
  177. package/dist/integrations/agent/execution-definitions.js +211 -0
  178. package/dist/integrations/agent/execution-lowering.js +811 -0
  179. package/dist/integrations/agent/execution-preparation.js +67 -0
  180. package/dist/integrations/agent/index.js +0 -2
  181. package/dist/integrations/agent/inline-execution.js +74 -0
  182. package/dist/integrations/agent/model-map.js +515 -0
  183. package/dist/integrations/agent/persona-fallback.js +30 -0
  184. package/dist/integrations/agent/request-lowering.js +186 -0
  185. package/dist/integrations/agent/runner-dispatch.js +230 -37
  186. package/dist/integrations/agent/runner.js +12 -83
  187. package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
  188. package/dist/integrations/harnesses/aider/index.js +0 -1
  189. package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
  190. package/dist/integrations/harnesses/amazonq/index.js +0 -1
  191. package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
  192. package/dist/integrations/harnesses/claude/index.js +1 -5
  193. package/dist/integrations/harnesses/claude/session-log.js +3 -33
  194. package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
  195. package/dist/integrations/harnesses/codex/index.js +0 -1
  196. package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
  197. package/dist/integrations/harnesses/copilot/index.js +0 -1
  198. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
  199. package/dist/integrations/harnesses/gemini/index.js +0 -1
  200. package/dist/integrations/harnesses/index.js +4 -44
  201. package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
  202. package/dist/integrations/harnesses/opencode/index.js +0 -2
  203. package/dist/integrations/harnesses/opencode/session-log.js +14 -204
  204. package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
  205. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
  206. package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
  207. package/dist/integrations/harnesses/openhands/index.js +0 -1
  208. package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
  209. package/dist/integrations/harnesses/pi/index.js +0 -1
  210. package/dist/integrations/harnesses/shared.js +0 -1
  211. package/dist/integrations/harnesses/types.js +1 -3
  212. package/dist/integrations/lockfile.js +82 -79
  213. package/dist/integrations/session-logs/index.js +6 -17
  214. package/dist/integrations/session-logs/provider-base.js +1 -29
  215. package/dist/llm/client.js +10 -5
  216. package/dist/llm/embedder.js +6 -7
  217. package/dist/llm/embedders/local.js +37 -88
  218. package/dist/llm/embedders/types.js +1 -1
  219. package/dist/llm/graph-extract.js +75 -50
  220. package/dist/llm/index-passes.js +43 -5
  221. package/dist/llm/memory-infer.js +8 -6
  222. package/dist/llm/metadata-enhance.js +5 -3
  223. package/dist/llm/structured-call.js +122 -25
  224. package/dist/output/format-exempt.js +1 -1
  225. package/dist/output/render-registry.js +0 -16
  226. package/dist/output/renderers.js +12 -7
  227. package/dist/output/shapes/curate.js +1 -0
  228. package/dist/output/shapes/helpers.js +10 -2
  229. package/dist/output/shapes/passthrough.js +2 -0
  230. package/dist/output/text/command-format.js +31 -33
  231. package/dist/output/text/health-format.js +1 -29
  232. package/dist/output/text/migrate.js +6 -56
  233. package/dist/output/text/proposal-format.js +16 -1
  234. package/dist/output/text/workflow-format.js +16 -0
  235. package/dist/registry/network.js +279 -0
  236. package/dist/registry/pinned-request-helper.js +247 -0
  237. package/dist/registry/pinned-transport.js +717 -0
  238. package/dist/registry/providers/skills-sh.js +18 -6
  239. package/dist/registry/providers/static-index.js +20 -7
  240. package/dist/registry/resolve.js +53 -28
  241. package/dist/scripts/akm-migrate-node.js +19334 -52269
  242. package/dist/scripts/akm-migrate.js +19270 -51612
  243. package/dist/setup/registry-stash-loader.js +64 -20
  244. package/dist/setup/semantic-assets.js +9 -34
  245. package/dist/setup/setup.js +12 -30
  246. package/dist/setup/source-identity.js +17 -0
  247. package/dist/setup/steps/sources.js +36 -15
  248. package/dist/setup/steps/tasks.js +39 -11
  249. package/dist/sources/providers/git-provider.js +3 -3
  250. package/dist/sources/providers/npm.js +2 -2
  251. package/dist/sources/providers/provider-utils.js +4 -3
  252. package/dist/sources/providers/website.js +11 -7
  253. package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
  254. package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
  255. package/dist/sources/website-url.js +73 -0
  256. package/dist/storage/engines/sqlite-migrations.js +81 -26
  257. package/dist/storage/managed-db.js +27 -24
  258. package/dist/storage/repositories/events-repository.js +3 -0
  259. package/dist/storage/repositories/index-connection.js +42 -10
  260. package/dist/storage/repositories/index-entries-repository.js +203 -229
  261. package/dist/storage/repositories/index-entry-mapper.js +8 -12
  262. package/dist/storage/repositories/index-entry-schema.js +255 -0
  263. package/dist/storage/repositories/index-fts-repository.js +64 -71
  264. package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
  265. package/dist/storage/repositories/index-meta-repository.js +0 -11
  266. package/dist/storage/repositories/index-schema.js +74 -350
  267. package/dist/storage/repositories/index-utility-repository.js +12 -17
  268. package/dist/storage/repositories/index-vec-repository.js +56 -7
  269. package/dist/storage/repositories/proposals-repository.js +4 -127
  270. package/dist/storage/repositories/registry-cache.js +2 -1
  271. package/dist/storage/repositories/task-history-repository.js +20 -40
  272. package/dist/storage/repositories/workflow-runs-repository.js +228 -129
  273. package/dist/storage/sqlite-read-snapshot.js +148 -0
  274. package/dist/tasks/backends/cron.js +170 -42
  275. package/dist/tasks/backends/index.js +1 -1
  276. package/dist/tasks/backends/launchd.js +787 -202
  277. package/dist/tasks/backends/schtasks.js +282 -83
  278. package/dist/tasks/embedded.js +7 -7
  279. package/dist/tasks/frozen-script.js +50 -0
  280. package/dist/tasks/resolve-akm-bin.js +5 -1
  281. package/dist/tasks/runner.js +239 -251
  282. package/dist/tasks/runtime-v3.js +281 -0
  283. package/dist/tasks/scheduler-binding.js +272 -0
  284. package/dist/tasks/scheduler-invocation.js +57 -43
  285. package/dist/tasks/scheduler-sync.js +654 -0
  286. package/dist/tasks/source-v3.js +752 -0
  287. package/dist/tasks/standalone-script-entry.js +5 -0
  288. package/dist/tasks/task-id.js +29 -0
  289. package/dist/workflows/authoring/authoring.js +15 -32
  290. package/dist/workflows/exec/dispatch-redaction.js +14 -8
  291. package/dist/workflows/exec/exec-unit.js +7 -28
  292. package/dist/workflows/exec/frozen-judge.js +57 -89
  293. package/dist/workflows/exec/lowering-notices.js +23 -0
  294. package/dist/workflows/exec/native-executor.js +301 -458
  295. package/dist/workflows/exec/param-secrets.js +4 -3
  296. package/dist/workflows/exec/run-workflow.js +26 -32
  297. package/dist/workflows/exec/step-work.js +105 -109
  298. package/dist/workflows/exec/unit-dispatch.js +103 -27
  299. package/dist/workflows/exec/unit-writer.js +3 -3
  300. package/dist/workflows/exec/worktree.js +2 -2
  301. package/dist/workflows/ir/compile.js +86 -72
  302. package/dist/workflows/ir/environment-v4.js +328 -0
  303. package/dist/workflows/ir/freeze-v4.js +122 -0
  304. package/dist/workflows/ir/plan-hash.js +13 -7
  305. package/dist/workflows/ir/schema-v4.js +525 -0
  306. package/dist/workflows/ir/schema.js +25 -284
  307. package/dist/workflows/ir/source-freeze-v4.js +506 -0
  308. package/dist/workflows/parser.js +27 -24
  309. package/dist/workflows/program/schema.js +1 -2
  310. package/dist/workflows/renderer.js +42 -29
  311. package/dist/workflows/resource-limits.js +4 -5
  312. package/dist/workflows/runtime/agent-identity.js +11 -13
  313. package/dist/workflows/runtime/plan-classifier.js +8 -8
  314. package/dist/workflows/runtime/runs.js +27 -43
  315. package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
  316. package/dist/workflows/source-files.js +373 -0
  317. package/dist/workflows/source-ir/compile.js +196 -0
  318. package/dist/workflows/source-ir/github-yaml.js +577 -0
  319. package/dist/workflows/source-ir/ordering.js +38 -0
  320. package/dist/workflows/source-ir/program.js +50 -0
  321. package/dist/workflows/source-ir/result.js +26 -0
  322. package/dist/workflows/source-ir/schema.js +772 -0
  323. package/dist/workflows/source-ir/semantics.js +242 -0
  324. package/dist/workflows/source-ir/uses.js +14 -0
  325. package/docs/README.md +2 -0
  326. package/docs/migration/README.md +3 -1
  327. package/docs/migration/release-notes/0.9.2.md +55 -0
  328. package/docs/migration/release-notes/README.md +5 -0
  329. package/docs/migration/v0.8-to-v0.9.md +76 -1077
  330. package/docs/migration/v0.9.0-troubleshooting.md +104 -516
  331. package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
  332. package/docs/reference/README.md +1 -0
  333. package/docs/reference/cli.md +230 -98
  334. package/docs/reference/configuration.md +159 -36
  335. package/docs/reference/data-and-telemetry.md +19 -1
  336. package/docs/reference/supported-formats.md +23 -3
  337. package/docs/reference/tasks.md +182 -0
  338. package/docs/reference/workflow-schema.md +91 -40
  339. package/docs/reference/workflows.md +33 -6
  340. package/package.json +10 -6
  341. package/schemas/akm-config.json +372 -224
  342. package/schemas/akm-task.json +324 -80
  343. package/schemas/akm-workflow.json +6 -9
  344. package/dist/core/migration-operation.js +0 -75
  345. package/dist/integrations/agent/model-aliases.js +0 -74
  346. package/dist/tasks/parser.js +0 -380
  347. package/dist/tasks/schema.js +0 -123
  348. package/dist/tasks/validator.js +0 -80
  349. package/dist/workflows/ir/freeze.js +0 -320
  350. package/dist/workflows/runtime/document-cache.js +0 -13
@@ -0,0 +1,242 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /** Shared semantic validation for every workflow source-IR producer and decoder. */
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { parseBuiltinCommandAction } from "../../commands/command/builtin-action.js";
8
+ import { validatePortableCommandTemplate } from "../../commands/command/portable-template.js";
9
+ import { bundleRefToString, parseBundleRef } from "../../core/asset/asset-ref.js";
10
+ import { parseSchedule } from "../../tasks/schedule.js";
11
+ import { classifyWorkflowSourceUses } from "./uses.js";
12
+ const TOKEN_SAFE_RUN = /^[A-Za-z0-9_./:@+=,-]+(?: [A-Za-z0-9_./:@+=,-]+)*$/;
13
+ export class WorkflowSourceSemanticError extends Error {
14
+ code;
15
+ constructor(code, message) {
16
+ super(message);
17
+ this.code = code;
18
+ this.name = "WorkflowSourceSemanticError";
19
+ }
20
+ }
21
+ export function canonicalizeWorkflowCron(value) {
22
+ const canonical = value.trim().split(/\s+/).join(" ");
23
+ if (canonical.startsWith("@") || canonical.split(" ").length !== 5) {
24
+ throw new WorkflowSourceSemanticError("invalid-cron", "GitHub schedule cron must use exactly five fields.");
25
+ }
26
+ try {
27
+ parseSchedule(canonical, "cron");
28
+ }
29
+ catch (cause) {
30
+ throw new WorkflowSourceSemanticError("invalid-cron", cause instanceof Error ? cause.message : "Invalid cron schedule.");
31
+ }
32
+ return canonical;
33
+ }
34
+ export function canonicalizeWorkflowRun(value) {
35
+ if (value.includes("${{")) {
36
+ throw new WorkflowSourceSemanticError("unsupported-github-expression", "GitHub expressions and contexts are not supported.");
37
+ }
38
+ if (value.includes("\n") || value.includes("\r")) {
39
+ throw new WorkflowSourceSemanticError("unsafe-run-syntax", "Local run accepts only whitespace-separated safe tokens; shell expansion and operators are unsupported.");
40
+ }
41
+ const canonical = value
42
+ .trim()
43
+ .split(/[ \t]+/)
44
+ .join(" ");
45
+ if (!TOKEN_SAFE_RUN.test(canonical)) {
46
+ throw new WorkflowSourceSemanticError("unsafe-run-syntax", "Local run accepts only whitespace-separated safe tokens; shell expansion and operators are unsupported.");
47
+ }
48
+ return canonical;
49
+ }
50
+ export function canonicalizeWorkflowWorkingDirectory(value, workspaceRoot) {
51
+ if (hasControlCharacter(value)) {
52
+ throw new WorkflowSourceSemanticError("working-directory-control-character", "working-directory may not contain NUL or control characters.");
53
+ }
54
+ if (value === "" || value.trim() === "") {
55
+ throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory must be a non-empty relative contained path.");
56
+ }
57
+ const portable = value.replaceAll("\\", "/");
58
+ const segments = portable.split("/");
59
+ if (path.posix.isAbsolute(portable) ||
60
+ path.win32.isAbsolute(value) ||
61
+ portable.startsWith("~") ||
62
+ segments.some((segment) => segment === "" || segment === "..")) {
63
+ throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory must be relative and contained.");
64
+ }
65
+ const withoutDots = segments.filter((segment) => segment !== ".");
66
+ const canonical = withoutDots.length === 0 ? "." : withoutDots.join("/");
67
+ if (workspaceRoot !== undefined)
68
+ verifyPhysicalContainment(workspaceRoot, canonical);
69
+ return canonical;
70
+ }
71
+ function hasControlCharacter(value) {
72
+ for (const character of value) {
73
+ const codePoint = character.codePointAt(0) ?? 0;
74
+ if (codePoint <= 0x1f || codePoint === 0x7f)
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ export function classifyWorkflowStepUses(value, classifier = classifyWorkflowSourceUses) {
80
+ if (value.includes("${{")) {
81
+ throw new WorkflowSourceSemanticError("unsupported-github-expression", "GitHub expressions are unsupported in uses.");
82
+ }
83
+ if (value.length === 0 || value.trim() !== value || /\s/.test(value)) {
84
+ throw new WorkflowSourceSemanticError("unsupported-uses-target", "uses must be one exact, non-empty executable ref");
85
+ }
86
+ const task = canonicalTaskTarget(value);
87
+ if (task)
88
+ return task;
89
+ let target;
90
+ try {
91
+ target = classifier(value);
92
+ }
93
+ catch (cause) {
94
+ throw usesFailure(value, cause);
95
+ }
96
+ if (target.kind === "github-action") {
97
+ throw new WorkflowSourceSemanticError("remote-action-acquisition-out-of-scope", `Remote action acquisition is out of scope for ${JSON.stringify(value)}.`);
98
+ }
99
+ if (target.kind === "workflow") {
100
+ throw new WorkflowSourceSemanticError("nested-workflow-unsupported", `Nested workflow target ${JSON.stringify(value)} is unsupported in a workflow step.`);
101
+ }
102
+ return target;
103
+ }
104
+ function canonicalTaskTarget(value) {
105
+ try {
106
+ const parsed = parseBundleRef(value);
107
+ if (parsed.fragment !== undefined || bundleRefToString(parsed) !== value)
108
+ return undefined;
109
+ const slash = parsed.conceptId.indexOf("/");
110
+ if (slash < 0 || parsed.conceptId.slice(0, slash) !== "tasks" || parsed.conceptId.length === slash + 1) {
111
+ return undefined;
112
+ }
113
+ return { kind: "task", ref: value };
114
+ }
115
+ catch {
116
+ return undefined;
117
+ }
118
+ }
119
+ /**
120
+ * Validate AKM's built-in command action at the shared source/decoder boundary.
121
+ *
122
+ * Inline YAML actions are portable templates and therefore use WP4's one
123
+ * authoritative template validator. Markdown prose is explicitly `literal`,
124
+ * while a stored ref remains resolution-owned because its template bytes are
125
+ * not available until the later resolver loads the command asset.
126
+ */
127
+ export function validateWorkflowBuiltinCommand(value, mode) {
128
+ let action;
129
+ try {
130
+ action = parseBuiltinCommandAction(value);
131
+ }
132
+ catch (cause) {
133
+ throw new WorkflowSourceSemanticError("builtin-command-inputs", cause instanceof Error ? cause.message : "Invalid akm/command inputs.");
134
+ }
135
+ const expectedMode = action.kind === "stored" ? "stored-ref" : "portable-template";
136
+ const effectiveMode = mode ?? expectedMode;
137
+ if (action.kind === "stored") {
138
+ if (effectiveMode !== "stored-ref") {
139
+ throw new WorkflowSourceSemanticError("builtin-command-inputs", "Stored akm/command refs require commandMode stored-ref.");
140
+ }
141
+ return action;
142
+ }
143
+ if (effectiveMode === "stored-ref") {
144
+ throw new WorkflowSourceSemanticError("builtin-command-inputs", "Inline akm/command content cannot use commandMode stored-ref.");
145
+ }
146
+ if (effectiveMode === "literal") {
147
+ if (action.arguments !== undefined) {
148
+ throw new WorkflowSourceSemanticError("builtin-command-inputs", "Literal akm/command content cannot declare arguments because no substitution occurs.");
149
+ }
150
+ return action;
151
+ }
152
+ try {
153
+ validatePortableCommandTemplate(action.content, "inline workflow command");
154
+ }
155
+ catch (cause) {
156
+ throw new WorkflowSourceSemanticError("builtin-command-inputs", cause instanceof Error ? cause.message : "Invalid portable command template.");
157
+ }
158
+ return action;
159
+ }
160
+ export function rejectNulInArgv(command) {
161
+ if (command.some((argument) => argument.includes("\0"))) {
162
+ throw new WorkflowSourceSemanticError("invalid-exec-argv", "Direct exec argv may not contain NUL bytes.");
163
+ }
164
+ }
165
+ function usesFailure(value, cause) {
166
+ const message = cause instanceof Error ? cause.message : String(cause);
167
+ const code = value.startsWith("docker://")
168
+ ? "docker-action-unsupported"
169
+ : value.startsWith("./") || value.startsWith("../") || value.startsWith("/")
170
+ ? "local-action-path-unsupported"
171
+ : /^(?:[A-Za-z0-9][A-Za-z0-9._-]*\/\/)?agents\//.test(value)
172
+ ? "non-executable-asset-ref"
173
+ : "unsupported-uses-target";
174
+ return new WorkflowSourceSemanticError(code, message);
175
+ }
176
+ function verifyPhysicalContainment(workspaceRoot, relative) {
177
+ let root;
178
+ try {
179
+ root = fs.realpathSync(workspaceRoot);
180
+ }
181
+ catch {
182
+ throw new WorkflowSourceSemanticError("working-directory-unverifiable", "Workspace root cannot be physically verified.");
183
+ }
184
+ const candidate = path.resolve(root, ...relative.split("/"));
185
+ if (!contained(root, candidate)) {
186
+ throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory escapes the workspace.");
187
+ }
188
+ let current = root;
189
+ for (const segment of relative === "." ? [] : relative.split("/")) {
190
+ current = path.join(current, segment);
191
+ try {
192
+ const entry = fs.lstatSync(current);
193
+ if (entry.isSymbolicLink()) {
194
+ let physical;
195
+ try {
196
+ physical = fs.realpathSync(current);
197
+ }
198
+ catch {
199
+ throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory contains a dangling or unresolvable symlink.");
200
+ }
201
+ if (!contained(root, physical)) {
202
+ throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory resolves through a symlink outside the workspace.");
203
+ }
204
+ let target;
205
+ try {
206
+ target = fs.statSync(current);
207
+ }
208
+ catch {
209
+ throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory symlink target cannot be physically verified.");
210
+ }
211
+ if (!target.isDirectory()) {
212
+ throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory must resolve through directories.");
213
+ }
214
+ continue;
215
+ }
216
+ if (!entry.isDirectory()) {
217
+ throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory must resolve through directories.");
218
+ }
219
+ const physical = fs.realpathSync(current);
220
+ if (!contained(root, physical)) {
221
+ throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory resolves through a symlink outside the workspace.");
222
+ }
223
+ }
224
+ catch (cause) {
225
+ if (cause instanceof WorkflowSourceSemanticError)
226
+ throw cause;
227
+ const code = cause?.code;
228
+ if (code === "ENOENT") {
229
+ // A genuinely absent lexical component is allowed at source time; the
230
+ // runtime dispatch boundary revalidates containment when it appears.
231
+ // `lstat` distinguishes this from a dangling symlink, which fails
232
+ // closed above even before its target can appear.
233
+ return;
234
+ }
235
+ throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory cannot be physically verified.");
236
+ }
237
+ }
238
+ }
239
+ function contained(root, candidate) {
240
+ const relative = path.relative(root, candidate);
241
+ return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
242
+ }
@@ -0,0 +1,14 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Workflow source adapters deliberately do not own an executable-ref grammar.
6
+ * `tasks/...` is the one workflow-only target and is recognized by
7
+ * `classifyWorkflowStepUses`; every remaining target delegates here to WP6's
8
+ * canonical task-v3 classifier.
9
+ */
10
+ import { classifyTaskV3Uses } from "../../tasks/source-v3.js";
11
+ /** Canonical non-task classifier used by direct source-IR decoding. */
12
+ export function classifyWorkflowSourceUses(value) {
13
+ return classifyTaskV3Uses(value);
14
+ }
package/docs/README.md CHANGED
@@ -30,6 +30,7 @@ the task needs, and capture what you learn along the way.
30
30
  - [Environment & Secrets](https://github.com/itlackey/akm/blob/main/docs/reference/env-and-secrets.md) -- `akm env` and `akm secret`: exact operations, file modes, and the security guarantee
31
31
  - [Run Workflows](https://github.com/itlackey/akm/blob/main/docs/guides/run-workflows.md) -- Start or continue a run, check on it, resume it, or abandon it
32
32
  - [Scheduling](https://github.com/itlackey/akm/blob/main/docs/guides/scheduling.md) -- Run akm tasks through the OS scheduler (cron / launchd / schtasks) safely
33
+ - [Migrate to 0.9.2](migration/v0.9.1-to-v0.9.2.md) -- Convert task-v2 sources safely and understand workflow resume compatibility
33
34
  - [Improve the Library](https://github.com/itlackey/akm/blob/main/docs/guides/improve-the-library.md) -- Feedback, history, and proposals -- how evidence turns into reviewable changes
34
35
  - Recipes: [Turn a Website into a Searchable Bundle](https://github.com/itlackey/akm/blob/main/docs/guides/recipes/website-source.md), [Headless Install](https://github.com/itlackey/akm/blob/main/docs/guides/recipes/headless-install.md)
35
36
 
@@ -55,6 +56,7 @@ Working on akm itself, not just using it.
55
56
  - [CLI](reference/cli.md) -- All `akm` commands and flags
56
57
  - [Configuration](reference/configuration.md) -- Engines, strategies, bundles, and settings
57
58
  - [Supported Formats](reference/supported-formats.md) -- Every bundle format akm recognizes, its detection marker, and current read/write support
59
+ - [Tasks](reference/tasks.md) -- Task-v3 files, targets, triggers, and fail-closed migration
58
60
  - [Asset Types](https://github.com/itlackey/akm/blob/main/docs/reference/asset-types.md) -- The capability taxonomy, directory conventions, and per-type examples
59
61
  - [Refs](https://github.com/itlackey/akm/blob/main/docs/reference/refs.md) -- The ref grammar `akm search` emits and `akm show` consumes
60
62
  - [Memory](https://github.com/itlackey/akm/blob/main/docs/reference/memory.md) -- The `memory` asset type: capture, belief states, and derived memories
@@ -2,7 +2,9 @@
2
2
 
3
3
  Upgrade guides and per-release migration notes.
4
4
 
5
- - [v0.8 -> v0.9 migration guide](v0.8-to-v0.9.md) -- Current-cycle breaking changes
5
+ - [v0.9.1 -> v0.9.2 migration guide](v0.9.1-to-v0.9.2.md) -- Task-v2 to task-v3 conversion, the single durable-v4 workflow boundary, and release behavior changes
6
+ - [v0.9.2 release note](release-notes/0.9.2.md) -- Self-contained terminal upgrade summary shipped for `akm help migrate 0.9.2`
7
+ - [v0.8 -> current v0.9 migration guide](v0.8-to-v0.9.md) -- Package upgrade with fresh current config/state and explicit task conversion
6
8
  - [v0.7 -> v0.8 migration guide](v0.7-to-v0.8.md) -- Task schema and 0.8-era changes
7
9
  - [v0.5 -> v0.6 migration guide](https://github.com/itlackey/akm/blob/main/docs/migration/v0.5-to-v0.6.md) -- Terminology cut, registry schema v3, publisher changes
8
10
  - [Release notes](release-notes/) -- The short per-release notes `akm help migrate <version>` prints (bundled with the npm package)
@@ -0,0 +1,55 @@
1
+ Migration notes for akm v0.9.2
2
+
3
+ Exact-prefix additive `state.db` upgrades remain automatic. The released
4
+ historical migration 018 is classified separately because it removes retired
5
+ dead-lane state: ordinary commands stop before it. Run `akm upgrade --force`;
6
+ after executable replacement AKM writes and verifies a sibling
7
+ `state.db.pre-018-drop-dead-lane-schema.<UTC-digits>.<UUID>.bak` snapshot, then
8
+ applies the immutable migration. The exact ledger recheck, snapshot, and 018
9
+ transaction share one SQLite writer-exclusion window. There is no general
10
+ database migration command.
11
+
12
+ A newly created `state.db` still bootstraps automatically, but only when this
13
+ invocation atomically created and retained ownership of that exact inode. An
14
+ already-existing file with no applied migration IDs is not fresh, whether its
15
+ `schema_migrations` table is absent or empty: ordinary commands reject it
16
+ without writing. `akm upgrade --force` first verifies a
17
+ descriptor-bound `state.db.pre-001-initial-schema.<UTC-digits>.<UUID>.bak`
18
+ snapshot. The same writer-exclusion transaction then initializes the ledger and
19
+ applies migrations 001–002, so an old-schema writer cannot commit data between
20
+ the recovery snapshot and migration 002's rebuild. Snapshot readers and targets
21
+ are bound to their held inodes, not swappable pathnames. A failed snapshot path
22
+ is reported and never removed by cleanup code.
23
+
24
+ Task sources now use Task v3. Normal execution rejects task-v2 files; preview
25
+ the repository-wide conversion with `akm migrate apply --dry-run`, review every
26
+ `changed`, `skipped`, or `blocked` result, then run `akm migrate apply`. The
27
+ migrator validates the replacement before it backs up and replaces a source,
28
+ and ambiguous argv arrays remain blocked for manual review.
29
+
30
+ Workflows now accept peer Markdown (`.md`) and GitHub-shaped YAML (`.yml`)
31
+ sources through source IR v1. Runs freeze durable plan v4, the only executable
32
+ plan format. Pre-v4 stored plans are rejected; start a new run from current
33
+ source. A v4 resume does not re-read the authored workflow, configuration, or
34
+ asset index. Scheduled fires are new starts, so they read the current source
35
+ and create a fresh v4 freeze. V4 also rejects `inherit_env`; use exact named
36
+ environment bindings and `pass_env` names instead.
37
+
38
+ `akm command run --dry-run` performs authorization and adapter lowering but
39
+ does not dispatch or materialize credentials. It writes no authored source or
40
+ durable state and records no usage, events, or accounting. Safe provenance and
41
+ lowering notices omit resolved, prompt, command, environment, and credential
42
+ values. `--verbose` writes those safe diagnostics to stderr without changing
43
+ the command result on stdout. `akm health` adds offline
44
+ `selected-model-aliases` and `configured-engines` advisories; their evidence
45
+ does not disclose endpoint values, exact model IDs, credential values, or
46
+ provider output.
47
+
48
+ `improve.strategies.<name>.processes.triage.judgment` now accepts a boolean or
49
+ an object. Set `judgment: false` to disable the tier explicitly. A newly
50
+ authored object defaults to enabled, while unknown object keys are rejected.
51
+ The standalone proposal command's `--judgment` option remains an explicit
52
+ invocation override and does not rewrite strategy configuration.
53
+
54
+ See the [long-form guide](../v0.9.1-to-v0.9.2.md) for complete task examples,
55
+ workflow boundaries, compatibility details, and upgrade checks.
@@ -5,6 +5,11 @@ focused migration note that `akm help migrate <version>` prints to the
5
5
  terminal. The longform cross-release guides (e.g. `v0.5-to-v0.6.md`)
6
6
  live one level up in `docs/migration/`.
7
7
 
8
+ ## Available notes
9
+
10
+ - [0.9.2](0.9.2.md) — task v3, workflow source IR v1 and durable v4,
11
+ command diagnostics, and strategy judgment migration
12
+
8
13
  ## Adding notes for a new release
9
14
 
10
15
  1. Create `<version>.md` in this directory (e.g. `0.7.0.md`).