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
@@ -1,16 +1,34 @@
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 { randomUUID } from "node:crypto";
4
5
  import fs from "node:fs";
5
6
  import path from "node:path";
6
7
  import { stashDirFor } from "../../core/asset/asset-placement.js";
8
+ import { isBundleSlug } from "../../core/asset/asset-ref.js";
7
9
  import { displayRef, parseQualifiedRefInput } from "../../core/asset/resolve-ref.js";
10
+ import { loadConfig } from "../../core/config/config.js";
8
11
  import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
9
- import { findSourceForPath, getPrimarySource, resolveSourceEntries, } from "../../indexer/search/search-source.js";
10
- import { isRemoteOrigin, resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
12
+ import { defaultBundleForTarget } from "../../core/mutation-target.js";
13
+ import { warn } from "../../core/warn.js";
14
+ import { commitWriteTargetBoundary, prepareWriteTargetForMutation, resolveWriteTarget, } from "../../core/write-source.js";
15
+ import { withAssetMutationLease } from "../../indexer/index-writer-lock.js";
16
+ import { indexWrittenAssets } from "../../indexer/index-written-assets.js";
17
+ import { findSourceForPath, resolveSourceEntries } from "../../indexer/search/search-source.js";
18
+ import { isRemoteOrigin, resolveSourcesForLocator, resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
11
19
  import { syncFromRef } from "../../sources/providers/sync-from-ref.js";
12
20
  import { resolveAssetPath } from "../../sources/resolve.js";
21
+ function destinationRef(config, target, type, name) {
22
+ if (!config || !target)
23
+ return undefined;
24
+ return displayRef({ type, name, bundleId: target.source.name }, defaultBundleForTarget(config));
25
+ }
13
26
  export async function akmClone(options) {
27
+ const unmanagedDest = options.dest;
28
+ const hasUnmanagedDest = unmanagedDest !== undefined;
29
+ if (hasUnmanagedDest && options.target !== undefined) {
30
+ throw new UsageError("--dest and --bundle cannot be used together; choose an unmanaged path or a managed bundle.");
31
+ }
14
32
  // F1b/F4b: accept the 0.9.0 conceptId spelling (`akm clone scripts/deploy.sh`).
15
33
  // F5 origin split (parseQualifiedRefInput): `akm clone` also accepts a NON-slug
16
34
  // clone SOURCE as the `origin//conceptId` prefix — a registry ref
@@ -19,25 +37,29 @@ export async function akmClone(options) {
19
37
  // fallback below (the strict new-grammar parser rejects such origins as they
20
38
  // are not bundle slugs).
21
39
  const parsed = parseQualifiedRefInput(options.sourceRef);
22
- // When --dest is provided, the working stash is optional
40
+ const config = hasUnmanagedDest ? undefined : loadConfig();
41
+ const resolvedWriteTarget = config ? resolveWriteTarget(config, options.target) : undefined;
42
+ const writeTarget = resolvedWriteTarget ? prepareWriteTargetForMutation(resolvedWriteTarget) : undefined;
43
+ // An unmanaged --dest does not require any configured write target.
23
44
  let allSources;
24
45
  try {
25
46
  allSources = resolveSourceEntries();
26
47
  }
27
48
  catch (err) {
28
- if (options.dest) {
49
+ if (hasUnmanagedDest) {
29
50
  allSources = [];
30
51
  }
31
52
  else {
32
53
  throw err;
33
54
  }
34
55
  }
35
- const primarySource = getPrimarySource(allSources);
36
- const destRoot = options.dest ? path.resolve(options.dest) : primarySource?.path;
56
+ const destRoot = unmanagedDest !== undefined ? path.resolve(unmanagedDest) : writeTarget?.source.path;
37
57
  if (!destRoot) {
38
- throw new ConfigError("No working stash configured and no --dest provided. Run `akm init` or pass --dest.", "STASH_DIR_NOT_FOUND");
58
+ throw new ConfigError("No writable source configured and no --dest provided. Run `akm bundle create` or pass --dest.", "STASH_DIR_NOT_FOUND");
39
59
  }
40
- let searchSources = resolveSourcesForOrigin(parsed.origin, allSources);
60
+ let searchSources = parsed.origin && !isBundleSlug(parsed.origin)
61
+ ? resolveSourcesForLocator(parsed.origin, allSources)
62
+ : resolveSourcesForOrigin(parsed.origin, allSources);
41
63
  // Remote fetch fallback: if no local source matched and origin looks remote, fetch it
42
64
  let remoteFetched;
43
65
  if (searchSources.length === 0 && parsed.origin && isRemoteOrigin(parsed.origin, allSources)) {
@@ -99,7 +121,11 @@ export async function akmClone(options) {
99
121
  throw new UsageError(`Unsafe clone name "${destName}": resolves outside the target type directory.`);
100
122
  }
101
123
  }
102
- const destLabel = options.dest ? "at destination" : "in working stash";
124
+ const destLabel = hasUnmanagedDest
125
+ ? "at destination"
126
+ : writeTarget?.selector
127
+ ? `in target "${writeTarget.selector}"`
128
+ : "in working stash";
103
129
  // Guard against self-clone
104
130
  if (parsed.type === "skill") {
105
131
  const sourceSkillDir = path.resolve(path.dirname(sourcePath));
@@ -117,51 +143,109 @@ export async function akmClone(options) {
117
143
  throw new Error(`Source and destination are the same path. Use --name to provide a new name for the clone.`);
118
144
  }
119
145
  }
120
- let destPath;
121
- if (parsed.type === "skill") {
122
- const sourceSkillDir = path.dirname(sourcePath);
123
- const destSkillDir = path.join(destRoot, typeDir, destName);
124
- const overwritten = fs.existsSync(destSkillDir);
125
- if (overwritten && !options.force) {
126
- throw new UsageError(`Asset already exists ${destLabel}: ${destSkillDir}. Use --force to overwrite.`, "RESOURCE_ALREADY_EXISTS");
146
+ return withAssetMutationLease("clone", async () => {
147
+ let destPath;
148
+ let overwritten;
149
+ let operationPaths;
150
+ if (parsed.type === "skill") {
151
+ const sourceSkillDir = path.dirname(sourcePath);
152
+ const destSkillDir = path.join(destRoot, typeDir, destName);
153
+ assertNoDestinationSymlinkParent(destRoot, destSkillDir);
154
+ const existing = lstatIfExists(destSkillDir);
155
+ overwritten = existing !== undefined;
156
+ if (overwritten && !options.force) {
157
+ throw new UsageError(`Asset already exists ${destLabel}: ${destSkillDir}. Use --force to overwrite.`, "RESOURCE_ALREADY_EXISTS");
158
+ }
159
+ const replacedPaths = existing?.isDirectory() && !existing.isSymbolicLink() ? listTreeFiles(destSkillDir) : [];
160
+ // Stage first so a failed source copy leaves the old entry untouched. A
161
+ // final symlink is removed as an entry, never traversed.
162
+ const stagingDir = `${destSkillDir}.tmp-${randomUUID()}`;
163
+ try {
164
+ fs.cpSync(sourceSkillDir, stagingDir, { recursive: true, errorOnExist: true, force: false });
165
+ if (overwritten)
166
+ fs.rmSync(destSkillDir, { recursive: true, force: true });
167
+ fs.renameSync(stagingDir, destSkillDir);
168
+ }
169
+ catch (err) {
170
+ fs.rmSync(stagingDir, { recursive: true, force: true });
171
+ throw err;
172
+ }
173
+ destPath = path.join(destSkillDir, "SKILL.md");
174
+ operationPaths = [...new Set([...replacedPaths, ...listTreeFiles(destSkillDir)])];
127
175
  }
128
- // Stage-then-swap (never destroy-then-copy): a mid-copy failure must not
129
- // leave the destination gone under --force. Copy into a tmp sibling, then
130
- // remove the old dir and rename — the same pattern git-install uses.
131
- const stagingDir = `${destSkillDir}.tmp-${process.pid}`;
132
- fs.rmSync(stagingDir, { recursive: true, force: true });
133
- try {
134
- fs.cpSync(sourceSkillDir, stagingDir, { recursive: true });
135
- if (overwritten) {
136
- fs.rmSync(destSkillDir, { recursive: true, force: true });
176
+ else {
177
+ destPath = path.join(destRoot, typeDir, destName);
178
+ assertNoDestinationSymlinkParent(destRoot, destPath);
179
+ const existing = lstatIfExists(destPath);
180
+ overwritten = existing !== undefined;
181
+ if (overwritten && !options.force) {
182
+ throw new UsageError(`Asset already exists ${destLabel}: ${destPath}. Use --force to overwrite.`, "RESOURCE_ALREADY_EXISTS");
183
+ }
184
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
185
+ const stagingPath = `${destPath}.tmp-${randomUUID()}`;
186
+ try {
187
+ fs.copyFileSync(sourcePath, stagingPath, fs.constants.COPYFILE_EXCL);
188
+ if (overwritten)
189
+ fs.rmSync(destPath, { recursive: true, force: true });
190
+ fs.renameSync(stagingPath, destPath);
137
191
  }
138
- fs.renameSync(stagingDir, destSkillDir);
192
+ catch (err) {
193
+ fs.rmSync(stagingPath, { force: true });
194
+ throw err;
195
+ }
196
+ operationPaths = [destPath];
139
197
  }
140
- catch (err) {
141
- fs.rmSync(stagingDir, { recursive: true, force: true });
142
- throw err;
198
+ const ref = destinationRef(config, writeTarget, parsed.type, destName);
199
+ if (writeTarget) {
200
+ const commitRoot = writeTarget.source.repoPath ?? writeTarget.source.path;
201
+ const commitPaths = operationPaths.map((filePath) => path.relative(commitRoot, filePath).replaceAll(path.sep, "/"));
202
+ commitWriteTargetBoundary(writeTarget, `Clone ${ref}`, { paths: commitPaths });
203
+ if (!(await indexWrittenAssets(writeTarget.source.path, [destPath], { bundleId: writeTarget.source.name }))) {
204
+ warn(`Clone ${ref} succeeded, but its targeted index update failed; run \`akm index\` to refresh it.`);
205
+ }
143
206
  }
144
- destPath = path.join(destSkillDir, "SKILL.md");
145
- const ref = displayRef({ type: parsed.type, name: destName, bundleId: "local" });
146
207
  return {
147
208
  source: { path: sourcePath, registryId: sourceSource?.registryId },
148
- destination: { path: destPath, ref },
209
+ destination: { path: destPath, ...(ref ? { ref } : {}) },
149
210
  overwritten,
150
211
  ...(remoteFetched ? { remoteFetched } : {}),
151
212
  };
213
+ });
214
+ }
215
+ function lstatIfExists(filePath) {
216
+ try {
217
+ return fs.lstatSync(filePath);
218
+ }
219
+ catch (error) {
220
+ if (error.code === "ENOENT")
221
+ return undefined;
222
+ throw error;
152
223
  }
153
- destPath = path.join(destRoot, typeDir, destName);
154
- const overwritten = fs.existsSync(destPath);
155
- if (overwritten && !options.force) {
156
- throw new UsageError(`Asset already exists ${destLabel}: ${destPath}. Use --force to overwrite.`, "RESOURCE_ALREADY_EXISTS");
224
+ }
225
+ function assertNoDestinationSymlinkParent(root, destination) {
226
+ const resolvedRoot = path.resolve(root);
227
+ const relativeParent = path.relative(resolvedRoot, path.dirname(path.resolve(destination)));
228
+ if (relativeParent === "" || relativeParent === ".")
229
+ return;
230
+ if (relativeParent.startsWith("..") || path.isAbsolute(relativeParent)) {
231
+ throw new UsageError(`Clone destination escapes the selected target: ${destination}.`, "PATH_ESCAPE_VIOLATION");
232
+ }
233
+ let current = resolvedRoot;
234
+ for (const segment of relativeParent.split(path.sep)) {
235
+ current = path.join(current, segment);
236
+ if (lstatIfExists(current)?.isSymbolicLink()) {
237
+ throw new UsageError(`Clone destination has a symbolic-link parent outside the selected target boundary: ${current}.`, "PATH_ESCAPE_VIOLATION");
238
+ }
239
+ }
240
+ }
241
+ function listTreeFiles(root) {
242
+ const files = [];
243
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
244
+ const entryPath = path.join(root, entry.name);
245
+ if (entry.isDirectory())
246
+ files.push(...listTreeFiles(entryPath));
247
+ else
248
+ files.push(entryPath);
157
249
  }
158
- fs.mkdirSync(path.dirname(destPath), { recursive: true });
159
- fs.copyFileSync(sourcePath, destPath);
160
- const ref = displayRef({ type: parsed.type, name: destName, bundleId: "local" });
161
- return {
162
- source: { path: sourcePath, registryId: sourceSource?.registryId },
163
- destination: { path: destPath, ref },
164
- overwritten,
165
- ...(remoteFetched ? { remoteFetched } : {}),
166
- };
250
+ return files;
167
251
  }
@@ -2,10 +2,10 @@
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
  import path from "node:path";
5
+ import { detectAdapterId } from "../../core/adapter/detect-adapter.js";
5
6
  import { isRemoteUrl } from "../../core/common.js";
6
- import { bundleEntryToSourceEntry, bundlesToSourceEntries, getSources, loadConfig, mutateConfig, } from "../../core/config/config.js";
7
+ import { bundleEntryToSourceEntry, bundlesToSourceEntries, getSources, mutateConfig } from "../../core/config/config.js";
7
8
  import { ConfigError, UsageError } from "../../core/errors.js";
8
- import { resolveSourceEntries } from "../../indexer/search/search-source.js";
9
9
  import { bundleKeyForPath, bundleKeyForUrl, nextBundleKey } from "./bundle-config-ops.js";
10
10
  // ── Operations ──────────────────────────────────────────────────────────────
11
11
  /**
@@ -24,17 +24,32 @@ export function addStash(opts) {
24
24
  throw new ConfigError("writable: true is only supported on filesystem and git sources", "INVALID_CONFIG_FILE");
25
25
  }
26
26
  let result;
27
- if (isRemoteUrl(target)) {
28
- if (!providerType) {
29
- throw new UsageError("--provider is required for URL sources (e.g. --provider git --provider website)");
30
- }
27
+ const targetIsUrl = isRemoteUrl(target);
28
+ if (targetIsUrl && !providerType) {
29
+ throw new UsageError("--provider is required for URL sources (e.g. --provider git --provider website)");
30
+ }
31
+ // R-013: `--provider npm` names an npm package SPEC (e.g. "lodash",
32
+ // "@scope/pkg@^2"), never a URL — a tarball URL is not installable as a
33
+ // package spec and would only fail much later, at first sync, with a
34
+ // confusing "Invalid npm package name" error. Reject it loudly here instead.
35
+ if (providerType === "npm" && targetIsUrl) {
36
+ throw new UsageError(`--provider npm expects a package spec (e.g. "lodash" or "@scope/pkg@^2"), not a URL: "${target}". ` +
37
+ "Drop --provider npm and re-run `akm bundle add <package>` to add an npm source.");
31
38
  }
39
+ // A bare (non-URL) target with --provider npm is a declarative npm source
40
+ // add — the same "locator, not a URL" descriptor path used for git/website
41
+ // URL sources below. Without this, a non-URL target fell through to the
42
+ // filesystem branch below and `--provider npm` was silently ignored,
43
+ // creating a bogus filesystem bundle for the current working directory
44
+ // (R-013).
45
+ const useDescriptorPath = targetIsUrl || providerType === "npm";
32
46
  mutateConfig((config) => {
33
47
  const bundles = { ...(config.bundles ?? {}) };
34
48
  let key;
35
- if (isRemoteUrl(target)) {
49
+ if (useDescriptorPath) {
36
50
  if (bundleKeyForUrl(config, target)) {
37
- result = { sources: getSources(config), added: false, message: "Source URL already configured" };
51
+ const already = targetIsUrl ? "Source URL already configured" : "Source already configured";
52
+ result = { sources: getSources(config), added: false, message: already };
38
53
  return config;
39
54
  }
40
55
  key = nextBundleKey(bundles, name, target);
@@ -47,7 +62,13 @@ export function addStash(opts) {
47
62
  return config;
48
63
  }
49
64
  key = nextBundleKey(bundles, name, resolvedPath);
50
- bundles[key] = { path: resolvedPath, ...(writable === true ? { writable: true } : {}) };
65
+ bundles[key] = {
66
+ path: resolvedPath,
67
+ ...(writable === true ? { writable: true } : {}),
68
+ components: {
69
+ main: { root: ".", adapter: detectAdapterId(resolvedPath), writable: writable ?? true },
70
+ },
71
+ };
51
72
  }
52
73
  const next = { ...config, bundles };
53
74
  const entry = bundleEntryToSourceEntry(key, bundles[key]);
@@ -56,17 +77,25 @@ export function addStash(opts) {
56
77
  });
57
78
  return result;
58
79
  }
59
- /** Build the 0.9.0 bundle descriptor for a URL source (spec §10.1). */
60
- function urlBundleDescriptor(providerType, url, options, writable) {
80
+ /**
81
+ * Build the 0.9.0 bundle descriptor for a declarative (non-filesystem) source
82
+ * (spec §10.1). `locator` is a URL for git/website; for npm it is a bare
83
+ * package spec (e.g. "lodash", "@scope/pkg@^2") — never a URL (R-013,
84
+ * rejected earlier in {@link addStash}).
85
+ */
86
+ function urlBundleDescriptor(providerType, locator, options, writable) {
61
87
  if (providerType === "website") {
62
88
  // Website provider options ride on the (passthrough) website descriptor and
63
89
  // round-trip back to `entry.options` via bundleEntryToSourceEntry.
64
- return { website: { url, ...(options ?? {}) } };
90
+ return {
91
+ website: { url: locator, ...(options ?? {}) },
92
+ components: { main: { root: ".", adapter: "website-snapshot", writable: false } },
93
+ };
65
94
  }
66
95
  if (providerType === "npm")
67
- return { npm: url };
96
+ return { npm: locator };
68
97
  if (providerType === "git")
69
- return { git: url, ...(writable ? { writable: true } : {}) };
98
+ return { git: locator, ...(writable ? { writable: true } : {}) };
70
99
  throw new ConfigError(`unsupported source type "${providerType}"; expected filesystem, git, website, or npm`, "INVALID_CONFIG_FILE");
71
100
  }
72
101
  /**
@@ -97,12 +126,3 @@ export function removeStash(target) {
97
126
  });
98
127
  return result;
99
128
  }
100
- /**
101
- * List all stash sources (local filesystem + configured stashes).
102
- */
103
- export function listStashes() {
104
- const config = loadConfig();
105
- const localSources = resolveSourceEntries();
106
- const sources = getSources(config);
107
- return { localSources, sources };
108
- }