akm-cli 0.9.17-alpha.3 → 0.9.17-alpha.4
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 +731 -0
- package/dist/akm +94 -196
- package/dist/cli/shared.js +6 -2
- package/dist/cli.js +22 -9
- 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 +2 -2
- package/dist/commands/health/checks.js +30 -75
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +0 -38
- package/dist/commands/health/improve-metrics.js +123 -562
- 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 +11 -106
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -73
- package/dist/commands/health.js +122 -143
- package/dist/commands/improve/consolidate/chunking.js +25 -100
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +538 -1075
- 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 -1075
- package/dist/commands/improve/eligibility.js +126 -400
- package/dist/commands/improve/execution.js +3 -5
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +29 -166
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +12 -7
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +443 -1063
- package/dist/commands/improve/ledger.js +114 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +459 -1172
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +14 -118
- package/dist/commands/improve/memory/memory-improve.js +4 -3
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -10
- package/dist/commands/improve/preparation.js +851 -2339
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +621 -1367
- package/dist/commands/improve/salience.js +46 -232
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +323 -0
- package/dist/commands/proposal/drain.js +251 -644
- package/dist/commands/proposal/proposal-cli.js +3 -18
- package/dist/commands/proposal/proposal-types.js +20 -41
- package/dist/commands/proposal/proposal.js +1 -2
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +502 -1487
- 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 +13 -89
- package/dist/commands/read/curate.js +63 -413
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +2 -13
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +7 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +2 -11
- 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/stash-cli.js +1 -1
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +9 -8
- package/dist/commands/tasks/tasks.js +326 -930
- package/dist/commands/tasks/validate.js +42 -21
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +0 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +11 -12
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +291 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +1 -33
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +163 -68
- 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 +21 -95
- package/dist/core/config/schema/improve.js +4 -42
- 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-lock.js +76 -173
- package/dist/core/logs-db.js +2 -2
- package/dist/core/paths.js +0 -27
- 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 +108 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +293 -1012
- 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/graph-db.js +106 -46
- package/dist/indexer/ensure-index.js +44 -85
- package/dist/indexer/graph/graph-extraction.js +340 -562
- package/dist/indexer/graph/graph-related.js +130 -0
- 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 +139 -151
- package/dist/indexer/indexer.js +524 -846
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +81 -90
- package/dist/indexer/passes/metadata.js +132 -200
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +1 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +181 -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 +2 -7
- 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/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +10 -15
- package/dist/llm/graph-extract.js +3 -12
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/metadata-enhance.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 +2 -34
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +60 -23
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +1 -2
- 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 +43937 -93313
- package/dist/scripts/akm-migrate.js +43697 -93071
- 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/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 +0 -17
- 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 +168 -0
- package/dist/storage/repositories/index-connection.js +34 -70
- package/dist/storage/repositories/index-entries-repository.js +69 -111
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +83 -269
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +192 -220
- 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 +35 -0
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- 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 +34 -27
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +129 -277
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +125 -745
- package/dist/tasks/backends/schtasks.js +101 -620
- 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/scheduler-binding.js +18 -238
- package/dist/tasks/scheduler-invocation.js +52 -52
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +361 -751
- package/dist/tasks/source/parse-task-source.js +160 -10
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +2 -2
- 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 +41 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
- package/docs/reference/cli.md +182 -125
- package/docs/reference/configuration.md +49 -56
- package/docs/reference/data-and-telemetry.md +19 -20
- package/docs/reference/tasks.md +86 -38
- 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 +87 -406
- 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 -146
- package/dist/commands/improve/distill/promote-memory.js +0 -329
- package/dist/commands/improve/distill/quality-gate.js +0 -500
- 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 -21
- 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/config/retired-experimental-keys-shim.js +0 -62
- 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 -441
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- 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/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/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 -78
- 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
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
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
|
+
/** Semantic checks shared by the workflow grammars (`parser.ts`, `github-yaml.ts`) and freeze. */
|
|
5
5
|
import fs from "node:fs";
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import { parseBuiltinCommandAction } from "
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { parseBuiltinCommandAction } from "../commands/command/builtin-action.js";
|
|
8
|
+
import { classifyTargetRef } from "../execution/target-ref.js";
|
|
9
|
+
import { parseSchedule } from "../tasks/schedule.js";
|
|
10
10
|
export class WorkflowSourceSemanticError extends Error {
|
|
11
11
|
code;
|
|
12
12
|
constructor(code, message) {
|
|
@@ -15,6 +15,14 @@ export class WorkflowSourceSemanticError extends Error {
|
|
|
15
15
|
this.name = "WorkflowSourceSemanticError";
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
+
/** The argv a `run:` string executes under `shell`. */
|
|
19
|
+
export function workflowShellCommand(shell, content) {
|
|
20
|
+
if (shell === "cmd")
|
|
21
|
+
return ["cmd", "/d", "/s", "/c", content];
|
|
22
|
+
if (shell === "pwsh" || shell === "powershell")
|
|
23
|
+
return [shell, "-Command", content];
|
|
24
|
+
return [shell, "-c", content];
|
|
25
|
+
}
|
|
18
26
|
export function canonicalizeWorkflowCron(value) {
|
|
19
27
|
const canonical = value.trim().split(/\s+/).join(" ");
|
|
20
28
|
if (canonical.startsWith("@") || canonical.split(" ").length !== 5) {
|
|
@@ -66,28 +74,21 @@ function hasControlCharacter(value) {
|
|
|
66
74
|
}
|
|
67
75
|
return false;
|
|
68
76
|
}
|
|
69
|
-
export function classifyWorkflowStepUses(value
|
|
77
|
+
export function classifyWorkflowStepUses(value) {
|
|
70
78
|
if (value.includes("${{")) {
|
|
71
79
|
throw new WorkflowSourceSemanticError("unsupported-github-expression", "GitHub expressions are unsupported in uses.");
|
|
72
80
|
}
|
|
73
81
|
if (value.length === 0 || value.trim() !== value || /\s/.test(value)) {
|
|
74
82
|
throw new WorkflowSourceSemanticError("unsupported-uses-target", "uses must be one exact, non-empty executable ref");
|
|
75
83
|
}
|
|
76
|
-
|
|
84
|
+
if (value === "akm/command")
|
|
85
|
+
return { kind: "builtin-command", ref: "akm/command" };
|
|
77
86
|
try {
|
|
78
|
-
|
|
87
|
+
return classifyTargetRef(value);
|
|
79
88
|
}
|
|
80
89
|
catch (cause) {
|
|
81
90
|
throw usesFailure(value, cause);
|
|
82
91
|
}
|
|
83
|
-
// P3a (docs/plans/specs/p3a-plan-v5-child-freeze.md §1.3(2)/§4, A-N4): a
|
|
84
|
-
// `kind: "workflow"` target used to throw `nested-workflow-unsupported`
|
|
85
|
-
// here. That rejection is REMOVED — classification returns the workflow
|
|
86
|
-
// target like any other target-ref-shaped `uses:`, and freeze decides
|
|
87
|
-
// (`src/workflows/freeze/targets/child-workflow.ts`, the ONE recursive
|
|
88
|
-
// child-workflow resolver both the direct and task-wrapped composition
|
|
89
|
-
// forms route through).
|
|
90
|
-
return target;
|
|
91
92
|
}
|
|
92
93
|
/**
|
|
93
94
|
* Validate AKM's built-in command action at the shared source/decoder boundary.
|
|
@@ -121,11 +122,6 @@ export function validateWorkflowBuiltinCommand(value, mode) {
|
|
|
121
122
|
}
|
|
122
123
|
return action;
|
|
123
124
|
}
|
|
124
|
-
export function rejectNulInArgv(command) {
|
|
125
|
-
if (command.some((argument) => argument.includes("\0"))) {
|
|
126
|
-
throw new WorkflowSourceSemanticError("invalid-exec-argv", "Direct exec argv may not contain NUL bytes.");
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
125
|
function usesFailure(value, cause) {
|
|
130
126
|
const message = cause instanceof Error ? cause.message : String(cause);
|
|
131
127
|
const code = value.startsWith("docker://")
|
|
@@ -18,13 +18,8 @@
|
|
|
18
18
|
import validateSummaryJudgePrompt from "../assets/prompts/validate-summary-judge.md" with { type: "text" };
|
|
19
19
|
import { parseJsonResponse } from "../core/parse.js";
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* `complete`). This is the ONE verdict parser: {@link validateStepSummary}
|
|
24
|
-
* fails closed through it, and the engine's gate wrapper (step-work.ts) uses
|
|
25
|
-
* the same function to classify a malformed verdict as verifier
|
|
26
|
-
* INFRASTRUCTURE failure — never an honest rejection that would consume a
|
|
27
|
-
* gate loop — so the two classifications cannot drift.
|
|
21
|
+
* The one verdict parser: a well-formed verdict, or `undefined` when malformed
|
|
22
|
+
* (which the engine treats as a verifier failure, never a rejection).
|
|
28
23
|
*/
|
|
29
24
|
export function parseJudgeVerdict(raw) {
|
|
30
25
|
const parsed = parseJsonResponse(raw);
|
|
@@ -29,49 +29,57 @@ akm migrate apply
|
|
|
29
29
|
|
|
30
30
|
In order, every run applies (or, under `status`/`--dry-run`, plans):
|
|
31
31
|
|
|
32
|
-
1. **
|
|
33
|
-
first-class fields
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
1. **config.json in its current shape** (`configFile`): retired and unknown
|
|
33
|
+
keys dropped, legacy `extraParams` lifted onto first-class fields, the
|
|
34
|
+
legacy `stashDir`/`sources[]`/`installed` layout converted to
|
|
35
|
+
`bundles`/`defaultBundle`. Config loading already does all of this in
|
|
36
|
+
memory; this persists it under a backup.
|
|
37
|
+
2. **Pending `state.db` migrations**, historical-destructive ones included
|
|
38
|
+
(`stateMigrations`). This is the only path (besides `akm upgrade`, which
|
|
39
|
+
calls the same code) that is allowed to apply a destructive migration to an
|
|
40
|
+
existing, unversioned or behind-generation `state.db` — see
|
|
38
41
|
[One-way state.db](#one-way-note-statedb-migrations-are-one-way) below.
|
|
39
|
-
3. **Task
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
3. **Task files**: every task file at version 2 or 3, and every version 4
|
|
43
|
+
file still carrying the retired `schedule[].enabled` key, rewritten as
|
|
44
|
+
task source v4 (`taskFiles`) under one backup directory per run. A file
|
|
45
|
+
the planner cannot convert unambiguously is reported `blocked` and left
|
|
46
|
+
alone; the rest still convert.
|
|
47
|
+
4. **Residue sweep**: superseded pre-0.9.0 `.akm` files in the stash and the
|
|
48
|
+
transaction-journal, maintenance-barrier, lock-mutex and version-stamp
|
|
49
|
+
files older releases kept under `$DATA`/`$STATE`/`$CONFIG` (`deadResidue`).
|
|
50
|
+
|
|
51
|
+
The step list in [`docs/reference/cli.md`](../reference/cli.md#migrate) is the
|
|
52
|
+
authoritative one; the two must agree.
|
|
46
53
|
|
|
47
54
|
### The plan JSON
|
|
48
55
|
|
|
49
|
-
One JSON object on stdout, always
|
|
56
|
+
One JSON object on stdout, always, with one field per step. A current
|
|
57
|
+
install, nothing to do, as `akm migrate status` prints it (under `apply` the
|
|
58
|
+
per-step objects carry results instead — `applied`, `removed` — with the
|
|
59
|
+
same step names):
|
|
50
60
|
|
|
51
61
|
```json
|
|
52
62
|
{
|
|
53
63
|
"schemaVersion": 1,
|
|
54
64
|
"status": "current",
|
|
55
65
|
"blockers": [],
|
|
56
|
-
"
|
|
66
|
+
"configFile": { "keys": [], "changed": false, "applied": false },
|
|
57
67
|
"stateMigrations": { "pending": [] },
|
|
58
|
-
"
|
|
59
|
-
"
|
|
68
|
+
"taskFiles": { "schemaVersion": 1, "changed": 0, "skipped": 0, "blocked": 0, "files": [] },
|
|
69
|
+
"deadResidue": { "pending": [] }
|
|
60
70
|
}
|
|
61
71
|
```
|
|
62
72
|
|
|
63
|
-
`akm migrate status` against a tree with one blocked task file
|
|
64
|
-
omitted below for brevity — its shape is identical):
|
|
73
|
+
`akm migrate status` against a tree with one blocked task file:
|
|
65
74
|
|
|
66
75
|
```json
|
|
67
76
|
{
|
|
68
77
|
"schemaVersion": 1,
|
|
69
78
|
"status": "blocked",
|
|
70
|
-
"blockers": ["with-on-non-command-target"],
|
|
79
|
+
"blockers": ["tasks/nightly.yml: with-on-non-command-target"],
|
|
71
80
|
"stateMigrations": { "pending": [] },
|
|
72
|
-
"
|
|
81
|
+
"taskFiles": {
|
|
73
82
|
"schemaVersion": 1,
|
|
74
|
-
"generation": "task-v3-to-v4",
|
|
75
83
|
"changed": 3,
|
|
76
84
|
"skipped": 1,
|
|
77
85
|
"blocked": 1,
|
|
@@ -109,16 +117,14 @@ Key fields:
|
|
|
109
117
|
| Field | Meaning |
|
|
110
118
|
| --- | --- |
|
|
111
119
|
| `stateMigrations` | `{ pending: string[] }` under `status`/`--dry-run`; `{ applied: string[], safetyCopyPath?: string }` after a real `apply`. `safetyCopyPath` is present only when a historical-destructive migration ran — see below. |
|
|
112
|
-
| `
|
|
113
|
-
| `backupPath` / `
|
|
114
|
-
| `deadResidue`
|
|
120
|
+
| `taskFiles` | `changed`/`skipped`/`blocked` counts and a `files[]` array with each file's `status` and `reason`. |
|
|
121
|
+
| `backupPath` / `applied` | Present after a real apply that rewrote at least one task file: the run's backup directory and how many files it rewrote. |
|
|
122
|
+
| `deadResidue` | `{ pending: [...] }` under a read-only run, `{ removed: [...] }` / `{ recovered: [...], quarantined: [...], deferred: [...] }` after apply. An untrusted journal (unreadable `journal.json`, or a fence violation) is quarantined to `$DATA/txn-quarantine`; a trusted, fenced journal whose `rollback`/`finalize` throws is deferred, left in place under `$DATA/txn/<rootNs>/`. Neither is thrown, and neither sets `status` to `blocked`. `staleTxns.pending` entries carry `wouldQuarantine: { reason }` when the journal's read-only fence check alone (not a `rollback`/`finalize` run) already shows it would be quarantined by a real apply. |
|
|
115
123
|
|
|
116
124
|
**Backups and their retention:**
|
|
117
125
|
|
|
118
|
-
- Task-
|
|
119
|
-
|
|
120
|
-
`<dataDir>/backups/task-v4/<timestamp>-<uuid>/` respectively — one
|
|
121
|
-
directory per apply run, pruned to the **5 most recent** automatically.
|
|
126
|
+
- Task-file backups go to `<dataDir>/backups/tasks/<timestamp>-<uuid>/`,
|
|
127
|
+
one directory per apply run that rewrote a file; nothing prunes them.
|
|
122
128
|
- Config backups go to `<cacheDir>/config-backups/config-<ISO-ts>.json`,
|
|
123
129
|
also capped at **5**.
|
|
124
130
|
- A `state.db` historical-destructive migration writes a verified sibling
|
|
@@ -197,25 +203,26 @@ that wording is not a stable interface.
|
|
|
197
203
|
(`status: "fail"`).
|
|
198
204
|
|
|
199
205
|
The check that replaces grepping akm's refusal text is a **hard check**
|
|
200
|
-
named `state-db-migrations
|
|
206
|
+
named `state-db-migrations`. Every `state.db` open applies pending migrations
|
|
207
|
+
(copying the file to `state.db.pre-<id>.bak` first when one drops schema), so
|
|
208
|
+
after an upgrade the check passes and names what health's own open applied:
|
|
201
209
|
|
|
202
210
|
```json
|
|
203
211
|
{
|
|
204
212
|
"name": "state-db-migrations",
|
|
205
|
-
"status": "
|
|
206
|
-
"message": "
|
|
207
|
-
"evidence": {
|
|
213
|
+
"status": "pass",
|
|
214
|
+
"message": "Applied 11 pending state.db migration(s) on open (018-drop-dead-lane-schema … 028-improve-ledger); the pre-migration copy is /data/akm/state.db.pre-018-drop-dead-lane-schema.bak.",
|
|
215
|
+
"evidence": {
|
|
216
|
+
"path": "/data/akm/state.db",
|
|
217
|
+
"pending": [],
|
|
218
|
+
"applied": ["018-drop-dead-lane-schema", "…", "028-improve-ledger"],
|
|
219
|
+
"backupPath": "/data/akm/state.db.pre-018-drop-dead-lane-schema.bak"
|
|
220
|
+
}
|
|
208
221
|
}
|
|
209
222
|
```
|
|
210
223
|
|
|
211
|
-
It
|
|
212
|
-
|
|
213
|
-
that opens `state.db` refuses to touch a pending historical-destructive
|
|
214
|
-
migration by design**, naming `akm upgrade` and `akm migrate apply` as the
|
|
215
|
-
only two commands allowed to apply one. Before this check existed, that
|
|
216
|
-
refusal surfaced as a crash (config-error exit) instead of a normal `fail`
|
|
217
|
-
row — this is what a bundler should now watch for `state-db-migrations` to
|
|
218
|
-
report, instead of grepping error text for a fixed remedy string.
|
|
224
|
+
It is `fail` only when a pending migration could not be applied; `evidence.pending`
|
|
225
|
+
then names what is still pending. Watch this row's `status`, not error text.
|
|
219
226
|
|
|
220
227
|
## The `akm-migrate` executable
|
|
221
228
|
|
|
@@ -259,7 +266,7 @@ rather than rely on `$HOME`-derived defaults (names verified against
|
|
|
259
266
|
| `AKM_CONFIG_DIR` | `config.json`'s directory. |
|
|
260
267
|
| `AKM_DATA_DIR` | Durable, non-regenerable data: **`index.db` and `state.db` live here.** This is the directory a migration snapshot's safety copy sits beside. |
|
|
261
268
|
| `AKM_CACHE_DIR` | Regenerable cache: registry downloads, config backups, task logs. Safe to discard between image builds (not between boots of the same running install). |
|
|
262
|
-
| `AKM_STATE_DIR` | **Not** where `state.db` lives, despite the name — this is the XDG "state" directory. Holds scheduled-task invocation context, companion-plugin hook state (Claude Code / OpenCode hook logs), and, per stash, `akm improve`'s machine-local writers (`improve/
|
|
269
|
+
| `AKM_STATE_DIR` | **Not** where `state.db` lives, despite the name — this is the XDG "state" directory. Holds scheduled-task invocation context, companion-plugin hook state (Claude Code / OpenCode hook logs), and, per stash, `akm improve`'s machine-local writers (`improve/measurement/verdicts/`) and whole-run lock (`locks/`) — see [Storage locations](https://github.com/itlackey/akm/blob/main/docs/architecture/internals/storage-locations.md). Set it anyway if you schedule akm tasks inside the image, so that context is captured consistently rather than falling back to `$HOME/.local/state/akm`. |
|
|
263
270
|
|
|
264
271
|
Set all five to paths that persist across container restarts (a mounted
|
|
265
272
|
volume), or `akm migrate apply` will see an empty `state.db` on every boot
|
package/docs/migration/README.md
CHANGED
|
@@ -5,6 +5,7 @@ Upgrade guides and per-release migration notes.
|
|
|
5
5
|
- [v0.9.1 -> v0.9.2 migration guide](v0.9.1-to-v0.9.2.md) -- Task-v2/task-v3 to task source v4 conversion, the durable-v4-family workflow boundary at executable `irVersion: 5`, and release behavior changes
|
|
6
6
|
- [v0.9.2 release note](release-notes/0.9.2.md) -- Self-contained terminal upgrade summary shipped for `akm help migrate 0.9.2`
|
|
7
7
|
- [v0.9.16 release note](release-notes/0.9.16.md) -- Source-bound scheduler grants, local execution authority, and split unsafe overrides
|
|
8
|
+
- [v0.9.17 release note](release-notes/0.9.17.md) -- Tolerant readers, one config migration step, a plain scheduler list, less machinery, and the upgrade rehearsal gate
|
|
8
9
|
- [v0.8 -> current v0.9 migration guide](v0.8-to-v0.9.md) -- Package upgrade with fresh current config/state and explicit task conversion
|
|
9
10
|
- [v0.7 -> v0.8 migration guide](v0.7-to-v0.8.md) -- Task schema and 0.8-era changes
|
|
10
11
|
- [v0.5 -> v0.6 migration guide](https://github.com/itlackey/akm/blob/main/docs/migration/v0.5-to-v0.6.md) -- Terminology cut, registry schema v3, publisher changes
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
Migration notes for akm v0.9.17
|
|
2
|
+
|
|
3
|
+
Upgrading no longer needs a manual step to keep working, and there is less
|
|
4
|
+
machinery to break.
|
|
5
|
+
|
|
6
|
+
Readers tolerate what older releases wrote. A `version: 2` or `version: 3`
|
|
7
|
+
task source reads and runs, converted in memory with a one-line warning. A
|
|
8
|
+
config key this release does not know -- retired, misspelled, or written by a
|
|
9
|
+
newer release -- is kept in memory and named once, never a reason to refuse
|
|
10
|
+
the config; ordinary writes round-trip it, and `akm migrate apply` drops it.
|
|
11
|
+
`akm migrate apply` has one config step (`configFile`): read config.json
|
|
12
|
+
through the same pipeline every load runs and write the current shape back,
|
|
13
|
+
under a backup.
|
|
14
|
+
|
|
15
|
+
Scheduling is one list. `scheduler.enabled` in config.json holds the
|
|
16
|
+
fully-qualified refs this host schedules (`bundle//tasks/x`). The
|
|
17
|
+
0.9.17-alpha `{kind, ref, sourceId}` grant objects are read as their ref. A
|
|
18
|
+
config with no list at all -- every release before 0.9.17 -- means "keep
|
|
19
|
+
what is installed": the first `akm task sync` (or `setup`, `task enable`,
|
|
20
|
+
`task disable`, `task add`) after the upgrade takes the akm-written rows
|
|
21
|
+
already in the native scheduler as the host's choice, writes the list, and
|
|
22
|
+
says so. An explicit list, empty or not, is never second-guessed. There are
|
|
23
|
+
no grants, no source identities, no carry-forward and no fire-time gate.
|
|
24
|
+
|
|
25
|
+
Removed machinery: filesystem transaction journals for proposal accept/revert
|
|
26
|
+
(the asset is written, then the proposal row and its event are recorded in
|
|
27
|
+
one state.db transaction; a crash in between leaves a re-acceptable pending
|
|
28
|
+
proposal); the maintenance barrier, its per-process activity registry (the
|
|
29
|
+
source of the lock-sidecar leak) and the SQLite lock-operation mutex (a lock
|
|
30
|
+
file is one `O_EXCL` create); startup version reconciliation and
|
|
31
|
+
`--host-local`; the akm-install enumerator and `akm upgrade --version/--tag`;
|
|
32
|
+
the upgrade and transaction health advisories; the `akm info` compat
|
|
33
|
+
manifest. `akm migrate apply` removes the files those left under `$DATA`,
|
|
34
|
+
`$STATE` and `$CONFIG`.
|
|
35
|
+
|
|
36
|
+
Every historical shape akm has written is exercised by the upgrade rehearsal
|
|
37
|
+
(`tests/integration/upgrade-rehearsal/`) before each release: a real previous
|
|
38
|
+
release builds a home, the candidate installs over it in place, and the
|
|
39
|
+
rehearsal drives migrate, bundle list, search, show, task sync, health and a
|
|
40
|
+
scheduled task's generated cron command, then confirms the previous release
|
|
41
|
+
still runs against the candidate-written home.
|
|
@@ -53,14 +53,26 @@ migration contract.
|
|
|
53
53
|
below.
|
|
54
54
|
|
|
55
55
|
Everything else below can happen after the binary upgrade, at your own
|
|
56
|
-
pace:
|
|
57
|
-
|
|
58
|
-
runs
|
|
56
|
+
pace: an unmigrated v2/v3 task source keeps reading and running through the
|
|
57
|
+
in-memory read shim, with a one-line deprecation warning, until you migrate
|
|
58
|
+
it (nothing silently breaks or half-runs, and only a genuinely unmigratable
|
|
59
|
+
shape fails closed with an actionable hint), and pre-`irVersion`-5 runs stay
|
|
60
|
+
inspectable indefinitely.
|
|
59
61
|
|
|
60
62
|
## Task sources
|
|
61
63
|
|
|
62
|
-
akm 0.9.2 has shipped three task source generations.
|
|
63
|
-
|
|
64
|
+
akm 0.9.2 has shipped three task source generations. **Task source v4** is
|
|
65
|
+
the current, standing grammar; an older `version: 2` or `version: 3` file
|
|
66
|
+
still reads and runs through an in-memory read shim that converts it to v4
|
|
67
|
+
on the same bytes `akm migrate apply` would produce, with a one-line stderr
|
|
68
|
+
deprecation warning and no disk write. Only a v2/v3 document the
|
|
69
|
+
deterministic conversion itself cannot resolve fails to load. `akm migrate
|
|
70
|
+
apply` remains the way to rewrite the file on disk and silence the warning.
|
|
71
|
+
(A later release — see the [Tasks reference](../reference/tasks.md) for the
|
|
72
|
+
current grammar — extended the same kind of shim to a `version: 4` document
|
|
73
|
+
whose `schedule[]` still carries a per-entry `enabled` key, retired from
|
|
74
|
+
task source v4's own grammar since; the field is stripped without being
|
|
75
|
+
read, never re-added.)
|
|
64
76
|
|
|
65
77
|
**Before — 0.9.1 task v2:**
|
|
66
78
|
|
|
@@ -77,7 +89,7 @@ redact: [REVIEW_TOKEN]
|
|
|
77
89
|
```
|
|
78
90
|
|
|
79
91
|
**An intermediate generation — task v3** (shipped earlier in the 0.9.x
|
|
80
|
-
line; also
|
|
92
|
+
line; also read only through the shim now, not as a standing grammar):
|
|
81
93
|
|
|
82
94
|
```yaml
|
|
83
95
|
version: 3
|
|
@@ -667,7 +679,7 @@ phase-specific code:
|
|
|
667
679
|
| Code | Domain |
|
|
668
680
|
|---|---|
|
|
669
681
|
| `TASK_SOURCE_INVALID` | A task document's field- or semantic-level validation failure, or a malformed/oversized/too-deep YAML front end failure. |
|
|
670
|
-
| `TASK_SCHEMA_VERSION_UNSUPPORTED` | A task document's `version:` is
|
|
682
|
+
| `TASK_SCHEMA_VERSION_UNSUPPORTED` | A task document's `version:` is `3` or `2` and the in-memory read shim's deterministic conversion cannot resolve it — a human decision is needed (see [Task sources](#task-sources)); a convertible v2/v3 document reads through the shim instead of failing. |
|
|
671
683
|
| `TARGET_REF_INVALID` | A value is not a canonical `commands/`, `scripts/`, `tasks/`, or `workflows/` asset ref (malformed shapes, GitHub locators, other asset families). |
|
|
672
684
|
| `WORKFLOW_SOURCE_INVALID` | A workflow-source compile failure other than the one below. |
|
|
673
685
|
| `COMPOSITION_INVALID` | A composition-policy rejection: a rejected `with:`, a multi-job document, a composition cycle/depth/size violation. |
|