akm-cli 0.9.0-rc.0 → 0.9.0-rc.13
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 +1283 -22
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → 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/memory-infer-user.md +2 -3
- 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/prompts/workflow-unit-preamble.md +26 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -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 +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +99 -0
- package/dist/commands/env/env-cli.js +84 -224
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- 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 +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- 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 +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/migration-help.js +7 -4
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +232 -121
- 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 +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -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 +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -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 +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -834
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -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 +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/json-schema.js +142 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -34
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -56
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +16 -2
- package/dist/integrations/agent/profiles.js +36 -62
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +93 -4
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +88 -196
- package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
- package/dist/integrations/harnesses/aider/index.js +48 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
- package/dist/integrations/harnesses/amazonq/index.js +45 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +24 -35
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
- package/dist/integrations/harnesses/codex/index.js +52 -0
- package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
- package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
- package/dist/integrations/harnesses/copilot/index.js +48 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
- package/dist/integrations/harnesses/gemini/index.js +48 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +54 -34
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +14 -32
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
- package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
- package/dist/integrations/harnesses/openhands/index.js +48 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
- package/dist/integrations/harnesses/pi/index.js +45 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +43 -32
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +36 -39
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -279
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +11 -39
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -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 +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1164
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +3 -2
- package/dist/output/text.js +10 -19
- 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 +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- 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 +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +240 -19
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/text-import-hook.mjs +1 -1
- package/dist/workflows/authoring/authoring.js +104 -43
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -16
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +450 -0
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +1038 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1460 -0
- package/dist/workflows/exec/run-workflow.js +602 -0
- package/dist/workflows/exec/scheduler.js +71 -0
- package/dist/workflows/exec/step-work.js +1190 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +246 -0
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +68 -0
- package/dist/workflows/ir/schema.js +540 -0
- package/dist/workflows/parser.js +878 -304
- package/dist/workflows/program/expressions.js +181 -0
- package/dist/workflows/program/schema.js +51 -0
- package/dist/workflows/renderer.js +100 -45
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +376 -119
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +2 -3
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/schemas/akm-workflow.json +373 -0
- package/dist/akm-migrate-storage +0 -38
- 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/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- 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/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- 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/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- 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/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -259
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- 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 -1413
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- 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/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/scripts/migrate-storage.js +0 -19108
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- 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 -1012
- package/dist/workflows/db.js +0 -215
- package/docs/data-and-telemetry.md +0 -226
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import { makeAssetRef, parseAssetRef } from "../../core/asset/asset-ref.js";
|
|
7
6
|
import { parseFrontmatter } from "../../core/asset/frontmatter.js";
|
|
8
|
-
import {
|
|
7
|
+
import { conceptIdFromTypeName, parseRefInput, resolveRef } from "../../core/asset/resolve-ref.js";
|
|
8
|
+
import { loadConfig } from "../../core/config/config.js";
|
|
9
9
|
import { NotFoundError, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
|
|
10
10
|
import { readEvents } from "../../core/events.js";
|
|
11
|
-
import {
|
|
11
|
+
import { deriveInstallations } from "../../indexer/installations.js";
|
|
12
12
|
import { getWritableStashDirs, resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
13
13
|
import { resolveAssetPath } from "../../indexer/walk/path-resolver.js";
|
|
14
|
+
import { closeDatabase, openExistingDatabase, openReadonlyExistingDatabase, } from "../../storage/repositories/index-connection.js";
|
|
15
|
+
import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
|
|
16
|
+
import { getUtilityScoresByIds } from "../../storage/repositories/index-utility-repository.js";
|
|
14
17
|
import { isDistillRefusedInputType } from "./distill.js";
|
|
15
|
-
import {
|
|
18
|
+
import { isStrategyFilteredForAllPasses } from "./improve-strategies.js";
|
|
19
|
+
import { parseMemoryRef } from "./memory/derived-ref.js";
|
|
20
|
+
import { improveStateReadRefs } from "./source-identity.js";
|
|
16
21
|
// Eligibility / candidate-selection predicates for improve. Free functions
|
|
17
22
|
// (no akmImprove closure state) extracted from improve.ts to shrink the
|
|
18
23
|
// orchestrator and make candidate selection independently testable.
|
|
@@ -21,69 +26,122 @@ export function resolveImproveScope(scope) {
|
|
|
21
26
|
if (!trimmed)
|
|
22
27
|
return { mode: "all" };
|
|
23
28
|
try {
|
|
24
|
-
|
|
29
|
+
parseRefInput(trimmed);
|
|
25
30
|
return { mode: "ref", value: trimmed };
|
|
26
31
|
}
|
|
27
|
-
catch {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
catch (err) {
|
|
33
|
+
// A bare word with no ref separator is a `--scope <type>` filter attempt,
|
|
34
|
+
// not a ref. Any such word is accepted, including foreign/unknown type strings,
|
|
35
|
+
// which simply match zero entries downstream (a read-only query filter,
|
|
36
|
+
// not a data-acceptance gate, so no deny-list is needed here: an
|
|
37
|
+
// unrecognized type just matches nothing, since nothing is ever indexed
|
|
38
|
+
// with it). No test pinned the old "Unknown asset type" rejection for
|
|
39
|
+
// this case (chunk-1.5 anchors §A.5 — 0 hits).
|
|
40
|
+
//
|
|
41
|
+
// A colon-shaped value that still fails `parseRefInput` is a genuinely
|
|
42
|
+
// malformed ref attempt (bad name, path traversal, or a deny-listed
|
|
43
|
+
// deliberately-removed type like tool/vault, D1.5-6) — that must still
|
|
44
|
+
// surface as a real error, not be silently absorbed into a type filter
|
|
45
|
+
// that will never match anything.
|
|
46
|
+
if (!/[/:#]/.test(trimmed)) {
|
|
47
|
+
return { mode: "type", value: trimmed };
|
|
31
48
|
}
|
|
32
|
-
|
|
49
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
50
|
+
throw new UsageError(`Invalid --scope "${trimmed}": ${message}`, "INVALID_FLAG_VALUE");
|
|
33
51
|
}
|
|
34
52
|
}
|
|
35
53
|
/**
|
|
36
|
-
* Dedupe
|
|
37
|
-
*
|
|
38
|
-
* Layer-2 proactive-maintenance
|
|
54
|
+
* Dedupe eligible refs by their durable item ref when available, preserving
|
|
55
|
+
* the first candidate and its display ref. Used to
|
|
56
|
+
* merge the eligibility sources (feedback-signal, Layer-2 proactive-maintenance,
|
|
57
|
+
* high-salience) without admitting a ref into the loop twice.
|
|
39
58
|
*/
|
|
40
59
|
export function dedupeRefs(refs) {
|
|
41
60
|
const seen = new Set();
|
|
42
61
|
const out = [];
|
|
43
62
|
for (const r of refs) {
|
|
44
|
-
|
|
63
|
+
const key = r.itemRef ?? r.ref;
|
|
64
|
+
if (seen.has(key))
|
|
45
65
|
continue;
|
|
46
|
-
seen.add(
|
|
66
|
+
seen.add(key);
|
|
47
67
|
out.push(r);
|
|
48
68
|
}
|
|
49
69
|
return out;
|
|
50
70
|
}
|
|
51
|
-
export async function collectEligibleRefs(scope, stashDir, improveProfile) {
|
|
71
|
+
export async function collectEligibleRefs(scope, stashDir, improveProfile, config) {
|
|
72
|
+
return collectEligibleRefsFromIndex(scope, stashDir, improveProfile, false, config);
|
|
73
|
+
}
|
|
74
|
+
/** Dry-run planner path: query an existing index without creating or mutating it. */
|
|
75
|
+
export async function collectEligibleRefsReadOnly(scope, stashDir, improveProfile, config) {
|
|
76
|
+
return collectEligibleRefsFromIndex(scope, stashDir, improveProfile, true, config);
|
|
77
|
+
}
|
|
78
|
+
async function collectEligibleRefsFromIndex(scope, stashDir, improveProfile, readOnly, configOverride) {
|
|
79
|
+
const config = configOverride ?? loadConfig();
|
|
52
80
|
if (scope.mode === "ref" && scope.value) {
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
81
|
+
const writableDirs = new Set(getWritableStashDirs(stashDir, config).map((dir) => path.resolve(dir)));
|
|
82
|
+
let db;
|
|
83
|
+
try {
|
|
84
|
+
db = readOnly ? openReadonlyExistingDatabase() : openExistingDatabase();
|
|
85
|
+
if (!db) {
|
|
86
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
87
|
+
}
|
|
88
|
+
const entries = getAllEntries(db);
|
|
89
|
+
const entriesByItemRef = new Map(entries.flatMap((entry) => entry.bundleId && entry.conceptId ? [[`${entry.bundleId}//${entry.conceptId}`, entry]] : []));
|
|
90
|
+
const installations = deriveInstallations(resolveSourceEntries(stashDir, config));
|
|
91
|
+
const resolved = resolveRef(scope.value, {
|
|
92
|
+
defaultBundle: config.defaultBundle,
|
|
93
|
+
bundles: installations.map((installation) => ({
|
|
94
|
+
id: installation.id,
|
|
95
|
+
hasConcept: (conceptId) => entriesByItemRef.has(`${installation.id}//${conceptId}`),
|
|
96
|
+
})),
|
|
97
|
+
});
|
|
98
|
+
const indexed = entriesByItemRef.get(`${resolved.bundle}//${resolved.conceptId}`);
|
|
99
|
+
if (!indexed?.bundleId || !indexed.conceptId || !fs.existsSync(indexed.filePath)) {
|
|
100
|
+
if (await findAssetFilePath(scope.value, stashDir)) {
|
|
101
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
102
|
+
}
|
|
103
|
+
throw new NotFoundError(`Asset not found in the selected writable source: ${scope.value}`, "ASSET_NOT_FOUND");
|
|
104
|
+
}
|
|
105
|
+
if (!isEntryInScope(indexed.stashDir, indexed.filePath, stashDir) ||
|
|
106
|
+
!isEntryInWritableSource(indexed.stashDir, indexed.filePath, writableDirs)) {
|
|
107
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
108
|
+
}
|
|
109
|
+
const itemRef = `${indexed.bundleId}//${indexed.conceptId}`;
|
|
57
110
|
return {
|
|
58
|
-
plannedRefs: [],
|
|
59
|
-
memorySummary: {
|
|
60
|
-
|
|
111
|
+
plannedRefs: [{ ref: indexed.conceptId, itemRef, reason: "scope-ref", filePath: indexed.filePath }],
|
|
112
|
+
memorySummary: {
|
|
113
|
+
eligible: indexed.entry.type === "memory" ? 1 : 0,
|
|
114
|
+
derived: indexed.entry.type === "memory" && indexed.entry.name.endsWith(".derived") ? 1 : 0,
|
|
115
|
+
},
|
|
116
|
+
strategyFilteredRefs: [],
|
|
61
117
|
};
|
|
62
118
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error instanceof Error && /no such table:\s*entries/i.test(error.message)) {
|
|
121
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
if (db)
|
|
127
|
+
closeDatabase(db);
|
|
128
|
+
}
|
|
71
129
|
}
|
|
72
130
|
let sources;
|
|
73
131
|
try {
|
|
74
|
-
sources = resolveSourceEntries(stashDir);
|
|
132
|
+
sources = resolveSourceEntries(stashDir, config);
|
|
75
133
|
}
|
|
76
134
|
catch {
|
|
77
|
-
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 },
|
|
135
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
78
136
|
}
|
|
79
137
|
if (sources.length === 0) {
|
|
80
|
-
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 },
|
|
138
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
81
139
|
}
|
|
82
140
|
// Only operate on writable sources — never mutate read-only registry caches
|
|
83
141
|
// or remote stashes that the user did not mark writable.
|
|
84
142
|
let writableDirs;
|
|
85
143
|
try {
|
|
86
|
-
writableDirs = getWritableStashDirs(stashDir);
|
|
144
|
+
writableDirs = getWritableStashDirs(stashDir, config);
|
|
87
145
|
}
|
|
88
146
|
catch {
|
|
89
147
|
writableDirs = sources.slice(0, 1).map((s) => s.path); // fallback: primary only
|
|
@@ -91,7 +149,10 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
|
|
|
91
149
|
const writableDirSet = new Set(writableDirs.map((d) => path.resolve(d)));
|
|
92
150
|
let db;
|
|
93
151
|
try {
|
|
94
|
-
db = openExistingDatabase();
|
|
152
|
+
db = readOnly ? openReadonlyExistingDatabase() : openExistingDatabase();
|
|
153
|
+
if (!db) {
|
|
154
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
155
|
+
}
|
|
95
156
|
const entries = getAllEntries(db, scope.mode === "type" ? scope.value : undefined).filter((indexed) => {
|
|
96
157
|
// First apply the existing stashDir-scope filter (no-op when stashDir is unset).
|
|
97
158
|
if (!isEntryInScope(indexed.stashDir, indexed.filePath, stashDir))
|
|
@@ -100,11 +161,26 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
|
|
|
100
161
|
return isEntryInWritableSource(indexed.stashDir, indexed.filePath, writableDirSet);
|
|
101
162
|
});
|
|
102
163
|
const planned = new Map();
|
|
103
|
-
const
|
|
164
|
+
const strategyFiltered = new Map();
|
|
104
165
|
let memoryEligible = 0;
|
|
105
166
|
let memoryDerived = 0;
|
|
106
167
|
for (const indexed of entries) {
|
|
107
|
-
|
|
168
|
+
// Chunk-8 WI-8.5c: the candidate `ref` is the SHORT conceptId
|
|
169
|
+
// (`<stash-subdir>/<name>`, D-R2) — it now matches the disk lookup,
|
|
170
|
+
// xrefs, and `displayRef` output spelling. `.itemRef` below stays the
|
|
171
|
+
// fully-qualified durable key.
|
|
172
|
+
const ref = conceptIdFromTypeName(indexed.entry.type, indexed.entry.name);
|
|
173
|
+
try {
|
|
174
|
+
parseRefInput(ref);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error instanceof UsageError || error instanceof NotFoundError)
|
|
178
|
+
continue;
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
// Derive the durable item_ref from indexed provenance without another query.
|
|
182
|
+
// A provenance-free row uses the short conceptId ref for improve state.
|
|
183
|
+
const itemRef = indexed.bundleId && indexed.conceptId ? `${indexed.bundleId}//${indexed.conceptId}` : undefined;
|
|
108
184
|
const isDerived = indexed.entry.name.endsWith(".derived");
|
|
109
185
|
// `.derived` memories are LLM-inferred and intentionally skip reflect
|
|
110
186
|
// (see the synthetic `derived-memory-reflect-skipped` branch in the
|
|
@@ -113,19 +189,20 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
|
|
|
113
189
|
// 2026-05-21: 11 derived refs re-planned every hour during idle periods.
|
|
114
190
|
// The cleanup phase (analyzeMemoryCleanup) inspects derived memories
|
|
115
191
|
// independently of `plannedRefs`, so dropping them here loses nothing.
|
|
116
|
-
if (!isDerived && !planned.has(ref) && !
|
|
117
|
-
// 2026-05-27: extend the .derived precedent to
|
|
192
|
+
if (!isDerived && !planned.has(ref) && !strategyFiltered.has(ref)) {
|
|
193
|
+
// 2026-05-27: extend the .derived precedent to strategy-incompatible
|
|
118
194
|
// refs. If every per-ref pass (reflect + distill) on the active
|
|
119
|
-
//
|
|
120
|
-
// caller emits `improve_skipped { reason:
|
|
195
|
+
// strategy would refuse this ref, drop it from `plannedRefs`. The
|
|
196
|
+
// caller emits `improve_skipped { reason: strategy_filtered_all_passes }`
|
|
121
197
|
// once `eventsCtx` is available so the audit trail is preserved in a
|
|
122
198
|
// single event per ref instead of 2× synthetic actions per run.
|
|
123
199
|
// Background: see /tmp/akm-health-investigations/planner-profile-metrics-deep-analysis.md
|
|
124
|
-
if (improveProfile &&
|
|
125
|
-
|
|
200
|
+
if (improveProfile && isStrategyFilteredForAllPasses(ref, improveProfile)) {
|
|
201
|
+
strategyFiltered.set(ref, {
|
|
126
202
|
ref,
|
|
127
|
-
reason: "
|
|
203
|
+
reason: "strategy_filtered_all_passes",
|
|
128
204
|
filePath: indexed.filePath,
|
|
205
|
+
itemRef,
|
|
129
206
|
});
|
|
130
207
|
}
|
|
131
208
|
else {
|
|
@@ -133,6 +210,7 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
|
|
|
133
210
|
ref,
|
|
134
211
|
reason: scope.mode === "type" ? "scope-type" : indexed.entry.type === "memory" ? "memory-cleanup" : "scope-type",
|
|
135
212
|
filePath: indexed.filePath,
|
|
213
|
+
itemRef,
|
|
136
214
|
});
|
|
137
215
|
}
|
|
138
216
|
}
|
|
@@ -145,14 +223,14 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
|
|
|
145
223
|
return {
|
|
146
224
|
plannedRefs: [...planned.values()],
|
|
147
225
|
memorySummary: { eligible: memoryEligible, derived: memoryDerived },
|
|
148
|
-
|
|
226
|
+
strategyFilteredRefs: [...strategyFiltered.values()],
|
|
149
227
|
};
|
|
150
228
|
}
|
|
151
229
|
catch (error) {
|
|
152
|
-
//
|
|
230
|
+
// Empty-stash setup paths can open index.db before its schema exists.
|
|
153
231
|
rethrowIfTestIsolationError(error);
|
|
154
|
-
if (error instanceof
|
|
155
|
-
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 },
|
|
232
|
+
if (error instanceof Error && /no such table:\s*entries/i.test(error.message)) {
|
|
233
|
+
return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
|
|
156
234
|
}
|
|
157
235
|
throw error;
|
|
158
236
|
}
|
|
@@ -191,11 +269,16 @@ export function isEntryInWritableSource(entryStashDir, filePath, writableDirSet)
|
|
|
191
269
|
export function memoryCleanupParentRef(scope, stashDir) {
|
|
192
270
|
if (scope.mode !== "ref" || !scope.value)
|
|
193
271
|
return undefined;
|
|
194
|
-
const parsed =
|
|
272
|
+
const parsed = parseRefInput(scope.value);
|
|
195
273
|
if (parsed.type !== "memory")
|
|
196
274
|
return undefined;
|
|
275
|
+
// Non-derived parent scope: emit the canonical `memories/<name>` conceptId so
|
|
276
|
+
// it matches `resolveParentRef`'s output in analyzeMemoryCleanup's parentRef
|
|
277
|
+
// filter (Group-C item 2 — the reader and every comparison site flipped
|
|
278
|
+
// together; emitting the raw scope value would re-open the mismatch the
|
|
279
|
+
// chunk-8 history warns about).
|
|
197
280
|
if (!parsed.name.endsWith(".derived"))
|
|
198
|
-
return
|
|
281
|
+
return conceptIdFromTypeName(parsed.type, parsed.name);
|
|
199
282
|
const sources = resolveSourceEntries(stashDir);
|
|
200
283
|
for (const source of sources) {
|
|
201
284
|
const candidate = path.join(source.path, "memories", `${parsed.name}.md`);
|
|
@@ -203,23 +286,21 @@ export function memoryCleanupParentRef(scope, stashDir) {
|
|
|
203
286
|
continue;
|
|
204
287
|
const raw = fs.readFileSync(candidate, "utf8");
|
|
205
288
|
const fm = parseFrontmatter(raw).data;
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
catch { }
|
|
214
|
-
}
|
|
289
|
+
// The `source:` backref is normalized to the `memories/<name>` conceptId.
|
|
290
|
+
// That is exactly what
|
|
291
|
+
// analyzeMemoryCleanup's parentRef filter compares against — resolveParentRef
|
|
292
|
+
// emits the same conceptId — so the two sites stay in lockstep.
|
|
293
|
+
const parent = parseMemoryRef(typeof fm.source === "string" ? fm.source : undefined);
|
|
294
|
+
if (parent)
|
|
295
|
+
return parent;
|
|
215
296
|
}
|
|
216
|
-
return
|
|
297
|
+
return conceptIdFromTypeName("memory", parsed.name.slice(0, -".derived".length));
|
|
217
298
|
}
|
|
218
299
|
export function isLessonCandidate(ref) {
|
|
219
300
|
// Only lesson assets need lesson-schema validation (description + when_to_use).
|
|
220
301
|
// Memories have their own distill path via shouldDistillMemoryRef.
|
|
221
302
|
// All other types go through reflect, not distill.
|
|
222
|
-
return
|
|
303
|
+
return parseRefInput(ref).type === "lesson";
|
|
223
304
|
}
|
|
224
305
|
/**
|
|
225
306
|
* Planner-side check: should this ref enter the distill queue?
|
|
@@ -239,16 +320,16 @@ export function isLessonCandidate(ref) {
|
|
|
239
320
|
* which was true *only* for `lesson:*` refs — exactly the set distill refuses.
|
|
240
321
|
* The result: every hourly run re-queued the same lesson refs, the same skip
|
|
241
322
|
* message returned, and no work was ever done. See
|
|
242
|
-
* `tests/commands/improve-distill-planner-skip-lessons.test.ts`.
|
|
323
|
+
* `tests/integration/commands/improve-distill-planner-skip-lessons.test.ts`.
|
|
243
324
|
*/
|
|
244
325
|
export function isDistillCandidateRef(ref, stashDir) {
|
|
245
|
-
const parsed =
|
|
326
|
+
const parsed = parseRefInput(ref);
|
|
246
327
|
if (isDistillRefusedInputType(parsed.type))
|
|
247
328
|
return false;
|
|
248
329
|
return shouldDistillMemoryRef(ref, stashDir);
|
|
249
330
|
}
|
|
250
331
|
export function shouldDistillMemoryRef(ref, stashDir) {
|
|
251
|
-
const parsed =
|
|
332
|
+
const parsed = parseRefInput(ref);
|
|
252
333
|
if (parsed.type !== "memory")
|
|
253
334
|
return false;
|
|
254
335
|
const sources = resolveSourceEntries(stashDir);
|
|
@@ -282,15 +363,16 @@ export function shouldDistillMemoryRef(ref, stashDir) {
|
|
|
282
363
|
* metadata events are ignored so a stray `akm feedback <ref>` invocation
|
|
283
364
|
* without a flag doesn't trigger downstream re-processing.
|
|
284
365
|
*/
|
|
285
|
-
export function buildLatestFeedbackTsMap(refs, sinceIso) {
|
|
366
|
+
export function buildLatestFeedbackTsMap(refs, sinceIso, itemRefByRef) {
|
|
286
367
|
const out = new Map();
|
|
287
368
|
if (refs.length === 0)
|
|
288
369
|
return out;
|
|
289
|
-
|
|
370
|
+
// Correlate item_ref-keyed events and conceptId-keyed direct invocations.
|
|
371
|
+
const refByDurableKey = new Map(refs.flatMap((ref) => improveStateReadRefs(ref, itemRefByRef?.get(ref)).map((key) => [key, ref])));
|
|
290
372
|
const { events } = readEvents({ type: "feedback", since: sinceIso });
|
|
291
373
|
for (const e of events) {
|
|
292
|
-
const ref = e.ref;
|
|
293
|
-
if (!ref
|
|
374
|
+
const ref = e.ref ? refByDurableKey.get(e.ref) : undefined;
|
|
375
|
+
if (!ref)
|
|
294
376
|
continue;
|
|
295
377
|
const meta = e.metadata;
|
|
296
378
|
const hasSignal = meta !== undefined && (typeof meta.signal === "string" || typeof meta.note === "string");
|
|
@@ -306,21 +388,22 @@ export function buildLatestFeedbackTsMap(refs, sinceIso) {
|
|
|
306
388
|
* Latest proposal timestamp per input-ref, filtered by source ('reflect' or
|
|
307
389
|
* 'distill'). Reads the corresponding `*_invoked` events from state.db —
|
|
308
390
|
* these events are emitted at proposal creation time and carry the *input*
|
|
309
|
-
* asset ref (
|
|
391
|
+
* asset ref (`memories/foo`, `skills/bar`, etc.) directly. We use them rather than
|
|
310
392
|
* `listProposals` because distill proposals are keyed by the derived
|
|
311
393
|
* lesson/knowledge ref, not the source memory — joining back through the
|
|
312
394
|
* payload would be fragile.
|
|
313
395
|
*/
|
|
314
|
-
export function buildLatestProposalTsMap(refs, source) {
|
|
396
|
+
export function buildLatestProposalTsMap(refs, source, itemRefByRef) {
|
|
315
397
|
const out = new Map();
|
|
316
398
|
if (refs.length === 0)
|
|
317
399
|
return out;
|
|
318
|
-
|
|
400
|
+
// Correlate item_ref-keyed events and conceptId-keyed direct invocations.
|
|
401
|
+
const refByDurableKey = new Map(refs.flatMap((ref) => improveStateReadRefs(ref, itemRefByRef?.get(ref)).map((key) => [key, ref])));
|
|
319
402
|
const eventType = source === "reflect" ? "reflect_invoked" : "distill_invoked";
|
|
320
403
|
const { events } = readEvents({ type: eventType });
|
|
321
404
|
for (const e of events) {
|
|
322
|
-
const ref = e.ref;
|
|
323
|
-
if (!ref
|
|
405
|
+
const ref = e.ref ? refByDurableKey.get(e.ref) : undefined;
|
|
406
|
+
if (!ref)
|
|
324
407
|
continue;
|
|
325
408
|
// For distill_invoked we only count attempts that produced (or attempted
|
|
326
409
|
// to produce) a real proposal — config_disabled / parse-error outcomes
|
|
@@ -343,8 +426,9 @@ export function buildLatestProposalTsMap(refs, source) {
|
|
|
343
426
|
* exists for this (ref, source) OR `latestFeedback[ref] > lastProposal[ref]`.
|
|
344
427
|
*
|
|
345
428
|
* Refs with no feedback signal at all are ineligible by definition — the
|
|
346
|
-
* high-
|
|
347
|
-
* planner)
|
|
429
|
+
* proactive-maintenance and high-salience fallback lanes (see
|
|
430
|
+
* `noFeedbackCandidates` later in the planner) handle never-rated assets
|
|
431
|
+
* separately.
|
|
348
432
|
*/
|
|
349
433
|
export function isSignalDeltaEligible(ref, latestFeedback, lastProposal) {
|
|
350
434
|
const fb = latestFeedback.get(ref);
|
|
@@ -385,7 +469,7 @@ export function shouldAnalyzeMemoryCleanup(scope, eligibleMemories, primaryStash
|
|
|
385
469
|
return scope.value === "memory";
|
|
386
470
|
if (!scope.value)
|
|
387
471
|
return false;
|
|
388
|
-
return
|
|
472
|
+
return parseRefInput(scope.value).type === "memory";
|
|
389
473
|
}
|
|
390
474
|
export function buildUtilityMap(refs) {
|
|
391
475
|
const map = new Map();
|
|
@@ -398,7 +482,9 @@ export function buildUtilityMap(refs) {
|
|
|
398
482
|
const allDbEntries = getAllEntries(db);
|
|
399
483
|
const idToRef = new Map();
|
|
400
484
|
for (const indexed of allDbEntries) {
|
|
401
|
-
|
|
485
|
+
// Chunk-8 WI-8.5c: correlate on the SHORT conceptId to match the
|
|
486
|
+
// `ImproveEligibleRef.ref` set built in collectEligibleRefsFromIndex.
|
|
487
|
+
const ref = conceptIdFromTypeName(indexed.entry.type, indexed.entry.name);
|
|
402
488
|
if (refSet.has(ref))
|
|
403
489
|
idToRef.set(indexed.id, ref);
|
|
404
490
|
}
|
|
@@ -429,6 +515,6 @@ export async function findAssetFilePath(ref, stashDir, writableDirSet) {
|
|
|
429
515
|
writableDirSet,
|
|
430
516
|
directoryIndexNames: ["SKILL.md"],
|
|
431
517
|
preserveDirectNameFallback: true,
|
|
432
|
-
honorOrigin:
|
|
518
|
+
honorOrigin: true,
|
|
433
519
|
});
|
|
434
520
|
}
|