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
package/README.md CHANGED
@@ -1,44 +1,44 @@
1
- # akm -- Agent Knowledge Management
1
+ # akm -- Agent Knowledge Manager
2
2
 
3
- > **akm** (Agent Knowledge Management) -- A package manager for AI agent skills, commands, tools, and knowledge.
3
+ > **akm** (Agent Knowledge Manager) -- A knowledge toolkit for AI agents.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/akm-cli)](https://www.npmjs.com/package/akm-cli)
6
6
  [![npm downloads](https://img.shields.io/npm/dm/akm-cli)](https://www.npmjs.com/package/akm-cli)
7
7
  [![license](https://img.shields.io/github/license/itlackey/akm)](https://github.com/itlackey/akm/blob/main/LICENSE)
8
8
 
9
- `akm` is a package manager for AI agent capabilities -- scripts, skills, commands,
10
- agents, knowledge, memories, workflows, wikis, env files, secrets, lessons, and
11
- scheduled tasks. It works with any AI coding assistant that can run shell commands,
9
+ `akm` is a knowledge toolkit for AI agent capabilities -- scripts, skills, commands,
10
+ agents, knowledge, instructions, memories, workflows, env files, secrets, lessons,
11
+ tasks, sessions, and facts. It can discover and install bundles from npm, git, local
12
+ directories, and configured registries. It works with any AI coding assistant that can run shell commands,
12
13
  including [Claude Code](https://claude.ai/code),
13
14
  [OpenCode](https://opencode.ai), [Cursor](https://cursor.com), and more.
14
15
 
15
16
  ## Install
16
17
 
17
- **Option 1 — Prebuilt binary (recommended, no runtime required):**
18
+ **Option 1 — npm package (recommended; requires [Node.js](https://nodejs.org) >= 22):**
18
19
 
19
20
  ```sh
20
- # Linux / macOS
21
- curl -fsSL https://github.com/itlackey/akm/releases/latest/download/install.sh | bash
22
-
23
- # Windows (PowerShell)
24
- irm https://github.com/itlackey/akm/releases/latest/download/install.ps1 | iex
21
+ npm install -g akm-cli
25
22
  ```
26
23
 
27
- **Option 2 — Bun (requires [Bun](https://bun.sh) >= 1.0):**
24
+ **Option 2 — Prebuilt binary (no runtime required):**
28
25
 
29
26
  ```sh
30
- bun install -g akm-cli
31
- ```
32
-
33
- **Option 3 — Node.js (requires Node.js >= 20.12):**
27
+ # Linux / macOS
28
+ curl -fsSL https://github.com/itlackey/akm/releases/latest/download/install.sh | bash
34
29
 
35
- ```sh
36
- npm install -g akm-cli
30
+ # Windows (PowerShell)
31
+ irm https://github.com/itlackey/akm/releases/latest/download/install.ps1 | iex
37
32
  ```
38
33
 
39
34
  Upgrade in place with `akm upgrade`.
40
35
 
41
- > **AKM 0.9.0 supports three install paths:** prebuilt binary, Bun, or Node.js >= 20.12.
36
+ The npm package always uses Node.js to bootstrap its cross-platform command.
37
+ If a working [Bun](https://bun.sh) >= 1.0 is also on `PATH`, the launcher
38
+ prefers Bun for execution; old, unusable, or absent Bun installations fall back
39
+ to Node.js. Node.js remains required for the npm package. The standalone
40
+ binaries are runtime-free.
41
+
42
42
  > The old `vault` asset type was removed in 0.9.0; use `env` for whole `.env`
43
43
  > groups and `secret` for standalone sensitive values.
44
44
 
@@ -46,16 +46,41 @@ Upgrade in place with `akm upgrade`.
46
46
 
47
47
  ```sh
48
48
  akm setup # Guided setup: configure, initialize, and index
49
- akm add github:owner/repo # Add a stash from GitHub
49
+ akm task doctor # Verify scheduler and installed runtime
50
+ akm bundle add github:owner/repo # Add a bundle from GitHub
50
51
  akm search "deploy" # Find assets across all sources
51
- akm show script:deploy.sh # View details and run command
52
+ akm show scripts/deploy.sh # View details and run command
52
53
  ```
53
54
 
55
+ Non-interactive setup never activates schedules.
56
+
57
+ ## Schedule Tasks Safely
58
+
59
+ ```sh
60
+ akm setup # Review definitions, schedules, and enabled state
61
+ # Confirm scheduler activation only after reviewing the complete task summary.
62
+ akm task doctor # Verify backend, runtime, task state, and warnings
63
+ ```
64
+
65
+ Setup shows the complete task review — both the general-purpose core
66
+ templates and the maintainer-oriented improve cadence — before asking one
67
+ explicit question about changing task files and the OS scheduler. Only
68
+ confirmation prepares the definitions and syncs the scheduler. Declining, or
69
+ running setup non-interactively, leaves both unchanged. A scheduled entry
70
+ captures the installed akm runtime used during activation. Ordinary
71
+ `akm task sync` preserves that runtime; after moving or replacing the
72
+ installation, use `akm task sync --rebind` explicitly to migrate or repair
73
+ scheduler entries, then run `akm task doctor` again.
74
+
75
+ Rerunning setup preserves existing scheduler bindings. If setup changes the AKM
76
+ storage path, or the installed runtime path changes, run
77
+ `akm task sync --rebind` explicitly.
78
+
54
79
  ## Why akm?
55
80
 
56
81
  - **Works with any AI agent** -- No plugins or SDKs required. Any model that can run shell commands can use `akm`.
57
- - **One command to search everything** -- Local stash, registries, and community skills from [skills.sh](https://skills.sh) in a single query.
58
- - **Install stashes from anywhere** -- npm, GitHub, GitLab, local directories.
82
+ - **One command to search your knowledge** -- Local assets are searched by default. Add `--from registry` or `--from all` for configured registry results; [skills.sh](https://skills.sh) participates only when enabled.
83
+ - **Install bundles from anywhere** -- npm, GitHub, GitLab, local directories.
59
84
  - **Semantic search** -- Optional local embeddings (via Ollama or HuggingFace) for finding assets by meaning, not just keywords.
60
85
  - **Private registries** -- Host your own registry for team or enterprise use.
61
86
 
@@ -67,22 +92,22 @@ Add this to your `AGENTS.md`, `CLAUDE.md`, or system prompt:
67
92
  ## Resources & Capabilities
68
93
 
69
94
  You have access to a searchable library of scripts, skills, commands, agents,
70
- knowledge, memories, workflows, wikis, env files, secrets, lessons, and scheduled tasks
71
- via the `akm` CLI. Use `akm -h` for details.
95
+ knowledge, instructions, memories, workflows, env files, secrets, lessons, tasks,
96
+ sessions, and facts via the `akm` CLI. Use `akm -h` for details.
72
97
  ```
73
98
 
74
- ## Install Stashes from Anywhere
99
+ ## Install Bundles from Anywhere
75
100
 
76
101
  ```sh
77
- akm add @scope/my-stash # npm
78
- akm add github:owner/repo#v1.2.3 # GitHub with tag
79
- akm add git+https://gitlab.com/org/stash # Any git repo
80
- akm add ./path/to/local/stash # Local directory
102
+ akm bundle add @scope/pkg # npm
103
+ akm bundle add github:owner/repo#v1.2.3 # GitHub with tag
104
+ akm bundle add git+https://gitlab.com/org/repo # Any git repo
105
+ akm bundle add ./path/to/local/dir # Local directory
81
106
  ```
82
107
 
83
- Manage stashes with `akm list`, `akm update --all`, and `akm remove`.
108
+ Manage bundles with `akm bundle list`, `akm bundle update --all`, and `akm bundle remove`.
84
109
 
85
- ## Publish Your Own Stash
110
+ ## Publish Your Own Bundle
86
111
 
87
112
  1. Organize your assets into a directory
88
113
  2. Add `"akm"` to `keywords` in `package.json`
@@ -93,11 +118,11 @@ Manage stashes with `akm list`, `akm update --all`, and `akm remove`.
93
118
 
94
119
  Full docs, CLI reference, and guides are available on [GitHub](https://github.com/itlackey/akm):
95
120
 
96
- - [Getting Started](https://github.com/itlackey/akm/blob/main/docs/getting-started.md)
97
- - [CLI Reference](https://github.com/itlackey/akm/blob/main/docs/cli.md)
98
- - [Configuration](https://github.com/itlackey/akm/blob/main/docs/configuration.md)
99
- - [Stash Maker's Guide](https://github.com/itlackey/akm/blob/main/docs/stash-makers.md)
100
- - [Registry](https://github.com/itlackey/akm/blob/main/docs/registry.md)
121
+ - [Getting Started](https://github.com/itlackey/akm/blob/main/docs/guides/getting-started.md)
122
+ - [CLI Reference](https://github.com/itlackey/akm/blob/main/docs/reference/cli.md)
123
+ - [Configuration](https://github.com/itlackey/akm/blob/main/docs/reference/configuration.md)
124
+ - [Bundle Maker's Guide](https://github.com/itlackey/akm/blob/main/docs/guides/stash-makers.md)
125
+ - [Registry](https://github.com/itlackey/akm/blob/main/docs/reference/registry.md)
101
126
 
102
127
  ## License
103
128
 
package/SECURITY.md CHANGED
@@ -7,9 +7,9 @@ Security fixes are made on the latest minor release line of `akm-cli`. The
7
7
 
8
8
  | Version | Supported |
9
9
  | --- | --- |
10
- | 0.8.x | ✅ active |
11
- | 0.7.x | ❌ no longer maintained |
12
- | < 0.7 | ❌ no longer maintained |
10
+ | 0.9.x | ✅ active |
11
+ | 0.8.x | ❌ no longer maintained |
12
+ | < 0.8 | ❌ no longer maintained |
13
13
 
14
14
  ## Reporting a vulnerability
15
15
 
@@ -31,7 +31,7 @@ shell commands (via scripts, workflows, and agent dispatch), and talks to
31
31
  explicitly configured external services (LLM endpoints, git remotes, npm,
32
32
  HTTP sources). It does **not** ship telemetry, send data to anyone by
33
33
  default, or open network listeners. See
34
- [`docs/data-and-telemetry.md`](docs/data-and-telemetry.md) for the on-disk
34
+ [`docs/reference/data-and-telemetry.md`](docs/reference/data-and-telemetry.md) for the on-disk
35
35
  inventory.
36
36
 
37
37
  Several akm surfaces execute user-controlled code or data with the full
@@ -42,52 +42,67 @@ bugs, but you should be aware of them:
42
42
 
43
43
  Workflow steps run in your shell with your PATH and your environment
44
44
  variables — including any secrets you have exported or loaded via
45
- `akm vault load`. **Only add workflow sources you trust.** See
46
- [`docs/features/workflows.md` — "Security: workflow sources are executed
47
- code"](docs/features/workflows.md#security-workflow-sources-are-executed-code)
45
+ `akm env run` / `akm secret run`. **Only add workflow sources you trust.** See
46
+ [`docs/reference/workflows.md` — "Security: workflow sources are executed
47
+ code"](docs/reference/workflows.md#security-workflow-sources-are-executed-code)
48
48
  for the full discussion.
49
49
 
50
50
  ### Scripts execute shell commands
51
51
 
52
- `akm show script:<name>` returns a `run:` command line the user (or an
52
+ `akm show scripts/<name>` returns a `run:` command line the user (or an
53
53
  integrating agent) then executes. The same trust model applies: scripts you
54
54
  install from third-party stashes are third-party code.
55
55
 
56
56
  ### Agents and commands embed user-authored prompts
57
57
 
58
- `akm show agent:<name>` and `akm show command:<name>` return prompt
58
+ `akm show agents/<name>` and `akm show commands/<name>` return prompt
59
59
  templates and system prompts that an LLM will execute. A malicious stash
60
60
  maintainer could write a system prompt that instructs the LLM to read
61
61
  sensitive files in your working tree and exfiltrate them via the LLM
62
62
  response. Audit the prompt body the same way you'd audit a script.
63
63
 
64
- ### Vaults are plaintext on disk
64
+ ### Installing a stash means trusting its code
65
65
 
66
- `akm vault` files are `0o600`-permissioned plaintext at
67
- `<stash>/vaults/<name>.env`. They are protected against other local users
68
- by filesystem permissions but not encrypted at rest. Do not commit vault
69
- files to source control — they are `.gitignore`d in the default stash
70
- layout for that reason. The `akm vault show` / `akm vault list` commands
71
- never echo values; `akm vault load` produces shell-eval output meant to be
72
- piped to `eval`, never displayed.
66
+ Installing a stash is not a data-only operation: **`<stashDir>/scripts/wiki-fetchers/*.{ts,js,mjs}` is imported and EXECUTED during `akm index`** (when a website-snapshot source in that stash is synced), with no gate, no prompt, and no allowlist. Every file in that directory is dynamically `import()`ed, and only *after* the module has fully evaluated does akm check that its default export looks like a fetcher (`{ name, matches, fetch }`) — module-level code (anything outside the exported functions) runs unconditionally before that check ever happens, and a file that fails the check still ran. There is no sandboxing: a wiki-fetcher script executes with the full permissions of the akm process, exactly like the scripts and workflow steps documented above.
73
67
 
74
- ### Improve / propose / distill send asset content to the configured LLM
68
+ This is a deliberate design decision (owner ruling), not an oversight, and it will not change without a separate decision to add a gate. **If you install a stash from a source you do not trust, you are trusting its code to run on your machine at index time** — audit `scripts/wiki-fetchers/` the same way you would audit any other executable you're about to run, before installing.
75
69
 
76
- `akm improve`, `akm propose`, `akm distill`, `akm reflect`, and `akm
77
- consolidate` send asset frontmatter and body to whatever LLM endpoint is
78
- configured in `~/.config/akm/config.json` (under `llm.endpoint`). If you
79
- have configured a third-party LLM, your asset content goes to that
80
- third-party. Use a local model (`http://localhost:11434` via Ollama, etc.)
81
- for assets containing secrets or private notes.
70
+ The built-in YouTube snapshot fetcher (`src/sources/snapshot-fetchers/youtube.ts`) deliberately **impersonates the YouTube Android app's InnerTube client** (`clientName: "ANDROID"`, a spoofed `clientVersion`) when calling YouTube's private `youtubei/v1/player` endpoint, because the public web client's caption URLs are Proof-of-Origin-Token gated and return empty bodies. This is known, intentional behavior needed to fetch captions at all, not a bug — documented here so it isn't mistaken for one.
71
+
72
+ ### Environment and secret assets are plaintext on disk
73
+
74
+ `env` and `secret` assets are owner-permissioned plaintext under `<stash>/env/`
75
+ and `<stash>/secrets/`. They are protected against other local users by
76
+ filesystem permissions but are not encrypted at rest. Do not commit these
77
+ files to source control. Normal `akm env` and `akm secret` output never echoes
78
+ values; materialize values only at the command boundary with `akm env run`,
79
+ `akm secret run`, or `akm secret path`.
80
+
81
+ The knowledge graph extracted from your assets (entities/relations) lives
82
+ only in `$DATA/index.db` and is surfaced as aggregate counts via `akm health`
83
+ (`--report` for the full breakdown) — there is no export command that writes
84
+ graph content to an arbitrary path.
85
+
86
+ ### Improve / propose send asset content to the configured LLM
87
+
88
+ `akm improve` (whose strategies run processes such as reflect, distill, and
89
+ consolidate) and `akm proposal new` can send asset frontmatter and body to the
90
+ named LLM engine selected by the command, strategy, or current defaults. LLM
91
+ connections live under
92
+ `engines.<name>` in `~/.config/akm/config.json`. If you configure a third-party
93
+ LLM, your asset content goes to that third party. Use a local engine endpoint
94
+ (for example, `http://localhost:11434/v1/chat/completions` via Ollama) for assets
95
+ containing secrets or private notes.
82
96
 
83
97
  ## Known non-issues
84
98
 
85
- - **`akm` requires Bun or the prebuilt binary** — Node.js is not supported
86
- in 0.8.0 because Bun-specific APIs are used in hot paths. This is a
87
- compatibility limitation, not a security risk; the prebuilt binary is a
88
- Bun-compiled standalone executable.
99
+ - **The `akm-cli` npm package requires Node.js >= 22 as its bootstrap.** A
100
+ working Bun >= 1.0 is preferred for execution when it is also on `PATH`; old,
101
+ unusable, or absent Bun installations fall back to Node.js. Bun does not
102
+ remove the package's Node.js requirement. Standalone binaries are
103
+ runtime-free. This is a compatibility limitation, not a security risk.
89
104
  - **Workflows can read any file the akm process can read.** This is not a
90
105
  bug — see "Threat model" above.
91
- - **`bun install -g akm-cli` runs the preinstall hook.** The hook only
92
- emits an error message and exits non-zero on Node.js; it does not phone
93
- home or write outside the install directory.
106
+ - **Installing `akm-cli` runs the preinstall hook.** The hook only validates
107
+ the runtime version and exits non-zero when it is unsupported; it does not
108
+ phone home or write outside the install directory.
package/dist/akm CHANGED
@@ -1,38 +1,162 @@
1
- #!/bin/sh
2
- # This Source Code Form is subject to the terms of the Mozilla Public
3
- # License, v. 2.0. If a copy of the MPL was not distributed with this
4
- # file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
-
6
- case "$0" in
7
- */*) SCRIPT_PATH=$0 ;;
8
- *)
9
- SCRIPT_PATH=$(command -v -- "$0" 2>/dev/null || true)
10
- if [ -z "$SCRIPT_PATH" ]; then
11
- echo "akm launcher could not resolve its own path." >&2
12
- exit 127
13
- fi
14
- ;;
15
- esac
16
-
17
- if command -v readlink >/dev/null 2>&1; then
18
- while [ -L "$SCRIPT_PATH" ]; do
19
- LINK_TARGET=$(readlink "$SCRIPT_PATH")
20
- case "$LINK_TARGET" in
21
- /*) SCRIPT_PATH=$LINK_TARGET ;;
22
- *) SCRIPT_PATH=${SCRIPT_PATH%/*}/$LINK_TARGET ;;
23
- esac
24
- done
25
- fi
26
-
27
- SCRIPT_DIR=$(CDPATH= cd -- "${SCRIPT_PATH%/*}" && pwd)
28
-
29
- if command -v bun >/dev/null 2>&1; then
30
- exec bun "$SCRIPT_DIR/cli.js" "$@"
31
- fi
32
-
33
- if command -v node >/dev/null 2>&1; then
34
- exec node "$SCRIPT_DIR/cli-node.mjs" "$@"
35
- fi
36
-
37
- echo "akm requires Bun or Node.js >= 20.12.0 on PATH." >&2
38
- exit 127
1
+ #!/usr/bin/env node
2
+ // This Source Code Form is subject to the terms of the Mozilla Public
3
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
+
6
+ import { spawn, spawnSync } from "node:child_process";
7
+ import { createHash } from "node:crypto";
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+
12
+ const CONTEXT_ARG = "--scheduler-context";
13
+ const CONTEXT_KEYS = ["AKM_BUNDLE_DIR", "AKM_CONFIG_DIR", "AKM_DATA_DIR", "AKM_CACHE_DIR", "AKM_STATE_DIR"];
14
+ const CONTROL_CHARACTER = /[\u0000-\u001f\u007f-\u009f]/;
15
+
16
+ function invalidContext(file, reason) {
17
+ throw new Error(`Invalid scheduler context descriptor "${file}": ${reason}.`);
18
+ }
19
+
20
+ function readSchedulerContext(file) {
21
+ if (CONTROL_CHARACTER.test(file) || (!path.posix.isAbsolute(file) && !path.win32.isAbsolute(file))) {
22
+ invalidContext(file, "path must be absolute");
23
+ }
24
+ let linkStat;
25
+ try {
26
+ linkStat = fs.lstatSync(file);
27
+ } catch (error) {
28
+ invalidContext(file, error instanceof Error ? error.message : String(error));
29
+ }
30
+ if (linkStat.isSymbolicLink()) invalidContext(file, "symbolic links are not allowed");
31
+ if (!linkStat.isFile()) invalidContext(file, "path is not a regular file");
32
+
33
+ let bytes;
34
+ let fd;
35
+ try {
36
+ const noFollow = process.platform === "win32" ? 0 : fs.constants.O_NOFOLLOW;
37
+ fd = fs.openSync(file, fs.constants.O_RDONLY | noFollow);
38
+ const stat = fs.fstatSync(fd);
39
+ if (!stat.isFile()) invalidContext(file, "path is not a regular file");
40
+ if (process.platform !== "win32") {
41
+ if (typeof process.getuid !== "function") {
42
+ invalidContext(file, "current uid is unavailable for ownership verification");
43
+ }
44
+ const uid = process.getuid();
45
+ if (stat.uid !== uid) invalidContext(file, `file owner ${stat.uid} does not match uid ${uid}`);
46
+ if ((stat.mode & 0o077) !== 0) invalidContext(file, "group or other permissions must be disabled");
47
+ }
48
+ bytes = fs.readFileSync(fd);
49
+ } finally {
50
+ if (fd !== undefined) fs.closeSync(fd);
51
+ }
52
+
53
+ const match = /^([a-f0-9]{64})\.json$/.exec(path.basename(file));
54
+ const digest = createHash("sha256").update(bytes).digest("hex");
55
+ if (!match || match[1] !== digest) {
56
+ invalidContext(file, "content SHA-256 does not match the descriptor filename");
57
+ }
58
+
59
+ let descriptor;
60
+ try {
61
+ descriptor = JSON.parse(bytes.toString("utf8"));
62
+ } catch (error) {
63
+ invalidContext(file, error instanceof Error ? error.message : String(error));
64
+ }
65
+ if (
66
+ typeof descriptor !== "object" ||
67
+ descriptor === null ||
68
+ Array.isArray(descriptor) ||
69
+ descriptor.version !== 1 ||
70
+ Object.keys(descriptor).sort().join("\0") !== "environment\0version"
71
+ ) {
72
+ invalidContext(file, "expected the scheduler context v1 schema");
73
+ }
74
+ const environment = descriptor.environment;
75
+ const expected = [...CONTEXT_KEYS, "PATH"].sort();
76
+ const keys =
77
+ environment && typeof environment === "object" && !Array.isArray(environment)
78
+ ? Object.keys(environment).sort()
79
+ : [];
80
+ if (keys.length !== expected.length || keys.some((key, index) => key !== expected[index])) {
81
+ invalidContext(file, "environment keys do not match the scheduler context v1 schema");
82
+ }
83
+ for (const key of CONTEXT_KEYS) {
84
+ const value = environment[key];
85
+ if (
86
+ typeof value !== "string" ||
87
+ value.trim() === "" ||
88
+ CONTROL_CHARACTER.test(value) ||
89
+ (!path.posix.isAbsolute(value) && !path.win32.isAbsolute(value))
90
+ ) {
91
+ invalidContext(file, `${key} must be an absolute path without control characters`);
92
+ }
93
+ }
94
+ if (typeof environment.PATH !== "string" || CONTROL_CHARACTER.test(environment.PATH)) {
95
+ invalidContext(file, "PATH must be a string without control characters");
96
+ }
97
+ return environment;
98
+ }
99
+
100
+ const contextIndex = process.argv.indexOf(CONTEXT_ARG);
101
+ let contextValid = true;
102
+ if (contextIndex !== -1) {
103
+ try {
104
+ const contextPath = process.argv[contextIndex + 1];
105
+ if (!contextPath) throw new Error(`${CONTEXT_ARG} requires an absolute path.`);
106
+ const environment = readSchedulerContext(contextPath);
107
+ const expected = [...CONTEXT_KEYS, "PATH"].sort();
108
+ for (const key of expected) process.env[key] = environment[key];
109
+ process.argv.splice(contextIndex, 2);
110
+ } catch (error) {
111
+ console.error(`akm: ${error instanceof Error ? error.message : String(error)}`);
112
+ process.exitCode = 78;
113
+ contextValid = false;
114
+ }
115
+ }
116
+
117
+ if (contextValid) {
118
+ process.env.AKM_LAUNCHER_NODE = process.execPath;
119
+ process.env.AKM_LAUNCHER_PATH = fileURLToPath(import.meta.url);
120
+
121
+ if (!process.versions.bun) {
122
+ const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
123
+ if (major < 22) {
124
+ console.error("The akm-cli npm package requires Node.js >= 22 to bootstrap.");
125
+ process.exit(1);
126
+ }
127
+ }
128
+
129
+ const bunProbe = process.versions.bun
130
+ ? { status: 0, stdout: process.versions.bun }
131
+ : spawnSync("bun", ["--version"], {
132
+ encoding: "utf8",
133
+ stdio: ["ignore", "pipe", "ignore"],
134
+ timeout: 5_000,
135
+ });
136
+ const [bunMajor = 0] = (bunProbe.status === 0 ? bunProbe.stdout.trim() : "").split(".").map(Number);
137
+ const useBun = bunMajor >= 1;
138
+ const bunEntry = fileURLToPath(new URL("./cli.js", import.meta.url));
139
+ const nodeEntry = fileURLToPath(new URL("./cli-node.mjs", import.meta.url));
140
+
141
+ if (!useBun && !process.versions.bun) {
142
+ await import("./cli-node.mjs");
143
+ } else {
144
+ const command = useBun ? (process.versions.bun ? process.execPath : "bun") : "node";
145
+ const entry = useBun ? bunEntry : nodeEntry;
146
+ const runtime = useBun ? "Bun" : "Node.js";
147
+ const result = await new Promise((resolve) => {
148
+ const child = spawn(command, [entry, ...process.argv.slice(2)], { stdio: "inherit", env: process.env });
149
+ child.once("error", (error) => resolve({ error }));
150
+ child.once("exit", (code, signal) => resolve({ code, signal }));
151
+ });
152
+
153
+ if (result.error) {
154
+ console.error(`akm launcher could not start ${runtime}: ${result.error.message}`);
155
+ process.exitCode = 127;
156
+ } else if (result.signal) {
157
+ process.kill(process.pid, result.signal);
158
+ } else {
159
+ process.exitCode = result.code ?? 1;
160
+ }
161
+ }
162
+ }
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ // This Source Code Form is subject to the terms of the Mozilla Public
3
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
+
6
+ import { spawn, spawnSync } from "node:child_process";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ if (!process.versions.bun) {
10
+ const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
11
+ if (major < 22) {
12
+ console.error("The akm-cli npm package requires Node.js >= 22 to bootstrap.");
13
+ process.exit(1);
14
+ }
15
+ }
16
+
17
+ const bunProbe = process.versions.bun
18
+ ? { status: 0, stdout: process.versions.bun }
19
+ : spawnSync("bun", ["--version"], {
20
+ encoding: "utf8",
21
+ stdio: ["ignore", "pipe", "ignore"],
22
+ timeout: 5_000,
23
+ });
24
+ const [bunMajor = 0] = (bunProbe.status === 0 ? bunProbe.stdout.trim() : "").split(".").map(Number);
25
+ const useBun = bunMajor >= 1;
26
+ const bunEntry = fileURLToPath(new URL("./scripts/akm-migrate.js", import.meta.url));
27
+
28
+ {
29
+ const command = process.versions.bun ? process.execPath : useBun ? "bun" : process.execPath;
30
+ const result = await new Promise((resolve) => {
31
+ const child = spawn(command, [bunEntry, ...process.argv.slice(2)], { stdio: "inherit" });
32
+ child.once("error", (error) => resolve({ error }));
33
+ child.once("exit", (code, signal) => resolve({ code, signal }));
34
+ });
35
+
36
+ if (result.error) {
37
+ console.error(`akm-migrate launcher could not start its runtime: ${result.error.message}`);
38
+ process.exitCode = 127;
39
+ } else if (result.signal) {
40
+ process.kill(process.pid, result.signal);
41
+ } else {
42
+ process.exitCode = result.code ?? 1;
43
+ }
44
+ }
@@ -3,6 +3,8 @@
3
3
  <RegistrationInfo>
4
4
  <Description>akm scheduled task: {{TASK_ID}}</Description>
5
5
  <URI>{{FOLDER}}{{TASK_ID}}</URI>
6
+ <Source>{{SIGNATURE}}</Source>
7
+ <Documentation>Log target (informational only; schtasks doesn't redirect): {{LOG_PATH}}</Documentation>
6
8
  </RegistrationInfo>
7
9
  <Triggers>
8
10
  {{TRIGGER_XML}}
@@ -25,5 +27,4 @@
25
27
  <Arguments>{{ARGS}}</Arguments>
26
28
  </Exec>
27
29
  </Actions>
28
- <!-- Log target (informational only; schtasks doesn't redirect): {{LOG_PATH}} -->
29
30
  </Task>