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
|
@@ -0,0 +1,166 @@
|
|
|
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
|
+
* `akm bundle` command group — 0.9 CLI overhaul (S7).
|
|
6
|
+
*
|
|
7
|
+
* Consolidates the five former top-level bundle-lifecycle commands under one
|
|
8
|
+
* group, hard break, no alias kept at the top level:
|
|
9
|
+
* - `create` (= old top-level `init`, src/commands/sources/init.ts)
|
|
10
|
+
* - `add` (= old top-level `add`, src/commands/sources/add-cli.ts — the
|
|
11
|
+
* command definition moved here; `add-cli.ts` keeps its exported helpers,
|
|
12
|
+
* including `auditInstalledStashForDangerousKeys`, which a test imports
|
|
13
|
+
* directly)
|
|
14
|
+
* - `list` (= old top-level `list`)
|
|
15
|
+
* - `remove` (= old top-level `remove`)
|
|
16
|
+
* - `update` (= old top-level `update`)
|
|
17
|
+
* - `show <name>` — NEW: a single-bundle detail view of the `list` payload.
|
|
18
|
+
*
|
|
19
|
+
* `add`/`list`/`remove`/`update` are pure relocations (payload and output
|
|
20
|
+
* shape unchanged: `SourceEntry`/`RemoveResponse`/`UpdateResponse` keep their
|
|
21
|
+
* bare `add`/`list`/`remove`/`update` output shape). `create` is a genuine
|
|
22
|
+
* verb rename (was `init`), so its output shape is renamed to `bundle-create`
|
|
23
|
+
* to match (the same convention S8 used for `propose` -> `proposal new`'s
|
|
24
|
+
* `proposal-new` shape). `show` is a new shape, `bundle-show`.
|
|
25
|
+
*/
|
|
26
|
+
import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
|
|
27
|
+
import { NotFoundError, UsageError } from "../../core/errors.js";
|
|
28
|
+
import { appendEvent } from "../../core/events.js";
|
|
29
|
+
import { addCommand } from "./add-cli.js";
|
|
30
|
+
import { akmInit } from "./init.js";
|
|
31
|
+
import { akmListSources, akmRemove, akmUpdate } from "./installed-stashes.js";
|
|
32
|
+
const VALID_SOURCE_KINDS = new Set(["filesystem", "git", "npm", "website"]);
|
|
33
|
+
function parseKindFilter(raw) {
|
|
34
|
+
if (!raw)
|
|
35
|
+
return undefined;
|
|
36
|
+
const kinds = raw.split(",").map((s) => s.trim());
|
|
37
|
+
for (const k of kinds) {
|
|
38
|
+
if (!VALID_SOURCE_KINDS.has(k)) {
|
|
39
|
+
throw new UsageError(`Invalid --kind value: "${k}". Expected one of: filesystem, git, npm, website`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return kinds;
|
|
43
|
+
}
|
|
44
|
+
const createCommand = defineJsonCommand({
|
|
45
|
+
meta: {
|
|
46
|
+
name: "create",
|
|
47
|
+
description: "Initialize akm's working bundle directory and persist it in config",
|
|
48
|
+
},
|
|
49
|
+
args: {
|
|
50
|
+
dir: { type: "string", description: "Custom bundle directory path (default: ~/akm)" },
|
|
51
|
+
"set-default": {
|
|
52
|
+
type: "boolean",
|
|
53
|
+
description: "Make --dir the default bundle. Without this, `akm bundle create --dir X` scaffolds X but leaves your existing default bundle unchanged.",
|
|
54
|
+
default: false,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
async run({ args }) {
|
|
58
|
+
const result = await akmInit({
|
|
59
|
+
dir: args.dir,
|
|
60
|
+
setDefault: args["set-default"],
|
|
61
|
+
});
|
|
62
|
+
output("bundle-create", result);
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const listCommand = defineJsonCommand({
|
|
66
|
+
meta: { name: "list", description: "List configured bundles and their resolved source state" },
|
|
67
|
+
args: {
|
|
68
|
+
kind: {
|
|
69
|
+
type: "string",
|
|
70
|
+
description: "Filter by source provider (filesystem, git, npm, website). Comma-separated.",
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
async run({ args }) {
|
|
74
|
+
const kind = parseKindFilter(args.kind);
|
|
75
|
+
const result = await akmListSources({ kind });
|
|
76
|
+
output("list", result);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
const showCommand = defineJsonCommand({
|
|
80
|
+
meta: { name: "show", description: "Show detail for a single configured bundle" },
|
|
81
|
+
args: {
|
|
82
|
+
name: { type: "positional", description: "Bundle name (as reported by `akm bundle list`)", required: true },
|
|
83
|
+
},
|
|
84
|
+
async run({ args }) {
|
|
85
|
+
const { sources } = await akmListSources();
|
|
86
|
+
const entry = sources.find((s) => s.name === args.name);
|
|
87
|
+
if (!entry) {
|
|
88
|
+
throw new NotFoundError(`No configured bundle named "${args.name}"`, "SOURCE_NOT_FOUND");
|
|
89
|
+
}
|
|
90
|
+
output("bundle-show", entry);
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
const removeCommand = defineJsonCommand({
|
|
94
|
+
meta: { name: "remove", description: "Remove a bundle by id, ref, path, URL, or name" },
|
|
95
|
+
args: {
|
|
96
|
+
target: { type: "positional", description: "Bundle to remove (id, ref, path, URL, or name)", required: true },
|
|
97
|
+
yes: { type: "boolean", alias: "y", description: "Skip confirmation prompt", default: false },
|
|
98
|
+
},
|
|
99
|
+
async run({ args }) {
|
|
100
|
+
const { confirmDestructive } = await import("../../cli/confirm.js");
|
|
101
|
+
const confirmed = await confirmDestructive(`Remove bundle "${args.target}"? This cannot be undone.`, {
|
|
102
|
+
yes: args.yes === true,
|
|
103
|
+
});
|
|
104
|
+
if (!confirmed) {
|
|
105
|
+
process.stderr.write("Aborted.\n");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const result = await akmRemove({ target: args.target });
|
|
109
|
+
appendEvent({
|
|
110
|
+
eventType: "remove",
|
|
111
|
+
metadata: {
|
|
112
|
+
target: args.target,
|
|
113
|
+
ref: typeof result.removed?.ref === "string" ? result.removed.ref : null,
|
|
114
|
+
id: typeof result.removed?.id === "string" ? result.removed.id : null,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
output("remove", result);
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const updateCommand = defineJsonCommand({
|
|
121
|
+
meta: { name: "update", description: "Update one or all managed bundles" },
|
|
122
|
+
args: {
|
|
123
|
+
target: { type: "positional", description: "Bundle to update (id or ref)", required: false },
|
|
124
|
+
all: { type: "boolean", description: "Update all installed entries", default: false },
|
|
125
|
+
force: { type: "boolean", description: "Force fresh download even if version is unchanged", default: false },
|
|
126
|
+
// F1/R-058: gates ONLY the rare branch where the resolved content
|
|
127
|
+
// directory moves and the previous `localRoot` is deleted — a normal
|
|
128
|
+
// refresh (the overwhelming majority of updates) deletes nothing and
|
|
129
|
+
// never consults this flag. Mirrors `remove`'s `-y/--yes`.
|
|
130
|
+
yes: {
|
|
131
|
+
type: "boolean",
|
|
132
|
+
alias: "y",
|
|
133
|
+
description: "Skip the confirmation prompt when an update needs to delete a previous install directory (because the resolved content location moved). No effect on a normal refresh, which deletes nothing.",
|
|
134
|
+
default: false,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
async run({ args }) {
|
|
138
|
+
const result = await akmUpdate({ target: args.target, all: args.all, force: args.force, yes: args.yes });
|
|
139
|
+
appendEvent({
|
|
140
|
+
eventType: "update",
|
|
141
|
+
metadata: {
|
|
142
|
+
target: args.target ?? null,
|
|
143
|
+
all: args.all === true,
|
|
144
|
+
force: args.force === true,
|
|
145
|
+
processed: Array.isArray(result.processed)
|
|
146
|
+
? result.processed.length
|
|
147
|
+
: 0,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
output("update", result);
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
export const bundleCommand = defineGroupCommand({
|
|
154
|
+
meta: {
|
|
155
|
+
name: "bundle",
|
|
156
|
+
description: "Create, add to, inspect, and manage your bundles (working bundle + configured sources)",
|
|
157
|
+
},
|
|
158
|
+
subCommands: {
|
|
159
|
+
create: createCommand,
|
|
160
|
+
add: addCommand,
|
|
161
|
+
list: listCommand,
|
|
162
|
+
show: showCommand,
|
|
163
|
+
remove: removeCommand,
|
|
164
|
+
update: updateCommand,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
* Bundle-map config write helpers (0.9.0 config-shape cutover, spec §10.1).
|
|
6
|
+
*
|
|
7
|
+
* The `stashDir`/`sources[]`/`installed[]` trio is retired: every source is now
|
|
8
|
+
* a `bundles.<slug>` entry, and the primary working stash is the `defaultBundle`.
|
|
9
|
+
* These helpers give the source writers (`akm bundle create`, `akm setup`, `akm bundle add`,
|
|
10
|
+
* `akm sources add/remove`) one place to derive slug-legal bundle keys (via the
|
|
11
|
+
* shared {@link deriveBundleId} — D-R5), locate an existing bundle by its source
|
|
12
|
+
* descriptor, and set/repoint the primary bundle — without duplicating the
|
|
13
|
+
* keying rules across call sites.
|
|
14
|
+
*/
|
|
15
|
+
import path from "node:path";
|
|
16
|
+
import { primaryBundlePath } from "../../core/config/config.js";
|
|
17
|
+
import { deriveBundleId } from "../../indexer/installations.js";
|
|
18
|
+
export { primaryBundlePath };
|
|
19
|
+
/**
|
|
20
|
+
* Upsert the primary filesystem bundle (`{ path, writable: true }`) and point
|
|
21
|
+
* `defaultBundle` at it. Reuses the current default key when it already names a
|
|
22
|
+
* filesystem bundle (so re-pointing the primary keeps a stable id); otherwise
|
|
23
|
+
* derives a fresh slug-legal key from the path.
|
|
24
|
+
*/
|
|
25
|
+
export function withPrimaryBundle(config, stashDir) {
|
|
26
|
+
const bundles = { ...(config.bundles ?? {}) };
|
|
27
|
+
let key = config.defaultBundle;
|
|
28
|
+
if (!key || !(key in bundles) || typeof bundles[key]?.path !== "string") {
|
|
29
|
+
key = deriveBundleId(undefined, stashDir, new Set(Object.keys(bundles)));
|
|
30
|
+
}
|
|
31
|
+
bundles[key] = {
|
|
32
|
+
...bundles[key],
|
|
33
|
+
path: stashDir,
|
|
34
|
+
writable: true,
|
|
35
|
+
components: { main: { root: ".", adapter: "akm", writable: true } },
|
|
36
|
+
};
|
|
37
|
+
return { ...config, bundles, defaultBundle: key };
|
|
38
|
+
}
|
|
39
|
+
/** Existing bundle key whose filesystem descriptor resolves to `resolvedPath`, or `undefined`. */
|
|
40
|
+
export function bundleKeyForPath(config, resolvedPath) {
|
|
41
|
+
for (const [key, bundle] of Object.entries(config.bundles ?? {})) {
|
|
42
|
+
if (typeof bundle.path === "string" && path.resolve(bundle.path) === resolvedPath)
|
|
43
|
+
return key;
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
/** Existing bundle key whose git/website/npm descriptor matches `url`, or `undefined`. */
|
|
48
|
+
export function bundleKeyForUrl(config, url) {
|
|
49
|
+
for (const [key, bundle] of Object.entries(config.bundles ?? {})) {
|
|
50
|
+
if (bundle.git === url || bundle.website?.url === url || bundle.npm === url)
|
|
51
|
+
return key;
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Derive a slug-legal, batch-unique bundle key for a new source: prefer the
|
|
57
|
+
* caller's `preferredName` when it is a legal slug, else slug the seed locator
|
|
58
|
+
* (path/url) — the shared {@link deriveBundleId} rule (D-R5), made unique against
|
|
59
|
+
* the currently-configured bundle keys.
|
|
60
|
+
*/
|
|
61
|
+
export function nextBundleKey(bundles, preferredName, seedLocator) {
|
|
62
|
+
return deriveBundleId(preferredName, seedLocator, new Set(Object.keys(bundles)));
|
|
63
|
+
}
|
|
@@ -2,11 +2,16 @@
|
|
|
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
|
import fs from "node:fs";
|
|
5
|
-
import {
|
|
5
|
+
import { placementTypes } from "../../core/asset/asset-placement.js";
|
|
6
|
+
import { resolveStashDir } from "../../core/common.js";
|
|
6
7
|
import { getSources, loadConfig } from "../../core/config/config.js";
|
|
7
8
|
import { getDbPath } from "../../core/paths.js";
|
|
8
|
-
import {
|
|
9
|
+
import { error } from "../../core/warn.js";
|
|
9
10
|
import { getEffectiveSemanticStatus, readSemanticStatus } from "../../indexer/search/semantic-status.js";
|
|
11
|
+
import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
|
|
12
|
+
import { getEntryCount, getEntryCountByType } from "../../storage/repositories/index-entries-repository.js";
|
|
13
|
+
import { getMeta } from "../../storage/repositories/index-meta-repository.js";
|
|
14
|
+
import { isVecAvailable } from "../../storage/repositories/index-vec-repository.js";
|
|
10
15
|
import { pkgVersion } from "../../version.js";
|
|
11
16
|
/**
|
|
12
17
|
* Assemble system info describing the current capabilities, configuration,
|
|
@@ -16,8 +21,13 @@ import { pkgVersion } from "../../version.js";
|
|
|
16
21
|
*/
|
|
17
22
|
export function assembleInfo(options) {
|
|
18
23
|
const config = loadConfig();
|
|
19
|
-
//
|
|
20
|
-
|
|
24
|
+
// Primary stash directory + default bundle name — same resolution
|
|
25
|
+
// `akm sources list` uses (R-057), so `akm info` and `akm sources list`
|
|
26
|
+
// agree on which stash is primary.
|
|
27
|
+
const stashDir = resolveStashDir();
|
|
28
|
+
const defaultBundle = config.defaultBundle ?? null;
|
|
29
|
+
// Asset types (copy into a mutable array — `placementTypes()` returns readonly)
|
|
30
|
+
const assetTypes = [...placementTypes()];
|
|
21
31
|
const semanticRuntime = readSemanticStatus();
|
|
22
32
|
const semanticStatus = getEffectiveSemanticStatus(config, semanticRuntime);
|
|
23
33
|
// Search modes
|
|
@@ -32,28 +42,26 @@ export function assembleInfo(options) {
|
|
|
32
42
|
...(r.provider ? { provider: r.provider } : {}),
|
|
33
43
|
...(r.enabled !== undefined ? { enabled: r.enabled } : {}),
|
|
34
44
|
}));
|
|
35
|
-
// Stash providers —
|
|
36
|
-
//
|
|
37
|
-
// always reflects at least one provider when a stash is configured.
|
|
45
|
+
// Stash providers — the unified `bundles` source list (spec §10.1), which
|
|
46
|
+
// already includes the primary (`defaultBundle`) stash first.
|
|
38
47
|
const configuredSources = getSources(config);
|
|
39
|
-
const
|
|
40
|
-
? [{ type: "filesystem", path: config.stashDir, name: "primary" }]
|
|
41
|
-
: configuredSources;
|
|
42
|
-
const sourceProviders = stashesList.map((s) => ({
|
|
48
|
+
const sourceProviders = configuredSources.map((s) => ({
|
|
43
49
|
type: s.type,
|
|
44
50
|
...(s.name ? { name: s.name } : {}),
|
|
45
51
|
...(s.path ? { path: s.path } : {}),
|
|
46
52
|
...(s.url ? { url: s.url } : {}),
|
|
47
53
|
...(s.enabled !== undefined ? { enabled: s.enabled } : {}),
|
|
48
54
|
}));
|
|
49
|
-
// Index stats —
|
|
50
|
-
//
|
|
51
|
-
//
|
|
55
|
+
// Index stats — `options.dbPath` is a test-only override (see the param
|
|
56
|
+
// doc above); real callers fall through to the same `getDbPath()` that
|
|
57
|
+
// health and search use, so info reads the same database they do.
|
|
52
58
|
const resolvedDbPath = options?.dbPath ?? getDbPath();
|
|
53
59
|
const indexStats = readIndexStats(resolvedDbPath);
|
|
54
60
|
return {
|
|
55
61
|
schemaVersion: 1,
|
|
56
62
|
version: pkgVersion,
|
|
63
|
+
bundleDir: stashDir,
|
|
64
|
+
defaultBundle,
|
|
57
65
|
assetTypes,
|
|
58
66
|
searchModes,
|
|
59
67
|
semanticSearch: {
|
|
@@ -70,6 +78,7 @@ export function assembleInfo(options) {
|
|
|
70
78
|
function readIndexStats(resolvedPath) {
|
|
71
79
|
const EMPTY = {
|
|
72
80
|
entryCount: 0,
|
|
81
|
+
byType: {},
|
|
73
82
|
lastBuiltAt: null,
|
|
74
83
|
hasEmbeddings: false,
|
|
75
84
|
vecAvailable: false,
|
|
@@ -81,6 +90,7 @@ function readIndexStats(resolvedPath) {
|
|
|
81
90
|
db = openExistingDatabase(resolvedPath);
|
|
82
91
|
return {
|
|
83
92
|
entryCount: getEntryCount(db),
|
|
93
|
+
byType: getEntryCountByType(db),
|
|
84
94
|
lastBuiltAt: getMeta(db, "builtAt") ?? null,
|
|
85
95
|
hasEmbeddings: getMeta(db, "hasEmbeddings") === "1",
|
|
86
96
|
vecAvailable: isVecAvailable(db),
|
|
@@ -89,7 +99,9 @@ function readIndexStats(resolvedPath) {
|
|
|
89
99
|
catch (err) {
|
|
90
100
|
// Surface the error so operators can diagnose mismatches between
|
|
91
101
|
// `akm info` and `akm health` rather than silently returning zeros.
|
|
92
|
-
|
|
102
|
+
// Routed through core/warn's `error()` (not a raw process.stderr.write)
|
|
103
|
+
// so `--quiet`/`setQuiet()` actually gate this line (R-057).
|
|
104
|
+
error(`[akm info] failed to read index stats from ${resolvedPath}: ${String(err)}`);
|
|
93
105
|
return EMPTY;
|
|
94
106
|
}
|
|
95
107
|
finally {
|
|
@@ -10,18 +10,18 @@
|
|
|
10
10
|
import { spawnSync } from "node:child_process";
|
|
11
11
|
import fs from "node:fs";
|
|
12
12
|
import path from "node:path";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { stashDirNames } from "../../core/asset/asset-placement.js";
|
|
14
|
+
import { mutateConfig } from "../../core/config/config.js";
|
|
15
15
|
import { ConfigError } from "../../core/errors.js";
|
|
16
|
-
import { assertSafeStashDir,
|
|
17
|
-
import {
|
|
16
|
+
import { assertSafeStashDir, getConfigPath, getDefaultStashDir } from "../../core/paths.js";
|
|
17
|
+
import { primaryBundlePath, withPrimaryBundle } from "./bundle-config-ops.js";
|
|
18
18
|
import { copyStashSkeleton, ensureStashGitignore, scaffoldStashMeta } from "./stash-skeleton.js";
|
|
19
19
|
/**
|
|
20
20
|
* Refuse to persist a temporary-directory stashDir to the user's config when
|
|
21
21
|
* running under a test runner AND `--dir <tempdir>` was passed explicitly.
|
|
22
22
|
* This guard targets the exact agent-overreach pattern documented in
|
|
23
|
-
* `
|
|
24
|
-
* `akm
|
|
23
|
+
* `memories/akm-init-persists-stashdir-warning`: an agent ran
|
|
24
|
+
* `akm bundle create --dir $(mktemp -d)` for an E2E test and silently rewrote the
|
|
25
25
|
* developer's real config to point at a now-deleted temp dir.
|
|
26
26
|
*
|
|
27
27
|
* Tests that legitimately resolve a tempdir via HOME (default-path init) are
|
|
@@ -31,7 +31,7 @@ import { copyStashSkeleton, ensureStashGitignore, scaffoldStashMeta } from "./st
|
|
|
31
31
|
* - `BUN_TEST=1` — explicit opt-in
|
|
32
32
|
* - `NODE_ENV=test` — what `bun test` sets today
|
|
33
33
|
*
|
|
34
|
-
* Tests that genuinely need to exercise `akm
|
|
34
|
+
* Tests that genuinely need to exercise `akm bundle create --dir /tmp/...` should set
|
|
35
35
|
* `AKM_FORCE_INIT_TMP_STASH=1`.
|
|
36
36
|
*/
|
|
37
37
|
function assertInitSandbox(stashDir, dirExplicitlyProvided) {
|
|
@@ -72,8 +72,8 @@ async function akmInitReal(options) {
|
|
|
72
72
|
const setDefault = options?.setDefault === true;
|
|
73
73
|
const stashDir = options?.dir ? path.resolve(options.dir) : getDefaultStashDir();
|
|
74
74
|
// Safety check (#473): refuse stashDir at /, $HOME, /etc, ~/.config, etc.
|
|
75
|
-
// Runs BEFORE any disk write — a fat-fingered `akm
|
|
76
|
-
// `akm
|
|
75
|
+
// Runs BEFORE any disk write — a fat-fingered `akm bundle create --dir /` or
|
|
76
|
+
// `akm bundle create --dir ~` would otherwise mkdir + git-init the user's system
|
|
77
77
|
// root or home directory. Catastrophic-on-misuse vs. trivial-to-recover-from.
|
|
78
78
|
assertSafeStashDir(stashDir);
|
|
79
79
|
// Defense-in-depth: refuse to persist an explicit --dir /tmp/... stashDir
|
|
@@ -84,7 +84,7 @@ async function akmInitReal(options) {
|
|
|
84
84
|
fs.mkdirSync(stashDir, { recursive: true });
|
|
85
85
|
created = true;
|
|
86
86
|
}
|
|
87
|
-
for (const sub of
|
|
87
|
+
for (const sub of stashDirNames()) {
|
|
88
88
|
const subDir = path.join(stashDir, sub);
|
|
89
89
|
if (!fs.existsSync(subDir)) {
|
|
90
90
|
fs.mkdirSync(subDir, { recursive: true });
|
|
@@ -97,16 +97,16 @@ async function akmInitReal(options) {
|
|
|
97
97
|
// opts into versioning by un-ignoring a path.
|
|
98
98
|
ensureStashGitignore(stashDir);
|
|
99
99
|
// Run seeding UNCONDITIONALLY (not just when the stash was newly created) so
|
|
100
|
-
// re-running `akm
|
|
100
|
+
// re-running `akm bundle create` on an existing stash backfills any missing skeleton
|
|
101
101
|
// files — the README, the per-type SOFT convention templates under
|
|
102
102
|
// facts/conventions/assets/, and the `.meta/index.md` orientation doc. Both
|
|
103
103
|
// helpers are absent-only: they never overwrite a file a user has edited.
|
|
104
104
|
copyStashSkeleton(stashDir);
|
|
105
105
|
scaffoldStashMeta(stashDir);
|
|
106
106
|
// Persist stashDir in config.json — but ONLY when the user is actually
|
|
107
|
-
// setting up / opting into a default. A bare `akm
|
|
107
|
+
// setting up / opting into a default. A bare `akm bundle create --dir <secondary>`
|
|
108
108
|
// must NOT silently repoint the user's real default stash (the footgun
|
|
109
|
-
// documented in
|
|
109
|
+
// documented in memories/akm-init-persists-stashdir-warning).
|
|
110
110
|
//
|
|
111
111
|
// Decision matrix — persist when ANY of:
|
|
112
112
|
// (a) no --dir provided → default HOME-resolved setup flow
|
|
@@ -115,35 +115,25 @@ async function akmInitReal(options) {
|
|
|
115
115
|
// Otherwise (--dir + existing default + no --set-default) leave the default
|
|
116
116
|
// pointer alone; the target dir is still scaffolded above.
|
|
117
117
|
const configPath = getConfigPath();
|
|
118
|
-
|
|
119
|
-
const existingStashDir = existing.stashDir;
|
|
120
|
-
const shouldPersist = !dirExplicitlyProvided || !existingStashDir || setDefault;
|
|
121
|
-
let defaultStashUpdated = false;
|
|
118
|
+
let defaultBundleUpdated = false;
|
|
122
119
|
let previousStashDir;
|
|
123
|
-
if (
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const binDir = getBinDir();
|
|
139
|
-
const rgResult = ensureRg(binDir);
|
|
140
|
-
ripgrep = rgResult;
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
// Non-fatal: ripgrep is optional, search works without it
|
|
144
|
-
}
|
|
120
|
+
if (options?.persistConfig !== false) {
|
|
121
|
+
const result = mutateConfig((latest) => {
|
|
122
|
+
// 0.9.0 (spec §10.1): the primary stash is the `defaultBundle`'s filesystem
|
|
123
|
+
// `path`, not the retired top-level `stashDir`.
|
|
124
|
+
const currentPrimary = primaryBundlePath(latest);
|
|
125
|
+
const shouldPersist = !dirExplicitlyProvided || !currentPrimary || setDefault;
|
|
126
|
+
if (!shouldPersist) {
|
|
127
|
+
previousStashDir = currentPrimary;
|
|
128
|
+
return latest;
|
|
129
|
+
}
|
|
130
|
+
if (currentPrimary === stashDir)
|
|
131
|
+
return latest;
|
|
132
|
+
return withPrimaryBundle(latest, stashDir);
|
|
133
|
+
});
|
|
134
|
+
defaultBundleUpdated = result.written;
|
|
145
135
|
}
|
|
146
|
-
return { stashDir, created, configPath,
|
|
136
|
+
return { bundleDir: stashDir, created, configPath, defaultBundleUpdated, previousBundleDir: previousStashDir };
|
|
147
137
|
}
|
|
148
138
|
/** Initialise `dir` as a git repository if it is not already one. */
|
|
149
139
|
function ensureGitRepo(dir) {
|