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
|
@@ -7,35 +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 {
|
|
15
|
-
import {
|
|
19
|
+
import { getParsedInvocation } from "../cli/invocation.js";
|
|
20
|
+
import { getStringArg } from "../cli/parse-args.js";
|
|
21
|
+
import { defineGroupCommand, defineJsonCommand, output } from "../cli/shared.js";
|
|
16
22
|
import { assertFlatAssetName, combineCreatePath, normalizeCreateSubPath } from "../core/asset/asset-create.js";
|
|
17
|
-
import { parseAssetRef } from "../core/asset/asset-ref.js";
|
|
18
23
|
import { loadConfig } from "../core/config/config.js";
|
|
19
24
|
import { NotFoundError, UsageError } from "../core/errors.js";
|
|
20
25
|
import { akmIndex } from "../indexer/indexer.js";
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import { createWorkflowAsset, formatWorkflowErrors, getWorkflowTemplate, validateWorkflowSource, } from "../workflows/authoring/authoring.js";
|
|
26
|
-
import { hasWorkflowSubcommand, parseWorkflowJsonObject, parseWorkflowStepState, WORKFLOW_STEP_STATES, } from "../workflows/cli.js";
|
|
27
|
-
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";
|
|
28
30
|
const workflowStartCommand = defineJsonCommand({
|
|
29
31
|
meta: {
|
|
30
32
|
name: "start",
|
|
31
33
|
description: "Start a new workflow run in the current working scope",
|
|
32
34
|
},
|
|
33
35
|
args: {
|
|
34
|
-
ref: { type: "positional", description: "Workflow ref (
|
|
36
|
+
ref: { type: "positional", description: "Workflow ref (workflows/<name>)", required: true },
|
|
35
37
|
params: { type: "string", description: "Workflow parameters as a JSON object" },
|
|
36
38
|
force: {
|
|
37
39
|
type: "boolean",
|
|
38
|
-
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",
|
|
39
41
|
default: false,
|
|
40
42
|
},
|
|
41
43
|
},
|
|
@@ -57,45 +59,17 @@ const workflowNextCommand = defineJsonCommand({
|
|
|
57
59
|
},
|
|
58
60
|
async run({ args }) {
|
|
59
61
|
// `--dry-run` is intentionally NOT a declared arg (so it stays out of
|
|
60
|
-
// --help). The guard reads it straight from
|
|
61
|
-
// callers still get a clear, actionable error instead of a
|
|
62
|
-
// "unknown flag" from citty.
|
|
63
|
-
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")) {
|
|
64
66
|
throw new UsageError("`akm workflow next` does not support --dry-run. Remove the flag to start or resume a run.", "INVALID_FLAG_VALUE");
|
|
65
67
|
}
|
|
66
68
|
const parsedParams = args.params ? parseWorkflowJsonObject(args.params, "--params") : undefined;
|
|
67
|
-
// If the target looks like a UUID-style run id (no `:` and matches the
|
|
68
|
-
// run-id shape), short-circuit with a structured WORKFLOW_NOT_FOUND
|
|
69
|
-
// error before parseAssetRef gets to throw an unhelpful ref-parse error.
|
|
70
|
-
if (looksLikeWorkflowRunId(args.target)) {
|
|
71
|
-
const { hasWorkflowRun } = await import("../workflows/runtime/runs.js");
|
|
72
|
-
if (!(await hasWorkflowRun(args.target))) {
|
|
73
|
-
throw new NotFoundError(`Workflow run "${args.target}" not found.`, "WORKFLOW_NOT_FOUND", "Run `akm workflow list --active` to see runs.");
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
69
|
const result = await getNextWorkflowStep(args.target, parsedParams);
|
|
77
70
|
output("workflow-next", result);
|
|
78
71
|
},
|
|
79
72
|
});
|
|
80
|
-
/**
|
|
81
|
-
* Heuristic: a workflow run id is a UUID-shaped or hex-id-shaped string with
|
|
82
|
-
* no `:` separator (refs always contain a colon: `workflow:<name>` or
|
|
83
|
-
* `<origin>//workflow:<name>`). When this matches we can give a much better
|
|
84
|
-
* error than parseAssetRef's "Invalid asset type" failure.
|
|
85
|
-
*/
|
|
86
|
-
function looksLikeWorkflowRunId(target) {
|
|
87
|
-
if (target.includes(":"))
|
|
88
|
-
return false;
|
|
89
|
-
if (target.includes("/"))
|
|
90
|
-
return false;
|
|
91
|
-
// UUID v4-ish: 8-4-4-4-12 hex digits separated by dashes.
|
|
92
|
-
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(target))
|
|
93
|
-
return true;
|
|
94
|
-
// Bare hex/alphanumeric run ids of >=8 chars (covers shortened ids).
|
|
95
|
-
if (/^[0-9a-z][0-9a-z_-]{7,}$/i.test(target) && /[0-9]/.test(target))
|
|
96
|
-
return true;
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
73
|
const workflowCompleteCommand = defineJsonCommand({
|
|
100
74
|
meta: {
|
|
101
75
|
name: "complete",
|
|
@@ -139,35 +113,37 @@ const workflowStatusCommand = defineJsonCommand({
|
|
|
139
113
|
description: "Show full workflow run state for review or resume; workflow refs resolve within the current scope",
|
|
140
114
|
},
|
|
141
115
|
args: {
|
|
142
|
-
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 },
|
|
117
|
+
units: {
|
|
118
|
+
type: "boolean",
|
|
119
|
+
description: "Also list per-unit rows from the run journal (unit id, status, failure_reason, and any result/error " +
|
|
120
|
+
"diagnostic text). Diagnostics only — step evidence stays deterministic and is unaffected.",
|
|
121
|
+
default: false,
|
|
122
|
+
},
|
|
143
123
|
},
|
|
144
124
|
async run({ args }) {
|
|
145
125
|
const target = args.target;
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return parseAssetRef(target);
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
})();
|
|
155
|
-
if (parsed?.type === "workflow") {
|
|
156
|
-
const ref = `${parsed.origin ? `${parsed.origin}//` : ""}workflow:${parsed.name}`;
|
|
157
|
-
const { runs } = await listWorkflowRuns({ workflowRef: ref });
|
|
158
|
-
if (runs.length === 0) {
|
|
159
|
-
throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
|
|
160
|
-
}
|
|
161
|
-
const mostRecent = runs[0];
|
|
162
|
-
if (!mostRecent)
|
|
163
|
-
throw new NotFoundError(`No workflow runs found for ${ref}`, "WORKFLOW_NOT_FOUND");
|
|
164
|
-
const result = await getWorkflowStatus(mostRecent.id);
|
|
126
|
+
const includeUnits = args.units === true;
|
|
127
|
+
if (await hasWorkflowRun(target)) {
|
|
128
|
+
const result = await getWorkflowStatus(target, { includeUnits });
|
|
165
129
|
output("workflow-status", result);
|
|
130
|
+
return;
|
|
166
131
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
132
|
+
let runs;
|
|
133
|
+
try {
|
|
134
|
+
({ runs } = await listWorkflowRuns({ workflowRef: target }));
|
|
170
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);
|
|
171
147
|
},
|
|
172
148
|
});
|
|
173
149
|
const workflowListCommand = defineJsonCommand({
|
|
@@ -187,19 +163,22 @@ const workflowListCommand = defineJsonCommand({
|
|
|
187
163
|
const workflowCreateCommand = defineJsonCommand({
|
|
188
164
|
meta: {
|
|
189
165
|
name: "create",
|
|
190
|
-
description: "Create a workflow markdown document in the working
|
|
166
|
+
description: "Create a workflow (markdown document) in the working bundle",
|
|
191
167
|
},
|
|
192
168
|
args: {
|
|
193
169
|
name: {
|
|
194
170
|
type: "positional",
|
|
195
|
-
description: "Workflow name (flat, no '/'; use --path for a subdirectory)",
|
|
171
|
+
description: "Workflow name (flat, no '/'; use --path for a subdirectory).",
|
|
196
172
|
required: true,
|
|
197
173
|
},
|
|
198
174
|
path: {
|
|
199
175
|
type: "string",
|
|
200
176
|
description: "Relative subdirectory under workflows/ to place the workflow in (e.g. 'release'). The filename comes from the name.",
|
|
201
177
|
},
|
|
202
|
-
from: {
|
|
178
|
+
from: {
|
|
179
|
+
type: "string",
|
|
180
|
+
description: "Import and validate content from an existing file",
|
|
181
|
+
},
|
|
203
182
|
force: {
|
|
204
183
|
type: "boolean",
|
|
205
184
|
description: "Overwrite an existing workflow (requires --from or --reset)",
|
|
@@ -210,6 +189,11 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
210
189
|
description: "Explicitly replace an existing workflow with a fresh template (use with --force)",
|
|
211
190
|
default: false,
|
|
212
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
|
+
},
|
|
213
197
|
},
|
|
214
198
|
async run({ args }) {
|
|
215
199
|
// `name` is flat; subdirectory placement is `--path`'s job.
|
|
@@ -219,6 +203,14 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
219
203
|
if (!namePattern.test(effectiveName)) {
|
|
220
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.");
|
|
221
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
|
+
}
|
|
222
214
|
if (args.force && !args.from && !args.reset) {
|
|
223
215
|
throw new UsageError("Refusing to overwrite with template: pass --from <file> to replace content, or --reset to explicitly replace with a fresh template.");
|
|
224
216
|
}
|
|
@@ -234,61 +226,180 @@ const workflowCreateCommand = defineJsonCommand({
|
|
|
234
226
|
output("workflow-create", { ok: true, ...result });
|
|
235
227
|
},
|
|
236
228
|
});
|
|
237
|
-
const
|
|
229
|
+
const workflowRunCommand = defineJsonCommand({
|
|
238
230
|
meta: {
|
|
239
|
-
name: "
|
|
240
|
-
description: "
|
|
231
|
+
name: "run",
|
|
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",
|
|
241
235
|
},
|
|
242
|
-
|
|
243
|
-
|
|
236
|
+
args: {
|
|
237
|
+
target: { type: "positional", description: "Workflow run id or workflow ref (auto-starts a run)", required: true },
|
|
238
|
+
params: { type: "string", description: "Workflow parameters as a JSON object (only for auto-started runs)" },
|
|
239
|
+
"max-steps": { type: "string", description: "Stop after executing this many steps" },
|
|
240
|
+
},
|
|
241
|
+
async run({ args }) {
|
|
242
|
+
requireWorkflowEngineEnabled(loadConfig(), "run");
|
|
243
|
+
const { runWorkflowSteps } = await import("../workflows/exec/run-workflow.js");
|
|
244
|
+
const rawMaxSteps = getStringArg(args, "max-steps");
|
|
245
|
+
let maxSteps;
|
|
246
|
+
if (rawMaxSteps !== undefined) {
|
|
247
|
+
maxSteps = Number.parseInt(rawMaxSteps, 10);
|
|
248
|
+
if (!/^\d+$/.test(rawMaxSteps) || maxSteps <= 0) {
|
|
249
|
+
throw new UsageError(`--max-steps must be a positive integer, got "${rawMaxSteps}".`, "INVALID_FLAG_VALUE");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const result = await runWorkflowSteps({
|
|
253
|
+
target: args.target,
|
|
254
|
+
...(args.params ? { params: parseWorkflowJsonObject(args.params, "--params") } : {}),
|
|
255
|
+
...(maxSteps !== undefined ? { maxSteps } : {}),
|
|
256
|
+
});
|
|
257
|
+
output("workflow-run", result);
|
|
244
258
|
},
|
|
245
259
|
});
|
|
246
|
-
const
|
|
260
|
+
const workflowBriefCommand = defineJsonCommand({
|
|
247
261
|
meta: {
|
|
248
|
-
name: "
|
|
249
|
-
description: "
|
|
262
|
+
name: "brief",
|
|
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",
|
|
250
267
|
},
|
|
251
268
|
args: {
|
|
252
269
|
target: {
|
|
253
270
|
type: "positional",
|
|
254
|
-
description: "Workflow
|
|
271
|
+
description: "Workflow run id (or a workflow ref with an active run)",
|
|
255
272
|
required: true,
|
|
256
273
|
},
|
|
257
274
|
},
|
|
258
275
|
async run({ args }) {
|
|
259
|
-
|
|
260
|
-
const {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
276
|
+
requireWorkflowEngineEnabled(loadConfig(), "brief");
|
|
277
|
+
const { buildWorkflowBrief } = await import("../workflows/exec/brief.js");
|
|
278
|
+
const result = await buildWorkflowBrief(args.target);
|
|
279
|
+
output("workflow-brief", result);
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
const WORKFLOW_REPORT_STATES = ["completed", "failed", "running"];
|
|
283
|
+
const workflowReportCommand = defineJsonCommand({
|
|
284
|
+
meta: {
|
|
285
|
+
name: "report",
|
|
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/" +
|
|
289
|
+
"heartbeats a unit; completed/failed records it and, when the step's work-list is fully terminal, runs the " +
|
|
290
|
+
"engine's completion path (reducer, artifact + schema validation, gate). --settle (no --unit) advances a run " +
|
|
291
|
+
"parked on a route-only/empty step. Refused while a live engine lease exists",
|
|
292
|
+
},
|
|
293
|
+
args: {
|
|
294
|
+
target: {
|
|
295
|
+
type: "positional",
|
|
296
|
+
description: "Workflow run id (or a workflow ref with an active run)",
|
|
297
|
+
required: true,
|
|
298
|
+
},
|
|
299
|
+
unit: {
|
|
300
|
+
type: "string",
|
|
301
|
+
description: "Content-derived unit id from `akm workflow brief` (copy it verbatim). Omit with --settle.",
|
|
302
|
+
},
|
|
303
|
+
settle: {
|
|
304
|
+
type: "boolean",
|
|
305
|
+
description: "Advance/finalize a run whose active step has NO unit left to report: a non-dispatching step (params-based route, empty fan-out, all-unresolvable) OR a fully-terminal step still needing finalization (every unit ran but the gate never judged — e.g. after resuming a required-gate block). Runs the deterministic completion path. Mutually exclusive with --unit; refused when the step still has genuinely pending units",
|
|
306
|
+
default: false,
|
|
307
|
+
},
|
|
308
|
+
"expect-step": {
|
|
309
|
+
type: "string",
|
|
310
|
+
description: "Guard: the step id you briefed against. Refuses the report if the run's active step has since moved (from the `brief` report/settle command line)",
|
|
311
|
+
},
|
|
312
|
+
status: { type: "string", description: `Unit status: ${WORKFLOW_REPORT_STATES.join(", ")}` },
|
|
313
|
+
result: { type: "string", description: "Result payload (JSON for a schema unit, else text). completed only." },
|
|
314
|
+
"result-file": { type: "string", description: "Read the result payload from this file instead of --result/stdin" },
|
|
315
|
+
tokens: { type: "string", description: "Tokens spent on this unit (counts against a declared budget)" },
|
|
316
|
+
"session-id": { type: "string", description: "Harness-native session id revealed while executing the unit" },
|
|
317
|
+
"failure-reason": { type: "string", description: "Structured failure vocabulary for a --status failed report" },
|
|
318
|
+
note: { type: "string", description: "Short progress note for a --status running heartbeat (not persisted)" },
|
|
319
|
+
rerun: {
|
|
320
|
+
type: "boolean",
|
|
321
|
+
description: "Re-run an already-FAILED unit: record a NEW attempt (re-applies budget) instead of refusing a differing re-report",
|
|
322
|
+
default: false,
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
async run({ args }) {
|
|
326
|
+
requireWorkflowEngineEnabled(loadConfig(), "report");
|
|
327
|
+
// --settle: the unit-less verb that advances a run parked on a
|
|
328
|
+
// non-dispatching step. Mutually exclusive with the per-unit report flags.
|
|
329
|
+
if (args.settle === true) {
|
|
330
|
+
if (getStringArg(args, "unit") !== undefined || getStringArg(args, "status") !== undefined) {
|
|
331
|
+
throw new UsageError("--settle advances a route-only/empty step and takes no --unit or --status. Drop them, or report a " +
|
|
332
|
+
"specific unit with `--unit <id> --status <state>` instead.", "INVALID_FLAG_VALUE");
|
|
333
|
+
}
|
|
334
|
+
const { settleWorkflowSpine } = await import("../workflows/exec/report.js");
|
|
335
|
+
const result = await settleWorkflowSpine({
|
|
336
|
+
target: args.target,
|
|
337
|
+
...(getStringArg(args, "expect-step") !== undefined ? { expectStep: getStringArg(args, "expect-step") } : {}),
|
|
267
338
|
});
|
|
339
|
+
output("workflow-report", result);
|
|
268
340
|
return;
|
|
269
341
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
async function resolveWorkflowFilePath(target) {
|
|
274
|
-
if (!target.startsWith("workflow:"))
|
|
275
|
-
return target;
|
|
276
|
-
const parsed = parseAssetRef(target);
|
|
277
|
-
if (parsed.type !== "workflow") {
|
|
278
|
-
throw new UsageError(`Expected a workflow ref (workflow:<name>), got "${target}".`);
|
|
279
|
-
}
|
|
280
|
-
const config = loadConfig();
|
|
281
|
-
const allSources = resolveSourceEntries(undefined, config);
|
|
282
|
-
const searchSources = resolveSourcesForOrigin(parsed.origin, allSources);
|
|
283
|
-
for (const source of searchSources) {
|
|
284
|
-
try {
|
|
285
|
-
return await resolveAssetPath(source.path, "workflow", parsed.name);
|
|
342
|
+
const status = args.status;
|
|
343
|
+
if (!status) {
|
|
344
|
+
throw new UsageError("--status is required (completed | failed | running), or pass --settle to advance a non-dispatching step.", "MISSING_REQUIRED_ARGUMENT");
|
|
286
345
|
}
|
|
287
|
-
|
|
288
|
-
|
|
346
|
+
if (!WORKFLOW_REPORT_STATES.includes(status)) {
|
|
347
|
+
throw new UsageError(`Invalid --status "${status}". Expected one of: ${WORKFLOW_REPORT_STATES.join(", ")}.`, "INVALID_FLAG_VALUE");
|
|
289
348
|
}
|
|
290
|
-
|
|
291
|
-
|
|
349
|
+
const unitId = getStringArg(args, "unit");
|
|
350
|
+
if (!unitId) {
|
|
351
|
+
throw new UsageError("--unit is required (the content-derived unit id from `akm workflow brief`), or pass --settle for a route-only/empty step.", "MISSING_REQUIRED_ARGUMENT");
|
|
352
|
+
}
|
|
353
|
+
let tokens;
|
|
354
|
+
const rawTokens = getStringArg(args, "tokens");
|
|
355
|
+
if (rawTokens !== undefined) {
|
|
356
|
+
tokens = Number.parseInt(rawTokens, 10);
|
|
357
|
+
if (!/^\d+$/.test(rawTokens)) {
|
|
358
|
+
throw new UsageError(`--tokens must be a non-negative integer, got "${rawTokens}".`, "INVALID_FLAG_VALUE");
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Result payload precedence: --result, then --result-file, then stdin
|
|
362
|
+
// (completed/failed only; a running heartbeat carries no result).
|
|
363
|
+
let resultRaw;
|
|
364
|
+
if (status !== "running") {
|
|
365
|
+
const resultFile = getStringArg(args, "result-file");
|
|
366
|
+
if (args.result !== undefined && resultFile !== undefined) {
|
|
367
|
+
throw new UsageError("Pass at most one of --result or --result-file.", "INVALID_FLAG_VALUE");
|
|
368
|
+
}
|
|
369
|
+
if (args.result !== undefined) {
|
|
370
|
+
resultRaw = String(args.result);
|
|
371
|
+
}
|
|
372
|
+
else if (resultFile !== undefined) {
|
|
373
|
+
const fs = await import("node:fs");
|
|
374
|
+
resultRaw = fs.readFileSync(resultFile, "utf8");
|
|
375
|
+
}
|
|
376
|
+
else if (!process.stdin.isTTY) {
|
|
377
|
+
resultRaw = await readStdin();
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
const { reportWorkflowUnit } = await import("../workflows/exec/report.js");
|
|
381
|
+
const result = await reportWorkflowUnit({
|
|
382
|
+
target: args.target,
|
|
383
|
+
unitId,
|
|
384
|
+
status: status,
|
|
385
|
+
...(getStringArg(args, "expect-step") !== undefined ? { expectStep: getStringArg(args, "expect-step") } : {}),
|
|
386
|
+
...(resultRaw !== undefined ? { resultRaw } : {}),
|
|
387
|
+
...(tokens !== undefined ? { tokens } : {}),
|
|
388
|
+
...(args.rerun === true ? { rerun: true } : {}),
|
|
389
|
+
...(getStringArg(args, "session-id") !== undefined ? { sessionId: getStringArg(args, "session-id") } : {}),
|
|
390
|
+
...(getStringArg(args, "failure-reason") !== undefined
|
|
391
|
+
? { failureReason: getStringArg(args, "failure-reason") }
|
|
392
|
+
: {}),
|
|
393
|
+
...(getStringArg(args, "note") !== undefined ? { note: getStringArg(args, "note") } : {}),
|
|
394
|
+
});
|
|
395
|
+
output("workflow-report", result);
|
|
396
|
+
},
|
|
397
|
+
});
|
|
398
|
+
async function readStdin() {
|
|
399
|
+
const chunks = [];
|
|
400
|
+
for await (const chunk of process.stdin)
|
|
401
|
+
chunks.push(chunk);
|
|
402
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
292
403
|
}
|
|
293
404
|
const workflowAbandonCommand = defineJsonCommand({
|
|
294
405
|
meta: {
|
|
@@ -316,7 +427,7 @@ const workflowResumeCommand = defineJsonCommand({
|
|
|
316
427
|
output("workflow-resume", result);
|
|
317
428
|
},
|
|
318
429
|
});
|
|
319
|
-
export const workflowCommand =
|
|
430
|
+
export const workflowCommand = defineGroupCommand({
|
|
320
431
|
meta: {
|
|
321
432
|
name: "workflow",
|
|
322
433
|
description: "Author, inspect, and execute step-by-step workflow assets",
|
|
@@ -328,16 +439,16 @@ export const workflowCommand = defineCommand({
|
|
|
328
439
|
status: workflowStatusCommand,
|
|
329
440
|
list: workflowListCommand,
|
|
330
441
|
create: workflowCreateCommand,
|
|
331
|
-
template: workflowTemplateCommand,
|
|
332
442
|
resume: workflowResumeCommand,
|
|
333
443
|
abandon: workflowAbandonCommand,
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
444
|
+
run: workflowRunCommand,
|
|
445
|
+
brief: workflowBriefCommand,
|
|
446
|
+
report: workflowReportCommand,
|
|
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.
|
|
343
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
|
+
}
|