akm-cli 0.9.0-rc.0 → 0.9.0-rc.13

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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -1,21 +1,29 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { getParsedInvocation } from "../../cli/invocation.js";
4
5
  import { getStringArg } from "../../cli/parse-args.js";
5
6
  import { defineJsonCommand, output, parseAllFlagValues } from "../../cli/shared.js";
6
7
  import { UsageError } from "../../core/errors.js";
7
8
  import { appendEvent } from "../../core/events.js";
8
- import { buildMemoryFrontmatter, parseDuration, readMemoryContent, resolveRememberContentArg, runAutoHeuristics, runLlmEnrich, } from "../remember.js";
9
- import { assertFlatAssetName, inferAssetName, writeMarkdownAsset } from "./knowledge.js";
9
+ import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
10
+ import { buildMemoryFrontmatter, parseDuration, readMemoryContent, runAutoHeuristics, runLlmEnrich } from "../remember.js";
11
+ import { assertFlatAssetName, inferAssetName, resolveSupersedesForWrite, resolveSupersedesWriteTarget, resolveXrefsForWrite, writeMarkdownAsset, } from "./knowledge.js";
10
12
  import { akmSearch } from "./search.js";
11
13
  // ── Helper: similar memory search ────────────────────────────────────────────
12
14
  /**
13
15
  * Best-effort top-3 similar memory search for `--show-similar`.
14
16
  * Scoped to memory: type; excludes the just-written ref.
15
17
  */
16
- async function fetchSimilarMemories(query, excludeRef) {
18
+ async function fetchSimilarMemories(query, excludeRef, eventSource) {
17
19
  try {
18
- const result = await akmSearch({ query, type: "memory", limit: 4 });
20
+ const result = await akmSearch({
21
+ query,
22
+ type: "memory",
23
+ limit: 4,
24
+ eventSource,
25
+ attributionProjection: "brief",
26
+ });
19
27
  return (result.hits ?? [])
20
28
  .filter((h) => "ref" in h && h.ref !== excludeRef)
21
29
  .slice(0, 3)
@@ -25,11 +33,22 @@ async function fetchSimilarMemories(query, excludeRef) {
25
33
  return [];
26
34
  }
27
35
  }
36
+ /**
37
+ * `--target` was renamed to `--bundle` on `remember` in 0.9 (S8). citty is
38
+ * non-strict, so the retired spelling is silently absorbed rather than
39
+ * rejected — the memory then lands in the default bundle instead of the one
40
+ * the caller named, with exit 0 and no error. Reject it explicitly instead.
41
+ */
42
+ function rejectRetiredTargetFlag() {
43
+ if (!getParsedInvocation().hasFlag("--target"))
44
+ return;
45
+ throw new UsageError("`akm remember --target` was renamed to `--bundle` in 0.9. Use `--bundle <name>` instead.", "INVALID_FLAG_VALUE");
46
+ }
28
47
  // ── Command definition ────────────────────────────────────────────────────────
29
48
  export const rememberCommand = defineJsonCommand({
30
49
  meta: {
31
50
  name: "remember",
32
- description: "Record a memory in the default stash",
51
+ description: "Record a memory in the default bundle",
33
52
  },
34
53
  args: {
35
54
  content: {
@@ -66,6 +85,14 @@ export const rememberCommand = defineJsonCommand({
66
85
  type: "string",
67
86
  description: "Source reference (URL, asset ref, file path, or any free-form string)",
68
87
  },
88
+ xref: {
89
+ type: "string",
90
+ description: "Cross-reference ref recorded in the memory's `xrefs:` frontmatter (repeatable: --xref knowledge/auth-flow --xref memories/vpn-note). Each ref must resolve in the write target or a configured source; an unresolvable ref aborts the write.",
91
+ },
92
+ supersedes: {
93
+ type: "string",
94
+ description: "Ref of an existing asset this memory corrects (repeatable: --supersedes memories/projectA/old-note). Writes 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 write; a ref outside the write target and working bundle still writes the correction but skips the demotion (reported as applied: false).",
95
+ },
69
96
  auto: {
70
97
  type: "boolean",
71
98
  description: "Apply heuristic tagging (code, subjective, source, observed_at) from the body",
@@ -76,9 +103,9 @@ export const rememberCommand = defineJsonCommand({
76
103
  description: "Call the configured LLM to propose tags and description (requires LLM config)",
77
104
  default: false,
78
105
  },
79
- target: {
106
+ bundle: {
80
107
  type: "string",
81
- description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working stash.",
108
+ description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working bundle.",
82
109
  },
83
110
  user: {
84
111
  type: "string",
@@ -96,19 +123,50 @@ export const rememberCommand = defineJsonCommand({
96
123
  type: "string",
97
124
  description: "Scope this memory to a channel name (persisted as `scope_channel` frontmatter)",
98
125
  },
99
- showSimilar: {
126
+ "show-similar": {
100
127
  type: "boolean",
101
- description: "Return top-3 similar existing memories in output (opt-in)",
128
+ // R-062: canonical spelling is kebab-case, matching every other
129
+ // multi-word flag in the CLI (--fail-on-flagged, --auto-fix, …).
130
+ // `--showSimilar` (the pre-rename spelling) is kept as an explicit,
131
+ // documented alias rather than a silent citty auto-alias — citty
132
+ // registers BOTH the camelCase and kebab-case spelling of any
133
+ // declared flag name automatically, so this is a rename, not a
134
+ // breaking change: both spellings already worked, and both keep
135
+ // working.
136
+ alias: "showSimilar",
137
+ description: "Return top-3 similar existing memories in output (opt-in). Alias: --showSimilar.",
102
138
  },
103
139
  },
104
140
  async run({ args }) {
105
- const body = readMemoryContent(resolveRememberContentArg(args.content));
141
+ rejectRetiredTargetFlag();
142
+ const body = readMemoryContent(args.content);
143
+ const eventSource = resolveUsageEventSource();
106
144
  // `--name` is a flat name; subdirectory placement is `--path`'s job.
107
145
  assertFlatAssetName(args.name);
108
146
  // Determine if the user has requested any structured metadata mode.
109
147
  // Collect all --tag occurrences directly from process.argv because citty
110
148
  // only exposes the last value for repeated string flags.
111
149
  const rawTags = parseAllFlagValues("--tag");
150
+ // Collect and validate --xref occurrences (repeatable, same argv pattern
151
+ // as --tag). Validation happens BEFORE any write: an unresolvable ref is
152
+ // input validation (UsageError → exit 2) and must leave the stash
153
+ // untouched. Refs resolvable only in a configured extra stash source are
154
+ // accepted (cross-stash provenance).
155
+ const rawSupersedes = parseAllFlagValues("--supersedes");
156
+ const writeTarget = resolveSupersedesWriteTarget(rawSupersedes, args.bundle);
157
+ const xrefs = resolveXrefsForWrite(parseAllFlagValues("--xref"), writeTarget);
158
+ // Collect and validate --supersedes occurrences (repeatable). Same
159
+ // before-any-write validation contract: an unresolvable ref exits 2 with
160
+ // nothing written AND nothing demoted (no partial correction). The
161
+ // superseded refs fold into the new memory's xrefs automatically
162
+ // (correction provenance per the back-linking conventions); the demotion
163
+ // itself runs inside writeMarkdownAsset, ordered before the git boundary
164
+ // commit.
165
+ const supersedes = resolveSupersedesForWrite(rawSupersedes, writeTarget);
166
+ for (const s of supersedes) {
167
+ if (!xrefs.includes(s.ref))
168
+ xrefs.push(s.ref);
169
+ }
112
170
  // Collect scope flags. Scope alone counts as structured metadata so we
113
171
  // emit frontmatter, but it does NOT trigger the "tags required" check —
114
172
  // memory + scope (no tags) is a valid combination for multi-tenant use.
@@ -120,7 +178,10 @@ export const rememberCommand = defineJsonCommand({
120
178
  }
121
179
  const hasScope = Object.keys(scopeFields).length > 0;
122
180
  const hasTagRequiringArgs = rawTags.length > 0 || !!args.expires || !!args.source || !!args.description;
123
- const hasStructuredArgs = hasTagRequiringArgs || hasScope || args.auto;
181
+ // --xref counts as structured metadata (it must land in frontmatter) but,
182
+ // like scope, does NOT trigger the tags-required check — provenance
183
+ // without tags is a valid write.
184
+ const hasStructuredArgs = hasTagRequiringArgs || hasScope || args.auto || xrefs.length > 0;
124
185
  if (!hasStructuredArgs) {
125
186
  // Phase 1B / Rec 7: even the zero-flag hot-path emits
126
187
  // `captureMode: hot` + `beliefState: asserted` so user-supplied
@@ -139,8 +200,9 @@ export const rememberCommand = defineJsonCommand({
139
200
  fallbackPrefix: "memory",
140
201
  preferredName: inferAssetName(body, "memory"),
141
202
  force: args.force,
142
- target: args.target,
203
+ target: writeTarget,
143
204
  path: args.path,
205
+ supersedes,
144
206
  });
145
207
  appendEvent({
146
208
  eventType: "remember",
@@ -148,7 +210,7 @@ export const rememberCommand = defineJsonCommand({
148
210
  metadata: { path: result.path, force: args.force === true },
149
211
  });
150
212
  if (args.showSimilar) {
151
- const similar = await fetchSimilarMemories(body.slice(0, 500), result.ref);
213
+ const similar = await fetchSimilarMemories(body.slice(0, 500), result.ref, eventSource);
152
214
  output("remember", { ok: true, ...result, similar });
153
215
  }
154
216
  else {
@@ -220,6 +282,7 @@ export const rememberCommand = defineJsonCommand({
220
282
  description,
221
283
  tags,
222
284
  source,
285
+ xrefs,
223
286
  observed_at,
224
287
  expires,
225
288
  subjective,
@@ -228,14 +291,20 @@ export const rememberCommand = defineJsonCommand({
228
291
  ...(hasScope ? { scope: scopeFields } : {}),
229
292
  });
230
293
  const contentWithFrontmatter = `${frontmatterBlock}\n${body}`;
294
+ // Derive the asset slug from the body, exactly like the hot path above:
295
+ // `contentWithFrontmatter` starts with the `---` fence, which
296
+ // inferAssetName would slugify to "" and fall back to a random
297
+ // memory-<epoch>-<rand> name.
231
298
  const result = await writeMarkdownAsset({
232
299
  type: "memory",
233
300
  content: contentWithFrontmatter,
234
301
  name: args.name,
235
302
  fallbackPrefix: "memory",
303
+ preferredName: inferAssetName(body, "memory"),
236
304
  force: args.force,
237
- target: args.target,
305
+ target: writeTarget,
238
306
  path: args.path,
307
+ supersedes,
239
308
  });
240
309
  appendEvent({
241
310
  eventType: "remember",
@@ -250,7 +319,7 @@ export const rememberCommand = defineJsonCommand({
250
319
  },
251
320
  });
252
321
  if (args.showSimilar) {
253
- const similar = await fetchSimilarMemories((body ?? args.content ?? "").slice(0, 500), result.ref);
322
+ const similar = await fetchSimilarMemories((body ?? args.content ?? "").slice(0, 500), result.ref, eventSource);
254
323
  output("remember", { ok: true, ...result, similar });
255
324
  }
256
325
  else {
@@ -6,51 +6,62 @@
6
6
  * from src/cli.ts (WS6) so the God Module shrinks; the `main.subCommands.search`,
7
7
  * `.curate`, and `.show` keys and every command's args/output shape are
8
8
  * byte-identical. The three commands form a clean cluster: they share the
9
- * private `resolveEventSource()` helper and the `parseScopeFilterFlags`
9
+ * usage-event provenance and the `parseScopeFilterFlags`
10
10
  * search-source parsers. Handlers whose body is a plain
11
11
  * `runWithJsonErrors(async () => { … })` are migrated to `defineJsonCommand`,
12
12
  * which emits the same JSON envelope (stdout/stderr/exit-code) as the inline
13
13
  * form.
14
14
  */
15
+ import { getParsedInvocation } from "../../cli/invocation.js";
15
16
  import { parsePositiveIntFlag } from "../../cli/parse-args.js";
16
17
  import { defineJsonCommand, output, parseAllFlagValues } from "../../cli/shared.js";
17
- import { parseAssetRef } from "../../core/asset/asset-ref.js";
18
+ import { parseBundleRef } from "../../core/asset/asset-ref.js";
18
19
  import { parseMetaRef } from "../../core/asset/stash-meta.js";
19
20
  import { UsageError } from "../../core/errors.js";
20
- import { getHyphenatedBoolean, getOutputMode, parseFlagValue } from "../../output/context.js";
21
+ import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
22
+ import { getOutputMode } from "../../output/context.js";
21
23
  import { akmCurate } from "./curate.js";
22
24
  import { akmSearch, parseBeliefFilterMode, parseScopeFilterFlags, parseSearchSource } from "./search.js";
23
25
  import { akmShowUnified } from "./show.js";
24
- // AKM_EVENT_SOURCE attributes a query to a `user` invocation, the internal
25
- // `improve` loop, or the `task` runner so the event log can distinguish
26
- // genuine demand from machine traffic; any other value is treated as unset.
27
- function resolveEventSource() {
28
- const raw = process.env.AKM_EVENT_SOURCE;
29
- if (raw === "improve")
30
- return "improve";
31
- if (raw === "task")
32
- return "task";
33
- if (raw === "user")
34
- return "user";
35
- return undefined;
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");
36
37
  }
37
38
  export const searchCommand = defineJsonCommand({
38
- meta: { name: "search", description: "Search the stash" },
39
+ meta: { name: "search", description: "Search the bundle" },
39
40
  args: {
40
- query: { type: "positional", description: "Search query (omit to list all assets)", required: false, default: "" },
41
+ query: {
42
+ type: "positional",
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.',
44
+ required: false,
45
+ default: "",
46
+ },
41
47
  type: {
42
48
  type: "string",
43
- description: "Asset type filter (skill, command, agent, knowledge, workflow, script, memory, env, secret, wiki, 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.",
44
50
  },
45
51
  limit: { type: "string", description: "Maximum number of results" },
46
- 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
+ },
47
58
  filter: {
48
59
  type: "string",
49
60
  description: "Scope filter (repeatable): --filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>. Narrows results without changing ranking.",
50
61
  },
51
62
  "include-proposed": {
52
63
  type: "boolean",
53
- 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.',
54
65
  default: false,
55
66
  },
56
67
  belief: {
@@ -58,35 +69,55 @@ export const searchCommand = defineJsonCommand({
58
69
  description: "Memory belief filter: all|current|historical. current keeps active memory beliefs; historical keeps contradicted/superseded/archived memory beliefs.",
59
70
  default: "all",
60
71
  },
61
- format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
62
- detail: { type: "string", description: "Detail level (brief|normal|full)" },
63
- "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": {
64
81
  type: "boolean",
65
- description: "Disable the automatic project-context ranking boost (also disabled by AKM_DISABLE_PROJECT_CONTEXT=1).",
66
- 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.",
67
87
  },
68
88
  "include-sessions": {
69
89
  type: "boolean",
70
90
  description: "Include session assets (excluded from default search results via config.search.defaultExcludeTypes).",
71
91
  default: false,
72
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
+ },
73
103
  },
74
104
  async run({ args }) {
105
+ rejectRetiredSourceFlag();
75
106
  const query = (args.query ?? "").trim();
76
- if (!query) {
77
- 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`.');
78
- }
79
107
  const type = args.type;
80
108
  const limit = parsePositiveIntFlag(args.limit ?? undefined);
81
- const source = parseSearchSource(args.source);
109
+ const source = parseSearchSource(args.from);
82
110
  // Repeatable; citty exposes only the last `--filter` value, so read all
83
111
  // occurrences directly from argv (same pattern as `--tag`).
84
112
  const filterTokens = parseAllFlagValues("--filter");
85
113
  const filters = parseScopeFilterFlags(filterTokens, "--filter");
86
114
  const includeProposed = args["include-proposed"] === true;
87
115
  const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
88
- const noProjectContext = getHyphenatedBoolean(args, "no-project-context");
116
+ const disableProjectContext = args["project-context"] === false;
117
+ const skipLogging = args["track-usage"] === false;
89
118
  const includeSessions = args["include-sessions"];
119
+ const assets = args.assets === true;
120
+ const outputMode = getOutputMode();
90
121
  const result = await akmSearch({
91
122
  query,
92
123
  type,
@@ -96,15 +127,21 @@ export const searchCommand = defineJsonCommand({
96
127
  includeProposed,
97
128
  belief,
98
129
  includeSessions,
99
- disableProjectContext: noProjectContext,
100
- disableScopedUtility: noProjectContext,
101
- eventSource: resolveEventSource(),
130
+ disableProjectContext,
131
+ disableScopedUtility: disableProjectContext,
132
+ skipLogging,
133
+ assets,
134
+ eventSource: resolveUsageEventSource(),
135
+ attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
102
136
  });
103
137
  output("search", result);
104
138
  },
105
139
  });
106
140
  export const curateCommand = defineJsonCommand({
107
- 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
+ },
108
145
  args: {
109
146
  // Optional in citty so run() is invoked when omitted; we re-validate
110
147
  // below to surface a structured UsageError (exit 2) instead of citty's
@@ -112,102 +149,172 @@ export const curateCommand = defineJsonCommand({
112
149
  query: { type: "positional", description: "Task or prompt to curate assets for", required: false },
113
150
  type: {
114
151
  type: "string",
115
- description: "Asset type filter (skill, command, agent, knowledge, workflow, script, memory, env, secret, wiki, 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.",
116
153
  },
117
154
  limit: { type: "string", description: "Maximum number of curated results", default: "4" },
118
- source: { type: "string", description: "Search source (stash|registry|both)", default: "stash" },
119
- // Output-contract flags. The active values are read from the process-level
120
- // singleton (parsed from argv at startup); these declarations make them
121
- // visible in `akm curate --help` and document the supported axes.
122
- format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
123
- detail: { type: "string", description: "Detail level (brief|normal|full)" },
124
- 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
+ },
125
166
  },
126
167
  async run({ args }) {
168
+ rejectRetiredSourceFlag();
127
169
  if (!args.query || !String(args.query).trim()) {
128
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"`.');
129
171
  }
130
172
  const type = args.type;
131
173
  const limitParsed = parsePositiveIntFlag(args.limit ?? undefined);
132
174
  const limit = limitParsed && limitParsed > 0 ? limitParsed : 4;
133
- const source = parseSearchSource(args.source ?? "stash");
134
- const curated = await akmCurate({ query: args.query, type, limit, source, eventSource: resolveEventSource() });
175
+ const source = parseSearchSource(args.from ?? "local");
176
+ const skipLogging = args["track-usage"] === false;
177
+ const outputMode = getOutputMode();
178
+ const curated = await akmCurate({
179
+ query: args.query,
180
+ type,
181
+ limit,
182
+ source,
183
+ skipLogging,
184
+ eventSource: resolveUsageEventSource(),
185
+ attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
186
+ });
135
187
  output("curate", curated);
136
188
  },
137
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
+ }
138
248
  export const showCommand = defineJsonCommand({
139
249
  meta: {
140
250
  name: "show",
141
- 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)",
142
252
  },
143
253
  args: {
144
254
  ref: {
145
255
  type: "positional",
146
- description: 'Asset ref ([origin//]type:name) 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`.",
147
257
  required: true,
148
258
  },
149
- format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
150
- detail: { type: "string", description: "Detail level (brief|normal|full)" },
151
- shape: { type: "string", description: "Output projection (human|agent|summary)" },
152
- scope: {
259
+ filter: {
153
260
  type: "string",
154
- 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.",
155
272
  },
156
273
  },
157
274
  async run({ args }) {
158
275
  // `[origin//]meta[:name]` targets the stash `.meta/` convention, which is
159
276
  // not a typed asset ref — skip ref validation and let akmShowUnified
160
- // direct-read it. (`parseAssetRef` would reject the non-type `meta`.)
277
+ // direct-read it. (the ref parser would reject the non-type `meta`.)
161
278
  if (!parseMetaRef(args.ref))
162
- parseAssetRef(args.ref);
163
- // The knowledge-view positional syntax (`akm show knowledge:foo section "Auth"`)
164
- // is rewritten to `--akmView` / `--akmHeading` / `--akmStart` / `--akmEnd`
165
- // by `normalizeShowArgv` before citty parses argv. We read those values
166
- // directly via `parseFlagValue` so the flags don't surface as user-facing
167
- // options in `akm show --help`.
168
- const akmView = parseFlagValue(process.argv, "--akmView");
169
- const akmHeading = parseFlagValue(process.argv, "--akmHeading");
170
- const akmStart = parseFlagValue(process.argv, "--akmStart");
171
- const akmEnd = parseFlagValue(process.argv, "--akmEnd");
172
- let view;
173
- if (akmView) {
174
- switch (akmView) {
175
- case "section":
176
- view = { mode: "section", heading: akmHeading ?? "" };
177
- break;
178
- case "lines":
179
- view = {
180
- mode: "lines",
181
- start: Number(akmStart ?? "1"),
182
- end: akmEnd ? parseInt(akmEnd, 10) : Number.MAX_SAFE_INTEGER,
183
- };
184
- break;
185
- case "toc":
186
- case "frontmatter":
187
- case "full":
188
- view = { mode: akmView };
189
- break;
190
- default:
191
- throw new UsageError(`Unknown view mode: ${akmView}. Expected one of: full|toc|frontmatter|section|lines`);
192
- }
193
- }
279
+ parseBundleRef(args.ref);
280
+ rejectRemovedScopeFlag(args.ref);
281
+ rejectExtraShowPositionals(args._, args.ref);
282
+ const invocation = getParsedInvocation();
194
283
  const cliShape = getOutputMode().shape;
195
- const explicitDetail = parseFlagValue(process.argv, "--detail");
196
- // `--shape summary` selects the compact metadata projection for show
197
- // (the legacy `--detail summary` spelling still maps here via the
198
- // back-compat path in resolveOutputMode). `--detail brief` forces the
199
- // brief response regardless of shape.
200
- const showDetail = explicitDetail === "brief" ? "brief" : cliShape === "summary" ? "summary" : undefined;
201
- // `--scope` is repeatable — citty only exposes the last value, so read
202
- // every occurrence directly from argv (same pattern as `--filter`).
203
- const scopeTokens = parseAllFlagValues("--scope");
204
- const scope = parseScopeFilterFlags(scopeTokens, "--scope");
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.
296
+ const explicitDetail = invocation.getFlagValue("--detail");
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;
205
312
  const result = await akmShowUnified({
206
313
  ref: args.ref,
207
- view,
208
314
  detail: showDetail,
209
315
  scope,
210
- eventSource: resolveEventSource(),
316
+ skipLogging,
317
+ eventSource: resolveUsageEventSource(),
211
318
  });
212
319
  output("show", result);
213
320
  },