akm-cli 0.9.0-rc.1 → 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 +1190 -52
- 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/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 +13 -9
- package/dist/commands/env/env-cli.js +76 -159
- 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/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 +75 -228
- 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 -855
- 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/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 -73
- 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 -58
- 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 +8 -3
- package/dist/integrations/agent/profiles.js +6 -99
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +78 -13
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +48 -279
- package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
- package/dist/integrations/harnesses/aider/index.js +2 -12
- package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
- package/dist/integrations/harnesses/amazonq/index.js +3 -17
- package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +1 -14
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
- package/dist/integrations/harnesses/codex/index.js +2 -13
- package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
- package/dist/integrations/harnesses/copilot/index.js +1 -13
- package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
- package/dist/integrations/harnesses/gemini/index.js +1 -13
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +31 -33
- 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 +1 -18
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
- package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
- package/dist/integrations/harnesses/openhands/index.js +2 -12
- package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
- package/dist/integrations/harnesses/pi/index.js +3 -16
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +38 -34
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +24 -40
- 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 +15 -281
- 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 +8 -40
- 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 -1375
- 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 +1 -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 +68 -35
- 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/workflows/authoring/authoring.js +96 -148
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -20
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +25 -59
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +157 -94
- package/dist/workflows/exec/report.js +365 -200
- package/dist/workflows/exec/run-workflow.js +46 -40
- package/dist/workflows/exec/scheduler.js +12 -41
- package/dist/workflows/exec/step-work.js +239 -205
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/ir/compile.js +141 -283
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/plan-hash.js +40 -5
- package/dist/workflows/ir/schema.js +537 -1
- package/dist/workflows/parser.js +878 -306
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +99 -121
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +200 -113
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +4 -26
- 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/{dist/schemas → schemas}/akm-workflow.json +127 -82
- 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 -316
- 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 -1414
- 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 -25
- 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/schemas/akm-config.json +0 -14225
- package/dist/scripts/migrate-storage.js +0 -13169
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
- 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/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/db.js +0 -350
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -760
- package/dist/workflows/program/project.js +0 -105
- package/docs/data-and-telemetry.md +0 -227
- package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -7,37 +7,37 @@
|
|
|
7
7
|
* args/output shape are byte-identical. Handlers whose body is a plain
|
|
8
8
|
* `runWithJsonErrors(...) + output(...)` are migrated to `defineJsonCommand`,
|
|
9
9
|
* which emits the same JSON envelope (stdout/stderr/exit-code) as the inline
|
|
10
|
-
* form.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* form.
|
|
11
|
+
*
|
|
12
|
+
* 0.9.0 CLI overhaul (S5): `workflow template` is dropped — `workflow create
|
|
13
|
+
* --print` prints the same content without writing. `workflow validate` is
|
|
14
|
+
* dropped — `akm lint --type workflows` covers structural validation.
|
|
15
|
+
* `workflow watch` is dropped — poll `akm log --since '@offset:<id>' --run
|
|
16
|
+
* <run-id>` instead. Workflows are markdown-only (workflow-format-
|
|
17
|
+
* unification) — `workflow create <name>.yaml` is a usage error.
|
|
13
18
|
*/
|
|
14
|
-
import {
|
|
19
|
+
import { getParsedInvocation } from "../cli/invocation.js";
|
|
15
20
|
import { getStringArg } from "../cli/parse-args.js";
|
|
16
|
-
import { defineJsonCommand, output
|
|
21
|
+
import { defineGroupCommand, defineJsonCommand, output } from "../cli/shared.js";
|
|
17
22
|
import { assertFlatAssetName, combineCreatePath, normalizeCreateSubPath } from "../core/asset/asset-create.js";
|
|
18
|
-
import { parseAssetRef } from "../core/asset/asset-ref.js";
|
|
19
23
|
import { loadConfig } from "../core/config/config.js";
|
|
20
24
|
import { NotFoundError, UsageError } from "../core/errors.js";
|
|
21
25
|
import { akmIndex } from "../indexer/indexer.js";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import { createWorkflowAsset, formatWorkflowErrors, getWorkflowProgramTemplate, getWorkflowTemplate, validateWorkflowProgramSource, validateWorkflowSource, } from "../workflows/authoring/authoring.js";
|
|
27
|
-
import { hasWorkflowSubcommand, parseWorkflowJsonObject, parseWorkflowStepState, WORKFLOW_STEP_STATES, } from "../workflows/cli.js";
|
|
28
|
-
import { isWorkflowProgramPath } from "../workflows/program/project.js";
|
|
29
|
-
import { abandonWorkflowRun, completeWorkflowStep, getNextWorkflowStep, getWorkflowStatus, listWorkflowRuns, resumeWorkflowRun, startWorkflowRun, } from "../workflows/runtime/runs.js";
|
|
26
|
+
import { assertWorkflowMarkdownName, createWorkflowAsset, getWorkflowTemplate } from "../workflows/authoring/authoring.js";
|
|
27
|
+
import { parseWorkflowJsonObject, parseWorkflowStepState, WORKFLOW_STEP_STATES } from "../workflows/cli.js";
|
|
28
|
+
import { requireWorkflowEngineEnabled } from "../workflows/exec/workflow-engine-gate.js";
|
|
29
|
+
import { abandonWorkflowRun, completeWorkflowStep, getNextWorkflowStep, getWorkflowStatus, hasWorkflowRun, listWorkflowRuns, resumeWorkflowRun, startWorkflowRun, } from "../workflows/runtime/runs.js";
|
|
30
30
|
const workflowStartCommand = defineJsonCommand({
|
|
31
31
|
meta: {
|
|
32
32
|
name: "start",
|
|
33
33
|
description: "Start a new workflow run in the current working scope",
|
|
34
34
|
},
|
|
35
35
|
args: {
|
|
36
|
-
ref: { type: "positional", description: "Workflow ref (
|
|
36
|
+
ref: { type: "positional", description: "Workflow ref (workflows/<name>)", required: true },
|
|
37
37
|
params: { type: "string", description: "Workflow parameters as a JSON object" },
|
|
38
38
|
force: {
|
|
39
39
|
type: "boolean",
|
|
40
|
-
description: "Allow a parallel run when an active run already exists in this scope
|
|
40
|
+
description: "Allow a parallel run when an active run already exists in this scope",
|
|
41
41
|
default: false,
|
|
42
42
|
},
|
|
43
43
|
},
|
|
@@ -59,45 +59,17 @@ const workflowNextCommand = defineJsonCommand({
|
|
|
59
59
|
},
|
|
60
60
|
async run({ args }) {
|
|
61
61
|
// `--dry-run` is intentionally NOT a declared arg (so it stays out of
|
|
62
|
-
// --help). The guard reads it straight from
|
|
63
|
-
// callers still get a clear, actionable error instead of a
|
|
64
|
-
// "unknown flag" from citty.
|
|
65
|
-
if (
|
|
62
|
+
// --help). The guard reads it straight from the invocation singleton so
|
|
63
|
+
// existing callers still get a clear, actionable error instead of a
|
|
64
|
+
// generic "unknown flag" from citty.
|
|
65
|
+
if (getParsedInvocation().hasFlag("--dry-run")) {
|
|
66
66
|
throw new UsageError("`akm workflow next` does not support --dry-run. Remove the flag to start or resume a run.", "INVALID_FLAG_VALUE");
|
|
67
67
|
}
|
|
68
68
|
const parsedParams = args.params ? parseWorkflowJsonObject(args.params, "--params") : undefined;
|
|
69
|
-
// If the target looks like a UUID-style run id (no `:` and matches the
|
|
70
|
-
// run-id shape), short-circuit with a structured WORKFLOW_NOT_FOUND
|
|
71
|
-
// error before parseAssetRef gets to throw an unhelpful ref-parse error.
|
|
72
|
-
if (looksLikeWorkflowRunId(args.target)) {
|
|
73
|
-
const { hasWorkflowRun } = await import("../workflows/runtime/runs.js");
|
|
74
|
-
if (!(await hasWorkflowRun(args.target))) {
|
|
75
|
-
throw new NotFoundError(`Workflow run "${args.target}" not found.`, "WORKFLOW_NOT_FOUND", "Run `akm workflow list --active` to see runs.");
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
69
|
const result = await getNextWorkflowStep(args.target, parsedParams);
|
|
79
70
|
output("workflow-next", result);
|
|
80
71
|
},
|
|
81
72
|
});
|
|
82
|
-
/**
|
|
83
|
-
* Heuristic: a workflow run id is a UUID-shaped or hex-id-shaped string with
|
|
84
|
-
* no `:` separator (refs always contain a colon: `workflow:<name>` or
|
|
85
|
-
* `<origin>//workflow:<name>`). When this matches we can give a much better
|
|
86
|
-
* error than parseAssetRef's "Invalid asset type" failure.
|
|
87
|
-
*/
|
|
88
|
-
function looksLikeWorkflowRunId(target) {
|
|
89
|
-
if (target.includes(":"))
|
|
90
|
-
return false;
|
|
91
|
-
if (target.includes("/"))
|
|
92
|
-
return false;
|
|
93
|
-
// UUID v4-ish: 8-4-4-4-12 hex digits separated by dashes.
|
|
94
|
-
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(target))
|
|
95
|
-
return true;
|
|
96
|
-
// Bare hex/alphanumeric run ids of >=8 chars (covers shortened ids).
|
|
97
|
-
if (/^[0-9a-z][0-9a-z_-]{7,}$/i.test(target) && /[0-9]/.test(target))
|
|
98
|
-
return true;
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
73
|
const workflowCompleteCommand = defineJsonCommand({
|
|
102
74
|
meta: {
|
|
103
75
|
name: "complete",
|
|
@@ -141,42 +113,37 @@ const workflowStatusCommand = defineJsonCommand({
|
|
|
141
113
|
description: "Show full workflow run state for review or resume; workflow refs resolve within the current scope",
|
|
142
114
|
},
|
|
143
115
|
args: {
|
|
144
|
-
target: { type: "positional", description: "Workflow run id or workflow ref (
|
|
116
|
+
target: { type: "positional", description: "Workflow run id or workflow ref (workflows/<name>)", required: true },
|
|
145
117
|
units: {
|
|
146
118
|
type: "boolean",
|
|
147
119
|
description: "Also list per-unit rows from the run journal (unit id, status, failure_reason, and any result/error " +
|
|
148
|
-
"diagnostic text). Diagnostics only — step evidence stays deterministic and is unaffected
|
|
120
|
+
"diagnostic text). Diagnostics only — step evidence stays deterministic and is unaffected.",
|
|
149
121
|
default: false,
|
|
150
122
|
},
|
|
151
123
|
},
|
|
152
124
|
async run({ args }) {
|
|
153
125
|
const target = args.target;
|
|
154
126
|
const includeUnits = args.units === true;
|
|
155
|
-
|
|
156
|
-
const parsed = (() => {
|
|
157
|
-
try {
|
|
158
|
-
return parseAssetRef(target);
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
})();
|
|
164
|
-
if (parsed?.type === "workflow") {
|
|
165
|
-
const ref = `${parsed.origin ? `${parsed.origin}//` : ""}workflow:${parsed.name}`;
|
|
166
|
-
const { runs } = await listWorkflowRuns({ workflowRef: ref });
|
|
167
|
-
if (runs.length === 0) {
|
|
168
|
-
throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
|
|
169
|
-
}
|
|
170
|
-
const mostRecent = runs[0];
|
|
171
|
-
if (!mostRecent)
|
|
172
|
-
throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
|
|
173
|
-
const result = await getWorkflowStatus(mostRecent.id, { includeUnits });
|
|
174
|
-
output("workflow-status", result);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
127
|
+
if (await hasWorkflowRun(target)) {
|
|
177
128
|
const result = await getWorkflowStatus(target, { includeUnits });
|
|
178
129
|
output("workflow-status", result);
|
|
130
|
+
return;
|
|
179
131
|
}
|
|
132
|
+
let runs;
|
|
133
|
+
try {
|
|
134
|
+
({ runs } = await listWorkflowRuns({ workflowRef: target }));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (!target.includes(":") && !target.includes("/")) {
|
|
138
|
+
throw new NotFoundError(`Workflow run "${target}" not found.`, "WORKFLOW_NOT_FOUND");
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
const mostRecent = runs[0];
|
|
143
|
+
if (!mostRecent)
|
|
144
|
+
throw new NotFoundError(`No workflow runs found for ${target}`, "WORKFLOW_NOT_FOUND");
|
|
145
|
+
const result = await getWorkflowStatus(mostRecent.id, { includeUnits });
|
|
146
|
+
output("workflow-status", result);
|
|
180
147
|
},
|
|
181
148
|
});
|
|
182
149
|
const workflowListCommand = defineJsonCommand({
|
|
@@ -196,12 +163,12 @@ const workflowListCommand = defineJsonCommand({
|
|
|
196
163
|
const workflowCreateCommand = defineJsonCommand({
|
|
197
164
|
meta: {
|
|
198
165
|
name: "create",
|
|
199
|
-
description: "Create a workflow
|
|
166
|
+
description: "Create a workflow (markdown document) in the working bundle",
|
|
200
167
|
},
|
|
201
168
|
args: {
|
|
202
169
|
name: {
|
|
203
170
|
type: "positional",
|
|
204
|
-
description: "Workflow name (flat, no '/'; use --path for a subdirectory).
|
|
171
|
+
description: "Workflow name (flat, no '/'; use --path for a subdirectory).",
|
|
205
172
|
required: true,
|
|
206
173
|
},
|
|
207
174
|
path: {
|
|
@@ -210,7 +177,7 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
210
177
|
},
|
|
211
178
|
from: {
|
|
212
179
|
type: "string",
|
|
213
|
-
description: "Import and validate content from an existing file
|
|
180
|
+
description: "Import and validate content from an existing file",
|
|
214
181
|
},
|
|
215
182
|
force: {
|
|
216
183
|
type: "boolean",
|
|
@@ -222,6 +189,11 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
222
189
|
description: "Explicitly replace an existing workflow with a fresh template (use with --force)",
|
|
223
190
|
default: false,
|
|
224
191
|
},
|
|
192
|
+
print: {
|
|
193
|
+
type: "boolean",
|
|
194
|
+
description: "Print the RAW template that would be written to stdout without creating anything — pipe it to a file as a starter document",
|
|
195
|
+
default: false,
|
|
196
|
+
},
|
|
225
197
|
},
|
|
226
198
|
async run({ args }) {
|
|
227
199
|
// `name` is flat; subdirectory placement is `--path`'s job.
|
|
@@ -231,6 +203,14 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
231
203
|
if (!namePattern.test(effectiveName)) {
|
|
232
204
|
throw new UsageError("Workflow name must start with a lowercase letter or digit and contain only lowercase letters, digits, hyphens, dots, underscores, and slashes.");
|
|
233
205
|
}
|
|
206
|
+
assertWorkflowMarkdownName(effectiveName);
|
|
207
|
+
if (args.print) {
|
|
208
|
+
// Raw document, not an envelope — the retired `workflow template` was
|
|
209
|
+
// format-exempt for the same reason: `--print > starter.md` must yield
|
|
210
|
+
// a usable starter file, not `{ok,template,kind}` JSON.
|
|
211
|
+
process.stdout.write(getWorkflowTemplate());
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
234
214
|
if (args.force && !args.from && !args.reset) {
|
|
235
215
|
throw new UsageError("Refusing to overwrite with template: pass --from <file> to replace content, or --reset to explicitly replace with a fresh template.");
|
|
236
216
|
}
|
|
@@ -246,117 +226,20 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
246
226
|
output("workflow-create", { ok: true, ...result });
|
|
247
227
|
},
|
|
248
228
|
});
|
|
249
|
-
const workflowTemplateCommand = defineCommand({
|
|
250
|
-
meta: {
|
|
251
|
-
name: "template",
|
|
252
|
-
description: "Print a valid workflow template (markdown by default, --yaml for a YAML program)",
|
|
253
|
-
},
|
|
254
|
-
args: {
|
|
255
|
-
yaml: {
|
|
256
|
-
type: "boolean",
|
|
257
|
-
description: "Print a minimal valid YAML workflow program instead of the markdown template",
|
|
258
|
-
default: false,
|
|
259
|
-
},
|
|
260
|
-
},
|
|
261
|
-
run({ args }) {
|
|
262
|
-
process.stdout.write(args.yaml ? getWorkflowProgramTemplate() : getWorkflowTemplate());
|
|
263
|
-
},
|
|
264
|
-
});
|
|
265
|
-
const workflowValidateCommand = defineJsonCommand({
|
|
266
|
-
meta: {
|
|
267
|
-
name: "validate",
|
|
268
|
-
description: "Validate a workflow file or ref (markdown document or YAML program) and print any errors",
|
|
269
|
-
},
|
|
270
|
-
args: {
|
|
271
|
-
target: {
|
|
272
|
-
type: "positional",
|
|
273
|
-
description: "Workflow ref (workflow:<name>) or filesystem path to a workflow .md/.yaml",
|
|
274
|
-
required: true,
|
|
275
|
-
},
|
|
276
|
-
},
|
|
277
|
-
async run({ args }) {
|
|
278
|
-
const filePath = await resolveWorkflowFilePath(args.target);
|
|
279
|
-
// YAML programs (redesign addendum, R1) validate through the program
|
|
280
|
-
// parser AND compiler so expression/reference errors surface at lint
|
|
281
|
-
// time; both error lists carry line numbers. Markdown is unchanged.
|
|
282
|
-
if (isWorkflowProgramPath(filePath)) {
|
|
283
|
-
const { result } = validateWorkflowProgramSource(filePath);
|
|
284
|
-
if (!result.ok) {
|
|
285
|
-
throw new UsageError(formatWorkflowErrors(filePath, result.errors));
|
|
286
|
-
}
|
|
287
|
-
// Non-fatal WARNINGS ride the envelope additively — `ok` stays true. The
|
|
288
|
-
// text formatter renders them clearly marked for humans; the JSON key is
|
|
289
|
-
// the machine channel. Empty array when the program is fully typed/declared.
|
|
290
|
-
output("workflow-validate", {
|
|
291
|
-
ok: true,
|
|
292
|
-
path: filePath,
|
|
293
|
-
format: "program",
|
|
294
|
-
title: result.program.name,
|
|
295
|
-
stepCount: result.program.steps.length,
|
|
296
|
-
warnings: result.warnings.map((w) => ({ line: w.line, message: w.message })),
|
|
297
|
-
});
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
const { parse } = validateWorkflowSource(filePath);
|
|
301
|
-
if (parse.ok) {
|
|
302
|
-
output("workflow-validate", {
|
|
303
|
-
ok: true,
|
|
304
|
-
path: filePath,
|
|
305
|
-
title: parse.document.title,
|
|
306
|
-
stepCount: parse.document.steps.length,
|
|
307
|
-
});
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
throw new UsageError(formatWorkflowErrors(filePath, parse.errors));
|
|
311
|
-
},
|
|
312
|
-
});
|
|
313
|
-
async function resolveWorkflowFilePath(target) {
|
|
314
|
-
// A bare (`workflow:<name>`) OR origin-qualified (`<origin>//workflow:<name>`)
|
|
315
|
-
// ref resolves through the source search, exactly like `workflow start` /
|
|
316
|
-
// `status` / `next`. Anything else is treated as a filesystem path. Detecting
|
|
317
|
-
// the origin-qualified form here (not just the bare prefix) keeps `validate`'s
|
|
318
|
-
// ref contract in lockstep with the rest of the workflow command family — an
|
|
319
|
-
// `extra//workflow:foo` ref validates the file that `extra//workflow:foo`
|
|
320
|
-
// starts, rather than being mistaken for a relative path that does not exist.
|
|
321
|
-
const looksLikeWorkflowRef = target.startsWith("workflow:") || target.includes("//workflow:");
|
|
322
|
-
if (!looksLikeWorkflowRef)
|
|
323
|
-
return target;
|
|
324
|
-
const parsed = parseAssetRef(target);
|
|
325
|
-
if (parsed.type !== "workflow") {
|
|
326
|
-
throw new UsageError(`Expected a workflow ref (workflow:<name>), got "${target}".`);
|
|
327
|
-
}
|
|
328
|
-
const config = loadConfig();
|
|
329
|
-
const allSources = resolveSourceEntries(undefined, config);
|
|
330
|
-
const searchSources = resolveSourcesForOrigin(parsed.origin, allSources);
|
|
331
|
-
for (const source of searchSources) {
|
|
332
|
-
try {
|
|
333
|
-
return await resolveAssetPath(source.path, "workflow", parsed.name);
|
|
334
|
-
}
|
|
335
|
-
catch {
|
|
336
|
-
/* try next source */
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
throw new UsageError(`Workflow not found for ref: workflow:${parsed.name}`);
|
|
340
|
-
}
|
|
341
229
|
const workflowRunCommand = defineJsonCommand({
|
|
342
230
|
meta: {
|
|
343
231
|
name: "run",
|
|
344
|
-
description: "EXPERIMENTAL
|
|
345
|
-
"(fan-out, schema output) to the configured runner and advances
|
|
232
|
+
description: "EXPERIMENTAL, gated behind `experimental.workflowEngine`: execute a workflow's steps with the native " +
|
|
233
|
+
"engine — akm dispatches each step's units (fan-out, schema output) to the configured runner and advances " +
|
|
234
|
+
"the run through the normal completion gates",
|
|
346
235
|
},
|
|
347
236
|
args: {
|
|
348
237
|
target: { type: "positional", description: "Workflow run id or workflow ref (auto-starts a run)", required: true },
|
|
349
238
|
params: { type: "string", description: "Workflow parameters as a JSON object (only for auto-started runs)" },
|
|
350
239
|
"max-steps": { type: "string", description: "Stop after executing this many steps" },
|
|
351
|
-
"require-gates": {
|
|
352
|
-
type: "boolean",
|
|
353
|
-
description: "Treat every criteria-bearing completion gate as required: if no LLM judge is available, BLOCK the step " +
|
|
354
|
-
"(for a human to resolve via `akm workflow resume`) instead of failing open. A per-step `gate.required: true` " +
|
|
355
|
-
"in the workflow does the same on every surface; this is the run-wide override (#18).",
|
|
356
|
-
default: false,
|
|
357
|
-
},
|
|
358
240
|
},
|
|
359
241
|
async run({ args }) {
|
|
242
|
+
requireWorkflowEngineEnabled(loadConfig(), "run");
|
|
360
243
|
const { runWorkflowSteps } = await import("../workflows/exec/run-workflow.js");
|
|
361
244
|
const rawMaxSteps = getStringArg(args, "max-steps");
|
|
362
245
|
let maxSteps;
|
|
@@ -370,7 +253,6 @@ const workflowRunCommand = defineJsonCommand({
|
|
|
370
253
|
target: args.target,
|
|
371
254
|
...(args.params ? { params: parseWorkflowJsonObject(args.params, "--params") } : {}),
|
|
372
255
|
...(maxSteps !== undefined ? { maxSteps } : {}),
|
|
373
|
-
...(args["require-gates"] === true ? { requireGates: true } : {}),
|
|
374
256
|
});
|
|
375
257
|
output("workflow-run", result);
|
|
376
258
|
},
|
|
@@ -378,9 +260,10 @@ const workflowRunCommand = defineJsonCommand({
|
|
|
378
260
|
const workflowBriefCommand = defineJsonCommand({
|
|
379
261
|
meta: {
|
|
380
262
|
name: "brief",
|
|
381
|
-
description: "EXPERIMENTAL
|
|
382
|
-
"harness-neutral driver protocol) — read-only, takes no engine lease,
|
|
383
|
-
"instructions, output schema, env binding names, and the exact
|
|
263
|
+
description: "EXPERIMENTAL, gated behind `experimental.workflowEngine`: describe a run's active step as an executable " +
|
|
264
|
+
"work-list for ANY agent session (the harness-neutral driver protocol) — read-only, takes no engine lease, " +
|
|
265
|
+
"mutates nothing; prints per-unit instructions, output schema, env binding names, and the exact " +
|
|
266
|
+
"`akm workflow report` command lines",
|
|
384
267
|
},
|
|
385
268
|
args: {
|
|
386
269
|
target: {
|
|
@@ -390,6 +273,7 @@ const workflowBriefCommand = defineJsonCommand({
|
|
|
390
273
|
},
|
|
391
274
|
},
|
|
392
275
|
async run({ args }) {
|
|
276
|
+
requireWorkflowEngineEnabled(loadConfig(), "brief");
|
|
393
277
|
const { buildWorkflowBrief } = await import("../workflows/exec/brief.js");
|
|
394
278
|
const result = await buildWorkflowBrief(args.target);
|
|
395
279
|
output("workflow-brief", result);
|
|
@@ -399,8 +283,9 @@ const WORKFLOW_REPORT_STATES = ["completed", "failed", "running"];
|
|
|
399
283
|
const workflowReportCommand = defineJsonCommand({
|
|
400
284
|
meta: {
|
|
401
285
|
name: "report",
|
|
402
|
-
description: "EXPERIMENTAL
|
|
403
|
-
"protocol) — ingested through the SAME shared step semantics
|
|
286
|
+
description: "EXPERIMENTAL, gated behind `experimental.workflowEngine`: report a unit's result back into a run (the " +
|
|
287
|
+
"mutating half of the harness-neutral driver protocol) — ingested through the SAME shared step semantics " +
|
|
288
|
+
"the engine uses. --status running claims/" +
|
|
404
289
|
"heartbeats a unit; completed/failed records it and, when the step's work-list is fully terminal, runs the " +
|
|
405
290
|
"engine's completion path (reducer, artifact + schema validation, gate). --settle (no --unit) advances a run " +
|
|
406
291
|
"parked on a route-only/empty step. Refused while a live engine lease exists",
|
|
@@ -438,6 +323,7 @@ const workflowReportCommand = defineJsonCommand({
|
|
|
438
323
|
},
|
|
439
324
|
},
|
|
440
325
|
async run({ args }) {
|
|
326
|
+
requireWorkflowEngineEnabled(loadConfig(), "report");
|
|
441
327
|
// --settle: the unit-less verb that advances a run parked on a
|
|
442
328
|
// non-dispatching step. Mutually exclusive with the per-unit report flags.
|
|
443
329
|
if (args.settle === true) {
|
|
@@ -515,41 +401,6 @@ async function readStdin() {
|
|
|
515
401
|
chunks.push(chunk);
|
|
516
402
|
return Buffer.concat(chunks).toString("utf8");
|
|
517
403
|
}
|
|
518
|
-
const workflowWatchCommand = defineJsonCommand({
|
|
519
|
-
meta: {
|
|
520
|
-
name: "watch",
|
|
521
|
-
description: "Print a run's workflow_* events (state.db events table) as NDJSON and exit; --stream polls in the " +
|
|
522
|
-
"foreground until the run reaches a terminal status (no daemon)",
|
|
523
|
-
},
|
|
524
|
-
args: {
|
|
525
|
-
runId: { type: "positional", description: "Workflow run id", required: true },
|
|
526
|
-
stream: {
|
|
527
|
-
type: "boolean",
|
|
528
|
-
description: "Keep polling for new events until the run leaves 'active' (completed/failed/blocked)",
|
|
529
|
-
default: false,
|
|
530
|
-
},
|
|
531
|
-
"interval-ms": { type: "string", description: "Poll interval in milliseconds for --stream (default: 1000)" },
|
|
532
|
-
},
|
|
533
|
-
async run({ args }) {
|
|
534
|
-
const rawInterval = getStringArg(args, "interval-ms");
|
|
535
|
-
let intervalMs;
|
|
536
|
-
if (rawInterval !== undefined) {
|
|
537
|
-
intervalMs = Number.parseInt(rawInterval, 10);
|
|
538
|
-
if (!/^\d+$/.test(rawInterval) || intervalMs <= 0) {
|
|
539
|
-
throw new UsageError(`--interval-ms must be a positive integer, got "${rawInterval}".`, "INVALID_FLAG_VALUE");
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
const { watchWorkflowRun } = await import("../workflows/exec/watch.js");
|
|
543
|
-
const result = await watchWorkflowRun({
|
|
544
|
-
runId: args.runId,
|
|
545
|
-
stream: args.stream === true,
|
|
546
|
-
...(intervalMs !== undefined ? { intervalMs } : {}),
|
|
547
|
-
});
|
|
548
|
-
// The event lines above are raw NDJSON on stdout; this trailing envelope
|
|
549
|
-
// is the machine-readable command result (counts + terminal status).
|
|
550
|
-
output("workflow-watch", { ok: true, ...result });
|
|
551
|
-
},
|
|
552
|
-
});
|
|
553
404
|
const workflowAbandonCommand = defineJsonCommand({
|
|
554
405
|
meta: {
|
|
555
406
|
name: "abandon",
|
|
@@ -576,7 +427,7 @@ const workflowResumeCommand = defineJsonCommand({
|
|
|
576
427
|
output("workflow-resume", result);
|
|
577
428
|
},
|
|
578
429
|
});
|
|
579
|
-
export const workflowCommand =
|
|
430
|
+
export const workflowCommand = defineGroupCommand({
|
|
580
431
|
meta: {
|
|
581
432
|
name: "workflow",
|
|
582
433
|
description: "Author, inspect, and execute step-by-step workflow assets",
|
|
@@ -588,20 +439,16 @@ export const workflowCommand = defineCommand({
|
|
|
588
439
|
status: workflowStatusCommand,
|
|
589
440
|
list: workflowListCommand,
|
|
590
441
|
create: workflowCreateCommand,
|
|
591
|
-
template: workflowTemplateCommand,
|
|
592
442
|
resume: workflowResumeCommand,
|
|
593
443
|
abandon: workflowAbandonCommand,
|
|
594
|
-
validate: workflowValidateCommand,
|
|
595
444
|
run: workflowRunCommand,
|
|
596
445
|
brief: workflowBriefCommand,
|
|
597
446
|
report: workflowReportCommand,
|
|
598
|
-
watch: workflowWatchCommand,
|
|
599
|
-
},
|
|
600
|
-
run({ args }) {
|
|
601
|
-
return runWithJsonErrors(async () => {
|
|
602
|
-
if (hasWorkflowSubcommand(args))
|
|
603
|
-
return;
|
|
604
|
-
output("workflow-list", await listWorkflowRuns({ activeOnly: true }));
|
|
605
|
-
});
|
|
606
447
|
},
|
|
448
|
+
// No `defaultRun`: bare `akm workflow` is a usage error (exit 2), the
|
|
449
|
+
// canonical bare-group behavior — owner ruling 12. Run `akm workflow list
|
|
450
|
+
// --active` for what the bare form used to print. This group was previously
|
|
451
|
+
// hand-rolled on `defineCommand` with its own `hasWorkflowSubcommand` guard,
|
|
452
|
+
// which duplicated the subcommand names in a second hand-maintained set;
|
|
453
|
+
// `defineGroupCommand` derives the guard from `subCommands` directly.
|
|
607
454
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
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
|
-
import { defaultRendererRegistry } from "./
|
|
4
|
+
import { defaultRendererRegistry } from "./type-presentation.js";
|
|
5
5
|
function registryActionContributor(registry) {
|
|
6
6
|
return {
|
|
7
7
|
name: "registry-action-contributor",
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
* Decide whether injecting an env with the given dangerous keys is allowed,
|
|
6
|
+
* warned, or blocked. Third-party (registry-installed) stashes hard-block;
|
|
7
|
+
* first-party stashes warn. See rule 1 above.
|
|
8
|
+
*
|
|
9
|
+
* @param dangerousKeys The subset of injected keys flagged as process-hijacking
|
|
10
|
+
* (already filtered by the caller via `isDangerousEnvKey`).
|
|
11
|
+
* @param thirdParty `true` when the env's source is a third-party stash — i.e.
|
|
12
|
+
* its origin carries a `registryId`.
|
|
13
|
+
*/
|
|
14
|
+
export function decideDangerousEnvInjection(input) {
|
|
15
|
+
if (input.dangerousKeys.length === 0)
|
|
16
|
+
return "allow";
|
|
17
|
+
return input.thirdParty ? "block" : "warn";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Decide the baseline install stance for a freshly-installed stash's
|
|
21
|
+
* dangerous-key scan. The interactive confirm / rollback UX is applied by the
|
|
22
|
+
* caller on top of the `"gate"` stance — this predicate only fixes the policy.
|
|
23
|
+
* See rule 2 above.
|
|
24
|
+
*/
|
|
25
|
+
export function decideDangerousKeyInstall(input) {
|
|
26
|
+
if (!input.findingsPresent)
|
|
27
|
+
return "allow";
|
|
28
|
+
return input.allowInsecure ? "warn-allow" : "gate";
|
|
29
|
+
}
|
|
30
|
+
// ── Rule 3: task activation (tasks/runner.ts) ────────────────────────────────
|
|
31
|
+
/**
|
|
32
|
+
* Whether a scheduler-generated task invocation must be skipped because the
|
|
33
|
+
* task is not activated (its `enabled:` is false). Manual (non-scheduled) runs
|
|
34
|
+
* are always dispatched — installing a task grants nothing until enabled, but
|
|
35
|
+
* the operator may still run it by hand for catch-up / testing. See rule 3.
|
|
36
|
+
*/
|
|
37
|
+
export function shouldSkipUnactivatedTask(input) {
|
|
38
|
+
return !input.enabled && input.scheduled;
|
|
39
|
+
}
|
|
40
|
+
// ── Rule 4: write activation (search-source.ts, installations.ts) ────────────
|
|
41
|
+
/**
|
|
42
|
+
* Whether a resolved source is write-activated. Only the primary stash and
|
|
43
|
+
* sources explicitly marked `writable: true` are writable; registry-cached
|
|
44
|
+
* (installed, read-only) sources are never written in place because
|
|
45
|
+
* `akm update` overwrites them. See rule 4 above.
|
|
46
|
+
*/
|
|
47
|
+
export function isSourceWriteActivated(source) {
|
|
48
|
+
return source.writable === true;
|
|
49
|
+
}
|