akm-cli 0.9.2-alpha.4 → 0.9.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 +493 -0
- package/STABILITY.md +23 -5
- package/dist/assets/hints/cli-hints-full.md +12 -7
- package/dist/assets/tasks/core/extract.yml +3 -5
- package/dist/assets/tasks/core/improve.yml +3 -5
- package/dist/assets/tasks/core/index-refresh.yml +3 -5
- package/dist/assets/tasks/core/sync.yml +3 -5
- package/dist/assets/tasks/core/version-check.yml +3 -5
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +3 -5
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -6
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +3 -5
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +3 -5
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +3 -5
- package/dist/cli/unknown-flags.js +12 -1
- package/dist/cli.js +8 -1
- package/dist/commands/command/command-execution.js +23 -2
- package/dist/commands/health/improve-metrics.js +38 -0
- package/dist/commands/health/windows.js +8 -4
- package/dist/commands/health.js +8 -4
- package/dist/commands/lint/index.js +1 -1
- package/dist/commands/migrate-cli.js +130 -24
- package/dist/commands/proposal/validators/proposal-validators.js +7 -2
- package/dist/commands/tasks/explain.js +304 -0
- package/dist/commands/tasks/tasks-cli.js +185 -3
- package/dist/commands/tasks/tasks.js +265 -52
- package/dist/commands/workflow/plan.js +159 -0
- package/dist/commands/workflow-cli.js +94 -2
- package/dist/core/activation-policy.js +2 -12
- package/dist/core/adapter/adapters/akm-lint.js +7 -4
- package/dist/core/adapter/adapters/akm-metadata.js +26 -14
- package/dist/core/adapter/adapters/akm-task-adapter.js +13 -10
- package/dist/core/errors.js +45 -0
- package/dist/core/json-schema.js +15 -5
- package/dist/core/state/migrations.js +57 -0
- package/dist/core/state-db.js +16 -14
- package/dist/core/subprocess.js +47 -13
- package/dist/execution/guarded-source.js +44 -0
- package/dist/execution/input-contract.js +250 -0
- package/dist/execution/target-ref.js +63 -0
- package/dist/indexer/usage/usage-events.js +14 -3
- package/dist/integrations/agent/execution-lowering.js +12 -1
- package/dist/output/shapes/passthrough.js +2 -0
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -3
- package/dist/output/text/workflow-format.js +192 -10
- package/dist/output/text/workflow.js +2 -1
- package/dist/runtime.js +1 -0
- package/dist/scripts/akm-migrate-node.js +11838 -10118
- package/dist/scripts/akm-migrate.js +11828 -10117
- package/dist/setup/steps/tasks.js +34 -17
- package/dist/storage/repositories/task-history-repository.js +5 -1
- package/dist/storage/repositories/workflow-runs-repository.js +144 -6
- package/dist/tasks/backends/launchd.js +31 -84
- package/dist/tasks/embedded.js +13 -7
- package/dist/tasks/model/invocation.js +4 -0
- package/dist/tasks/prepare/prepare-script-target.js +9 -0
- package/dist/tasks/prepare/prepare-support.js +154 -0
- package/dist/tasks/prepare/prepare.js +117 -0
- package/dist/tasks/prepare/prepared-execution.js +4 -0
- package/dist/tasks/prepare/script-capture.js +80 -0
- package/dist/tasks/run/attempt-lifecycle.js +165 -0
- package/dist/tasks/run/load-task.js +117 -0
- package/dist/tasks/run/provenance.js +20 -0
- package/dist/tasks/run/run-command-task.js +92 -0
- package/dist/tasks/run/run-native-task.js +222 -0
- package/dist/tasks/run/run-task.js +99 -0
- package/dist/tasks/run/run-workflow-task.js +222 -0
- package/dist/tasks/run/task-history.js +134 -0
- package/dist/tasks/run/task-log.js +179 -0
- package/dist/tasks/run/task-result.js +19 -0
- package/dist/tasks/scheduler-binding.js +66 -2
- package/dist/tasks/scheduler-invocation.js +63 -3
- package/dist/tasks/scheduler-sync.js +77 -14
- package/dist/tasks/source/bounded-document.js +455 -0
- package/dist/tasks/source/parse-task-source.js +59 -0
- package/dist/tasks/source/project-v4.js +62 -0
- package/dist/tasks/source/task-input-diagnostics.js +36 -0
- package/dist/tasks/source/task-source-v4.js +626 -0
- package/dist/tasks/source-v3.js +10 -733
- package/dist/tasks/task-run-reserved-flags.js +79 -0
- package/dist/workflows/authoring/authoring.js +17 -8
- package/dist/workflows/exec/child-invocation.js +34 -0
- package/dist/workflows/exec/child-workflow.js +370 -0
- package/dist/workflows/exec/exec-unit.js +50 -170
- package/dist/workflows/exec/frozen-judge.js +19 -2
- package/dist/workflows/exec/native-executor.js +49 -27
- package/dist/workflows/exec/param-secrets.js +12 -0
- package/dist/workflows/exec/run-workflow.js +48 -59
- package/dist/workflows/exec/step-work.js +222 -80
- package/dist/workflows/exec/unit-dispatch.js +72 -0
- package/dist/workflows/freeze/child-output-references.js +94 -0
- package/dist/workflows/freeze/environment.js +174 -0
- package/dist/workflows/freeze/identity.js +22 -0
- package/dist/workflows/freeze/resolve-steps.js +78 -0
- package/dist/workflows/freeze/source-freeze.js +57 -0
- package/dist/workflows/freeze/step-values.js +68 -0
- package/dist/workflows/freeze/targets/child-workflow.js +206 -0
- package/dist/workflows/freeze/targets/command.js +81 -0
- package/dist/workflows/freeze/targets/script.js +57 -0
- package/dist/workflows/freeze/targets/shell.js +31 -0
- package/dist/workflows/freeze/targets/task.js +179 -0
- package/dist/workflows/freeze/task-bindings.js +180 -0
- package/dist/workflows/ir/compile.js +59 -11
- package/dist/workflows/ir/environment-v4.js +3 -3
- package/dist/workflows/ir/freeze-v4.js +41 -7
- package/dist/workflows/ir/params.js +58 -131
- package/dist/workflows/ir/plan-hash.js +3 -3
- package/dist/workflows/ir/schema-v4.js +246 -17
- package/dist/workflows/parser.js +74 -2
- package/dist/workflows/program/schema.js +5 -2
- package/dist/workflows/resource-limits.js +20 -0
- package/dist/workflows/runtime/plan-classifier.js +24 -7
- package/dist/workflows/runtime/run-outputs.js +103 -0
- package/dist/workflows/runtime/runs.js +114 -9
- package/dist/workflows/runtime/workflow-asset-loader.js +14 -6
- package/dist/workflows/source-files.js +5 -5
- package/dist/workflows/source-ir/compare.js +17 -0
- package/dist/workflows/source-ir/compile.js +7 -3
- package/dist/workflows/source-ir/github-yaml.js +64 -17
- package/dist/workflows/source-ir/schema.js +69 -21
- package/dist/workflows/source-ir/semantics.js +7 -25
- package/dist/workflows/source-ir/triggers.js +79 -0
- package/dist/workflows/source-ir/uses.js +33 -7
- package/docs/migration/README.md +1 -1
- package/docs/migration/release-notes/0.9.2.md +87 -11
- package/docs/migration/release-notes/README.md +3 -2
- package/docs/migration/v0.8-to-v0.9.md +13 -11
- package/docs/migration/v0.9.0-troubleshooting.md +20 -13
- package/docs/migration/v0.9.1-to-v0.9.2.md +598 -49
- package/docs/reference/README.md +1 -1
- package/docs/reference/cli.md +140 -46
- package/docs/reference/configuration.md +6 -5
- package/docs/reference/supported-formats.md +9 -5
- package/docs/reference/tasks.md +338 -75
- package/docs/reference/workflow-schema.md +290 -16
- package/docs/reference/workflows.md +57 -7
- package/package.json +1 -1
- package/schemas/akm-task.json +173 -118
- package/schemas/akm-workflow.json +28 -0
- package/dist/tasks/runner.js +0 -941
- package/dist/tasks/runtime-v3.js +0 -281
- package/dist/workflows/ir/source-freeze-v4.js +0 -506
- package/dist/workflows/source-ir/ordering.js +0 -38
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,499 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.9.2] - 2026-08-29
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **A blocked workflow run became permanently unresumable after `akm
|
|
14
|
+
workflow abandon` (#847).** Abandon correctly moved the run to `failed`
|
|
15
|
+
but left its current step `blocked`; the durable-spine validator then
|
|
16
|
+
rejected that honest abandoned shape as corruption before `resume` could
|
|
17
|
+
reopen the step. Failed-run validation now accepts the three legitimate
|
|
18
|
+
current-step states — `pending` for an abandoned active run, `blocked` for
|
|
19
|
+
an abandoned blocked run, and `failed` for an execution failure — and
|
|
20
|
+
`resume` normalizes each back to `pending` as promised by the CLI help.
|
|
21
|
+
|
|
22
|
+
- **`akm task sync` could compute another bundle's real scheduler entries as
|
|
23
|
+
drift and try to remove them (#846).** Removal was scoped by a bundle
|
|
24
|
+
*display name* (`bundleName`/`--bundle` target) — a value derived from a
|
|
25
|
+
directory basename that two unrelated bundles can legitimately share (an
|
|
26
|
+
unconfigured bundle's name is deduped only against its own config's
|
|
27
|
+
bundles, never against other bundles actually installed on the machine).
|
|
28
|
+
A primary/unconfigured-bundle sync now additionally confirms a
|
|
29
|
+
name-matching installed entry's *resolved bundle path*, recovered from
|
|
30
|
+
that entry's own scheduler-context descriptor, before treating it as
|
|
31
|
+
eligible for reconcile — and refuses (rather than assumes) when that path
|
|
32
|
+
can't be established. **Backward compatibility:** every entry installed by
|
|
33
|
+
this codebase already carries a scheduler-context descriptor (the
|
|
34
|
+
`--scheduler-context` file used to restore the scheduled process's
|
|
35
|
+
environment), so existing installations resolve correctly with no user
|
|
36
|
+
action required. An entry whose descriptor is missing, unreadable, or
|
|
37
|
+
owned by a different OS user is never assumed to belong to the invoking
|
|
38
|
+
bundle; such an entry is simply left untouched by sync (it will not be
|
|
39
|
+
auto-repaired or removed) until it is reinstalled or removed by hand.
|
|
40
|
+
|
|
41
|
+
- **Scheduled tasks on Windows ran but recorded no output.** A task fired by
|
|
42
|
+
Task Scheduler logged `exit_code=0` with an empty log: the command really
|
|
43
|
+
ran, but nothing it printed was captured. Captured runs asked for their own
|
|
44
|
+
process group, which is what lets a timeout reap the whole descendant tree
|
|
45
|
+
on macOS/Linux; on Windows that same flag instead means "start with no
|
|
46
|
+
console", and a console host started that way (`powershell.exe`, `cmd.exe`)
|
|
47
|
+
allocates its own console and thereby replaces the pipes it was handed, so
|
|
48
|
+
its output went nowhere. Windows got no reaping benefit in exchange — the
|
|
49
|
+
group kill it enables is a POSIX-only call — so captured Windows runs no
|
|
50
|
+
longer ask for it. A run whose output capture is incomplete for any other
|
|
51
|
+
reason now says so in the task log instead of leaving a silent gap.
|
|
52
|
+
- **A scheduled shell task could fail instantly with exit code 1 on Windows.**
|
|
53
|
+
Two defects on the default Windows task shell (`powershell`): a
|
|
54
|
+
scheduler-fired run restores the PATH captured at install time, which can be
|
|
55
|
+
minimal, and `powershell.exe` is not on it (it lives in a `WindowsPowerShell`
|
|
56
|
+
subdirectory, not `System32`), so the spawn failed outright; and rebinding a
|
|
57
|
+
bare leading `akm` produced a quoted path, which PowerShell parses as a
|
|
58
|
+
string rather than a command to run. Both shells are now resolved to
|
|
59
|
+
absolute paths on Windows, and a rebound invocation carries PowerShell's
|
|
60
|
+
call operator. `cmd`-shell tasks additionally pass their hand-quoted command
|
|
61
|
+
line through verbatim, since `cmd /s /c` does not read a standard argv.
|
|
62
|
+
- **`state.db` could fail to open on macOS** with "this platform has no
|
|
63
|
+
descriptor-backed path." The descriptor-alias optimization used to bind a
|
|
64
|
+
SQLite open to its exact held inode isn't reliably available everywhere —
|
|
65
|
+
Windows never has one, and macOS's `/dev/fd` is a small fixed-size table
|
|
66
|
+
that a process holding higher file-descriptor numbers (as a bundled
|
|
67
|
+
standalone binary routinely does) can miss. The surrounding identity checks
|
|
68
|
+
(dev/ino/uid, re-verified immediately before and after every open) are the
|
|
69
|
+
real protection; a missing alias now falls back to the plain path on any
|
|
70
|
+
platform instead of throwing, matching the fallback Windows already used.
|
|
71
|
+
- The Windows build shipped no embedded template assets, because the
|
|
72
|
+
build-time asset copy anchored its rewrites on forward slashes while the
|
|
73
|
+
glob yields platform-native separators.
|
|
74
|
+
|
|
75
|
+
## [0.9.2-alpha.5] - 2026-08-28
|
|
76
|
+
|
|
77
|
+
### Breaking changes & migration
|
|
78
|
+
|
|
79
|
+
- **Durable workflow plans bump to `irVersion` 5.** A stored run frozen
|
|
80
|
+
before this release (`irVersion` 4 or earlier) can no longer `resume`,
|
|
81
|
+
`next`, `complete`, or `run` — those fail closed with `UsageError` code
|
|
82
|
+
`WORKFLOW_IR_VERSION_UNSUPPORTED`, naming the run and pointing at
|
|
83
|
+
`akm workflow abandon`. `akm workflow status`, `akm workflow list`, and
|
|
84
|
+
`akm workflow abandon` keep working on those runs — no data is lost, and
|
|
85
|
+
their step spine is untouched by abandoning. **Before upgrading**, run
|
|
86
|
+
`akm workflow list --active` and either let in-flight runs finish or
|
|
87
|
+
abandon them; after upgrading, recover a blocked run with
|
|
88
|
+
`akm workflow abandon <id>` followed by `akm workflow run <ref>` to start
|
|
89
|
+
fresh from the current authored source. There is no second executor and no
|
|
90
|
+
compatibility replay layer for a pre-`irVersion`-5 plan. The unit and gate
|
|
91
|
+
input-hash prefixes bump alongside it, from `hashVersion` 5 to
|
|
92
|
+
`hashVersion` 7, so that a freshly frozen plan's units are never
|
|
93
|
+
content-addressed the same way an old, no-longer-executable plan's were.
|
|
94
|
+
(`hashVersion` 6 existed only inside this release's own development and
|
|
95
|
+
never shipped in any version — the durable step a released install sees is
|
|
96
|
+
5 → 7.) The unit preimage also gains one **conditional** field,
|
|
97
|
+
`taskInputs`: the *resolved* values of a task-composing step's input
|
|
98
|
+
bindings, present only for a unit whose frozen target carries
|
|
99
|
+
`inputBindings` — a binding-free unit's preimage keeps exactly the shape it
|
|
100
|
+
had. Hashing the resolved values, not just the frozen binding expression,
|
|
101
|
+
is what makes a resumed run whose upstream step output changed under a
|
|
102
|
+
`{from: "steps.<id>.output"}` binding fail loudly as a replay divergence
|
|
103
|
+
instead of silently reusing the completed unit's stale result.
|
|
104
|
+
See [Migrating from akm 0.9.1 to 0.9.2](docs/migration/v0.9.1-to-v0.9.2.md#workflow-cutover).
|
|
105
|
+
- A workflow step that passes `with:` to a `tasks/<ref>` target whose task
|
|
106
|
+
declares **no** `inputs:` (a `version: 4` task with no `inputs:` key at
|
|
107
|
+
all) is now **rejected** (`UsageError` code
|
|
108
|
+
`COMPOSITION_INVALID`, exit 2) instead of having the authored mapping
|
|
109
|
+
silently dropped at freeze — for any authored shape, including `with: {}`.
|
|
110
|
+
When the target's task source **does** declare `inputs:`, `with:` now
|
|
111
|
+
**binds** them instead: a literal value, or a `{from: "steps.<id>.output…"}`
|
|
112
|
+
reference resolved just before the unit dispatches (the reference grammar
|
|
113
|
+
also accepts `{from: "params.<name>"}`, but a composing step's own
|
|
114
|
+
document can never declare `params:`, so that form is not reachable in
|
|
115
|
+
this release). See [Task input bindings](docs/reference/tasks.md#typed-inputs-and-output)
|
|
116
|
+
for the full grammar. `with:` on `uses: akm/command` is unaffected — it is
|
|
117
|
+
still that builtin's own action-argument bag, never an input binding.
|
|
118
|
+
- **New rejection:** `with:` on a workflow step targeting `uses:
|
|
119
|
+
commands/<ref>` or `uses: scripts/<ref>` is now **rejected**
|
|
120
|
+
(`COMPOSITION_INVALID`, exit 2) instead of being silently discarded at
|
|
121
|
+
freeze — neither target is a binding surface. Remove the `with:` block from
|
|
122
|
+
any such step; a command/script-composing step never accepted its values
|
|
123
|
+
in the first place, so this closes a defect rather than a feature.
|
|
124
|
+
- Composing a task source v4 document from a workflow step's `uses:
|
|
125
|
+
tasks/<ref>`, where the task's own target is a workflow, is no longer
|
|
126
|
+
deferred: it now **freezes and dispatches** normally, the same as a
|
|
127
|
+
direct `uses: workflows/<ref>` step. The prior release's
|
|
128
|
+
`TASK_SOURCE_INVALID` "arrives in a later 0.9.x release" rejection for this
|
|
129
|
+
case is gone.
|
|
130
|
+
- Task-source validation errors raised through the shared `sourceError`
|
|
131
|
+
funnel (field- and semantic-level checks: missing/invalid fields, schedule
|
|
132
|
+
conflicts, and similar) now report code **`TASK_SOURCE_INVALID`** instead of
|
|
133
|
+
`INVALID_FLAG_VALUE`. YAML syntax, size, structure, and expansion failures
|
|
134
|
+
(malformed YAML, oversized source, unsupported YAML constructs, and
|
|
135
|
+
alias/tag/depth/node-count limits) are raised earlier, before that funnel is
|
|
136
|
+
reached — early in this release these still reported `INVALID_FLAG_VALUE`,
|
|
137
|
+
but by 0.9.2's release they report `TASK_SOURCE_INVALID` too (the terminal
|
|
138
|
+
diagnostics ratchet, see the Changed entry below): task-source failures no
|
|
139
|
+
longer split across two codes, so **scripts that were branching on both
|
|
140
|
+
`TASK_SOURCE_INVALID` and `INVALID_FLAG_VALUE` for a task-source error can
|
|
141
|
+
drop the `INVALID_FLAG_VALUE` arm**. Every such error's message prefix is
|
|
142
|
+
`Invalid task source at <path>[:<line>]: …` — not `Invalid task v3 source`,
|
|
143
|
+
since the label no longer names a specific schema generation (task source
|
|
144
|
+
v4 is the only version `src/` accepts by release; see the "Task v3 sources
|
|
145
|
+
no longer parse" entry below). The envelope's `error` message text and exit
|
|
146
|
+
code 2 are unchanged for every task-source error. The envelope's `hint`
|
|
147
|
+
field and the `detail` text `akm lint` and the akm-task adapter report for
|
|
148
|
+
the same failure change from `… Run \`akm <command> --help\` to see
|
|
149
|
+
accepted values.` to `… Fix the task source at the reported path and line,
|
|
150
|
+
then re-run.`
|
|
151
|
+
- **Task-history / JSON-output `target.kind` vocabulary changed.** A prepared
|
|
152
|
+
command (agent/LLM) run now reports `"command"` (formerly the confusingly
|
|
153
|
+
inverted `"prompt"`); the former shared `"command"` string for the native
|
|
154
|
+
arm splits into `"shell"` and `"script"`, now distinguishable in history;
|
|
155
|
+
`"workflow"` and `"unknown"` are unchanged. **Consumers branching on
|
|
156
|
+
`"prompt"` must handle `"command"`** — this affects `akm task run`'s and
|
|
157
|
+
`akm task history`'s JSON output (`result.target.kind` /
|
|
158
|
+
`rows[].target.kind`) and any code reading `task_history.target_kind`
|
|
159
|
+
directly. Rows written by earlier akm versions are read back **mapped** to
|
|
160
|
+
the new vocabulary (legacy `"prompt"` → `{kind:"command", engine}`, legacy
|
|
161
|
+
`"command"` → `{kind:"shell"}`), so `akm task history` output stays uniform
|
|
162
|
+
across vintages. New rows carry a `targetVocab: 2` marker inside their
|
|
163
|
+
`metadata_json`, which akm versions before this one reject as an unknown
|
|
164
|
+
metadata field — a mixed-version fleet must upgrade every `akm` that writes
|
|
165
|
+
task history before an older one reads it.
|
|
166
|
+
- **Task source v4 (`version: 4`) is the task source grammar.** By 0.9.2's
|
|
167
|
+
release, `version: 4` is the *only* version `src/` accepts — see the
|
|
168
|
+
"Task v3 sources no longer parse" entry below for the cutover, the
|
|
169
|
+
`TASK_SCHEMA_VERSION_UNSUPPORTED` rejection, and the migration path. What
|
|
170
|
+
follows describes the v4 grammar itself. Scheduling is **optional**: a
|
|
171
|
+
task source v4 document with no `schedule:` parses, is runnable with
|
|
172
|
+
`akm task run`, and is **skipped** by `akm task sync` (zero bindings, zero
|
|
173
|
+
failures) instead of being rejected for missing a trigger — this is now
|
|
174
|
+
the *only* scheduling grammar; the second syntax task v3 offered
|
|
175
|
+
(`akm.schedule` / a document's top-level `on:`) is retired along with v3
|
|
176
|
+
itself. Task source v4 removes the `akm:` options bag and the `on:`
|
|
177
|
+
trigger block outright;
|
|
178
|
+
every field they carried is a top-level key instead: `akm.description` →
|
|
179
|
+
`description`, `akm.when_to_use` → `when_to_use`, `akm.tags` → `tags`,
|
|
180
|
+
`akm.agent` → `agent`, `akm.engine` → `engine`, `akm.model` → `model`,
|
|
181
|
+
`akm.inference` → `inference`, `akm.outputSchema` → `output`,
|
|
182
|
+
`akm.tools` → `tools`, `akm.timeout` → `timeout`, `akm.redact` →
|
|
183
|
+
`redact`, `akm.maxSteps` → `maxSteps`, `akm.maxRetries` → `maxRetries`,
|
|
184
|
+
`akm.schedule` → top-level `schedule:`, and `akm.enabled` → each
|
|
185
|
+
`schedule:` entry's own `enabled` (v3's single document-level flag
|
|
186
|
+
becomes per-binding in task source v4, defaulting to `true`; the
|
|
187
|
+
document-level `enabled` skip that read it is gone with v3, since a v4
|
|
188
|
+
document has no document-level `enabled` key to read). The GitHub-action
|
|
189
|
+
`uses:` target (`owner/repo@ref`) is removed outright — see the "GitHub
|
|
190
|
+
Action locators are no longer recognized anywhere" entry below.
|
|
191
|
+
`with:` is legal in task source v4 only alongside
|
|
192
|
+
`uses: akm/command`; every other target uses the new typed `inputs:`
|
|
193
|
+
declarations instead of `with:`. A declared `inputs:` name may not collide
|
|
194
|
+
with a flag `akm task run` already declares for itself (`bundle`, `format`,
|
|
195
|
+
`detail`, `shape`, `output`, `scheduled`, `quiet`, `verbose`, `help`,
|
|
196
|
+
`no-quiet`, `no-verbose`) or with `target`, the spelling `akm task`
|
|
197
|
+
retired in 0.9 and still answers with a rename hint in every spelling —
|
|
198
|
+
such a document now fails `TASK_SOURCE_INVALID` at parse time, since the
|
|
199
|
+
colliding name would otherwise route a caller's value into `akm task run`'s
|
|
200
|
+
own flag, or into that rename hint, instead of the declared input. `akm
|
|
201
|
+
task run <id>` now accepts exact-name input flags for a task source v4
|
|
202
|
+
document's declared `inputs:` (an undeclared flag name fails
|
|
203
|
+
`UNKNOWN_FLAG`; a bad value or an unsatisfied `required: true` declaration
|
|
204
|
+
fails `INPUT_BINDING_INVALID`; both exit 2 with the usual JSON error
|
|
205
|
+
envelope).
|
|
206
|
+
Where those materialized values go depends on the task's own target: for
|
|
207
|
+
`uses: workflows/<ref>` they become the child run's params (the existing
|
|
208
|
+
`with:` → params path); for a `run:`, `scripts/<ref>`, or `commands/<ref>`
|
|
209
|
+
target they are validated and then **discarded** — `akm task run`'s own
|
|
210
|
+
flags never populate an `AKM_TASK_INPUTS` environment variable or a
|
|
211
|
+
`## Task inputs` prompt block. Those two surfaces are a separate delivery
|
|
212
|
+
path: they carry a **workflow step's** `with:` binding into a task it
|
|
213
|
+
composes via `uses: tasks/<ref>` (see the `with:`-binding bullet above),
|
|
214
|
+
not `akm task run`'s own CLI flags. `schedule[].inputs` on a `version: 4`
|
|
215
|
+
task source are compiled the same way `akm task run`'s flags are: `akm
|
|
216
|
+
task sync` builds them into the scheduler binding's own invocation tail
|
|
217
|
+
instead of only validating and discarding them, so a scheduled run is
|
|
218
|
+
subject to the identical workflow-target-only delivery rule. `akm task
|
|
219
|
+
add` now authors task source v4 (see the "Task v3 sources no longer
|
|
220
|
+
parse" entry below for the `--params` → typed `inputs:` change). A
|
|
221
|
+
`version: 4` task source is now a valid workflow-step target (see above).
|
|
222
|
+
The published [task schema](schemas/akm-task.json) now publishes only the
|
|
223
|
+
single `version: 4` shape — the `version: 3` arm and its `githubActionRef`
|
|
224
|
+
definition are removed; a `version: 2` or `version: 3` document validates
|
|
225
|
+
against nothing in this schema and is converted by `akm migrate apply`
|
|
226
|
+
instead. **Binding a task's inputs adds nothing to the hash preimage of a
|
|
227
|
+
step that binds none**: a unit whose frozen target carries no
|
|
228
|
+
`inputBindings` has exactly the preimage *shape* it had before this
|
|
229
|
+
feature — no `taskInputs` key at all. Its hash *value* still moves, because
|
|
230
|
+
every unit and gate hash in this release re-versions once (`hashVersion`
|
|
231
|
+
5 → 7, see the `irVersion` 5 entry above), and no pre-`irVersion`-5 plan can
|
|
232
|
+
execute here to be compared against.
|
|
233
|
+
- **A task's `output:` is legal only with a command target.** `output:`
|
|
234
|
+
alongside `run:`, `uses: scripts/<ref>`, or `uses: workflows/<ref>` now
|
|
235
|
+
fails `TASK_SOURCE_INVALID` (exit 2) at parse instead of being accepted and
|
|
236
|
+
never enforced: those runtimes decide success from the process exit code or
|
|
237
|
+
from a child run's own status and consume no task-level response schema, so
|
|
238
|
+
an authored contract there was silently unenforced. `uses: commands/<ref>`
|
|
239
|
+
and `uses: akm/command` — the targets that forward it as the model's
|
|
240
|
+
response schema — are unchanged. The published
|
|
241
|
+
[task schema](schemas/akm-task.json) enforces the same rule, so an editor
|
|
242
|
+
validating against it no longer green-lights a document `akm task run`
|
|
243
|
+
refuses to load. Migration handles this for you: `akm migrate apply` drops
|
|
244
|
+
an `akm.outputSchema` that sat on one of those three targets (it was inert
|
|
245
|
+
in v3 as well — nothing ever read it there) and reports the drop as a
|
|
246
|
+
notice on that file's plan entry rather than blocking the file.
|
|
247
|
+
- **A `schedule:` entry must be able to satisfy the task's declared
|
|
248
|
+
`inputs:`.** A scheduled firing supplies no input flags, so a task
|
|
249
|
+
declaring a `required: true` input — which may not also carry a
|
|
250
|
+
`default:` — and a `schedule:` entry that names no value for it could only
|
|
251
|
+
ever install a binding that fails at every firing. Such a document now
|
|
252
|
+
fails `TASK_SOURCE_INVALID` (exit 2) at parse, naming the unsatisfied
|
|
253
|
+
input, instead of syncing cleanly and failing once per fire. This covers
|
|
254
|
+
every entry shape: the `schedule: "<cron>"` string shorthand and a list
|
|
255
|
+
entry with no `inputs:` key are held to the same contract as one that
|
|
256
|
+
authors `inputs:`. Give the entry an `inputs:` value for each named input,
|
|
257
|
+
or declare a `default:` on the input instead. Manual-only tasks are
|
|
258
|
+
unaffected — a `required: true` input with no `schedule:` is still valid
|
|
259
|
+
and is supplied per run with `akm task run <id> --<name> <value>`.
|
|
260
|
+
- **`akm workflow create --json` renames its `stashDir` envelope field to
|
|
261
|
+
`bundleDir`.** The success envelope now reads
|
|
262
|
+
`{ok, ref, path, bundleDir}`; the value (the owning bundle's directory) is
|
|
263
|
+
unchanged. Scripts reading `stashDir` off `akm workflow create --json`
|
|
264
|
+
must read `bundleDir`. This was the last `stash`-vocabulary field on a
|
|
265
|
+
0.9.2 command envelope; the indexer's internal `IndexOptions.stashDir` is
|
|
266
|
+
not a CLI surface and is unchanged.
|
|
267
|
+
- **Task v3 sources no longer parse.** A task document with `version: 3`
|
|
268
|
+
(or `version: 2`) fails with `UsageError` code
|
|
269
|
+
`TASK_SCHEMA_VERSION_UNSUPPORTED` (exit 2) instead of executing — the v3
|
|
270
|
+
parser is gone from `src/`; it survives only vendored inside the
|
|
271
|
+
`akm-migrate` executable, which is how the migrator still reads what it
|
|
272
|
+
converts. Run `akm migrate apply --dry-run`, review every `changed` /
|
|
273
|
+
`skipped` / `blocked` result, then `akm migrate apply` — the command now
|
|
274
|
+
runs **both** generations in one pass: task-v2 → task-v3, then
|
|
275
|
+
task-v3 → task source v4, against the same tree. `akm task add` authors
|
|
276
|
+
task source v4 directly; a task's `--params` becomes typed `inputs:` with
|
|
277
|
+
defaults instead of a `with:` bag. A task's enabled state is now per
|
|
278
|
+
schedule binding (`schedule[].enabled`) rather than a document-level
|
|
279
|
+
`akm.enabled` flag — `akm task add --disabled` writes
|
|
280
|
+
`schedule: [{cron: …, enabled: false}]` instead of a document-level
|
|
281
|
+
`akm.enabled: false`. See
|
|
282
|
+
[Migrating task v3 to task source v4](docs/migration/v0.9.1-to-v0.9.2.md#migrating-task-v3-to-task-source-v4).
|
|
283
|
+
- **GitHub Action locators are no longer recognized anywhere.** A task's
|
|
284
|
+
`uses: owner/repo[/path]@rev` is now a source error at parse
|
|
285
|
+
(`TASK_SOURCE_INVALID`); a workflow step's `uses: owner/repo[/path]@rev`
|
|
286
|
+
now fails with reason `unsupported-uses-target` instead of
|
|
287
|
+
`remote-action-acquisition-out-of-scope`. Nothing acquired or executed a
|
|
288
|
+
remote action in any akm release — this deletes the *recognition* of the
|
|
289
|
+
shape, not a capability that ever worked. The migrator still names the
|
|
290
|
+
target explicitly when it blocks a file
|
|
291
|
+
(`github-action-target-removed`).
|
|
292
|
+
- **Multi-job YAML is rejected at the adapter boundary.** A GitHub-shaped
|
|
293
|
+
workflow document whose `jobs:` map does not contain exactly one job now
|
|
294
|
+
fails at the source adapter with reason `multi-job-unsupported`, surfaced
|
|
295
|
+
from `akm workflow run` (and `akm workflow plan`) as `UsageError` code
|
|
296
|
+
`COMPOSITION_INVALID` (exit 2). Previously such a document parsed and
|
|
297
|
+
ordered its jobs cleanly and was refused only later, in two different
|
|
298
|
+
places, with two different shapes (one thrown error, one `ok: false`
|
|
299
|
+
compile result). Split a multi-job document into separate single-job
|
|
300
|
+
workflows and compose them with a child-workflow step
|
|
301
|
+
(`uses: workflows/<ref>`). Every other workflow-source compile failure now
|
|
302
|
+
reports `UsageError` code `WORKFLOW_SOURCE_INVALID` rather than
|
|
303
|
+
`INVALID_FLAG_VALUE`.
|
|
304
|
+
- **The second task scheduling syntax is removed.** `akm.schedule` and a
|
|
305
|
+
task document's top-level `on:` are gone along with task v3 (see "Task v3
|
|
306
|
+
sources no longer parse" above); task source v4's optional top-level
|
|
307
|
+
`schedule:` is the one canonical scheduling form, and a task with no
|
|
308
|
+
`schedule:` is manual-only and fully composable as a workflow-step
|
|
309
|
+
target.
|
|
310
|
+
|
|
311
|
+
### Changed
|
|
312
|
+
|
|
313
|
+
- **`INVALID_FLAG_VALUE` is now rare in task or workflow domain failures,
|
|
314
|
+
with two named exceptions.** Every task-source, workflow-source,
|
|
315
|
+
target-classification, and composition failure now reports a
|
|
316
|
+
phase-specific code — `TASK_SOURCE_INVALID`, `TARGET_REF_INVALID`,
|
|
317
|
+
`COMPOSITION_INVALID`, `WORKFLOW_SOURCE_INVALID`, `INPUT_BINDING_INVALID`,
|
|
318
|
+
`TASK_SCHEMA_VERSION_UNSUPPORTED`, or `TASK_TARGET_UNSUPPORTED` — **except**
|
|
319
|
+
a task's workflow-target `env:` composition rejection (a `uses:
|
|
320
|
+
workflows/<ref>` task that also authors `env:`) and a workflow child-ref
|
|
321
|
+
asset-resolution failure (`Workflow source target <ref> was not found.`),
|
|
322
|
+
both deliberately preserved as `INVALID_FLAG_VALUE` so an existing pinned
|
|
323
|
+
test's code and message stay byte-unchanged. The remaining
|
|
324
|
+
`INVALID_FLAG_VALUE` sites in the task/workflow domains (38 total, across
|
|
325
|
+
`src/tasks/**` and `src/workflows/**`) are these two preserved exceptions
|
|
326
|
+
plus scalar CLI-argument parsing (a cron expression, a task id, a workflow
|
|
327
|
+
parameter flag) and one code-allowlist membership entry — genuine
|
|
328
|
+
flag-value validation or a pinned exception, not a re-codable
|
|
329
|
+
task/workflow source or composition failure. **Scripts branching on
|
|
330
|
+
`code` for a task/workflow domain error should switch on the specific
|
|
331
|
+
code above rather than assuming `INVALID_FLAG_VALUE` — except for the two
|
|
332
|
+
named exceptions, which still report `INVALID_FLAG_VALUE`.** Exit codes
|
|
333
|
+
are unchanged (2 for every one of these).
|
|
334
|
+
- **A typed task-input or workflow-param flag no longer echoes the supplied
|
|
335
|
+
value in a validation error.** `akm task run <ref> --<input> <value>`
|
|
336
|
+
against a `type:`-declared input used to report
|
|
337
|
+
`must be <types>; received "<value>"` on a coercion failure, and a value
|
|
338
|
+
that failed its declared `enum:`/`minimum:`/`maximum:` constraint reported
|
|
339
|
+
the value in that message too — both are closed now, since a typed flag
|
|
340
|
+
can carry a credential and this detail lands in stderr envelopes that get
|
|
341
|
+
pasted into CI logs and issue reports. The declared constraint (the
|
|
342
|
+
allowed list or the bound) is still named, since it comes from the
|
|
343
|
+
author's own schema rather than the caller's data. Error and exit codes
|
|
344
|
+
are unchanged.
|
|
345
|
+
|
|
346
|
+
### Added
|
|
347
|
+
|
|
348
|
+
- **Child workflows.** A workflow step can now compose another workflow —
|
|
349
|
+
directly (`uses: workflows/<ref>`) or through a task source v4 document
|
|
350
|
+
whose own target is a workflow (`uses: tasks/<ref>`) — instead of
|
|
351
|
+
failing to freeze. `with:` on the composing step binds the child's
|
|
352
|
+
declared `params:`. Composition is bounded: depth (8 levels), a
|
|
353
|
+
composition cycle, and aggregate embedded plan bytes (1 MiB total across
|
|
354
|
+
one root freeze) are all checked at **freeze**, before the parent run is
|
|
355
|
+
published, and fail with `UsageError` code `COMPOSITION_INVALID`. The
|
|
356
|
+
child workflow is compiled, validated, and frozen **completely** — its own
|
|
357
|
+
complete plan embedded inside the parent's — before the parent run exists,
|
|
358
|
+
so editing the child's source afterward cannot affect an already-frozen
|
|
359
|
+
parent, and the child's transitive sources join the parent's guarded
|
|
360
|
+
source read set. A composing step's own `env:` is rejected at freeze
|
|
361
|
+
(`UsageError` code `COMPOSITION_INVALID`) rather than silently dropped —
|
|
362
|
+
a child run carries its own frozen environment inside its own plan, so a
|
|
363
|
+
parent-level `env:` on the composing step has nothing to apply to.
|
|
364
|
+
Running a step that composes a child workflow now drives
|
|
365
|
+
the child to completion — see **Child workflows now execute** and
|
|
366
|
+
**Workflow `outputs:`** below. (Correction: an earlier development
|
|
367
|
+
increment of this same 0.9.2 release briefly made an unexecuted composing
|
|
368
|
+
step fail closed with `UsageError` code
|
|
369
|
+
`WORKFLOW_CHILD_EXECUTION_UNSUPPORTED`. That code never reached a release
|
|
370
|
+
and is gone from the shipped 0.9.2 — it is listed here only because a
|
|
371
|
+
0.9.2 pre-release snapshot may otherwise be the sole place it was seen.)
|
|
372
|
+
See
|
|
373
|
+
[Workflow Schema: Child workflows](docs/reference/workflow-schema.md#child-workflows).
|
|
374
|
+
- **Child workflows now execute.** Running a step whose target is a child
|
|
375
|
+
workflow drives that child inline, in the parent's own process, with the
|
|
376
|
+
same engine `akm workflow run` uses — publication is idempotent, so a
|
|
377
|
+
retried or resumed composing step reuses the same child rather than
|
|
378
|
+
starting a new one. The child's final status maps onto the composing
|
|
379
|
+
step and the parent run: `completed` promotes the child's exported result
|
|
380
|
+
as the step's output and the parent continues; `failed` fails the step
|
|
381
|
+
and the run; `blocked` blocks the step and the run, with recovery notes
|
|
382
|
+
naming the exact sequence — `akm workflow resume <childRunId>`, then
|
|
383
|
+
`akm workflow resume <parentRunId>` and `akm workflow run <parentRunId>`.
|
|
384
|
+
`akm workflow status` on a run that composes children now renders a
|
|
385
|
+
`children:` tree; `akm workflow list` excludes child runs by default
|
|
386
|
+
(`--children` includes them), and a child run id always works directly
|
|
387
|
+
with `status`/`resume`/`abandon`/`run`. See
|
|
388
|
+
[Workflow Schema: Child execution](docs/reference/workflow-schema.md#child-execution)
|
|
389
|
+
and [Running Workflows: Child runs](https://github.com/itlackey/akm/blob/main/docs/guides/run-workflows.md#child-runs).
|
|
390
|
+
- **Workflow `outputs:`.** A workflow may declare a run-level export in its
|
|
391
|
+
Markdown frontmatter — `outputs: {<name>: {from: steps.<id>.output(.<seg>)*,
|
|
392
|
+
schema?}}`, up to 64 entries — resolved once, from persisted step
|
|
393
|
+
evidence, at run completion. An unresolvable reference, a truncated
|
|
394
|
+
step artifact, or a schema violation rolls the completion back
|
|
395
|
+
(`UsageError` code `WORKFLOW_OUTPUT_INVALID`): the run stays `active` and
|
|
396
|
+
its final step stays `pending` rather than completing with missing
|
|
397
|
+
exports. A run with no `outputs:` declaration exports `{runId, status}`
|
|
398
|
+
instead. This is a Markdown-frontmatter-only key — a GitHub-shaped
|
|
399
|
+
workflow's closed root key set has no extension surface for it, the same
|
|
400
|
+
reason it cannot declare `params:` either. See
|
|
401
|
+
[Workflow Schema: Workflow outputs](docs/reference/workflow-schema.md#workflow-outputs).
|
|
402
|
+
- **`akm workflow plan <ref>`** (Evolving) — compiles, resolves, and freezes
|
|
403
|
+
a workflow exactly as starting a run would, then stops: zero durable
|
|
404
|
+
writes, no published run, no event, no lease. Prints the canonical step
|
|
405
|
+
graph, per-step frozen target kinds, task/child expansion, input
|
|
406
|
+
bindings, the source read set, and freeze-time lowering notices —
|
|
407
|
+
secret-free by construction (no resolved reference value, request
|
|
408
|
+
content, script bytes, or credential is ever printed). Defaults to a
|
|
409
|
+
human-readable summary; `--format json` returns the full envelope. See
|
|
410
|
+
[CLI reference: workflow plan](docs/reference/cli.md#workflow-plan).
|
|
411
|
+
- **`akm task explain <ref> [input flags]`** — read-only task introspection.
|
|
412
|
+
Prints the task's source path and version, its declared `inputs:` (with
|
|
413
|
+
defaults — a secret-shaped default prints as `<redacted>`), the supplied
|
|
414
|
+
values with provenance (`default` | `flag` | `schedule-binding`, likewise
|
|
415
|
+
redacted when secret-shaped), the resolved target kind/ref, effective
|
|
416
|
+
execution settings with field-level provenance, and schedule bindings.
|
|
417
|
+
Never spawns anything, writes history, or touches the scheduler; never
|
|
418
|
+
prints an `env:` value, a credential, a prompt body, a `run:` string, or
|
|
419
|
+
`with.content`. It accepts the task's own declared input flags and nothing
|
|
420
|
+
else: `--scheduled` — which `explain` neither declares nor implements —
|
|
421
|
+
fails `UNKNOWN_FLAG` (exit 2) rather than being silently discarded, in
|
|
422
|
+
every spelling (`--scheduled`, `--scheduled=false`, …). See
|
|
423
|
+
[CLI reference: task](docs/reference/cli.md#task).
|
|
424
|
+
- **`AKM_TASK_INPUTS`** — the exec-context environment variable a
|
|
425
|
+
task-composed step's shell/script target receives: canonical JSON of its
|
|
426
|
+
resolved, schema-validated `inputs:` bindings. Present only when the
|
|
427
|
+
bindings are non-empty; subject to the same per-platform size ceiling as
|
|
428
|
+
`AKM_INPUTS` / `AKM_PARAMS`. See
|
|
429
|
+
[Context reaching the command](docs/reference/workflow-schema.md#context-reaching-the-command).
|
|
430
|
+
- **A v3 → task source v4 migrator**: the separate `akm-migrate` executable
|
|
431
|
+
(installed alongside `akm`) gains `task-v4-status` / `task-v4-apply
|
|
432
|
+
[--dry-run]`, a second, independent generation of the same dry-run-first,
|
|
433
|
+
`changed | skipped | blocked` migration planner — options bag flattened to
|
|
434
|
+
top-level keys. A `with:` authored on any target other than
|
|
435
|
+
`uses: akm/command` is `blocked` for manual review, alongside a
|
|
436
|
+
github-action-targeted `uses:` (blocked reason
|
|
437
|
+
`github-action-target-removed`) and anything else ambiguous: the migrator
|
|
438
|
+
translates structure, never intent, so `inputs:` is never invented on a
|
|
439
|
+
file's behalf — declaring it is an authoring decision left to the person
|
|
440
|
+
editing the migrated file. Nothing is overwritten without a backup. A
|
|
441
|
+
`changed` file can carry an informational **notice** for a translation that
|
|
442
|
+
is faithful but not one-to-one — a manual-dispatch-only trigger that v4
|
|
443
|
+
expresses as "no `schedule:`", and an `akm.outputSchema` dropped because v4
|
|
444
|
+
accepts `output:` only with a command target — so read the notices on a
|
|
445
|
+
dry-run plan, not just the outcomes. A v3 document that was never valid in
|
|
446
|
+
the first place (an empty `on:`, or a `workflow_dispatch:` carrying
|
|
447
|
+
`inputs:`) is `blocked` as `invalid-v3-task` rather than being converted
|
|
448
|
+
into runnable v4 bytes. By
|
|
449
|
+
0.9.2's release this generation runs automatically as the second half of
|
|
450
|
+
`akm migrate status` / `akm migrate apply [--dry-run]` (see "Task v3
|
|
451
|
+
sources no longer parse" above) — `task-v4-status`/`task-v4-apply` remain
|
|
452
|
+
as the standalone, single-generation entry points the frozen migrator
|
|
453
|
+
always exposes. See the
|
|
454
|
+
[0.9.1 to 0.9.2 migration guide](docs/migration/v0.9.1-to-v0.9.2.md#migrating-task-v3-to-task-source-v4).
|
|
455
|
+
|
|
456
|
+
### Fixed
|
|
457
|
+
|
|
458
|
+
- **A flag value for a parameter or input declaring both `array` and a
|
|
459
|
+
scalar type is no longer forced into an array.** `akm workflow run <ref>
|
|
460
|
+
--<param> <value>` (and, new in this release, `akm task run <id>
|
|
461
|
+
--<input> <value>`) unconditionally grouped a supplied value into an array
|
|
462
|
+
whenever the declaration mentioned `array` at all, so
|
|
463
|
+
`type: ["array", "string"]` with `--x hello` delivered `["hello"]` instead
|
|
464
|
+
of the permitted string, and `type: ["array", "null"]` could never produce
|
|
465
|
+
`null` — silently, since the altered value still satisfied the array
|
|
466
|
+
branch. A single, non-bracketed value now tries the union's scalar
|
|
467
|
+
alternatives first. An `array`-only declaration, the JSON-array shorthand
|
|
468
|
+
(`--x '["a","b"]'`), and grouping a repeated flag are all unchanged.
|
|
469
|
+
- **`akm task <subcommand> --target=<value>` now answers with the 0.9 rename
|
|
470
|
+
hint instead of ignoring the flag.** The retired-spelling check compared
|
|
471
|
+
whole argv tokens, so it caught a bare `--target` but not `--target=team`;
|
|
472
|
+
because `target` is exempt from the generic unknown-flag gate on `task`
|
|
473
|
+
subcommands precisely so that check can answer, the `=`-spelling was
|
|
474
|
+
rejected by nothing at all and the bundle the caller named was silently
|
|
475
|
+
dropped. It now fails with `UsageError` code `INVALID_FLAG_VALUE` (exit 2)
|
|
476
|
+
naming `--bundle`, in every spelling.
|
|
477
|
+
- **The embedded `akm` hint sheet no longer teaches a task format this
|
|
478
|
+
release rejects.** Its "Scheduled Tasks" section still told readers to
|
|
479
|
+
author `version: 3` with `akm.enabled` and `akm.timeout`; it now describes
|
|
480
|
+
task source v4 (`version: 4`, per-entry `schedule[].enabled`, top-level
|
|
481
|
+
`timeout`, typed `inputs:`/`output:`) and points at `akm migrate apply`.
|
|
482
|
+
The `stash`-terminology doc lint now scans the shipped hint assets too, so
|
|
483
|
+
the embedded help cannot drift out of the active-docs vocabulary again.
|
|
484
|
+
- **The macOS native scheduler backend no longer refuses a real
|
|
485
|
+
`launchctl` inventory.** Its loaded-service reader enforced a narrow,
|
|
486
|
+
hand-written grammar over `launchctl print`'s full output and rejected
|
|
487
|
+
the entire read — surfacing as `INVALID_CONFIG_FILE` from every akm
|
|
488
|
+
scheduler command — the moment any line fell outside it, which real
|
|
489
|
+
`launchctl` output on a real Mac routinely does. It now scans for akm's
|
|
490
|
+
own `com.akm.task.*` labels and ignores everything else, which is what
|
|
491
|
+
every caller actually needed. Caught by the gated native-scheduler
|
|
492
|
+
suite's first run against macOS.
|
|
493
|
+
- **The Windows-built package no longer ships without its embedded
|
|
494
|
+
template assets.** The build's asset-copy step matched paths against a
|
|
495
|
+
forward-slash pattern, but path separators on Windows are backslashes,
|
|
496
|
+
so the match silently failed and `dist/assets/` was never populated —
|
|
497
|
+
the packaged npm tarball built on Windows carried no templates at all,
|
|
498
|
+
and any command rendering one (for example `akm health --format html`)
|
|
499
|
+
crashed with `ERR_MODULE_NOT_FOUND`. Also caught by the gated
|
|
500
|
+
native-scheduler suite's first run, this time against Windows.
|
|
501
|
+
|
|
9
502
|
## [0.9.2-alpha.4] - 2026-08-26
|
|
10
503
|
|
|
11
504
|
### Added
|
package/STABILITY.md
CHANGED
|
@@ -58,6 +58,7 @@ enumeration of the whole `proposal` noun group.
|
|
|
58
58
|
| `akm curate` | Stable | |
|
|
59
59
|
| `akm show` | Stable | |
|
|
60
60
|
| `akm workflow status` | Stable | |
|
|
61
|
+
| `akm workflow plan` | Evolving | New in 0.9.2; secret-free provenance output; envelope shape may change. |
|
|
61
62
|
| `akm workflow list` | Stable | |
|
|
62
63
|
| `akm workflow create` | Stable | |
|
|
63
64
|
| `akm workflow resume` | Stable | |
|
|
@@ -110,6 +111,7 @@ enumeration of the whole `proposal` noun group.
|
|
|
110
111
|
| `akm task history` | Evolving | |
|
|
111
112
|
| `akm task sync` | Evolving | |
|
|
112
113
|
| `akm task doctor` | Evolving | |
|
|
114
|
+
| `akm task explain` | Evolving | New in 0.9.2; secret-shaped values in provenance output are redacted on a best-effort heuristic basis (not a guarantee). |
|
|
113
115
|
|
|
114
116
|
## Stable
|
|
115
117
|
|
|
@@ -254,11 +256,27 @@ CHANGELOG with a migration note.
|
|
|
254
256
|
`akm improve && akm proposal drain --promote --yes`, or a `triage` block
|
|
255
257
|
with `applyMode: "promote"` in your strategy.
|
|
256
258
|
- **Tasks** — `akm task` subcommand surface (`add | run | sync | doctor |
|
|
257
|
-
history`; no alias, no `list`/`remove`/`init`/`enable`/`disable`);
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
259
|
+
history | explain`; no alias, no `list`/`remove`/`init`/`enable`/`disable`);
|
|
260
|
+
task source v4 YAML (typed `inputs:`, optional `schedule:`) is the only
|
|
261
|
+
accepted version — task v3 and task v2 sources are converted by
|
|
262
|
+
`akm migrate apply`. Command tasks use named engines and task history
|
|
263
|
+
metadata is versioned. Schema additions in patch releases; removals only at
|
|
264
|
+
minor. Bare `akm task` is a usage error naming the subcommands
|
|
265
|
+
(`akm task doctor` reports scheduler diagnostics). `akm task explain <ref>`
|
|
266
|
+
(new in 0.9.2) and `akm workflow plan <ref>` are both zero-write
|
|
267
|
+
provenance surfaces: they show what a task or workflow would do —
|
|
268
|
+
resolved target, input bindings, child expansion — without starting or
|
|
269
|
+
publishing a run. `akm workflow plan` is secret-free **by construction**
|
|
270
|
+
(the excluded data never reaches the command). `akm task explain`
|
|
271
|
+
instead **redacts** secret-shaped input values on a best-effort
|
|
272
|
+
heuristic basis — a value that doesn't match the heuristic can still
|
|
273
|
+
print unredacted.
|
|
274
|
+
- **Workflow plan** — `akm workflow plan <ref>`, new in 0.9.2: zero-write
|
|
275
|
+
compile+freeze introspection (the canonical step graph, task/child
|
|
276
|
+
expansion, input bindings, and lowering notices for a workflow, without
|
|
277
|
+
starting or publishing a run). The envelope shape may still change; the
|
|
278
|
+
five long-Stable `workflow` verbs (`status`, `list`, `create`, `resume`,
|
|
279
|
+
`abandon`) and `run` are unaffected.
|
|
262
280
|
- **Events / log** — `akm log` is the event-stream surface (0.9.0: the
|
|
263
281
|
asset-scoped `akm history` surface, and `log`'s own `tail` subcommand, were
|
|
264
282
|
both removed; `log` is now a leaf command — the former `list` surface).
|
|
@@ -362,16 +362,21 @@ akm task sync --rebind # Also re-pin the scheduler's akm
|
|
|
362
362
|
akm task doctor # Scheduler binding + runtime eligibility diagnosis
|
|
363
363
|
akm task history # Recent run rows (status, timing)
|
|
364
364
|
akm task run <id> # Run one task immediately (works when disabled)
|
|
365
|
+
akm task explain <ref> # Read-only: declared inputs, target, schedule — spawns nothing
|
|
365
366
|
akm search --type task # Enumerate task assets (there is no `task list`)
|
|
366
367
|
```
|
|
367
368
|
|
|
368
|
-
Task files use
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
`
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
`akm
|
|
369
|
+
Task files use task source v4 (`version: 4`). There is no `akm:` options bag
|
|
370
|
+
or `on:` block — every control (`schedule`, `timeout`, `engine`, `model`,
|
|
371
|
+
`redact`, `maxSteps`, `maxRetries`, …) is a top-level key now. Typed
|
|
372
|
+
`inputs:` declarations and a bounded `output:` schema work like a
|
|
373
|
+
workflow's (`output:` replaces v3's `akm.outputSchema`). To disable one
|
|
374
|
+
schedule entry, set that entry's `enabled: false` under `schedule:` and run
|
|
375
|
+
`akm task sync` (the cron line stays, commented); to remove one, delete the
|
|
376
|
+
YAML and run `akm task sync` — the scheduler entry is unbound. Top-level
|
|
377
|
+
`timeout:` may be `null` (disable the invocation timer) or a duration/number
|
|
378
|
+
overriding the selected engine invocation timeout. Preview old task-v2/v3
|
|
379
|
+
conversion with `akm migrate apply --dry-run`.
|
|
375
380
|
|
|
376
381
|
## Agent Dispatch
|
|
377
382
|
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
version:
|
|
1
|
+
version: 4
|
|
2
2
|
run: akm proposal extract --auto
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
enabled: true
|
|
6
|
-
description: Opt-in all-harness session extraction every 30 min
|
|
3
|
+
description: Opt-in all-harness session extraction every 30 min
|
|
4
|
+
schedule: "*/30 * * * *"
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
version:
|
|
1
|
+
version: 4
|
|
2
2
|
run: akm improve --strategy graph-refresh --skip-if-locked
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
enabled: true
|
|
6
|
-
description: Full-corpus graph rebuild (weekly Sunday 3:10am)
|
|
3
|
+
description: Full-corpus graph rebuild (weekly Sunday 3:10am)
|
|
4
|
+
schedule: "10 3 * * 0"
|