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
@@ -15,36 +15,53 @@
15
15
  import { getParsedInvocation } from "../../cli/invocation.js";
16
16
  import { parsePositiveIntFlag } from "../../cli/parse-args.js";
17
17
  import { defineJsonCommand, output, parseAllFlagValues } from "../../cli/shared.js";
18
- import { parseRefInput } from "../../core/asset/resolve-ref.js";
18
+ import { parseBundleRef } from "../../core/asset/asset-ref.js";
19
19
  import { parseMetaRef } from "../../core/asset/stash-meta.js";
20
20
  import { UsageError } from "../../core/errors.js";
21
21
  import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
22
- import { getHyphenatedBoolean, getOutputMode } from "../../output/context.js";
22
+ import { getOutputMode } from "../../output/context.js";
23
23
  import { akmCurate } from "./curate.js";
24
24
  import { akmSearch, parseBeliefFilterMode, parseScopeFilterFlags, parseSearchSource } from "./search.js";
25
25
  import { akmShowUnified } from "./show.js";
26
+ /**
27
+ * `--source` was renamed to `--from` on `search`/`curate` in 0.9 (S8). citty
28
+ * is non-strict, so the retired spelling is silently absorbed rather than
29
+ * rejected — the command then runs against the DEFAULT `--from` value
30
+ * (local) instead of the source the caller named, with exit 0 and no error.
31
+ * Reject it explicitly instead.
32
+ */
33
+ function rejectRetiredSourceFlag() {
34
+ if (!getParsedInvocation().hasFlag("--source"))
35
+ return;
36
+ throw new UsageError("`--source` was renamed to `--from` in 0.9. Use `--from local|registry|all` instead.", "INVALID_FLAG_VALUE");
37
+ }
26
38
  export const searchCommand = defineJsonCommand({
27
- meta: { name: "search", description: "Search the stash" },
39
+ meta: { name: "search", description: "Search the bundle" },
28
40
  args: {
29
41
  query: {
30
42
  type: "positional",
31
- description: 'Search query (omit to list all assets). A ref-prefix query — "<type>:<prefix>/" or bare "<type>:" — enumerates that subtree/type instead of keyword-matching; an explicit --type wins over the parsed type.',
43
+ description: 'Search query (omit to list all assets). A conceptId-prefix query — "memories/projecta/", "bundle//", "bundle//skills/" — enumerates that subtree instead of keyword-matching; a trailing "/" is required, and an explicit --type wins over the prefix.',
32
44
  required: false,
33
45
  default: "",
34
46
  },
35
47
  type: {
36
48
  type: "string",
37
- description: "Asset type filter (skill, command, agent, knowledge, workflow, script, memory, env, secret, lesson, or any). Use workflow to find step-by-step task assets.",
49
+ description: "Asset type filter — free-form, exact match, unvalidated; an unknown type returns no hits (default: any). Built-ins: skill, command, agent, knowledge, workflow, script, memory, lesson, task, session, fact, env, secret, instruction — plus any adapter-defined type (e.g. website, wiki-source, a wiki pageKind). Use workflow to find step-by-step task assets.",
38
50
  },
39
51
  limit: { type: "string", description: "Maximum number of results" },
40
- source: { type: "string", description: "Search source (stash|registry|both)", default: "stash" },
52
+ from: { type: "string", description: "Search source (local|registry|all)", default: "local" },
53
+ assets: {
54
+ type: "boolean",
55
+ description: "Include asset-level search results (only meaningful with --from registry|all)",
56
+ default: false,
57
+ },
41
58
  filter: {
42
59
  type: "string",
43
60
  description: "Scope filter (repeatable): --filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>. Narrows results without changing ranking.",
44
61
  },
45
62
  "include-proposed": {
46
63
  type: "boolean",
47
- description: 'Include entries with quality:"proposed" in the result set. Excluded by default (v1 spec §4.2).',
64
+ description: 'Include entries with quality:"proposed" in the result set. Excluded by default.',
48
65
  default: false,
49
66
  },
50
67
  belief: {
@@ -52,35 +69,54 @@ export const searchCommand = defineJsonCommand({
52
69
  description: "Memory belief filter: all|current|historical. current keeps active memory beliefs; historical keeps contradicted/superseded/archived memory beliefs.",
53
70
  default: "all",
54
71
  },
55
- format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
56
- detail: { type: "string", description: "Detail level (brief|normal|full)" },
57
- "no-project-context": {
72
+ // Declared as the POSITIVE name with `default: true` so citty's native
73
+ // `--no-<name>` negation (it strips a leading `--no-` from ANY token and
74
+ // negates the remainder BEFORE consulting the declared-args table — see
75
+ // node_modules/citty/dist/index.mjs) does the work, the same pattern
76
+ // `sync --push/--no-push` uses. A flag DECLARED as `no-project-context`
77
+ // can never be negated: `--no-project-context` parses as "negate
78
+ // `project-context`", a name nothing declared, leaving the real key at
79
+ // its default `false` forever (F1/A1).
80
+ "project-context": {
58
81
  type: "boolean",
59
- description: "Disable the automatic project-context ranking boost (also disabled by AKM_DISABLE_PROJECT_CONTEXT=1).",
60
- default: false,
82
+ default: true,
83
+ description: "Automatic project-context ranking boost: assets whose name/tags/aliases match the current working " +
84
+ "directory's project get a small score boost, and this search's usage also feeds the scoped-utility " +
85
+ "ranking signal. Default: on. Use --no-project-context to disable BOTH the project-context boost and " +
86
+ "the scoped-utility signal for this search only.",
61
87
  },
62
88
  "include-sessions": {
63
89
  type: "boolean",
64
90
  description: "Include session assets (excluded from default search results via config.search.defaultExcludeTypes).",
65
91
  default: false,
66
92
  },
93
+ // Declared as the POSITIVE name with `default: true` for the same reason
94
+ // as `project-context` above — never declare a flag whose NAME starts
95
+ // with `no-`.
96
+ "track-usage": {
97
+ type: "boolean",
98
+ default: true,
99
+ description: "A successful search updates ranking signals (usage-events telemetry and the MemRL utility-score bump " +
100
+ "used to prioritize future results). Default: on. Use --no-track-usage to run a read-only search that " +
101
+ "does not influence future ranking.",
102
+ },
67
103
  },
68
104
  async run({ args }) {
105
+ rejectRetiredSourceFlag();
69
106
  const query = (args.query ?? "").trim();
70
- if (!query) {
71
- throw new UsageError('A search query is required. Usage: akm search "<query>" [--type <type>] [--limit <n>]', "MISSING_REQUIRED_ARGUMENT", 'Pass a query like `akm search "docker"` or `akm search "code review" --type skill`.');
72
- }
73
107
  const type = args.type;
74
108
  const limit = parsePositiveIntFlag(args.limit ?? undefined);
75
- const source = parseSearchSource(args.source);
109
+ const source = parseSearchSource(args.from);
76
110
  // Repeatable; citty exposes only the last `--filter` value, so read all
77
111
  // occurrences directly from argv (same pattern as `--tag`).
78
112
  const filterTokens = parseAllFlagValues("--filter");
79
113
  const filters = parseScopeFilterFlags(filterTokens, "--filter");
80
114
  const includeProposed = args["include-proposed"] === true;
81
115
  const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
82
- const noProjectContext = getHyphenatedBoolean(args, "no-project-context");
116
+ const disableProjectContext = args["project-context"] === false;
117
+ const skipLogging = args["track-usage"] === false;
83
118
  const includeSessions = args["include-sessions"];
119
+ const assets = args.assets === true;
84
120
  const outputMode = getOutputMode();
85
121
  const result = await akmSearch({
86
122
  query,
@@ -91,8 +127,10 @@ export const searchCommand = defineJsonCommand({
91
127
  includeProposed,
92
128
  belief,
93
129
  includeSessions,
94
- disableProjectContext: noProjectContext,
95
- disableScopedUtility: noProjectContext,
130
+ disableProjectContext,
131
+ disableScopedUtility: disableProjectContext,
132
+ skipLogging,
133
+ assets,
96
134
  eventSource: resolveUsageEventSource(),
97
135
  attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
98
136
  });
@@ -100,7 +138,10 @@ export const searchCommand = defineJsonCommand({
100
138
  },
101
139
  });
102
140
  export const curateCommand = defineJsonCommand({
103
- meta: { name: "curate", description: "Curate the best matching assets for a task or prompt" },
141
+ meta: {
142
+ name: "curate",
143
+ description: "Pick the assets worth loading for a task. Unlike `akm search`, this reranks by intent, attaches a preview and run details per hit, adds related support refs, and summarizes the set — the usual starting point for an agent.",
144
+ },
104
145
  args: {
105
146
  // Optional in citty so run() is invoked when omitted; we re-validate
106
147
  // below to surface a structured UsageError (exit 2) instead of citty's
@@ -108,54 +149,126 @@ export const curateCommand = defineJsonCommand({
108
149
  query: { type: "positional", description: "Task or prompt to curate assets for", required: false },
109
150
  type: {
110
151
  type: "string",
111
- description: "Asset type filter (skill, command, agent, knowledge, workflow, script, memory, env, secret, lesson, or any). Use workflow to curate step-by-step task assets.",
152
+ description: "Asset type filter — free-form, exact match, unvalidated; an unknown type returns no hits (default: any). Built-ins: skill, command, agent, knowledge, workflow, script, memory, lesson, task, session, fact, env, secret, instruction — plus any adapter-defined type (e.g. website, wiki-source, a wiki pageKind). Use workflow to curate step-by-step task assets.",
112
153
  },
113
154
  limit: { type: "string", description: "Maximum number of curated results", default: "4" },
114
- source: { type: "string", description: "Search source (stash|registry|both)", default: "stash" },
115
- // Output-contract flags. The active values are read from the process-level
116
- // singleton (parsed from argv at startup); these declarations make them
117
- // visible in `akm curate --help` and document the supported axes.
118
- format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
119
- detail: { type: "string", description: "Detail level (brief|normal|full)" },
120
- shape: { type: "string", description: "Output projection (human|agent)" },
155
+ from: { type: "string", description: "Search source (local|registry|all)", default: "local" },
156
+ // Declared as the POSITIVE name with `default: true` — see the
157
+ // `project-context` comment on `searchCommand` above for why a flag NAME
158
+ // must never start with `no-`.
159
+ "track-usage": {
160
+ type: "boolean",
161
+ default: true,
162
+ description: "A successful curate updates ranking signals (usage-events telemetry for the curated items and the " +
163
+ "underlying search). Default: on. Use --no-track-usage to run a read-only curate that does not " +
164
+ "influence future ranking.",
165
+ },
121
166
  },
122
167
  async run({ args }) {
168
+ rejectRetiredSourceFlag();
123
169
  if (!args.query || !String(args.query).trim()) {
124
170
  throw new UsageError('A curate query is required. Usage: akm curate "<task or prompt>" [--type <type>] [--limit <n>]', "MISSING_REQUIRED_ARGUMENT", 'Describe the task you want assets for, e.g. `akm curate "deploy to prod"`.');
125
171
  }
126
172
  const type = args.type;
127
173
  const limitParsed = parsePositiveIntFlag(args.limit ?? undefined);
128
174
  const limit = limitParsed && limitParsed > 0 ? limitParsed : 4;
129
- const source = parseSearchSource(args.source ?? "stash");
175
+ const source = parseSearchSource(args.from ?? "local");
176
+ const skipLogging = args["track-usage"] === false;
130
177
  const outputMode = getOutputMode();
131
178
  const curated = await akmCurate({
132
179
  query: args.query,
133
180
  type,
134
181
  limit,
135
182
  source,
183
+ skipLogging,
136
184
  eventSource: resolveUsageEventSource(),
137
185
  attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
138
186
  });
139
187
  output("curate", curated);
140
188
  },
141
189
  });
190
+ /**
191
+ * Reject `--scope` (either spelling) on `akm show` (E-3). `--scope` was
192
+ * removed in favor of `--filter` (R-047, guardrail 6 — no alias, must keep
193
+ * failing loudly, not silently). It is deliberately NOT a declared flag on
194
+ * this command, which means citty's default behavior for an undeclared flag
195
+ * kicks in — and that default is silent acceptance:
196
+ *
197
+ * - `--scope=user=nobody` (equals form): citty consumes it as an unknown
198
+ * flag's own inline value. It never reaches `args._`, so nothing downstream
199
+ * ever notices — the command runs to completion and exits 0, having
200
+ * silently ignored the caller's (unsatisfied) scope request. This is the
201
+ * dangerous case: the caller believes a read was scoped when it was not,
202
+ * and it directly violates guardrail 6's "removed spelling must fail
203
+ * loudly, not silently".
204
+ * - `--scope user=nobody` (space form): citty treats `--scope` as boolean
205
+ * and pushes `user=nobody` into `args._` as a stray positional, which
206
+ * incidentally trips `rejectExtraShowPositionals`'s arity check below —
207
+ * but with the wrong diagnosis (it blames the unrelated retired
208
+ * `toc|section|lines|frontmatter|full` view-mode grammar).
209
+ *
210
+ * This check runs FIRST, before the positional check, so both spellings are
211
+ * caught by one explicit, correctly-worded error — it does NOT make `--scope`
212
+ * work, it only makes the failure loud and the diagnosis accurate.
213
+ *
214
+ * NOTE (general issue, out of scope here): citty silently accepts ANY
215
+ * undeclared flag on ANY command (e.g. `akm info --totallybogus` exits 0) —
216
+ * this same silent-ignore failure mode applies repo-wide, not just to
217
+ * `--scope` on `show`. Fixing that generally is a separate, wide-blast-radius
218
+ * owner decision (same family as E-2, `akm list --type skill`); this function
219
+ * only closes the `--scope`/`show` instance of it.
220
+ */
221
+ function rejectRemovedScopeFlag(ref) {
222
+ const usedScopeFlag = getParsedInvocation().userArgs.some((token) => token === "--scope" || token.startsWith("--scope="));
223
+ if (!usedScopeFlag)
224
+ return;
225
+ throw new UsageError("akm show has no --scope flag — it was removed in 0.9.0. Use --filter instead: " +
226
+ "--filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>.", "INVALID_FLAG_VALUE", `\`akm show ${ref} --filter user=<id>\` narrows resolution to assets whose frontmatter scope matches.`);
227
+ }
228
+ /**
229
+ * Reject any positional after the ref. The
230
+ * `akm show <ref> toc|section "H"|lines A B|frontmatter|full` view grammar was
231
+ * removed in 0.9.0; its keywords used to be rewritten into hidden flags before
232
+ * citty saw argv, so without this guard a stale invocation would silently
233
+ * render the whole item instead of the view the caller asked for.
234
+ *
235
+ * `--scope` is handled separately, and earlier, by {@link rejectRemovedScopeFlag}
236
+ * — by the time this runs, a `--scope`-caused stray positional has already
237
+ * been intercepted with the correct diagnosis, so this function's generic
238
+ * message is reached only by genuine leftover view-grammar tokens.
239
+ */
240
+ function rejectExtraShowPositionals(positionals, ref) {
241
+ const extra = (Array.isArray(positionals) ? positionals.map(String) : []).slice(1);
242
+ if (extra.length === 0)
243
+ return;
244
+ throw new UsageError(`akm show takes a single ref, but got ${extra.map((token) => `"${token}"`).join(" ")} after "${ref}". ` +
245
+ "The view-mode grammar (toc|section|lines|frontmatter|full) was removed in 0.9.0 — use " +
246
+ `\`akm show ${ref}#<heading-slug>\` to read one section, or \`akm show ${ref}\` for the whole item.`, "INVALID_FLAG_VALUE", "An unmatched #fragment lists the available slugs.");
247
+ }
142
248
  export const showCommand = defineJsonCommand({
143
249
  meta: {
144
250
  name: "show",
145
- description: "Show a stash asset by ref (e.g. akm show knowledge/guide.md toc, akm show knowledge/guide.md section 'Auth')",
251
+ description: "Show a bundle asset by ref (e.g. akm show knowledge/guide.md, akm show knowledge/guide.md#auth)",
146
252
  },
147
253
  args: {
148
254
  ref: {
149
255
  type: "positional",
150
- description: 'Asset ref ([bundle//]conceptId) optionally followed by a view mode. View modes: `toc` (table of contents), `section "Heading"` (extract one section), `lines <start> <end>` (line range), `frontmatter` (YAML metadata only), `full` (raw file). Example: `akm show knowledge/guide.md section "Auth"`.',
256
+ description: "Asset ref ([bundle//]conceptId[#fragment]). On a markdown document `#fragment` selects one section by heading slug, and an unmatched fragment lists the available slugs. Example: `akm show knowledge/guide.md#auth`.",
151
257
  required: true,
152
258
  },
153
- format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
154
- detail: { type: "string", description: "Detail level (brief|normal|full)" },
155
- shape: { type: "string", description: "Output projection (human|agent|summary)" },
156
- scope: {
259
+ filter: {
157
260
  type: "string",
158
- description: "Scope filter (repeatable): --scope user=<id> --scope agent=<id> --scope run=<id> --scope channel=<name>. Narrows resolution to assets whose frontmatter scope matches.",
261
+ description: "Scope filter (repeatable): --filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>. Narrows resolution to assets whose frontmatter scope matches. Same axis as `akm search --filter`.",
262
+ },
263
+ // Declared as the POSITIVE name with `default: true` — see the
264
+ // `project-context` comment on `searchCommand` above for why a flag NAME
265
+ // must never start with `no-`.
266
+ "track-usage": {
267
+ type: "boolean",
268
+ default: true,
269
+ description: "A successful show updates ranking signals (usage-events telemetry, including the search-selection " +
270
+ "linkage when this show follows a recent search). Default: on. Use --no-track-usage to run a " +
271
+ "read-only show that does not influence future ranking.",
159
272
  },
160
273
  },
161
274
  async run({ args }) {
@@ -163,55 +276,44 @@ export const showCommand = defineJsonCommand({
163
276
  // not a typed asset ref — skip ref validation and let akmShowUnified
164
277
  // direct-read it. (the ref parser would reject the non-type `meta`.)
165
278
  if (!parseMetaRef(args.ref))
166
- parseRefInput(args.ref);
167
- // The knowledge-view positional syntax (`akm show knowledge/foo section "Auth"`)
168
- // is rewritten to `--akmView` / `--akmHeading` / `--akmStart` / `--akmEnd`
169
- // by `normalizeShowArgv` before citty parses argv. We read those values
170
- // directly via `getParsedInvocation()` so the flags don't surface as
171
- // user-facing options in `akm show --help`.
279
+ parseBundleRef(args.ref);
280
+ rejectRemovedScopeFlag(args.ref);
281
+ rejectExtraShowPositionals(args._, args.ref);
172
282
  const invocation = getParsedInvocation();
173
- const akmView = invocation.getFlagValue("--akmView");
174
- const akmHeading = invocation.getFlagValue("--akmHeading");
175
- const akmStart = invocation.getFlagValue("--akmStart");
176
- const akmEnd = invocation.getFlagValue("--akmEnd");
177
- let view;
178
- if (akmView) {
179
- switch (akmView) {
180
- case "section":
181
- view = { mode: "section", heading: akmHeading ?? "" };
182
- break;
183
- case "lines":
184
- view = {
185
- mode: "lines",
186
- start: Number(akmStart ?? "1"),
187
- end: akmEnd ? parseInt(akmEnd, 10) : Number.MAX_SAFE_INTEGER,
188
- };
189
- break;
190
- case "toc":
191
- case "frontmatter":
192
- case "full":
193
- view = { mode: akmView };
194
- break;
195
- default:
196
- throw new UsageError(`Unknown view mode: ${akmView}. Expected one of: full|toc|frontmatter|section|lines`);
197
- }
198
- }
199
283
  const cliShape = getOutputMode().shape;
284
+ // F6/R-021 — `show` deliberately does NOT inherit `output.detail` from
285
+ // config the way `search`/`curate` do via `getOutputMode().detail`
286
+ // (which merges an explicit `--detail` flag with the config default,
287
+ // "brief" out of the box). A bare `akm show <ref>` must always return
288
+ // the FULL asset body regardless of `config.output.detail` — that is
289
+ // the point of the command. This is a deliberate, permanent exemption,
290
+ // not an oversight, so it is resolved through exactly one path here:
291
+ // read the raw `--detail` flag directly (bypassing the config-merged
292
+ // output mode on purpose) and only ever narrow the response when the
293
+ // caller EXPLICITLY passed `--detail brief` on this invocation.
294
+ // `--detail full` (explicit or, since it's also the implicit default,
295
+ // omitted) and any other value fall through to the full response.
200
296
  const explicitDetail = invocation.getFlagValue("--detail");
201
- // `--shape summary` selects the compact metadata projection for show
202
- // (the legacy `--detail summary` spelling still maps here via the
203
- // back-compat path in resolveOutputMode). `--detail brief` forces the
204
- // brief response regardless of shape.
205
- const showDetail = explicitDetail === "brief" ? "brief" : cliShape === "summary" ? "summary" : undefined;
206
- // `--scope` is repeatable — citty only exposes the last value, so read
207
- // every occurrence directly from argv (same pattern as `--filter`).
208
- const scopeTokens = parseAllFlagValues("--scope");
209
- const scope = parseScopeFilterFlags(scopeTokens, "--scope");
297
+ // `--shape summary` selects the compact metadata projection for show.
298
+ // `--detail brief` forces the brief response regardless of shape.
299
+ const showDetail = explicitDetail === "brief"
300
+ ? "brief"
301
+ : explicitDetail === "full"
302
+ ? "full"
303
+ : cliShape === "summary"
304
+ ? "summary"
305
+ : undefined;
306
+ // `--filter` is repeatable — citty only exposes the last value, so read
307
+ // every occurrence directly from argv (same helper as `akm search`; the two
308
+ // commands share one spelling for the scope-narrowing axis).
309
+ const scopeTokens = parseAllFlagValues("--filter");
310
+ const scope = parseScopeFilterFlags(scopeTokens, "--filter");
311
+ const skipLogging = args["track-usage"] === false;
210
312
  const result = await akmShowUnified({
211
313
  ref: args.ref,
212
- view,
213
314
  detail: showDetail,
214
315
  scope,
316
+ skipLogging,
215
317
  eventSource: resolveUsageEventSource(),
216
318
  });
217
319
  output("show", result);
@@ -8,7 +8,7 @@
8
8
  * because there is one data store. Provider fan-out is gone.
9
9
  *
10
10
  * The orchestration here is thin: build the FTS query, optionally interleave
11
- * a registry search behind `--source registry|both`, and log a usage event.
11
+ * a registry search behind `--from registry|all`, and log a usage event.
12
12
  * Provider `search()` methods do not exist.
13
13
  */
14
14
  import { getSources, loadConfig } from "../../core/config/config.js";
@@ -35,23 +35,31 @@ export async function akmSearch(input) {
35
35
  const normalizedQuery = query.toLowerCase();
36
36
  const searchType = input.type ?? "any";
37
37
  const limit = normalizeLimit(input.limit);
38
- const parsedSource = parseSearchSource(input.source ?? "stash");
38
+ const parsedSource = parseSearchSource(input.source ?? "local");
39
39
  const config = loadConfig();
40
- // Named-source filter: when --source is not a standard enum value, treat it
40
+ // Named-source filter: when --from is not a standard enum value, treat it
41
41
  // as a named source (a `bundles` key). Validated early (before
42
42
  // resolveSourceEntries, which can throw STASH_DIR_NOT_FOUND) so that a bad
43
- // --source name always produces INVALID_SOURCE_VALUE regardless of stash state.
43
+ // --from name always produces INVALID_SOURCE_VALUE regardless of stash state.
44
44
  let namedSourceName;
45
45
  let source;
46
- if (parsedSource !== "stash" && parsedSource !== "registry" && parsedSource !== "both") {
46
+ if (parsedSource !== "local" && parsedSource !== "registry" && parsedSource !== "all") {
47
47
  namedSourceName = parsedSource;
48
48
  assertNamedSourceExists(config, namedSourceName);
49
- source = "stash";
49
+ source = "local";
50
50
  }
51
51
  else {
52
52
  source = parsedSource;
53
53
  }
54
- let allSources = resolveReadSources(undefined, config).sources;
54
+ // A pure `--from registry` search needs no local stash at all (this is the
55
+ // one path folded in from the retired `akm registry search`, which never
56
+ // touched local source/stash resolution either) — only resolve local
57
+ // sources when local hits are actually needed, or a named source narrows
58
+ // to a local bundle. Without this, `resolveReadSources` (which can throw
59
+ // STASH_DIR_NOT_FOUND via `resolveStashDir()`) would make registry-only
60
+ // search fail on a machine with no stash ever configured.
61
+ const needsLocalSources = source !== "registry" || namedSourceName !== undefined;
62
+ let allSources = needsLocalSources ? resolveReadSources(undefined, config).sources : [];
55
63
  // When a named source was requested, narrow the sources list to just that entry.
56
64
  // `resolveSourceEntries` sets `registryId` to `entry.name` for each config source.
57
65
  if (namedSourceName !== undefined) {
@@ -61,23 +69,24 @@ export async function akmSearch(input) {
61
69
  // disk (resolveSourceEntries skips non-existent dirs). Fall through to the
62
70
  // zero-sources guard below which emits a friendly warning.
63
71
  }
64
- if (allSources.length === 0) {
72
+ if (needsLocalSources && allSources.length === 0) {
65
73
  // stashDir: "" is a safe sentinel here — the response carries zero hits
66
74
  // and a warning, so no downstream code will try to use the empty path.
67
75
  const response = {
68
76
  schemaVersion: 1,
69
- stashDir: "",
77
+ bundleDir: "",
70
78
  source,
71
79
  hits: [],
72
- warnings: ["No stashes configured. Run `akm init` to create your working stash."],
80
+ warnings: ["No bundles configured. Run `akm bundle create` to create your working bundle."],
73
81
  timing: { totalMs: Date.now() - t0 },
74
82
  };
75
83
  maybeLogSearchEvent(input, query, response);
76
84
  return response;
77
85
  }
78
86
  // Primary stash directory — used for DB path lookups and as the default
79
- // stash root. Safe because the empty-sources case is handled above.
80
- const stashDir = allSources[0].path;
87
+ // stash root. Empty when a pure registry search skipped local resolution
88
+ // entirely (safe: registry-only responses never read `stashDir`).
89
+ const stashDir = allSources[0]?.path ?? "";
81
90
  // Expose the filtered source list to downstream search calls.
82
91
  const sources = allSources;
83
92
  const filters = normalizeScopeFilters(input.filters);
@@ -95,7 +104,7 @@ export async function akmSearch(input) {
95
104
  filters,
96
105
  includeProposed,
97
106
  beliefFilter: belief,
98
- // When `--source <name>` narrowed the source list above, propagate
107
+ // When `--from <name>` narrowed the source list above, propagate
99
108
  // that intent down to the database layer so FTS/vector hits from
100
109
  // sources outside the narrowed set are filtered out post-ranking.
101
110
  // Without this, the index (which spans every configured source)
@@ -105,13 +114,15 @@ export async function akmSearch(input) {
105
114
  disableProjectContext: input.disableProjectContext === true,
106
115
  disableScopedUtility: input.disableScopedUtility === true,
107
116
  });
108
- const registryResult = source === "stash" ? undefined : await searchRegistry(query, { limit, registries: config.registries });
109
- if (source === "stash") {
117
+ const registryResult = source === "local"
118
+ ? undefined
119
+ : await searchRegistry(query, { limit, includeAssets: input.assets === true, registries: config.registries });
120
+ if (source === "local") {
110
121
  const localHits = localResult?.hits ?? [];
111
122
  const hasResults = localHits.length > 0;
112
123
  const response = {
113
124
  schemaVersion: 1,
114
- stashDir,
125
+ bundleDir: stashDir,
115
126
  source,
116
127
  hits: localHits,
117
128
  tip: hasResults ? undefined : localResult?.tip,
@@ -122,18 +133,14 @@ export async function akmSearch(input) {
122
133
  return response;
123
134
  }
124
135
  const registryHits = (registryResult?.hits ?? []).map((hit) => {
125
- // Use the provider-supplied installRef when available (already correctly
126
- // prefixed), otherwise derive it from source + ref for backward compat.
127
- const installRef = hit.installRef ??
128
- (hit.source === "npm" ? `npm:${hit.ref}` : hit.source === "git" ? `git+${hit.ref}` : `github:${hit.ref}`);
129
- // The legacy registry boolean `curated` was removed in v1 (spec §4.2).
136
+ const installRef = hit.installRef;
130
137
  // Hit-level `warnings` are forwarded when the provider surfaced any.
131
138
  return {
132
139
  type: "registry",
133
140
  name: hit.title,
134
141
  id: hit.id,
135
142
  description: hit.description,
136
- action: `akm add ${installRef} -> then search again`,
143
+ action: `akm bundle add ${installRef} -> then search again`,
137
144
  score: hit.score,
138
145
  registryName: hit.registryName,
139
146
  ...(hit.warnings && hit.warnings.length > 0 ? { warnings: hit.warnings } : {}),
@@ -144,7 +151,7 @@ export async function akmSearch(input) {
144
151
  const hasResults = slicedRegistryHits.length > 0;
145
152
  const response = {
146
153
  schemaVersion: 1,
147
- stashDir,
154
+ bundleDir: stashDir,
148
155
  source,
149
156
  hits: [],
150
157
  registryHits: slicedRegistryHits,
@@ -155,13 +162,13 @@ export async function akmSearch(input) {
155
162
  maybeLogSearchEvent(input, query, response);
156
163
  return response;
157
164
  }
158
- // source === "both"
165
+ // source === "all"
159
166
  const allStashHits = (localResult?.hits ?? []).slice(0, limit);
160
167
  const warnings = [...(localResult?.warnings ?? []), ...(registryResult?.warnings ?? [])];
161
168
  const hasResults = allStashHits.length > 0 || registryHits.length > 0;
162
169
  const response = {
163
170
  schemaVersion: 1,
164
- stashDir,
171
+ bundleDir: stashDir,
165
172
  source,
166
173
  hits: allStashHits,
167
174
  registryHits,
@@ -209,7 +216,7 @@ function resolveEntryIds(db, hits) {
209
216
  * - `stashHitCount`: number of local stash hits (response.hits, source-only
210
217
  * entries). Always 0 for registry-only searches.
211
218
  * - `registryHitCount`: number of registry hits (response.registryHits).
212
- * Only non-zero when source is "registry" or "both".
219
+ * Only non-zero when source is "registry" or "all".
213
220
  * - `resultCount`: total across both pools so telemetry reflects the actual
214
221
  * number of results the user saw, regardless of source mode.
215
222
  *
@@ -273,7 +280,7 @@ function logSearchEvent(query, response, mode = "keyword", eventSource = "user",
273
280
  if (resolvedIds.length > 0) {
274
281
  let scopeKey;
275
282
  try {
276
- const stashPath = response.stashDir;
283
+ const stashPath = response.bundleDir;
277
284
  const disabled = disableScopedUtility || (stashPath && isTransientStashPath(stashPath));
278
285
  scopeKey = disabled ? undefined : getCurrentWorkflowScopeKey();
279
286
  }
@@ -291,7 +298,7 @@ function logSearchEvent(query, response, mode = "keyword", eventSource = "user",
291
298
  }
292
299
  // ── Helpers ──────────────────────────────────────────────────────────────────
293
300
  /**
294
- * Validate a named `--source` against the bundle-derived source list (0.9.0
301
+ * Validate a named `--from` against the bundle-derived source list (0.9.0
295
302
  * spec §10.1: a named source is a `bundles` key, matched via its derived
296
303
  * source entry's `name`, or an exact path). Throws INVALID_SOURCE_VALUE with
297
304
  * the known names before any stash access can fail differently.
@@ -303,7 +310,7 @@ function assertNamedSourceExists(config, namedSourceName) {
303
310
  const validNames = configSources.map((s) => s.name).filter((n) => Boolean(n));
304
311
  const hint = validNames.length > 0
305
312
  ? `Known source names: ${validNames.join(", ")}`
306
- : "No named sources are configured. Run `akm list` to see installed stashes.";
313
+ : "No named sources are configured. Run `akm bundle list` to see installed bundles.";
307
314
  throw new UsageError(`Unknown source name: "${namedSourceName}". ${hint}`, "INVALID_SOURCE_VALUE");
308
315
  }
309
316
  }
@@ -314,13 +321,12 @@ function normalizeLimit(limit) {
314
321
  return Math.min(Math.floor(limit), 200);
315
322
  }
316
323
  /**
317
- * Parse the `--source` flag value.
324
+ * Parse the `--from` flag value.
318
325
  *
319
326
  * Accepts:
320
- * - `stash` (default) — search the local stash index only
327
+ * - `local` (default) — search the local stash index only
321
328
  * - `registry` — search remote registries only
322
- * - `both` — search stash and registries
323
- * - `local` — alias for `stash`
329
+ * - `all` — search local and registries
324
330
  * - Any named source from `config.sources[].name` — filters stash results to
325
331
  * that single source only. The named-source path is detected and resolved
326
332
  * inside `akmSearch`; this function returns the raw name so the caller can
@@ -332,13 +338,21 @@ function normalizeLimit(limit) {
332
338
  * at parse time.
333
339
  */
334
340
  export function parseSearchSource(source) {
335
- if (source === "stash" || source === "registry" || source === "both")
341
+ if (source === "local" || source === "registry" || source === "all")
336
342
  return source;
337
- // Accept "local" as alias for "stash"
338
- if (source === "local")
339
- return "stash";
340
343
  if (typeof source === "undefined")
341
- return "stash";
344
+ return "local";
345
+ // 0.9.0 (S8): `--source stash`/`--source both` renamed to `--from
346
+ // local`/`--from all`. Reject the retired values explicitly — otherwise
347
+ // they fall through to the named-source lookup below and surface as a
348
+ // misleading "no source named stash/both" error instead of naming the
349
+ // rename.
350
+ if (source === "stash") {
351
+ throw new UsageError('"stash" was renamed to "local" in 0.9. Use `--from local` instead.', "INVALID_FLAG_VALUE");
352
+ }
353
+ if (source === "both") {
354
+ throw new UsageError('"both" was renamed to "all" in 0.9. Use `--from all` instead.', "INVALID_FLAG_VALUE");
355
+ }
342
356
  // Pass through unknown strings — they may be valid named sources.
343
357
  // `akmSearch` will validate against config.sources and throw a UsageError
344
358
  // with a helpful message if the name isn't found.
@@ -369,11 +383,12 @@ function normalizeScopeFilters(raw) {
369
383
  return Object.keys(out).length > 0 ? out : undefined;
370
384
  }
371
385
  /**
372
- * Parse repeated `--filter k=v` / `--scope k=v` argv tokens into a
386
+ * Parse repeated `--filter k=v` argv tokens into a
373
387
  * `StashEntryScope`. Throws a {@link UsageError} for malformed tokens
374
388
  * (missing `=`, unknown key) so callers don't see ambiguous misses.
375
389
  *
376
- * Used by both `akm search --filter` and `akm show --scope`.
390
+ * Used by both `akm search --filter` and `akm show --filter` — the two
391
+ * commands share one spelling for the scope-narrowing axis.
377
392
  */
378
393
  export function parseScopeFilterFlags(values, flagName = "--filter") {
379
394
  if (values.length === 0)
@@ -398,11 +413,11 @@ export function parseScopeFilterFlags(values, flagName = "--filter") {
398
413
  }
399
414
  /**
400
415
  * Returns true iff `entry.scope` (when present) satisfies every key in
401
- * `filters`. A missing `entry.scope` (legacy memories) only matches when
402
- * `filters` is empty / undefined.
416
+ * `filters`. A missing `entry.scope` only matches when `filters` is empty or
417
+ * undefined.
403
418
  *
404
419
  * Filter semantics:
405
- * - No filter passed → all entries match (legacy behavior preserved).
420
+ * - No filter passed → all entries match.
406
421
  * - `filters.user = "alice"` → entry must have `scope.user === "alice"`.
407
422
  * - Multiple keys → AND-joined; every supplied key must match.
408
423
  */