akm-cli 0.9.0-rc.8 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -7,6 +7,18 @@
|
|
|
7
7
|
* in an {@link AkmConfig}.
|
|
8
8
|
*/
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { ConfigError } from "../errors.js";
|
|
12
|
+
/** The current one-component-per-bundle configuration entry, if present. */
|
|
13
|
+
export function bundleComponentConfig(bundle) {
|
|
14
|
+
if (!bundle?.components)
|
|
15
|
+
return undefined;
|
|
16
|
+
const components = Object.values(bundle.components);
|
|
17
|
+
if (components.length !== 1) {
|
|
18
|
+
throw new ConfigError("A bundle components map must contain exactly one component.", "INVALID_CONFIG_FILE");
|
|
19
|
+
}
|
|
20
|
+
return components[0];
|
|
21
|
+
}
|
|
10
22
|
/**
|
|
11
23
|
* Convert a `bundles` map (0.9.0 config-shape cutover, spec §10.1 / D-R5) into
|
|
12
24
|
* the ordered {@link SourceConfigEntry} list the transitional runtime source
|
|
@@ -28,7 +40,18 @@ export function primaryBundlePath(config) {
|
|
|
28
40
|
if (!bundles || !key)
|
|
29
41
|
return undefined;
|
|
30
42
|
const entry = bundles[key];
|
|
31
|
-
|
|
43
|
+
if (!entry || typeof entry.path !== "string" || entry.path.length === 0)
|
|
44
|
+
return undefined;
|
|
45
|
+
const componentRoot = bundleComponentConfig(entry)?.root;
|
|
46
|
+
if (!componentRoot || componentRoot === ".")
|
|
47
|
+
return entry.path;
|
|
48
|
+
const bundleRoot = path.resolve(entry.path);
|
|
49
|
+
const resolved = path.resolve(bundleRoot, componentRoot);
|
|
50
|
+
const relative = path.relative(bundleRoot, resolved);
|
|
51
|
+
if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
52
|
+
throw new ConfigError(`Component root "${componentRoot}" escapes bundle "${key}".`, "INVALID_CONFIG_FILE");
|
|
53
|
+
}
|
|
54
|
+
return resolved;
|
|
32
55
|
}
|
|
33
56
|
export function bundlesToSourceEntries(config) {
|
|
34
57
|
const bundles = config.bundles;
|
|
@@ -50,13 +73,14 @@ export function bundleEntryToSourceEntry(key, bundle, isPrimary = false) {
|
|
|
50
73
|
const base = {
|
|
51
74
|
name: key,
|
|
52
75
|
...(bundle.writable !== undefined ? { writable: bundle.writable } : {}),
|
|
76
|
+
...(bundle.enabled !== undefined ? { enabled: bundle.enabled } : {}),
|
|
53
77
|
...(isPrimary ? { primary: true } : {}),
|
|
54
78
|
};
|
|
55
79
|
if (typeof bundle.path === "string" && bundle.path.length > 0) {
|
|
56
80
|
return { type: "filesystem", path: bundle.path, ...base };
|
|
57
81
|
}
|
|
58
82
|
if (typeof bundle.git === "string" && bundle.git.length > 0) {
|
|
59
|
-
return { type: "git", url: bundle.git, ...base };
|
|
83
|
+
return { type: "git", url: normalizeInstalledGitRef("", bundle.git), ...base };
|
|
60
84
|
}
|
|
61
85
|
if (bundle.website && typeof bundle.website.url === "string") {
|
|
62
86
|
// All non-`url` website-descriptor keys (maxPages/refresh/maxDepth + any
|
|
@@ -79,20 +103,21 @@ export function bundleEntryToSourceEntry(key, bundle, isPrimary = false) {
|
|
|
79
103
|
/**
|
|
80
104
|
* Desired 0.9.0 bundle descriptor for a registry-installed source (spec §10.1).
|
|
81
105
|
* Maps the install source kind onto the ONE source descriptor a bundle entry
|
|
82
|
-
* carries: git/github →
|
|
83
|
-
* (local/filesystem) → `{ path: stashRoot }`.
|
|
106
|
+
* carries: git/github → a provider-ready clone URL, npm → `{ npm: ref }`,
|
|
107
|
+
* everything else (local/filesystem) → `{ path: stashRoot }`.
|
|
84
108
|
*
|
|
85
109
|
* CRITICAL (spec §10.2:453): the materialized cache root NEVER appears in the
|
|
86
110
|
* descriptor for a git/npm bundle — the desired config carries only the source
|
|
87
|
-
*
|
|
88
|
-
* lock's `localRoot`. Callers layer
|
|
111
|
+
* descriptor; the install locator stays in `registryId` and the resolved root
|
|
112
|
+
* belongs exclusively in the lock's `localRoot`. Callers layer
|
|
113
|
+
* `registryId`/`writable` onto the result.
|
|
89
114
|
*/
|
|
90
115
|
export function installedSourceDescriptor(source, ref, stashRoot) {
|
|
91
116
|
switch (source) {
|
|
92
117
|
case "git":
|
|
93
118
|
case "github":
|
|
94
119
|
if (ref)
|
|
95
|
-
return { git: ref };
|
|
120
|
+
return { git: normalizeInstalledGitRef(source, ref) };
|
|
96
121
|
break;
|
|
97
122
|
case "npm":
|
|
98
123
|
if (ref)
|
|
@@ -105,6 +130,19 @@ export function installedSourceDescriptor(source, ref, stashRoot) {
|
|
|
105
130
|
// cache to re-materialize), so the resolved root IS the desired path.
|
|
106
131
|
return { path: stashRoot };
|
|
107
132
|
}
|
|
133
|
+
function normalizeInstalledGitRef(source, ref) {
|
|
134
|
+
if (ref.startsWith("git+"))
|
|
135
|
+
return ref.slice(4);
|
|
136
|
+
const isGithubShorthand = ref.startsWith("github:") || (source === "github" && /^[^/:#]+\/[^/#]+(?:#.+)?$/.test(ref));
|
|
137
|
+
if (!isGithubShorthand)
|
|
138
|
+
return ref;
|
|
139
|
+
const body = ref.startsWith("github:") ? ref.slice("github:".length) : ref;
|
|
140
|
+
const fragmentAt = body.indexOf("#");
|
|
141
|
+
const repository = fragmentAt >= 0 ? body.slice(0, fragmentAt) : body;
|
|
142
|
+
const requestedRef = fragmentAt >= 0 ? body.slice(fragmentAt + 1) : "";
|
|
143
|
+
const cloneUrl = `https://github.com/${repository.replace(/\.git$/i, "")}`;
|
|
144
|
+
return requestedRef ? `${cloneUrl}/tree/${requestedRef}` : cloneUrl;
|
|
145
|
+
}
|
|
108
146
|
/**
|
|
109
147
|
* Synthesize a stable identifier when a {@link SourceConfigEntry} omits its
|
|
110
148
|
* `name`. Uses a short hash of the discriminating fields so two equivalent
|
|
@@ -144,8 +182,7 @@ export function parseSourceSpec(entry) {
|
|
|
144
182
|
case "npm":
|
|
145
183
|
return entry.path ? { type: "npm", package: entry.path } : undefined;
|
|
146
184
|
default:
|
|
147
|
-
|
|
148
|
-
return entry.path ? { type: "filesystem", path: entry.path } : undefined;
|
|
185
|
+
return undefined;
|
|
149
186
|
}
|
|
150
187
|
}
|
|
151
188
|
/**
|
|
@@ -166,8 +203,15 @@ export function resolveConfiguredSources(config) {
|
|
|
166
203
|
const out = [];
|
|
167
204
|
for (const persisted of bundleEntries) {
|
|
168
205
|
const runtime = toConfiguredSource(persisted, persisted.primary === true);
|
|
169
|
-
if (runtime)
|
|
170
|
-
|
|
206
|
+
if (runtime) {
|
|
207
|
+
const component = bundleComponentConfig(config.bundles?.[persisted.name ?? ""]);
|
|
208
|
+
out.push({
|
|
209
|
+
...runtime,
|
|
210
|
+
...(component?.adapter ? { adapterId: component.adapter } : {}),
|
|
211
|
+
...(component?.root ? { componentRoot: component.root } : {}),
|
|
212
|
+
...(component?.writable !== undefined ? { writable: component.writable } : {}),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
171
215
|
}
|
|
172
216
|
return out;
|
|
173
217
|
}
|
|
@@ -211,15 +211,14 @@ export function configSet(config, dotted, raw) {
|
|
|
211
211
|
return undefined;
|
|
212
212
|
}, config);
|
|
213
213
|
const next = setPath(config, path, isPlainObject(existing) && isPlainObject(parsed.data) ? deepMergeConfig(existing, parsed.data) : parsed.data);
|
|
214
|
-
// Targeted invariant: defaultWriteTarget must point at a configured
|
|
214
|
+
// Targeted invariant: defaultWriteTarget must point at a configured bundle
|
|
215
215
|
// (#464.a). Whole-config validation happens at save time; this check fires
|
|
216
|
-
// at set time so the user sees the typo immediately.
|
|
217
|
-
// accepted here (legacy behaviour) — saveConfig will reject if it persists.
|
|
216
|
+
// at set time so the user sees the typo immediately.
|
|
218
217
|
if (dotted === "defaultWriteTarget" && typeof value === "string") {
|
|
219
|
-
const
|
|
220
|
-
const knownNames =
|
|
221
|
-
if (
|
|
222
|
-
throw new UsageError(`Unknown
|
|
218
|
+
const bundles = next.bundles && typeof next.bundles === "object" ? next.bundles : {};
|
|
219
|
+
const knownNames = Object.keys(bundles);
|
|
220
|
+
if (!knownNames.includes(value)) {
|
|
221
|
+
throw new UsageError(`Unknown bundle "${value}" for defaultWriteTarget; configured bundles: ${knownNames.map((n) => `"${n}"`).join(", ") || "none"}.`, "INVALID_FLAG_VALUE");
|
|
223
222
|
}
|
|
224
223
|
}
|
|
225
224
|
return next;
|
|
@@ -404,7 +403,24 @@ function unsetPath(config, path) {
|
|
|
404
403
|
return next;
|
|
405
404
|
}
|
|
406
405
|
// ── Hint generation (#460) ──────────────────────────────────────────────────
|
|
407
|
-
|
|
406
|
+
/**
|
|
407
|
+
* Per-key "use X instead" guidance for config keys retired before the 0.9
|
|
408
|
+
* cutover, keyed on the first dotted-path segment. Mitigation item 3: the
|
|
409
|
+
* generic "valid top-level keys" hint doesn't tell a pre-0.9 user what
|
|
410
|
+
* replaced the key they typed — this does.
|
|
411
|
+
*/
|
|
412
|
+
const RETIRED_KEY_HINTS = {
|
|
413
|
+
stashDir: "stashDir was removed in 0.9; get the stash path from `akm config path --all` or `akm info`.",
|
|
414
|
+
sources: "sources was replaced by bundles in 0.9; run `akm-migrate apply` on a pre-0.9 config to convert it.",
|
|
415
|
+
installed: "installed was replaced by bundles in 0.9; run `akm-migrate apply` on a pre-0.9 config to convert it.",
|
|
416
|
+
wikiName: "the wiki subsystem was removed in 0.9; wikis are ordinary knowledge assets now — see `akm import`.",
|
|
417
|
+
wiki: "the wiki subsystem was removed in 0.9; wikis are ordinary knowledge assets now — see `akm import`.",
|
|
418
|
+
llm: "llm was replaced by named engines configuration in 0.9; configure `engines` instead.",
|
|
419
|
+
};
|
|
420
|
+
export function unknownKeyHint(attempted) {
|
|
408
421
|
const keys = listTopLevelConfigKeys();
|
|
409
|
-
|
|
422
|
+
const generic = `Valid top-level keys: ${keys.join(", ")}. Use dotted paths for nested values (e.g. embedding.endpoint, engines.<name>.model).`;
|
|
423
|
+
const firstSegment = attempted.split(".")[0] ?? "";
|
|
424
|
+
const retiredHint = RETIRED_KEY_HINTS[firstSegment];
|
|
425
|
+
return retiredHint ? `${retiredHint} ${generic}` : generic;
|
|
410
426
|
}
|
|
@@ -58,7 +58,7 @@ export function resolveBatchSize(configured, contextLength) {
|
|
|
58
58
|
// ── Defaults ────────────────────────────────────────────────────────────────
|
|
59
59
|
export const DEFAULT_CONFIG = {
|
|
60
60
|
configVersion: "0.9.0",
|
|
61
|
-
semanticSearchMode: "
|
|
61
|
+
semanticSearchMode: "off",
|
|
62
62
|
registries: [
|
|
63
63
|
{ url: "https://raw.githubusercontent.com/itlackey/akm-registry/main/index.json", name: "akm-registry" },
|
|
64
64
|
{ url: "https://skills.sh", name: "skills.sh", provider: "skills-sh", enabled: false },
|
|
@@ -69,7 +69,6 @@ export const DEFAULT_CONFIG = {
|
|
|
69
69
|
},
|
|
70
70
|
};
|
|
71
71
|
// ── Load / Save / Update ────────────────────────────────────────────────────
|
|
72
|
-
const PROJECT_CONFIG_RELATIVE_PATH = path.join(".akm", "config.json");
|
|
73
72
|
let cachedConfig;
|
|
74
73
|
export function resetConfigCache() {
|
|
75
74
|
cachedConfig = undefined;
|
|
@@ -129,9 +128,8 @@ export function loadUserConfig() {
|
|
|
129
128
|
* Parse raw config text and validate via Zod.
|
|
130
129
|
* ({@link AkmConfigSchema}). Returns the merged-with-defaults AkmConfig.
|
|
131
130
|
*
|
|
132
|
-
* The
|
|
133
|
-
*
|
|
134
|
-
* the canonical shape and throws on anything it doesn't recognise.
|
|
131
|
+
* The schema accepts only the current config version and validates the
|
|
132
|
+
* canonical shape before defaults are merged.
|
|
135
133
|
*/
|
|
136
134
|
export function parseAndValidateConfigText(text, sourcePath) {
|
|
137
135
|
const raw = parseConfigText(text, sourcePath);
|
|
@@ -175,10 +173,6 @@ export function getImproveProcessConfig(processName, selected) {
|
|
|
175
173
|
return selected?.processes?.[processName];
|
|
176
174
|
}
|
|
177
175
|
export function loadConfig() {
|
|
178
|
-
// Single-layer load: only the user-level config file is read. Project-level
|
|
179
|
-
// .akm/config.json files discovered under cwd-ancestors emit a one-time
|
|
180
|
-
// deprecation warning (#457) but are NOT merged.
|
|
181
|
-
warnIfProjectConfigPresent(process.cwd());
|
|
182
176
|
return loadUserConfig();
|
|
183
177
|
}
|
|
184
178
|
export function saveConfig(config) {
|
|
@@ -265,7 +259,7 @@ export async function mutateConfigWithPrecommit(mutate, precommit) {
|
|
|
265
259
|
/**
|
|
266
260
|
* Strip literal apiKey fields before writing config to disk.
|
|
267
261
|
* API keys are expected to come from environment variables
|
|
268
|
-
* (AKM_EMBED_API_KEY, AKM_LLM_API_KEY,
|
|
262
|
+
* (AKM_EMBED_API_KEY, AKM_LLM_API_KEY, AKM_ENGINE_<NAME>_API_KEY).
|
|
269
263
|
*
|
|
270
264
|
* `${VAR}` / `$VAR` references are preserved — they are not secrets, they
|
|
271
265
|
* are deferred lookups resolved at consumption by `resolveSecret`. Dropping
|
|
@@ -350,15 +344,14 @@ export function resolveSecret(value) {
|
|
|
350
344
|
/**
|
|
351
345
|
* Read a per-pass {@link IndexPassConfig} entry from {@link IndexConfig},
|
|
352
346
|
* filtering out the reserved feature-section keys so callers don't mistake
|
|
353
|
-
* `metadataEnhance`
|
|
347
|
+
* `metadataEnhance` for a pass.
|
|
354
348
|
*/
|
|
355
349
|
/**
|
|
356
350
|
* Reserved well-known keys on IndexConfig that are NOT per-pass entries.
|
|
357
|
-
* `
|
|
358
|
-
*
|
|
359
|
-
* (stash-conventions SPEC-8) is a boolean feature flag, not a pass section.
|
|
351
|
+
* `indexBodyOpening` (stash-conventions SPEC-8) is a boolean feature flag, not
|
|
352
|
+
* a pass section.
|
|
360
353
|
*/
|
|
361
|
-
const INDEX_RESERVED_KEYS = new Set(["metadataEnhance", "
|
|
354
|
+
const INDEX_RESERVED_KEYS = new Set(["metadataEnhance", "indexBodyOpening"]);
|
|
362
355
|
export function getIndexPassConfig(config, passName) {
|
|
363
356
|
if (!config)
|
|
364
357
|
return undefined;
|
|
@@ -370,42 +363,10 @@ export function getIndexPassConfig(config, passName) {
|
|
|
370
363
|
return entry;
|
|
371
364
|
}
|
|
372
365
|
// Re-export source runtime helpers — implementation lives in config-sources.ts.
|
|
373
|
-
export { bundleEntryToSourceEntry, bundlesToSourceEntries, installedSourceDescriptor, parseSourceSpec, primaryBundlePath, resolveConfiguredSources, } from "./config-sources.js";
|
|
366
|
+
export { bundleComponentConfig, bundleEntryToSourceEntry, bundlesToSourceEntries, installedSourceDescriptor, parseSourceSpec, primaryBundlePath, resolveConfiguredSources, } from "./config-sources.js";
|
|
374
367
|
/**
|
|
375
368
|
* Merge a partial user-config override onto a base config. Used by
|
|
376
369
|
* {@link loadUserConfig} (DEFAULT_CONFIG + on-disk) and {@link updateConfig}
|
|
377
370
|
* (current config + partial patch). Sub-objects with named records (profiles,
|
|
378
371
|
* defaults, etc.) shallow-merge; arrays override wholesale.
|
|
379
372
|
*/
|
|
380
|
-
/**
|
|
381
|
-
* Walk cwd-ancestors looking for `.akm/config.json`. If one is found, emit a
|
|
382
|
-
* one-time deprecation warning per path. The file's contents are NOT read —
|
|
383
|
-
* multi-layer project config was removed in this release; the warning stays
|
|
384
|
-
* for one cycle so users notice they have a now-dead file on disk and can
|
|
385
|
-
* migrate its settings to the user-level config.
|
|
386
|
-
*/
|
|
387
|
-
const PROJECT_CONFIG_DEPRECATION_WARNED = new Set();
|
|
388
|
-
function warnIfProjectConfigPresent(startDir) {
|
|
389
|
-
let currentDir = path.resolve(startDir);
|
|
390
|
-
while (true) {
|
|
391
|
-
const configPath = path.join(currentDir, PROJECT_CONFIG_RELATIVE_PATH);
|
|
392
|
-
if (isFile(configPath) && !PROJECT_CONFIG_DEPRECATION_WARNED.has(configPath)) {
|
|
393
|
-
PROJECT_CONFIG_DEPRECATION_WARNED.add(configPath);
|
|
394
|
-
warn(`[akm] DEPRECATED: project-level config file found at ${configPath}. ` +
|
|
395
|
-
"Project-level config files are no longer merged (removed after 0.8.x deprecation). " +
|
|
396
|
-
"Move any needed settings to ~/.config/akm/config.json; this file is ignored.");
|
|
397
|
-
}
|
|
398
|
-
const parentDir = path.dirname(currentDir);
|
|
399
|
-
if (parentDir === currentDir)
|
|
400
|
-
break;
|
|
401
|
-
currentDir = parentDir;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
function isFile(filePath) {
|
|
405
|
-
try {
|
|
406
|
-
return fs.statSync(filePath).isFile();
|
|
407
|
-
}
|
|
408
|
-
catch {
|
|
409
|
-
return false;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
* True only when the user has explicitly opted into autonomous `akm improve`
|
|
6
|
+
* mutation.
|
|
7
|
+
*
|
|
8
|
+
* Accepts a partial config so callers holding a plain object (tests, the
|
|
9
|
+
* strategy resolver) do not need a fully-parsed one.
|
|
10
|
+
*/
|
|
11
|
+
export function isImproveAutonomyEnabled(config) {
|
|
12
|
+
return config?.experimental?.improveAutonomy === true;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The config key an operator sets to enable a gated lane.
|
|
16
|
+
*
|
|
17
|
+
* Named rather than inlined because it is user-facing text: it goes into the
|
|
18
|
+
* `improve_skipped` event metadata, the `akm task doctor` output, and the
|
|
19
|
+
* health advisory, and those three must name the same key as the schema.
|
|
20
|
+
*/
|
|
21
|
+
export const IMPROVE_AUTONOMY_CONFIG_KEY = "experimental.improveAutonomy";
|
|
@@ -27,7 +27,11 @@ export const EmbeddingConnectionConfigSchema = z
|
|
|
27
27
|
endpoint: z.string().optional(),
|
|
28
28
|
model: z.string().optional(),
|
|
29
29
|
apiKey: z.string().regex(ENV_REFERENCE_PATTERN, `apiKey must be $VAR or \${VAR}`).optional(),
|
|
30
|
-
|
|
30
|
+
// Bounded to the index schema's own vec-table guard (1–4096,
|
|
31
|
+
// storage/repositories/index-schema.ts) so an out-of-range dimension
|
|
32
|
+
// fails at config validation with a clear message instead of crashing
|
|
33
|
+
// `akm index` when ensureSchema rejects it (§24.2 "Semantic" gate).
|
|
34
|
+
dimension: positiveInt.max(4096).optional(),
|
|
31
35
|
localModel: z.string().min(1).optional(),
|
|
32
36
|
maxTokens: positiveInt.optional(),
|
|
33
37
|
batchSize: positiveInt.optional(),
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
* `experimental` config section — explicit opt-ins for behaviour that is not
|
|
6
|
+
* covered by the stability contract (D8).
|
|
7
|
+
*
|
|
8
|
+
* An entry here exists so a user can turn something ON deliberately. Every key
|
|
9
|
+
* defaults to OFF, and the runtime must treat "absent" and "false" identically:
|
|
10
|
+
* autonomy is never inferred from a partially-written config.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
export const ExperimentalConfigSchema = z
|
|
14
|
+
.object({
|
|
15
|
+
/**
|
|
16
|
+
* Allow `akm improve` to mutate assets without review.
|
|
17
|
+
*
|
|
18
|
+
* OFF by default. Gates memory-cleanup, memory-inference writes, and triage
|
|
19
|
+
* `applyMode: "promote"`. Consolidation stays enabled because destructive
|
|
20
|
+
* operations are advisory and promotion emits a reviewable proposal.
|
|
21
|
+
* `akm improve` itself stays on either way — what this gates is autonomy,
|
|
22
|
+
* not the feature.
|
|
23
|
+
*
|
|
24
|
+
* `sync.push` is deliberately NOT gated by this key: it publishes
|
|
25
|
+
* already-committed content to a remote the user configured for that
|
|
26
|
+
* purpose, and it has its own `sync.push: false` / `--no-push` controls.
|
|
27
|
+
*/
|
|
28
|
+
improveAutonomy: z.boolean().optional(),
|
|
29
|
+
})
|
|
30
|
+
.passthrough();
|
|
@@ -377,12 +377,6 @@ export const ImproveProfileConfigSchema = z
|
|
|
377
377
|
description: z.string().min(1).optional(),
|
|
378
378
|
processes: ImproveProfileProcessesSchema.optional(),
|
|
379
379
|
limit: positiveInt.optional(),
|
|
380
|
-
// #614 — symmetric valence weighting in the eligibility sort. When true,
|
|
381
|
-
// the attention term becomes |valence| MAGNITUDE so BOTH strong positive
|
|
382
|
-
// and strong negative feedback drive attention (utility stays dominant) and
|
|
383
|
-
// strong-signed assets are routed to a fix/reinforce lane. DEFAULT OFF —
|
|
384
|
-
// false/absent preserves the legacy negative-only ranking byte-for-byte.
|
|
385
|
-
symmetricValence: z.boolean().optional(),
|
|
386
380
|
sync: z
|
|
387
381
|
.object({
|
|
388
382
|
enabled: z.boolean().optional(),
|
|
@@ -42,10 +42,13 @@ const ImproveSalienceSchema = z
|
|
|
42
42
|
replayBudget: z.number().int().min(0).optional(),
|
|
43
43
|
})
|
|
44
44
|
.passthrough();
|
|
45
|
-
// R5 — longitudinal collapse
|
|
45
|
+
// R5 — longitudinal collapse detector (observe-only; deterministic,
|
|
46
46
|
// fail-open, runs only on cycles where consolidate did work).
|
|
47
47
|
// Default ON; opt out via `improve.collapseDetector.enabled: false`.
|
|
48
48
|
// See docs/architecture/specs/improve-collapse-churn-detector-design.md.
|
|
49
|
+
// The design's CHURN alert class was removed (never fired in production —
|
|
50
|
+
// its accepted-change-volume input was always a hardcoded 0), so this schema
|
|
51
|
+
// no longer carries `churnMinAcceptedActions`.
|
|
49
52
|
const ImproveCollapseDetectorSchema = z
|
|
50
53
|
.object({
|
|
51
54
|
enabled: z.boolean().optional(),
|
|
@@ -59,12 +62,26 @@ const ImproveCollapseDetectorSchema = z
|
|
|
59
62
|
recallDropThreshold: z.number().min(0).max(1).optional(),
|
|
60
63
|
// distinct-content-ratio decline over the window that fires collapse (default 0.05).
|
|
61
64
|
entropyDropThreshold: z.number().min(0).max(1).optional(),
|
|
62
|
-
// Accepted-action volume over the window below which churn never fires (default 25).
|
|
63
|
-
churnMinAcceptedActions: z.number().int().min(1).optional(),
|
|
64
65
|
// improve_cycle_metrics retention (default 365 days, owner-approved).
|
|
65
66
|
retentionDays: z.number().int().min(1).optional(),
|
|
66
67
|
})
|
|
67
68
|
.passthrough();
|
|
69
|
+
// #733 — orphan-GC pass (Workstream C, lean by design: one config gate).
|
|
70
|
+
// The pass ALWAYS runs and ALWAYS reports counts (via the `asset_state_gc`
|
|
71
|
+
// event); this gate controls ONLY whether it actually deletes rows whose
|
|
72
|
+
// `missing_since` has been past the grace window (`STATE_GC_GRACE_MS`, 7
|
|
73
|
+
// days — a named constant, not configurable) for longer than that window.
|
|
74
|
+
const ImproveStateGcSchema = z
|
|
75
|
+
.object({
|
|
76
|
+
/**
|
|
77
|
+
* Actually DELETE `asset_salience` / `asset_outcome` rows once they have
|
|
78
|
+
* been unresolvable for longer than the grace window. Default false for
|
|
79
|
+
* 0.9.0: live data (the event's `pending` counts) proves the report
|
|
80
|
+
* clean before deletion is turned on.
|
|
81
|
+
*/
|
|
82
|
+
collect: z.boolean().optional(),
|
|
83
|
+
})
|
|
84
|
+
.passthrough();
|
|
68
85
|
export const ImproveConfigSchema = z
|
|
69
86
|
.object({
|
|
70
87
|
strategies: z.record(engineName, ImproveProfileConfigSchema).optional(),
|
|
@@ -72,5 +89,6 @@ export const ImproveConfigSchema = z
|
|
|
72
89
|
eventRetentionDays: nonNegativeNumber.optional(),
|
|
73
90
|
salience: ImproveSalienceSchema.optional(),
|
|
74
91
|
collapseDetector: ImproveCollapseDetectorSchema.optional(),
|
|
92
|
+
stateGc: ImproveStateGcSchema.optional(),
|
|
75
93
|
})
|
|
76
94
|
.passthrough();
|
|
@@ -87,19 +87,6 @@ export const IndexPassConfigSchema = z.preprocess((raw, ctx) => {
|
|
|
87
87
|
})
|
|
88
88
|
.passthrough());
|
|
89
89
|
const MetadataEnhanceSchema = z.object({ enabled: z.boolean().optional() }).passthrough();
|
|
90
|
-
/**
|
|
91
|
-
* RETIRED (meta-review 10-Q3): the staleness-detect pass was deleted; nothing
|
|
92
|
-
* reads this section anymore. The key stays TOLERATED here so configs that
|
|
93
|
-
* still carry `index.stalenessDetection` (written by 0.8.x migrations) do not
|
|
94
|
-
* fail validation — deleting the key would route it into the per-pass
|
|
95
|
-
* catchall, which rejects its `enabled`/`thresholdDays` fields.
|
|
96
|
-
*/
|
|
97
|
-
const StalenessDetectionSchema = z
|
|
98
|
-
.object({
|
|
99
|
-
enabled: z.boolean().optional(),
|
|
100
|
-
thresholdDays: positiveInt.optional(),
|
|
101
|
-
})
|
|
102
|
-
.passthrough();
|
|
103
90
|
const IndexDefaultsSchema = z
|
|
104
91
|
.object({
|
|
105
92
|
engine: engineName.optional(),
|
|
@@ -142,6 +129,13 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
|
|
|
142
129
|
if (typeof raw !== "object")
|
|
143
130
|
return raw;
|
|
144
131
|
for (const [passName, value] of Object.entries(raw)) {
|
|
132
|
+
if (passName === "stalenessDetection") {
|
|
133
|
+
ctx.addIssue({
|
|
134
|
+
code: z.ZodIssueCode.custom,
|
|
135
|
+
message: "Invalid `index.stalenessDetection`: the removed pass is not supported.",
|
|
136
|
+
});
|
|
137
|
+
return raw;
|
|
138
|
+
}
|
|
145
139
|
if (passName === "indexBodyOpening") {
|
|
146
140
|
if (typeof value !== "boolean") {
|
|
147
141
|
ctx.addIssue({
|
|
@@ -166,7 +160,6 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
|
|
|
166
160
|
.object({
|
|
167
161
|
defaults: IndexDefaultsSchema.optional(),
|
|
168
162
|
metadataEnhance: MetadataEnhanceSchema.optional(),
|
|
169
|
-
stalenessDetection: StalenessDetectionSchema.optional(),
|
|
170
163
|
indexBodyOpening: z
|
|
171
164
|
.boolean()
|
|
172
165
|
.optional()
|
|
@@ -174,7 +167,7 @@ const IndexConfigRuntimeSchema = z.preprocess((raw, ctx) => {
|
|
|
174
167
|
"lowest-weight `content` search column and the embedding text (default false). Secret/env files " +
|
|
175
168
|
"and session-kind memories are never captured. Toggling the flag changes indexed text: run " +
|
|
176
169
|
"`akm index --full` afterwards to re-extract every entry and regenerate embeddings, and re-mint " +
|
|
177
|
-
"collapse-detector canary baselines via `
|
|
170
|
+
"collapse-detector canary baselines via `bun scripts/refresh-canary-set.ts --refresh`."),
|
|
178
171
|
})
|
|
179
172
|
.catchall(IndexPassConfigSchema));
|
|
180
173
|
// The runtime catchall correctly validates arbitrary pass objects, but its
|
|
@@ -9,7 +9,10 @@ import { z } from "zod";
|
|
|
9
9
|
// ── Output ──────────────────────────────────────────────────────────────────
|
|
10
10
|
export const OutputConfigSchema = z
|
|
11
11
|
.object({
|
|
12
|
-
format
|
|
12
|
+
// D7 — every `--format` value is a valid default, not just the three that
|
|
13
|
+
// predated universal md/html rendering. Kept in step with OUTPUT_FORMATS
|
|
14
|
+
// (`src/output/context.ts`).
|
|
15
|
+
format: z.enum(["json", "yaml", "text", "jsonl", "md", "html"]).optional(),
|
|
13
16
|
detail: z.enum(["brief", "normal", "full"]).optional(),
|
|
14
17
|
})
|
|
15
18
|
.passthrough();
|
|
@@ -7,21 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
// ── Setup-derived recommendations ──────────────────────────────────────────
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
improve: z.string().min(1).optional(),
|
|
20
|
-
index: z.string().min(1).optional(),
|
|
21
|
-
})
|
|
22
|
-
.passthrough();
|
|
23
|
-
export const SetupConfigSchema = z
|
|
24
|
-
.object({
|
|
25
|
-
taskSchedules: SetupTaskSchedulesSchema.optional(),
|
|
26
|
-
})
|
|
27
|
-
.passthrough();
|
|
10
|
+
//
|
|
11
|
+
// R-063 #11: this object previously carried a `taskSchedules` sub-key (cron
|
|
12
|
+
// hints nominally derived by `akm setup --reset-recommended`), but nothing in
|
|
13
|
+
// the tasks subsystem or setup flow ever read or wrote it — confirmed dead at
|
|
14
|
+
// HEAD (deriveRecommendedConfig's return type never included it either; see
|
|
15
|
+
// tests/integration/setup/detect-environment.test.ts's regression guard).
|
|
16
|
+
// Removed. The `setup` namespace itself is kept (passthrough) for future
|
|
17
|
+
// setup-derived config.
|
|
18
|
+
export const SetupConfigSchema = z.object({}).passthrough();
|
|
@@ -10,16 +10,7 @@ import { z } from "zod";
|
|
|
10
10
|
import { isBundleSlug } from "../../asset/asset-ref.js";
|
|
11
11
|
import { httpUrl, nonEmptyString, positiveInt } from "./primitives.js";
|
|
12
12
|
// ── Sources / registries / installed ────────────────────────────────────────
|
|
13
|
-
const SourceConfigEntryOptionsSchema = z
|
|
14
|
-
.object({
|
|
15
|
-
/**
|
|
16
|
-
* @deprecated 0.9.0 (issue #507). Retired per-asset push-on-commit. Kept so
|
|
17
|
-
* old configs still parse; its intent maps onto the batch push gate and
|
|
18
|
-
* encountering it emits a one-time deprecation warning.
|
|
19
|
-
*/
|
|
20
|
-
pushOnCommit: z.boolean().optional(),
|
|
21
|
-
})
|
|
22
|
-
.passthrough();
|
|
13
|
+
const SourceConfigEntryOptionsSchema = z.record(z.unknown());
|
|
23
14
|
export const SourceConfigEntrySchema = z
|
|
24
15
|
.object({
|
|
25
16
|
type: nonEmptyString,
|
|
@@ -33,6 +24,13 @@ export const SourceConfigEntrySchema = z
|
|
|
33
24
|
})
|
|
34
25
|
.passthrough()
|
|
35
26
|
.superRefine((entry, ctx) => {
|
|
27
|
+
if (entry.options && "pushOnCommit" in entry.options) {
|
|
28
|
+
ctx.addIssue({
|
|
29
|
+
code: z.ZodIssueCode.custom,
|
|
30
|
+
path: ["options", "pushOnCommit"],
|
|
31
|
+
message: "options.pushOnCommit is not supported",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
36
34
|
if (!["filesystem", "git", "website", "npm"].includes(entry.type)) {
|
|
37
35
|
ctx.addIssue({
|
|
38
36
|
code: z.ZodIssueCode.custom,
|
|
@@ -58,29 +56,6 @@ export const RegistryConfigEntrySchema = z
|
|
|
58
56
|
options: z.record(z.unknown()).optional(),
|
|
59
57
|
})
|
|
60
58
|
.passthrough();
|
|
61
|
-
const KitSourceSchema = z.enum(["filesystem", "git", "npm", "github", "website", "local"]);
|
|
62
|
-
export const InstalledStashEntrySchema = z
|
|
63
|
-
.object({
|
|
64
|
-
id: nonEmptyString,
|
|
65
|
-
source: KitSourceSchema,
|
|
66
|
-
ref: nonEmptyString,
|
|
67
|
-
artifactUrl: nonEmptyString,
|
|
68
|
-
stashRoot: nonEmptyString,
|
|
69
|
-
cacheDir: nonEmptyString,
|
|
70
|
-
installedAt: nonEmptyString,
|
|
71
|
-
writable: z.boolean().optional(),
|
|
72
|
-
resolvedVersion: z.string().min(1).optional(),
|
|
73
|
-
resolvedRevision: z.string().min(1).optional(),
|
|
74
|
-
})
|
|
75
|
-
.passthrough()
|
|
76
|
-
.superRefine((entry, ctx) => {
|
|
77
|
-
if (entry.writable === true && entry.source !== "git" && entry.source !== "filesystem") {
|
|
78
|
-
ctx.addIssue({
|
|
79
|
-
code: z.ZodIssueCode.custom,
|
|
80
|
-
message: `writable: true is only supported on filesystem and git sources (got "${entry.source}" on installed entry "${entry.id}").`,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
59
|
// ── Bundles (0.9.0 config-shape cutover, spec §10.1 / D-R5) ─────────────────
|
|
85
60
|
//
|
|
86
61
|
// `bundles` + `defaultBundle` are the 0.9.0 desired-configuration shape that
|
|
@@ -105,6 +80,17 @@ const BundleWebsiteDescriptorSchema = z
|
|
|
105
80
|
refresh: z.string().min(1).optional(),
|
|
106
81
|
maxPages: positiveInt.optional(),
|
|
107
82
|
maxDepth: positiveInt.optional(),
|
|
83
|
+
// Default true: crawl-scoped robots.txt compliance (Disallow/Crawl-delay
|
|
84
|
+
// for the akm/akm-cli product tokens or "*"). See
|
|
85
|
+
// src/sources/snapshot-fetchers/robots.ts. Opt out with `false` to
|
|
86
|
+
// restore pre-P1 behavior exactly (no /robots.txt request at all).
|
|
87
|
+
respectRobots: z.boolean().optional(),
|
|
88
|
+
// Hard wall-clock cap on the whole crawl, in milliseconds. Defaults to
|
|
89
|
+
// 10 minutes. Unlike a between-page check, this aborts work already in
|
|
90
|
+
// flight — including a `Retry-After` sleep, which a server can otherwise
|
|
91
|
+
// make arbitrarily long. Set to 0 to disable the cap entirely for a
|
|
92
|
+
// deliberately long-running crawl.
|
|
93
|
+
crawlTimeoutMs: z.number().int().min(0).optional(),
|
|
108
94
|
})
|
|
109
95
|
.passthrough();
|
|
110
96
|
/** One component of a bundle (spec §10.1). Single-entry, transitional. */
|
|
@@ -123,6 +109,12 @@ export const BundleConfigEntrySchema = z
|
|
|
123
109
|
website: BundleWebsiteDescriptorSchema.optional(),
|
|
124
110
|
npm: z.string().min(1).optional(),
|
|
125
111
|
writable: z.boolean().optional(),
|
|
112
|
+
// Opt a bundle out of indexing, search, refresh, and write targeting
|
|
113
|
+
// without deleting it. Carried over from the pre-cutover `sources[].enabled`
|
|
114
|
+
// flag, which the runtime still honors on the derived source entry
|
|
115
|
+
// (`write-source.ts`, `search-source.ts`); without it here, migrating a
|
|
116
|
+
// disabled source would silently reactivate it.
|
|
117
|
+
enabled: z.boolean().optional(),
|
|
126
118
|
// The original registry install id when the bundle KEY was slug-derived from
|
|
127
119
|
// it (e.g. registryId `github:owner/repo` → key `repo`). Preserved so the
|
|
128
120
|
// source locator survives the config-shape migration (D-R5). Absent when the
|
|
@@ -132,6 +124,14 @@ export const BundleConfigEntrySchema = z
|
|
|
132
124
|
})
|
|
133
125
|
.passthrough()
|
|
134
126
|
.superRefine((entry, ctx) => {
|
|
127
|
+
const options = entry.options;
|
|
128
|
+
if (options && typeof options === "object" && "pushOnCommit" in options) {
|
|
129
|
+
ctx.addIssue({
|
|
130
|
+
code: z.ZodIssueCode.custom,
|
|
131
|
+
path: ["options", "pushOnCommit"],
|
|
132
|
+
message: "options.pushOnCommit is not supported",
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
135
|
const descriptors = ["path", "git", "website", "npm"].filter((k) => entry[k] !== undefined);
|
|
136
136
|
if (descriptors.length === 0) {
|
|
137
137
|
ctx.addIssue({
|
|
@@ -152,6 +152,22 @@ export const BundleConfigEntrySchema = z
|
|
|
152
152
|
message: "writable: true is only supported on path and git bundle sources",
|
|
153
153
|
});
|
|
154
154
|
}
|
|
155
|
+
const componentEntries = entry.components ? Object.entries(entry.components) : [];
|
|
156
|
+
if (entry.components !== undefined && componentEntries.length !== 1) {
|
|
157
|
+
ctx.addIssue({
|
|
158
|
+
code: z.ZodIssueCode.custom,
|
|
159
|
+
path: ["components"],
|
|
160
|
+
message: "a bundle components map must contain exactly one component",
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const componentEntry = componentEntries[0];
|
|
164
|
+
if (componentEntry?.[1].writable === true && (entry.website !== undefined || entry.npm !== undefined)) {
|
|
165
|
+
ctx.addIssue({
|
|
166
|
+
code: z.ZodIssueCode.custom,
|
|
167
|
+
path: ["components", componentEntry[0], "writable"],
|
|
168
|
+
message: "writable: true is only supported on path and git bundle sources",
|
|
169
|
+
});
|
|
170
|
+
}
|
|
155
171
|
});
|
|
156
172
|
/**
|
|
157
173
|
* `bundles` map. Keys are workspace bundle slugs (spec §11.1 / D-R5 charset).
|