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
@@ -0,0 +1,562 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ export function formatInfoPlain(r) {
5
+ const lines = [];
6
+ if (r.version)
7
+ lines.push(`version: ${String(r.version)}`);
8
+ if (r.bundleDir)
9
+ lines.push(`bundleDir: ${String(r.bundleDir)}`);
10
+ if (r.configPath)
11
+ lines.push(`configPath: ${String(r.configPath)}`);
12
+ if (r.cacheDir)
13
+ lines.push(`cacheDir: ${String(r.cacheDir)}`);
14
+ if (r.dbPath)
15
+ lines.push(`dbPath: ${String(r.dbPath)}`);
16
+ const capabilities = r.capabilities;
17
+ if (capabilities) {
18
+ lines.push("capabilities:");
19
+ for (const [k, v] of Object.entries(capabilities)) {
20
+ lines.push(` ${k}: ${typeof v === "object" ? JSON.stringify(v) : String(v)}`);
21
+ }
22
+ }
23
+ const indexStats = r.index;
24
+ if (indexStats) {
25
+ lines.push("index:");
26
+ for (const [k, v] of Object.entries(indexStats)) {
27
+ lines.push(` ${k}: ${typeof v === "object" ? JSON.stringify(v) : String(v)}`);
28
+ }
29
+ }
30
+ if (lines.length === 0)
31
+ return JSON.stringify(r, null, 2);
32
+ return lines.join("\n");
33
+ }
34
+ export function formatConfigPlain(r) {
35
+ // Recursive flattener: prints `key=value` lines, and nested objects as
36
+ // `parent.child=value`. Arrays render as JSON for compactness.
37
+ const lines = [];
38
+ const walk = (obj, prefix) => {
39
+ for (const [k, v] of Object.entries(obj)) {
40
+ const path = prefix ? `${prefix}.${k}` : k;
41
+ if (v === null || v === undefined) {
42
+ lines.push(`${path}=`);
43
+ }
44
+ else if (Array.isArray(v)) {
45
+ lines.push(`${path}=${JSON.stringify(v)}`);
46
+ }
47
+ else if (typeof v === "object") {
48
+ walk(v, path);
49
+ }
50
+ else {
51
+ lines.push(`${path}=${String(v)}`);
52
+ }
53
+ }
54
+ };
55
+ walk(r, "");
56
+ if (lines.length === 0)
57
+ return "(empty config)";
58
+ return lines.join("\n");
59
+ }
60
+ export function formatFeedbackPlain(r) {
61
+ const ref = String(r.ref ?? "?");
62
+ const signal = String(r.signal ?? "?");
63
+ const note = typeof r.note === "string" && r.note ? ` — ${r.note}` : "";
64
+ return `Recorded ${signal} feedback for ${ref}${note}`;
65
+ }
66
+ export function formatRememberPlain(r) {
67
+ const ref = String(r.ref ?? "?");
68
+ const pathValue = String(r.path ?? "?");
69
+ return `Saved ${ref} at ${pathValue}`;
70
+ }
71
+ export function formatImportPlain(r) {
72
+ const ref = String(r.ref ?? "?");
73
+ const source = String(r.source ?? "?");
74
+ const pathValue = String(r.path ?? "?");
75
+ return `Imported ${source} → ${ref} at ${pathValue}`;
76
+ }
77
+ export function formatSyncPlain(r) {
78
+ if (r.ok === false) {
79
+ const reason = typeof r.reason === "string" ? r.reason : "unknown";
80
+ return `sync: failed (${reason})`;
81
+ }
82
+ const name = typeof r.name === "string" ? r.name : "primary bundle";
83
+ const committed = r.committed === true;
84
+ const pushed = r.pushed === true;
85
+ const parts = [`sync: ${name}`];
86
+ parts.push(committed ? "committed" : "no changes");
87
+ if (pushed)
88
+ parts.push("pushed");
89
+ return parts.join(" — ");
90
+ }
91
+ export function formatRegistryListPlain(r) {
92
+ const registries = Array.isArray(r.registries) ? r.registries : [];
93
+ if (registries.length === 0) {
94
+ return "No registries configured. Add one with `akm registry add <url>`.";
95
+ }
96
+ const lines = [];
97
+ for (const reg of registries) {
98
+ const url = String(reg.url ?? "?");
99
+ const name = typeof reg.name === "string" ? reg.name : "";
100
+ const provider = typeof reg.provider === "string" ? ` (${reg.provider})` : "";
101
+ const enabled = reg.enabled === false ? " [disabled]" : "";
102
+ const head = name ? `${name}: ${url}` : url;
103
+ lines.push(`${head}${provider}${enabled}`);
104
+ }
105
+ return lines.join("\n");
106
+ }
107
+ export function formatRegistryAddPlain(r) {
108
+ if (r.added === false) {
109
+ return typeof r.message === "string" ? r.message : "Registry already configured.";
110
+ }
111
+ const registries = Array.isArray(r.registries) ? r.registries.length : 0;
112
+ return `Registry added (${registries} total).`;
113
+ }
114
+ export function formatRegistryRemovePlain(r) {
115
+ if (r.removed === false) {
116
+ return typeof r.message === "string" ? r.message : "No matching registry found.";
117
+ }
118
+ const entry = r.entry;
119
+ const url = entry ? String(entry.url ?? entry.name ?? "?") : "?";
120
+ return `Removed registry ${url}`;
121
+ }
122
+ export function formatRegistrySearchPlain(r, detail) {
123
+ // Reuse the same renderer as `search` — both share `hits` / `registryHits`.
124
+ return formatSearchPlain(r, detail);
125
+ }
126
+ export function formatEnvListPlain(r) {
127
+ // Multi-env listing: { envs: [{ ref, path, keys }, ...] }
128
+ const envs = Array.isArray(r.envs) ? r.envs : [];
129
+ if (envs.length === 0) {
130
+ return "No env files. Create one with `akm env create <name>`, then edit the .env file directly.";
131
+ }
132
+ const lines = [];
133
+ for (const v of envs) {
134
+ const ref = String(v.ref ?? "?");
135
+ const keys = Array.isArray(v.keys) ? v.keys.map(String) : [];
136
+ if (lines.length > 0)
137
+ lines.push("");
138
+ lines.push(`## ${ref}`);
139
+ if (keys.length === 0) {
140
+ lines.push("- (no keys)");
141
+ continue;
142
+ }
143
+ for (const key of keys) {
144
+ lines.push(`- ${key}`);
145
+ }
146
+ }
147
+ return lines.join("\n");
148
+ }
149
+ export function formatEnvCreatePlain(r) {
150
+ return `Created env ${String(r.ref ?? "?")}`;
151
+ }
152
+ export function formatEnvExportPlain(r) {
153
+ return `Wrote ${String(r.ref ?? "?")} export script → ${String(r.out ?? "?")} (mode 0600; source it, then delete)`;
154
+ }
155
+ export function formatEnvRemovePlain(r) {
156
+ const removed = r.removed === true;
157
+ return removed ? `Removed env ${String(r.ref ?? "?")}` : `Env ${String(r.ref ?? "?")} was not present`;
158
+ }
159
+ export function formatEventsPlain(r) {
160
+ const events = Array.isArray(r.events) ? r.events : [];
161
+ const headerParts = [];
162
+ if (typeof r.ref === "string" && r.ref)
163
+ headerParts.push(`ref: ${r.ref}`);
164
+ if (typeof r.type === "string" && r.type)
165
+ headerParts.push(`type: ${r.type}`);
166
+ if (typeof r.since === "string" && r.since)
167
+ headerParts.push(`since: ${r.since}`);
168
+ const totalCount = typeof r.totalCount === "number" ? r.totalCount : events.length;
169
+ headerParts.push(`${totalCount} event(s)`);
170
+ const header = headerParts.join(" ");
171
+ if (events.length === 0) {
172
+ return `${header}\nNo events.`;
173
+ }
174
+ const lines = [header, ""];
175
+ for (const event of events) {
176
+ lines.push(formatEventLine(event));
177
+ }
178
+ return lines.join("\n").trimEnd();
179
+ }
180
+ export function formatEventLine(event) {
181
+ const ts = String(event.ts ?? "?");
182
+ const eventType = String(event.eventType ?? "?");
183
+ const ref = event.ref ? String(event.ref) : null;
184
+ const head = ref ? `${ts} [${eventType}] ${ref}` : `${ts} [${eventType}]`;
185
+ if (event.metadata != null && event.metadata !== "") {
186
+ const meta = typeof event.metadata === "string" ? event.metadata : JSON.stringify(event.metadata);
187
+ return `${head}\n metadata: ${meta}`;
188
+ }
189
+ return head;
190
+ }
191
+ export function formatSearchPlain(r, detail) {
192
+ const hits = r.hits ?? [];
193
+ const registryHits = r.registryHits ?? [];
194
+ const allHits = [...hits, ...registryHits];
195
+ if (allHits.length === 0) {
196
+ const warnings = Array.isArray(r.warnings) ? r.warnings : [];
197
+ const hasSetupWarning = warnings.some((w) => String(w).toLowerCase().includes("no bundle") || String(w).toLowerCase().includes("not configured"));
198
+ if (hasSetupWarning) {
199
+ return "No bundle configured. Run `akm bundle create` to create your working bundle, then `akm index` to build the search index.";
200
+ }
201
+ const base = r.tip ? String(r.tip) : "No matches found.";
202
+ return `${base}\nTry:\n akm search '<broader-term>' # fewer keywords\n akm bundle list # see all configured sources\n akm curate '<query>' # let akm select the best match`;
203
+ }
204
+ const lines = [];
205
+ for (const hit of allHits) {
206
+ const type = hit.type ?? "unknown";
207
+ const name = hit.name ?? "unnamed";
208
+ const score = hit.score != null ? ` (score: ${hit.score})` : "";
209
+ const desc = hit.description ? ` ${hit.description}` : "";
210
+ lines.push(`${type}: ${name}${score}`);
211
+ if (desc)
212
+ lines.push(desc);
213
+ if (hit.id)
214
+ lines.push(` id: ${String(hit.id)}`);
215
+ if (hit.ref)
216
+ lines.push(` ref: ${String(hit.ref)}`);
217
+ if (hit.origin !== undefined)
218
+ lines.push(` origin: ${String(hit.origin)}`);
219
+ if (Array.isArray(hit.keys) && hit.keys.length > 0)
220
+ lines.push(` keys: ${hit.keys.join(", ")}`);
221
+ if (hit.size)
222
+ lines.push(` size: ${String(hit.size)}`);
223
+ if (hit.action)
224
+ lines.push(` action: ${String(hit.action)}`);
225
+ if (hit.run)
226
+ lines.push(` run: ${String(hit.run)}`);
227
+ if (Array.isArray(hit.tags) && hit.tags.length > 0)
228
+ lines.push(` tags: ${hit.tags.join(", ")}`);
229
+ // Optional v1 spec §4.2 quality marker (e.g. "curated" / "proposed").
230
+ if (typeof hit.quality === "string" && hit.quality)
231
+ lines.push(` quality: ${hit.quality}`);
232
+ // Surface optional hit-level warnings (v1 spec §4.2).
233
+ if (Array.isArray(hit.warnings) && hit.warnings.length > 0) {
234
+ lines.push(` warnings: ${hit.warnings.join("; ")}`);
235
+ }
236
+ const graph = typeof hit.graph === "object" && hit.graph !== null ? hit.graph : undefined;
237
+ if (graph) {
238
+ const entities = Array.isArray(graph.entities) ? graph.entities : [];
239
+ if (entities.length > 0) {
240
+ const matched = entities
241
+ .filter((entity) => String(entity.kind ?? "") === "matched")
242
+ .map((entity) => String(entity.name ?? "?"));
243
+ const neighbors = entities
244
+ .filter((entity) => String(entity.kind ?? "") !== "matched")
245
+ .map((entity) => String(entity.name ?? "?"));
246
+ lines.push(` graph: ${[
247
+ matched.length > 0 ? `query match=${matched.join(", ")}` : undefined,
248
+ neighbors.length > 0 ? `neighbors=${neighbors.join(", ")}` : undefined,
249
+ ]
250
+ .filter(Boolean)
251
+ .join("; ")}`);
252
+ }
253
+ }
254
+ if (detail === "full") {
255
+ if (hit.path)
256
+ lines.push(` path: ${String(hit.path)}`);
257
+ if (hit.editable != null)
258
+ lines.push(` editable: ${String(hit.editable)}`);
259
+ if (hit.editHint)
260
+ lines.push(` editHint: ${String(hit.editHint)}`);
261
+ const whyMatched = hit.whyMatched;
262
+ if (whyMatched && whyMatched.length > 0) {
263
+ lines.push(` whyMatched: ${whyMatched.join(", ")}`);
264
+ }
265
+ }
266
+ lines.push(""); // blank line between hits
267
+ }
268
+ if (detail === "full" && r.timing) {
269
+ const timing = r.timing;
270
+ const parts = [];
271
+ if (timing.totalMs != null)
272
+ parts.push(`total: ${timing.totalMs}ms`);
273
+ if (timing.rankMs != null)
274
+ parts.push(`rank: ${timing.rankMs}ms`);
275
+ if (timing.embedMs != null)
276
+ parts.push(`embed: ${timing.embedMs}ms`);
277
+ if (parts.length > 0)
278
+ lines.push(`timing: ${parts.join(", ")}`);
279
+ }
280
+ // REC-02: When stash hits exist, tell the agent the next required step so it
281
+ // doesn't skip `akm show` and write from training memory instead.
282
+ if (hits.length >= 1) {
283
+ // Prefer skill/command/agent type hits for the "Next:" ref — knowledge docs are
284
+ // supplementary context, not the authoritative schema agents should load first.
285
+ const preferredHit = hits.find((h) => h.type === "skill" || h.type === "command" || h.type === "agent") ?? hits[0];
286
+ const topRef = typeof preferredHit.ref === "string" ? preferredHit.ref : null;
287
+ const hasWorkflowHit = hits.some((h) => h.type === "workflow");
288
+ if (topRef) {
289
+ if (hasWorkflowHit) {
290
+ const workflowRef = hits.find((h) => h.type === "workflow");
291
+ const wfRef = workflowRef && typeof workflowRef.ref === "string" ? workflowRef.ref : topRef;
292
+ lines.push(`Next: akm show '${topRef}' | To start a workflow: akm workflow next '${wfRef}'`);
293
+ lines.push("After running workflow next: follow each step and run `akm workflow complete <run-id> --step <step-id>` when done.");
294
+ }
295
+ else {
296
+ lines.push(`Next: akm show '${topRef}'`);
297
+ lines.push("After reading the asset: check whether a workflow applies before editing — if so, use `akm workflow next` instead.");
298
+ }
299
+ }
300
+ }
301
+ return lines.join("\n").trimEnd();
302
+ }
303
+ export function formatCuratePlain(r, detail) {
304
+ const query = typeof r.query === "string" ? r.query : "";
305
+ const summary = typeof r.summary === "string" ? r.summary : "";
306
+ const items = Array.isArray(r.items) ? r.items : [];
307
+ const lines = [`Curated results for "${query}"`];
308
+ if (summary)
309
+ lines.push(summary);
310
+ if (items.length === 0) {
311
+ if (r.tip)
312
+ lines.push(String(r.tip));
313
+ return lines.join("\n");
314
+ }
315
+ for (const item of items) {
316
+ const type = typeof item.type === "string" ? item.type : "unknown";
317
+ const name = typeof item.name === "string" ? item.name : "unnamed";
318
+ lines.push("");
319
+ lines.push(`[${type}] ${name}`);
320
+ if (item.description)
321
+ lines.push(` ${String(item.description)}`);
322
+ if (item.preview)
323
+ lines.push(` preview: ${String(item.preview)}`);
324
+ if (item.ref)
325
+ lines.push(` ref: ${String(item.ref)}`);
326
+ if (item.id)
327
+ lines.push(` id: ${String(item.id)}`);
328
+ if (Array.isArray(item.keys) && item.keys.length > 0) {
329
+ lines.push(` keys: ${item.keys.join(", ")}`);
330
+ }
331
+ if (Array.isArray(item.parameters) && item.parameters.length > 0) {
332
+ lines.push(` parameters: ${item.parameters.join(", ")}`);
333
+ }
334
+ if (item.run)
335
+ lines.push(` run: ${String(item.run)}`);
336
+ if (item.followUp)
337
+ lines.push(` show: ${String(item.followUp)}`);
338
+ if (Array.isArray(item.supportRefs) && item.supportRefs.length > 0) {
339
+ for (const support of item.supportRefs) {
340
+ if (!support.ref)
341
+ continue;
342
+ const label = typeof support.type === "string" ? `[${support.type}] ` : "";
343
+ const why = typeof support.reason === "string" ? ` — ${support.reason}` : "";
344
+ lines.push(` support: ${label}${String(support.ref)}${why}`);
345
+ }
346
+ }
347
+ if (detail !== "brief" && item.reason)
348
+ lines.push(` why: ${String(item.reason)}`);
349
+ }
350
+ const warnings = Array.isArray(r.warnings) ? r.warnings : [];
351
+ if (warnings.length > 0) {
352
+ lines.push("");
353
+ lines.push("Warnings:");
354
+ for (const warning of warnings) {
355
+ lines.push(`- ${String(warning)}`);
356
+ }
357
+ }
358
+ lines.push("");
359
+ lines.push("Next steps:");
360
+ lines.push(" 1. Run `akm show <ref>` for the best result above to read the full schema.");
361
+ lines.push(" 2. Edit the workspace file using the schema field names and your task-specific values.");
362
+ lines.push(" 3. Run `akm feedback <ref> --positive` when the task succeeds.");
363
+ lines.push("To search further: akm search '<query>'");
364
+ return lines.join("\n");
365
+ }
366
+ export function formatInitPlain(r) {
367
+ let out = `Bundle initialized at ${r.bundleDir ?? "unknown"}`;
368
+ // When --dir scaffolded a secondary bundle but the default was deliberately
369
+ // left untouched, tell the user instead of silently repointing their default.
370
+ if (r.defaultBundleUpdated === false && typeof r.previousBundleDir === "string" && r.previousBundleDir) {
371
+ out += `\nYour default bundle is unchanged (${r.previousBundleDir}). Re-run with --set-default to make ${r.bundleDir} the default.`;
372
+ }
373
+ else if (r.configPath) {
374
+ out += `\nConfig saved to ${r.configPath}`;
375
+ }
376
+ return out;
377
+ }
378
+ export function formatIndexPlain(r) {
379
+ const indexResult = r;
380
+ let out = `Indexed ${indexResult.totalEntries ?? 0} entries from ${indexResult.directoriesScanned ?? 0} directories (mode: ${indexResult.mode ?? "unknown"})`;
381
+ const warnings = indexResult.warnings;
382
+ if (Array.isArray(warnings) && warnings.length > 0) {
383
+ out += `\nWarnings (${warnings.length}):`;
384
+ for (const message of warnings)
385
+ out += `\n - ${String(message)}`;
386
+ }
387
+ const verification = indexResult.verification;
388
+ if (verification?.ok === false && verification.message) {
389
+ out += `\nVerification: ${String(verification.message)}`;
390
+ }
391
+ const timing = indexResult.timing;
392
+ if (timing) {
393
+ out +=
394
+ `\nTiming: total ${timing.totalMs}ms` +
395
+ `, preflight ${timing.preflightMs}ms` +
396
+ `, walk ${timing.walkMs}ms` +
397
+ `, llm ${timing.llmMs}ms` +
398
+ `, embeddings ${timing.embedMs}ms` +
399
+ `, fts ${timing.ftsMs}ms` +
400
+ `, finalize ${timing.finalizeMs}ms` +
401
+ `, clean ${timing.cleanMs}ms` +
402
+ `, end-to-end ${timing.endToEndMs}ms`;
403
+ }
404
+ return out;
405
+ }
406
+ export function formatListPlain(r) {
407
+ const sources = Array.isArray(r.sources) ? r.sources : [];
408
+ if (sources.length === 0)
409
+ return "No sources configured. Use `akm bundle add` to add a source.";
410
+ const lines = [];
411
+ for (const src of sources) {
412
+ const kind = typeof src.kind === "string" ? src.kind : "unknown";
413
+ const name = typeof src.name === "string" ? src.name : "unnamed";
414
+ const ver = typeof src.version === "string" ? ` v${src.version}` : "";
415
+ const prov = typeof src.provider === "string" ? ` (${src.provider})` : "";
416
+ const flags = [];
417
+ if (src.default === true)
418
+ flags.push("default");
419
+ if (src.writable === true)
420
+ flags.push("writable");
421
+ const flagText = flags.length > 0 ? ` [${flags.join(", ")}]` : "";
422
+ lines.push(`[${kind}] ${name}${ver}${prov}${flagText}`);
423
+ }
424
+ lines.push("");
425
+ lines.push("To search: akm search '<query>' | To view an asset: akm show <ref>");
426
+ return lines.join("\n");
427
+ }
428
+ /** Render a single `SourceEntry` — `akm bundle show <name>`'s detail view of one `list` row. */
429
+ export function formatBundleShowPlain(r) {
430
+ const name = typeof r.name === "string" ? r.name : "unknown";
431
+ const kind = typeof r.kind === "string" ? r.kind : "unknown";
432
+ const lines = [`${name} [${kind}]`];
433
+ if (r.default === true)
434
+ lines.push(" default: true");
435
+ if (r.writable === true)
436
+ lines.push(" writable: true");
437
+ if (typeof r.version === "string")
438
+ lines.push(` version: ${r.version}`);
439
+ if (typeof r.provider === "string")
440
+ lines.push(` provider: ${r.provider}`);
441
+ if (typeof r.path === "string")
442
+ lines.push(` path: ${r.path}`);
443
+ if (typeof r.ref === "string")
444
+ lines.push(` ref: ${r.ref}`);
445
+ if (typeof r.registryId === "string")
446
+ lines.push(` registryId: ${r.registryId}`);
447
+ lines.push(` items: ${typeof r.itemCount === "number" ? r.itemCount : 0}`);
448
+ const byType = r.byType;
449
+ if (byType && Object.keys(byType).length > 0) {
450
+ lines.push(` byType: ${Object.entries(byType)
451
+ .map(([t, n]) => `${t}=${n}`)
452
+ .join(", ")}`);
453
+ }
454
+ const status = r.status;
455
+ if (status?.exists === false)
456
+ lines.push(" status: MISSING on disk");
457
+ return lines.join("\n");
458
+ }
459
+ export function formatAddPlain(r) {
460
+ // `akm bundle add <ref>` (source-add.ts `AddResponse`) and `akm bundle add
461
+ // <target> --provider <kind>` (source-manage.ts `SourceAddResult`) are
462
+ // genuinely different operations that happen to share the "add" command
463
+ // name: the former eagerly fetches and indexes content, the latter only
464
+ // writes a desired locator to config — nothing is synced until a later
465
+ // `akm bundle update`. Force-fitting the declarative shape's `added`/`entry`/`message`
466
+ // fields into the "Installed <ref> (N scanned...)" wording produced
467
+ // "Installed undefined (0 directories scanned...)" (R-014) because it
468
+ // implied a sync that never happened. `AddResponse` always carries an
469
+ // `index` block (even when zero entries were scanned); `SourceAddResult`
470
+ // never does — that is the reliable shape discriminator used below to
471
+ // render each honestly instead of unifying them.
472
+ if (!("index" in r))
473
+ return formatDeclarativeAddPlain(r);
474
+ const index = r.index;
475
+ const scanned = index?.directoriesScanned ?? 0;
476
+ const total = index?.totalEntries ?? 0;
477
+ const lines = [`Installed ${r.ref} (${scanned} directories scanned, ${total} total assets indexed)`];
478
+ const warnings = index?.warnings;
479
+ if (Array.isArray(warnings) && warnings.length > 0) {
480
+ lines.push(`Warnings (${warnings.length}):`);
481
+ for (const message of warnings)
482
+ lines.push(` - ${String(message)}`);
483
+ }
484
+ return lines.join("\n");
485
+ }
486
+ /** Render a `SourceAddResult` (declarative `--provider` add) — see {@link formatAddPlain}. */
487
+ function formatDeclarativeAddPlain(r) {
488
+ if (r.added !== true) {
489
+ return typeof r.message === "string" ? r.message : "add: no changes";
490
+ }
491
+ const entry = r.entry;
492
+ const kind = typeof entry?.type === "string" ? entry.type : "source";
493
+ const name = (typeof entry?.name === "string" && entry.name) ||
494
+ (typeof entry?.path === "string" && entry.path) ||
495
+ (typeof entry?.url === "string" && entry.url) ||
496
+ "source";
497
+ // A filesystem bundle reflects files already on disk — nothing to fetch,
498
+ // just index it. Every other declarative kind (git/website/npm) is a
499
+ // locator only; its content is not materialized until `akm bundle update`.
500
+ if (kind === "filesystem") {
501
+ return `Added ${name} (filesystem) — run \`akm index\` to index it.`;
502
+ }
503
+ return `Added ${name} (${kind}) — not yet synced; run \`akm bundle update ${name}\` to fetch it.`;
504
+ }
505
+ export function formatRemovePlain(r) {
506
+ const target = r.target ?? r.ref ?? "";
507
+ const ok = r.ok !== false ? "OK" : "FAILED";
508
+ return `remove: ${target} ${ok}`;
509
+ }
510
+ export function formatUpdatePlain(r) {
511
+ // R-015: `processed` alone conflated three cases into one empty array —
512
+ // a true no-op (--all with nothing configured), a source this call flatly
513
+ // never looked at (a plain source under --all), and a plain git/website
514
+ // source that WAS just synced successfully but has no `UpdateResultItem`
515
+ // shape to report (no version/lock to diff). All three rendered as the
516
+ // same misleading "nothing to update". `plainSynced` and `skipped` (see
517
+ // sources/types.ts) cover the other two so this can report accurately.
518
+ const processed = r.processed;
519
+ const plainSynced = r.plainSynced;
520
+ const skipped = r.skipped;
521
+ const lines = [];
522
+ for (const item of processed ?? []) {
523
+ const changed = item.changed;
524
+ const installed = item.installed;
525
+ const previous = item.previous;
526
+ if (changed?.any) {
527
+ const prev = previous?.resolvedVersion ?? "unknown";
528
+ const next = installed?.resolvedVersion ?? "unknown";
529
+ lines.push(`update: ${item.id} v${prev} → v${next}`);
530
+ }
531
+ else {
532
+ lines.push(`update: ${item.id} (unchanged)`);
533
+ }
534
+ }
535
+ for (const item of plainSynced ?? []) {
536
+ lines.push(`update: ${item.id} synced (${item.kind})`);
537
+ }
538
+ for (const item of skipped ?? []) {
539
+ lines.push(`update: ${item.id} skipped — ${item.reason}`);
540
+ }
541
+ return lines.length > 0 ? lines.join("\n") : `update: nothing to update`;
542
+ }
543
+ export function formatUpgradePlain(r) {
544
+ if (r.upgraded === true) {
545
+ return `akm upgraded: v${r.currentVersion} → v${r.newVersion}`;
546
+ }
547
+ if (r.updateAvailable === true) {
548
+ return `akm v${r.currentVersion} → v${r.latestVersion} available (run 'akm upgrade' to install)`;
549
+ }
550
+ if (r.updateAvailable === false && r.latestVersion) {
551
+ return `akm v${r.currentVersion} is already the latest version`;
552
+ }
553
+ if (r.message)
554
+ return String(r.message);
555
+ return null;
556
+ }
557
+ export function formatClonePlain(r) {
558
+ const dst = r.destination?.path ?? "unknown";
559
+ const remote = r.remoteFetched ? " (fetched from remote)" : "";
560
+ const over = r.overwritten ? " (overwritten)" : "";
561
+ return `Cloned${remote} → ${dst}${over}`;
562
+ }
@@ -2,12 +2,10 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  // Output text formatters for `akm env *` commands.
5
- import { formatEnvCreatePlain, formatEnvExportPlain, formatEnvListPlain, formatEnvRemovePlain, formatEnvSetPlain, formatEnvUnsetPlain, } from "./helpers.js";
5
+ import { formatEnvCreatePlain, formatEnvExportPlain, formatEnvListPlain, formatEnvRemovePlain } from "./helpers.js";
6
6
  export const envFormatters = [
7
7
  { command: "env-list", handler: (r) => formatEnvListPlain(r) },
8
8
  { command: "env-create", handler: (r) => formatEnvCreatePlain(r) },
9
9
  { command: "env-export", handler: (r) => formatEnvExportPlain(r) },
10
10
  { command: "env-remove", handler: (r) => formatEnvRemovePlain(r) },
11
- { command: "env-set", handler: (r) => formatEnvSetPlain(r) },
12
- { command: "env-unset", handler: (r) => formatEnvUnsetPlain(r) },
13
11
  ];
@@ -1,11 +1,12 @@
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
- // Output text formatters for `akm events list` / `akm events tail` (#204).
5
- // Both share a renderer; `events-tail` is also called per-event by the streaming
6
- // code path via `formatEventLine`.
4
+ // Output text formatter for `akm log` (#204).
5
+ //
6
+ // R-060: renamed from `events-list` to `log-list` — see
7
+ // src/output/shapes/events.ts for the full rationale.
8
+ //
9
+ // 0.9.0 CLI overhaul (S3): `log tail` (and its `log-tail` formatter entry)
10
+ // was dropped along with the command.
7
11
  import { formatEventsPlain } from "./helpers.js";
8
- export const eventsFormatters = [
9
- { command: "events-list", handler: (r) => formatEventsPlain(r) },
10
- { command: "events-tail", handler: (r) => formatEventsPlain(r) },
11
- ];
12
+ export const eventsFormatters = [{ command: "log-list", handler: (r) => formatEventsPlain(r) }];