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
|
@@ -9,25 +9,35 @@ import { appendEvent } from "../../core/events.js";
|
|
|
9
9
|
import { warn } from "../../core/warn.js";
|
|
10
10
|
import { insertEventOnce } from "../../storage/repositories/events-repository.js";
|
|
11
11
|
import { withWorkflowRunsRepo, } from "../../storage/repositories/workflow-runs-repository.js";
|
|
12
|
-
import {
|
|
13
|
-
import { frozenSummaryJudge } from "../exec/frozen-judge.js";
|
|
12
|
+
import { frozenSummaryJudge, resolveJudgeCwd } from "../exec/frozen-judge.js";
|
|
14
13
|
import { detectSecretShapedParams } from "../exec/param-secrets.js";
|
|
15
14
|
import { freezeWorkflow } from "../freeze/freeze.js";
|
|
16
15
|
import { applyWorkflowParamDefaults, materializeWorkflowParameterFlags, validateWorkflowParams, } from "../ir/params.js";
|
|
17
16
|
import { canonicalPlanJson, computePlanHash } from "../ir/plan-hash.js";
|
|
17
|
+
import { resolveOrchestrationRefs, summarizeStepOrchestration } from "../renderer.js";
|
|
18
18
|
import { clip, WORKFLOW_UNIT_DIAGNOSTIC_CLIP } from "../resource-limits.js";
|
|
19
19
|
import { validateStepSummary } from "../validate-summary.js";
|
|
20
20
|
import { resolveAgentIdentity } from "./agent-identity.js";
|
|
21
|
-
import { frozenStepRows, readRunPlan } from "./run-plan.js";
|
|
22
|
-
import { canonicalizeWorkflowRefInput, loadWorkflowAsset
|
|
21
|
+
import { decodeWorkflowPlan, frozenStepRows, readRunPlan } from "./run-plan.js";
|
|
22
|
+
import { canonicalizeWorkflowRefInput, loadWorkflowAsset } from "./workflow-asset-loader.js";
|
|
23
23
|
/**
|
|
24
24
|
* Membership test for the journaled `runner` column, which is an untyped string.
|
|
25
25
|
* The `Record<WorkflowRuntimeKind, …>` is exhaustiveness-checked, so a new runtime
|
|
26
26
|
* kind cannot be added to the union without being accepted here too.
|
|
27
27
|
*/
|
|
28
|
-
const IR_RUNTIME_KINDS = {
|
|
28
|
+
const IR_RUNTIME_KINDS = { connection: true, harness: true, exec: true };
|
|
29
|
+
/** What a run of an earlier release journaled for the runner kinds that were renamed. */
|
|
30
|
+
const EARLIER_RUNTIME_KINDS = {
|
|
31
|
+
llm: "connection",
|
|
32
|
+
agent: "harness",
|
|
33
|
+
sdk: "harness",
|
|
34
|
+
};
|
|
29
35
|
function runtimeKindOf(runner) {
|
|
30
|
-
|
|
36
|
+
if (runner === null)
|
|
37
|
+
return null;
|
|
38
|
+
if (Object.hasOwn(IR_RUNTIME_KINDS, runner))
|
|
39
|
+
return runner;
|
|
40
|
+
return EARLIER_RUNTIME_KINDS[runner] ?? null;
|
|
31
41
|
}
|
|
32
42
|
function toUnitDiagnostic(row) {
|
|
33
43
|
let diagnostic = null;
|
|
@@ -98,38 +108,21 @@ export async function startWorkflowRun(ref, params = {}, options) {
|
|
|
98
108
|
return withWorkflowRunsRepo(async (repo) => {
|
|
99
109
|
const now = new Date().toISOString();
|
|
100
110
|
const runId = randomUUID();
|
|
101
|
-
const scopeKey = getCurrentWorkflowScopeKey();
|
|
102
111
|
const currentStepId = plan.steps[0]?.stepId ?? null;
|
|
103
|
-
const workflowEntryId = resolveWorkflowEntryId(asset.sourcePath, asset.ref, asset.adapterId);
|
|
104
112
|
// Capture the invoking harness/session identity for this run. Explicit options
|
|
105
113
|
// win; otherwise fall back to best-effort environment detection. This is
|
|
106
114
|
// identity-only — no background thread or timer is started here.
|
|
107
115
|
const detected = resolveAgentIdentity();
|
|
108
116
|
const agentHarness = options?.agentHarness !== undefined ? options.agentHarness : detected.harness;
|
|
109
117
|
const agentSessionId = options?.agentSessionId !== undefined ? options.agentSessionId : detected.sessionId;
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
// The active-alias query and all inserts share one immediate transaction.
|
|
115
|
-
// #942: an active run of this ref in a different scope (e.g. a scheduled
|
|
116
|
-
// task's cwd vs. a shell) is warned about once; the uniqueness guard stays
|
|
117
|
-
// scope-local. The query excludes the caller's own scope in SQL.
|
|
118
|
-
const crossScopeActive = repo.findActiveRunOutsideScope(workflowRefs, scopeKey);
|
|
119
|
-
const crossScopeWarning = crossScopeActive
|
|
120
|
-
? `Workflow ${asset.ref} already has an active run in another scope ` +
|
|
121
|
-
`(id ${crossScopeActive.id}, started ${crossScopeActive.created_at}, scope ${crossScopeActive.scope_key ?? "unknown"}); ` +
|
|
122
|
-
`starting a separate run here. Resume it from anywhere with "akm workflow run ${crossScopeActive.id}" ` +
|
|
123
|
-
`or free it with "akm workflow abandon ${crossScopeActive.id}".`
|
|
124
|
-
: undefined;
|
|
118
|
+
// Starting a ref always starts a run. Other active runs of the same ref
|
|
119
|
+
// are not an error: name them once, after the start succeeds, so the
|
|
120
|
+
// operator can continue or abandon the ones they no longer want.
|
|
121
|
+
const otherActive = repo.listRuns({ workflowRefs, activeOnly: true });
|
|
125
122
|
repo.publishWorkflowRunV4({
|
|
126
|
-
workflowRefs,
|
|
127
|
-
...(options?.force ? { force: true } : {}),
|
|
128
123
|
run: {
|
|
129
124
|
id: runId,
|
|
130
125
|
workflowRef: asset.ref,
|
|
131
|
-
scopeKey,
|
|
132
|
-
workflowEntryId,
|
|
133
126
|
workflowTitle: asset.title,
|
|
134
127
|
paramsJson: JSON.stringify(effectiveParams),
|
|
135
128
|
currentStepId,
|
|
@@ -149,9 +142,12 @@ export async function startWorkflowRun(ref, params = {}, options) {
|
|
|
149
142
|
planJson,
|
|
150
143
|
planHash,
|
|
151
144
|
});
|
|
145
|
+
if (otherActive.length > 0) {
|
|
146
|
+
const ids = otherActive.map((run) => run.id);
|
|
147
|
+
warn(`Workflow ${asset.ref} already has ${ids.length} active run(s) (${ids.join(", ")}); started another. ` +
|
|
148
|
+
`Continue one with "akm workflow run ${ids[0]}" or give up on it with "akm workflow abandon ${ids[0]}".`);
|
|
149
|
+
}
|
|
152
150
|
const result = await getWorkflowStatus(runId);
|
|
153
|
-
if (crossScopeWarning)
|
|
154
|
-
result.warnings = [...(result.warnings ?? []), crossScopeWarning];
|
|
155
151
|
// Params reach every unit prompt in clear (only the journal scrubs them).
|
|
156
152
|
// Surface a loud, best-effort warning when a param LOOKS like a credential
|
|
157
153
|
// so the author moves it to an env binding. Advisory only — never blocks
|
|
@@ -159,14 +155,19 @@ export async function startWorkflowRun(ref, params = {}, options) {
|
|
|
159
155
|
const secretWarnings = detectSecretShapedParams(effectiveParams);
|
|
160
156
|
if (secretWarnings.length > 0)
|
|
161
157
|
result.warnings = [...(result.warnings ?? []), ...secretWarnings];
|
|
162
|
-
// The implicit engine fallback is announced ONCE, here at run creation —
|
|
163
|
-
// the frozen plan records the engine actually used, so a resume never
|
|
164
|
-
// re-announces a decision it did not make.
|
|
165
|
-
if (frozen.engineAnnouncement)
|
|
166
|
-
result.warnings = [...(result.warnings ?? []), frozen.engineAnnouncement];
|
|
167
158
|
return result;
|
|
168
159
|
});
|
|
169
160
|
}
|
|
161
|
+
function decodeStatusPlan(planJson) {
|
|
162
|
+
if (!planJson)
|
|
163
|
+
return undefined;
|
|
164
|
+
try {
|
|
165
|
+
return decodeWorkflowPlan(JSON.parse(planJson));
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
170
171
|
export async function getWorkflowStatus(runId, opts) {
|
|
171
172
|
return withWorkflowRunsRepo((repo) => {
|
|
172
173
|
const run = readWorkflowRun(repo, runId);
|
|
@@ -176,25 +177,32 @@ export async function getWorkflowStatus(runId, opts) {
|
|
|
176
177
|
// The honest diagnostic surface (#22): read the unit journal straight and
|
|
177
178
|
// project each row, INCLUDING failures whose diagnostic text the
|
|
178
179
|
// deterministic evidence graph drops. Read-only; never mutates the run.
|
|
179
|
-
|
|
180
|
+
const rows = repo.getUnitsForRun(run.id);
|
|
181
|
+
// The plan is decoded only to describe a failed unit, read-only: no run
|
|
182
|
+
// warning (`readRunPlan` says it is "running" an older plan) and no
|
|
183
|
+
// orchestration when the plan cannot be decoded.
|
|
184
|
+
const plan = rows.some((row) => row.status === "failed") ? decodeStatusPlan(run.plan_json) : undefined;
|
|
185
|
+
detail.units = rows.map((row) => {
|
|
186
|
+
const unit = toUnitDiagnostic(row);
|
|
187
|
+
const step = row.status === "failed" ? plan?.steps.find((candidate) => candidate.stepId === row.step_id) : undefined;
|
|
188
|
+
const summary = step ? summarizeStepOrchestration(step, undefined) : undefined;
|
|
189
|
+
return summary ? { ...unit, orchestration: resolveOrchestrationRefs(summary) } : unit;
|
|
190
|
+
});
|
|
180
191
|
}
|
|
181
192
|
return detail;
|
|
182
193
|
});
|
|
183
194
|
}
|
|
184
195
|
export async function listWorkflowRuns(input) {
|
|
185
|
-
const scopeKey = input?.allScopes === true ? null : getCurrentWorkflowScopeKey();
|
|
186
196
|
const activeOnly = input?.activeOnly === true;
|
|
187
197
|
const includeChildren = input?.includeChildren === true;
|
|
188
198
|
if (input?.workflowRef === undefined) {
|
|
189
199
|
return withWorkflowRunsRepo((repo) => ({
|
|
190
200
|
runs: repo
|
|
191
201
|
.listRuns({
|
|
192
|
-
scopeKey,
|
|
193
202
|
...(activeOnly ? { activeOnly: true } : {}),
|
|
194
203
|
...(includeChildren ? { includeChildren: true } : {}),
|
|
195
204
|
})
|
|
196
205
|
.map(toWorkflowRunSummary),
|
|
197
|
-
scopeKey,
|
|
198
206
|
}));
|
|
199
207
|
}
|
|
200
208
|
const exactRef = input.workflowRef.trim();
|
|
@@ -212,12 +220,11 @@ export async function listWorkflowRuns(input) {
|
|
|
212
220
|
}
|
|
213
221
|
catch (error) {
|
|
214
222
|
if (parsedExactRef.bundle !== undefined) {
|
|
215
|
-
const exactRows = await withWorkflowRunsRepo((repo) => repo.listRuns({
|
|
223
|
+
const exactRows = await withWorkflowRunsRepo((repo) => repo.listRuns({ workflowRef: exactRef, ...(includeChildren ? { includeChildren: true } : {}) }));
|
|
216
224
|
if (exactRows.length === 0)
|
|
217
225
|
throw error;
|
|
218
226
|
return {
|
|
219
227
|
runs: exactRows.filter((row) => !activeOnly || row.status === "active").map(toWorkflowRunSummary),
|
|
220
|
-
scopeKey,
|
|
221
228
|
};
|
|
222
229
|
}
|
|
223
230
|
if (!(error instanceof NotFoundError))
|
|
@@ -226,23 +233,20 @@ export async function listWorkflowRuns(input) {
|
|
|
226
233
|
return withWorkflowRunsRepo((repo) => ({
|
|
227
234
|
runs: repo
|
|
228
235
|
.listRuns({
|
|
229
|
-
scopeKey,
|
|
230
236
|
workflowRefs,
|
|
231
237
|
...(activeOnly ? { activeOnly: true } : {}),
|
|
232
238
|
...(includeChildren ? { includeChildren: true } : {}),
|
|
233
239
|
})
|
|
234
240
|
.map(toWorkflowRunSummary),
|
|
235
|
-
scopeKey,
|
|
236
241
|
}));
|
|
237
242
|
}
|
|
238
243
|
export async function getNextWorkflowStep(specifier, params, options) {
|
|
239
244
|
return withWorkflowRunsRepo(async (repo) => {
|
|
240
|
-
const { run, autoStarted,
|
|
245
|
+
const { run, autoStarted, startWarnings } = await resolveRunSpecifier(repo, specifier, params, options?.parameterFlags);
|
|
241
246
|
const steps = readWorkflowRunSteps(repo, run.id);
|
|
242
247
|
return {
|
|
243
248
|
...projectNextResult(run, steps),
|
|
244
249
|
...(autoStarted ? { autoStarted: true } : {}),
|
|
245
|
-
...(resumed ? { resumed: true } : {}),
|
|
246
250
|
...(startWarnings?.length ? { startWarnings } : {}),
|
|
247
251
|
};
|
|
248
252
|
});
|
|
@@ -348,7 +352,7 @@ export async function completeWorkflowStep(input) {
|
|
|
348
352
|
const stepPlan = storedPlan.steps.find((step) => step.stepId === input.stepId);
|
|
349
353
|
if (!stepPlan)
|
|
350
354
|
throw new NotFoundError(`Step "${input.stepId}" was not found in workflow run ${run.id}.`);
|
|
351
|
-
return { existing, plan: storedPlan, stepPlan };
|
|
355
|
+
return { existing, plan: storedPlan, stepPlan, workflowRef: run.workflow_ref };
|
|
352
356
|
});
|
|
353
357
|
const summary = input.summary?.trim();
|
|
354
358
|
// #506: completing a step requires a summary of the work done.
|
|
@@ -365,14 +369,11 @@ export async function completeWorkflowStep(input) {
|
|
|
365
369
|
? // Manual completion journals no gate row, so there is no `<stepId>.gate:l<loop>`
|
|
366
370
|
// identity to agree with — but the dispatch still names the REAL run and
|
|
367
371
|
// step (frozen-judge falls back to the gate node id for the unit id).
|
|
368
|
-
frozenSummaryJudge(preflight.stepPlan.gate.frozenJudge, input.signal, undefined, {
|
|
369
|
-
runId: input.runId,
|
|
370
|
-
stepId: input.stepId,
|
|
371
|
-
})
|
|
372
|
+
frozenSummaryJudge(preflight.stepPlan.gate.frozenJudge, input.signal, undefined, { runId: input.runId, stepId: input.stepId }, undefined, resolveJudgeCwd(preflight.stepPlan.gate.frozenJudge, preflight.workflowRef))
|
|
372
373
|
: input.summaryJudge;
|
|
373
374
|
if (criteria.length > 0 && !judge) {
|
|
374
375
|
throw new ConfigError(`Workflow run ${input.runId} has completion criteria for step "${input.stepId}" but its frozen plan has no judge. ` +
|
|
375
|
-
"
|
|
376
|
+
"Run `akm setup` to add a connection or harness, abandon this run, and create a new one with `akm workflow run <ref>`.", "INVALID_CONFIG_FILE");
|
|
376
377
|
}
|
|
377
378
|
const verdict = await validateStepSummary({ stepTitle: preflight.stepPlan.title, completionCriteria: criteria, summary }, judge ?? undefined, input.signal);
|
|
378
379
|
if (!verdict.complete) {
|
|
@@ -457,57 +458,27 @@ export async function completeWorkflowStep(input) {
|
|
|
457
458
|
return detail;
|
|
458
459
|
});
|
|
459
460
|
}
|
|
460
|
-
async function resolveRunSpecifier(repo, specifier, params, parameterFlags
|
|
461
|
-
const hasParameters = (params && Object.keys(params).length > 0) || (parameterFlags?.length ?? 0) > 0;
|
|
461
|
+
async function resolveRunSpecifier(repo, specifier, params, parameterFlags) {
|
|
462
462
|
const explicitRun = findRunByIdOrPrefix(repo, specifier);
|
|
463
463
|
if (explicitRun) {
|
|
464
|
-
|
|
465
|
-
// run id (or an id prefix), which already names the run to act on (#919).
|
|
466
|
-
if (forceNew) {
|
|
467
|
-
throw new UsageError(`--new starts a fresh run from a workflow ref; "${specifier}" already names a run id.`, "INVALID_FLAG_VALUE");
|
|
468
|
-
}
|
|
469
|
-
if (hasParameters) {
|
|
464
|
+
if ((params && Object.keys(params).length > 0) || (parameterFlags?.length ?? 0) > 0) {
|
|
470
465
|
throw new UsageError(`Workflow parameter flags can only be used when starting a new run, not with existing run id "${specifier}".`);
|
|
471
466
|
}
|
|
472
467
|
return { run: explicitRun, autoStarted: false };
|
|
473
468
|
}
|
|
474
|
-
|
|
475
|
-
const exactRef = specifier.trim();
|
|
476
|
-
const parsedExact = parseBundleRef(exactRef);
|
|
477
|
-
const qualifiedExact = parsedExact.bundle !== undefined && parsedExact.fragment === undefined;
|
|
478
|
-
const detached = qualifiedExact && !forceNew ? repo.getActiveRunRowForScope(exactRef, scopeKey) : undefined;
|
|
469
|
+
// A workflow ref always starts a new run; only a run id drives an existing one.
|
|
479
470
|
let ref;
|
|
480
471
|
try {
|
|
481
472
|
ref = await canonicalizeWorkflowSpecifier(specifier);
|
|
482
473
|
}
|
|
483
474
|
catch (error) {
|
|
484
|
-
if (detached) {
|
|
485
|
-
if (hasParameters) {
|
|
486
|
-
throw new UsageError(`Workflow parameter flags can only be set on a new run; ${specifier} is already active ` +
|
|
487
|
-
`(id ${detached.id}, scope ${scopeKey}).`, "INVALID_FLAG_VALUE", `Pass --new to start a separate run, or run "akm workflow abandon ${detached.id}" to free up ${specifier} first.`);
|
|
488
|
-
}
|
|
489
|
-
return { run: detached, autoStarted: false, resumed: true };
|
|
490
|
-
}
|
|
491
475
|
if (error instanceof NotFoundError && !specifier.includes(":") && !specifier.includes("/")) {
|
|
492
476
|
throw new NotFoundError(`Workflow run or workflow "${specifier}" not found.`, "WORKFLOW_NOT_FOUND");
|
|
493
477
|
}
|
|
494
478
|
throw error;
|
|
495
479
|
}
|
|
496
|
-
const active = forceNew ? undefined : repo.getActiveRunRowForScope(await workflowRunRefSet(ref, exactRef), scopeKey);
|
|
497
|
-
if (active) {
|
|
498
|
-
if (hasParameters) {
|
|
499
|
-
throw new UsageError(`Workflow parameter flags can only be set on a new run; ${ref} is already active ` +
|
|
500
|
-
`(id ${active.id}, scope ${scopeKey}).`, "INVALID_FLAG_VALUE", `Pass --new to start a separate run, or run "akm workflow abandon ${active.id}" to free up ${ref} first.`);
|
|
501
|
-
}
|
|
502
|
-
return { run: active, autoStarted: false, resumed: true };
|
|
503
|
-
}
|
|
504
|
-
// `force` (#485's own escape hatch) is what lets `--new` create a second
|
|
505
|
-
// active run for this (ref, scope) pair instead of the concurrency guard
|
|
506
|
-
// refusing it — the caller explicitly asked for a fresh run, so the guard
|
|
507
|
-
// that exists to catch an ACCIDENTAL second run does not apply (#919).
|
|
508
480
|
const started = await startWorkflowRun(ref, params ?? {}, {
|
|
509
481
|
...(parameterFlags !== undefined ? { parameterFlags } : {}),
|
|
510
|
-
...(forceNew ? { force: true } : {}),
|
|
511
482
|
});
|
|
512
483
|
return {
|
|
513
484
|
run: readWorkflowRun(repo, started.run.id),
|
|
@@ -636,7 +607,7 @@ function toChildRunNode(repo, rootRunId, row) {
|
|
|
636
607
|
? {
|
|
637
608
|
resume: {
|
|
638
609
|
command: `akm workflow resume ${row.id}`,
|
|
639
|
-
// biome-ignore lint/suspicious/noThenProperty: mirrors
|
|
610
|
+
// biome-ignore lint/suspicious/noThenProperty: mirrors the real WorkflowChildRunNode.resume.then field name
|
|
640
611
|
then: `akm workflow resume ${rootRunId} && akm workflow run ${rootRunId}`,
|
|
641
612
|
},
|
|
642
613
|
}
|
|
@@ -648,7 +619,6 @@ function toWorkflowRunSummary(run) {
|
|
|
648
619
|
return {
|
|
649
620
|
id: run.id,
|
|
650
621
|
workflowRef: run.workflow_ref,
|
|
651
|
-
scopeKey: run.scope_key,
|
|
652
622
|
workflowEntryId: run.workflow_entry_id,
|
|
653
623
|
workflowTitle: run.workflow_title,
|
|
654
624
|
status: run.status,
|
|
@@ -733,11 +703,3 @@ function parseJsonArray(value) {
|
|
|
733
703
|
}
|
|
734
704
|
return undefined;
|
|
735
705
|
}
|
|
736
|
-
export async function getActiveWorkflowRun(scopeKey = getCurrentWorkflowScopeKey()) {
|
|
737
|
-
return withWorkflowRunsRepo((repo) => {
|
|
738
|
-
const row = repo.findActiveOrBlockedRunForScope(scopeKey);
|
|
739
|
-
if (!row)
|
|
740
|
-
return null;
|
|
741
|
-
return { runId: row.id, stepId: row.current_step_id, workflowRef: row.workflow_ref };
|
|
742
|
-
}).catch(() => null); // fail-open: never crash show output due to DB error
|
|
743
|
-
}
|
|
@@ -3,16 +3,13 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
5
|
import fs from "node:fs";
|
|
6
|
-
import { detectAdapterId } from "../../core/adapter/detect-adapter.js";
|
|
7
6
|
import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
8
7
|
import { loadConfig } from "../../core/config/config.js";
|
|
9
8
|
import { COMPOSITION_INVALID_MULTI_JOB_HINT, NotFoundError, UsageError } from "../../core/errors.js";
|
|
10
|
-
import { getDbPath } from "../../core/paths.js";
|
|
11
9
|
import { canonicalizeWorkflowName } from "../../core/recognition-util.js";
|
|
12
|
-
import {
|
|
13
|
-
import { resolveAdapterConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
|
|
10
|
+
import { resolveConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
|
|
14
11
|
import { resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
15
|
-
import {
|
|
12
|
+
import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
|
|
16
13
|
import { compileWorkflowSource } from "../compile.js";
|
|
17
14
|
/**
|
|
18
15
|
* Build the canonical `workflow_runs.workflow_ref` for an AKM workflow asset.
|
|
@@ -31,71 +28,70 @@ export function parseWorkflowRefInput(ref) {
|
|
|
31
28
|
}
|
|
32
29
|
return parsed;
|
|
33
30
|
}
|
|
34
|
-
/** Resolve input sugar to the workflow's canonical run identity. */
|
|
31
|
+
/** Resolve input sugar to the workflow's canonical run identity, without compiling it. */
|
|
35
32
|
export async function canonicalizeWorkflowRefInput(ref) {
|
|
36
|
-
return (
|
|
33
|
+
return resolveWorkflowAsset(ref).fullRef;
|
|
37
34
|
}
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
*/
|
|
41
|
-
export async function loadWorkflowAsset(ref) {
|
|
35
|
+
/** Resolve a workflow ref to its authored file and canonical run ref. */
|
|
36
|
+
function resolveWorkflowAsset(ref) {
|
|
42
37
|
const bundleRef = parseWorkflowRefInput(ref);
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (!bundleId || (bundleRef.bundle !== undefined && bundleRef.bundle !== bundleId))
|
|
49
|
-
return [];
|
|
50
|
-
return [{ source, bundleId }];
|
|
51
|
-
});
|
|
52
|
-
if (bundleRef.bundle && searchSources.length === 0) {
|
|
53
|
-
throw new UsageError(`Bundle "${bundleRef.bundle}" was not found among configured sources.`, "WORKFLOW_SOURCE_INVALID");
|
|
54
|
-
}
|
|
55
|
-
let assetPath;
|
|
56
|
-
let sourcePath;
|
|
57
|
-
let sourceBundleId;
|
|
58
|
-
let workflowName;
|
|
59
|
-
let workflowAdapterId;
|
|
60
|
-
let rejectedSource;
|
|
61
|
-
for (const candidateSource of searchSources) {
|
|
62
|
-
const { source, bundleId } = candidateSource;
|
|
63
|
-
const adapterId = source.adapterId ?? detectAdapterId(source.path);
|
|
64
|
-
const ownedSource = source.adapterId ? source : { ...source, adapterId };
|
|
65
|
-
const owner = resolveAdapterConceptOwner(source.path, adapterId, bundleRef.conceptId);
|
|
66
|
-
if (!owner)
|
|
67
|
-
continue;
|
|
68
|
-
if (!ownsNativeWorkflowRuntime(ownedSource) || !owner.workflowSource) {
|
|
69
|
-
rejectedSource ??= { source: ownedSource, bundleId };
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
assetPath = owner.path;
|
|
73
|
-
sourcePath = source.path;
|
|
74
|
-
sourceBundleId = bundleId;
|
|
75
|
-
workflowName = owner.workflowSource.canonicalName;
|
|
76
|
-
workflowAdapterId = adapterId;
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
if (!assetPath) {
|
|
80
|
-
if (rejectedSource) {
|
|
81
|
-
const sourceName = rejectedSource.bundleId;
|
|
82
|
-
const adapterId = rejectedSource.source.adapterId ?? "unassigned";
|
|
83
|
-
throw new UsageError(`Bundle "${sourceName}" uses adapter "${adapterId}", which does not support native workflow execution.`, "WORKFLOW_SOURCE_INVALID");
|
|
38
|
+
const sources = resolveSourceEntries(undefined, loadConfig());
|
|
39
|
+
const match = resolveConceptOwner(bundleRef, sources);
|
|
40
|
+
if (!match) {
|
|
41
|
+
if (bundleRef.bundle && resolveSourcesForOrigin(bundleRef.bundle, sources).length === 0) {
|
|
42
|
+
throw new UsageError(`Bundle "${bundleRef.bundle}" was not found among configured sources.`, "WORKFLOW_SOURCE_INVALID");
|
|
84
43
|
}
|
|
85
44
|
throw new NotFoundError(`Workflow not found for ref: ${ref}`);
|
|
86
45
|
}
|
|
87
|
-
const
|
|
46
|
+
const { owner, source, bundleId, adapterId } = match;
|
|
47
|
+
if ((adapterId !== "akm" && adapterId !== "akm-workflow") || !owner.workflowSource) {
|
|
48
|
+
throw new UsageError(`Bundle "${bundleId}" uses adapter "${adapterId}", which does not support native workflow execution.`, "WORKFLOW_SOURCE_INVALID");
|
|
49
|
+
}
|
|
88
50
|
// Canonicalize the stored ref: `workflows/foo.md` and `workflows/foo` resolve
|
|
89
51
|
// to the same file, so they MUST share one run identity.
|
|
90
|
-
const canonicalName = canonicalizeWorkflowName(
|
|
91
|
-
const fullRef =
|
|
92
|
-
? makeBundleRef(
|
|
93
|
-
: canonicalWorkflowRunRef(
|
|
52
|
+
const canonicalName = canonicalizeWorkflowName(owner.workflowSource.canonicalName);
|
|
53
|
+
const fullRef = adapterId === "akm-workflow"
|
|
54
|
+
? makeBundleRef(bundleId, canonicalName)
|
|
55
|
+
: canonicalWorkflowRunRef(bundleId, canonicalName);
|
|
56
|
+
return { assetPath: owner.path, sourcePath: source.path, adapterId, canonicalName, fullRef };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The root of the bundle that owns a workflow ref right now: where the run's exec units and agents work.
|
|
60
|
+
* A bundle-qualified ref names its bundle, so the workflow file need not exist (a bundle update may have
|
|
61
|
+
* renamed or removed it; the frozen plan is the run's authority). An unqualified legacy ref finds its
|
|
62
|
+
* owner by the existing walk. When the bundle does not resolve, the error keeps its type (and exit code)
|
|
63
|
+
* and names the ref in its message.
|
|
64
|
+
*/
|
|
65
|
+
export function resolveRunBundleRoot(ref) {
|
|
66
|
+
const { bundle } = parseWorkflowRefInput(ref);
|
|
67
|
+
if (bundle === undefined) {
|
|
68
|
+
try {
|
|
69
|
+
return resolveWorkflowAsset(ref).sourcePath;
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
// Only a miss means the bundle does not resolve; any other error (an
|
|
73
|
+
// unsupported adapter, a collision) is reported as itself.
|
|
74
|
+
if (err instanceof NotFoundError) {
|
|
75
|
+
throw new NotFoundError(`workflow ${ref} does not resolve to a bundle: ${err.message}`, err.code, err.hint());
|
|
76
|
+
}
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const source = resolveSourcesForOrigin(bundle, resolveSourceEntries(undefined, loadConfig()))[0];
|
|
81
|
+
if (!source) {
|
|
82
|
+
throw new UsageError(`workflow ${ref} does not resolve to a bundle: bundle "${bundle}" is not configured`, "WORKFLOW_SOURCE_INVALID");
|
|
83
|
+
}
|
|
84
|
+
return source.path;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve a workflow ref and compile its authored bytes into a plan.
|
|
88
|
+
*/
|
|
89
|
+
export async function loadWorkflowAsset(ref) {
|
|
90
|
+
const { assetPath, adapterId, canonicalName, fullRef } = resolveWorkflowAsset(ref);
|
|
94
91
|
const title = canonicalName.split("/").pop() || canonicalName;
|
|
95
92
|
const bytes = fs.readFileSync(assetPath);
|
|
96
93
|
const result = compileWorkflowSource(bytes.toString("utf8"), {
|
|
97
94
|
path: assetPath,
|
|
98
|
-
workspaceRoot: resolvedSourcePath,
|
|
99
95
|
title,
|
|
100
96
|
});
|
|
101
97
|
if (!result.ok) {
|
|
@@ -106,36 +102,9 @@ export async function loadWorkflowAsset(ref) {
|
|
|
106
102
|
return {
|
|
107
103
|
ref: fullRef,
|
|
108
104
|
path: assetPath,
|
|
109
|
-
|
|
110
|
-
adapterId: workflowAdapterId,
|
|
105
|
+
adapterId,
|
|
111
106
|
title,
|
|
112
107
|
plan: result.plan,
|
|
113
108
|
sourceHash: createHash("sha256").update(bytes).digest("hex"),
|
|
114
109
|
};
|
|
115
110
|
}
|
|
116
|
-
function ownsNativeWorkflowRuntime(source) {
|
|
117
|
-
return source.adapterId === "akm" || source.adapterId === "akm-workflow";
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Resolve the `entries.id` for an indexed workflow, or null when the index
|
|
121
|
-
* database does not yet exist or has no matching entry.
|
|
122
|
-
*/
|
|
123
|
-
export function resolveWorkflowEntryId(_sourcePath, ref, adapterId) {
|
|
124
|
-
if (!fs.existsSync(getDbPath()))
|
|
125
|
-
return null;
|
|
126
|
-
const parsed = parseBundleRef(ref);
|
|
127
|
-
if (!parsed.bundle)
|
|
128
|
-
throw new UsageError(`Expected a bundle-qualified workflow ref, got "${ref}".`);
|
|
129
|
-
const itemRef = makeBundleRef(parsed.bundle, parsed.conceptId);
|
|
130
|
-
return withIndexDb((db) => {
|
|
131
|
-
const row = db
|
|
132
|
-
.prepare(`SELECT id
|
|
133
|
-
FROM entries
|
|
134
|
-
WHERE type = 'workflow'
|
|
135
|
-
AND item_ref = ?
|
|
136
|
-
${adapterId ? "AND adapter_id = ?" : ""}
|
|
137
|
-
LIMIT 1`)
|
|
138
|
-
.get(itemRef, ...(adapterId ? [adapterId] : []));
|
|
139
|
-
return row?.id ?? null;
|
|
140
|
-
});
|
|
141
|
-
}
|
|
@@ -66,15 +66,6 @@ export class WorkflowSourceLinkResolutionError extends WorkflowSourceRejectionEr
|
|
|
66
66
|
Object.setPrototypeOf(this, new.target.prototype);
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
export class WorkflowSourcePathIdentityError extends WorkflowSourceRejectionError {
|
|
70
|
-
constructor(sourcePath, targetPath) {
|
|
71
|
-
super(`Workflow source ${sourcePath} resolves outside the bundle root to ${targetPath}.`, "PATH_ESCAPE_VIOLATION", [
|
|
72
|
-
sourcePath,
|
|
73
|
-
]);
|
|
74
|
-
this.name = "WorkflowSourcePathIdentityError";
|
|
75
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
69
|
/** Convert an adapter-owned concept id into its extensionless workflow name. */
|
|
79
70
|
export function workflowNameForConceptId(adapterId, conceptId) {
|
|
80
71
|
if (adapterId === "akm-workflow")
|
|
@@ -270,21 +261,18 @@ function inspectWorkflowSourceCandidate(candidate, canonicalName, realRoot) {
|
|
|
270
261
|
issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
|
|
271
262
|
return { issues };
|
|
272
263
|
}
|
|
264
|
+
// A symlink may point anywhere (installing a bundle is the trust decision),
|
|
265
|
+
// but it may not change the source's format.
|
|
273
266
|
const targetPath = toPosix(path.relative(realRoot, realPath));
|
|
274
|
-
const contained = isWithinResolved(realPath, realRoot);
|
|
275
|
-
if (!contained)
|
|
276
|
-
issues.push(new WorkflowSourcePathIdentityError(candidate.relativePath, targetPath));
|
|
277
267
|
if (isLink && path.extname(realPath).toLowerCase() !== candidate.lowerExtension) {
|
|
278
268
|
issues.push(new WorkflowSourceLinkIdentityError(candidate.relativePath, targetPath));
|
|
279
269
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
if (!fs.statSync(realPath).isFile())
|
|
283
|
-
issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
|
|
284
|
-
}
|
|
285
|
-
catch {
|
|
270
|
+
try {
|
|
271
|
+
if (!fs.statSync(realPath).isFile())
|
|
286
272
|
issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
|
|
287
|
-
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
|
|
288
276
|
}
|
|
289
277
|
if (issues.length > 0)
|
|
290
278
|
return { issues };
|
package/docs/README.md
CHANGED
|
@@ -17,6 +17,7 @@ Full per-directory indexes: [Guides](guides/README.md),
|
|
|
17
17
|
- [Getting Started](guides/getting-started.md) -- Install akm, connect a source, and pull a curated shortlist in five to seven minutes
|
|
18
18
|
- [Concepts](guides/concepts.md) -- Capabilities, bundles, adapters, asset types, and refs -- the mental model in one page
|
|
19
19
|
- [Agent Install Guide](agents/agent-install.md) -- Step-by-step automated (non-interactive) install for agents
|
|
20
|
+
- [Upgrade from 0.9 to 0.10](migration/v0.9-to-v0.10.md) -- The current upgrade path: the order to follow, every removed CLI spelling, config key and workflow feature with its replacement, and what a scheduled `akm improve` now does
|
|
20
21
|
- `akm hints` (complete guide by default; `akm hints --detail brief` for the short one) -- The CLI reference agents load to use akm; always the embedded corpus at `src/assets/hints/cli-hints-{full,short}.md`
|
|
21
22
|
|
|
22
23
|
## Use
|
|
@@ -32,7 +33,6 @@ the task needs, and capture what you learn along the way.
|
|
|
32
33
|
- [Environment & Secrets](reference/env-and-secrets.md) -- `akm env` and `akm secret`: exact operations, file modes, and the security guarantee
|
|
33
34
|
- [Run Workflows](guides/run-workflows.md) -- Start or continue a run, check on it, resume it, or abandon it
|
|
34
35
|
- [Scheduling](guides/scheduling.md) -- Run akm tasks through the OS scheduler (cron / launchd / schtasks) safely
|
|
35
|
-
- [Migrate to 0.9.2](migration/v0.9.1-to-v0.9.2.md) -- Convert task-v2 sources safely and understand workflow resume compatibility
|
|
36
36
|
- [Improve the Library](guides/improve-the-library.md) -- Feedback, history, and proposals -- how evidence turns into reviewable changes
|
|
37
37
|
- Recipes: [Turn a Website into a Searchable Bundle](guides/recipes/website-source.md), [Headless Install](guides/recipes/headless-install.md)
|
|
38
38
|
|
|
@@ -42,23 +42,21 @@ Package complete capabilities and turn knowledge into repeatable work.
|
|
|
42
42
|
|
|
43
43
|
- [Bundle Author's Guide](guides/author-bundles.md) -- Build a bundle, make it discoverable, and share it so others can install it with `akm bundle add`
|
|
44
44
|
- [Author's Guide: Writing Workflows](guides/author-workflows.md) -- Write and test a workflow definition, from a minimal example to gates and outputs
|
|
45
|
-
- [Claude Code workflows vs. akm workflows](guides/claude-code-vs-akm-workflows.md) -- Short decision guide for choosing between a session-native workflow and an akm workflow ([full technical comparison](architecture/comparisons/claude-code-vs-akm-workflows-full.md))
|
|
46
45
|
- [Bundling akm](integration/bundling-akm.md) -- Ship akm inside your own product: the pin/migrate/health boot contract, plan JSON shapes, and exit codes for bundlers
|
|
47
46
|
|
|
48
47
|
### Maintainers
|
|
49
48
|
|
|
50
49
|
Working on akm itself, not just using it.
|
|
51
50
|
|
|
52
|
-
- [Maintainer Docs](maintainers/README.md) -- Start here: local development,
|
|
51
|
+
- [Maintainer Docs](maintainers/README.md) -- Start here: local development, the release checklist, and measuring improvement
|
|
53
52
|
- [Local Development](maintainers/local-development.md) -- Dogfooding akm while editing its own source
|
|
54
|
-
- [Curate Workmap](maintainers/curate-workmap.md) -- The current `akm curate` contract and the highest-value next fixes
|
|
55
53
|
|
|
56
54
|
## Look up details
|
|
57
55
|
|
|
58
56
|
- [CLI](reference/cli.md) -- All `akm` commands and flags
|
|
59
|
-
- [Configuration](reference/configuration.md) --
|
|
57
|
+
- [Configuration](reference/configuration.md) -- Connections, harnesses, strategies, bundles, and settings
|
|
60
58
|
- [Supported Formats](reference/supported-formats.md) -- Every bundle format akm recognizes, its detection marker, and current read/write support
|
|
61
|
-
- [Tasks](reference/tasks.md) -- Task
|
|
59
|
+
- [Tasks](reference/tasks.md) -- Task source v4 files, targets, triggers, and the explicit `akm migrate apply` conversion of v2 and v3 files
|
|
62
60
|
- [Asset Types](reference/asset-types.md) -- The capability taxonomy, directory conventions, and per-type examples
|
|
63
61
|
- [Refs](reference/refs.md) -- The ref grammar `akm search` emits and `akm show` consumes
|
|
64
62
|
- [Memory](reference/memory.md) -- The `memory` asset type: capture, belief states, and derived memories
|
|
@@ -68,17 +66,14 @@ Working on akm itself, not just using it.
|
|
|
68
66
|
- [Website Sources](reference/website-sources.md) -- The pluggable fetcher API for URL-based knowledge reads
|
|
69
67
|
- [Data & Telemetry](reference/data-and-telemetry.md) -- Exactly what akm reads and writes on your machine (no remote telemetry)
|
|
70
68
|
- [Architecture Overview](architecture/architecture.md) -- How akm's bundles, cache, index, and registries fit together
|
|
71
|
-
- [Core Principles](architecture/akm-core-principles.md) --
|
|
69
|
+
- [Core Principles](architecture/akm-core-principles.md) -- How the code, tests and docs in this repo are built: the engineering rules and what enforces each
|
|
72
70
|
- [Adapters](architecture/adapters.md) -- How akm picks an adapter, indexes, validates, and writes into a bundle
|
|
73
71
|
- [The Workflow Engine](architecture/workflow-engine.md) -- How a frozen plan is stored, dispatched, and resumed without replaying completed units
|
|
74
72
|
- [The Improvement Loop](architecture/improvement.md) -- How a feedback signal becomes a ranking change, and how evidence becomes a proposal
|
|
75
|
-
- [
|
|
76
|
-
- [
|
|
77
|
-
- [
|
|
78
|
-
- [
|
|
79
|
-
- [Testing](architecture/README.md#testing-testing) -- Testing workflow and pre-release checklist
|
|
80
|
-
- [Migration](migration/README.md) -- Upgrade guides and per-release migration notes
|
|
81
|
-
- [Roadmap](https://github.com/itlackey/akm/blob/main/ROADMAP.md) -- High-level focus for the releases from here through 1.0
|
|
73
|
+
- [Specs](architecture/README.md#specs-specs) -- Normative specifications (ref grammar, OKF support)
|
|
74
|
+
- [Internals](architecture/README.md#internals-internals) -- Current-truth subsystem references (storage, indexing, classification, improve, health)
|
|
75
|
+
- [Testing](architecture/README.md#testing-testing) -- Testing workflow
|
|
76
|
+
- [Migration](migration/README.md) -- The current 0.9 to 0.10 upgrade guide, then the historical guides and per-release notes of earlier releases
|
|
82
77
|
|
|
83
78
|
## Execution boundary
|
|
84
79
|
|
|
@@ -86,8 +81,7 @@ AKM retrieves every supported capability type. It directly orchestrates
|
|
|
86
81
|
defined execution surfaces such as workflows, agent dispatch, tasks, and
|
|
87
82
|
guarded subprocess injection. It does not blindly execute arbitrary indexed
|
|
88
83
|
content merely because that content appears in search results. See
|
|
89
|
-
[
|
|
90
|
-
and [The Improvement Loop](architecture/improvement.md) for how that boundary
|
|
84
|
+
[The Improvement Loop](architecture/improvement.md) for how that boundary
|
|
91
85
|
applies to akm's own self-generated changes.
|
|
92
86
|
|
|
93
87
|
## Posts
|