akm-cli 0.9.0-rc.8 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -2,7 +2,7 @@
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
- * schtasks.exe backend for `akm tasks` (Windows default).
5
+ * schtasks.exe backend for `akm task` (Windows default).
6
6
  *
7
7
  * Each task is registered under the `\akm\` Task Scheduler folder so the
8
8
  * backend never touches user-managed tasks. The full task definition is
@@ -37,7 +37,7 @@ import { ConfigError } from "../../core/errors.js";
37
37
  import { getTaskLogDir } from "../../core/paths.js";
38
38
  import { resolveAkmInvocation } from "../resolve-akm-bin.js";
39
39
  import { parseSchedule, translateToSchtasks } from "../schedule.js";
40
- import { buildScheduledTaskInvocation, resolveScheduledTaskContext, } from "../scheduler-invocation.js";
40
+ import { buildScheduledTaskInvocation, parseScheduledTaskArgv, resolveScheduledTaskContext, schedulerContextDescriptor, schedulerContextPath, } from "../scheduler-invocation.js";
41
41
  import { escapeXml, nodeExec, nodeFs, normalizeXmlForUtf16File, runOrThrow, } from "./exec-utils.js";
42
42
  export const DEFAULT_FOLDER_PREFIX = "\\akm\\";
43
43
  const SIGNATURE_PREFIX = "akm:v1:";
@@ -48,12 +48,19 @@ export function SCHTASKS_BACKEND(options = {}) {
48
48
  const logDir = options.logDir ?? getTaskLogDir();
49
49
  const folder = options.folderPrefix ?? DEFAULT_FOLDER_PREFIX;
50
50
  const scheduledContext = options.scheduledContext ?? resolveScheduledTaskContext();
51
+ const defaultContextPath = schedulerContextPath(schedulerContextDescriptor(scheduledContext, process.env.PATH ?? ""));
51
52
  const userSid = options.userSid ?? resolveCurrentUserSid(exec);
52
53
  const taskName = (id) => `${folder}${id}`;
53
54
  return {
54
55
  name: "schtasks",
55
- install(task) {
56
- const xml = normalizeXmlForUtf16File(buildSchtasksXml(task, akmArgv, logDir, { folderPrefix: folder, scheduledContext, userSid }));
56
+ install(task, opts) {
57
+ const xml = normalizeXmlForUtf16File(buildSchtasksXml(task, akmArgv, logDir, {
58
+ folderPrefix: folder,
59
+ contextPath: opts?.contextPath ?? defaultContextPath,
60
+ userSid,
61
+ binding: [...(opts?.binding ?? akmArgv)],
62
+ ...(opts?.target !== undefined ? { target: opts.target } : {}),
63
+ }));
57
64
  const query = runOrThrow(exec, ["schtasks", "/Query", "/TN", taskName(task.id), "/XML"], {
58
65
  isOk: (r) => r.status === 0 || isMissingTaskResult(r),
59
66
  message: (r) => `schtasks /Query failed (exit ${r.status}): ${r.stderr || r.stdout || "no output"}.`,
@@ -146,26 +153,142 @@ export function SCHTASKS_BACKEND(options = {}) {
146
153
  ids.push(name.slice(folder.length));
147
154
  }
148
155
  }
149
- return ids.map((id) => {
156
+ const refs = [];
157
+ for (const id of ids) {
150
158
  const query = runOrThrow(exec, ["schtasks", "/Query", "/TN", taskName(id), "/XML"], {
151
159
  message: (r) => `schtasks /Query /XML for "${taskName(id)}" failed (exit ${r.status}): ${r.stderr || r.stdout || "no output"}.`,
152
160
  });
153
161
  const signature = installedSignature(query.stdout);
154
- return signature === undefined ? { id } : { id, signature };
162
+ const installed = extractSchtasksInvocation(query.stdout);
163
+ // An invocation that no longer parses (e.g. a pre-0.9 `tasks run`
164
+ // entry surviving the scheduler-ABI respelling) is an orphan of its
165
+ // marker id, not a hard failure: omit it so `akmTasksSync` treats the
166
+ // id as "not present" and reinstalls it from the current task file.
167
+ if (!installed)
168
+ continue;
169
+ refs.push({
170
+ id,
171
+ ...(signature !== undefined ? { signature } : {}),
172
+ ...(installed.target !== undefined ? { target: installed.target } : {}),
173
+ binding: installed.binding,
174
+ contextPath: installed.contextPath,
175
+ });
176
+ }
177
+ return refs;
178
+ },
179
+ listForRebind() {
180
+ const r = runOrThrow(exec, ["schtasks", "/Query", "/FO", "CSV", "/NH"], {
181
+ message: (res) => `schtasks /Query failed (exit ${res.status}): ${res.stderr || res.stdout || "no output"}.`,
155
182
  });
183
+ const refs = [];
184
+ for (const line of (r.stdout ?? "").split(/\r?\n/)) {
185
+ const match = line.match(/^"([^"]+)",/);
186
+ const name = match?.[1];
187
+ if (!name?.startsWith(folder))
188
+ continue;
189
+ const id = name.slice(folder.length);
190
+ const query = runOrThrow(exec, ["schtasks", "/Query", "/TN", taskName(id), "/XML"], {
191
+ message: (result) => `schtasks /Query /XML for "${taskName(id)}" failed (exit ${result.status}): ${result.stderr || result.stdout || "no output"}.`,
192
+ });
193
+ const signature = installedSignature(query.stdout);
194
+ const installed = extractSchtasksInvocation(query.stdout);
195
+ refs.push({
196
+ id,
197
+ ...(signature !== undefined ? { signature } : {}),
198
+ ...(installed?.target !== undefined ? { target: installed.target } : {}),
199
+ });
200
+ }
201
+ return refs;
156
202
  },
157
- expectedSignature(task) {
158
- const signature = taskXmlSignature(buildSchtasksXml(task, akmArgv, logDir, { folderPrefix: folder, scheduledContext, userSid }));
203
+ expectedSignature(task, opts) {
204
+ const signature = taskXmlSignature(buildSchtasksXml(task, akmArgv, logDir, {
205
+ folderPrefix: folder,
206
+ contextPath: opts?.contextPath ?? defaultContextPath,
207
+ userSid,
208
+ binding: [...(opts?.binding ?? akmArgv)],
209
+ ...(opts?.target !== undefined ? { target: opts.target } : {}),
210
+ }));
159
211
  if (signature === undefined)
160
212
  throw new Error("Failed to fingerprint generated Task Scheduler XML.");
161
213
  return signature;
162
214
  },
163
215
  };
164
216
  }
217
+ /**
218
+ * Recover the bundle name embedded as a `--bundle <bundle>` pair in the
219
+ * PowerShell `<Arguments>` of an installed Task Scheduler definition. Returns
220
+ * undefined for the primary/default form.
221
+ */
222
+ export function extractSchtasksTarget(xml) {
223
+ return extractSchtasksInvocation(xml)?.target;
224
+ }
225
+ export function extractSchtasksInvocation(xml) {
226
+ const argsElement = xml.match(/<(?:[\w.-]+:)?Arguments>([\s\S]*?)<\/(?:[\w.-]+:)?Arguments>/i);
227
+ if (!argsElement)
228
+ return undefined;
229
+ const commandLine = decodeXml(argsElement[1]);
230
+ const invocationStart = findPowerShellInvocationOperator(commandLine);
231
+ if (invocationStart === undefined)
232
+ return undefined;
233
+ return parseScheduledTaskArgv(parsePowerShellSingleQuotedArgs(commandLine, invocationStart + 1));
234
+ }
235
+ function findPowerShellInvocationOperator(script) {
236
+ let inSingleQuote = false;
237
+ for (let index = 0; index < script.length; index += 1) {
238
+ const char = script[index];
239
+ if (char === "'") {
240
+ if (inSingleQuote && script[index + 1] === "'") {
241
+ index += 1;
242
+ }
243
+ else {
244
+ inSingleQuote = !inSingleQuote;
245
+ }
246
+ continue;
247
+ }
248
+ if (!inSingleQuote && char === "&" && /\s/.test(script[index + 1] ?? ""))
249
+ return index;
250
+ }
251
+ return undefined;
252
+ }
253
+ function parsePowerShellSingleQuotedArgs(script, start) {
254
+ const argv = [];
255
+ let index = start;
256
+ while (index < script.length) {
257
+ while (/\s/.test(script[index] ?? ""))
258
+ index += 1;
259
+ if (script[index] === ";" || script[index] === '"' || index >= script.length)
260
+ break;
261
+ if (script[index] !== "'")
262
+ return [];
263
+ index += 1;
264
+ let value = "";
265
+ let closed = false;
266
+ while (index < script.length) {
267
+ const char = script[index];
268
+ if (char !== "'") {
269
+ value += char;
270
+ index += 1;
271
+ continue;
272
+ }
273
+ if (script[index + 1] === "'") {
274
+ value += "'";
275
+ index += 2;
276
+ continue;
277
+ }
278
+ index += 1;
279
+ closed = true;
280
+ break;
281
+ }
282
+ if (!closed)
283
+ return [];
284
+ argv.push(value);
285
+ }
286
+ return argv;
287
+ }
165
288
  export function buildSchtasksXml(task, akmArgv, logDir, options) {
166
289
  const folder = options.folderPrefix ?? DEFAULT_FOLDER_PREFIX;
167
290
  const now = options.now ? options.now() : new Date();
168
- const definition = buildSchtasksDefinition(task, akmArgv, logDir, folder, options.scheduledContext, options.userSid);
291
+ const definition = buildSchtasksDefinition(task, options.binding ?? akmArgv, logDir, folder, options.contextPath, options.userSid, options.target);
169
292
  const triggerXml = renderSchtasksTrigger(definition.trigger, now);
170
293
  return schtasksTemplate
171
294
  .replaceAll("{{TASK_ID}}", escapeXml(task.id))
@@ -178,15 +301,12 @@ export function buildSchtasksXml(task, akmArgv, logDir, options) {
178
301
  .replace("{{ARGS}}", escapeXml(definition.args))
179
302
  .replace("{{LOG_PATH}}", escapeXml(definition.logPath));
180
303
  }
181
- function buildSchtasksDefinition(task, akmArgv, logDir, folder, scheduledContext, userSid) {
304
+ function buildSchtasksDefinition(task, akmArgv, logDir, folder, contextPath, userSid, target) {
182
305
  const spec = parseSchedule(task.schedule, "schtasks");
183
306
  const trigger = translateToSchtasks(spec);
184
- const invocation = buildScheduledTaskInvocation(akmArgv, task.id, scheduledContext);
185
- const environment = Object.entries(invocation.environment)
186
- .map(([key, value]) => `$env:${key}=${quotePowerShell(value)}`)
187
- .join("; ");
307
+ const invocation = buildScheduledTaskInvocation(akmArgv, task.id, contextPath, target);
188
308
  const invoke = `& ${invocation.argv.map((arg) => quotePowerShell(arg)).join(" ")}`;
189
- const script = `${environment}; ${invoke}; exit $LASTEXITCODE`;
309
+ const script = `${invoke}; exit $LASTEXITCODE`;
190
310
  const command = "powershell.exe";
191
311
  const args = ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", script].map(quoteArg).join(" ");
192
312
  const logPath = path.join(logDir, `${task.id}.log`);
@@ -2,14 +2,18 @@
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
- * Embedded core task templates.
5
+ * Embedded task templates.
6
6
  *
7
- * A curated set of read-only YAML task templates ships inside the akm binary
8
- * under `src/assets/tasks/core/`. They are resolved at runtime via
7
+ * Curated sets of read-only YAML task templates ship inside the akm binary
8
+ * under `src/assets/tasks/<category>/` `core/` (general-purpose maintenance)
9
+ * and `improve/` (the maintainer-oriented multi-cadence improve schedule,
10
+ * folded in from the retired `registerDefaultTasks`/`akm tasks init` path in
11
+ * 0.9, S6). Every category subdirectory is enumerated the same way; adding a
12
+ * new one needs no code change here. Templates are resolved at runtime via
9
13
  * `import.meta.dir` (mirroring `SKELETON_DIR` in
10
14
  * src/commands/stash-skeleton.ts) and are NOT written to any stash at
11
- * install/init time — the `akm setup` wizard copies a template into the
12
- * primary stash only when the user opts in (copy-on-enable).
15
+ * install time — the `akm setup` wizard copies a template into the primary
16
+ * stash only when the user opts in (copy-on-enable).
13
17
  *
14
18
  * Each entry exposes the parsed `command`, `schedule`, and `description`
15
19
  * alongside the raw `yaml`, so the wizard can both render a choice and write
@@ -17,57 +21,69 @@
17
21
  */
18
22
  import fs from "node:fs";
19
23
  import path from "node:path";
20
- import { parse as yamlParse } from "yaml";
21
24
  import { getDirname } from "../runtime.js";
22
- /** Directory holding the bundled core task templates. */
23
- const CORE_TASKS_DIR = path.join(getDirname(import.meta.url), "../assets/tasks/core");
25
+ import { parseTaskDocument } from "./parser.js";
26
+ /** Directory holding the bundled task template categories. */
27
+ const TASKS_ASSETS_DIR = path.join(getDirname(import.meta.url), "../assets/tasks");
24
28
  /**
25
- * Enumerate the embedded core task templates from the bundled assets
26
- * directory. Sorted by id for deterministic ordering. Returns an empty array
27
- * if the directory is missing (defensive — a build without assets should not
28
- * crash the wizard).
29
+ * Enumerate the embedded task templates from every category subdirectory of
30
+ * the bundled assets directory. Sorted by category then id for deterministic
31
+ * ordering. Returns an empty array if the directory is missing (defensive —
32
+ * a build without assets should not crash the wizard).
29
33
  */
30
34
  export function listEmbeddedTasks() {
31
- let entries;
35
+ let categories;
32
36
  try {
33
- entries = fs.readdirSync(CORE_TASKS_DIR);
37
+ categories = fs
38
+ .readdirSync(TASKS_ASSETS_DIR, { withFileTypes: true })
39
+ .filter((entry) => entry.isDirectory())
40
+ .map((entry) => entry.name)
41
+ .sort();
34
42
  }
35
43
  catch {
36
44
  return [];
37
45
  }
38
46
  const tasks = [];
39
- for (const entry of entries.sort()) {
40
- if (!entry.endsWith(".yml"))
41
- continue;
42
- const id = entry.slice(0, -4);
43
- const filePath = path.join(CORE_TASKS_DIR, entry);
44
- let yaml;
47
+ for (const category of categories) {
48
+ const categoryDir = path.join(TASKS_ASSETS_DIR, category);
49
+ let entries;
45
50
  try {
46
- yaml = fs.readFileSync(filePath, "utf8");
51
+ entries = fs.readdirSync(categoryDir);
47
52
  }
48
53
  catch {
49
54
  continue;
50
55
  }
51
- let doc;
52
- try {
53
- doc = yamlParse(yaml) ?? {};
54
- }
55
- catch {
56
- continue;
56
+ for (const entry of entries.sort()) {
57
+ if (!entry.endsWith(".yml"))
58
+ continue;
59
+ const id = entry.slice(0, -4);
60
+ const filePath = path.join(categoryDir, entry);
61
+ let yaml;
62
+ try {
63
+ yaml = fs.readFileSync(filePath, "utf8");
64
+ }
65
+ catch {
66
+ continue;
67
+ }
68
+ let task;
69
+ try {
70
+ task = parseTaskDocument({ yaml, filePath, id });
71
+ }
72
+ catch {
73
+ continue;
74
+ }
75
+ if (task.target.kind !== "command")
76
+ continue;
77
+ tasks.push({
78
+ id,
79
+ label: `${category}/${id}`,
80
+ command: task.target.cmd.join(" "),
81
+ schedule: task.schedule,
82
+ description: task.description ?? "",
83
+ enabled: task.enabled,
84
+ yaml,
85
+ });
57
86
  }
58
- const command = typeof doc.command === "string" ? doc.command : "";
59
- const schedule = typeof doc.schedule === "string" ? doc.schedule : "";
60
- const description = typeof doc.description === "string" ? doc.description : "";
61
- const enabled = doc.enabled !== false;
62
- tasks.push({
63
- id,
64
- label: `core/${id}`,
65
- command,
66
- schedule,
67
- description,
68
- enabled,
69
- yaml,
70
- });
71
87
  }
72
88
  return tasks;
73
89
  }
@@ -13,7 +13,7 @@
13
13
  * params:
14
14
  * region: us-east-1
15
15
  * # ...or:
16
- * prompt: agent:my-agent # asset ref
16
+ * prompt: agents/my-agent # asset ref
17
17
  * # ...or:
18
18
  * prompt: ./prompts/my-prompt.md # relative file path
19
19
  * # ...or:
@@ -21,7 +21,7 @@
21
21
  * Do the thing.
22
22
  * And the other thing.
23
23
  * # ...or:
24
- * command: akm improve --auto-accept=90 --limit 25
24
+ * command: akm improve --strategy quick --limit 25
25
25
  * enabled: true # default true
26
26
  * name: Daily backup
27
27
  * description: …
@@ -35,11 +35,9 @@
35
35
  */
36
36
  import path from "node:path";
37
37
  import { parse as parseYaml } from "yaml";
38
- import { stashDirFor } from "../core/asset/asset-placement.js";
39
38
  import { isFullRefInput } from "../core/asset/resolve-ref.js";
40
39
  import { UsageError } from "../core/errors.js";
41
40
  import { formatExtraParamsIssue, validateExtraParams } from "../core/extra-params.js";
42
- import { findBareAkmExecutableIndex } from "./command-executable.js";
43
41
  import { TASK_SCHEMA_VERSION } from "./schema.js";
44
42
  import { validateTaskId } from "./task-id.js";
45
43
  export function parseTaskDocument(input) {
@@ -58,9 +56,6 @@ export function parseTaskDocument(input) {
58
56
  throw err;
59
57
  throw new UsageError(`Task "${id}" has invalid YAML: ${err instanceof Error ? err.message : String(err)}. File: ${filePath}`, "INVALID_FLAG_VALUE");
60
58
  }
61
- const legacy = data.version === undefined || data.version === 1;
62
- if (legacy)
63
- data = normalizeV1Task(data, filePath);
64
59
  requireVersion(data, id, filePath);
65
60
  rejectUnknownKeys(data, id, filePath);
66
61
  const schedule = requireString(data.schedule, "schedule", filePath);
@@ -97,9 +92,7 @@ export function parseTaskDocument(input) {
97
92
  }
98
93
  else if (hasCommand) {
99
94
  rejectTargetFields(data, ["timeoutMs"], id, filePath);
100
- const parsedCommand = readCommand(data.command, filePath, id);
101
- const cmd = legacy ? normalizeV1Command(parsedCommand) : parsedCommand;
102
- target = { kind: "command", cmd };
95
+ target = { kind: "command", cmd: readCommand(data.command, filePath, id) };
103
96
  }
104
97
  else {
105
98
  rejectTargetFields(data, ["engine", "model", "timeoutMs", "llm"], id, filePath);
@@ -109,7 +102,7 @@ export function parseTaskDocument(input) {
109
102
  }
110
103
  const engine = optionalString(data.engine, "engine", filePath);
111
104
  const model = optionalString(data.model, "model", filePath);
112
- const timeoutMs = readTimeout(data.timeoutMs, filePath, legacy);
105
+ const timeoutMs = readTimeout(data.timeoutMs, filePath);
113
106
  const llm = readLlmOverrides(data.llm, filePath);
114
107
  target = {
115
108
  kind: "prompt",
@@ -120,7 +113,7 @@ export function parseTaskDocument(input) {
120
113
  ...(llm ? { llm } : {}),
121
114
  };
122
115
  }
123
- const timeoutMs = hasCommand ? readTimeout(data.timeoutMs, filePath, legacy) : undefined;
116
+ const timeoutMs = hasCommand ? readTimeout(data.timeoutMs, filePath) : undefined;
124
117
  return {
125
118
  version: TASK_SCHEMA_VERSION,
126
119
  schemaVersion: TASK_SCHEMA_VERSION,
@@ -154,133 +147,6 @@ const TASK_KEYS = new Set([
154
147
  "llm",
155
148
  ]);
156
149
  const SHARED_KEYS = new Set(["version", "name", "description", "when_to_use", "tags", "schedule", "enabled"]);
157
- /** Lower the complete permissive 0.8 task shape into the strict v2 reader shape. */
158
- function normalizeV1Task(data, filePath) {
159
- const normalized = { version: TASK_SCHEMA_VERSION };
160
- for (const key of ["schedule", "workflow", "prompt", "command", "name", "description", "when_to_use"]) {
161
- const value = data[key];
162
- if (value === undefined || value === null)
163
- continue;
164
- if (key === "command" && Array.isArray(value)) {
165
- normalized[key] = value.filter((part) => typeof part === "string" && part.trim().length > 0);
166
- }
167
- else if (key === "command") {
168
- normalized[key] = value;
169
- }
170
- else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
171
- normalized[key] = String(value).trim();
172
- }
173
- else {
174
- normalized[key] = value;
175
- }
176
- }
177
- normalized.enabled = data.enabled === undefined ? true : data.enabled === true;
178
- if (typeof data.tags === "string") {
179
- normalized.tags = data.tags
180
- .split(/[\s,]+/)
181
- .map((tag) => tag.trim())
182
- .filter(Boolean);
183
- }
184
- else if (Array.isArray(data.tags)) {
185
- normalized.tags = data.tags.filter((tag) => typeof tag === "string" && tag.trim().length > 0);
186
- }
187
- const hasWorkflow = "workflow" in data && data.workflow !== "" && data.workflow != null;
188
- const hasPrompt = "prompt" in data && data.prompt !== "" && data.prompt != null;
189
- if (hasWorkflow && data.params && typeof data.params === "object" && !Array.isArray(data.params)) {
190
- normalized.params = data.params;
191
- }
192
- else if (hasWorkflow && typeof data.params === "string" && data.params.trim()) {
193
- try {
194
- const params = JSON.parse(data.params);
195
- if (params && typeof params === "object" && !Array.isArray(params))
196
- normalized.params = params;
197
- else
198
- normalized.params = data.params;
199
- }
200
- catch {
201
- normalized.params = data.params;
202
- }
203
- }
204
- if (hasPrompt && data.profile !== undefined && data.profile !== null) {
205
- const profile = legacyString(data.profile);
206
- if (profile === undefined) {
207
- throw new UsageError(`Key "profile" must be a string. File: ${filePath}`, "INVALID_FLAG_VALUE");
208
- }
209
- if (profile)
210
- normalized.engine = profile;
211
- }
212
- if (!hasWorkflow && "timeoutMs" in data) {
213
- const timeout = data.timeoutMs;
214
- if (timeout === null || timeout === "null" || timeout === 0 || (typeof timeout === "number" && timeout < 0)) {
215
- normalized.timeoutMs = null;
216
- }
217
- else if (typeof timeout === "number" && timeout > 0) {
218
- normalized.timeoutMs = timeout;
219
- }
220
- }
221
- return normalized;
222
- }
223
- function legacyString(value) {
224
- if (value === undefined || value === null)
225
- return undefined;
226
- if (typeof value === "string")
227
- return value.trim();
228
- if (typeof value === "number" || typeof value === "boolean")
229
- return String(value);
230
- return undefined;
231
- }
232
- /** Rewrite only the removed AKM spelling; arbitrary command arguments remain untouched. */
233
- function normalizeV1Command(cmd) {
234
- const akmIndex = findBareAkmExecutableIndex(cmd);
235
- if (akmIndex === undefined)
236
- return cmd;
237
- const improveIndex = findImproveSubcommandIndex(cmd, akmIndex);
238
- if (improveIndex === undefined)
239
- return cmd;
240
- return cmd.map((part, index) => {
241
- if (index <= improveIndex)
242
- return part;
243
- if (part === "--profile")
244
- return "--strategy";
245
- if (part.startsWith("--profile="))
246
- return `--strategy=${part.slice("--profile=".length)}`;
247
- return part;
248
- });
249
- }
250
- const AKM_GLOBAL_BOOLEAN_OPTIONS = new Set([
251
- "--quiet",
252
- "-q",
253
- "--verbose",
254
- "--no-quiet",
255
- "--no-verbose",
256
- "--quiet=false",
257
- "--verbose=false",
258
- ]);
259
- const AKM_GLOBAL_VALUE_OPTIONS = new Set(["--format", "--output", "--detail", "--shape"]);
260
- function findImproveSubcommandIndex(cmd, akmIndex) {
261
- let index = akmIndex + 1;
262
- while (index < cmd.length) {
263
- const part = cmd[index];
264
- if (part === "improve")
265
- return index;
266
- if (AKM_GLOBAL_BOOLEAN_OPTIONS.has(part)) {
267
- index += 1;
268
- continue;
269
- }
270
- if (AKM_GLOBAL_VALUE_OPTIONS.has(part)) {
271
- if (index + 1 >= cmd.length)
272
- return undefined;
273
- index += 2;
274
- continue;
275
- }
276
- if ([...AKM_GLOBAL_VALUE_OPTIONS].some((option) => part.startsWith(`${option}=`) && part.length > option.length + 1)) {
277
- index += 1;
278
- continue;
279
- }
280
- return undefined;
281
- }
282
- return undefined;
283
- }
284
150
  function requireVersion(data, id, filePath) {
285
151
  if (data.version === TASK_SCHEMA_VERSION)
286
152
  return;
@@ -305,8 +171,7 @@ function rejectTargetFields(data, allowed, id, filePath) {
305
171
  * • "[bundle//]<subdir>/<name>" (asset ref) → asset
306
172
  * • "./foo.md", "../foo.md", "/abs" → file
307
173
  * • "C:\\abs" (Windows absolute) → file
308
- * • "<type>:<name>" (retired colon grammar) typed UsageError
309
- * • anything else (incl. block scalars) → inline text
174
+ * • anything else (including colon text and block scalars) inline text
310
175
  */
311
176
  function resolvePromptSource(raw, filePath, id) {
312
177
  const trimmed = raw.trim();
@@ -326,19 +191,6 @@ function resolvePromptSource(raw, filePath, id) {
326
191
  if (isFullRefInput(trimmed)) {
327
192
  return { kind: "asset", ref: trimmed };
328
193
  }
329
- // The pre-0.9.0 `type:name` colon grammar is retired (D-R3, ref-grammar
330
- // decision). Reject it with a typed error naming the canonical form rather
331
- // than silently degrading to inline text — mirrors `parseTaskRef`'s rejection
332
- // of `task:<id>`.
333
- const legacyColon = /^([a-z][a-z0-9_-]*):([^\s]+)/i.exec(trimmed);
334
- if (legacyColon) {
335
- const typeTok = legacyColon[1] ?? "";
336
- const name = legacyColon[2] ?? "";
337
- const subdir = stashDirFor(typeTok);
338
- const canonical = subdir ? `${subdir}/${name}` : `<stash-subdir>/${name}`;
339
- throw new UsageError(`Task "${id}" prompt uses the removed \`type:name\` ref grammar ("${trimmed}") — ` +
340
- `use the canonical asset ref \`${canonical}\`. File: ${filePath}`, "INVALID_FLAG_VALUE");
341
- }
342
194
  return { kind: "inline", text: trimmed };
343
195
  }
344
196
  function optionalString(value, key, filePath) {
@@ -401,13 +253,11 @@ function readParams(value, filePath) {
401
253
  }
402
254
  throw new UsageError(`Key "params" must be a mapping. File: ${filePath}`, "INVALID_FLAG_VALUE");
403
255
  }
404
- function readTimeout(value, filePath, legacy = false) {
256
+ function readTimeout(value, filePath) {
405
257
  if (value === undefined)
406
258
  return undefined;
407
259
  if (value === null)
408
260
  return null;
409
- if (legacy && typeof value === "number" && Number.isFinite(value) && value > 0)
410
- return value;
411
261
  if (typeof value === "number" && Number.isInteger(value) && value > 0)
412
262
  return value;
413
263
  throw new UsageError(`Key "timeoutMs" must be a positive integer or null. File: ${filePath}`, "INVALID_FLAG_VALUE");