akm-cli 0.9.8-beta.3 → 0.9.8
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 +134 -137
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,115 +4,25 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
|
|
7
|
-
## [0.9.8
|
|
8
|
-
|
|
9
|
-
### Fixed
|
|
10
|
-
|
|
11
|
-
- **The incremental index no longer misses an edit whose timestamp did not move
|
|
12
|
-
forward.** The per-directory freshness check summarised a directory as its
|
|
13
|
-
file-name set plus the single newest mtime, which lost two kinds of change.
|
|
14
|
-
An edit to any file other than the newest one landed below that maximum and
|
|
15
|
-
was invisible even though its own mtime changed — so a restore, checkout, or
|
|
16
|
-
archive extraction that stamped a plausible older date left stale content in
|
|
17
|
-
the index. And because mtime is writable by ordinary tooling (`touch -r`,
|
|
18
|
-
`rsync --times`, `cp -p`), an edit with a restored timestamp was invisible
|
|
19
|
-
outright. The directory is now digested per file over
|
|
20
|
-
`(basename, size, mtime, ctime)` at nanosecond resolution. It is the same one
|
|
21
|
-
`stat` call per file, so the incremental fast path costs what it did before.
|
|
22
|
-
Both gaps predate 0.9.8 and applied to every earlier release.
|
|
23
|
-
|
|
24
|
-
Trade-off worth knowing: `ctime` also moves on metadata-only changes such as
|
|
25
|
-
`chmod`, and after copying a tree, so those now cost one extra rescan. That
|
|
26
|
-
direction is deliberate — extra work, never stale content. Existing indexes
|
|
27
|
-
rescan once as the digest changes shape, then return to the fast path.
|
|
28
|
-
|
|
29
|
-
- **`akm migrate apply` can now clear a legacy `extraParams` config.** A config
|
|
30
|
-
still carrying a liftable key such as `extraParams.temperature` fails config
|
|
31
|
-
load closed, and that error names `akm migrate apply` as the fix — but the
|
|
32
|
-
migrate command resolved the stash directory and ran the task migrator, both
|
|
33
|
-
of which load config, so it died on the very error it exists to clear. An
|
|
34
|
-
operator hitting this had no reachable way forward. The config lift now runs
|
|
35
|
-
before anything that loads config, and `akm migrate status` reports the
|
|
36
|
-
pending lift as its blocker instead of re-raising the same error. A genuine
|
|
37
|
-
conflict, where an `extraParams` key and its first-class field disagree, still
|
|
38
|
-
hard-rejects and names both values rather than guessing.
|
|
39
|
-
|
|
40
|
-
- **`akm health` no longer warns about disk usage on a fresh install.** The
|
|
41
|
-
`data-dir-usage` advisory added earlier in 0.9.8 counted SQLite's `-wal` and
|
|
42
|
-
`-shm` sidecars toward the data directory's total but not toward the live
|
|
43
|
-
databases they belong to. On an untouched install the write-ahead log is most
|
|
44
|
-
of the directory, so the very first `akm health` reported a ~126x ratio and
|
|
45
|
-
exited `warn` with no user data present. Sidecars now count as part of their
|
|
46
|
-
database, and the advisory stays quiet below 1 GB, where a ratio says nothing
|
|
47
|
-
useful about disk pressure.
|
|
48
|
-
|
|
49
|
-
## [0.9.8-beta.2] - 2026-09-02
|
|
50
|
-
|
|
51
|
-
> **Adds state migration `026-proposals-strip-legacy-fragment-refs`.** The
|
|
52
|
-
> one-way caveat below applies to it as well: once this build opens
|
|
53
|
-
> `state.db`, 0.9.8-beta.1 and earlier refuse it with `unknown migration ID
|
|
54
|
-
> 026-proposals-strip-legacy-fragment-refs`.
|
|
55
|
-
|
|
56
|
-
### Added
|
|
57
|
-
|
|
58
|
-
- **`akm health` reports data-dir disk usage** (#896). A `data-dir-usage`
|
|
59
|
-
advisory sums the data directory with a stat-only walk and warns when it is
|
|
60
|
-
more than 3× the three live databases (state.db, index.db, logs.db) or when
|
|
61
|
-
one top-level subdirectory holds more than half of it, naming that
|
|
62
|
-
subdirectory with its size and share (for example `backups/ is 70G (94% of
|
|
63
|
-
data dir)`). The walk stops after 100,000 entries and says so. Silent when
|
|
64
|
-
nothing looks wrong.
|
|
65
|
-
|
|
66
|
-
### Fixed
|
|
67
|
-
|
|
68
|
-
- **`akm task sync` no longer spawns `npm root --global` on every call** (#901).
|
|
69
|
-
The npm-global-root probe behind `resolveAkmInvocation` is memoized for the
|
|
70
|
-
process, so a `task sync --rebind` cycle spawns npm at most once instead of
|
|
71
|
-
twice, and an installation that loops it every minute stops accumulating an
|
|
72
|
-
npm debug log per spawn.
|
|
73
|
-
- **A blocked v2 task now says how to convert it** (#902, #899). The
|
|
74
|
-
`argv-array-has-no-portable-shell-string` blocker printed by `akm migrate`
|
|
75
|
-
and the `TASK_SCHEMA_VERSION_UNSUPPORTED` read error now state that manual
|
|
76
|
-
conversion is required and name the rewrite (`command:` argv array →
|
|
77
|
-
`run:` string plus `shell:`). The full v2 → v4 field mapping is documented in
|
|
78
|
-
`docs/migration/v0.9.1-to-v0.9.2.md`.
|
|
79
|
-
- **Legacy `#fragment` proposal rows are repaired instead of warned about
|
|
80
|
-
forever** (#898). State migration 026 strips the retired export-fragment
|
|
81
|
-
selector from `proposals.ref` in place so the rows parse again, and an
|
|
82
|
-
unparseable proposal row now warns once per process instead of once per
|
|
83
|
-
read (`akm health --report` read the table seven times).
|
|
84
|
-
|
|
85
|
-
- **A no-op incremental `akm index` no longer costs minutes of CPU** (#900).
|
|
86
|
-
Two causes: the per-directory freshness check ran two full scans of the
|
|
87
|
-
`entries` table for every directory (O(directories × entries)), and every
|
|
88
|
-
file was read, hashed, and parsed before the freshness check decided the
|
|
89
|
-
directory was unchanged. The directory lookup now uses the existing
|
|
90
|
-
`file_path` index, and a stat-based gate over each directory's walked file
|
|
91
|
-
set skips unchanged directories before any file is read. On a synthetic
|
|
92
|
-
800-directory, 4,000-entry corpus a no-op pass fell from ~37 s to under 1 s
|
|
93
|
-
of CPU with identical entries and search results. The persisted directory
|
|
94
|
-
fingerprint now covers every walked file and `index_dir_state` gains a
|
|
95
|
-
`row_count` column; an existing index.db drains each directory once more
|
|
96
|
-
after upgrading, then takes the fast path.
|
|
97
|
-
|
|
98
|
-
- **Task-migration snapshots are capped at the five most recent** (#897).
|
|
99
|
-
`akm migrate apply` writes one snapshot directory per run under
|
|
100
|
-
`backups/task-v3` and `backups/task-v4` and never pruned them; each apply
|
|
101
|
-
now keeps the five newest and removes the rest, the same policy config
|
|
102
|
-
backups already use. Nothing in the current code writes the legacy
|
|
103
|
-
`backups/migrations`, `manual`, `releases`, or `operations` directories,
|
|
104
|
-
so they are left alone; the new health advisory is what surfaces them.
|
|
105
|
-
|
|
106
|
-
## [0.9.8-beta.1] - 2026-09-01
|
|
7
|
+
## [0.9.8] - 2026-09-02
|
|
107
8
|
|
|
108
9
|
A cleanup and stabilization release: deletion of machinery that policed the
|
|
109
10
|
codebase's shape rather than its behaviour, and — because auditing for that
|
|
110
11
|
machinery meant reading the code closely — a run of real defects it had been
|
|
111
|
-
sitting on top of.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
12
|
+
sitting on top of. Two security holes, two search-correctness bugs, a
|
|
13
|
+
locale-dependent hash, a deletion shield that failed open, and sixteen places
|
|
14
|
+
that answered a failure with a confident wrong answer instead of an error.
|
|
15
|
+
|
|
16
|
+
Then a second round, from verifying the release against a real 23,865-entry
|
|
17
|
+
environment: a no-op incremental index costing ~21 CPU-minutes, legacy proposal
|
|
18
|
+
rows that could not be repaired, an npm probe spawning on every scheduler tick,
|
|
19
|
+
a blocked task migration that named no remedy, and a data directory that could
|
|
20
|
+
reach 74 GB with nothing reporting it.
|
|
21
|
+
|
|
22
|
+
> **Upgrading is one-way for `state.db`.** This release adds two migrations,
|
|
23
|
+
> `025-task-history-vocabulary-backfill` and
|
|
24
|
+
> `026-proposals-strip-legacy-fragment-refs`. Once any 0.9.8 command opens
|
|
25
|
+
> `state.db`, its ledger contains IDs that 0.9.7 does not know, and 0.9.7
|
|
116
26
|
> refuses to open it: `Refusing to open a database with a newer migration
|
|
117
27
|
> ledger: unknown migration ID 025-task-history-vocabulary-backfill`.
|
|
118
28
|
>
|
|
@@ -127,12 +37,22 @@ sitting on top of.
|
|
|
127
37
|
>
|
|
128
38
|
> ```sh
|
|
129
39
|
> akm info --format json # confirm your data dir
|
|
130
|
-
> sqlite3 "$DATA_DIR/state.db" "VACUUM INTO '
|
|
40
|
+
> sqlite3 "$DATA_DIR/state.db" "VACUUM INTO 'state.db.pre-0.9.8.bak'"
|
|
131
41
|
> ```
|
|
132
42
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
43
|
+
> **`index.db` rescans once.** The per-directory freshness fingerprint changed
|
|
44
|
+
> shape, so the first `akm index` after upgrading re-reads every directory and
|
|
45
|
+
> then returns to the fast path. Nothing is lost; the index is derived.
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- **`akm health` reports data-dir disk usage** (#896). A `data-dir-usage`
|
|
50
|
+
advisory sums the data directory with a stat-only walk and warns when it is
|
|
51
|
+
more than 3× the three live databases (state.db, index.db, logs.db) or when
|
|
52
|
+
one top-level subdirectory holds more than half of it, naming that
|
|
53
|
+
subdirectory with its size and share (for example `backups/ is 70G (94% of
|
|
54
|
+
data dir)`). The walk stops after 100,000 entries and says so. Silent when
|
|
55
|
+
nothing looks wrong.
|
|
136
56
|
|
|
137
57
|
### Changed
|
|
138
58
|
|
|
@@ -149,6 +69,39 @@ with a confident wrong answer instead of an error.
|
|
|
149
69
|
~60 lines of comment justifying it. `--format text` still renders the same
|
|
150
70
|
summary through the same formatter; it is simply no longer the default.
|
|
151
71
|
|
|
72
|
+
|
|
73
|
+
- **Search no longer truncates long queries (#892).** `MAX_LEXICAL_QUERY_TOKENS
|
|
74
|
+
= 16` silently dropped every token past the sixteenth, and tokens are
|
|
75
|
+
collected in order, so the discarded half was the tail — for
|
|
76
|
+
natural-language input, usually where the discriminating words are. It also
|
|
77
|
+
fed ranking, so token-overlap scoring ran on the truncated set too. It was
|
|
78
|
+
unexplained in the code and in the commit that introduced it, and unreachable
|
|
79
|
+
from any flag, config key, or environment variable. Removed: the planner
|
|
80
|
+
handles 10,000 tokens in 9ms, so no performance cliff was being protected.
|
|
81
|
+
|
|
82
|
+
- **Content and memory bodies are no longer silently truncated.**
|
|
83
|
+
`MAX_CONTENT_CHARS` (100k, duplicated across 8 adapters) cut indexed content
|
|
84
|
+
so the tail of a long document was unsearchable; `MAX_BODY_CHARS` (4000) cut
|
|
85
|
+
the text sent for memory inference, so on a large-context engine the model
|
|
86
|
+
saw a fraction of the input while the derived memory looked complete. Both
|
|
87
|
+
removed.
|
|
88
|
+
|
|
89
|
+
- **GitHub Actions are pinned to commit SHAs (#768).** All 29 `uses:` steps
|
|
90
|
+
across every workflow, with the tag preserved in a trailing comment.
|
|
91
|
+
|
|
92
|
+
- **Gated CI runs on schedule, dispatch, and candidate tags only.** The
|
|
93
|
+
`detect-changes` job that selected suites by regex-matching a PR diff is
|
|
94
|
+
gone — its path patterns had gone stale and still named test files this
|
|
95
|
+
release moved or deleted, so it was silently under-selecting suites. Release
|
|
96
|
+
evidence is unchanged; the checklist always required an exact-SHA dispatch.
|
|
97
|
+
|
|
98
|
+
- **`akm-eval` in CI is now a determinism check only.** Its score gates are
|
|
99
|
+
removed. Measured before cutting: the baseline scored a perfect 1.0 against
|
|
100
|
+
a 0.75 gate, and seven of nine case types never ran — CI has no LLM and no
|
|
101
|
+
run history, so everything the eval exists to measure was skipped while the
|
|
102
|
+
job reported green. The harness itself is unchanged and remains a genuine
|
|
103
|
+
quality signal when run against a real bundle.
|
|
104
|
+
|
|
152
105
|
### Fixed
|
|
153
106
|
|
|
154
107
|
- **Historical state migrations are reachable where akm cannot reinstall
|
|
@@ -264,39 +217,83 @@ with a confident wrong answer instead of an error.
|
|
|
264
217
|
`bun run lint` failed locally while CI, which never has those files, stayed
|
|
265
218
|
green.
|
|
266
219
|
|
|
267
|
-
### Changed
|
|
268
220
|
|
|
269
|
-
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
221
|
+
- **`akm task sync` no longer spawns `npm root --global` on every call** (#901).
|
|
222
|
+
The npm-global-root probe behind `resolveAkmInvocation` is memoized for the
|
|
223
|
+
process, so a `task sync --rebind` cycle spawns npm at most once instead of
|
|
224
|
+
twice, and an installation that loops it every minute stops accumulating an
|
|
225
|
+
npm debug log per spawn.
|
|
226
|
+
- **A blocked v2 task now says how to convert it** (#902, #899). The
|
|
227
|
+
`argv-array-has-no-portable-shell-string` blocker printed by `akm migrate`
|
|
228
|
+
and the `TASK_SCHEMA_VERSION_UNSUPPORTED` read error now state that manual
|
|
229
|
+
conversion is required and name the rewrite (`command:` argv array →
|
|
230
|
+
`run:` string plus `shell:`). The full v2 → v4 field mapping is documented in
|
|
231
|
+
`docs/migration/v0.9.1-to-v0.9.2.md`.
|
|
232
|
+
- **Legacy `#fragment` proposal rows are repaired instead of warned about
|
|
233
|
+
forever** (#898). State migration 026 strips the retired export-fragment
|
|
234
|
+
selector from `proposals.ref` in place so the rows parse again, and an
|
|
235
|
+
unparseable proposal row now warns once per process instead of once per
|
|
236
|
+
read (`akm health --report` read the table seven times).
|
|
277
237
|
|
|
278
|
-
- **
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
238
|
+
- **A no-op incremental `akm index` no longer costs minutes of CPU** (#900).
|
|
239
|
+
Two causes: the per-directory freshness check ran two full scans of the
|
|
240
|
+
`entries` table for every directory (O(directories × entries)), and every
|
|
241
|
+
file was read, hashed, and parsed before the freshness check decided the
|
|
242
|
+
directory was unchanged. The directory lookup now uses the existing
|
|
243
|
+
`file_path` index, and a stat-based gate over each directory's walked file
|
|
244
|
+
set skips unchanged directories before any file is read. On a synthetic
|
|
245
|
+
800-directory, 4,000-entry corpus a no-op pass fell from ~37 s to under 1 s
|
|
246
|
+
of CPU with identical entries and search results. The persisted directory
|
|
247
|
+
fingerprint now covers every walked file and `index_dir_state` gains a
|
|
248
|
+
`row_count` column; an existing index.db drains each directory once more
|
|
249
|
+
after upgrading, then takes the fast path.
|
|
284
250
|
|
|
285
|
-
- **
|
|
286
|
-
|
|
251
|
+
- **Task-migration snapshots are capped at the five most recent** (#897).
|
|
252
|
+
`akm migrate apply` writes one snapshot directory per run under
|
|
253
|
+
`backups/task-v3` and `backups/task-v4` and never pruned them; each apply
|
|
254
|
+
now keeps the five newest and removes the rest, the same policy config
|
|
255
|
+
backups already use. Nothing in the current code writes the legacy
|
|
256
|
+
`backups/migrations`, `manual`, `releases`, or `operations` directories,
|
|
257
|
+
so they are left alone; the new health advisory is what surfaces them.
|
|
287
258
|
|
|
288
|
-
- **Gated CI runs on schedule, dispatch, and candidate tags only.** The
|
|
289
|
-
`detect-changes` job that selected suites by regex-matching a PR diff is
|
|
290
|
-
gone — its path patterns had gone stale and still named test files this
|
|
291
|
-
release moved or deleted, so it was silently under-selecting suites. Release
|
|
292
|
-
evidence is unchanged; the checklist always required an exact-SHA dispatch.
|
|
293
259
|
|
|
294
|
-
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
260
|
+
- **The incremental index no longer misses an edit whose timestamp did not move
|
|
261
|
+
forward.** The per-directory freshness check summarised a directory as its
|
|
262
|
+
file-name set plus the single newest mtime, which lost two kinds of change.
|
|
263
|
+
An edit to any file other than the newest one landed below that maximum and
|
|
264
|
+
was invisible even though its own mtime changed — so a restore, checkout, or
|
|
265
|
+
archive extraction that stamped a plausible older date left stale content in
|
|
266
|
+
the index. And because mtime is writable by ordinary tooling (`touch -r`,
|
|
267
|
+
`rsync --times`, `cp -p`), an edit with a restored timestamp was invisible
|
|
268
|
+
outright. The directory is now digested per file over
|
|
269
|
+
`(basename, size, mtime, ctime)` at nanosecond resolution. It is the same one
|
|
270
|
+
`stat` call per file, so the incremental fast path costs what it did before.
|
|
271
|
+
Both gaps predate 0.9.8 and applied to every earlier release.
|
|
272
|
+
|
|
273
|
+
Trade-off worth knowing: `ctime` also moves on metadata-only changes such as
|
|
274
|
+
`chmod`, and after copying a tree, so those now cost one extra rescan. That
|
|
275
|
+
direction is deliberate — extra work, never stale content. Existing indexes
|
|
276
|
+
rescan once as the digest changes shape, then return to the fast path.
|
|
277
|
+
|
|
278
|
+
- **`akm migrate apply` can now clear a legacy `extraParams` config.** A config
|
|
279
|
+
still carrying a liftable key such as `extraParams.temperature` fails config
|
|
280
|
+
load closed, and that error names `akm migrate apply` as the fix — but the
|
|
281
|
+
migrate command resolved the stash directory and ran the task migrator, both
|
|
282
|
+
of which load config, so it died on the very error it exists to clear. An
|
|
283
|
+
operator hitting this had no reachable way forward. The config lift now runs
|
|
284
|
+
before anything that loads config, and `akm migrate status` reports the
|
|
285
|
+
pending lift as its blocker instead of re-raising the same error. A genuine
|
|
286
|
+
conflict, where an `extraParams` key and its first-class field disagree, still
|
|
287
|
+
hard-rejects and names both values rather than guessing.
|
|
288
|
+
|
|
289
|
+
- **`akm health` no longer warns about disk usage on a fresh install.** The
|
|
290
|
+
`data-dir-usage` advisory added earlier in 0.9.8 counted SQLite's `-wal` and
|
|
291
|
+
`-shm` sidecars toward the data directory's total but not toward the live
|
|
292
|
+
databases they belong to. On an untouched install the write-ahead log is most
|
|
293
|
+
of the directory, so the very first `akm health` reported a ~126x ratio and
|
|
294
|
+
exited `warn` with no user data present. Sidecars now count as part of their
|
|
295
|
+
database, and the advisory stays quiet below 1 GB, where a ratio says nothing
|
|
296
|
+
useful about disk pressure.
|
|
300
297
|
|
|
301
298
|
### Removed
|
|
302
299
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "akm-cli",
|
|
3
|
-
"version": "0.9.8
|
|
3
|
+
"version": "0.9.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "akm (Agent Knowledge Manager) — a portable, local-first capability library for AI agents. Discover, load, share, and improve reusable skills, scripts, workflows, and knowledge across any shell-capable coding agent, including Claude Code, OpenCode, and Cursor.",
|
|
6
6
|
"keywords": [
|