akm-cli 0.9.0-rc.4 → 0.9.0-rc.6
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 +122 -26
- package/README.md +7 -7
- package/SECURITY.md +11 -10
- package/dist/akm +2 -2
- package/dist/akm-migrate-storage +2 -2
- package/dist/assets/hints/cli-hints-full.md +60 -73
- package/dist/assets/hints/cli-hints-short.md +8 -12
- package/dist/assets/improve-strategies/default.json +5 -7
- package/dist/assets/improve-strategies/frequent.json +2 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +2 -2
- package/dist/assets/improve-strategies/quick.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +3 -3
- package/dist/assets/improve-strategies/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/stash-skeleton/README.md +10 -11
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +1 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +1 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +1 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -2
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -2
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +1 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -2
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +1 -1
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +18 -18
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +8 -9
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +13 -15
- package/dist/assets/tasks/core/extract.yml +2 -2
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/templates/html/health.html +2 -3
- package/dist/cli/config-migrate.js +1328 -101
- package/dist/cli/invocation.js +255 -0
- package/dist/cli/parse-args.js +20 -83
- package/dist/cli/shared.js +15 -37
- package/dist/cli.js +18 -49
- package/dist/commands/agent/agent-dispatch.js +2 -2
- package/dist/commands/agent/contribute-cli.js +5 -4
- package/dist/commands/bundle/bundle-cli.js +68 -0
- package/dist/commands/bundle/bundle.js +219 -0
- package/dist/commands/completions.js +2 -2
- package/dist/commands/config-cli.js +6 -3
- package/dist/commands/env/env-binding.js +13 -9
- package/dist/commands/env/env-cli.js +49 -48
- package/dist/commands/env/secret-cli.js +24 -10
- package/dist/commands/events.js +2 -2
- package/dist/commands/feedback-cli.js +59 -33
- package/dist/commands/graph/graph.js +6 -4
- package/dist/commands/health/advisories.js +4 -4
- package/dist/commands/health/html-report.js +190 -593
- package/dist/commands/health/improve-metrics.js +240 -188
- package/dist/commands/health/metrics.js +9 -17
- package/dist/commands/health/report-view-model.js +509 -0
- package/dist/commands/health/surfaces.js +6 -3
- package/dist/commands/health/types-checks.js +4 -0
- package/dist/commands/health/types-improve.js +22 -0
- package/dist/commands/health/types-metrics.js +4 -0
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +1 -2
- package/dist/commands/health.js +219 -161
- package/dist/commands/improve/collapse-detector.js +25 -14
- package/dist/commands/improve/consolidate/chunking.js +7 -5
- package/dist/commands/improve/consolidate.js +640 -740
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +79 -49
- package/dist/commands/improve/distill/quality-gate.js +113 -35
- package/dist/commands/improve/distill-promotion-policy.js +24 -885
- package/dist/commands/improve/distill.js +565 -337
- package/dist/commands/improve/eligibility.js +75 -36
- package/dist/commands/improve/extract-cli.js +6 -6
- package/dist/commands/improve/extract-prompt.js +5 -34
- package/dist/commands/improve/extract.js +526 -357
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +11 -20
- package/dist/commands/improve/improve-result-file.js +7 -6
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +3 -9
- package/dist/commands/improve/improve.js +822 -727
- package/dist/commands/improve/locks.js +27 -95
- package/dist/commands/improve/loop-stages.js +941 -963
- package/dist/commands/improve/memory/derived-ref.js +122 -0
- package/dist/commands/improve/memory/memory-contradiction-detect.js +35 -38
- package/dist/commands/improve/memory/memory-improve.js +24 -37
- package/dist/commands/improve/outcome-loop.js +13 -33
- package/dist/commands/improve/preparation.js +889 -691
- package/dist/commands/improve/proactive-maintenance.js +37 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +974 -588
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +8 -4
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -40
- package/dist/commands/improve/source-identity.js +39 -26
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +288 -295
- package/dist/commands/lint/index.js +132 -19
- package/dist/commands/mv-cli.js +257 -234
- package/dist/commands/observability-cli.js +2 -1
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +17 -16
- package/dist/commands/proposal/proposal-cli.js +40 -77
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +39 -1
- package/dist/commands/proposal/propose.js +41 -19
- package/dist/commands/proposal/repository.js +566 -486
- package/dist/commands/proposal/validators/proposal-quality-validators.js +22 -6
- package/dist/commands/proposal/validators/proposal-validators.js +6 -5
- package/dist/commands/proposal/validators/proposals.js +5 -4
- package/dist/commands/read/curate.js +50 -28
- package/dist/commands/read/knowledge.js +25 -16
- package/dist/commands/read/remember-cli.js +12 -4
- package/dist/commands/read/search-cli.js +33 -33
- package/dist/commands/read/search.js +68 -55
- package/dist/commands/read/show.js +54 -135
- package/dist/commands/remember.js +7 -5
- package/dist/commands/sources/add-cli.js +10 -24
- package/dist/commands/sources/bundle-config-ops.js +58 -0
- package/dist/commands/sources/history.js +13 -8
- package/dist/commands/sources/info.js +10 -11
- package/dist/commands/sources/init.js +12 -21
- package/dist/commands/sources/installed-stashes.js +151 -138
- package/dist/commands/sources/schema-repair.js +5 -3
- package/dist/commands/sources/self-update.js +9 -7
- package/dist/commands/sources/source-add.js +116 -154
- package/dist/commands/sources/source-clone.js +33 -14
- package/dist/commands/sources/source-manage.js +43 -32
- package/dist/commands/sources/sources-cli.js +12 -7
- package/dist/commands/sources/stash-cli.js +12 -5
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/default-tasks.js +13 -13
- package/dist/commands/tasks/tasks-cli.js +3 -3
- package/dist/commands/tasks/tasks.js +71 -31
- package/dist/commands/workflow-cli.js +22 -26
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +509 -0
- package/dist/core/adapter/adapters/akm-lint.js +381 -0
- package/dist/core/adapter/adapters/akm-metadata.js +416 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +150 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +196 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +117 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +413 -0
- package/dist/core/adapter/adapters/okf-adapter.js +223 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +212 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +154 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/recognize-match.js +42 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/asset-placement.js +229 -0
- package/dist/core/asset/asset-ref.js +107 -78
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +1 -1
- package/dist/core/asset/resolve-ref.js +223 -0
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/common.js +141 -49
- package/dist/core/config/config-io.js +0 -108
- package/dist/core/config/config-schema.js +94 -1039
- package/dist/core/config/config-sources.js +115 -36
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-walker.js +4 -2
- package/dist/core/config/config.js +21 -26
- package/dist/core/config/engine-semantics.js +0 -4
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +395 -0
- package/dist/core/config/schema/improve.js +76 -0
- package/dist/core/config/schema/index-config.js +183 -0
- package/dist/core/config/schema/output.js +15 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +27 -0
- package/dist/core/config/schema/sources-bundles.js +164 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +113 -8
- package/dist/core/errors.js +1 -1
- package/dist/core/events-types.js +4 -0
- package/dist/core/extra-params.js +1 -0
- package/dist/core/file-change.js +16 -0
- package/dist/core/fs-txn.js +316 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +9 -1
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +16 -0
- package/dist/core/migration-backup.js +332 -160
- package/dist/core/paths.js +3 -6
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +130 -0
- package/dist/core/redaction.js +2 -2
- package/dist/core/standards/resolve-standards-context.js +47 -64
- package/dist/core/standards/resolve-type-conventions.js +3 -3
- package/dist/core/state/migrations.js +201 -8
- package/dist/core/state-db.js +38 -2
- package/dist/core/subprocess.js +303 -0
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/write-source.js +39 -67
- package/dist/indexer/bundle-identity-guard.js +91 -0
- package/dist/indexer/db/graph-db.js +1 -1
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +29 -9
- package/dist/indexer/graph/graph-boost.js +28 -24
- package/dist/indexer/graph/graph-extraction.js +5 -6
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-written-assets.js +44 -17
- package/dist/indexer/indexer.js +289 -153
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +224 -0
- package/dist/indexer/passes/dir-staleness.js +2 -1
- package/dist/indexer/passes/memory-inference.js +8 -4
- package/dist/indexer/passes/metadata.js +96 -243
- package/dist/indexer/scan/doc-to-entry.js +123 -0
- package/dist/indexer/scan/drain-dir.js +144 -0
- package/dist/indexer/search/db-search.js +171 -99
- package/dist/indexer/search/fts-query.js +1 -1
- package/dist/indexer/search/ranking-contributors.js +57 -7
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +31 -6
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +109 -52
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/unmigrated-vaults-guard.js +2 -1
- package/dist/indexer/usage/usage-events.js +72 -9
- package/dist/indexer/walk/file-context.js +1 -44
- package/dist/indexer/walk/matchers.js +16 -32
- package/dist/indexer/walk/path-resolver.js +6 -5
- package/dist/indexer/walk/walker.js +4 -2
- package/dist/integrations/agent/engine-resolution.js +22 -0
- package/dist/integrations/agent/model-aliases.js +1 -1
- package/dist/integrations/agent/prompts.js +35 -11
- package/dist/integrations/agent/spawn.js +41 -270
- package/dist/integrations/harnesses/aider/agent-builder.js +2 -2
- package/dist/integrations/harnesses/aider/index.js +2 -11
- package/dist/integrations/harnesses/amazonq/agent-builder.js +1 -9
- package/dist/integrations/harnesses/amazonq/index.js +3 -16
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +1 -12
- package/dist/integrations/harnesses/claude/session-log.js +27 -65
- package/dist/integrations/harnesses/codex/agent-builder.js +1 -2
- package/dist/integrations/harnesses/codex/index.js +2 -12
- package/dist/integrations/harnesses/copilot/agent-builder.js +2 -3
- package/dist/integrations/harnesses/copilot/index.js +1 -12
- package/dist/integrations/harnesses/gemini/agent-builder.js +1 -3
- package/dist/integrations/harnesses/gemini/index.js +1 -12
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +27 -2
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +1 -12
- package/dist/integrations/harnesses/opencode/session-log.js +67 -110
- package/dist/integrations/harnesses/opencode-sdk/harness.js +2 -11
- package/dist/integrations/harnesses/openhands/agent-builder.js +3 -3
- package/dist/integrations/harnesses/openhands/index.js +2 -11
- package/dist/integrations/harnesses/pi/agent-builder.js +3 -11
- package/dist/integrations/harnesses/pi/index.js +3 -15
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +37 -2
- package/dist/integrations/lockfile.js +36 -0
- package/dist/integrations/session-logs/index.js +21 -12
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +7 -5
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +8 -4
- package/dist/llm/graph-extract.js +7 -2
- package/dist/llm/metadata-enhance.js +43 -26
- package/dist/llm/structured-call.js +15 -7
- package/dist/migrate/legacy/config-source-migration.js +223 -0
- package/dist/migrate/legacy/content-migration.js +305 -0
- package/dist/migrate/legacy/legacy-layout.js +779 -0
- package/dist/migrate/legacy/legacy-paths.js +25 -0
- package/dist/migrate/legacy/legacy-stash-json.js +72 -0
- package/dist/migrate/legacy/proposal-fs-import.js +168 -0
- package/dist/migrate/legacy/task-target-ref-migration.js +272 -0
- package/dist/migrate/legacy/three-db-cutover.js +840 -0
- package/dist/migrate/legacy/workflow-migrations-bodies.js +52 -0
- package/dist/migrate/legacy/workflow-migrations-frozen.js +21 -0
- package/dist/migrate/legacy-ref-grammar.js +209 -0
- package/dist/output/command-registry.js +27 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/renderers.js +32 -276
- package/dist/output/shapes/passthrough.js +3 -9
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/text/command-format.js +547 -0
- package/dist/output/text/helpers.js +15 -1377
- package/dist/output/text/proposal-format.js +230 -0
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +107 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/workflow-format.js +345 -0
- package/dist/output/text.js +1 -3
- package/dist/registry/build-index.js +13 -17
- package/dist/registry/providers/static-index.js +2 -2
- package/dist/registry/resolve.js +4 -90
- package/dist/registry/semver.js +93 -0
- package/dist/runtime.js +90 -0
- package/dist/schemas/akm-config.json +2956 -14890
- package/dist/schemas/akm-task.json +2 -2
- package/dist/schemas/akm-workflow.json +2 -2
- package/dist/scripts/migrate-storage.js +2312 -19642
- package/dist/setup/detect.js +5 -7
- package/dist/setup/engine-config.js +2 -1
- package/dist/setup/registry-stash-loader.js +1 -1
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +109 -39
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +50 -274
- package/dist/setup/steps/platforms.js +1 -0
- package/dist/setup/steps/sources.js +13 -6
- package/dist/setup/steps/stashdir.js +5 -2
- package/dist/sources/freshness.js +39 -0
- package/dist/sources/providers/git-provider.js +29 -33
- package/dist/sources/providers/git-stash.js +10 -5
- package/dist/sources/providers/provider-utils.js +40 -18
- package/dist/sources/providers/website.js +1 -1
- package/dist/sources/resolve.js +5 -5
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +105 -39
- package/dist/storage/database.js +47 -3
- package/dist/storage/engines/sqlite-migrations.js +34 -16
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/improve-runs-repository.js +0 -20
- package/dist/storage/repositories/index-connection.js +80 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +952 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +15 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +164 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +109 -0
- package/dist/storage/repositories/index-meta-repository.js +50 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +241 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +369 -0
- package/dist/storage/repositories/index-vec-repository.js +245 -0
- package/dist/storage/repositories/proposals-repository.js +41 -50
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/workflow-runs-repository.js +17 -11
- package/dist/tasks/backends/cron.js +5 -5
- package/dist/tasks/backends/exec-utils.js +21 -0
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +16 -17
- package/dist/tasks/backends/schtasks.js +33 -41
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/parser.js +25 -5
- package/dist/tasks/runner.js +33 -39
- package/dist/tasks/validator.js +5 -6
- package/dist/workflows/authoring/authoring.js +8 -11
- package/dist/workflows/exec/brief.js +10 -7
- package/dist/workflows/exec/report.js +261 -156
- package/dist/workflows/exec/run-workflow.js +2 -1
- package/dist/workflows/exec/step-work.js +3 -9
- package/dist/workflows/program/parser.js +4 -60
- package/dist/workflows/renderer.js +11 -60
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +7 -4
- package/dist/workflows/runtime/runs.js +11 -10
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +27 -16
- package/dist/workflows/validate-summary.js +2 -2
- package/dist/workflows/validator.js +18 -2
- package/docs/migration/release-notes/0.9.0.md +45 -3
- package/docs/migration/v0.8-to-v0.9.md +466 -262
- package/docs/{data-and-telemetry.md → reference/data-and-telemetry.md} +61 -17
- package/package.json +10 -9
- package/schemas/akm-config.json +2956 -14890
- package/schemas/akm-task.json +2 -2
- package/schemas/akm-workflow.json +2 -2
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/improve-strategies/recombine-only.json +0 -23
- package/dist/assets/improve-strategies/synthesize.json +0 -17
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -262
- package/dist/commands/improve/procedural.js +0 -403
- package/dist/commands/improve/recombine.js +0 -843
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/wiki-cli.js +0 -291
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -316
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1585
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
- package/dist/output/text/wiki.js +0 -16
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -18228
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1013
- package/dist/workflows/db.js +0 -413
- package/docs/README.md +0 -103
- package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -2,19 +2,30 @@
|
|
|
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
4
|
/**
|
|
5
|
-
* Shared `entries`-row projection + mapper
|
|
5
|
+
* Shared `entries`-row projection + mapper for the `index.db` storage repos.
|
|
6
6
|
*
|
|
7
7
|
* Centralizes the one canonical `entries` SELECT column list and the
|
|
8
8
|
* JSON-parse-guarded row → {@link DbIndexedEntry} mapping that several queries
|
|
9
9
|
* used to reimplement. Corrupt `entry_json` rows are skipped (warn once) rather
|
|
10
10
|
* than crashing the caller.
|
|
11
|
+
*
|
|
12
|
+
* Relocated from `src/indexer/db/entry-mapper.ts` (WI-5a): it now imports the
|
|
13
|
+
* shared shapes from the leaf types module rather than from `db.ts`, so it no
|
|
14
|
+
* longer participates in the indexer-db import cycle.
|
|
11
15
|
*/
|
|
12
16
|
import { warn } from "../../core/warn.js";
|
|
13
17
|
/**
|
|
14
18
|
* Canonical column list for reading a full indexed entry from the `entries`
|
|
15
19
|
* table, in the order {@link rowToIndexedEntry} expects.
|
|
20
|
+
*
|
|
21
|
+
* Chunk-5 flip (Checkpoint A): the durable identity columns `concept_id` and
|
|
22
|
+
* `bundle_id` are surfaced here so the state.db salience/outcome dual-read arms
|
|
23
|
+
* can build the fully-qualified `<bundle>//<concept-id>` new-grammar key from a
|
|
24
|
+
* mapped entry with ZERO extra queries (they are the last two columns and both
|
|
25
|
+
* nullable — a NULL-provenance write-back straggler simply yields `undefined`,
|
|
26
|
+
* and the reader falls through to its inline legacy `type:name` arm).
|
|
16
27
|
*/
|
|
17
|
-
export const ENTRY_COLUMNS = "id, entry_key, dir_path, file_path, stash_dir, entry_json, search_text";
|
|
28
|
+
export const ENTRY_COLUMNS = "id, entry_key, dir_path, file_path, stash_dir, entry_json, search_text, concept_id, bundle_id";
|
|
18
29
|
/**
|
|
19
30
|
* Map one raw `entries` row to a {@link DbIndexedEntry}, parsing `entry_json`.
|
|
20
31
|
* Returns `null` (and warns, tagged with `context`) when the JSON is corrupt so
|
|
@@ -37,5 +48,7 @@ export function rowToIndexedEntry(row, context) {
|
|
|
37
48
|
stashDir: row.stash_dir,
|
|
38
49
|
entry,
|
|
39
50
|
searchText: row.search_text,
|
|
51
|
+
conceptId: row.concept_id ?? undefined,
|
|
52
|
+
bundleId: row.bundle_id ?? undefined,
|
|
40
53
|
};
|
|
41
54
|
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* `index.db` FTS5 search + rebuild repository.
|
|
6
|
+
*
|
|
7
|
+
* Owns the `entries_fts` full-text query path and the incremental/full FTS
|
|
8
|
+
* rebuild. Extracted verbatim from `src/indexer/db/db.ts` (WI-5a).
|
|
9
|
+
*/
|
|
10
|
+
import { warn } from "../../core/warn.js";
|
|
11
|
+
import { buildPrefixQuery, sanitizeFtsQuery } from "../../indexer/search/fts-query.js";
|
|
12
|
+
import { buildSearchFields } from "../../indexer/search/search-fields.js";
|
|
13
|
+
import { SQLITE_CHUNK_SIZE } from "./index-sql.js";
|
|
14
|
+
export function searchFts(db, query, limit, entryType, excludeTypes) {
|
|
15
|
+
const ftsQuery = sanitizeFtsQuery(query);
|
|
16
|
+
if (!ftsQuery)
|
|
17
|
+
return [];
|
|
18
|
+
// Try the exact AND query first
|
|
19
|
+
const exactResults = runFtsQuery(db, ftsQuery, limit, entryType, excludeTypes);
|
|
20
|
+
if (exactResults.length > 0)
|
|
21
|
+
return exactResults;
|
|
22
|
+
// Exact match returned zero results — try prefix fallback.
|
|
23
|
+
// Append FTS5 `*` suffix to each token that is >= 3 characters long.
|
|
24
|
+
// Short tokens (1-2 chars) are excluded from prefix expansion because
|
|
25
|
+
// they produce too many false positives.
|
|
26
|
+
const prefixQuery = buildPrefixQuery(ftsQuery);
|
|
27
|
+
if (!prefixQuery)
|
|
28
|
+
return [];
|
|
29
|
+
return runFtsQuery(db, prefixQuery, limit, entryType, excludeTypes);
|
|
30
|
+
}
|
|
31
|
+
function runFtsQuery(db, ftsQuery, limit, entryType, excludeTypes) {
|
|
32
|
+
// #627 — exclude-type clause. Only applies on the untyped ('any') path; an
|
|
33
|
+
// explicit include filter (entryType) already narrows to a single type, so
|
|
34
|
+
// exclusion is redundant there. An empty list skips the clause entirely
|
|
35
|
+
// (never emit `NOT IN ()`, which is a SQL error / always-false).
|
|
36
|
+
const excludes = excludeTypes && excludeTypes.length > 0 ? excludeTypes : [];
|
|
37
|
+
// The typed and untyped paths differ ONLY by one WHERE clause (an entry_type
|
|
38
|
+
// equality vs. an optional NOT IN exclusion) and their param order — the
|
|
39
|
+
// SELECT/JOIN/ORDER/LIMIT is shared, so build it once. Join on integer
|
|
40
|
+
// entry_id directly (no CAST; we store integer). bm25() per-column weights:
|
|
41
|
+
// entry_id(0), name(10), description(5), tags(3), hints(2), content(1).
|
|
42
|
+
let filterClause;
|
|
43
|
+
let params;
|
|
44
|
+
if (entryType && entryType !== "any") {
|
|
45
|
+
filterClause = "AND e.entry_type = ?";
|
|
46
|
+
params = [ftsQuery, entryType, limit];
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
filterClause = excludes.length > 0 ? `AND e.entry_type NOT IN (${excludes.map(() => "?").join(", ")})` : "";
|
|
50
|
+
// Param order: MATCH, then the NOT IN values, then LIMIT.
|
|
51
|
+
params = [ftsQuery, ...excludes, limit];
|
|
52
|
+
}
|
|
53
|
+
const sql = `
|
|
54
|
+
SELECT e.id, e.file_path AS filePath, e.entry_json, e.search_text AS searchText,
|
|
55
|
+
e.item_ref AS itemRef,
|
|
56
|
+
bm25(entries_fts, 0, 10.0, 5.0, 3.0, 2.0, 1.0) AS bm25Score
|
|
57
|
+
FROM entries_fts f
|
|
58
|
+
JOIN entries e ON e.id = f.entry_id
|
|
59
|
+
WHERE entries_fts MATCH ?
|
|
60
|
+
${filterClause}
|
|
61
|
+
ORDER BY bm25Score, e.id ASC
|
|
62
|
+
LIMIT ?
|
|
63
|
+
`;
|
|
64
|
+
try {
|
|
65
|
+
const rows = db.prepare(sql).all(...params);
|
|
66
|
+
// Guard against corrupt JSON — skip the row rather than crashing
|
|
67
|
+
const results = [];
|
|
68
|
+
for (const row of rows) {
|
|
69
|
+
let entry;
|
|
70
|
+
try {
|
|
71
|
+
entry = JSON.parse(row.entry_json);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
warn(`[db] searchFts: skipping entry id=${row.id} — corrupt entry_json`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
results.push({
|
|
78
|
+
id: row.id,
|
|
79
|
+
filePath: row.filePath,
|
|
80
|
+
entry,
|
|
81
|
+
searchText: row.searchText,
|
|
82
|
+
bm25Score: row.bm25Score,
|
|
83
|
+
itemRef: row.itemRef,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return results;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
warn("[db] runFtsQuery failed:", err instanceof Error ? err.message : String(err));
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Rebuild the FTS5 search index.
|
|
95
|
+
*
|
|
96
|
+
* `incremental` (default `false`): when true, only rebuild rows that
|
|
97
|
+
* `upsertEntry` marked dirty since the last `rebuildFts` call. The full path
|
|
98
|
+
* (default) wipes `entries_fts` and re-inserts every row from `entries` —
|
|
99
|
+
* appropriate for `akm index --full` and version-upgrade rebuilds.
|
|
100
|
+
*
|
|
101
|
+
* Both paths are wrapped in a single transaction so the FTS table is never
|
|
102
|
+
* left in a half-rebuilt state.
|
|
103
|
+
*
|
|
104
|
+
* Skipped corrupt-JSON rows are aggregated into one warning instead of
|
|
105
|
+
* spamming stderr per-entry.
|
|
106
|
+
*/
|
|
107
|
+
export function rebuildFts(db, options) {
|
|
108
|
+
const incremental = options?.incremental === true;
|
|
109
|
+
db.transaction(() => {
|
|
110
|
+
let rows;
|
|
111
|
+
if (incremental) {
|
|
112
|
+
// Read the dirty queue and join against entries to get the JSON.
|
|
113
|
+
// Then drop the matching rows from entries_fts so the INSERT below
|
|
114
|
+
// doesn't double-up. The dirty list is drained at the end.
|
|
115
|
+
rows = db
|
|
116
|
+
.prepare(`SELECT e.id AS id, e.entry_json AS entry_json
|
|
117
|
+
FROM entries_fts_dirty d
|
|
118
|
+
JOIN entries e ON e.id = d.entry_id`)
|
|
119
|
+
.all();
|
|
120
|
+
if (rows.length === 0)
|
|
121
|
+
return;
|
|
122
|
+
const ids = rows.map((r) => r.id);
|
|
123
|
+
// Delete only the dirty FTS rows — chunk to stay under
|
|
124
|
+
// SQLITE_MAX_VARIABLE_NUMBER on large dirty queues.
|
|
125
|
+
for (let i = 0; i < ids.length; i += SQLITE_CHUNK_SIZE) {
|
|
126
|
+
const chunk = ids.slice(i, i + SQLITE_CHUNK_SIZE);
|
|
127
|
+
const placeholders = chunk.map(() => "?").join(",");
|
|
128
|
+
db.prepare(`DELETE FROM entries_fts WHERE entry_id IN (${placeholders})`).run(...chunk);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Full path: wipe and re-read every row.
|
|
133
|
+
db.exec("DELETE FROM entries_fts");
|
|
134
|
+
rows = db.prepare("SELECT id, entry_json FROM entries").all();
|
|
135
|
+
}
|
|
136
|
+
const insertStmt = db.prepare("INSERT INTO entries_fts (entry_id, name, description, tags, hints, content) VALUES (?, ?, ?, ?, ?, ?)");
|
|
137
|
+
let skipped = 0;
|
|
138
|
+
for (const row of rows) {
|
|
139
|
+
let entry;
|
|
140
|
+
let fields;
|
|
141
|
+
try {
|
|
142
|
+
entry = JSON.parse(row.entry_json);
|
|
143
|
+
fields = buildSearchFields(entry);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
skipped++;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
insertStmt.run(row.id, fields.name, fields.description, fields.tags, fields.hints, fields.content);
|
|
150
|
+
}
|
|
151
|
+
if (skipped > 0) {
|
|
152
|
+
warn(`[db] rebuildFts: skipped ${skipped} entr${skipped === 1 ? "y" : "ies"} with invalid entry_json`);
|
|
153
|
+
}
|
|
154
|
+
// Always drain the dirty queue — both paths converge here. The
|
|
155
|
+
// incremental path drains it because we just consumed every dirty row;
|
|
156
|
+
// the full path drains it because a full rebuild covers everything the
|
|
157
|
+
// dirty list tracks. The table is guaranteed to exist (created by
|
|
158
|
+
// ensureSchema()).
|
|
159
|
+
//
|
|
160
|
+
// BUG-L1: previously the if/else arms ran identical statements — the
|
|
161
|
+
// duplication has been collapsed.
|
|
162
|
+
db.exec("DELETE FROM entries_fts_dirty");
|
|
163
|
+
})();
|
|
164
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* `index.db` LLM enrichment-cache repository.
|
|
6
|
+
*
|
|
7
|
+
* Owns the raw SQL for `llm_enrichment_cache` — the body-hash-keyed cache that
|
|
8
|
+
* lets `akm index --enrich` skip the LLM call when a file's body is unchanged.
|
|
9
|
+
* Extracted verbatim from `src/indexer/db/db.ts` (WI-5a).
|
|
10
|
+
*/
|
|
11
|
+
import { bestEffort } from "../../core/best-effort.js";
|
|
12
|
+
import { sha256Hex } from "../../runtime.js";
|
|
13
|
+
import { SQLITE_CHUNK_SIZE } from "./index-sql.js";
|
|
14
|
+
/**
|
|
15
|
+
* Look up a cached LLM result for the given asset_ref.
|
|
16
|
+
*
|
|
17
|
+
* Returns `undefined` when no entry exists OR when the stored body_hash
|
|
18
|
+
* doesn't match `currentBodyHash` (body has changed since the result was
|
|
19
|
+
* cached). In both cases the caller should invoke the LLM and write a new
|
|
20
|
+
* cache entry.
|
|
21
|
+
*/
|
|
22
|
+
export function getLlmCacheEntry(db, assetRef, currentBodyHash, cacheVariant = "") {
|
|
23
|
+
const row = db
|
|
24
|
+
.prepare("SELECT asset_ref, cache_variant, body_hash, result_json, updated_at FROM llm_enrichment_cache WHERE asset_ref = ? AND cache_variant = ?")
|
|
25
|
+
.get(assetRef, cacheVariant);
|
|
26
|
+
if (!row)
|
|
27
|
+
return undefined;
|
|
28
|
+
// Hash mismatch → body changed, treat as cache miss.
|
|
29
|
+
if (row.body_hash !== currentBodyHash)
|
|
30
|
+
return undefined;
|
|
31
|
+
return {
|
|
32
|
+
assetRef: row.asset_ref,
|
|
33
|
+
cacheVariant: row.cache_variant,
|
|
34
|
+
bodyHash: row.body_hash,
|
|
35
|
+
resultJson: row.result_json,
|
|
36
|
+
updatedAt: row.updated_at,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Batched variant of {@link getLlmCacheEntry}. Fetches every cache row whose
|
|
41
|
+
* `asset_ref` is in `refs` with a single `IN (...)` query (chunked to respect
|
|
42
|
+
* SQLITE_MAX_VARIABLE_NUMBER), returning a `Map<assetRef, LlmCacheEntry>`.
|
|
43
|
+
*
|
|
44
|
+
* Unlike `getLlmCacheEntry`, this does NOT filter by body hash — callers must
|
|
45
|
+
* compare `entry.bodyHash` against the current body hash themselves. This lets
|
|
46
|
+
* the batch path issue one DB query per chunk instead of one per file.
|
|
47
|
+
*/
|
|
48
|
+
export function getLlmCacheEntriesByRefs(db, refs, cacheVariant = "") {
|
|
49
|
+
const result = new Map();
|
|
50
|
+
if (refs.length === 0)
|
|
51
|
+
return result;
|
|
52
|
+
for (let i = 0; i < refs.length; i += SQLITE_CHUNK_SIZE) {
|
|
53
|
+
const chunk = refs.slice(i, i + SQLITE_CHUNK_SIZE);
|
|
54
|
+
const placeholders = chunk.map(() => "?").join(", ");
|
|
55
|
+
const rows = db
|
|
56
|
+
.prepare(`SELECT asset_ref, cache_variant, body_hash, result_json, updated_at FROM llm_enrichment_cache
|
|
57
|
+
WHERE cache_variant = ? AND asset_ref IN (${placeholders})`)
|
|
58
|
+
.all(cacheVariant, ...chunk);
|
|
59
|
+
for (const row of rows) {
|
|
60
|
+
result.set(row.asset_ref, {
|
|
61
|
+
assetRef: row.asset_ref,
|
|
62
|
+
cacheVariant: row.cache_variant,
|
|
63
|
+
bodyHash: row.body_hash,
|
|
64
|
+
resultJson: row.result_json,
|
|
65
|
+
updatedAt: row.updated_at,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Insert or update a cached LLM result for the given asset_ref.
|
|
73
|
+
*/
|
|
74
|
+
export function upsertLlmCacheEntry(db, assetRef, bodyHash, resultJson, cacheVariant = "") {
|
|
75
|
+
db.prepare(`INSERT INTO llm_enrichment_cache (asset_ref, cache_variant, body_hash, result_json, updated_at)
|
|
76
|
+
VALUES (?, ?, ?, ?, ?)
|
|
77
|
+
ON CONFLICT(asset_ref, cache_variant) DO UPDATE SET
|
|
78
|
+
body_hash = excluded.body_hash,
|
|
79
|
+
result_json = excluded.result_json,
|
|
80
|
+
updated_at = excluded.updated_at`).run(assetRef, cacheVariant, bodyHash, resultJson, Date.now());
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Delete LLM cache entries whose asset_ref is no longer present in the
|
|
84
|
+
* `entries` table. Should be called during the cleanup phase of each index
|
|
85
|
+
* run to prevent the cache from growing unboundedly as assets are removed.
|
|
86
|
+
*
|
|
87
|
+
* The join uses a LIKE match against the entries `file_path` column because
|
|
88
|
+
* graph/memory cache refs are absolute file paths, while enrichment cache
|
|
89
|
+
* refs are entry_key strings — we preserve any entry that still has a
|
|
90
|
+
* corresponding row in either the entries table (by entry_key) or that
|
|
91
|
+
* matches a live file_path.
|
|
92
|
+
*/
|
|
93
|
+
export function clearStaleCacheEntries(db) {
|
|
94
|
+
bestEffort(() => {
|
|
95
|
+
db.exec(`
|
|
96
|
+
DELETE FROM llm_enrichment_cache
|
|
97
|
+
WHERE asset_ref NOT IN (SELECT file_path FROM entries)
|
|
98
|
+
AND asset_ref NOT IN (SELECT entry_key FROM entries)
|
|
99
|
+
`);
|
|
100
|
+
}, "llm_enrichment_cache may not exist in very old DBs opened without ensureSchema");
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Compute a stable SHA-256 hex digest of a UTF-8 string. Used as the body_hash
|
|
104
|
+
* key in `llm_enrichment_cache`. Routed through the runtime boundary so the
|
|
105
|
+
* SQLite layer stays free of direct runtime-specific references.
|
|
106
|
+
*/
|
|
107
|
+
export function computeBodyHash(body) {
|
|
108
|
+
return sha256Hex(body);
|
|
109
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* `index.db` meta + per-directory index-state repository.
|
|
6
|
+
*
|
|
7
|
+
* Owns the raw SQL for `index_meta` (the key/value stamp table) and
|
|
8
|
+
* `index_dir_state` (incremental-index bookkeeping). Extracted verbatim from
|
|
9
|
+
* `src/indexer/db/db.ts` (WI-5a) so the storage layer, not the indexer god-file,
|
|
10
|
+
* owns these primitives.
|
|
11
|
+
*/
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
// ── Meta helpers ────────────────────────────────────────────────────────────
|
|
14
|
+
export function getMeta(db, key) {
|
|
15
|
+
const row = db.prepare("SELECT value FROM index_meta WHERE key = ?").get(key);
|
|
16
|
+
return row?.value;
|
|
17
|
+
}
|
|
18
|
+
export function setMeta(db, key, value) {
|
|
19
|
+
db.prepare("INSERT OR REPLACE INTO index_meta (key, value) VALUES (?, ?)").run(key, value);
|
|
20
|
+
}
|
|
21
|
+
// ── Per-directory index state ───────────────────────────────────────────────
|
|
22
|
+
export function getIndexDirState(db, dirPath) {
|
|
23
|
+
const row = db
|
|
24
|
+
.prepare("SELECT dir_path, file_set_hash, file_mtime_max_ms, reason, updated_at FROM index_dir_state WHERE dir_path = ?")
|
|
25
|
+
.get(dirPath);
|
|
26
|
+
if (!row)
|
|
27
|
+
return undefined;
|
|
28
|
+
return {
|
|
29
|
+
dirPath: row.dir_path,
|
|
30
|
+
fileSetHash: row.file_set_hash,
|
|
31
|
+
fileMtimeMaxMs: row.file_mtime_max_ms,
|
|
32
|
+
reason: row.reason,
|
|
33
|
+
updatedAt: row.updated_at,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function upsertIndexDirState(db, state) {
|
|
37
|
+
db.prepare(`INSERT INTO index_dir_state (dir_path, file_set_hash, file_mtime_max_ms, reason, updated_at)
|
|
38
|
+
VALUES (?, ?, ?, ?, ?)
|
|
39
|
+
ON CONFLICT(dir_path) DO UPDATE SET
|
|
40
|
+
file_set_hash = excluded.file_set_hash,
|
|
41
|
+
file_mtime_max_ms = excluded.file_mtime_max_ms,
|
|
42
|
+
reason = excluded.reason,
|
|
43
|
+
updated_at = excluded.updated_at`).run(state.dirPath, state.fileSetHash, state.fileMtimeMaxMs, state.reason, new Date().toISOString());
|
|
44
|
+
}
|
|
45
|
+
export function deleteIndexDirState(db, dirPath) {
|
|
46
|
+
db.prepare("DELETE FROM index_dir_state WHERE dir_path = ?").run(dirPath);
|
|
47
|
+
}
|
|
48
|
+
export function deleteIndexDirStatesByStashDir(db, stashDir) {
|
|
49
|
+
db.prepare("DELETE FROM index_dir_state WHERE dir_path = ? OR dir_path LIKE ?").run(stashDir, `${stashDir}${path.sep}%`);
|
|
50
|
+
}
|