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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/CHANGELOG.md +1283 -22
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,392 @@
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
+ * Per-`type` validate checks for the `akm` adapter — akm 0.9.0 chunk-2, WI-C,
6
+ * implementing spec §6 (the per-`type` validation column) as a
7
+ * behavior-preserving port of `src/commands/lint/*`'s type linters. The `akm`
8
+ * adapter's `validate` = shared base checks (WI-A `shared.ts`) + these per-type
9
+ * extra checks, keyed on the winning `type`, reproducing today's
10
+ * `getLinterForType(subdir).lint(ctx)` dispatch. The FROZEN lint golden
11
+ * (`tests/fixtures/goldens/lint/all-types.json`, `perType`) is the conformance
12
+ * gate.
13
+ *
14
+ * ── type → linter mapping (registry.ts `getLinterForType`) ──
15
+ *
16
+ * command → CommandLinter | agent → AgentLinter (missing-name-or-type +
17
+ * invalid `type` value); fact → FactLinter (missing-category); task →
18
+ * TaskLinter (invalid-task-yaml); workflow(.md) → WorkflowLinter
19
+ * (placeholder-stub READ-ONLY + invalid-workflow-structure); memory →
20
+ * MemoryLinter (orphaned-stub READ-ONLY); skill → SkillLinter directory check
21
+ * (missing-skill-md, see {@link skillDirectoryDiagnostics}); env/secret → the
22
+ * env dangerous-key scan (lint/index.ts:191-218, `.env`-suffix-narrow);
23
+ * knowledge/lesson/script/secret/wiki/session → DefaultLinter (base only).
24
+ *
25
+ * ── READ-ONLY discipline ──
26
+ *
27
+ * `placeholder-stub` and `orphaned-stub` carry a `--fix` DELETE in the live
28
+ * linters; `BundleAdapter.validate` MUST NOT write, so both are emitted as
29
+ * non-fixable Diagnostics here (never delete). All reads route through
30
+ * `ValidateContext` (the run snapshot + pending overlay) — the live linters'
31
+ * `fs.existsSync` sibling/SKILL.md probes become `ctx.readFile` lookups.
32
+ *
33
+ * ── env/secret dangerous-key narrowness (PRESERVED, spec §6) ──
34
+ *
35
+ * Today's scan (`collectEnvFiles`) only visits `.env`-SUFFIXED files under
36
+ * `env/` and `secrets/`, so `secrets/<bare-name>` is NOT scanned. This port
37
+ * keeps that exact narrowness: {@link dangerousEnvKeyDiagnostics} runs only when
38
+ * the path's basename ends in `.env`. NOT widened.
39
+ *
40
+ * ── Cycle-safety (chunk-2 ratchet, baseline 18) ──
41
+ *
42
+ * Imported ONLY by `akm-adapter.ts` (no inbound `src/` edge) → can never join a
43
+ * cycle. It VALUE-imports `parseWorkflow` (already transitively reachable from
44
+ * `akm-adapter` via `matchers.ts`) and the pure predicate `isDangerousEnvKey`
45
+ * from `commands/lint/env-key-rules` — the predicate is imported, not copied,
46
+ * precisely so the 40+ security-sensitive dangerous-key names cannot drift from
47
+ * the canonical set; importing it is ratchet-neutral (verified: 18). The small
48
+ * key-scan / suppression-comment logic IS ported (content-based, reads the
49
+ * overlay `raw`, not disk). `type` determination stays in `akm-adapter.ts`
50
+ * (which owns `recognizeMatch`) so this leaf never imports back into the
51
+ * adapter.
52
+ */
53
+ import path from "node:path";
54
+ import { isDangerousEnvKey } from "../../../commands/lint/env-key-rules.js";
55
+ import { compileWorkflowPlan } from "../../../workflows/ir/compile.js";
56
+ import { parseWorkflow } from "../../../workflows/parser.js";
57
+ /** Recommended `category` values for facts — `commands/lint/fact-linter.ts:9`. */
58
+ const KNOWN_CATEGORIES = new Set(["personal", "team", "project", "convention", "meta"]);
59
+ /** Placeholder markers a workflow stub carries — `commands/lint/workflow-linter.ts:10`. */
60
+ const PLACEHOLDER_STRINGS = ["Describe what this workflow accomplishes", "Example Workflow"];
61
+ /** Inline suppression token — `commands/lint/env-key-rules.ts:138` (not exported there; reproduced verbatim). */
62
+ const SUPPRESSION_COMMENT = "# akm-lint-ok: dangerous-env-key";
63
+ // ── BaseLinter protected-method ports (base-linter.ts:520-551) ───────────────
64
+ /** Port of `BaseLinter.checkMissingNameOrType` (`:520-527`). */
65
+ function checkMissingNameOrType(data, frontmatter) {
66
+ if (!frontmatter)
67
+ return null;
68
+ const missingFields = [];
69
+ if (!("name" in data) || !data.name)
70
+ missingFields.push("name");
71
+ if (!("type" in data) || !data.type)
72
+ missingFields.push("type");
73
+ if (missingFields.length === 0)
74
+ return null;
75
+ return `missing fields: ${missingFields.join(", ")}`;
76
+ }
77
+ /** Port of `BaseLinter.checkInvalidTypeValue` (`:534-539`). */
78
+ function checkInvalidTypeValue(data, allowedTypes) {
79
+ if (!("type" in data) || !data.type)
80
+ return null;
81
+ const value = String(data.type);
82
+ if (allowedTypes.includes(value))
83
+ return null;
84
+ return `type field has invalid value '${value}'; expected one of: ${allowedTypes.join(", ")}`;
85
+ }
86
+ /** Port of `BaseLinter.suggestSlug` (`:544-551`). */
87
+ function suggestSlug(filePath) {
88
+ return path
89
+ .basename(filePath, ".md")
90
+ .toLowerCase()
91
+ .replace(/[^a-z0-9-]+/g, "-")
92
+ .replace(/-+/g, "-")
93
+ .replace(/^-|-$/g, "");
94
+ }
95
+ // ── name/type linter (CommandLinter / AgentLinter) ───────────────────────────
96
+ /** Reproduce CommandLinter/AgentLinter's extra checks (`command-linter.ts` / `agent-linter.ts`). */
97
+ export function nameOrTypeDiagnostics(relPath, data, frontmatter, allowedTypes) {
98
+ const missingFieldDetail = checkMissingNameOrType(data, frontmatter);
99
+ if (missingFieldDetail) {
100
+ const slug = suggestSlug(relPath);
101
+ return [
102
+ {
103
+ file: relPath,
104
+ issue: "missing-name-or-type",
105
+ detail: `${missingFieldDetail}; suggested slug: ${slug}`,
106
+ fixed: false,
107
+ },
108
+ ];
109
+ }
110
+ const invalidTypeDetail = checkInvalidTypeValue(data, allowedTypes);
111
+ if (invalidTypeDetail) {
112
+ return [{ file: relPath, issue: "missing-name-or-type", detail: invalidTypeDetail, fixed: false }];
113
+ }
114
+ return [];
115
+ }
116
+ // ── env dangerous-key scan (content-based port of env-key-rules.ts) ──────────
117
+ /** Matches a KEY=value assignment line, capturing only the key — `commands/env/env.ts:62`. */
118
+ const ASSIGN_RE = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/;
119
+ /** Port of `commands/env/env.ts#scanKeys` (`:65-77`) — content-based (overlay `raw`, not disk). */
120
+ function scanKeys(text) {
121
+ const keys = [];
122
+ const seen = new Set();
123
+ for (const line of text.split(/\r?\n/)) {
124
+ const m = line.match(ASSIGN_RE);
125
+ if (!m)
126
+ continue;
127
+ const key = m[1];
128
+ if (seen.has(key))
129
+ continue;
130
+ seen.add(key);
131
+ keys.push(key);
132
+ }
133
+ return keys;
134
+ }
135
+ /** Port of `env-key-rules.ts#collectSuppressedKeys` (`:144-164`) — content-based. */
136
+ function collectSuppressedKeys(raw) {
137
+ const suppressed = new Set();
138
+ const lines = raw.split(/\r?\n/);
139
+ let prevNonEmpty = "";
140
+ for (const line of lines) {
141
+ const trimmed = line.trim();
142
+ if (trimmed === "")
143
+ continue;
144
+ const keyMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=/);
145
+ if (keyMatch && prevNonEmpty.toLowerCase() === SUPPRESSION_COMMENT) {
146
+ suppressed.add(keyMatch[1]);
147
+ }
148
+ prevNonEmpty = trimmed;
149
+ }
150
+ return suppressed;
151
+ }
152
+ /**
153
+ * env/secret dangerous-key scan (`lint/index.ts:191-218` + `env-key-rules.ts#checkEnvForDangerousKeys`),
154
+ * keyed on `type` and preserving the `.env`-suffix narrowness (see file header).
155
+ * Reads the overlay `raw`, not disk. `type`==="env" ⇒ ref prefix `env:`;
156
+ * `type`==="secret" ⇒ `secret:` (`lint/index.ts:201-204`).
157
+ */
158
+ export function dangerousEnvKeyDiagnostics(type, relPath, raw) {
159
+ if (type !== "env" && type !== "secret")
160
+ return [];
161
+ const baseNameWithExt = path.basename(relPath);
162
+ if (!baseNameWithExt.endsWith(".env"))
163
+ return []; // NARROWNESS: collectEnvFiles only visits *.env
164
+ const refPrefix = type === "env" ? "env" : "secret";
165
+ const baseName = path.basename(relPath, ".env");
166
+ const ref = baseName === "" ? `${refPrefix}:.env` : `${refPrefix}:${baseName}`;
167
+ const keys = scanKeys(raw);
168
+ const suppressed = collectSuppressedKeys(raw);
169
+ const diagnostics = [];
170
+ for (const key of keys) {
171
+ if (!isDangerousEnvKey(key))
172
+ continue;
173
+ if (suppressed.has(key))
174
+ continue;
175
+ diagnostics.push({
176
+ file: relPath,
177
+ issue: "dangerous-env-key",
178
+ detail: `Env key \`${key}\` can be used to hijack process execution when injected via \`akm env run\`. Ref: ${ref}. Review this file before running \`akm env run\` commands against untrusted stashes. (suppress with: ${SUPPRESSION_COMMENT} on previous line)`,
179
+ fixed: false,
180
+ });
181
+ }
182
+ return diagnostics;
183
+ }
184
+ // ── skill directory check (SkillLinter.lintDirectory) ────────────────────────
185
+ /**
186
+ * Reproduce `SkillLinter.lintDirectory` (`skill-linter.ts:31-45`) in the
187
+ * change-set model: for a change under `skills/<name>/…`, emit `missing-skill-md`
188
+ * when `skills/<name>/SKILL.md` is absent from the overlay. `seen` dedups so a
189
+ * dir with multiple changed files reports once (matching the per-subdir call).
190
+ * `file`/`detail` mirror the live check exactly (relDir + `no SKILL.md in <relDir>/`).
191
+ */
192
+ export async function skillDirectoryDiagnostics(relPath, seen, ctx) {
193
+ const segments = relPath
194
+ .replace(/\\/g, "/")
195
+ .split("/")
196
+ .filter((s) => s.length > 0);
197
+ if (segments.length < 3 || segments[0] !== "skills")
198
+ return []; // must be skills/<name>/<file…>
199
+ const skillDir = `${segments[0]}/${segments[1]}`;
200
+ if (seen.has(skillDir))
201
+ return [];
202
+ seen.add(skillDir);
203
+ const skillMd = await ctx.readFile(`${skillDir}/SKILL.md`);
204
+ if (skillMd !== null)
205
+ return [];
206
+ return [{ file: skillDir, issue: "missing-skill-md", detail: `no SKILL.md in ${skillDir}/`, fixed: false }];
207
+ }
208
+ /**
209
+ * The winning `type`'s per-type EXTRA validate checks (base checks run
210
+ * separately in `akm-adapter.ts`). Async: memory's orphaned-stub sibling probe
211
+ * routes through `ctx`.
212
+ */
213
+ export async function perTypeValidateChecks(args) {
214
+ const { type, relPath, raw, data, frontmatter, body, ext, ctx } = args;
215
+ switch (type) {
216
+ case "command":
217
+ return nameOrTypeDiagnostics(relPath, data, frontmatter, ["command"]);
218
+ case "agent":
219
+ return nameOrTypeDiagnostics(relPath, data, frontmatter, ["agent"]);
220
+ case "fact":
221
+ return factDiagnostics(relPath, data);
222
+ case "task":
223
+ return taskDiagnostics(relPath, data);
224
+ case "workflow":
225
+ // Unified workflows are markdown-only; other extensions are not a lint path.
226
+ return ext === ".md" ? workflowDiagnostics(relPath, raw, body) : [];
227
+ case "memory":
228
+ return memoryDiagnostics(relPath, data, body, ctx);
229
+ case "env":
230
+ case "secret":
231
+ return dangerousEnvKeyDiagnostics(type, relPath, raw);
232
+ default:
233
+ // knowledge / lesson / script / wiki / session → DefaultLinter (base only).
234
+ return [];
235
+ }
236
+ }
237
+ /** FactLinter extra check (`fact-linter.ts:23-44`). */
238
+ export function factDiagnostics(relPath, data) {
239
+ const category = typeof data.category === "string" ? data.category.trim() : "";
240
+ if (!category) {
241
+ return [
242
+ {
243
+ file: relPath,
244
+ issue: "missing-category",
245
+ detail: "fact is missing a `category` (personal|team|project|convention|meta)",
246
+ fixed: false,
247
+ },
248
+ ];
249
+ }
250
+ if (!KNOWN_CATEGORIES.has(category)) {
251
+ return [
252
+ {
253
+ file: relPath,
254
+ issue: "missing-category",
255
+ detail: `unrecognized category "${category}" (expected one of: ${[...KNOWN_CATEGORIES].join(", ")})`,
256
+ fixed: false,
257
+ },
258
+ ];
259
+ }
260
+ return [];
261
+ }
262
+ /** TaskLinter extra check (`task-linter.ts:25-58`). `data` is the parsed YAML. */
263
+ export function taskDiagnostics(relPath, data) {
264
+ if (data === null || Object.keys(data).length === 0)
265
+ return [];
266
+ const missing = [];
267
+ if (!("schedule" in data) || typeof data.schedule !== "string" || data.schedule.trim() === "") {
268
+ missing.push("schedule");
269
+ }
270
+ if (!("enabled" in data) || typeof data.enabled !== "boolean") {
271
+ missing.push("enabled (must be a boolean)");
272
+ }
273
+ const hasTarget = "prompt" in data || "workflow" in data || "command" in data;
274
+ if (!hasTarget)
275
+ missing.push("prompt, workflow, or command");
276
+ if (missing.length > 0) {
277
+ return [
278
+ {
279
+ file: relPath,
280
+ issue: "invalid-task-yaml",
281
+ detail: `missing required fields: ${missing.join(", ")}`,
282
+ fixed: false,
283
+ },
284
+ ];
285
+ }
286
+ return [];
287
+ }
288
+ /**
289
+ * The first placeholder marker present in a workflow body, or `null`
290
+ * (`workflow-linter.ts:80-85` `#checkPlaceholderStub`). Shared with the live
291
+ * `akmLint --fix` path (`commands/lint/index.ts`) so the placeholder-stub RULE
292
+ * has ONE home; the caller decides fixability (validate flags, the CLI deletes).
293
+ */
294
+ export function matchWorkflowPlaceholder(body) {
295
+ return PLACEHOLDER_STRINGS.find((p) => body.includes(p)) ?? null;
296
+ }
297
+ /**
298
+ * WorkflowLinter's `invalid-workflow-structure` check (`workflow-linter.ts:48-77`):
299
+ * parse and compile through the unified workflow frontend, surfacing every
300
+ * structural or semantic error and skipping the read-only `/.cache/`+`/registry/`
301
+ * cached copies. Shared with the live linter;
302
+ * `parsePath` is the path handed to `parseWorkflow` (the adapter passes the
303
+ * change relPath, the CLI passes the absolute filePath — matching each caller's
304
+ * legacy behavior). NEVER writes.
305
+ */
306
+ export function workflowStructureDiagnostics(relPath, raw, parsePath) {
307
+ if (parsePath.includes("/.cache/") || parsePath.includes("/registry/"))
308
+ return [];
309
+ const diagnostics = [];
310
+ try {
311
+ const result = parseWorkflow(raw, { path: parsePath });
312
+ if (!result.ok) {
313
+ for (const err of result.errors ?? []) {
314
+ diagnostics.push({
315
+ file: relPath,
316
+ issue: "invalid-workflow-structure",
317
+ detail: err.message ?? String(err),
318
+ fixed: false,
319
+ });
320
+ }
321
+ return diagnostics;
322
+ }
323
+ const compiled = compileWorkflowPlan(result.document, path.basename(parsePath, path.extname(parsePath)));
324
+ if (!compiled.ok) {
325
+ for (const err of compiled.errors) {
326
+ diagnostics.push({
327
+ file: relPath,
328
+ issue: "invalid-workflow-structure",
329
+ detail: err.message,
330
+ fixed: false,
331
+ });
332
+ }
333
+ }
334
+ }
335
+ catch (e) {
336
+ diagnostics.push({
337
+ file: relPath,
338
+ issue: "invalid-workflow-structure",
339
+ detail: `workflow parser error: ${e instanceof Error ? e.message : String(e)}`,
340
+ fixed: false,
341
+ });
342
+ }
343
+ return diagnostics;
344
+ }
345
+ /**
346
+ * WorkflowLinter extra checks (`workflow-linter.ts:22-79`), READ-ONLY:
347
+ * `placeholder-stub` is NEVER deleted here (validate MUST NOT write) — emitted
348
+ * as a non-fixable Diagnostic. `invalid-workflow-structure` parses and compiles
349
+ * the whole `raw` through the unified workflow frontend.
350
+ */
351
+ function workflowDiagnostics(relPath, raw, body) {
352
+ const diagnostics = [];
353
+ const placeholderMatch = matchWorkflowPlaceholder(body);
354
+ if (placeholderMatch) {
355
+ diagnostics.push({
356
+ file: relPath,
357
+ issue: "placeholder-stub",
358
+ detail: `placeholder text: "${placeholderMatch}"`,
359
+ fixed: false,
360
+ });
361
+ }
362
+ diagnostics.push(...workflowStructureDiagnostics(relPath, raw, relPath));
363
+ return diagnostics;
364
+ }
365
+ /** The non-fixable orphaned-stub finding detail (`memory-linter.ts` no-fix branch). Shared with the live linter. */
366
+ export const ORPHANED_STUB_DETAIL = "inferenceProcessed stub with no derived sibling";
367
+ /**
368
+ * The CONTENT half of MemoryLinter's orphaned-stub predicate
369
+ * (`memory-linter.ts:67-73` `#isOrphanedStub`, minus the sibling probe):
370
+ * `inferenceProcessed: true` AND a body under 100 chars. The `.derived.md`
371
+ * sibling existence is I/O and is checked by the caller (the CLI via
372
+ * `fs.existsSync`, the adapter via `ctx.readFile`), so the RULE stays here while
373
+ * each caller supplies its own read.
374
+ */
375
+ export function memoryOrphanStubApplies(data, body) {
376
+ return data.inferenceProcessed === true && body.trim().length < 100;
377
+ }
378
+ /**
379
+ * MemoryLinter extra check (`memory-linter.ts:19-65`), READ-ONLY: the
380
+ * `orphaned-stub` DELETE fix is dropped (validate MUST NOT write) — emitted as
381
+ * a non-fixable Diagnostic. The `<name>.derived.md` sibling probe routes
382
+ * through `ctx.readFile` (overlay), not `fs.existsSync`.
383
+ */
384
+ async function memoryDiagnostics(relPath, data, body, ctx) {
385
+ if (!memoryOrphanStubApplies(data, body))
386
+ return [];
387
+ const derivedPath = `${relPath.replace(/\.md$/, "")}.derived.md`;
388
+ const sibling = await ctx.readFile(derivedPath);
389
+ if (sibling !== null)
390
+ return [];
391
+ return [{ file: relPath, issue: "orphaned-stub", detail: ORPHANED_STUB_DETAIL, fixed: false }];
392
+ }