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
package/dist/storage/database.js
CHANGED
|
@@ -128,6 +128,13 @@ function bunOptions(opts) {
|
|
|
128
128
|
out.readonly = opts.readonly;
|
|
129
129
|
if (opts.create !== undefined)
|
|
130
130
|
out.create = opts.create;
|
|
131
|
+
// bun:sqlite reads a partial options object as the full set of open flags:
|
|
132
|
+
// with neither `readonly` nor `readwrite` set the handle carries no access
|
|
133
|
+
// mode and every statement fails with SQLITE_MISUSE ("bad parameter or
|
|
134
|
+
// other API misuse"). Default to writable, matching the driver's no-options
|
|
135
|
+
// open and better-sqlite3's semantics.
|
|
136
|
+
if (!out.readonly)
|
|
137
|
+
out.readwrite = true;
|
|
131
138
|
return out;
|
|
132
139
|
}
|
|
133
140
|
let bunSqliteModule;
|
|
@@ -1,115 +1,47 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* `config-migrate.ts`) reuses the SAME runner. The `bootstrap` hook — a one-line
|
|
12
|
-
* pre-versioning back-fill — is now unused by live callers (the pre-cutover
|
|
13
|
-
* workflow.db that once needed it fails closed at migrate time).
|
|
14
|
-
*
|
|
15
|
-
* This module factors that runner out once. Each caller supplies only its own
|
|
16
|
-
* `MIGRATIONS` array (plus, historically, an optional `bootstrap` hook).
|
|
17
|
-
*
|
|
18
|
-
* Migration-safety contract:
|
|
19
|
-
* - `id` is permanent and must never be reused.
|
|
20
|
-
* - `up` must be idempotent (use IF NOT EXISTS, INSERT OR IGNORE, etc.).
|
|
21
|
-
* - `up` must not DROP any table that holds durable (non-regenerable) data.
|
|
22
|
-
* - `up` must not RENAME or change the type of an existing column.
|
|
23
|
-
* - To add a column: use `ALTER TABLE … ADD COLUMN … DEFAULT …`.
|
|
24
|
-
* - Applied IDs must be an exact ordered prefix of the registry.
|
|
25
|
-
* - Released migration bodies are sealed by SHA-256 in the same ledger.
|
|
26
|
-
*/
|
|
27
|
-
import crypto from "node:crypto";
|
|
28
|
-
export function migrationChecksum(migration) {
|
|
29
|
-
return crypto.createHash("sha256").update(migration.id).update("\0").update(migration.up).digest("hex");
|
|
4
|
+
export function assertMigrationRegistry(migrations) {
|
|
5
|
+
const seen = new Set();
|
|
6
|
+
for (const migration of migrations) {
|
|
7
|
+
if (seen.has(migration.id))
|
|
8
|
+
throw new Error(`Migration registry contains duplicate ID ${migration.id}.`);
|
|
9
|
+
seen.add(migration.id);
|
|
10
|
+
}
|
|
30
11
|
}
|
|
31
12
|
function migrationsTableExists(db) {
|
|
32
13
|
return !!db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'schema_migrations'").get();
|
|
33
14
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Core ledger inspection against the expected ordered `{ id, checksum }`
|
|
39
|
-
* registry. Both {@link inspectMigrationLedger} (bodies → checksums) and
|
|
40
|
-
* {@link inspectSealedMigrationLedger} (frozen pre-computed checksums) route
|
|
41
|
-
* here so the two entry points can never diverge.
|
|
42
|
-
*/
|
|
43
|
-
function inspectLedgerAgainst(db, expected) {
|
|
44
|
-
const registryIds = expected.map((entry) => entry.id);
|
|
45
|
-
if (new Set(registryIds).size !== registryIds.length) {
|
|
46
|
-
return {
|
|
47
|
-
status: "inconsistent",
|
|
48
|
-
migrationIds: [],
|
|
49
|
-
checksums: [],
|
|
50
|
-
detail: "migration registry contains duplicate IDs",
|
|
51
|
-
};
|
|
52
|
-
}
|
|
15
|
+
/** Inspect the database's applied IDs against the exact ordered registry prefix. */
|
|
16
|
+
function inspectLedgerAgainst(db, registryIds) {
|
|
53
17
|
if (!migrationsTableExists(db))
|
|
54
|
-
return { status: registryIds.length === 0 ? "current" : "old", migrationIds: []
|
|
55
|
-
const
|
|
56
|
-
const rows = db
|
|
57
|
-
.prepare(`SELECT id${hasChecksum ? ", checksum" : ""} FROM schema_migrations ORDER BY rowid`)
|
|
58
|
-
.all();
|
|
18
|
+
return { status: registryIds.length === 0 ? "current" : "old", migrationIds: [] };
|
|
19
|
+
const rows = db.prepare("SELECT id FROM schema_migrations ORDER BY rowid").all();
|
|
59
20
|
const migrationIds = rows.map((row) => row.id);
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (!entry) {
|
|
65
|
-
return { status: "newer", migrationIds, checksums, detail: `unknown migration ID ${row.id}` };
|
|
21
|
+
for (const [index, row] of rows.entries()) {
|
|
22
|
+
const expectedId = registryIds[index];
|
|
23
|
+
if (!expectedId) {
|
|
24
|
+
return { status: "newer", migrationIds, detail: `unknown migration ID ${row.id}` };
|
|
66
25
|
}
|
|
67
|
-
if (row.id !==
|
|
26
|
+
if (row.id !== expectedId) {
|
|
68
27
|
const knownLater = registryIds.includes(row.id);
|
|
69
28
|
return {
|
|
70
29
|
status: knownLater ? "inconsistent" : "newer",
|
|
71
30
|
migrationIds,
|
|
72
|
-
checksums,
|
|
73
31
|
detail: knownLater
|
|
74
32
|
? `migration ledger is not an exact ordered prefix at position ${index + 1}`
|
|
75
33
|
: `unknown migration ID ${row.id}`,
|
|
76
34
|
};
|
|
77
35
|
}
|
|
78
|
-
if (row.checksum && row.checksum !== entry.checksum) {
|
|
79
|
-
return {
|
|
80
|
-
status: "inconsistent",
|
|
81
|
-
migrationIds,
|
|
82
|
-
checksums,
|
|
83
|
-
detail: `migration ${row.id} checksum does not match the released migration body`,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
const missingChecksum = checksums.indexOf(null);
|
|
88
|
-
if (missingChecksum >= 0) {
|
|
89
|
-
return {
|
|
90
|
-
status: "old",
|
|
91
|
-
migrationIds,
|
|
92
|
-
checksums,
|
|
93
|
-
detail: `migration ${migrationIds[missingChecksum]} has not been sealed with a checksum`,
|
|
94
|
-
};
|
|
95
36
|
}
|
|
96
37
|
return {
|
|
97
|
-
status: rows.length ===
|
|
38
|
+
status: rows.length === registryIds.length ? "current" : "old",
|
|
98
39
|
migrationIds,
|
|
99
|
-
checksums,
|
|
100
40
|
};
|
|
101
41
|
}
|
|
102
42
|
export function inspectMigrationLedger(db, migrations) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Ledger inspection against a FROZEN `{ id, checksum }` copy of a migration
|
|
107
|
-
* array whose live source is gone (plan §3.3 item 1). Behaviourally identical
|
|
108
|
-
* to {@link inspectMigrationLedger} — the checksums are simply pre-computed
|
|
109
|
-
* rather than derived from `up` bodies.
|
|
110
|
-
*/
|
|
111
|
-
export function inspectSealedMigrationLedger(db, sealed) {
|
|
112
|
-
return inspectLedgerAgainst(db, sealed);
|
|
43
|
+
assertMigrationRegistry(migrations);
|
|
44
|
+
return inspectLedgerAgainst(db, migrations.map((migration) => migration.id));
|
|
113
45
|
}
|
|
114
46
|
export function assertMigrationLedger(db, migrations) {
|
|
115
47
|
const state = inspectMigrationLedger(db, migrations);
|
|
@@ -136,12 +68,9 @@ export function ensureMigrationsTable(db) {
|
|
|
136
68
|
db.exec(`
|
|
137
69
|
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
138
70
|
id TEXT PRIMARY KEY,
|
|
139
|
-
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
140
|
-
checksum TEXT
|
|
71
|
+
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
141
72
|
);
|
|
142
73
|
`);
|
|
143
|
-
if (!ledgerHasChecksum(db))
|
|
144
|
-
db.exec("ALTER TABLE schema_migrations ADD COLUMN checksum TEXT");
|
|
145
74
|
}
|
|
146
75
|
/**
|
|
147
76
|
* Apply every pending migration, one transaction per migration.
|
|
@@ -154,9 +83,10 @@ export function ensureMigrationsTable(db) {
|
|
|
154
83
|
*
|
|
155
84
|
* @param db The open SQLite database.
|
|
156
85
|
* @param migrations The module's ordered, append-only migration list.
|
|
157
|
-
* @param opts
|
|
86
|
+
* @param opts Migration execution options.
|
|
158
87
|
*/
|
|
159
88
|
export function runMigrations(db, migrations, opts) {
|
|
89
|
+
assertMigrationRegistry(migrations);
|
|
160
90
|
if (opts?.applyPending === false) {
|
|
161
91
|
assertMigrationLedger(db, migrations);
|
|
162
92
|
return;
|
|
@@ -164,24 +94,6 @@ export function runMigrations(db, migrations, opts) {
|
|
|
164
94
|
if (migrationsTableExists(db))
|
|
165
95
|
assertMigrationLedger(db, migrations);
|
|
166
96
|
ensureMigrationsTable(db);
|
|
167
|
-
opts?.bootstrap?.(db);
|
|
168
|
-
const ledger = assertMigrationLedger(db, migrations);
|
|
169
|
-
db.transaction(() => {
|
|
170
|
-
const update = db.prepare("UPDATE schema_migrations SET checksum = ? WHERE id = ? AND checksum IS NULL");
|
|
171
|
-
for (let index = 0; index < ledger.migrationIds.length; index += 1) {
|
|
172
|
-
update.run(migrationChecksum(migrations[index]), ledger.migrationIds[index]);
|
|
173
|
-
}
|
|
174
|
-
if (opts?.generationMarker) {
|
|
175
|
-
db.exec(`
|
|
176
|
-
CREATE TABLE IF NOT EXISTS akm_migration_generation (
|
|
177
|
-
singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
|
|
178
|
-
operation_id TEXT NOT NULL,
|
|
179
|
-
phase TEXT NOT NULL
|
|
180
|
-
)
|
|
181
|
-
`);
|
|
182
|
-
db.prepare("INSERT INTO akm_migration_generation(singleton, operation_id, phase) VALUES (1, ?, ?) ON CONFLICT(singleton) DO UPDATE SET operation_id=excluded.operation_id, phase=excluded.phase").run(opts.generationMarker.operationId, opts.generationMarker.phase);
|
|
183
|
-
}
|
|
184
|
-
})();
|
|
185
97
|
const appliedRows = db.prepare("SELECT id FROM schema_migrations ORDER BY rowid").all();
|
|
186
98
|
const applied = new Set(appliedRows.map((r) => r.id));
|
|
187
99
|
for (const migration of migrations) {
|
|
@@ -190,7 +102,7 @@ export function runMigrations(db, migrations, opts) {
|
|
|
190
102
|
opts?.beforeMigration?.(migration);
|
|
191
103
|
db.transaction(() => {
|
|
192
104
|
db.exec(migration.up);
|
|
193
|
-
db.prepare("INSERT INTO schema_migrations (id
|
|
105
|
+
db.prepare("INSERT INTO schema_migrations (id) VALUES (?)").run(migration.id);
|
|
194
106
|
})();
|
|
195
107
|
}
|
|
196
108
|
}
|
|
@@ -29,10 +29,10 @@ import { applyStandardPragmas } from "./sqlite-pragmas.js";
|
|
|
29
29
|
*/
|
|
30
30
|
export function openManagedDatabase(spec) {
|
|
31
31
|
const dir = path.dirname(spec.path);
|
|
32
|
-
if (!fs.existsSync(dir)) {
|
|
32
|
+
if (spec.create !== false && !fs.existsSync(dir)) {
|
|
33
33
|
fs.mkdirSync(dir, { recursive: true });
|
|
34
34
|
}
|
|
35
|
-
const db = openDatabase(spec.path);
|
|
35
|
+
const db = spec.create === false ? openDatabase(spec.path, { create: false }) : openDatabase(spec.path);
|
|
36
36
|
applyStandardPragmas(db, spec.pragmas ?? { dataDir: dir });
|
|
37
37
|
spec.init?.(db);
|
|
38
38
|
return db;
|
|
@@ -45,7 +45,7 @@ export function listActiveCanarySetIds(db) {
|
|
|
45
45
|
/**
|
|
46
46
|
* Deactivate every canary row in a set. Rows are RETAINED (active = 0) so
|
|
47
47
|
* historical improve_cycle_metrics rows keyed on the old canary_set_id stay
|
|
48
|
-
* interpretable; only `
|
|
48
|
+
* interpretable; only `bun scripts/refresh-canary-set.ts --refresh` calls this.
|
|
49
49
|
*/
|
|
50
50
|
export function deactivateCanarySet(db, canarySetId) {
|
|
51
51
|
const result = db
|
|
@@ -38,12 +38,7 @@ export function eventRowToEnvelope(row) {
|
|
|
38
38
|
*/
|
|
39
39
|
export function insertEvent(db, input) {
|
|
40
40
|
try {
|
|
41
|
-
|
|
42
|
-
.prepare(`INSERT INTO events (event_type, ts, ref, metadata_json)
|
|
43
|
-
VALUES (?, ?, ?, ?)
|
|
44
|
-
RETURNING id`)
|
|
45
|
-
.get(input.eventType, input.ts, input.ref ?? null, JSON.stringify(input.metadata ?? {}));
|
|
46
|
-
return result?.id;
|
|
41
|
+
return insertEventStrict(db, input);
|
|
47
42
|
}
|
|
48
43
|
catch (err) {
|
|
49
44
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -51,6 +46,17 @@ export function insertEvent(db, input) {
|
|
|
51
46
|
return undefined;
|
|
52
47
|
}
|
|
53
48
|
}
|
|
49
|
+
/** Insert an event without best-effort error swallowing for transaction-coupled mutations. */
|
|
50
|
+
export function insertEventStrict(db, input) {
|
|
51
|
+
const result = db
|
|
52
|
+
.prepare(`INSERT INTO events (event_type, ts, ref, metadata_json)
|
|
53
|
+
VALUES (?, ?, ?, ?)
|
|
54
|
+
RETURNING id`)
|
|
55
|
+
.get(input.eventType, input.ts, input.ref ?? null, JSON.stringify(input.metadata ?? {}));
|
|
56
|
+
if (!result)
|
|
57
|
+
throw new Error(`Failed to persist ${input.eventType} event.`);
|
|
58
|
+
return result.id;
|
|
59
|
+
}
|
|
54
60
|
/** Strict idempotent event insert for durable mutation journals. */
|
|
55
61
|
export function insertEventOnce(db, input) {
|
|
56
62
|
const rows = db
|
|
@@ -77,10 +83,15 @@ export function insertEventOnce(db, input) {
|
|
|
77
83
|
}
|
|
78
84
|
/**
|
|
79
85
|
* Read events from the database matching the filter. Returns events in
|
|
80
|
-
* ascending id order so consumers can process them in emission order
|
|
86
|
+
* ascending id order so consumers can process them in emission order —
|
|
87
|
+
* true even when `options.limit` selects the most-recent page (see
|
|
88
|
+
* {@link ReadStateEventsOptions.limit}).
|
|
81
89
|
*
|
|
82
90
|
* The returned `nextId` is the maximum id seen (or `sinceId` when no rows
|
|
83
|
-
* match), suitable as the next `sinceId` cursor value.
|
|
91
|
+
* match), suitable as the next `sinceId` cursor value. This is unaffected by
|
|
92
|
+
* `limit`: it is always the id of the last row actually returned, which —
|
|
93
|
+
* because a `limit` page is the MOST RECENT matching rows — is the same
|
|
94
|
+
* value an unbounded read of the same filter would have produced.
|
|
84
95
|
*/
|
|
85
96
|
export function readStateEvents(db, options = {}) {
|
|
86
97
|
const conditions = [];
|
|
@@ -102,10 +113,15 @@ export function readStateEvents(db, options = {}) {
|
|
|
102
113
|
params.push(options.ref);
|
|
103
114
|
}
|
|
104
115
|
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
116
|
+
const hasLimit = options.limit !== undefined && options.limit > 0;
|
|
117
|
+
const orderAndLimit = hasLimit ? "ORDER BY id DESC LIMIT ?" : "ORDER BY id ASC";
|
|
118
|
+
const queryParams = hasLimit ? [...params, options.limit] : params;
|
|
105
119
|
const rows = db
|
|
106
|
-
.prepare(`SELECT id, event_type, ts, ref, metadata_json FROM events ${where}
|
|
107
|
-
.all(...
|
|
108
|
-
|
|
120
|
+
.prepare(`SELECT id, event_type, ts, ref, metadata_json FROM events ${where} ${orderAndLimit}`)
|
|
121
|
+
.all(...queryParams);
|
|
122
|
+
// A DESC-ordered LIMIT page comes back newest-first; reverse it so the
|
|
123
|
+
// returned array is always ascending by id, matching the unbounded path.
|
|
124
|
+
const events = (hasLimit ? rows.slice().reverse() : rows).map(eventRowToEnvelope);
|
|
109
125
|
const nextId = events.length > 0 ? events[events.length - 1].id : (options.sinceId ?? 0);
|
|
110
126
|
return { events, nextId };
|
|
111
127
|
}
|
|
@@ -41,19 +41,13 @@ export function computeImproveRunMetrics(result) {
|
|
|
41
41
|
case "noop":
|
|
42
42
|
break;
|
|
43
43
|
}
|
|
44
|
-
// Legacy: pre-gate action results may carry autoAccepted: true (reflect path).
|
|
45
|
-
const r = action.result;
|
|
46
|
-
if (r && r.autoAccepted === true)
|
|
47
|
-
autoAcceptedCount++;
|
|
48
44
|
}
|
|
49
45
|
// Add gate-promoted count from the unified PostPhaseAutoAcceptGate (all phases).
|
|
50
46
|
autoAcceptedCount += result.gateAutoAcceptedCount ?? 0;
|
|
51
47
|
// C1 (13-bus-factor): distill-skipped rows are folded into the bounded
|
|
52
48
|
// `distillSkipped` aggregate and no longer live in `actions`. Add the
|
|
53
49
|
// aggregate total to the skipped + total-actions counters so metrics_json
|
|
54
|
-
//
|
|
55
|
-
// per-ref distill-skipped in `actions` have no aggregate, so they are counted
|
|
56
|
-
// by the classify loop above — never double-counted.)
|
|
50
|
+
// keeps aggregate metrics aligned with the logical action count.
|
|
57
51
|
const distillSkippedTotal = result.distillSkipped?.total ?? 0;
|
|
58
52
|
skippedCount += distillSkippedTotal;
|
|
59
53
|
return {
|
|
@@ -83,10 +77,10 @@ export function recordImproveRun(db, input) {
|
|
|
83
77
|
const metricsObj = input.metrics ?? computeImproveRunMetrics(input.result);
|
|
84
78
|
db.prepare(`
|
|
85
79
|
INSERT INTO improve_runs
|
|
86
|
-
(id, started_at, completed_at, stash_dir, dry_run,
|
|
80
|
+
(id, started_at, completed_at, stash_dir, dry_run, strategy,
|
|
87
81
|
scope_mode, scope_value, guidance, ok, result_json, metrics_json, metadata_json)
|
|
88
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
89
|
-
`).run(input.id, input.startedAt, input.completedAt, input.stashDir, input.dryRun ? 1 : 0, input.
|
|
82
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
83
|
+
`).run(input.id, input.startedAt, input.completedAt, input.stashDir, input.dryRun ? 1 : 0, input.strategy, input.scopeMode, input.scopeValue, input.guidance, input.ok ? 1 : 0, JSON.stringify(input.result), JSON.stringify(metricsObj), JSON.stringify(input.metadata ?? {}));
|
|
90
84
|
}
|
|
91
85
|
/**
|
|
92
86
|
* Read real (non-dry-run) improve_runs rows whose `started_at` falls in the
|
|
@@ -104,8 +98,8 @@ export function recordImproveRun(db, input) {
|
|
|
104
98
|
*/
|
|
105
99
|
export function queryImproveRuns(db, since, until) {
|
|
106
100
|
const sql = until
|
|
107
|
-
? "SELECT id, started_at, completed_at, ok, scope_mode, scope_value,
|
|
108
|
-
: "SELECT id, started_at, completed_at, ok, scope_mode, scope_value,
|
|
101
|
+
? "SELECT id, started_at, completed_at, ok, scope_mode, scope_value, strategy, result_json FROM improve_runs WHERE started_at >= ? AND started_at < ? AND dry_run = 0 ORDER BY started_at DESC"
|
|
102
|
+
: "SELECT id, started_at, completed_at, ok, scope_mode, scope_value, strategy, result_json FROM improve_runs WHERE started_at >= ? AND dry_run = 0 ORDER BY started_at DESC";
|
|
109
103
|
return (until ? db.prepare(sql).all(since, until) : db.prepare(sql).all(since));
|
|
110
104
|
}
|
|
111
105
|
/**
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
* `index.db` connection lifecycle for the storage layer.
|
|
6
6
|
*
|
|
7
7
|
* Opens/closes the index database, arming the sqlite-vec extension and (for the
|
|
8
|
-
* managed open path) running `ensureSchema`.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* storage→indexer arrow.
|
|
8
|
+
* managed open path) running `ensureSchema`. This module lives BELOW the
|
|
9
|
+
* indexer, so the storage loan helpers (`index-db.ts`, `registry-cache.ts`)
|
|
10
|
+
* import their opener from a sibling here instead of reaching up into the
|
|
11
|
+
* indexer — inverting the old storage→indexer arrow.
|
|
13
12
|
*/
|
|
14
13
|
import fs from "node:fs";
|
|
15
14
|
import { createRequire } from "node:module";
|
|
@@ -63,7 +62,19 @@ export function openExistingDatabase(dbPath) {
|
|
|
63
62
|
// Existing-DB callers must not mutate schema or embedding metadata on open,
|
|
64
63
|
// but some paths still need write access to usage_events and other tables —
|
|
65
64
|
// so init only loads the vec extension, it does not run ensureSchema.
|
|
66
|
-
|
|
65
|
+
//
|
|
66
|
+
// "Existing" is load-bearing: a missing file throws instead of being
|
|
67
|
+
// created. Create-on-open used to leave a schema-less index.db behind (a
|
|
68
|
+
// fire-and-forget telemetry read was enough), which every later opener then
|
|
69
|
+
// saw as an existing-but-broken index ("no such table: entries") — the
|
|
70
|
+
// curate→proposal file-order failure pinned by
|
|
71
|
+
// tests/storage/open-existing-database-no-create.test.ts. `create: false`
|
|
72
|
+
// below is the race-free backstop for this pre-check.
|
|
73
|
+
const resolvedPath = dbPath ?? getDbPath();
|
|
74
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
75
|
+
throw new Error(`Index database not found at ${resolvedPath}. Run 'akm index' to build it.`);
|
|
76
|
+
}
|
|
77
|
+
return openManagedDatabase({ path: resolvedPath, init: loadVecExtension, create: false });
|
|
67
78
|
}
|
|
68
79
|
/**
|
|
69
80
|
* Open an existing index for queries without creating directories, a database
|