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
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
-
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
-
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
/**
|
|
5
|
-
* `akm wiki` command family. Extracted verbatim from src/cli.ts (WS6) so the
|
|
6
|
-
* God Module shrinks; the `main.subCommands.wiki` key and every subcommand's
|
|
7
|
-
* args/output shape are byte-identical. Handlers whose body is a plain
|
|
8
|
-
* `runWithJsonErrors(...) + output(...)` are migrated to `defineJsonCommand`,
|
|
9
|
-
* which emits the same JSON envelope (stdout/stderr/exit-code) as the inline
|
|
10
|
-
* form. `wiki lint` keeps an explicit `runWithJsonErrors` because it calls
|
|
11
|
-
* `process.exit(1)` after the wrapper when findings exist.
|
|
12
|
-
*/
|
|
13
|
-
import { defineCommand } from "citty";
|
|
14
|
-
import { getStringArg, parsePositiveIntFlag } from "../cli/parse-args.js";
|
|
15
|
-
import { defineGroupCommand, defineJsonCommand, output, runWithJsonErrors } from "../cli/shared.js";
|
|
16
|
-
import { resolveStashDir } from "../core/common.js";
|
|
17
|
-
import { loadConfig, resolveConfiguredSources } from "../core/config/config.js";
|
|
18
|
-
import { ConfigError, UsageError } from "../core/errors.js";
|
|
19
|
-
import { akmAgentDispatch } from "./agent/agent-dispatch.js";
|
|
20
|
-
import { readKnowledgeInput } from "./read/knowledge.js";
|
|
21
|
-
import { buildWebsiteOptions } from "./sources/add-cli.js";
|
|
22
|
-
const wikiCreateCommand = defineJsonCommand({
|
|
23
|
-
meta: { name: "create", description: "Scaffold a new wiki under <stashDir>/wikis/<name>/" },
|
|
24
|
-
args: {
|
|
25
|
-
name: { type: "positional", description: "Wiki name (lowercase, digits, hyphens)", required: true },
|
|
26
|
-
},
|
|
27
|
-
async run({ args }) {
|
|
28
|
-
const { createWiki } = await import("../wiki/wiki.js");
|
|
29
|
-
const stashDir = resolveStashDir();
|
|
30
|
-
const result = createWiki(stashDir, args.name);
|
|
31
|
-
output("wiki-create", result);
|
|
32
|
-
},
|
|
33
|
-
});
|
|
34
|
-
const wikiRegisterCommand = defineJsonCommand({
|
|
35
|
-
meta: {
|
|
36
|
-
name: "register",
|
|
37
|
-
description: "Register an existing directory or repo as a first-class wiki without copying or mutating it; refreshes source and wiki search state immediately",
|
|
38
|
-
},
|
|
39
|
-
args: {
|
|
40
|
-
name: { type: "positional", description: "Wiki name (lowercase, digits, hyphens)", required: true },
|
|
41
|
-
ref: { type: "positional", description: "Path or repo ref for the external wiki source", required: true },
|
|
42
|
-
writable: {
|
|
43
|
-
type: "boolean",
|
|
44
|
-
description: "Mark a git-backed source as writable so changes can be pushed back",
|
|
45
|
-
default: false,
|
|
46
|
-
},
|
|
47
|
-
"max-pages": { type: "string", description: "Maximum pages to crawl for website sources (default: 50)" },
|
|
48
|
-
"max-depth": { type: "string", description: "Maximum crawl depth for website sources (default: 3)" },
|
|
49
|
-
},
|
|
50
|
-
async run({ args }) {
|
|
51
|
-
const { registerWikiSource } = await import("./sources/source-add.js");
|
|
52
|
-
const result = await registerWikiSource({
|
|
53
|
-
ref: args.ref.trim(),
|
|
54
|
-
name: args.name,
|
|
55
|
-
options: Object.keys(buildWebsiteOptions(args)).length > 0 ? buildWebsiteOptions(args) : undefined,
|
|
56
|
-
writable: args.writable,
|
|
57
|
-
});
|
|
58
|
-
output("wiki-register", result);
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
const wikiListCommand = defineJsonCommand({
|
|
62
|
-
meta: { name: "list", description: "List wikis with page/raw counts and last-modified timestamps" },
|
|
63
|
-
async run() {
|
|
64
|
-
const { listWikis } = await import("../wiki/wiki.js");
|
|
65
|
-
const stashDir = resolveStashDir();
|
|
66
|
-
const wikis = listWikis(stashDir);
|
|
67
|
-
output("wiki-list", { wikis });
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
const wikiShowCommand = defineJsonCommand({
|
|
71
|
-
meta: { name: "show", description: "Show a wiki's path, description, counts, and last 3 log entries" },
|
|
72
|
-
args: {
|
|
73
|
-
name: { type: "positional", description: "Wiki name", required: true },
|
|
74
|
-
},
|
|
75
|
-
async run({ args }) {
|
|
76
|
-
const { showWiki } = await import("../wiki/wiki.js");
|
|
77
|
-
const stashDir = resolveStashDir();
|
|
78
|
-
const result = showWiki(stashDir, args.name);
|
|
79
|
-
output("wiki-show", result);
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
const wikiRemoveCommand = defineJsonCommand({
|
|
83
|
-
meta: {
|
|
84
|
-
name: "remove",
|
|
85
|
-
description: "Remove a wiki and refresh the index. Preserves raw/ by default; pass --with-sources to also delete raw/",
|
|
86
|
-
},
|
|
87
|
-
args: {
|
|
88
|
-
name: { type: "positional", description: "Wiki name", required: true },
|
|
89
|
-
yes: {
|
|
90
|
-
type: "boolean",
|
|
91
|
-
alias: "y",
|
|
92
|
-
description: "Skip confirmation prompt (required in non-interactive shells)",
|
|
93
|
-
default: false,
|
|
94
|
-
},
|
|
95
|
-
"with-sources": {
|
|
96
|
-
type: "boolean",
|
|
97
|
-
description: "Also delete the raw/ directory (immutable ingested sources)",
|
|
98
|
-
default: false,
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
async run({ args }) {
|
|
102
|
-
const { confirmDestructive } = await import("../cli/confirm.js");
|
|
103
|
-
const confirmed = await confirmDestructive(`Remove wiki "${args.name}"? This cannot be undone.`, {
|
|
104
|
-
yes: args.yes === true,
|
|
105
|
-
});
|
|
106
|
-
if (!confirmed) {
|
|
107
|
-
process.stderr.write("Aborted.\n");
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const withSources = args["with-sources"];
|
|
111
|
-
const { removeWiki } = await import("../wiki/wiki.js");
|
|
112
|
-
const { akmIndex } = await import("../indexer/indexer.js");
|
|
113
|
-
const stashDir = resolveStashDir();
|
|
114
|
-
const result = removeWiki(stashDir, args.name, { withSources });
|
|
115
|
-
await akmIndex({ stashDir });
|
|
116
|
-
output("wiki-remove", result);
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
const wikiPagesCommand = defineJsonCommand({
|
|
120
|
-
meta: {
|
|
121
|
-
name: "pages",
|
|
122
|
-
description: "List wiki pages (ref + frontmatter description), excluding schema/index/log/raw",
|
|
123
|
-
},
|
|
124
|
-
args: {
|
|
125
|
-
name: { type: "positional", description: "Wiki name", required: true },
|
|
126
|
-
},
|
|
127
|
-
async run({ args }) {
|
|
128
|
-
const { listPages } = await import("../wiki/wiki.js");
|
|
129
|
-
const stashDir = resolveStashDir();
|
|
130
|
-
const pages = listPages(stashDir, args.name);
|
|
131
|
-
output("wiki-pages", { wiki: args.name, pages });
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
const wikiSearchCommand = defineJsonCommand({
|
|
135
|
-
meta: {
|
|
136
|
-
name: "search",
|
|
137
|
-
description: "Search wiki pages within a single wiki (scoped wrapper over `akm search --type wiki`; excludes raw/schema/index/log and returns canonical wiki refs)",
|
|
138
|
-
},
|
|
139
|
-
args: {
|
|
140
|
-
name: { type: "positional", description: "Wiki name", required: true },
|
|
141
|
-
query: { type: "positional", description: "Search query", required: true },
|
|
142
|
-
limit: { type: "string", description: "Max hits (default 20)", required: false },
|
|
143
|
-
},
|
|
144
|
-
async run({ args }) {
|
|
145
|
-
const { resolveWikiSource, searchInWiki } = await import("../wiki/wiki.js");
|
|
146
|
-
const stashDir = resolveStashDir();
|
|
147
|
-
resolveWikiSource(stashDir, args.name);
|
|
148
|
-
const parsedLimit = args.limit ? Number(args.limit) : undefined;
|
|
149
|
-
const limit = typeof parsedLimit === "number" && Number.isFinite(parsedLimit) && parsedLimit > 0 ? parsedLimit : undefined;
|
|
150
|
-
const response = await searchInWiki({ stashDir, wikiName: args.name, query: args.query, limit });
|
|
151
|
-
output("search", response);
|
|
152
|
-
},
|
|
153
|
-
});
|
|
154
|
-
const wikiStashCommand = defineJsonCommand({
|
|
155
|
-
meta: {
|
|
156
|
-
name: "stash",
|
|
157
|
-
description: "Copy a source into wikis/<name>/raw/<slug>.md with frontmatter. Source may be a file path, URL, or '-' for stdin.",
|
|
158
|
-
},
|
|
159
|
-
args: {
|
|
160
|
-
name: { type: "positional", description: "Wiki name", required: true },
|
|
161
|
-
source: { type: "positional", description: "Source file path, URL, or '-' to read from stdin", required: true },
|
|
162
|
-
as: { type: "string", description: "Preferred slug base (defaults to source filename or first-line slug)" },
|
|
163
|
-
target: {
|
|
164
|
-
type: "string",
|
|
165
|
-
description: "Name of a writable stash source to write into instead of the default stash. Must match a configured source name (run `akm list` to see sources).",
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
async run({ args }) {
|
|
169
|
-
const { stashRaw } = await import("../wiki/wiki.js");
|
|
170
|
-
let stashDir;
|
|
171
|
-
if (args.target) {
|
|
172
|
-
// Resolve the named source to its filesystem path.
|
|
173
|
-
const cfg = loadConfig();
|
|
174
|
-
const sources = resolveConfiguredSources(cfg);
|
|
175
|
-
const match = sources.find((s) => s.name === args.target);
|
|
176
|
-
if (!match) {
|
|
177
|
-
throw new UsageError(`--target must reference a configured source name. No source named "${args.target}" found. Run \`akm list\` to see available sources.`, "INVALID_FLAG_VALUE");
|
|
178
|
-
}
|
|
179
|
-
const spec = match.source;
|
|
180
|
-
if (spec.type !== "filesystem" && spec.type !== "local") {
|
|
181
|
-
throw new ConfigError(`Source "${args.target}" is not a filesystem source and cannot be used as a wiki stash target.`, "INVALID_CONFIG_FILE", `Use a source with type "filesystem" or "local", or omit --target to use the default stash.`);
|
|
182
|
-
}
|
|
183
|
-
stashDir = spec.path;
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
stashDir = resolveStashDir();
|
|
187
|
-
}
|
|
188
|
-
const { content, preferredName } = await readKnowledgeInput(args.source, { stashDir });
|
|
189
|
-
const result = stashRaw({
|
|
190
|
-
stashDir,
|
|
191
|
-
wikiName: args.name,
|
|
192
|
-
content,
|
|
193
|
-
preferredName: args.as ?? preferredName,
|
|
194
|
-
explicitSlug: args.as !== undefined,
|
|
195
|
-
});
|
|
196
|
-
output("wiki-stash", { ok: true, wiki: args.name, source: args.source, ...result });
|
|
197
|
-
},
|
|
198
|
-
});
|
|
199
|
-
const wikiLintCommand = defineCommand({
|
|
200
|
-
meta: {
|
|
201
|
-
name: "lint",
|
|
202
|
-
description: "Structural lint for a wiki: orphans, broken xrefs, missing descriptions, uncited raws, stale index",
|
|
203
|
-
},
|
|
204
|
-
args: {
|
|
205
|
-
name: { type: "positional", description: "Wiki name", required: true },
|
|
206
|
-
},
|
|
207
|
-
async run({ args }) {
|
|
208
|
-
let findingCount = 0;
|
|
209
|
-
await runWithJsonErrors(async () => {
|
|
210
|
-
const { lintWiki } = await import("../wiki/wiki.js");
|
|
211
|
-
const stashDir = resolveStashDir();
|
|
212
|
-
const report = lintWiki(stashDir, args.name);
|
|
213
|
-
output("wiki-lint", report);
|
|
214
|
-
findingCount = report.findings.length;
|
|
215
|
-
});
|
|
216
|
-
if (findingCount > 0)
|
|
217
|
-
process.exit(1); // EXIT_GENERAL
|
|
218
|
-
},
|
|
219
|
-
});
|
|
220
|
-
const wikiIngestCommand = defineJsonCommand({
|
|
221
|
-
meta: {
|
|
222
|
-
name: "ingest",
|
|
223
|
-
description: "Dispatch an agent to execute the ingest workflow for this wiki. Uses --profile or config.defaults.agent.",
|
|
224
|
-
},
|
|
225
|
-
args: {
|
|
226
|
-
name: { type: "positional", description: "Wiki name", required: true },
|
|
227
|
-
profile: {
|
|
228
|
-
type: "string",
|
|
229
|
-
description: "Agent profile to use (default: config.defaults.agent).",
|
|
230
|
-
},
|
|
231
|
-
model: {
|
|
232
|
-
type: "string",
|
|
233
|
-
description: "Model override — accepts aliases (opus, sonnet, haiku) or exact platform model IDs.",
|
|
234
|
-
},
|
|
235
|
-
"timeout-ms": { type: "string", description: "Override the agent CLI timeout in milliseconds." },
|
|
236
|
-
},
|
|
237
|
-
async run({ args }) {
|
|
238
|
-
const { buildIngestWorkflow } = await import("../wiki/wiki.js");
|
|
239
|
-
const stashDir = resolveStashDir();
|
|
240
|
-
const built = buildIngestWorkflow(stashDir, args.name);
|
|
241
|
-
const config = loadConfig();
|
|
242
|
-
const profileName = getStringArg(args, "profile") ?? config.defaults?.agent;
|
|
243
|
-
if (!profileName) {
|
|
244
|
-
throw new UsageError("akm wiki ingest requires an agent profile. Pass --profile <name> or set defaults.agent in config.", "MISSING_REQUIRED_ARGUMENT", "Available profiles are listed under profiles.agent in your config. Run `akm config get profiles.agent` to inspect.");
|
|
245
|
-
}
|
|
246
|
-
const timeoutMs = parsePositiveIntFlag(args["timeout-ms"], "--timeout-ms");
|
|
247
|
-
const model = getStringArg(args, "model");
|
|
248
|
-
const { getDefaultLlmConfig } = await import("../core/config/config.js");
|
|
249
|
-
const dispatchResult = await akmAgentDispatch({
|
|
250
|
-
profileName,
|
|
251
|
-
agentConfig: config,
|
|
252
|
-
llmConfig: getDefaultLlmConfig(config),
|
|
253
|
-
prompt: built.workflow,
|
|
254
|
-
dispatch: {
|
|
255
|
-
prompt: built.workflow,
|
|
256
|
-
...(model !== undefined ? { model } : {}),
|
|
257
|
-
},
|
|
258
|
-
...(timeoutMs !== undefined && Number.isFinite(timeoutMs) ? { timeoutMs } : {}),
|
|
259
|
-
});
|
|
260
|
-
output("wiki-ingest", {
|
|
261
|
-
wiki: built.wiki,
|
|
262
|
-
path: built.path,
|
|
263
|
-
schemaPath: built.schemaPath,
|
|
264
|
-
dispatched: true,
|
|
265
|
-
profile: profileName,
|
|
266
|
-
agentResult: dispatchResult,
|
|
267
|
-
});
|
|
268
|
-
},
|
|
269
|
-
});
|
|
270
|
-
export const wikiCommand = defineGroupCommand({
|
|
271
|
-
meta: {
|
|
272
|
-
name: "wiki",
|
|
273
|
-
description: "Manage multiple markdown wikis (Karpathy-style). akm surfaces (lifecycle, raw/, lint, index); the agent writes pages.",
|
|
274
|
-
},
|
|
275
|
-
subCommands: {
|
|
276
|
-
create: wikiCreateCommand,
|
|
277
|
-
register: wikiRegisterCommand,
|
|
278
|
-
list: wikiListCommand,
|
|
279
|
-
show: wikiShowCommand,
|
|
280
|
-
remove: wikiRemoveCommand,
|
|
281
|
-
pages: wikiPagesCommand,
|
|
282
|
-
search: wikiSearchCommand,
|
|
283
|
-
stash: wikiStashCommand,
|
|
284
|
-
lint: wikiLintCommand,
|
|
285
|
-
ingest: wikiIngestCommand,
|
|
286
|
-
},
|
|
287
|
-
async defaultRun() {
|
|
288
|
-
// Default action: list wikis
|
|
289
|
-
const { listWikis } = await import("../wiki/wiki.js");
|
|
290
|
-
output("wiki-list", { wikis: listWikis(resolveStashDir()) });
|
|
291
|
-
},
|
|
292
|
-
});
|
|
@@ -1,76 +0,0 @@
|
|
|
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
|
-
* Central registry for asset type renderer and action builder maps.
|
|
6
|
-
*
|
|
7
|
-
* Previously these maps lived in `db-search.ts` (then `local-search.ts`) and
|
|
8
|
-
* were wired into `asset-spec.ts` via a fragile `_setAssetTypeHooks` deferred
|
|
9
|
-
* callback pattern. If the search module was imported after
|
|
10
|
-
* `registerAssetType()` calls, hooks would be silently dropped.
|
|
11
|
-
*
|
|
12
|
-
* This module is a simple singleton that both `asset-spec.ts` and
|
|
13
|
-
* `db-search.ts` import from, eliminating the import-order dependency
|
|
14
|
-
* entirely.
|
|
15
|
-
*/
|
|
16
|
-
import { buildWorkflowAction } from "../../output/renderers.js";
|
|
17
|
-
/** Map asset types to their primary renderer names. */
|
|
18
|
-
export const TYPE_TO_RENDERER = {
|
|
19
|
-
script: "script-source",
|
|
20
|
-
skill: "skill-md",
|
|
21
|
-
command: "command-md",
|
|
22
|
-
agent: "agent-md",
|
|
23
|
-
knowledge: "knowledge-md",
|
|
24
|
-
lesson: "lesson-md",
|
|
25
|
-
memory: "memory-md",
|
|
26
|
-
workflow: "workflow-md",
|
|
27
|
-
env: "env-file",
|
|
28
|
-
secret: "secret-file",
|
|
29
|
-
wiki: "wiki-md",
|
|
30
|
-
task: "task-yaml",
|
|
31
|
-
session: "session-md",
|
|
32
|
-
fact: "fact-md",
|
|
33
|
-
};
|
|
34
|
-
/** Map asset types to action builder functions for search results. */
|
|
35
|
-
export const ACTION_BUILDERS = {
|
|
36
|
-
script: (ref) => `akm show ${ref} -> execute the run command`,
|
|
37
|
-
skill: (ref) => `akm show ${ref} -> follow the instructions`,
|
|
38
|
-
command: (ref) => `akm show ${ref} -> fill placeholders and dispatch`,
|
|
39
|
-
agent: (ref) => `akm show ${ref} -> dispatch with full prompt`,
|
|
40
|
-
knowledge: (ref) => `akm show ${ref} -> read reference material`,
|
|
41
|
-
lesson: (ref) => `akm show ${ref} -> read the lesson and apply when_to_use`,
|
|
42
|
-
memory: (ref) => `akm show ${ref} -> recall context`,
|
|
43
|
-
workflow: (ref) => buildWorkflowAction(ref),
|
|
44
|
-
env: (ref) => `akm show ${ref} -> inspect key names; akm env run ${ref} -- <command> -> run with the whole .env injected (prefer --clean to minimize inherited parent env; child stdout is not redacted). akm env export ${ref} --out <file> writes a sourceable script (values to a file, not stdout).`,
|
|
45
|
-
secret: (ref) => `akm show ${ref} -> name only (value never shown); akm secret path ${ref} -> file path; akm secret run ${ref} <VAR> -- <command> -> run with value injected into $VAR`,
|
|
46
|
-
wiki: (ref) => `akm show ${ref} -> read the wiki page`,
|
|
47
|
-
task: (ref) => `akm tasks show ${ref.replace(/^task:/, "")} -> inspect; akm tasks run <id> -> run now; akm tasks remove <id> -> unschedule`,
|
|
48
|
-
session: (ref) => `akm show ${ref} -> read the session summary; follow the \`access\` frontmatter to open the raw log at \`log_path\``,
|
|
49
|
-
fact: (ref) => `akm show ${ref} -> read the stash fact and apply it as durable context`,
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Register a type-to-renderer mapping.
|
|
53
|
-
*
|
|
54
|
-
* Called by `registerAssetType()` in `asset-spec.ts` when a spec includes
|
|
55
|
-
* `rendererName`, or directly by extension code.
|
|
56
|
-
*/
|
|
57
|
-
export function registerTypeRenderer(type, rendererName) {
|
|
58
|
-
TYPE_TO_RENDERER[type] = rendererName;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Register an action builder for an asset type.
|
|
62
|
-
*
|
|
63
|
-
* Called by `registerAssetType()` in `asset-spec.ts` when a spec includes
|
|
64
|
-
* `actionBuilder`, or directly by extension code.
|
|
65
|
-
*/
|
|
66
|
-
export function registerActionBuilder(type, builder) {
|
|
67
|
-
ACTION_BUILDERS[type] = builder;
|
|
68
|
-
}
|
|
69
|
-
export const defaultRendererRegistry = {
|
|
70
|
-
rendererNameFor(type) {
|
|
71
|
-
return TYPE_TO_RENDERER[type];
|
|
72
|
-
},
|
|
73
|
-
actionBuilderFor(type) {
|
|
74
|
-
return ACTION_BUILDERS[type];
|
|
75
|
-
},
|
|
76
|
-
};
|
|
@@ -1,259 +0,0 @@
|
|
|
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 path from "node:path";
|
|
5
|
-
import { buildWorkflowAction } from "../../output/renderers.js";
|
|
6
|
-
import { registerActionBuilder, registerTypeRenderer } from "./asset-registry.js";
|
|
7
|
-
function toPosix(input) {
|
|
8
|
-
return input.replace(/\\/g, "/");
|
|
9
|
-
}
|
|
10
|
-
const buildTaskAction = (ref) => `akm tasks show ${ref.replace(/^task:/, "")} -> inspect; akm tasks run <id> -> run now; akm tasks remove <id> -> unschedule`;
|
|
11
|
-
const markdownSpec = {
|
|
12
|
-
isRelevantFile: (fileName) => path.extname(fileName).toLowerCase() === ".md",
|
|
13
|
-
toCanonicalName: (typeRoot, filePath) => {
|
|
14
|
-
const rel = toPosix(path.relative(typeRoot, filePath));
|
|
15
|
-
// Strip .md extension from canonical names (agent:code-reviewer, not agent:code-reviewer.md)
|
|
16
|
-
return rel.endsWith(".md") ? rel.slice(0, -3) : rel;
|
|
17
|
-
},
|
|
18
|
-
toAssetPath: (typeRoot, name) => {
|
|
19
|
-
// Accept both with and without .md extension
|
|
20
|
-
const withExt = name.endsWith(".md") ? name : `${name}.md`;
|
|
21
|
-
return path.join(typeRoot, withExt);
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
/** All recognized script extensions for the script asset type */
|
|
25
|
-
export const SCRIPT_EXTENSIONS = new Set([
|
|
26
|
-
".sh",
|
|
27
|
-
".ts",
|
|
28
|
-
".js",
|
|
29
|
-
".ps1",
|
|
30
|
-
".cmd",
|
|
31
|
-
".bat",
|
|
32
|
-
".py",
|
|
33
|
-
".rb",
|
|
34
|
-
".go",
|
|
35
|
-
".pl",
|
|
36
|
-
".php",
|
|
37
|
-
".lua",
|
|
38
|
-
".r",
|
|
39
|
-
".swift",
|
|
40
|
-
".kt",
|
|
41
|
-
".kts",
|
|
42
|
-
]);
|
|
43
|
-
const scriptSpec = {
|
|
44
|
-
isRelevantFile: (fileName) => SCRIPT_EXTENSIONS.has(path.extname(fileName).toLowerCase()),
|
|
45
|
-
toCanonicalName: (typeRoot, filePath) => toPosix(path.relative(typeRoot, filePath)),
|
|
46
|
-
toAssetPath: (typeRoot, name) => path.join(typeRoot, name),
|
|
47
|
-
};
|
|
48
|
-
const ASSET_SPECS_INTERNAL = {
|
|
49
|
-
skill: {
|
|
50
|
-
stashDir: "skills",
|
|
51
|
-
isRelevantFile: (fileName) => fileName === "SKILL.md",
|
|
52
|
-
toCanonicalName: (typeRoot, filePath) => {
|
|
53
|
-
const relDir = toPosix(path.dirname(path.relative(typeRoot, filePath)));
|
|
54
|
-
if (!relDir || relDir === ".")
|
|
55
|
-
return undefined;
|
|
56
|
-
return relDir;
|
|
57
|
-
},
|
|
58
|
-
toAssetPath: (typeRoot, name) => path.join(typeRoot, name, "SKILL.md"),
|
|
59
|
-
},
|
|
60
|
-
command: { stashDir: "commands", ...markdownSpec },
|
|
61
|
-
agent: { stashDir: "agents", ...markdownSpec },
|
|
62
|
-
knowledge: { stashDir: "knowledge", ...markdownSpec },
|
|
63
|
-
workflow: {
|
|
64
|
-
stashDir: "workflows",
|
|
65
|
-
...markdownSpec,
|
|
66
|
-
rendererName: "workflow-md",
|
|
67
|
-
actionBuilder: (ref) => buildWorkflowAction(ref),
|
|
68
|
-
},
|
|
69
|
-
script: { stashDir: "scripts", ...scriptSpec },
|
|
70
|
-
memory: { stashDir: "memories", ...markdownSpec },
|
|
71
|
-
// Environment assets — whole `.env` files sourced/injected wholesale. Replaced
|
|
72
|
-
// the deprecated `vault` type (removed in 0.9.0). Only key NAMES are surfaced
|
|
73
|
-
// as metadata; values and comment text are never read for indexing (comments
|
|
74
|
-
// routinely contain commented-out credentials).
|
|
75
|
-
env: {
|
|
76
|
-
stashDir: "env",
|
|
77
|
-
isRelevantFile: (fileName) => fileName === ".env" || fileName.endsWith(".env"),
|
|
78
|
-
toCanonicalName: (typeRoot, filePath) => {
|
|
79
|
-
const rel = toPosix(path.relative(typeRoot, filePath));
|
|
80
|
-
const fileName = path.basename(rel);
|
|
81
|
-
// Treat ".env" as the "default" env; "<name>.env" → "<name>"
|
|
82
|
-
if (fileName === ".env") {
|
|
83
|
-
const dir = path.dirname(rel);
|
|
84
|
-
return dir === "." || dir === "" ? "default" : `${dir}/default`;
|
|
85
|
-
}
|
|
86
|
-
const stripped = rel.endsWith(".env") ? rel.slice(0, -4) : rel;
|
|
87
|
-
return stripped;
|
|
88
|
-
},
|
|
89
|
-
toAssetPath: (typeRoot, name) => {
|
|
90
|
-
if (name === "default")
|
|
91
|
-
return path.join(typeRoot, ".env");
|
|
92
|
-
return path.join(typeRoot, name.endsWith(".env") ? name : `${name}.env`);
|
|
93
|
-
},
|
|
94
|
-
rendererName: "env-file",
|
|
95
|
-
actionBuilder: (ref) => `akm show ${ref} -> inspect key names; akm env run ${ref} -- <command> -> run with the whole .env injected (prefer --clean to minimize inherited parent env; child stdout is not redacted); akm env export ${ref} --out <file> -> write a sourceable script to a file`,
|
|
96
|
-
},
|
|
97
|
-
// Secrets — a single sensitive value used on its own for authentication (a
|
|
98
|
-
// PEM key, API token, TLS cert). Unlike `env` (a group of related .env
|
|
99
|
-
// configuration), the ENTIRE file is the one secret value — there is no safe
|
|
100
|
-
// region to parse, so only the filename is ever surfaced as metadata. The
|
|
101
|
-
// value reaches a command only via `akm secret run` (injected into a child
|
|
102
|
-
// env var) or `akm secret path` (Docker `_FILE` convention). A secret is any
|
|
103
|
-
// regular file under `secrets/` except `.lock`/`.sensitive` sidecars; the
|
|
104
|
-
// canonical name preserves the natural filename (e.g. `id_rsa`, `team/deploy.key`).
|
|
105
|
-
secret: {
|
|
106
|
-
stashDir: "secrets",
|
|
107
|
-
isRelevantFile: (fileName) => !fileName.endsWith(".lock") && !fileName.endsWith(".sensitive"),
|
|
108
|
-
toCanonicalName: (typeRoot, filePath) => toPosix(path.relative(typeRoot, filePath)),
|
|
109
|
-
toAssetPath: (typeRoot, name) => path.join(typeRoot, name),
|
|
110
|
-
rendererName: "secret-file",
|
|
111
|
-
actionBuilder: (ref) => `akm show ${ref} -> name only (value never shown); akm secret path ${ref} -> file path; akm secret run ${ref} <VAR> -- <command> -> run with value injected into $VAR`,
|
|
112
|
-
},
|
|
113
|
-
wiki: {
|
|
114
|
-
stashDir: "wikis",
|
|
115
|
-
...markdownSpec,
|
|
116
|
-
rendererName: "wiki-md",
|
|
117
|
-
actionBuilder: (ref) => `akm show ${ref} -> read the wiki page`,
|
|
118
|
-
},
|
|
119
|
-
// v1 spec §13 — `lesson` asset type. Required frontmatter fields are
|
|
120
|
-
// `description` and `when_to_use`; lint enforces both (see
|
|
121
|
-
// `src/core/lesson-lint.ts`). Lessons normally arrive as proposals via
|
|
122
|
-
// `akm distill <ref>` (§14.5) and are promoted via `akm proposal accept`,
|
|
123
|
-
// but they can also be authored directly with `akm import` /
|
|
124
|
-
// `akm remember`-style flows.
|
|
125
|
-
lesson: {
|
|
126
|
-
stashDir: "lessons",
|
|
127
|
-
...markdownSpec,
|
|
128
|
-
rendererName: "lesson-md",
|
|
129
|
-
actionBuilder: (ref) => `akm show ${ref} -> read the lesson and apply when_to_use`,
|
|
130
|
-
},
|
|
131
|
-
// Scheduled tasks. A task file pairs a cron-style schedule with a target
|
|
132
|
-
// (workflow ref, prompt, or command) that `akm tasks` registers with the
|
|
133
|
-
// OS-native scheduler (cron / launchd / schtasks). Stored as pure YAML
|
|
134
|
-
// under <stash>/tasks/<id>.yml.
|
|
135
|
-
task: {
|
|
136
|
-
stashDir: "tasks",
|
|
137
|
-
isRelevantFile: (fileName) => path.extname(fileName).toLowerCase() === ".yml",
|
|
138
|
-
toCanonicalName: (typeRoot, filePath) => {
|
|
139
|
-
const rel = toPosix(path.relative(typeRoot, filePath));
|
|
140
|
-
return rel.endsWith(".yml") ? rel.slice(0, -4) : rel;
|
|
141
|
-
},
|
|
142
|
-
toAssetPath: (typeRoot, name) => {
|
|
143
|
-
const withExt = name.endsWith(".yml") ? name : `${name}.yml`;
|
|
144
|
-
return path.join(typeRoot, withExt);
|
|
145
|
-
},
|
|
146
|
-
rendererName: "task-yaml",
|
|
147
|
-
actionBuilder: buildTaskAction,
|
|
148
|
-
},
|
|
149
|
-
// #561 — agent sessions indexed as a first-class searchable asset type.
|
|
150
|
-
// Generated (derived) markdown written by the `extract` pass to
|
|
151
|
-
// `sessions/<harness>/<session-id>.md`; carries `log_path` + `access`
|
|
152
|
-
// frontmatter so any agent can navigate into the raw session log. A plain
|
|
153
|
-
// markdown spec — the summary body is the searchable surface.
|
|
154
|
-
session: {
|
|
155
|
-
stashDir: "sessions",
|
|
156
|
-
...markdownSpec,
|
|
157
|
-
rendererName: "session-md",
|
|
158
|
-
actionBuilder: (ref) => `akm show ${ref} -> read the session summary; follow the \`access\` frontmatter to open the raw log at \`log_path\``,
|
|
159
|
-
},
|
|
160
|
-
// Durable stash-level semantic knowledge — facts about the user, team, or
|
|
161
|
-
// project (personal details, team tool stacks, coding conventions /
|
|
162
|
-
// "constitution", and stash-meta like naming conventions or the active
|
|
163
|
-
// projects list). Unlike `memory` (episodic, recency-decayed) these are
|
|
164
|
-
// mostly-static declarations meant to be reliably surfaced as context. A
|
|
165
|
-
// plain markdown spec; `category` frontmatter scopes the fact and
|
|
166
|
-
// `pinned: true` marks the small always-injected core. See
|
|
167
|
-
// docs/design/fact-asset-type.md.
|
|
168
|
-
fact: {
|
|
169
|
-
stashDir: "facts",
|
|
170
|
-
...markdownSpec,
|
|
171
|
-
rendererName: "fact-md",
|
|
172
|
-
actionBuilder: (ref) => `akm show ${ref} -> read the stash fact and apply it as durable context`,
|
|
173
|
-
},
|
|
174
|
-
};
|
|
175
|
-
export const ASSET_SPECS = ASSET_SPECS_INTERNAL;
|
|
176
|
-
/**
|
|
177
|
-
* Register a custom asset type with the akm asset system.
|
|
178
|
-
*
|
|
179
|
-
* ## Full extension registration API
|
|
180
|
-
*
|
|
181
|
-
* Providing `rendererName` and/or `actionBuilder` in the spec automatically
|
|
182
|
-
* registers the renderer and action builder so that search results and `show`
|
|
183
|
-
* output work out of the box without additional calls.
|
|
184
|
-
*
|
|
185
|
-
* ### Minimal registration (filesystem layout only)
|
|
186
|
-
* ```ts
|
|
187
|
-
* registerAssetType("widget", {
|
|
188
|
-
* stashDir: "widgets",
|
|
189
|
-
* isRelevantFile: (f) => f.endsWith(".widget"),
|
|
190
|
-
* toCanonicalName: (root, fp) => path.basename(fp, ".widget"),
|
|
191
|
-
* toAssetPath: (root, name) => path.join(root, `${name}.widget`),
|
|
192
|
-
* });
|
|
193
|
-
* ```
|
|
194
|
-
*
|
|
195
|
-
* ### Full registration (filesystem + renderer + action)
|
|
196
|
-
* ```ts
|
|
197
|
-
* registerAssetType("widget", {
|
|
198
|
-
* stashDir: "widgets",
|
|
199
|
-
* isRelevantFile: (f) => f.endsWith(".widget"),
|
|
200
|
-
* toCanonicalName: (root, fp) => path.basename(fp, ".widget"),
|
|
201
|
-
* toAssetPath: (root, name) => path.join(root, `${name}.widget`),
|
|
202
|
-
* rendererName: "widget-md", // registered via registerRenderer() separately
|
|
203
|
-
* actionBuilder: (ref) => `akm show ${ref} -> use widget`,
|
|
204
|
-
* });
|
|
205
|
-
* ```
|
|
206
|
-
*
|
|
207
|
-
* Renderer and action builder registration is handled directly via the
|
|
208
|
-
* `asset-registry` singleton — no deferred hooks or import-order concerns.
|
|
209
|
-
*/
|
|
210
|
-
export function registerAssetType(type, spec) {
|
|
211
|
-
ASSET_SPECS_INTERNAL[type] = spec;
|
|
212
|
-
TYPE_DIRS[type] = spec.stashDir;
|
|
213
|
-
// Auto-register renderer and action builder if provided in spec
|
|
214
|
-
if (spec.rendererName) {
|
|
215
|
-
registerTypeRenderer(type, spec.rendererName);
|
|
216
|
-
}
|
|
217
|
-
if (spec.actionBuilder) {
|
|
218
|
-
registerActionBuilder(type, spec.actionBuilder);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Remove a previously-registered asset type.
|
|
223
|
-
*
|
|
224
|
-
* Primarily used by tests for cleanup after `registerAssetType` calls so
|
|
225
|
-
* subsequent tests see a pristine type registry. Built-in types should not
|
|
226
|
-
* normally be deregistered at runtime.
|
|
227
|
-
*/
|
|
228
|
-
export function deregisterAssetType(type) {
|
|
229
|
-
delete ASSET_SPECS_INTERNAL[type];
|
|
230
|
-
delete TYPE_DIRS[type];
|
|
231
|
-
}
|
|
232
|
-
export function getAssetTypes() {
|
|
233
|
-
return Object.keys(ASSET_SPECS_INTERNAL);
|
|
234
|
-
}
|
|
235
|
-
export const TYPE_DIRS = Object.fromEntries(Object.entries(ASSET_SPECS_INTERNAL).map(([type, spec]) => [type, spec.stashDir]));
|
|
236
|
-
export function isRelevantAssetFile(assetType, fileName) {
|
|
237
|
-
return ASSET_SPECS[assetType]?.isRelevantFile(fileName) ?? false;
|
|
238
|
-
}
|
|
239
|
-
export function deriveCanonicalAssetName(assetType, typeRoot, filePath) {
|
|
240
|
-
return ASSET_SPECS[assetType]?.toCanonicalName(typeRoot, filePath);
|
|
241
|
-
}
|
|
242
|
-
export function deriveCanonicalAssetNameFromStashRoot(assetType, stashRoot, filePath) {
|
|
243
|
-
const relPath = toPosix(path.relative(stashRoot, filePath));
|
|
244
|
-
const segments = relPath.split("/").filter(Boolean);
|
|
245
|
-
const firstSegment = segments[0];
|
|
246
|
-
// When the first segment matches the canonical type dir (e.g. "agents"),
|
|
247
|
-
// use it as the type root so canonical names are relative to it.
|
|
248
|
-
// Otherwise fall back to stashRoot — this preserves the full relative path
|
|
249
|
-
// as the canonical name, which is correct for installed stashes that live
|
|
250
|
-
// under custom directories (e.g. "tools/agents/svelte-file-editor").
|
|
251
|
-
const typeRoot = firstSegment === TYPE_DIRS[assetType] ? path.join(stashRoot, firstSegment) : stashRoot;
|
|
252
|
-
return deriveCanonicalAssetName(assetType, typeRoot, filePath);
|
|
253
|
-
}
|
|
254
|
-
export function resolveAssetPathFromName(assetType, typeRoot, name) {
|
|
255
|
-
const spec = ASSET_SPECS[assetType];
|
|
256
|
-
if (!spec)
|
|
257
|
-
throw new Error(`Unknown asset type: "${assetType}"`);
|
|
258
|
-
return spec.toAssetPath(typeRoot, name);
|
|
259
|
-
}
|