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,180 @@
|
|
|
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
|
+
* The `akm-workflow` adapter — akm 0.9.0 format-family work item (#46).
|
|
6
|
+
*
|
|
7
|
+
* A native akm workflow bundle (spec §6/§7). One format now (workflow-format-
|
|
8
|
+
* unification): `.md` files, orchestration graph in frontmatter, per-step
|
|
9
|
+
* prose in the body. Recognition is frontmatter `type: workflow`, or — since
|
|
10
|
+
* this adapter's whole domain IS workflows — simply residing under this
|
|
11
|
+
* bundle's root; no content sniffing. conceptId strips the `.md` extension. A
|
|
12
|
+
* plain `.md` that opts out via an explicit non-workflow `type:` frontmatter
|
|
13
|
+
* key is abstained on.
|
|
14
|
+
*
|
|
15
|
+
* ── validate (spec §6 workflow row) ──
|
|
16
|
+
*
|
|
17
|
+
* Reuses the akm adapter's per-type workflow checks (shared base checks +
|
|
18
|
+
* `placeholder-stub` + `invalid-workflow-structure`). Delegates to the SAME
|
|
19
|
+
* `perTypeValidateChecks` / `runBaseValidateChecks` the `akm` adapter uses, so
|
|
20
|
+
* workflow validation has one home.
|
|
21
|
+
*
|
|
22
|
+
* Conformance oracle (authored, DO NOT modify): fixture
|
|
23
|
+
* `tests/fixtures/bundles/akm-workflow/` + goldens
|
|
24
|
+
* `tests/fixtures/format-family-goldens/akm-workflow/{recognition,placement,lint,renderer}.json`.
|
|
25
|
+
*/
|
|
26
|
+
import fs from "node:fs";
|
|
27
|
+
import path from "node:path";
|
|
28
|
+
import { parseFrontmatter } from "../../asset/frontmatter.js";
|
|
29
|
+
import { perTypeValidateChecks } from "./akm-lint.js";
|
|
30
|
+
import { hashContent, nonEmptyString, readTags, runBaseValidateChecks } from "./shared.js";
|
|
31
|
+
/** A native workflow bundle is single-component; its one component is `main`. */
|
|
32
|
+
const COMPONENT_ID = "main";
|
|
33
|
+
/** One recognized workflow extension now (workflow-format-unification): `.md`. */
|
|
34
|
+
const WORKFLOW_EXTS = new Set([".md"]);
|
|
35
|
+
/** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
|
|
36
|
+
const MAX_CONTENT_CHARS = 100_000;
|
|
37
|
+
function toPosix(p) {
|
|
38
|
+
return p.replace(/\\/g, "/");
|
|
39
|
+
}
|
|
40
|
+
/** Strip the recognized workflow extension from a component-root-relative path → conceptId. */
|
|
41
|
+
function conceptIdOf(relPath) {
|
|
42
|
+
return toPosix(relPath).replace(/\.md$/i, "");
|
|
43
|
+
}
|
|
44
|
+
/** `README.md` (case-insensitive) is documentation, never the typed asset — mirrors the akm matcher stack's D-R6 reserved-file exclusion (`TYPED_DIR_DOC_FILES`). */
|
|
45
|
+
function isReservedDocFile(fileName) {
|
|
46
|
+
return fileName.toLowerCase() === "readme.md";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Recognition gate: any `.md` file in this bundle IS a workflow (this
|
|
50
|
+
* adapter's entire domain is workflows — spec §2.5, "residence under
|
|
51
|
+
* workflows/"), UNLESS its frontmatter declares a DIFFERENT non-empty
|
|
52
|
+
* `type:` (an explicit opt-out, e.g. a README-shaped doc that wants to be
|
|
53
|
+
* something else). No content sniffing.
|
|
54
|
+
*/
|
|
55
|
+
function isWorkflowFile(raw) {
|
|
56
|
+
const data = parseFrontmatter(raw).data;
|
|
57
|
+
const type = data.type;
|
|
58
|
+
return type === undefined || type === "workflow";
|
|
59
|
+
}
|
|
60
|
+
function recognize(c, file) {
|
|
61
|
+
if (!WORKFLOW_EXTS.has(file.ext))
|
|
62
|
+
return null;
|
|
63
|
+
if (isReservedDocFile(file.fileName))
|
|
64
|
+
return null;
|
|
65
|
+
const raw = file.content();
|
|
66
|
+
if (!isWorkflowFile(raw))
|
|
67
|
+
return null;
|
|
68
|
+
const conceptId = conceptIdOf(file.relPath);
|
|
69
|
+
const name = conceptId.split("/").pop() ?? conceptId;
|
|
70
|
+
const parsed = parseFrontmatter(raw);
|
|
71
|
+
const description = nonEmptyString(parsed.data.description);
|
|
72
|
+
const body = parsed.content;
|
|
73
|
+
const tags = readTags(parsed.data.tags);
|
|
74
|
+
const doc = {
|
|
75
|
+
ref: `${c.id}//${conceptId}`,
|
|
76
|
+
bundle: c.id,
|
|
77
|
+
component: COMPONENT_ID,
|
|
78
|
+
conceptId,
|
|
79
|
+
path: file.absPath,
|
|
80
|
+
hash: hashContent(raw),
|
|
81
|
+
adapterId: "akm-workflow",
|
|
82
|
+
type: "workflow",
|
|
83
|
+
name,
|
|
84
|
+
content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,
|
|
85
|
+
};
|
|
86
|
+
if (description !== undefined)
|
|
87
|
+
doc.description = description;
|
|
88
|
+
if (tags !== undefined)
|
|
89
|
+
doc.tags = tags;
|
|
90
|
+
return doc;
|
|
91
|
+
}
|
|
92
|
+
async function validate(c, changes, ctx) {
|
|
93
|
+
const diagnostics = [];
|
|
94
|
+
for (const change of changes) {
|
|
95
|
+
if (change.op === "delete")
|
|
96
|
+
continue;
|
|
97
|
+
const raw = change.after ?? (await ctx.readFile(change.path));
|
|
98
|
+
if (typeof raw !== "string")
|
|
99
|
+
continue;
|
|
100
|
+
const ext = path.extname(change.path).toLowerCase();
|
|
101
|
+
if (!WORKFLOW_EXTS.has(ext) || isReservedDocFile(path.basename(change.path)) || !isWorkflowFile(raw))
|
|
102
|
+
continue;
|
|
103
|
+
const relPath = toPosix(change.path);
|
|
104
|
+
const p = parseFrontmatter(raw);
|
|
105
|
+
const parsed = { data: p.data, content: p.content, frontmatter: p.frontmatter };
|
|
106
|
+
diagnostics.push(...(await runBaseValidateChecks(relPath, parsed, c.root, ctx)));
|
|
107
|
+
diagnostics.push(...(await perTypeValidateChecks({
|
|
108
|
+
type: "workflow",
|
|
109
|
+
relPath,
|
|
110
|
+
raw,
|
|
111
|
+
data: parsed.data,
|
|
112
|
+
frontmatter: parsed.frontmatter,
|
|
113
|
+
body: parsed.content,
|
|
114
|
+
ext,
|
|
115
|
+
ctx,
|
|
116
|
+
})));
|
|
117
|
+
}
|
|
118
|
+
return diagnostics;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* True when a top-level file in `root` is workflow-shaped (used by
|
|
122
|
+
* looksLikeRoot). Unlike `isWorkflowFile` (which admits an absent `type:` —
|
|
123
|
+
* the lenient default ONCE a source is already known to be this bundle),
|
|
124
|
+
* this requires an EXPLICIT `type: workflow` — the install-time probe is
|
|
125
|
+
* choosing WHICH adapter owns an unconfigured root among several candidates
|
|
126
|
+
* (spec §1.2), and an incidental `.md` with no frontmatter type at all
|
|
127
|
+
* (common in an OKF or llm-wiki bundle) must not misclassify that root as
|
|
128
|
+
* akm-workflow's.
|
|
129
|
+
*/
|
|
130
|
+
function hasTopLevelWorkflowFile(root, entries) {
|
|
131
|
+
for (const entry of entries) {
|
|
132
|
+
if (!entry.isFile())
|
|
133
|
+
continue;
|
|
134
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
135
|
+
if (!WORKFLOW_EXTS.has(ext) || isReservedDocFile(entry.name))
|
|
136
|
+
continue;
|
|
137
|
+
let raw;
|
|
138
|
+
try {
|
|
139
|
+
raw = fs.readFileSync(path.join(root, entry.name), "utf8");
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (parseFrontmatter(raw).data.type === "workflow")
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
export const akmWorkflowAdapter = {
|
|
150
|
+
id: "akm-workflow",
|
|
151
|
+
version: "0.9.0",
|
|
152
|
+
extensions: [".md"],
|
|
153
|
+
recognize,
|
|
154
|
+
validate,
|
|
155
|
+
/** Markdown placement; an explicit `.md` conceptId short-circuits to that extension. */
|
|
156
|
+
placeNew(c, conceptId) {
|
|
157
|
+
const posix = toPosix(conceptId);
|
|
158
|
+
if (/\.md$/i.test(posix))
|
|
159
|
+
return path.join(c.root, posix);
|
|
160
|
+
return path.join(c.root, `${posix}.md`);
|
|
161
|
+
},
|
|
162
|
+
/** Workflows live anywhere under the component root. */
|
|
163
|
+
directoryList() {
|
|
164
|
+
return ["."];
|
|
165
|
+
},
|
|
166
|
+
/**
|
|
167
|
+
* Install-time probe (§1.2): a root holding a workflow-shaped `.md` file at
|
|
168
|
+
* top level (frontmatter `type: workflow` or no `type:` at all).
|
|
169
|
+
*/
|
|
170
|
+
looksLikeRoot(root) {
|
|
171
|
+
let entries;
|
|
172
|
+
try {
|
|
173
|
+
entries = fs.readdirSync(root, { withFileTypes: true });
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
return hasTopLevelWorkflowFile(root, entries);
|
|
179
|
+
},
|
|
180
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
* The `claude` tool-directory adapter — akm 0.9.0 format-family work item (#46).
|
|
6
|
+
*
|
|
7
|
+
* Recognizes a Claude Code `.claude` layout (spec §6/§7, real-world:
|
|
8
|
+
* https://code.claude.com/docs/en/claude-directory): a root `CLAUDE.md` →
|
|
9
|
+
* `instruction`, `commands/*.md` → `command`, `agents/*.md` → `agent`,
|
|
10
|
+
* `skills/<name>/SKILL.md` → `skill` (item = the dir; bundled resources abstain),
|
|
11
|
+
* and ABSTAINS on runtime config (`settings.json`, `.mcp.json`). The component
|
|
12
|
+
* id is the PROVENANCE `.claude`; the ref prefix is the bundle id (`c.id`).
|
|
13
|
+
*
|
|
14
|
+
* All behavior lives in the shared tool-dir codec ({@link makeToolDirAdapter});
|
|
15
|
+
* this module supplies only the `.claude` layout + the install-time probe.
|
|
16
|
+
*
|
|
17
|
+
* Conformance oracle (authored, DO NOT modify): fixture
|
|
18
|
+
* `tests/fixtures/bundles/claude/` + goldens
|
|
19
|
+
* `tests/fixtures/format-family-goldens/claude/{recognition,placement,lint,renderer}.json`.
|
|
20
|
+
*/
|
|
21
|
+
import fs from "node:fs";
|
|
22
|
+
import path from "node:path";
|
|
23
|
+
import { makeToolDirAdapter } from "./tool-dir-shared.js";
|
|
24
|
+
const LAYOUT = {
|
|
25
|
+
adapterId: "claude",
|
|
26
|
+
componentId: ".claude",
|
|
27
|
+
instructionFile: "CLAUDE.md",
|
|
28
|
+
instructionConceptId: "CLAUDE",
|
|
29
|
+
commandDirs: new Set(["commands"]),
|
|
30
|
+
agentDirs: new Set(["agents"]),
|
|
31
|
+
skillDirs: new Set(["skills"]),
|
|
32
|
+
};
|
|
33
|
+
/** True when `root` carries a directory. */
|
|
34
|
+
function dirExists(p) {
|
|
35
|
+
try {
|
|
36
|
+
return fs.statSync(p).isDirectory();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Install-time probe (§1.2): a root is a `.claude` tool dir when it carries a
|
|
44
|
+
* root `CLAUDE.md` AND at least one of the `commands/`/`agents/`/`skills/` tool
|
|
45
|
+
* dirs. The tool-dir requirement keeps a bare project `CLAUDE.md` (no `.claude`
|
|
46
|
+
* structure) from being mistaken for a claude bundle, and — because it demands
|
|
47
|
+
* `CLAUDE.md`, which an akm workspace / okf / wiki root never carries — the
|
|
48
|
+
* probe is registered AHEAD of `akm` so a `.claude` root (whose `commands/`
|
|
49
|
+
* etc. also look like akm stash subdirs) is claimed by `claude`, not shadowed.
|
|
50
|
+
*/
|
|
51
|
+
function claudeLooksLikeRoot(root) {
|
|
52
|
+
try {
|
|
53
|
+
if (!fs.existsSync(path.join(root, "CLAUDE.md")))
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return ["commands", "agents", "skills"].some((d) => dirExists(path.join(root, d)));
|
|
60
|
+
}
|
|
61
|
+
export const claudeAdapter = makeToolDirAdapter(LAYOUT, claudeLooksLikeRoot);
|
|
@@ -0,0 +1,187 @@
|
|
|
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
|
+
* The `dotenv` adapter — akm 0.9.0 format-family work item (#46).
|
|
6
|
+
*
|
|
7
|
+
* A metadata-only env/secret bundle (spec §6/§7, normative §21.2). REDACTION IS
|
|
8
|
+
* A HARD CONTRACT keyed on the ADAPTER, never on the open `type` value (a
|
|
9
|
+
* frontmatter `type:` cannot opt out):
|
|
10
|
+
* - `env/*.env` → `type: env` — only the KEY NAMES are surfaced (on `hints`);
|
|
11
|
+
* VALUES, COMMENTS, and raw CONTENT are NEVER read into the index.
|
|
12
|
+
* - any file under `secrets/` → `type: secret` — only the FILE NAME is
|
|
13
|
+
* surfaced; the whole file is the value and is never read. A `.env` UNDER
|
|
14
|
+
* `secrets/` is a SECRET (the dir gate wins) — name-only, MORE redacted than
|
|
15
|
+
* an `env/` file even though it has KEY=VALUE lines.
|
|
16
|
+
* conceptId: env strips `.env`; secret keeps its natural path (including any
|
|
17
|
+
* extension). Neither branch ever writes a value onto the emitted document.
|
|
18
|
+
*
|
|
19
|
+
* ── validate (spec §6 env/secret validation column) ──
|
|
20
|
+
*
|
|
21
|
+
* The dangerous-key scan (`dangerous-env-key`), reusing the akm adapter's
|
|
22
|
+
* `dangerousEnvKeyDiagnostics` — which preserves the code-grounded narrowness:
|
|
23
|
+
* it runs ONLY on `*.env`-suffixed files, so `secrets/<bare-name>` is never
|
|
24
|
+
* scanned (its whole content is an opaque secret value). Reads KEY NAMES only.
|
|
25
|
+
*
|
|
26
|
+
* Conformance oracle (authored, DO NOT modify): fixture
|
|
27
|
+
* `tests/fixtures/bundles/dotenv/` + goldens
|
|
28
|
+
* `tests/fixtures/format-family-goldens/dotenv/{recognition,placement,lint,renderer}.json`.
|
|
29
|
+
*/
|
|
30
|
+
import fs from "node:fs";
|
|
31
|
+
import path from "node:path";
|
|
32
|
+
import { assetPathForName, typeForStashDir } from "../../asset/asset-placement.js";
|
|
33
|
+
import { dangerousEnvKeyDiagnostics } from "./akm-lint.js";
|
|
34
|
+
import { hashContent } from "./shared.js";
|
|
35
|
+
/** A dotenv bundle is single-component; its one component is `main`. */
|
|
36
|
+
const COMPONENT_ID = "main";
|
|
37
|
+
/** The `env/` content subdir (KEY=VALUE files). */
|
|
38
|
+
const ENV_DIR = "env";
|
|
39
|
+
/** The `secrets/` content subdir (whole-file secrets). */
|
|
40
|
+
const SECRETS_DIR = "secrets";
|
|
41
|
+
/** Non-secret marker suffixes under `secrets/` (spec §6 secret row). */
|
|
42
|
+
const SECRET_SKIP_SUFFIXES = [".lock", ".sensitive"];
|
|
43
|
+
/** Matches a KEY=value assignment line, capturing only the key (mirrors akm-lint scanKeys). */
|
|
44
|
+
const ASSIGN_RE = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/;
|
|
45
|
+
function toPosix(p) {
|
|
46
|
+
return p.replace(/\\/g, "/");
|
|
47
|
+
}
|
|
48
|
+
/** Classify a component-root-relative file as env / secret, or null (abstain). */
|
|
49
|
+
function classify(relPath) {
|
|
50
|
+
const posix = toPosix(relPath);
|
|
51
|
+
const segs = posix.split("/").filter((s) => s.length > 0);
|
|
52
|
+
if (segs.length < 2)
|
|
53
|
+
return null;
|
|
54
|
+
const head = segs[0];
|
|
55
|
+
const base = segs[segs.length - 1];
|
|
56
|
+
if (head === ENV_DIR) {
|
|
57
|
+
return base === ".env" || base.endsWith(".env") ? "env" : null;
|
|
58
|
+
}
|
|
59
|
+
if (head === SECRETS_DIR) {
|
|
60
|
+
return SECRET_SKIP_SUFFIXES.some((s) => base.endsWith(s)) ? null : "secret";
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/** Extract KEY NAMES (never values) from an env file's raw content, first-appearance order, deduped. */
|
|
65
|
+
function scanKeyNames(raw) {
|
|
66
|
+
const keys = [];
|
|
67
|
+
const seen = new Set();
|
|
68
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
69
|
+
const m = line.match(ASSIGN_RE);
|
|
70
|
+
if (!m)
|
|
71
|
+
continue;
|
|
72
|
+
const key = m[1];
|
|
73
|
+
if (seen.has(key))
|
|
74
|
+
continue;
|
|
75
|
+
seen.add(key);
|
|
76
|
+
keys.push(key);
|
|
77
|
+
}
|
|
78
|
+
return keys;
|
|
79
|
+
}
|
|
80
|
+
function recognize(c, file) {
|
|
81
|
+
const type = classify(file.relPath);
|
|
82
|
+
if (type === null)
|
|
83
|
+
return null;
|
|
84
|
+
const posix = toPosix(file.relPath);
|
|
85
|
+
const raw = file.content();
|
|
86
|
+
if (type === "env") {
|
|
87
|
+
// env: strip `.env`; surface KEY NAMES only (never values/comments/content).
|
|
88
|
+
const conceptId = posix.replace(/\.env$/i, "");
|
|
89
|
+
const name = (conceptId.split("/").pop() ?? conceptId) || "default";
|
|
90
|
+
const keys = scanKeyNames(raw);
|
|
91
|
+
const doc = {
|
|
92
|
+
ref: `${c.id}//${conceptId}`,
|
|
93
|
+
bundle: c.id,
|
|
94
|
+
component: COMPONENT_ID,
|
|
95
|
+
conceptId,
|
|
96
|
+
path: file.absPath,
|
|
97
|
+
hash: hashContent(raw),
|
|
98
|
+
adapterId: "dotenv",
|
|
99
|
+
type: "env",
|
|
100
|
+
name,
|
|
101
|
+
};
|
|
102
|
+
if (keys.length > 0)
|
|
103
|
+
doc.hints = keys;
|
|
104
|
+
return doc;
|
|
105
|
+
}
|
|
106
|
+
// secret: keep the natural path; surface the FILE NAME only — never keys/content.
|
|
107
|
+
const name = posix.split("/").pop() ?? posix;
|
|
108
|
+
return {
|
|
109
|
+
ref: `${c.id}//${posix}`,
|
|
110
|
+
bundle: c.id,
|
|
111
|
+
component: COMPONENT_ID,
|
|
112
|
+
conceptId: posix,
|
|
113
|
+
path: file.absPath,
|
|
114
|
+
hash: hashContent(raw),
|
|
115
|
+
adapterId: "dotenv",
|
|
116
|
+
type: "secret",
|
|
117
|
+
name,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async function validate(_c, changes, ctx) {
|
|
121
|
+
const diagnostics = [];
|
|
122
|
+
for (const change of changes) {
|
|
123
|
+
if (change.op === "delete")
|
|
124
|
+
continue;
|
|
125
|
+
const raw = change.after ?? (await ctx.readFile(change.path));
|
|
126
|
+
if (typeof raw !== "string")
|
|
127
|
+
continue;
|
|
128
|
+
const type = classify(change.path);
|
|
129
|
+
if (type === null)
|
|
130
|
+
continue;
|
|
131
|
+
// dangerousEnvKeyDiagnostics is `.env`-suffix-narrow: a bare secret file is never scanned.
|
|
132
|
+
diagnostics.push(...dangerousEnvKeyDiagnostics(type, toPosix(change.path), raw));
|
|
133
|
+
}
|
|
134
|
+
return diagnostics;
|
|
135
|
+
}
|
|
136
|
+
export const dotenvAdapter = {
|
|
137
|
+
id: "dotenv",
|
|
138
|
+
version: "0.9.0",
|
|
139
|
+
extensions: [".env"],
|
|
140
|
+
recognize,
|
|
141
|
+
validate,
|
|
142
|
+
/**
|
|
143
|
+
* env places to `env/<name>.env`, secret to `secrets/<name>` (identity join,
|
|
144
|
+
* no extension logic) — reusing the shared `assetPathForName` so the env
|
|
145
|
+
* default-alias / already-suffixed / nested-secret edge cases match the akm
|
|
146
|
+
* placement convention exactly.
|
|
147
|
+
*/
|
|
148
|
+
placeNew(c, conceptId) {
|
|
149
|
+
const posix = toPosix(conceptId);
|
|
150
|
+
const slash = posix.indexOf("/");
|
|
151
|
+
if (slash > 0) {
|
|
152
|
+
const head = posix.slice(0, slash);
|
|
153
|
+
const rest = posix.slice(slash + 1);
|
|
154
|
+
const type = typeForStashDir(head);
|
|
155
|
+
if ((type === "env" || type === "secret") && rest.length > 0) {
|
|
156
|
+
return assetPathForName(type, path.join(c.root, head), rest);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return path.join(c.root, posix);
|
|
160
|
+
},
|
|
161
|
+
/** The dotenv bundle owns its `env/` + `secrets/` dirs. */
|
|
162
|
+
directoryList() {
|
|
163
|
+
return [ENV_DIR, SECRETS_DIR];
|
|
164
|
+
},
|
|
165
|
+
/**
|
|
166
|
+
* Install-time probe (§1.2): a root whose ONLY content dirs are `env/` and/or
|
|
167
|
+
* `secrets/` (at least one present). The env/secrets-ONLY requirement keeps a
|
|
168
|
+
* full akm workspace — which also carries `env/` + `secrets/` alongside many
|
|
169
|
+
* other stash subdirs — from being mistaken for a dotenv bundle, so the probe
|
|
170
|
+
* is registered ahead of `akm` without shadowing it.
|
|
171
|
+
*/
|
|
172
|
+
looksLikeRoot(root) {
|
|
173
|
+
let entries;
|
|
174
|
+
try {
|
|
175
|
+
entries = fs.readdirSync(root, { withFileTypes: true });
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
181
|
+
if (dirs.length === 0)
|
|
182
|
+
return false;
|
|
183
|
+
if (!dirs.every((d) => d === ENV_DIR || d === SECRETS_DIR))
|
|
184
|
+
return false;
|
|
185
|
+
return dirs.includes(ENV_DIR) || dirs.includes(SECRETS_DIR);
|
|
186
|
+
},
|
|
187
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
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
|
+
* The `generic-files` adapter — akm 0.9.0 format-family work item (#46).
|
|
6
|
+
*
|
|
7
|
+
* The AKM-native FALLBACK family (spec §7). Any leftover file is classified by
|
|
8
|
+
* extension (open-question-5, RESOLVED — maintainer 2026-07):
|
|
9
|
+
* - a SCRIPT_EXTENSIONS extension → `script` (conceptId KEEPS the extension);
|
|
10
|
+
* - markdown / plain-text → `document` (conceptId STRIPS the extension);
|
|
11
|
+
* - everything else → `file` (conceptId keeps the extension).
|
|
12
|
+
* Placement is IDENTITY: `document` appends `.md`, `script`/`file` keep their
|
|
13
|
+
* natural path. D-R6 reserved files (`index.md`/`log.md`) are excluded from the
|
|
14
|
+
* catch-all so a structural listing is never indexed as a `document`.
|
|
15
|
+
*
|
|
16
|
+
* EXPLICIT-CONFIG ONLY: `generic-files` is never in the §1.2 auto-probe order —
|
|
17
|
+
* a user opts in deliberately — so `looksLikeRoot` NEVER fires. It has no
|
|
18
|
+
* type-specific validators (`validate` runs base checks only).
|
|
19
|
+
*
|
|
20
|
+
* Conformance oracle (authored, DO NOT modify): fixture
|
|
21
|
+
* `tests/fixtures/bundles/generic-files/` + goldens
|
|
22
|
+
* `tests/fixtures/format-family-goldens/generic-files/{recognition,placement,lint,renderer}.json`.
|
|
23
|
+
*/
|
|
24
|
+
import path from "node:path";
|
|
25
|
+
import { parseFrontmatter } from "../../asset/frontmatter.js";
|
|
26
|
+
import { SCRIPT_EXTENSIONS } from "../../recognition-util.js";
|
|
27
|
+
import { hashContent, nonEmptyString, readTags, runBaseValidateChecks } from "./shared.js";
|
|
28
|
+
/** A generic-files bundle is single-component; its one component is `main`. */
|
|
29
|
+
const COMPONENT_ID = "main";
|
|
30
|
+
/** Markdown / plain-text extensions classified as `document`. */
|
|
31
|
+
const DOCUMENT_EXTENSIONS = new Set([".md", ".markdown", ".txt", ".text"]);
|
|
32
|
+
/** OKF reserved structural files (D-R6) — excluded from the catch-all, case-insensitive. */
|
|
33
|
+
const RESERVED_FILES = new Set(["index.md", "log.md"]);
|
|
34
|
+
/** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
|
|
35
|
+
const MAX_CONTENT_CHARS = 100_000;
|
|
36
|
+
function toPosix(p) {
|
|
37
|
+
return p.replace(/\\/g, "/");
|
|
38
|
+
}
|
|
39
|
+
function isReserved(base) {
|
|
40
|
+
return RESERVED_FILES.has(base.toLowerCase());
|
|
41
|
+
}
|
|
42
|
+
/** Classify by extension (open-question-5 predicate). */
|
|
43
|
+
function classify(ext) {
|
|
44
|
+
if (SCRIPT_EXTENSIONS.has(ext))
|
|
45
|
+
return "script";
|
|
46
|
+
if (DOCUMENT_EXTENSIONS.has(ext))
|
|
47
|
+
return "document";
|
|
48
|
+
return "file";
|
|
49
|
+
}
|
|
50
|
+
function recognize(c, file) {
|
|
51
|
+
const posix = toPosix(file.relPath);
|
|
52
|
+
const base = posix.split("/").pop() ?? posix;
|
|
53
|
+
if (isReserved(base))
|
|
54
|
+
return null; // D-R6: never index a structural listing
|
|
55
|
+
const type = classify(file.ext);
|
|
56
|
+
// document strips its extension; script/file keep the natural path.
|
|
57
|
+
const conceptId = type === "document" ? posix.replace(/\.[^./]+$/, "") : posix;
|
|
58
|
+
const name = conceptId.split("/").pop() ?? conceptId;
|
|
59
|
+
const raw = file.content();
|
|
60
|
+
const parsed = parseFrontmatter(raw);
|
|
61
|
+
const body = parsed.content;
|
|
62
|
+
const doc = {
|
|
63
|
+
ref: `${c.id}//${conceptId}`,
|
|
64
|
+
bundle: c.id,
|
|
65
|
+
component: COMPONENT_ID,
|
|
66
|
+
conceptId,
|
|
67
|
+
path: file.absPath,
|
|
68
|
+
hash: hashContent(raw),
|
|
69
|
+
adapterId: "generic-files",
|
|
70
|
+
type,
|
|
71
|
+
name,
|
|
72
|
+
content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,
|
|
73
|
+
};
|
|
74
|
+
if (type !== "script")
|
|
75
|
+
doc.ownsPresentation = true;
|
|
76
|
+
const description = nonEmptyString(parsed.data.description);
|
|
77
|
+
if (description !== undefined)
|
|
78
|
+
doc.description = description;
|
|
79
|
+
const tags = readTags(parsed.data.tags);
|
|
80
|
+
if (tags !== undefined)
|
|
81
|
+
doc.tags = tags;
|
|
82
|
+
return doc;
|
|
83
|
+
}
|
|
84
|
+
async function validate(c, changes, ctx) {
|
|
85
|
+
const diagnostics = [];
|
|
86
|
+
for (const change of changes) {
|
|
87
|
+
if (change.op === "delete")
|
|
88
|
+
continue;
|
|
89
|
+
const raw = change.after ?? (await ctx.readFile(change.path));
|
|
90
|
+
if (typeof raw !== "string")
|
|
91
|
+
continue;
|
|
92
|
+
// No type-specific validators — base checks only (spec §6 script/document/file rows).
|
|
93
|
+
diagnostics.push(...(await runBaseValidateChecks(toPosix(change.path), parseFrontmatter(raw), c.root, ctx)));
|
|
94
|
+
}
|
|
95
|
+
return diagnostics;
|
|
96
|
+
}
|
|
97
|
+
export const genericFilesAdapter = {
|
|
98
|
+
id: "generic-files",
|
|
99
|
+
version: "0.9.0",
|
|
100
|
+
// Non-exhaustive HINT: generic-files recognizes ANY file — recognize() is the
|
|
101
|
+
// source of truth (empty extension list would drop the extension-strip hint).
|
|
102
|
+
extensions: [".md", ".txt"],
|
|
103
|
+
recognize,
|
|
104
|
+
validate,
|
|
105
|
+
/**
|
|
106
|
+
* IDENTITY placement (open-question-5): a conceptId that carries an extension
|
|
107
|
+
* (`script`/`file`) places to itself; an extension-less conceptId (a
|
|
108
|
+
* `document`) appends `.md`.
|
|
109
|
+
*/
|
|
110
|
+
placeNew(c, conceptId) {
|
|
111
|
+
const posix = toPosix(conceptId);
|
|
112
|
+
const hasExt = path.extname(posix) !== "";
|
|
113
|
+
return path.join(c.root, hasExt ? posix : `${posix}.md`);
|
|
114
|
+
},
|
|
115
|
+
/** generic-files is EXPLICIT-CONFIG ONLY — never auto-selected (§1.2), so this never fires. */
|
|
116
|
+
looksLikeRoot() {
|
|
117
|
+
return false;
|
|
118
|
+
},
|
|
119
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
import { agentSkillsAdapter } from "./agent-skills-adapter.js";
|
|
5
|
+
import { akmAdapter } from "./akm-adapter.js";
|
|
6
|
+
import { akmTaskAdapter } from "./akm-task-adapter.js";
|
|
7
|
+
import { akmWorkflowAdapter } from "./akm-workflow-adapter.js";
|
|
8
|
+
import { claudeAdapter } from "./claude-adapter.js";
|
|
9
|
+
import { dotenvAdapter } from "./dotenv-adapter.js";
|
|
10
|
+
import { genericFilesAdapter } from "./generic-files-adapter.js";
|
|
11
|
+
import { llmWikiAdapter } from "./llm-wiki-adapter.js";
|
|
12
|
+
import { okfAdapter } from "./okf-adapter.js";
|
|
13
|
+
import { opencodeAdapter } from "./opencode-adapter.js";
|
|
14
|
+
import { websiteSnapshotAdapter } from "./website-snapshot-adapter.js";
|
|
15
|
+
export { agentSkillsAdapter } from "./agent-skills-adapter.js";
|
|
16
|
+
export { akmAdapter } from "./akm-adapter.js";
|
|
17
|
+
export { akmTaskAdapter } from "./akm-task-adapter.js";
|
|
18
|
+
export { akmWorkflowAdapter } from "./akm-workflow-adapter.js";
|
|
19
|
+
export { claudeAdapter } from "./claude-adapter.js";
|
|
20
|
+
export { dotenvAdapter } from "./dotenv-adapter.js";
|
|
21
|
+
export { genericFilesAdapter } from "./generic-files-adapter.js";
|
|
22
|
+
export { llmWikiAdapter } from "./llm-wiki-adapter.js";
|
|
23
|
+
export { okfAdapter } from "./okf-adapter.js";
|
|
24
|
+
export { opencodeAdapter } from "./opencode-adapter.js";
|
|
25
|
+
export { websiteSnapshotAdapter } from "./website-snapshot-adapter.js";
|
|
26
|
+
/**
|
|
27
|
+
* Every built-in adapter, frozen in the §1.2 install-time probe order: the first
|
|
28
|
+
* adapter whose `looksLikeRoot` fires claims a root, so MORE-SPECIFIC probes
|
|
29
|
+
* come FIRST. This ARRAY ORDER is the executable probe order (`getAdapters()`
|
|
30
|
+
* returns it verbatim) and is pinned by the conformance suite's ordered-owner
|
|
31
|
+
* matrix — it, not the spec §1.2(3) 5-adapter prose listing, is authoritative
|
|
32
|
+
* for the implemented 11-family set.
|
|
33
|
+
*
|
|
34
|
+
* Probe-precedence rationale (grounds "cannot shadow the existing three"):
|
|
35
|
+
*
|
|
36
|
+
* - The three loosest probes — `llm-wiki`, `akm`, and `okf` — stay LAST.
|
|
37
|
+
* Native AKM evidence wins before OKF because AKM Markdown is an OKF
|
|
38
|
+
* superset; the AKM probe is correspondingly strict enough not to claim an
|
|
39
|
+
* OKF bundle merely because it contains one familiar directory name.
|
|
40
|
+
* - `akm.looksLikeRoot` fires on ANY root carrying a stash-subdir-named
|
|
41
|
+
* directory — which includes a `.claude`/`.opencode` tool dir (`commands/`,
|
|
42
|
+
* `agents/`, `skills/`) and a dotenv bundle (`env/`, `secrets/`). So
|
|
43
|
+
* `claude` / `opencode` / `dotenv` come AHEAD of `akm`; their tighter
|
|
44
|
+
* markers (CLAUDE.md+tooldir / AGENTS.md|opencode.json / env-secrets-ONLY)
|
|
45
|
+
* claim those roots first, and `akm` still wins its own workspace root (which
|
|
46
|
+
* those tighter probes reject).
|
|
47
|
+
* - `website-snapshot` (manifest.json), `agent-skills` (a `<name>/SKILL.md`
|
|
48
|
+
* package), `akm-workflow` (a workflow-shaped top-level file), and `akm-task`
|
|
49
|
+
* (a schedule-bearing top-level `.yml`) carry disjoint, specific markers that
|
|
50
|
+
* fire on none of the other roots; they come at the front for clarity.
|
|
51
|
+
* - `generic-files` is EXPLICIT-CONFIG ONLY (§1.2) — its `looksLikeRoot` never
|
|
52
|
+
* fires — so it is LAST and can never shadow anything.
|
|
53
|
+
*/
|
|
54
|
+
export const BUILTIN_ADAPTERS = Object.freeze([
|
|
55
|
+
// Specific, disjoint markers first.
|
|
56
|
+
websiteSnapshotAdapter,
|
|
57
|
+
agentSkillsAdapter,
|
|
58
|
+
// Tool dirs + dotenv BEFORE akm (they share stash-subdir-shaped structure).
|
|
59
|
+
claudeAdapter,
|
|
60
|
+
opencodeAdapter,
|
|
61
|
+
dotenvAdapter,
|
|
62
|
+
// Native akm sub-formats (disjoint content-shape probes).
|
|
63
|
+
akmWorkflowAdapter,
|
|
64
|
+
akmTaskAdapter,
|
|
65
|
+
// Loose probes: specific native layouts before the portable OKF baseline.
|
|
66
|
+
llmWikiAdapter,
|
|
67
|
+
akmAdapter,
|
|
68
|
+
okfAdapter,
|
|
69
|
+
// Explicit-config fallback (never auto-selected) — last.
|
|
70
|
+
genericFilesAdapter,
|
|
71
|
+
]);
|
|
72
|
+
/**
|
|
73
|
+
* DEPRECATED no-op retained for test back-compat only. The built-in set is now
|
|
74
|
+
* the static, frozen {@link BUILTIN_ADAPTERS}, exposed by the registry at
|
|
75
|
+
* module load (normative §12.6), so there is nothing to register. New code MUST
|
|
76
|
+
* NOT call this — `getAdapters()` / `adapterForId()` are always populated.
|
|
77
|
+
*/
|
|
78
|
+
export function registerBuiltinAdapters() {
|
|
79
|
+
// intentionally empty — BUILTIN_ADAPTERS is static; see the doc comment above.
|
|
80
|
+
}
|