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,93 @@
|
|
|
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
|
+
const ENV_OPTIONS_WITH_OPERAND = new Set(["--argv0", "--chdir", "--unset"]);
|
|
5
|
+
const ENV_OPTIONS_WITH_OPTIONAL_VALUE = new Set(["--block-signal", "--default-signal", "--ignore-signal"]);
|
|
6
|
+
const ENV_OPTIONS_WITHOUT_OPERAND = new Set(["--debug", "--ignore-environment", "--list-signal-handling"]);
|
|
7
|
+
/** Locate a command whose executable position clearly names AKM, including an explicit path. */
|
|
8
|
+
export function findAkmExecutableIndex(command) {
|
|
9
|
+
if (command.length === 0)
|
|
10
|
+
return undefined;
|
|
11
|
+
const executableIndex = isEnvExecutable(command[0]) ? findEnvCommandIndex(command) : 0;
|
|
12
|
+
if (executableIndex === undefined || !isAkmExecutable(command[executableIndex]))
|
|
13
|
+
return undefined;
|
|
14
|
+
return executableIndex;
|
|
15
|
+
}
|
|
16
|
+
/** Locate only PATH-selected AKM, which is safe to redirect to the current installation. */
|
|
17
|
+
export function findBareAkmExecutableIndex(command) {
|
|
18
|
+
const executableIndex = findAkmExecutableIndex(command);
|
|
19
|
+
if (executableIndex === undefined || !isBareAkm(command[executableIndex]))
|
|
20
|
+
return undefined;
|
|
21
|
+
return executableIndex;
|
|
22
|
+
}
|
|
23
|
+
function findEnvCommandIndex(command) {
|
|
24
|
+
let index = 1;
|
|
25
|
+
while (index < command.length) {
|
|
26
|
+
const part = command[index];
|
|
27
|
+
if (part === "--") {
|
|
28
|
+
index += 1;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
if (isEnvironmentAssignment(part))
|
|
32
|
+
break;
|
|
33
|
+
if (!part.startsWith("-"))
|
|
34
|
+
break;
|
|
35
|
+
const operandCount = envOptionOperandCount(part);
|
|
36
|
+
if (operandCount === undefined || index + operandCount >= command.length)
|
|
37
|
+
return undefined;
|
|
38
|
+
index += operandCount + 1;
|
|
39
|
+
}
|
|
40
|
+
while (index < command.length && isEnvironmentAssignment(command[index]))
|
|
41
|
+
index += 1;
|
|
42
|
+
return index < command.length ? index : undefined;
|
|
43
|
+
}
|
|
44
|
+
function envOptionOperandCount(option) {
|
|
45
|
+
if (option === "-")
|
|
46
|
+
return 0;
|
|
47
|
+
if (ENV_OPTIONS_WITHOUT_OPERAND.has(option) || ENV_OPTIONS_WITH_OPTIONAL_VALUE.has(option))
|
|
48
|
+
return 0;
|
|
49
|
+
if ([...ENV_OPTIONS_WITH_OPTIONAL_VALUE].some((prefix) => option.startsWith(`${prefix}=`)))
|
|
50
|
+
return 0;
|
|
51
|
+
if (ENV_OPTIONS_WITH_OPERAND.has(option))
|
|
52
|
+
return 1;
|
|
53
|
+
if (["--argv0=", "--chdir=", "--unset="].some((prefix) => option.startsWith(prefix)))
|
|
54
|
+
return 0;
|
|
55
|
+
if (!option.startsWith("-") || option.startsWith("--"))
|
|
56
|
+
return undefined;
|
|
57
|
+
const shortOptions = option.slice(1);
|
|
58
|
+
for (let index = 0; index < shortOptions.length; index += 1) {
|
|
59
|
+
const flag = shortOptions[index];
|
|
60
|
+
if (flag === "i" || flag === "v")
|
|
61
|
+
continue;
|
|
62
|
+
if (flag === "S")
|
|
63
|
+
return undefined;
|
|
64
|
+
if (flag === "u" || flag === "C" || flag === "P" || flag === "a") {
|
|
65
|
+
return index === shortOptions.length - 1 ? 1 : 0;
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
return shortOptions.length > 0 ? 0 : undefined;
|
|
70
|
+
}
|
|
71
|
+
function isEnvironmentAssignment(value) {
|
|
72
|
+
return /^[A-Za-z_][A-Za-z0-9_]*=/.test(value);
|
|
73
|
+
}
|
|
74
|
+
function isEnvExecutable(value) {
|
|
75
|
+
if (!value)
|
|
76
|
+
return false;
|
|
77
|
+
if (value === "env")
|
|
78
|
+
return true;
|
|
79
|
+
if (!isAbsolutePath(value))
|
|
80
|
+
return false;
|
|
81
|
+
return /^env(?:\.exe)?$/i.test(value.split(/[\\/]/).at(-1) ?? "");
|
|
82
|
+
}
|
|
83
|
+
function isAbsolutePath(value) {
|
|
84
|
+
return value.startsWith("/") || value.startsWith("\\\\") || /^[A-Za-z]:[\\/]/.test(value);
|
|
85
|
+
}
|
|
86
|
+
function isBareAkm(value) {
|
|
87
|
+
return value !== undefined && /^akm(?:\.exe)?$/i.test(value);
|
|
88
|
+
}
|
|
89
|
+
function isAkmExecutable(value) {
|
|
90
|
+
if (!value)
|
|
91
|
+
return false;
|
|
92
|
+
return /^akm(?:\.exe)?$/i.test(value.split(/[\\/]/).at(-1) ?? "");
|
|
93
|
+
}
|
package/dist/tasks/embedded.js
CHANGED
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
* Embedded
|
|
5
|
+
* Embedded task templates.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* under `src/assets/tasks
|
|
7
|
+
* Curated sets of read-only YAML task templates ship inside the akm binary
|
|
8
|
+
* under `src/assets/tasks/<category>/` — `core/` (general-purpose maintenance)
|
|
9
|
+
* and `improve/` (the maintainer-oriented multi-cadence improve schedule,
|
|
10
|
+
* folded in from the retired `registerDefaultTasks`/`akm tasks init` path in
|
|
11
|
+
* 0.9, S6). Every category subdirectory is enumerated the same way; adding a
|
|
12
|
+
* new one needs no code change here. Templates are resolved at runtime via
|
|
9
13
|
* `import.meta.dir` (mirroring `SKELETON_DIR` in
|
|
10
14
|
* src/commands/stash-skeleton.ts) and are NOT written to any stash at
|
|
11
|
-
* install
|
|
12
|
-
*
|
|
15
|
+
* install time — the `akm setup` wizard copies a template into the primary
|
|
16
|
+
* stash only when the user opts in (copy-on-enable).
|
|
13
17
|
*
|
|
14
18
|
* Each entry exposes the parsed `command`, `schedule`, and `description`
|
|
15
19
|
* alongside the raw `yaml`, so the wizard can both render a choice and write
|
|
@@ -17,55 +21,69 @@
|
|
|
17
21
|
*/
|
|
18
22
|
import fs from "node:fs";
|
|
19
23
|
import path from "node:path";
|
|
20
|
-
import { parse as yamlParse } from "yaml";
|
|
21
24
|
import { getDirname } from "../runtime.js";
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
import { parseTaskDocument } from "./parser.js";
|
|
26
|
+
/** Directory holding the bundled task template categories. */
|
|
27
|
+
const TASKS_ASSETS_DIR = path.join(getDirname(import.meta.url), "../assets/tasks");
|
|
24
28
|
/**
|
|
25
|
-
* Enumerate the embedded
|
|
26
|
-
* directory. Sorted by id for deterministic
|
|
27
|
-
* if the directory is missing (defensive —
|
|
28
|
-
* crash the wizard).
|
|
29
|
+
* Enumerate the embedded task templates from every category subdirectory of
|
|
30
|
+
* the bundled assets directory. Sorted by category then id for deterministic
|
|
31
|
+
* ordering. Returns an empty array if the directory is missing (defensive —
|
|
32
|
+
* a build without assets should not crash the wizard).
|
|
29
33
|
*/
|
|
30
34
|
export function listEmbeddedTasks() {
|
|
31
|
-
let
|
|
35
|
+
let categories;
|
|
32
36
|
try {
|
|
33
|
-
|
|
37
|
+
categories = fs
|
|
38
|
+
.readdirSync(TASKS_ASSETS_DIR, { withFileTypes: true })
|
|
39
|
+
.filter((entry) => entry.isDirectory())
|
|
40
|
+
.map((entry) => entry.name)
|
|
41
|
+
.sort();
|
|
34
42
|
}
|
|
35
43
|
catch {
|
|
36
44
|
return [];
|
|
37
45
|
}
|
|
38
46
|
const tasks = [];
|
|
39
|
-
for (const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const id = entry.slice(0, -4);
|
|
43
|
-
const filePath = path.join(CORE_TASKS_DIR, entry);
|
|
44
|
-
let yaml;
|
|
47
|
+
for (const category of categories) {
|
|
48
|
+
const categoryDir = path.join(TASKS_ASSETS_DIR, category);
|
|
49
|
+
let entries;
|
|
45
50
|
try {
|
|
46
|
-
|
|
51
|
+
entries = fs.readdirSync(categoryDir);
|
|
47
52
|
}
|
|
48
53
|
catch {
|
|
49
54
|
continue;
|
|
50
55
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
for (const entry of entries.sort()) {
|
|
57
|
+
if (!entry.endsWith(".yml"))
|
|
58
|
+
continue;
|
|
59
|
+
const id = entry.slice(0, -4);
|
|
60
|
+
const filePath = path.join(categoryDir, entry);
|
|
61
|
+
let yaml;
|
|
62
|
+
try {
|
|
63
|
+
yaml = fs.readFileSync(filePath, "utf8");
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
let task;
|
|
69
|
+
try {
|
|
70
|
+
task = parseTaskDocument({ yaml, filePath, id });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (task.target.kind !== "command")
|
|
76
|
+
continue;
|
|
77
|
+
tasks.push({
|
|
78
|
+
id,
|
|
79
|
+
label: `${category}/${id}`,
|
|
80
|
+
command: task.target.cmd.join(" "),
|
|
81
|
+
schedule: task.schedule,
|
|
82
|
+
description: task.description ?? "",
|
|
83
|
+
enabled: task.enabled,
|
|
84
|
+
yaml,
|
|
85
|
+
});
|
|
57
86
|
}
|
|
58
|
-
const command = typeof doc.command === "string" ? doc.command : "";
|
|
59
|
-
const schedule = typeof doc.schedule === "string" ? doc.schedule : "";
|
|
60
|
-
const description = typeof doc.description === "string" ? doc.description : "";
|
|
61
|
-
tasks.push({
|
|
62
|
-
id,
|
|
63
|
-
label: `core/${id}`,
|
|
64
|
-
command,
|
|
65
|
-
schedule,
|
|
66
|
-
description,
|
|
67
|
-
yaml,
|
|
68
|
-
});
|
|
69
87
|
}
|
|
70
88
|
return tasks;
|
|
71
89
|
}
|
package/dist/tasks/parser.js
CHANGED
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
* ```yaml
|
|
10
10
|
* schedule: "0 9 * * *"
|
|
11
11
|
* # one of:
|
|
12
|
-
* workflow:
|
|
12
|
+
* workflow: workflows/daily-backup
|
|
13
13
|
* params:
|
|
14
14
|
* region: us-east-1
|
|
15
15
|
* # ...or:
|
|
16
|
-
* prompt:
|
|
16
|
+
* prompt: agents/my-agent # asset ref
|
|
17
17
|
* # ...or:
|
|
18
18
|
* prompt: ./prompts/my-prompt.md # relative file path
|
|
19
19
|
* # ...or:
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* Do the thing.
|
|
22
22
|
* And the other thing.
|
|
23
23
|
* # ...or:
|
|
24
|
-
* command: akm improve --
|
|
24
|
+
* command: akm improve --strategy quick --limit 25
|
|
25
25
|
* enabled: true # default true
|
|
26
26
|
* name: Daily backup
|
|
27
27
|
* description: …
|
|
@@ -29,16 +29,20 @@
|
|
|
29
29
|
* tags: [scheduled, backup]
|
|
30
30
|
* ```
|
|
31
31
|
*
|
|
32
|
-
* Validation lives in {@link validateTaskDocument}. The parser
|
|
33
|
-
* shape; cron syntax
|
|
32
|
+
* Validation lives in {@link validateTaskDocument}. The parser enforces the
|
|
33
|
+
* strict source shape; cron syntax and target reachability are
|
|
34
34
|
* checked separately so callers can choose how strictly to surface errors.
|
|
35
35
|
*/
|
|
36
36
|
import path from "node:path";
|
|
37
37
|
import { parse as parseYaml } from "yaml";
|
|
38
|
+
import { isFullRefInput } from "../core/asset/resolve-ref.js";
|
|
38
39
|
import { UsageError } from "../core/errors.js";
|
|
40
|
+
import { formatExtraParamsIssue, validateExtraParams } from "../core/extra-params.js";
|
|
39
41
|
import { TASK_SCHEMA_VERSION } from "./schema.js";
|
|
42
|
+
import { validateTaskId } from "./task-id.js";
|
|
40
43
|
export function parseTaskDocument(input) {
|
|
41
|
-
const { yaml, filePath
|
|
44
|
+
const { yaml, filePath } = input;
|
|
45
|
+
const id = validateTaskId(input.id);
|
|
42
46
|
let data;
|
|
43
47
|
try {
|
|
44
48
|
const parsed = parseYaml(yaml);
|
|
@@ -52,15 +56,17 @@ export function parseTaskDocument(input) {
|
|
|
52
56
|
throw err;
|
|
53
57
|
throw new UsageError(`Task "${id}" has invalid YAML: ${err instanceof Error ? err.message : String(err)}. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
54
58
|
}
|
|
55
|
-
|
|
59
|
+
requireVersion(data, id, filePath);
|
|
60
|
+
rejectUnknownKeys(data, id, filePath);
|
|
61
|
+
const schedule = requireString(data.schedule, "schedule", filePath);
|
|
56
62
|
if (!schedule) {
|
|
57
63
|
throw new UsageError(`Task "${id}" is missing a schedule (YAML key "schedule"). File: ${filePath}`, "MISSING_REQUIRED_ARGUMENT");
|
|
58
64
|
}
|
|
59
|
-
const enabled = data.enabled
|
|
60
|
-
const name =
|
|
61
|
-
const description =
|
|
62
|
-
const when_to_use =
|
|
63
|
-
const tags =
|
|
65
|
+
const enabled = readEnabled(data.enabled, filePath);
|
|
66
|
+
const name = optionalString(data.name, "name", filePath);
|
|
67
|
+
const description = optionalString(data.description, "description", filePath);
|
|
68
|
+
const when_to_use = optionalString(data.when_to_use, "when_to_use", filePath);
|
|
69
|
+
const tags = readTags(data.tags, filePath);
|
|
64
70
|
const hasWorkflow = "workflow" in data && data.workflow !== "" && data.workflow != null;
|
|
65
71
|
const hasPrompt = "prompt" in data && data.prompt !== "" && data.prompt != null;
|
|
66
72
|
const hasCommand = "command" in data && data.command !== "" && data.command != null;
|
|
@@ -73,7 +79,8 @@ export function parseTaskDocument(input) {
|
|
|
73
79
|
}
|
|
74
80
|
let target;
|
|
75
81
|
if (hasWorkflow) {
|
|
76
|
-
|
|
82
|
+
rejectTargetFields(data, ["params"], id, filePath);
|
|
83
|
+
const ref = requireString(data.workflow, "workflow", filePath);
|
|
77
84
|
if (!ref) {
|
|
78
85
|
throw new UsageError(`Task "${id}" has empty \`workflow\`. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
79
86
|
}
|
|
@@ -84,98 +91,146 @@ export function parseTaskDocument(input) {
|
|
|
84
91
|
};
|
|
85
92
|
}
|
|
86
93
|
else if (hasCommand) {
|
|
87
|
-
|
|
88
|
-
target = { kind: "command", cmd };
|
|
94
|
+
rejectTargetFields(data, ["timeoutMs"], id, filePath);
|
|
95
|
+
target = { kind: "command", cmd: readCommand(data.command, filePath, id) };
|
|
89
96
|
}
|
|
90
97
|
else {
|
|
91
|
-
|
|
98
|
+
rejectTargetFields(data, ["engine", "model", "timeoutMs", "llm"], id, filePath);
|
|
99
|
+
const promptRaw = requireString(data.prompt, "prompt", filePath);
|
|
92
100
|
if (!promptRaw) {
|
|
93
101
|
throw new UsageError(`Task "${id}" has empty \`prompt\`. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
94
102
|
}
|
|
95
|
-
const
|
|
103
|
+
const engine = optionalString(data.engine, "engine", filePath);
|
|
104
|
+
const model = optionalString(data.model, "model", filePath);
|
|
105
|
+
const timeoutMs = readTimeout(data.timeoutMs, filePath);
|
|
106
|
+
const llm = readLlmOverrides(data.llm, filePath);
|
|
96
107
|
target = {
|
|
97
108
|
kind: "prompt",
|
|
98
109
|
source: resolvePromptSource(promptRaw, filePath, id),
|
|
99
|
-
|
|
110
|
+
...(engine ? { engine } : {}),
|
|
111
|
+
...(model ? { model } : {}),
|
|
112
|
+
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
113
|
+
...(llm ? { llm } : {}),
|
|
100
114
|
};
|
|
101
115
|
}
|
|
102
|
-
|
|
103
|
-
// Omitted → undefined (inherits config.agent.timeoutMs).
|
|
104
|
-
let timeoutMs;
|
|
105
|
-
if ("timeoutMs" in data) {
|
|
106
|
-
const raw = data.timeoutMs;
|
|
107
|
-
if (raw === null || raw === "null" || raw === 0 || (typeof raw === "number" && raw < 0)) {
|
|
108
|
-
timeoutMs = null;
|
|
109
|
-
}
|
|
110
|
-
else if (typeof raw === "number" && raw > 0) {
|
|
111
|
-
timeoutMs = raw;
|
|
112
|
-
}
|
|
113
|
-
// non-numeric / unrecognised → leave as undefined (inherit)
|
|
114
|
-
}
|
|
116
|
+
const timeoutMs = hasCommand ? readTimeout(data.timeoutMs, filePath) : undefined;
|
|
115
117
|
return {
|
|
118
|
+
version: TASK_SCHEMA_VERSION,
|
|
116
119
|
schemaVersion: TASK_SCHEMA_VERSION,
|
|
117
120
|
id,
|
|
118
121
|
schedule,
|
|
119
122
|
enabled,
|
|
120
123
|
target,
|
|
121
|
-
name
|
|
122
|
-
description
|
|
123
|
-
when_to_use
|
|
124
|
-
tags
|
|
124
|
+
...(name ? { name } : {}),
|
|
125
|
+
...(description ? { description } : {}),
|
|
126
|
+
...(when_to_use ? { when_to_use } : {}),
|
|
127
|
+
...(tags ? { tags } : {}),
|
|
125
128
|
source: { path: filePath },
|
|
126
129
|
timeoutMs,
|
|
127
130
|
};
|
|
128
131
|
}
|
|
132
|
+
const TASK_KEYS = new Set([
|
|
133
|
+
"version",
|
|
134
|
+
"name",
|
|
135
|
+
"description",
|
|
136
|
+
"when_to_use",
|
|
137
|
+
"tags",
|
|
138
|
+
"schedule",
|
|
139
|
+
"enabled",
|
|
140
|
+
"workflow",
|
|
141
|
+
"prompt",
|
|
142
|
+
"command",
|
|
143
|
+
"params",
|
|
144
|
+
"engine",
|
|
145
|
+
"model",
|
|
146
|
+
"timeoutMs",
|
|
147
|
+
"llm",
|
|
148
|
+
]);
|
|
149
|
+
const SHARED_KEYS = new Set(["version", "name", "description", "when_to_use", "tags", "schedule", "enabled"]);
|
|
150
|
+
function requireVersion(data, id, filePath) {
|
|
151
|
+
if (data.version === TASK_SCHEMA_VERSION)
|
|
152
|
+
return;
|
|
153
|
+
const actual = data.version === undefined ? "missing" : JSON.stringify(data.version);
|
|
154
|
+
throw new UsageError(`TASK_SCHEMA_VERSION_UNSUPPORTED: Task "${id}" uses task schema version ${actual}; version: 2 is required. File: ${filePath}`, "TASK_SCHEMA_VERSION_UNSUPPORTED", "Use task schema version: 2.");
|
|
155
|
+
}
|
|
156
|
+
function rejectUnknownKeys(data, id, filePath) {
|
|
157
|
+
const unknown = Object.keys(data).filter((key) => !TASK_KEYS.has(key));
|
|
158
|
+
if (unknown.length > 0) {
|
|
159
|
+
throw new UsageError(`Task "${id}" has unknown key(s): ${unknown.join(", ")}. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function rejectTargetFields(data, allowed, id, filePath) {
|
|
163
|
+
const forbidden = Object.keys(data).filter((key) => !SHARED_KEYS.has(key) && !allowed.includes(key) && !["workflow", "prompt", "command"].includes(key));
|
|
164
|
+
if (forbidden.length > 0) {
|
|
165
|
+
throw new UsageError(`Task "${id}" has field(s) not valid for this target: ${forbidden.join(", ")}. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
129
168
|
/**
|
|
130
169
|
* Resolve a `prompt:` value into a {@link TaskPromptSource} variant.
|
|
131
170
|
*
|
|
132
|
-
* • "<
|
|
171
|
+
* • "[bundle//]<subdir>/<name>" (asset ref) → asset
|
|
133
172
|
* • "./foo.md", "../foo.md", "/abs" → file
|
|
134
173
|
* • "C:\\abs" (Windows absolute) → file
|
|
135
|
-
* • anything else (
|
|
174
|
+
* • anything else (including colon text and block scalars) → inline text
|
|
136
175
|
*/
|
|
137
176
|
function resolvePromptSource(raw, filePath, id) {
|
|
138
177
|
const trimmed = raw.trim();
|
|
178
|
+
if (!trimmed) {
|
|
179
|
+
throw new UsageError(`Task "${id}" has empty \`prompt\`. File: ${filePath}`, "MISSING_REQUIRED_ARGUMENT");
|
|
180
|
+
}
|
|
139
181
|
if (trimmed.startsWith("./") || trimmed.startsWith("../") || path.isAbsolute(trimmed)) {
|
|
140
182
|
return { kind: "file", path: trimmed };
|
|
141
183
|
}
|
|
142
184
|
if (/^[A-Za-z]:[\\/]/.test(trimmed)) {
|
|
143
185
|
return { kind: "file", path: trimmed };
|
|
144
186
|
}
|
|
145
|
-
|
|
187
|
+
// Canonical 0.9.0 asset ref: `[bundle//]<stash-subdir>/<name>`. Detection is
|
|
188
|
+
// delegated to the canonical parser (never a hand-rolled regex) — only a
|
|
189
|
+
// conceptId whose leading segment is a real stash subdir counts as a ref; a
|
|
190
|
+
// bare `word/word` inline prompt (no known subdir) stays inline text (D-R3).
|
|
191
|
+
if (isFullRefInput(trimmed)) {
|
|
146
192
|
return { kind: "asset", ref: trimmed };
|
|
147
193
|
}
|
|
148
|
-
if (!trimmed) {
|
|
149
|
-
throw new UsageError(`Task "${id}" has empty \`prompt\`. File: ${filePath}`, "MISSING_REQUIRED_ARGUMENT");
|
|
150
|
-
}
|
|
151
194
|
return { kind: "inline", text: trimmed };
|
|
152
195
|
}
|
|
153
|
-
function
|
|
196
|
+
function optionalString(value, key, filePath) {
|
|
154
197
|
if (value === undefined || value === null)
|
|
155
198
|
return undefined;
|
|
156
199
|
if (typeof value === "string")
|
|
157
|
-
return value
|
|
158
|
-
if (typeof value === "number" || typeof value === "boolean")
|
|
159
|
-
return String(value);
|
|
200
|
+
return value;
|
|
160
201
|
throw new UsageError(`Key "${key}" must be a string. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
161
202
|
}
|
|
162
|
-
function
|
|
203
|
+
function requireString(value, key, filePath) {
|
|
204
|
+
const result = optionalString(value, key, filePath);
|
|
205
|
+
if (result === undefined || result.length === 0) {
|
|
206
|
+
throw new UsageError(`Key "${key}" must be a non-empty string. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
207
|
+
}
|
|
208
|
+
return result;
|
|
209
|
+
}
|
|
210
|
+
function readEnabled(value, filePath) {
|
|
211
|
+
if (value === undefined)
|
|
212
|
+
return true;
|
|
213
|
+
if (typeof value !== "boolean")
|
|
214
|
+
throw new UsageError(`Key "enabled" must be a boolean. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
215
|
+
return value;
|
|
216
|
+
}
|
|
217
|
+
function readTags(value, filePath) {
|
|
163
218
|
if (value === undefined || value === null)
|
|
164
219
|
return undefined;
|
|
165
|
-
if (typeof value === "string") {
|
|
166
|
-
return value
|
|
167
|
-
.split(/[\s,]+/)
|
|
168
|
-
.map((s) => s.trim())
|
|
169
|
-
.filter(Boolean);
|
|
170
|
-
}
|
|
171
220
|
if (Array.isArray(value)) {
|
|
172
|
-
|
|
221
|
+
if (!value.every((entry) => typeof entry === "string" && entry.length > 0)) {
|
|
222
|
+
throw new UsageError(`Key "tags" must be an array of non-empty strings. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
223
|
+
}
|
|
224
|
+
return value;
|
|
173
225
|
}
|
|
174
|
-
|
|
226
|
+
throw new UsageError(`Key "tags" must be an array of strings. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
175
227
|
}
|
|
176
228
|
function readCommand(value, filePath, id) {
|
|
177
229
|
if (Array.isArray(value)) {
|
|
178
|
-
|
|
230
|
+
if (!value.every((entry) => typeof entry === "string" && entry.length > 0)) {
|
|
231
|
+
throw new UsageError(`Task "${id}" command array must contain non-empty strings. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
232
|
+
}
|
|
233
|
+
const parts = value;
|
|
179
234
|
if (parts.length === 0) {
|
|
180
235
|
throw new UsageError(`Task "${id}" has empty \`command\` array. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
181
236
|
}
|
|
@@ -196,16 +251,53 @@ function readParams(value, filePath) {
|
|
|
196
251
|
if (typeof value === "object" && !Array.isArray(value)) {
|
|
197
252
|
return value;
|
|
198
253
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
254
|
+
throw new UsageError(`Key "params" must be a mapping. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
255
|
+
}
|
|
256
|
+
function readTimeout(value, filePath) {
|
|
257
|
+
if (value === undefined)
|
|
258
|
+
return undefined;
|
|
259
|
+
if (value === null)
|
|
260
|
+
return null;
|
|
261
|
+
if (typeof value === "number" && Number.isInteger(value) && value > 0)
|
|
262
|
+
return value;
|
|
263
|
+
throw new UsageError(`Key "timeoutMs" must be a positive integer or null. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
264
|
+
}
|
|
265
|
+
function readLlmOverrides(value, filePath) {
|
|
266
|
+
if (value === undefined)
|
|
267
|
+
return undefined;
|
|
268
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
269
|
+
throw new UsageError(`Key "llm" must be a mapping. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
270
|
+
}
|
|
271
|
+
const data = value;
|
|
272
|
+
const allowed = new Set([
|
|
273
|
+
"temperature",
|
|
274
|
+
"maxTokens",
|
|
275
|
+
"supportsJsonSchema",
|
|
276
|
+
"extraParams",
|
|
277
|
+
"contextLength",
|
|
278
|
+
"enableThinking",
|
|
279
|
+
]);
|
|
280
|
+
const unknown = Object.keys(data).filter((key) => !allowed.has(key));
|
|
281
|
+
if (unknown.length)
|
|
282
|
+
throw new UsageError(`Key "llm" has unknown field(s): ${unknown.join(", ")}. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
283
|
+
if (data.temperature !== undefined && (typeof data.temperature !== "number" || !Number.isFinite(data.temperature))) {
|
|
284
|
+
throw new UsageError(`Key "llm.temperature" must be a finite number. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
285
|
+
}
|
|
286
|
+
for (const key of ["maxTokens", "contextLength"]) {
|
|
287
|
+
if (data[key] !== undefined && (!Number.isInteger(data[key]) || data[key] <= 0)) {
|
|
288
|
+
throw new UsageError(`Key "llm.${key}" must be a positive integer. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
for (const key of ["supportsJsonSchema", "enableThinking"]) {
|
|
292
|
+
if (data[key] !== undefined && typeof data[key] !== "boolean") {
|
|
293
|
+
throw new UsageError(`Key "llm.${key}" must be a boolean. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
205
294
|
}
|
|
206
|
-
|
|
207
|
-
|
|
295
|
+
}
|
|
296
|
+
if (data.extraParams !== undefined) {
|
|
297
|
+
const issue = validateExtraParams(data.extraParams)[0];
|
|
298
|
+
if (issue) {
|
|
299
|
+
throw new UsageError(`${formatExtraParamsIssue('Key "llm.extraParams"', issue)}. File: ${filePath}`, "INVALID_FLAG_VALUE");
|
|
208
300
|
}
|
|
209
301
|
}
|
|
210
|
-
|
|
302
|
+
return data;
|
|
211
303
|
}
|