akm-cli 0.10.261012-beta → 0.10.261014-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* `akm workflow` command family. `run` is the canonical start/
|
|
6
|
-
*
|
|
5
|
+
* `akm workflow` command family. `run` is the canonical start/execute surface
|
|
6
|
+
* (a ref starts a new run, a run id drives that run) and `resume` reopens a
|
|
7
|
+
* run; the former public `start`, `next`, and `complete` lifecycle is gone.
|
|
7
8
|
* `create --print` emits Markdown, the only workflow source format. Validate
|
|
8
9
|
* with `akm lint --type workflows`.
|
|
9
10
|
*/
|
|
@@ -13,7 +14,6 @@ import { armAbortDeadline } from "../core/abort-deadline.js";
|
|
|
13
14
|
import { assertFlatAssetName, combineCreatePath, normalizeCreateSubPath } from "../core/asset/asset-create.js";
|
|
14
15
|
import { NotFoundError, TransientError, UsageError } from "../core/errors.js";
|
|
15
16
|
import { warn } from "../core/warn.js";
|
|
16
|
-
import { akmIndex } from "../indexer/indexer.js";
|
|
17
17
|
import { assertWorkflowMarkdownName, createWorkflowAsset, getWorkflowTemplate } from "../workflows/authoring/authoring.js";
|
|
18
18
|
import { WORKFLOW_MAX_TIMEOUT_MS } from "../workflows/resource-limits.js";
|
|
19
19
|
import { abandonWorkflowRun, getWorkflowStatus, listWorkflowRuns, resolveWorkflowRunTarget, resumeWorkflowRun, } from "../workflows/runtime/runs.js";
|
|
@@ -21,7 +21,7 @@ import { akmWorkflowPlan } from "./workflow/plan.js";
|
|
|
21
21
|
const workflowStatusCommand = defineJsonCommand({
|
|
22
22
|
meta: {
|
|
23
23
|
name: "status",
|
|
24
|
-
description: "Show full workflow run state for review or resume; workflow
|
|
24
|
+
description: "Show full workflow run state for review or resume; a workflow ref shows its most recent run",
|
|
25
25
|
},
|
|
26
26
|
args: {
|
|
27
27
|
target: { type: "positional", description: "Workflow run id or workflow ref (workflows/<name>)", required: true },
|
|
@@ -31,16 +31,17 @@ const workflowStatusCommand = defineJsonCommand({
|
|
|
31
31
|
"diagnostic text). Diagnostics only — step evidence stays deterministic and is unaffected.",
|
|
32
32
|
default: false,
|
|
33
33
|
},
|
|
34
|
+
// Deprecated no-op, accepted through 0.10 so scripts that pass it do not
|
|
35
|
+
// fail with UNKNOWN_FLAG. Runs are no longer scoped to a directory.
|
|
34
36
|
"all-scopes": {
|
|
35
37
|
type: "boolean",
|
|
36
|
-
description: "
|
|
38
|
+
description: "Deprecated, no effect: runs are host-wide, not scoped to a directory. Accepted through 0.10 for existing scripts.",
|
|
37
39
|
default: false,
|
|
38
40
|
},
|
|
39
41
|
},
|
|
40
42
|
async run({ args }) {
|
|
41
43
|
const target = args.target;
|
|
42
44
|
const includeUnits = args.units === true;
|
|
43
|
-
const allScopes = args["all-scopes"] === true;
|
|
44
45
|
const resolvedRunId = await resolveWorkflowRunTarget(target);
|
|
45
46
|
if (resolvedRunId !== undefined) {
|
|
46
47
|
const result = await getWorkflowStatus(resolvedRunId, { includeUnits });
|
|
@@ -48,9 +49,8 @@ const workflowStatusCommand = defineJsonCommand({
|
|
|
48
49
|
return;
|
|
49
50
|
}
|
|
50
51
|
let runs;
|
|
51
|
-
let scopeKey;
|
|
52
52
|
try {
|
|
53
|
-
({ runs
|
|
53
|
+
({ runs } = await listWorkflowRuns({ workflowRef: target }));
|
|
54
54
|
}
|
|
55
55
|
catch (error) {
|
|
56
56
|
if (!target.includes(":") && !target.includes("/")) {
|
|
@@ -60,14 +60,6 @@ const workflowStatusCommand = defineJsonCommand({
|
|
|
60
60
|
}
|
|
61
61
|
const mostRecent = runs[0];
|
|
62
62
|
if (!mostRecent) {
|
|
63
|
-
// #942: name the scope actually searched and point at `--all-scopes`
|
|
64
|
-
// rather than a bare "not found" — the ref-fallthrough lookup is
|
|
65
|
-
// scope-local by default, so "no runs" here means "none in THIS
|
|
66
|
-
// scope", not "none anywhere". Already searching every scope (or no
|
|
67
|
-
// real scope was filtered on) has nothing more specific to suggest.
|
|
68
|
-
if (!allScopes && scopeKey !== null) {
|
|
69
|
-
throw new NotFoundError(`No workflow runs found for ${target} in scope ${scopeKey}.`, "WORKFLOW_NOT_FOUND", `Run 'akm workflow status ${target} --all-scopes' to search every scope.`);
|
|
70
|
-
}
|
|
71
63
|
throw new NotFoundError(`No workflow runs found for ${target}`, "WORKFLOW_NOT_FOUND");
|
|
72
64
|
}
|
|
73
65
|
const result = await getWorkflowStatus(mostRecent.id, { includeUnits });
|
|
@@ -77,9 +69,7 @@ const workflowStatusCommand = defineJsonCommand({
|
|
|
77
69
|
const workflowListCommand = defineJsonCommand({
|
|
78
70
|
meta: {
|
|
79
71
|
name: "list",
|
|
80
|
-
description: "List workflow runs
|
|
81
|
-
"sit in another scope: get the run id from `akm task history <task-id> --limit 1` (detail.runId) and pass it " +
|
|
82
|
-
"to `akm workflow status <run-id>`, which works from any directory, or pass --all-scopes.",
|
|
72
|
+
description: "List workflow runs on this host, most recently updated first",
|
|
83
73
|
},
|
|
84
74
|
args: {
|
|
85
75
|
ref: { type: "string", description: "Filter to one workflow ref" },
|
|
@@ -89,11 +79,11 @@ const workflowListCommand = defineJsonCommand({
|
|
|
89
79
|
description: "Also include child workflow runs (hidden by default, P3b)",
|
|
90
80
|
default: false,
|
|
91
81
|
},
|
|
82
|
+
// Deprecated no-op, accepted through 0.10 so scripts that pass it do not
|
|
83
|
+
// fail with UNKNOWN_FLAG. Runs are no longer scoped to a directory.
|
|
92
84
|
"all-scopes": {
|
|
93
85
|
type: "boolean",
|
|
94
|
-
description: "
|
|
95
|
-
"`null` with this flag, otherwise the scope that was searched — so an empty `runs: []` is never " +
|
|
96
|
-
'indistinguishable from "nothing anywhere".',
|
|
86
|
+
description: "Deprecated, no effect: runs are host-wide, not scoped to a directory. Accepted through 0.10 for existing scripts.",
|
|
97
87
|
default: false,
|
|
98
88
|
},
|
|
99
89
|
},
|
|
@@ -102,7 +92,6 @@ const workflowListCommand = defineJsonCommand({
|
|
|
102
92
|
workflowRef: args.ref,
|
|
103
93
|
activeOnly: args.active,
|
|
104
94
|
includeChildren: args.children,
|
|
105
|
-
allScopes: args["all-scopes"],
|
|
106
95
|
});
|
|
107
96
|
output("workflow-list", result);
|
|
108
97
|
},
|
|
@@ -158,12 +147,6 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
158
147
|
from: args.from,
|
|
159
148
|
force: args.force,
|
|
160
149
|
});
|
|
161
|
-
// Index the newly-written workflow so `akm workflow run` can resolve
|
|
162
|
-
// a workflowEntryId without requiring an explicit `akm index` call
|
|
163
|
-
// first. Uses the same incremental index path that `akm add` uses.
|
|
164
|
-
// `result.bundleDir` — the indexer's own `IndexOptions.stashDir` field
|
|
165
|
-
// name is unchanged (indexer vocabulary is out of scope, P4 row B-50).
|
|
166
|
-
await akmIndex({ stashDir: result.bundleDir });
|
|
167
150
|
output("workflow-create", { ok: true, ...result });
|
|
168
151
|
},
|
|
169
152
|
});
|
|
@@ -184,29 +167,34 @@ const WORKFLOW_RUN_SKIP_REASONS = {
|
|
|
184
167
|
const workflowRunCommand = defineJsonCommand({
|
|
185
168
|
meta: {
|
|
186
169
|
name: "run",
|
|
187
|
-
description: "Start
|
|
170
|
+
description: "Start a new run of a workflow ref, or drive an existing run by id, through completion, failure, a verification gate, or an explicit limit",
|
|
188
171
|
},
|
|
189
172
|
args: {
|
|
190
|
-
target: {
|
|
173
|
+
target: {
|
|
174
|
+
type: "positional",
|
|
175
|
+
description: "Workflow ref (starts a new run) or workflow run id (drives that run)",
|
|
176
|
+
required: true,
|
|
177
|
+
},
|
|
191
178
|
"max-steps": { type: "string", description: "Stop after executing this many steps" },
|
|
192
179
|
"max-retries": { type: "string", description: "Retry a failed workflow step this many additional times" },
|
|
193
180
|
timeout: { type: "string", description: "Whole-run timeout: N, Nms, Ns, or Nm (bare N is milliseconds)" },
|
|
181
|
+
// Deprecated no-op, accepted through 0.10 so scripts that pass it do not
|
|
182
|
+
// fail with UNKNOWN_FLAG. A workflow ref always starts a new run now.
|
|
194
183
|
new: {
|
|
195
184
|
type: "boolean",
|
|
196
|
-
description: "
|
|
197
|
-
"(never abandons it). A workflow ref only — passing a run id with --new is a usage error.",
|
|
185
|
+
description: "Deprecated, no effect: a workflow ref always starts a new run. Accepted through 0.10 for existing scripts.",
|
|
198
186
|
default: false,
|
|
199
187
|
},
|
|
200
188
|
"skip-if-locked": {
|
|
201
189
|
type: "boolean",
|
|
202
|
-
description: "If another akm process is already driving this run
|
|
203
|
-
"writer, skip gracefully (exit 0) instead of failing (exit 75). Use for
|
|
204
|
-
"so they don't pile up failures while a longer-running invocation is in progress.",
|
|
190
|
+
description: "If another akm process is already driving this run (or, for a workflow ref, an active run of it), or " +
|
|
191
|
+
"state.db is busy with another writer, skip gracefully (exit 0) instead of failing (exit 75). Use for " +
|
|
192
|
+
"high-frequency scheduled runs so they don't pile up failures while a longer-running invocation is in progress.",
|
|
205
193
|
default: false,
|
|
206
194
|
},
|
|
207
195
|
},
|
|
208
196
|
async run({ args, rawArgs }) {
|
|
209
|
-
const { runWorkflowSteps } = await import("../workflows/exec/run-workflow.js");
|
|
197
|
+
const { findLiveLockedRunOfRef, runWorkflowSteps } = await import("../workflows/exec/run-workflow.js");
|
|
210
198
|
const parameterFlags = parseWorkflowParameterFlags(rawArgs, args.target);
|
|
211
199
|
const maxSteps = parseIntegerFlag(getStringArg(args, "max-steps"), "--max-steps", 1);
|
|
212
200
|
const maxRetries = parseIntegerFlag(getStringArg(args, "max-retries"), "--max-retries", 0);
|
|
@@ -228,15 +216,25 @@ const workflowRunCommand = defineJsonCommand({
|
|
|
228
216
|
timeoutMs,
|
|
229
217
|
reason: `Workflow run timed out after ${timeoutMs}ms.`,
|
|
230
218
|
});
|
|
219
|
+
const skip = (reason, message) => {
|
|
220
|
+
warn(`[workflow] ${message} skipping (--skip-if-locked)`);
|
|
221
|
+
output("workflow-run", { ok: true, target: args.target, skipped: { reason, message } });
|
|
222
|
+
};
|
|
231
223
|
try {
|
|
232
224
|
let result;
|
|
233
225
|
try {
|
|
226
|
+
// #1239: a ref start never conflicts with another run of the ref, so
|
|
227
|
+
// the one extra condition is an active run of it a live process is driving.
|
|
228
|
+
const held = skipIfLocked ? await findLiveLockedRunOfRef(args.target) : undefined;
|
|
229
|
+
if (held) {
|
|
230
|
+
skip("lock-held", `Workflow run ${held.runId} of ${args.target} is already being driven by another akm process (pid ${held.holder}).`);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
234
233
|
result = await runWorkflowSteps({
|
|
235
234
|
target: args.target,
|
|
236
235
|
parameterFlags,
|
|
237
236
|
...(maxSteps !== undefined ? { maxSteps } : {}),
|
|
238
237
|
...(maxRetries !== undefined ? { maxRetries } : {}),
|
|
239
|
-
newRun: args.new,
|
|
240
238
|
signal: controller.signal,
|
|
241
239
|
});
|
|
242
240
|
}
|
|
@@ -247,9 +245,7 @@ const workflowRunCommand = defineJsonCommand({
|
|
|
247
245
|
// off UsageError) — a bad flag or malformed input still fails loudly
|
|
248
246
|
// even with the flag set.
|
|
249
247
|
if (skipIfLocked && err instanceof TransientError && WORKFLOW_RUN_SKIP_REASONS[err.code]) {
|
|
250
|
-
|
|
251
|
-
warn(`[workflow] ${err.message} skipping (--skip-if-locked)`);
|
|
252
|
-
output("workflow-run", { ok: true, target: args.target, skipped: { reason, message: err.message } });
|
|
248
|
+
skip(WORKFLOW_RUN_SKIP_REASONS[err.code], err.message);
|
|
253
249
|
return;
|
|
254
250
|
}
|
|
255
251
|
throw err;
|
|
@@ -371,10 +367,9 @@ function parseWorkflowTimeout(raw) {
|
|
|
371
367
|
}
|
|
372
368
|
return timeoutMs;
|
|
373
369
|
}
|
|
374
|
-
//
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
// (B-N9); the global `--format json` is spliced on by `defineJsonCommand`.
|
|
370
|
+
// Read-only compile+freeze introspection — zero durable writes, zero
|
|
371
|
+
// usage/event rows. `--json` is deliberately NOT a flag anywhere in this CLI;
|
|
372
|
+
// the global `--format json` is spliced on by `defineJsonCommand`.
|
|
378
373
|
const workflowPlanCommand = defineJsonCommand({
|
|
379
374
|
meta: {
|
|
380
375
|
name: "plan",
|
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
* github.com/anthropics/skills): each `<name>/SKILL.md` is one `skill` item
|
|
9
9
|
* whose conceptId is the package DIRECTORY (`<name>`); bundled resources under
|
|
10
10
|
* the package (`<name>/reference/FORMS.md`) are part of the item, not standalone
|
|
11
|
-
* concepts (item-scoped incrementality
|
|
12
|
-
* with claude/opencode as functions
|
|
11
|
+
* concepts (item-scoped incrementality). The SKILL.md codec is shared
|
|
12
|
+
* with claude/opencode as functions; this adapter differs in that the
|
|
13
13
|
* package dir sits directly under the component root (no `skills/` prefix) and
|
|
14
|
-
* that `validate` enforces the FULL Agent Skills contract
|
|
14
|
+
* that `validate` enforces the FULL Agent Skills contract.
|
|
15
15
|
*
|
|
16
16
|
* RECOGNITION ≠ VALIDATION: an invalid skill (bad name charset, over-long
|
|
17
17
|
* description) is still RECOGNIZED as `type: skill` (the raw invalid `name` is
|
|
18
18
|
* projected so it is inspectable downstream); the violations surface only in
|
|
19
|
-
* `validate
|
|
19
|
+
* `validate`. This mirrors how `okf` recognizes content and defers
|
|
20
20
|
* leniency to validate.
|
|
21
21
|
*
|
|
22
|
-
* ── validate
|
|
22
|
+
* ── validate ──
|
|
23
23
|
*
|
|
24
24
|
* - `skill-name-invalid` — name must be NFKC 1-64 chars matching
|
|
25
25
|
* `^[a-z0-9]+(-[a-z0-9]+)*$`, carry no reserved word, and equal the parent
|
|
@@ -32,8 +32,7 @@
|
|
|
32
32
|
* cannot reach it, because a change is always a file and a manifest-less
|
|
33
33
|
* package contributes no SKILL.md change (issue #774).
|
|
34
34
|
*
|
|
35
|
-
* The two field codes are
|
|
36
|
-
* implemented here. Base checks are NOT run:
|
|
35
|
+
* The two field codes are implemented here. Base checks are NOT run:
|
|
37
36
|
* a SKILL.md carries no `updated` field, so `missing-updated` would fire on
|
|
38
37
|
* every conformant skill and contradict the lint golden.
|
|
39
38
|
*
|
|
@@ -50,12 +49,12 @@ import { hashContent, nonEmptyString, readTags } from "./shared.js";
|
|
|
50
49
|
const COMPONENT_ID = "main";
|
|
51
50
|
/** The skill manifest basename (the item marker). */
|
|
52
51
|
const SKILL_MANIFEST = "SKILL.md";
|
|
53
|
-
/** Agent Skills hard limits
|
|
52
|
+
/** Agent Skills hard limits. */
|
|
54
53
|
const NAME_MAX = 64;
|
|
55
54
|
const DESCRIPTION_MAX = 1024;
|
|
56
55
|
/** Agent Skills reserved words a name must not contain (real-world source). */
|
|
57
56
|
const RESERVED_NAME_WORDS = ["anthropic", "claude"];
|
|
58
|
-
/** name charset/shape rule
|
|
57
|
+
/** name charset/shape rule. */
|
|
59
58
|
const NAME_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
60
59
|
/** conceptId + package-dir name for a `<name>/SKILL.md` file, or null when the file is not a skill manifest. */
|
|
61
60
|
function skillPackage(relPath) {
|
|
@@ -111,7 +110,7 @@ function skillFieldDiagnostics(relPath, dirName, data) {
|
|
|
111
110
|
file: relPath,
|
|
112
111
|
issue: "skill-name-invalid",
|
|
113
112
|
detail: `skill name '${name}' must match ^[a-z0-9]+(-[a-z0-9]+)*$ (NFKC, 1-${NAME_MAX} chars, ` +
|
|
114
|
-
`no reserved word, == parent dir name '${dirName}') — Agent Skills hard rule
|
|
113
|
+
`no reserved word, == parent dir name '${dirName}') — Agent Skills hard rule.`,
|
|
115
114
|
fixed: false,
|
|
116
115
|
});
|
|
117
116
|
}
|
|
@@ -120,7 +119,7 @@ function skillFieldDiagnostics(relPath, dirName, data) {
|
|
|
120
119
|
diagnostics.push({
|
|
121
120
|
file: relPath,
|
|
122
121
|
issue: "skill-description-too-long",
|
|
123
|
-
detail: `skill description is ${description.length} characters; the Agent Skills hard limit is 1-${DESCRIPTION_MAX}
|
|
122
|
+
detail: `skill description is ${description.length} characters; the Agent Skills hard limit is 1-${DESCRIPTION_MAX}.`,
|
|
124
123
|
fixed: false,
|
|
125
124
|
});
|
|
126
125
|
}
|
|
@@ -2,19 +2,18 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* The AKM workspace's own `akm` adapter
|
|
5
|
+
* The AKM workspace's own `akm` adapter.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* §6 + §7 (the `akm` row) EXACTLY: a BEHAVIOR-PRESERVING PORT that reproduces
|
|
7
|
+
* A BEHAVIOR-PRESERVING PORT that reproduces
|
|
9
8
|
* TODAY'S classification and placement VERBATIM by REUSING the existing matcher
|
|
10
9
|
* stack. It is NOT re-derived onto frontmatter `type` (that is the sibling
|
|
11
|
-
* `okf` adapter's job
|
|
12
|
-
* VALUES the single `akm` adapter emits
|
|
10
|
+
* `okf` adapter's job), NOT split per-`type` (the 14 AKM formats are `type`
|
|
11
|
+
* VALUES the single `akm` adapter emits), and introduces NO new
|
|
13
12
|
* positional/directory heuristics of its own.
|
|
14
13
|
*
|
|
15
|
-
* ── recognize
|
|
14
|
+
* ── recognize: the sync `runMatchers` reproduction ──
|
|
16
15
|
*
|
|
17
|
-
* `file-context.ts#runMatchers`
|
|
16
|
+
* `file-context.ts#runMatchers` is async ONLY because of its lazy
|
|
18
17
|
* `ensureBuiltinsRegistered()` dynamic import; its ARBITRATION is pure and
|
|
19
18
|
* synchronous. We reproduce it here by importing the SAME four builtin matcher
|
|
20
19
|
* functions (`matchers.ts` `extensionMatcher` / `directoryMatcher` /
|
|
@@ -31,10 +30,10 @@
|
|
|
31
30
|
* same arbitration.
|
|
32
31
|
*
|
|
33
32
|
* The winning `MatchResult.renderer` is carried on `documentJson.renderer` so
|
|
34
|
-
*
|
|
35
|
-
* `IndexDocument` field
|
|
33
|
+
* presentation can be wired via `TYPE_PRESENTATION` without a new
|
|
34
|
+
* `IndexDocument` field.
|
|
36
35
|
*
|
|
37
|
-
* ── conceptId
|
|
36
|
+
* ── conceptId: the QUALIFIED spelling ──
|
|
38
37
|
*
|
|
39
38
|
* conceptId = `<stash-subdir>/<canonical-name>` — the placement stash-subdir
|
|
40
39
|
* (`stashDirFor(type)`) followed by the winning type's canonical name
|
|
@@ -43,26 +42,26 @@
|
|
|
43
42
|
* extension, env/task strip their ext, and secret/session keep the natural
|
|
44
43
|
* path). For Markdown types this IS the OKF concept ID (path − `.md`); it is
|
|
45
44
|
* the same spelling `readCandidates` consumes, so
|
|
46
|
-
* recognize/read share one identity
|
|
47
|
-
* `type` is carried separately on `IndexDocument.type
|
|
45
|
+
* recognize/read share one identity. The
|
|
46
|
+
* `type` is carried separately on `IndexDocument.type` (type ≠
|
|
48
47
|
* identity), and `entry.name` keeps the BARE canonical name for FTS parity.
|
|
49
48
|
*
|
|
50
49
|
* ── readCandidates / directoryList / looksLikeRoot: type-driven placement ──
|
|
51
50
|
*
|
|
52
51
|
* Placement is type-driven (`path-resolver.ts#buildDiskCandidates`: the primary
|
|
53
52
|
* candidate is `assetPathForName(ref.type, join(root, stashDirFor(ref.type)),
|
|
54
|
-
* ref.name)`).
|
|
53
|
+
* ref.name)`). A ref carries no `type`, so `readCandidates` recovers
|
|
55
54
|
* it from the conceptId's LEADING path segment — the qualified `<stash-subdir>/
|
|
56
|
-
* <name>` form
|
|
55
|
+
* <name>` form — reverse-mapping that segment against the placement
|
|
57
56
|
* stash-subdir map and then delegating to `assetPathCandidatesForName`.
|
|
58
57
|
*
|
|
59
|
-
* ── validate
|
|
58
|
+
* ── validate ──
|
|
60
59
|
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
60
|
+
* Shared base checks (`validateChangesWithBaseChecks` — the ported
|
|
61
|
+
* unquoted-colon / missing-updated / stale-path / missing-ref), then the
|
|
62
|
+
* per-type linters (SkillLinter/WorkflowLinter/TaskLinter/…) in `akm-lint.ts`.
|
|
64
63
|
*
|
|
65
|
-
* ── Cycle-safety
|
|
64
|
+
* ── Cycle-safety ──
|
|
66
65
|
*
|
|
67
66
|
* This module VALUE-imports `matchers.ts` (indexer/walk) for classification and
|
|
68
67
|
* `asset-placement.ts` (core/asset) for placement — delegating to the existing
|
|
@@ -74,15 +73,14 @@
|
|
|
74
73
|
* in production for the frozen `BUILTIN_ADAPTERS` list
|
|
75
74
|
* (`installations.ts#detectAdapterId`, `provider-utils.ts#detectStashRoot`).
|
|
76
75
|
* The adapter is still itself a leaf, since neither the barrel nor the
|
|
77
|
-
* registry import anything that imports back into this file
|
|
78
|
-
* scripts/lint-import-cycles.ts` reports 0 cycle participants and this module
|
|
79
|
-
* is NOT one.
|
|
76
|
+
* registry import anything that imports back into this file.
|
|
80
77
|
*/
|
|
81
78
|
import fs from "node:fs";
|
|
82
79
|
import path from "node:path";
|
|
83
80
|
import { applyPostContributorFields, applyPreContributorFields, extractPackageMetadata, getMarkdownFragmentContent, hasMarkdownFragmentContent, setMarkdownFragmentContent, } from "../../../indexer/passes/metadata.js";
|
|
84
81
|
import { assetPathCandidatesForName, deriveCanonicalAssetNameFromStashRoot, placementTypes, stashDirFor, stashDirNames, } from "../../asset/asset-placement.js";
|
|
85
82
|
import { parseFrontmatter } from "../../asset/frontmatter.js";
|
|
83
|
+
import { sensitiveMarkerPath } from "../../sensitive-marker-path.js";
|
|
86
84
|
import { executionDefaultsFromFrontmatter, renderMarkdownExecutionSource } from "../execution-source.js";
|
|
87
85
|
import { recognizeMatch } from "../recognize-match.js";
|
|
88
86
|
import { perTypeValidateChecks, skillDirectoryDiagnostics } from "./akm-lint.js";
|
|
@@ -95,15 +93,14 @@ import { hashContent, RESERVED_FILES, runBaseValidateChecks } from "./shared.js"
|
|
|
95
93
|
// unaffected.
|
|
96
94
|
export { recognizeMatch } from "../recognize-match.js";
|
|
97
95
|
/**
|
|
98
|
-
* OKF reserved structural files (
|
|
99
|
-
* adapter-spec §5.1/§6): `index.md` (directory listing) and `log.md` (update
|
|
96
|
+
* OKF reserved structural files: `index.md` (directory listing) and `log.md` (update
|
|
100
97
|
* history) are bundle structure at EVERY depth — never a concept document. The
|
|
101
98
|
* `okf` / `llm-wiki` adapters already exclude them (`shared.ts`'s
|
|
102
99
|
* `RESERVED_FILES`); this brings the `akm` adapter into conformance so a
|
|
103
100
|
* `knowledge/index.md` never classifies as a `knowledge` item. Case-insensitive,
|
|
104
101
|
* matched on the bare filename so the exclusion holds at any depth.
|
|
105
102
|
*/
|
|
106
|
-
/** True when `name` (a bare file name) is an OKF reserved file, case-insensitively
|
|
103
|
+
/** True when `name` (a bare file name) is an OKF reserved file, case-insensitively. */
|
|
107
104
|
function isReservedFileName(name) {
|
|
108
105
|
return RESERVED_FILES.has(name.toLowerCase());
|
|
109
106
|
}
|
|
@@ -136,7 +133,7 @@ function akmStashAbstains(root, absPath) {
|
|
|
136
133
|
return true;
|
|
137
134
|
// Skip env `.env` files that have a sibling `.sensitive` marker file.
|
|
138
135
|
if (segments[0] === "env" && (absPath.endsWith(".env") || path.basename(absPath) === ".env")) {
|
|
139
|
-
if (fs.existsSync(absPath
|
|
136
|
+
if (fs.existsSync(sensitiveMarkerPath(absPath, "env")))
|
|
140
137
|
return true;
|
|
141
138
|
}
|
|
142
139
|
// Skip secret files that are themselves a `.sensitive` marker, or that have a
|
|
@@ -145,7 +142,7 @@ function akmStashAbstains(root, absPath) {
|
|
|
145
142
|
if (segments[0] === "secrets") {
|
|
146
143
|
if (absPath.endsWith(".sensitive") || absPath.endsWith(".lock"))
|
|
147
144
|
return true;
|
|
148
|
-
if (fs.existsSync(
|
|
145
|
+
if (fs.existsSync(sensitiveMarkerPath(absPath, "secret")))
|
|
149
146
|
return true;
|
|
150
147
|
}
|
|
151
148
|
// Inside a `wikis/<name>/` directory, the root-level infrastructure files
|
|
@@ -166,11 +163,11 @@ function stashDirToType(stashDir) {
|
|
|
166
163
|
}
|
|
167
164
|
/**
|
|
168
165
|
* The search-surface `IndexDocument` fields that have NO first-class `IndexDocument`
|
|
169
|
-
* home
|
|
170
|
-
* (`search-fields.ts
|
|
166
|
+
* home and therefore ride `documentJson` so the persist-time fold
|
|
167
|
+
* (`search-fields.ts`) can still reach them — the exact set
|
|
171
168
|
* `buildSearchFields` folds into the `hints`/`content` FTS columns beyond the
|
|
172
169
|
* first-class name/description/tags/aliases/searchHints, plus the provenance the
|
|
173
|
-
*
|
|
170
|
+
* tests read (renderer/source). Kept as a named list so the fold surface and
|
|
174
171
|
* the mapping stay in lockstep.
|
|
175
172
|
*/
|
|
176
173
|
const DOCUMENT_JSON_CARRIED_FIELDS = [
|
|
@@ -203,11 +200,11 @@ const DOCUMENT_JSON_CARRIED_FIELDS = [
|
|
|
203
200
|
];
|
|
204
201
|
/**
|
|
205
202
|
* Map the fully-assembled `IndexDocument` (produced by the shared metadata
|
|
206
|
-
* pipeline) onto an `IndexDocument
|
|
203
|
+
* pipeline) onto an `IndexDocument`. First-class ranking/embedding
|
|
207
204
|
* fields land on named IndexDocument fields; every other search-surface or
|
|
208
205
|
* signal field rides `documentJson` (opaque adapter extras) so nothing the
|
|
209
|
-
* ranking/embedding/filter inputs read is lost
|
|
210
|
-
* The winning renderer name is carried on `documentJson.renderer
|
|
206
|
+
* ranking/embedding/filter inputs read is lost.
|
|
207
|
+
* The winning renderer name is carried on `documentJson.renderer`.
|
|
211
208
|
*/
|
|
212
209
|
function indexDocumentFromEntry(entry, base, rendererName) {
|
|
213
210
|
const extras = { renderer: rendererName };
|
|
@@ -264,7 +261,7 @@ function conceptIdForRecognizedType(root, filePath, type) {
|
|
|
264
261
|
return stashDir !== undefined ? `${stashDir}/${canonicalName}` : canonicalName;
|
|
265
262
|
}
|
|
266
263
|
function recognize(c, file) {
|
|
267
|
-
//
|
|
264
|
+
// `index.md` / `log.md` are OKF reserved structural files at
|
|
268
265
|
// every depth — never items. Excluded BEFORE classification so a directory
|
|
269
266
|
// listing or update log never becomes a `knowledge` (or other) concept.
|
|
270
267
|
if (isReservedFileName(file.fileName))
|
|
@@ -294,12 +291,12 @@ function recognize(c, file) {
|
|
|
294
291
|
// `skills/skills/x`. `entry.name` below keeps the BARE canonical name —
|
|
295
292
|
// identity ≠ search text.
|
|
296
293
|
const dirPath = path.dirname(file.absPath);
|
|
297
|
-
//
|
|
298
|
-
//
|
|
294
|
+
// recognize carries the FULL index-time metadata surface,
|
|
295
|
+
// reproducing `buildEntryFromFile`'s flat-walk metadata
|
|
299
296
|
// output by SHARING its P1/P2/P4 assembly and substituting the synchronous
|
|
300
297
|
// `foldRecognizedMetadata` (+ `applyFoldedMetadata`, which replicates the
|
|
301
298
|
// in-place contributor precedence) for the async P3 renderer contributors.
|
|
302
|
-
// `entry.name` = the BARE canonical name (conceptId minus the
|
|
299
|
+
// `entry.name` = the BARE canonical name (conceptId minus the stash-subdir
|
|
303
300
|
// prefix) so the FTS `name` column
|
|
304
301
|
// matches the pre-0.9.0 indexer (search-behavior parity), NOT the frontmatter
|
|
305
302
|
// title. Parity is by construction — the two paths differ only in the P3 step,
|
|
@@ -347,14 +344,13 @@ function renderExecutionSource(c, file) {
|
|
|
347
344
|
defaults: (data) => executionDefaultsFromFrontmatter(data, {
|
|
348
345
|
kind: document.type === "command" ? "command" : "persona",
|
|
349
346
|
allowTopLevelEngine: true,
|
|
350
|
-
toolsKeys: ["tools"],
|
|
351
347
|
}),
|
|
352
348
|
});
|
|
353
349
|
}
|
|
354
350
|
/**
|
|
355
351
|
* A read-only {@link FileContext} backed by an OVERLAY string (a pending
|
|
356
352
|
* change's content) instead of the live filesystem — the `validate` contract
|
|
357
|
-
* ({@link BundleAdapter.validate} doc comment
|
|
353
|
+
* ({@link BundleAdapter.validate} doc comment) forbids
|
|
358
354
|
* reading the live FS. It mirrors `buildFileContext`'s eager path-field
|
|
359
355
|
* derivation exactly (so the matchers classify identically) and serves the
|
|
360
356
|
* overlay bytes from `content()`/`frontmatter()`. `stat()` throws: no matcher
|
|
@@ -395,7 +391,7 @@ function buildOverlayContext(root, relPathInput, raw) {
|
|
|
395
391
|
};
|
|
396
392
|
}
|
|
397
393
|
/**
|
|
398
|
-
* `validate`
|
|
394
|
+
* `validate` = shared base checks + the winning `type`'s per-type
|
|
399
395
|
* extra checks, reproducing today's `akmLint`/`getLinterForType` dispatch
|
|
400
396
|
* byte-for-byte (the FROZEN `lint/all-types.json` `perType` golden is the gate).
|
|
401
397
|
*
|
|
@@ -439,7 +435,6 @@ async function validate(c, changes, ctx) {
|
|
|
439
435
|
body: parsed.content,
|
|
440
436
|
ext: overlay.ext,
|
|
441
437
|
ctx,
|
|
442
|
-
workspaceRoot: c.root,
|
|
443
438
|
})));
|
|
444
439
|
diagnostics.push(...(await skillDirectoryDiagnostics(change.path, seenSkillDirs, ctx)));
|
|
445
440
|
}
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* Per-`type` validate checks for the `akm` adapter
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* adapter's `validate` = shared base checks (WI-A `shared.ts`) + these per-type
|
|
5
|
+
* Per-`type` validate checks for the `akm` adapter: a behavior-preserving
|
|
6
|
+
* port of `src/commands/lint/*`'s type linters. The `akm`
|
|
7
|
+
* adapter's `validate` = shared base checks (`shared.ts`) + these per-type
|
|
9
8
|
* extra checks, keyed on the winning `type`, reproducing today's
|
|
10
9
|
* `getLinterForType(subdir).lint(ctx)` dispatch. The FROZEN lint golden
|
|
11
10
|
* (`tests/fixtures/goldens/lint/all-types.json`, `perType`) is the conformance
|
|
@@ -30,7 +29,7 @@
|
|
|
30
29
|
* `ValidateContext` (the run snapshot + pending overlay) — the live linters'
|
|
31
30
|
* `fs.existsSync` sibling/SKILL.md probes become `ctx.readFile` lookups.
|
|
32
31
|
*
|
|
33
|
-
* ── env/secret dangerous-key narrowness (PRESERVED
|
|
32
|
+
* ── env/secret dangerous-key narrowness (PRESERVED) ──
|
|
34
33
|
*
|
|
35
34
|
* Today's scan (`collectEnvFiles`) only visits `.env`-SUFFIXED files under
|
|
36
35
|
* `env/` and `secrets/`, so `secrets/<bare-name>` is NOT scanned. This port
|
|
@@ -207,7 +206,7 @@ export async function skillDirectoryDiagnostics(relPath, seen, ctx, skillDirs =
|
|
|
207
206
|
* routes through `ctx`.
|
|
208
207
|
*/
|
|
209
208
|
export async function perTypeValidateChecks(args) {
|
|
210
|
-
const { type, relPath, raw, data, frontmatter, body, ext, ctx
|
|
209
|
+
const { type, relPath, raw, data, frontmatter, body, ext, ctx } = args;
|
|
211
210
|
switch (type) {
|
|
212
211
|
case "command":
|
|
213
212
|
return nameOrTypeDiagnostics(relPath, data, frontmatter, ["command"]);
|
|
@@ -216,7 +215,7 @@ export async function perTypeValidateChecks(args) {
|
|
|
216
215
|
case "fact":
|
|
217
216
|
return factDiagnostics(relPath, data);
|
|
218
217
|
case "task":
|
|
219
|
-
return taskDiagnostics(relPath, raw
|
|
218
|
+
return taskDiagnostics(relPath, raw);
|
|
220
219
|
case "workflow":
|
|
221
220
|
return ext === ".md" ? workflowDiagnostics(relPath, raw, body) : [];
|
|
222
221
|
case "memory":
|
|
@@ -255,9 +254,9 @@ export function factDiagnostics(relPath, data) {
|
|
|
255
254
|
return [];
|
|
256
255
|
}
|
|
257
256
|
/**
|
|
258
|
-
* Task validation has one semantic owner: the
|
|
259
|
-
*
|
|
260
|
-
*
|
|
257
|
+
* Task validation has one semantic owner: the task source parser, which reads
|
|
258
|
+
* task source v4 and refuses an older `version` with
|
|
259
|
+
* `TASK_SCHEMA_VERSION_UNSUPPORTED`.
|
|
261
260
|
* Keeping raw YAML at this boundary preserves duplicate-key, alias/tag,
|
|
262
261
|
* source-location, descriptor, resource-bound, and migration-hint behavior.
|
|
263
262
|
*
|
|
@@ -266,12 +265,11 @@ export function factDiagnostics(relPath, data) {
|
|
|
266
265
|
* contract; the cron suits the local scheduler backend), so `akm lint --type
|
|
267
266
|
* tasks` never reports clean a task that sync would refuse.
|
|
268
267
|
*/
|
|
269
|
-
export function taskDiagnostics(relPath, raw
|
|
268
|
+
export function taskDiagnostics(relPath, raw) {
|
|
270
269
|
try {
|
|
271
270
|
const parsed = parseTaskSource({
|
|
272
271
|
filePath: relPath,
|
|
273
272
|
yaml: raw,
|
|
274
|
-
...(workspaceRoot ? { workspaceRoot } : {}),
|
|
275
273
|
});
|
|
276
274
|
assertTaskScheduleInputsSatisfyContract(parsed.v4, relPath);
|
|
277
275
|
assertTaskScheduleCronValid(parsed.v4, backendNameForPlatform());
|
|
@@ -170,7 +170,7 @@ export function foldRecognizedMetadata(rendererName, file) {
|
|
|
170
170
|
case "task-yaml": {
|
|
171
171
|
out.tags = Array.from(new Set([...(out.tags ?? []), "task", "scheduled"]));
|
|
172
172
|
try {
|
|
173
|
-
const parsed = parseTaskSource({ yaml: file.content(), filePath: file.absPath
|
|
173
|
+
const parsed = parseTaskSource({ yaml: file.content(), filePath: file.absPath });
|
|
174
174
|
const v4 = parsed.v4;
|
|
175
175
|
const target = v4.target;
|
|
176
176
|
const hints = new Set();
|
|
@@ -261,7 +261,7 @@ export function foldRecognizedMetadata(rendererName, file) {
|
|
|
261
261
|
// ── workflow-document-metadata (historical renderer id `workflow-md`, peer sources) ──
|
|
262
262
|
case "workflow-md": {
|
|
263
263
|
try {
|
|
264
|
-
const result = compileWorkflowSource(file.content(), { path: file.relPath
|
|
264
|
+
const result = compileWorkflowSource(file.content(), { path: file.relPath });
|
|
265
265
|
if (!result.ok)
|
|
266
266
|
return out;
|
|
267
267
|
const plan = result.plan;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* The `akm-task` adapter for task `.yml` sources.
|
|
6
6
|
*
|
|
7
|
-
* A native akm task-YAML bundle
|
|
7
|
+
* A native akm task-YAML bundle. A `.yml` file derives
|
|
8
8
|
* `type: task`; conceptId strips the `.yml` extension. Tasks are AKM-native
|
|
9
9
|
* YAML, NOT OKF markdown concepts. Recognition does NOT gate on validity — an
|
|
10
10
|
* invalid task (e.g. `uses` plus `run`) is still RECOGNIZED; the `invalid-task-yaml`
|
|
@@ -14,16 +14,15 @@
|
|
|
14
14
|
* is not a task spelling (nothing indexes or schedules it), so it is reported
|
|
15
15
|
* as `invalid-task-yaml` rather than silently skipped (issue #760).
|
|
16
16
|
*
|
|
17
|
-
* ── validate
|
|
17
|
+
* ── validate ──
|
|
18
18
|
*
|
|
19
19
|
* Validation enters the canonical task source parser (`parseTaskSource`,
|
|
20
20
|
* which reads only task source v4 — a `version: 2` or `version: 3`
|
|
21
21
|
* document fails closed with `TASK_SCHEMA_VERSION_UNSUPPORTED`, naming
|
|
22
22
|
* `akm migrate apply`, which converts it). That parser owns the closed key sets,
|
|
23
23
|
* the executable-selector XOR, hostile YAML policy, the `akm/command`
|
|
24
|
-
* builtin, bounds
|
|
25
|
-
*
|
|
26
|
-
* diagnostic shape.
|
|
24
|
+
* builtin, and bounds. The adapter only translates a parser failure into
|
|
25
|
+
* the format-family diagnostic shape.
|
|
27
26
|
*
|
|
28
27
|
* Conformance oracle (authored, DO NOT modify): fixture
|
|
29
28
|
* `tests/fixtures/bundles/akm-task/` + goldens
|
|
@@ -38,7 +37,7 @@ import { toPosix } from "../../common.js";
|
|
|
38
37
|
import { hashContent } from "./shared.js";
|
|
39
38
|
/** A native task bundle is single-component; its one component is `main`. */
|
|
40
39
|
const COMPONENT_ID = "main";
|
|
41
|
-
/** The task YAML extension
|
|
40
|
+
/** The task YAML extension. */
|
|
42
41
|
const TASK_EXT = TASK_EXTENSION;
|
|
43
42
|
function recognize(c, file) {
|
|
44
43
|
if (file.ext !== TASK_EXT)
|
|
@@ -59,7 +58,7 @@ function recognize(c, file) {
|
|
|
59
58
|
content: raw,
|
|
60
59
|
};
|
|
61
60
|
}
|
|
62
|
-
async function validate(
|
|
61
|
+
async function validate(_c, changes, ctx) {
|
|
63
62
|
const diagnostics = [];
|
|
64
63
|
for (const change of changes) {
|
|
65
64
|
if (change.op === "delete")
|
|
@@ -84,7 +83,7 @@ async function validate(c, changes, ctx) {
|
|
|
84
83
|
continue;
|
|
85
84
|
}
|
|
86
85
|
try {
|
|
87
|
-
parseTaskSource({ yaml: raw, filePath: relPath
|
|
86
|
+
parseTaskSource({ yaml: raw, filePath: relPath });
|
|
88
87
|
}
|
|
89
88
|
catch (cause) {
|
|
90
89
|
diagnostics.push({
|
|
@@ -145,7 +144,7 @@ export const akmTaskAdapter = {
|
|
|
145
144
|
continue;
|
|
146
145
|
}
|
|
147
146
|
try {
|
|
148
|
-
parseTaskSource({ yaml: raw, filePath: entry.name
|
|
147
|
+
parseTaskSource({ yaml: raw, filePath: entry.name });
|
|
149
148
|
return true;
|
|
150
149
|
}
|
|
151
150
|
catch {
|