akm-cli 0.7.5 → 0.8.0-rc.6

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 (236) hide show
  1. package/{.github/CHANGELOG.md → CHANGELOG.md} +113 -2
  2. package/README.md +20 -4
  3. package/SECURITY.md +93 -0
  4. package/dist/cli/config-migrate.js +144 -0
  5. package/dist/cli/config-validate.js +39 -0
  6. package/dist/cli/confirm.js +73 -0
  7. package/dist/cli/parse-args.js +133 -0
  8. package/dist/cli.js +1995 -551
  9. package/dist/commands/agent-dispatch.js +110 -0
  10. package/dist/commands/agent-support.js +68 -0
  11. package/dist/commands/completions.js +3 -0
  12. package/dist/commands/config-cli.js +130 -534
  13. package/dist/commands/consolidate.js +1531 -0
  14. package/dist/commands/curate.js +44 -3
  15. package/dist/commands/db-cli.js +23 -0
  16. package/dist/commands/distill-promotion-policy.js +660 -0
  17. package/dist/commands/distill.js +990 -75
  18. package/dist/commands/eval-cases.js +43 -0
  19. package/dist/commands/events.js +5 -23
  20. package/dist/commands/graph.js +477 -0
  21. package/dist/commands/health.js +400 -0
  22. package/dist/commands/help/help-accept.md +9 -0
  23. package/dist/commands/help/help-improve.md +77 -0
  24. package/dist/commands/help/help-proposals.md +15 -0
  25. package/dist/commands/help/help-propose.md +17 -0
  26. package/dist/commands/help/help-reject.md +8 -0
  27. package/dist/commands/history.js +54 -46
  28. package/dist/commands/improve-profiles.js +146 -0
  29. package/dist/commands/improve-result-file.js +103 -0
  30. package/dist/commands/improve.js +2175 -0
  31. package/dist/commands/info.js +5 -2
  32. package/dist/commands/init.js +50 -2
  33. package/dist/commands/installed-stashes.js +102 -139
  34. package/dist/commands/knowledge.js +136 -0
  35. package/dist/commands/lint/agent-linter.js +49 -0
  36. package/dist/commands/lint/base-linter.js +479 -0
  37. package/dist/commands/lint/command-linter.js +49 -0
  38. package/dist/commands/lint/default-linter.js +16 -0
  39. package/dist/commands/lint/index.js +183 -0
  40. package/dist/commands/lint/knowledge-linter.js +16 -0
  41. package/dist/commands/lint/markdown-insertion.js +343 -0
  42. package/dist/commands/lint/memory-linter.js +61 -0
  43. package/dist/commands/lint/registry.js +36 -0
  44. package/dist/commands/lint/skill-linter.js +45 -0
  45. package/dist/commands/lint/task-linter.js +50 -0
  46. package/dist/commands/lint/types.js +4 -0
  47. package/dist/commands/lint/vault-key-rules.js +139 -0
  48. package/dist/commands/lint/workflow-linter.js +56 -0
  49. package/dist/commands/lint.js +4 -0
  50. package/dist/commands/migration-help.js +5 -2
  51. package/dist/commands/proposal.js +66 -12
  52. package/dist/commands/propose.js +86 -31
  53. package/dist/commands/reflect.js +1119 -73
  54. package/dist/commands/registry-search.js +5 -2
  55. package/dist/commands/remember.js +69 -6
  56. package/dist/commands/schema-repair.js +203 -0
  57. package/dist/commands/search.js +115 -14
  58. package/dist/commands/self-update.js +3 -0
  59. package/dist/commands/show.js +144 -25
  60. package/dist/commands/source-add.js +17 -45
  61. package/dist/commands/source-clone.js +3 -0
  62. package/dist/commands/source-manage.js +14 -19
  63. package/dist/commands/tasks.js +438 -0
  64. package/dist/commands/url-checker.js +42 -0
  65. package/dist/commands/vault.js +130 -77
  66. package/dist/core/action-contributors.js +28 -0
  67. package/dist/core/asset-ref.js +7 -0
  68. package/dist/core/asset-registry.js +7 -16
  69. package/dist/core/asset-serialize.js +88 -0
  70. package/dist/core/asset-spec.js +22 -0
  71. package/dist/core/common.js +157 -0
  72. package/dist/core/concurrent.js +25 -0
  73. package/dist/core/config-io.js +347 -0
  74. package/dist/core/config-migration.js +625 -0
  75. package/dist/core/config-schema.js +501 -0
  76. package/dist/core/config-sources.js +108 -0
  77. package/dist/core/config-types.js +4 -0
  78. package/dist/core/config-walker.js +337 -0
  79. package/dist/core/config.js +327 -987
  80. package/dist/core/errors.js +40 -19
  81. package/dist/core/events.js +91 -138
  82. package/dist/core/file-lock.js +104 -0
  83. package/dist/core/frontmatter.js +3 -6
  84. package/dist/core/lesson-lint.js +3 -0
  85. package/dist/core/markdown.js +20 -0
  86. package/dist/core/memory-belief.js +62 -0
  87. package/dist/core/memory-contradiction-detect.js +274 -0
  88. package/dist/core/memory-improve.js +806 -0
  89. package/dist/core/parse.js +158 -0
  90. package/dist/core/paths.js +326 -14
  91. package/dist/core/proposal-quality-validators.js +364 -0
  92. package/dist/core/proposal-validators.js +69 -0
  93. package/dist/core/proposals.js +498 -42
  94. package/dist/core/state-db.js +927 -0
  95. package/dist/core/text-truncation.js +107 -0
  96. package/dist/core/time.js +54 -0
  97. package/dist/core/warn.js +62 -1
  98. package/dist/core/write-source.js +3 -0
  99. package/dist/indexer/db-backup.js +391 -0
  100. package/dist/indexer/db-search.js +152 -253
  101. package/dist/indexer/db.js +933 -103
  102. package/dist/indexer/ensure-index.js +64 -0
  103. package/dist/indexer/file-context.js +3 -0
  104. package/dist/indexer/graph-boost.js +376 -101
  105. package/dist/indexer/graph-db.js +391 -0
  106. package/dist/indexer/graph-dedup.js +95 -0
  107. package/dist/indexer/graph-extraction.js +550 -124
  108. package/dist/indexer/index-context.js +4 -0
  109. package/dist/indexer/indexer.js +506 -291
  110. package/dist/indexer/llm-cache.js +47 -0
  111. package/dist/indexer/manifest.js +3 -0
  112. package/dist/indexer/matchers.js +148 -160
  113. package/dist/indexer/memory-inference.js +99 -74
  114. package/dist/indexer/metadata-contributors.js +29 -0
  115. package/dist/indexer/metadata.js +255 -196
  116. package/dist/indexer/path-resolver.js +92 -0
  117. package/dist/indexer/project-context.js +192 -0
  118. package/dist/indexer/ranking-contributors.js +331 -0
  119. package/dist/indexer/ranking.js +81 -0
  120. package/dist/indexer/search-fields.js +5 -9
  121. package/dist/indexer/search-hit-enrichers.js +111 -0
  122. package/dist/indexer/search-source.js +44 -10
  123. package/dist/indexer/semantic-status.js +5 -16
  124. package/dist/indexer/staleness-detect.js +447 -0
  125. package/dist/indexer/usage-events.js +12 -9
  126. package/dist/indexer/walker.js +28 -0
  127. package/dist/integrations/agent/builders.js +135 -0
  128. package/dist/integrations/agent/config.js +122 -230
  129. package/dist/integrations/agent/detect.js +3 -0
  130. package/dist/integrations/agent/index.js +7 -13
  131. package/dist/integrations/agent/model-aliases.js +55 -0
  132. package/dist/integrations/agent/profiles.js +70 -5
  133. package/dist/integrations/agent/prompts.js +150 -74
  134. package/dist/integrations/agent/runner.js +151 -0
  135. package/dist/integrations/agent/sdk-runner.js +126 -0
  136. package/dist/integrations/agent/spawn.js +118 -23
  137. package/dist/integrations/github.js +3 -0
  138. package/dist/integrations/lockfile.js +32 -69
  139. package/dist/integrations/session-logs/index.js +68 -0
  140. package/dist/integrations/session-logs/providers/claude-code.js +59 -0
  141. package/dist/integrations/session-logs/providers/opencode.js +55 -0
  142. package/dist/integrations/session-logs/types.js +4 -0
  143. package/dist/llm/call-ai.js +62 -0
  144. package/dist/llm/client.js +72 -124
  145. package/dist/llm/embedder.js +3 -19
  146. package/dist/llm/embedders/cache.js +3 -7
  147. package/dist/llm/embedders/local.js +3 -0
  148. package/dist/llm/embedders/remote.js +20 -8
  149. package/dist/llm/embedders/types.js +3 -7
  150. package/dist/llm/feature-gate.js +89 -48
  151. package/dist/llm/graph-extract.js +676 -70
  152. package/dist/llm/index-passes.js +9 -23
  153. package/dist/llm/memory-infer.js +52 -71
  154. package/dist/llm/metadata-enhance.js +42 -29
  155. package/dist/llm/prompts/graph-extract-user-prompt.md +35 -0
  156. package/dist/output/cli-hints-full.md +281 -0
  157. package/dist/output/cli-hints-short.md +65 -0
  158. package/dist/output/cli-hints.js +5 -318
  159. package/dist/output/context.js +3 -0
  160. package/dist/output/renderers.js +223 -256
  161. package/dist/output/shapes.js +150 -105
  162. package/dist/output/text.js +318 -30
  163. package/dist/registry/build-index.js +3 -0
  164. package/dist/registry/create-provider-registry.js +3 -0
  165. package/dist/registry/factory.js +3 -0
  166. package/dist/registry/origin-resolve.js +3 -0
  167. package/dist/registry/providers/index.js +3 -0
  168. package/dist/registry/providers/skills-sh.js +70 -49
  169. package/dist/registry/providers/static-index.js +53 -48
  170. package/dist/registry/providers/types.js +3 -24
  171. package/dist/registry/resolve.js +11 -16
  172. package/dist/registry/types.js +3 -0
  173. package/dist/scripts/migrate-storage.js +17307 -0
  174. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +8900 -0
  175. package/dist/scripts/migrations/v16-to-v17.js +141 -0
  176. package/dist/setup/detect.js +3 -0
  177. package/dist/setup/ripgrep-install.js +3 -0
  178. package/dist/setup/ripgrep-resolve.js +3 -0
  179. package/dist/setup/setup.js +775 -37
  180. package/dist/setup/steps.js +3 -15
  181. package/dist/sources/include.js +3 -0
  182. package/dist/sources/provider-factory.js +5 -12
  183. package/dist/sources/provider.js +3 -20
  184. package/dist/sources/providers/filesystem.js +19 -23
  185. package/dist/sources/providers/git.js +7 -5
  186. package/dist/sources/providers/index.js +3 -0
  187. package/dist/sources/providers/install-types.js +3 -13
  188. package/dist/sources/providers/npm.js +3 -4
  189. package/dist/sources/providers/provider-utils.js +3 -0
  190. package/dist/sources/providers/sync-from-ref.js +3 -11
  191. package/dist/sources/providers/tar-utils.js +3 -0
  192. package/dist/sources/providers/website.js +18 -22
  193. package/dist/sources/resolve.js +3 -0
  194. package/dist/sources/types.js +3 -0
  195. package/dist/sources/website-ingest.js +7 -0
  196. package/dist/tasks/backends/cron.js +203 -0
  197. package/dist/tasks/backends/exec-utils.js +28 -0
  198. package/dist/tasks/backends/index.js +24 -0
  199. package/dist/tasks/backends/launchd-template.xml +19 -0
  200. package/dist/tasks/backends/launchd.js +187 -0
  201. package/dist/tasks/backends/schtasks-template.xml +29 -0
  202. package/dist/tasks/backends/schtasks.js +215 -0
  203. package/dist/tasks/parser.js +211 -0
  204. package/dist/tasks/resolveAkmBin.js +87 -0
  205. package/dist/tasks/runner.js +458 -0
  206. package/dist/tasks/schedule.js +211 -0
  207. package/dist/tasks/schema.js +15 -0
  208. package/dist/tasks/validator.js +62 -0
  209. package/dist/version.js +3 -0
  210. package/dist/wiki/index-template.md +12 -0
  211. package/dist/wiki/ingest-workflow-template.md +54 -0
  212. package/dist/wiki/log-template.md +8 -0
  213. package/dist/wiki/schema-template.md +61 -0
  214. package/dist/wiki/wiki-templates.js +15 -0
  215. package/dist/wiki/wiki.js +13 -61
  216. package/dist/workflows/authoring.js +8 -25
  217. package/dist/workflows/cli.js +3 -0
  218. package/dist/workflows/db.js +140 -10
  219. package/dist/workflows/document-cache.js +3 -10
  220. package/dist/workflows/parser.js +3 -0
  221. package/dist/workflows/renderer.js +11 -3
  222. package/dist/workflows/runs.js +62 -91
  223. package/dist/workflows/schema.js +3 -0
  224. package/dist/workflows/scope-key.js +3 -0
  225. package/dist/workflows/validator.js +4 -8
  226. package/dist/workflows/workflow-template.md +24 -0
  227. package/docs/README.md +9 -2
  228. package/docs/data-and-telemetry.md +225 -0
  229. package/docs/migration/release-notes/0.7.0.md +1 -1
  230. package/docs/migration/release-notes/0.7.5.md +2 -2
  231. package/docs/migration/release-notes/0.8.0.md +48 -0
  232. package/docs/migration/v0.7-to-v0.8.md +1307 -0
  233. package/package.json +20 -8
  234. package/.github/LICENSE +0 -374
  235. package/dist/commands/install-audit.js +0 -381
  236. package/dist/templates/wiki-templates.js +0 -100
@@ -0,0 +1,110 @@
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
+ * `akm agent <profile> [--prompt <text>] [--command <ref>] [--workflow <ref>] [args...]`
6
+ *
7
+ * Dispatch an agent by named profile, optionally injecting a prompt from
8
+ * inline text, a stash command: asset, or a stash workflow: asset.
9
+ *
10
+ * When none of --prompt, --command, or --workflow are given, the agent is
11
+ * launched interactively (no injected prompt).
12
+ *
13
+ * Template placeholders (`{{0}}`, `{{1}}`, ...) in the loaded asset body are
14
+ * filled from the extra positional args in order.
15
+ */
16
+ import fs from "node:fs";
17
+ import { parseAssetRef } from "../core/asset-ref";
18
+ import { NotFoundError, UsageError } from "../core/errors";
19
+ import { requireAgentProfile } from "../integrations/agent/config";
20
+ import { runAgentSdk } from "../integrations/agent/sdk-runner";
21
+ import { runAgent } from "../integrations/agent/spawn";
22
+ /**
23
+ * Fill `{{0}}`, `{{1}}`, ... placeholders in `template` with the
24
+ * corresponding entries in `args`. Any placeholder index that exceeds the
25
+ * args array is left as-is.
26
+ */
27
+ function fillPlaceholders(template, args) {
28
+ return template.replace(/\{\{(\d+)\}\}/g, (match, idx) => {
29
+ const i = Number.parseInt(idx, 10);
30
+ return i < args.length ? args[i] : match;
31
+ });
32
+ }
33
+ /**
34
+ * Resolve the body of an asset by ref string. The ref must parse as a
35
+ * valid asset ref (e.g. `command:my-cmd`, `workflow:my-flow`). The file
36
+ * must exist on disk (the index provides the file path).
37
+ *
38
+ * Throws `NotFoundError` when the ref cannot be resolved.
39
+ */
40
+ async function resolveAssetBody(ref) {
41
+ let parsed;
42
+ try {
43
+ parsed = parseAssetRef(ref);
44
+ }
45
+ catch (err) {
46
+ throw new UsageError(`Invalid asset ref "${ref}": ${err instanceof Error ? err.message : String(err)}`, "INVALID_FLAG_VALUE");
47
+ }
48
+ // Lazy import to avoid pulling the full indexer at startup.
49
+ const { lookup } = await import("../indexer/indexer.js");
50
+ const entry = await lookup(parsed);
51
+ if (!entry) {
52
+ throw new NotFoundError(`Asset "${ref}" not found in the index. Run \`akm index\` to rebuild the index.`);
53
+ }
54
+ try {
55
+ return fs.readFileSync(entry.filePath, "utf8");
56
+ }
57
+ catch (err) {
58
+ throw new NotFoundError(`Asset "${ref}" is indexed but the file could not be read (${entry.filePath}): ${err instanceof Error ? err.message : String(err)}`);
59
+ }
60
+ }
61
+ export async function akmAgentDispatch(options) {
62
+ if (!options.profileName?.trim()) {
63
+ throw new UsageError("agent: <profile> is required.", "MISSING_REQUIRED_ARGUMENT");
64
+ }
65
+ // Resolve the profile — throws ConfigError with an actionable hint when
66
+ // agent config is absent or the profile is not found.
67
+ const profile = requireAgentProfile(options.agentConfig, options.profileName.trim());
68
+ // Resolve the prompt text from whichever source was provided.
69
+ let prompt;
70
+ if (options.commandRef) {
71
+ const body = await resolveAssetBody(options.commandRef);
72
+ prompt = options.args?.length ? fillPlaceholders(body, options.args) : body;
73
+ }
74
+ else if (options.workflowRef) {
75
+ const body = await resolveAssetBody(options.workflowRef);
76
+ prompt = options.args?.length ? fillPlaceholders(body, options.args) : body;
77
+ }
78
+ else if (options.prompt !== undefined) {
79
+ prompt = options.prompt;
80
+ }
81
+ // When prompt is undefined, the agent is launched interactively.
82
+ const stdio = prompt === undefined && profile.sdkMode !== true ? "interactive" : profile.stdio;
83
+ // Build the final dispatch request: merge the caller-supplied dispatch with
84
+ // the resolved prompt so the builder has all context in one place.
85
+ const dispatchRequest = options.dispatch
86
+ ? { ...options.dispatch, prompt: prompt ?? options.dispatch.prompt }
87
+ : undefined;
88
+ const runOptions = {
89
+ stdio,
90
+ parseOutput: "text",
91
+ ...(options.args?.length && !options.commandRef && !options.workflowRef ? { args: options.args } : {}),
92
+ ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),
93
+ ...(dispatchRequest !== undefined ? { dispatch: dispatchRequest } : {}),
94
+ };
95
+ const result = profile.sdkMode
96
+ ? await runAgentSdk(profile, prompt ?? "", runOptions, options.llmConfig)
97
+ : await runAgent(profile, prompt, runOptions);
98
+ return {
99
+ schemaVersion: 1,
100
+ ok: result.ok,
101
+ shape: "agent-result",
102
+ profileName: profile.name,
103
+ exitCode: result.exitCode,
104
+ stdout: result.stdout ?? "",
105
+ stderr: result.stderr ?? "",
106
+ durationMs: result.durationMs,
107
+ ...(result.error !== undefined ? { error: result.error } : {}),
108
+ ...(result.reason !== undefined ? { reason: result.reason } : {}),
109
+ };
110
+ }
@@ -0,0 +1,68 @@
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
+ * Shared helpers for agent-based commands (reflect, propose, etc.).
6
+ *
7
+ * Consolidates utility functions that were duplicated byte-for-byte across
8
+ * `reflect.ts` and `propose.ts`. Any command that shells out to an agent
9
+ * profile can import from here rather than copy-pasting.
10
+ */
11
+ import { loadConfig } from "../core/config";
12
+ import { requireAgentProfile, } from "../integrations/agent";
13
+ // ── Config helpers ───────────────────────────────────────────────────────────
14
+ /**
15
+ * Load the loaded AkmConfig from disk.
16
+ *
17
+ * After 0.8.0, the legacy `agent` top-level block was removed — the agent
18
+ * profile data now lives on the unified `AkmConfig` (via `profiles.agent` and
19
+ * `defaults.agent`). This helper remains for source-compat with callers that
20
+ * still expect an "AgentConfig"; it now returns the loaded `AkmConfig`.
21
+ */
22
+ export function loadAgentConfigFromDisk() {
23
+ return loadConfig();
24
+ }
25
+ /**
26
+ * Resolve the agent profile for a command's options.
27
+ * Prefers an injected `agentProfile` (test seam) over the on-disk config.
28
+ */
29
+ export function resolveAgentProfile(options) {
30
+ if (options.agentProfile)
31
+ return options.agentProfile;
32
+ const agent = options.agentConfig ?? loadAgentConfigFromDisk();
33
+ return requireAgentProfile(agent, options.profile);
34
+ }
35
+ // ── Failure helpers ──────────────────────────────────────────────────────────
36
+ /**
37
+ * Base failure envelope shared by all agent command failures.
38
+ * Each command returns its own typed failure shape — this helper builds the
39
+ * common fields so per-command wrappers only need to add their own fields.
40
+ */
41
+ export function baseFailureFields(result, fallbackReason = "non_zero_exit") {
42
+ const reason = result.reason ?? fallbackReason;
43
+ return {
44
+ schemaVersion: 1,
45
+ ok: false,
46
+ reason,
47
+ error: result.error ?? `agent failure (${reason})`,
48
+ exitCode: result.exitCode,
49
+ ...(result.stdout ? { stdout: result.stdout } : {}),
50
+ ...(result.stderr ? { stderr: result.stderr } : {}),
51
+ };
52
+ }
53
+ // ── ENOENT hint ──────────────────────────────────────────────────────────────
54
+ /**
55
+ * Return `true` when a failed agent result looks like the binary was not found
56
+ * on PATH. Used to surface a better error message pointing the user at
57
+ * `akm setup`.
58
+ */
59
+ export function isEnoentFailure(result) {
60
+ return (result.reason === "spawn_failed" &&
61
+ (!!result.error?.includes("ENOENT") || !!result.error?.toLowerCase().includes("not found")));
62
+ }
63
+ /**
64
+ * Build an actionable error message for a spawn-ENOENT failure.
65
+ */
66
+ export function enoentHintMessage(binName) {
67
+ return `The agent binary '${binName}' was not found on PATH. Run \`akm setup\` to configure an agent CLI, or install ${binName} and retry.`;
68
+ }
@@ -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
  import fs from "node:fs";
2
5
  import os from "node:os";
3
6
  import path from "node:path";