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,419 @@
|
|
|
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 first-class `llm-wiki` adapter — akm 0.9.0 chunk-4 (DEV-7 restore).
|
|
6
|
+
*
|
|
7
|
+
* The `wiki` ASSET-TYPE dies in chunk 4 (plan §11 Chunk 4 / §7.4), but the LLM
|
|
8
|
+
* Wiki structure stays first-class as its OWN adapter. This relocates the
|
|
9
|
+
* native wiki semantics from the retired `src/wiki/` module into a
|
|
10
|
+
* `BundleAdapter` implementing `docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md` §7
|
|
11
|
+
* (llm-wiki row), §6 (wiki-page row), §0.2 (the `wiki` asset-type is retired;
|
|
12
|
+
* the adapter is first-class), §1.2 (probe = schema.md + pages/), §9 (links).
|
|
13
|
+
*
|
|
14
|
+
* Conformance oracle (authored, DO NOT modify): fixture
|
|
15
|
+
* `tests/fixtures/bundles/llm-wiki/` + goldens
|
|
16
|
+
* `tests/fixtures/format-family-goldens/llm-wiki/{recognition,placement,renderer,lint}.json`.
|
|
17
|
+
* The adapter is built to MATCH those goldens (driven by
|
|
18
|
+
* `tests/core/adapter/llm-wiki-adapter.test.ts`).
|
|
19
|
+
*
|
|
20
|
+
* ── Structure (spec §7, wiki.ts canonical-content contract) ──
|
|
21
|
+
*
|
|
22
|
+
* - `schema.md` / `index.md` / `log.md` at the wiki ROOT are RESERVED
|
|
23
|
+
* (recognized, never indexed as concepts) — analogous to OKF's index.md/log.md.
|
|
24
|
+
* - `raw/<slug>.md` are immutable ingested sources → the adapter's own `type`
|
|
25
|
+
* = `wiki-source` (RESOLVED, reading A: recognition golden). First-class
|
|
26
|
+
* addressable + searchable; lint tracks whether each is cited.
|
|
27
|
+
* - `pages/**.md` are agent-authored pages → open `type` = frontmatter
|
|
28
|
+
* `pageKind` (concept/entity/note/<custom>). None of concept/entity/note/
|
|
29
|
+
* wiki-source is in `KNOWN_TYPES`, so they present GENERICALLY (renderer
|
|
30
|
+
* golden); the retired `wiki-md` renderer is deliberately unused.
|
|
31
|
+
* - Anything else (root README, stray root `.md`, other dirs) is NOT a wiki
|
|
32
|
+
* asset (`recognize` abstains) — pages live under `pages/`.
|
|
33
|
+
*
|
|
34
|
+
* ── Links / citations (spec §9) ──
|
|
35
|
+
*
|
|
36
|
+
* A page's `IndexDocument.links` = its resolved `xrefs:` frontmatter (the
|
|
37
|
+
* `wiki:<name>/<conceptId>` form, stripped to the target conceptId) PLUS its
|
|
38
|
+
* body bundle-relative markdown links, deduped, first-appearance order. Its
|
|
39
|
+
* `sources:` frontmatter resolves to the cited raw conceptIds (citation edges),
|
|
40
|
+
* carried on `documentJson` (adapter extras — plan §4.3) and consumed by the
|
|
41
|
+
* uncited-raw lint check.
|
|
42
|
+
*
|
|
43
|
+
* ── validate (spec §6/§7, §9) — native wiki checks ONLY ──
|
|
44
|
+
*
|
|
45
|
+
* The native structural checks ported from the retired `src/wiki/` module's
|
|
46
|
+
* `lintWiki`: `broken-xref`
|
|
47
|
+
* (an xref target that does not resolve to an existing page), `uncited-raw`
|
|
48
|
+
* (a `raw/` source not cited by any page's `sources:`), `missing-description`
|
|
49
|
+
* (a page with no description), and `broken-source` (a page `sources:` entry
|
|
50
|
+
* with no matching raw file). Broken xrefs are TOLERATED (warning, non-blocking,
|
|
51
|
+
* spec §9). The shared `runBaseValidateChecks` (unquoted-colon / missing-updated
|
|
52
|
+
* / stale-path / missing-ref) is NOT run: wiki files never carry an `updated`
|
|
53
|
+
* field, so `missing-updated` would fire on every page/reserved file and
|
|
54
|
+
* contradict the lint golden's clean result — the native checks are the wiki's
|
|
55
|
+
* complete validation surface. The `orphan` issue CODE is APPROVED but the
|
|
56
|
+
* recorded chunk-4 behavior (lint golden edgeCases) is to emit `broken-xref`
|
|
57
|
+
* only (the actionable finding) and surface `orphan` after the xref is fixed —
|
|
58
|
+
* so no `orphan` finding is emitted here.
|
|
59
|
+
*
|
|
60
|
+
* ── Cycle-safety ──
|
|
61
|
+
*
|
|
62
|
+
* Imported by the `adapters/index.ts` barrel, which is NOT test-only: `core/
|
|
63
|
+
* adapter/registry.ts:33` imports it in production for the frozen
|
|
64
|
+
* `BUILTIN_ADAPTERS` list (`installations.ts#detectAdapterId`,
|
|
65
|
+
* `provider-utils.ts#detectStashRoot`). This still can never gain an inbound
|
|
66
|
+
* edge from a cycle participant, since neither the barrel nor the registry
|
|
67
|
+
* import anything that imports back into this file. It value-imports only
|
|
68
|
+
* pure leaves (`frontmatter`, `shared`) plus Node builtins + `yaml` (already a
|
|
69
|
+
* runtime dep). Verified: `bun scripts/lint-import-cycles.ts` reports 0 cycle
|
|
70
|
+
* participants with this file present.
|
|
71
|
+
*/
|
|
72
|
+
import fs from "node:fs";
|
|
73
|
+
import path from "node:path";
|
|
74
|
+
import { parse as parseYaml } from "yaml";
|
|
75
|
+
import { parseFrontmatter, parseFrontmatterBlock } from "../../asset/frontmatter.js";
|
|
76
|
+
import { hashContent, nonEmptyString } from "./shared.js";
|
|
77
|
+
/** A wiki is a single-component bundle; its one component is conventionally `main` (recognition golden). */
|
|
78
|
+
const WIKI_COMPONENT_ID = "main";
|
|
79
|
+
/** The adapter's own `type` for immutable ingested sources under `raw/` (recognition golden, reading A). */
|
|
80
|
+
const WIKI_SOURCE_TYPE = "wiki-source";
|
|
81
|
+
/** Default open `type` for a `pages/` file whose frontmatter carries no `pageKind`. */
|
|
82
|
+
const DEFAULT_PAGE_KIND = "note";
|
|
83
|
+
/** Reserved wiki files (case-insensitive) at the wiki ROOT — recognized, never indexed as concepts (spec §7). */
|
|
84
|
+
const RESERVED_ROOT_FILES = new Set(["schema.md", "index.md", "log.md"]);
|
|
85
|
+
/** Content subdirectory holding immutable ingested sources. */
|
|
86
|
+
const RAW_SUBDIR = "raw";
|
|
87
|
+
/** Content subdirectory holding agent-authored pages. */
|
|
88
|
+
const PAGES_SUBDIR = "pages";
|
|
89
|
+
/** Upper bound on the bounded `content` FTS field (mirrors okf-adapter). */
|
|
90
|
+
const MAX_CONTENT_CHARS = 100_000;
|
|
91
|
+
/** POSIX-normalize separators. */
|
|
92
|
+
function toPosix(p) {
|
|
93
|
+
return p.replace(/\\/g, "/");
|
|
94
|
+
}
|
|
95
|
+
/** conceptId = component-root-relative path minus `.md`. */
|
|
96
|
+
function conceptIdOf(relPath) {
|
|
97
|
+
return toPosix(relPath).replace(/\.md$/i, "");
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Parse a wiki page's frontmatter with a real YAML parser so list-valued keys
|
|
101
|
+
* (`xrefs:`, `sources:`) round-trip (the project's hand-rolled `parseFrontmatter`
|
|
102
|
+
* deliberately drops YAML lists — see `wiki.ts#parsePageFrontmatterYaml`).
|
|
103
|
+
* Tolerant: malformed YAML / no frontmatter yields empty fields.
|
|
104
|
+
*/
|
|
105
|
+
function parseWikiFrontmatter(raw) {
|
|
106
|
+
const out = { xrefs: [], sources: [] };
|
|
107
|
+
const block = parseFrontmatterBlock(raw);
|
|
108
|
+
let data = {};
|
|
109
|
+
if (block) {
|
|
110
|
+
try {
|
|
111
|
+
const value = parseYaml(block.frontmatter);
|
|
112
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
113
|
+
data = value;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// malformed YAML — fall back to the lightweight parser (scalars only)
|
|
118
|
+
try {
|
|
119
|
+
data = parseFrontmatter(raw).data;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
data = {};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
out.description = nonEmptyString(data.description);
|
|
127
|
+
out.pageKind = nonEmptyString(data.pageKind);
|
|
128
|
+
out.wikiRole = nonEmptyString(data.wikiRole);
|
|
129
|
+
if (Array.isArray(data.xrefs)) {
|
|
130
|
+
out.xrefs = data.xrefs
|
|
131
|
+
.filter((x) => typeof x === "string" && x.trim().length > 0)
|
|
132
|
+
.map((x) => x.trim());
|
|
133
|
+
}
|
|
134
|
+
if (Array.isArray(data.sources)) {
|
|
135
|
+
out.sources = data.sources
|
|
136
|
+
.filter((s) => typeof s === "string" && s.trim().length > 0)
|
|
137
|
+
.map((s) => s.trim());
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
/** True when `relPath` is a RESERVED wiki file at the component root (schema/index/log). */
|
|
142
|
+
function isReservedRootFile(relPath) {
|
|
143
|
+
const posix = toPosix(relPath);
|
|
144
|
+
if (posix.includes("/"))
|
|
145
|
+
return false; // reserved files are special ONLY at the wiki root
|
|
146
|
+
return RESERVED_ROOT_FILES.has(posix.toLowerCase());
|
|
147
|
+
}
|
|
148
|
+
/** First path segment of a component-root-relative POSIX path (or the whole thing when flat). */
|
|
149
|
+
function firstSegment(relPath) {
|
|
150
|
+
const posix = toPosix(relPath);
|
|
151
|
+
const slash = posix.indexOf("/");
|
|
152
|
+
return slash < 0 ? posix : posix.slice(0, slash);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Resolve one xref token (`wiki:<bundleId>/<conceptId>`) to a same-wiki target
|
|
156
|
+
* conceptId, or `null` when it points at another wiki / is not a wiki xref.
|
|
157
|
+
* `bundleId` is the bundle id (`c.id`); cross-wiki xrefs are left alone
|
|
158
|
+
* (wiki.ts#lintWiki: "a cross-wiki link is a feature, not a defect").
|
|
159
|
+
*/
|
|
160
|
+
function resolveXref(xref, bundleId) {
|
|
161
|
+
const prefix = `wiki:${bundleId}/`;
|
|
162
|
+
if (!xref.startsWith(prefix))
|
|
163
|
+
return null;
|
|
164
|
+
const target = xref.slice(prefix.length).replace(/\.md$/i, "");
|
|
165
|
+
return target.length > 0 ? target : null;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Resolve a page body's bundle-relative markdown links to component-root-relative
|
|
169
|
+
* conceptIds. `/`-rooted links resolve from the component root; standard relative
|
|
170
|
+
* links resolve against the linking page's own directory. External schemes,
|
|
171
|
+
* anchors, non-`.md` targets, and links escaping the component root are dropped
|
|
172
|
+
* (tolerant, §9). First-appearance order; duplicates collapse.
|
|
173
|
+
*/
|
|
174
|
+
function resolveBodyLinks(body, fileRelPath) {
|
|
175
|
+
const dir = path.posix.dirname(toPosix(fileRelPath));
|
|
176
|
+
const linkRe = /\[[^\]]*\]\(([^)]+)\)/g;
|
|
177
|
+
const out = [];
|
|
178
|
+
const seen = new Set();
|
|
179
|
+
let match;
|
|
180
|
+
// biome-ignore lint/suspicious/noAssignInExpressions: idiomatic regex loop
|
|
181
|
+
while ((match = linkRe.exec(body)) !== null) {
|
|
182
|
+
let target = match[1].trim();
|
|
183
|
+
const wsIdx = target.search(/\s/);
|
|
184
|
+
if (wsIdx >= 0)
|
|
185
|
+
target = target.slice(0, wsIdx);
|
|
186
|
+
const hashIdx = target.indexOf("#");
|
|
187
|
+
if (hashIdx >= 0)
|
|
188
|
+
target = target.slice(0, hashIdx);
|
|
189
|
+
const queryIdx = target.indexOf("?");
|
|
190
|
+
if (queryIdx >= 0)
|
|
191
|
+
target = target.slice(0, queryIdx);
|
|
192
|
+
if (!target)
|
|
193
|
+
continue;
|
|
194
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(target))
|
|
195
|
+
continue; // external scheme
|
|
196
|
+
if (target.startsWith("//"))
|
|
197
|
+
continue; // protocol-relative
|
|
198
|
+
if (!target.toLowerCase().endsWith(".md"))
|
|
199
|
+
continue;
|
|
200
|
+
let resolved;
|
|
201
|
+
if (target.startsWith("/")) {
|
|
202
|
+
resolved = path.posix.normalize(target.slice(1));
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const base = dir === "." ? "" : dir;
|
|
206
|
+
resolved = path.posix.normalize(path.posix.join(base, target));
|
|
207
|
+
}
|
|
208
|
+
if (resolved.startsWith("../") || resolved === ".." || resolved.startsWith("/"))
|
|
209
|
+
continue;
|
|
210
|
+
const conceptId = resolved.replace(/\.md$/i, "");
|
|
211
|
+
if (!conceptId || seen.has(conceptId))
|
|
212
|
+
continue;
|
|
213
|
+
seen.add(conceptId);
|
|
214
|
+
out.push(conceptId);
|
|
215
|
+
}
|
|
216
|
+
return out;
|
|
217
|
+
}
|
|
218
|
+
/** Resolve a page's `xrefs` + body links into deduped target conceptIds (links = relationships, §9). */
|
|
219
|
+
function resolvePageLinks(fm, body, fileRelPath, bundleId) {
|
|
220
|
+
const out = [];
|
|
221
|
+
const seen = new Set();
|
|
222
|
+
const push = (conceptId) => {
|
|
223
|
+
if (conceptId.length > 0 && !seen.has(conceptId)) {
|
|
224
|
+
seen.add(conceptId);
|
|
225
|
+
out.push(conceptId);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
for (const xref of fm.xrefs) {
|
|
229
|
+
const resolved = resolveXref(xref, bundleId);
|
|
230
|
+
if (resolved !== null)
|
|
231
|
+
push(resolved);
|
|
232
|
+
}
|
|
233
|
+
for (const link of resolveBodyLinks(body, fileRelPath))
|
|
234
|
+
push(link);
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
/** Resolve a page's `sources:` entries (`raw/<slug>[.md]`) to raw conceptIds (citation edges). */
|
|
238
|
+
function resolveSources(fm) {
|
|
239
|
+
const out = [];
|
|
240
|
+
const seen = new Set();
|
|
241
|
+
for (const src of fm.sources) {
|
|
242
|
+
const match = src.match(/^raw\/([^/\s]+?)(?:\.md)?$/i);
|
|
243
|
+
if (!match)
|
|
244
|
+
continue;
|
|
245
|
+
const conceptId = `raw/${match[1]}`;
|
|
246
|
+
if (!seen.has(conceptId)) {
|
|
247
|
+
seen.add(conceptId);
|
|
248
|
+
out.push(conceptId);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return out;
|
|
252
|
+
}
|
|
253
|
+
function recognize(c, file) {
|
|
254
|
+
if (file.ext !== ".md")
|
|
255
|
+
return null;
|
|
256
|
+
const relPath = toPosix(file.relPath);
|
|
257
|
+
// Reserved root files (schema/index/log) are recognized but never indexed.
|
|
258
|
+
if (isReservedRootFile(relPath))
|
|
259
|
+
return null;
|
|
260
|
+
const head = firstSegment(relPath);
|
|
261
|
+
const isRaw = head === RAW_SUBDIR && relPath.includes("/");
|
|
262
|
+
const isPage = head === PAGES_SUBDIR && relPath.includes("/");
|
|
263
|
+
// Only `raw/` sources and `pages/` pages are wiki assets. Everything else
|
|
264
|
+
// (root README, stray root `.md`, other dirs) is abstained on.
|
|
265
|
+
if (!isRaw && !isPage)
|
|
266
|
+
return null;
|
|
267
|
+
const conceptId = conceptIdOf(relPath);
|
|
268
|
+
const lastSegment = conceptId.split("/").pop() ?? conceptId;
|
|
269
|
+
const raw = file.content();
|
|
270
|
+
const fm = parseWikiFrontmatter(raw);
|
|
271
|
+
const body = parseFrontmatter(raw).content;
|
|
272
|
+
const doc = {
|
|
273
|
+
ref: `${c.id}//${conceptId}`,
|
|
274
|
+
bundle: c.id,
|
|
275
|
+
component: WIKI_COMPONENT_ID,
|
|
276
|
+
conceptId,
|
|
277
|
+
path: file.absPath,
|
|
278
|
+
hash: hashContent(raw),
|
|
279
|
+
adapterId: "llm-wiki",
|
|
280
|
+
ownsPresentation: true,
|
|
281
|
+
type: isRaw ? WIKI_SOURCE_TYPE : (fm.pageKind ?? DEFAULT_PAGE_KIND),
|
|
282
|
+
name: lastSegment,
|
|
283
|
+
content: body.length > MAX_CONTENT_CHARS ? body.slice(0, MAX_CONTENT_CHARS) : body,
|
|
284
|
+
};
|
|
285
|
+
if (fm.description !== undefined)
|
|
286
|
+
doc.description = fm.description;
|
|
287
|
+
if (isPage) {
|
|
288
|
+
const links = resolvePageLinks(fm, body, relPath, c.id);
|
|
289
|
+
if (links.length > 0)
|
|
290
|
+
doc.links = links;
|
|
291
|
+
const sources = resolveSources(fm);
|
|
292
|
+
// wiki page extras (adapter-owned; plan §4.3 — wikiRole/pageKind + citations).
|
|
293
|
+
const extras = { pageKind: fm.pageKind ?? DEFAULT_PAGE_KIND, sources };
|
|
294
|
+
if (fm.wikiRole !== undefined)
|
|
295
|
+
extras.wikiRole = fm.wikiRole;
|
|
296
|
+
doc.documentJson = extras;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
doc.documentJson = { wikiRole: fm.wikiRole ?? "source" };
|
|
300
|
+
}
|
|
301
|
+
return doc;
|
|
302
|
+
}
|
|
303
|
+
async function validate(c, changes, ctx) {
|
|
304
|
+
const items = [];
|
|
305
|
+
for (const change of changes) {
|
|
306
|
+
if (change.op === "delete")
|
|
307
|
+
continue;
|
|
308
|
+
const raw = change.after ?? (await ctx.readFile(change.path));
|
|
309
|
+
if (typeof raw !== "string")
|
|
310
|
+
continue;
|
|
311
|
+
const relPath = toPosix(change.path);
|
|
312
|
+
if (isReservedRootFile(relPath))
|
|
313
|
+
continue; // reserved files are not concepts — no page checks
|
|
314
|
+
const head = firstSegment(relPath);
|
|
315
|
+
const isRaw = head === RAW_SUBDIR && relPath.includes("/");
|
|
316
|
+
const isPage = head === PAGES_SUBDIR && relPath.includes("/");
|
|
317
|
+
if (!isRaw && !isPage)
|
|
318
|
+
continue;
|
|
319
|
+
items.push({
|
|
320
|
+
relPath,
|
|
321
|
+
conceptId: conceptIdOf(relPath),
|
|
322
|
+
kind: isRaw ? "raw" : "page",
|
|
323
|
+
fm: parseWikiFrontmatter(raw),
|
|
324
|
+
body: parseFrontmatter(raw).content,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
const existingConceptIds = new Set(items.map((i) => i.conceptId));
|
|
328
|
+
const citedRawConceptIds = new Set();
|
|
329
|
+
for (const item of items) {
|
|
330
|
+
if (item.kind !== "page")
|
|
331
|
+
continue;
|
|
332
|
+
for (const src of resolveSources(item.fm))
|
|
333
|
+
citedRawConceptIds.add(src);
|
|
334
|
+
}
|
|
335
|
+
const diagnostics = [];
|
|
336
|
+
for (const item of items) {
|
|
337
|
+
if (item.kind === "raw") {
|
|
338
|
+
// uncited-raw: a raw source not cited by any page's `sources:`.
|
|
339
|
+
if (!citedRawConceptIds.has(item.conceptId)) {
|
|
340
|
+
diagnostics.push({
|
|
341
|
+
file: item.relPath,
|
|
342
|
+
issue: "uncited-raw",
|
|
343
|
+
detail: `warning: raw source ${item.conceptId} is not cited by any page's sources: frontmatter (non-blocking).`,
|
|
344
|
+
fixed: false,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
// missing-description
|
|
350
|
+
if (item.fm.description === undefined) {
|
|
351
|
+
diagnostics.push({
|
|
352
|
+
file: item.relPath,
|
|
353
|
+
issue: "missing-description",
|
|
354
|
+
detail: "warning: page is missing a frontmatter `description` (non-blocking).",
|
|
355
|
+
fixed: false,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
// broken-xref: same-wiki xref targets that do not resolve to an existing page.
|
|
359
|
+
const targets = new Set();
|
|
360
|
+
for (const xref of item.fm.xrefs) {
|
|
361
|
+
const resolved = resolveXref(xref, c.id);
|
|
362
|
+
if (resolved !== null)
|
|
363
|
+
targets.add(resolved);
|
|
364
|
+
}
|
|
365
|
+
for (const link of resolveBodyLinks(item.body, item.relPath))
|
|
366
|
+
targets.add(link);
|
|
367
|
+
for (const target of targets) {
|
|
368
|
+
if (!existingConceptIds.has(target)) {
|
|
369
|
+
diagnostics.push({
|
|
370
|
+
file: item.relPath,
|
|
371
|
+
issue: "broken-xref",
|
|
372
|
+
detail: `warning: cross-reference target not found: ${target} ` +
|
|
373
|
+
"(non-blocking; cross-references must point at pages that actually exist — wiki schema hard rule).",
|
|
374
|
+
fixed: false,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// broken-source: `sources:` entries must resolve to an existing raw file.
|
|
379
|
+
for (const source of resolveSources(item.fm)) {
|
|
380
|
+
if (!existingConceptIds.has(source)) {
|
|
381
|
+
diagnostics.push({
|
|
382
|
+
file: item.relPath,
|
|
383
|
+
issue: "broken-source",
|
|
384
|
+
detail: `warning: page references missing raw source ${source} (non-blocking).`,
|
|
385
|
+
fixed: false,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return diagnostics;
|
|
391
|
+
}
|
|
392
|
+
export const llmWikiAdapter = {
|
|
393
|
+
id: "llm-wiki",
|
|
394
|
+
version: "0.9.0",
|
|
395
|
+
extensions: [".md"],
|
|
396
|
+
recognize,
|
|
397
|
+
validate,
|
|
398
|
+
/** `<c.root>/<conceptId>.md` — the conceptId already carries its `pages/`/`raw/` prefix (placement golden). */
|
|
399
|
+
placeNew(c, conceptId) {
|
|
400
|
+
return path.join(c.root, `${conceptId}.md`);
|
|
401
|
+
},
|
|
402
|
+
/** The wiki owns its whole root (schema/index/log at root plus pages/ + raw/); one component. */
|
|
403
|
+
directoryList(_c) {
|
|
404
|
+
return ["."];
|
|
405
|
+
},
|
|
406
|
+
/** Install-time probe (§1.2): a root is an LLM Wiki when it has a root `schema.md` AND a `pages/` directory. */
|
|
407
|
+
looksLikeRoot(root) {
|
|
408
|
+
try {
|
|
409
|
+
if (!fs.existsSync(path.join(root, "schema.md")))
|
|
410
|
+
return false;
|
|
411
|
+
return fs.statSync(path.join(root, PAGES_SUBDIR)).isDirectory();
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
};
|
|
418
|
+
// Exported pure helpers for the conformance test.
|
|
419
|
+
export { resolveBodyLinks, resolvePageLinks, resolveSources, resolveXref };
|