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.
- package/{.github/CHANGELOG.md → CHANGELOG.md} +238 -3
- package/README.md +22 -6
- package/SECURITY.md +93 -0
- package/dist/assets/help/help-accept.md +12 -0
- package/dist/assets/help/help-improve.md +81 -0
- package/dist/{commands → assets}/help/help-proposals.md +7 -4
- package/dist/assets/help/help-reject.md +11 -0
- package/dist/{output → assets/hints}/cli-hints-full.md +60 -32
- package/dist/{output → assets/hints}/cli-hints-short.md +10 -7
- package/dist/assets/profiles/default.json +15 -0
- package/dist/assets/profiles/graph-refresh.json +13 -0
- package/dist/assets/profiles/memory-focus.json +12 -0
- package/dist/assets/profiles/quick.json +15 -0
- package/dist/assets/profiles/thorough.json +15 -0
- package/dist/assets/prompts/extract-session.md +80 -0
- package/dist/assets/prompts/graph-extract-user-prompt.md +35 -0
- package/dist/assets/tasks/graph-refresh-weekly.yml +10 -0
- package/dist/cli/config-migrate.js +144 -0
- package/dist/cli/config-validate.js +39 -0
- package/dist/cli/confirm.js +73 -0
- package/dist/cli/parse-args.js +93 -3
- package/dist/cli/shared.js +129 -0
- package/dist/cli.js +2141 -1268
- package/dist/commands/add-cli.js +279 -0
- package/dist/commands/agent-dispatch.js +20 -12
- package/dist/commands/agent-support.js +11 -5
- package/dist/commands/completions.js +3 -0
- package/dist/commands/config-cli.js +129 -517
- package/dist/commands/consolidate.js +1557 -147
- package/dist/commands/curate.js +44 -3
- package/dist/commands/db-cli.js +23 -0
- package/dist/commands/distill-promotion-policy.js +5 -3
- package/dist/commands/distill.js +906 -100
- package/dist/commands/env.js +213 -0
- package/dist/commands/eval-cases.js +3 -0
- package/dist/commands/events.js +3 -0
- package/dist/commands/extract-cli.js +127 -0
- package/dist/commands/extract-prompt.js +217 -0
- package/dist/commands/extract.js +477 -0
- package/dist/commands/feedback-cli.js +331 -0
- package/dist/commands/graph.js +260 -5
- package/dist/commands/health.js +1042 -55
- package/dist/commands/history.js +51 -16
- package/dist/commands/improve-auto-accept.js +97 -0
- package/dist/commands/improve-cli.js +236 -0
- package/dist/commands/improve-profiles.js +138 -0
- package/dist/commands/improve-result-file.js +167 -0
- package/dist/commands/improve.js +1736 -346
- package/dist/commands/info.js +26 -28
- package/dist/commands/init.js +49 -1
- package/dist/commands/installed-stashes.js +6 -23
- package/dist/commands/knowledge.js +3 -0
- package/dist/commands/lint/agent-linter.js +3 -0
- package/dist/commands/lint/base-linter.js +199 -5
- package/dist/commands/lint/command-linter.js +3 -0
- package/dist/commands/lint/default-linter.js +3 -0
- package/dist/commands/lint/env-key-rules.js +154 -0
- package/dist/commands/lint/index.js +92 -3
- package/dist/commands/lint/knowledge-linter.js +3 -0
- package/dist/commands/lint/markdown-insertion.js +343 -0
- package/dist/commands/lint/memory-linter.js +3 -0
- package/dist/commands/lint/registry.js +3 -0
- package/dist/commands/lint/skill-linter.js +3 -0
- package/dist/commands/lint/task-linter.js +15 -12
- package/dist/commands/lint/types.js +3 -0
- package/dist/commands/lint/workflow-linter.js +3 -0
- package/dist/commands/lint.js +3 -0
- package/dist/commands/migration-help.js +5 -2
- package/dist/commands/proposal-drain-policies.js +128 -0
- package/dist/commands/proposal-drain.js +477 -0
- package/dist/commands/proposal.js +60 -6
- package/dist/commands/propose.js +24 -19
- package/dist/commands/reflect.js +1004 -94
- package/dist/commands/registry-cli.js +150 -0
- package/dist/commands/registry-search.js +3 -0
- package/dist/commands/remember-cli.js +257 -0
- package/dist/commands/remember.js +15 -6
- package/dist/commands/schema-repair.js +88 -15
- package/dist/commands/search.js +99 -14
- package/dist/commands/secret.js +173 -0
- package/dist/commands/self-update.js +3 -0
- package/dist/commands/show.js +32 -13
- package/dist/commands/source-add.js +7 -35
- package/dist/commands/source-clone.js +3 -0
- package/dist/commands/source-manage.js +3 -0
- package/dist/commands/tasks.js +161 -95
- package/dist/commands/url-checker.js +3 -0
- package/dist/core/action-contributors.js +3 -0
- package/dist/core/asset-ref.js +13 -2
- package/dist/core/asset-registry.js +9 -2
- package/dist/core/asset-serialize.js +88 -0
- package/dist/core/asset-spec.js +61 -5
- package/dist/core/common.js +93 -5
- package/dist/core/concurrent.js +3 -0
- package/dist/core/config-io.js +347 -0
- package/dist/core/config-migration.js +622 -0
- package/dist/core/config-schema.js +558 -0
- package/dist/core/config-sources.js +108 -0
- package/dist/core/config-types.js +4 -0
- package/dist/core/config-walker.js +337 -0
- package/dist/core/config.js +366 -1077
- package/dist/core/errors.js +42 -20
- package/dist/core/events.js +31 -25
- package/dist/core/file-lock.js +104 -0
- package/dist/core/frontmatter.js +75 -10
- package/dist/core/lesson-lint.js +3 -0
- package/dist/core/markdown.js +3 -0
- package/dist/core/memory-belief.js +62 -0
- package/dist/core/memory-contradiction-detect.js +274 -0
- package/dist/core/memory-improve.js +142 -14
- package/dist/core/parse.js +3 -0
- package/dist/core/paths.js +218 -50
- package/dist/core/proposal-quality-validators.js +380 -0
- package/dist/core/proposal-validators.js +11 -3
- package/dist/core/proposals.js +464 -5
- package/dist/core/state-db.js +349 -56
- package/dist/core/text-truncation.js +107 -0
- package/dist/core/time.js +3 -0
- package/dist/core/tty.js +59 -0
- package/dist/core/warn.js +7 -2
- package/dist/core/write-source.js +12 -0
- package/dist/indexer/db-backup.js +391 -0
- package/dist/indexer/db-search.js +136 -28
- package/dist/indexer/db.js +661 -166
- package/dist/indexer/ensure-index.js +3 -0
- package/dist/indexer/file-context.js +3 -0
- package/dist/indexer/graph-boost.js +162 -40
- package/dist/indexer/graph-db.js +241 -51
- package/dist/indexer/graph-dedup.js +3 -7
- package/dist/indexer/graph-extraction.js +242 -149
- package/dist/indexer/index-context.js +3 -9
- package/dist/indexer/indexer.js +86 -16
- package/dist/indexer/llm-cache.js +24 -19
- package/dist/indexer/manifest.js +3 -0
- package/dist/indexer/matchers.js +184 -11
- package/dist/indexer/memory-inference.js +94 -50
- package/dist/indexer/metadata-contributors.js +3 -0
- package/dist/indexer/metadata.js +110 -50
- package/dist/indexer/path-resolver.js +3 -0
- package/dist/indexer/project-context.js +192 -0
- package/dist/indexer/ranking-contributors.js +134 -7
- package/dist/indexer/ranking.js +8 -1
- package/dist/indexer/search-fields.js +5 -9
- package/dist/indexer/search-hit-enrichers.js +91 -2
- package/dist/indexer/search-source.js +20 -1
- package/dist/indexer/semantic-status.js +4 -1
- package/dist/indexer/staleness-detect.js +447 -0
- package/dist/indexer/usage-events.js +12 -9
- package/dist/indexer/walker.js +3 -0
- package/dist/integrations/agent/builders.js +135 -0
- package/dist/integrations/agent/config.js +121 -401
- package/dist/integrations/agent/detect.js +3 -0
- package/dist/integrations/agent/index.js +6 -14
- package/dist/integrations/agent/model-aliases.js +55 -0
- package/dist/integrations/agent/profiles.js +3 -0
- package/dist/integrations/agent/prompts.js +137 -8
- package/dist/integrations/agent/runner.js +208 -0
- package/dist/integrations/agent/sdk-runner.js +8 -2
- package/dist/integrations/agent/spawn.js +54 -14
- package/dist/integrations/github.js +3 -0
- package/dist/integrations/lockfile.js +22 -51
- package/dist/integrations/session-logs/index.js +4 -0
- package/dist/integrations/session-logs/inline-refs.js +35 -0
- package/dist/integrations/session-logs/pre-filter.js +152 -0
- package/dist/integrations/session-logs/providers/claude-code.js +226 -0
- package/dist/integrations/session-logs/providers/opencode.js +231 -25
- package/dist/integrations/session-logs/types.js +3 -0
- package/dist/llm/call-ai.js +14 -26
- package/dist/llm/client.js +16 -2
- package/dist/llm/embedder.js +20 -29
- package/dist/llm/embedders/cache.js +3 -7
- package/dist/llm/embedders/local.js +42 -1
- package/dist/llm/embedders/remote.js +20 -8
- package/dist/llm/embedders/types.js +3 -7
- package/dist/llm/feature-gate.js +92 -56
- package/dist/llm/graph-extract.js +402 -31
- package/dist/llm/index-passes.js +44 -29
- package/dist/llm/memory-infer.js +30 -2
- package/dist/llm/metadata-enhance.js +3 -7
- package/dist/output/cli-hints.js +7 -4
- package/dist/output/context.js +60 -8
- package/dist/output/renderers.js +170 -194
- package/dist/output/shapes/curate.js +56 -0
- package/dist/output/shapes/distill.js +10 -0
- package/dist/output/shapes/env-list.js +19 -0
- package/dist/output/shapes/events.js +11 -0
- package/dist/output/shapes/helpers.js +424 -0
- package/dist/output/shapes/history.js +7 -0
- package/dist/output/shapes/passthrough.js +105 -0
- package/dist/output/shapes/proposal-accept.js +7 -0
- package/dist/output/shapes/proposal-diff.js +7 -0
- package/dist/output/shapes/proposal-list.js +7 -0
- package/dist/output/shapes/proposal-producer.js +11 -0
- package/dist/output/shapes/proposal-reject.js +7 -0
- package/dist/output/shapes/proposal-show.js +7 -0
- package/dist/output/shapes/registry-search.js +6 -0
- package/dist/output/shapes/registry.js +30 -0
- package/dist/output/shapes/search.js +6 -0
- package/dist/output/shapes/secret-list.js +19 -0
- package/dist/output/shapes/show.js +6 -0
- package/dist/output/shapes/vault-list.js +19 -0
- package/dist/output/shapes.js +51 -549
- package/dist/output/text/add.js +6 -0
- package/dist/output/text/clone.js +6 -0
- package/dist/output/text/config.js +6 -0
- package/dist/output/text/curate.js +6 -0
- package/dist/output/text/distill.js +7 -0
- package/dist/output/text/enable-disable.js +7 -0
- package/dist/output/text/events.js +10 -0
- package/dist/output/text/feedback.js +6 -0
- package/dist/output/text/helpers.js +1059 -0
- package/dist/output/text/history.js +7 -0
- package/dist/output/text/import.js +6 -0
- package/dist/output/text/index.js +6 -0
- package/dist/output/text/info.js +6 -0
- package/dist/output/text/init.js +6 -0
- package/dist/output/text/list.js +6 -0
- package/dist/output/text/proposal-producer.js +8 -0
- package/dist/output/text/proposal.js +12 -0
- package/dist/output/text/registry-commands.js +11 -0
- package/dist/output/text/registry.js +30 -0
- package/dist/output/text/remember.js +6 -0
- package/dist/output/text/remove.js +6 -0
- package/dist/output/text/save.js +6 -0
- package/dist/output/text/search.js +6 -0
- package/dist/output/text/show.js +6 -0
- package/dist/output/text/update.js +6 -0
- package/dist/output/text/upgrade.js +6 -0
- package/dist/output/text/vault.js +16 -0
- package/dist/output/text/wiki.js +15 -0
- package/dist/output/text/workflow.js +14 -0
- package/dist/output/text.js +44 -1329
- package/dist/registry/build-index.js +3 -0
- package/dist/registry/create-provider-registry.js +3 -0
- package/dist/registry/factory.js +4 -1
- package/dist/registry/origin-resolve.js +3 -0
- package/dist/registry/providers/index.js +3 -0
- package/dist/registry/providers/skills-sh.js +11 -2
- package/dist/registry/providers/static-index.js +10 -1
- package/dist/registry/providers/types.js +3 -24
- package/dist/registry/resolve.js +11 -16
- package/dist/registry/types.js +3 -0
- package/dist/scripts/migrate-storage.js +17767 -0
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +9031 -0
- package/dist/scripts/migrations/v16-to-v17.js +141 -0
- package/dist/setup/detect.js +3 -0
- package/dist/setup/ripgrep-install.js +3 -0
- package/dist/setup/ripgrep-resolve.js +3 -0
- package/dist/setup/setup.js +306 -67
- package/dist/setup/steps.js +3 -15
- package/dist/sources/include.js +3 -0
- package/dist/sources/provider-factory.js +3 -11
- package/dist/sources/provider.js +3 -20
- package/dist/sources/providers/filesystem.js +19 -23
- package/dist/sources/providers/git.js +171 -21
- package/dist/sources/providers/index.js +3 -0
- package/dist/sources/providers/install-types.js +3 -13
- package/dist/sources/providers/npm.js +3 -4
- package/dist/sources/providers/provider-utils.js +3 -0
- package/dist/sources/providers/sync-from-ref.js +3 -11
- package/dist/sources/providers/tar-utils.js +3 -0
- package/dist/sources/providers/website.js +18 -22
- package/dist/sources/resolve.js +3 -0
- package/dist/sources/types.js +3 -0
- package/dist/sources/website-ingest.js +3 -0
- package/dist/tasks/backends/cron.js +3 -0
- package/dist/tasks/backends/exec-utils.js +3 -0
- package/dist/tasks/backends/index.js +3 -11
- package/dist/tasks/backends/launchd.js +4 -1
- package/dist/tasks/backends/schtasks.js +4 -1
- package/dist/tasks/parser.js +51 -38
- package/dist/tasks/resolveAkmBin.js +3 -0
- package/dist/tasks/runner.js +35 -9
- package/dist/tasks/schedule.js +20 -1
- package/dist/tasks/schema.js +5 -3
- package/dist/tasks/validator.js +6 -3
- package/dist/version.js +3 -0
- package/dist/wiki/wiki-templates.js +6 -3
- package/dist/wiki/wiki.js +4 -1
- package/dist/workflows/authoring.js +4 -1
- package/dist/workflows/cli.js +3 -0
- package/dist/workflows/db.js +140 -10
- package/dist/workflows/document-cache.js +3 -10
- package/dist/workflows/parser.js +3 -0
- package/dist/workflows/renderer.js +3 -0
- package/dist/workflows/runs.js +18 -1
- package/dist/workflows/schema.js +3 -0
- package/dist/workflows/scope-key.js +3 -0
- package/dist/workflows/validator.js +5 -9
- package/docs/README.md +7 -2
- package/docs/data-and-telemetry.md +225 -0
- package/docs/migration/release-notes/0.7.5.md +2 -2
- package/docs/migration/release-notes/0.8.0.md +57 -5
- package/docs/migration/v0.7-to-v0.8.md +1378 -0
- package/package.json +28 -11
- package/.github/LICENSE +0 -374
- package/dist/commands/help/help-accept.md +0 -9
- package/dist/commands/help/help-improve.md +0 -53
- package/dist/commands/help/help-reject.md +0 -8
- package/dist/commands/install-audit.js +0 -385
- package/dist/commands/vault.js +0 -310
- package/dist/indexer/match-contributors.js +0 -141
- package/dist/integrations/agent/pipeline.js +0 -39
- package/dist/integrations/agent/runners.js +0 -31
- package/dist/llm/prompts/graph-extract-user-prompt.md +0 -12
- /package/dist/{tasks → assets}/backends/launchd-template.xml +0 -0
- /package/dist/{tasks → assets}/backends/schtasks-template.xml +0 -0
- /package/dist/{commands → assets}/help/help-propose.md +0 -0
- /package/dist/{wiki → assets/wiki}/index-template.md +0 -0
- /package/dist/{wiki → assets/wiki}/ingest-workflow-template.md +0 -0
- /package/dist/{wiki → assets/wiki}/log-template.md +0 -0
- /package/dist/{wiki → assets/wiki}/schema-template.md +0 -0
- /package/dist/{workflows → assets/workflows}/workflow-template.md +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
// vault-list strips `path` from each vault object (security fix M3: avoid
|
|
5
|
+
// leaking absolute disk paths) then stamps the envelope (#484).
|
|
6
|
+
import { registerOutputShape } from "./registry";
|
|
7
|
+
registerOutputShape("vault-list", (result) => {
|
|
8
|
+
const r = result;
|
|
9
|
+
const vaults = Array.isArray(r.vaults) ? r.vaults : [];
|
|
10
|
+
return {
|
|
11
|
+
...r,
|
|
12
|
+
shape: r.shape ?? "vault-list",
|
|
13
|
+
schemaVersion: r.schemaVersion ?? 1,
|
|
14
|
+
vaults: vaults.map((v) => {
|
|
15
|
+
const { path: _path, ...rest } = v;
|
|
16
|
+
return rest;
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
});
|
package/dist/output/shapes.js
CHANGED
|
@@ -1,561 +1,63 @@
|
|
|
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
|
* Pure shaping functions that select and trim fields from command result
|
|
3
6
|
* objects according to the active detail level / agent mode.
|
|
4
7
|
*
|
|
5
8
|
* Every function in this module is side-effect free and operates on plain
|
|
6
9
|
* `Record<string, unknown>` shapes, which makes them trivial to unit test.
|
|
10
|
+
*
|
|
11
|
+
* Output shapes are registered via `registerOutputShape` — see the per-command
|
|
12
|
+
* modules in `src/output/shapes/` for individual registrations. The central
|
|
13
|
+
* `shapeForCommand` dispatcher looks up the registry and throws for unknown
|
|
14
|
+
* commands (v1 spec §9 — exhaustive registry, no silent fallback).
|
|
7
15
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return shapeProposalAcceptOutput(result, detail);
|
|
38
|
-
case "proposal-reject":
|
|
39
|
-
return shapeProposalRejectOutput(result, detail);
|
|
40
|
-
case "proposal-diff":
|
|
41
|
-
return shapeProposalDiffOutput(result, detail);
|
|
42
|
-
// Output shape registration for `akm reflect` and `akm propose` (#226).
|
|
43
|
-
// Both share the proposal-producer envelope shape (success carries a
|
|
44
|
-
// proposal entry; failure carries an AgentFailureReason discriminant).
|
|
45
|
-
case "reflect":
|
|
46
|
-
case "propose":
|
|
47
|
-
return shapeProposalProducerOutput(result, detail);
|
|
48
|
-
case "improve":
|
|
49
|
-
return result;
|
|
50
|
-
// Output shape registration for `akm distill <ref>` (#228). The shape is
|
|
51
|
-
// simple — outcome + ids + optional payload — so `brief` strips the full
|
|
52
|
-
// proposal blob, `normal` keeps the headline fields, and `full` projects
|
|
53
|
-
// everything for downstream automation.
|
|
54
|
-
case "distill":
|
|
55
|
-
return shapeDistillOutput(result, detail);
|
|
56
|
-
case "graph-summary":
|
|
57
|
-
case "graph-entities":
|
|
58
|
-
case "graph-relations":
|
|
59
|
-
case "graph-related":
|
|
60
|
-
case "graph-export":
|
|
61
|
-
return result;
|
|
62
|
-
// Identity-passthrough commands — registered here so the registry stays
|
|
63
|
-
// exhaustive (v1 spec §9). Each result object is already shaped at the
|
|
64
|
-
// command boundary; the registry just confirms there's no surprise
|
|
65
|
-
// command name slipping through.
|
|
66
|
-
case "add":
|
|
67
|
-
case "clone":
|
|
68
|
-
case "config":
|
|
69
|
-
case "curate":
|
|
70
|
-
case "disable":
|
|
71
|
-
case "enable":
|
|
72
|
-
case "feedback":
|
|
73
|
-
case "import":
|
|
74
|
-
case "index":
|
|
75
|
-
case "health":
|
|
76
|
-
case "info":
|
|
77
|
-
case "init":
|
|
78
|
-
case "list":
|
|
79
|
-
case "registry-add":
|
|
80
|
-
case "registry-build-index":
|
|
81
|
-
case "registry-list":
|
|
82
|
-
case "registry-remove":
|
|
83
|
-
case "remember":
|
|
84
|
-
case "remove":
|
|
85
|
-
case "save":
|
|
86
|
-
case "update":
|
|
87
|
-
case "upgrade":
|
|
88
|
-
case "vault-create":
|
|
89
|
-
case "vault-list":
|
|
90
|
-
case "vault-set":
|
|
91
|
-
case "vault-unset":
|
|
92
|
-
case "wiki-create":
|
|
93
|
-
case "wiki-ingest":
|
|
94
|
-
case "wiki-lint":
|
|
95
|
-
case "wiki-list":
|
|
96
|
-
case "wiki-pages":
|
|
97
|
-
case "wiki-register":
|
|
98
|
-
case "wiki-remove":
|
|
99
|
-
case "wiki-show":
|
|
100
|
-
case "wiki-stash":
|
|
101
|
-
case "workflow-complete":
|
|
102
|
-
case "workflow-create":
|
|
103
|
-
case "workflow-list":
|
|
104
|
-
case "workflow-next":
|
|
105
|
-
case "workflow-resume":
|
|
106
|
-
case "workflow-start":
|
|
107
|
-
case "workflow-status":
|
|
108
|
-
case "workflow-validate":
|
|
109
|
-
case "tasks-add":
|
|
110
|
-
case "tasks-list":
|
|
111
|
-
case "tasks-show":
|
|
112
|
-
case "tasks-remove":
|
|
113
|
-
case "tasks-enable":
|
|
114
|
-
case "tasks-disable":
|
|
115
|
-
case "tasks-run":
|
|
116
|
-
case "tasks-history":
|
|
117
|
-
case "tasks-sync":
|
|
118
|
-
case "tasks-doctor":
|
|
119
|
-
return result;
|
|
120
|
-
// Output shape registration for `akm lint`, `akm setup`, and `akm consolidate`.
|
|
121
|
-
// Each result is already fully shaped at the command boundary; pass through as-is.
|
|
122
|
-
case "lint":
|
|
123
|
-
case "setup":
|
|
124
|
-
case "consolidate":
|
|
125
|
-
return result;
|
|
126
|
-
// Output shape registration for `akm agent <profile>`. The result carries
|
|
127
|
-
// structured agent-run fields; the text renderer uses the interactive/
|
|
128
|
-
// captured distinction to decide what to print.
|
|
129
|
-
case "agent-result":
|
|
130
|
-
return result;
|
|
131
|
-
default:
|
|
132
|
-
// v1 spec §9 (output-shape registry exhaustive): no silent JSON.stringify
|
|
133
|
-
// fallback. A missing case here is a registration bug — fail loudly so
|
|
134
|
-
// the caller (or its tests) sees the missing command name.
|
|
135
|
-
throw new Error(`output shape not registered for command: ${command}`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
16
|
+
import { UsageError } from "../core/errors";
|
|
17
|
+
import { getOutputShapeHandler } from "./shapes/registry";
|
|
18
|
+
// Re-export helpers so existing imports from `shapes.ts` keep working.
|
|
19
|
+
export { capDescription, NORMAL_DESCRIPTION_LIMIT, pickFields, shapeAssetHit, shapeDistillOutput, shapeEventEntry, shapeEventsOutput, shapeHistoryEntry, shapeHistoryOutput, shapeProposalAcceptOutput, shapeProposalDiffOutput, shapeProposalEntry, shapeProposalListOutput, shapeProposalProducerOutput, shapeProposalRejectOutput, shapeProposalShowOutput, shapeRegistrySearchOutput, shapeSearchHit, shapeSearchHitForAgent, shapeSearchOutput, shapeShowOutput, truncateDescription, } from "./shapes/helpers";
|
|
20
|
+
// Re-export registry API so callers can use this module as the single entry
|
|
21
|
+
// point (backward compat).
|
|
22
|
+
export { deregisterOutputShape, registerOutputShape } from "./shapes/registry";
|
|
23
|
+
// ── Per-command shape modules (self-register at import time) ──────────────────
|
|
24
|
+
// Importing these modules triggers their `registerOutputShape(...)` calls.
|
|
25
|
+
// These imports must come AFTER the registry module has been loaded (guaranteed
|
|
26
|
+
// by the import order above).
|
|
27
|
+
import "./shapes/search";
|
|
28
|
+
import "./shapes/curate";
|
|
29
|
+
import "./shapes/registry-search";
|
|
30
|
+
import "./shapes/show";
|
|
31
|
+
import "./shapes/history";
|
|
32
|
+
import "./shapes/events";
|
|
33
|
+
import "./shapes/proposal-list";
|
|
34
|
+
import "./shapes/proposal-show";
|
|
35
|
+
import "./shapes/proposal-accept";
|
|
36
|
+
import "./shapes/proposal-reject";
|
|
37
|
+
import "./shapes/proposal-diff";
|
|
38
|
+
import "./shapes/proposal-producer";
|
|
39
|
+
import "./shapes/distill";
|
|
40
|
+
import "./shapes/env-list";
|
|
41
|
+
import "./shapes/vault-list";
|
|
42
|
+
import "./shapes/secret-list";
|
|
43
|
+
import "./shapes/passthrough";
|
|
44
|
+
// ── Dispatcher ────────────────────────────────────────────────────────────────
|
|
138
45
|
/**
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
* surface the structured failure-reason envelope as-is — the failure
|
|
143
|
-
* surface is small and the reason / error text is always load-bearing.
|
|
46
|
+
* Commands whose shape handler implements the `summary` projection. For every
|
|
47
|
+
* other command, `--shape summary` is a usage error (v1 §5 — honest rejection
|
|
48
|
+
* for a soon-frozen contract, not a silent fallback to `human`).
|
|
144
49
|
*/
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
reason: result.reason,
|
|
150
|
-
error: result.error,
|
|
151
|
-
...(result.ref !== undefined ? { ref: result.ref } : {}),
|
|
152
|
-
...(result.type !== undefined ? { type: result.type } : {}),
|
|
153
|
-
...(result.name !== undefined ? { name: result.name } : {}),
|
|
154
|
-
...(result.exitCode !== undefined ? { exitCode: result.exitCode } : {}),
|
|
155
|
-
};
|
|
156
|
-
if (detail === "full") {
|
|
157
|
-
return {
|
|
158
|
-
schemaVersion: result.schemaVersion ?? 1,
|
|
159
|
-
...base,
|
|
160
|
-
...(result.stdout !== undefined ? { stdout: result.stdout } : {}),
|
|
161
|
-
...(result.stderr !== undefined ? { stderr: result.stderr } : {}),
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
return base;
|
|
165
|
-
}
|
|
166
|
-
const proposal = result.proposal ?? {};
|
|
167
|
-
const base = {
|
|
168
|
-
ok: true,
|
|
169
|
-
ref: result.ref,
|
|
170
|
-
...(result.agentProfile !== undefined ? { agentProfile: result.agentProfile } : {}),
|
|
171
|
-
...(typeof result.durationMs === "number" ? { durationMs: result.durationMs } : {}),
|
|
172
|
-
proposal: shapeProposalEntry(proposal, detail === "brief" ? "normal" : detail),
|
|
173
|
-
};
|
|
174
|
-
if (detail === "full") {
|
|
175
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
176
|
-
}
|
|
177
|
-
return base;
|
|
178
|
-
}
|
|
179
|
-
export function shapeProposalEntry(entry, detail) {
|
|
180
|
-
if (detail === "brief") {
|
|
181
|
-
return pickFields(entry, ["id", "ref", "status", "source", "createdAt"]);
|
|
182
|
-
}
|
|
183
|
-
if (detail === "normal" || detail === "summary") {
|
|
184
|
-
return pickFields(entry, ["id", "ref", "status", "source", "sourceRun", "createdAt", "updatedAt", "review"]);
|
|
185
|
-
}
|
|
186
|
-
// full / agent: project everything including the payload.
|
|
187
|
-
return pickFields(entry, [
|
|
188
|
-
"id",
|
|
189
|
-
"ref",
|
|
190
|
-
"status",
|
|
191
|
-
"source",
|
|
192
|
-
"sourceRun",
|
|
193
|
-
"createdAt",
|
|
194
|
-
"updatedAt",
|
|
195
|
-
"payload",
|
|
196
|
-
"review",
|
|
197
|
-
]);
|
|
198
|
-
}
|
|
199
|
-
export function shapeProposalListOutput(result, detail) {
|
|
200
|
-
const proposals = Array.isArray(result.proposals) ? result.proposals : [];
|
|
201
|
-
const shaped = proposals.map((p) => shapeProposalEntry(p, detail));
|
|
202
|
-
const base = {
|
|
203
|
-
totalCount: result.totalCount ?? shaped.length,
|
|
204
|
-
proposals: shaped,
|
|
205
|
-
};
|
|
206
|
-
if (detail === "full") {
|
|
207
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
208
|
-
}
|
|
209
|
-
return base;
|
|
210
|
-
}
|
|
211
|
-
export function shapeProposalShowOutput(result, detail) {
|
|
212
|
-
const proposal = result.proposal ?? {};
|
|
213
|
-
const validation = result.validation;
|
|
214
|
-
const base = {
|
|
215
|
-
proposal: shapeProposalEntry(proposal, detail === "brief" ? "normal" : detail),
|
|
216
|
-
...(validation ? { validation } : {}),
|
|
217
|
-
};
|
|
218
|
-
if (detail === "full") {
|
|
219
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
220
|
-
}
|
|
221
|
-
return base;
|
|
222
|
-
}
|
|
223
|
-
export function shapeProposalAcceptOutput(result, detail) {
|
|
224
|
-
const proposal = result.proposal ?? {};
|
|
225
|
-
const base = {
|
|
226
|
-
ok: result.ok ?? true,
|
|
227
|
-
id: result.id,
|
|
228
|
-
ref: result.ref,
|
|
229
|
-
assetPath: result.assetPath,
|
|
230
|
-
proposal: shapeProposalEntry(proposal, detail === "brief" ? "normal" : detail),
|
|
231
|
-
};
|
|
232
|
-
if (detail === "full") {
|
|
233
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
234
|
-
}
|
|
235
|
-
return base;
|
|
236
|
-
}
|
|
237
|
-
export function shapeProposalRejectOutput(result, detail) {
|
|
238
|
-
const proposal = result.proposal ?? {};
|
|
239
|
-
const base = {
|
|
240
|
-
ok: result.ok ?? true,
|
|
241
|
-
id: result.id,
|
|
242
|
-
ref: result.ref,
|
|
243
|
-
...(result.reason !== undefined ? { reason: result.reason } : {}),
|
|
244
|
-
proposal: shapeProposalEntry(proposal, detail === "brief" ? "normal" : detail),
|
|
245
|
-
};
|
|
246
|
-
if (detail === "full") {
|
|
247
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
248
|
-
}
|
|
249
|
-
return base;
|
|
250
|
-
}
|
|
251
|
-
export function shapeDistillOutput(result, detail) {
|
|
252
|
-
const proposal = result.proposal;
|
|
253
|
-
if (detail === "brief") {
|
|
254
|
-
return pickFields(result, ["ok", "outcome", "inputRef", "lessonRef", "proposalId", "message"]);
|
|
255
|
-
}
|
|
256
|
-
const base = {
|
|
257
|
-
ok: result.ok ?? true,
|
|
258
|
-
outcome: result.outcome,
|
|
259
|
-
inputRef: result.inputRef,
|
|
260
|
-
lessonRef: result.lessonRef,
|
|
261
|
-
...(result.proposalId !== undefined ? { proposalId: result.proposalId } : {}),
|
|
262
|
-
...(result.message !== undefined ? { message: result.message } : {}),
|
|
263
|
-
...(Array.isArray(result.findings) && result.findings.length > 0 ? { findings: result.findings } : {}),
|
|
264
|
-
...(proposal ? { proposal: shapeProposalEntry(proposal, detail === "summary" ? "normal" : detail) } : {}),
|
|
265
|
-
};
|
|
266
|
-
if (detail === "full") {
|
|
267
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
268
|
-
}
|
|
269
|
-
return base;
|
|
270
|
-
}
|
|
271
|
-
export function shapeProposalDiffOutput(result, detail) {
|
|
272
|
-
const base = {
|
|
273
|
-
id: result.id,
|
|
274
|
-
ref: result.ref,
|
|
275
|
-
isNew: result.isNew,
|
|
276
|
-
unified: result.unified,
|
|
277
|
-
...(result.targetPath !== undefined ? { targetPath: result.targetPath } : {}),
|
|
278
|
-
};
|
|
279
|
-
if (detail === "full") {
|
|
280
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
281
|
-
}
|
|
282
|
-
return base;
|
|
283
|
-
}
|
|
284
|
-
export function shapeEventsOutput(result, detail) {
|
|
285
|
-
const events = Array.isArray(result.events) ? result.events : [];
|
|
286
|
-
const shapedEvents = events.map((event) => shapeEventEntry(event, detail));
|
|
287
|
-
const base = {
|
|
288
|
-
...(result.ref !== undefined ? { ref: result.ref } : {}),
|
|
289
|
-
...(result.type !== undefined ? { type: result.type } : {}),
|
|
290
|
-
...(result.since !== undefined ? { since: result.since } : {}),
|
|
291
|
-
...(typeof result.sinceOffset === "number" ? { sinceOffset: result.sinceOffset } : {}),
|
|
292
|
-
totalCount: result.totalCount ?? shapedEvents.length,
|
|
293
|
-
events: shapedEvents,
|
|
294
|
-
};
|
|
295
|
-
if (typeof result.nextOffset === "number") {
|
|
296
|
-
base.nextOffset = result.nextOffset;
|
|
297
|
-
}
|
|
298
|
-
if (typeof result.reason === "string") {
|
|
299
|
-
base.reason = result.reason;
|
|
300
|
-
}
|
|
301
|
-
if (detail === "full") {
|
|
302
|
-
return { schemaVersion: result.schemaVersion ?? 1, ...base };
|
|
303
|
-
}
|
|
304
|
-
return base;
|
|
305
|
-
}
|
|
306
|
-
export function shapeEventEntry(entry, detail) {
|
|
307
|
-
if (detail === "brief") {
|
|
308
|
-
return pickFields(entry, ["eventType", "ref", "ts"]);
|
|
309
|
-
}
|
|
310
|
-
if (detail === "normal" || detail === "summary") {
|
|
311
|
-
return pickFields(entry, ["eventType", "ref", "ts"]);
|
|
312
|
-
}
|
|
313
|
-
// full / agent: project everything the reader emits.
|
|
314
|
-
return pickFields(entry, ["id", "schemaVersion", "eventType", "ref", "ts", "metadata"]);
|
|
315
|
-
}
|
|
316
|
-
export function shapeHistoryOutput(result, detail) {
|
|
317
|
-
const entries = Array.isArray(result.entries) ? result.entries : [];
|
|
318
|
-
const shapedEntries = entries.map((entry) => shapeHistoryEntry(entry, detail));
|
|
319
|
-
if (detail === "full") {
|
|
320
|
-
return {
|
|
321
|
-
schemaVersion: result.schemaVersion ?? 1,
|
|
322
|
-
...(result.ref !== undefined ? { ref: result.ref } : {}),
|
|
323
|
-
...(result.since !== undefined ? { since: result.since } : {}),
|
|
324
|
-
totalCount: result.totalCount ?? shapedEntries.length,
|
|
325
|
-
entries: shapedEntries,
|
|
326
|
-
// `sources` lists the event sources included in this response.
|
|
327
|
-
// Always contains "usage_events"; also "events.jsonl" when
|
|
328
|
-
// --include-proposals was specified.
|
|
329
|
-
...(Array.isArray(result.sources) ? { sources: result.sources } : {}),
|
|
330
|
-
...(Array.isArray(result.warnings) && result.warnings.length > 0 ? { warnings: result.warnings } : {}),
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
return {
|
|
334
|
-
...(result.ref !== undefined ? { ref: result.ref } : {}),
|
|
335
|
-
...(result.since !== undefined ? { since: result.since } : {}),
|
|
336
|
-
totalCount: result.totalCount ?? shapedEntries.length,
|
|
337
|
-
entries: shapedEntries,
|
|
338
|
-
...(Array.isArray(result.sources) ? { sources: result.sources } : {}),
|
|
339
|
-
...(Array.isArray(result.warnings) && result.warnings.length > 0 ? { warnings: result.warnings } : {}),
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
export function shapeHistoryEntry(entry, detail) {
|
|
343
|
-
if (detail === "brief") {
|
|
344
|
-
// signal is load-bearing for feedback rows (positive/negative) so we
|
|
345
|
-
// project it even at brief — without it the entry is ambiguous.
|
|
346
|
-
return pickFields(entry, ["eventType", "ref", "signal", "createdAt"]);
|
|
347
|
-
}
|
|
348
|
-
if (detail === "normal" || detail === "summary") {
|
|
349
|
-
return pickFields(entry, ["eventType", "ref", "signal", "query", "createdAt"]);
|
|
50
|
+
const SHAPE_SUMMARY_COMMANDS = new Set(["show"]);
|
|
51
|
+
export function shapeForCommand(command, result, detail, shape = "human") {
|
|
52
|
+
if (shape === "summary" && !SHAPE_SUMMARY_COMMANDS.has(command)) {
|
|
53
|
+
throw new UsageError(`'--shape summary' is not supported for 'akm ${command}'. It is only available on 'akm show'.`, "INVALID_SHAPE_VALUE");
|
|
350
54
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
export function shapeSearchOutput(result, detail, forAgent = false) {
|
|
355
|
-
const hits = Array.isArray(result.hits) ? result.hits : [];
|
|
356
|
-
const registryHits = Array.isArray(result.registryHits) ? result.registryHits : [];
|
|
357
|
-
const shapedHits = forAgent
|
|
358
|
-
? hits.map((hit) => shapeSearchHitForAgent(hit))
|
|
359
|
-
: hits.map((hit) => shapeSearchHit(hit, detail));
|
|
360
|
-
const shapedRegistryHits = forAgent
|
|
361
|
-
? registryHits.map((hit) => shapeSearchHitForAgent(hit))
|
|
362
|
-
: registryHits.map((hit) => shapeSearchHit(hit, detail));
|
|
363
|
-
if (forAgent) {
|
|
364
|
-
return {
|
|
365
|
-
hits: shapedHits,
|
|
366
|
-
...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
|
|
367
|
-
...(result.tip ? { tip: result.tip } : {}),
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
if (detail === "full") {
|
|
371
|
-
return {
|
|
372
|
-
schemaVersion: result.schemaVersion,
|
|
373
|
-
stashDir: result.stashDir,
|
|
374
|
-
source: result.source,
|
|
375
|
-
hits: shapedHits,
|
|
376
|
-
...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
|
|
377
|
-
...(result.semanticSearch ? { semanticSearch: result.semanticSearch } : {}),
|
|
378
|
-
...(result.tip ? { tip: result.tip } : {}),
|
|
379
|
-
...(result.warnings ? { warnings: result.warnings } : {}),
|
|
380
|
-
...(result.timing ? { timing: result.timing } : {}),
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
return {
|
|
384
|
-
hits: shapedHits,
|
|
385
|
-
...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
|
|
386
|
-
...(Array.isArray(result.warnings) && result.warnings.length > 0 ? { warnings: result.warnings } : {}),
|
|
387
|
-
...(result.tip ? { tip: result.tip } : {}),
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
export function shapeRegistrySearchOutput(result, detail) {
|
|
391
|
-
const hits = Array.isArray(result.hits) ? result.hits : [];
|
|
392
|
-
const assetHits = Array.isArray(result.assetHits) ? result.assetHits : [];
|
|
393
|
-
// Shape stash hits as registry type
|
|
394
|
-
const shapedKitHits = hits.map((hit) => shapeSearchHit({ ...hit, type: "registry" }, detail));
|
|
395
|
-
// Shape asset hits by detail level
|
|
396
|
-
const shapedAssetHits = assetHits.map((hit) => shapeAssetHit(hit, detail));
|
|
397
|
-
const shaped = {
|
|
398
|
-
hits: shapedKitHits,
|
|
399
|
-
...(shapedAssetHits.length > 0 ? { assetHits: shapedAssetHits } : {}),
|
|
400
|
-
...(Array.isArray(result.warnings) && result.warnings.length > 0 ? { warnings: result.warnings } : {}),
|
|
401
|
-
};
|
|
402
|
-
if (detail === "full") {
|
|
403
|
-
shaped.query = result.query;
|
|
404
|
-
}
|
|
405
|
-
return shaped;
|
|
406
|
-
}
|
|
407
|
-
export function shapeAssetHit(hit, detail) {
|
|
408
|
-
if (detail === "brief")
|
|
409
|
-
return pickFields(hit, ["assetName", "assetType", "action", "estimatedTokens"]);
|
|
410
|
-
if (detail === "normal") {
|
|
411
|
-
return capDescription(pickFields(hit, ["assetName", "assetType", "description", "stash", "action", "estimatedTokens"]), NORMAL_DESCRIPTION_LIMIT);
|
|
412
|
-
}
|
|
413
|
-
return hit;
|
|
414
|
-
}
|
|
415
|
-
export function shapeSearchHit(hit, detail) {
|
|
416
|
-
if (hit.type === "registry") {
|
|
417
|
-
if (detail === "brief") {
|
|
418
|
-
// RegistrySearchHit uses `title` (not `name`); always project installRef
|
|
419
|
-
// and score so callers can use the result without --detail full (QA #28).
|
|
420
|
-
const out = pickFields(hit, ["title", "name", "installRef", "score"]);
|
|
421
|
-
// Normalise: if only title exists, expose it as `name` for consistency
|
|
422
|
-
if (out.title && !out.name)
|
|
423
|
-
out.name = out.title;
|
|
424
|
-
return out;
|
|
425
|
-
}
|
|
426
|
-
if (detail === "normal") {
|
|
427
|
-
// `curated` was removed in v1 (spec §4.2). Renderers project optional
|
|
428
|
-
// hit-level `warnings` instead so providers can surface non-fatal issues.
|
|
429
|
-
const out = capDescription(pickFields(hit, ["title", "name", "description", "action", "installRef", "score", "warnings"]), NORMAL_DESCRIPTION_LIMIT);
|
|
430
|
-
if (out.title && !out.name)
|
|
431
|
-
out.name = out.title;
|
|
432
|
-
return out;
|
|
433
|
-
}
|
|
434
|
-
return hit;
|
|
435
|
-
}
|
|
436
|
-
// Stash hit (local or remote)
|
|
437
|
-
// `ref` is included at `brief` so agents can run `akm show <ref>` without
|
|
438
|
-
// needing --detail full or --for-agent (REC-03).
|
|
439
|
-
if (detail === "brief")
|
|
440
|
-
return pickFields(hit, ["type", "name", "ref", "action", "estimatedTokens", "keys"]);
|
|
441
|
-
if (detail === "normal") {
|
|
442
|
-
// `warnings` is projected at `normal` so non-fatal hit-level issues are
|
|
443
|
-
// visible without forcing callers up to `--detail full`. Optional
|
|
444
|
-
// `quality` (v1 spec §4.2) is also surfaced when present so callers
|
|
445
|
-
// can see why a `proposed` entry showed up under `--include-proposed`.
|
|
446
|
-
const shaped = capDescription(pickFields(hit, ["type", "name", "description", "action", "score", "estimatedTokens", "warnings", "quality"]), NORMAL_DESCRIPTION_LIMIT);
|
|
447
|
-
if (Array.isArray(hit.keys) && hit.keys.length > 0)
|
|
448
|
-
shaped.keys = hit.keys;
|
|
449
|
-
return shaped;
|
|
450
|
-
}
|
|
451
|
-
return hit;
|
|
452
|
-
}
|
|
453
|
-
/** Agent-optimized search hit: only fields an LLM agent needs to decide and act */
|
|
454
|
-
export function shapeSearchHitForAgent(hit) {
|
|
455
|
-
const picked = pickFields(hit, ["name", "ref", "type", "description", "action", "score", "estimatedTokens", "keys"]);
|
|
456
|
-
return capDescription(picked, NORMAL_DESCRIPTION_LIMIT);
|
|
457
|
-
}
|
|
458
|
-
export function capDescription(hit, limit) {
|
|
459
|
-
if (typeof hit.description !== "string")
|
|
460
|
-
return hit;
|
|
461
|
-
return { ...hit, description: truncateDescription(hit.description, limit) };
|
|
462
|
-
}
|
|
463
|
-
export function truncateDescription(description, limit) {
|
|
464
|
-
const normalized = description.replace(/\s+/g, " ").trim();
|
|
465
|
-
if (normalized.length <= limit)
|
|
466
|
-
return normalized;
|
|
467
|
-
const truncated = normalized.slice(0, limit - 1);
|
|
468
|
-
const lastSpace = truncated.lastIndexOf(" ");
|
|
469
|
-
const safe = lastSpace >= Math.floor(limit * 0.6) ? truncated.slice(0, lastSpace) : truncated;
|
|
470
|
-
return `${safe.trimEnd()}...`;
|
|
471
|
-
}
|
|
472
|
-
export function shapeShowOutput(result, detail, forAgent = false) {
|
|
473
|
-
if (forAgent) {
|
|
474
|
-
return pickFields(result, [
|
|
475
|
-
"type",
|
|
476
|
-
"name",
|
|
477
|
-
"description",
|
|
478
|
-
"action",
|
|
479
|
-
"content",
|
|
480
|
-
"template",
|
|
481
|
-
"prompt",
|
|
482
|
-
"run",
|
|
483
|
-
"setup",
|
|
484
|
-
"cwd",
|
|
485
|
-
"activeRun",
|
|
486
|
-
"toolPolicy",
|
|
487
|
-
"modelHint",
|
|
488
|
-
"agent",
|
|
489
|
-
"parameters",
|
|
490
|
-
"workflowTitle",
|
|
491
|
-
"workflowParameters",
|
|
492
|
-
"steps",
|
|
493
|
-
"keys",
|
|
494
|
-
"comments",
|
|
495
|
-
"related",
|
|
496
|
-
]);
|
|
497
|
-
}
|
|
498
|
-
if (detail === "summary") {
|
|
499
|
-
return pickFields(result, [
|
|
500
|
-
"type",
|
|
501
|
-
"name",
|
|
502
|
-
"description",
|
|
503
|
-
"tags",
|
|
504
|
-
"parameters",
|
|
505
|
-
"workflowTitle",
|
|
506
|
-
"action",
|
|
507
|
-
"run",
|
|
508
|
-
"origin",
|
|
509
|
-
"keys",
|
|
510
|
-
"comments",
|
|
511
|
-
"related",
|
|
512
|
-
]);
|
|
513
|
-
}
|
|
514
|
-
const base = pickFields(result, [
|
|
515
|
-
"type",
|
|
516
|
-
"name",
|
|
517
|
-
"origin",
|
|
518
|
-
"action",
|
|
519
|
-
"description",
|
|
520
|
-
"tags",
|
|
521
|
-
"content",
|
|
522
|
-
"template",
|
|
523
|
-
"prompt",
|
|
524
|
-
"toolPolicy",
|
|
525
|
-
"modelHint",
|
|
526
|
-
"agent",
|
|
527
|
-
"parameters",
|
|
528
|
-
"workflowTitle",
|
|
529
|
-
"workflowParameters",
|
|
530
|
-
"steps",
|
|
531
|
-
"run",
|
|
532
|
-
"setup",
|
|
533
|
-
"cwd",
|
|
534
|
-
"activeRun",
|
|
535
|
-
"keys",
|
|
536
|
-
"comments",
|
|
537
|
-
"related",
|
|
538
|
-
// path and editable are always projected so JSON consumers can locate and
|
|
539
|
-
// edit the asset without needing --detail full (QA #7).
|
|
540
|
-
"path",
|
|
541
|
-
"editable",
|
|
542
|
-
]);
|
|
543
|
-
if (detail !== "full") {
|
|
544
|
-
return base;
|
|
545
|
-
}
|
|
546
|
-
return {
|
|
547
|
-
schemaVersion: 1,
|
|
548
|
-
...base,
|
|
549
|
-
...pickFields(result, ["editHint"]),
|
|
550
|
-
};
|
|
551
|
-
}
|
|
552
|
-
export function pickFields(source, fields) {
|
|
553
|
-
const result = {};
|
|
554
|
-
for (const field of fields) {
|
|
555
|
-
if (source[field] !== undefined) {
|
|
556
|
-
result[field] = source[field];
|
|
557
|
-
}
|
|
55
|
+
const handler = getOutputShapeHandler(command);
|
|
56
|
+
if (handler) {
|
|
57
|
+
return handler(result, detail, shape);
|
|
558
58
|
}
|
|
559
|
-
|
|
59
|
+
// v1 spec §9 (output-shape registry exhaustive): no silent JSON.stringify
|
|
60
|
+
// fallback. A missing case here is a registration bug — fail loudly so
|
|
61
|
+
// the caller (or its tests) sees the missing command name.
|
|
62
|
+
throw new Error(`output shape not registered for command: ${command}`);
|
|
560
63
|
}
|
|
561
|
-
export { NORMAL_DESCRIPTION_LIMIT };
|
|
@@ -0,0 +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/.
|
|
4
|
+
import { formatAddPlain } from "./helpers";
|
|
5
|
+
import { registerTextFormatter } from "./registry";
|
|
6
|
+
registerTextFormatter("add", (r) => formatAddPlain(r));
|
|
@@ -0,0 +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/.
|
|
4
|
+
import { formatClonePlain } from "./helpers";
|
|
5
|
+
import { registerTextFormatter } from "./registry";
|
|
6
|
+
registerTextFormatter("clone", (r) => formatClonePlain(r));
|
|
@@ -0,0 +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/.
|
|
4
|
+
import { formatConfigPlain } from "./helpers";
|
|
5
|
+
import { registerTextFormatter } from "./registry";
|
|
6
|
+
registerTextFormatter("config", (r) => formatConfigPlain(r));
|
|
@@ -0,0 +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/.
|
|
4
|
+
import { formatCuratePlain } from "./helpers";
|
|
5
|
+
import { registerTextFormatter } from "./registry";
|
|
6
|
+
registerTextFormatter("curate", (r, detail) => formatCuratePlain(r, detail));
|