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,392 @@
|
|
|
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
|
+
* Per-`type` validate checks for the `akm` adapter — akm 0.9.0 chunk-2, WI-C,
|
|
6
|
+
* implementing spec §6 (the per-`type` validation column) as a
|
|
7
|
+
* behavior-preserving port of `src/commands/lint/*`'s type linters. The `akm`
|
|
8
|
+
* adapter's `validate` = shared base checks (WI-A `shared.ts`) + these per-type
|
|
9
|
+
* extra checks, keyed on the winning `type`, reproducing today's
|
|
10
|
+
* `getLinterForType(subdir).lint(ctx)` dispatch. The FROZEN lint golden
|
|
11
|
+
* (`tests/fixtures/goldens/lint/all-types.json`, `perType`) is the conformance
|
|
12
|
+
* gate.
|
|
13
|
+
*
|
|
14
|
+
* ── type → linter mapping (registry.ts `getLinterForType`) ──
|
|
15
|
+
*
|
|
16
|
+
* command → CommandLinter | agent → AgentLinter (missing-name-or-type +
|
|
17
|
+
* invalid `type` value); fact → FactLinter (missing-category); task →
|
|
18
|
+
* TaskLinter (invalid-task-yaml); workflow(.md) → WorkflowLinter
|
|
19
|
+
* (placeholder-stub READ-ONLY + invalid-workflow-structure); memory →
|
|
20
|
+
* MemoryLinter (orphaned-stub READ-ONLY); skill → SkillLinter directory check
|
|
21
|
+
* (missing-skill-md, see {@link skillDirectoryDiagnostics}); env/secret → the
|
|
22
|
+
* env dangerous-key scan (lint/index.ts:191-218, `.env`-suffix-narrow);
|
|
23
|
+
* knowledge/lesson/script/secret/wiki/session → DefaultLinter (base only).
|
|
24
|
+
*
|
|
25
|
+
* ── READ-ONLY discipline ──
|
|
26
|
+
*
|
|
27
|
+
* `placeholder-stub` and `orphaned-stub` carry a `--fix` DELETE in the live
|
|
28
|
+
* linters; `BundleAdapter.validate` MUST NOT write, so both are emitted as
|
|
29
|
+
* non-fixable Diagnostics here (never delete). All reads route through
|
|
30
|
+
* `ValidateContext` (the run snapshot + pending overlay) — the live linters'
|
|
31
|
+
* `fs.existsSync` sibling/SKILL.md probes become `ctx.readFile` lookups.
|
|
32
|
+
*
|
|
33
|
+
* ── env/secret dangerous-key narrowness (PRESERVED, spec §6) ──
|
|
34
|
+
*
|
|
35
|
+
* Today's scan (`collectEnvFiles`) only visits `.env`-SUFFIXED files under
|
|
36
|
+
* `env/` and `secrets/`, so `secrets/<bare-name>` is NOT scanned. This port
|
|
37
|
+
* keeps that exact narrowness: {@link dangerousEnvKeyDiagnostics} runs only when
|
|
38
|
+
* the path's basename ends in `.env`. NOT widened.
|
|
39
|
+
*
|
|
40
|
+
* ── Cycle-safety (chunk-2 ratchet, baseline 18) ──
|
|
41
|
+
*
|
|
42
|
+
* Imported ONLY by `akm-adapter.ts` (no inbound `src/` edge) → can never join a
|
|
43
|
+
* cycle. It VALUE-imports `parseWorkflow` (already transitively reachable from
|
|
44
|
+
* `akm-adapter` via `matchers.ts`) and the pure predicate `isDangerousEnvKey`
|
|
45
|
+
* from `commands/lint/env-key-rules` — the predicate is imported, not copied,
|
|
46
|
+
* precisely so the 40+ security-sensitive dangerous-key names cannot drift from
|
|
47
|
+
* the canonical set; importing it is ratchet-neutral (verified: 18). The small
|
|
48
|
+
* key-scan / suppression-comment logic IS ported (content-based, reads the
|
|
49
|
+
* overlay `raw`, not disk). `type` determination stays in `akm-adapter.ts`
|
|
50
|
+
* (which owns `recognizeMatch`) so this leaf never imports back into the
|
|
51
|
+
* adapter.
|
|
52
|
+
*/
|
|
53
|
+
import path from "node:path";
|
|
54
|
+
import { isDangerousEnvKey } from "../../../commands/lint/env-key-rules.js";
|
|
55
|
+
import { compileWorkflowPlan } from "../../../workflows/ir/compile.js";
|
|
56
|
+
import { parseWorkflow } from "../../../workflows/parser.js";
|
|
57
|
+
/** Recommended `category` values for facts — `commands/lint/fact-linter.ts:9`. */
|
|
58
|
+
const KNOWN_CATEGORIES = new Set(["personal", "team", "project", "convention", "meta"]);
|
|
59
|
+
/** Placeholder markers a workflow stub carries — `commands/lint/workflow-linter.ts:10`. */
|
|
60
|
+
const PLACEHOLDER_STRINGS = ["Describe what this workflow accomplishes", "Example Workflow"];
|
|
61
|
+
/** Inline suppression token — `commands/lint/env-key-rules.ts:138` (not exported there; reproduced verbatim). */
|
|
62
|
+
const SUPPRESSION_COMMENT = "# akm-lint-ok: dangerous-env-key";
|
|
63
|
+
// ── BaseLinter protected-method ports (base-linter.ts:520-551) ───────────────
|
|
64
|
+
/** Port of `BaseLinter.checkMissingNameOrType` (`:520-527`). */
|
|
65
|
+
function checkMissingNameOrType(data, frontmatter) {
|
|
66
|
+
if (!frontmatter)
|
|
67
|
+
return null;
|
|
68
|
+
const missingFields = [];
|
|
69
|
+
if (!("name" in data) || !data.name)
|
|
70
|
+
missingFields.push("name");
|
|
71
|
+
if (!("type" in data) || !data.type)
|
|
72
|
+
missingFields.push("type");
|
|
73
|
+
if (missingFields.length === 0)
|
|
74
|
+
return null;
|
|
75
|
+
return `missing fields: ${missingFields.join(", ")}`;
|
|
76
|
+
}
|
|
77
|
+
/** Port of `BaseLinter.checkInvalidTypeValue` (`:534-539`). */
|
|
78
|
+
function checkInvalidTypeValue(data, allowedTypes) {
|
|
79
|
+
if (!("type" in data) || !data.type)
|
|
80
|
+
return null;
|
|
81
|
+
const value = String(data.type);
|
|
82
|
+
if (allowedTypes.includes(value))
|
|
83
|
+
return null;
|
|
84
|
+
return `type field has invalid value '${value}'; expected one of: ${allowedTypes.join(", ")}`;
|
|
85
|
+
}
|
|
86
|
+
/** Port of `BaseLinter.suggestSlug` (`:544-551`). */
|
|
87
|
+
function suggestSlug(filePath) {
|
|
88
|
+
return path
|
|
89
|
+
.basename(filePath, ".md")
|
|
90
|
+
.toLowerCase()
|
|
91
|
+
.replace(/[^a-z0-9-]+/g, "-")
|
|
92
|
+
.replace(/-+/g, "-")
|
|
93
|
+
.replace(/^-|-$/g, "");
|
|
94
|
+
}
|
|
95
|
+
// ── name/type linter (CommandLinter / AgentLinter) ───────────────────────────
|
|
96
|
+
/** Reproduce CommandLinter/AgentLinter's extra checks (`command-linter.ts` / `agent-linter.ts`). */
|
|
97
|
+
export function nameOrTypeDiagnostics(relPath, data, frontmatter, allowedTypes) {
|
|
98
|
+
const missingFieldDetail = checkMissingNameOrType(data, frontmatter);
|
|
99
|
+
if (missingFieldDetail) {
|
|
100
|
+
const slug = suggestSlug(relPath);
|
|
101
|
+
return [
|
|
102
|
+
{
|
|
103
|
+
file: relPath,
|
|
104
|
+
issue: "missing-name-or-type",
|
|
105
|
+
detail: `${missingFieldDetail}; suggested slug: ${slug}`,
|
|
106
|
+
fixed: false,
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
const invalidTypeDetail = checkInvalidTypeValue(data, allowedTypes);
|
|
111
|
+
if (invalidTypeDetail) {
|
|
112
|
+
return [{ file: relPath, issue: "missing-name-or-type", detail: invalidTypeDetail, fixed: false }];
|
|
113
|
+
}
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
// ── env dangerous-key scan (content-based port of env-key-rules.ts) ──────────
|
|
117
|
+
/** Matches a KEY=value assignment line, capturing only the key — `commands/env/env.ts:62`. */
|
|
118
|
+
const ASSIGN_RE = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/;
|
|
119
|
+
/** Port of `commands/env/env.ts#scanKeys` (`:65-77`) — content-based (overlay `raw`, not disk). */
|
|
120
|
+
function scanKeys(text) {
|
|
121
|
+
const keys = [];
|
|
122
|
+
const seen = new Set();
|
|
123
|
+
for (const line of text.split(/\r?\n/)) {
|
|
124
|
+
const m = line.match(ASSIGN_RE);
|
|
125
|
+
if (!m)
|
|
126
|
+
continue;
|
|
127
|
+
const key = m[1];
|
|
128
|
+
if (seen.has(key))
|
|
129
|
+
continue;
|
|
130
|
+
seen.add(key);
|
|
131
|
+
keys.push(key);
|
|
132
|
+
}
|
|
133
|
+
return keys;
|
|
134
|
+
}
|
|
135
|
+
/** Port of `env-key-rules.ts#collectSuppressedKeys` (`:144-164`) — content-based. */
|
|
136
|
+
function collectSuppressedKeys(raw) {
|
|
137
|
+
const suppressed = new Set();
|
|
138
|
+
const lines = raw.split(/\r?\n/);
|
|
139
|
+
let prevNonEmpty = "";
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
const trimmed = line.trim();
|
|
142
|
+
if (trimmed === "")
|
|
143
|
+
continue;
|
|
144
|
+
const keyMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=/);
|
|
145
|
+
if (keyMatch && prevNonEmpty.toLowerCase() === SUPPRESSION_COMMENT) {
|
|
146
|
+
suppressed.add(keyMatch[1]);
|
|
147
|
+
}
|
|
148
|
+
prevNonEmpty = trimmed;
|
|
149
|
+
}
|
|
150
|
+
return suppressed;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* env/secret dangerous-key scan (`lint/index.ts:191-218` + `env-key-rules.ts#checkEnvForDangerousKeys`),
|
|
154
|
+
* keyed on `type` and preserving the `.env`-suffix narrowness (see file header).
|
|
155
|
+
* Reads the overlay `raw`, not disk. `type`==="env" ⇒ ref prefix `env:`;
|
|
156
|
+
* `type`==="secret" ⇒ `secret:` (`lint/index.ts:201-204`).
|
|
157
|
+
*/
|
|
158
|
+
export function dangerousEnvKeyDiagnostics(type, relPath, raw) {
|
|
159
|
+
if (type !== "env" && type !== "secret")
|
|
160
|
+
return [];
|
|
161
|
+
const baseNameWithExt = path.basename(relPath);
|
|
162
|
+
if (!baseNameWithExt.endsWith(".env"))
|
|
163
|
+
return []; // NARROWNESS: collectEnvFiles only visits *.env
|
|
164
|
+
const refPrefix = type === "env" ? "env" : "secret";
|
|
165
|
+
const baseName = path.basename(relPath, ".env");
|
|
166
|
+
const ref = baseName === "" ? `${refPrefix}:.env` : `${refPrefix}:${baseName}`;
|
|
167
|
+
const keys = scanKeys(raw);
|
|
168
|
+
const suppressed = collectSuppressedKeys(raw);
|
|
169
|
+
const diagnostics = [];
|
|
170
|
+
for (const key of keys) {
|
|
171
|
+
if (!isDangerousEnvKey(key))
|
|
172
|
+
continue;
|
|
173
|
+
if (suppressed.has(key))
|
|
174
|
+
continue;
|
|
175
|
+
diagnostics.push({
|
|
176
|
+
file: relPath,
|
|
177
|
+
issue: "dangerous-env-key",
|
|
178
|
+
detail: `Env key \`${key}\` can be used to hijack process execution when injected via \`akm env run\`. Ref: ${ref}. Review this file before running \`akm env run\` commands against untrusted stashes. (suppress with: ${SUPPRESSION_COMMENT} on previous line)`,
|
|
179
|
+
fixed: false,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return diagnostics;
|
|
183
|
+
}
|
|
184
|
+
// ── skill directory check (SkillLinter.lintDirectory) ────────────────────────
|
|
185
|
+
/**
|
|
186
|
+
* Reproduce `SkillLinter.lintDirectory` (`skill-linter.ts:31-45`) in the
|
|
187
|
+
* change-set model: for a change under `skills/<name>/…`, emit `missing-skill-md`
|
|
188
|
+
* when `skills/<name>/SKILL.md` is absent from the overlay. `seen` dedups so a
|
|
189
|
+
* dir with multiple changed files reports once (matching the per-subdir call).
|
|
190
|
+
* `file`/`detail` mirror the live check exactly (relDir + `no SKILL.md in <relDir>/`).
|
|
191
|
+
*/
|
|
192
|
+
export async function skillDirectoryDiagnostics(relPath, seen, ctx) {
|
|
193
|
+
const segments = relPath
|
|
194
|
+
.replace(/\\/g, "/")
|
|
195
|
+
.split("/")
|
|
196
|
+
.filter((s) => s.length > 0);
|
|
197
|
+
if (segments.length < 3 || segments[0] !== "skills")
|
|
198
|
+
return []; // must be skills/<name>/<file…>
|
|
199
|
+
const skillDir = `${segments[0]}/${segments[1]}`;
|
|
200
|
+
if (seen.has(skillDir))
|
|
201
|
+
return [];
|
|
202
|
+
seen.add(skillDir);
|
|
203
|
+
const skillMd = await ctx.readFile(`${skillDir}/SKILL.md`);
|
|
204
|
+
if (skillMd !== null)
|
|
205
|
+
return [];
|
|
206
|
+
return [{ file: skillDir, issue: "missing-skill-md", detail: `no SKILL.md in ${skillDir}/`, fixed: false }];
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The winning `type`'s per-type EXTRA validate checks (base checks run
|
|
210
|
+
* separately in `akm-adapter.ts`). Async: memory's orphaned-stub sibling probe
|
|
211
|
+
* routes through `ctx`.
|
|
212
|
+
*/
|
|
213
|
+
export async function perTypeValidateChecks(args) {
|
|
214
|
+
const { type, relPath, raw, data, frontmatter, body, ext, ctx } = args;
|
|
215
|
+
switch (type) {
|
|
216
|
+
case "command":
|
|
217
|
+
return nameOrTypeDiagnostics(relPath, data, frontmatter, ["command"]);
|
|
218
|
+
case "agent":
|
|
219
|
+
return nameOrTypeDiagnostics(relPath, data, frontmatter, ["agent"]);
|
|
220
|
+
case "fact":
|
|
221
|
+
return factDiagnostics(relPath, data);
|
|
222
|
+
case "task":
|
|
223
|
+
return taskDiagnostics(relPath, data);
|
|
224
|
+
case "workflow":
|
|
225
|
+
// Unified workflows are markdown-only; other extensions are not a lint path.
|
|
226
|
+
return ext === ".md" ? workflowDiagnostics(relPath, raw, body) : [];
|
|
227
|
+
case "memory":
|
|
228
|
+
return memoryDiagnostics(relPath, data, body, ctx);
|
|
229
|
+
case "env":
|
|
230
|
+
case "secret":
|
|
231
|
+
return dangerousEnvKeyDiagnostics(type, relPath, raw);
|
|
232
|
+
default:
|
|
233
|
+
// knowledge / lesson / script / wiki / session → DefaultLinter (base only).
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** FactLinter extra check (`fact-linter.ts:23-44`). */
|
|
238
|
+
export function factDiagnostics(relPath, data) {
|
|
239
|
+
const category = typeof data.category === "string" ? data.category.trim() : "";
|
|
240
|
+
if (!category) {
|
|
241
|
+
return [
|
|
242
|
+
{
|
|
243
|
+
file: relPath,
|
|
244
|
+
issue: "missing-category",
|
|
245
|
+
detail: "fact is missing a `category` (personal|team|project|convention|meta)",
|
|
246
|
+
fixed: false,
|
|
247
|
+
},
|
|
248
|
+
];
|
|
249
|
+
}
|
|
250
|
+
if (!KNOWN_CATEGORIES.has(category)) {
|
|
251
|
+
return [
|
|
252
|
+
{
|
|
253
|
+
file: relPath,
|
|
254
|
+
issue: "missing-category",
|
|
255
|
+
detail: `unrecognized category "${category}" (expected one of: ${[...KNOWN_CATEGORIES].join(", ")})`,
|
|
256
|
+
fixed: false,
|
|
257
|
+
},
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
/** TaskLinter extra check (`task-linter.ts:25-58`). `data` is the parsed YAML. */
|
|
263
|
+
export function taskDiagnostics(relPath, data) {
|
|
264
|
+
if (data === null || Object.keys(data).length === 0)
|
|
265
|
+
return [];
|
|
266
|
+
const missing = [];
|
|
267
|
+
if (!("schedule" in data) || typeof data.schedule !== "string" || data.schedule.trim() === "") {
|
|
268
|
+
missing.push("schedule");
|
|
269
|
+
}
|
|
270
|
+
if (!("enabled" in data) || typeof data.enabled !== "boolean") {
|
|
271
|
+
missing.push("enabled (must be a boolean)");
|
|
272
|
+
}
|
|
273
|
+
const hasTarget = "prompt" in data || "workflow" in data || "command" in data;
|
|
274
|
+
if (!hasTarget)
|
|
275
|
+
missing.push("prompt, workflow, or command");
|
|
276
|
+
if (missing.length > 0) {
|
|
277
|
+
return [
|
|
278
|
+
{
|
|
279
|
+
file: relPath,
|
|
280
|
+
issue: "invalid-task-yaml",
|
|
281
|
+
detail: `missing required fields: ${missing.join(", ")}`,
|
|
282
|
+
fixed: false,
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
}
|
|
286
|
+
return [];
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* The first placeholder marker present in a workflow body, or `null`
|
|
290
|
+
* (`workflow-linter.ts:80-85` `#checkPlaceholderStub`). Shared with the live
|
|
291
|
+
* `akmLint --fix` path (`commands/lint/index.ts`) so the placeholder-stub RULE
|
|
292
|
+
* has ONE home; the caller decides fixability (validate flags, the CLI deletes).
|
|
293
|
+
*/
|
|
294
|
+
export function matchWorkflowPlaceholder(body) {
|
|
295
|
+
return PLACEHOLDER_STRINGS.find((p) => body.includes(p)) ?? null;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* WorkflowLinter's `invalid-workflow-structure` check (`workflow-linter.ts:48-77`):
|
|
299
|
+
* parse and compile through the unified workflow frontend, surfacing every
|
|
300
|
+
* structural or semantic error and skipping the read-only `/.cache/`+`/registry/`
|
|
301
|
+
* cached copies. Shared with the live linter;
|
|
302
|
+
* `parsePath` is the path handed to `parseWorkflow` (the adapter passes the
|
|
303
|
+
* change relPath, the CLI passes the absolute filePath — matching each caller's
|
|
304
|
+
* legacy behavior). NEVER writes.
|
|
305
|
+
*/
|
|
306
|
+
export function workflowStructureDiagnostics(relPath, raw, parsePath) {
|
|
307
|
+
if (parsePath.includes("/.cache/") || parsePath.includes("/registry/"))
|
|
308
|
+
return [];
|
|
309
|
+
const diagnostics = [];
|
|
310
|
+
try {
|
|
311
|
+
const result = parseWorkflow(raw, { path: parsePath });
|
|
312
|
+
if (!result.ok) {
|
|
313
|
+
for (const err of result.errors ?? []) {
|
|
314
|
+
diagnostics.push({
|
|
315
|
+
file: relPath,
|
|
316
|
+
issue: "invalid-workflow-structure",
|
|
317
|
+
detail: err.message ?? String(err),
|
|
318
|
+
fixed: false,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
return diagnostics;
|
|
322
|
+
}
|
|
323
|
+
const compiled = compileWorkflowPlan(result.document, path.basename(parsePath, path.extname(parsePath)));
|
|
324
|
+
if (!compiled.ok) {
|
|
325
|
+
for (const err of compiled.errors) {
|
|
326
|
+
diagnostics.push({
|
|
327
|
+
file: relPath,
|
|
328
|
+
issue: "invalid-workflow-structure",
|
|
329
|
+
detail: err.message,
|
|
330
|
+
fixed: false,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch (e) {
|
|
336
|
+
diagnostics.push({
|
|
337
|
+
file: relPath,
|
|
338
|
+
issue: "invalid-workflow-structure",
|
|
339
|
+
detail: `workflow parser error: ${e instanceof Error ? e.message : String(e)}`,
|
|
340
|
+
fixed: false,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return diagnostics;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* WorkflowLinter extra checks (`workflow-linter.ts:22-79`), READ-ONLY:
|
|
347
|
+
* `placeholder-stub` is NEVER deleted here (validate MUST NOT write) — emitted
|
|
348
|
+
* as a non-fixable Diagnostic. `invalid-workflow-structure` parses and compiles
|
|
349
|
+
* the whole `raw` through the unified workflow frontend.
|
|
350
|
+
*/
|
|
351
|
+
function workflowDiagnostics(relPath, raw, body) {
|
|
352
|
+
const diagnostics = [];
|
|
353
|
+
const placeholderMatch = matchWorkflowPlaceholder(body);
|
|
354
|
+
if (placeholderMatch) {
|
|
355
|
+
diagnostics.push({
|
|
356
|
+
file: relPath,
|
|
357
|
+
issue: "placeholder-stub",
|
|
358
|
+
detail: `placeholder text: "${placeholderMatch}"`,
|
|
359
|
+
fixed: false,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
diagnostics.push(...workflowStructureDiagnostics(relPath, raw, relPath));
|
|
363
|
+
return diagnostics;
|
|
364
|
+
}
|
|
365
|
+
/** The non-fixable orphaned-stub finding detail (`memory-linter.ts` no-fix branch). Shared with the live linter. */
|
|
366
|
+
export const ORPHANED_STUB_DETAIL = "inferenceProcessed stub with no derived sibling";
|
|
367
|
+
/**
|
|
368
|
+
* The CONTENT half of MemoryLinter's orphaned-stub predicate
|
|
369
|
+
* (`memory-linter.ts:67-73` `#isOrphanedStub`, minus the sibling probe):
|
|
370
|
+
* `inferenceProcessed: true` AND a body under 100 chars. The `.derived.md`
|
|
371
|
+
* sibling existence is I/O and is checked by the caller (the CLI via
|
|
372
|
+
* `fs.existsSync`, the adapter via `ctx.readFile`), so the RULE stays here while
|
|
373
|
+
* each caller supplies its own read.
|
|
374
|
+
*/
|
|
375
|
+
export function memoryOrphanStubApplies(data, body) {
|
|
376
|
+
return data.inferenceProcessed === true && body.trim().length < 100;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* MemoryLinter extra check (`memory-linter.ts:19-65`), READ-ONLY: the
|
|
380
|
+
* `orphaned-stub` DELETE fix is dropped (validate MUST NOT write) — emitted as
|
|
381
|
+
* a non-fixable Diagnostic. The `<name>.derived.md` sibling probe routes
|
|
382
|
+
* through `ctx.readFile` (overlay), not `fs.existsSync`.
|
|
383
|
+
*/
|
|
384
|
+
async function memoryDiagnostics(relPath, data, body, ctx) {
|
|
385
|
+
if (!memoryOrphanStubApplies(data, body))
|
|
386
|
+
return [];
|
|
387
|
+
const derivedPath = `${relPath.replace(/\.md$/, "")}.derived.md`;
|
|
388
|
+
const sibling = await ctx.readFile(derivedPath);
|
|
389
|
+
if (sibling !== null)
|
|
390
|
+
return [];
|
|
391
|
+
return [{ file: relPath, issue: "orphaned-stub", detail: ORPHANED_STUB_DETAIL, fixed: false }];
|
|
392
|
+
}
|