akm-cli 0.10.261013-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 +494 -3
- package/README.md +15 -0
- package/SECURITY.md +9 -8
- package/STABILITY.md +45 -49
- package/dist/assets/hints/cli-hints-full.md +15 -12
- 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/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-cli.js +2 -2
- package/dist/commands/env/secret-cli.js +2 -2
- 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/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 -15
- package/dist/commands/improve/eligibility.js +1 -1
- 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/index.js +2 -2
- 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 +2 -2
- 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 +2 -4
- package/dist/commands/remember.js +25 -40
- 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 +2 -2
- 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 -8
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +103 -68
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +37 -41
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +1 -27
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +1 -1
- package/dist/commands/workflow-cli.js +3 -4
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +33 -38
- package/dist/core/adapter/adapters/akm-lint.js +7 -8
- package/dist/core/adapter/adapters/akm-task-adapter.js +3 -3
- 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 +3 -3
- 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/closest-match.js +37 -0
- package/dist/core/common.js +33 -5
- 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 +385 -93
- 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 +41 -22
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +7 -7
- 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/errors.js +9 -15
- 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 +32 -4
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +78 -52
- 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/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 +19 -6
- package/dist/indexer/installations.js +11 -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 +6 -8
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +40 -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/walker.js +14 -4
- 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 +154 -178
- package/dist/integrations/agent/runner.js +20 -72
- 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 -24
- 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 -7
- package/dist/output/shapes/helpers.js +18 -42
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +29 -37
- 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-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +7 -8
- 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 +5280 -4263
- package/dist/scripts/akm-migrate.js +5280 -4263
- 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.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 +1 -5
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- 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/workflow-runs-repository.js +8 -15
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +5 -5
- package/dist/tasks/prepare/prepare.js +5 -5
- package/dist/tasks/prepare/script-capture.js +3 -5
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +8 -13
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -13
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +12 -19
- 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/source/bounded-document.js +31 -76
- 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 +47 -68
- 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/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +0 -2
- package/dist/workflows/exec/dispatch-redaction.js +14 -83
- package/dist/workflows/exec/environment.js +2 -3
- package/dist/workflows/exec/exec-unit.js +10 -59
- package/dist/workflows/exec/frozen-judge.js +10 -26
- package/dist/workflows/exec/native-executor.js +56 -45
- package/dist/workflows/exec/run-workflow.js +7 -24
- package/dist/workflows/exec/step-work.js +9 -14
- package/dist/workflows/exec/unit-dispatch.js +6 -13
- package/dist/workflows/freeze/freeze.js +14 -32
- package/dist/workflows/freeze/step-values.js +5 -11
- package/dist/workflows/freeze/targets/command.js +3 -6
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +44 -34
- package/dist/workflows/plan.js +3 -1
- package/dist/workflows/renderer.js +6 -5
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +2 -1
- package/dist/workflows/runtime/runs.js +14 -9
- 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 +282 -98
- 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 +45 -12
- package/docs/architecture/persisted-data-compat.md +9 -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 +164 -42
- package/docs/architecture/workflow-engine.md +17 -14
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +1 -3
- package/docs/guides/author-workflows.md +61 -73
- package/docs/guides/bundles.md +4 -5
- 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 +6 -9
- 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 +0 -3
- 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 +295 -59
- 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 +356 -279
- package/docs/reference/configuration.md +569 -557
- package/docs/reference/data-and-telemetry.md +8 -5
- package/docs/reference/env-and-secrets.md +11 -5
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +6 -27
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +11 -8
- package/docs/reference/ui-api.md +11 -6
- package/docs/reference/workflow-schema.md +106 -134
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +2 -0
- 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/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/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 -335
- 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/exec/lowering-notices.js +0 -23
- 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 -544
- 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 -187
- 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 -3379
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1702
- 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
|
@@ -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
|
});
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
|
|
5
|
+
import { RETIRED_ENGINE_ARG, SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
|
|
5
6
|
import { defineGroupCommand, defineJsonCommand, EXIT_CODES, output } from "../../cli/shared.js";
|
|
6
7
|
import { loadConfig } from "../../core/config/config.js";
|
|
7
8
|
import { isVerbose, setVerbose, warn, warnVerbose } from "../../core/warn.js";
|
|
@@ -30,8 +31,8 @@ export const commandRunCommand = defineJsonCommand({
|
|
|
30
31
|
type: "string",
|
|
31
32
|
description: "Override the command's agent selector with a portable agent ref or native harness selector",
|
|
32
33
|
},
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
...SELECTION_ARGS,
|
|
35
|
+
...RETIRED_ENGINE_ARG,
|
|
35
36
|
"timeout-ms": { type: "string", description: "Override the execution timeout in milliseconds" },
|
|
36
37
|
cwd: { type: "string", description: "Override the execution workspace/current working directory" },
|
|
37
38
|
"dry-run": {
|
|
@@ -46,15 +47,10 @@ export const commandRunCommand = defineJsonCommand({
|
|
|
46
47
|
const timeoutMs = parsePositiveIntFlag(exactStringArg(args, "timeout-ms"), "--timeout-ms");
|
|
47
48
|
const current = {};
|
|
48
49
|
const agent = getStringArg(args, "agent");
|
|
49
|
-
const engine = getStringArg(args, "engine");
|
|
50
|
-
const model = getStringArg(args, "model");
|
|
51
50
|
const workspace = getStringArg(args, "cwd");
|
|
52
51
|
if (agent !== undefined)
|
|
53
52
|
current.agent = agent;
|
|
54
|
-
|
|
55
|
-
current.engine = engine;
|
|
56
|
-
if (model !== undefined)
|
|
57
|
-
current.model = model;
|
|
53
|
+
Object.assign(current, selectionFromArgs(args));
|
|
58
54
|
if (timeoutMs !== undefined)
|
|
59
55
|
current.timeout = timeoutMs;
|
|
60
56
|
if (workspace !== undefined)
|