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,117 +2,44 @@
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
- * Source-management CLI commands — `akm list/remove/update/upgrade/sync/clone/history`.
5
+ * Source-management CLI commands — `akm upgrade/sync/clone`.
6
6
  *
7
7
  * Extracted verbatim from src/cli.ts (WS6). Each `main.subCommands.<key>`
8
8
  * registration line stays byte-identical; the args/output shape of every
9
- * subcommand is unchanged. The `--kind` filter helper (`parseKindFilter` +
10
- * `VALID_SOURCE_KINDS`), the `runSyncBody` git-commit/push body, and the
11
- * `wasFormatValueConsumedAsName` citty-mis-parse workaround are used ONLY by
12
- * this cluster, so they move with it.
9
+ * subcommand is unchanged. The `runSyncBody` git-commit/push body is used
10
+ * ONLY by this cluster, so it moves with it.
13
11
  *
14
12
  * Leaf handlers whose body is a plain `runWithJsonErrors(async () => { … })`
15
13
  * are migrated to `defineJsonCommand`, which emits the same JSON envelope
16
14
  * (stdout/stderr/exit-code) as the inline form. `sync` keeps `defineCommand`
17
15
  * because its `run` delegates to `runSyncBody` (which owns the
18
16
  * `runWithJsonErrors` wrapper) rather than wrapping inline.
17
+ *
18
+ * 0.9.0 CLI overhaul (S3): top-level `history` was dropped; its
19
+ * `--accept-rate-by-source` metric was folded into `akm health --report`
20
+ * (src/commands/health/accept-rate.ts).
21
+ *
22
+ * 0.9 CLI overhaul (S7): `list`/`remove`/`update` moved out of this cluster
23
+ * into the new `akm bundle` group (src/commands/sources/bundle-cli.ts) — no
24
+ * top-level `list`/`remove`/`update` remains. Root `sync` and this file's
25
+ * `clone`/`upgrade` stay top-level (the shipped `core/sync.yml` task calls
26
+ * `akm sync` directly).
19
27
  */
20
28
  import { defineCommand } from "citty";
21
29
  import { getParsedInvocation } from "../../cli/invocation.js";
22
- import { defineJsonCommand, output, runWithJsonErrors } from "../../cli/shared.js";
30
+ import { defineJsonCommand, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
23
31
  import { loadConfig } from "../../core/config/config.js";
24
32
  import { UsageError } from "../../core/errors.js";
25
33
  import { appendEvent } from "../../core/events.js";
26
- import { resolveSourceEntries } from "../../indexer/search/search-source.js";
27
34
  import { resolveWritableOverride, saveGitStash } from "../../sources/providers/git.js";
28
35
  import { pkgVersion } from "../../version.js";
29
- import { akmHistory } from "./history.js";
30
- import { akmListSources, akmRemove, akmUpdate } from "./installed-stashes.js";
31
36
  import { checkForUpdate, performUpgrade } from "./self-update.js";
32
37
  import { akmClone } from "./source-clone.js";
33
- const VALID_SOURCE_KINDS = new Set(["local", "managed", "remote"]);
34
- function parseKindFilter(raw) {
35
- if (!raw)
36
- return undefined;
37
- const kinds = raw.split(",").map((s) => s.trim());
38
- for (const k of kinds) {
39
- if (!VALID_SOURCE_KINDS.has(k)) {
40
- throw new UsageError(`Invalid --kind value: "${k}". Expected one of: local, managed, remote`);
41
- }
42
- }
43
- return kinds;
44
- }
45
- export const listCommand = defineJsonCommand({
46
- meta: { name: "list", description: "List all sources (local directories, managed packages, remote providers)" },
47
- args: {
48
- kind: { type: "string", description: "Filter by source kind (local, managed, remote). Comma-separated." },
49
- },
50
- async run({ args }) {
51
- const kind = parseKindFilter(args.kind);
52
- const result = await akmListSources({ kind });
53
- output("list", result);
54
- },
55
- });
56
- export const removeCommand = defineJsonCommand({
57
- meta: { name: "remove", description: "Remove a source by id, ref, path, URL, or name" },
58
- args: {
59
- target: { type: "positional", description: "Source to remove (id, ref, path, URL, or name)", required: true },
60
- yes: { type: "boolean", alias: "y", description: "Skip confirmation prompt", default: false },
61
- },
62
- async run({ args }) {
63
- const { confirmDestructive } = await import("../../cli/confirm.js");
64
- const confirmed = await confirmDestructive(`Remove source "${args.target}"? This cannot be undone.`, {
65
- yes: args.yes === true,
66
- });
67
- if (!confirmed) {
68
- process.stderr.write("Aborted.\n");
69
- return;
70
- }
71
- const result = await akmRemove({ target: args.target });
72
- appendEvent({
73
- eventType: "remove",
74
- metadata: {
75
- target: args.target,
76
- ref: typeof result.removed?.ref === "string" ? result.removed.ref : null,
77
- id: typeof result.removed?.id === "string" ? result.removed.id : null,
78
- },
79
- });
80
- output("remove", result);
81
- },
82
- });
83
- export const updateCommand = defineJsonCommand({
84
- meta: { name: "update", description: "Update one or all managed sources" },
85
- args: {
86
- target: { type: "positional", description: "Source to update (id or ref)", required: false },
87
- all: { type: "boolean", description: "Update all installed entries", default: false },
88
- force: { type: "boolean", description: "Force fresh download even if version is unchanged", default: false },
89
- },
90
- async run({ args }) {
91
- const result = await akmUpdate({ target: args.target, all: args.all, force: args.force });
92
- appendEvent({
93
- eventType: "update",
94
- metadata: {
95
- target: args.target ?? null,
96
- all: args.all === true,
97
- force: args.force === true,
98
- processed: Array.isArray(result.processed)
99
- ? result.processed.length
100
- : 0,
101
- },
102
- });
103
- output("update", result);
104
- },
105
- });
106
38
  export const upgradeCommand = defineJsonCommand({
107
39
  meta: { name: "upgrade", description: "Upgrade akm to the latest release" },
108
40
  args: {
109
41
  check: { type: "boolean", description: "Check for updates without installing", default: false },
110
42
  force: { type: "boolean", description: "Force upgrade even if on latest", default: false },
111
- "skip-checksum": {
112
- type: "boolean",
113
- description: "Skip checksum verification (not recommended)",
114
- default: false,
115
- },
116
43
  "skip-post-upgrade": {
117
44
  type: "boolean",
118
45
  description: "Skip the post-upgrade index rebuild (migration preflight and apply still run)",
@@ -129,57 +56,57 @@ export const upgradeCommand = defineJsonCommand({
129
56
  output("upgrade", check);
130
57
  return;
131
58
  }
132
- const skipChecksum = args["skip-checksum"];
133
59
  const skipPostUpgrade = args["skip-post-upgrade"];
134
60
  const migrationConfig = args["migration-config"];
135
- const result = await performUpgrade(check, { force: args.force, skipChecksum, skipPostUpgrade, migrationConfig });
61
+ const result = await performUpgrade(check, { force: args.force, skipPostUpgrade, migrationConfig });
136
62
  output("upgrade", result);
137
63
  },
138
64
  });
139
- // `sync` body. Kept as a standalone function so the git-commit/push logic and
140
- // the `--format`-as-name workaround stay in one place.
141
- async function runSyncBody(args, verb) {
65
+ // `sync` body, standalone so the git-commit/push logic stays in one place.
66
+ async function runSyncBody(args) {
142
67
  await runWithJsonErrors(async () => {
143
- // Fix: citty can consume `--format json` (space-separated) as the
144
- // positional `name` argument (e.g. `akm sync --format json` parses
145
- // name="json"). Detect the mis-parse by checking argv order only
146
- // treat the positional as consumed by --format when --format appears
147
- // before any standalone occurrence of the same value in the sync
148
- // subcommand's argv slice. This preserves legitimate invocations
149
- // like `akm sync json --format json`.
150
- const parsedFormat = getParsedInvocation().getFlagValue("--format");
151
- const effectiveName = args.name !== undefined &&
152
- parsedFormat !== undefined &&
153
- args.name === parsedFormat &&
154
- wasFormatValueConsumedAsName(args.name, parsedFormat, verb)
155
- ? undefined
156
- : args.name;
68
+ // The optional `name` positional is safe to trust: the global output flags
69
+ // are declared on the command (GLOBAL_OUTPUT_ARGS), so `akm sync --format
70
+ // json` parses `json` as the flag's value, never as a stash name.
71
+ const effectiveName = args.name;
157
72
  let writable;
158
73
  if (effectiveName === undefined) {
159
- // Primary stash — honour the root-level writable flag from config.
74
+ // Primary stash — honour the configured default bundle's writable flag.
160
75
  writable = resolveWritableOverride(loadConfig());
161
76
  }
162
77
  const result = saveGitStash(effectiveName, args.message, writable, { push: args.push !== false });
78
+ // 0.9.0 breaking change: both "save" holdovers from the command's
79
+ // pre-rename name are now "sync" — the persisted eventType below and the
80
+ // envelope shape emitted at the end of this function. Historical state.db
81
+ // rows still carry "save" — `readEvents`/`tailEvents` (src/core/events.ts)
82
+ // treat "save" and "sync" as synonyms on READ so `akm log --type save`
83
+ // keeps returning both old and new rows. Only the WRITE side changes here.
84
+ // The envelope shape needs no such synonym: it is per-invocation, never
85
+ // persisted, so nothing can be holding an old value.
163
86
  appendEvent({
164
- eventType: "save",
87
+ eventType: "sync",
165
88
  metadata: {
166
89
  name: effectiveName ?? null,
167
90
  message: args.message ?? null,
168
91
  ok: result.ok !== false,
169
92
  },
170
93
  });
171
- output("save", result);
94
+ output("sync", result);
172
95
  });
173
96
  }
174
97
  export const syncCommand = defineCommand({
175
98
  meta: {
176
99
  name: "sync",
177
- description: "Sync changes in a git-backed stash: commits (and pushes when writable + remote is configured). No-op for non-git stashes.",
100
+ description: "Sync changes in a git-backed bundle: commits (and pushes when writable + remote is configured). No-op for non-git bundles.",
178
101
  },
102
+ // Raw defineCommand (not defineJsonCommand), so the global output flags are
103
+ // spread in explicitly — without them the optional `name` positional would
104
+ // swallow a space-separated global flag's value.
179
105
  args: {
106
+ ...GLOBAL_OUTPUT_ARGS,
180
107
  name: {
181
108
  type: "positional",
182
- description: "Name of the git stash to sync (default: primary stash directory)",
109
+ description: "Name of the git bundle to sync (default: primary bundle directory)",
183
110
  required: false,
184
111
  },
185
112
  message: {
@@ -194,122 +121,44 @@ export const syncCommand = defineCommand({
194
121
  },
195
122
  },
196
123
  async run({ args }) {
197
- await runSyncBody(args, "sync");
124
+ await runSyncBody(args);
198
125
  },
199
126
  });
200
127
  /**
201
- * Detect whether `--format <value>` was consumed by citty as the optional
202
- * `name` positional of `akm sync`. Returns true only when `--format` appears
203
- * in the sync subcommand's argv slice AND the candidate name does NOT
204
- * appear as a standalone positional elsewhere (before or after the flag).
205
- *
206
- * This keeps `akm sync json --format json` routing `json` as the stash name,
207
- * while `akm sync --format json` (no separate positional) is treated as a
208
- * primary-stash sync. `verb` is the subcommand token to anchor on.
128
+ * `--target` was renamed to `--bundle` on `clone` in 0.9 (S8). citty is
129
+ * non-strict, so the retired spelling is silently absorbed rather than
130
+ * rejected the asset then lands in the default bundle instead of the one
131
+ * the caller named, with exit 0 and no error. Reject it explicitly instead.
209
132
  */
210
- function wasFormatValueConsumedAsName(name, formatValue, verb) {
211
- const argv = getParsedInvocation().userArgs;
212
- const verbIndex = argv.indexOf(verb);
213
- const tokens = verbIndex >= 0 ? argv.slice(verbIndex + 1) : argv;
214
- let formatIndex = -1;
215
- let formatConsumesNextToken = false;
216
- for (let i = 0; i < tokens.length; i += 1) {
217
- const token = tokens[i];
218
- if (token === "--format") {
219
- formatIndex = i;
220
- formatConsumesNextToken = true;
221
- break;
222
- }
223
- if (token === `--format=${formatValue}`) {
224
- formatIndex = i;
225
- break;
226
- }
227
- }
228
- if (formatIndex === -1)
229
- return false;
230
- // If the name appears as a standalone token before --format, it's the
231
- // real positional and --format did not consume it.
232
- if (tokens.slice(0, formatIndex).includes(name))
233
- return false;
234
- // If --format has a space-separated value, skip past the value token
235
- // when scanning after the flag; otherwise start right after the flag.
236
- const firstTokenAfterFormat = formatIndex + (formatConsumesNextToken ? 2 : 1);
237
- if (tokens.slice(firstTokenAfterFormat).includes(name))
238
- return false;
239
- return true;
133
+ function rejectRetiredCloneTargetFlag() {
134
+ if (!getParsedInvocation().hasFlag("--target"))
135
+ return;
136
+ throw new UsageError("`akm clone --target` was renamed to `--bundle` in 0.9. Use `--bundle <name>` instead.", "INVALID_FLAG_VALUE");
240
137
  }
241
138
  export const cloneCommand = defineJsonCommand({
242
139
  meta: {
243
140
  name: "clone",
244
- description: "Clone an asset from any source into the working stash or a custom destination",
141
+ description: "Clone an asset from any source into a managed bundle or an unmanaged custom destination",
245
142
  },
246
143
  args: {
247
- ref: { type: "positional", description: "Asset ref (e.g. npm:@scope/pkg//script:deploy.sh)", required: true },
144
+ ref: { type: "positional", description: "Asset ref (e.g. npm:@scope/pkg//scripts/deploy.sh)", required: true },
248
145
  name: { type: "string", description: "New name for the cloned asset" },
249
- force: { type: "boolean", description: "Overwrite if asset already exists in working stash", default: false },
250
- dest: { type: "string", description: "Destination directory (default: working stash)" },
146
+ force: { type: "boolean", description: "Overwrite if the asset already exists at the destination", default: false },
147
+ bundle: {
148
+ type: "string",
149
+ description: "Override the managed destination. Accepts a bundle name from config; falls back to defaultWriteTarget then the working bundle.",
150
+ },
151
+ dest: { type: "string", description: "Unmanaged destination directory (cannot be combined with --bundle)" },
251
152
  },
252
153
  async run({ args }) {
154
+ rejectRetiredCloneTargetFlag();
253
155
  const result = await akmClone({
254
156
  sourceRef: args.ref,
255
157
  newName: args.name,
256
158
  force: args.force,
257
159
  dest: args.dest,
160
+ target: args.bundle,
258
161
  });
259
162
  output("clone", result);
260
163
  },
261
164
  });
262
- export const historyCommand = defineJsonCommand({
263
- meta: {
264
- name: "history",
265
- description: "Show mutation/usage history for a single asset (--ref) or stash-wide.\n\n" +
266
- "Event sources:\n" +
267
- " usage_events (default): search, show, and feedback events from the local index.\n" +
268
- " state.db events (--include-proposals): proposal lifecycle events (promoted, rejected)\n" +
269
- " emitted by `akm accept` / `akm reject`.\n\n" +
270
- "Results from all active sources are merged and sorted chronologically.",
271
- },
272
- args: {
273
- ref: { type: "string", description: "Asset ref ([bundle//]conceptId). Omit for stash-wide history." },
274
- since: { type: "string", description: "ISO timestamp or epoch ms — only events on/after this time" },
275
- generator: {
276
- type: "string",
277
- description: "Filter by event generator: user, improve, task, audit, or unknown.",
278
- },
279
- "include-proposals": {
280
- type: "boolean",
281
- description: "Also include proposal lifecycle events (promoted, rejected) from state.db events. " +
282
- "Default: false (usage_events only).",
283
- default: false,
284
- },
285
- "accept-rate-by-source": {
286
- type: "boolean",
287
- description: "Compute accept-rate-per-source metrics from the proposal store and include them in the output (F-4 / #385). " +
288
- "Useful for measuring which generators (reflect, distill, …) produce the most accepted proposals.",
289
- default: false,
290
- },
291
- format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
292
- },
293
- async run({ args }) {
294
- const generatorFlag = args.generator;
295
- if (generatorFlag !== undefined &&
296
- generatorFlag !== "user" &&
297
- generatorFlag !== "improve" &&
298
- generatorFlag !== "task" &&
299
- generatorFlag !== "audit" &&
300
- generatorFlag !== "unknown") {
301
- throw new UsageError(`Invalid --generator value: "${generatorFlag}". Must be user, improve, task, audit, or unknown.`, "INVALID_FLAG_VALUE");
302
- }
303
- const sources = resolveSourceEntries();
304
- const stashDir = sources[0]?.path;
305
- const result = await akmHistory({
306
- ref: args.ref,
307
- since: args.since,
308
- source: generatorFlag,
309
- includeProposals: args["include-proposals"],
310
- acceptRateBySource: args["accept-rate-by-source"],
311
- stashDir,
312
- });
313
- output("history", result);
314
- },
315
- });
@@ -2,15 +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
- * Stash-lifecycle command cluster — the create/index/ingest/inspect verbs for
6
- * the working stash and its index database: `akm init` (create the stash +
7
- * persist stashDir), `akm index` (build/refresh the search index), `akm import`
8
- * (ingest a knowledge doc/URL), and `akm info` (system capabilities + index
9
- * stats).
5
+ * Stash-lifecycle command cluster — the index/ingest/inspect verbs for
6
+ * the working stash and its index database: `akm index` (build/refresh the
7
+ * search index), `akm import` (ingest a knowledge doc/URL), and `akm info`
8
+ * (system capabilities + index stats).
10
9
  * Extracted verbatim from src/cli.ts (WS6) so the God Module shrinks; the
11
- * `main.subCommands.{init,index,import,info}` keys and every subcommand's
10
+ * `main.subCommands.{index,import,info}` keys and every subcommand's
12
11
  * args/output shape stay byte-identical.
13
12
  *
13
+ * 0.9 CLI overhaul (S7): `init` moved out of this cluster into the new
14
+ * `akm bundle create` (src/commands/sources/bundle-cli.ts) — no top-level
15
+ * `init` remains.
16
+ *
14
17
  * These share no private helper with any command still inline in cli.ts — every
15
18
  * dependency is already exported from a shared module (core/paths, core/warn,
16
19
  * core/errors, core/events, output/context, cli/shared, cli/parse-args, plus the
@@ -18,7 +21,7 @@
18
21
  * ./core/asset-create, ./core/common), so the cluster moves with zero hoisting.
19
22
  *
20
23
  * The leaf handlers whose body is a plain `runWithJsonErrors(...) + output(...)`
21
- * (`init`, `import`, `info`) are migrated onto
24
+ * (`import`, `info`) are migrated onto
22
25
  * `defineJsonCommand`, which emits the same JSON envelope (stdout/stderr/
23
26
  * exit-code) as the inline form. `index` keeps a plain `defineCommand` wrapping
24
27
  * `runWithJsonErrors` because its body owns a spinner, an AbortController, and
@@ -28,49 +31,30 @@ import path from "node:path";
28
31
  import { defineCommand } from "citty";
29
32
  import * as p from "../../cli/clack.js";
30
33
  import { getParsedInvocation } from "../../cli/invocation.js";
31
- import { defineJsonCommand, output, parseAllFlagValues, runWithJsonErrors } from "../../cli/shared.js";
34
+ import { defineJsonCommand, GLOBAL_OUTPUT_ARGS, output, parseAllFlagValues, runWithJsonErrors } from "../../cli/shared.js";
32
35
  import { assertFlatAssetName } from "../../core/asset/asset-create.js";
33
36
  import { parseFrontmatter } from "../../core/asset/frontmatter.js";
34
37
  import { isHttpUrl, resolveStashDir } from "../../core/common.js";
35
38
  import { loadConfig } from "../../core/config/config.js";
36
39
  import { UsageError } from "../../core/errors.js";
37
40
  import { appendEvent } from "../../core/events.js";
41
+ import { resolveBundleWriteTarget } from "../../core/mutation-target.js";
38
42
  import { getCacheDir } from "../../core/paths.js";
39
43
  import { clearLogFile, info, isVerbose, setLogFile } from "../../core/warn.js";
40
44
  import { resolveWriteTarget } from "../../core/write-source.js";
41
45
  import { akmIndex } from "../../indexer/indexer.js";
42
46
  import { getHyphenatedBoolean, getOutputMode } from "../../output/context.js";
43
- import { inferAssetName, mergeXrefsIntoContent, readKnowledgeInput, resolveSupersedesForWrite, resolveXrefsForWrite, writeMarkdownAsset, } from "../read/knowledge.js";
47
+ import { inferAssetName, mergeXrefsIntoContent, readKnowledgeInput, resolveSupersedesForWrite, resolveSupersedesWriteTarget, resolveXrefsForWrite, writeMarkdownAsset, } from "../read/knowledge.js";
44
48
  import { assembleInfo } from "./info.js";
45
- import { akmInit } from "./init.js";
46
- export const initCommand = defineJsonCommand({
47
- meta: {
48
- name: "init",
49
- description: "Initialize akm's working stash directory and persist stashDir in config",
50
- },
51
- args: {
52
- dir: { type: "string", description: "Custom stash directory path (default: ~/akm)" },
53
- "set-default": {
54
- type: "boolean",
55
- description: "Make --dir the default stash (write stashDir to config.json). Without this, `akm init --dir X` scaffolds X but leaves your existing default stash unchanged.",
56
- default: false,
57
- },
58
- },
59
- async run({ args }) {
60
- // Accept both historical spellings for backwards compatibility with
61
- // older docs/scripts that used `--stashDir`.
62
- const invocation = getParsedInvocation();
63
- const legacyDir = invocation.getFlagValue("--stashDir") ?? invocation.getFlagValue("--stash-dir");
64
- const result = await akmInit({
65
- dir: args.dir ?? legacyDir,
66
- setDefault: args["set-default"],
67
- });
68
- output("init", result);
69
- },
70
- });
71
49
  export const indexCommand = defineCommand({
72
50
  meta: { name: "index", description: "Build search index (incremental by default; --full forces full reindex)" },
73
51
  args: {
52
+ // R-051: `index` is a raw `defineCommand` (not `defineJsonCommand`), so it
53
+ // does not get `GLOBAL_OUTPUT_ARGS` for free. `--format`/`--detail`/
54
+ // `--shape`/`--output` already parsed correctly here (this command has no
55
+ // extra positional for a stray value to fall into), so this is purely a
56
+ // `--help` visibility / consistency fix, not a behavior change.
57
+ ...GLOBAL_OUTPUT_ARGS,
74
58
  full: { type: "boolean", description: "Force full reindex", default: false },
75
59
  clean: {
76
60
  type: "boolean",
@@ -82,11 +66,6 @@ export const indexCommand = defineCommand({
82
66
  description: "When combined with --clean, report stale entries without deleting them.",
83
67
  default: false,
84
68
  },
85
- background: {
86
- type: "boolean",
87
- description: "Run as a background process (suppresses interactive output, manages PID file).",
88
- default: false,
89
- },
90
69
  },
91
70
  async run({ args }) {
92
71
  await runWithJsonErrors(async () => {
@@ -96,7 +75,6 @@ export const indexCommand = defineCommand({
96
75
  if (getHyphenatedBoolean(args, "re-enrich") || getParsedInvocation().getFlagValue("--re-enrich") !== undefined) {
97
76
  throw new UsageError("`akm index --re-enrich` has been removed. Re-enrichment of index-time LLM passes is not exposed in this slice.");
98
77
  }
99
- const isBackground = args.background === true;
100
78
  const outputMode = getOutputMode();
101
79
  const controller = new AbortController();
102
80
  const abort = () => controller.abort(new Error("index interrupted"));
@@ -105,7 +83,7 @@ export const indexCommand = defineCommand({
105
83
  const indexLogFile = path.join(getCacheDir(), "logs", "index", `${new Date().toISOString().replace(/[:.]/g, "-")}.log`);
106
84
  setLogFile(indexLogFile);
107
85
  const verbose = isVerbose();
108
- const spin = !verbose && !isBackground && outputMode.format === "text" ? p.spinner() : null;
86
+ const spin = !verbose && outputMode.format === "text" ? p.spinner() : null;
109
87
  if (spin) {
110
88
  spin.start(`Building search index${args.full ? " (full rebuild)" : ""}...`);
111
89
  }
@@ -136,9 +114,7 @@ export const indexCommand = defineCommand({
136
114
  if (spin) {
137
115
  spin.stop(`Indexed ${result.totalEntries} assets.`);
138
116
  }
139
- if (!isBackground) {
140
- output("index", result);
141
- }
117
+ output("index", result);
142
118
  }
143
119
  catch (error) {
144
120
  if (spin) {
@@ -164,7 +140,7 @@ export const infoCommand = defineJsonCommand({
164
140
  export const importKnowledgeCommand = defineJsonCommand({
165
141
  meta: {
166
142
  name: "import",
167
- description: "Import a knowledge document or URL into the default stash",
143
+ description: "Import a knowledge document or URL into the default bundle",
168
144
  },
169
145
  args: {
170
146
  source: {
@@ -187,15 +163,15 @@ export const importKnowledgeCommand = defineJsonCommand({
187
163
  },
188
164
  target: {
189
165
  type: "string",
190
- description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working stash.",
166
+ description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working bundle.",
191
167
  },
192
168
  xref: {
193
169
  type: "string",
194
- description: "Cross-reference ref merged into the document's `xrefs:` frontmatter (repeatable: --xref knowledge:auth-flow). Existing frontmatter is preserved (dedupe-append, never a nested block); a document whose frontmatter is not parseable YAML aborts the import rather than being rewritten lossily. Each ref must resolve in the write target or a configured source; an unresolvable ref aborts the import.",
170
+ description: "Cross-reference ref merged into the document's `xrefs:` frontmatter (repeatable: --xref knowledge/auth-flow). Existing frontmatter is preserved (dedupe-append, never a nested block); a document whose frontmatter is not parseable YAML aborts the import rather than being rewritten lossily. Each ref must resolve in the write target or a configured source; an unresolvable ref aborts the import.",
195
171
  },
196
172
  supersedes: {
197
173
  type: "string",
198
- description: "Ref of an existing asset this document corrects (repeatable: --supersedes knowledge:legacy-guide). Imports the correction with an xref to the old asset AND demotes the old asset (`beliefState: superseded` + `supersededBy`, a metadata-only edit) so ranking prefers the correction and `--belief current` hides the stale version. An unresolvable or self-referencing ref aborts the import; a ref outside the write target and working stash still imports the correction but skips the demotion (reported as applied: false).",
174
+ description: "Ref of an existing asset this document corrects (repeatable: --supersedes knowledge/legacy-guide). Imports the correction with an xref to the old asset AND demotes the old asset (`beliefState: superseded` + `supersededBy`, a metadata-only edit) so ranking prefers the correction and `--belief current` hides the stale version. An unresolvable or self-referencing ref aborts the import; a ref outside the write target and working bundle still imports the correction but skips the demotion (reported as applied: false).",
199
175
  },
200
176
  },
201
177
  async run({ args }) {
@@ -205,18 +181,35 @@ export const importKnowledgeCommand = defineJsonCommand({
205
181
  // the last value, so read argv directly). Validation happens BEFORE any
206
182
  // read/write so an unresolvable ref (UsageError → exit 2) leaves the
207
183
  // stash untouched.
208
- const xrefs = resolveXrefsForWrite(parseAllFlagValues("--xref"), args.target);
184
+ const rawSupersedes = parseAllFlagValues("--supersedes");
185
+ const writeTarget = resolveSupersedesWriteTarget(rawSupersedes, args.target);
186
+ const xrefs = resolveXrefsForWrite(parseAllFlagValues("--xref"), writeTarget);
209
187
  // Collect and validate --supersedes occurrences (repeatable). Same
210
188
  // before-any-read/write contract: an unresolvable ref exits 2 with nothing
211
189
  // imported AND nothing demoted. The superseded refs fold into the imported
212
190
  // doc's xrefs automatically (correction provenance); the demotion runs
213
191
  // inside writeMarkdownAsset, ordered before the git boundary commit.
214
- const supersedes = resolveSupersedesForWrite(parseAllFlagValues("--supersedes"), args.target);
192
+ const supersedes = resolveSupersedesForWrite(rawSupersedes, writeTarget);
215
193
  for (const s of supersedes) {
216
194
  if (!xrefs.includes(s.ref))
217
195
  xrefs.push(s.ref);
218
196
  }
219
- const stashDir = resolveWriteTarget(loadConfig(), args.target).source.path;
197
+ const config = loadConfig();
198
+ const stashDir = (() => {
199
+ try {
200
+ return resolveWriteTarget(config, writeTarget).source.path;
201
+ }
202
+ catch (error) {
203
+ if (!writeTarget)
204
+ throw error;
205
+ try {
206
+ return resolveBundleWriteTarget(config, writeTarget).source.path;
207
+ }
208
+ catch {
209
+ throw error;
210
+ }
211
+ }
212
+ })();
220
213
  const { content, preferredName } = await readKnowledgeInput(args.source, { stashDir });
221
214
  // Imported docs may carry their own frontmatter: merge (dedupe-append)
222
215
  // BEFORE the write so write-path indexing sees the final content and no
@@ -237,7 +230,7 @@ export const importKnowledgeCommand = defineJsonCommand({
237
230
  fallbackPrefix: "knowledge",
238
231
  preferredName: preferredName ?? inferAssetName(parseFrontmatter(content).content, "knowledge"),
239
232
  force: args.force,
240
- target: args.target,
233
+ target: writeTarget,
241
234
  path: args.path,
242
235
  supersedes,
243
236
  });