akm-cli 0.10.261012-beta → 0.10.261014-beta
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/CHANGELOG.md +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
package/dist/assets/ui/config.js
CHANGED
|
@@ -34,16 +34,32 @@ function node(key, value, path, sources, depth) {
|
|
|
34
34
|
return html`<li class="leaf"><span class="mono key">${key}</span><span class="leaf-value">${leafValue(value)}</span>${sourceBadge(source)}</li>`;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const rest = (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
/** What a table shows of an entry beyond its named columns, as compact JSON. */
|
|
38
|
+
function otherFields(entry, shown) {
|
|
39
|
+
const rest = Object.fromEntries(Object.entries(entry).filter(([key]) => !shown.includes(key)));
|
|
40
|
+
return Object.keys(rest).length > 0 ? JSON.stringify(rest) : "";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function connectionsTable(connections) {
|
|
44
|
+
if (connections.length === 0) return emptyState("No connections are configured.");
|
|
45
|
+
const aliases = (c) =>
|
|
46
|
+
Object.entries(c.models ?? {})
|
|
47
|
+
.map(([alias, entry]) => `${alias}: ${typeof entry === "string" ? entry : entry.model}`)
|
|
48
|
+
.join(", ");
|
|
49
|
+
return tableWrap(
|
|
50
|
+
html`<table><thead><tr><th>Name</th><th>Endpoint</th><th>Models</th><th>Other</th></tr></thead><tbody>${connections.map(
|
|
51
|
+
(c) =>
|
|
52
|
+
html`<tr><td class="mono">${c.name}</td><td class="mono wrap">${c.endpoint ?? ""}</td><td class="mono wrap">${aliases(c)}</td><td class="mono small wrap">${otherFields(c, ["name", "endpoint", "models"])}</td></tr>`,
|
|
53
|
+
)}</tbody></table>`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function harnessesTable(harnesses) {
|
|
58
|
+
if (harnesses.length === 0) return emptyState("No harnesses are configured.");
|
|
43
59
|
return tableWrap(
|
|
44
|
-
html`<table><thead><tr><th>Name</th><th>
|
|
45
|
-
(
|
|
46
|
-
html`<tr><td class="mono">${
|
|
60
|
+
html`<table><thead><tr><th>Name</th><th>Platform</th><th>Other</th></tr></thead><tbody>${harnesses.map(
|
|
61
|
+
(h) =>
|
|
62
|
+
html`<tr><td class="mono">${h.name}</td><td class="mono">${h.platform ?? h.name}</td><td class="mono small wrap">${otherFields(h, ["name", "platform"])}</td></tr>`,
|
|
47
63
|
)}</tbody></table>`,
|
|
48
64
|
);
|
|
49
65
|
}
|
|
@@ -58,7 +74,8 @@ export async function render() {
|
|
|
58
74
|
])}${data.exists ? "" : html`<p class="muted">There is no config file, so everything below is a default.</p>`}</section>
|
|
59
75
|
<section><h2>Effective config</h2><p class="legend-line">Source: ${sourceBadge("default")} built-in ${sourceBadge("file")} this install's config.json ${sourceBadge("extends:ref")} a config it extends</p>
|
|
60
76
|
${keys.length === 0 ? emptyState("The effective config is empty.") : html`<ul class="tree root">${keys.map((k) => node(k, data.config[k], k, sources, 0))}</ul>`}</section>
|
|
61
|
-
<section><h2>
|
|
77
|
+
<section><h2>Connections</h2>${connectionsTable(data.connections)}</section>
|
|
78
|
+
<section><h2>Harnesses</h2>${harnessesTable(data.harnesses)}</section>
|
|
62
79
|
<section><h2>Environment</h2><p class="muted">AKM_* variables set for the server. They override paths and credentials.</p>${
|
|
63
80
|
data.env.length === 0
|
|
64
81
|
? emptyState("No AKM_* environment variables are set.")
|
|
@@ -37,8 +37,8 @@ first step's attached artifact."
|
|
|
37
37
|
|
|
38
38
|
A `### gate` sub-heading is the step's completion rubric: the judge
|
|
39
39
|
receives this whole section byte-exact. Omit the heading or leave its text
|
|
40
|
-
empty to skip validation. A non-empty rubric
|
|
41
|
-
|
|
40
|
+
empty to skip validation. A non-empty rubric needs a connection or a harness
|
|
41
|
+
to judge it; verifier failures and malformed verdicts reject the
|
|
42
42
|
gate rather than silently skipping it.
|
|
43
43
|
|
|
44
44
|
- Confirm the step accomplished what it set out to do.
|
package/dist/cli/clack.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
import { cancel as realCancel, confirm as realConfirm, intro as realIntro, isCancel as realIsCancel, log as realLog, multiselect as realMultiselect, note as realNote, outro as realOutro, select as realSelect, spinner as realSpinner, text as realText, } from "@clack/prompts";
|
|
4
|
+
import { cancel as realCancel, confirm as realConfirm, intro as realIntro, isCancel as realIsCancel, log as realLog, multiselect as realMultiselect, note as realNote, outro as realOutro, password as realPassword, select as realSelect, spinner as realSpinner, text as realText, } from "@clack/prompts";
|
|
5
5
|
// ── Test seam ────────────────────────────────────────────────────────────────
|
|
6
6
|
// Swap-and-restore override. Inert in production; only tests call the setter
|
|
7
7
|
// (via tests/_helpers/seams.ts `overrideSeam`, never directly).
|
|
@@ -18,6 +18,7 @@ const realFns = {
|
|
|
18
18
|
select: realSelect,
|
|
19
19
|
multiselect: realMultiselect,
|
|
20
20
|
text: realText,
|
|
21
|
+
password: realPassword,
|
|
21
22
|
spinner: realSpinner,
|
|
22
23
|
note: realNote,
|
|
23
24
|
isCancel: realIsCancel,
|
|
@@ -42,6 +43,7 @@ export const confirm = bind("confirm");
|
|
|
42
43
|
export const select = bind("select");
|
|
43
44
|
export const multiselect = bind("multiselect");
|
|
44
45
|
export const text = bind("text");
|
|
46
|
+
export const password = bind("password");
|
|
45
47
|
export const spinner = bind("spinner");
|
|
46
48
|
export const note = bind("note");
|
|
47
49
|
export const isCancel = bind("isCancel");
|
|
@@ -0,0 +1,33 @@
|
|
|
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 { UsageError } from "../core/errors.js";
|
|
5
|
+
import { warnOnce } from "../core/warn.js";
|
|
6
|
+
import { getStringArg } from "./parse-args.js";
|
|
7
|
+
export const SELECTION_ARGS = {
|
|
8
|
+
connection: { type: "string", description: "Run on this connection, by name (default: the default connection)" },
|
|
9
|
+
harness: { type: "string", description: "Run on this harness, by name or platform (default: the default harness)" },
|
|
10
|
+
model: { type: "string", description: "Model to run, by alias (fast, balanced, reasoning) or exact name" },
|
|
11
|
+
};
|
|
12
|
+
/** The retired `--engine`: parsed, left out of `--help` (`withoutHiddenArgs`). Spread it where the flag existed. */
|
|
13
|
+
export const RETIRED_ENGINE_ARG = {
|
|
14
|
+
engine: { type: "string", hidden: true, description: "Retired: use --connection or --harness." },
|
|
15
|
+
};
|
|
16
|
+
export function selectionFromArgs(args) {
|
|
17
|
+
const connection = getStringArg(args, "connection");
|
|
18
|
+
const harness = getStringArg(args, "harness");
|
|
19
|
+
if (connection !== undefined && harness !== undefined) {
|
|
20
|
+
throw new UsageError("--connection and --harness are mutually exclusive. Pick one.", "INVALID_FLAG_VALUE");
|
|
21
|
+
}
|
|
22
|
+
const engine = getStringArg(args, "engine");
|
|
23
|
+
if (engine !== undefined) {
|
|
24
|
+
warnOnce("retired-flag:--engine", "--engine is retired: use --connection or --harness. For now it names a connection by that name, else a harness.");
|
|
25
|
+
}
|
|
26
|
+
const model = getStringArg(args, "model");
|
|
27
|
+
return {
|
|
28
|
+
...(connection !== undefined ? { connection } : {}),
|
|
29
|
+
...(harness !== undefined ? { harness } : {}),
|
|
30
|
+
...(engine !== undefined ? { engine } : {}),
|
|
31
|
+
...(model !== undefined ? { model } : {}),
|
|
32
|
+
};
|
|
33
|
+
}
|
package/dist/cli/shared.js
CHANGED
|
@@ -92,7 +92,7 @@ function extractHint(error) {
|
|
|
92
92
|
* R-067: this used to call `process.exit(exitCode)` directly, which
|
|
93
93
|
* terminates the process synchronously and skips every pending `finally`
|
|
94
94
|
* block up the call stack — including `src/cli.ts`'s own
|
|
95
|
-
* `
|
|
95
|
+
* `disposeLlmUsageSink()` cleanup and citty's per-command `cleanup`
|
|
96
96
|
* hooks. `process.exitCode = exitCode; return;` is equivalent for every
|
|
97
97
|
* caller here: Node/Bun exits with that code once the event loop drains
|
|
98
98
|
* naturally, but cleanup on the way there still runs.
|
|
@@ -183,6 +183,19 @@ export const GLOBAL_OUTPUT_ARGS = {
|
|
|
183
183
|
default: false,
|
|
184
184
|
},
|
|
185
185
|
};
|
|
186
|
+
/**
|
|
187
|
+
* A command with the args marked `hidden` left out: what `--help` renders. A
|
|
188
|
+
* hidden arg parses like any other and is simply not advertised, the way
|
|
189
|
+
* `meta.hidden` keeps a command out of the COMMANDS list. It is for a retired
|
|
190
|
+
* spelling that still works, so a scheduled command written for an earlier
|
|
191
|
+
* release keeps running.
|
|
192
|
+
*/
|
|
193
|
+
export function withoutHiddenArgs(command) {
|
|
194
|
+
const args = command.args;
|
|
195
|
+
if (!args)
|
|
196
|
+
return command;
|
|
197
|
+
return { ...command, args: Object.fromEntries(Object.entries(args).filter(([, def]) => def.hidden !== true)) };
|
|
198
|
+
}
|
|
186
199
|
/**
|
|
187
200
|
* Define a citty command whose `run` body is automatically wrapped in
|
|
188
201
|
* `runWithJsonErrors`, so the handler emits a byte-identical JSON error
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
* by a `meta.name` alias rather than its key takes the stand-down path (no
|
|
26
26
|
* validation) — conservative by design.
|
|
27
27
|
*/
|
|
28
|
+
import { closestMatch } from "../core/closest-match.js";
|
|
28
29
|
import { UsageError } from "../core/errors.js";
|
|
29
30
|
import { warn } from "../core/warn.js";
|
|
30
31
|
import { cittyComparableName, findCittyTopLevelCommandIndex, toAliasArray, } from "./invocation.js";
|
|
@@ -61,7 +62,8 @@ function collectKnownArgs(root, rawArgs) {
|
|
|
61
62
|
// Shared args (GLOBAL_OUTPUT_ARGS) recur at every level; suggest each once.
|
|
62
63
|
if (!names.has(comparable)) {
|
|
63
64
|
names.add(comparable);
|
|
64
|
-
|
|
65
|
+
if (def.hidden !== true)
|
|
66
|
+
displayNames.push(`--${key}`);
|
|
65
67
|
}
|
|
66
68
|
if (def.type === "string" || def.type === "enum")
|
|
67
69
|
valueFlags.add(comparable);
|
|
@@ -100,37 +102,6 @@ function collectKnownArgs(root, rawArgs) {
|
|
|
100
102
|
}
|
|
101
103
|
return { names, valueFlags, booleanFlags, displayNames, path, resolved: true };
|
|
102
104
|
}
|
|
103
|
-
/** Single-row-at-a-time edit-distance DP (inputs are short flag/command names). */
|
|
104
|
-
function editDistance(a, b) {
|
|
105
|
-
let previous = Array.from({ length: b.length + 1 }, (_, j) => j);
|
|
106
|
-
for (let i = 1; i <= a.length; i += 1) {
|
|
107
|
-
const current = [i];
|
|
108
|
-
for (let j = 1; j <= b.length; j += 1) {
|
|
109
|
-
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
110
|
-
current.push(Math.min((previous[j] ?? 0) + 1, (current[j - 1] ?? 0) + 1, (previous[j - 1] ?? 0) + cost));
|
|
111
|
-
}
|
|
112
|
-
previous = current;
|
|
113
|
-
}
|
|
114
|
-
return previous[b.length] ?? 0;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Closest candidate within `threshold` edit distance, or undefined when
|
|
118
|
-
* nothing is close enough to be worth suggesting. Shared by the unknown-flag
|
|
119
|
-
* and unknown-command (src/cli.ts) did-you-mean paths, which pick different
|
|
120
|
-
* thresholds.
|
|
121
|
-
*/
|
|
122
|
-
export function closestMatch(attempted, candidates, threshold) {
|
|
123
|
-
let best;
|
|
124
|
-
let bestDistance = Number.POSITIVE_INFINITY;
|
|
125
|
-
for (const candidate of candidates) {
|
|
126
|
-
const distance = editDistance(attempted, candidate);
|
|
127
|
-
if (distance < bestDistance) {
|
|
128
|
-
bestDistance = distance;
|
|
129
|
-
best = candidate;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return best !== undefined && bestDistance <= threshold ? best : undefined;
|
|
133
|
-
}
|
|
134
105
|
/**
|
|
135
106
|
* The one unknown-flag rejection, shared by the short- and long-flag scans so
|
|
136
107
|
* the user-facing error contract cannot drift between them. No explicit hint
|
|
@@ -164,13 +135,11 @@ export function assertKnownFlags(root, rawArgs) {
|
|
|
164
135
|
// `workflow run`, `task run`, and `task explain` each own one deliberately
|
|
165
136
|
// dynamic namespace: long options become exact-name parameter/input flags
|
|
166
137
|
// and are checked against the frozen plan / task source's own contract
|
|
167
|
-
// before this gate would otherwise reject them (
|
|
168
|
-
// docs/plans/specs/p2a-task-source-v4.md §5.1 — task run's
|
|
138
|
+
// before this gate would otherwise reject them (task run's
|
|
169
139
|
// UNKNOWN_FLAG/INPUT_BINDING_INVALID must be raised from INSIDE the command
|
|
170
140
|
// body, where runWithJsonErrors renders the JSON envelope, not from this
|
|
171
|
-
// generic pre-dispatch gate;
|
|
172
|
-
//
|
|
173
|
-
// scanner, so it needs the identical exemption).
|
|
141
|
+
// generic pre-dispatch gate; `task explain` reuses the identical
|
|
142
|
+
// `parseTaskInputFlags` scanner, so it needs the identical exemption).
|
|
174
143
|
const dynamicNamedFlagCommands = new Set(["workflow run", "task run", "task explain"]);
|
|
175
144
|
const dynamicWorkflowParams = dynamicNamedFlagCommands.has(known.path.join(" "));
|
|
176
145
|
const tolerant = UNKNOWN_FLAG_TOLERANT_COMMANDS.has(known.path.join(" "));
|
package/dist/cli.js
CHANGED
|
@@ -58,8 +58,8 @@ process.on("uncaughtException", (err) => {
|
|
|
58
58
|
import fs from "node:fs";
|
|
59
59
|
import { defineCommand, parseArgs, renderUsage, runCommand, showUsage } from "citty";
|
|
60
60
|
import { findCittyTopLevelCommandIndex, getParsedInvocation, parseAllFlagValues, resolveHelpMigrateVersionArg, setParsedInvocation, } from "./cli/invocation.js";
|
|
61
|
-
import { defineGroupCommand, EXIT_CODES, emitJsonError, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors, } from "./cli/shared.js";
|
|
62
|
-
import { assertKnownFlags
|
|
61
|
+
import { defineGroupCommand, EXIT_CODES, emitJsonError, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors, withoutHiddenArgs, } from "./cli/shared.js";
|
|
62
|
+
import { assertKnownFlags } from "./cli/unknown-flags.js";
|
|
63
63
|
import { agentCommand, lintCommand } from "./commands/agent/contribute-cli.js";
|
|
64
64
|
import { commandCommand } from "./commands/command/command-cli.js";
|
|
65
65
|
import { generateBashCompletions, installBashCompletions } from "./commands/completions.js";
|
|
@@ -68,6 +68,7 @@ import { envCommand } from "./commands/env/env-cli.js";
|
|
|
68
68
|
import { secretCommand } from "./commands/env/secret-cli.js";
|
|
69
69
|
import { feedbackCommand } from "./commands/feedback-cli.js";
|
|
70
70
|
import { akmHealth } from "./commands/health.js";
|
|
71
|
+
import { closestMatch } from "./core/closest-match.js";
|
|
71
72
|
import "./commands/health/renderers.js";
|
|
72
73
|
import "./commands/metrics/md-report.js";
|
|
73
74
|
import { parseWindowSpec } from "./commands/health/windows.js";
|
|
@@ -95,7 +96,6 @@ import { getConfigPath } from "./core/paths.js";
|
|
|
95
96
|
import { DURATION_UNITS, parseDuration } from "./core/time.js";
|
|
96
97
|
import { plainize } from "./core/tty.js";
|
|
97
98
|
import { info, isQuiet, setQuiet, setVerbose, warn } from "./core/warn.js";
|
|
98
|
-
import { disposeDispatchResources } from "./integrations/agent/runner-dispatch.js";
|
|
99
99
|
import { installLlmUsagePersistenceIfAbsent } from "./llm/usage-persist.js";
|
|
100
100
|
import { EMBEDDED_HINTS, EMBEDDED_HINTS_FULL } from "./output/cli-hints.js";
|
|
101
101
|
import { getOutputMode, initOutputMode, parseDetailLevel } from "./output/context.js";
|
|
@@ -120,8 +120,8 @@ function applyEarlyStderrFlags(argv) {
|
|
|
120
120
|
* Default --format is `json`, so a CI or piped consumer sees only the JSON on
|
|
121
121
|
* stdout. But an interactive user running `akm setup --yes` would otherwise
|
|
122
122
|
* see only the JSON blob with no obvious next step. When stderr is a TTY and
|
|
123
|
-
* the JSON went to stdout, print a
|
|
124
|
-
*
|
|
123
|
+
* the JSON went to stdout, print a short summary to stderr telling the user
|
|
124
|
+
* (a) where the stash landed, (b) what runs where, and (c) what to run next.
|
|
125
125
|
*
|
|
126
126
|
* Silent when: stderr is not a TTY (CI, pipes), --format=text/yaml (the user
|
|
127
127
|
* already gets readable output), --quiet, or the result is missing fields.
|
|
@@ -136,7 +136,10 @@ function printSetupTtyHint(result) {
|
|
|
136
136
|
return;
|
|
137
137
|
if (!result?.bundleDir)
|
|
138
138
|
return;
|
|
139
|
-
|
|
139
|
+
const runs = result.runs
|
|
140
|
+
? ` Model calls: ${result.runs.modelCalls}\n Agent work: ${result.runs.agentWork}\n Embeddings: ${result.runs.embeddings}\n`
|
|
141
|
+
: "";
|
|
142
|
+
console.error(plainize(`\n✓ Bundle created at ${result.bundleDir}\n${runs}` +
|
|
140
143
|
' Next: `akm bundle add <source>`, `akm index`, `akm search "<query>"`, `akm hints`'));
|
|
141
144
|
}
|
|
142
145
|
/**
|
|
@@ -149,7 +152,7 @@ function printSetupTtyHint(result) {
|
|
|
149
152
|
const setupCommand = defineCommand({
|
|
150
153
|
meta: {
|
|
151
154
|
name: "setup",
|
|
152
|
-
description: "Interactive configuration wizard.
|
|
155
|
+
description: "Interactive configuration wizard. Enables agent programs (Claude Code, Codex, OpenCode, ...), sets up a model connection and embeddings, and picks bundle sources and registries. Flags answer individual questions; --yes takes the detected default for the rest, for scripting.",
|
|
153
156
|
},
|
|
154
157
|
args: {
|
|
155
158
|
// R-051/S11: `setup` is a raw `defineCommand` (not `defineJsonCommand`),
|
|
@@ -157,9 +160,33 @@ const setupCommand = defineCommand({
|
|
|
157
160
|
// already had. Three of its four run branches call `output()`; spreading
|
|
158
161
|
// this in is a `--help` visibility fix, not a behavior change.
|
|
159
162
|
...GLOBAL_OUTPUT_ARGS,
|
|
160
|
-
|
|
163
|
+
endpoint: {
|
|
161
164
|
type: "string",
|
|
162
|
-
description:
|
|
165
|
+
description: "OpenAI-compatible endpoint to add or update as a connection (the first is named default), e.g. http://localhost:11434/v1",
|
|
166
|
+
},
|
|
167
|
+
"api-key-env": {
|
|
168
|
+
type: "string",
|
|
169
|
+
description: "Name of the environment variable holding the connection's API key; the connection gets apiKey: $NAME. Keys are never passed on the command line.",
|
|
170
|
+
},
|
|
171
|
+
name: {
|
|
172
|
+
type: "string",
|
|
173
|
+
description: "Name for a further connection (with --endpoint); the first connection is named default",
|
|
174
|
+
},
|
|
175
|
+
harness: {
|
|
176
|
+
type: "string",
|
|
177
|
+
description: "Agent programs to enable, comma-separated (claude,codex,opencode,...); the first is the default",
|
|
178
|
+
},
|
|
179
|
+
embedding: {
|
|
180
|
+
type: "string",
|
|
181
|
+
description: "Embeddings: a model the connection serves, local (the built-in embedder), or off",
|
|
182
|
+
},
|
|
183
|
+
"embedding-endpoint": {
|
|
184
|
+
type: "string",
|
|
185
|
+
description: "Another endpoint that serves the --embedding model",
|
|
186
|
+
},
|
|
187
|
+
"embedding-api-key-env": {
|
|
188
|
+
type: "string",
|
|
189
|
+
description: "Name of the environment variable holding the embedding endpoint's API key",
|
|
163
190
|
},
|
|
164
191
|
from: {
|
|
165
192
|
type: "string",
|
|
@@ -168,11 +195,11 @@ const setupCommand = defineCommand({
|
|
|
168
195
|
yes: {
|
|
169
196
|
type: "boolean",
|
|
170
197
|
default: false,
|
|
171
|
-
description: "
|
|
198
|
+
description: "Take the detected default for every question no flag answers; no prompts. Idempotent — safe to run in CI.",
|
|
172
199
|
},
|
|
173
200
|
dir: {
|
|
174
201
|
type: "string",
|
|
175
|
-
description: "Bundle directory path (overrides defaultBundle in config
|
|
202
|
+
description: "Bundle directory path (overrides defaultBundle in config)",
|
|
176
203
|
},
|
|
177
204
|
// Declared as the POSITIVE name with `default: true` so citty's native
|
|
178
205
|
// `--no-<name>` negation (it strips a leading `--no-` from ANY token and
|
|
@@ -186,19 +213,32 @@ const setupCommand = defineCommand({
|
|
|
186
213
|
default: true,
|
|
187
214
|
description: "Scaffold the bundle directory. Use --no-init to write configuration without scaffolding it.",
|
|
188
215
|
},
|
|
189
|
-
probe
|
|
216
|
+
// There is no `--probe`: probing is the default, so only the opt-out is declared. citty parses `--no-probe`
|
|
217
|
+
// as the negation of `probe` whether or not `probe` is declared, so the value is `args.probe === false`;
|
|
218
|
+
// declaring `no-probe` is what puts the flag in `--help` and keeps the unknown-flag check from refusing it.
|
|
219
|
+
"no-probe": {
|
|
190
220
|
type: "boolean",
|
|
191
|
-
|
|
192
|
-
description: "Probe LLM/embedding endpoints before writing config to verify connectivity",
|
|
221
|
+
description: "Offline run: the endpoint is not contacted and its models are not listed. A connection added this way has no model until one is named with `akm models set`; the picks it already has are kept.",
|
|
193
222
|
},
|
|
194
223
|
},
|
|
195
224
|
async run({ args }) {
|
|
196
225
|
await runWithJsonErrors(async () => {
|
|
197
226
|
const noInit = !args.init;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
227
|
+
const noProbe = args.probe === false;
|
|
228
|
+
const { hasSetupFlags, parseSetupFlags } = await import("./setup/setup-flags.js");
|
|
229
|
+
const flags = parseSetupFlags({
|
|
230
|
+
endpoint: args.endpoint,
|
|
231
|
+
apiKeyEnv: args["api-key-env"],
|
|
232
|
+
name: args.name,
|
|
233
|
+
harness: args.harness,
|
|
234
|
+
embedding: args.embedding,
|
|
235
|
+
embeddingEndpoint: args["embedding-endpoint"],
|
|
236
|
+
embeddingApiKeyEnv: args["embedding-api-key-env"],
|
|
237
|
+
});
|
|
201
238
|
if (args.from) {
|
|
239
|
+
if (hasSetupFlags(flags) && !args.yes) {
|
|
240
|
+
throw new UsageError("--from takes --endpoint, --harness and the other answer flags only with --yes.", "INVALID_FLAG_VALUE");
|
|
241
|
+
}
|
|
202
242
|
// File-based bootstrap. `loadSetupConfigFromFile` expands a leading
|
|
203
243
|
// `~`, resolves relative paths against cwd, picks the YAML or JSON
|
|
204
244
|
// parser based on the file extension, and surfaces any
|
|
@@ -211,21 +251,8 @@ const setupCommand = defineCommand({
|
|
|
211
251
|
configJson: loaded.configJson,
|
|
212
252
|
dir: args.dir,
|
|
213
253
|
noInit,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
});
|
|
217
|
-
output("setup", result);
|
|
218
|
-
printSetupTtyHint(result);
|
|
219
|
-
}
|
|
220
|
-
else if (args.config) {
|
|
221
|
-
// Non-interactive config mode. With `--yes`, defaults fill any keys
|
|
222
|
-
// the JSON blob leaves missing after the deep merge.
|
|
223
|
-
const { runSetupFromConfig } = await import("./setup/setup.js");
|
|
224
|
-
const result = await runSetupFromConfig({
|
|
225
|
-
configJson: args.config,
|
|
226
|
-
dir: args.dir,
|
|
227
|
-
noInit,
|
|
228
|
-
probe: args.probe,
|
|
254
|
+
noProbe,
|
|
255
|
+
flags,
|
|
229
256
|
applyDefaults: args.yes,
|
|
230
257
|
});
|
|
231
258
|
output("setup", result);
|
|
@@ -234,11 +261,7 @@ const setupCommand = defineCommand({
|
|
|
234
261
|
else if (args.yes) {
|
|
235
262
|
// Defaults mode — no prompts
|
|
236
263
|
const { runSetupWithDefaults } = await import("./setup/setup.js");
|
|
237
|
-
const result = await runSetupWithDefaults({
|
|
238
|
-
dir: args.dir,
|
|
239
|
-
noInit,
|
|
240
|
-
probe: args.probe,
|
|
241
|
-
});
|
|
264
|
+
const result = await runSetupWithDefaults({ dir: args.dir, noInit, noProbe, flags });
|
|
242
265
|
output("setup", result);
|
|
243
266
|
printSetupTtyHint(result);
|
|
244
267
|
}
|
|
@@ -248,10 +271,10 @@ const setupCommand = defineCommand({
|
|
|
248
271
|
// first prompt and then block forever instead of failing — and `akm
|
|
249
272
|
// setup` is the first command users automate.
|
|
250
273
|
if (process.stdin.isTTY !== true) {
|
|
251
|
-
throw new UsageError("Interactive setup requires a TTY. Pass --yes to
|
|
274
|
+
throw new UsageError("Interactive setup requires a TTY. Pass --yes to take the detected defaults (flags such as --endpoint answer questions), or --from <file> to configure from a file.", "NON_INTERACTIVE_REQUIRES_YES");
|
|
252
275
|
}
|
|
253
276
|
const { runSetupWizard } = await import("./setup/setup.js");
|
|
254
|
-
await runSetupWizard({ dir: args.dir, noInit });
|
|
277
|
+
await runSetupWizard({ dir: args.dir, noInit, noProbe, flags });
|
|
255
278
|
}
|
|
256
279
|
});
|
|
257
280
|
},
|
|
@@ -298,8 +321,8 @@ const healthCommand = defineCommand({
|
|
|
298
321
|
probe: {
|
|
299
322
|
type: "boolean",
|
|
300
323
|
default: true,
|
|
301
|
-
description: "Probe
|
|
302
|
-
negativeDescription: "Skip the reachability probes, the update check, and the scheduler-binary version check (for an offline or air-gapped host).",
|
|
324
|
+
description: "Probe configured connections for reachability and run each harness's `--version`, check for a newer akm release, look up the newest Claude plugin tag, and check the scheduler's recorded akm binary version (on by default).",
|
|
325
|
+
negativeDescription: "Skip the reachability probes, the harness `--version` runs, the update check, the Claude plugin tag lookup, and the scheduler-binary version check (for an offline or air-gapped host).",
|
|
303
326
|
},
|
|
304
327
|
},
|
|
305
328
|
async run({ args }) {
|
|
@@ -464,6 +487,7 @@ const commands = {
|
|
|
464
487
|
registry: registryCommand,
|
|
465
488
|
migrate: migrateCommand,
|
|
466
489
|
config: configCommand,
|
|
490
|
+
models: modelsCommand,
|
|
467
491
|
feedback: feedbackCommand,
|
|
468
492
|
log: logCommand,
|
|
469
493
|
agent: agentCommand,
|
|
@@ -475,14 +499,13 @@ const commands = {
|
|
|
475
499
|
env: envCommand,
|
|
476
500
|
secret: secretCommand,
|
|
477
501
|
task: taskCommand,
|
|
478
|
-
models: modelsCommand,
|
|
479
502
|
hints: hintsCommand,
|
|
480
503
|
};
|
|
481
504
|
function commandHelpTopic(name, command) {
|
|
482
505
|
return defineCommand({
|
|
483
506
|
meta: { name, description: `Print help for akm ${name}` },
|
|
484
507
|
async run() {
|
|
485
|
-
await showUsage(command, buildUsageParentForPath([name]));
|
|
508
|
+
await showUsage(withoutHiddenArgs(command), buildUsageParentForPath([name]));
|
|
486
509
|
},
|
|
487
510
|
});
|
|
488
511
|
}
|
|
@@ -571,8 +594,7 @@ export const main = defineCommand({
|
|
|
571
594
|
});
|
|
572
595
|
const MAIN_TOP_LEVEL_ARGS = main.args;
|
|
573
596
|
/**
|
|
574
|
-
*
|
|
575
|
-
* `akm task run`'s input-flags coverage can pin that an undeclared,
|
|
597
|
+
* Exported so `akm task run`'s input-flags coverage can pin that an undeclared,
|
|
576
598
|
* per-task dynamic flag (e.g. `--scope all`) does not change this
|
|
577
599
|
* classification — it parses only `args.id` off the declared args and
|
|
578
600
|
* tolerates extra tokens (citty's non-strict `parseArgs`).
|
|
@@ -1066,7 +1088,7 @@ export async function runCli() {
|
|
|
1066
1088
|
}
|
|
1067
1089
|
else {
|
|
1068
1090
|
const path = resolveCittyCommandPath(main, rawArgs);
|
|
1069
|
-
await showUsage(resolved, buildUsageParentForPath(path));
|
|
1091
|
+
await showUsage(withoutHiddenArgs(resolved), buildUsageParentForPath(path));
|
|
1070
1092
|
}
|
|
1071
1093
|
return;
|
|
1072
1094
|
}
|
|
@@ -1099,14 +1121,13 @@ export async function runCli() {
|
|
|
1099
1121
|
// could ever reach this boundary. Route it the same way rather than
|
|
1100
1122
|
// hard-coding GENERAL(1): the CLI contract reserves 1 for general/not-found
|
|
1101
1123
|
// and requires a non-`AkmError` throw to render the JSON failure envelope
|
|
1102
|
-
// with INTERNAL(70)
|
|
1124
|
+
// with INTERNAL(70), which is what lets
|
|
1103
1125
|
// automation tell an internal defect apart from an ordinary failure.
|
|
1104
1126
|
// `emitJsonError` classifies and sets `process.exitCode` itself.
|
|
1105
1127
|
emitJsonError(error);
|
|
1106
1128
|
}
|
|
1107
1129
|
finally {
|
|
1108
1130
|
disposeLlmUsageSink();
|
|
1109
|
-
await disposeDispatchResources();
|
|
1110
1131
|
}
|
|
1111
1132
|
}
|
|
1112
1133
|
// Only run the CLI when this module is the direct entry point. When it is
|
|
@@ -4,23 +4,24 @@
|
|
|
4
4
|
import { UsageError } from "../../core/errors.js";
|
|
5
5
|
import { warn } from "../../core/warn.js";
|
|
6
6
|
import { isPortableExecutionAgentSelector } from "../../execution/source.js";
|
|
7
|
-
import { fallbackAnnouncement, NO_ENGINE_MESSAGE_SUFFIX, NO_ENGINE_REMEDY, withEngineFallback, } from "../../integrations/agent/engine-fallback.js";
|
|
8
7
|
import { executeInteractiveAgentInvocation } from "../../integrations/agent/runner-dispatch.js";
|
|
9
8
|
import { executeCommandInvocation } from "../command/command-execution.js";
|
|
10
9
|
function canonicalCurrent(options) {
|
|
11
10
|
const current = {};
|
|
12
11
|
if (options.agentRef !== undefined)
|
|
13
12
|
current.agent = options.agentRef;
|
|
14
|
-
if (options.
|
|
15
|
-
current.
|
|
13
|
+
if (options.selection?.connection !== undefined)
|
|
14
|
+
current.connection = options.selection.connection;
|
|
15
|
+
if (options.selection?.harness !== undefined)
|
|
16
|
+
current.harness = options.selection.harness;
|
|
17
|
+
if (options.selection?.engine !== undefined)
|
|
18
|
+
current.engine = options.selection.engine;
|
|
16
19
|
if (options.selection?.model !== undefined)
|
|
17
20
|
current.model = options.selection.model;
|
|
18
21
|
if (Object.hasOwn(options.selection ?? {}, "inference"))
|
|
19
22
|
current.inference = options.selection?.inference;
|
|
20
23
|
if (options.selection?.outputSchema !== undefined)
|
|
21
24
|
current.outputSchema = options.selection.outputSchema;
|
|
22
|
-
if (options.selection?.tools !== undefined)
|
|
23
|
-
current.tools = options.selection.tools;
|
|
24
25
|
if (options.timeoutMs !== undefined)
|
|
25
26
|
current.timeout = options.timeoutMs;
|
|
26
27
|
if (options.cwd !== undefined)
|
|
@@ -53,30 +54,22 @@ async function delegateCanonicalCommand(options, seams, action) {
|
|
|
53
54
|
}
|
|
54
55
|
export async function akmAgentDispatch(options, seams = {}) {
|
|
55
56
|
if (!options.agentConfig)
|
|
56
|
-
throw new UsageError("agent requires a valid config with
|
|
57
|
+
throw new UsageError("agent requires a valid config with a harness or connection.", "MISSING_REQUIRED_ARGUMENT");
|
|
57
58
|
rejectInvalidAgentRef(options.agentRef);
|
|
58
|
-
|
|
59
|
-
if (options.prompt !== undefined || hasResolvedSelection) {
|
|
60
|
-
if (options.prompt === undefined) {
|
|
61
|
-
throw new UsageError("Agent persona/model/tool/schema/inference selection requires an explicit task from --prompt or --prompt-stdin; it cannot fabricate an empty command. Omit those selections for a prompt-free interactive launch.", "MISSING_REQUIRED_ARGUMENT");
|
|
62
|
-
}
|
|
59
|
+
if (options.prompt !== undefined)
|
|
63
60
|
return delegateCanonicalCommand(options, seams, { content: options.prompt });
|
|
61
|
+
// No prompt: the harness is started for a person. Only where and which model ride along; the rest needs a task.
|
|
62
|
+
const { connection, harness, engine, model, ...needsTask } = options.selection ?? {};
|
|
63
|
+
if (options.agentRef !== undefined || Object.keys(needsTask).length > 0) {
|
|
64
|
+
throw new UsageError("An agent persona, inference setting or output schema applies to a task: pass --prompt or --prompt-stdin. Without a prompt only the harness (and a model) is started.", "MISSING_REQUIRED_ARGUMENT");
|
|
64
65
|
}
|
|
65
|
-
// Same implicit opencode-sdk fallback the workflow and task surfaces apply,
|
|
66
|
-
// so an engine-less install is usable everywhere or nowhere — not a mix.
|
|
67
|
-
const { config: agentConfig, fallbackEngineName } = withEngineFallback(options.agentConfig);
|
|
68
|
-
const engineName = options.engine ?? agentConfig.defaults?.engine;
|
|
69
|
-
// Announced, never silent: `options.engine` outranks the default, so the
|
|
70
|
-
// fallback is only reportable when it is the engine actually selected.
|
|
71
|
-
const engineAnnouncement = fallbackAnnouncement(fallbackEngineName, engineName);
|
|
72
|
-
if (engineAnnouncement)
|
|
73
|
-
warn(engineAnnouncement);
|
|
74
|
-
if (!engineName)
|
|
75
|
-
throw new UsageError(`agent ${NO_ENGINE_MESSAGE_SUFFIX} ${NO_ENGINE_REMEDY}`, "MISSING_REQUIRED_ARGUMENT");
|
|
76
66
|
const executeInteractive = seams.executeInteractive ?? executeInteractiveAgentInvocation;
|
|
77
67
|
const execution = await executeInteractive({
|
|
78
|
-
config: agentConfig,
|
|
79
|
-
|
|
68
|
+
config: options.agentConfig,
|
|
69
|
+
...(typeof connection === "string" ? { connection } : {}),
|
|
70
|
+
...(typeof harness === "string" ? { harness } : {}),
|
|
71
|
+
...(typeof engine === "string" ? { engine } : {}),
|
|
72
|
+
...(typeof model === "string" ? { model } : {}),
|
|
80
73
|
...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),
|
|
81
74
|
...(options.cwd !== undefined ? { cwd: options.cwd } : {}),
|
|
82
75
|
});
|
|
@@ -92,6 +85,5 @@ export async function akmAgentDispatch(options, seams = {}) {
|
|
|
92
85
|
durationMs: result.durationMs,
|
|
93
86
|
...(result.error !== undefined ? { error: result.error } : {}),
|
|
94
87
|
...(result.reason !== undefined ? { reason: result.reason } : {}),
|
|
95
|
-
...(engineAnnouncement ? { warnings: [engineAnnouncement] } : {}),
|
|
96
88
|
};
|
|
97
89
|
}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
import fs from "node:fs";
|
|
24
24
|
import { defineCommand } from "citty";
|
|
25
25
|
import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
|
|
26
|
+
import { RETIRED_ENGINE_ARG, SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
|
|
26
27
|
import { EXIT_CODES, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
|
|
27
28
|
import { loadConfig } from "../../core/config/config.js";
|
|
28
29
|
import { UsageError } from "../../core/errors.js";
|
|
@@ -36,13 +37,13 @@ export function readPromptStdin(read = () => fs.readFileSync(0, "utf8")) {
|
|
|
36
37
|
export const agentCommand = defineCommand({
|
|
37
38
|
meta: {
|
|
38
39
|
name: "agent",
|
|
39
|
-
description: "Dispatch an agent CLI (opencode, claude, …) with an optional agent persona and model defaults. Use --prompt for work;
|
|
40
|
+
description: "Dispatch an agent CLI (opencode, claude, …) with an optional agent persona and model defaults. Use --prompt for work; without one the harness starts interactively. Stored commands run through akm command run.",
|
|
40
41
|
},
|
|
41
42
|
args: {
|
|
42
43
|
...GLOBAL_OUTPUT_ARGS,
|
|
43
44
|
"agent-ref": {
|
|
44
45
|
type: "positional",
|
|
45
|
-
description: "Optional agent asset ref (e.g. agents/code-reviewer). Resolves persona and model defaults
|
|
46
|
+
description: "Optional agent asset ref (e.g. agents/code-reviewer). Resolves persona and model defaults.",
|
|
46
47
|
required: false,
|
|
47
48
|
},
|
|
48
49
|
prompt: { type: "string", description: "Task prompt to pass to the agent" },
|
|
@@ -51,10 +52,11 @@ export const agentCommand = defineCommand({
|
|
|
51
52
|
description: "Read the task prompt from stdin (mutually exclusive with --prompt)",
|
|
52
53
|
default: false,
|
|
53
54
|
},
|
|
54
|
-
|
|
55
|
+
...SELECTION_ARGS,
|
|
56
|
+
...RETIRED_ENGINE_ARG,
|
|
55
57
|
model: {
|
|
56
|
-
|
|
57
|
-
description:
|
|
58
|
+
...SELECTION_ARGS.model,
|
|
59
|
+
description: `${SELECTION_ARGS.model.description}. Overrides the model specified in the agent asset.`,
|
|
58
60
|
},
|
|
59
61
|
"timeout-ms": { type: "string", description: "Override the agent CLI timeout in milliseconds" },
|
|
60
62
|
cwd: {
|
|
@@ -77,14 +79,13 @@ export const agentCommand = defineCommand({
|
|
|
77
79
|
const cwd = getStringArg(args, "cwd");
|
|
78
80
|
// The common invocation resolver loads a selected agent through its
|
|
79
81
|
// owning bundle adapter. This CLI never re-reads/show-projects the file.
|
|
80
|
-
const
|
|
82
|
+
const selection = selectionFromArgs(args);
|
|
81
83
|
const stdinPrompt = promptStdin ? readPromptStdin() : undefined;
|
|
82
84
|
const result = await akmAgentDispatch({
|
|
83
|
-
engine: getStringArg(args, "engine"),
|
|
84
85
|
prompt: stdinPrompt ?? promptText,
|
|
85
86
|
...(agentRef === undefined ? {} : { agentRef }),
|
|
86
87
|
agentConfig,
|
|
87
|
-
...(
|
|
88
|
+
...(Object.keys(selection).length === 0 ? {} : { selection }),
|
|
88
89
|
...(cwd ? { cwd } : {}),
|
|
89
90
|
...(timeoutMs !== undefined && Number.isFinite(timeoutMs) ? { timeoutMs } : {}),
|
|
90
91
|
});
|