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
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
* `akm env` command family. Extracted verbatim from src/cli.ts (WS6) so the God
|
|
6
6
|
* Module shrinks; the `main.subCommands.env` key and every subcommand's
|
|
7
7
|
* args/output shape are byte-identical. The ref-resolution helpers
|
|
8
|
-
* (parseEnvRef /
|
|
9
|
-
* traversal guard) live in src/core/env-secret-ref.ts so env + secret share one
|
|
8
|
+
* (parseEnvRef / makeEnvRef / resolveEnvPath) live in src/core/env-secret-ref.ts so env + secret share one
|
|
10
9
|
* copy.
|
|
11
10
|
*
|
|
12
11
|
* `akm env` manages whole `.env` files under each stash's env/ directory.
|
|
@@ -42,7 +41,7 @@ const envCreateCommand = defineJsonCommand({
|
|
|
42
41
|
args: {
|
|
43
42
|
name: {
|
|
44
43
|
type: "positional",
|
|
45
|
-
description: "Env
|
|
44
|
+
description: "Env ref (flat name, e.g. env/prod → prod.env; use --path for a subdirectory)",
|
|
46
45
|
required: true,
|
|
47
46
|
},
|
|
48
47
|
path: {
|
|
@@ -119,10 +118,7 @@ const envPathCommand = defineJsonCommand({
|
|
|
119
118
|
quiet: { type: "boolean", alias: "q", description: "Suppress the unsafe-source warning", default: false },
|
|
120
119
|
},
|
|
121
120
|
async run({ args }) {
|
|
122
|
-
const {
|
|
123
|
-
if (!fs.existsSync(absPath)) {
|
|
124
|
-
throw new NotFoundError(`Env not found: ${makeEnvRef(name, source)}`);
|
|
125
|
-
}
|
|
121
|
+
const { absPath } = resolveEnvPath(args.ref);
|
|
126
122
|
// The raw `.env` may contain `X=$(cmd)`, which executes if `source`d.
|
|
127
123
|
// Warning goes to stderr (never contaminates the path on stdout) and is
|
|
128
124
|
// suppressed with --quiet for the legitimate `_FILE` / `--env-file` use.
|
|
@@ -166,9 +162,6 @@ const envExportCommand = defineJsonCommand({
|
|
|
166
162
|
" session). export never prints values to stdout, to avoid leaking them into a captured context.", "MISSING_REQUIRED_ARGUMENT");
|
|
167
163
|
}
|
|
168
164
|
const { name, absPath, source } = resolveEnvPath(args.ref);
|
|
169
|
-
if (!fs.existsSync(absPath)) {
|
|
170
|
-
throw new NotFoundError(`Env not found: ${makeEnvRef(name, source)}`);
|
|
171
|
-
}
|
|
172
165
|
const { buildShellExportScript } = await import("./env.js");
|
|
173
166
|
const resolvedOut = path.resolve(outPath);
|
|
174
167
|
writeFileAtomic(resolvedOut, buildShellExportScript(absPath), 0o600);
|
|
@@ -177,16 +170,19 @@ const envExportCommand = defineJsonCommand({
|
|
|
177
170
|
});
|
|
178
171
|
/**
|
|
179
172
|
* Shared implementation for `env run`. Injects an entire env file's values into
|
|
180
|
-
* the child process env — never via a shell
|
|
181
|
-
* for process-hijacking variables.
|
|
173
|
+
* the child process env — never via a shell.
|
|
182
174
|
*/
|
|
183
175
|
async function runEnvInjected(target, opts) {
|
|
184
176
|
const command = getParsedInvocation().passthroughArgs();
|
|
185
177
|
if (command.length === 0) {
|
|
186
178
|
throw new UsageError("Missing command. Usage: akm env run <ref> -- <command>");
|
|
187
179
|
}
|
|
188
|
-
|
|
189
|
-
|
|
180
|
+
try {
|
|
181
|
+
resolveEnvPath(target);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (!(error instanceof NotFoundError))
|
|
185
|
+
throw error;
|
|
190
186
|
// Help users who reach for the removed single-key `ref/KEY` form.
|
|
191
187
|
const slash = target.lastIndexOf("/");
|
|
192
188
|
if (slash > 0) {
|
|
@@ -194,7 +190,8 @@ async function runEnvInjected(target, opts) {
|
|
|
194
190
|
if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(maybeKey)) {
|
|
195
191
|
let baseExists = false;
|
|
196
192
|
try {
|
|
197
|
-
|
|
193
|
+
resolveEnvPath(target.slice(0, slash));
|
|
194
|
+
baseExists = true;
|
|
198
195
|
}
|
|
199
196
|
catch {
|
|
200
197
|
baseExists = false;
|
|
@@ -205,16 +202,15 @@ async function runEnvInjected(target, opts) {
|
|
|
205
202
|
}
|
|
206
203
|
}
|
|
207
204
|
}
|
|
208
|
-
throw
|
|
205
|
+
throw error;
|
|
209
206
|
}
|
|
210
|
-
// Load → filter → secret-substitute →
|
|
207
|
+
// Load → filter → secret-substitute → keys-only
|
|
211
208
|
// audit event. Shared with the workflow engine's per-unit env bindings —
|
|
212
209
|
// see env-binding.ts for the extracted core and its safety invariants.
|
|
213
210
|
const { resolveEnvBinding } = await import("./env-binding.js");
|
|
214
211
|
const { values: envValues } = resolveEnvBinding(target, {
|
|
215
212
|
only: opts.only,
|
|
216
213
|
except: opts.except,
|
|
217
|
-
allowDangerousEnvKeys: opts.allowDangerousEnvKeys,
|
|
218
214
|
});
|
|
219
215
|
const mergedEnv = buildChildEnv(process.env, {
|
|
220
216
|
clean: opts.clean === true,
|
|
@@ -241,8 +237,8 @@ async function runEnvInjected(target, opts) {
|
|
|
241
237
|
throw err;
|
|
242
238
|
}
|
|
243
239
|
// R-067: was `process.exit(result.status ?? 0)`, which terminates the
|
|
244
|
-
// process synchronously and skips the `finally {
|
|
245
|
-
//
|
|
240
|
+
// process synchronously and skips the `finally { disposeLlmUsageSink(); }`
|
|
241
|
+
// block in src/cli.ts's `runCommand` — even
|
|
246
242
|
// on the success path, since this call was unconditional. Setting
|
|
247
243
|
// `process.exitCode` and returning lets cleanup run while still exiting
|
|
248
244
|
// with the child's exact status once the event loop drains, matching the
|
|
@@ -264,8 +260,8 @@ const envRunCommand = defineJsonCommand({
|
|
|
264
260
|
meta: {
|
|
265
261
|
name: "run",
|
|
266
262
|
description:
|
|
267
|
-
// biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${
|
|
268
|
-
"Run a command with the env file injected into its environment: `akm env run <ref> -- <command>`. Use `-- $SHELL` for an interactive session. Restrict which variables are injected with --only / --except. Values may embed `${
|
|
263
|
+
// biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${ref}` token syntax documented for users, not interpolation
|
|
264
|
+
"Run a command with the env file injected into its environment: `akm env run <ref> -- <command>`. Use `-- $SHELL` for an interactive session. Restrict which variables are injected with --only / --except. Values may embed `${ref}` tokens, replaced at run time: a `${secrets/NAME}` (or `${bundle//secrets/NAME}`) token with the secret's value, any other asset ref with its absolute path. Pass --clean to start the child with a minimal inherited environment instead of the full parent environment.",
|
|
269
265
|
},
|
|
270
266
|
args: {
|
|
271
267
|
target: { type: "positional", description: "Env ref", required: true },
|
|
@@ -283,9 +279,12 @@ const envRunCommand = defineJsonCommand({
|
|
|
283
279
|
type: "string",
|
|
284
280
|
description: "When used with --clean, also inherit these parent env vars (comma-separated). Ignored without --clean.",
|
|
285
281
|
},
|
|
282
|
+
// Deprecated no-op, accepted through 0.10 so scripts that pass it do not
|
|
283
|
+
// fail with UNKNOWN_FLAG. Installing a bundle is the trust decision: env
|
|
284
|
+
// run no longer blocks process-hijacking keys.
|
|
286
285
|
"allow-dangerous-env-keys": {
|
|
287
286
|
type: "boolean",
|
|
288
|
-
description: "
|
|
287
|
+
description: "Deprecated, no effect: env run no longer blocks process-hijacking variables. Accepted through 0.10 for existing scripts.",
|
|
289
288
|
default: false,
|
|
290
289
|
},
|
|
291
290
|
},
|
|
@@ -295,7 +294,6 @@ const envRunCommand = defineJsonCommand({
|
|
|
295
294
|
except: parseKeyListFlag(args.except),
|
|
296
295
|
clean: args.clean === true,
|
|
297
296
|
inherit: parseKeyListFlag(args.inherit) ?? [],
|
|
298
|
-
allowDangerousEnvKeys: args["allow-dangerous-env-keys"] === true,
|
|
299
297
|
});
|
|
300
298
|
},
|
|
301
299
|
});
|
package/dist/commands/env/env.js
CHANGED
|
@@ -37,13 +37,11 @@
|
|
|
37
37
|
*
|
|
38
38
|
* Value parsing is delegated to the `dotenv` package.
|
|
39
39
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* values only, never keys;
|
|
44
|
-
*
|
|
45
|
-
* injected so this module keeps its narrow dependency surface (dotenv +
|
|
46
|
-
* core/common) and never reaches into the secret resolver/source machinery.
|
|
40
|
+
* Ref-token substitution: env VALUES may embed `${ref}` tokens (a secret's
|
|
41
|
+
* value, or any other asset's path), replaced when the env is injected (see
|
|
42
|
+
* `substituteRefTokens` in core/ref-token.ts and `resolveEnvBinding`).
|
|
43
|
+
* Substitution applies to values only, never keys; shell-style `${VAR}` /
|
|
44
|
+
* `$VAR` are left untouched.
|
|
47
45
|
*/
|
|
48
46
|
import fs from "node:fs";
|
|
49
47
|
import path from "node:path";
|
|
@@ -91,11 +89,11 @@ export function loadEnv(envPath) {
|
|
|
91
89
|
* it to the literal string `$(rm -rf ~)` and we re-emit it single-quoted. This
|
|
92
90
|
* backs `akm env export <ref> --out <file>` (file-only; never printed to stdout).
|
|
93
91
|
*
|
|
94
|
-
* NOTE: `${
|
|
95
|
-
*
|
|
96
|
-
* `${
|
|
97
|
-
* shells, never to the secret).
|
|
98
|
-
*
|
|
92
|
+
* NOTE: `${ref}` token substitution is intentionally NOT applied here. The
|
|
93
|
+
* export path emits values single-quoted as literals, so an unsubstituted
|
|
94
|
+
* `${secrets/name}` is written verbatim (it would expand to nothing under POSIX
|
|
95
|
+
* shells, never to the secret). Token resolution is scoped to the value
|
|
96
|
+
* injection path only; see `resolveEnvBinding`.
|
|
99
97
|
*/
|
|
100
98
|
export function buildShellExportScript(envPath) {
|
|
101
99
|
const env = loadEnv(envPath);
|
|
@@ -110,52 +108,6 @@ export function buildShellExportScript(envPath) {
|
|
|
110
108
|
}
|
|
111
109
|
return lines.length > 0 ? `${lines.join("\n")}\n` : "";
|
|
112
110
|
}
|
|
113
|
-
/**
|
|
114
|
-
* Matches a `${secret:NAME}` substitution token in an env value. The captured
|
|
115
|
-
* NAME accepts the same character set as a secret asset name (letters, digits,
|
|
116
|
-
* `_`, `.`, `/`, `-`). Only this exact form is recognised — shell-style
|
|
117
|
-
* `${VAR}` and `$VAR` deliberately do not match and are left untouched.
|
|
118
|
-
*/
|
|
119
|
-
const SECRET_TOKEN_RE = /\$\{secret:([A-Za-z0-9_./-]+)\}/g;
|
|
120
|
-
/**
|
|
121
|
-
* Replace every `${secret:NAME}` token in each value with the corresponding
|
|
122
|
-
* secret value, looked up via the injected `resolveSecret`. Keys are never
|
|
123
|
-
* touched. Multiple tokens per value and tokens embedded in larger strings
|
|
124
|
-
* (e.g. `Bearer ${secret:a}:${secret:b}`) are all substituted.
|
|
125
|
-
*
|
|
126
|
-
* `resolveSecret` returns `undefined` for an unknown secret name; such names are
|
|
127
|
-
* collected into `missing` (de-duplicated, in first-seen order) and their tokens
|
|
128
|
-
* are left unsubstituted in the returned values. Callers MUST treat a non-empty
|
|
129
|
-
* `missing` as a hard error and inject NOTHING — never partially inject.
|
|
130
|
-
*
|
|
131
|
-
* The lookup is injected so this module does not import the secret
|
|
132
|
-
* resolver/source machinery directly, preserving its narrow dependency surface.
|
|
133
|
-
* Resolved secret values must never be logged or printed by callers.
|
|
134
|
-
*/
|
|
135
|
-
export function resolveSecretTokens(values, resolveSecret) {
|
|
136
|
-
const missing = [];
|
|
137
|
-
const missingSeen = new Set();
|
|
138
|
-
const out = {};
|
|
139
|
-
const cache = new Map();
|
|
140
|
-
for (const [key, value] of Object.entries(values)) {
|
|
141
|
-
out[key] = value.replace(SECRET_TOKEN_RE, (match, name) => {
|
|
142
|
-
let resolved = cache.get(name);
|
|
143
|
-
if (!cache.has(name)) {
|
|
144
|
-
resolved = resolveSecret(name);
|
|
145
|
-
cache.set(name, resolved);
|
|
146
|
-
}
|
|
147
|
-
if (resolved === undefined) {
|
|
148
|
-
if (!missingSeen.has(name)) {
|
|
149
|
-
missingSeen.add(name);
|
|
150
|
-
missing.push(name);
|
|
151
|
-
}
|
|
152
|
-
return match;
|
|
153
|
-
}
|
|
154
|
-
return resolved;
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
return { values: out, missing };
|
|
158
|
-
}
|
|
159
111
|
/** Create an empty env file (does nothing if it already exists). */
|
|
160
112
|
export function createEnv(envPath) {
|
|
161
113
|
ensureParentDir(envPath);
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
* `akm secret` command family. Extracted verbatim from src/cli.ts (WS6) so the
|
|
6
6
|
* God Module shrinks; the `main.subCommands.secret` key and every subcommand's
|
|
7
7
|
* args/output shape are byte-identical. The ref-resolution helpers
|
|
8
|
-
* (parseSecretRef / makeSecretRef / resolveSecretPath
|
|
9
|
-
* findEnvSource) live in src/core/env-secret-ref.ts so env + secret share one
|
|
8
|
+
* (parseSecretRef / makeSecretRef / resolveSecretPath) live in src/core/env-secret-ref.ts so env + secret share one
|
|
10
9
|
* copy.
|
|
11
10
|
*
|
|
12
11
|
* `akm secret` manages whole-file secrets under each stash's secrets/ directory.
|
|
@@ -32,14 +31,13 @@ import path from "node:path";
|
|
|
32
31
|
import { getParsedInvocation } from "../../cli/invocation.js";
|
|
33
32
|
import { getStringArg } from "../../cli/parse-args.js";
|
|
34
33
|
import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
|
|
35
|
-
import { decideDangerousEnvInjection } from "../../core/activation-policy.js";
|
|
36
34
|
import { deriveCanonicalAssetName } from "../../core/asset/asset-placement.js";
|
|
37
35
|
import { loadConfig } from "../../core/config/config.js";
|
|
38
36
|
import { makeSecretRef, resolveSecretPath, resolveSecretWriteTarget, sensitiveMarkerPath, withEnvSecretWrite, } from "../../core/env-secret-ref.js";
|
|
39
37
|
import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
|
|
40
38
|
import { appendEvent } from "../../core/events.js";
|
|
41
|
-
import { warn } from "../../core/warn.js";
|
|
42
39
|
import { resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
40
|
+
import { isFileOrFileSymlink } from "../../indexer/walk/walker.js";
|
|
43
41
|
import { readStdin } from "../../runtime.js";
|
|
44
42
|
import { buildChildEnv } from "./child-env.js";
|
|
45
43
|
function parseKeyListFlag(raw) {
|
|
@@ -65,7 +63,7 @@ function listSecretsRecursive() {
|
|
|
65
63
|
walk(full);
|
|
66
64
|
continue;
|
|
67
65
|
}
|
|
68
|
-
if (!entry.isFile())
|
|
66
|
+
if (!entry.isFile() && !(entry.isSymbolicLink() && isFileOrFileSymlink(full)))
|
|
69
67
|
continue;
|
|
70
68
|
if (entry.name.endsWith(".lock") || entry.name.endsWith(".sensitive"))
|
|
71
69
|
continue;
|
|
@@ -99,7 +97,7 @@ const secretSetCommand = defineJsonCommand({
|
|
|
99
97
|
args: {
|
|
100
98
|
ref: {
|
|
101
99
|
type: "positional",
|
|
102
|
-
description: "Secret ref (flat name, e.g. secrets/deploy-key
|
|
100
|
+
description: "Secret ref (flat name, e.g. secrets/deploy-key; use --path for a subdirectory)",
|
|
103
101
|
required: true,
|
|
104
102
|
},
|
|
105
103
|
path: {
|
|
@@ -170,9 +168,9 @@ const secretRunCommand = defineJsonCommand({
|
|
|
170
168
|
},
|
|
171
169
|
},
|
|
172
170
|
async run({ args }) {
|
|
173
|
-
// Validate the target env var name FIRST (before the command split) so
|
|
174
|
-
//
|
|
175
|
-
//
|
|
171
|
+
// Validate the target env var name FIRST (before the command split) so an
|
|
172
|
+
// invalid name is rejected regardless of how the command is supplied — and
|
|
173
|
+
// so the failure does not depend on argv parsing.
|
|
176
174
|
const varName = args.var;
|
|
177
175
|
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(varName)) {
|
|
178
176
|
throw new UsageError(`"${varName}" is not a valid environment variable name.`, "INVALID_FLAG_VALUE");
|
|
@@ -182,28 +180,12 @@ const secretRunCommand = defineJsonCommand({
|
|
|
182
180
|
throw new UsageError("Missing command. Usage: akm secret run <ref> <VAR> -- <command>");
|
|
183
181
|
}
|
|
184
182
|
const { name, absPath, source } = resolveSecretPath(args.ref);
|
|
185
|
-
|
|
186
|
-
throw new NotFoundError(`Secret not found: ${makeSecretRef(name, source)}`);
|
|
187
|
-
}
|
|
188
|
-
const { isDangerousEnvKey } = await import("../lint/env-key-rules.js");
|
|
189
|
-
if (isDangerousEnvKey(varName)) {
|
|
190
|
-
const detail = `"${varName}" is a known process-hijacking variable (e.g. LD_PRELOAD, PATH).`;
|
|
191
|
-
const decision = decideDangerousEnvInjection({
|
|
192
|
-
dangerousKeys: [varName],
|
|
193
|
-
thirdParty: Boolean(source.registryId),
|
|
194
|
-
});
|
|
195
|
-
if (decision === "block") {
|
|
196
|
-
throw new UsageError(`Refusing to inject a secret from a third-party stash into ${detail}\n` +
|
|
197
|
-
" Review the secret, then copy it into a first-party secret if you trust it.", "INVALID_FLAG_VALUE");
|
|
198
|
-
}
|
|
199
|
-
warn(`Injecting a secret into ${detail} Injecting anyway (first-party stash).`);
|
|
200
|
-
}
|
|
201
|
-
const { readValue } = await import("./secret.js");
|
|
183
|
+
const { readValue } = await import("../../core/secret-value.js");
|
|
202
184
|
const mergedEnv = buildChildEnv(process.env, {
|
|
203
185
|
clean: args.clean === true,
|
|
204
186
|
inherit: parseKeyListFlag(args.inherit) ?? [],
|
|
205
187
|
});
|
|
206
|
-
mergedEnv[varName] = readValue(absPath)
|
|
188
|
+
mergedEnv[varName] = readValue(absPath);
|
|
207
189
|
// Audit trail: record access by ref + var name only — never the value.
|
|
208
190
|
appendEvent({
|
|
209
191
|
eventType: "secret_access",
|
|
@@ -225,8 +207,8 @@ const secretRunCommand = defineJsonCommand({
|
|
|
225
207
|
throw err;
|
|
226
208
|
}
|
|
227
209
|
// R-067: was `process.exit(result.status ?? 0)`, unconditional even on
|
|
228
|
-
// the success path — it skipped the `finally {
|
|
229
|
-
//
|
|
210
|
+
// the success path — it skipped the `finally { disposeLlmUsageSink(); }`
|
|
211
|
+
// cleanup in src/cli.ts's `runCommand`.
|
|
230
212
|
// Setting `process.exitCode` and returning still exits with the child's
|
|
231
213
|
// exact status once the event loop drains, but lets cleanup run first —
|
|
232
214
|
// same pattern `emitJsonError` (src/cli/shared.ts) already established.
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* The supported value-use path is:
|
|
18
18
|
*
|
|
19
19
|
* - `akm secret run <ref> <VAR> -- <cmd>` — value injected into the child
|
|
20
|
-
* process env as `VAR=<value>` (see `readValue`).
|
|
20
|
+
* process env as `VAR=<value>` (see `readValue` in `core/secret-value.ts`).
|
|
21
21
|
*
|
|
22
22
|
* `akm secret path <ref>` (print the file path for the Docker `/run/secrets` +
|
|
23
23
|
* `_FILE` convention) was removed in 0.9.0 alongside `akm secret remove` — an
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
* and could silently target different files. A ref's file still lives at
|
|
26
26
|
* `<stash>/secrets/<name>`; locate or delete it there directly.
|
|
27
27
|
*
|
|
28
|
-
* Values are stored as raw bytes (no quoting, multi-line allowed)
|
|
29
|
-
*
|
|
28
|
+
* Values are stored as raw bytes (no quoting, multi-line allowed), unlike env
|
|
29
|
+
* values which forbid literal newlines; they are read back trimmed (`core/secret-value.ts`).
|
|
30
30
|
*/
|
|
31
31
|
import { createHash } from "node:crypto";
|
|
32
32
|
import fs from "node:fs";
|
|
@@ -82,13 +82,6 @@ function ensureParentDir(filePath) {
|
|
|
82
82
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
83
83
|
}
|
|
84
84
|
// ── Public API ──────────────────────────────────────────────────────────────
|
|
85
|
-
/**
|
|
86
|
-
* Read a secret's raw bytes. Internal use only (for `secret run`). Callers
|
|
87
|
-
* MUST NOT write the returned value to stdout or any log.
|
|
88
|
-
*/
|
|
89
|
-
export function readValue(secretPath) {
|
|
90
|
-
return fs.readFileSync(secretPath);
|
|
91
|
-
}
|
|
92
85
|
/**
|
|
93
86
|
* Write (create or overwrite) a secret with the given raw bytes, atomically at
|
|
94
87
|
* mode 0600 under a write-lock. No quoting; multi-line / binary allowed.
|