akm-cli 0.9.16 → 0.9.17-alpha.10
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 +2101 -0
- package/STABILITY.md +11 -10
- package/dist/akm +124 -193
- package/dist/akm-migrate +38 -19
- package/dist/assets/hints/cli-hints-full.md +6 -7
- package/dist/assets/improve-strategies/catchup.json +0 -3
- package/dist/assets/improve-strategies/consolidate.json +0 -1
- package/dist/assets/improve-strategies/default.json +1 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
- package/dist/assets/improve-strategies/quick.json +1 -2
- package/dist/assets/improve-strategies/reflect-distill.json +1 -2
- package/dist/assets/improve-strategies/thorough.json +0 -3
- package/dist/assets/prompts/consolidate-pair.md +20 -0
- package/dist/assets/prompts/consolidate-system.md +4 -11
- package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
- package/dist/assets/templates/html/health.html +3 -5
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +6 -2
- package/dist/cli/unknown-flags.js +24 -1
- package/dist/cli.js +68 -10
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +6 -0
- package/dist/commands/health/archive-usage.js +92 -0
- package/dist/commands/health/checks.js +83 -74
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/data-dir-usage.js +25 -13
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +1 -42
- package/dist/commands/health/improve-metrics.js +136 -591
- package/dist/commands/health/md-report.js +1 -6
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +14 -120
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -74
- package/dist/commands/health.js +145 -143
- package/dist/commands/improve/consolidate/chunking.js +26 -117
- package/dist/commands/improve/consolidate/continuity-check.js +137 -0
- package/dist/commands/improve/consolidate/pair-pass.js +791 -0
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +589 -1127
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1041
- package/dist/commands/improve/eligibility.js +126 -390
- package/dist/commands/improve/execution.js +8 -10
- package/dist/commands/improve/extract-prompt.js +1 -2
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +75 -169
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +52 -4
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +480 -1074
- package/dist/commands/improve/ledger.js +119 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +415 -1073
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +16 -118
- package/dist/commands/improve/memory/memory-improve.js +266 -14
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -15
- package/dist/commands/improve/preparation.js +779 -2319
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +642 -1353
- package/dist/commands/improve/retrieval-gate.js +127 -0
- package/dist/commands/improve/retrieval-scope.js +92 -0
- package/dist/commands/improve/salience.js +41 -240
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +322 -0
- package/dist/commands/lint/base-linter.js +37 -15
- package/dist/commands/proposal/drain.js +261 -578
- package/dist/commands/proposal/proposal-cli.js +19 -20
- package/dist/commands/proposal/proposal-types.js +31 -24
- package/dist/commands/proposal/proposal.js +38 -8
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +1097 -1394
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +22 -89
- package/dist/commands/read/curate.js +105 -462
- package/dist/commands/read/knowledge.js +3 -2
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +57 -108
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +4 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +127 -29
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/source-manage.js +9 -2
- package/dist/commands/sources/stash-cli.js +24 -4
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +12 -13
- package/dist/commands/tasks/tasks.js +350 -936
- package/dist/commands/tasks/validate.js +26 -24
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +2 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +42 -12
- package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/asset-placement.js +4 -13
- package/dist/core/asset/frontmatter.js +106 -1
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +285 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +9 -34
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +184 -111
- package/dist/core/config/engine-semantics.js +0 -2
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +54 -125
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/index-config.js +9 -48
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-change.js +13 -5
- package/dist/core/file-lock.js +76 -173
- package/dist/core/improve-result.js +35 -7
- package/dist/core/improve-types.js +0 -1
- package/dist/core/logs-db.js +2 -2
- package/dist/core/loopback.js +7 -12
- package/dist/core/non-task-input.js +20 -0
- package/dist/core/parse.js +13 -16
- package/dist/core/paths.js +0 -24
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +123 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/time.js +0 -20
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +294 -1005
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/ensure-index.js +77 -73
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +141 -154
- package/dist/indexer/indexer.js +400 -1124
- package/dist/indexer/links/declared-links.js +90 -0
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +96 -90
- package/dist/indexer/passes/metadata.js +132 -219
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +2 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +190 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +36 -7
- package/dist/indexer/walk/walker.js +3 -4
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/client.js +18 -6
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +11 -17
- package/dist/llm/feature-gate.js +0 -8
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +25 -38
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +69 -31
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +48 -3
- package/dist/output/text/show-format.js +13 -17
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +42948 -92369
- package/dist/scripts/akm-migrate.js +42935 -92354
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/connection.js +5 -6
- package/dist/setup/steps/platforms.js +2 -2
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +83 -21
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +209 -0
- package/dist/storage/repositories/index-connection.js +39 -72
- package/dist/storage/repositories/index-entries-repository.js +131 -129
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +101 -268
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-links-repository.js +143 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +257 -325
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +104 -1
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/salience-repository.js +1 -19
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +130 -0
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +191 -302
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +141 -748
- package/dist/tasks/backends/schtasks.js +119 -623
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/run/load-task.js +1 -1
- package/dist/tasks/scheduler-binding.js +20 -238
- package/dist/tasks/scheduler-invocation.js +136 -244
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +368 -679
- package/dist/tasks/source/parse-task-source.js +55 -9
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +464 -88
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +43 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
- package/docs/reference/cli.md +232 -135
- package/docs/reference/configuration.md +71 -57
- package/docs/reference/data-and-telemetry.md +20 -21
- package/docs/reference/tasks.md +105 -39
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +115 -738
- package/schemas/akm-workflow.json +1 -0
- package/dist/assets/improve-strategies/graph-refresh.json +0 -15
- package/dist/assets/prompts/contradiction-judge.md +0 -33
- package/dist/assets/prompts/graph-extract-system.md +0 -1
- package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
- package/dist/assets/prompts/metadata-enhance-system.md +0 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -149
- package/dist/commands/improve/distill/promote-memory.js +0 -291
- package/dist/commands/improve/distill/quality-gate.js +0 -337
- package/dist/commands/improve/eval-cases.js +0 -52
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -31
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/db/graph-db.js +0 -444
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/graph/graph-extraction.js +0 -1108
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/search/ranking-types.js +0 -4
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/llm/graph-extract.js +0 -728
- package/dist/llm/metadata-enhance.js +0 -96
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/tasks/source/task-to-v3.js +0 -507
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -77
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
* a bundle/adapter/concept id at all — it reads exactly the path it was
|
|
10
10
|
* given and classifies it.
|
|
11
11
|
*
|
|
12
|
-
* Reuses the exact
|
|
13
|
-
* (`src/tasks/source/parse-task-source.ts`)
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
12
|
+
* Reuses the exact version router `parseTaskSource`
|
|
13
|
+
* (`src/tasks/source/parse-task-source.ts`) every other task-source reader
|
|
14
|
+
* uses (`akm task sync`'s `compileTaskSources` included) — this module never
|
|
15
|
+
* forks a second parser. `readBoundedTaskSourceYaml` /
|
|
16
|
+
* `peekTaskSourceVersion` / `own` are the SAME front-end helpers the router
|
|
17
|
+
* calls first; they are used here only to recover the file's DECLARED schema
|
|
18
|
+
* version for the report and to tell `blocked` from `invalid`.
|
|
17
19
|
*
|
|
18
20
|
* Beyond parsing, this module also runs the SAME two per-source gates
|
|
19
21
|
* `akm task sync`'s `compileTaskSources` runs before it ever installs a
|
|
@@ -41,16 +43,18 @@
|
|
|
41
43
|
*
|
|
42
44
|
* Outcome classification (mirrors `parse-task-source.ts`'s own routing
|
|
43
45
|
* table in its header, extended for the two gates above):
|
|
44
|
-
* - `valid` — parses as task source v4
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
46
|
+
* - `valid` — parses as task source v4 and passes both sync gates.
|
|
47
|
+
* - `blocked` — declared `version: 2` or `3`, or a `version: 4`
|
|
48
|
+
* document still carrying the retired
|
|
49
|
+
* `schedule[].enabled`: what `akm migrate apply`
|
|
50
|
+
* rewrites. The runtime reads only v4 (#987), so the
|
|
51
|
+
* reason names that command.
|
|
48
52
|
* - `invalid` — the document declares SOME version (`4`, or anything
|
|
49
53
|
* other than 2/3/4) but fails to parse/validate, OR it
|
|
50
54
|
* parsed but fails one of the two sync gates above, OR
|
|
51
|
-
* the YAML itself does not parse at all
|
|
52
|
-
*
|
|
53
|
-
*
|
|
55
|
+
* the YAML itself does not parse at all (a genuine
|
|
56
|
+
* syntax error, not merely a non-task shape) — reported
|
|
57
|
+
* with the parser's own reason.
|
|
54
58
|
* - `not-a-task` — the document parses as YAML but never declares a
|
|
55
59
|
* `version:` field at all (or isn't a YAML mapping) —
|
|
56
60
|
* the strongest signal available that the file was
|
|
@@ -62,7 +66,7 @@ import { UsageError } from "../../core/errors.js";
|
|
|
62
66
|
import { backendNameForPlatform } from "../../tasks/backends/index.js";
|
|
63
67
|
import { assertTaskScheduleCronValid, assertTaskScheduleInputsSatisfyContract } from "../../tasks/scheduler-sync.js";
|
|
64
68
|
import { own, readBoundedTaskSourceYaml } from "../../tasks/source/bounded-document.js";
|
|
65
|
-
import { parseTaskSource, peekTaskSourceVersion } from "../../tasks/source/parse-task-source.js";
|
|
69
|
+
import { parseTaskSource, peekTaskSourceVersion, v4ScheduleHasRetiredEnabledKey, } from "../../tasks/source/parse-task-source.js";
|
|
66
70
|
/** True when `root` is a YAML mapping that itself declares a `version:` key, regardless of that key's type/value. */
|
|
67
71
|
function declaresVersionKey(root) {
|
|
68
72
|
return root !== null && typeof root === "object" && !Array.isArray(root) && own(root, "version");
|
|
@@ -126,14 +130,12 @@ export async function akmTaskValidate(filePath) {
|
|
|
126
130
|
if (!(cause instanceof UsageError))
|
|
127
131
|
throw cause;
|
|
128
132
|
const reason = cause.message;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
reason: `${reason} Run \`akm migrate apply --dry-run\`, review the plan, then run \`akm migrate apply\`.`,
|
|
136
|
-
};
|
|
133
|
+
// What `akm migrate apply` rewrites is the only refusal for these
|
|
134
|
+
// shapes (`parse-task-source.ts`), so no message-text sniffing is needed.
|
|
135
|
+
if (declaredVersion === 2 ||
|
|
136
|
+
declaredVersion === 3 ||
|
|
137
|
+
(declaredVersion === 4 && v4ScheduleHasRetiredEnabledKey(root))) {
|
|
138
|
+
return { ok: false, path: resolvedPath, sourceVersion: declaredVersion, outcome: "blocked", reason };
|
|
137
139
|
}
|
|
138
140
|
if (peekFailed) {
|
|
139
141
|
return { ok: false, path: resolvedPath, outcome: "invalid", reason };
|
|
@@ -150,10 +152,10 @@ export async function akmTaskValidate(filePath) {
|
|
|
150
152
|
};
|
|
151
153
|
}
|
|
152
154
|
// Success is unreachable from any path that leaves `declaredVersion`
|
|
153
|
-
// undefined — the router requires a numeric
|
|
155
|
+
// undefined — the router requires a numeric version 4 to reach here.
|
|
154
156
|
const sourceVersion = declaredVersion ?? 4;
|
|
155
|
-
// The
|
|
156
|
-
//
|
|
157
|
+
// The document itself parsed — now the two gates `compileTaskSources`
|
|
158
|
+
// runs before accepting it. A violation here is `invalid`.
|
|
157
159
|
try {
|
|
158
160
|
assertTaskScheduleInputsSatisfyContract(parsed.v4, resolvedPath);
|
|
159
161
|
assertTaskScheduleCronValid(parsed.v4, backend);
|
|
@@ -2,13 +2,11 @@
|
|
|
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 plan <ref>` — compile + freeze WITHOUT publishing
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* never `publishWorkflowRunV4`, `startWorkflowRun`, `warn()`, `appendEvent`,
|
|
11
|
-
* or `akmIndex`.
|
|
5
|
+
* `akm workflow plan <ref>` — compile + freeze WITHOUT publishing. Zero
|
|
6
|
+
* durable writes, zero usage/event rows: this module calls exactly the same
|
|
7
|
+
* two functions `startWorkflowRun` does to reach a frozen plan
|
|
8
|
+
* (`loadWorkflowAsset`, `freezeWorkflow`) and NOTHING else — never
|
|
9
|
+
* `publishWorkflowRunV4`, `startWorkflowRun`, `appendEvent`, or `akmIndex`.
|
|
12
10
|
*
|
|
13
11
|
* SECRET-FREE, by construction (§4.6's closed print list): a resolved
|
|
14
12
|
* reference VALUE is never printed (references resolve at pre-attempt, not
|
|
@@ -20,9 +18,8 @@
|
|
|
20
18
|
*/
|
|
21
19
|
import path from "node:path";
|
|
22
20
|
import { loadConfig } from "../../core/config/config.js";
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import { compileResolveFreezeWorkflowV4 } from "../../workflows/ir/freeze-v4.js";
|
|
21
|
+
import { buildExecutionFromWire } from "../../integrations/agent/execution.js";
|
|
22
|
+
import { freezeWorkflow } from "../../workflows/freeze/freeze.js";
|
|
26
23
|
import { computePlanHash } from "../../workflows/ir/plan-hash.js";
|
|
27
24
|
import { loadWorkflowAsset } from "../../workflows/runtime/workflow-asset-loader.js";
|
|
28
25
|
/** The step's dispatch unit — the map template for a fan-out, else the root unit. Undefined for a route step. */
|
|
@@ -49,7 +46,7 @@ function childExportedOutputNames(frozenPlan) {
|
|
|
49
46
|
}
|
|
50
47
|
/**
|
|
51
48
|
* A `child-workflow` target's `expansion`. Recurses into the embedded
|
|
52
|
-
* plan's own steps in the identical shape
|
|
49
|
+
* plan's own steps in the identical shape — `usesById` is
|
|
53
50
|
* omitted for the recursive call because a nested child's own authored
|
|
54
51
|
* source is not available here (only its already-frozen plan is), so a
|
|
55
52
|
* task-wrapped step nested inside a child conservatively reports `via:
|
|
@@ -67,15 +64,15 @@ function childExpansion(target) {
|
|
|
67
64
|
};
|
|
68
65
|
}
|
|
69
66
|
/** The task/child expansion boundary for one step (§4.6). */
|
|
70
|
-
function stepExpansion(step, frozenTarget,
|
|
67
|
+
function stepExpansion(step, frozenTarget, usesById) {
|
|
71
68
|
if (frozenTarget?.kind === "child-workflow")
|
|
72
69
|
return childExpansion(frozenTarget);
|
|
73
|
-
const uses =
|
|
70
|
+
const uses = usesById?.get(step.stepId);
|
|
74
71
|
if (uses?.startsWith("tasks/"))
|
|
75
72
|
return { via: "task", taskRef: uses };
|
|
76
73
|
return { via: "direct" };
|
|
77
74
|
}
|
|
78
|
-
function projectStep(step, sequenceIndex,
|
|
75
|
+
function projectStep(step, sequenceIndex, usesById) {
|
|
79
76
|
const unit = stepUnit(step);
|
|
80
77
|
const frozenTarget = unit?.frozenTarget;
|
|
81
78
|
const kind = step.route ? "route" : step.root?.kind === "map" ? "map" : "unit";
|
|
@@ -95,7 +92,7 @@ function projectStep(step, sequenceIndex, sourceStepsById) {
|
|
|
95
92
|
judgeEngine: step.gate.frozenJudge ? step.gate.frozenJudge.request.engine.name : null,
|
|
96
93
|
},
|
|
97
94
|
...(step.outputSchema !== undefined ? { outputSchema: step.outputSchema } : {}),
|
|
98
|
-
expansion: stepExpansion(step, frozenTarget,
|
|
95
|
+
expansion: stepExpansion(step, frozenTarget, usesById),
|
|
99
96
|
};
|
|
100
97
|
}
|
|
101
98
|
/**
|
|
@@ -103,30 +100,27 @@ function projectStep(step, sequenceIndex, sourceStepsById) {
|
|
|
103
100
|
* from its own already-frozen `request` (the identical computation
|
|
104
101
|
* `freeze/targets/command.ts`'s `commandResult` already performs at freeze
|
|
105
102
|
* time and discards) — walked over the whole plan, including gate judges and
|
|
106
|
-
* recursively into every embedded child plan. Read-only: `
|
|
107
|
-
*
|
|
103
|
+
* recursively into every embedded child plan. Read-only: `buildExecutionFromWire`
|
|
104
|
+
* reads no config and dispatches nothing.
|
|
108
105
|
*/
|
|
109
106
|
function collectLoweringNotices(plan, config) {
|
|
110
107
|
const notices = [];
|
|
111
|
-
const lower = (
|
|
112
|
-
notices.push(...
|
|
108
|
+
const lower = (target) => {
|
|
109
|
+
notices.push(...buildExecutionFromWire(target).notices);
|
|
113
110
|
};
|
|
114
111
|
for (const step of plan.steps) {
|
|
115
112
|
const unit = stepUnit(step);
|
|
116
113
|
if (unit) {
|
|
117
114
|
if (unit.frozenTarget.kind === "command")
|
|
118
|
-
lower(unit.frozenTarget
|
|
115
|
+
lower(unit.frozenTarget);
|
|
119
116
|
else if (unit.frozenTarget.kind === "child-workflow")
|
|
120
117
|
notices.push(...collectLoweringNotices(unit.frozenTarget.frozenPlan, config));
|
|
121
118
|
}
|
|
122
119
|
if (step.gate.frozenJudge)
|
|
123
|
-
lower(step.gate.frozenJudge
|
|
120
|
+
lower(step.gate.frozenJudge);
|
|
124
121
|
}
|
|
125
122
|
return notices;
|
|
126
123
|
}
|
|
127
|
-
function relativeSourceReadSet(plan) {
|
|
128
|
-
return plan.sourceReadSet.map((snapshot) => snapshot.identity.file);
|
|
129
|
-
}
|
|
130
124
|
/**
|
|
131
125
|
* Compile + freeze `ref` and project the frozen plan into the read-only
|
|
132
126
|
* `akm workflow plan` envelope. Never publishes, never writes, never warns.
|
|
@@ -134,9 +128,9 @@ function relativeSourceReadSet(plan) {
|
|
|
134
128
|
export async function akmWorkflowPlan(ref) {
|
|
135
129
|
const asset = await loadWorkflowAsset(ref);
|
|
136
130
|
const config = loadConfig();
|
|
137
|
-
const frozen = await
|
|
131
|
+
const frozen = await freezeWorkflow(asset, config);
|
|
138
132
|
const plan = frozen.plan;
|
|
139
|
-
const
|
|
133
|
+
const usesById = new Map(asset.plan.steps.map((step) => [step.stepId, step.spec?.uses]));
|
|
140
134
|
const sourceFormat = path.extname(asset.path).toLowerCase() === ".md" ? "markdown" : "github-yaml";
|
|
141
135
|
return {
|
|
142
136
|
ok: true,
|
|
@@ -151,9 +145,8 @@ export async function akmWorkflowPlan(ref) {
|
|
|
151
145
|
...(plan.budget ? { budget: plan.budget } : {}),
|
|
152
146
|
...(plan.params ? { params: plan.params } : {}),
|
|
153
147
|
...(plan.outputs ? { outputs: plan.outputs } : {}),
|
|
154
|
-
steps: plan.steps.map((step, index) => projectStep(step, index,
|
|
155
|
-
sourceReadSet: relativeSourceReadSet(plan),
|
|
148
|
+
steps: plan.steps.map((step, index) => projectStep(step, index, usesById)),
|
|
156
149
|
notices: collectLoweringNotices(plan, config),
|
|
157
|
-
warnings:
|
|
150
|
+
warnings: frozen.warnings.map((warning) => warning.message),
|
|
158
151
|
};
|
|
159
152
|
}
|
|
@@ -15,7 +15,7 @@ import { NotFoundError, TransientError, UsageError } from "../core/errors.js";
|
|
|
15
15
|
import { warn } from "../core/warn.js";
|
|
16
16
|
import { akmIndex } from "../indexer/indexer.js";
|
|
17
17
|
import { assertWorkflowMarkdownName, createWorkflowAsset, getWorkflowTemplate } from "../workflows/authoring/authoring.js";
|
|
18
|
-
import { WORKFLOW_MAX_TIMEOUT_MS } from "../workflows/
|
|
18
|
+
import { WORKFLOW_MAX_TIMEOUT_MS } from "../workflows/resource-limits.js";
|
|
19
19
|
import { abandonWorkflowRun, getWorkflowStatus, listWorkflowRuns, resolveWorkflowRunTarget, resumeWorkflowRun, } from "../workflows/runtime/runs.js";
|
|
20
20
|
import { akmWorkflowPlan } from "./workflow/plan.js";
|
|
21
21
|
const workflowStatusCommand = defineJsonCommand({
|
|
@@ -174,8 +174,8 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
174
174
|
* `--skip-if-locked` (#948) eligibility: only these two named, retryable
|
|
175
175
|
* `TransientError` codes (#948 addendum — moved off UsageError, exit 75) turn
|
|
176
176
|
* a `workflow run` failure into a graceful skip — `RUN_LEASE_HELD` (another
|
|
177
|
-
*
|
|
178
|
-
*
|
|
177
|
+
* live akm process holds THIS run's lock file, `exec/run-workflow.ts`) and
|
|
178
|
+
* `STATE_DB_CONTENDED` (an unrelated akm process is
|
|
179
179
|
* writing state.db right now, `core/state-db.ts`'s BEGIN IMMEDIATE retry
|
|
180
180
|
* exhaustion). Every other error — a bad flag, an unresolvable target —
|
|
181
181
|
* still fails loudly.
|
|
@@ -202,7 +202,7 @@ const workflowRunCommand = defineJsonCommand({
|
|
|
202
202
|
},
|
|
203
203
|
"skip-if-locked": {
|
|
204
204
|
type: "boolean",
|
|
205
|
-
description: "If another akm process already
|
|
205
|
+
description: "If another akm process is already driving this run, or state.db is busy with another " +
|
|
206
206
|
"writer, skip gracefully (exit 0) instead of failing (exit 75). Use for high-frequency scheduled runs " +
|
|
207
207
|
"so they don't pile up failures while a longer-running invocation is in progress.",
|
|
208
208
|
default: false,
|
|
@@ -192,8 +192,9 @@ const DOCUMENT_JSON_CARRIED_FIELDS = [
|
|
|
192
192
|
"cwd",
|
|
193
193
|
"wikiRole",
|
|
194
194
|
"sources",
|
|
195
|
-
"generation",
|
|
196
195
|
"evidenceSources",
|
|
196
|
+
// #935: a workflow's step targets and a task's target, read as declared links.
|
|
197
|
+
"uses",
|
|
197
198
|
// D2 (#730): the OKF v0.2 provenance `promoteProposal` stamps onto AKM-native
|
|
198
199
|
// writes (generated/verified/sources, namespaced — see `types.ts`'s
|
|
199
200
|
// `OkfProvenance` doc). Carried so the akm adapter rereads what it wrote and
|
|
@@ -54,8 +54,7 @@ import path from "node:path";
|
|
|
54
54
|
import { isDangerousEnvKey } from "../../../commands/lint/env-key-rules.js";
|
|
55
55
|
import { parseTaskSource } from "../../../tasks/source/parse-task-source.js";
|
|
56
56
|
import { taskSourceErrorDetail } from "../../../tasks/source-v3.js";
|
|
57
|
-
import {
|
|
58
|
-
import { compileWorkflowSource } from "../../../workflows/source-ir/compile.js";
|
|
57
|
+
import { checkWorkflowPlan, compileWorkflowSource } from "../../../workflows/compile.js";
|
|
59
58
|
import { conceptIdForStashFile } from "../../asset/resolve-ref.js";
|
|
60
59
|
import { isAkmRegistryCachePath, scanEnvKeyNames } from "../../common.js";
|
|
61
60
|
/** Recommended `category` values for facts — `commands/lint/fact-linter.ts:9`. */
|
|
@@ -370,7 +369,7 @@ export function workflowFrontendDiagnostics(relPath, raw, parsePath) {
|
|
|
370
369
|
}
|
|
371
370
|
return { errors, warnings };
|
|
372
371
|
}
|
|
373
|
-
const compiled =
|
|
372
|
+
const compiled = checkWorkflowPlan(result.plan);
|
|
374
373
|
if (!compiled.ok) {
|
|
375
374
|
for (const err of compiled.errors) {
|
|
376
375
|
errors.push({
|
|
@@ -54,10 +54,10 @@
|
|
|
54
54
|
* concern (Chunk 4/5), not recognition's. On the valid Chunk-0b fixture this
|
|
55
55
|
* distinction never triggers.
|
|
56
56
|
*/
|
|
57
|
+
import { parseBuiltinCommandAction } from "../../../commands/command/builtin-action.js";
|
|
57
58
|
import { scanEnvKeyNames } from "../../../commands/env/env.js";
|
|
58
59
|
import { parseTaskSource } from "../../../tasks/source/parse-task-source.js";
|
|
59
|
-
import { compileWorkflowSource } from "../../../workflows/
|
|
60
|
-
import { sourceStepInstructions } from "../../../workflows/source-ir/program.js";
|
|
60
|
+
import { compileWorkflowSource, workflowStepInstructions } from "../../../workflows/compile.js";
|
|
61
61
|
import { parseFrontmatter } from "../../asset/frontmatter.js";
|
|
62
62
|
import { parseMarkdownToc } from "../../asset/markdown.js";
|
|
63
63
|
import { nonEmptyString } from "./shared.js";
|
|
@@ -126,6 +126,25 @@ function applyFrontmatterDescriptionAndTags(fm, out) {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
|
+
/** The command a stored `akm/command` action runs; inline content names no asset. */
|
|
130
|
+
function storedCommandRef(action) {
|
|
131
|
+
return action?.kind === "stored" ? action.ref : undefined;
|
|
132
|
+
}
|
|
133
|
+
/** The asset a workflow step targets: its `uses:` ref, or the ref of a stored `akm/command`. Prose and `run:` steps target none. */
|
|
134
|
+
function workflowStepTarget(spec) {
|
|
135
|
+
if (!spec?.uses)
|
|
136
|
+
return undefined;
|
|
137
|
+
if (spec.uses !== "akm/command")
|
|
138
|
+
return spec.uses;
|
|
139
|
+
if (spec.commandMode !== "stored-ref")
|
|
140
|
+
return undefined;
|
|
141
|
+
try {
|
|
142
|
+
return storedCommandRef(parseBuiltinCommandAction(spec.with));
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
129
148
|
/** Collect + finalize a searchHints set the way every contributor does (`Array.from(hints).filter(Boolean)`, assigned only when non-empty). */
|
|
130
149
|
function finalizeHints(out, hints) {
|
|
131
150
|
if (hints.size > 0)
|
|
@@ -246,6 +265,9 @@ export function foldRecognizedMetadata(rendererName, file) {
|
|
|
246
265
|
hints.add(`prompt:${target.command.ref}`);
|
|
247
266
|
else
|
|
248
267
|
hints.add(`uses:${target.uses.ref}`);
|
|
268
|
+
const used = target.uses.kind !== "builtin-command" ? target.uses.ref : storedCommandRef(target.command);
|
|
269
|
+
if (used)
|
|
270
|
+
out.uses = [used];
|
|
249
271
|
}
|
|
250
272
|
else {
|
|
251
273
|
hints.add(`run:${target.run}`);
|
|
@@ -320,19 +342,25 @@ export function foldRecognizedMetadata(rendererName, file) {
|
|
|
320
342
|
const result = compileWorkflowSource(file.content(), { path: file.relPath, workspaceRoot: file.stashRoot });
|
|
321
343
|
if (!result.ok)
|
|
322
344
|
return out;
|
|
323
|
-
const
|
|
345
|
+
const plan = result.plan;
|
|
324
346
|
const hints = new Set();
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
hints.add(
|
|
330
|
-
|
|
331
|
-
|
|
347
|
+
const uses = new Set();
|
|
348
|
+
if (plan.preamble)
|
|
349
|
+
hints.add(plan.preamble);
|
|
350
|
+
for (const step of plan.steps) {
|
|
351
|
+
hints.add(step.stepId);
|
|
352
|
+
hints.add(workflowStepInstructions(step));
|
|
353
|
+
if (step.gate.criteria[0])
|
|
354
|
+
hints.add(step.gate.criteria[0]);
|
|
355
|
+
const used = workflowStepTarget(step.spec);
|
|
356
|
+
if (used)
|
|
357
|
+
uses.add(used);
|
|
332
358
|
}
|
|
333
359
|
out.searchHints = Array.from(hints).filter(Boolean);
|
|
334
|
-
if (
|
|
335
|
-
|
|
360
|
+
if (uses.size > 0)
|
|
361
|
+
out.uses = [...uses];
|
|
362
|
+
if (plan.paramSchemas) {
|
|
363
|
+
const parameters = Object.entries(plan.paramSchemas).map(([name, schema]) => {
|
|
336
364
|
const description = schema.description;
|
|
337
365
|
return { name, ...(typeof description === "string" && description ? { description } : {}) };
|
|
338
366
|
});
|
|
@@ -396,4 +424,6 @@ export function applyFoldedMetadata(entry, folded) {
|
|
|
396
424
|
entry.toc = folded.toc;
|
|
397
425
|
if (folded.parameters)
|
|
398
426
|
entry.parameters = folded.parameters;
|
|
427
|
+
if (folded.uses)
|
|
428
|
+
entry.uses = folded.uses;
|
|
399
429
|
}
|
|
@@ -17,11 +17,9 @@
|
|
|
17
17
|
* ── validate (spec §6 task validation column) ──
|
|
18
18
|
*
|
|
19
19
|
* Validation enters the canonical task source parser (`parseTaskSource`,
|
|
20
|
-
* task source v4
|
|
21
|
-
*
|
|
22
|
-
* `
|
|
23
|
-
* cannot convert, or any other unsupported number, fails closed with
|
|
24
|
-
* `TASK_SCHEMA_VERSION_UNSUPPORTED`). That parser owns the closed key sets,
|
|
20
|
+
* which reads only task source v4 — a `version: 2` or `version: 3`
|
|
21
|
+
* document fails closed with `TASK_SCHEMA_VERSION_UNSUPPORTED`, naming
|
|
22
|
+
* `akm migrate apply`, which converts it). That parser owns the closed key sets,
|
|
25
23
|
* the executable-selector XOR, hostile YAML policy, the `akm/command`
|
|
26
24
|
* builtin, bounds, and physical `working-directory` containment. The
|
|
27
25
|
* adapter only translates a parser failure into the format-family
|
|
@@ -33,7 +31,8 @@
|
|
|
33
31
|
*/
|
|
34
32
|
import fs from "node:fs";
|
|
35
33
|
import path from "node:path";
|
|
36
|
-
import {
|
|
34
|
+
import { readBoundedTaskSourceYaml } from "../../../tasks/source/bounded-document.js";
|
|
35
|
+
import { parseTaskSource, peekTaskSourceVersion } from "../../../tasks/source/parse-task-source.js";
|
|
37
36
|
import { TASK_EXTENSION, TASK_NEAR_MISS_EXTENSION, taskExtensionDetail, taskSourceErrorDetail, } from "../../../tasks/source-v3.js";
|
|
38
37
|
import { toPosix } from "../../common.js";
|
|
39
38
|
import { hashContent } from "./shared.js";
|
|
@@ -125,8 +124,11 @@ export const akmTaskAdapter = {
|
|
|
125
124
|
return ["."];
|
|
126
125
|
},
|
|
127
126
|
/**
|
|
128
|
-
* Install-time probe (§1.2): a root holding a top-level, valid task
|
|
129
|
-
* `.yml` file
|
|
127
|
+
* Install-time probe (§1.2): a root holding a top-level, valid task source
|
|
128
|
+
* v4 `.yml` file, or a task v2/v3 file that `akm migrate apply` has yet to
|
|
129
|
+
* convert (the runtime refuses those, so without this the migrator and
|
|
130
|
+
* `akm task sync` would not find them in a bundle whose adapter config does
|
|
131
|
+
* not record). The full parser keeps this disjoint from unrelated YAML and
|
|
130
132
|
* prevents probe semantics from drifting from validation semantics.
|
|
131
133
|
*/
|
|
132
134
|
looksLikeRoot(root) {
|
|
@@ -152,9 +154,28 @@ export const akmTaskAdapter = {
|
|
|
152
154
|
return true;
|
|
153
155
|
}
|
|
154
156
|
catch {
|
|
157
|
+
if (isLegacyTaskDocument(raw, entry.name))
|
|
158
|
+
return true;
|
|
155
159
|
// Continue probing the remaining top-level .yml files.
|
|
156
160
|
}
|
|
157
161
|
}
|
|
158
162
|
return false;
|
|
159
163
|
},
|
|
160
164
|
};
|
|
165
|
+
/** The executable keys each retired task schema version required one of. */
|
|
166
|
+
const LEGACY_TASK_TARGET_KEYS = {
|
|
167
|
+
2: ["workflow", "prompt", "command"],
|
|
168
|
+
3: ["uses", "run"],
|
|
169
|
+
};
|
|
170
|
+
/** A task v2/v3 document: its schema version, plus a target key that version used. */
|
|
171
|
+
function isLegacyTaskDocument(yaml, filePath) {
|
|
172
|
+
let root;
|
|
173
|
+
try {
|
|
174
|
+
root = readBoundedTaskSourceYaml({ yaml, filePath }, { sourceLabel: "task source" }).root;
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const keys = LEGACY_TASK_TARGET_KEYS[peekTaskSourceVersion(root) ?? 0];
|
|
180
|
+
return keys !== undefined && keys.some((key) => Object.hasOwn(root, key));
|
|
181
|
+
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import fs from "node:fs";
|
|
23
23
|
import path from "node:path";
|
|
24
|
-
import { looksLikeGithubWorkflowSource } from "../../../workflows/
|
|
24
|
+
import { looksLikeGithubWorkflowSource } from "../../../workflows/compile.js";
|
|
25
25
|
import { parseFrontmatter } from "../../asset/frontmatter.js";
|
|
26
26
|
import { toPosix } from "../../common.js";
|
|
27
27
|
import { perTypeValidateChecks, workflowYamlSourceDiagnostics } from "./akm-lint.js";
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
5
|
import { isMap, isScalar, parseDocument, visit } from "yaml";
|
|
6
6
|
import { cloneExecutionJson, cloneExecutionJsonObject, } from "../../execution/json.js";
|
|
7
|
-
import {
|
|
7
|
+
import { snapshotStrictRecord } from "../../execution/record.js";
|
|
8
8
|
import { cloneToolSelection, createAdapterRenderedExecutionSource, } from "../../execution/source.js";
|
|
9
9
|
import { UsageError } from "../errors.js";
|
|
10
10
|
import { warnOnce } from "../warn.js";
|
|
@@ -137,20 +137,16 @@ function nullableTimeout(value, path) {
|
|
|
137
137
|
/** Adapter helper for the common frontmatter fields fixed by the 0.9.2 design. */
|
|
138
138
|
export function executionDefaultsFromFrontmatter(data, options) {
|
|
139
139
|
const frontmatter = snapshotStrictRecord(data, "frontmatter");
|
|
140
|
-
const
|
|
141
|
-
assertSnapshotKeys(optionRecord, ["kind", "allowTopLevelEngine", "toolsKeys"], "execution frontmatter projection options");
|
|
142
|
-
const kind = optionRecord.kind;
|
|
140
|
+
const kind = options.kind;
|
|
143
141
|
if (kind !== "command" && kind !== "persona") {
|
|
144
142
|
throw new TypeError("execution frontmatter projection options.kind is invalid");
|
|
145
143
|
}
|
|
146
|
-
const allowTopLevelEngine = Object.hasOwn(
|
|
147
|
-
? optionRecord.allowTopLevelEngine
|
|
148
|
-
: false;
|
|
144
|
+
const allowTopLevelEngine = Object.hasOwn(options, "allowTopLevelEngine") ? options.allowTopLevelEngine : false;
|
|
149
145
|
if (typeof allowTopLevelEngine !== "boolean") {
|
|
150
146
|
throw new TypeError("execution frontmatter projection options.allowTopLevelEngine must be a boolean");
|
|
151
147
|
}
|
|
152
|
-
const configuredToolsKeys = Object.hasOwn(
|
|
153
|
-
? cloneExecutionJson(
|
|
148
|
+
const configuredToolsKeys = Object.hasOwn(options, "toolsKeys")
|
|
149
|
+
? cloneExecutionJson(options.toolsKeys, "execution frontmatter projection options.toolsKeys")
|
|
154
150
|
: ["tools"];
|
|
155
151
|
if (!Array.isArray(configuredToolsKeys) || configuredToolsKeys.some((key) => typeof key !== "string" || !key)) {
|
|
156
152
|
throw new TypeError("execution frontmatter projection options.toolsKeys must be an array of non-empty strings");
|
|
@@ -272,43 +268,35 @@ export function executionDefaultsFromFrontmatter(data, options) {
|
|
|
272
268
|
}
|
|
273
269
|
return out;
|
|
274
270
|
}
|
|
275
|
-
function snapshotRendererInput(input) {
|
|
276
|
-
const inputSnapshot = snapshotStrictRecord(input, "adapter execution source");
|
|
277
|
-
assertSnapshotKeys(inputSnapshot, ["kind", "raw", "identity", "defaults", "extensions"], "adapter execution source");
|
|
278
|
-
const identity = snapshotStrictRecord(inputSnapshot.identity, "adapter execution source identity");
|
|
279
|
-
assertSnapshotKeys(identity, ["ref", "bundle", "adapter", "file"], "adapter execution source identity");
|
|
280
|
-
return { input: inputSnapshot, identity };
|
|
281
|
-
}
|
|
282
271
|
export function renderMarkdownExecutionSource(input) {
|
|
283
|
-
const
|
|
284
|
-
const raw = snapshots.input.raw;
|
|
272
|
+
const raw = input.raw;
|
|
285
273
|
if (typeof raw !== "string")
|
|
286
274
|
throw new TypeError("adapter execution source.raw must be a string");
|
|
287
|
-
const kind =
|
|
275
|
+
const kind = input.kind;
|
|
288
276
|
if (kind !== "command" && kind !== "persona")
|
|
289
277
|
throw new TypeError("adapter execution source.kind is invalid");
|
|
290
|
-
const
|
|
291
|
-
const parsed = parseExecutionMarkdown(raw,
|
|
292
|
-
const hasDefaults = Object.hasOwn(
|
|
293
|
-
const defaultsProjection =
|
|
278
|
+
const identity = input.identity;
|
|
279
|
+
const parsed = parseExecutionMarkdown(raw, identity.file);
|
|
280
|
+
const hasDefaults = Object.hasOwn(input, "defaults");
|
|
281
|
+
const defaultsProjection = input.defaults;
|
|
294
282
|
const defaults = typeof defaultsProjection === "function" ? defaultsProjection(parsed.data) : defaultsProjection;
|
|
295
283
|
if (hasDefaults && defaults === undefined) {
|
|
296
284
|
throw new TypeError("adapter execution source defaults must be omitted or resolve to an object");
|
|
297
285
|
}
|
|
298
|
-
const extensionsProjection =
|
|
286
|
+
const extensionsProjection = input.extensions;
|
|
299
287
|
const extensionsAreProjected = typeof extensionsProjection === "function";
|
|
300
288
|
const extensions = extensionsAreProjected ? extensionsProjection(parsed.data) : extensionsProjection;
|
|
301
|
-
if (Object.hasOwn(
|
|
289
|
+
if (Object.hasOwn(input, "extensions") && !extensionsAreProjected && extensions === undefined) {
|
|
302
290
|
throw new TypeError("adapter execution source extensions must be omitted or be an adapter-owned extension object");
|
|
303
291
|
}
|
|
304
292
|
return createAdapterRenderedExecutionSource({
|
|
305
293
|
kind,
|
|
306
294
|
content: parsed.content,
|
|
307
295
|
identity: {
|
|
308
|
-
ref:
|
|
309
|
-
bundle:
|
|
310
|
-
adapter:
|
|
311
|
-
file:
|
|
296
|
+
ref: identity.ref,
|
|
297
|
+
bundle: identity.bundle,
|
|
298
|
+
adapter: identity.adapter,
|
|
299
|
+
file: identity.file,
|
|
312
300
|
hash: createHash("sha256").update(raw, "utf8").digest("hex"),
|
|
313
301
|
},
|
|
314
302
|
...(hasDefaults ? { defaults } : {}),
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
import fs from "node:fs";
|
|
27
27
|
import path from "node:path";
|
|
28
28
|
import { toPosix } from "../common.js";
|
|
29
|
-
import {
|
|
29
|
+
import { SCRIPT_EXTENSIONS, WORKFLOW_EXTENSIONS } from "../recognition-util.js";
|
|
30
30
|
const workflowSpec = {
|
|
31
31
|
isRelevantFile: (fileName) => WORKFLOW_EXTENSIONS.includes(path.extname(fileName).toLowerCase()),
|
|
32
32
|
toCanonicalName: (typeRoot, filePath) => {
|
|
@@ -245,21 +245,12 @@ export function assetPathForName(assetType, typeRoot, name) {
|
|
|
245
245
|
* "default" alias is genuinely dual-owned: both `<dir>/.env` and
|
|
246
246
|
* `<dir>/default.env` derive the same canonical name (`toCanonicalName`
|
|
247
247
|
* above), so a physical-owner lookup must consider both without reading
|
|
248
|
-
* either file.
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
* the name (see `resolveParentRef`/`isDerivedMemory` in
|
|
252
|
-
* `commands/improve/memory/derived-ref.ts`, and the belief-edge identity
|
|
253
|
-
* channel's own `memory:<name>.derived` refs). The plain `.md` file wins when
|
|
254
|
-
* both exist, so it stays `primary` — first in the returned list — and every
|
|
255
|
-
* caller here already prefers the first candidate that exists on disk. Every
|
|
256
|
-
* other placement type has exactly one inverse spelling.
|
|
248
|
+
* either file. Every other placement type has exactly one inverse spelling —
|
|
249
|
+
* including `memory`: `<name>.derived.md` is a separate item that owns
|
|
250
|
+
* `<name>.derived`, never a second spelling of `<name>`.
|
|
257
251
|
*/
|
|
258
252
|
export function assetPathCandidatesForName(assetType, typeRoot, name) {
|
|
259
253
|
const primary = assetPathForName(assetType, typeRoot, name);
|
|
260
|
-
if (assetType === "memory" && !name.endsWith(DERIVED_SUFFIX)) {
|
|
261
|
-
return [primary, assetPathForName(assetType, typeRoot, `${name}${DERIVED_SUFFIX}`)];
|
|
262
|
-
}
|
|
263
254
|
if (assetType !== "env")
|
|
264
255
|
return [primary];
|
|
265
256
|
const base = name === "default" ? "" : name.endsWith("/default") ? name.slice(0, -"default".length) : undefined;
|