akm-cli 0.10.261012-beta → 0.10.261014-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,712 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.10.261014] - 2026-10-27
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Connections and harnesses replace engines (#1244). `config.json` names
|
|
14
|
+
`connections`, the OpenAI-compatible endpoints akm reaches models through
|
|
15
|
+
(`endpoint`, `apiKey`, `models`, `contextLength`, `timeoutMs`, `concurrency`;
|
|
16
|
+
every other key on a connection or a model entry is a request field in the
|
|
17
|
+
endpoint's own spelling, sent as written), and `harnesses`, the agent programs
|
|
18
|
+
you already have (`platform`, `bin`, `args`, `workspace`, `agent`,
|
|
19
|
+
`timeoutMs`, `models`). There is no `defaults` block: the entry named
|
|
20
|
+
`default`, or the only entry, is the default connection or harness. Anywhere a
|
|
21
|
+
connection or harness can be named (config, a flag, an asset's `connection:`
|
|
22
|
+
or `harness:`) and none is, the default is used; a name that is not
|
|
23
|
+
configured is an error (exit 78) that names it, lists the configured ones and
|
|
24
|
+
the nearest, and is never replaced by the default. With neither
|
|
25
|
+
configured, model features and agent work are off, each command that needs one
|
|
26
|
+
says so and points at `akm setup`, and everything that needs no model keeps
|
|
27
|
+
working.
|
|
28
|
+
- `improve.strategy` replaces `defaults.improveStrategy`. `improve.processes.
|
|
29
|
+
<process>` and `improve.qualityGate` say where each process and the quality
|
|
30
|
+
gates run (`connection` or `harness`, `model`, `llm`, `timeoutMs`),
|
|
31
|
+
`improve.connection` and `improve.harness` where all of `akm improve`'s model
|
|
32
|
+
work runs, and `index` takes `connection`, `model`, `llm` and `timeoutMs`. A
|
|
33
|
+
strategy says which processes run, never where.
|
|
34
|
+
- `embedding` with a `model` and no `endpoint` is served by the default
|
|
35
|
+
connection: its endpoint and its key. With no connection, the built-in local
|
|
36
|
+
embedder runs, with one warning.
|
|
37
|
+
- A connection or harness its own schema rejects (no endpoint, an endpoint that
|
|
38
|
+
is not a URL, a harness akm cannot run) is ignored with one warning naming
|
|
39
|
+
it, instead of stopping every command; the rest of the file loads.
|
|
40
|
+
- Aliases and `akm models`. A connection's `models` maps an alias (`fast`,
|
|
41
|
+
`balanced`, `reasoning`, or your own) to the model's name, or to an object
|
|
42
|
+
holding the name and request fields of its own; a harness's `models` maps an
|
|
43
|
+
alias to the harness's own model name, over the map akm ships for its platform
|
|
44
|
+
(Claude Code has one). An alias a connection does not map answers with its
|
|
45
|
+
first model. `akm models` lists a connection's aliases, then the models its
|
|
46
|
+
endpoint lists, and `akm models set <alias> <model>` changes one, keeping the
|
|
47
|
+
request fields of an alias that has them and warning when the endpoint does not
|
|
48
|
+
list the model. `--connection` picks another connection and `--no-probe` skips
|
|
49
|
+
the listing.
|
|
50
|
+
- `--connection`, `--harness` and `--model` on `akm agent`, `akm command run`,
|
|
51
|
+
`akm improve`, `akm proposal new`, `akm proposal extract` and `akm task add`
|
|
52
|
+
say where one invocation runs and with which model; omitted means the default,
|
|
53
|
+
and `--connection` and `--harness` are mutually exclusive. A run's selection
|
|
54
|
+
reaches every call in it, the quality-gate judges of `akm improve` included.
|
|
55
|
+
`akm task add` writes them into the task, and `akm task explain` reads them
|
|
56
|
+
back.
|
|
57
|
+
- Keys come from a `$VAR` reference (`apiKey: "$NAME"`) or from
|
|
58
|
+
`<config dir>/credentials.json` (0600), where each key is stored for one
|
|
59
|
+
endpoint: `{ "connections": { "<name>": { "key", "endpoint" } }, "services":
|
|
60
|
+
{ "embedding" | "curateRerank": { "key", "endpoint" } } }`. A key is read for
|
|
61
|
+
that endpoint alone, and a connection called `embedding` and the embedding
|
|
62
|
+
service hold different keys. A connection only an `extends` base defines uses
|
|
63
|
+
no key stored on this host (the base chose its endpoint); its runner records
|
|
64
|
+
`storedKey: false`, so a journaled or resumed run withholds it whether or not
|
|
65
|
+
the config is loaded. A literal `apiKey` in
|
|
66
|
+
`config.json` is kept, warned about once, and never read, sent or printed;
|
|
67
|
+
`akm config get` masks it and the redactor treats it as a secret.
|
|
68
|
+
- `akm health` has one `connections-and-harnesses` check, and `akm info` a
|
|
69
|
+
`connectionsAndHarnesses` list, with a
|
|
70
|
+
row for each connection (its endpoint, whether its key is held and, for
|
|
71
|
+
health, whether the endpoint answers), each harness (its platform, whether its
|
|
72
|
+
binary is found and, when probing, its version) and each kind of work (improve,
|
|
73
|
+
judges, agents, extract, enrich, index, embedding, curate rerank) naming the
|
|
74
|
+
connection or harness and the model it resolves to. The rows are resolved by
|
|
75
|
+
the code the calls use, so the table cannot disagree with a dispatch. An
|
|
76
|
+
override is compared by kind as well as name and model, so a connection and a
|
|
77
|
+
harness that share a name do not hide a per-process pin; each override row
|
|
78
|
+
carries `kind`. `akm info` contacts nothing, and neither does `akm health
|
|
79
|
+
--no-probe`.
|
|
80
|
+
- `akm setup` asks which installed agent programs to enable (saying whether akm
|
|
81
|
+
can limit each to reading and searching for its own model calls, judged on the
|
|
82
|
+
program the harness will run: `harnesses.<name>.bin`, else the platform's
|
|
83
|
+
binary on `PATH`), whether the default one also
|
|
84
|
+
takes akm's model calls (a no with no connection after it is saved as
|
|
85
|
+
`modelWork: false` on that harness, which keeps model calls off it by default;
|
|
86
|
+
a saved `modelWork: false` stays through `--yes` and is the question's default,
|
|
87
|
+
and only a yes clears it), an endpoint with its key at a masked prompt and one
|
|
88
|
+
model for each alias, picked from the models the endpoint lists, and where
|
|
89
|
+
embeddings come from. A key you type is stored in `credentials.json` for the
|
|
90
|
+
connection and its endpoint. Each flag answers one question and `--yes` takes the
|
|
91
|
+
detected default for the rest: `--endpoint`, `--api-key-env`, `--name`,
|
|
92
|
+
`--harness`, `--embedding`, `--embedding-endpoint` and
|
|
93
|
+
`--embedding-api-key-env`. A rerun starts from the current config and keeps the
|
|
94
|
+
alias picks it has. `--no-probe` runs offline: the endpoint is not contacted,
|
|
95
|
+
no models are listed, and the connection has no model until `akm models set`
|
|
96
|
+
names one.
|
|
97
|
+
- Non-interactively, with no harness yet configured, `akm setup` enables every
|
|
98
|
+
agent program found on `PATH`, the first the default; with none, agent work
|
|
99
|
+
runs on akm's own runtime over the connection.
|
|
100
|
+
- Agent work on a connection, with no harness, runs on akm's own runtime: a
|
|
101
|
+
pinned OpenCode 2 binary (2.1.4) that akm fetches and runs as a process, one
|
|
102
|
+
per run (#1244). It has no entry in config, and `opencode-sdk` is not a
|
|
103
|
+
harness platform.
|
|
104
|
+
- The first run fetches the binary: the one `@opencode/cli-<platform>` package
|
|
105
|
+
for the machine (its OS and CPU, musl, and the baseline build for an x64 CPU
|
|
106
|
+
without AVX2, chosen as OpenCode's own installer chooses), about 114 MB, from
|
|
107
|
+
the npm registry into `<akm cache dir>/opencode/2.1.4/`, checked against the
|
|
108
|
+
registry's sha512 integrity before anything is extracted. Two akm processes
|
|
109
|
+
fetching at once both finish. A failed fetch fails the run as not started and
|
|
110
|
+
names the package, its URL and the cache path; with no network for that step,
|
|
111
|
+
enable the `opencode` harness with an installed OpenCode 2. No setting points
|
|
112
|
+
the runtime at a binary of your own. On Alpine/musl the binary needs
|
|
113
|
+
`libstdc++` and `libgcc` (the Alpine Node image has them).
|
|
114
|
+
- The run is the command the `opencode` harness builds for OpenCode 2 model
|
|
115
|
+
work (`run --standalone --title akm`, the prompt on stdin), driven by the
|
|
116
|
+
connection a run was dispatched with, as the run froze it: the connection is
|
|
117
|
+
the process's only provider (`@ai-sdk/openai-compatible`, which the binary
|
|
118
|
+
bundles, so nothing is downloaded for it), at the connection's endpoint with
|
|
119
|
+
its key, carrying the one model the run names and the context window and
|
|
120
|
+
output cap the connection states, so the endpoint receives the model name as
|
|
121
|
+
written, as on chat, and a connection edited or removed later cannot redirect
|
|
122
|
+
the run.
|
|
123
|
+
- The process is akm's own. OpenCode's config, data, cache, state and temp
|
|
124
|
+
directories are under `<akm data dir>/opencode-runtime/`, no `OPENCODE_*`
|
|
125
|
+
variable of akm's environment reaches it, and it has no user or project
|
|
126
|
+
OpenCode config, no Claude Code skills, no model catalog fetch and no hosted
|
|
127
|
+
free models. It still
|
|
128
|
+
loads what OpenCode reads from outside its config directories: `~/.agents`,
|
|
129
|
+
and OpenCode's system config (`/etc/opencode`, or macOS managed
|
|
130
|
+
preferences).
|
|
131
|
+
- `--standalone` keeps a run to one process that ends with it, and another
|
|
132
|
+
run's unfinished turns are never resumed (OpenCode's background service
|
|
133
|
+
resumes every top-level session whose turn did not finish, whichever process
|
|
134
|
+
owns it). OpenCode makes and migrates its database at start, and two
|
|
135
|
+
processes doing that to one database break each other, so the first start of
|
|
136
|
+
the runtime's OpenCode version is a run of its own (`session list`, no model)
|
|
137
|
+
under a lock file in the runtime directory, and every run that starts with it,
|
|
138
|
+
a workflow's parallel units or another akm process's, waits for it.
|
|
139
|
+
- A plugin akm writes to the runtime's config directory gives the agent akm's
|
|
140
|
+
read tools (`akm_search`, `akm_show`, `akm_curate`), which call the `akm` that
|
|
141
|
+
started the run with `--detail agent --format json` and the run's
|
|
142
|
+
environment, so a stamped run's reads count as that run's. The same plugin lays
|
|
143
|
+
the connection's request fields, in the endpoint's own spelling, over each
|
|
144
|
+
model request, and takes off the output cap OpenCode adds to every request
|
|
145
|
+
(`max_completion_tokens: 32000` unless the model's limit says otherwise): a
|
|
146
|
+
request carries the cap the connection or the call writes, and none
|
|
147
|
+
otherwise, as on chat. A persona goes in the prompt.
|
|
148
|
+
- The commands the agent runs get the environment a CLI harness's child gets,
|
|
149
|
+
less its `OPENCODE_*` variables: akm's own, with its directories
|
|
150
|
+
(`AKM_CONFIG_DIR` and the rest) and the run's variables (workflow and task
|
|
151
|
+
`env:`, `AKM_EVENT_SOURCE`) set over it. What
|
|
152
|
+
akm sets for the OpenCode process itself (its directories and its OpenCode
|
|
153
|
+
settings) is put back to what akm runs in, or removed, for each command.
|
|
154
|
+
- The connection's key is in no process's environment: the inline config names
|
|
155
|
+
a file under `<akm data dir>/opencode-runtime/keys/` that holds it for the
|
|
156
|
+
run (0600, removed when the run ends).
|
|
157
|
+
- Sessions are stored in the runtime's own OpenCode database,
|
|
158
|
+
`<akm data dir>/opencode-runtime/data/opencode/opencode.db`; akm reads your
|
|
159
|
+
OpenCode 2 database read-only, for OpenCode 2 history (below).
|
|
160
|
+
- A timeout or an abort ends the run's process group, SIGINT first and SIGTERM
|
|
161
|
+
and SIGKILL after 5 s each, as for every harness. A unit `timeout` therefore
|
|
162
|
+
ends a turn in about the timeout when the endpoint is down; OpenCode alone
|
|
163
|
+
retries a failing endpoint with backoff for over a minute and has no config
|
|
164
|
+
setting to shorten it, so a unit with no `timeout` waits that long.
|
|
165
|
+
- OpenCode's headless `run` cancels questions and rejects permission requests,
|
|
166
|
+
and the model carries on. A run reports its session id and the tokens its turn
|
|
167
|
+
used, read from the session OpenCode keeps in the runtime's database, so a
|
|
168
|
+
workflow's `budget.max_tokens` and the unit journal count them; a harness run
|
|
169
|
+
reports neither.
|
|
170
|
+
- A failed run reports as a harness run does, a non-zero exit with OpenCode's
|
|
171
|
+
own message: the `llm_rate_limit`, `llm_content_filter` and `parse_error`
|
|
172
|
+
reasons the embedded runtime gave are not given.
|
|
173
|
+
- `platform: "opencode"` is your OpenCode, whichever major is installed, run
|
|
174
|
+
through its CLI: `opencode run` with the prompt on stdin, a model only when akm
|
|
175
|
+
names one, an agent only when the asset names one, and your `args` as written.
|
|
176
|
+
Agent work adds nothing else. Your OpenCode owns its configuration, logins and
|
|
177
|
+
sessions; akm reads, copies and embeds nothing of yours, and its runs are in
|
|
178
|
+
your OpenCode history, which improve reads. An interactive `akm agent` still
|
|
179
|
+
hands the terminal to the CLI. Model work is akm's own process: it adds its
|
|
180
|
+
agent to your inline config, read as OpenCode reads it (JSONC, and a
|
|
181
|
+
`{env:NAME}` reference written outside a string replaced by its value), and
|
|
182
|
+
keeps the rest of it, sets
|
|
183
|
+
`OPENCODE_DISABLE_FREE_MODELS=1` (OpenCode 2.1.2 and later honor it: a call
|
|
184
|
+
with no usable provider fails instead of sending the prompt to OpenCode's
|
|
185
|
+
hosted free model), and on OpenCode 2 runs `--standalone` (one process that
|
|
186
|
+
ends with the run, not a background service) with `--title akm`.
|
|
187
|
+
- A config in the old form (`engines`, `defaults.engine`, `defaults.llmEngine`,
|
|
188
|
+
`defaults.improveStrategy`, `workflow.judgeEngine`, a strategy's `engine`,
|
|
189
|
+
`model`, `llm` and `timeoutMs`) still loads: it is read as the new form in
|
|
190
|
+
memory, with one warning that names `akm migrate apply`, and the file is
|
|
191
|
+
rewritten only by `akm migrate apply`. An ordinary write (`akm config set`)
|
|
192
|
+
edits the file's own document and no longer converts it or drops what the
|
|
193
|
+
loader only reads; removing a value the old form supplies is refused, naming
|
|
194
|
+
`akm migrate apply`. `akm migrate apply` converts it for good, under a backup
|
|
195
|
+
of `config.json`:
|
|
196
|
+
- `engines` and `defaults` become `connections` and `harnesses` (the default
|
|
197
|
+
engine is renamed `default`, and references follow), `defaults.improveStrategy`
|
|
198
|
+
becomes `improve.strategy`, a strategy's per-process `engine` becomes
|
|
199
|
+
`connection` or `harness` by the target's kind, the where-fields a strategy
|
|
200
|
+
carried move to `improve.processes` and `improve.qualityGate`, and
|
|
201
|
+
`index.defaults.*` and `index.<pass>.engine` become `index.*` and
|
|
202
|
+
`connection`. An engine that is akm's own OpenCode runtime, or a setting akm
|
|
203
|
+
no longer reads, is dropped with a note.
|
|
204
|
+
- An engine's `apiKeyFile`, a literal or `${secrets/...}` `apiKey`, and the
|
|
205
|
+
same literal or secret-store `apiKey` on a connection, `embedding` or
|
|
206
|
+
`search.curateRerank`, are read and stored in `credentials.json` for the
|
|
207
|
+
connection's new name (or the `embedding` or `curateRerank` service) and the
|
|
208
|
+
endpoint the block names, then removed from the file. A key that cannot be
|
|
209
|
+
moved (its secret does not resolve, the block names no endpoint of its own, a
|
|
210
|
+
`connections` entry now gives it another endpoint than its engine wrote the key
|
|
211
|
+
for, or `credentials.json` already holds a different key or endpoint for that
|
|
212
|
+
slot) stays on the
|
|
213
|
+
connection as `apiKey`, with a note. One note per key names it, never its
|
|
214
|
+
value. `AKM_ENGINE_<NAME>_API_KEY` and `AKM_LLM_API_KEY`, when set, become
|
|
215
|
+
`apiKey: "$VAR"`. An engine that names no key, with none of those variables
|
|
216
|
+
set, gets none, and a note names the variables.
|
|
217
|
+
- A key in `credentials.json`'s older flat `{ "<name>": "<key>" }` form is
|
|
218
|
+
filed under the endpoint the config gives its block, after the file is copied
|
|
219
|
+
to `<cache dir>/config-backups/credentials.json.<timestamp>`. A block that
|
|
220
|
+
already has a stored key is never overwritten: the same key for the same
|
|
221
|
+
endpoint drops the older entry, and any other leaves both, with a note. A flat
|
|
222
|
+
key called `connections` or `services` is told from the namespace of that name
|
|
223
|
+
by its shape.
|
|
224
|
+
- The old engine names are kept in the data directory (`migrate/engine-targets.json`)
|
|
225
|
+
until no `engine:` key that names one is left in a file the migration can
|
|
226
|
+
reach, so an asset in a read-only bundle, a block it could not rewrite, or an
|
|
227
|
+
asset that is a symbolic link (read through, never rewritten) keeps its
|
|
228
|
+
meaning in the meantime, as does a retired `--engine` flag. The run
|
|
229
|
+
that forgets them adds one note, `assetEngineKeys.notes`, listing each
|
|
230
|
+
renamed engine with the flag that replaces `--engine <old name>`
|
|
231
|
+
(`--connection` or `--harness`).
|
|
232
|
+
- The user `models.json` is folded into the models of the connections and
|
|
233
|
+
harnesses it names, then moved to
|
|
234
|
+
`<cache dir>/config-backups/models.json.<timestamp>`. A connection's own
|
|
235
|
+
column beats the `*` column and the flat shorthand, which beat the engine's
|
|
236
|
+
own model; a model the config already names for an alias stands. What it
|
|
237
|
+
cannot place is listed in the notes.
|
|
238
|
+
- `engine:` on commands, agents, workflows (`defaults` and units) and task
|
|
239
|
+
sources becomes `connection:` or `harness:` by what the name is now, under
|
|
240
|
+
one backup directory per run (a name that is neither is written as
|
|
241
|
+
`harness:`, with a note). `akm migrate status` and `--dry-run` list the files.
|
|
242
|
+
The step reads the roots the runtime reads, by each bundle's adapter (an
|
|
243
|
+
`akm` stash's typed directories, an `akm-workflow` or `akm-task` bundle's
|
|
244
|
+
root, a Claude or OpenCode bundle's commands and agents, there for
|
|
245
|
+
`akm.engine` only), the default stash (`~/akm`)
|
|
246
|
+
included when no bundle or `AKM_BUNDLE_DIR` names it, and leaves a disabled
|
|
247
|
+
bundle as written, the default stash or the `AKM_BUNDLE_DIR` directory
|
|
248
|
+
included, under any spelling of its path.
|
|
249
|
+
- A connection or harness the loader ignores stays in the file, with a note
|
|
250
|
+
on what to fix; `akm migrate apply` never deletes one.
|
|
251
|
+
- The residue sweep leaves the `.akm/` of a stash a disabled bundle owns as
|
|
252
|
+
written, as the task and asset steps do.
|
|
253
|
+
- The standalone binary does local semantic search. It carries the ONNX Runtime
|
|
254
|
+
library for its platform and, the first time it embeds, copies it once into
|
|
255
|
+
`<cache dir>/onnxruntime/<version>-<platform>-<arch>/` (18 to 34 MB) and loads
|
|
256
|
+
it from there. A binary writes its native addon to the system temp directory,
|
|
257
|
+
so a `noexec` temp directory blocks semantic search (keyword search works): set
|
|
258
|
+
`TMPDIR` to an executable one.
|
|
259
|
+
Alpine/musl and Intel macOS have no native ONNX Runtime library: the index
|
|
260
|
+
reports semantic search `blocked` with the reason, and keyword search works.
|
|
261
|
+
- `akm index --format json` reports `verification.embeddingRuntime`, the runtime
|
|
262
|
+
the local embedder embedded with (`onnxruntime-node`); it is absent for a
|
|
263
|
+
remote embedding provider and when nothing was embedded locally.
|
|
264
|
+
- `akm health` has a `semantic-search` check again. `akm index` records the
|
|
265
|
+
semantic status it found (with the runtime and, when semantic search is
|
|
266
|
+
`blocked` or `unavailable` on this machine, the reason) beside its other
|
|
267
|
+
index facts, and the check reads that record with the index's current entry
|
|
268
|
+
and vector counts: `pass` when every entry has a vector on the native runtime,
|
|
269
|
+
`warn` when vectors lag, another runtime embedded, or the platform has no
|
|
270
|
+
native ONNX Runtime library (Alpine/musl, Intel macOS), `fail` when blocked
|
|
271
|
+
or unavailable for a cause that can be fixed (the library did not load). It
|
|
272
|
+
loads no model and sends no request, and search does not read
|
|
273
|
+
the record. The health report's Semantic Search line shows the check (`OK`,
|
|
274
|
+
`OFF`, `BLOCKED`, `UNAVAILABLE` or `UNKNOWN`); it used to say `OK` always.
|
|
275
|
+
|
|
276
|
+
### Changed
|
|
277
|
+
|
|
278
|
+
- Each kind of call asks for a shipped alias until something nearer names a
|
|
279
|
+
model: improve passes, extract, enrich and the index passes ask for `fast`;
|
|
280
|
+
judges (the reflect and distill quality gates, triage's judgment, workflow
|
|
281
|
+
gates) and agent work ask for `balanced`. A harness with a model map but no
|
|
282
|
+
entry for the alias warns once.
|
|
283
|
+
- Model work runs on any harness. Where a harness can be restricted it is: Claude
|
|
284
|
+
Code runs with its settings files ignored, only `Read` and `akm search`, `akm
|
|
285
|
+
show` and `akm curate`, no MCP servers and no saved transcript, Codex with
|
|
286
|
+
`--sandbox read-only`, and OpenCode 2 as an agent passed inline for the run,
|
|
287
|
+
in OpenCode 2's native `agents` map so that an entry of its name in your
|
|
288
|
+
config cannot replace it, with every tool denied except `read`, `glob` and
|
|
289
|
+
`grep` (and `akm_search`, `akm_show` and `akm_curate` when the akm plugin is
|
|
290
|
+
installed), so a tool a plugin adds is denied too; a plugin's own hooks still
|
|
291
|
+
run. Where it cannot
|
|
292
|
+
(the other platforms, and OpenCode 1, which warns once), the call runs
|
|
293
|
+
unrestricted, in a scratch directory, with a notice. A config that names an `opencode` harness for model work loads, and a
|
|
294
|
+
native agent named for model work is ignored with a notice. Agent work is not
|
|
295
|
+
restricted: it runs the program as you would.
|
|
296
|
+
- The `opencode` CLI dispatch path is no longer deprecated (0.10.261001 deprecated
|
|
297
|
+
it in favour of an `opencode-sdk` engine, which is gone): `platform:
|
|
298
|
+
"opencode"` is the `opencode` harness, your own OpenCode of either major run
|
|
299
|
+
through `opencode run`.
|
|
300
|
+
- Every process akm starts inherits akm's environment: a harness's child, a
|
|
301
|
+
workflow `exec` unit's command, a task's command and the commands of an agent
|
|
302
|
+
on akm's own runtime get the environment akm runs in, with the directories this akm
|
|
303
|
+
resolved, the run's `AKM_EVENT_SOURCE` and a unit's `env:` bindings set over it.
|
|
304
|
+
The environment allowlist, the Windows floor, the `PATH` supplement for
|
|
305
|
+
scheduler contexts, each harness's passthrough names and the passthrough
|
|
306
|
+
redaction policy are gone, and a frozen `pass_env` still parses and selects
|
|
307
|
+
nothing. A dispatch reply from any runner is scrubbed of the connection's key.
|
|
308
|
+
It, and the output and diagnostics a workflow `exec` unit journals, are
|
|
309
|
+
scrubbed of the values of credential-named variables in the environment the
|
|
310
|
+
child inherited (names such as `*_API_KEY`, `*_TOKEN`, `*_SECRET` and
|
|
311
|
+
`*_PASSWORD`, eight characters or more), the same rule a task log uses; a
|
|
312
|
+
task log also scrubs the values its `redact:` list names, and a workflow
|
|
313
|
+
journal the `secrets/` values substituted into a binding.
|
|
314
|
+
`env run --clean` keeps its own list. Agent work on OpenCode adds nothing to the
|
|
315
|
+
invocation; Codex agent work no longer sets `--sandbox workspace-write` and
|
|
316
|
+
Aider no longer gets `--no-auto-commits`, so each runs with the settings its
|
|
317
|
+
own configuration gives it (model work on Codex still runs `--sandbox
|
|
318
|
+
read-only`).
|
|
319
|
+
- Stopping a child process (a timeout, an abort, or a signal to akm) sends its
|
|
320
|
+
process group SIGINT first, then SIGTERM and SIGKILL, each after a 5 second
|
|
321
|
+
grace for as long as it still runs, where it sent SIGTERM and then SIGKILL.
|
|
322
|
+
SIGTERM also follows at once when the leader exits and leaves members of its
|
|
323
|
+
group behind. This covers agent programs, workflow `exec` units and task
|
|
324
|
+
commands. A program that records how a run ended acts on the SIGINT: OpenCode 2
|
|
325
|
+
marks its session interrupted and releases it, and only a run that had to be
|
|
326
|
+
terminated or killed stays suspended in your OpenCode history, where your own
|
|
327
|
+
OpenCode's background service may resume it (up to ten attempts, OpenCode's own
|
|
328
|
+
policy). On Windows there is no process group and a signal ends the program at
|
|
329
|
+
once.
|
|
330
|
+
- Harnesses are thin shells. akm writes only the arguments a program needs to run
|
|
331
|
+
without a person, hands it the prompt and takes its standard output as the
|
|
332
|
+
reply, as written: it no longer asks for JSON output or reads a result or a
|
|
333
|
+
session id out of it. A reply that must have a shape is parsed once by the
|
|
334
|
+
caller, from the schema instruction already in the prompt. Claude Code and pi
|
|
335
|
+
take the prompt on stdin, and their persona goes to `--append-system-prompt`
|
|
336
|
+
(appended to pi's own prompt).
|
|
337
|
+
- `akm agent` with no `--prompt` starts the harness for a person, with the
|
|
338
|
+
terminal and the harness's model; a connection has nothing to start, and the
|
|
339
|
+
command says so, naming `--prompt` and a harness.
|
|
340
|
+
- One loop corrects a reply that must have a shape. When the parser refuses the
|
|
341
|
+
reply, it is sent once more with what was wrong; reflect, distill, extract,
|
|
342
|
+
`akm proposal new`, the judges, the proposal drain's judgment and a workflow
|
|
343
|
+
unit with an output schema all use it. A call that fails ends as the dispatch
|
|
344
|
+
reported it, and a workflow exec step is never run twice to fix its output.
|
|
345
|
+
- A model call has one timeout, and it is the resolver's: the call's own setting,
|
|
346
|
+
else the connection's or harness's `timeoutMs`, else ten minutes for model work
|
|
347
|
+
(agent work on a harness runs until it finishes). A retry after a transient
|
|
348
|
+
failure spends what is left of the call's budget, and `akm remember --enrich`
|
|
349
|
+
keeps its 10 s limit on the request itself.
|
|
350
|
+
- `--engine NAME` on `akm agent`, `akm command run`, `akm task add`, `akm
|
|
351
|
+
proposal new` and `akm proposal extract`, and `--require-engines` on `akm
|
|
352
|
+
improve`, are still accepted, hidden from `--help` and completions, with one
|
|
353
|
+
warning each. `--engine` names a connection by that name, else a harness (`akm
|
|
354
|
+
task add --engine` writes `connection:` or `harness:`), and `--require-engines`
|
|
355
|
+
does nothing: `akm improve` stops at planning (exit 78) before any lock, index
|
|
356
|
+
write or log when no process that calls a model has a connection or harness to
|
|
357
|
+
run on (or there are several and none is called `default`), with no flag asking
|
|
358
|
+
for it. That is weaker than what the flag did, and a scheduled caller that
|
|
359
|
+
relied on it loses that: no check before the run that every enabled process
|
|
360
|
+
has a usable target and a working completion. A run with some processes that
|
|
361
|
+
can run and some that cannot runs the former and lists the rest in
|
|
362
|
+
`skippedProcesses`, and a configured but unusable target (a harness program
|
|
363
|
+
that is not installed, a connection that does not answer) is found when the
|
|
364
|
+
process dispatches. Run `akm health` first instead (`akm health && akm
|
|
365
|
+
improve`; it exits 4 on a warning): its `connections-and-harnesses` check names
|
|
366
|
+
each connection that does not answer, each harness program that is not
|
|
367
|
+
installed and a missing default. A did-you-mean for an unknown flag never
|
|
368
|
+
offers a hidden flag.
|
|
369
|
+
- A workflow run frozen by an earlier release (plan irVersion 7 or lower) whose
|
|
370
|
+
plan holds a command target is no longer resumed: it is abandoned (status
|
|
371
|
+
`failed`) with a message naming `akm workflow run <ref>` to start afresh.
|
|
372
|
+
Converting its engine runners would have changed unit input hashes and
|
|
373
|
+
published a second child run. Plans with no command target still decode. The
|
|
374
|
+
plan version is now 8, which freezes a connection or a harness where 7
|
|
375
|
+
froze an engine.
|
|
376
|
+
- `akm proposal extract --type opencode` and the improve extract gate read
|
|
377
|
+
OpenCode 2 history from the `session_v2` and `session_message` tables with
|
|
378
|
+
SQLite, read-only, from your OpenCode database and akm's own: top-level
|
|
379
|
+
sessions only, without subagent sessions or akm's model work (which ran as the
|
|
380
|
+
`akm-model-work` agent; OpenCode 1 keeps no such marker). The content hash
|
|
381
|
+
of every session is unchanged, so nothing is extracted again. A file or
|
|
382
|
+
session that cannot be read (a session missing from its file, a file with
|
|
383
|
+
neither OpenCode layout) is recorded as `read_failed`, not as an empty
|
|
384
|
+
`too_short` session.
|
|
385
|
+
- OpenCode's directories follow `XDG_DATA_HOME`, `XDG_CACHE_HOME` and
|
|
386
|
+
`XDG_CONFIG_HOME` on every platform, as OpenCode's own do (the data path was
|
|
387
|
+
wrong on macOS and ignored `XDG_DATA_HOME`); `akm health` follows
|
|
388
|
+
`XDG_CACHE_HOME` for OpenCode's plugin cache too.
|
|
389
|
+
- Model work no longer counts as user demand. Model work run through
|
|
390
|
+
`structured-call`, `propose` or `drain` stamped no event source, so the `akm`
|
|
391
|
+
commands its agent ran were recorded as the user's, which feeds ranking; it now
|
|
392
|
+
stamps `improve` (a task's agent still records `task`, and an unknown source
|
|
393
|
+
`unknown`).
|
|
394
|
+
- `GET /api/config` lists `connections` and `harnesses`, each a list of named
|
|
395
|
+
entries, where it listed `engines`, and the config page shows the two as
|
|
396
|
+
tables.
|
|
397
|
+
- The npm package depends on no OpenCode library: akm's own runtime fetches one
|
|
398
|
+
OpenCode binary on first use instead, so `npm install -g akm-cli` needs no
|
|
399
|
+
compiler (the OpenCode libraries it replaces pulled in a native addon that
|
|
400
|
+
built from source) and the installed package is smaller. Standalone binaries are
|
|
401
|
+
built by `scripts/build-standalone.ts` with no stubs for those libraries.
|
|
402
|
+
- Bundles are fetched when added and on `akm bundle update`. `akm index` no
|
|
403
|
+
longer re-fetches a git or website bundle after twelve hours, `--full` does
|
|
404
|
+
not force a fetch, and a failed forced refresh reports the failure instead of
|
|
405
|
+
serving the old copy for up to seven days (the previous copy stays on disk).
|
|
406
|
+
A configured npm bundle with no lock entry is skipped by `akm index` with one
|
|
407
|
+
warning naming `akm bundle update`, instead of hitting the npm registry on
|
|
408
|
+
every index run.
|
|
409
|
+
- `akm search --assets` is removed. It asked registries for asset-level hits,
|
|
410
|
+
but `akm search` never put them in its output, so the flag printed nothing; the
|
|
411
|
+
registry providers' asset scoring and the `assetHits` response field go with it.
|
|
412
|
+
- Registry hits from `akm search --from registry|all` carry `installRef` (the ref
|
|
413
|
+
for `akm bundle add`). The brief projection already listed it, but the hit was
|
|
414
|
+
built without it, so `--detail brief` showed only the name and score.
|
|
415
|
+
- `akm search --detail normal` includes `ref` on local hits, as `brief` already
|
|
416
|
+
did. `normal` was the only level that showed a hit without the ref `akm show`
|
|
417
|
+
needs.
|
|
418
|
+
- Env and secret files are indexed even when the bundle's `.gitignore` hides them
|
|
419
|
+
(`akm bundle create` ignores `env/` and `secrets/`), so `akm show env/<name>`
|
|
420
|
+
and `akm search --type env` work in a default bundle. The indexer lists the
|
|
421
|
+
git-ignored files under those two directories in addition to the tracked and
|
|
422
|
+
untracked ones; values still never reach the index.
|
|
423
|
+
- `akm health --no-probe` also skips the `plugin-version` newest-tag lookup (a
|
|
424
|
+
`git ls-remote` against the plugin marketplace). With probing off the row
|
|
425
|
+
reports `unknown` ("not probed") instead of "up to date", and the local
|
|
426
|
+
version-range check still runs.
|
|
427
|
+
- `akm task doctor` no longer reports `historyDir`. It named `$CACHE/tasks/history`,
|
|
428
|
+
which does not exist now that task run history lives in `state.db`.
|
|
429
|
+
- Four user-facing messages no longer cite deleted spec sections: the lesson
|
|
430
|
+
frontmatter error from `akm distill` ("See v1 spec §13"), the two `agent-skills`
|
|
431
|
+
lint details ("spec §4.5"), the bundle-identity-drift warning ("spec §11.5") and
|
|
432
|
+
the unknown-`quality` warning ("v1 spec §4.2").
|
|
433
|
+
- `akm config unset` removes the named key and leaves a parent object that
|
|
434
|
+
becomes empty. It used to delete the parent too, so unsetting a harness's only
|
|
435
|
+
key removed the harness and `akm agent` then exited 78 (`{}` is how a harness
|
|
436
|
+
is enabled).
|
|
437
|
+
- The local embedder runs the model on `onnxruntime-node` with
|
|
438
|
+
`@huggingface/tokenizers`. `@huggingface/transformers` and the `sharp`,
|
|
439
|
+
`@huggingface/jinja` and `onnxruntime-web` packages it brought are no longer
|
|
440
|
+
installed. akm fetches the model's four files from the Hugging Face Hub itself,
|
|
441
|
+
into the same `$HF_HOME/<repo>/` layout as before (`HF_HUB_OFFLINE` still
|
|
442
|
+
forbids the fetch), so a model cache an earlier release filled is reused. The
|
|
443
|
+
vectors are the same to within 1e-6 of Transformers.js, so an index built
|
|
444
|
+
before stays valid.
|
|
445
|
+
|
|
446
|
+
### Fixed
|
|
447
|
+
|
|
448
|
+
- `bun.lock` resolved `onnxruntime-node` to `onnxruntime-web`, so every checkout
|
|
449
|
+
and CI run embedded on WebAssembly, about eight times slower than the native
|
|
450
|
+
runtime. It resolves to the real package. (npm installs do not read `bun.lock`;
|
|
451
|
+
the release binaries could not embed at all, see Added.)
|
|
452
|
+
|
|
453
|
+
### Removed
|
|
454
|
+
|
|
455
|
+
- `engines`, the `defaults` block (`defaults.engine`, `defaults.llmEngine`, with
|
|
456
|
+
`defaults.improveStrategy` now `improve.strategy`), `workflow.judgeEngine`, a
|
|
457
|
+
strategy's `engine`, `model`, `llm` and `timeoutMs`, `provider`, and
|
|
458
|
+
`extraParams` as a key (write the request fields on the connection or model
|
|
459
|
+
entry), all read from an old file and converted by `akm migrate apply`. An
|
|
460
|
+
`extraParams` key that shadows a first-class setting (`temperature`,
|
|
461
|
+
`maxTokens`, `enableThinking`, `reasoningEffort`) is dropped with a note, and
|
|
462
|
+
the setting wins.
|
|
463
|
+
- `models.json`, the user overlay and the one akm shipped, and the `akm models
|
|
464
|
+
list` and `akm models copy-defaults` commands that managed them. Aliases live
|
|
465
|
+
on `connections.<name>.models`, and `akm models` shows and changes them.
|
|
466
|
+
- `apiKeyFile`, the implicit `AKM_ENGINE_<NAME>_API_KEY` and `AKM_LLM_API_KEY`
|
|
467
|
+
lookups, and `${secrets/...}` as a connection key. Use `apiKey: "$VAR"` or
|
|
468
|
+
`credentials.json`.
|
|
469
|
+
- `supportsJsonSchema`. When an endpoint rejects a response schema, akm retries
|
|
470
|
+
without one and remembers that for the rest of the process.
|
|
471
|
+
- The fallback engine. With no engine configured, akm used the `opencode` binary
|
|
472
|
+
on `PATH`; with no connection and no harness, model features and agent work are
|
|
473
|
+
off and each command that needs one points at `akm setup`.
|
|
474
|
+
- The `opencode-sdk` engine platform, and the load-time rule that refused model
|
|
475
|
+
work on an `opencode` engine.
|
|
476
|
+
- The LLM feature gate, with the 600 s timeout it carried: curate's rerank reads
|
|
477
|
+
`search.curateRerank.enabled` and memory inference `index.memory.enabled`
|
|
478
|
+
themselves.
|
|
479
|
+
- The per-harness result extractors and the JSON output modes they read.
|
|
480
|
+
- The `default-engine`, `default-llm-engine`, `configured-engines`,
|
|
481
|
+
`active-improve-strategy`, `thinking-control` and `engine-last-used` checks of
|
|
482
|
+
`akm health`, and its hard failure for an unreachable default connection; an
|
|
483
|
+
unreachable connection is a warning in the `connections-and-harnesses` check.
|
|
484
|
+
- `akm setup --probe` and `--config`, and the engine, Ollama and provider steps
|
|
485
|
+
of the wizard.
|
|
486
|
+
- The `opencode serve` server management, the OpenCode 1 and 2 HTTP adapters,
|
|
487
|
+
and the `@opencode-ai/sdk` and `@opencode/client` dependencies. Agent work on a
|
|
488
|
+
connection needs no OpenCode of yours or client package, so `akm health` checks
|
|
489
|
+
for neither.
|
|
490
|
+
- Asset tool requests. An agent or command's `tools:` (or a Claude command's
|
|
491
|
+
`allowed-tools:`) is no longer read, a task's `tools:` is ignored with a
|
|
492
|
+
warning, and `akm migrate apply` drops a v3 task's `akm.tools`. With them go
|
|
493
|
+
the `execution.allowedTools` config key (now an unknown key: warned, ignored
|
|
494
|
+
and dropped by `akm migrate apply`), the `EXECUTION_NOT_AUTHORIZED` error,
|
|
495
|
+
`toolPolicy` in `akm show`, the harness builders' tool flags, and recognizing
|
|
496
|
+
a file as an agent by its `tools:` key. Restrict an agent's tools in the
|
|
497
|
+
harness's own agent definition and select it with the harness's `agent`.
|
|
498
|
+
|
|
499
|
+
## [0.10.261013] - 2026-10-23
|
|
500
|
+
|
|
501
|
+
### Fixed
|
|
502
|
+
|
|
503
|
+
- A secret is now also redacted when it appears in its JSON-escaped spelling
|
|
504
|
+
(#1238). Text redaction matched only the exact and URL-encoded forms, so a child
|
|
505
|
+
that printed `JSON.stringify({ token })` for a secret with a quote, backslash,
|
|
506
|
+
newline or non-ASCII character left it in the unit journal when the output failed
|
|
507
|
+
its schema, had no schema, or came with a non-zero exit. The shared redactor now
|
|
508
|
+
also matches the `\"`, `\\`, `\n` and `\uXXXX` forms (lowercase or uppercase
|
|
509
|
+
hex, DEL included), for workflow, engine and task-output redaction alike.
|
|
510
|
+
- `akm bundle rename` now rewrites the refs of a bundle whose id contains an
|
|
511
|
+
emoji or other character outside the Basic Multilingual Plane correctly
|
|
512
|
+
(#1239). It used to cut into the `//` separator, storing `team/workflows/x`
|
|
513
|
+
for `💼//workflows/x` and stranding the bundle's workflow runs, task history
|
|
514
|
+
and proposals.
|
|
515
|
+
- A task's `uses:` script or workflow in an npm, website or read-only bundle now
|
|
516
|
+
resolves (#1238). It used to fail with "unsupported kind for writes", because
|
|
517
|
+
the lookup went through the write-target resolver. An unknown bundle in such a
|
|
518
|
+
ref is reported as not configured, without naming a flag.
|
|
519
|
+
- `akm bundle update` no longer re-clones a git or npm bundle whose upstream
|
|
520
|
+
revision has not changed. Re-cloning replaced the bundle's directory under any
|
|
521
|
+
running task or workflow, and left an empty revision directory behind after
|
|
522
|
+
each real change. An unchanged bundle is now reported as unchanged and left
|
|
523
|
+
alone (`--force` still fetches it again). After a real change, the previous
|
|
524
|
+
revision is kept and older revision directories are removed (#1235).
|
|
525
|
+
- Scheduled tasks in the `AKM_BUNDLE_DIR` working stash were silently dropped by
|
|
526
|
+
an unscoped `akm task sync` (and `--rebind`) once any other bundle was
|
|
527
|
+
configured (#1236). Task sync now uses the same set of active bundles as
|
|
528
|
+
search, show and workflows, so the working stash is synced the same way
|
|
529
|
+
whether you sync everything or name it with `--bundle`.
|
|
530
|
+
- A `bundle update` while a workflow is running no longer fails the run (#1238,
|
|
531
|
+
#1235). A running workflow used to remember the directory it was started in, so
|
|
532
|
+
once the update moved the bundle to a new revision directory, the next step
|
|
533
|
+
failed with `PATH_ESCAPE_VIOLATION` and the only remedy was `abandon`. The
|
|
534
|
+
run now finds its bundle again at each step and carries on from the new
|
|
535
|
+
directory. It continues from its frozen plan even if the new revision renamed
|
|
536
|
+
or removed the workflow file, and a step fails only when the run's bundle is
|
|
537
|
+
no longer configured.
|
|
538
|
+
- `exec.cwd` is applied once (#1238). `cwd: sub` used to run in `<bundle>/sub/sub`.
|
|
539
|
+
It now runs in `<bundle>/sub`.
|
|
540
|
+
|
|
541
|
+
### Changed
|
|
542
|
+
|
|
543
|
+
- `akm workflow plan --format text` now shows each step's argv, cwd and env refs,
|
|
544
|
+
and the bundle-qualified ref that every `${ref}` token, `env:` entry and child
|
|
545
|
+
`workflow:` resolves to; a ref no bundle owns, in the workflow or in a child
|
|
546
|
+
workflow it runs, fails the plan and names it.
|
|
547
|
+
`akm workflow status <id> --units` shows the same argv, cwd and resolved refs
|
|
548
|
+
for a failed unit (#1238).
|
|
549
|
+
- A workflow exec step's command now receives `AKM_CONFIG_DIR`, `AKM_DATA_DIR`,
|
|
550
|
+
`AKM_CACHE_DIR` and `AKM_STATE_DIR` set to the directories the akm that started
|
|
551
|
+
it resolved, including ones it found through `XDG_*_HOME`, and `AKM_BUNDLE_DIR`
|
|
552
|
+
when it had one. A step that runs `akm` uses the same bundle and state without
|
|
553
|
+
`pass_env` (#1238).
|
|
554
|
+
- `akm env`, `akm secret`, workflow `env:` bindings and child workflows, task
|
|
555
|
+
`uses:` assets, and `improve`/`distill`/schema-repair file lookups now find an
|
|
556
|
+
asset with the same lookup `akm show` uses, instead of each keeping its own
|
|
557
|
+
copy of it (#1238). The visible differences: a missing child workflow fails
|
|
558
|
+
with the ordinary "Workflow not found" error, an env ref in a workflow does
|
|
559
|
+
not resolve into a disabled bundle, and `improve` finds a concept in a
|
|
560
|
+
bundle whose adapter names the file (such as an OKF table) from disk as well
|
|
561
|
+
as from the index.
|
|
562
|
+
- An asset is addressed by its akm ref and nothing else (#1238). `akm secret
|
|
563
|
+
set|run` and `akm env create|run|path|export|remove` now take a full ref
|
|
564
|
+
(`secrets/gitea_token`, `team//env/prod`); a bare name such as `gitea_token`
|
|
565
|
+
or `prod` is a usage error that names the full form. `akm env create prod` is
|
|
566
|
+
now `akm env create env/prod`.
|
|
567
|
+
- One substitution token, `${ref}`, replaces `${secret:NAME}` in env values and
|
|
568
|
+
`secret://name` in config credentials (#1238). A `${secrets/name}` token is
|
|
569
|
+
replaced with the secret's value and any other asset ref, such as
|
|
570
|
+
`${scripts/lab/fetch.sh}`, with its absolute path; the ref may name any bundle
|
|
571
|
+
(`${team//secrets/discord_bot_token}`) rather than only the env file's own
|
|
572
|
+
bundle. A ref into a bundle of any adapter works when it is qualified and the
|
|
573
|
+
bundle is installed (`${docs//tables/customers}` in an OKF bundle). A `${...}`
|
|
574
|
+
body that is not an akm ref, such as `${HOME}` or shell substitution like
|
|
575
|
+
`${v//-/_}`, is left as text. `engines.*.apiKey`, `embedding.apiKey`,
|
|
576
|
+
`search.curateRerank.apiKey` and a git bundle's `credential` accept `$VAR`,
|
|
577
|
+
`${VAR}` or `${secrets/<name>}` (in any bundle, such as `${team//secrets/x}`); a
|
|
578
|
+
`${...}` naming any other kind of asset, such as `${scripts/x}`, is rejected
|
|
579
|
+
when the config loads. An env file that still holds `${secret:NAME}` keeps
|
|
580
|
+
working: akm reads it as `${<the env file's bundle>//secrets/NAME}` and warns
|
|
581
|
+
once, naming the env ref. The file is not rewritten, so write the full ref.
|
|
582
|
+
- A workflow unit's `env:` bindings are now read at dispatch with the same
|
|
583
|
+
function `akm env run` uses, so a bundle's env asset, its `${ref}` tokens and
|
|
584
|
+
the secrets they name behave the same in a workflow as on the command line
|
|
585
|
+
(#1238). An edit to an env file after a run started is picked up by the next
|
|
586
|
+
dispatch instead of failing with "key set changed".
|
|
587
|
+
- Only secret values are redacted from workflow output (#1238). A value
|
|
588
|
+
substituted from a `secrets/` ref is still `[REDACTED]` in stdout, stderr,
|
|
589
|
+
diagnostics and the journal, but the rest of an env asset, such as a URL or a
|
|
590
|
+
channel id, now reaches the journal and the next step intact. A credential
|
|
591
|
+
typed straight into an env file is no longer redacted; keep credentials in
|
|
592
|
+
`secrets/`.
|
|
593
|
+
- A secret's value is read the same way everywhere (#1238): the file content with
|
|
594
|
+
surrounding whitespace trimmed. `akm secret run` and env tokens used to pass
|
|
595
|
+
the raw bytes, trailing newline included, while config credentials and the
|
|
596
|
+
website fetchers trimmed.
|
|
597
|
+
- Installing a bundle is now the trust decision (#1237). A bundle whose `env/`
|
|
598
|
+
files set a key such as `PATH` installs, updates unattended, and works in
|
|
599
|
+
`akm env run`, `akm secret run` and workflow `env:` bindings with no flag, no
|
|
600
|
+
prompt and no block, whichever bundle it comes from. `akm lint` still reports
|
|
601
|
+
`dangerous-env-key` findings, non-blocking.
|
|
602
|
+
- An agent's own `tools` list is now honoured for an agent in any bundle, not
|
|
603
|
+
only the primary stash. `execution.allowedTools` still caps what a run grants.
|
|
604
|
+
- A task `env:` value that looks like a credential is now a warning, in the same
|
|
605
|
+
style workflow params give, instead of an error that stopped the task. The
|
|
606
|
+
warning points to `akm secret run` or `akm env run` in the task's `run:`.
|
|
607
|
+
- `--allow-dangerous-env-keys` on `bundle add`, `bundle update` and `env run` is
|
|
608
|
+
now a deprecated no-op, accepted through 0.10 so existing scripts keep working.
|
|
609
|
+
It is an unknown flag from 0.11.
|
|
610
|
+
- Reads follow symlinks (#1237). An env file or secret that is a symlink to a
|
|
611
|
+
file outside its bundle directory now resolves through `akm env`, `akm secret`,
|
|
612
|
+
`${ref}` substitution and a workflow `env:` binding, and a ref
|
|
613
|
+
resolved by path does the same, instead of failing with "escapes the secrets
|
|
614
|
+
directory" or "Ref resolves outside the stash root", so a secret can point at
|
|
615
|
+
a container's `/run/secrets/<name>`. A command, agent or script that is such a
|
|
616
|
+
symlink also resolves when a workflow, task or `akm agent` runs it, and
|
|
617
|
+
`akm index` indexes a file symlink like any other file, so `akm show` and
|
|
618
|
+
search find it, and `akm env list` and `akm secret list` list it. A symlinked
|
|
619
|
+
script runs under the interpreter its own name selects, and cloning a skill
|
|
620
|
+
copies a symlinked file by content. A directory symlink is still never
|
|
621
|
+
descended. Names with `..`
|
|
622
|
+
segments or absolute names are still refused, and writes still never follow a
|
|
623
|
+
symlink out of the bundle.
|
|
624
|
+
- `akm workflow run <ref>` always starts a new run, and `akm workflow run <run-id>`
|
|
625
|
+
continues one (#1239). `akm workflow resume <run-id>` only re-activates a blocked
|
|
626
|
+
or failed run so `run <run-id>` can continue it. Before, running a ref
|
|
627
|
+
silently resumed any active run of that ref started from the same directory,
|
|
628
|
+
which is why scripts passed `--new` and why a scheduled task and a shell could
|
|
629
|
+
each start their own run. Now, when other runs of the ref are still active, the
|
|
630
|
+
start prints one warning naming their ids and the `akm workflow run <id>` /
|
|
631
|
+
`akm workflow abandon <id>` commands, and starts anyway. Parameters are accepted
|
|
632
|
+
on every ref start, and `--new` is accepted and does nothing (deprecated,
|
|
633
|
+
through 0.10).
|
|
634
|
+
- Workflow runs are no longer tied to the directory you run from (#1239).
|
|
635
|
+
`akm workflow list` and `akm workflow status <ref>` show every run on the host,
|
|
636
|
+
most recently updated first, from any directory, so the runs of a scheduled
|
|
637
|
+
task are listed like any other. `--all-scopes` is accepted and does nothing
|
|
638
|
+
(deprecated, through 0.10), and the `list` result no longer carries a
|
|
639
|
+
`scopeKey`. Runs started by 0.10 are not visible to a 0.9.15 binary reading the
|
|
640
|
+
same `state.db`.
|
|
641
|
+
- `akm workflow run <ref> --skip-if-locked` also skips (exit 0, nothing started)
|
|
642
|
+
when an active run of that ref is being driven by a live process (#1239). Without
|
|
643
|
+
the flag a start is never refused.
|
|
644
|
+
- `akm bundle rename` rewrites the workflow ref on that bundle's workflow runs, so
|
|
645
|
+
`akm workflow list` shows the old runs under the new name, and lists the bundle's
|
|
646
|
+
active and blocked runs in its output, each with its status (#1239). Their frozen
|
|
647
|
+
plans keep the old refs; continue or abandon them.
|
|
648
|
+
- `akm workflow create` no longer indexes the new workflow, and a new run no longer
|
|
649
|
+
records an index entry id (#1239).
|
|
650
|
+
- A workflow plan records the refs it uses and no locations (#1238). New runs
|
|
651
|
+
freeze plan `irVersion` 7, which holds no bundle directory, no directory
|
|
652
|
+
identity and, for each `env:` ref, only its bundle-qualified ref: the env
|
|
653
|
+
file, its keys and the secrets it names are read at each step. Runs frozen
|
|
654
|
+
by earlier releases (`irVersion` 5 and 6) carry those fields, which are never
|
|
655
|
+
read but are kept as stored, so a run interrupted before the upgrade finds the
|
|
656
|
+
child workflow run it had already started instead of starting a second one, and
|
|
657
|
+
continues the same way. A plan frozen by a newer akm is refused with a message
|
|
658
|
+
that says to upgrade akm, whether or not this akm could decode it. A plan with an
|
|
659
|
+
agent step records an empty directory identity, so a 0.10 pre-release that finds
|
|
660
|
+
the run stops at that step instead of running the agent in the wrong directory.
|
|
661
|
+
`akm workflow plan` lists an env ref without its `keys` and `secretNames`.
|
|
662
|
+
- A workflow's exec units, agents and gate judges work in the root of the bundle
|
|
663
|
+
that holds the workflow, found at each step, and `exec.cwd` is joined onto it (#1238).
|
|
664
|
+
`exec.cwd` may now be absolute, and it is no longer required to stay inside the
|
|
665
|
+
bundle: a command can reach any directory anyway. A step whose workflow no
|
|
666
|
+
longer resolves to a bundle fails naming the workflow (a step with a gate is
|
|
667
|
+
blocked by its judge first, for `akm workflow resume`) instead of running in
|
|
668
|
+
akm's own working directory.
|
|
669
|
+
- An exec step's argv and `exec.cwd` can name an asset in any bundle with the same
|
|
670
|
+
`${ref}` token env assets use (#1238): `["bun", "${homelab//scripts/lab-status/fetch.ts}"]`.
|
|
671
|
+
A `secrets/` ref is replaced by the secret's value, which is redacted from the
|
|
672
|
+
unit's output after it is parsed, like a secret bound through an env asset; any
|
|
673
|
+
other asset ref by its absolute path. A ref no bundle owns
|
|
674
|
+
fails the unit, naming it, before anything is spawned. Prompts are not
|
|
675
|
+
substituted. A workflow in bundle A can now run a script from bundle B with an
|
|
676
|
+
env asset from bundle C that names a secret in bundle D.
|
|
677
|
+
- A task no longer captures its working directory's identity when it is prepared
|
|
678
|
+
and re-checks it before it runs (#1238). A `run:` task runs in
|
|
679
|
+
`<bundle>/<working-directory>`, and a `uses: scripts/<file>` target that is a
|
|
680
|
+
symlink to a file outside the bundle works: the task freezes that file's
|
|
681
|
+
bytes.
|
|
682
|
+
- A task's `working-directory` follows the same rule as a workflow's `exec.cwd`
|
|
683
|
+
(#1238): a non-empty path, relative to the task's bundle root or absolute, and
|
|
684
|
+
no longer required to stay inside the bundle. A symlink to a directory outside
|
|
685
|
+
the bundle, an absolute path and a path with `..` all work, and `akm lint` and
|
|
686
|
+
`akm task sync` no longer need the bundle root to check it.
|
|
687
|
+
|
|
688
|
+
### Deprecated
|
|
689
|
+
|
|
690
|
+
- `secret://name` in config is retired in favour of `${secrets/name}` (#1238). A
|
|
691
|
+
config that still holds it loads as if it said `${secrets/name}`, with one
|
|
692
|
+
warning naming the key, and `akm migrate apply` rewrites `config.json`.
|
|
693
|
+
`akm config set` and `bundle add --credential` no longer accept it. A workflow run
|
|
694
|
+
frozen before the upgrade keeps resolving its engine credential when it is
|
|
695
|
+
continued, and keeps the `secret://` text it stored.
|
|
696
|
+
|
|
697
|
+
### Removed
|
|
698
|
+
|
|
699
|
+
- The dangerous-key audit on `bundle add` and `bundle update`, its prompt, its
|
|
700
|
+
rollback of a freshly installed bundle, and the `blocked` per-bundle status in
|
|
701
|
+
`bundle update --all`. The `DANGEROUS_ENV_KEY` and `DANGEROUS_ENV_AUDIT_FAILED`
|
|
702
|
+
error codes are gone with them (#1237).
|
|
703
|
+
- The first-party and third-party distinction for env and secret injection
|
|
704
|
+
(`src/core/activation-policy.ts`) and the unused `trusted` field on a derived
|
|
705
|
+
bundle installation (#1237).
|
|
706
|
+
- `akm show` no longer reports an `activeRun` field. Run state is under
|
|
707
|
+
`akm workflow` (#1239).
|
|
708
|
+
- The "indexed root no longer matches the bundle source" warnings when a command
|
|
709
|
+
or persona is dispatched (#1238). A bundle at a different location than the
|
|
710
|
+
index recorded is no longer reported as drift.
|
|
711
|
+
- The `exec_cwd_escape` failure reason and the checks behind it: the parser, the
|
|
712
|
+
compiler and the exec runner no longer reject an `exec.cwd` that leaves the
|
|
713
|
+
workflow's bundle (#1238).
|
|
714
|
+
|
|
9
715
|
## [0.10.261012] - 2026-10-22
|
|
10
716
|
|
|
11
717
|
### Changed
|
|
@@ -373,7 +1079,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
373
1079
|
its whole deadline. It now returns at once with `reason: "aborted"` and the declined tool call in `error`.
|
|
374
1080
|
- **Documented: OpenCode permission defaults in a dispatch (#1049).** OpenCode 1 asks before reading or writing outside
|
|
375
1081
|
the project directory; OpenCode 2 does not unless its config says `ask`, so akm's permission rejection only happens
|
|
376
|
-
on OpenCode 2 once you add that rule. akm changes no default. See [Configuration](docs/reference/configuration.md#
|
|
1082
|
+
on OpenCode 2 once you add that rule. akm changes no default. See [Configuration](docs/reference/configuration.md#harnesses).
|
|
377
1083
|
|
|
378
1084
|
## [0.10.26101201] - 2026-10-12
|
|
379
1085
|
|
|
@@ -962,7 +1668,7 @@ When upgrading from 0.9.27:
|
|
|
962
1668
|
with a message saying to set `"plugin": ["akm-opencode@next"]`, and lockstep stays on the `@latest` pin.
|
|
963
1669
|
Missing, older-than-`@latest` or unpinned `@next` fails closed like the stable lockstep. Claude Code and
|
|
964
1670
|
Codex are unchanged (no prerelease channel). The result gains `channel`. Works with `--check`, `--force`
|
|
965
|
-
and `-q`. See [`akm upgrade`](docs/reference/cli.md#prereleases
|
|
1671
|
+
and `-q`. See [`akm upgrade`](docs/reference/cli.md#prereleases---next).
|
|
966
1672
|
|
|
967
1673
|
## [0.9.28-alpha.4] - 2026-10-08
|
|
968
1674
|
|
|
@@ -5033,7 +5739,8 @@ install's cron schedule, not their worth.
|
|
|
5033
5739
|
instead. This is a Markdown-frontmatter-only key — a GitHub-shaped
|
|
5034
5740
|
workflow's closed root key set has no extension surface for it, the same
|
|
5035
5741
|
reason it cannot declare `params:` either. See
|
|
5036
|
-
[
|
|
5742
|
+
[Moving from akm 0.9 to 0.10: Workflows](docs/migration/v0.9-to-v0.10.md#workflows),
|
|
5743
|
+
which removed top-level `outputs:`.
|
|
5037
5744
|
- **`akm workflow plan <ref>`** (Evolving) — compiles, resolves, and freezes
|
|
5038
5745
|
a workflow exactly as starting a run would, then stops: zero durable
|
|
5039
5746
|
writes, no published run, no event, no lease. Prints the canonical step
|