akm-cli 0.9.0-rc.1 → 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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  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/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /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) }];