akm-cli 0.9.0-rc.8 → 0.9.0
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 +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { assertNever } from "../../core/assert.js";
|
|
7
|
+
import { parseRefInput } from "../../core/asset/resolve-ref.js";
|
|
7
8
|
import { daysToMs } from "../../core/common.js";
|
|
8
|
-
import { loadConfig } from "../../core/config/config.js";
|
|
9
|
-
import { rethrowIfTestIsolationError } from "../../core/errors.js";
|
|
9
|
+
import { bundlesToSourceEntries, loadConfig } from "../../core/config/config.js";
|
|
10
|
+
import { ConfigError, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
|
|
10
11
|
import { appendEvent, readEvents } from "../../core/events.js";
|
|
11
12
|
import { classifyImproveAction, foldDistillSkipped } from "../../core/improve-types.js";
|
|
13
|
+
import { resolveMutationTarget } from "../../core/mutation-target.js";
|
|
12
14
|
import { getDbPath, getStateDbPathInDataDir } from "../../core/paths.js";
|
|
13
15
|
import { redactSensitiveText } from "../../core/redaction.js";
|
|
14
16
|
import { openStateDatabase } from "../../core/state-db.js";
|
|
@@ -16,16 +18,16 @@ import { info, warn } from "../../core/warn.js";
|
|
|
16
18
|
import { resolveWritable, resolveWriteTarget } from "../../core/write-source.js";
|
|
17
19
|
import { ensureIndex } from "../../indexer/ensure-index.js";
|
|
18
20
|
import { akmIndex } from "../../indexer/indexer.js";
|
|
19
|
-
import { resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
21
|
+
import { resolveEntryContentDir, resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
20
22
|
import { collectEngineCredentialValues } from "../../integrations/agent/engine-resolution.js";
|
|
21
23
|
import { materializeLlmRunnerConnection } from "../../integrations/agent/runner.js";
|
|
22
24
|
import { installLlmUsagePersistence } from "../../llm/usage-persist.js";
|
|
23
|
-
import { withLlmStage } from "../../llm/usage-telemetry.js";
|
|
24
25
|
import { isGitBackedStash, listGitChangedPaths, resolveWritableOverride, saveGitStash, } from "../../sources/providers/git.js";
|
|
25
26
|
import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
|
|
26
27
|
import { getEntryCount } from "../../storage/repositories/index-entries-repository.js";
|
|
27
28
|
import { drainProposals } from "../proposal/drain.js";
|
|
28
29
|
import { resolveDrainPolicy } from "../proposal/drain-policies.js";
|
|
30
|
+
import { describeGatedLanes, isAutonomyLaneAllowed } from "./autonomy-gate.js";
|
|
29
31
|
import { akmDistill } from "./distill.js";
|
|
30
32
|
// Eligibility / candidate-selection predicates live in ./eligibility.
|
|
31
33
|
import { buildLatestProposalTsMap, collectEligibleRefs, collectEligibleRefsReadOnly, memoryCleanupParentRef, resolveImproveScope, shouldAnalyzeMemoryCleanup, } from "./eligibility.js";
|
|
@@ -34,7 +36,6 @@ import { resolveImprovePlan } from "./improve-strategies.js";
|
|
|
34
36
|
import { improveLockPath, MIN_IMPROVE_LOCK_STALE_MS, releaseImproveLock, tryAcquireImproveLock } from "./locks.js";
|
|
35
37
|
// The cycle loop / post-loop / maintenance stages live in ./loop-stages.
|
|
36
38
|
import { runImproveLoopStage, runImprovePostLoopStage } from "./loop-stages.js";
|
|
37
|
-
import { detectAndWriteContradictions } from "./memory/memory-contradiction-detect.js";
|
|
38
39
|
import { analyzeMemoryCleanup } from "./memory/memory-improve.js";
|
|
39
40
|
// The pre-loop preparation pipeline lives in ./preparation.
|
|
40
41
|
import { runImprovePreparationStage } from "./preparation.js";
|
|
@@ -42,7 +43,6 @@ import { DEFAULT_DUE_DAYS, filterProactiveDue } from "./proactive-maintenance.js
|
|
|
42
43
|
import { akmReflect } from "./reflect.js";
|
|
43
44
|
import { createRunContext } from "./run-context.js";
|
|
44
45
|
import { errMessage } from "./shared.js";
|
|
45
|
-
import { shouldReadLegacyBareImproveState } from "./source-identity.js";
|
|
46
46
|
// Re-exported from ./loop-stages for test importers (improve-db-locking).
|
|
47
47
|
export { runImproveMaintenancePasses } from "./loop-stages.js";
|
|
48
48
|
export function renderSyncCommitMessage(template, result, nowMs) {
|
|
@@ -98,10 +98,19 @@ export async function akmImprove(options = {}) {
|
|
|
98
98
|
let memorySummary = { eligible: 0, derived: 0 };
|
|
99
99
|
let strategyFilteredRefs = [];
|
|
100
100
|
let memoryCleanupPlan;
|
|
101
|
+
let autonomyGatedDirectLanes = [];
|
|
101
102
|
let guidance;
|
|
102
103
|
let triageDrain;
|
|
103
104
|
let improveLockOwnership;
|
|
104
105
|
let exitBackstop;
|
|
106
|
+
// I1: open a single state.db connection for the main improve run so all
|
|
107
|
+
// appendEvent calls reuse one handle instead of open/migrate/close per call.
|
|
108
|
+
let eventsDb;
|
|
109
|
+
// Start boundary-pinned for prepass telemetry, then replace this binding with
|
|
110
|
+
// the long-lived handle after the prepass. The usage sink resolves it per
|
|
111
|
+
// append, so one owner and counter span both lifecycle phases.
|
|
112
|
+
let eventsCtx = { dbPath: resolvedStateDbPath };
|
|
113
|
+
let disposeLlmUsageSink = () => { };
|
|
105
114
|
const releaseRunLock = () => {
|
|
106
115
|
const ownership = improveLockOwnership;
|
|
107
116
|
if (!ownership)
|
|
@@ -114,6 +123,13 @@ export async function akmImprove(options = {}) {
|
|
|
114
123
|
// Best-effort cleanup. Exact ownership prevents deleting a successor.
|
|
115
124
|
}
|
|
116
125
|
};
|
|
126
|
+
const commitStashBatch = makeCommitStashBatch({
|
|
127
|
+
run: setup,
|
|
128
|
+
getInitialGitPaths: () => initialGitPaths,
|
|
129
|
+
// Captured via getter: the live `eventsCtx` binding is reassigned after the
|
|
130
|
+
// prepass, and the catch-path sync must write through the current context.
|
|
131
|
+
getEventsCtx: () => eventsCtx,
|
|
132
|
+
});
|
|
117
133
|
if (!options.dryRun) {
|
|
118
134
|
const remainingBudget = budgetAbortController.signal.remainingBudgetMs;
|
|
119
135
|
clearBudgetTimer = armBudgetWatchdog(Math.max(1, remainingBudget ?? budgetMs), budgetAbortController);
|
|
@@ -129,6 +145,7 @@ export async function akmImprove(options = {}) {
|
|
|
129
145
|
return buildLockSkippedResult(selectedStrategy.name, scope, options.runId);
|
|
130
146
|
}
|
|
131
147
|
improveLockOwnership = acquisition.ownership;
|
|
148
|
+
disposeLlmUsageSink = installLlmUsagePersistence(() => eventsCtx);
|
|
132
149
|
exitBackstop = releaseRunLock;
|
|
133
150
|
process.on("exit", exitBackstop);
|
|
134
151
|
initialGitPaths =
|
|
@@ -144,6 +161,7 @@ export async function akmImprove(options = {}) {
|
|
|
144
161
|
memorySummary = collected.memorySummary;
|
|
145
162
|
strategyFilteredRefs = collected.strategyFilteredRefs;
|
|
146
163
|
memoryCleanupPlan = collected.memoryCleanupPlan;
|
|
164
|
+
autonomyGatedDirectLanes = collected.autonomyGatedDirectLanes;
|
|
147
165
|
guidance = collected.guidance;
|
|
148
166
|
preEnsureCleanupWarnings.push(...collected.warnings);
|
|
149
167
|
if (options.dryRun) {
|
|
@@ -153,6 +171,9 @@ export async function akmImprove(options = {}) {
|
|
|
153
171
|
}
|
|
154
172
|
}
|
|
155
173
|
catch (err) {
|
|
174
|
+
// If the live prepass fails, emit its summary and clear the owning sink
|
|
175
|
+
// before any run teardown. The disposer is idempotent with the main finalizer.
|
|
176
|
+
disposeLlmUsageSink();
|
|
156
177
|
clearBudgetTimer();
|
|
157
178
|
if (exitBackstop) {
|
|
158
179
|
process.removeListener("exit", exitBackstop);
|
|
@@ -161,25 +182,6 @@ export async function akmImprove(options = {}) {
|
|
|
161
182
|
releaseRunLock();
|
|
162
183
|
throw err;
|
|
163
184
|
}
|
|
164
|
-
// I1: open a single state.db connection for the entire improve run so all
|
|
165
|
-
// appendEvent calls reuse one handle instead of open/migrate/close per call.
|
|
166
|
-
let eventsDb;
|
|
167
|
-
// `eventsCtx` is read by the main catch (improve_failed) and finally, so it
|
|
168
|
-
// lives in the outer scope. It is always assigned at the top of the try.
|
|
169
|
-
// Pinned to the boundary snapshot so the fallback per-call `appendEvent`
|
|
170
|
-
// opens (when the long-lived handle below fails to open) never re-read env.
|
|
171
|
-
let eventsCtx = { dbPath: resolvedStateDbPath };
|
|
172
|
-
// #576: clears the per-run LLM usage sink. Defaults to a no-op until the sink
|
|
173
|
-
// is installed inside the try; the `finally` always calls it.
|
|
174
|
-
let disposeLlmUsageSink = () => { };
|
|
175
|
-
const commitStashBatch = makeCommitStashBatch({
|
|
176
|
-
run: setup,
|
|
177
|
-
getInitialGitPaths: () => initialGitPaths,
|
|
178
|
-
// Captured via getter: the live `eventsCtx` binding is reassigned inside
|
|
179
|
-
// the try below, and the catch-path sync must write through whichever
|
|
180
|
-
// context is current (#662 / P6/P7 in the chunk-7 ledger).
|
|
181
|
-
getEventsCtx: () => eventsCtx,
|
|
182
|
-
});
|
|
183
185
|
try {
|
|
184
186
|
try {
|
|
185
187
|
eventsDb = openStateDatabase(resolvedStateDbPath);
|
|
@@ -191,11 +193,6 @@ export async function akmImprove(options = {}) {
|
|
|
191
193
|
// still pinned to the boundary-resolved path, never a live env re-read.
|
|
192
194
|
eventsCtx = { dbPath: resolvedStateDbPath };
|
|
193
195
|
}
|
|
194
|
-
// #576: persist per-call LLM usage telemetry for this run as `llm_usage`
|
|
195
|
-
// events, reusing the same boundary-pinned events context (and long-lived
|
|
196
|
-
// handle when available). Disposed in `finally` so the sink never leaks
|
|
197
|
-
// across runs. Wrapping is best-effort end to end — see usage-telemetry.ts.
|
|
198
|
-
disposeLlmUsageSink = installLlmUsagePersistence(eventsCtx);
|
|
199
196
|
// WI-9.10: construct the run's RunContext here — the first point after
|
|
200
197
|
// run-setup where config/stashDir/eventsCtx/proposalsCtx/sourceRun/dryRun
|
|
201
198
|
// are all in hand. See buildImproveRunContext for exactly which
|
|
@@ -206,6 +203,7 @@ export async function akmImprove(options = {}) {
|
|
|
206
203
|
strategyFilteredRefs,
|
|
207
204
|
plannedRefs,
|
|
208
205
|
memoryCleanupPlan,
|
|
206
|
+
autonomyGatedDirectLanes,
|
|
209
207
|
memorySummary,
|
|
210
208
|
preEnsureCleanupWarnings,
|
|
211
209
|
eventsCtx,
|
|
@@ -272,13 +270,33 @@ export async function akmImprove(options = {}) {
|
|
|
272
270
|
}
|
|
273
271
|
}
|
|
274
272
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
273
|
+
/** Resolve a dry-run inspection source without adapting it into a write target. */
|
|
274
|
+
function resolveImproveReadSource(config, scopedRef, explicitTarget, fallbackStashDir) {
|
|
275
|
+
if (scopedRef?.origin && explicitTarget && scopedRef.origin !== explicitTarget) {
|
|
276
|
+
throw new UsageError(`Qualified ref bundle "${scopedRef.origin}" conflicts with --target "${explicitTarget}".`, "INVALID_FLAG_VALUE", `Drop --target or use --target ${scopedRef.origin}.`);
|
|
277
|
+
}
|
|
278
|
+
const selector = scopedRef?.origin ?? explicitTarget ?? config.defaultWriteTarget;
|
|
279
|
+
if (!selector && fallbackStashDir) {
|
|
280
|
+
return { source: { name: "stash", path: fallbackStashDir } };
|
|
281
|
+
}
|
|
282
|
+
const configuredSelector = selector ?? config.defaultBundle;
|
|
283
|
+
if (configuredSelector) {
|
|
284
|
+
const entry = bundlesToSourceEntries(config)?.find((source) => source.name === configuredSelector);
|
|
285
|
+
if (!entry) {
|
|
286
|
+
throw new UsageError(`No source named "${configuredSelector}" is configured. Run \`akm bundle list\` to see available sources.`, "INVALID_FLAG_VALUE");
|
|
287
|
+
}
|
|
288
|
+
const sourcePath = resolveEntryContentDir(entry);
|
|
289
|
+
if (!sourcePath) {
|
|
290
|
+
throw new ConfigError(`Source "${configuredSelector}" has no resolvable on-disk path; improve cannot inspect this entry.`, "INVALID_CONFIG_FILE");
|
|
291
|
+
}
|
|
292
|
+
return { selector: configuredSelector, source: { name: configuredSelector, path: sourcePath } };
|
|
293
|
+
}
|
|
294
|
+
const implicit = resolveSourceEntries(undefined, config)[0];
|
|
295
|
+
if (!implicit) {
|
|
296
|
+
throw new ConfigError("no source configured; run `akm bundle create`", "STASH_DIR_NOT_FOUND");
|
|
297
|
+
}
|
|
298
|
+
return { source: { name: implicit.registryId ?? "stash", path: implicit.path } };
|
|
299
|
+
}
|
|
282
300
|
/**
|
|
283
301
|
* Run-setup: budget/watchdog plumbing, scope + seam resolution, the invocation
|
|
284
302
|
* plan, write-target resolution, the profile-defaulted options rebuild, and
|
|
@@ -316,18 +334,32 @@ function resolveImproveRunSetup(options) {
|
|
|
316
334
|
const selectedStrategy = resolvedPlan.strategy;
|
|
317
335
|
const improveSensitiveValues = collectEngineCredentialValues(_earlyConfig);
|
|
318
336
|
const improveProfile = selectedStrategy.config;
|
|
319
|
-
const
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
:
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
337
|
+
const scopedRef = scope.mode === "ref" && scope.value ? parseRefInput(scope.value) : undefined;
|
|
338
|
+
const readSource = options.dryRun
|
|
339
|
+
? options.writeTarget
|
|
340
|
+
? { selector: options.writeTarget.selector, source: options.writeTarget.source }
|
|
341
|
+
: resolveImproveReadSource(_earlyConfig, scopedRef, options.target, options.stashDir)
|
|
342
|
+
: undefined;
|
|
343
|
+
const writeTarget = options.dryRun
|
|
344
|
+
? undefined
|
|
345
|
+
: scopedRef?.origin
|
|
346
|
+
? resolveMutationTarget(_earlyConfig, scopedRef, options.writeTarget?.source.name ?? options.target).target
|
|
347
|
+
: (options.writeTarget ??
|
|
348
|
+
(options.target || _earlyConfig.defaultWriteTarget || !options.stashDir
|
|
349
|
+
? resolveWriteTarget(_earlyConfig, options.target)
|
|
350
|
+
: {
|
|
351
|
+
source: { kind: "filesystem", name: "stash", path: options.stashDir },
|
|
352
|
+
config: {
|
|
353
|
+
type: "filesystem",
|
|
354
|
+
name: "stash",
|
|
355
|
+
path: options.stashDir,
|
|
356
|
+
writable: true,
|
|
357
|
+
},
|
|
358
|
+
}));
|
|
359
|
+
const selectedSource = writeTarget?.source ?? readSource?.source;
|
|
360
|
+
if (!selectedSource)
|
|
361
|
+
throw new ConfigError("improve could not resolve a source", "STASH_DIR_NOT_FOUND");
|
|
362
|
+
const selectedSelector = writeTarget?.selector ?? readSource?.selector;
|
|
331
363
|
// Apply profile defaults — CLI flags take precedence over profile defaults.
|
|
332
364
|
// Rebuild options with effective values so all downstream stage functions
|
|
333
365
|
// automatically pick up the profile-driven defaults.
|
|
@@ -336,17 +368,15 @@ function resolveImproveRunSetup(options) {
|
|
|
336
368
|
// Pin nested calls and quality gates to the same config snapshot as the
|
|
337
369
|
// invocation plan. They must never reload a changed config mid-run.
|
|
338
370
|
config: _earlyConfig,
|
|
339
|
-
target:
|
|
340
|
-
sourceName:
|
|
341
|
-
writeTarget,
|
|
342
|
-
stashDir:
|
|
371
|
+
target: selectedSelector,
|
|
372
|
+
sourceName: selectedSource.name,
|
|
373
|
+
...(writeTarget ? { writeTarget } : {}),
|
|
374
|
+
stashDir: selectedSource.path,
|
|
343
375
|
consolidateOptions: {
|
|
344
376
|
...options.consolidateOptions,
|
|
345
|
-
target:
|
|
346
|
-
writeTarget,
|
|
377
|
+
target: selectedSelector,
|
|
378
|
+
...(writeTarget ? { writeTarget } : {}),
|
|
347
379
|
},
|
|
348
|
-
legacyBareState: options.legacyBareState ??
|
|
349
|
-
shouldReadLegacyBareImproveState(writeTarget.source.name, writeTarget.source.path, _earlyConfig),
|
|
350
380
|
// Profile-level limit, then process-level reflect.limit as fallback.
|
|
351
381
|
// CLI --limit takes precedence over both.
|
|
352
382
|
limit: options.limit ?? improveProfile?.processes?.reflect?.limit ?? improveProfile.limit,
|
|
@@ -465,7 +495,7 @@ function recordImproveFailure(err, run, eventsCtx) {
|
|
|
465
495
|
*/
|
|
466
496
|
async function indexAndCollect(args) {
|
|
467
497
|
const { signal } = args;
|
|
468
|
-
const { scope, options, primaryStashDir, improveProfile,
|
|
498
|
+
const { scope, options, primaryStashDir, improveProfile, _earlyConfig, ensureIndexFn, collectEligibleRefsImpl } = args.run;
|
|
469
499
|
const warnings = [];
|
|
470
500
|
let plannedRefs = [];
|
|
471
501
|
let memorySummary = { eligible: 0, derived: 0 };
|
|
@@ -533,31 +563,23 @@ async function indexAndCollect(args) {
|
|
|
533
563
|
plannedRefs,
|
|
534
564
|
memorySummary,
|
|
535
565
|
strategyFilteredRefs = [],
|
|
536
|
-
} = await collectEligibleRefsImpl(scope, options.stashDir, improveProfile));
|
|
566
|
+
} = await collectEligibleRefsImpl(scope, options.stashDir, improveProfile, _earlyConfig));
|
|
537
567
|
const cleanupParentRef = memoryCleanupParentRef(scope, options.stashDir);
|
|
538
|
-
//
|
|
539
|
-
//
|
|
540
|
-
//
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
const contradictionDetectionFn = options.contradictionDetectionFn ?? detectAndWriteContradictions;
|
|
547
|
-
await withLlmStage("memory-contradiction", () => contradictionDetectionFn(primaryStashDir, _earlyConfig, undefined, improveProfile, resolvedPlan.processes.consolidate.runner
|
|
548
|
-
? materializeLlmRunnerConnection(resolvedPlan.processes.consolidate.runner)
|
|
549
|
-
: null), { engine: resolvedPlan.processes.consolidate.runner?.engine, process: "consolidate" });
|
|
550
|
-
}
|
|
551
|
-
catch (err) {
|
|
552
|
-
if (signal.aborted)
|
|
553
|
-
throw err;
|
|
554
|
-
// Non-fatal: contradiction detection is a best-effort pass.
|
|
555
|
-
warn(`[improve] contradiction detection failed (non-fatal): ${errMessage(err)}`);
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
const memoryCleanupPlan = shouldAnalyzeMemoryCleanup(scope, memorySummary.eligible, primaryStashDir)
|
|
568
|
+
// D8 — the two direct lanes share one eligibility predicate, which reads scope
|
|
569
|
+
// and eligible-memory count and no strategy flag at all. Compute it once: it
|
|
570
|
+
// decides whether each lane would have run, which is also what decides whether
|
|
571
|
+
// a gated lane is worth REPORTING. A lane that was never eligible was not
|
|
572
|
+
// suppressed by the gate, so claiming it was would be noise.
|
|
573
|
+
const cleanupEligible = shouldAnalyzeMemoryCleanup(scope, memorySummary.eligible, primaryStashDir);
|
|
574
|
+
// Cleanup remains independent of the disabled contradiction writer.
|
|
575
|
+
const memoryCleanupPlan = cleanupEligible
|
|
559
576
|
? analyzeMemoryCleanup(primaryStashDir, cleanupParentRef ? { parentRef: cleanupParentRef } : undefined)
|
|
560
577
|
: undefined;
|
|
578
|
+
const cleanupWouldMutate = Boolean(memoryCleanupPlan &&
|
|
579
|
+
(memoryCleanupPlan.pruneCandidates.length > 0 ||
|
|
580
|
+
memoryCleanupPlan.beliefStateTransitions.length > 0 ||
|
|
581
|
+
memoryCleanupPlan.relativeDateCandidates.length > 0));
|
|
582
|
+
const autonomyGatedDirectLanes = cleanupWouldMutate && !isAutonomyLaneAllowed("memoryCleanup", _earlyConfig) ? ["memoryCleanup"] : [];
|
|
561
583
|
const guidance = memorySummary.eligible > 0
|
|
562
584
|
? "Improve folds memory cleanup into the same proposal queue: speculative promotions still go through reflect/distill proposals, while high-confidence redundant derived memories are moved into a recoverable cleanup archive instead of being left active in the stash."
|
|
563
585
|
: undefined;
|
|
@@ -566,6 +588,7 @@ async function indexAndCollect(args) {
|
|
|
566
588
|
memorySummary,
|
|
567
589
|
strategyFilteredRefs: strategyFilteredRefs ?? [],
|
|
568
590
|
memoryCleanupPlan,
|
|
591
|
+
autonomyGatedDirectLanes,
|
|
569
592
|
guidance,
|
|
570
593
|
warnings,
|
|
571
594
|
};
|
|
@@ -655,8 +678,6 @@ function makeCommitStashBatch(deps) {
|
|
|
655
678
|
}
|
|
656
679
|
const saveGitStashFn = options.saveGitStashFn ?? saveGitStash;
|
|
657
680
|
const writableOverride = writeTarget ? resolveWritable(writeTarget.config) : resolveWritableOverride(_earlyConfig);
|
|
658
|
-
// pushOnCommit is deprecated and fully ignored (Decision 6, WI-9.6b) — it no
|
|
659
|
-
// longer participates in this fallback chain.
|
|
660
681
|
const push = options.sync?.push ?? improveProfile.sync?.push ?? true;
|
|
661
682
|
const message = renderSyncCommitMessage(effectiveSync.message ?? "akm improve auto-sync", messageContext, Date.now());
|
|
662
683
|
try {
|
|
@@ -721,17 +742,17 @@ function preloadRejectedProposals() {
|
|
|
721
742
|
* immediately before the loop so external proposal writes that occurred
|
|
722
743
|
* before this run acquired its lock are visible.
|
|
723
744
|
*/
|
|
724
|
-
export function refilterProactiveLoopRefs(loopRefs,
|
|
745
|
+
export function refilterProactiveLoopRefs(loopRefs, improveProfile) {
|
|
725
746
|
// Re-read cooldown timestamps immediately before execution so external
|
|
726
747
|
// proposal writes that occurred before this run acquired its lock are visible.
|
|
727
748
|
const proactiveLoopRefs = loopRefs.filter((r) => r.eligibilitySource === "proactive");
|
|
728
749
|
let postLockLoopRefs = loopRefs;
|
|
729
750
|
if (proactiveLoopRefs.length > 0) {
|
|
730
751
|
const proactiveRefStrs = proactiveLoopRefs.map((r) => r.ref);
|
|
731
|
-
//
|
|
752
|
+
// Correlate proposal timestamps on each candidate's durable key.
|
|
732
753
|
const proactiveItemRefByRef = new Map(proactiveLoopRefs.map((r) => [r.ref, r.itemRef]));
|
|
733
|
-
const freshReflectTs = buildLatestProposalTsMap(proactiveRefStrs, "reflect",
|
|
734
|
-
const freshDistillTs = buildLatestProposalTsMap(proactiveRefStrs, "distill",
|
|
754
|
+
const freshReflectTs = buildLatestProposalTsMap(proactiveRefStrs, "reflect", proactiveItemRefByRef);
|
|
755
|
+
const freshDistillTs = buildLatestProposalTsMap(proactiveRefStrs, "distill", proactiveItemRefByRef);
|
|
735
756
|
const pmDueDays = improveProfile.processes?.proactiveMaintenance?.dueDays ?? DEFAULT_DUE_DAYS;
|
|
736
757
|
const stillDue = new Set(filterProactiveDue(proactiveLoopRefs, freshReflectTs, freshDistillTs, pmDueDays, Date.now()).map((r) => r.ref));
|
|
737
758
|
const dropped = proactiveLoopRefs.filter((r) => !stillDue.has(r.ref));
|
|
@@ -776,11 +797,9 @@ async function runPostLoopStageOrSkip(args) {
|
|
|
776
797
|
improveProfile,
|
|
777
798
|
resolvedPlan,
|
|
778
799
|
consolidationRan: preparation.consolidationRan,
|
|
779
|
-
// R5: floor violations from this run's consolidate pass,
|
|
780
|
-
//
|
|
781
|
-
// detection.
|
|
800
|
+
// R5: floor violations from this run's consolidate pass, for the collapse
|
|
801
|
+
// detector's merge-floor advisory.
|
|
782
802
|
consolidationMergeFloorViolations: preparation.consolidation.mergeFloorViolations ?? 0,
|
|
783
|
-
acceptedActions: 0,
|
|
784
803
|
});
|
|
785
804
|
}
|
|
786
805
|
/**
|
|
@@ -805,6 +824,24 @@ async function runImproveStageSequence(args) {
|
|
|
805
824
|
},
|
|
806
825
|
}, eventsCtx);
|
|
807
826
|
}
|
|
827
|
+
// D8 — one event per lane the autonomy gate downgraded, naming the lane AND
|
|
828
|
+
// the config key that would enable it. This is the difference between a gate
|
|
829
|
+
// and a silent no-op: whatever the user would have seen happen, they now see
|
|
830
|
+
// explained. `health` already aggregates `improve_skipped` by reason
|
|
831
|
+
// (buildImproveSkipSummary), so these surface there without new machinery.
|
|
832
|
+
for (const lane of [...args.run.resolvedPlan.autonomyGated, ...describeGatedLanes(args.autonomyGatedDirectLanes)]) {
|
|
833
|
+
warn(`[improve] ${lane.lane} skipped — it ${lane.reason}. Set \`${lane.configKey}: true\` to enable it.`);
|
|
834
|
+
appendEvent({
|
|
835
|
+
eventType: "improve_skipped",
|
|
836
|
+
ref: undefined,
|
|
837
|
+
metadata: {
|
|
838
|
+
strategy: selectedStrategy.name,
|
|
839
|
+
reason: "autonomy_gated",
|
|
840
|
+
lane: lane.lane,
|
|
841
|
+
configKey: lane.configKey,
|
|
842
|
+
},
|
|
843
|
+
}, eventsCtx);
|
|
844
|
+
}
|
|
808
845
|
// Single prep->loop->post-loop pass, run under the invocation's lock.
|
|
809
846
|
// Accumulators are direct assignments from the single pass's results.
|
|
810
847
|
let preparation;
|
|
@@ -844,7 +881,7 @@ async function runImproveStageSequence(args) {
|
|
|
844
881
|
preparation = await runPreparation();
|
|
845
882
|
const rejectedProposalsByRef = preloadRejectedProposals();
|
|
846
883
|
const runLoop = () => {
|
|
847
|
-
const postLockLoopRefs = refilterProactiveLoopRefs(preparation.loopRefs,
|
|
884
|
+
const postLockLoopRefs = refilterProactiveLoopRefs(preparation.loopRefs, improveProfile);
|
|
848
885
|
return runImproveLoopStageImpl({
|
|
849
886
|
ctx,
|
|
850
887
|
primaryStashDir,
|