akm-cli 0.9.0-rc.9 → 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 +95 -55
  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 +25 -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 +88 -7
  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 -1878
  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 -1231
  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 -257
  424. package/dist/migrate/legacy/content-migration.js +0 -350
  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 -80
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -278
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -845
  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
@@ -1,35 +1,197 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { createHash } from "node:crypto";
5
+ import fs from "node:fs";
4
6
  import path from "node:path";
5
7
  import { resolveStashDir } from "../core/common.js";
6
8
  import { ConfigError } from "../core/errors.js";
7
- import { getCacheDir, getConfigDir, getDataDir } from "../core/paths.js";
9
+ import { getCacheDir, getConfigDir, getDataDir, getTaskContextDir } from "../core/paths.js";
8
10
  export const SCHEDULED_TASK_CONTEXT_KEYS = [
9
- "AKM_STASH_DIR",
11
+ "AKM_BUNDLE_DIR",
10
12
  "AKM_CONFIG_DIR",
11
13
  "AKM_DATA_DIR",
12
14
  "AKM_CACHE_DIR",
13
15
  "AKM_STATE_DIR",
14
16
  ];
17
+ export const SCHEDULER_CONTEXT_ARG = "--scheduler-context";
15
18
  /** Resolve the complete non-secret AKM directory context captured by schedulers. */
16
19
  export function resolveScheduledTaskContext(env = process.env, platform = process.platform) {
17
20
  return canonicalContext({
18
- AKM_STASH_DIR: path.resolve(resolveStashDir(undefined, env)),
21
+ AKM_BUNDLE_DIR: path.resolve(resolveStashDir(env)),
19
22
  AKM_CONFIG_DIR: path.resolve(getConfigDir(env, platform)),
20
23
  AKM_DATA_DIR: path.resolve(getDataDir(env, platform)),
21
24
  AKM_CACHE_DIR: path.resolve(getCacheDir(env)),
22
- // Retain the legacy state root for scheduled commands and upgrade tooling
23
- // that still honor it even though current durable state lives under DATA.
25
+ // Capture the complete process directory context used by scheduled commands.
24
26
  AKM_STATE_DIR: path.resolve(resolveStateDir(env, platform)),
25
27
  });
26
28
  }
27
- /** Build the one scheduler-generated argv shape consumed by all backends. */
28
- export function buildScheduledTaskInvocation(akmArgv, id, context) {
29
- const environment = canonicalContext(context);
29
+ /**
30
+ * Build the one scheduler-generated argv shape consumed by all backends.
31
+ *
32
+ * `target` records the bundle a non-primary task lives in as a `--bundle
33
+ * <bundle>` token so the scheduled `akm task run` resolves the task (and its
34
+ * relative asset refs) from that bundle. It is emitted ONLY when supplied and
35
+ * non-empty — callers pass it exclusively for a non-default bundle, so a
36
+ * primary-bundle (or default) task omits the target pair.
37
+ */
38
+ export function buildScheduledTaskInvocation(akmArgv, id, contextPath, target) {
39
+ const targetArgs = target !== undefined && target !== "" ? ["--bundle", target] : [];
30
40
  return {
31
- argv: [...akmArgv, "tasks", "run", id, "--scheduled"],
32
- environment,
41
+ argv: [
42
+ ...akmArgv,
43
+ SCHEDULER_CONTEXT_ARG,
44
+ assertAbsolutePath(contextPath),
45
+ "task",
46
+ "run",
47
+ id,
48
+ ...targetArgs,
49
+ "--scheduled",
50
+ ],
51
+ };
52
+ }
53
+ export function schedulerContextDescriptor(context = resolveScheduledTaskContext(), envPath = process.env.PATH ?? "") {
54
+ return {
55
+ version: 1,
56
+ environment: { ...canonicalContext(context), PATH: validatePathValue(envPath) },
57
+ };
58
+ }
59
+ export function schedulerContextPath(descriptor) {
60
+ const bytes = serializeDescriptor(descriptor);
61
+ const digest = createHash("sha256").update(bytes).digest("hex");
62
+ return path.join(getTaskContextDir(descriptor.environment), `${digest}.json`);
63
+ }
64
+ /** Write a content-addressed descriptor without ever replacing existing content. */
65
+ export function writeSchedulerContextDescriptor(descriptor = schedulerContextDescriptor()) {
66
+ const file = schedulerContextPath(descriptor);
67
+ const bytes = serializeDescriptor(descriptor);
68
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
69
+ if (process.platform !== "win32") {
70
+ fs.chmodSync(path.dirname(file), 0o700);
71
+ }
72
+ if (lstatIfExists(file)) {
73
+ if (serializeDescriptor(validateSchedulerContextDescriptor(file)) !== bytes)
74
+ throw invalidSchedulerContext();
75
+ return file;
76
+ }
77
+ const temp = path.join(path.dirname(file), `.${path.basename(file)}.${process.pid}.${Date.now()}.tmp`);
78
+ try {
79
+ fs.writeFileSync(temp, bytes, { encoding: "utf8", mode: 0o600, flag: "wx" });
80
+ try {
81
+ fs.renameSync(temp, file);
82
+ }
83
+ catch (error) {
84
+ if (!lstatIfExists(file) || serializeDescriptor(validateSchedulerContextDescriptor(file)) !== bytes)
85
+ throw error;
86
+ }
87
+ restrictDescriptor(file);
88
+ validateSchedulerContextDescriptor(file);
89
+ }
90
+ finally {
91
+ fs.rmSync(temp, { force: true });
92
+ }
93
+ return file;
94
+ }
95
+ export function loadSchedulerContextDescriptor(file, env = process.env) {
96
+ const descriptor = validateSchedulerContextDescriptor(file);
97
+ for (const key of SCHEDULED_TASK_CONTEXT_KEYS)
98
+ env[key] = descriptor.environment[key];
99
+ env.PATH = descriptor.environment.PATH;
100
+ }
101
+ export function validateSchedulerContextDescriptor(file) {
102
+ const absolute = assertAbsolutePath(file);
103
+ let linkStat;
104
+ try {
105
+ linkStat = fs.lstatSync(absolute);
106
+ }
107
+ catch (error) {
108
+ throw schedulerContextFileError(absolute, error instanceof Error ? error.message : String(error));
109
+ }
110
+ if (linkStat.isSymbolicLink())
111
+ throw schedulerContextFileError(absolute, "symbolic links are not allowed");
112
+ if (!linkStat.isFile())
113
+ throw schedulerContextFileError(absolute, "path is not a regular file");
114
+ let descriptorBytes;
115
+ let fd;
116
+ try {
117
+ const noFollow = process.platform === "win32" ? 0 : fs.constants.O_NOFOLLOW;
118
+ fd = fs.openSync(absolute, fs.constants.O_RDONLY | noFollow);
119
+ const stat = fs.fstatSync(fd);
120
+ if (!stat.isFile())
121
+ throw schedulerContextFileError(absolute, "path is not a regular file");
122
+ if (process.platform !== "win32") {
123
+ if (typeof process.getuid !== "function") {
124
+ throw schedulerContextFileError(absolute, "current uid is unavailable for ownership verification");
125
+ }
126
+ const uid = process.getuid();
127
+ if (stat.uid !== uid)
128
+ throw schedulerContextFileError(absolute, `file owner ${stat.uid} does not match uid ${uid}`);
129
+ if ((stat.mode & 0o077) !== 0) {
130
+ throw schedulerContextFileError(absolute, "group or other permissions must be disabled");
131
+ }
132
+ }
133
+ descriptorBytes = fs.readFileSync(fd);
134
+ }
135
+ catch (error) {
136
+ if (error instanceof ConfigError)
137
+ throw error;
138
+ throw schedulerContextFileError(absolute, error instanceof Error ? error.message : String(error));
139
+ }
140
+ finally {
141
+ if (fd !== undefined)
142
+ fs.closeSync(fd);
143
+ }
144
+ const filename = path.basename(absolute);
145
+ const match = /^([a-f0-9]{64})\.json$/.exec(filename);
146
+ const digest = createHash("sha256").update(descriptorBytes).digest("hex");
147
+ if (!match || match[1] !== digest) {
148
+ throw schedulerContextFileError(absolute, "content SHA-256 does not match the descriptor filename");
149
+ }
150
+ let parsed;
151
+ try {
152
+ parsed = JSON.parse(descriptorBytes.toString("utf8"));
153
+ }
154
+ catch (error) {
155
+ throw schedulerContextFileError(absolute, error instanceof Error ? error.message : String(error));
156
+ }
157
+ return canonicalDescriptor(parsed);
158
+ }
159
+ /** Load and remove the hidden descriptor argument before citty parses argv. */
160
+ export function consumeSchedulerContextArg(argv, env = process.env) {
161
+ const separator = argv.indexOf("--");
162
+ const index = argv.slice(0, separator === -1 ? argv.length : separator).indexOf(SCHEDULER_CONTEXT_ARG);
163
+ if (index === -1)
164
+ return argv;
165
+ const file = argv[index + 1];
166
+ if (!file) {
167
+ throw new ConfigError(`${SCHEDULER_CONTEXT_ARG} requires an absolute descriptor path.`, "INVALID_CONFIG_FILE");
168
+ }
169
+ loadSchedulerContextDescriptor(file, env);
170
+ return [...argv.slice(0, index), ...argv.slice(index + 2)];
171
+ }
172
+ export function parseScheduledTaskArgv(argv) {
173
+ const contextIndex = argv.indexOf(SCHEDULER_CONTEXT_ARG);
174
+ if (contextIndex < 1 || argv.indexOf(SCHEDULER_CONTEXT_ARG, contextIndex + 1) !== -1)
175
+ return undefined;
176
+ const contextPath = argv[contextIndex + 1];
177
+ const tasksIndex = contextIndex + 2;
178
+ if (!contextPath || argv[tasksIndex] !== "task" || argv[tasksIndex + 1] !== "run" || !argv[tasksIndex + 2]) {
179
+ return undefined;
180
+ }
181
+ let index = tasksIndex + 3;
182
+ let target;
183
+ if (argv[index] === "--bundle") {
184
+ target = argv[index + 1];
185
+ if (!target)
186
+ return undefined;
187
+ index += 2;
188
+ }
189
+ if (argv[index] !== "--scheduled" || index !== argv.length - 1)
190
+ return undefined;
191
+ return {
192
+ binding: [...argv.slice(0, contextIndex)],
193
+ contextPath: assertAbsolutePath(contextPath),
194
+ ...(target !== undefined ? { target } : {}),
33
195
  };
34
196
  }
35
197
  function canonicalContext(input) {
@@ -51,6 +213,54 @@ function canonicalContext(input) {
51
213
  }
52
214
  return context;
53
215
  }
216
+ function canonicalDescriptor(input) {
217
+ if (typeof input !== "object" || input === null || Array.isArray(input))
218
+ throw invalidSchedulerContext();
219
+ const record = input;
220
+ if (Object.keys(record).length !== 2 || record.version !== 1)
221
+ throw invalidSchedulerContext();
222
+ const rawEnvironment = record.environment;
223
+ if (typeof rawEnvironment !== "object" || rawEnvironment === null || Array.isArray(rawEnvironment)) {
224
+ throw invalidSchedulerContext();
225
+ }
226
+ const environment = rawEnvironment;
227
+ if (Object.keys(environment).length !== SCHEDULED_TASK_CONTEXT_KEYS.length + 1)
228
+ throw invalidSchedulerContext();
229
+ const PATH = validatePathValue(environment.PATH);
230
+ const { PATH: _, ...rawContext } = environment;
231
+ return { version: 1, environment: { ...canonicalContext(rawContext), PATH } };
232
+ }
233
+ function serializeDescriptor(descriptor) {
234
+ return `${JSON.stringify(canonicalDescriptor(descriptor))}\n`;
235
+ }
236
+ function validatePathValue(value) {
237
+ if (typeof value !== "string" || containsControlCharacter(value))
238
+ throw invalidSchedulerContext();
239
+ return value;
240
+ }
241
+ function assertAbsolutePath(value) {
242
+ if (containsControlCharacter(value) || (!path.posix.isAbsolute(value) && !path.win32.isAbsolute(value))) {
243
+ throw invalidSchedulerContext();
244
+ }
245
+ return value;
246
+ }
247
+ function restrictDescriptor(file) {
248
+ if (process.platform !== "win32")
249
+ fs.chmodSync(file, 0o600);
250
+ }
251
+ function lstatIfExists(file) {
252
+ try {
253
+ return fs.lstatSync(file);
254
+ }
255
+ catch (error) {
256
+ if (error.code === "ENOENT")
257
+ return undefined;
258
+ throw error;
259
+ }
260
+ }
261
+ function schedulerContextFileError(file, reason) {
262
+ return new ConfigError(`Invalid scheduler context descriptor "${file}": ${reason}.`, "INVALID_CONFIG_FILE");
263
+ }
54
264
  function containsControlCharacter(value) {
55
265
  for (const char of value) {
56
266
  const code = char.codePointAt(0) ?? 0;
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * Task asset schema. A task pairs a cron-style schedule with exactly one of:
6
6
  *
7
- * • a workflow target — invoked via `startWorkflowRun()`
7
+ * • a workflow target — executed via `runWorkflowSteps()`
8
8
  * • a prompt target — invoked via `runAgent()` against the configured
9
9
  * agent harness (e.g. `opencode run`)
10
10
  * • a command target — invoked directly via `Bun.spawn()`, no AI agent
@@ -13,3 +13,26 @@
13
13
  * inline prompts use a YAML block scalar (`prompt: |`).
14
14
  */
15
15
  export const TASK_SCHEMA_VERSION = 2;
16
+ /**
17
+ * Lint-level shape problems for a parsed task YAML mapping: the field rules
18
+ * `src/tasks/parser.ts` enforces at load time, phrased as diagnostics. The ONE
19
+ * definition shared by both task linters (`core/adapter/adapters/akm-lint.ts`
20
+ * and `akm-task-adapter.ts`) so lint and runtime cannot disagree — they
21
+ * previously did, in both directions: lint demanded `enabled` (which the
22
+ * parser defaults to `true`, so a runnable task was flagged) and never checked
23
+ * `version` (which the parser hard-requires as `2`, so a lint-clean task died
24
+ * at runtime with TASK_SCHEMA_VERSION_UNSUPPORTED). `schemas/akm-task.json`
25
+ * agrees with the parser: `required: [version, schedule]`, `version:
26
+ * {const: 2}`, `enabled` optional but boolean. Target-arity rules stay with
27
+ * each caller (they legitimately differ: at-least-one vs exactly-one).
28
+ */
29
+ export function taskFieldProblems(data) {
30
+ const problems = [];
31
+ if (data.version !== TASK_SCHEMA_VERSION)
32
+ problems.push(`version (must be ${TASK_SCHEMA_VERSION})`);
33
+ if (typeof data.schedule !== "string" || data.schedule.trim() === "")
34
+ problems.push("schedule");
35
+ if ("enabled" in data && typeof data.enabled !== "boolean")
36
+ problems.push("enabled (must be a boolean when present)");
37
+ return problems;
38
+ }
@@ -31,7 +31,5 @@ export function validateTaskId(id) {
31
31
  return id;
32
32
  }
33
33
  export function normaliseTaskId(raw) {
34
- // Keep accepting old task-file suffixes at the CLI boundary, but never
35
- // normalize filesystem-derived ids into a different filename.
36
- return validateTaskId(raw.trim().replace(/\.(yml|md)$/, ""));
34
+ return validateTaskId(raw.trim());
37
35
  }
@@ -10,15 +10,17 @@
10
10
  * • the asset/file source exists (prompt targets)
11
11
  * • the selected engine resolves (prompt targets)
12
12
  *
13
- * Validation is deliberately split from parsing: callers that only want to
14
- * read frontmatter (e.g. `tasks list`) can skip these checks, while
15
- * `tasks add` and `tasks run` should always run them.
13
+ * Validation is deliberately split from parsing: callers that only inspect
14
+ * task metadata (e.g. `akm show`) can skip these checks, while
15
+ * `task add` and `task run` should always run them.
16
16
  */
17
17
  import fs from "node:fs";
18
18
  import path from "node:path";
19
+ import { placementSpecFor } from "../core/asset/asset-placement.js";
19
20
  import { parseRefInput } from "../core/asset/resolve-ref.js";
20
21
  import { loadConfig } from "../core/config/config.js";
21
22
  import { NotFoundError } from "../core/errors.js";
23
+ import { NO_ENGINE_MESSAGE_SUFFIX, withEngineFallback } from "../integrations/agent/engine-fallback.js";
22
24
  import { resolveEngine } from "../integrations/agent/engine-resolution.js";
23
25
  import { resolveAssetPath } from "../sources/resolve.js";
24
26
  import { parseSchedule } from "./schedule.js";
@@ -39,12 +41,15 @@ export async function validateTaskDocument(task, options) {
39
41
  }
40
42
  // Prompt target. Resolve the engine unconditionally — when no engine is
41
43
  // set on the task, defaults.engine is required. Catching this at
42
- // `tasks add` / `tasks sync` time is much more useful than failing only
44
+ // `task add` / `task sync` time is much more useful than failing only
43
45
  // when the OS scheduler fires.
44
- const config = loadConfig();
46
+ // Resolve against the SAME effective config the runner will use
47
+ // (`tasks/runner.ts`), or validation rejects at `task add` / `task sync` a
48
+ // task the runner would have happily executed via the implicit fallback.
49
+ const { config } = withEngineFallback(loadConfig());
45
50
  const engine = task.target.engine ?? config.defaults?.engine;
46
51
  if (!engine)
47
- throw new NotFoundError(`Task "${task.id}" has no selected engine.`, "ASSET_NOT_FOUND");
52
+ throw new NotFoundError(`Task "${task.id}" ${NO_ENGINE_MESSAGE_SUFFIX}`, "ASSET_NOT_FOUND");
48
53
  const resolved = resolveEngine(engine, config);
49
54
  if (task.target.llm !== undefined && resolved.kind !== "llm") {
50
55
  throw new NotFoundError(`Task "${task.id}" uses llm overrides with non-LLM engine "${engine}".`, "ASSET_NOT_FOUND");
@@ -53,6 +58,15 @@ export async function validateTaskDocument(task, options) {
53
58
  if (src.kind === "asset") {
54
59
  const stashDir = options.stashDir;
55
60
  const ref = parseRefInput(src.ref);
61
+ // D11 — `parseRefInput` now also accepts an opaque adapter conceptId (a
62
+ // ref whose leading segment is not an AKM placement dir), but
63
+ // `resolveAssetPath` (src/sources/resolve.ts) is placement-dir-only: it
64
+ // has no stash-subdir to route an opaque type through. Surface a clean
65
+ // domain error here rather than let that helper crash on a missing
66
+ // directory mapping.
67
+ if (placementSpecFor(ref.type) === undefined) {
68
+ throw new NotFoundError(`Task "${task.id}" prompt asset ref "${src.ref}" is not an AKM-placed asset — adapter-owned (opaque) prompt sources are not resolvable as task inputs yet.`, "ASSET_NOT_FOUND");
69
+ }
56
70
  await resolveAssetPath(stashDir, ref.type, ref.name);
57
71
  }
58
72
  else if (src.kind === "file") {