akm-cli 0.9.1 → 0.9.2-alpha.2
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 +103 -28
- package/README.md +3 -1
- package/SECURITY.md +1 -1
- package/STABILITY.md +1 -1
- package/dist/akm +2 -2
- package/dist/akm-migrate +2 -2
- package/dist/assets/hints/cli-hints-full.md +14 -9
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/models.json +35 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
- package/dist/assets/tasks/core/extract.yml +6 -5
- package/dist/assets/tasks/core/improve.yml +6 -5
- package/dist/assets/tasks/core/index-refresh.yml +6 -5
- package/dist/assets/tasks/core/sync.yml +6 -5
- package/dist/assets/tasks/core/version-check.yml +6 -5
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
- package/dist/cli/confirm.js +2 -2
- package/dist/cli/parse-args.js +3 -24
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +2 -2
- package/dist/cli.js +11 -9
- package/dist/commands/agent/agent-dispatch.js +55 -89
- package/dist/commands/agent/contribute-cli.js +12 -45
- package/dist/commands/command/builtin-action.js +32 -0
- package/dist/commands/command/command-cli.js +99 -0
- package/dist/commands/command/command-execution.js +308 -0
- package/dist/commands/command/execution-source-loader.js +176 -0
- package/dist/commands/command/portable-template.js +60 -0
- package/dist/commands/config-cli.js +10 -4
- package/dist/commands/env/env.js +4 -2
- package/dist/commands/feedback-cli.js +1 -1
- package/dist/commands/health/checks.js +241 -29
- package/dist/commands/health/html-report.js +0 -14
- package/dist/commands/health/report-view-model.js +0 -1
- package/dist/commands/health/surfaces.js +6 -7
- package/dist/commands/health/types.js +0 -2
- package/dist/commands/health.js +63 -18
- package/dist/commands/improve/collapse-detector.js +5 -6
- package/dist/commands/improve/consolidate.js +251 -214
- package/dist/commands/improve/distill/promote-memory.js +71 -34
- package/dist/commands/improve/distill/quality-gate.js +17 -5
- package/dist/commands/improve/distill.js +232 -155
- package/dist/commands/improve/eligibility.js +112 -79
- package/dist/commands/improve/execution.js +57 -0
- package/dist/commands/improve/extract-cli.js +5 -5
- package/dist/commands/improve/extract-prompt.js +64 -22
- package/dist/commands/improve/extract.js +608 -360
- package/dist/commands/improve/improve-strategies.js +43 -14
- package/dist/commands/improve/improve.js +249 -29
- package/dist/commands/improve/loop-stages.js +11 -17
- package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
- package/dist/commands/improve/outcome-loop.js +22 -38
- package/dist/commands/improve/planner.js +134 -0
- package/dist/commands/improve/preparation.js +730 -409
- package/dist/commands/improve/reflect.js +386 -223
- package/dist/commands/improve/run-context.js +3 -4
- package/dist/commands/improve/salience.js +6 -58
- package/dist/commands/improve/session-asset.js +12 -12
- package/dist/commands/lint/index.js +101 -29
- package/dist/commands/migrate-cli.js +11 -69
- package/dist/commands/migration-tool.js +6 -9
- package/dist/commands/models-cli.js +27 -0
- package/dist/commands/proposal/drain.js +258 -186
- package/dist/commands/proposal/proposal-cli.js +32 -10
- package/dist/commands/proposal/proposal.js +2 -5
- package/dist/commands/proposal/propose.js +192 -172
- package/dist/commands/proposal/repository.js +54 -91
- package/dist/commands/proposal/validators/proposal-validators.js +9 -7
- package/dist/commands/read/curate.js +53 -22
- package/dist/commands/read/registry-search.js +25 -9
- package/dist/commands/read/remember-cli.js +14 -2
- package/dist/commands/read/search.js +10 -4
- package/dist/commands/read/show.js +139 -153
- package/dist/commands/registry-cli.js +16 -7
- package/dist/commands/remember.js +33 -18
- package/dist/commands/sources/add-cli.js +19 -178
- package/dist/commands/sources/bundle-cli.js +15 -3
- package/dist/commands/sources/dangerous-env-audit.js +135 -0
- package/dist/commands/sources/info.js +2 -1
- package/dist/commands/sources/installed-stashes.js +901 -177
- package/dist/commands/sources/schema-repair.js +174 -95
- package/dist/commands/sources/self-update.js +30 -74
- package/dist/commands/sources/source-add.js +3 -5
- package/dist/commands/sources/sources-cli.js +2 -15
- package/dist/commands/sources/update-transaction.js +220 -0
- package/dist/commands/tasks/tasks-cli.js +3 -3
- package/dist/commands/tasks/tasks.js +736 -317
- package/dist/commands/workflow-cli.js +2 -2
- package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
- package/dist/core/adapter/adapters/akm-adapter.js +85 -35
- package/dist/core/adapter/adapters/akm-lint.js +54 -39
- package/dist/core/adapter/adapters/akm-metadata.js +45 -45
- package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
- package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
- package/dist/core/adapter/adapters/index.js +0 -9
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
- package/dist/core/adapter/adapters/okf-adapter.js +4 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
- package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
- package/dist/core/adapter/execution-source.js +308 -0
- package/dist/core/adapter/recognize-match.js +36 -13
- package/dist/core/adapter/registry.js +0 -9
- package/dist/core/asset/stash-meta.js +94 -4
- package/dist/core/common.js +6 -11
- package/dist/core/config/config-io.js +3 -3
- package/dist/core/config/config-schema.js +18 -40
- package/dist/core/config/config-sources.js +11 -21
- package/dist/core/config/config-walker.js +31 -13
- package/dist/core/config/config.js +23 -26
- package/dist/core/config/schema/engines.js +8 -7
- package/dist/core/config/schema/improve-processes.js +29 -5
- package/dist/core/config/schema/index-config.js +0 -27
- package/dist/core/config/schema/primitives.js +1 -23
- package/dist/core/config/schema/sources-bundles.js +13 -16
- package/dist/core/errors.js +2 -0
- package/dist/core/events.js +68 -32
- package/dist/core/extra-params.js +1 -0
- package/dist/core/improve-result.js +315 -0
- package/dist/core/lesson-lint.js +0 -6
- package/dist/core/maintenance-barrier.js +4 -4
- package/dist/core/network-policy.js +152 -0
- package/dist/core/paths.js +1 -1
- package/dist/core/recognition-util.js +4 -4
- package/dist/core/registry-url.js +456 -0
- package/dist/core/state/migrations.js +161 -47
- package/dist/core/state-db.js +453 -80
- package/dist/core/system-error.js +32 -0
- package/dist/core/time.js +2 -12
- package/dist/core/write-source.js +0 -18
- package/dist/execution/directory-identity.js +52 -0
- package/dist/execution/executable-identity.js +107 -0
- package/dist/execution/guarded-source.js +398 -0
- package/dist/execution/json.js +95 -0
- package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
- package/dist/execution/record.js +55 -0
- package/dist/execution/resolved-request.js +730 -0
- package/dist/execution/source.js +320 -0
- package/dist/indexer/bundle-identity-guard.js +5 -4
- package/dist/indexer/db/graph-db.js +33 -0
- package/dist/indexer/graph/graph-boost.js +3 -4
- package/dist/indexer/graph/graph-extraction.js +562 -373
- package/dist/indexer/index-written-assets.js +78 -39
- package/dist/indexer/indexer.js +471 -432
- package/dist/indexer/installations.js +6 -0
- package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
- package/dist/indexer/materialize-embeddings.js +155 -0
- package/dist/indexer/passes/memory-inference.js +227 -174
- package/dist/indexer/passes/metadata.js +263 -118
- package/dist/indexer/scan/doc-to-entry.js +7 -10
- package/dist/indexer/scan/drain-dir.js +51 -23
- package/dist/indexer/search/db-search.js +156 -50
- package/dist/indexer/search/fts-query.js +40 -40
- package/dist/indexer/search/ranking.js +36 -1
- package/dist/indexer/search/search-attribution.js +3 -1
- package/dist/indexer/search/search-fields.js +23 -14
- package/dist/indexer/search/search-hit-enrichers.js +1 -1
- package/dist/indexer/search/search-source.js +7 -16
- package/dist/indexer/search/semantic-status.js +10 -1
- package/dist/indexer/usage/show-usage.js +105 -0
- package/dist/indexer/usage/usage-events.js +7 -2
- package/dist/indexer/walk/matchers.js +40 -10
- package/dist/indexer/walk/path-resolver.js +5 -2
- package/dist/indexer/walk/walker.js +20 -2
- package/dist/integrations/agent/builder-shared.js +3 -6
- package/dist/integrations/agent/conversation-fallback.js +16 -0
- package/dist/integrations/agent/engine-resolution.js +87 -87
- package/dist/integrations/agent/execution-cascade.js +566 -0
- package/dist/integrations/agent/execution-definitions.js +211 -0
- package/dist/integrations/agent/execution-lowering.js +811 -0
- package/dist/integrations/agent/execution-preparation.js +67 -0
- package/dist/integrations/agent/index.js +0 -2
- package/dist/integrations/agent/inline-execution.js +74 -0
- package/dist/integrations/agent/model-map.js +515 -0
- package/dist/integrations/agent/persona-fallback.js +30 -0
- package/dist/integrations/agent/request-lowering.js +186 -0
- package/dist/integrations/agent/runner-dispatch.js +230 -37
- package/dist/integrations/agent/runner.js +12 -83
- package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
- package/dist/integrations/harnesses/aider/index.js +0 -1
- package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
- package/dist/integrations/harnesses/amazonq/index.js +0 -1
- package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
- package/dist/integrations/harnesses/claude/index.js +1 -5
- package/dist/integrations/harnesses/claude/session-log.js +3 -33
- package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
- package/dist/integrations/harnesses/codex/index.js +0 -1
- package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
- package/dist/integrations/harnesses/copilot/index.js +0 -1
- package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
- package/dist/integrations/harnesses/gemini/index.js +0 -1
- package/dist/integrations/harnesses/index.js +4 -44
- package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
- package/dist/integrations/harnesses/opencode/index.js +0 -2
- package/dist/integrations/harnesses/opencode/session-log.js +14 -204
- package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
- package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
- package/dist/integrations/harnesses/openhands/index.js +0 -1
- package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
- package/dist/integrations/harnesses/pi/index.js +0 -1
- package/dist/integrations/harnesses/shared.js +0 -1
- package/dist/integrations/harnesses/types.js +1 -3
- package/dist/integrations/lockfile.js +82 -79
- package/dist/integrations/session-logs/index.js +6 -17
- package/dist/integrations/session-logs/provider-base.js +1 -29
- package/dist/llm/client.js +10 -5
- package/dist/llm/embedder.js +6 -7
- package/dist/llm/embedders/local.js +37 -88
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/graph-extract.js +75 -50
- package/dist/llm/index-passes.js +43 -5
- package/dist/llm/memory-infer.js +8 -6
- package/dist/llm/metadata-enhance.js +5 -3
- package/dist/llm/structured-call.js +122 -25
- package/dist/output/format-exempt.js +1 -1
- package/dist/output/render-registry.js +0 -16
- package/dist/output/renderers.js +12 -7
- package/dist/output/shapes/curate.js +1 -0
- package/dist/output/shapes/helpers.js +10 -2
- package/dist/output/shapes/passthrough.js +2 -0
- package/dist/output/text/command-format.js +31 -33
- package/dist/output/text/health-format.js +1 -29
- package/dist/output/text/migrate.js +6 -56
- package/dist/output/text/proposal-format.js +16 -1
- package/dist/output/text/workflow-format.js +16 -0
- package/dist/registry/network.js +279 -0
- package/dist/registry/pinned-request-helper.js +247 -0
- package/dist/registry/pinned-transport.js +717 -0
- package/dist/registry/providers/skills-sh.js +18 -6
- package/dist/registry/providers/static-index.js +20 -7
- package/dist/registry/resolve.js +53 -28
- package/dist/scripts/akm-migrate-node.js +19334 -52269
- package/dist/scripts/akm-migrate.js +19270 -51612
- package/dist/setup/registry-stash-loader.js +64 -20
- package/dist/setup/semantic-assets.js +9 -34
- package/dist/setup/setup.js +12 -30
- package/dist/setup/source-identity.js +17 -0
- package/dist/setup/steps/sources.js +36 -15
- package/dist/setup/steps/tasks.js +39 -11
- package/dist/sources/providers/git-provider.js +3 -3
- package/dist/sources/providers/npm.js +2 -2
- package/dist/sources/providers/provider-utils.js +4 -3
- package/dist/sources/providers/website.js +11 -7
- package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
- package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
- package/dist/sources/website-url.js +73 -0
- package/dist/storage/engines/sqlite-migrations.js +81 -26
- package/dist/storage/managed-db.js +27 -24
- package/dist/storage/repositories/events-repository.js +3 -0
- package/dist/storage/repositories/index-connection.js +42 -10
- package/dist/storage/repositories/index-entries-repository.js +203 -229
- package/dist/storage/repositories/index-entry-mapper.js +8 -12
- package/dist/storage/repositories/index-entry-schema.js +255 -0
- package/dist/storage/repositories/index-fts-repository.js +64 -71
- package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
- package/dist/storage/repositories/index-meta-repository.js +0 -11
- package/dist/storage/repositories/index-schema.js +74 -350
- package/dist/storage/repositories/index-utility-repository.js +12 -17
- package/dist/storage/repositories/index-vec-repository.js +56 -7
- package/dist/storage/repositories/proposals-repository.js +4 -127
- package/dist/storage/repositories/registry-cache.js +2 -1
- package/dist/storage/repositories/task-history-repository.js +20 -40
- package/dist/storage/repositories/workflow-runs-repository.js +228 -129
- package/dist/storage/sqlite-read-snapshot.js +148 -0
- package/dist/tasks/backends/cron.js +170 -42
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +787 -202
- package/dist/tasks/backends/schtasks.js +282 -83
- package/dist/tasks/embedded.js +7 -7
- package/dist/tasks/frozen-script.js +50 -0
- package/dist/tasks/resolve-akm-bin.js +5 -1
- package/dist/tasks/runner.js +239 -251
- package/dist/tasks/runtime-v3.js +281 -0
- package/dist/tasks/scheduler-binding.js +272 -0
- package/dist/tasks/scheduler-invocation.js +57 -43
- package/dist/tasks/scheduler-sync.js +654 -0
- package/dist/tasks/source-v3.js +752 -0
- package/dist/tasks/standalone-script-entry.js +5 -0
- package/dist/tasks/task-id.js +29 -0
- package/dist/workflows/authoring/authoring.js +15 -32
- package/dist/workflows/exec/dispatch-redaction.js +14 -8
- package/dist/workflows/exec/exec-unit.js +7 -28
- package/dist/workflows/exec/frozen-judge.js +57 -89
- package/dist/workflows/exec/lowering-notices.js +23 -0
- package/dist/workflows/exec/native-executor.js +301 -458
- package/dist/workflows/exec/param-secrets.js +4 -3
- package/dist/workflows/exec/run-workflow.js +26 -32
- package/dist/workflows/exec/step-work.js +105 -109
- package/dist/workflows/exec/unit-dispatch.js +103 -27
- package/dist/workflows/exec/unit-writer.js +3 -3
- package/dist/workflows/exec/worktree.js +2 -2
- package/dist/workflows/ir/compile.js +86 -72
- package/dist/workflows/ir/environment-v4.js +328 -0
- package/dist/workflows/ir/freeze-v4.js +122 -0
- package/dist/workflows/ir/plan-hash.js +13 -7
- package/dist/workflows/ir/schema-v4.js +525 -0
- package/dist/workflows/ir/schema.js +25 -284
- package/dist/workflows/ir/source-freeze-v4.js +506 -0
- package/dist/workflows/parser.js +27 -24
- package/dist/workflows/program/schema.js +1 -2
- package/dist/workflows/renderer.js +42 -29
- package/dist/workflows/resource-limits.js +4 -5
- package/dist/workflows/runtime/agent-identity.js +11 -13
- package/dist/workflows/runtime/plan-classifier.js +8 -8
- package/dist/workflows/runtime/runs.js +27 -43
- package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
- package/dist/workflows/source-files.js +373 -0
- package/dist/workflows/source-ir/compile.js +196 -0
- package/dist/workflows/source-ir/github-yaml.js +577 -0
- package/dist/workflows/source-ir/ordering.js +38 -0
- package/dist/workflows/source-ir/program.js +50 -0
- package/dist/workflows/source-ir/result.js +26 -0
- package/dist/workflows/source-ir/schema.js +772 -0
- package/dist/workflows/source-ir/semantics.js +242 -0
- package/dist/workflows/source-ir/uses.js +14 -0
- package/docs/README.md +2 -0
- package/docs/migration/README.md +3 -1
- package/docs/migration/release-notes/0.9.2.md +55 -0
- package/docs/migration/release-notes/README.md +5 -0
- package/docs/migration/v0.8-to-v0.9.md +76 -1077
- package/docs/migration/v0.9.0-troubleshooting.md +104 -516
- package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
- package/docs/reference/README.md +1 -0
- package/docs/reference/cli.md +230 -98
- package/docs/reference/configuration.md +159 -36
- package/docs/reference/data-and-telemetry.md +19 -1
- package/docs/reference/supported-formats.md +23 -3
- package/docs/reference/tasks.md +182 -0
- package/docs/reference/workflow-schema.md +91 -40
- package/docs/reference/workflows.md +33 -6
- package/package.json +10 -6
- package/schemas/akm-config.json +372 -224
- package/schemas/akm-task.json +324 -80
- package/schemas/akm-workflow.json +6 -9
- package/dist/core/migration-operation.js +0 -75
- package/dist/integrations/agent/model-aliases.js +0 -74
- package/dist/tasks/parser.js +0 -380
- package/dist/tasks/schema.js +0 -123
- package/dist/tasks/validator.js +0 -80
- package/dist/workflows/ir/freeze.js +0 -320
- package/dist/workflows/runtime/document-cache.js +0 -13
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/** Shared semantic validation for every workflow source-IR producer and decoder. */
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { parseBuiltinCommandAction } from "../../commands/command/builtin-action.js";
|
|
8
|
+
import { validatePortableCommandTemplate } from "../../commands/command/portable-template.js";
|
|
9
|
+
import { bundleRefToString, parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
10
|
+
import { parseSchedule } from "../../tasks/schedule.js";
|
|
11
|
+
import { classifyWorkflowSourceUses } from "./uses.js";
|
|
12
|
+
const TOKEN_SAFE_RUN = /^[A-Za-z0-9_./:@+=,-]+(?: [A-Za-z0-9_./:@+=,-]+)*$/;
|
|
13
|
+
export class WorkflowSourceSemanticError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
constructor(code, message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.name = "WorkflowSourceSemanticError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function canonicalizeWorkflowCron(value) {
|
|
22
|
+
const canonical = value.trim().split(/\s+/).join(" ");
|
|
23
|
+
if (canonical.startsWith("@") || canonical.split(" ").length !== 5) {
|
|
24
|
+
throw new WorkflowSourceSemanticError("invalid-cron", "GitHub schedule cron must use exactly five fields.");
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
parseSchedule(canonical, "cron");
|
|
28
|
+
}
|
|
29
|
+
catch (cause) {
|
|
30
|
+
throw new WorkflowSourceSemanticError("invalid-cron", cause instanceof Error ? cause.message : "Invalid cron schedule.");
|
|
31
|
+
}
|
|
32
|
+
return canonical;
|
|
33
|
+
}
|
|
34
|
+
export function canonicalizeWorkflowRun(value) {
|
|
35
|
+
if (value.includes("${{")) {
|
|
36
|
+
throw new WorkflowSourceSemanticError("unsupported-github-expression", "GitHub expressions and contexts are not supported.");
|
|
37
|
+
}
|
|
38
|
+
if (value.includes("\n") || value.includes("\r")) {
|
|
39
|
+
throw new WorkflowSourceSemanticError("unsafe-run-syntax", "Local run accepts only whitespace-separated safe tokens; shell expansion and operators are unsupported.");
|
|
40
|
+
}
|
|
41
|
+
const canonical = value
|
|
42
|
+
.trim()
|
|
43
|
+
.split(/[ \t]+/)
|
|
44
|
+
.join(" ");
|
|
45
|
+
if (!TOKEN_SAFE_RUN.test(canonical)) {
|
|
46
|
+
throw new WorkflowSourceSemanticError("unsafe-run-syntax", "Local run accepts only whitespace-separated safe tokens; shell expansion and operators are unsupported.");
|
|
47
|
+
}
|
|
48
|
+
return canonical;
|
|
49
|
+
}
|
|
50
|
+
export function canonicalizeWorkflowWorkingDirectory(value, workspaceRoot) {
|
|
51
|
+
if (hasControlCharacter(value)) {
|
|
52
|
+
throw new WorkflowSourceSemanticError("working-directory-control-character", "working-directory may not contain NUL or control characters.");
|
|
53
|
+
}
|
|
54
|
+
if (value === "" || value.trim() === "") {
|
|
55
|
+
throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory must be a non-empty relative contained path.");
|
|
56
|
+
}
|
|
57
|
+
const portable = value.replaceAll("\\", "/");
|
|
58
|
+
const segments = portable.split("/");
|
|
59
|
+
if (path.posix.isAbsolute(portable) ||
|
|
60
|
+
path.win32.isAbsolute(value) ||
|
|
61
|
+
portable.startsWith("~") ||
|
|
62
|
+
segments.some((segment) => segment === "" || segment === "..")) {
|
|
63
|
+
throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory must be relative and contained.");
|
|
64
|
+
}
|
|
65
|
+
const withoutDots = segments.filter((segment) => segment !== ".");
|
|
66
|
+
const canonical = withoutDots.length === 0 ? "." : withoutDots.join("/");
|
|
67
|
+
if (workspaceRoot !== undefined)
|
|
68
|
+
verifyPhysicalContainment(workspaceRoot, canonical);
|
|
69
|
+
return canonical;
|
|
70
|
+
}
|
|
71
|
+
function hasControlCharacter(value) {
|
|
72
|
+
for (const character of value) {
|
|
73
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
74
|
+
if (codePoint <= 0x1f || codePoint === 0x7f)
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
export function classifyWorkflowStepUses(value, classifier = classifyWorkflowSourceUses) {
|
|
80
|
+
if (value.includes("${{")) {
|
|
81
|
+
throw new WorkflowSourceSemanticError("unsupported-github-expression", "GitHub expressions are unsupported in uses.");
|
|
82
|
+
}
|
|
83
|
+
if (value.length === 0 || value.trim() !== value || /\s/.test(value)) {
|
|
84
|
+
throw new WorkflowSourceSemanticError("unsupported-uses-target", "uses must be one exact, non-empty executable ref");
|
|
85
|
+
}
|
|
86
|
+
const task = canonicalTaskTarget(value);
|
|
87
|
+
if (task)
|
|
88
|
+
return task;
|
|
89
|
+
let target;
|
|
90
|
+
try {
|
|
91
|
+
target = classifier(value);
|
|
92
|
+
}
|
|
93
|
+
catch (cause) {
|
|
94
|
+
throw usesFailure(value, cause);
|
|
95
|
+
}
|
|
96
|
+
if (target.kind === "github-action") {
|
|
97
|
+
throw new WorkflowSourceSemanticError("remote-action-acquisition-out-of-scope", `Remote action acquisition is out of scope for ${JSON.stringify(value)}.`);
|
|
98
|
+
}
|
|
99
|
+
if (target.kind === "workflow") {
|
|
100
|
+
throw new WorkflowSourceSemanticError("nested-workflow-unsupported", `Nested workflow target ${JSON.stringify(value)} is unsupported in a workflow step.`);
|
|
101
|
+
}
|
|
102
|
+
return target;
|
|
103
|
+
}
|
|
104
|
+
function canonicalTaskTarget(value) {
|
|
105
|
+
try {
|
|
106
|
+
const parsed = parseBundleRef(value);
|
|
107
|
+
if (parsed.fragment !== undefined || bundleRefToString(parsed) !== value)
|
|
108
|
+
return undefined;
|
|
109
|
+
const slash = parsed.conceptId.indexOf("/");
|
|
110
|
+
if (slash < 0 || parsed.conceptId.slice(0, slash) !== "tasks" || parsed.conceptId.length === slash + 1) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
return { kind: "task", ref: value };
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate AKM's built-in command action at the shared source/decoder boundary.
|
|
121
|
+
*
|
|
122
|
+
* Inline YAML actions are portable templates and therefore use WP4's one
|
|
123
|
+
* authoritative template validator. Markdown prose is explicitly `literal`,
|
|
124
|
+
* while a stored ref remains resolution-owned because its template bytes are
|
|
125
|
+
* not available until the later resolver loads the command asset.
|
|
126
|
+
*/
|
|
127
|
+
export function validateWorkflowBuiltinCommand(value, mode) {
|
|
128
|
+
let action;
|
|
129
|
+
try {
|
|
130
|
+
action = parseBuiltinCommandAction(value);
|
|
131
|
+
}
|
|
132
|
+
catch (cause) {
|
|
133
|
+
throw new WorkflowSourceSemanticError("builtin-command-inputs", cause instanceof Error ? cause.message : "Invalid akm/command inputs.");
|
|
134
|
+
}
|
|
135
|
+
const expectedMode = action.kind === "stored" ? "stored-ref" : "portable-template";
|
|
136
|
+
const effectiveMode = mode ?? expectedMode;
|
|
137
|
+
if (action.kind === "stored") {
|
|
138
|
+
if (effectiveMode !== "stored-ref") {
|
|
139
|
+
throw new WorkflowSourceSemanticError("builtin-command-inputs", "Stored akm/command refs require commandMode stored-ref.");
|
|
140
|
+
}
|
|
141
|
+
return action;
|
|
142
|
+
}
|
|
143
|
+
if (effectiveMode === "stored-ref") {
|
|
144
|
+
throw new WorkflowSourceSemanticError("builtin-command-inputs", "Inline akm/command content cannot use commandMode stored-ref.");
|
|
145
|
+
}
|
|
146
|
+
if (effectiveMode === "literal") {
|
|
147
|
+
if (action.arguments !== undefined) {
|
|
148
|
+
throw new WorkflowSourceSemanticError("builtin-command-inputs", "Literal akm/command content cannot declare arguments because no substitution occurs.");
|
|
149
|
+
}
|
|
150
|
+
return action;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
validatePortableCommandTemplate(action.content, "inline workflow command");
|
|
154
|
+
}
|
|
155
|
+
catch (cause) {
|
|
156
|
+
throw new WorkflowSourceSemanticError("builtin-command-inputs", cause instanceof Error ? cause.message : "Invalid portable command template.");
|
|
157
|
+
}
|
|
158
|
+
return action;
|
|
159
|
+
}
|
|
160
|
+
export function rejectNulInArgv(command) {
|
|
161
|
+
if (command.some((argument) => argument.includes("\0"))) {
|
|
162
|
+
throw new WorkflowSourceSemanticError("invalid-exec-argv", "Direct exec argv may not contain NUL bytes.");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function usesFailure(value, cause) {
|
|
166
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
167
|
+
const code = value.startsWith("docker://")
|
|
168
|
+
? "docker-action-unsupported"
|
|
169
|
+
: value.startsWith("./") || value.startsWith("../") || value.startsWith("/")
|
|
170
|
+
? "local-action-path-unsupported"
|
|
171
|
+
: /^(?:[A-Za-z0-9][A-Za-z0-9._-]*\/\/)?agents\//.test(value)
|
|
172
|
+
? "non-executable-asset-ref"
|
|
173
|
+
: "unsupported-uses-target";
|
|
174
|
+
return new WorkflowSourceSemanticError(code, message);
|
|
175
|
+
}
|
|
176
|
+
function verifyPhysicalContainment(workspaceRoot, relative) {
|
|
177
|
+
let root;
|
|
178
|
+
try {
|
|
179
|
+
root = fs.realpathSync(workspaceRoot);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
throw new WorkflowSourceSemanticError("working-directory-unverifiable", "Workspace root cannot be physically verified.");
|
|
183
|
+
}
|
|
184
|
+
const candidate = path.resolve(root, ...relative.split("/"));
|
|
185
|
+
if (!contained(root, candidate)) {
|
|
186
|
+
throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory escapes the workspace.");
|
|
187
|
+
}
|
|
188
|
+
let current = root;
|
|
189
|
+
for (const segment of relative === "." ? [] : relative.split("/")) {
|
|
190
|
+
current = path.join(current, segment);
|
|
191
|
+
try {
|
|
192
|
+
const entry = fs.lstatSync(current);
|
|
193
|
+
if (entry.isSymbolicLink()) {
|
|
194
|
+
let physical;
|
|
195
|
+
try {
|
|
196
|
+
physical = fs.realpathSync(current);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory contains a dangling or unresolvable symlink.");
|
|
200
|
+
}
|
|
201
|
+
if (!contained(root, physical)) {
|
|
202
|
+
throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory resolves through a symlink outside the workspace.");
|
|
203
|
+
}
|
|
204
|
+
let target;
|
|
205
|
+
try {
|
|
206
|
+
target = fs.statSync(current);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory symlink target cannot be physically verified.");
|
|
210
|
+
}
|
|
211
|
+
if (!target.isDirectory()) {
|
|
212
|
+
throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory must resolve through directories.");
|
|
213
|
+
}
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (!entry.isDirectory()) {
|
|
217
|
+
throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory must resolve through directories.");
|
|
218
|
+
}
|
|
219
|
+
const physical = fs.realpathSync(current);
|
|
220
|
+
if (!contained(root, physical)) {
|
|
221
|
+
throw new WorkflowSourceSemanticError("working-directory-escape", "working-directory resolves through a symlink outside the workspace.");
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (cause) {
|
|
225
|
+
if (cause instanceof WorkflowSourceSemanticError)
|
|
226
|
+
throw cause;
|
|
227
|
+
const code = cause?.code;
|
|
228
|
+
if (code === "ENOENT") {
|
|
229
|
+
// A genuinely absent lexical component is allowed at source time; the
|
|
230
|
+
// runtime dispatch boundary revalidates containment when it appears.
|
|
231
|
+
// `lstat` distinguishes this from a dangling symlink, which fails
|
|
232
|
+
// closed above even before its target can appear.
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
throw new WorkflowSourceSemanticError("working-directory-unverifiable", "working-directory cannot be physically verified.");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function contained(root, candidate) {
|
|
240
|
+
const relative = path.relative(root, candidate);
|
|
241
|
+
return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
|
|
242
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* Workflow source adapters deliberately do not own an executable-ref grammar.
|
|
6
|
+
* `tasks/...` is the one workflow-only target and is recognized by
|
|
7
|
+
* `classifyWorkflowStepUses`; every remaining target delegates here to WP6's
|
|
8
|
+
* canonical task-v3 classifier.
|
|
9
|
+
*/
|
|
10
|
+
import { classifyTaskV3Uses } from "../../tasks/source-v3.js";
|
|
11
|
+
/** Canonical non-task classifier used by direct source-IR decoding. */
|
|
12
|
+
export function classifyWorkflowSourceUses(value) {
|
|
13
|
+
return classifyTaskV3Uses(value);
|
|
14
|
+
}
|
package/docs/README.md
CHANGED
|
@@ -30,6 +30,7 @@ the task needs, and capture what you learn along the way.
|
|
|
30
30
|
- [Environment & Secrets](https://github.com/itlackey/akm/blob/main/docs/reference/env-and-secrets.md) -- `akm env` and `akm secret`: exact operations, file modes, and the security guarantee
|
|
31
31
|
- [Run Workflows](https://github.com/itlackey/akm/blob/main/docs/guides/run-workflows.md) -- Start or continue a run, check on it, resume it, or abandon it
|
|
32
32
|
- [Scheduling](https://github.com/itlackey/akm/blob/main/docs/guides/scheduling.md) -- Run akm tasks through the OS scheduler (cron / launchd / schtasks) safely
|
|
33
|
+
- [Migrate to 0.9.2](migration/v0.9.1-to-v0.9.2.md) -- Convert task-v2 sources safely and understand workflow resume compatibility
|
|
33
34
|
- [Improve the Library](https://github.com/itlackey/akm/blob/main/docs/guides/improve-the-library.md) -- Feedback, history, and proposals -- how evidence turns into reviewable changes
|
|
34
35
|
- Recipes: [Turn a Website into a Searchable Bundle](https://github.com/itlackey/akm/blob/main/docs/guides/recipes/website-source.md), [Headless Install](https://github.com/itlackey/akm/blob/main/docs/guides/recipes/headless-install.md)
|
|
35
36
|
|
|
@@ -55,6 +56,7 @@ Working on akm itself, not just using it.
|
|
|
55
56
|
- [CLI](reference/cli.md) -- All `akm` commands and flags
|
|
56
57
|
- [Configuration](reference/configuration.md) -- Engines, strategies, bundles, and settings
|
|
57
58
|
- [Supported Formats](reference/supported-formats.md) -- Every bundle format akm recognizes, its detection marker, and current read/write support
|
|
59
|
+
- [Tasks](reference/tasks.md) -- Task-v3 files, targets, triggers, and fail-closed migration
|
|
58
60
|
- [Asset Types](https://github.com/itlackey/akm/blob/main/docs/reference/asset-types.md) -- The capability taxonomy, directory conventions, and per-type examples
|
|
59
61
|
- [Refs](https://github.com/itlackey/akm/blob/main/docs/reference/refs.md) -- The ref grammar `akm search` emits and `akm show` consumes
|
|
60
62
|
- [Memory](https://github.com/itlackey/akm/blob/main/docs/reference/memory.md) -- The `memory` asset type: capture, belief states, and derived memories
|
package/docs/migration/README.md
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Upgrade guides and per-release migration notes.
|
|
4
4
|
|
|
5
|
-
- [v0.
|
|
5
|
+
- [v0.9.1 -> v0.9.2 migration guide](v0.9.1-to-v0.9.2.md) -- Task-v2 to task-v3 conversion, the single durable-v4 workflow boundary, and release behavior changes
|
|
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
|
+
- [v0.8 -> current v0.9 migration guide](v0.8-to-v0.9.md) -- Package upgrade with fresh current config/state and explicit task conversion
|
|
6
8
|
- [v0.7 -> v0.8 migration guide](v0.7-to-v0.8.md) -- Task schema and 0.8-era changes
|
|
7
9
|
- [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
|
|
8
10
|
- [Release notes](release-notes/) -- The short per-release notes `akm help migrate <version>` prints (bundled with the npm package)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
Migration notes for akm v0.9.2
|
|
2
|
+
|
|
3
|
+
Exact-prefix additive `state.db` upgrades remain automatic. The released
|
|
4
|
+
historical migration 018 is classified separately because it removes retired
|
|
5
|
+
dead-lane state: ordinary commands stop before it. Run `akm upgrade --force`;
|
|
6
|
+
after executable replacement AKM writes and verifies a sibling
|
|
7
|
+
`state.db.pre-018-drop-dead-lane-schema.<UTC-digits>.<UUID>.bak` snapshot, then
|
|
8
|
+
applies the immutable migration. The exact ledger recheck, snapshot, and 018
|
|
9
|
+
transaction share one SQLite writer-exclusion window. There is no general
|
|
10
|
+
database migration command.
|
|
11
|
+
|
|
12
|
+
A newly created `state.db` still bootstraps automatically, but only when this
|
|
13
|
+
invocation atomically created and retained ownership of that exact inode. An
|
|
14
|
+
already-existing file with no applied migration IDs is not fresh, whether its
|
|
15
|
+
`schema_migrations` table is absent or empty: ordinary commands reject it
|
|
16
|
+
without writing. `akm upgrade --force` first verifies a
|
|
17
|
+
descriptor-bound `state.db.pre-001-initial-schema.<UTC-digits>.<UUID>.bak`
|
|
18
|
+
snapshot. The same writer-exclusion transaction then initializes the ledger and
|
|
19
|
+
applies migrations 001–002, so an old-schema writer cannot commit data between
|
|
20
|
+
the recovery snapshot and migration 002's rebuild. Snapshot readers and targets
|
|
21
|
+
are bound to their held inodes, not swappable pathnames. A failed snapshot path
|
|
22
|
+
is reported and never removed by cleanup code.
|
|
23
|
+
|
|
24
|
+
Task sources now use Task v3. Normal execution rejects task-v2 files; preview
|
|
25
|
+
the repository-wide conversion with `akm migrate apply --dry-run`, review every
|
|
26
|
+
`changed`, `skipped`, or `blocked` result, then run `akm migrate apply`. The
|
|
27
|
+
migrator validates the replacement before it backs up and replaces a source,
|
|
28
|
+
and ambiguous argv arrays remain blocked for manual review.
|
|
29
|
+
|
|
30
|
+
Workflows now accept peer Markdown (`.md`) and GitHub-shaped YAML (`.yml`)
|
|
31
|
+
sources through source IR v1. Runs freeze durable plan v4, the only executable
|
|
32
|
+
plan format. Pre-v4 stored plans are rejected; start a new run from current
|
|
33
|
+
source. A v4 resume does not re-read the authored workflow, configuration, or
|
|
34
|
+
asset index. Scheduled fires are new starts, so they read the current source
|
|
35
|
+
and create a fresh v4 freeze. V4 also rejects `inherit_env`; use exact named
|
|
36
|
+
environment bindings and `pass_env` names instead.
|
|
37
|
+
|
|
38
|
+
`akm command run --dry-run` performs authorization and adapter lowering but
|
|
39
|
+
does not dispatch or materialize credentials. It writes no authored source or
|
|
40
|
+
durable state and records no usage, events, or accounting. Safe provenance and
|
|
41
|
+
lowering notices omit resolved, prompt, command, environment, and credential
|
|
42
|
+
values. `--verbose` writes those safe diagnostics to stderr without changing
|
|
43
|
+
the command result on stdout. `akm health` adds offline
|
|
44
|
+
`selected-model-aliases` and `configured-engines` advisories; their evidence
|
|
45
|
+
does not disclose endpoint values, exact model IDs, credential values, or
|
|
46
|
+
provider output.
|
|
47
|
+
|
|
48
|
+
`improve.strategies.<name>.processes.triage.judgment` now accepts a boolean or
|
|
49
|
+
an object. Set `judgment: false` to disable the tier explicitly. A newly
|
|
50
|
+
authored object defaults to enabled, while unknown object keys are rejected.
|
|
51
|
+
The standalone proposal command's `--judgment` option remains an explicit
|
|
52
|
+
invocation override and does not rewrite strategy configuration.
|
|
53
|
+
|
|
54
|
+
See the [long-form guide](../v0.9.1-to-v0.9.2.md) for complete task examples,
|
|
55
|
+
workflow boundaries, compatibility details, and upgrade checks.
|
|
@@ -5,6 +5,11 @@ focused migration note that `akm help migrate <version>` prints to the
|
|
|
5
5
|
terminal. The longform cross-release guides (e.g. `v0.5-to-v0.6.md`)
|
|
6
6
|
live one level up in `docs/migration/`.
|
|
7
7
|
|
|
8
|
+
## Available notes
|
|
9
|
+
|
|
10
|
+
- [0.9.2](0.9.2.md) — task v3, workflow source IR v1 and durable v4,
|
|
11
|
+
command diagnostics, and strategy judgment migration
|
|
12
|
+
|
|
8
13
|
## Adding notes for a new release
|
|
9
14
|
|
|
10
15
|
1. Create `<version>.md` in this directory (e.g. `0.7.0.md`).
|