akm-cli 0.8.0-rc2 → 0.8.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 (313) hide show
  1. package/{.github/CHANGELOG.md → CHANGELOG.md} +238 -3
  2. package/README.md +22 -6
  3. package/SECURITY.md +93 -0
  4. package/dist/assets/help/help-accept.md +12 -0
  5. package/dist/assets/help/help-improve.md +81 -0
  6. package/dist/{commands → assets}/help/help-proposals.md +7 -4
  7. package/dist/assets/help/help-reject.md +11 -0
  8. package/dist/{output → assets/hints}/cli-hints-full.md +60 -32
  9. package/dist/{output → assets/hints}/cli-hints-short.md +10 -7
  10. package/dist/assets/profiles/default.json +15 -0
  11. package/dist/assets/profiles/graph-refresh.json +13 -0
  12. package/dist/assets/profiles/memory-focus.json +12 -0
  13. package/dist/assets/profiles/quick.json +15 -0
  14. package/dist/assets/profiles/thorough.json +15 -0
  15. package/dist/assets/prompts/extract-session.md +80 -0
  16. package/dist/assets/prompts/graph-extract-user-prompt.md +35 -0
  17. package/dist/assets/tasks/graph-refresh-weekly.yml +10 -0
  18. package/dist/cli/config-migrate.js +144 -0
  19. package/dist/cli/config-validate.js +39 -0
  20. package/dist/cli/confirm.js +73 -0
  21. package/dist/cli/parse-args.js +93 -3
  22. package/dist/cli/shared.js +129 -0
  23. package/dist/cli.js +2141 -1268
  24. package/dist/commands/add-cli.js +279 -0
  25. package/dist/commands/agent-dispatch.js +20 -12
  26. package/dist/commands/agent-support.js +11 -5
  27. package/dist/commands/completions.js +3 -0
  28. package/dist/commands/config-cli.js +129 -517
  29. package/dist/commands/consolidate.js +1557 -147
  30. package/dist/commands/curate.js +44 -3
  31. package/dist/commands/db-cli.js +23 -0
  32. package/dist/commands/distill-promotion-policy.js +5 -3
  33. package/dist/commands/distill.js +906 -100
  34. package/dist/commands/env.js +213 -0
  35. package/dist/commands/eval-cases.js +3 -0
  36. package/dist/commands/events.js +3 -0
  37. package/dist/commands/extract-cli.js +127 -0
  38. package/dist/commands/extract-prompt.js +217 -0
  39. package/dist/commands/extract.js +477 -0
  40. package/dist/commands/feedback-cli.js +331 -0
  41. package/dist/commands/graph.js +260 -5
  42. package/dist/commands/health.js +1042 -55
  43. package/dist/commands/history.js +51 -16
  44. package/dist/commands/improve-auto-accept.js +97 -0
  45. package/dist/commands/improve-cli.js +236 -0
  46. package/dist/commands/improve-profiles.js +138 -0
  47. package/dist/commands/improve-result-file.js +167 -0
  48. package/dist/commands/improve.js +1736 -346
  49. package/dist/commands/info.js +26 -28
  50. package/dist/commands/init.js +49 -1
  51. package/dist/commands/installed-stashes.js +6 -23
  52. package/dist/commands/knowledge.js +3 -0
  53. package/dist/commands/lint/agent-linter.js +3 -0
  54. package/dist/commands/lint/base-linter.js +199 -5
  55. package/dist/commands/lint/command-linter.js +3 -0
  56. package/dist/commands/lint/default-linter.js +3 -0
  57. package/dist/commands/lint/env-key-rules.js +154 -0
  58. package/dist/commands/lint/index.js +92 -3
  59. package/dist/commands/lint/knowledge-linter.js +3 -0
  60. package/dist/commands/lint/markdown-insertion.js +343 -0
  61. package/dist/commands/lint/memory-linter.js +3 -0
  62. package/dist/commands/lint/registry.js +3 -0
  63. package/dist/commands/lint/skill-linter.js +3 -0
  64. package/dist/commands/lint/task-linter.js +15 -12
  65. package/dist/commands/lint/types.js +3 -0
  66. package/dist/commands/lint/workflow-linter.js +3 -0
  67. package/dist/commands/lint.js +3 -0
  68. package/dist/commands/migration-help.js +5 -2
  69. package/dist/commands/proposal-drain-policies.js +128 -0
  70. package/dist/commands/proposal-drain.js +477 -0
  71. package/dist/commands/proposal.js +60 -6
  72. package/dist/commands/propose.js +24 -19
  73. package/dist/commands/reflect.js +1004 -94
  74. package/dist/commands/registry-cli.js +150 -0
  75. package/dist/commands/registry-search.js +3 -0
  76. package/dist/commands/remember-cli.js +257 -0
  77. package/dist/commands/remember.js +15 -6
  78. package/dist/commands/schema-repair.js +88 -15
  79. package/dist/commands/search.js +99 -14
  80. package/dist/commands/secret.js +173 -0
  81. package/dist/commands/self-update.js +3 -0
  82. package/dist/commands/show.js +32 -13
  83. package/dist/commands/source-add.js +7 -35
  84. package/dist/commands/source-clone.js +3 -0
  85. package/dist/commands/source-manage.js +3 -0
  86. package/dist/commands/tasks.js +161 -95
  87. package/dist/commands/url-checker.js +3 -0
  88. package/dist/core/action-contributors.js +3 -0
  89. package/dist/core/asset-ref.js +13 -2
  90. package/dist/core/asset-registry.js +9 -2
  91. package/dist/core/asset-serialize.js +88 -0
  92. package/dist/core/asset-spec.js +61 -5
  93. package/dist/core/common.js +93 -5
  94. package/dist/core/concurrent.js +3 -0
  95. package/dist/core/config-io.js +347 -0
  96. package/dist/core/config-migration.js +622 -0
  97. package/dist/core/config-schema.js +558 -0
  98. package/dist/core/config-sources.js +108 -0
  99. package/dist/core/config-types.js +4 -0
  100. package/dist/core/config-walker.js +337 -0
  101. package/dist/core/config.js +366 -1077
  102. package/dist/core/errors.js +42 -20
  103. package/dist/core/events.js +31 -25
  104. package/dist/core/file-lock.js +104 -0
  105. package/dist/core/frontmatter.js +75 -10
  106. package/dist/core/lesson-lint.js +3 -0
  107. package/dist/core/markdown.js +3 -0
  108. package/dist/core/memory-belief.js +62 -0
  109. package/dist/core/memory-contradiction-detect.js +274 -0
  110. package/dist/core/memory-improve.js +142 -14
  111. package/dist/core/parse.js +3 -0
  112. package/dist/core/paths.js +218 -50
  113. package/dist/core/proposal-quality-validators.js +380 -0
  114. package/dist/core/proposal-validators.js +11 -3
  115. package/dist/core/proposals.js +464 -5
  116. package/dist/core/state-db.js +349 -56
  117. package/dist/core/text-truncation.js +107 -0
  118. package/dist/core/time.js +3 -0
  119. package/dist/core/tty.js +59 -0
  120. package/dist/core/warn.js +7 -2
  121. package/dist/core/write-source.js +12 -0
  122. package/dist/indexer/db-backup.js +391 -0
  123. package/dist/indexer/db-search.js +136 -28
  124. package/dist/indexer/db.js +661 -166
  125. package/dist/indexer/ensure-index.js +3 -0
  126. package/dist/indexer/file-context.js +3 -0
  127. package/dist/indexer/graph-boost.js +162 -40
  128. package/dist/indexer/graph-db.js +241 -51
  129. package/dist/indexer/graph-dedup.js +3 -7
  130. package/dist/indexer/graph-extraction.js +242 -149
  131. package/dist/indexer/index-context.js +3 -9
  132. package/dist/indexer/indexer.js +86 -16
  133. package/dist/indexer/llm-cache.js +24 -19
  134. package/dist/indexer/manifest.js +3 -0
  135. package/dist/indexer/matchers.js +184 -11
  136. package/dist/indexer/memory-inference.js +94 -50
  137. package/dist/indexer/metadata-contributors.js +3 -0
  138. package/dist/indexer/metadata.js +110 -50
  139. package/dist/indexer/path-resolver.js +3 -0
  140. package/dist/indexer/project-context.js +192 -0
  141. package/dist/indexer/ranking-contributors.js +134 -7
  142. package/dist/indexer/ranking.js +8 -1
  143. package/dist/indexer/search-fields.js +5 -9
  144. package/dist/indexer/search-hit-enrichers.js +91 -2
  145. package/dist/indexer/search-source.js +20 -1
  146. package/dist/indexer/semantic-status.js +4 -1
  147. package/dist/indexer/staleness-detect.js +447 -0
  148. package/dist/indexer/usage-events.js +12 -9
  149. package/dist/indexer/walker.js +3 -0
  150. package/dist/integrations/agent/builders.js +135 -0
  151. package/dist/integrations/agent/config.js +121 -401
  152. package/dist/integrations/agent/detect.js +3 -0
  153. package/dist/integrations/agent/index.js +6 -14
  154. package/dist/integrations/agent/model-aliases.js +55 -0
  155. package/dist/integrations/agent/profiles.js +3 -0
  156. package/dist/integrations/agent/prompts.js +137 -8
  157. package/dist/integrations/agent/runner.js +208 -0
  158. package/dist/integrations/agent/sdk-runner.js +8 -2
  159. package/dist/integrations/agent/spawn.js +54 -14
  160. package/dist/integrations/github.js +3 -0
  161. package/dist/integrations/lockfile.js +22 -51
  162. package/dist/integrations/session-logs/index.js +4 -0
  163. package/dist/integrations/session-logs/inline-refs.js +35 -0
  164. package/dist/integrations/session-logs/pre-filter.js +152 -0
  165. package/dist/integrations/session-logs/providers/claude-code.js +226 -0
  166. package/dist/integrations/session-logs/providers/opencode.js +231 -25
  167. package/dist/integrations/session-logs/types.js +3 -0
  168. package/dist/llm/call-ai.js +14 -26
  169. package/dist/llm/client.js +16 -2
  170. package/dist/llm/embedder.js +20 -29
  171. package/dist/llm/embedders/cache.js +3 -7
  172. package/dist/llm/embedders/local.js +42 -1
  173. package/dist/llm/embedders/remote.js +20 -8
  174. package/dist/llm/embedders/types.js +3 -7
  175. package/dist/llm/feature-gate.js +92 -56
  176. package/dist/llm/graph-extract.js +402 -31
  177. package/dist/llm/index-passes.js +44 -29
  178. package/dist/llm/memory-infer.js +30 -2
  179. package/dist/llm/metadata-enhance.js +3 -7
  180. package/dist/output/cli-hints.js +7 -4
  181. package/dist/output/context.js +60 -8
  182. package/dist/output/renderers.js +170 -194
  183. package/dist/output/shapes/curate.js +56 -0
  184. package/dist/output/shapes/distill.js +10 -0
  185. package/dist/output/shapes/env-list.js +19 -0
  186. package/dist/output/shapes/events.js +11 -0
  187. package/dist/output/shapes/helpers.js +424 -0
  188. package/dist/output/shapes/history.js +7 -0
  189. package/dist/output/shapes/passthrough.js +105 -0
  190. package/dist/output/shapes/proposal-accept.js +7 -0
  191. package/dist/output/shapes/proposal-diff.js +7 -0
  192. package/dist/output/shapes/proposal-list.js +7 -0
  193. package/dist/output/shapes/proposal-producer.js +11 -0
  194. package/dist/output/shapes/proposal-reject.js +7 -0
  195. package/dist/output/shapes/proposal-show.js +7 -0
  196. package/dist/output/shapes/registry-search.js +6 -0
  197. package/dist/output/shapes/registry.js +30 -0
  198. package/dist/output/shapes/search.js +6 -0
  199. package/dist/output/shapes/secret-list.js +19 -0
  200. package/dist/output/shapes/show.js +6 -0
  201. package/dist/output/shapes/vault-list.js +19 -0
  202. package/dist/output/shapes.js +51 -549
  203. package/dist/output/text/add.js +6 -0
  204. package/dist/output/text/clone.js +6 -0
  205. package/dist/output/text/config.js +6 -0
  206. package/dist/output/text/curate.js +6 -0
  207. package/dist/output/text/distill.js +7 -0
  208. package/dist/output/text/enable-disable.js +7 -0
  209. package/dist/output/text/events.js +10 -0
  210. package/dist/output/text/feedback.js +6 -0
  211. package/dist/output/text/helpers.js +1059 -0
  212. package/dist/output/text/history.js +7 -0
  213. package/dist/output/text/import.js +6 -0
  214. package/dist/output/text/index.js +6 -0
  215. package/dist/output/text/info.js +6 -0
  216. package/dist/output/text/init.js +6 -0
  217. package/dist/output/text/list.js +6 -0
  218. package/dist/output/text/proposal-producer.js +8 -0
  219. package/dist/output/text/proposal.js +12 -0
  220. package/dist/output/text/registry-commands.js +11 -0
  221. package/dist/output/text/registry.js +30 -0
  222. package/dist/output/text/remember.js +6 -0
  223. package/dist/output/text/remove.js +6 -0
  224. package/dist/output/text/save.js +6 -0
  225. package/dist/output/text/search.js +6 -0
  226. package/dist/output/text/show.js +6 -0
  227. package/dist/output/text/update.js +6 -0
  228. package/dist/output/text/upgrade.js +6 -0
  229. package/dist/output/text/vault.js +16 -0
  230. package/dist/output/text/wiki.js +15 -0
  231. package/dist/output/text/workflow.js +14 -0
  232. package/dist/output/text.js +44 -1329
  233. package/dist/registry/build-index.js +3 -0
  234. package/dist/registry/create-provider-registry.js +3 -0
  235. package/dist/registry/factory.js +4 -1
  236. package/dist/registry/origin-resolve.js +3 -0
  237. package/dist/registry/providers/index.js +3 -0
  238. package/dist/registry/providers/skills-sh.js +11 -2
  239. package/dist/registry/providers/static-index.js +10 -1
  240. package/dist/registry/providers/types.js +3 -24
  241. package/dist/registry/resolve.js +11 -16
  242. package/dist/registry/types.js +3 -0
  243. package/dist/scripts/migrate-storage.js +17767 -0
  244. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +9031 -0
  245. package/dist/scripts/migrations/v16-to-v17.js +141 -0
  246. package/dist/setup/detect.js +3 -0
  247. package/dist/setup/ripgrep-install.js +3 -0
  248. package/dist/setup/ripgrep-resolve.js +3 -0
  249. package/dist/setup/setup.js +306 -67
  250. package/dist/setup/steps.js +3 -15
  251. package/dist/sources/include.js +3 -0
  252. package/dist/sources/provider-factory.js +3 -11
  253. package/dist/sources/provider.js +3 -20
  254. package/dist/sources/providers/filesystem.js +19 -23
  255. package/dist/sources/providers/git.js +171 -21
  256. package/dist/sources/providers/index.js +3 -0
  257. package/dist/sources/providers/install-types.js +3 -13
  258. package/dist/sources/providers/npm.js +3 -4
  259. package/dist/sources/providers/provider-utils.js +3 -0
  260. package/dist/sources/providers/sync-from-ref.js +3 -11
  261. package/dist/sources/providers/tar-utils.js +3 -0
  262. package/dist/sources/providers/website.js +18 -22
  263. package/dist/sources/resolve.js +3 -0
  264. package/dist/sources/types.js +3 -0
  265. package/dist/sources/website-ingest.js +3 -0
  266. package/dist/tasks/backends/cron.js +3 -0
  267. package/dist/tasks/backends/exec-utils.js +3 -0
  268. package/dist/tasks/backends/index.js +3 -11
  269. package/dist/tasks/backends/launchd.js +4 -1
  270. package/dist/tasks/backends/schtasks.js +4 -1
  271. package/dist/tasks/parser.js +51 -38
  272. package/dist/tasks/resolveAkmBin.js +3 -0
  273. package/dist/tasks/runner.js +35 -9
  274. package/dist/tasks/schedule.js +20 -1
  275. package/dist/tasks/schema.js +5 -3
  276. package/dist/tasks/validator.js +6 -3
  277. package/dist/version.js +3 -0
  278. package/dist/wiki/wiki-templates.js +6 -3
  279. package/dist/wiki/wiki.js +4 -1
  280. package/dist/workflows/authoring.js +4 -1
  281. package/dist/workflows/cli.js +3 -0
  282. package/dist/workflows/db.js +140 -10
  283. package/dist/workflows/document-cache.js +3 -10
  284. package/dist/workflows/parser.js +3 -0
  285. package/dist/workflows/renderer.js +3 -0
  286. package/dist/workflows/runs.js +18 -1
  287. package/dist/workflows/schema.js +3 -0
  288. package/dist/workflows/scope-key.js +3 -0
  289. package/dist/workflows/validator.js +5 -9
  290. package/docs/README.md +7 -2
  291. package/docs/data-and-telemetry.md +225 -0
  292. package/docs/migration/release-notes/0.7.5.md +2 -2
  293. package/docs/migration/release-notes/0.8.0.md +57 -5
  294. package/docs/migration/v0.7-to-v0.8.md +1378 -0
  295. package/package.json +28 -11
  296. package/.github/LICENSE +0 -374
  297. package/dist/commands/help/help-accept.md +0 -9
  298. package/dist/commands/help/help-improve.md +0 -53
  299. package/dist/commands/help/help-reject.md +0 -8
  300. package/dist/commands/install-audit.js +0 -385
  301. package/dist/commands/vault.js +0 -310
  302. package/dist/indexer/match-contributors.js +0 -141
  303. package/dist/integrations/agent/pipeline.js +0 -39
  304. package/dist/integrations/agent/runners.js +0 -31
  305. package/dist/llm/prompts/graph-extract-user-prompt.md +0 -12
  306. /package/dist/{tasks → assets}/backends/launchd-template.xml +0 -0
  307. /package/dist/{tasks → assets}/backends/schtasks-template.xml +0 -0
  308. /package/dist/{commands → assets}/help/help-propose.md +0 -0
  309. /package/dist/{wiki → assets/wiki}/index-template.md +0 -0
  310. /package/dist/{wiki → assets/wiki}/ingest-workflow-template.md +0 -0
  311. /package/dist/{wiki → assets/wiki}/log-template.md +0 -0
  312. /package/dist/{wiki → assets/wiki}/schema-template.md +0 -0
  313. /package/dist/{workflows → assets/workflows}/workflow-template.md +0 -0
@@ -1,35 +1,50 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { getDefaultLlmConfig, getIndexPassConfig } from "../core/config";
1
5
  /**
2
- * Per-pass LLM config resolution for `akm index`.
3
- *
4
- * Locked v1 contract (#208):
5
- * - There is exactly one provider/model configuration: `akm.llm`.
6
- * - Every LLM-using pass inside `akm index` defaults to that block.
7
- * - A pass can be opted out individually with `index.<passName>.llm = false`.
8
- * - Any attempt to supply provider/model fields under `index.<passName>` is
9
- * rejected at config-load time by `parseIndexConfig` in
10
- * {@link ../core/config.ts} (`ConfigError("INVALID_CONFIG_FILE")`).
11
- *
12
- * Passes plug in by calling {@link resolveIndexPassLLM} with their pass
13
- * name (e.g. `"memory"` for #201's memory-inference pass, `"graph"` for
14
- * #207's graph-extraction pass). They do not read `config.llm` directly.
15
- * This keeps the config surface small and the wiring uniform.
16
- */
17
- /**
18
- * Resolve the {@link LlmConnectionConfig} a single index pass should use, or
19
- * `undefined` when the pass should run without an LLM.
20
- *
21
- * Returns `undefined` if any of:
22
- * - No top-level `akm.llm` block is configured.
23
- * - The pass is explicitly opted out (`index.<passName>.llm === false`).
24
- *
25
- * Otherwise returns the shared `akm.llm` config. There is no per-pass
26
- * provider override; that decision is locked by §9 of the v1 spec.
6
+ * Map a pass name (as used by callers — "memory", "graph", etc.) to the
7
+ * matching key under `profiles.improve.default.processes`. Pass names with
8
+ * no improve-profile counterpart return undefined and resolve via the
9
+ * default LLM only.
27
10
  */
11
+ function improveProcessKeyForPass(passName) {
12
+ switch (passName) {
13
+ case "memory":
14
+ return "memoryInference";
15
+ case "graph":
16
+ return "graphExtraction";
17
+ default:
18
+ return undefined;
19
+ }
20
+ }
28
21
  export function resolveIndexPassLLM(passName, config) {
29
- if (!config.llm)
30
- return undefined;
31
- const passConfig = config.index?.[passName];
22
+ // Gate 1 — explicit opt-out via the index-config block stays authoritative.
23
+ const passConfig = getIndexPassConfig(config.index, passName);
32
24
  if (passConfig?.llm === false)
33
25
  return undefined;
34
- return config.llm;
26
+ // Gate 2 — per-process profile from the improve profile, when present.
27
+ // This is the path that lets
28
+ // profiles.improve.default.processes.graphExtraction.profile = "ministral-3b"
29
+ // actually take effect on the graph pass instead of being silently
30
+ // ignored.
31
+ const processKey = improveProcessKeyForPass(passName);
32
+ if (processKey) {
33
+ const processConfig = config.profiles?.improve?.default?.processes?.[processKey];
34
+ // Honor enabled === false here too — an explicit disable wins.
35
+ if (processConfig?.enabled === false)
36
+ return undefined;
37
+ const profileName = processConfig?.profile;
38
+ if (profileName) {
39
+ const profile = config.profiles?.llm?.[profileName];
40
+ if (profile)
41
+ return profile;
42
+ // A named-but-missing profile is a configuration error in spirit, but
43
+ // we fall through to default rather than throwing — callers gracefully
44
+ // treat `undefined` as "pass disabled" and emitting a hard throw here
45
+ // would take the whole improve run down on a typo.
46
+ }
47
+ }
48
+ // Gate 3 — fall back to the default LLM profile.
49
+ return getDefaultLlmConfig(config);
35
50
  }
@@ -1,3 +1,6 @@
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/.
1
4
  /**
2
5
  * LLM helper for the `akm index` memory-inference pass (#201).
3
6
  *
@@ -24,11 +27,35 @@ const MAX_BODY_CHARS = 4000;
24
27
  const SYSTEM_PROMPT = "You compress a developer memory into one high-signal derived memory for later retrieval. " +
25
28
  "Return only valid JSON. No prose outside the JSON object. No markdown fences.";
26
29
  const USER_PROMPT_PREFIX = `Compress the memory below into one derived memory. Output ONLY JSON:
27
- {"title":"string","description":"string","tags":["string"],"searchHints":["string"],"content":"string"}
28
- Rules: be specific, no vague generalizations, preserve key facts (names/versions/paths/config keys verbatim), merge related points, max 3 sentences body, 3-8 tags, 3-6 searchHints.
30
+ {"title":"short title string","description":"one sentence summary string","tags":["tag1","tag2"],"searchHints":["search phrase 1","search phrase 2"],"content":"2-3 sentence compressed body preserving key facts verbatim"}
31
+ Rules: be specific, no vague generalizations, preserve key facts (names/versions/paths/config keys verbatim), merge related points, 3-8 tags, 3-6 searchHints. The content field must be a plain string with 2-3 sentences.
29
32
 
30
33
  Memory:
31
34
  `;
35
+ /**
36
+ * Strict JSON Schema for the derived-memory payload. Sent to providers that
37
+ * opt in via `LlmConnectionConfig.supportsJsonSchema = true`; the client
38
+ * silently drops the schema for providers that don't.
39
+ *
40
+ * Extends the responseSchema lift (PR 1, asset-writers-investigation §5) to
41
+ * the memory-inference path. Mirrors the validation gate below
42
+ * (title/description/content + non-empty tags/searchHints) so a
43
+ * schema-compliant response is guaranteed to pass the downstream check
44
+ * — no more "incomplete derived memory payload from LLM; skipping memory"
45
+ * for shape-only failures.
46
+ */
47
+ const DERIVED_MEMORY_JSON_SCHEMA = {
48
+ type: "object",
49
+ properties: {
50
+ title: { type: "string", minLength: 1 },
51
+ description: { type: "string", minLength: 1 },
52
+ content: { type: "string", minLength: 1 },
53
+ tags: { type: "array", items: { type: "string" }, minItems: 1, maxItems: 8 },
54
+ searchHints: { type: "array", items: { type: "string" }, minItems: 1, maxItems: 6 },
55
+ },
56
+ required: ["title", "description", "content", "tags", "searchHints"],
57
+ additionalProperties: false,
58
+ };
32
59
  /**
33
60
  * Compress a single memory body into one derived memory via the configured LLM.
34
61
  *
@@ -53,6 +80,7 @@ export async function compressMemoryToDerivedMemory(llmConfig, body, signal, akm
53
80
  temperature: 0.1,
54
81
  timeoutMs: llmConfig.timeoutMs,
55
82
  signal,
83
+ responseSchema: DERIVED_MEMORY_JSON_SCHEMA,
56
84
  });
57
85
  if (!raw)
58
86
  return undefined;
@@ -1,10 +1,6 @@
1
- /**
2
- * LLM-driven metadata enhancement for stash entries.
3
- *
4
- * Split out of `llm.ts` so the higher-level workflow (prompting the LLM to
5
- * improve descriptions/tags/searchHints) lives separately from the low-level
6
- * transport client in `client.ts`.
7
- */
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/.
8
4
  import { chatCompletion, parseJsonResponse } from "./client";
9
5
  import { tryLlmFeature } from "./feature-gate";
10
6
  const SYSTEM_PROMPT = `You are a metadata generator for a developer asset registry. Given a script/skill/command/agent entry, generate improved metadata. Respond with ONLY valid JSON, no markdown fencing.`;
@@ -1,12 +1,15 @@
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/.
1
4
  /**
2
5
  * Embedded "agent CLI hints" rendered by `akm hints` when no other source
3
6
  * is available.
4
7
  *
5
8
  * Extracted from `src/cli.ts` so it does not bloat the CLI module and so
6
9
  * docs/CI tooling can re-use the same constants. Two flavors:
7
- * `EMBEDDED_HINTS` (default reference, ~40 lines) and
8
- * `EMBEDDED_HINTS_FULL` (`--detail full`, ~250 lines).
10
+ * `EMBEDDED_HINTS` (`--detail brief`, short reference, ~40 lines) and
11
+ * `EMBEDDED_HINTS_FULL` (`--detail normal|full`, ~250 lines).
9
12
  */
10
- import EMBEDDED_HINTS_FULL from "./cli-hints-full.md" with { type: "text" };
11
- import EMBEDDED_HINTS from "./cli-hints-short.md" with { type: "text" };
13
+ import EMBEDDED_HINTS_FULL from "../assets/hints/cli-hints-full.md" with { type: "text" };
14
+ import EMBEDDED_HINTS from "../assets/hints/cli-hints-short.md" with { type: "text" };
12
15
  export { EMBEDDED_HINTS, EMBEDDED_HINTS_FULL };
@@ -1,7 +1,10 @@
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/.
1
4
  /**
2
5
  * Process-level output mode singleton.
3
6
  *
4
- * Output mode (format + detail + forAgent) is parsed once at startup from
7
+ * Output mode (format + detail + shape) is parsed once at startup from
5
8
  * `process.argv` and the persisted user config. All subsequent `output()`
6
9
  * calls read from this in-memory singleton instead of re-scanning argv and
7
10
  * re-loading config on every call.
@@ -9,8 +12,9 @@
9
12
  * Initialized from `cli.ts` before `runMain`.
10
13
  */
11
14
  import { UsageError } from "../core/errors";
12
- export const OUTPUT_FORMATS = ["json", "yaml", "text", "jsonl"];
13
- export const DETAIL_LEVELS = ["brief", "normal", "full", "summary", "agent"];
15
+ export const OUTPUT_FORMATS = ["json", "yaml", "text", "jsonl", "md"];
16
+ export const DETAIL_LEVELS = ["brief", "normal", "full"];
17
+ export const SHAPE_MODES = ["human", "agent", "summary"];
14
18
  export function parseOutputFormat(value) {
15
19
  if (!value)
16
20
  return undefined;
@@ -25,6 +29,13 @@ export function parseDetailLevel(value) {
25
29
  return value;
26
30
  throw new UsageError(`Invalid value for --detail: ${value}. Expected one of: ${DETAIL_LEVELS.join("|")}`, "INVALID_DETAIL_VALUE");
27
31
  }
32
+ export function parseShapeMode(value) {
33
+ if (!value)
34
+ return undefined;
35
+ if (SHAPE_MODES.includes(value))
36
+ return value;
37
+ throw new UsageError(`Invalid value for --shape: ${value}. Expected one of: ${SHAPE_MODES.join("|")}`, "INVALID_SHAPE_VALUE");
38
+ }
28
39
  export function parseFlagValue(argv, flag) {
29
40
  for (let i = 0; i < argv.length; i++) {
30
41
  const arg = argv[i];
@@ -62,11 +73,52 @@ export function getHyphenatedBoolean(args, key) {
62
73
  */
63
74
  export function resolveOutputMode(argv, defaults = {}) {
64
75
  const format = parseOutputFormat(parseFlagValue(argv, "--format")) ?? defaults?.format ?? "json";
65
- const detail = parseDetailLevel(parseFlagValue(argv, "--detail")) ?? defaults?.detail ?? "brief";
66
- // `--detail=agent` is the preferred preset. `--for-agent` is kept for one
67
- // release cycle as an alias so existing scripts and docs keep working.
68
- const forAgent = detail === "agent" || hasBooleanFlag(argv, "--for-agent");
69
- return { format, detail, forAgent };
76
+ const rawDetail = parseFlagValue(argv, "--detail");
77
+ const rawShape = parseFlagValue(argv, "--shape");
78
+ const usedForAgent = hasBooleanFlag(argv, "--for-agent");
79
+ // Back-compat: the projection presets `summary`/`agent` used to live on
80
+ // `--detail`. They moved to `--shape` in 0.8 (removed from `--detail` in
81
+ // 0.9.0). Map the legacy spellings onto `--shape` + warn, and treat the
82
+ // verbosity axis as `normal` (the prior effective behaviour).
83
+ let detailForVerbosity = rawDetail;
84
+ let shapeFromLegacyDetail;
85
+ if (rawDetail === "summary" || rawDetail === "agent") {
86
+ // Only nudge toward `--shape` when the caller did not already pass an
87
+ // explicit `--shape` (which wins below). Otherwise the "use --shape <x>"
88
+ // advice would name a projection the caller did not request.
89
+ if (rawShape === undefined)
90
+ emitDetailShapeDeprecation(rawDetail);
91
+ shapeFromLegacyDetail = rawDetail;
92
+ detailForVerbosity = "normal";
93
+ }
94
+ else if (rawDetail === "per-run") {
95
+ // Legacy `akm health --detail per-run` (→ `--group-by run`). The health
96
+ // command owns the back-compat warning + mapping; the global singleton must
97
+ // not reject the value here, so fall through to the default verbosity.
98
+ detailForVerbosity = undefined;
99
+ }
100
+ if (usedForAgent) {
101
+ emitForAgentDeprecation();
102
+ }
103
+ const detail = parseDetailLevel(detailForVerbosity) ?? defaults?.detail ?? "brief";
104
+ // Precedence: explicit `--shape` wins; then legacy `--detail summary|agent`;
105
+ // then legacy `--for-agent`; default `human`.
106
+ const shape = parseShapeMode(rawShape) ?? shapeFromLegacyDetail ?? (usedForAgent ? "agent" : "human");
107
+ return { format, detail, shape, forAgent: shape === "agent" };
108
+ }
109
+ /** Suppress deprecation warnings under `--quiet` (mirrors the rest of the CLI). */
110
+ function isQuietArgv() {
111
+ return process.argv.includes("--quiet") || process.argv.includes("-q");
112
+ }
113
+ function emitDetailShapeDeprecation(value) {
114
+ if (isQuietArgv())
115
+ return;
116
+ process.stderr.write(`warning: '--detail ${value}' is deprecated; use '--shape ${value}'. Removed in 0.9.0.\n`);
117
+ }
118
+ function emitForAgentDeprecation() {
119
+ if (isQuietArgv())
120
+ return;
121
+ process.stderr.write("warning: '--for-agent' is deprecated; use '--shape agent'. Removed in 0.9.0.\n");
70
122
  }
71
123
  let _mode;
72
124
  /**