akm-cli 0.9.0-rc.8 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -6,8 +6,8 @@
6
6
  *
7
7
  * `sync()` resolves the npm package tarball, downloads it, verifies its
8
8
  * integrity, extracts it securely (via `extractTarGzSecure`), detects the
9
- * stash root inside the package, and applies any nested `.akm-include`
10
- * configuration. Cache hits short-circuit the fetch.
9
+ * stash root inside the package, and applies any nested `akm.include`
10
+ * (package.json) configuration. Cache hits short-circuit the fetch.
11
11
  */
12
12
  import fs from "node:fs";
13
13
  import path from "node:path";
@@ -19,11 +19,10 @@ import { applyAkmIncludeConfig, buildInstallCacheDir, computeFileHash, detectSta
19
19
  import { extractTarGzSecure, verifyArchiveIntegrity } from "./tar-utils.js";
20
20
  /**
21
21
  * NPM source provider — fetches a tarball from the npm registry and extracts
22
- * it into a local cache. Implements the v1 {@link SourceProvider} interface
23
- * (spec §2.1): `{ name, kind, init, path, sync }`.
22
+ * it into a local cache. Implements the {@link SourceProvider} interface.
24
23
  *
25
24
  * The install-time pipeline (`syncNpmRef`) lives below as a standalone
26
- * function used by `akm add` / `akm update` that path produces a
25
+ * function used by `akm add` / `akm update`; that path produces a
27
26
  * {@link SourceLockData} record for lockfile bookkeeping. The provider's own
28
27
  * `sync()` is a void refresh (delegates to the install pipeline but discards
29
28
  * the lock data, which is owned by `lockfile.ts`).
@@ -39,7 +38,7 @@ class NpmSourceProvider {
39
38
  path() {
40
39
  if (this.#config.path)
41
40
  return this.#config.path;
42
- throw new ConfigError(`npm source "${this.name}" has no resolved content path — run \`akm update\` to sync it before indexing.`);
41
+ throw new ConfigError(`npm source "${this.name}" has no resolved content path — run \`akm bundle update\` to sync it before indexing.`);
43
42
  }
44
43
  async sync(options) {
45
44
  const ref = npmRefFromConfig(this.#config);
@@ -48,22 +47,20 @@ class NpmSourceProvider {
48
47
  }
49
48
  registerSourceProvider("npm", (config) => new NpmSourceProvider(config));
50
49
  function npmRefFromConfig(config) {
51
- // Prefer an explicit ref-bearing field (set by akmAdd when persisting), else fall back
52
- // to options or url so the provider stays usable from a hand-rolled config.
53
- const candidate = config.options?.ref ?? config.url ?? config.options?.package ?? config.name;
50
+ const candidate = config.path;
54
51
  if (typeof candidate !== "string" || !candidate) {
55
- throw new UsageError('npm stash entry must include an `options.ref` (e.g. "npm:my-pkg@1.2.3")');
52
+ throw new UsageError('npm source entry must include a package ref (e.g. "npm:my-pkg@1.2.3")');
56
53
  }
57
54
  return candidate.startsWith("npm:") ? candidate : `npm:${candidate}`;
58
55
  }
59
56
  /**
60
57
  * Fetch and extract an npm tarball, returning a populated `SourceLockData`.
61
58
  *
62
- * Mirrors the historical `installRegistryRef()` path for npm sources:
63
- * - resolve artifact URL + integrity from the npm registry
59
+ * Materializes npm sources by:
60
+ * - resolving the artifact URL and integrity from the npm registry
64
61
  * - reuse cached extraction when present
65
62
  * - download, verify, extract securely, then detect the stash root
66
- * - honour `.akm-include` filters
63
+ * - honour `akm.include` (package.json) filters
67
64
  */
68
65
  export async function syncNpmRef(ref, options) {
69
66
  const parsed = parseRegistryRef(ref);
@@ -107,7 +104,7 @@ async function doSyncNpm(parsed, options) {
107
104
  }
108
105
  fs.mkdirSync(cacheDir, { recursive: true });
109
106
  let integrity;
110
- let provisionalKitRoot;
107
+ let provisionalBundleRoot;
111
108
  let installRoot;
112
109
  let stashRoot;
113
110
  try {
@@ -115,15 +112,15 @@ async function doSyncNpm(parsed, options) {
115
112
  verifyArchiveIntegrity(archivePath, resolved.resolvedRevision, resolved.source);
116
113
  integrity = await computeFileHash(archivePath);
117
114
  extractTarGzSecure(archivePath, extractedDir);
118
- const detectedProvisionalKitRoot = detectStashRoot(extractedDir);
119
- if (!detectedProvisionalKitRoot) {
115
+ const detectedProvisionalBundleRoot = detectStashRoot(extractedDir);
116
+ if (!detectedProvisionalBundleRoot) {
120
117
  throw new UsageError(`Unable to detect a stash root in extracted npm package: ${resolved.ref}`);
121
118
  }
122
- provisionalKitRoot = detectedProvisionalKitRoot;
123
- installRoot = applyAkmIncludeConfig(provisionalKitRoot, cacheDir, extractedDir) ?? provisionalKitRoot;
119
+ provisionalBundleRoot = detectedProvisionalBundleRoot;
120
+ installRoot = applyAkmIncludeConfig(provisionalBundleRoot, cacheDir, extractedDir) ?? provisionalBundleRoot;
124
121
  const detectedStashRoot = detectStashRoot(installRoot);
125
122
  if (!detectedStashRoot) {
126
- throw new UsageError(`Unable to detect a stash root after applying .akm-include configuration for npm package: ${resolved.ref}`);
123
+ throw new UsageError(`Unable to detect a stash root after applying akm.include (package.json) configuration for npm package: ${resolved.ref}`);
127
124
  }
128
125
  stashRoot = detectedStashRoot;
129
126
  }
@@ -76,14 +76,17 @@ function uniqueSlug() {
76
76
  * `local` sources get a unique slug so each install is isolated.
77
77
  */
78
78
  export function buildInstallCacheDir(cacheRootDir, source, id, version) {
79
- const slug = `${source}-${id.replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "")}`;
79
+ const safeId = id.replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "");
80
+ const identitySuffix = version === "writable" ? `-${createHash("sha256").update(`${source}:${id}`).digest("hex").slice(0, 12)}` : "";
81
+ const slug = `${source}-${safeId}${identitySuffix}`;
80
82
  const versionSlug = source === "local" ? uniqueSlug() : (version?.replace(/[^a-zA-Z0-9_.-]+/g, "-") ?? uniqueSlug());
81
83
  return path.join(cacheRootDir, slug || source, versionSlug);
82
84
  }
83
85
  /**
84
- * Apply an `.akm-include` config (if any) by copying the selected paths
85
- * into a sibling `selected/` directory and returning that path. Returns
86
- * undefined when no include config is found.
86
+ * Apply an `akm.include` config (a `package.json` `akm.include` array NOT
87
+ * a `.akm-include` dotfile) if any, by copying the selected paths into a
88
+ * sibling `selected/` directory and returning that path. Returns undefined
89
+ * when no include config is found.
87
90
  */
88
91
  export function applyAkmIncludeConfig(sourceRoot, cacheDir, searchRoot = sourceRoot) {
89
92
  const includeConfig = findNearestIncludeConfig(sourceRoot, searchRoot);
@@ -2,11 +2,7 @@
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
  /**
5
- * Unified install-ref dispatcher.
6
- *
7
- * Replaces the historical `installRegistryRef()` entry point. Given an
8
- * unparsed install ref, this resolves the right syncable provider and
9
- * invokes its `sync()` method.
5
+ * Materialize an install ref through the matching source implementation.
10
6
  */
11
7
  import { UsageError } from "../../core/errors.js";
12
8
  import { parseRegistryRef } from "../../registry/resolve.js";
@@ -21,11 +17,9 @@ export async function syncFromRef(ref, options) {
21
17
  return syncNpmRef(ref, options);
22
18
  }
23
19
  if (parsed.source === "git" || parsed.source === "github") {
24
- const { syncRegistryGitRef } = await import("./git.js");
25
- return syncRegistryGitRef(ref, options);
20
+ const { syncGitRef } = await import("./git-install.js");
21
+ return syncGitRef(ref, options);
26
22
  }
27
- // Exhaustiveness — `parseRegistryRef` only emits the four sources above.
28
- const _exhaustive = parsed;
29
23
  throw new UsageError(`No syncable provider for ref: ${ref}`);
30
24
  }
31
25
  function syncLocalRef(parsed, options) {
@@ -14,12 +14,17 @@ registerSourceProvider("website", (config) => {
14
14
  kind: "website",
15
15
  name,
16
16
  path() {
17
- return getWebsiteCachePaths(url).stashDir;
17
+ return getWebsiteCachePaths(url).rootDir;
18
18
  },
19
19
  async sync(options) {
20
20
  await ensureWebsiteMirror(config, {
21
21
  requireStashDir: true,
22
22
  force: options?.force,
23
+ // Feed the resolver into the EXISTING website-ingest plumbing that
24
+ // already threads `resolveSecret` down to `FetcherContext`. This is the
25
+ // line that closes the bundle-update / sync() gap: previously the X
26
+ // fetcher on this path saw only `X_BEARER_TOKEN`, never the store.
27
+ ...(options?.secrets ? { resolveSecret: options.secrets.resolveSecret } : {}),
23
28
  ...(allowPrivateHosts ? { allowPrivateHosts: true } : {}),
24
29
  });
25
30
  },
@@ -5,6 +5,7 @@ import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  import { recognizeMatch } from "../core/adapter/recognize-match.js";
7
7
  import { assetPathForName, deriveCanonicalAssetNameFromStashRoot, isRelevantAssetFile, stashDirFor, } from "../core/asset/asset-placement.js";
8
+ import { conceptIdFromTypeName } from "../core/asset/resolve-ref.js";
8
9
  import { hasErrnoCode, isWithin } from "../core/common.js";
9
10
  import { NotFoundError, UsageError } from "../core/errors.js";
10
11
  import { walkStashFlat } from "../indexer/walk/walker.js";
@@ -36,7 +37,7 @@ function resolveInTypeDir(stashDir, typeDir, type, name) {
36
37
  throw new UsageError("Ref resolves outside the stash root.", "PATH_ESCAPE_VIOLATION");
37
38
  }
38
39
  if (!fs.existsSync(resolvedTarget) || !fs.statSync(resolvedTarget).isFile()) {
39
- throw new NotFoundError(`Stash asset not found for ref: ${type}:${name}`, "ASSET_NOT_FOUND");
40
+ throw new NotFoundError(`Stash asset not found for ref: ${conceptIdFromTypeName(type, name)}`, "ASSET_NOT_FOUND");
40
41
  }
41
42
  const realTarget = fs.realpathSync(resolvedTarget);
42
43
  if (!isWithin(realTarget, resolvedRoot)) {
@@ -46,15 +47,15 @@ function resolveInTypeDir(stashDir, typeDir, type, name) {
46
47
  if (type === "script") {
47
48
  throw new NotFoundError("Script ref must resolve to a file with a supported script extension. Refer to the akm documentation for the complete list of supported script extensions.");
48
49
  }
49
- throw new NotFoundError(`Stash asset not found for ref: ${type}:${name}`, "ASSET_NOT_FOUND");
50
+ throw new NotFoundError(`Stash asset not found for ref: ${conceptIdFromTypeName(type, name)}`, "ASSET_NOT_FOUND");
50
51
  }
51
52
  return realTarget;
52
53
  }
53
54
  function resolveAndValidateTypeRoot(root, type, name) {
54
55
  const rootStat = readTypeRootStat(root, type, name);
55
56
  if (!rootStat.isDirectory()) {
56
- throw new NotFoundError(`Asset directory for ${type} assets is not accessible — got a file where a directory was expected for ref: ${type}:${name}. ` +
57
- "Run `akm index` to rebuild the index, or check your source configuration.", "ASSET_NOT_FOUND", "Run `akm list` to see your configured sources and verify the source path exists.");
57
+ throw new NotFoundError(`Asset directory for ${type} assets is not accessible — got a file where a directory was expected for ref: ${conceptIdFromTypeName(type, name)}. ` +
58
+ "Run `akm index` to rebuild the index, or check your source configuration.", "ASSET_NOT_FOUND", "Run `akm bundle list` to see your configured sources and verify the source path exists.");
58
59
  }
59
60
  return fs.realpathSync(root);
60
61
  }
@@ -64,7 +65,7 @@ function readTypeRootStat(root, type, name) {
64
65
  }
65
66
  catch (error) {
66
67
  if (hasErrnoCode(error, "ENOENT")) {
67
- throw new NotFoundError(`Asset not found for ref: ${type}:${name}. No ${type} assets are present in the configured source.`, "ASSET_NOT_FOUND", "Run `akm list` to see your configured sources, or `akm index` to rebuild the search index.");
68
+ throw new NotFoundError(`Asset not found for ref: ${conceptIdFromTypeName(type, name)}. No ${type} assets are present in the configured source.`, "ASSET_NOT_FOUND", "Run `akm bundle list` to see your configured sources, or `akm index` to rebuild the search index.");
68
69
  }
69
70
  throw error;
70
71
  }
@@ -0,0 +1,146 @@
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
+ import { isSafeLinkUrl } from "./content-extract.js";
5
+ import { coerceString, escapeMarkdownStructure } from "./fetcher-util.js";
6
+ import { fetchPinnedJson } from "./host-guard.js";
7
+ /**
8
+ * Bluesky profile fetcher, using the public AT Protocol XRPC endpoints.
9
+ *
10
+ * No authentication: `public.api.bsky.app` serves public profiles unauthed.
11
+ * The fetcher contract takes a URL, so bare-handle input (`@user.bsky.social`)
12
+ * is out of scope — that is `akm bundle add` sugar, not an addressable source.
13
+ */
14
+ const BSKY_HOSTS = new Set(["bsky.app", "www.bsky.app"]);
15
+ const PUBLIC_API_BASE = "https://public.api.bsky.app";
16
+ /** The XRPC endpoint caps `limit` at 100; asking for more is an error. */
17
+ const MAX_FEED_LIMIT = 100;
18
+ const DEFAULT_FEED_LIMIT = 50;
19
+ /** Bound the JSON read: fetch timeouts cover only the header phase. */
20
+ const BSKY_BYTE_CAP = 4 * 1024 * 1024;
21
+ const BSKY_BODY_TIMEOUT_MS = 30_000;
22
+ /** Extract a handle from `https://bsky.app/profile/<handle>`. */
23
+ export function extractBlueskyHandle(url) {
24
+ if (!BSKY_HOSTS.has(url.hostname.toLowerCase()))
25
+ return null;
26
+ const segments = url.pathname.split("/").filter(Boolean);
27
+ if (segments.length < 2 || segments[0] !== "profile")
28
+ return null;
29
+ const handle = segments[1]?.trim();
30
+ if (!handle)
31
+ return null;
32
+ // Only the profile root is a snapshot target; /post/<id> and other
33
+ // sub-routes are individual records, not a profile feed.
34
+ if (segments.length > 2)
35
+ return null;
36
+ return handle.replace(/^@/, "");
37
+ }
38
+ /** Emit a link only when it is a safe absolute http(s) URL. */
39
+ function safeLink(value) {
40
+ if (!value)
41
+ return "";
42
+ try {
43
+ return isSafeLinkUrl(new URL(value)) ? value : "";
44
+ }
45
+ catch {
46
+ return "";
47
+ }
48
+ }
49
+ function num(value) {
50
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
51
+ }
52
+ function xrpcJson(url, timeoutMs, signal) {
53
+ return fetchPinnedJson(url, {
54
+ headers: { Accept: "application/json", "User-Agent": "akm-cli bluesky fetcher" },
55
+ byteCap: BSKY_BYTE_CAP,
56
+ bodyTimeoutMs: BSKY_BODY_TIMEOUT_MS,
57
+ timeoutMs,
58
+ signal,
59
+ });
60
+ }
61
+ /** Resolve a handle to its DID. Returns null when the handle does not exist. */
62
+ async function resolveHandle(handle, timeoutMs, signal) {
63
+ const url = `${PUBLIC_API_BASE}/xrpc/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(handle)}`;
64
+ const json = (await xrpcJson(url, timeoutMs, signal));
65
+ const did = coerceString(json?.did);
66
+ return did || null;
67
+ }
68
+ function readPosts(feed, limit) {
69
+ if (!Array.isArray(feed))
70
+ return [];
71
+ const posts = [];
72
+ for (const entry of feed.slice(0, limit)) {
73
+ const post = entry?.post;
74
+ if (!post)
75
+ continue;
76
+ const record = (post.record ?? {});
77
+ const embed = (post.embed ?? {});
78
+ const external = (embed.external ?? {});
79
+ posts.push({
80
+ text: coerceString(record.text),
81
+ createdAt: coerceString(record.createdAt),
82
+ uri: coerceString(post.uri),
83
+ likeCount: num(post.likeCount),
84
+ repostCount: num(post.repostCount),
85
+ externalUri: safeLink(coerceString(external.uri)),
86
+ });
87
+ }
88
+ return posts;
89
+ }
90
+ /** Convert an `at://did/app.bsky.feed.post/<rkey>` URI to a bsky.app permalink. */
91
+ function permalink(handle, uri) {
92
+ const rkey = uri.split("/").pop();
93
+ return rkey ? `https://bsky.app/profile/${handle}/post/${rkey}` : "";
94
+ }
95
+ function renderMarkdown(handle, posts) {
96
+ const sections = [];
97
+ for (const post of posts) {
98
+ if (!post.text && !post.externalUri)
99
+ continue;
100
+ const when = post.createdAt ? new Date(post.createdAt) : null;
101
+ const iso = when && !Number.isNaN(when.getTime()) ? when.toISOString() : "";
102
+ sections.push(`## ${iso || "(undated)"}`, "");
103
+ if (post.text)
104
+ sections.push(escapeMarkdownStructure(post.text), "");
105
+ const meta = [];
106
+ const link = permalink(handle, post.uri);
107
+ if (link)
108
+ meta.push(link);
109
+ if (post.externalUri)
110
+ meta.push(`link: ${post.externalUri}`);
111
+ meta.push(`${post.likeCount} likes, ${post.repostCount} reposts`);
112
+ sections.push(meta.join(" — "), "");
113
+ }
114
+ return sections.join("\n").trimEnd();
115
+ }
116
+ const blueskyFetcher = {
117
+ name: "bluesky-profile",
118
+ matches(url) {
119
+ return extractBlueskyHandle(url) !== null;
120
+ },
121
+ async fetch(url, context) {
122
+ const handle = extractBlueskyHandle(url);
123
+ if (!handle)
124
+ return null;
125
+ const did = await resolveHandle(handle, context.timeoutMs, context.signal);
126
+ if (!did)
127
+ return null;
128
+ const feedUrl = `${PUBLIC_API_BASE}/xrpc/app.bsky.feed.getAuthorFeed` +
129
+ `?actor=${encodeURIComponent(did)}&limit=${Math.min(DEFAULT_FEED_LIMIT, MAX_FEED_LIMIT)}`;
130
+ const json = (await xrpcJson(feedUrl, context.timeoutMs, context.signal));
131
+ if (!json)
132
+ return null;
133
+ const posts = readPosts(json.feed, DEFAULT_FEED_LIMIT);
134
+ const markdown = renderMarkdown(handle, posts);
135
+ if (!markdown)
136
+ return null;
137
+ return {
138
+ url: `https://bsky.app/profile/${handle}`,
139
+ title: `Bluesky — @${handle}`,
140
+ markdown,
141
+ preferredName: `bluesky/${handle}`,
142
+ tags: ["bluesky", "social"],
143
+ };
144
+ },
145
+ };
146
+ export default blueskyFetcher;