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
|
@@ -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)
|
|
@@ -1,13 +1,14 @@
|
|
|
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 { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
|
|
4
5
|
import { UsageError } from "../../core/errors.js";
|
|
6
|
+
import { mergeNotices } from "../../execution/notices.js";
|
|
5
7
|
import { createInlineResolvedCommand, createResolvedCommand, createResolvedPersona, } from "../../execution/resolved-request.js";
|
|
6
8
|
import { isPortableExecutionAgentSelector, } from "../../execution/source.js";
|
|
7
9
|
import { recordIndexedShowUsage } from "../../indexer/usage/show-usage.js";
|
|
8
10
|
import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
|
|
9
|
-
import {
|
|
10
|
-
import { buildExecution, resolveExecution, } from "../../integrations/agent/execution.js";
|
|
11
|
+
import { buildExecution, currentLayer, resolveExecution, shippedAlias, } from "../../integrations/agent/execution.js";
|
|
11
12
|
import { runExecution } from "../../integrations/agent/runner-dispatch.js";
|
|
12
13
|
import { parseBuiltinCommandAction } from "./builtin-action.js";
|
|
13
14
|
import { loadAdapterExecutionSource, } from "./execution-source-loader.js";
|
|
@@ -106,18 +107,22 @@ export async function prepareCommandInvocation(options) {
|
|
|
106
107
|
renderedPersona = rendered;
|
|
107
108
|
}
|
|
108
109
|
const persona = renderedPersona ? createResolvedPersona(renderedPersona) : selectedAgent.present ? null : undefined;
|
|
110
|
+
const layers = [
|
|
111
|
+
shippedAlias(SHIPPED_ALIAS.agent),
|
|
112
|
+
...(renderedPersona
|
|
113
|
+
? [{ id: renderedPersona.identity.ref, kind: "agent", values: renderedPersona.defaults }]
|
|
114
|
+
: []),
|
|
115
|
+
{ id: renderedCommand?.identity.ref ?? "inline-command", kind: "command", values: commandDefaults },
|
|
116
|
+
...(options.invocationDefaults
|
|
117
|
+
? [{ id: "invocation-defaults", kind: "invocation-defaults", values: options.invocationDefaults }]
|
|
118
|
+
: []),
|
|
119
|
+
...(options.current ? [currentLayer(options.current)] : []),
|
|
120
|
+
];
|
|
109
121
|
return resolveExecution({
|
|
110
122
|
command,
|
|
111
123
|
config: options.config,
|
|
112
124
|
...(persona !== undefined ? { persona } : {}),
|
|
113
|
-
|
|
114
|
-
commandLayer: {
|
|
115
|
-
id: renderedCommand?.identity.ref ?? "inline-command",
|
|
116
|
-
values: commandDefaults,
|
|
117
|
-
},
|
|
118
|
-
...(options.invocationDefaults ? { invocationDefaults: options.invocationDefaults } : {}),
|
|
119
|
-
...(options.current ? { current: options.current } : {}),
|
|
120
|
-
...(options.modelMap ? { modelMap: options.modelMap } : {}),
|
|
125
|
+
layers,
|
|
121
126
|
});
|
|
122
127
|
}
|
|
123
128
|
function compareText(left, right) {
|
|
@@ -126,38 +131,27 @@ function compareText(left, right) {
|
|
|
126
131
|
const DIAGNOSTIC_PROVENANCE_FIELDS = new Set([
|
|
127
132
|
"/inference",
|
|
128
133
|
"agent",
|
|
129
|
-
"authorization",
|
|
130
134
|
"command",
|
|
131
|
-
"engine",
|
|
132
|
-
"engine.requested",
|
|
133
135
|
"model",
|
|
134
136
|
"outputSchema",
|
|
135
137
|
"persona",
|
|
136
138
|
"runtime.environment",
|
|
137
|
-
"runtime.settings",
|
|
138
139
|
"runtime.timeoutMs",
|
|
139
140
|
"runtime.workspace",
|
|
140
|
-
"
|
|
141
|
+
"target",
|
|
141
142
|
]);
|
|
142
143
|
const DIAGNOSTIC_NOTICE_FIELDS = new Set([
|
|
143
144
|
"agent",
|
|
144
145
|
"command.content",
|
|
145
|
-
"command.extensions",
|
|
146
146
|
"conversation",
|
|
147
|
-
"engine",
|
|
148
|
-
"engine.extensions",
|
|
149
|
-
"extensions",
|
|
150
147
|
"inference",
|
|
151
148
|
"model",
|
|
152
149
|
"outputSchema",
|
|
153
150
|
"persona",
|
|
154
|
-
"persona.extensions",
|
|
155
151
|
"runtime.environment",
|
|
156
|
-
"runtime.extensions",
|
|
157
|
-
"runtime.settings",
|
|
158
152
|
"runtime.timeoutMs",
|
|
159
153
|
"runtime.workspace",
|
|
160
|
-
"
|
|
154
|
+
"target",
|
|
161
155
|
]);
|
|
162
156
|
function canonicalDiagnosticProvenanceField(field) {
|
|
163
157
|
if (field.startsWith("/inference/"))
|
|
@@ -219,20 +213,15 @@ function safeDiagnosticNotice(notice) {
|
|
|
219
213
|
severity: "info",
|
|
220
214
|
adapter: notice.adapter,
|
|
221
215
|
field: "persona",
|
|
222
|
-
message: "The selected
|
|
216
|
+
message: "The selected harness has no native persona channel; AKM composed the persona into the prompt.",
|
|
223
217
|
});
|
|
224
218
|
default:
|
|
225
219
|
return undefined;
|
|
226
220
|
}
|
|
227
221
|
}
|
|
228
222
|
function diagnosticNotices(notices) {
|
|
229
|
-
const
|
|
230
|
-
|
|
231
|
-
const safe = safeDiagnosticNotice(notice);
|
|
232
|
-
if (safe)
|
|
233
|
-
canonical.set(JSON.stringify(safe), safe);
|
|
234
|
-
}
|
|
235
|
-
return Object.freeze([...canonical.values()].sort((left, right) => compareText(JSON.stringify(left), JSON.stringify(right))));
|
|
223
|
+
const safe = notices.flatMap((notice) => safeDiagnosticNotice(notice) ?? []);
|
|
224
|
+
return Object.freeze([...(mergeNotices(safe) ?? [])].sort((left, right) => compareText(JSON.stringify(left), JSON.stringify(right))));
|
|
236
225
|
}
|
|
237
226
|
/**
|
|
238
227
|
* Build a prepared invocation and project only safe structural diagnostics.
|
|
@@ -245,7 +234,7 @@ export function inspectPreparedCommandInvocation(prepared) {
|
|
|
245
234
|
shape: "command-dry-run",
|
|
246
235
|
ok: true,
|
|
247
236
|
dryRun: true,
|
|
248
|
-
engine: prepared.request.
|
|
237
|
+
engine: prepared.request.target.name,
|
|
249
238
|
provenance: diagnosticProvenance(prepared.provenance),
|
|
250
239
|
notices: diagnosticNotices(built.notices),
|
|
251
240
|
};
|
|
@@ -270,22 +259,19 @@ function resultEnvelope(result, engine, warnings, notices) {
|
|
|
270
259
|
export async function dispatchPreparedCommandInvocation(prepared, options = {}) {
|
|
271
260
|
const { request } = prepared;
|
|
272
261
|
const built = buildExecution(request, prepared.runner);
|
|
273
|
-
const selectedEngine = request.
|
|
262
|
+
const selectedEngine = request.target.name;
|
|
274
263
|
const result = await runExecution(built, runOptionsFor(options));
|
|
275
264
|
const consumedRefs = new Set();
|
|
276
265
|
if (request.command.source)
|
|
277
266
|
consumedRefs.add(request.command.source.ref);
|
|
278
267
|
if (request.persona)
|
|
279
268
|
consumedRefs.add(request.persona.source.ref);
|
|
280
|
-
//
|
|
281
|
-
//
|
|
282
|
-
// byte-identical to the pre-P1b bare resolveUsageEventSource() call (P-07's
|
|
283
|
-
// own default is "user").
|
|
269
|
+
// options.eventSource is only a FALLBACK — an ambient AKM_EVENT_SOURCE still
|
|
270
|
+
// wins. Absent, the default is "user".
|
|
284
271
|
const eventSource = resolveUsageEventSource(process.env, options.eventSource ?? "user");
|
|
285
272
|
for (const ref of consumedRefs)
|
|
286
273
|
recordIndexedShowUsage(ref, eventSource);
|
|
287
|
-
|
|
288
|
-
return resultEnvelope(result, selectedEngine, announcement ? [announcement] : [], built.notices);
|
|
274
|
+
return resultEnvelope(result, selectedEngine, [], built.notices);
|
|
289
275
|
}
|
|
290
276
|
export async function executeCommandInvocation(options, dispatchOptions = {}) {
|
|
291
277
|
return dispatchPreparedCommandInvocation(await prepareCommandInvocation(options), dispatchOptions);
|
|
@@ -6,7 +6,7 @@ import fs from "node:fs";
|
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { adapterForId } from "../../core/adapter/registry.js";
|
|
8
8
|
import { parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
9
|
-
import { isWithin } from "../../core/common.js";
|
|
9
|
+
import { isContainedResolvedPath, isWithin } from "../../core/common.js";
|
|
10
10
|
import { loadConfig } from "../../core/config/config.js";
|
|
11
11
|
import { bundleComponentConfig, bundlesToSourceEntries } from "../../core/config/config-sources.js";
|
|
12
12
|
import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
|
|
@@ -55,7 +55,7 @@ function isLexicallyWithin(candidate, root) {
|
|
|
55
55
|
const relative = path.relative(path.resolve(root), path.resolve(candidate));
|
|
56
56
|
return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
|
|
57
57
|
}
|
|
58
|
-
function implicitComponentForEntry(entry, config
|
|
58
|
+
function implicitComponentForEntry(entry, config) {
|
|
59
59
|
const sources = resolveSourceEntries(undefined, config);
|
|
60
60
|
const installations = deriveInstallations(sources);
|
|
61
61
|
for (const [index, installation] of installations.entries()) {
|
|
@@ -66,9 +66,6 @@ function implicitComponentForEntry(entry, config, realRoot) {
|
|
|
66
66
|
if (!source || !component)
|
|
67
67
|
continue;
|
|
68
68
|
const canonicalRoot = realDirectory(component.root, `Canonical implicit source root for ${entry.bundleId}`);
|
|
69
|
-
if (canonicalRoot !== realRoot) {
|
|
70
|
-
warnOnce(`execution-source-root-drift:${entry.itemRef}`, `[command] Indexed root for ${JSON.stringify(entry.itemRef)} no longer matches the working bundle source; re-resolving from live config. Run \`akm index --full\` to refresh it.`);
|
|
71
|
-
}
|
|
72
69
|
if (component.adapter !== entry.adapterId) {
|
|
73
70
|
warnOnce(`execution-source-adapter-drift:${entry.itemRef}`, `[command] Indexed adapter ${JSON.stringify(entry.adapterId)} for ${JSON.stringify(entry.itemRef)} no longer matches the working source's adapter ${JSON.stringify(component.adapter)}; re-resolving from live config. Run \`akm index --full\` to refresh it.`);
|
|
74
71
|
}
|
|
@@ -84,7 +81,7 @@ function implicitComponentForEntry(entry, config, realRoot) {
|
|
|
84
81
|
function componentForEntry(entry, config, realRoot) {
|
|
85
82
|
const configured = config.bundles?.[entry.bundleId];
|
|
86
83
|
if (!configured) {
|
|
87
|
-
const implicit = implicitComponentForEntry(entry, config
|
|
84
|
+
const implicit = implicitComponentForEntry(entry, config);
|
|
88
85
|
if (implicit)
|
|
89
86
|
return implicit;
|
|
90
87
|
throw new ConfigError(`Indexed execution source ${JSON.stringify(entry.itemRef)} belongs to unconfigured bundle ${JSON.stringify(entry.bundleId)}.`, "INVALID_CONFIG_FILE", "Refresh the bundle configuration and rebuild the index before dispatching this asset.");
|
|
@@ -116,9 +113,6 @@ function componentForEntry(entry, config, realRoot) {
|
|
|
116
113
|
if (!isWithin(configuredRoot, configuredSourceRoot)) {
|
|
117
114
|
throw new ConfigError(`Configured component root for ${JSON.stringify(entry.itemRef)} resolves outside its materialized bundle source.`, "INVALID_CONFIG_FILE", "Remove the escaping symlink or component path, then run `akm index --full`.");
|
|
118
115
|
}
|
|
119
|
-
if (configuredRoot !== realRoot) {
|
|
120
|
-
warnOnce(`execution-source-root-drift:${entry.itemRef}`, `[command] Indexed root for ${JSON.stringify(entry.itemRef)} no longer matches the ${JSON.stringify(configuredSource.type)} bundle source; re-resolving from live config. Run \`akm index --full\` to refresh it.`);
|
|
121
|
-
}
|
|
122
116
|
}
|
|
123
117
|
const writable = component?.writable ?? configured.writable ?? configured.path !== undefined;
|
|
124
118
|
return Object.freeze({
|
|
@@ -131,8 +125,8 @@ function componentForEntry(entry, config, realRoot) {
|
|
|
131
125
|
function expectedIndexedType(kind) {
|
|
132
126
|
return kind === "command" ? "command" : "agent";
|
|
133
127
|
}
|
|
134
|
-
function assertRenderedIdentity(source, entry,
|
|
135
|
-
const expectedFile = path.relative(
|
|
128
|
+
function assertRenderedIdentity(source, entry, content) {
|
|
129
|
+
const expectedFile = path.relative(path.resolve(entry.stashDir), path.resolve(entry.filePath)).replace(/\\/g, "/");
|
|
136
130
|
const expectedHash = createHash("sha256").update(content, "utf8").digest("hex");
|
|
137
131
|
if (source.identity.ref !== entry.itemRef ||
|
|
138
132
|
source.identity.bundle !== entry.bundleId ||
|
|
@@ -157,8 +151,10 @@ export async function loadAdapterExecutionSource(refInput, expectedKind, options
|
|
|
157
151
|
}
|
|
158
152
|
const config = await effectiveConfig(options.config);
|
|
159
153
|
const realRoot = realDirectory(entry.stashDir, `Indexed component root for ${entry.itemRef}`);
|
|
160
|
-
|
|
161
|
-
|
|
154
|
+
realRegularFile(entry.filePath, `Indexed execution source ${entry.itemRef}`);
|
|
155
|
+
// An index row must name a file inside its own component root. Checked on the
|
|
156
|
+
// authored path, so a file that is a symlink to one elsewhere still loads.
|
|
157
|
+
if (!isContainedResolvedPath(path.resolve(entry.filePath), path.resolve(entry.stashDir))) {
|
|
162
158
|
throw new ConfigError(`Indexed execution source ${JSON.stringify(entry.itemRef)} resolves outside its component root.`, "INVALID_CONFIG_FILE", "Remove the escaping path and rebuild the index.");
|
|
163
159
|
}
|
|
164
160
|
const component = componentForEntry(entry, config, realRoot);
|
|
@@ -174,6 +170,6 @@ export async function loadAdapterExecutionSource(refInput, expectedKind, options
|
|
|
174
170
|
if (!rendered || rendered.kind !== expectedKind) {
|
|
175
171
|
throw new ConfigError(`Bundle adapter ${JSON.stringify(entry.adapterId)} did not render ${JSON.stringify(entry.itemRef)} as a ${expectedKind}.`, "INVALID_CONFIG_FILE", "Rebuild the index; if the mismatch remains, repair the source file or owning adapter.");
|
|
176
172
|
}
|
|
177
|
-
assertRenderedIdentity(rendered, entry,
|
|
173
|
+
assertRenderedIdentity(rendered, entry, fileContext.content());
|
|
178
174
|
return rendered;
|
|
179
175
|
}
|
|
@@ -58,7 +58,7 @@ function walkCommandTree(cmd, parentPath = "") {
|
|
|
58
58
|
const valueFlags = [];
|
|
59
59
|
if (cmd.args) {
|
|
60
60
|
for (const [flagName, arg] of Object.entries(cmd.args)) {
|
|
61
|
-
if (arg.type === "positional")
|
|
61
|
+
if (arg.type === "positional" || arg.hidden === true)
|
|
62
62
|
continue;
|
|
63
63
|
flags.push(`--${flagName}`);
|
|
64
64
|
if (arg.type === "boolean" && arg.default === true)
|
|
@@ -9,14 +9,15 @@
|
|
|
9
9
|
* zero lines here — the walker handles get/set/unset/coercion uniformly.
|
|
10
10
|
*
|
|
11
11
|
* `configVersion` is controlled by the config lifecycle. All execution
|
|
12
|
-
* settings use their canonical
|
|
12
|
+
* settings use their canonical connection, harness and strategy paths; retired aliases are not
|
|
13
13
|
* rewritten at this boundary.
|
|
14
14
|
*/
|
|
15
15
|
import { isDeepStrictEqual } from "node:util";
|
|
16
16
|
import { defineGroupCommand, defineJsonCommand, output } from "../cli/shared.js";
|
|
17
17
|
import { isRecord } from "../core/common.js";
|
|
18
|
-
import { DEFAULT_CONFIG, getConfigValueSource, loadConfig, mutateConfig, parseAndValidateConfigText, resolveConfigRefSource, } from "../core/config/config.js";
|
|
18
|
+
import { DEFAULT_CONFIG, getConfigValueSource, loadConfig, mutateConfig, parseAndValidateConfigText, resolveConfigRefSource, unusableEntryAt, } from "../core/config/config.js";
|
|
19
19
|
import { configGet, configSet, configUnset, unknownKeyHint } from "../core/config/config-walker.js";
|
|
20
|
+
import { isEnvReference } from "../core/config/schema/primitives.js";
|
|
20
21
|
import { UsageError } from "../core/errors.js";
|
|
21
22
|
import { getConfigPath } from "../core/paths.js";
|
|
22
23
|
import { formatRegistryUrl } from "../core/registry-url.js";
|
|
@@ -31,11 +32,13 @@ export function unsetConfigValue(config, key) {
|
|
|
31
32
|
return configUnset(config, key);
|
|
32
33
|
}
|
|
33
34
|
export function listConfig(config) {
|
|
34
|
-
//
|
|
35
|
+
// Sources live in `bundles` (spread from config); the
|
|
35
36
|
// retired top-level `sources[]` array is no longer surfaced.
|
|
36
37
|
return redactConfigValue({ ...DEFAULT_CONFIG, ...config });
|
|
37
38
|
}
|
|
38
39
|
function redactConfigValue(value, path = []) {
|
|
40
|
+
if (path.at(-1) === "apiKey" && typeof value === "string" && !isEnvReference(value))
|
|
41
|
+
return undefined;
|
|
39
42
|
if (typeof value === "string" && isRegistryUrlPath(path))
|
|
40
43
|
return formatRegistryUrl(value);
|
|
41
44
|
if (Array.isArray(value))
|
|
@@ -44,8 +47,7 @@ function redactConfigValue(value, path = []) {
|
|
|
44
47
|
return value;
|
|
45
48
|
const result = {};
|
|
46
49
|
for (const [key, child] of Object.entries(value)) {
|
|
47
|
-
if (key !== "apiKey" ||
|
|
48
|
-
(typeof child === "string" && /^\$(?:[A-Za-z_][A-Za-z0-9_]*|\{[A-Za-z_][A-Za-z0-9_]*\})$/.test(child))) {
|
|
50
|
+
if (key !== "apiKey" || (typeof child === "string" && isEnvReference(child))) {
|
|
49
51
|
result[key] = redactConfigValue(child, [...path, key]);
|
|
50
52
|
}
|
|
51
53
|
}
|
|
@@ -195,6 +197,13 @@ export const configCommand = defineGroupCommand({
|
|
|
195
197
|
if (source.startsWith("extends:")) {
|
|
196
198
|
throw new UsageError(`Config key "${args.key}" is inherited from ${source} and cannot be unset here.`, "TARGET_NOT_UPDATABLE", `Override it locally with "akm config set ${args.key} <value>", or edit the base file directly.`);
|
|
197
199
|
}
|
|
200
|
+
// An entry the reader drops is not in the config `unsetConfigValue` sees, so it would no-op and say ok.
|
|
201
|
+
const ignored = unusableEntryAt(args.key);
|
|
202
|
+
if (ignored) {
|
|
203
|
+
throw new UsageError(`Config key "${args.key}" is inside ${ignored.kind} "${ignored.name}", which akm ignores (${ignored.why}), so \`akm config\` cannot edit it.`, "TARGET_NOT_UPDATABLE", ignored.inFile
|
|
204
|
+
? `Remove or fix the ${ignored.group}.${ignored.name} entry in ${getConfigPath()} by hand.`
|
|
205
|
+
: `${getConfigPath()} is still in the retired engines form: run \`akm migrate apply\` first, then fix or remove the entry.`);
|
|
206
|
+
}
|
|
198
207
|
const result = mutateConfig((current) => unsetConfigValue(current, args.key), { absentNoop: true });
|
|
199
208
|
const updated = result.config;
|
|
200
209
|
if (!args.silent) {
|
|
@@ -1,7 +1,10 @@
|
|
|
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
|
-
|
|
4
|
+
/**
|
|
5
|
+
* What `env run --clean` / `secret run --clean` keeps of the parent environment. The user typed
|
|
6
|
+
* the flag to get a minimal one; without the last eight names Windows cannot create the process.
|
|
7
|
+
*/
|
|
5
8
|
const CLEAN_ENV_ALLOWLIST = [
|
|
6
9
|
"HOME",
|
|
7
10
|
"PATH",
|
|
@@ -31,6 +34,14 @@ const CLEAN_ENV_ALLOWLIST = [
|
|
|
31
34
|
"TZ",
|
|
32
35
|
"NO_COLOR",
|
|
33
36
|
"COLORTERM",
|
|
37
|
+
"SystemRoot",
|
|
38
|
+
"SystemDrive",
|
|
39
|
+
"WINDIR",
|
|
40
|
+
"COMSPEC",
|
|
41
|
+
"PATHEXT",
|
|
42
|
+
"USERPROFILE",
|
|
43
|
+
"HOMEDRIVE",
|
|
44
|
+
"HOMEPATH",
|
|
34
45
|
];
|
|
35
46
|
export function buildChildEnv(parentEnv, options) {
|
|
36
47
|
const base = options.clean ? {} : { ...parentEnv };
|
|
@@ -39,19 +50,6 @@ export function buildChildEnv(parentEnv, options) {
|
|
|
39
50
|
if (parentEnv[key] !== undefined)
|
|
40
51
|
base[key] = parentEnv[key];
|
|
41
52
|
}
|
|
42
|
-
// The allowlist above is POSIX-shaped. On Windows a child started without
|
|
43
|
-
// SystemRoot/COMSPEC/PATHEXT and friends frequently cannot start at all —
|
|
44
|
-
// which is why every other spawn path in the codebase applies this floor
|
|
45
|
-
// (see spawnEnvNamesFor). `env run --clean` / `secret run --clean` did not,
|
|
46
|
-
// so clean-mode injection was unusable there. The floor is names the OS
|
|
47
|
-
// requires of any child, not user configuration, so it does not weaken what
|
|
48
|
-
// "clean" means about inherited secrets.
|
|
49
|
-
if (process.platform === "win32") {
|
|
50
|
-
for (const key of WIN32_SPAWN_ENV_FLOOR) {
|
|
51
|
-
if (parentEnv[key] !== undefined)
|
|
52
|
-
base[key] = parentEnv[key];
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
53
|
}
|
|
56
54
|
for (const key of options.inherit) {
|
|
57
55
|
if (parentEnv[key] !== undefined)
|
|
@@ -9,37 +9,43 @@
|
|
|
9
9
|
* REUSES the exact same machinery instead of forking it. Every safety
|
|
10
10
|
* invariant carries over unchanged:
|
|
11
11
|
*
|
|
12
|
-
* - `${
|
|
13
|
-
* secret
|
|
14
|
-
*
|
|
15
|
-
* third-party-sourced stashes and warned about for first-party ones.
|
|
12
|
+
* - `${ref}` tokens resolve through the one ref walk (a `secrets/` ref to the
|
|
13
|
+
* secret's trimmed value, any other asset ref to its absolute path); a
|
|
14
|
+
* missing ref is a hard error and NOTHING is injected (no partial injection).
|
|
16
15
|
* - An `env_access` audit event records key NAMES only, never values.
|
|
17
16
|
* - Resolved values must never be written to stdout or logs by callers.
|
|
18
17
|
*/
|
|
19
|
-
import
|
|
20
|
-
import path from "node:path";
|
|
21
|
-
import { decideDangerousEnvInjection } from "../../core/activation-policy.js";
|
|
22
|
-
import { assetPathForName } from "../../core/asset/asset-placement.js";
|
|
23
|
-
import { isWithin } from "../../core/common.js";
|
|
24
|
-
import { makeEnvRef, makeSecretRef, resolveEnvPath } from "../../core/env-secret-ref.js";
|
|
18
|
+
import { isInstalledBundle, makeEnvRef, resolveEnvPath, resolveRefOwner } from "../../core/env-secret-ref.js";
|
|
25
19
|
import { NotFoundError, UsageError } from "../../core/errors.js";
|
|
26
20
|
import { appendEvent } from "../../core/events.js";
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
21
|
+
import { substituteRefTokens } from "../../core/ref-token.js";
|
|
22
|
+
import { readValue } from "../../core/secret-value.js";
|
|
23
|
+
import { warnOnce } from "../../core/warn.js";
|
|
24
|
+
import { loadEnv } from "./env.js";
|
|
25
|
+
/** The retired `${secret:NAME}` env-value token (see `resolveEnvBinding`). */
|
|
26
|
+
const LEGACY_SECRET_TOKEN_RE = /\$\{secret:([^}\s]+)\}/g;
|
|
27
|
+
/**
|
|
28
|
+
* What a `${ref}` token stands for: a `secrets/` ref yields the secret's
|
|
29
|
+
* trimmed value, any other asset ref its absolute path, a ref no bundle owns
|
|
30
|
+
* `undefined`. The one resolver behind env values and exec argv.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveRefToken(ref) {
|
|
33
|
+
const owner = resolveRefOwner(ref);
|
|
34
|
+
if (owner === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
return owner.type === "secret"
|
|
37
|
+
? { kind: "secret", value: readValue(owner.absPath) }
|
|
38
|
+
: { kind: "path", path: owner.absPath };
|
|
39
|
+
}
|
|
30
40
|
/**
|
|
31
41
|
* Resolve an env ref to its injectable values: load the file, apply key
|
|
32
|
-
* filtering, substitute `${
|
|
33
|
-
* directory, enforce the dangerous-key policy, and append the keys-only
|
|
42
|
+
* filtering, substitute `${ref}` tokens, and append the keys-only
|
|
34
43
|
* `env_access` audit event.
|
|
35
44
|
*/
|
|
36
45
|
export function resolveEnvBinding(target, options = {}) {
|
|
37
46
|
const warn = options.warn ?? ((message) => process.stderr.write(`warning: ${message}\n`));
|
|
38
|
-
const { name, absPath, source } = resolveEnvPath(target);
|
|
47
|
+
const { name, absPath, source, bundleId } = resolveEnvPath(target);
|
|
39
48
|
const envRef = makeEnvRef(name, source);
|
|
40
|
-
if (!fs.existsSync(absPath)) {
|
|
41
|
-
throw new NotFoundError(`Env not found: ${envRef}`);
|
|
42
|
-
}
|
|
43
49
|
const allValues = loadEnv(absPath);
|
|
44
50
|
// Value-safe key filtering (--only / --except operate on key NAMES only).
|
|
45
51
|
let envValues = allValues;
|
|
@@ -58,49 +64,32 @@ export function resolveEnvBinding(target, options = {}) {
|
|
|
58
64
|
const excluded = new Set(options.except);
|
|
59
65
|
envValues = Object.fromEntries(Object.entries(allValues).filter(([k]) => !excluded.has(k)));
|
|
60
66
|
}
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
67
|
+
// Read-compat: env files written for 0.9 / early 0.10 spell a secret
|
|
68
|
+
// `${secret:NAME}`, meaning `secrets/NAME` in this env asset's own bundle.
|
|
69
|
+
// Read it as the `${ref}` it stands for; the file is bundle content and is
|
|
70
|
+
// never rewritten.
|
|
71
|
+
let firstLegacy;
|
|
72
|
+
envValues = Object.fromEntries(Object.entries(envValues).map(([key, value]) => [
|
|
73
|
+
key,
|
|
74
|
+
value.replace(LEGACY_SECRET_TOKEN_RE, (_token, secretName) => {
|
|
75
|
+
const spelling = `\${${bundleId}//secrets/${secretName}}`;
|
|
76
|
+
firstLegacy ??= spelling;
|
|
77
|
+
return spelling;
|
|
78
|
+
}),
|
|
79
|
+
]));
|
|
80
|
+
if (firstLegacy !== undefined) {
|
|
81
|
+
warnOnce(`legacy-secret-token:${envRef}`, `Env "${envRef}" uses the retired \${secret:NAME} spelling; reading it as ${firstLegacy}. Write the full ref in the env file.`);
|
|
82
|
+
}
|
|
83
|
+
// Substitute `${ref}` tokens. A missing ref is a hard error — inject NOTHING.
|
|
84
|
+
const { values: substituted, missing, secretValues, } = substituteRefTokens(envValues, resolveRefToken, isInstalledBundle);
|
|
76
85
|
if (missing.length > 0) {
|
|
77
|
-
throw new NotFoundError(`Env "${envRef}" references
|
|
86
|
+
throw new NotFoundError(`Env "${envRef}" references asset(s) that no bundle owns: ${missing.join(", ")}. Nothing was injected.`, "FILE_NOT_FOUND",
|
|
87
|
+
// biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${ref}` token syntax documented for users, not interpolation
|
|
88
|
+
"Write each `${ref}` as a full akm ref that exists, e.g. `${secrets/name}` or `${team//scripts/run.sh}`.");
|
|
78
89
|
}
|
|
79
90
|
envValues = substituted;
|
|
80
91
|
const keys = Object.keys(envValues);
|
|
81
|
-
// Scan injected keys for known process-hijacking variables. The workspace
|
|
82
|
-
// activation policy decides block (third-party, registryId set) vs. warn
|
|
83
|
-
// (first-party stash, where the operator owns the file).
|
|
84
|
-
const dangerous = keys.filter(isDangerousEnvKey);
|
|
85
|
-
if (dangerous.length > 0) {
|
|
86
|
-
const detail = `Env "${envRef}" injects process-hijacking variable(s): ${dangerous.join(", ")}.`;
|
|
87
|
-
const decision = decideDangerousEnvInjection({
|
|
88
|
-
dangerousKeys: dangerous,
|
|
89
|
-
thirdParty: Boolean(source.registryId),
|
|
90
|
-
allowDangerousEnvKeys: options.allowDangerousEnvKeys,
|
|
91
|
-
});
|
|
92
|
-
if (decision === "block") {
|
|
93
|
-
throw new UsageError(`Refusing to inject env from a third-party stash. ${detail}\n` +
|
|
94
|
-
` Review the file, then copy the values into a first-party env if you trust them, ` +
|
|
95
|
-
`or pass --allow-dangerous-env-keys once you have.`, "INVALID_FLAG_VALUE");
|
|
96
|
-
}
|
|
97
|
-
if (decision === "warn") {
|
|
98
|
-
warn(options.allowDangerousEnvKeys && source.registryId
|
|
99
|
-
? `${detail} Injecting anyway (--allow-dangerous-env-keys).`
|
|
100
|
-
: `${detail} Injecting anyway (first-party stash).`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
92
|
// Audit trail: keys only, never values.
|
|
104
93
|
appendEvent({ eventType: "env_access", ref: envRef, metadata: { keys } });
|
|
105
|
-
return { ref: envRef, values: envValues, keys };
|
|
94
|
+
return { ref: envRef, values: envValues, keys, secretValues };
|
|
106
95
|
}
|