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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,303 @@
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
+ /**
5
+ * Managed-subprocess primitive.
6
+ *
7
+ * The battle-tested spawn/timeout/abort/capture core, extracted from the agent
8
+ * CLI spawn wrapper so non-agent subprocess callers (task commands, setup
9
+ * probes/installers) get the same guarantees the agent path already had:
10
+ *
11
+ * • Process-GROUP spawn (`detached: true` when capturing) so a negative-pid
12
+ * kill reaps the whole descendant tree — no orphaned children.
13
+ * • A SIGTERM→SIGKILL kill ladder on timeout/abort — a child that ignores
14
+ * SIGTERM is force-killed after a grace period instead of wedging forever.
15
+ * • Bounded output capture ({@link readStream}) that cannot block past the
16
+ * wall budget even when the child leaves a pipe endpoint open.
17
+ * • Injectable `spawnFn`/`setTimeoutFn`/`clearTimeoutFn` seams so callers
18
+ * can drive the machinery deterministically in tests.
19
+ *
20
+ * Runtime boundary: the default spawn comes from `../runtime`; this module
21
+ * never touches `Bun.*` directly. It also never imports from `integrations/`
22
+ * or `tasks/` — it is a leaf primitive those layers consume.
23
+ */
24
+ import { spawn as runtimeSpawn } from "../runtime.js";
25
+ /**
26
+ * Kill the process group of `proc` with `signal`, falling back to
27
+ * `proc.kill(signal)` when `proc.pid` is unavailable (e.g. test fakes).
28
+ *
29
+ * Passing a negative PID to `process.kill` targets the entire process
30
+ * group, so opencode's child processes (the .opencode binary, etc.) are
31
+ * reaped alongside the node wrapper. The fallback keeps test fakes working
32
+ * without modification.
33
+ */
34
+ export function killGroup(proc, signal) {
35
+ if (typeof proc.pid === "number") {
36
+ try {
37
+ process.kill(-proc.pid, signal);
38
+ return;
39
+ }
40
+ catch {
41
+ // Process may have already exited; fall through to direct kill.
42
+ }
43
+ }
44
+ try {
45
+ proc.kill(signal);
46
+ }
47
+ catch {
48
+ /* ignore */
49
+ }
50
+ }
51
+ /**
52
+ * SIGTERM→SIGKILL kill ladder shared by the timeout and abort paths (§4.6
53
+ * dedup, H3). No-op when the child has already exited; otherwise runs
54
+ * `onKill` (the caller's reason flag — `timedOut` / `aborted` — set BEFORE
55
+ * the first signal, exactly as the inlined copies did), SIGTERMs the
56
+ * process group, and schedules a follow-up SIGKILL after `graceMs` in case
57
+ * the process ignores SIGTERM. The SIGKILL timer is unref'ed so it never
58
+ * pins the event loop.
59
+ */
60
+ export function scheduleKillLadder(proc, opts) {
61
+ if (!proc || proc.exitCode !== null)
62
+ return;
63
+ opts.onKill();
64
+ killGroup(proc, "SIGTERM");
65
+ const sigkillTimer = opts.setTimeoutFn(() => {
66
+ if (!proc || proc.exitCode !== null)
67
+ return;
68
+ killGroup(proc, "SIGKILL");
69
+ }, opts.graceMs ?? 5000);
70
+ if (typeof sigkillTimer !== "number")
71
+ sigkillTimer.unref?.();
72
+ }
73
+ const STREAM_READ_TIMEOUT = Symbol("stream-read-timeout");
74
+ /**
75
+ * Drain a readable stream to text, optionally racing each read against a
76
+ * timeout so a process that is killed via SIGTERM/SIGKILL but whose pipe
77
+ * endpoints stay open (e.g. background threads still holding the fd) cannot
78
+ * block the caller indefinitely. On timeout we return whatever was decoded
79
+ * before the pipe stopped draining.
80
+ */
81
+ export async function readStream(stream, opts) {
82
+ if (!stream)
83
+ return { text: "", timedOut: false };
84
+ const reader = stream.getReader();
85
+ const decoder = new TextDecoder();
86
+ let text = "";
87
+ if (!opts?.timeoutMs) {
88
+ try {
89
+ while (true) {
90
+ const chunk = await reader.read();
91
+ if (chunk.done)
92
+ break;
93
+ text += decoder.decode(chunk.value, { stream: true });
94
+ }
95
+ text += decoder.decode();
96
+ return { text, timedOut: false };
97
+ }
98
+ catch (error) {
99
+ return { text, timedOut: false, error };
100
+ }
101
+ finally {
102
+ try {
103
+ reader.releaseLock();
104
+ }
105
+ catch {
106
+ /* ignore */
107
+ }
108
+ }
109
+ }
110
+ const setTimeoutImpl = opts.setTimeoutFn ?? setTimeout;
111
+ const clearTimeoutImpl = opts.clearTimeoutFn ?? clearTimeout;
112
+ let timer;
113
+ const timeoutPromise = new Promise((resolve) => {
114
+ timer = setTimeoutImpl(() => {
115
+ timer = undefined;
116
+ resolve(STREAM_READ_TIMEOUT);
117
+ }, opts.timeoutMs);
118
+ if (typeof timer !== "number")
119
+ timer.unref?.();
120
+ });
121
+ try {
122
+ while (true) {
123
+ const chunk = await Promise.race([reader.read(), timeoutPromise]);
124
+ if (chunk === STREAM_READ_TIMEOUT) {
125
+ void reader.cancel().catch(() => { });
126
+ return { text, timedOut: true };
127
+ }
128
+ if (chunk.done)
129
+ break;
130
+ text += decoder.decode(chunk.value, { stream: true });
131
+ }
132
+ text += decoder.decode();
133
+ return { text, timedOut: false };
134
+ }
135
+ catch (error) {
136
+ return { text, timedOut: false, error };
137
+ }
138
+ finally {
139
+ if (timer !== undefined) {
140
+ clearTimeoutImpl(timer);
141
+ }
142
+ try {
143
+ reader.releaseLock();
144
+ }
145
+ catch {
146
+ /* ignore */
147
+ }
148
+ }
149
+ }
150
+ const EMPTY_READ = { text: "", timedOut: false };
151
+ function toError(err) {
152
+ return err instanceof Error ? err : new Error(String(err));
153
+ }
154
+ /**
155
+ * Spawn `cmd` and manage its lifecycle: process-group spawn, hard timeout and
156
+ * cooperative abort (both via the SIGTERM→SIGKILL {@link scheduleKillLadder}),
157
+ * bounded output capture, and an optional stdin payload. Never throws for a
158
+ * spawn/exit failure — those surface as {@link ManagedSubprocessResult.spawnError}.
159
+ */
160
+ export async function runManagedSubprocess(cmd, opts) {
161
+ const setTimeoutImpl = opts.setTimeoutFn ?? setTimeout;
162
+ const clearTimeoutImpl = opts.clearTimeoutFn ?? clearTimeout;
163
+ const spawnFn = opts.spawnFn ?? runtimeSpawn;
164
+ const capture = opts.capture;
165
+ const timeoutMs = opts.timeoutMs;
166
+ // Refuse to spawn at all when the caller's signal is already aborted.
167
+ if (opts.signal?.aborted) {
168
+ return {
169
+ exitCode: null,
170
+ stdout: "",
171
+ stderr: "",
172
+ timedOut: false,
173
+ aborted: true,
174
+ stdoutRead: EMPTY_READ,
175
+ stderrRead: EMPTY_READ,
176
+ };
177
+ }
178
+ let proc;
179
+ try {
180
+ proc = spawnFn(cmd, {
181
+ stdin: capture ? (opts.stdin !== undefined ? "pipe" : "ignore") : "inherit",
182
+ stdout: capture ? "pipe" : "inherit",
183
+ stderr: capture ? "pipe" : "inherit",
184
+ ...(opts.env ? { env: opts.env } : {}),
185
+ ...(opts.cwd ? { cwd: opts.cwd } : {}),
186
+ // Spawn in its own process group so killGroup(-pid, signal) reaches all
187
+ // descendants. Only in captured mode — interactive mode inherits the
188
+ // parent terminal's process group intentionally.
189
+ ...(capture ? { detached: true } : {}),
190
+ });
191
+ }
192
+ catch (err) {
193
+ return {
194
+ exitCode: null,
195
+ stdout: "",
196
+ stderr: "",
197
+ timedOut: false,
198
+ aborted: false,
199
+ spawnError: toError(err),
200
+ stdoutRead: EMPTY_READ,
201
+ stderrRead: EMPTY_READ,
202
+ };
203
+ }
204
+ opts.onSpawn?.(proc);
205
+ // Hard timeout: SIGTERM now, SIGKILL after the grace period if ignored.
206
+ // Skipped entirely when timeoutMs is null.
207
+ let timedOut = false;
208
+ let timer;
209
+ if (timeoutMs !== null) {
210
+ timer = setTimeoutImpl(() => {
211
+ scheduleKillLadder(proc, {
212
+ onKill: () => {
213
+ timedOut = true;
214
+ },
215
+ setTimeoutFn: setTimeoutImpl,
216
+ ...(opts.graceMs !== undefined ? { graceMs: opts.graceMs } : {}),
217
+ });
218
+ }, timeoutMs);
219
+ }
220
+ // Cooperative cancel: same ladder, flagged separately so the caller can tell
221
+ // a budget/user abort from a wall-clock expiry.
222
+ let aborted = false;
223
+ const abortSignal = opts.signal;
224
+ const onAbort = () => {
225
+ scheduleKillLadder(proc, {
226
+ onKill: () => {
227
+ aborted = true;
228
+ },
229
+ setTimeoutFn: setTimeoutImpl,
230
+ ...(opts.graceMs !== undefined ? { graceMs: opts.graceMs } : {}),
231
+ });
232
+ };
233
+ if (abortSignal) {
234
+ // A signal that aborted between the pre-spawn check and here fires the
235
+ // listener directly (the "abort" event would otherwise never re-dispatch).
236
+ if (abortSignal.aborted)
237
+ onAbort();
238
+ else
239
+ abortSignal.addEventListener("abort", onAbort, { once: true });
240
+ }
241
+ // Stream-drain timeout: the wall budget plus a 2 s grace, or 30 s when there
242
+ // is no kill timer. Ensures the caller never hangs past the budget even if a
243
+ // killed child leaves a pipe write-end open in a background thread.
244
+ const streamDrainTimeoutMs = timeoutMs !== null ? timeoutMs + 2_000 : 30_000;
245
+ const stdoutPromise = capture
246
+ ? readStream(proc.stdout ?? null, {
247
+ timeoutMs: streamDrainTimeoutMs,
248
+ setTimeoutFn: setTimeoutImpl,
249
+ clearTimeoutFn: clearTimeoutImpl,
250
+ })
251
+ : Promise.resolve(EMPTY_READ);
252
+ const stderrPromise = capture
253
+ ? readStream(proc.stderr ?? null, {
254
+ timeoutMs: streamDrainTimeoutMs,
255
+ setTimeoutFn: setTimeoutImpl,
256
+ clearTimeoutFn: clearTimeoutImpl,
257
+ })
258
+ : Promise.resolve(EMPTY_READ);
259
+ // Optional stdin payload (captured mode only). Race the write/close against
260
+ // proc.exited so a child that never drains stdin cannot pin us past the
261
+ // timeout.
262
+ if (opts.stdin !== undefined && capture && proc.stdin) {
263
+ const stdinPayload = opts.stdin;
264
+ const stdinStream = proc.stdin;
265
+ const stdinDone = (async () => {
266
+ try {
267
+ const writer = stdinStream.getWriter();
268
+ await writer.write(new TextEncoder().encode(stdinPayload));
269
+ await writer.close();
270
+ }
271
+ catch {
272
+ // Best-effort: ignore stdin write failures, the child will get EOF.
273
+ }
274
+ })();
275
+ await Promise.race([stdinDone, proc.exited.catch(() => undefined)]);
276
+ }
277
+ let exitCode = null;
278
+ try {
279
+ exitCode = await proc.exited;
280
+ }
281
+ catch (err) {
282
+ if (timer !== undefined)
283
+ clearTimeoutImpl(timer);
284
+ abortSignal?.removeEventListener("abort", onAbort);
285
+ // Drain readers so they don't surface as unhandled rejections. The streams
286
+ // carry their own drain timeout so this cannot block indefinitely.
287
+ await Promise.allSettled([stdoutPromise, stderrPromise]);
288
+ return {
289
+ exitCode: null,
290
+ stdout: "",
291
+ stderr: "",
292
+ timedOut: false,
293
+ aborted: false,
294
+ spawnError: toError(err),
295
+ stdoutRead: EMPTY_READ,
296
+ stderrRead: EMPTY_READ,
297
+ };
298
+ }
299
+ clearTimeoutImpl(timer);
300
+ abortSignal?.removeEventListener("abort", onAbort);
301
+ const [stdoutRead, stderrRead] = await Promise.all([stdoutPromise, stderrPromise]);
302
+ return { exitCode, stdout: stdoutRead.text, stderr: stderrRead.text, timedOut, aborted, stdoutRead, stderrRead };
303
+ }
@@ -9,9 +9,11 @@
9
9
  * implementations historically maintained overlapping-but-not-identical
10
10
  * vocabularies of hanging-connector words, which was a maintenance trap.
11
11
  *
12
- * This module is the single source of truth. `distill` continues to layer its
13
- * own section-heading regex on top (those patterns are distill-specific and
14
- * intentionally stay local to that module).
12
+ * This module is the single source of truth. A separate section-heading regex
13
+ * (`HEADING_FRAGMENT_PATTERNS` in
14
+ * `src/commands/proposal/validators/proposal-quality-validators.ts`) layers on
15
+ * top of these heuristics and is shared across distill, consolidate, and
16
+ * reflect rather than staying local to any one of them.
15
17
  */
16
18
  /**
17
19
  * Words that, when ending a sentence, suggest the description was truncated
@@ -87,8 +89,10 @@ export const TRUNCATION_TRAILING_WORDS = new Set([
87
89
  * - Trailing ellipsis (`...` or `…`)
88
90
  * - Last word matches {@link TRUNCATION_TRAILING_WORDS}
89
91
  *
90
- * Does NOT detect section-heading fragments — that check is distill-specific
91
- * and lives in `src/commands/distill.ts` (`HEADING_FRAGMENT_PATTERNS`).
92
+ * Does NOT detect section-heading fragments — that check lives in
93
+ * `HEADING_FRAGMENT_PATTERNS` in
94
+ * `src/commands/proposal/validators/proposal-quality-validators.ts`, shared by
95
+ * distill, consolidate, and reflect.
92
96
  */
93
97
  export function detectTruncatedDescription(description) {
94
98
  const trimmed = description.trim();
package/dist/core/time.js CHANGED
@@ -98,6 +98,26 @@ export function parseSinceToIso(since) {
98
98
  }
99
99
  return parsed.toISOString();
100
100
  }
101
+ /**
102
+ * LENIENT variant for config-driven since-values that may be a duration
103
+ * shorthand (e.g. `"30m"`, `"24h"`, `"7d"` per {@link DURATION_UNITS}):
104
+ * a matching duration resolves to the ISO timestamp of `now - duration`;
105
+ * anything else is returned UNCHANGED (assumed to already be an ISO
106
+ * timestamp) — this function never throws.
107
+ *
108
+ * Deliberately distinct from {@link parseSinceToIso}, which rejects
109
+ * unparseable input with a UsageError: the identity fallback here is
110
+ * behavior consumers rely on (consolidate's incremental narrowing compares
111
+ * the returned string lexicographically against file-mtime ISO strings, so
112
+ * garbage input silently selects nothing rather than failing the run —
113
+ * pinned by tests/commands/goldens-duration-flags.test.ts).
114
+ */
115
+ export function parseSinceToIsoLenient(since) {
116
+ const ms = parseDuration(since, DURATION_UNITS);
117
+ if (ms === null)
118
+ return since;
119
+ return new Date(Date.now() - ms).toISOString();
120
+ }
101
121
  /**
102
122
  * Convert an ISO-8601 timestamp string to the SQLite datetime format
103
123
  * `"YYYY-MM-DD HH:MM:SS"` used by `datetime('now')`.
@@ -0,0 +1,130 @@
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
+ /**
5
+ * Chunk 1.5 (WI-1.5.1, D1.5-4) — the §2.3 "compile-time safety mitigation"
6
+ * table for AKM's own presentation metadata. EXTENDED by chunk-2 WI-C
7
+ * (`docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md` §2) to carry the per-`type`
8
+ * renderer NAME + action builder, so this table becomes the `TYPE_PRESENTATION`
9
+ * data table §2 mandates ("Renderer/action = data table keyed on the open
10
+ * `type`, pointing at a named-function core module").
11
+ *
12
+ * The open type token (chunk 1.5) trades the deleted closed asset-type
13
+ * union's exhaustiveness checking for a runtime lookup. `TYPE_PRESENTATION`
14
+ * restores that exhaustiveness for AKM's OWN known types (the compiler
15
+ * demands an entry whenever {@link KnownType} gains a member), while
16
+ * {@link presentationFor} stays open over `string` so foreign/adapter types
17
+ * still resolve to a sane generic fallback instead of `undefined`/a throw.
18
+ *
19
+ * ── renderer/action provenance (WI-C, §2) ──
20
+ *
21
+ * The `renderer` NAMES and `action` builders below are the SINGLE SOURCE OF
22
+ * TRUTH for search-hit rendering — chunk-3 folded the old mutable renderer/
23
+ * action registry singleton into this static table (reached via
24
+ * {@link defaultRendererRegistry}). They cover all built-in types — INCLUDING
25
+ * the 15th type `instruction` (a read-like-knowledge markdown doc added for the
26
+ * format-family adapters) and the 6 "static-only" mappings
27
+ * (script/skill/command/agent/knowledge/memory) — §6 "6 renderer mappings".
28
+ * The workflow action is the one function-valued builder; its
29
+ * `buildWorkflowAction` body (`output/renderers.ts` — a cycle-sensitive module)
30
+ * is reproduced inline here rather than imported, to keep this leaf import-free
31
+ * (only `recognition-util`, D1-5's pure sink); `tests/core/adapter/
32
+ * akm-presentation.test.ts` pins the renderer/action values against drift.
33
+ */
34
+ import { isKnownType } from "./recognition-util.js";
35
+ /** POSIX-shell single-quote a value — inlined from `output/renderers.ts#shellQuote` (cycle-sensitive; see file header). */
36
+ function shellQuote(value) {
37
+ return `'${value.replace(/'/g, `'\\''`)}'`;
38
+ }
39
+ /** Reproduced from `output/renderers.ts#buildWorkflowAction` — the one function-valued `ACTION_BUILDERS.workflow` entry. */
40
+ function buildWorkflowAction(ref) {
41
+ return `Resume the active run or start a new run with \`akm workflow next ${shellQuote(ref)}\`.`;
42
+ }
43
+ /**
44
+ * Exhaustive over {@link KnownType} — a HAND-WRITTEN literal, not derived
45
+ * from `KNOWN_TYPES` programmatically, so the compiler rejects this object
46
+ * if a `KNOWN_TYPES` member is added without a corresponding entry here
47
+ * (TypeScript's version of the `§7.3 shipped-assets lint` cross-check the
48
+ * plan describes for later — "adding a KNOWN_TYPE forces a decision").
49
+ *
50
+ * `renderer`/`action` are the built-in search-hit rendering data (WI-C, §2) —
51
+ * see the file header.
52
+ */
53
+ export const TYPE_PRESENTATION = {
54
+ skill: { label: "Skill", renderer: "skill-md", action: (ref) => `akm show ${ref} -> follow the instructions` },
55
+ command: {
56
+ label: "Command",
57
+ renderer: "command-md",
58
+ action: (ref) => `akm show ${ref} -> fill placeholders and dispatch`,
59
+ },
60
+ agent: { label: "Agent", renderer: "agent-md", action: (ref) => `akm show ${ref} -> dispatch with full prompt` },
61
+ knowledge: {
62
+ label: "Knowledge",
63
+ renderer: "knowledge-md",
64
+ action: (ref) => `akm show ${ref} -> read reference material`,
65
+ },
66
+ workflow: { label: "Workflow", renderer: "workflow-md", action: (ref) => buildWorkflowAction(ref) },
67
+ script: { label: "Script", renderer: "script-source", action: (ref) => `akm show ${ref} -> execute the run command` },
68
+ memory: { label: "Memory", renderer: "memory-md", action: (ref) => `akm show ${ref} -> recall context` },
69
+ env: {
70
+ label: "Env",
71
+ renderer: "env-file",
72
+ action: (ref) => `akm show ${ref} -> inspect key names; akm env run ${ref} -- <command> -> run with the whole .env injected (prefer --clean to minimize inherited parent env; child stdout is not redacted). akm env export ${ref} --out <file> writes a sourceable script (values to a file, not stdout).`,
73
+ },
74
+ secret: {
75
+ label: "Secret",
76
+ renderer: "secret-file",
77
+ action: (ref) => `akm show ${ref} -> name only (value never shown); akm secret run ${ref} <VAR> -- <command> -> run with value injected into $VAR`,
78
+ },
79
+ lesson: {
80
+ label: "Lesson",
81
+ renderer: "lesson-md",
82
+ action: (ref) => `akm show ${ref} -> read the lesson and apply when_to_use`,
83
+ },
84
+ task: {
85
+ label: "Task",
86
+ renderer: "task-yaml",
87
+ action: (ref) => `akm show ${ref} -> inspect; akm task run <id> -> run now; edit the file + akm task sync -> unschedule`,
88
+ },
89
+ session: {
90
+ label: "Session",
91
+ renderer: "session-md",
92
+ action: (ref) => `akm show ${ref} -> read the session summary; follow the \`access\` frontmatter to open the raw log at \`log_path\``,
93
+ },
94
+ fact: {
95
+ label: "Fact",
96
+ renderer: "fact-md",
97
+ action: (ref) => `akm show ${ref} -> read the stash fact and apply it as durable context`,
98
+ },
99
+ // `instruction` (CLAUDE.md / AGENTS.md) is a read-like-knowledge markdown
100
+ // doc (spec §6/§7 instruction row, maintainer resolution 2026-07): it REUSES
101
+ // the `knowledge-md` renderer and mirrors knowledge's read action, so an
102
+ // instruction hit renders exactly like knowledge instead of the generic
103
+ // fallback (the parity guard in akm-presentation.test.ts pins this).
104
+ instruction: {
105
+ label: "Instruction",
106
+ renderer: "knowledge-md",
107
+ action: (ref) => `akm show ${ref} -> read the project instructions`,
108
+ },
109
+ };
110
+ /** Generic fallback for a type outside {@link KNOWN_TYPES} — never `undefined`, never a throw. */
111
+ const DEFAULT_PRESENTATION = { label: "Asset" };
112
+ /**
113
+ * Open-string lookup with a generic, non-`undefined` fallback (plan §2.3).
114
+ * `undefined` (no type known yet) and any foreign/adapter type both resolve
115
+ * to {@link DEFAULT_PRESENTATION}; only AKM's own {@link KNOWN_TYPES} get a
116
+ * type-specific presentation.
117
+ */
118
+ export function presentationFor(type) {
119
+ if (type !== undefined && isKnownType(type))
120
+ return TYPE_PRESENTATION[type];
121
+ return DEFAULT_PRESENTATION;
122
+ }
123
+ export const defaultRendererRegistry = {
124
+ rendererNameFor(type) {
125
+ return presentationFor(type).renderer;
126
+ },
127
+ actionBuilderFor(type) {
128
+ return presentationFor(type).action;
129
+ },
130
+ };
package/dist/core/warn.js CHANGED
@@ -78,9 +78,6 @@ export function setLogFile(filePath) {
78
78
  export function clearLogFile() {
79
79
  logFilePath = undefined;
80
80
  }
81
- export function getLogFile() {
82
- return logFilePath;
83
- }
84
81
  function appendToLogFile(level, args) {
85
82
  if (!logFilePath)
86
83
  return;