akm-cli 0.8.6 → 0.8.14
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 +442 -0
- package/dist/assets/help/help-proposals.md +1 -2
- package/dist/assets/hints/cli-hints-full.md +34 -19
- package/dist/assets/hints/cli-hints-short.md +1 -1
- package/dist/assets/profiles/catchup.json +13 -0
- package/dist/assets/profiles/consolidate.json +13 -0
- package/dist/assets/profiles/frequent.json +13 -0
- package/dist/assets/tasks/core/backup.yml +4 -0
- package/dist/assets/tasks/core/extract.yml +4 -0
- package/dist/assets/tasks/core/improve.yml +4 -0
- package/dist/assets/tasks/core/index-refresh.yml +4 -0
- package/dist/assets/tasks/core/sync.yml +4 -0
- package/dist/assets/tasks/core/update-stashes.yml +4 -0
- package/dist/assets/tasks/core/version-check.yml +4 -0
- package/dist/assets/templates/html/default.html +78 -0
- package/dist/assets/templates/html/health.html +560 -0
- package/dist/assets/templates/html/vendor/echarts.min.js +45 -0
- package/dist/cli/config-migrate.js +6 -6
- package/dist/cli/config-validate.js +4 -4
- package/dist/cli/confirm.js +3 -3
- package/dist/cli/parse-args.js +1 -1
- package/dist/cli/shared.js +72 -19
- package/dist/cli-node.mjs +26 -0
- package/dist/cli.js +206 -3866
- package/dist/commands/{agent-dispatch.js → agent/agent-dispatch.js} +6 -6
- package/dist/commands/{agent-support.js → agent/agent-support.js} +2 -2
- package/dist/commands/agent/contribute-cli.js +200 -0
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +230 -3
- package/dist/commands/db-cli.js +2 -2
- package/dist/commands/env/env-cli.js +529 -0
- package/dist/commands/env/env.js +410 -0
- package/dist/commands/env/secret-cli.js +259 -0
- package/dist/commands/{secret.js → env/secret.js} +6 -47
- package/dist/commands/events.js +4 -4
- package/dist/commands/feedback-cli.js +18 -34
- package/dist/commands/graph/graph-cli.js +132 -0
- package/dist/commands/{graph.js → graph/graph.js} +22 -16
- package/dist/commands/health/checks.js +279 -0
- package/dist/commands/health/html-report.js +448 -0
- package/dist/commands/health.js +189 -266
- package/dist/commands/{consolidate.js → improve/consolidate.js} +63 -38
- package/dist/commands/{distill-promotion-policy.js → improve/distill-promotion-policy.js} +3 -3
- package/dist/commands/{distill.js → improve/distill.js} +39 -18
- package/dist/commands/{eval-cases.js → improve/eval-cases.js} +1 -1
- package/dist/commands/{extract-cli.js → improve/extract-cli.js} +4 -4
- package/dist/commands/{extract-prompt.js → improve/extract-prompt.js} +2 -2
- package/dist/commands/{extract.js → improve/extract.js} +221 -26
- package/dist/commands/{improve-auto-accept.js → improve/improve-auto-accept.js} +30 -4
- package/dist/commands/{improve-cli.js → improve/improve-cli.js} +44 -22
- package/dist/commands/{improve-profiles.js → improve/improve-profiles.js} +13 -7
- package/dist/commands/{improve-result-file.js → improve/improve-result-file.js} +1 -1
- package/dist/commands/{improve.js → improve/improve.js} +672 -292
- package/dist/{core → commands/improve/memory}/memory-belief.js +2 -2
- package/dist/{core → commands/improve/memory}/memory-contradiction-detect.js +5 -5
- package/dist/{core → commands/improve/memory}/memory-improve.js +4 -4
- package/dist/commands/improve/reflect-noise.js +0 -0
- package/dist/commands/{reflect.js → improve/reflect.js} +58 -28
- package/dist/commands/improve/session-asset.js +248 -0
- package/dist/commands/lint/agent-linter.js +1 -1
- package/dist/commands/lint/base-linter.js +55 -37
- package/dist/commands/lint/command-linter.js +1 -1
- package/dist/commands/lint/default-linter.js +1 -1
- package/dist/commands/lint/env-key-rules.js +1 -1
- package/dist/commands/lint/index.js +19 -25
- package/dist/commands/lint/knowledge-linter.js +1 -1
- package/dist/commands/lint/memory-linter.js +1 -1
- package/dist/commands/lint/registry.js +8 -8
- package/dist/commands/lint/skill-linter.js +1 -1
- package/dist/commands/lint/task-linter.js +1 -1
- package/dist/commands/lint/workflow-linter.js +1 -1
- package/dist/commands/lint.js +1 -1
- package/dist/commands/observability-cli.js +244 -0
- package/dist/commands/proposal/drain-policies.js +3 -3
- package/dist/commands/proposal/drain.js +87 -15
- package/dist/commands/proposal/proposal-cli.js +490 -0
- package/dist/commands/{proposal.js → proposal/proposal.js} +17 -6
- package/dist/commands/{propose.js → proposal/propose.js} +11 -11
- package/dist/{core → commands/proposal/validators}/proposal-quality-validators.js +8 -3
- package/dist/{core → commands/proposal/validators}/proposal-validators.js +5 -5
- package/dist/{core → commands/proposal/validators}/proposals.js +374 -345
- package/dist/commands/{curate.js → read/curate.js} +7 -7
- package/dist/commands/{knowledge.js → read/knowledge.js} +22 -9
- package/dist/commands/{registry-search.js → read/registry-search.js} +5 -5
- package/dist/commands/{remember-cli.js → read/remember-cli.js} +15 -7
- package/dist/commands/read/search-cli.js +207 -0
- package/dist/commands/{search.js → read/search.js} +22 -27
- package/dist/commands/{show.js → read/show.js} +31 -45
- package/dist/commands/registry-cli.js +8 -8
- package/dist/commands/remember.js +14 -10
- package/dist/commands/sources/add-cli.js +293 -0
- package/dist/commands/{history.js → sources/history.js} +27 -25
- package/dist/commands/{info.js → sources/info.js} +6 -6
- package/dist/commands/{init.js → sources/init.js} +6 -6
- package/dist/commands/{installed-stashes.js → sources/installed-stashes.js} +12 -12
- package/dist/commands/{migration-help.js → sources/migration-help.js} +3 -2
- package/dist/commands/{schema-repair.js → sources/schema-repair.js} +8 -8
- package/dist/commands/{self-update.js → sources/self-update.js} +10 -9
- package/dist/commands/{source-add.js → sources/source-add.js} +10 -10
- package/dist/commands/{source-clone.js → sources/source-clone.js} +7 -7
- package/dist/commands/{source-manage.js → sources/source-manage.js} +4 -4
- package/dist/commands/sources/sources-cli.js +305 -0
- package/dist/commands/sources/stash-cli.js +219 -0
- package/dist/commands/{stash-skeleton.js → sources/stash-skeleton.js} +2 -1
- package/dist/commands/tasks/default-tasks.js +173 -0
- package/dist/commands/tasks/tasks-cli.js +210 -0
- package/dist/commands/{tasks.js → tasks/tasks.js} +14 -14
- package/dist/commands/wiki-cli.js +307 -0
- package/dist/commands/workflow-cli.js +329 -0
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/assert.js +40 -0
- package/dist/core/asset/asset-create.js +54 -0
- package/dist/core/{asset-ref.js → asset/asset-ref.js} +21 -4
- package/dist/core/{asset-registry.js → asset/asset-registry.js} +3 -3
- package/dist/core/{asset-spec.js → asset/asset-spec.js} +17 -31
- package/dist/core/{markdown.js → asset/markdown.js} +1 -1
- package/dist/core/{stash-meta.js → asset/stash-meta.js} +1 -1
- package/dist/core/best-effort.js +64 -0
- package/dist/core/common.js +32 -18
- package/dist/core/{config-io.js → config/config-io.js} +29 -19
- package/dist/core/{config-migration.js → config/config-migration.js} +11 -9
- package/dist/core/{config-schema.js → config/config-schema.js} +50 -7
- package/dist/core/config/config-types.js +16 -0
- package/dist/core/{config-walker.js → config/config-walker.js} +2 -2
- package/dist/core/{config.js → config/config.js} +10 -8
- package/dist/core/env-secret-ref.js +90 -0
- package/dist/core/errors.js +13 -3
- package/dist/core/events.js +27 -4
- package/dist/core/file-lock.js +1 -1
- package/dist/core/improve-types.js +48 -0
- package/dist/core/lesson-lint.js +2 -2
- package/dist/core/logs-db.js +304 -0
- package/dist/core/paths.js +2 -2
- package/dist/core/ripgrep/install.js +2 -2
- package/dist/core/ripgrep/resolve.js +2 -2
- package/dist/core/state-db.js +195 -60
- package/dist/core/text-truncation.js +148 -0
- package/dist/core/time.js +1 -1
- package/dist/core/write-source.js +98 -85
- package/dist/indexer/{db-backup.js → db/db-backup.js} +9 -24
- package/dist/indexer/{db.js → db/db.js} +128 -118
- package/dist/indexer/{graph-db.js → db/graph-db.js} +9 -4
- package/dist/indexer/{llm-cache.js → db/llm-cache.js} +15 -12
- package/dist/indexer/ensure-index.js +4 -4
- package/dist/indexer/{graph-boost.js → graph/graph-boost.js} +1 -1
- package/dist/indexer/{graph-extraction.js → graph/graph-extraction.js} +55 -13
- package/dist/indexer/indexer.js +37 -30
- package/dist/indexer/init.js +54 -0
- package/dist/indexer/manifest.js +10 -10
- package/dist/indexer/{memory-inference.js → passes/memory-inference.js} +141 -33
- package/dist/indexer/{metadata-contributors.js → passes/metadata-contributors.js} +10 -8
- package/dist/indexer/{metadata.js → passes/metadata.js} +15 -19
- package/dist/indexer/{staleness-detect.js → passes/staleness-detect.js} +53 -12
- package/dist/indexer/{db-search.js → search/db-search.js} +28 -16
- package/dist/indexer/{ranking-contributors.js → search/ranking-contributors.js} +1 -1
- package/dist/indexer/{ranking.js → search/ranking.js} +2 -2
- package/dist/indexer/{search-hit-enrichers.js → search/search-hit-enrichers.js} +3 -3
- package/dist/indexer/{search-source.js → search/search-source.js} +8 -8
- package/dist/indexer/{semantic-status.js → search/semantic-status.js} +3 -3
- package/dist/indexer/usage/unmigrated-vaults-guard.js +94 -0
- package/dist/indexer/{usage-events.js → usage/usage-events.js} +32 -0
- package/dist/indexer/{file-context.js → walk/file-context.js} +10 -15
- package/dist/indexer/{matchers.js → walk/matchers.js} +13 -9
- package/dist/indexer/{path-resolver.js → walk/path-resolver.js} +6 -6
- package/dist/indexer/{project-context.js → walk/project-context.js} +1 -1
- package/dist/indexer/{walker.js → walk/walker.js} +4 -3
- package/dist/integrations/agent/builder-shared.js +39 -0
- package/dist/integrations/agent/builders.js +14 -81
- package/dist/integrations/agent/config.js +6 -4
- package/dist/integrations/agent/detect.js +1 -1
- package/dist/integrations/agent/index.js +23 -8
- package/dist/integrations/agent/prompts.js +2 -3
- package/dist/integrations/agent/runner.js +22 -3
- package/dist/integrations/agent/spawn.js +9 -10
- package/dist/integrations/harnesses/claude/agent-builder.js +48 -0
- package/dist/integrations/harnesses/claude/config-import.js +70 -0
- package/dist/integrations/harnesses/claude/index.js +64 -0
- package/dist/integrations/{session-logs/providers/claude-code.js → harnesses/claude/session-log.js} +32 -5
- package/dist/integrations/harnesses/index.js +144 -0
- package/dist/integrations/harnesses/opencode/agent-builder.js +43 -0
- package/dist/integrations/harnesses/opencode/config-import.js +82 -0
- package/dist/integrations/harnesses/opencode/index.js +59 -0
- package/dist/integrations/{session-logs/providers/opencode.js → harnesses/opencode/session-log.js} +1 -1
- package/dist/integrations/harnesses/opencode-sdk/index.js +49 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +234 -0
- package/dist/integrations/harnesses/types.js +43 -0
- package/dist/integrations/lockfile.js +7 -16
- package/dist/integrations/session-logs/index.js +82 -9
- package/dist/llm/call-ai.js +4 -4
- package/dist/llm/client.js +146 -6
- package/dist/llm/embedder.js +6 -6
- package/dist/llm/embedders/local.js +9 -22
- package/dist/llm/embedders/remote.js +2 -2
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/graph-extract.js +31 -12
- package/dist/llm/index-passes.js +1 -1
- package/dist/llm/memory-infer.js +12 -5
- package/dist/llm/metadata-enhance.js +2 -2
- package/dist/llm/usage-persist.js +77 -0
- package/dist/llm/usage-telemetry.js +103 -0
- package/dist/output/context.js +9 -46
- package/dist/output/html-render.js +73 -0
- package/dist/output/renderers.js +88 -58
- package/dist/output/shapes/curate.js +7 -3
- package/dist/output/shapes/distill.js +7 -3
- package/dist/output/shapes/env-list.js +18 -16
- package/dist/output/shapes/events.js +5 -4
- package/dist/output/shapes/helpers.js +19 -5
- package/dist/output/shapes/history.js +7 -3
- package/dist/output/shapes/passthrough.js +8 -11
- package/dist/output/shapes/{proposal-accept.js → proposal/accept.js} +7 -3
- package/dist/output/shapes/{proposal-diff.js → proposal/diff.js} +7 -3
- package/dist/output/shapes/{proposal-list.js → proposal/list.js} +7 -3
- package/dist/output/shapes/{proposal-producer.js → proposal/producer.js} +5 -4
- package/dist/output/shapes/{proposal-reject.js → proposal/reject.js} +7 -3
- package/dist/output/shapes/{proposal-show.js → proposal/show.js} +7 -3
- package/dist/output/shapes/registry-search.js +7 -3
- package/dist/output/shapes/registry.js +12 -0
- package/dist/output/shapes/search.js +7 -3
- package/dist/output/shapes/secret-list.js +18 -16
- package/dist/output/shapes/show.js +7 -3
- package/dist/output/shapes.js +55 -30
- package/dist/output/text/add.js +2 -3
- package/dist/output/text/clone.js +2 -3
- package/dist/output/text/config.js +2 -3
- package/dist/output/text/curate.js +4 -3
- package/dist/output/text/distill.js +2 -3
- package/dist/output/text/enable-disable.js +5 -4
- package/dist/output/text/env.js +13 -0
- package/dist/output/text/events.js +5 -4
- package/dist/output/text/feedback.js +4 -3
- package/dist/output/text/helpers.js +123 -40
- package/dist/output/text/history.js +2 -3
- package/dist/output/text/import.js +2 -3
- package/dist/output/text/index.js +2 -3
- package/dist/output/text/info.js +2 -3
- package/dist/output/text/init.js +2 -3
- package/dist/output/text/list.js +2 -3
- package/dist/output/text/proposal/producer.js +9 -0
- package/dist/output/text/proposal/proposal.js +13 -0
- package/dist/output/text/registry-commands.js +8 -7
- package/dist/output/text/registry.js +12 -0
- package/dist/output/text/remember.js +4 -3
- package/dist/output/text/remove.js +2 -3
- package/dist/output/text/save.js +2 -3
- package/dist/output/text/search.js +4 -3
- package/dist/output/text/show.js +4 -3
- package/dist/output/text/update.js +2 -3
- package/dist/output/text/upgrade.js +2 -3
- package/dist/output/text/wiki.js +12 -11
- package/dist/output/text/workflow.js +12 -10
- package/dist/output/text.js +66 -32
- package/dist/registry/build-index.js +11 -10
- package/dist/registry/factory.js +1 -1
- package/dist/registry/origin-resolve.js +1 -1
- package/dist/registry/providers/index.js +2 -2
- package/dist/registry/providers/skills-sh.js +91 -72
- package/dist/registry/providers/static-index.js +75 -52
- package/dist/registry/resolve.js +3 -3
- package/dist/runtime.js +242 -0
- package/dist/scripts/migrate-storage.js +1654 -683
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +254 -168
- package/dist/setup/detect.js +311 -9
- package/dist/setup/harness-config-import.js +6 -120
- package/dist/setup/setup.js +454 -43
- package/dist/sources/include.js +1 -1
- package/dist/sources/provider-factory.js +2 -2
- package/dist/sources/providers/filesystem.js +3 -3
- package/dist/sources/providers/git.js +9 -9
- package/dist/sources/providers/index.js +4 -4
- package/dist/sources/providers/npm.js +6 -6
- package/dist/sources/providers/provider-utils.js +13 -20
- package/dist/sources/providers/sync-from-ref.js +5 -5
- package/dist/sources/providers/tar-utils.js +2 -2
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +5 -5
- package/dist/sources/website-ingest.js +5 -5
- package/dist/storage/database.js +102 -0
- package/dist/storage/engines/sqlite-migrations.js +42 -0
- package/dist/storage/locations.js +25 -0
- package/dist/storage/repositories/index-db.js +43 -0
- package/dist/storage/repositories/workflow-runs-repository.js +141 -0
- package/dist/tasks/backends/cron.js +4 -4
- package/dist/tasks/backends/exec-utils.js +32 -0
- package/dist/tasks/backends/index.js +3 -3
- package/dist/tasks/backends/launchd.js +7 -14
- package/dist/tasks/backends/schtasks.js +7 -16
- package/dist/tasks/embedded.js +71 -0
- package/dist/tasks/parser.js +2 -2
- package/dist/tasks/resolveAkmBin.js +1 -1
- package/dist/tasks/runner.js +127 -31
- package/dist/tasks/schedule.js +1 -1
- package/dist/tasks/validator.js +7 -7
- package/dist/text-import-hook.mjs +51 -0
- package/dist/version.js +2 -1
- package/dist/wiki/wiki.js +7 -7
- package/dist/workflows/{authoring.js → authoring/authoring.js} +6 -6
- package/dist/workflows/{scope-key.js → authoring/scope-key.js} +1 -1
- package/dist/workflows/cli.js +1 -1
- package/dist/workflows/db.js +54 -32
- package/dist/workflows/parser.js +4 -4
- package/dist/workflows/renderer.js +5 -5
- package/dist/workflows/runtime/agent-identity.js +56 -0
- package/dist/workflows/runtime/checkin.js +57 -0
- package/dist/workflows/{runs.js → runtime/runs.js} +197 -101
- package/dist/workflows/validate-summary.js +82 -0
- package/docs/README.md +1 -1
- package/docs/data-and-telemetry.md +6 -6
- package/package.json +17 -8
- package/dist/commands/add-cli.js +0 -279
- package/dist/commands/env.js +0 -213
- package/dist/integrations/agent/sdk-runner.js +0 -126
- package/dist/output/shapes/vault-list.js +0 -19
- package/dist/output/text/proposal-producer.js +0 -8
- package/dist/output/text/proposal.js +0 -12
- package/dist/output/text/vault.js +0 -16
- /package/dist/core/{asset-serialize.js → asset/asset-serialize.js} +0 -0
- /package/dist/core/{frontmatter.js → asset/frontmatter.js} +0 -0
- /package/dist/core/{config-sources.js → config/config-sources.js} +0 -0
- /package/dist/indexer/{graph-dedup.js → graph/graph-dedup.js} +0 -0
- /package/dist/{core/config-types.js → indexer/passes/pass-context.js} +0 -0
- /package/dist/indexer/{search-fields.js → search/search-fields.js} +0 -0
- /package/dist/indexer/{index-context.js → walk/index-context.js} +0 -0
- /package/dist/workflows/{document-cache.js → runtime/document-cache.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,448 @@ 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
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.9.0-beta.3] - 2026-06-12
|
|
10
|
+
|
|
11
|
+
Stabilization batch closing the remaining 0.9.0 milestone: DB-locking and
|
|
12
|
+
improve-pipeline perf backports, extract/reflect gate fixes, SQLite-first
|
|
13
|
+
proposal and log storage, `--format html` output, and per-stage LLM telemetry.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **`--format html` output with per-command templates** (#582). `akm health
|
|
18
|
+
--format html` renders the full interactive health report (ECharts inlined by
|
|
19
|
+
default, or via CDN with `AKM_ECHARTS=cdn`); every other command falls back to
|
|
20
|
+
a dark-mode default template that pretty-prints its JSON. A global `--output
|
|
21
|
+
<path>` flag writes the rendered HTML to a file instead of stdout. Token
|
|
22
|
+
replacement only — no template engine. The standalone health-report skill is
|
|
23
|
+
now folded into core.
|
|
24
|
+
- **Per-stage LLM telemetry** (#576). Every `chatCompletion` call now records
|
|
25
|
+
tokens (prompt/completion/total/reasoning), wall-time, model, and
|
|
26
|
+
finish_reason as an `llm_usage` event, attributed to the pipeline stage via an
|
|
27
|
+
ambient `AsyncLocalStorage` context (`withLlmStage`) set once per phase — no
|
|
28
|
+
`stage` parameter threaded through call sites. `akm health` exposes per-stage
|
|
29
|
+
token and time aggregates. Telemetry is best-effort and can never fail a run;
|
|
30
|
+
capture is forward-only.
|
|
31
|
+
- **Per-proposal gate decision + confidence** (#577). When a proposal passes
|
|
32
|
+
through the auto-accept/triage gate, its outcome (`auto-accepted` /
|
|
33
|
+
`deferred` / `auto-rejected`), reason, confidence, measured value, and the
|
|
34
|
+
thresholds in effect are persisted on the proposal (in the SQLite metadata).
|
|
35
|
+
`akm proposal show`/`list` surface them with reconstructable comparisons
|
|
36
|
+
(e.g. `0.72 < 0.90`), so tooling can explain *why* each proposal is pending
|
|
37
|
+
instead of relying on a run-level aggregate. Forward-only; legacy proposals
|
|
38
|
+
render `unknown`.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- **`SQLITE_BUSY` / "database is locked" under concurrent runs** (#584, #585,
|
|
43
|
+
#589). `busy_timeout` raised from 5 s to 30 s on every SQLite open path
|
|
44
|
+
(index.db and state.db); the improve maintenance pass now closes its index.db
|
|
45
|
+
handle before each reindex (which opens its own writer to the same WAL file);
|
|
46
|
+
and the post-loop purge reuses the long-lived events connection instead of
|
|
47
|
+
opening a second state.db writer. Together these eliminate all observed
|
|
48
|
+
lock failures from overlapping cron improve runs. (Backports of 0.8.8.)
|
|
49
|
+
- **Extract gate ignored the active profile's `extract.enabled: false`** (#593,
|
|
50
|
+
#594). The session-extraction gate hardcoded the `default` profile, so a
|
|
51
|
+
non-default profile (e.g. a quick pass) ran extract anyway — 300–600 s of
|
|
52
|
+
redundant work per run when a dedicated extract task also exists. The gate
|
|
53
|
+
now resolves `extract` against the active improve profile. (Backport of
|
|
54
|
+
0.8.11.)
|
|
55
|
+
- **Memory inference burned LLM calls on already-derived parents** (#588). The
|
|
56
|
+
primary pass now checks for the `<parent>.derived.md` child on disk *before*
|
|
57
|
+
the LLM/cache call, and opportunistically marks the parent processed so it
|
|
58
|
+
never re-pends. Previously ~55 % of the inference budget was spent
|
|
59
|
+
rediscovering children that already existed.
|
|
60
|
+
- **Reflect no longer queues empty-diff or cosmetic-only proposals** (#580).
|
|
61
|
+
A deterministic, LLM-free noise gate diffs each candidate against the current
|
|
62
|
+
asset; byte-identical edits are dropped and changes that are pure formatting
|
|
63
|
+
(whitespace reflow, hard-wrap changes, code-fence language hints, YAML scalar
|
|
64
|
+
re-folding) are suppressed, each recorded via summary events so suppression
|
|
65
|
+
rates are visible in `akm health`.
|
|
66
|
+
|
|
67
|
+
### Added
|
|
68
|
+
|
|
69
|
+
- **`minContentChars` pre-LLM extract gate** (#595, #596). Sessions whose raw
|
|
70
|
+
size is below `profiles.improve.<name>.processes.extract.minContentChars`
|
|
71
|
+
(default 10 — only truly empty sessions/journal files) skip the extract LLM
|
|
72
|
+
call entirely. Gates on raw input size, not post-noise-filter size.
|
|
73
|
+
(Backports of 0.8.12–0.8.14.)
|
|
74
|
+
- **Structured logs database** (#579). Task and run log lines now land in a
|
|
75
|
+
dedicated `logs.db` (WAL, 30 s busy_timeout) keyed by task, run, stream, and
|
|
76
|
+
time, with retention/purge wired into the existing purge pass and `ATTACH`
|
|
77
|
+
support for joining log lines to `state.db` rows (e.g. a failed
|
|
78
|
+
`task_history` row to its log output). The scattered-log audit and per-source
|
|
79
|
+
keep/move/drop decisions are documented in `docs/technical/logs-audit.md`.
|
|
80
|
+
|
|
81
|
+
### Changed
|
|
82
|
+
|
|
83
|
+
- **Proposals are now stored canonically in SQLite** (#578). The previously
|
|
84
|
+
bypassed `proposals` table in state.db is the single source of truth; all
|
|
85
|
+
proposal commands (`list`/`show`/`diff`/`accept`/`reject`/`revert`/`drain`),
|
|
86
|
+
the improve auto-accept gate, and health metrics read and write it through
|
|
87
|
+
one storage layer. Pending file-based proposals are imported on first read;
|
|
88
|
+
`akm proposal *` UX is unchanged. Design and migration notes live in
|
|
89
|
+
`docs/technical/proposal-storage.md`.
|
|
90
|
+
- **Improve planning no longer does per-ref DB lookups or per-ref skip events**
|
|
91
|
+
(#591, #592). Eligible refs carry a pre-resolved `filePath`, removing a
|
|
92
|
+
serial async lookup per ref (~500 s on 9 k-ref stashes), and the
|
|
93
|
+
profile-filtered skip loop emits one summary event with a count instead of
|
|
94
|
+
thousands of rows. (Backports of 0.8.9–0.8.10.)
|
|
95
|
+
|
|
96
|
+
## [0.9.0-beta.2] - 2026-06-09
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
|
|
100
|
+
- **Consolidation starved merge recall; the memory pool grew unbounded.** Commit
|
|
101
|
+
`633ece41` made the `incrementalSince` narrowing unconditional, so every
|
|
102
|
+
consolidation run only judged memories changed since the last run plus their
|
|
103
|
+
immediate vector-neighbors. Stale-but-unmerged duplicate clusters were never
|
|
104
|
+
re-examined, so the eligible pool grew monotonically and never shrank, and
|
|
105
|
+
contradiction detection (which rides on the consolidation pass) went dark.
|
|
106
|
+
Consolidation only runs on the nightly default-profile pass (`quick`/`frequent`
|
|
107
|
+
disable it), so a full-pool sweep is correct and affordable; the override is
|
|
108
|
+
removed. `lastConsolidateTs` still gates whether the pass runs. (Forward-port
|
|
109
|
+
of the 0.8.5 fix.)
|
|
110
|
+
- **`akm tasks sync` ignored schedule changes** — forward-ported from 0.8.4.
|
|
111
|
+
Sync classified any task already present in the OS scheduler as "unchanged"
|
|
112
|
+
without comparing its installed entry, so editing a task's `schedule:` in the
|
|
113
|
+
`.yml` never reached the crontab; the same gap affected `tasks enable`/`disable`
|
|
114
|
+
(toggled the comment, re-enabling a stale schedule). Sync now compares the
|
|
115
|
+
backend's installed signature against the signature the current definition
|
|
116
|
+
renders to and reinstalls on drift (new `updated[]` field); `enable`/`disable`
|
|
117
|
+
reinstall from the current `.yml`. The cron backend gains `expectedSignature()`
|
|
118
|
+
and a per-entry signature on `list()`; other backends fall back to an
|
|
119
|
+
idempotent reinstall.
|
|
120
|
+
|
|
121
|
+
### Added
|
|
122
|
+
|
|
123
|
+
- **`akm improve --skip-if-locked`** — forward-ported from 0.8.4. When another
|
|
124
|
+
improve run already holds the lock, the run logs and exits 0 with a no-op
|
|
125
|
+
result (`skipped.reason: "lock-held"`) instead of failing with the "already
|
|
126
|
+
running" config error (exit 78). Intended for high-frequency scheduled runs
|
|
127
|
+
(e.g. an every-30-min `quick` pass) that overlap a longer run. Default off.
|
|
128
|
+
|
|
129
|
+
### Removed
|
|
130
|
+
|
|
131
|
+
- **`akm config edit`** — the interactive menu-based editor was removed. A
|
|
132
|
+
prompt-driven drill-down was clunkier than just editing the file. Edit the
|
|
133
|
+
config directly (the path is shown by `akm config path`), use
|
|
134
|
+
`akm config set/get/unset` for scripted changes, and `akm config validate` to
|
|
135
|
+
check it.
|
|
136
|
+
|
|
137
|
+
## [0.9.0-beta.1] - 2026-06-08
|
|
138
|
+
|
|
139
|
+
### Fixed
|
|
140
|
+
|
|
141
|
+
- **`improve.lock` leaked on signal death (cron timeout)** — forward-ported from
|
|
142
|
+
0.8.3. The improve SIGTERM/SIGINT/SIGHUP handler calls `process.exit()`, which
|
|
143
|
+
skips `finally` blocks, so the `finally` releasing `improve.lock` never ran and
|
|
144
|
+
every timed-out cron run leaked the lock. It is now released from a
|
|
145
|
+
`process.on("exit", …)` handler registered at acquire time, via a new
|
|
146
|
+
ownership-checked `releaseLockIfOwned(path, pid)`.
|
|
147
|
+
- **`quick` profile was not quick** — forward-ported from 0.8.3. It did not
|
|
148
|
+
disable the default-ON session-`extract` process, so a `quick` run processed
|
|
149
|
+
the entire session backlog (~40 min). `quick` now sets
|
|
150
|
+
`processes.extract.enabled: false`.
|
|
151
|
+
- **`akm-eval` smoke suite adapted to the 0.9.0 CLI** (CI/tooling only). The
|
|
152
|
+
eval harness called `akm search --detail agent`, but 0.9.0 moved the
|
|
153
|
+
agent/summary projections to `--shape`; it now uses `--shape agent`.
|
|
154
|
+
Additionally, the improve-run history readers (`listRecentImproveRunIds` /
|
|
155
|
+
`resolveImproveRunId`) treated a missing `state.db` as an error rather than
|
|
156
|
+
"no runs", which broke the read-only smoke + replay-determinism gates on a
|
|
157
|
+
fresh checkout; a missing `state.db` is now handled as an empty history.
|
|
158
|
+
|
|
159
|
+
## [0.9.0-beta.0] - 2026-06-08
|
|
160
|
+
|
|
161
|
+
### Added
|
|
162
|
+
|
|
163
|
+
- **Cross-runtime: akm now runs on Node.js (≥ 20) in addition to Bun** (#560,
|
|
164
|
+
#465). A two-file runtime boundary (`src/storage/database.ts` owns SQLite via
|
|
165
|
+
`bun:sqlite` on Bun / `better-sqlite3` on Node; `src/runtime.ts` owns every
|
|
166
|
+
`Bun.*` API) contains all runtime-specific code, enforced by a lint guard so it
|
|
167
|
+
cannot leak back out. A CI `node-smoke` matrix runs the built CLI under Node
|
|
168
|
+
20 and 22. **Minimum Node is 20** — the prompts dependency (`@clack/core`) uses
|
|
169
|
+
`node:util.styleText`, added in Node 20.12; Node 18 is EOL and unsupported.
|
|
170
|
+
Bun remains the primary/default runtime.
|
|
171
|
+
- **`session` asset type — agent sessions are now searchable** (#561). The
|
|
172
|
+
`extract` pass, after distilling memory proposals from a session, additionally
|
|
173
|
+
writes the session itself as a first-class `session` asset
|
|
174
|
+
(`sessions/<harness>/<id>.md`) with an LLM-generated `## Summary` /
|
|
175
|
+
`## Key topics` body plus `harness` / `session_id` / `started_at` / `ended_at`
|
|
176
|
+
/ `project` / `log_path` / `access` frontmatter. Sessions become discoverable
|
|
177
|
+
via `akm search --type session` and `akm curate`, and the `access` + `log_path`
|
|
178
|
+
fields tell any agent how to open the raw session log. The behaviour is
|
|
179
|
+
ADDITIVE, FAIL-OPEN, and config-gated via
|
|
180
|
+
`profiles.improve.default.processes.extract.indexSessions` (default on when an
|
|
181
|
+
LLM is configured; set `false` for byte-identical legacy extract behaviour) and
|
|
182
|
+
`…extract.minSessionDuration` (default 5 minutes). Session assets are not
|
|
183
|
+
graph-extracted. No new LLM call is made when no provider is configured.
|
|
184
|
+
|
|
185
|
+
- **`akm env set` / `akm env unset` — single-key `.env` management.** `akm env
|
|
186
|
+
set <ref> <KEY>` sets/updates one key (value from stdin by default, or
|
|
187
|
+
`--from-env <VAR>` / `--from-file <path>` — never argv, never echoed); `akm env
|
|
188
|
+
unset <ref> <KEY...>` removes one or more keys. Both do a minimal edit that
|
|
189
|
+
preserves existing comments and key order, and use `dotenv` as the
|
|
190
|
+
serialisation oracle: a value is only written if `dotenv.parse` reads it back
|
|
191
|
+
exactly, and the whole edit is re-verified so no sibling key is disturbed. This
|
|
192
|
+
reintroduces key-level management (the deprecated `vault set`/`vault unset`
|
|
193
|
+
pointed here); `akm env remove` still removes the whole file.
|
|
194
|
+
|
|
195
|
+
- **`--path` for subdirectory asset creation** (#503) — a consistent `--path
|
|
196
|
+
<relative-dir>` flag across the asset-creating command surface: `akm remember`,
|
|
197
|
+
`akm import`, `akm propose`, `akm workflow create`, `akm env create`, and
|
|
198
|
+
`akm secret set`. `--path` is a directory applied rooted at the asset's type
|
|
199
|
+
directory (e.g. `akm remember "buy milk" --path personal --name grocery-list`
|
|
200
|
+
→ `memories/personal/grocery-list.md`; `akm workflow create ship --path
|
|
201
|
+
release` → `workflows/release/ship.md`). The filename/name still comes from the
|
|
202
|
+
`--name`/name positional (or, for `remember`/`import`, the content/source slug).
|
|
203
|
+
The explicit name is now a **flat** name everywhere: a `/` in it is rejected
|
|
204
|
+
with guidance to use `--path`. System-derived names (e.g. a URL-path-derived
|
|
205
|
+
knowledge name from `akm import <url>`) may still nest. Shared semantics live in
|
|
206
|
+
`src/core/asset-create.ts`. (Replaces #503's earlier nested-`--name` approach.)
|
|
207
|
+
- **Workflow runs record agent harness + session identity** — `akm workflow start`
|
|
208
|
+
now persists the agent harness (e.g. `claude-code`, `opencode`) and the
|
|
209
|
+
platform-native session id that owns each run. Identity is resolved best-effort
|
|
210
|
+
from the environment (`AKM_AGENT_HARNESS` / `AKM_SESSION_ID`, falling back to the
|
|
211
|
+
harness-native session env var) or can be passed explicitly to `startWorkflowRun`.
|
|
212
|
+
Stored via additive migration `002-add-agent-identity` and surfaced on
|
|
213
|
+
`WorkflowRunSummary.agentHarness` / `.agentSessionId`. This is the first concrete,
|
|
214
|
+
scoped slice toward workflow session monitoring (#501).
|
|
215
|
+
- **Workflow agent check-in + step-summary validation** (#506) — workflow runs now
|
|
216
|
+
use a file-signal / command-loop check-in model (no resident background thread, per
|
|
217
|
+
the ADR in `docs/technical/workflow-agent-checkin-adr.md`). `akm workflow start`
|
|
218
|
+
arms a durable check-in timestamp; `akm workflow complete --summary` now **requires**
|
|
219
|
+
a per-step summary and runs it through an LLM completion-criteria validation gate —
|
|
220
|
+
on failure the step stays pending and structured corrective feedback is returned
|
|
221
|
+
(`workflow-complete-rejected`). A pure `evaluateCheckin` surfaces a strong `continue`
|
|
222
|
+
directive through `getNextWorkflowStep` when an active run looks stalled. Migration
|
|
223
|
+
`002` adds `agent_harness`, `agent_session_id`, `checkin_armed_at` on
|
|
224
|
+
`workflow_runs` and `summary` on `workflow_run_steps`.
|
|
225
|
+
- **Default improve profiles + scheduled task set** (#552) — three new bundled
|
|
226
|
+
profiles in `src/assets/profiles/` — `frequent` (extract + inference; distill /
|
|
227
|
+
consolidate excluded), `consolidate` (consolidation-only), and `catchup` (manual
|
|
228
|
+
recovery: consolidate + triage drain) — alongside the existing `default` / `quick` /
|
|
229
|
+
`thorough` / `memory-focus` / `graph-refresh`. `akm setup` and the new `akm tasks
|
|
230
|
+
init` register a multi-cadence task set **idempotently**: `akm-improve-frequent`
|
|
231
|
+
(60 min), `akm-improve-consolidate` (4 h), `akm-improve-nightly` (`thorough`, daily
|
|
232
|
+
2 am, server-gated), `akm-improve-catchup` (registered but unscheduled), and
|
|
233
|
+
`akm-graph-refresh-weekly` (Sun 3 am). Registration is CI-aware (skips when
|
|
234
|
+
`CI=true`) and asks a single "Is this a server install?" prompt to gate the nightly
|
|
235
|
+
task (default yes on Linux-without-battery, no on macOS/laptop).
|
|
236
|
+
|
|
237
|
+
### Design notes
|
|
238
|
+
|
|
239
|
+
- **#501 narrowed; superseded by #506 for the monitoring design.** Issue #501
|
|
240
|
+
("Add background thread for workflow command session monitoring and agent
|
|
241
|
+
prompting") was an epic. Per #506's stated preference to avoid always-on
|
|
242
|
+
background threads/daemons, the background-thread requirement is **not**
|
|
243
|
+
implemented here. #501 is narrowed to the one tractable, prerequisite sub-feature
|
|
244
|
+
— persisting harness + session identity on each workflow run — which any future
|
|
245
|
+
monitor needs regardless of design. The session-monitoring/agent-steering loop is
|
|
246
|
+
deferred to #506 and requires a separately approved design.
|
|
247
|
+
|
|
248
|
+
### Changed
|
|
249
|
+
|
|
250
|
+
- **`improve`: consolidation runs before extract + smarter pool-delta gate**
|
|
251
|
+
(#551). The consolidation phase now runs **before** the session-extract pass
|
|
252
|
+
in the improve pipeline. Extract auto-accept writes new memory `.md` files on
|
|
253
|
+
every run, which previously made the consolidation pool-delta gate
|
|
254
|
+
(`memoryUpdatedAfterLastConsolidate`) fire unconditionally — consolidation
|
|
255
|
+
never skipped and wastefully re-judged freshly-promoted single-source
|
|
256
|
+
memories with no merge/contradiction candidates yet. Running consolidation
|
|
257
|
+
first means it only ever sees memories from **prior** runs; current-run
|
|
258
|
+
extract promotions are not on disk yet. The pool-delta gate is additionally
|
|
259
|
+
narrowed: a memory whose only mtime bump since the last consolidate came from
|
|
260
|
+
its **own** auto-accept promotion (tracked via the `promoted` event's
|
|
261
|
+
`assetPath`) is excluded from the "work to do" check, so adjacent-run
|
|
262
|
+
promotions get a full improve cycle to settle before consolidation considers
|
|
263
|
+
them. When the gate now correctly skips, the existing
|
|
264
|
+
`improve_skipped` / `consolidation_no_memory_updates` event is emitted so
|
|
265
|
+
health reflects it. No event-shape changes; emitted-event order changes only
|
|
266
|
+
because consolidation moved earlier.
|
|
267
|
+
|
|
268
|
+
- **Unified git commit model — single batch-at-boundary commit** (#507). Writing
|
|
269
|
+
or deleting an asset on a git-backed source no longer commits (and optionally
|
|
270
|
+
pushes) **per asset**. `writeAssetToSource` / `deleteAssetFromSource` now
|
|
271
|
+
perform a plain filesystem write/unlink for every kind, and git-backed targets
|
|
272
|
+
are committed **once** at the operation boundary (`akm remember --target`,
|
|
273
|
+
proposal accept/revert, consolidate) as a single complete commit — `git add -A`
|
|
274
|
+
stages `.akm/` state + sibling assets together — pushed under the same
|
|
275
|
+
`writable + remote` gate as `akm save`/`akm sync`. This removes the noisy,
|
|
276
|
+
incomplete per-asset commits (~25 per improve run) and leaves no dirty
|
|
277
|
+
working-tree residue.
|
|
278
|
+
|
|
279
|
+
- **`improve/consolidate`: `minPoolSize` guard** (#553). Consolidation now skips
|
|
280
|
+
itself when the eligible memory pool is below `processes.consolidate.minPoolSize`
|
|
281
|
+
(default **500**), emitting a `consolidation_skipped` event with
|
|
282
|
+
`reason: pool_below_min_size` and making **zero** LLM calls — so the always-enabled
|
|
283
|
+
consolidate task self-activates only once a stash is large enough to have real
|
|
284
|
+
merge/contradiction candidates. `minPoolSize: 0` disables the guard. The skip
|
|
285
|
+
surfaces in `akm health` improve output. The bundled `consolidate` profile sets
|
|
286
|
+
`500`, `catchup` sets `0`.
|
|
287
|
+
|
|
288
|
+
- **`improve/extract`: `minNewSessions` gate** (#554). The extract phase now counts
|
|
289
|
+
in-window, not-yet-seen candidate sessions **before** any LLM call and skips the
|
|
290
|
+
pass (emitting `extract_skipped` / `reason: below_min_new_sessions`, visible in
|
|
291
|
+
`akm health`) when the count is below `processes.extract.minNewSessions`. The
|
|
292
|
+
in-code default is **0 (disabled)**, so existing profiles keep always-run behaviour;
|
|
293
|
+
only the new `frequent` profile opts in with `3`. This removes the ~22% of improve
|
|
294
|
+
runs that previously ran the full `ensureIndex` + extract pipeline for zero new
|
|
295
|
+
sessions.
|
|
296
|
+
|
|
297
|
+
### Deprecated
|
|
298
|
+
|
|
299
|
+
- **`options.pushOnCommit`** (#507). The per-asset push-on-commit knob is retired.
|
|
300
|
+
Existing configs still parse — its push intent is mapped onto the batch push
|
|
301
|
+
gate and a one-time deprecation warning is emitted when the option is
|
|
302
|
+
encountered. Remove it and rely on `writable: true` + a configured remote.
|
|
303
|
+
|
|
304
|
+
### Fixed
|
|
305
|
+
|
|
306
|
+
- **Memory inference re-queued `hot` parents forever** (#550). `markParentProcessed`
|
|
307
|
+
was only called when a derived child was newly written; when the child already
|
|
308
|
+
existed (`written = 0`), the parent never got `inferenceProcessed: true` and was
|
|
309
|
+
re-queued on every `akm improve` run (~37 wasted LLM calls/run on one production
|
|
310
|
+
stash). The child-exists path now marks the parent done (a genuine write failure
|
|
311
|
+
still leaves it unmarked for retry), while `skippedChildExists` accounting is
|
|
312
|
+
unchanged.
|
|
313
|
+
- **Auto-accept rejected truncated LLM descriptions** (#556). ~9.3% of proposals
|
|
314
|
+
failed auto-accept validation because the LLM cut the description mid-clause (ending
|
|
315
|
+
in `to`/`for`/`and`/a comma/etc.) or lost a YAML continuation line. A deterministic
|
|
316
|
+
post-generation repair pass (`repairTruncatedDescription` in
|
|
317
|
+
`src/core/text-truncation.ts`) now trims the truncated fragment to the last complete
|
|
318
|
+
clause or swaps in the first complete sentence from the body — never fabricating
|
|
319
|
+
text — wired into the extract and distill proposal-write paths before validation.
|
|
320
|
+
Already-valid descriptions pass through byte-identical. (Plus a one-line prompt
|
|
321
|
+
tightening requiring a complete sentence.)
|
|
322
|
+
- **Semantic index verification stuck on stashes with vault entries** (#502).
|
|
323
|
+
Verification compared the stored embedding count against the *full* entry count, but
|
|
324
|
+
the embedding phase intentionally excludes vault rows — so any index with vault
|
|
325
|
+
entries reported `embeddingCount < totalEntries` forever and stayed in
|
|
326
|
+
semantic-blocked / verification-failed state. A new `getEmbeddableEntryCount`
|
|
327
|
+
(`entry_type != 'vault'`) now feeds the zero-entry short-circuit, the readiness gate,
|
|
328
|
+
the "Semantic search ready (X/Y)" message, and the persisted `entryCount`; a
|
|
329
|
+
genuinely missing embedding on an embeddable entry still reports `ok:false`.
|
|
330
|
+
|
|
331
|
+
### Internal
|
|
332
|
+
|
|
333
|
+
- **#490 architecture refactor.** Decomposed `src/cli.ts` from **4,589 → 620 LOC**
|
|
334
|
+
across 16 per-family command modules under `src/commands/*-cli.ts` (adopting a
|
|
335
|
+
`defineJsonCommand` factory for byte-identical JSON envelopes); converted `akm
|
|
336
|
+
health` checks to an ordered `HealthCheck` registry; and turned the
|
|
337
|
+
`migrate-storage` bin's 54 hand-rolled `recordStep` sites into a `MigrationStep`
|
|
338
|
+
registry with 3 recursive copy helpers unified into one `copyTree`. Shipped as
|
|
339
|
+
serialized local merges with a zero-behaviour-change contract (byte-identical CLI
|
|
340
|
+
surface + JSON envelopes), each gated and reviewed; the secret-migrating
|
|
341
|
+
`migrate-storage` change is pinned by a sha256 + file-mode fixture-stash
|
|
342
|
+
differential test.
|
|
343
|
+
|
|
344
|
+
## [0.8.14] - 2026-06-11
|
|
345
|
+
|
|
346
|
+
### Fixed
|
|
347
|
+
|
|
348
|
+
- **`akm extract` minContentChars default lowered from 500 to 10.** The 500-char
|
|
349
|
+
threshold used inputCount (raw session size) but analysis showed 209 of 218
|
|
350
|
+
candidate-producing sessions had inputCount < 500 — tiny agent sessions (22–368
|
|
351
|
+
chars) regularly yield 1–5 candidates. The only reliably skippable sessions are
|
|
352
|
+
empty ones (0 chars, journal files). Default lowered to 10 to catch only
|
|
353
|
+
truly empty sessions while preserving all signal-bearing content. Closes #597.
|
|
354
|
+
|
|
355
|
+
## [0.8.13] - 2026-06-11
|
|
356
|
+
|
|
357
|
+
### Fixed
|
|
358
|
+
|
|
359
|
+
- **`akm extract` minContentChars gate filtered all sessions.** The threshold was
|
|
360
|
+
checked against `filtered.stats.outputCount` (post-noise-filter chars), but the
|
|
361
|
+
pre-filter strips so much boilerplate that even signal-bearing sessions end up
|
|
362
|
+
below 500 chars of output. All 75 sessions in the first post-deploy run were
|
|
363
|
+
filtered, dropping candidates from 4–13 to 0. Fix: gate on `inputCount` (raw
|
|
364
|
+
session size) instead — a session with < 500 raw chars has nothing worth
|
|
365
|
+
extracting regardless of what the pre-filter produces. Closes #596.
|
|
366
|
+
|
|
367
|
+
## [0.8.12] - 2026-06-11
|
|
368
|
+
|
|
369
|
+
### Fixed
|
|
370
|
+
|
|
371
|
+
- **`akm extract` calling the LLM for noise sessions that never yield candidates.**
|
|
372
|
+
96% of processed sessions (72/75 measured) produced zero candidates, consuming
|
|
373
|
+
~330 s of LLM time per run. The pre-filter had no minimum content threshold —
|
|
374
|
+
sessions as short as 50 chars were sent to the LLM regardless. A new
|
|
375
|
+
`minContentChars` gate (default 500) skips the LLM call when post-filter
|
|
376
|
+
content falls below threshold, cutting extract LLM calls by ~95% on typical
|
|
377
|
+
stashes. Configurable via `profiles.improve.<name>.processes.extract.minContentChars`.
|
|
378
|
+
Closes #595.
|
|
379
|
+
|
|
380
|
+
## [0.8.11] - 2026-06-11
|
|
381
|
+
|
|
382
|
+
### Fixed
|
|
383
|
+
|
|
384
|
+
- **`akm improve --profile <name>` ignored profile's `extract.enabled: false` setting.**
|
|
385
|
+
The session-extraction gate in the preparation stage called
|
|
386
|
+
`isLlmFeatureEnabled(config, "session_extraction")`, which hardcodes a lookup
|
|
387
|
+
against `profiles.improve.default.processes.extract.enabled`. Any non-default
|
|
388
|
+
profile that set `extract.enabled: false` (e.g. `quick-shredder`) was silently
|
|
389
|
+
ignored, causing the extract pass to run regardless. The fix adds a
|
|
390
|
+
`resolveProcessEnabled("extract", improveProfile)` check so the active
|
|
391
|
+
resolved profile gates the pass correctly. Closes #593.
|
|
392
|
+
|
|
393
|
+
## [0.8.10] - 2026-06-11
|
|
394
|
+
|
|
395
|
+
### Fixed
|
|
396
|
+
|
|
397
|
+
- **`akm improve` taking 8–10 minutes per run due to O(n) DB writes for
|
|
398
|
+
profile-filtered refs.** When a profile disables reflect and distill for
|
|
399
|
+
certain asset types, `collectEligibleRefs` marks those refs as
|
|
400
|
+
`profile_filtered_all_passes`. The caller then emitted one `improve_skipped`
|
|
401
|
+
event per ref — a sequential DB write for each. On a ~9 000-ref stash this
|
|
402
|
+
was ~500 s of SQLite writes before any consolidation or memory inference
|
|
403
|
+
began. The fix collapses the per-ref loop into a single summary event
|
|
404
|
+
carrying a `count` field, eliminating ~9 000 sequential writes per run.
|
|
405
|
+
Closes #590.
|
|
406
|
+
|
|
407
|
+
## [0.8.9] - 2026-06-11
|
|
408
|
+
|
|
409
|
+
### Fixed
|
|
410
|
+
|
|
411
|
+
- **`akm improve` validation pass was O(n) in stash size, causing ~510 s overhead
|
|
412
|
+
on large stashes.** For every indexed ref, the preparation phase called
|
|
413
|
+
`findAssetFilePath()` — an async round-trip to the index DB followed by a
|
|
414
|
+
filesystem probe — serially inside a `for…await` loop. With ~9 000 indexed
|
|
415
|
+
refs at ~55 ms each, this loop consumed the entire 600–900 s run budget before
|
|
416
|
+
any reflect, triage, or memory-inference work began. The fix threads
|
|
417
|
+
`filePath` from the planning stage (`collectEligibleRefs`) through
|
|
418
|
+
`ImproveEligibleRef` so the validation pass and the disk-existence guard can
|
|
419
|
+
use the pre-resolved path directly. The async lookup is retained only as a
|
|
420
|
+
fallback for refs that enter via a narrow scope (e.g. `--scope ref:foo`).
|
|
421
|
+
Closes #587.
|
|
422
|
+
|
|
423
|
+
## [0.8.8] - 2026-06-11
|
|
424
|
+
|
|
425
|
+
### Fixed
|
|
426
|
+
|
|
427
|
+
- **SQLite `SQLITE_BUSY` errors under concurrent improve runs.** `busy_timeout`
|
|
428
|
+
was set to 5 000 ms in all three database open paths (`openDatabase`,
|
|
429
|
+
`openExistingDatabase`, `openStateDatabase`). Under a busy cron schedule — or
|
|
430
|
+
when a reindex triggered by memory inference ran concurrently with an event
|
|
431
|
+
write — the 5 s window was routinely exhausted, producing "database is locked"
|
|
432
|
+
failures. Raised to 30 000 ms across all three paths so transient lock
|
|
433
|
+
contention is retried for up to 30 s before surfacing as an error.
|
|
434
|
+
|
|
435
|
+
## [0.8.7] - 2026-06-09
|
|
436
|
+
|
|
437
|
+
### Fixed
|
|
438
|
+
|
|
439
|
+
- **`incrementalSince` duration strings were silently ignored.** Values like
|
|
440
|
+
`"30m"`, `"24h"`, `"7d"` were passed raw to `narrowToIncrementalCandidates`,
|
|
441
|
+
which compared them against ISO timestamps via string sort. All `2026-...`
|
|
442
|
+
timestamps are lexicographically less than `"30m"` (`'2' < '3'`) and `"24h"`
|
|
443
|
+
(`"20" < "24"`), so `isChanged()` always returned `false` and the candidate
|
|
444
|
+
pool was silently emptied rather than filtered to the window. The fix adds
|
|
445
|
+
`parseSinceToIso()`, which resolves human duration strings to absolute ISO
|
|
446
|
+
timestamps before comparison. Values that already look like ISO timestamps
|
|
447
|
+
are passed through unchanged.
|
|
448
|
+
|
|
7
449
|
## [0.8.6] - 2026-06-09
|
|
8
450
|
|
|
9
451
|
### Added
|
|
@@ -4,8 +4,7 @@ Usage:
|
|
|
4
4
|
Description:
|
|
5
5
|
List proposal queue entries.
|
|
6
6
|
|
|
7
|
-
(`akm proposals`
|
|
8
|
-
stderr and is removed in 0.9.0.)
|
|
7
|
+
(The flat `akm proposals` alias was removed in 0.9.0 — use `akm proposal list`.)
|
|
9
8
|
|
|
10
9
|
Options:
|
|
11
10
|
--status <status> Filter by pending, accepted, or rejected
|
|
@@ -22,7 +22,6 @@ akm search "<query>" --detail full # Include scores, paths, timing
|
|
|
22
22
|
| `--format` | `json`, `jsonl`, `text`, `yaml` | `json` |
|
|
23
23
|
| `--detail` | `brief`, `normal`, `full` | `brief` |
|
|
24
24
|
| `--shape` | `human`, `agent`, `summary` (`summary` only on `show`) | `human` |
|
|
25
|
-
| `--for-agent` | boolean (deprecated — use `--shape agent`) | `false` |
|
|
26
25
|
|
|
27
26
|
## Curate
|
|
28
27
|
|
|
@@ -59,7 +58,8 @@ akm show knowledge:my-doc # Show content (local or remote)
|
|
|
59
58
|
| knowledge | `content` (with view modes: `full`, `toc`, `frontmatter`, `section`, `lines`) |
|
|
60
59
|
| workflow | `workflowTitle`, `workflowParameters`, `steps` |
|
|
61
60
|
| memory | `content` (recalled context) |
|
|
62
|
-
|
|
|
61
|
+
| env | `keys`, `comments` (key names + comments only — values never returned) |
|
|
62
|
+
| secret | `name` only (the whole file is the value — never returned) |
|
|
63
63
|
| wiki | `content` (same view modes as knowledge). For any wiki task, run `akm wiki list`. To ingest sources, `akm wiki ingest <name>` dispatches the configured agent (defaults.agent or `--profile`) to execute the ingest workflow. |
|
|
64
64
|
|
|
65
65
|
## Capture Knowledge While You Work
|
|
@@ -78,7 +78,7 @@ akm workflow next workflow:ship-release # Start or resume the next workfl
|
|
|
78
78
|
akm feedback skill:code-review --positive # Record that an asset helped
|
|
79
79
|
akm feedback agent:reviewer --negative # Record that an asset missed the mark
|
|
80
80
|
akm feedback memory:deployment-notes --positive # Works for memories too
|
|
81
|
-
akm feedback
|
|
81
|
+
akm feedback env:prod --positive # Records env feedback without surfacing values
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
Use `akm feedback` whenever an asset materially helps or fails so future search
|
|
@@ -119,20 +119,37 @@ page create/update, log entry, lint, reindex.** Wiki pages are also addressable
|
|
|
119
119
|
`schema.md`, `index.md`, and `log.md` are not indexed and do not appear in
|
|
120
120
|
search results. No `--llm` anywhere — akm never reasons about page content.
|
|
121
121
|
|
|
122
|
-
##
|
|
122
|
+
## Env files
|
|
123
123
|
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
A group of related CONFIGURATION for an app/service in one `.env` file at
|
|
125
|
+
`<stashDir>/env/<name>.env`, sourced/injected wholesale. Key names + comments
|
|
126
|
+
are discoverable; values stay on disk and never reach stdout or the index. akm
|
|
127
|
+
does not edit entries — you edit the file with your own editor and akm loads it.
|
|
126
128
|
|
|
127
129
|
```sh
|
|
128
|
-
akm
|
|
129
|
-
akm
|
|
130
|
-
akm
|
|
131
|
-
akm
|
|
132
|
-
akm
|
|
133
|
-
akm
|
|
134
|
-
akm
|
|
135
|
-
akm
|
|
130
|
+
akm env create prod # Create an empty env file
|
|
131
|
+
akm env create prod --from-file ./.env # Ingest an existing .env
|
|
132
|
+
akm env list # List all env files across stashes with key names
|
|
133
|
+
akm show env:prod # Inspect key names + comments (never values)
|
|
134
|
+
akm env run env:prod -- ./deploy.sh # Run a command with the whole .env injected (the safe path)
|
|
135
|
+
akm env run env:prod -- $SHELL # Open an interactive shell with values injected
|
|
136
|
+
akm env export env:prod --out ./env.sh # Write a sourceable script to a file (mode 0600)
|
|
137
|
+
akm env path env:prod --quiet # Print the raw file path (for Docker `_FILE` / `--env-file`)
|
|
138
|
+
akm env remove env:prod # Delete the env file
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Secrets
|
|
142
|
+
|
|
143
|
+
A single sensitive value used on its own for authentication (a token, key, or
|
|
144
|
+
cert) — one file = one value at `<stashDir>/secrets/<name>`. The ENTIRE file is
|
|
145
|
+
the value; only the name is ever surfaced.
|
|
146
|
+
|
|
147
|
+
```sh
|
|
148
|
+
printf '%s' "$TOKEN" | akm secret set secret:deploy-token # Store a single value
|
|
149
|
+
akm secret list # List secrets (names only)
|
|
150
|
+
akm secret path secret:deploy-token # Print the file path (Docker `_FILE`)
|
|
151
|
+
akm secret run secret:deploy-token GITHUB_TOKEN -- gh release create v1.0.0 # Inject into one env var
|
|
152
|
+
akm secret remove secret:deploy-token # Delete the secret
|
|
136
153
|
```
|
|
137
154
|
|
|
138
155
|
## Workflows
|
|
@@ -171,8 +188,7 @@ When `--dest` is provided, `akm init` is not required first.
|
|
|
171
188
|
## Sync
|
|
172
189
|
|
|
173
190
|
Commit local changes in a git-backed stash. Behaviour adapts automatically.
|
|
174
|
-
(`akm save`
|
|
175
|
-
in 0.9.0.)
|
|
191
|
+
(`akm save` was the pre-0.8 spelling; it was removed in 0.9.0 — use `akm sync`.)
|
|
176
192
|
|
|
177
193
|
- **No `.git` directory** — no-op (silent skip)
|
|
178
194
|
- **Git repo, no remote** — stage and commit only (the default stash always falls here)
|
|
@@ -279,8 +295,8 @@ akm proposal revert <id> # Restore the pre-promot
|
|
|
279
295
|
```
|
|
280
296
|
|
|
281
297
|
The flat verbs `akm proposals` / `akm show proposal` / `akm accept` /
|
|
282
|
-
`akm reject` / `akm diff` / `akm revert`
|
|
283
|
-
|
|
298
|
+
`akm reject` / `akm diff` / `akm revert` were removed in 0.9.0 — use the
|
|
299
|
+
`akm proposal <verb>` forms above.
|
|
284
300
|
|
|
285
301
|
Per-task `timeoutMs`: task markdown frontmatter may set `timeoutMs: null` to
|
|
286
302
|
disable the agent kill timer for long-running local-model tasks, or a number
|
|
@@ -300,6 +316,5 @@ All commands accept `--format`, `--detail`, and `--shape` flags:
|
|
|
300
316
|
- `--shape human` (default) — standard projection
|
|
301
317
|
- `--shape agent` — agent-optimized output: strips non-actionable fields
|
|
302
318
|
- `--shape summary` — metadata only (no content/template/prompt), under 200 tokens; only valid on `akm show`
|
|
303
|
-
- `--for-agent` — deprecated alias for `--shape agent` (removed 0.9.0)
|
|
304
319
|
|
|
305
320
|
Run `akm -h` or `akm <command> -h` for per-command help.
|
|
@@ -58,7 +58,7 @@ akm registry search "<query>" # Search all registries
|
|
|
58
58
|
| knowledge | A reference doc (use `toc` or `section "..."` to navigate) |
|
|
59
59
|
| workflow | Parsed steps plus workflow-specific execution commands |
|
|
60
60
|
| memory | Recalled context (read the content for background information) |
|
|
61
|
-
| env | A `.env` file of related CONFIGURATION (many vars; sensitive or not — all protected); key names only. Inject with `akm env run <ref> -- <cmd>` (the agent-safe path — values stay on disk).
|
|
61
|
+
| env | A `.env` file of related CONFIGURATION (many vars; sensitive or not — all protected); key names only. Inject with `akm env run <ref> -- <cmd>` (the agent-safe path — values stay on disk). |
|
|
62
62
|
| secret | A single sensitive value for AUTHENTICATION (token, key, cert); name only. Use `akm secret path` / `akm secret run`. |
|
|
63
63
|
| wiki | A page in a multi-wiki knowledge base. For any wiki task, start with `akm wiki list`. To ingest sources, run `akm wiki ingest <name>` — it dispatches the configured agent profile to execute the ingest workflow against the wiki's `raw/` directory. Run `akm wiki -h` for the full surface. |
|
|
64
64
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Manual catch-up — consolidation + triage drain with no interval minimum.",
|
|
3
|
+
"processes": {
|
|
4
|
+
"reflect": { "enabled": false },
|
|
5
|
+
"distill": { "enabled": false },
|
|
6
|
+
"consolidate": { "enabled": true, "allowedTypes": ["memory"], "maxChunkSize": 50, "minPoolSize": 0 },
|
|
7
|
+
"memoryInference": { "enabled": false },
|
|
8
|
+
"graphExtraction": { "enabled": false },
|
|
9
|
+
"extract": { "enabled": false },
|
|
10
|
+
"triage": { "enabled": true, "applyMode": "queue", "policy": "personal-stash", "maxAcceptsPerRun": 100 }
|
|
11
|
+
},
|
|
12
|
+
"sync": { "enabled": true, "push": true }
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Consolidation-only pass — merges, deduplicates, and prunes memories every 4h.",
|
|
3
|
+
"processes": {
|
|
4
|
+
"reflect": { "enabled": false },
|
|
5
|
+
"distill": { "enabled": false },
|
|
6
|
+
"consolidate": { "enabled": true, "allowedTypes": ["memory"], "maxChunkSize": 25, "minPoolSize": 500 },
|
|
7
|
+
"memoryInference": { "enabled": false },
|
|
8
|
+
"graphExtraction": { "enabled": false },
|
|
9
|
+
"extract": { "enabled": false },
|
|
10
|
+
"triage": { "enabled": false }
|
|
11
|
+
},
|
|
12
|
+
"sync": { "enabled": true, "push": true }
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Frequent extract + inference pass — sessions, memory inference, graph, reflect.",
|
|
3
|
+
"processes": {
|
|
4
|
+
"reflect": { "enabled": true },
|
|
5
|
+
"distill": { "enabled": false },
|
|
6
|
+
"consolidate": { "enabled": false },
|
|
7
|
+
"memoryInference": { "enabled": true },
|
|
8
|
+
"graphExtraction": { "enabled": true },
|
|
9
|
+
"extract": { "enabled": true, "minNewSessions": 3 },
|
|
10
|
+
"triage": { "enabled": false }
|
|
11
|
+
},
|
|
12
|
+
"sync": { "enabled": true, "push": true }
|
|
13
|
+
}
|