akm-cli 0.9.0-beta.9 → 0.9.0-rc.1

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 (381) hide show
  1. package/CHANGELOG.md +715 -0
  2. package/README.md +12 -4
  3. package/dist/akm +38 -0
  4. package/dist/akm-migrate-storage +38 -0
  5. package/dist/assets/help/help-improve.md +9 -6
  6. package/dist/assets/hints/cli-hints-full.md +6 -5
  7. package/dist/assets/profiles/default.json +9 -4
  8. package/dist/assets/profiles/frequent.json +1 -1
  9. package/dist/assets/profiles/memory-focus.json +1 -1
  10. package/dist/assets/profiles/proactive-maintenance.json +25 -0
  11. package/dist/assets/profiles/quick.json +1 -1
  12. package/dist/assets/profiles/recombine-only.json +21 -0
  13. package/dist/assets/profiles/reflect-distill.json +30 -0
  14. package/dist/assets/profiles/synthesize.json +15 -0
  15. package/dist/assets/profiles/thorough.json +1 -1
  16. package/dist/assets/prompts/consolidate-system.md +23 -0
  17. package/dist/assets/prompts/contradiction-judge.md +33 -0
  18. package/dist/assets/prompts/distill-knowledge-system.md +22 -0
  19. package/dist/assets/prompts/distill-lesson-system.md +36 -0
  20. package/dist/assets/prompts/extract-session.md +11 -3
  21. package/dist/assets/prompts/graph-extract-system.md +1 -0
  22. package/dist/assets/prompts/graph-extract-user-prompt.md +1 -1
  23. package/dist/assets/prompts/memory-infer-system.md +1 -0
  24. package/dist/assets/prompts/memory-infer-user.md +5 -0
  25. package/dist/assets/prompts/metadata-enhance-system.md +1 -0
  26. package/dist/assets/prompts/procedural-system.md +44 -0
  27. package/dist/assets/prompts/recombine-system.md +40 -0
  28. package/dist/assets/prompts/staleness-detect-system.md +6 -0
  29. package/dist/assets/prompts/validate-summary-judge.md +1 -0
  30. package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +38 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +38 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +39 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +40 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +43 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +38 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +43 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +40 -0
  39. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +43 -0
  40. package/dist/assets/templates/html/health.html +281 -111
  41. package/dist/assets/wiki/ingest-workflow-template.md +45 -16
  42. package/dist/assets/wiki/schema-template.md +4 -4
  43. package/dist/cli/clack.js +56 -0
  44. package/dist/cli/config-migrate.js +7 -1
  45. package/dist/cli/confirm.js +1 -1
  46. package/dist/cli/parse-args.js +46 -1
  47. package/dist/cli/shared.js +28 -0
  48. package/dist/cli.js +25 -21
  49. package/dist/commands/agent/agent-dispatch.js +3 -2
  50. package/dist/commands/agent/agent-support.js +0 -7
  51. package/dist/commands/agent/contribute-cli.js +26 -7
  52. package/dist/commands/config-cli.js +26 -13
  53. package/dist/commands/env/child-env.js +47 -0
  54. package/dist/commands/env/env-binding.js +95 -0
  55. package/dist/commands/env/env-cli.js +228 -292
  56. package/dist/commands/env/env.js +14 -67
  57. package/dist/commands/env/secret-cli.js +140 -138
  58. package/dist/commands/feedback-cli.js +156 -155
  59. package/dist/commands/graph/graph-cli.js +5 -13
  60. package/dist/commands/graph/graph.js +3 -3
  61. package/dist/commands/health/advisories.js +151 -0
  62. package/dist/commands/health/checks.js +103 -16
  63. package/dist/commands/health/html-report.js +447 -81
  64. package/dist/commands/health/improve-metrics.js +771 -0
  65. package/dist/commands/health/llm-usage.js +65 -0
  66. package/dist/commands/health/md-report.js +103 -0
  67. package/dist/commands/health/metrics.js +278 -0
  68. package/dist/commands/health/stash-exposure.js +46 -0
  69. package/dist/commands/health/surfaces.js +216 -0
  70. package/dist/commands/health/task-runs.js +135 -0
  71. package/dist/commands/health/types.js +26 -0
  72. package/dist/commands/health/windows.js +195 -0
  73. package/dist/commands/health.js +91 -1091
  74. package/dist/commands/improve/anti-collapse.js +170 -0
  75. package/dist/commands/improve/calibration.js +161 -0
  76. package/dist/commands/improve/collapse-detector.js +421 -0
  77. package/dist/commands/improve/consolidate/chunking.js +141 -0
  78. package/dist/commands/improve/consolidate/eligibility.js +64 -0
  79. package/dist/commands/improve/consolidate/merge.js +145 -0
  80. package/dist/commands/improve/consolidate/sanitize.js +231 -0
  81. package/dist/commands/{lint.js → improve/consolidate/types.js} +1 -1
  82. package/dist/commands/improve/consolidate.js +1295 -1277
  83. package/dist/commands/improve/dedup.js +482 -0
  84. package/dist/commands/improve/distill/content-repair.js +202 -0
  85. package/dist/commands/improve/distill/promote-memory.js +229 -0
  86. package/dist/commands/improve/distill/quality-gate.js +236 -0
  87. package/dist/commands/improve/distill-guards.js +127 -0
  88. package/dist/commands/improve/distill-promotion-policy.js +826 -167
  89. package/dist/commands/improve/distill.js +228 -605
  90. package/dist/commands/improve/eligibility.js +434 -0
  91. package/dist/commands/improve/encoding-salience.js +205 -0
  92. package/dist/commands/improve/extract-cli.js +179 -59
  93. package/dist/commands/improve/extract-prompt.js +54 -3
  94. package/dist/commands/improve/extract-watch.js +140 -0
  95. package/dist/commands/improve/extract.js +409 -43
  96. package/dist/commands/improve/feedback-valence.js +54 -0
  97. package/dist/commands/improve/hot-probation.js +45 -0
  98. package/dist/commands/improve/improve-auto-accept.js +157 -10
  99. package/dist/commands/improve/improve-cli.js +115 -73
  100. package/dist/commands/improve/improve-profiles.js +28 -8
  101. package/dist/commands/improve/improve-result-file.js +15 -25
  102. package/dist/commands/improve/improve-session.js +58 -0
  103. package/dist/commands/improve/improve.js +485 -2764
  104. package/dist/commands/improve/locks.js +154 -0
  105. package/dist/commands/improve/loop-stages.js +1100 -0
  106. package/dist/commands/improve/memory/memory-belief.js +14 -15
  107. package/dist/commands/improve/memory/memory-contradiction-detect.js +83 -60
  108. package/dist/commands/improve/memory/memory-improve.js +27 -27
  109. package/dist/commands/improve/outcome-loop.js +270 -0
  110. package/dist/commands/improve/preparation.js +2002 -0
  111. package/dist/commands/improve/proactive-maintenance.js +37 -35
  112. package/dist/commands/improve/procedural.js +398 -0
  113. package/dist/commands/improve/recombine.js +818 -0
  114. package/dist/commands/improve/reflect-noise.js +0 -0
  115. package/dist/commands/improve/reflect.js +206 -45
  116. package/dist/commands/improve/salience.js +455 -0
  117. package/dist/commands/improve/schema-similarity-gate.js +168 -0
  118. package/dist/commands/improve/shared.js +51 -0
  119. package/dist/commands/improve/triage.js +93 -0
  120. package/dist/commands/lint/agent-linter.js +19 -24
  121. package/dist/commands/lint/base-linter.js +173 -60
  122. package/dist/commands/lint/command-linter.js +19 -24
  123. package/dist/commands/lint/env-key-rules.js +38 -1
  124. package/dist/commands/lint/fact-linter.js +39 -0
  125. package/dist/commands/lint/index.js +31 -13
  126. package/dist/commands/lint/memory-linter.js +1 -1
  127. package/dist/commands/lint/registry.js +7 -2
  128. package/dist/commands/lint/task-linter.js +3 -3
  129. package/dist/commands/lint/workflow-linter.js +26 -1
  130. package/dist/commands/observability-cli.js +4 -4
  131. package/dist/commands/proposal/drain-policies.js +13 -4
  132. package/dist/commands/proposal/drain.js +45 -51
  133. package/dist/commands/proposal/legacy-import.js +115 -0
  134. package/dist/commands/proposal/proposal-cli.js +24 -34
  135. package/dist/commands/proposal/proposal.js +2 -1
  136. package/dist/commands/proposal/propose.js +8 -3
  137. package/dist/commands/proposal/repository.js +829 -0
  138. package/dist/commands/proposal/validators/proposal-quality-validators.js +9 -8
  139. package/dist/commands/proposal/validators/proposals.js +93 -895
  140. package/dist/commands/read/curate.js +410 -111
  141. package/dist/commands/read/knowledge.js +10 -3
  142. package/dist/commands/read/remember-cli.js +133 -138
  143. package/dist/commands/read/search-cli.js +15 -8
  144. package/dist/commands/read/search.js +22 -11
  145. package/dist/commands/read/show.js +106 -14
  146. package/dist/commands/registry-cli.js +76 -87
  147. package/dist/commands/remember.js +11 -12
  148. package/dist/commands/sources/add-cli.js +91 -95
  149. package/dist/commands/sources/history.js +1 -1
  150. package/dist/commands/sources/init.js +66 -18
  151. package/dist/commands/sources/installed-stashes.js +11 -3
  152. package/dist/commands/sources/migration-help.js +7 -4
  153. package/dist/commands/sources/schema-repair.js +44 -46
  154. package/dist/commands/sources/self-update.js +2 -2
  155. package/dist/commands/sources/source-add.js +7 -3
  156. package/dist/commands/sources/sources-cli.js +3 -3
  157. package/dist/commands/sources/stash-cli.js +19 -39
  158. package/dist/commands/sources/stash-skeleton.js +57 -8
  159. package/dist/commands/tasks/default-tasks.js +15 -2
  160. package/dist/commands/tasks/tasks-cli.js +20 -29
  161. package/dist/commands/tasks/tasks.js +39 -11
  162. package/dist/commands/wiki-cli.js +23 -38
  163. package/dist/commands/workflow-cli.js +291 -13
  164. package/dist/core/asset/asset-registry.js +3 -1
  165. package/dist/core/asset/asset-spec.js +79 -5
  166. package/dist/core/asset/frontmatter.js +188 -167
  167. package/dist/core/asset/markdown.js +8 -0
  168. package/dist/core/authoring-rules.js +92 -0
  169. package/dist/core/common.js +4 -23
  170. package/dist/core/concurrent.js +10 -1
  171. package/dist/core/config/config-io.js +10 -1
  172. package/dist/core/config/config-migration.js +18 -40
  173. package/dist/core/config/config-schema.js +403 -62
  174. package/dist/core/config/config-types.js +3 -3
  175. package/dist/core/config/config.js +67 -22
  176. package/dist/core/deep-merge.js +38 -0
  177. package/dist/core/errors.js +1 -0
  178. package/dist/core/eval/rank-metrics.js +113 -0
  179. package/dist/core/events.js +4 -7
  180. package/dist/core/improve-types.js +47 -8
  181. package/dist/core/json-schema.js +142 -0
  182. package/dist/core/logs-db.js +14 -75
  183. package/dist/core/parse.js +36 -16
  184. package/dist/core/paths.js +18 -18
  185. package/dist/core/standards/resolve-standards-context.js +87 -0
  186. package/dist/core/standards/resolve-stash-standards.js +99 -0
  187. package/dist/core/standards/resolve-type-conventions.js +66 -0
  188. package/dist/core/state/migrations.js +770 -0
  189. package/dist/core/state-db.js +132 -1126
  190. package/dist/core/structured.js +69 -0
  191. package/dist/core/time.js +53 -0
  192. package/dist/core/warn.js +21 -0
  193. package/dist/core/write-source.js +37 -0
  194. package/dist/indexer/db/db.js +261 -770
  195. package/dist/indexer/db/entry-mapper.js +41 -0
  196. package/dist/indexer/db/graph-db.js +129 -86
  197. package/dist/indexer/db/llm-cache.js +2 -2
  198. package/dist/indexer/db/schema.js +516 -0
  199. package/dist/indexer/ensure-index.js +36 -92
  200. package/dist/indexer/feedback/utility-policy.js +75 -0
  201. package/dist/indexer/graph/graph-boost.js +51 -41
  202. package/dist/indexer/graph/graph-extraction.js +207 -4
  203. package/dist/indexer/index-writer-lock.js +18 -11
  204. package/dist/indexer/index-written-assets.js +105 -0
  205. package/dist/indexer/indexer.js +182 -204
  206. package/dist/indexer/passes/dir-staleness.js +114 -0
  207. package/dist/indexer/passes/memory-inference.js +13 -5
  208. package/dist/indexer/passes/metadata.js +20 -0
  209. package/dist/indexer/read-preflight.js +23 -0
  210. package/dist/indexer/search/db-search.js +89 -13
  211. package/dist/indexer/search/fts-query.js +51 -0
  212. package/dist/indexer/search/ranking-contributors.js +95 -9
  213. package/dist/indexer/search/ranking.js +79 -3
  214. package/dist/indexer/search/search-fields.js +6 -0
  215. package/dist/indexer/search/search-source.js +32 -21
  216. package/dist/indexer/search/semantic-status.js +4 -0
  217. package/dist/indexer/walk/matchers.js +48 -0
  218. package/dist/indexer/walk/walker.js +21 -13
  219. package/dist/integrations/agent/builders.js +41 -13
  220. package/dist/integrations/agent/config.js +20 -59
  221. package/dist/integrations/agent/detect.js +9 -0
  222. package/dist/integrations/agent/index.js +3 -19
  223. package/dist/integrations/agent/model-aliases.js +16 -2
  224. package/dist/integrations/agent/profiles.js +79 -6
  225. package/dist/integrations/agent/prompts.js +75 -9
  226. package/dist/integrations/agent/runner-dispatch.js +83 -0
  227. package/dist/integrations/agent/runner.js +13 -9
  228. package/dist/integrations/agent/spawn.js +206 -81
  229. package/dist/integrations/harnesses/aider/agent-builder.js +113 -0
  230. package/dist/integrations/harnesses/aider/index.js +58 -0
  231. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  232. package/dist/integrations/harnesses/amazonq/agent-builder.js +153 -0
  233. package/dist/integrations/harnesses/amazonq/index.js +59 -0
  234. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  235. package/dist/integrations/harnesses/claude/agent-builder.js +46 -7
  236. package/dist/integrations/harnesses/claude/index.js +27 -23
  237. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  238. package/dist/integrations/harnesses/claude/session-log.js +10 -0
  239. package/dist/integrations/harnesses/codex/agent-builder.js +137 -0
  240. package/dist/integrations/harnesses/codex/index.js +63 -0
  241. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  242. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  243. package/dist/integrations/harnesses/copilot/index.js +60 -0
  244. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  245. package/dist/integrations/harnesses/gemini/agent-builder.js +121 -0
  246. package/dist/integrations/harnesses/gemini/index.js +60 -0
  247. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  248. package/dist/integrations/harnesses/index.js +28 -7
  249. package/dist/integrations/harnesses/opencode/agent-builder.js +1 -1
  250. package/dist/integrations/harnesses/opencode/index.js +17 -16
  251. package/dist/integrations/harnesses/opencode/session-log.js +173 -3
  252. package/dist/integrations/harnesses/opencode-sdk/harness.js +65 -0
  253. package/dist/integrations/harnesses/opencode-sdk/index.js +10 -34
  254. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +642 -71
  255. package/dist/integrations/harnesses/openhands/agent-builder.js +126 -0
  256. package/dist/integrations/harnesses/openhands/index.js +58 -0
  257. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  258. package/dist/integrations/harnesses/pi/agent-builder.js +104 -0
  259. package/dist/integrations/harnesses/pi/index.js +58 -0
  260. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  261. package/dist/integrations/harnesses/types.js +8 -0
  262. package/dist/integrations/session-logs/index.js +40 -11
  263. package/dist/llm/call-ai.js +2 -2
  264. package/dist/llm/client.js +34 -11
  265. package/dist/llm/embedder.js +67 -4
  266. package/dist/llm/embedders/cache.js +3 -1
  267. package/dist/llm/embedders/deterministic.js +66 -0
  268. package/dist/llm/embedders/local.js +73 -3
  269. package/dist/llm/feature-gate.js +16 -15
  270. package/dist/llm/graph-extract.js +67 -44
  271. package/dist/llm/memory-infer-impl.js +138 -0
  272. package/dist/llm/memory-infer.js +1 -127
  273. package/dist/llm/metadata-enhance.js +44 -31
  274. package/dist/llm/structured-call.js +49 -0
  275. package/dist/migrate-storage-node.mjs +8 -0
  276. package/dist/output/context.js +5 -5
  277. package/dist/output/renderers.js +87 -15
  278. package/dist/output/shapes/curate.js +14 -2
  279. package/dist/output/shapes/helpers.js +0 -3
  280. package/dist/output/shapes/passthrough.js +6 -1
  281. package/dist/output/text/helpers.js +241 -2
  282. package/dist/output/text/workflow.js +4 -1
  283. package/dist/registry/providers/skills-sh.js +21 -147
  284. package/dist/registry/providers/static-index.js +15 -157
  285. package/dist/registry/resolve.js +27 -9
  286. package/dist/runtime.js +25 -1
  287. package/dist/schemas/akm-config.json +14225 -0
  288. package/dist/schemas/akm-workflow.json +328 -0
  289. package/dist/scripts/migrate-storage.js +2743 -8390
  290. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +1652 -607
  291. package/dist/setup/detect.js +9 -0
  292. package/dist/setup/legacy-config.js +106 -0
  293. package/dist/setup/prompt.js +57 -0
  294. package/dist/setup/providers.js +14 -0
  295. package/dist/setup/registry-stash-loader.js +12 -0
  296. package/dist/setup/semantic-assets.js +124 -0
  297. package/dist/setup/setup.js +52 -1614
  298. package/dist/setup/steps/connection.js +734 -0
  299. package/dist/setup/steps/output.js +31 -0
  300. package/dist/setup/steps/platforms.js +124 -0
  301. package/dist/setup/steps/semantic.js +27 -0
  302. package/dist/setup/steps/sources.js +222 -0
  303. package/dist/setup/steps/stashdir.js +42 -0
  304. package/dist/setup/steps/tasks.js +152 -0
  305. package/dist/sources/include.js +6 -2
  306. package/dist/sources/providers/filesystem.js +0 -1
  307. package/dist/sources/providers/git-install.js +210 -0
  308. package/dist/sources/providers/git-provider.js +234 -0
  309. package/dist/sources/providers/git-stash.js +248 -0
  310. package/dist/sources/providers/git.js +10 -661
  311. package/dist/sources/providers/npm.js +2 -6
  312. package/dist/sources/providers/provider-utils.js +13 -7
  313. package/dist/sources/providers/sync-from-ref.js +9 -1
  314. package/dist/sources/providers/website.js +9 -5
  315. package/dist/sources/website-ingest.js +187 -29
  316. package/dist/sources/wiki-fetchers/registry.js +53 -0
  317. package/dist/sources/wiki-fetchers/youtube.js +239 -0
  318. package/dist/storage/database.js +45 -10
  319. package/dist/storage/managed-db.js +82 -0
  320. package/dist/storage/repositories/canaries-repository.js +107 -0
  321. package/dist/storage/repositories/consolidation-repository.js +38 -0
  322. package/dist/storage/repositories/embeddings-repository.js +72 -0
  323. package/dist/storage/repositories/events-repository.js +187 -0
  324. package/dist/storage/repositories/extract-sessions-repository.js +96 -0
  325. package/dist/storage/repositories/improve-runs-repository.js +146 -0
  326. package/dist/storage/repositories/index-db.js +14 -8
  327. package/dist/storage/repositories/proposals-repository.js +220 -0
  328. package/dist/storage/repositories/recombine-repository.js +213 -0
  329. package/dist/storage/repositories/registry-cache.js +93 -0
  330. package/dist/storage/repositories/registry-index-cache-repository.js +46 -0
  331. package/dist/storage/repositories/task-history-repository.js +93 -0
  332. package/dist/storage/repositories/workflow-runs-repository.js +189 -1
  333. package/dist/storage/sqlite-pragmas.js +146 -0
  334. package/dist/tasks/backends/cron.js +1 -1
  335. package/dist/tasks/backends/index.js +9 -0
  336. package/dist/tasks/backends/launchd.js +1 -1
  337. package/dist/tasks/backends/schtasks.js +1 -1
  338. package/dist/tasks/{resolveAkmBin.js → resolve-akm-bin.js} +2 -2
  339. package/dist/tasks/runner.js +15 -13
  340. package/dist/text-import-hook.mjs +1 -1
  341. package/dist/wiki/wiki.js +52 -11
  342. package/dist/workflows/authoring/authoring.js +123 -10
  343. package/dist/workflows/authoring/workflow-program-template.yaml +31 -0
  344. package/dist/workflows/cli.js +5 -0
  345. package/dist/workflows/db.js +138 -4
  346. package/dist/workflows/exec/brief.js +484 -0
  347. package/dist/workflows/exec/native-executor.js +975 -0
  348. package/dist/workflows/exec/param-secrets.js +115 -0
  349. package/dist/workflows/exec/report.js +1295 -0
  350. package/dist/workflows/exec/run-workflow.js +596 -0
  351. package/dist/workflows/exec/scheduler.js +100 -0
  352. package/dist/workflows/exec/step-work.js +1156 -0
  353. package/dist/workflows/exec/unit-writer.js +23 -0
  354. package/dist/workflows/exec/watch.js +116 -0
  355. package/dist/workflows/exec/worktree.js +171 -0
  356. package/dist/workflows/ir/compile.js +388 -0
  357. package/dist/workflows/ir/params.js +54 -0
  358. package/dist/workflows/ir/plan-hash.js +33 -0
  359. package/dist/workflows/ir/schema.js +4 -0
  360. package/dist/workflows/parser.js +3 -1
  361. package/dist/workflows/program/expressions.js +369 -0
  362. package/dist/workflows/program/parser.js +760 -0
  363. package/dist/workflows/program/project.js +105 -0
  364. package/dist/workflows/program/schema.js +54 -0
  365. package/dist/workflows/renderer.js +82 -5
  366. package/dist/workflows/runtime/agent-identity.js +59 -14
  367. package/dist/workflows/runtime/runs.js +248 -153
  368. package/dist/workflows/runtime/unit-checkin.js +45 -0
  369. package/dist/workflows/runtime/workflow-asset-loader.js +188 -0
  370. package/dist/workflows/validate-summary.js +26 -10
  371. package/dist/workflows/validator.js +1 -1
  372. package/docs/README.md +69 -18
  373. package/docs/data-and-telemetry.md +7 -5
  374. package/docs/migration/release-notes/0.7.0.md +1 -1
  375. package/docs/migration/release-notes/0.9.0-beta.60.md +19 -0
  376. package/docs/migration/release-notes/0.9.0.md +39 -0
  377. package/package.json +10 -10
  378. package/dist/assets/tasks/core/update-stashes.yml +0 -4
  379. package/dist/commands/db-cli.js +0 -23
  380. package/dist/indexer/db/db-backup.js +0 -376
  381. package/dist/indexer/passes/staleness-detect.js +0 -488
@@ -18,7 +18,7 @@ import { asNonEmptyString, hasErrnoCode } from "../core/common.js";
18
18
  import { extractCommentMetadata, extractDescriptionFromComments } from "../indexer/passes/metadata.js";
19
19
  import { registerMetadataContributor } from "../indexer/passes/metadata-contributors.js";
20
20
  import { registerRenderer } from "../indexer/walk/file-context.js";
21
- import { buildWorkflowAction, workflowMdRenderer } from "../workflows/renderer.js";
21
+ import { buildWorkflowAction, workflowMdRenderer, workflowProgramRenderer } from "../workflows/renderer.js";
22
22
  // ── Interpreter auto-detection map ───────────────────────────────────────────
23
23
  const INTERPRETER_MAP = {
24
24
  ".sh": "bash",
@@ -210,6 +210,10 @@ const agentMdRenderer = {
210
210
  action: "Dispatch using the prompt below verbatim. Use modelHint and toolPolicy if present.",
211
211
  description: asNonEmptyString(parsedMd.data.description),
212
212
  prompt: parsedMd.content,
213
+ // `tools` is self-declared frontmatter. The provenance CEILING that decides
214
+ // whether this self-declared policy is honoured is applied at the show
215
+ // layer (`akmShowUnified`), which knows whether the source is the operator's
216
+ // own writable stash vs a read-only third-party source (07 P1-D).
213
217
  toolPolicy: parsedMd.data.tools,
214
218
  modelHint: typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined,
215
219
  };
@@ -364,23 +368,21 @@ const scriptSourceRenderer = {
364
368
  };
365
369
  // ── 8. env-file ───────────────────────────────────────────────────────────────
366
370
  /**
367
- * Env renderer. Returns ONLY key names and start-of-line comments never
368
- * values. Deliberately omits content/template/prompt so env values cannot leak
369
- * through `akm show`.
371
+ * Env renderer. Returns ONLY key names never values, and never comment
372
+ * text (comments routinely contain commented-out credentials). Deliberately
373
+ * omits content/template/prompt so env values cannot leak through `akm show`.
370
374
  */
371
375
  const envFileRenderer = {
372
376
  name: "env-file",
373
377
  buildShowResponse(ctx) {
374
378
  const name = deriveName(ctx);
375
- const { keys, comments } = listVaultKeys(ctx.absPath);
379
+ const { keys } = listVaultKeys(ctx.absPath);
376
380
  return {
377
381
  type: "env",
378
382
  name,
379
383
  path: ctx.absPath,
380
- action: "Environment — keys + comments only. Use `akm env run <ref> -- <command>` to run with the whole .env injected (the safe path values never reach stdout). `akm env export <ref> --out <file>` writes a sourceable script to a file. Never `source` the raw file. Values stay on disk and are never written to akm's stdout.",
381
- description: comments.length > 0 ? comments.join("\n") : undefined,
384
+ action: "Environment — key names only. Use `akm env run <ref> -- <command>` to run with the whole .env injected; prefer `--clean` to minimize inherited parent env. AKM itself does not print values, but child stdout/stderr is not redacted. `akm env export <ref> --out <file>` writes a sourceable script to a file. Never `source` the raw file. Values stay on disk and are never written to akm's stdout.",
382
385
  keys,
383
- comments,
384
386
  };
385
387
  },
386
388
  enrichSearchHit(hit, _stashDir) {
@@ -468,6 +470,44 @@ const sessionMdRenderer = {
468
470
  };
469
471
  },
470
472
  };
473
+ // ── 9. fact-md ───────────────────────────────────────────────────────────────
474
+ /**
475
+ * Renderer for the `fact` asset type. A fact is durable stash-level semantic
476
+ * knowledge (personal/team/project details, coding conventions, stash-meta).
477
+ * It carries `category` (personal|team|project|convention|meta) and an
478
+ * optional `pinned` flag marking it as part of the always-injected core. The
479
+ * renderer surfaces a one-liner (category + pinned marker) so an agent can tell
480
+ * at a glance what kind of fact it is and whether it is core context.
481
+ */
482
+ const factMdRenderer = {
483
+ name: "fact-md",
484
+ buildShowResponse(ctx) {
485
+ const name = deriveName(ctx);
486
+ const parsed = parseFrontmatter(ctx.content());
487
+ const fm = parsed.data;
488
+ const category = asNonEmptyString(fm.category);
489
+ const description = asNonEmptyString(fm.description);
490
+ const pinned = fm.pinned === true;
491
+ const headerParts = [
492
+ category ? `category: ${category}` : undefined,
493
+ pinned ? "pinned (core context)" : undefined,
494
+ ].filter((p) => !!p);
495
+ const action = [
496
+ "Durable stash fact — apply it as background context.",
497
+ headerParts.length > 0 ? headerParts.join(" ") : undefined,
498
+ ]
499
+ .filter((p) => !!p)
500
+ .join("\n");
501
+ return {
502
+ type: "fact",
503
+ name,
504
+ path: ctx.absPath,
505
+ action,
506
+ description,
507
+ content: parsed.content,
508
+ };
509
+ },
510
+ };
471
511
  function applySessionMetadata(entry, ctx) {
472
512
  try {
473
513
  const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
@@ -501,6 +541,34 @@ function applyTocMetadata(entry, ctx) {
501
541
  // Non-fatal: skip TOC if file can't be read
502
542
  }
503
543
  }
544
+ /**
545
+ * Fact metadata: surface `category` and the `pinned` core marker as tags +
546
+ * search hints (no dedicated DB columns — same encoding pattern as session /
547
+ * task). `pinned` is mirrored to both a `pinned` tag and a `pinned` search
548
+ * hint so the ranking contributor can detect it and queries can target it.
549
+ */
550
+ function applyFactMetadata(entry, ctx) {
551
+ try {
552
+ const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
553
+ const tags = new Set([...(entry.tags ?? []), "fact"]);
554
+ const hints = new Set(entry.searchHints ?? []);
555
+ const category = asNonEmptyString(fm.category);
556
+ if (category) {
557
+ tags.add(category);
558
+ hints.add(`category:${category}`);
559
+ }
560
+ if (fm.pinned === true) {
561
+ tags.add("pinned");
562
+ hints.add("pinned");
563
+ }
564
+ entry.tags = Array.from(tags).filter(Boolean);
565
+ if (hints.size > 0)
566
+ entry.searchHints = Array.from(hints).filter(Boolean);
567
+ }
568
+ catch {
569
+ // Non-fatal: skip metadata extraction on parse error
570
+ }
571
+ }
504
572
  /**
505
573
  * Parse frontmatter, apply description (if not already set) and merge tags
506
574
  * into `entry`. Returns the raw frontmatter data object so callers can access
@@ -581,12 +649,9 @@ function applyScriptMetadata(entry, ctx) {
581
649
  }
582
650
  }
583
651
  function applyEnvMetadata(entry, ctx) {
584
- const { keys, comments } = listVaultKeys(ctx.absPath);
585
- if (comments.length > 0 && !entry.description) {
586
- entry.description = comments.join(" ").slice(0, 500);
587
- entry.source = "comments";
588
- entry.confidence = 0.7;
589
- }
652
+ // Key names only comment text must never reach description/search_text
653
+ // (comments routinely contain commented-out credentials).
654
+ const { keys } = listVaultKeys(ctx.absPath);
590
655
  if (keys.length > 0) {
591
656
  entry.searchHints = keys;
592
657
  }
@@ -660,6 +725,11 @@ registerMetadataContributor({
660
725
  appliesTo: ({ rendererName }) => rendererName === "session-md",
661
726
  contribute: (entry, ctx) => applySessionMetadata(entry, ctx.renderContext),
662
727
  });
728
+ registerMetadataContributor({
729
+ name: "fact-md-metadata",
730
+ appliesTo: ({ rendererName }) => rendererName === "fact-md",
731
+ contribute: (entry, ctx) => applyFactMetadata(entry, ctx.renderContext),
732
+ });
663
733
  // ── Registration ─────────────────────────────────────────────────────────────
664
734
  /** All built-in renderers. */
665
735
  const builtinRenderers = [
@@ -671,11 +741,13 @@ const builtinRenderers = [
671
741
  lessonMdRenderer,
672
742
  memoryMdRenderer,
673
743
  workflowMdRenderer,
744
+ workflowProgramRenderer,
674
745
  scriptSourceRenderer,
675
746
  envFileRenderer,
676
747
  secretFileRenderer,
677
748
  taskMdRenderer,
678
749
  sessionMdRenderer,
750
+ factMdRenderer,
679
751
  ];
680
752
  /**
681
753
  * Register all built-in renderers with the file-context registry.
@@ -687,4 +759,4 @@ export function registerBuiltinRenderers() {
687
759
  }
688
760
  }
689
761
  // ── Named exports for testing ────────────────────────────────────────────────
690
- export { agentMdRenderer, commandMdRenderer, envFileRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, secretFileRenderer, skillMdRenderer, wikiMdRenderer, workflowMdRenderer, };
762
+ export { agentMdRenderer, commandMdRenderer, envFileRenderer, factMdRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, secretFileRenderer, skillMdRenderer, wikiMdRenderer, workflowMdRenderer, workflowProgramRenderer, };
@@ -5,7 +5,7 @@ import { capDescription, NORMAL_DESCRIPTION_LIMIT, pickFields } from "./helpers.
5
5
  // Curation is a small, high-signal top-N. Even at `brief` we keep `followUp`
6
6
  // (the actionable `akm show <ref>` command) and `reason` (why this asset was
7
7
  // selected) — these are the point of curate, unlike a bulk search listing.
8
- const BRIEF_FIELDS = ["source", "type", "name", "ref", "id", "followUp", "reason"];
8
+ const BRIEF_FIELDS = ["source", "type", "name", "ref", "id", "supportRefs", "followUp", "reason"];
9
9
  const NORMAL_FIELDS = [
10
10
  "source",
11
11
  "type",
@@ -17,12 +17,24 @@ const NORMAL_FIELDS = [
17
17
  "keys",
18
18
  "parameters",
19
19
  "run",
20
+ "supportRefs",
20
21
  "followUp",
21
22
  "reason",
22
23
  "score",
23
24
  ];
24
25
  // Agent shape: the minimal field set an LLM needs to decide and act.
25
- const AGENT_FIELDS = ["source", "type", "name", "ref", "id", "description", "followUp", "reason", "score"];
26
+ const AGENT_FIELDS = [
27
+ "source",
28
+ "type",
29
+ "name",
30
+ "ref",
31
+ "id",
32
+ "description",
33
+ "supportRefs",
34
+ "followUp",
35
+ "reason",
36
+ "score",
37
+ ];
26
38
  function shapeCurateItem(item, detail, shape) {
27
39
  if (shape === "agent") {
28
40
  return capDescription(pickFields(item, AGENT_FIELDS), NORMAL_DESCRIPTION_LIMIT);
@@ -369,7 +369,6 @@ export function shapeShowOutput(result, detail, shape = "human") {
369
369
  "workflowParameters",
370
370
  "steps",
371
371
  "keys",
372
- "comments",
373
372
  "related",
374
373
  ]);
375
374
  }
@@ -385,7 +384,6 @@ export function shapeShowOutput(result, detail, shape = "human") {
385
384
  "run",
386
385
  "origin",
387
386
  "keys",
388
- "comments",
389
387
  "related",
390
388
  ]);
391
389
  }
@@ -411,7 +409,6 @@ export function shapeShowOutput(result, detail, shape = "human") {
411
409
  "cwd",
412
410
  "activeRun",
413
411
  "keys",
414
- "comments",
415
412
  "related",
416
413
  // path and editable are always projected so JSON consumers can locate and
417
414
  // edit the asset without needing --detail full (QA #7).
@@ -23,7 +23,6 @@ const PASSTHROUGH_COMMANDS = [
23
23
  "agent-result",
24
24
  "clone",
25
25
  "config",
26
- "db-backups",
27
26
  "disable",
28
27
  "enable",
29
28
  "env-create",
@@ -43,6 +42,7 @@ const PASSTHROUGH_COMMANDS = [
43
42
  "extract",
44
43
  "health",
45
44
  "improve",
45
+ "improve-canary",
46
46
  "lessons-coverage",
47
47
  "import",
48
48
  "index",
@@ -86,15 +86,20 @@ const PASSTHROUGH_COMMANDS = [
86
86
  "wiki-remove",
87
87
  "wiki-show",
88
88
  "wiki-stash",
89
+ "workflow-abandon",
90
+ "workflow-brief",
89
91
  "workflow-complete",
90
92
  "workflow-complete-rejected",
91
93
  "workflow-create",
92
94
  "workflow-list",
93
95
  "workflow-next",
96
+ "workflow-report",
94
97
  "workflow-resume",
98
+ "workflow-run",
95
99
  "workflow-start",
96
100
  "workflow-status",
97
101
  "workflow-validate",
102
+ "workflow-watch",
98
103
  ];
99
104
  export const passthroughShapes = PASSTHROUGH_COMMANDS.map((command) => ({
100
105
  command,
@@ -194,7 +194,18 @@ export function formatWorkflowValidatePlain(r) {
194
194
  return `workflow validate: failed (${pathValue})`;
195
195
  const title = typeof r.title === "string" ? r.title : "";
196
196
  const stepCount = typeof r.stepCount === "number" ? r.stepCount : 0;
197
- return `workflow validate: ok — ${title || pathValue} (${stepCount} step(s))`;
197
+ const lines = [`workflow validate: ok — ${title || pathValue} (${stepCount} step(s))`];
198
+ // Non-fatal advisories: clearly marked, printed after the ok line so `ok`
199
+ // is never in doubt. Absent/empty for markdown and fully-typed programs.
200
+ const warnings = Array.isArray(r.warnings) ? r.warnings : [];
201
+ if (warnings.length > 0) {
202
+ lines.push(` ${warnings.length} warning(s):`);
203
+ for (const w of warnings) {
204
+ const line = typeof w.line === "number" ? w.line : "?";
205
+ lines.push(` warning: ${pathValue}:${line} — ${String(w.message ?? "")}`);
206
+ }
207
+ }
208
+ return lines.join("\n");
198
209
  }
199
210
  /**
200
211
  * Plain-text rendering for a step-completion that was rejected by the
@@ -722,8 +733,59 @@ export function formatWorkflowStatusPlain(result) {
722
733
  }
723
734
  }
724
735
  }
736
+ // `workflow status --units` (#22): the honest per-unit diagnostic surface —
737
+ // failure_reason plus any journaled result/error text. Diagnostics only; the
738
+ // deterministic step evidence above is unaffected.
739
+ const units = Array.isArray(result.units) ? result.units : undefined;
740
+ if (units) {
741
+ lines.push("");
742
+ lines.push(units.length > 0 ? "units:" : "units: (none journaled)");
743
+ for (const unit of units) {
744
+ const id = typeof unit.unitId === "string" ? unit.unitId : "unknown";
745
+ const status = typeof unit.status === "string" ? unit.status : "unknown";
746
+ const node = typeof unit.nodeId === "string" ? unit.nodeId : "";
747
+ const attempts = typeof unit.attempts === "number" ? unit.attempts : undefined;
748
+ const suffix = attempts !== undefined && attempts > 1 ? `, attempt ${attempts}` : "";
749
+ lines.push(` - ${id} [${node}] (${status}${suffix})`);
750
+ // Codex round-3 finding B: a `running` claim gone silent past the check-in
751
+ // window — the driver likely died. Surface it (with the claim holder) so a
752
+ // human can reclaim/re-run the unit, matching what `brief` reports.
753
+ if (unit.stale === true) {
754
+ const holder = typeof unit.claimHolder === "string" && unit.claimHolder.trim() ? ` claimed by ${unit.claimHolder}` : "";
755
+ lines.push(` stale: claim went silent past the check-in window${holder} — its driver may have died`);
756
+ }
757
+ if (typeof unit.failureReason === "string" && unit.failureReason.trim()) {
758
+ lines.push(` failure_reason: ${unit.failureReason}`);
759
+ }
760
+ if (typeof unit.diagnostic === "string" && unit.diagnostic.trim()) {
761
+ const diagLines = unit.diagnostic.split("\n");
762
+ lines.push(` diagnostic: ${diagLines[0]}`);
763
+ for (const diagLine of diagLines.slice(1))
764
+ lines.push(` ${diagLine}`);
765
+ }
766
+ }
767
+ }
768
+ // Review C2: the check-in `continue` directive must survive plain-text
769
+ // rendering — JSON consumers saw `checkin` but the text path dropped it.
770
+ const checkinLine = formatWorkflowCheckinLine(result);
771
+ if (checkinLine) {
772
+ lines.push("");
773
+ lines.push(checkinLine);
774
+ }
725
775
  return lines.join("\n");
726
776
  }
777
+ /**
778
+ * Render the stalled-run check-in directive (#506) when present on a
779
+ * workflow-next/status result. Returns null when the run is healthy.
780
+ */
781
+ function formatWorkflowCheckinLine(result) {
782
+ const checkin = typeof result.checkin === "object" && result.checkin !== null
783
+ ? result.checkin
784
+ : undefined;
785
+ if (!checkin || typeof checkin.directive !== "string" || !checkin.directive.trim())
786
+ return null;
787
+ return checkin.directive.trim();
788
+ }
727
789
  export function formatWorkflowNextPlain(result) {
728
790
  const base = formatWorkflowStatusPlain(result);
729
791
  const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
@@ -765,6 +827,155 @@ export function formatWorkflowNextPlain(result) {
765
827
  }
766
828
  return lines.join("\n");
767
829
  }
830
+ export function formatWorkflowRunPlain(result) {
831
+ const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
832
+ if (!run)
833
+ return null;
834
+ const lines = [`run: ${String(run.id ?? "unknown")}`, `status: ${String(run.status ?? "unknown")}`];
835
+ const executed = Array.isArray(result.executed) ? result.executed : [];
836
+ if (executed.length === 0) {
837
+ lines.push("executed: (no steps — run was already done or blocked)");
838
+ }
839
+ else {
840
+ lines.push("executed:");
841
+ for (const step of executed) {
842
+ const marker = step.ok === true ? "ok" : "FAILED";
843
+ lines.push(` - ${String(step.stepId ?? "?")} [${marker}] units: ${String(step.unitCount ?? 0)}` +
844
+ (Number(step.failedUnits ?? 0) > 0 ? ` (${String(step.failedUnits)} failed)` : ""));
845
+ if (typeof step.summary === "string" && step.summary.trim()) {
846
+ lines.push(` ${step.summary}`);
847
+ }
848
+ }
849
+ }
850
+ const gate = typeof result.gateRejection === "object" && result.gateRejection !== null
851
+ ? result.gateRejection
852
+ : undefined;
853
+ if (gate) {
854
+ lines.push(`gate rejected step ${String(gate.stepId ?? "?")}: ${String(gate.feedback ?? "")}`);
855
+ const missing = Array.isArray(gate.missing) ? gate.missing : [];
856
+ for (const item of missing)
857
+ lines.push(` missing: ${String(item)}`);
858
+ }
859
+ if (result.done === true)
860
+ lines.push("workflow completed.");
861
+ return lines.join("\n");
862
+ }
863
+ export function formatWorkflowBriefPlain(result) {
864
+ const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
865
+ if (!run)
866
+ return null;
867
+ const lines = [];
868
+ lines.push(`# Workflow brief: ${String(run.id ?? "unknown")}`);
869
+ lines.push(`workflow: ${String(run.workflowRef ?? "?")} (${String(run.workflowTitle ?? "")})`);
870
+ lines.push(`status: ${String(run.status ?? "?")}`);
871
+ if (typeof result.message === "string")
872
+ lines.push(result.message);
873
+ const lease = typeof result.engineLease === "object" && result.engineLease !== null
874
+ ? result.engineLease
875
+ : undefined;
876
+ if (lease) {
877
+ const live = lease.live === true ? "LIVE" : "expired";
878
+ lines.push(`engine lease: ${String(lease.holder ?? "?")} (until ${String(lease.until ?? "?")}) [${live}]`);
879
+ }
880
+ const warnings = Array.isArray(result.warnings) ? result.warnings : [];
881
+ for (const w of warnings)
882
+ lines.push(`! ${String(w)}`);
883
+ if (result.done === true) {
884
+ lines.push("");
885
+ lines.push("This run is completed — no work remains.");
886
+ return lines.join("\n");
887
+ }
888
+ const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
889
+ if (!step) {
890
+ return lines.join("\n");
891
+ }
892
+ const gate = typeof step.gate === "object" && step.gate !== null ? step.gate : undefined;
893
+ lines.push("");
894
+ lines.push(`## Active step: ${String(step.stepId ?? "?")} — ${String(step.title ?? "")} [${String(step.kind ?? "execute")}]`);
895
+ if (gate) {
896
+ const criteria = Array.isArray(gate.criteria) ? gate.criteria : [];
897
+ lines.push(`gate: loop ${String(gate.currentLoop ?? 1)} of max ${String(gate.maxLoops ?? 1)}` +
898
+ (criteria.length > 0 ? `; criteria: ${criteria.map(String).join("; ")}` : "; no completion criteria") +
899
+ (gate.judgesArtifact === true ? " (artifact-judged)" : ""));
900
+ }
901
+ if (step.outputSchema !== undefined)
902
+ lines.push("outputSchema: declared (see JSON output)");
903
+ const feedback = typeof result.gateFeedback === "object" && result.gateFeedback !== null
904
+ ? result.gateFeedback
905
+ : undefined;
906
+ if (feedback) {
907
+ lines.push(`gate feedback (previous loop rejected): ${String(feedback.feedback ?? "")}`);
908
+ const missing = Array.isArray(feedback.missing) ? feedback.missing : [];
909
+ for (const m of missing)
910
+ lines.push(` - missing: ${String(m)}`);
911
+ }
912
+ const route = typeof result.route === "object" && result.route !== null ? result.route : undefined;
913
+ if (route) {
914
+ lines.push("");
915
+ lines.push(`## Route contract on ${String(route.input ?? "?")}`);
916
+ const when = typeof route.when === "object" && route.when !== null ? route.when : {};
917
+ for (const [value, target] of Object.entries(when))
918
+ lines.push(` when "${value}" → ${String(target)}`);
919
+ if (route.defaultStepId !== undefined)
920
+ lines.push(` default → ${String(route.defaultStepId)}`);
921
+ const decision = typeof route.decision === "object" && route.decision !== null
922
+ ? route.decision
923
+ : undefined;
924
+ if (decision)
925
+ lines.push(` decision NOW: value "${String(decision.value)}" → ${String(decision.selected)}`);
926
+ else if (typeof route.decisionError === "string")
927
+ lines.push(` decision error: ${route.decisionError}`);
928
+ else
929
+ lines.push(" decision: pending this step's output (evaluated after units complete)");
930
+ }
931
+ const workList = typeof result.workList === "object" && result.workList !== null
932
+ ? result.workList
933
+ : undefined;
934
+ const units = workList && Array.isArray(workList.units) ? workList.units : [];
935
+ if (workList?.error) {
936
+ lines.push("");
937
+ lines.push(`work-list error: ${String(workList.error)}`);
938
+ }
939
+ else if (units.length > 0) {
940
+ lines.push("");
941
+ lines.push(`## Units (${units.length})`);
942
+ for (const u of units) {
943
+ const model = u.model ? ` model=${String(u.model)}` : "";
944
+ const journaled = typeof u.journaled === "object" && u.journaled !== null ? u.journaled : undefined;
945
+ const jstatus = journaled ? ` [journaled: ${String(journaled.status)}]` : "";
946
+ lines.push(`- ${String(u.unitId)} (runner=${String(u.runner)}${model})${jstatus}`);
947
+ const env = Array.isArray(u.env) ? u.env : [];
948
+ if (env.length > 0)
949
+ lines.push(` env (names): ${env.map(String).join(", ")}`);
950
+ if (u.outputSchema !== undefined)
951
+ lines.push(" outputSchema: declared (see JSON output)");
952
+ const resolved = typeof u.resolved === "object" && u.resolved !== null ? u.resolved : undefined;
953
+ if (resolved && resolved.ok === false)
954
+ lines.push(` RESOLUTION ERROR: ${String(resolved.error)}`);
955
+ if (typeof u.report === "string")
956
+ lines.push(` report: ${u.report}`);
957
+ }
958
+ }
959
+ // Finding D: a non-dispatching step (route-only / empty / all-unresolvable)
960
+ // advances via the `--settle` verb, surfaced so a driver can advance the spine.
961
+ if (typeof result.settleCommand === "string") {
962
+ lines.push("");
963
+ lines.push("## Advance (no reportable units)");
964
+ lines.push(`settle: ${result.settleCommand}`);
965
+ }
966
+ const guidance = typeof result.reportGuidance === "object" && result.reportGuidance !== null
967
+ ? result.reportGuidance
968
+ : undefined;
969
+ if (guidance) {
970
+ lines.push("");
971
+ lines.push("## Reporting");
972
+ if (typeof guidance.checkin === "string")
973
+ lines.push(`heartbeat: ${guidance.checkin}`);
974
+ if (typeof guidance.failure === "string")
975
+ lines.push(`on failure: ${guidance.failure}`);
976
+ }
977
+ return lines.join("\n");
978
+ }
768
979
  export function formatSearchPlain(r, detail) {
769
980
  const hits = r.hits ?? [];
770
981
  const registryHits = r.registryHits ?? [];
@@ -1005,6 +1216,15 @@ export function formatCuratePlain(r, detail) {
1005
1216
  lines.push(` run: ${String(item.run)}`);
1006
1217
  if (item.followUp)
1007
1218
  lines.push(` show: ${String(item.followUp)}`);
1219
+ if (Array.isArray(item.supportRefs) && item.supportRefs.length > 0) {
1220
+ for (const support of item.supportRefs) {
1221
+ if (!support.ref)
1222
+ continue;
1223
+ const label = typeof support.type === "string" ? `[${support.type}] ` : "";
1224
+ const why = typeof support.reason === "string" ? ` — ${support.reason}` : "";
1225
+ lines.push(` support: ${label}${String(support.ref)}${why}`);
1226
+ }
1227
+ }
1008
1228
  if (detail !== "brief" && item.reason)
1009
1229
  lines.push(` why: ${String(item.reason)}`);
1010
1230
  }
@@ -1026,8 +1246,14 @@ export function formatCuratePlain(r, detail) {
1026
1246
  }
1027
1247
  export function formatInitPlain(r) {
1028
1248
  let out = `Stash initialized at ${r.stashDir ?? "unknown"}`;
1029
- if (r.configPath)
1249
+ // When --dir scaffolded a secondary stash but the default was deliberately
1250
+ // left untouched, tell the user instead of silently repointing their default.
1251
+ if (r.defaultStashUpdated === false && typeof r.previousStashDir === "string" && r.previousStashDir) {
1252
+ out += `\nYour default stash is unchanged (${r.previousStashDir}). Re-run with --set-default to make ${r.stashDir} the default.`;
1253
+ }
1254
+ else if (r.configPath) {
1030
1255
  out += `\nConfig saved to ${r.configPath}`;
1256
+ }
1031
1257
  return out;
1032
1258
  }
1033
1259
  export function formatIndexPlain(r) {
@@ -1043,6 +1269,19 @@ export function formatIndexPlain(r) {
1043
1269
  if (verification?.ok === false && verification.message) {
1044
1270
  out += `\nVerification: ${String(verification.message)}`;
1045
1271
  }
1272
+ const timing = indexResult.timing;
1273
+ if (timing) {
1274
+ out +=
1275
+ `\nTiming: total ${timing.totalMs}ms` +
1276
+ `, preflight ${timing.preflightMs}ms` +
1277
+ `, walk ${timing.walkMs}ms` +
1278
+ `, llm ${timing.llmMs}ms` +
1279
+ `, embeddings ${timing.embedMs}ms` +
1280
+ `, fts ${timing.ftsMs}ms` +
1281
+ `, finalize ${timing.finalizeMs}ms` +
1282
+ `, clean ${timing.cleanMs}ms` +
1283
+ `, end-to-end ${timing.endToEndMs}ms`;
1284
+ }
1046
1285
  return out;
1047
1286
  }
1048
1287
  export function formatListPlain(r) {
@@ -2,7 +2,7 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  // Output text formatters for all `akm workflow *` commands.
5
- import { formatWorkflowCompleteRejectedPlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./helpers.js";
5
+ import { formatWorkflowBriefPlain, formatWorkflowCompleteRejectedPlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowRunPlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./helpers.js";
6
6
  export const workflowFormatters = [
7
7
  { command: "workflow-start", handler: (r) => formatWorkflowStatusPlain(r) },
8
8
  { command: "workflow-status", handler: (r) => formatWorkflowStatusPlain(r) },
@@ -13,4 +13,7 @@ export const workflowFormatters = [
13
13
  { command: "workflow-create", handler: (r) => formatWorkflowCreatePlain(r) },
14
14
  { command: "workflow-validate", handler: (r) => formatWorkflowValidatePlain(r) },
15
15
  { command: "workflow-resume", handler: (r) => formatWorkflowResumePlain(r) },
16
+ { command: "workflow-abandon", handler: (r) => formatWorkflowStatusPlain(r) },
17
+ { command: "workflow-run", handler: (r) => formatWorkflowRunPlain(r) },
18
+ { command: "workflow-brief", handler: (r) => formatWorkflowBriefPlain(r) },
16
19
  ];