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
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
* migrated to `defineJsonCommand`, which wraps the body in `runWithJsonErrors`
|
|
9
9
|
* and emits the same JSON envelope (stdout/stderr/exit-code) as the inline
|
|
10
10
|
* `runWithJsonErrors` form it replaces.
|
|
11
|
+
*
|
|
12
|
+
* 0.9 CLI overhaul (S8): the former top-level `extract` and `propose`
|
|
13
|
+
* commands are absorbed here as `extract` and `new` — no top-level
|
|
14
|
+
* registration remains for either spelling.
|
|
11
15
|
*/
|
|
16
|
+
import { getParsedInvocation } from "../../cli/invocation.js";
|
|
12
17
|
import { parsePositiveIntFlag } from "../../cli/parse-args.js";
|
|
13
18
|
import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
|
|
14
19
|
import { resolveStashDir } from "../../core/common.js";
|
|
@@ -17,10 +22,45 @@ import { UsageError } from "../../core/errors.js";
|
|
|
17
22
|
import { resolveTriageJudgmentRunner } from "../../integrations/agent/runner.js";
|
|
18
23
|
import { installLlmUsagePersistenceIfAbsent } from "../../llm/usage-persist.js";
|
|
19
24
|
import { withLlmStage } from "../../llm/usage-telemetry.js";
|
|
20
|
-
import {
|
|
25
|
+
import { extractCommand } from "../improve/extract-cli.js";
|
|
26
|
+
import { resolveImproveStrategy } from "../improve/improve-strategies.js";
|
|
21
27
|
import { drainProposals } from "./drain.js";
|
|
22
28
|
import { resolveDrainPolicy } from "./drain-policies.js";
|
|
23
|
-
import { akmProposalAccept, akmProposalDiff, akmProposalList, akmProposalReject, akmProposalRevert, akmProposalShow, } from "./proposal.js";
|
|
29
|
+
import { akmProposalAccept, akmProposalDiff, akmProposalList, akmProposalReject, akmProposalRevert, akmProposalShow, bulkAdjudicateProposals, } from "./proposal.js";
|
|
30
|
+
import { proposeCommand } from "./propose-cli.js";
|
|
31
|
+
/**
|
|
32
|
+
* `--source` was renamed to `--generator` on `proposal accept`/`proposal
|
|
33
|
+
* reject` in 0.9 (WS3/S8 — "Removed in 0.9.0"). citty is non-strict, so the
|
|
34
|
+
* retired spelling is silently absorbed rather than rejected — a bulk
|
|
35
|
+
* accept/reject invoked with `--source <name>` then has neither `--generator`
|
|
36
|
+
* nor a positional id, and falls through to the single-proposal path, which
|
|
37
|
+
* throws MISSING_REQUIRED_ARGUMENT instead of running the bulk action the
|
|
38
|
+
* caller asked for. Reject it explicitly instead.
|
|
39
|
+
*/
|
|
40
|
+
function rejectRetiredProposalSourceFlag(subcommand) {
|
|
41
|
+
if (!getParsedInvocation().hasFlag("--source"))
|
|
42
|
+
return;
|
|
43
|
+
throw new UsageError(`\`akm proposal ${subcommand} --source\` was renamed to \`--generator\` in 0.9. Use \`--generator <name>\` instead.`, "INVALID_FLAG_VALUE");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse + validate the shared bulk-adjudication filter flags
|
|
47
|
+
* (`--max-diff-lines`, `--older-than`). Extracted from the two verbatim
|
|
48
|
+
* copies that lived in the accept and reject bulk branches (WI-6.6).
|
|
49
|
+
*/
|
|
50
|
+
function parseBulkFilterFlags(args) {
|
|
51
|
+
const rawMaxDiff = args["max-diff-lines"] ? Number.parseInt(String(args["max-diff-lines"]), 10) : undefined;
|
|
52
|
+
if (rawMaxDiff !== undefined && (Number.isNaN(rawMaxDiff) || rawMaxDiff < 0)) {
|
|
53
|
+
throw new UsageError("--max-diff-lines must be a non-negative integer", "INVALID_FLAG_VALUE");
|
|
54
|
+
}
|
|
55
|
+
const rawOlderThan = args["older-than"] ? Number.parseInt(String(args["older-than"]), 10) : undefined;
|
|
56
|
+
if (rawOlderThan !== undefined && (Number.isNaN(rawOlderThan) || rawOlderThan < 0)) {
|
|
57
|
+
throw new UsageError("--older-than must be a non-negative integer (days)", "INVALID_FLAG_VALUE");
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
maxDiffLines: rawMaxDiff,
|
|
61
|
+
olderThanMs: rawOlderThan !== undefined ? rawOlderThan * 86_400_000 : undefined,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
24
64
|
function parseProposalStatus(raw) {
|
|
25
65
|
if (raw === undefined)
|
|
26
66
|
return undefined;
|
|
@@ -35,16 +75,18 @@ function parseProposalStatus(raw) {
|
|
|
35
75
|
const proposalListCommand = defineJsonCommand({
|
|
36
76
|
meta: { name: "list", description: "List proposal queue entries" },
|
|
37
77
|
args: {
|
|
78
|
+
queue: { type: "string", description: "Select the proposal queue by source name" },
|
|
38
79
|
status: {
|
|
39
80
|
type: "string",
|
|
40
81
|
description: "Filter by status (pending|accepted|rejected|reverted)",
|
|
41
82
|
},
|
|
42
|
-
ref: { type: "string", description: "Filter by asset ref (
|
|
83
|
+
ref: { type: "string", description: "Filter by asset ref ([bundle//]conceptId, e.g. knowledge/guide.md)" },
|
|
43
84
|
type: { type: "string", description: "Filter by asset type" },
|
|
44
85
|
},
|
|
45
86
|
run({ args }) {
|
|
46
87
|
const status = parseProposalStatus(args.status);
|
|
47
88
|
const result = akmProposalList({
|
|
89
|
+
queue: args.queue,
|
|
48
90
|
status,
|
|
49
91
|
ref: args.ref,
|
|
50
92
|
type: args.type,
|
|
@@ -54,30 +96,31 @@ const proposalListCommand = defineJsonCommand({
|
|
|
54
96
|
},
|
|
55
97
|
});
|
|
56
98
|
const proposalAcceptCommand = defineJsonCommand({
|
|
57
|
-
meta: { name: "accept", description: "Accept a proposal and promote it into the
|
|
99
|
+
meta: { name: "accept", description: "Accept a proposal and promote it into the bundle" },
|
|
58
100
|
args: {
|
|
59
101
|
id: {
|
|
60
102
|
type: "positional",
|
|
61
|
-
description: "Proposal id (uuid / prefix) or asset ref (e.g.
|
|
103
|
+
description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream). Optional when --generator is provided.",
|
|
62
104
|
required: false,
|
|
63
105
|
},
|
|
64
|
-
|
|
106
|
+
queue: { type: "string", description: "Select the proposal queue by source name" },
|
|
107
|
+
target: { type: "string", description: "Write destination; must match the proposal's recorded target" },
|
|
65
108
|
// F-6 / #393: Batch accept by generator, diff size, or age.
|
|
66
109
|
generator: {
|
|
67
110
|
type: "string",
|
|
68
|
-
description: "
|
|
111
|
+
description: "Bulk-accept all pending proposals from this generator (e.g. reflect, distill). Requires no positional id.",
|
|
69
112
|
},
|
|
70
113
|
"max-diff-lines": {
|
|
71
114
|
type: "string",
|
|
72
|
-
description: "
|
|
115
|
+
description: "When bulk-accepting, only accept proposals whose content is <= this many lines. Skips larger proposals.",
|
|
73
116
|
},
|
|
74
117
|
"older-than": {
|
|
75
118
|
type: "string",
|
|
76
|
-
description: "
|
|
119
|
+
description: "When bulk-accepting, only accept proposals created more than this many days ago (e.g. '7' for 7 days).",
|
|
77
120
|
},
|
|
78
121
|
"dry-run": {
|
|
79
122
|
type: "boolean",
|
|
80
|
-
description: "
|
|
123
|
+
description: "List proposals that would be bulk-accepted without accepting them.",
|
|
81
124
|
default: false,
|
|
82
125
|
},
|
|
83
126
|
yes: {
|
|
@@ -88,6 +131,7 @@ const proposalAcceptCommand = defineJsonCommand({
|
|
|
88
131
|
},
|
|
89
132
|
},
|
|
90
133
|
async run({ args }) {
|
|
134
|
+
rejectRetiredProposalSourceFlag("accept");
|
|
91
135
|
const generator = args.generator;
|
|
92
136
|
// F-6 / #393: Bulk-accept when --generator is provided without a positional id.
|
|
93
137
|
if (generator && !args.id) {
|
|
@@ -97,50 +141,27 @@ const proposalAcceptCommand = defineJsonCommand({
|
|
|
97
141
|
process.stderr.write("Aborted.\n");
|
|
98
142
|
return;
|
|
99
143
|
}
|
|
100
|
-
const {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
const maxDiffLines = rawMaxDiff;
|
|
111
|
-
const olderThanMs = rawOlderThan !== undefined ? rawOlderThan * 86_400_000 : undefined;
|
|
112
|
-
const pending = listProposals(stashDir, { status: "pending" }).filter((p) => {
|
|
113
|
-
if (p.source !== generator)
|
|
114
|
-
return false;
|
|
115
|
-
if (maxDiffLines !== undefined) {
|
|
116
|
-
const lines = (p.payload.content ?? "").split("\n").length;
|
|
117
|
-
if (lines > maxDiffLines)
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
if (olderThanMs !== undefined) {
|
|
121
|
-
const age = Date.now() - new Date(p.createdAt).getTime();
|
|
122
|
-
if (age < olderThanMs)
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
return true;
|
|
144
|
+
const { maxDiffLines, olderThanMs } = parseBulkFilterFlags(args);
|
|
145
|
+
const { count, results } = await bulkAdjudicateProposals({
|
|
146
|
+
action: "accept",
|
|
147
|
+
generator,
|
|
148
|
+
maxDiffLines,
|
|
149
|
+
olderThanMs,
|
|
150
|
+
dryRun: args["dry-run"],
|
|
151
|
+
queue: args.queue,
|
|
152
|
+
target: args.target,
|
|
126
153
|
});
|
|
127
|
-
|
|
128
|
-
for (const proposal of pending) {
|
|
129
|
-
if (args["dry-run"]) {
|
|
130
|
-
results.push({ id: proposal.id, ref: proposal.ref, source: proposal.source, dryRun: true });
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
const result = await akmProposalAccept({ id: proposal.id, target: args.target });
|
|
134
|
-
results.push(result);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
output("proposal-accept-batch", { accepted: results.length, results, dryRun: args["dry-run"] });
|
|
154
|
+
output("proposal-accept-batch", { accepted: count, results, dryRun: args["dry-run"] });
|
|
138
155
|
return;
|
|
139
156
|
}
|
|
140
157
|
if (!args.id) {
|
|
141
158
|
throw new UsageError("Usage: akm proposal accept <id> OR akm proposal accept --generator <generator>", "MISSING_REQUIRED_ARGUMENT");
|
|
142
159
|
}
|
|
143
|
-
const result = await akmProposalAccept({
|
|
160
|
+
const result = await akmProposalAccept({
|
|
161
|
+
id: args.id,
|
|
162
|
+
queue: args.queue,
|
|
163
|
+
target: args.target,
|
|
164
|
+
});
|
|
144
165
|
output("proposal-accept", result);
|
|
145
166
|
},
|
|
146
167
|
});
|
|
@@ -149,26 +170,27 @@ const proposalRejectCommand = defineJsonCommand({
|
|
|
149
170
|
args: {
|
|
150
171
|
id: {
|
|
151
172
|
type: "positional",
|
|
152
|
-
description: "Proposal id (uuid / prefix) or asset ref (e.g.
|
|
173
|
+
description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream). Optional when --generator is provided.",
|
|
153
174
|
required: false,
|
|
154
175
|
},
|
|
155
176
|
reason: { type: "string", description: "Reason for rejection (required)" },
|
|
177
|
+
queue: { type: "string", description: "Select the proposal queue by source name" },
|
|
156
178
|
// F-6 / #393: Batch reject by generator, diff size, or age.
|
|
157
179
|
generator: {
|
|
158
180
|
type: "string",
|
|
159
|
-
description: "
|
|
181
|
+
description: "Bulk-reject all pending proposals from this generator (e.g. reflect, distill). Requires no positional id.",
|
|
160
182
|
},
|
|
161
183
|
"max-diff-lines": {
|
|
162
184
|
type: "string",
|
|
163
|
-
description: "
|
|
185
|
+
description: "When bulk-rejecting, only reject proposals whose content is <= this many lines. Skips larger proposals.",
|
|
164
186
|
},
|
|
165
187
|
"older-than": {
|
|
166
188
|
type: "string",
|
|
167
|
-
description: "
|
|
189
|
+
description: "When bulk-rejecting, only reject proposals created more than this many days ago (e.g. '7' for 7 days).",
|
|
168
190
|
},
|
|
169
191
|
"dry-run": {
|
|
170
192
|
type: "boolean",
|
|
171
|
-
description: "
|
|
193
|
+
description: "List proposals that would be bulk-rejected without rejecting them.",
|
|
172
194
|
default: false,
|
|
173
195
|
},
|
|
174
196
|
yes: {
|
|
@@ -179,6 +201,7 @@ const proposalRejectCommand = defineJsonCommand({
|
|
|
179
201
|
},
|
|
180
202
|
},
|
|
181
203
|
async run({ args }) {
|
|
204
|
+
rejectRetiredProposalSourceFlag("reject");
|
|
182
205
|
const generator = args.generator;
|
|
183
206
|
if (!args.reason || !String(args.reason).trim()) {
|
|
184
207
|
throw new UsageError("Usage: akm proposal reject <id> --reason '<reason>' OR akm proposal reject --generator <generator> --reason '<reason>'", "MISSING_REQUIRED_ARGUMENT");
|
|
@@ -191,44 +214,17 @@ const proposalRejectCommand = defineJsonCommand({
|
|
|
191
214
|
process.stderr.write("Aborted.\n");
|
|
192
215
|
return;
|
|
193
216
|
}
|
|
194
|
-
const {
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
const maxDiffLines = rawMaxDiff;
|
|
205
|
-
const olderThanMs = rawOlderThan !== undefined ? rawOlderThan * 86_400_000 : undefined;
|
|
206
|
-
const pending = listProposals(stashDir, { status: "pending" }).filter((p) => {
|
|
207
|
-
if (p.source !== generator)
|
|
208
|
-
return false;
|
|
209
|
-
if (maxDiffLines !== undefined) {
|
|
210
|
-
const lines = (p.payload.content ?? "").split("\n").length;
|
|
211
|
-
if (lines > maxDiffLines)
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
|
-
if (olderThanMs !== undefined) {
|
|
215
|
-
const age = Date.now() - new Date(p.createdAt).getTime();
|
|
216
|
-
if (age < olderThanMs)
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
return true;
|
|
217
|
+
const { maxDiffLines, olderThanMs } = parseBulkFilterFlags(args);
|
|
218
|
+
const { count, results } = await bulkAdjudicateProposals({
|
|
219
|
+
action: "reject",
|
|
220
|
+
generator,
|
|
221
|
+
maxDiffLines,
|
|
222
|
+
olderThanMs,
|
|
223
|
+
dryRun: args["dry-run"],
|
|
224
|
+
queue: args.queue,
|
|
225
|
+
reason: String(args.reason),
|
|
220
226
|
});
|
|
221
|
-
|
|
222
|
-
for (const proposal of pending) {
|
|
223
|
-
if (args["dry-run"]) {
|
|
224
|
-
results.push({ id: proposal.id, ref: proposal.ref, source: proposal.source, dryRun: true });
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
const result = akmProposalReject({ id: proposal.id, reason: String(args.reason) });
|
|
228
|
-
results.push(result);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
output("proposal-reject-batch", { rejected: results.length, results, dryRun: args["dry-run"] });
|
|
227
|
+
output("proposal-reject-batch", { rejected: count, results, dryRun: args["dry-run"] });
|
|
232
228
|
return;
|
|
233
229
|
}
|
|
234
230
|
if (!args.id) {
|
|
@@ -242,7 +238,11 @@ const proposalRejectCommand = defineJsonCommand({
|
|
|
242
238
|
process.stderr.write("Aborted.\n");
|
|
243
239
|
return;
|
|
244
240
|
}
|
|
245
|
-
const result = akmProposalReject({
|
|
241
|
+
const result = await akmProposalReject({
|
|
242
|
+
id: args.id,
|
|
243
|
+
queue: args.queue,
|
|
244
|
+
reason: String(args.reason),
|
|
245
|
+
});
|
|
246
246
|
output("proposal-reject", result);
|
|
247
247
|
},
|
|
248
248
|
});
|
|
@@ -251,13 +251,14 @@ const proposalDiffCommand = defineJsonCommand({
|
|
|
251
251
|
args: {
|
|
252
252
|
id: {
|
|
253
253
|
type: "positional",
|
|
254
|
-
description: "Proposal id (uuid / prefix) or asset ref (e.g.
|
|
254
|
+
description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream)",
|
|
255
255
|
required: true,
|
|
256
256
|
},
|
|
257
|
-
|
|
257
|
+
queue: { type: "string", description: "Select the proposal queue by source name" },
|
|
258
|
+
target: { type: "string", description: "Diff destination; must match the proposal's recorded target" },
|
|
258
259
|
},
|
|
259
260
|
run({ args }) {
|
|
260
|
-
const result = akmProposalDiff({ id: args.id, target: args.target });
|
|
261
|
+
const result = akmProposalDiff({ id: args.id, queue: args.queue, target: args.target });
|
|
261
262
|
output("proposal-diff", result);
|
|
262
263
|
},
|
|
263
264
|
});
|
|
@@ -280,33 +281,34 @@ const proposalRevertCommand = defineJsonCommand({
|
|
|
280
281
|
args: {
|
|
281
282
|
id: {
|
|
282
283
|
type: "positional",
|
|
283
|
-
description: "Proposal id (full uuid) or asset ref (e.g.
|
|
284
|
+
description: "Proposal id (full uuid) or asset ref (e.g. skills/akm-dream). UUID prefixes are not supported for archived proposals — use the full UUID.",
|
|
284
285
|
required: true,
|
|
285
286
|
},
|
|
286
|
-
|
|
287
|
+
queue: { type: "string", description: "Select the proposal queue by source name" },
|
|
288
|
+
target: { type: "string", description: "Write destination; must match the proposal's recorded target" },
|
|
287
289
|
},
|
|
288
290
|
async run({ args }) {
|
|
289
291
|
const result = await akmProposalRevert({
|
|
290
292
|
id: args.id,
|
|
293
|
+
queue: args.queue,
|
|
291
294
|
target: args.target,
|
|
292
295
|
});
|
|
293
296
|
output("proposal-revert", result);
|
|
294
297
|
},
|
|
295
298
|
});
|
|
296
299
|
// `proposal show` (#225): show a single proposal with its validation findings.
|
|
297
|
-
// `akmProposalShow` already backs `akm show proposal <id>` (now deprecated); this
|
|
298
|
-
// is the canonical noun-group entry point.
|
|
299
300
|
const proposalShowCommand = defineJsonCommand({
|
|
300
301
|
meta: { name: "show", description: "Show a single proposal and its validation findings" },
|
|
301
302
|
args: {
|
|
302
303
|
id: {
|
|
303
304
|
type: "positional",
|
|
304
|
-
description: "Proposal id (uuid / prefix) or asset ref (e.g.
|
|
305
|
+
description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream)",
|
|
305
306
|
required: true,
|
|
306
307
|
},
|
|
308
|
+
queue: { type: "string", description: "Select the proposal queue by source name" },
|
|
307
309
|
},
|
|
308
310
|
run({ args }) {
|
|
309
|
-
const result = akmProposalShow({ id: args.id });
|
|
311
|
+
const result = akmProposalShow({ id: args.id, queue: args.queue });
|
|
310
312
|
output("proposal-show", result);
|
|
311
313
|
},
|
|
312
314
|
});
|
|
@@ -353,17 +355,21 @@ const proposalDrainCommand = defineJsonCommand({
|
|
|
353
355
|
description: "Opt into the judgment tier (llm by default; agent/sdk per config) for deferred items. No-op with a logged triage_deferred summary when no runner is configured.",
|
|
354
356
|
default: false,
|
|
355
357
|
},
|
|
356
|
-
|
|
358
|
+
strategy: {
|
|
357
359
|
type: "string",
|
|
358
|
-
description: "Read the triage block (policy, applyMode, ceilings, judgment) from this improve
|
|
360
|
+
description: "Read the triage block (policy, applyMode, ceilings, judgment) from this improve strategy.",
|
|
359
361
|
},
|
|
360
362
|
},
|
|
361
|
-
async run({ args }) {
|
|
363
|
+
async run({ args, rawArgs }) {
|
|
364
|
+
if (rawArgs.some((arg) => arg === "--profile" || arg.startsWith("--profile="))) {
|
|
365
|
+
throw new UsageError("proposal drain: --profile is retired; use --strategy.", "INVALID_FLAG_VALUE");
|
|
366
|
+
}
|
|
362
367
|
const stashDir = resolveStashDir();
|
|
363
368
|
const cfg = loadConfig();
|
|
364
|
-
// Phase 2: read the triage block from the named improve
|
|
369
|
+
// Phase 2: read the triage block from the named improve strategy. CLI flags
|
|
365
370
|
// always override config; config supplies defaults for any flag omitted.
|
|
366
|
-
const
|
|
371
|
+
const selectedStrategy = resolveImproveStrategy(args.strategy, cfg);
|
|
372
|
+
const triageConfig = selectedStrategy.config.processes?.triage;
|
|
367
373
|
const policy = resolveDrainPolicy(args.policy ?? triageConfig?.policy);
|
|
368
374
|
const dryRun = args["dry-run"] === true;
|
|
369
375
|
const applyMode = args.promote === true ? "promote" : (triageConfig?.applyMode ?? "queue");
|
|
@@ -404,10 +410,12 @@ const proposalDrainCommand = defineJsonCommand({
|
|
|
404
410
|
}
|
|
405
411
|
// Phase 3: resolve the judgment runner when --judgment is set. Default
|
|
406
412
|
// mode is llm; falls back to defaults.llm when the triage block sets
|
|
407
|
-
//
|
|
413
|
+
// no explicit engine selection. null when
|
|
408
414
|
// nothing is configured → the engine leaves deferred items unresolved and
|
|
409
415
|
// emits triage_deferred.
|
|
410
|
-
const judgment = args.judgment === true
|
|
416
|
+
const judgment = args.judgment === true
|
|
417
|
+
? resolveTriageJudgmentRunner(triageConfig?.judgment, cfg, triageConfig, selectedStrategy.config)
|
|
418
|
+
: null;
|
|
411
419
|
// #576: persist + attribute per-call LLM usage for the standalone drain
|
|
412
420
|
// path. `IfAbsent` keeps an enclosing `akm improve` sink in charge when
|
|
413
421
|
// drain runs as a sub-step; the disposer clears only a sink we installed.
|
|
@@ -416,6 +424,7 @@ const proposalDrainCommand = defineJsonCommand({
|
|
|
416
424
|
try {
|
|
417
425
|
result = await withLlmStage("drain", () => drainProposals({
|
|
418
426
|
stashDir,
|
|
427
|
+
config: cfg,
|
|
419
428
|
policy,
|
|
420
429
|
applyMode,
|
|
421
430
|
maxAccepts,
|
|
@@ -434,29 +443,28 @@ const proposalDrainCommand = defineJsonCommand({
|
|
|
434
443
|
policy: policy.name,
|
|
435
444
|
applyMode,
|
|
436
445
|
dryRun,
|
|
446
|
+
strategy: selectedStrategy.name,
|
|
447
|
+
judgmentEngine: judgment?.engine ?? null,
|
|
448
|
+
judgmentKind: judgment?.kind ?? null,
|
|
437
449
|
promoted: result.promoted,
|
|
438
450
|
rejected: result.rejected,
|
|
439
451
|
deferred: result.deferred,
|
|
440
452
|
skippedByCap: result.skippedByCap,
|
|
453
|
+
staged: result.staged,
|
|
441
454
|
});
|
|
442
455
|
},
|
|
443
456
|
});
|
|
444
|
-
// ── proposal noun group
|
|
445
|
-
//
|
|
446
|
-
// `akm proposal <verb>` is the canonical grammar in 0.8. The flat verbs
|
|
447
|
-
// (`proposals`/`accept`/`reject`/`diff`/`revert`) remain as deprecated aliases
|
|
448
|
-
// that warn to stderr and delegate to the same command bodies; they are removed
|
|
449
|
-
// in 0.9.0. Bare `akm proposal` behaves as `proposal list` (mirrors `akm env`).
|
|
457
|
+
// ── proposal noun group ───────────────────────────────────────────────────────
|
|
450
458
|
export const proposalCommand = defineGroupCommand({
|
|
451
|
-
meta: {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
type: "string",
|
|
455
|
-
description: "Filter by status (pending|accepted|rejected|reverted)",
|
|
456
|
-
},
|
|
457
|
-
ref: { type: "string", description: "Filter by asset ref (type:name)" },
|
|
458
|
-
type: { type: "string", description: "Filter by asset type" },
|
|
459
|
+
meta: {
|
|
460
|
+
name: "proposal",
|
|
461
|
+
description: "Manage the proposal queue: list, show, diff, accept, reject, revert, extract, new, drain",
|
|
459
462
|
},
|
|
463
|
+
// The group declared `--queue`/`--status`/`--ref`/`--type` only so the bare
|
|
464
|
+
// form could act as `proposal list`. That form is gone (see below), and
|
|
465
|
+
// `proposalListCommand` declares the identical set, so keeping them here
|
|
466
|
+
// would just advertise flags in `akm proposal --help` that no group-level
|
|
467
|
+
// body reads.
|
|
460
468
|
subCommands: {
|
|
461
469
|
list: proposalListCommand,
|
|
462
470
|
show: proposalShowCommand,
|
|
@@ -465,16 +473,10 @@ export const proposalCommand = defineGroupCommand({
|
|
|
465
473
|
reject: proposalRejectCommand,
|
|
466
474
|
revert: proposalRevertCommand,
|
|
467
475
|
drain: proposalDrainCommand,
|
|
476
|
+
extract: extractCommand,
|
|
477
|
+
new: proposeCommand,
|
|
468
478
|
},
|
|
469
|
-
//
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
const result = akmProposalList({
|
|
473
|
-
status,
|
|
474
|
-
ref: args.ref,
|
|
475
|
-
type: args.type,
|
|
476
|
-
includeArchive: status === "accepted" || status === "rejected" || status === "reverted",
|
|
477
|
-
});
|
|
478
|
-
output("proposal-list", result);
|
|
479
|
-
},
|
|
479
|
+
// No `defaultRun`: bare `akm proposal [--status …]` is a usage error (exit 2),
|
|
480
|
+
// the canonical bare-group behavior — owner ruling 12. `akm proposal list`
|
|
481
|
+
// takes the same flags and produces what the bare form used to.
|
|
480
482
|
});
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
// ── Source allow-list (F-4 / #385) ──────────────────────────────────────────
|
|
5
|
+
/**
|
|
6
|
+
* Curated allow-list of valid `source` values for proposals (F-4 / #385).
|
|
7
|
+
*
|
|
8
|
+
* Rationale (W3C PROV-DM 2013): Provenance records require typed, validated
|
|
9
|
+
* sources for meaningful aggregation. Accept-rate-per-source is the core
|
|
10
|
+
* self-measurement metric for recursive self-improvement: if reflect proposals
|
|
11
|
+
* are accepted at 20% and distill proposals at 60%, that guides resource
|
|
12
|
+
* allocation. Free-text typos (`"reflct"`) produce unaggregatable events.
|
|
13
|
+
*
|
|
14
|
+
* Automated sources (those in {@link AUTOMATED_PROPOSAL_SOURCES}) require a
|
|
15
|
+
* `sourceRun` field for full PROV-DM traceability.
|
|
16
|
+
*/
|
|
17
|
+
export const PROPOSAL_SOURCES = [
|
|
18
|
+
// Automated sources — require sourceRun for traceability.
|
|
19
|
+
"reflect",
|
|
20
|
+
"distill",
|
|
21
|
+
"consolidate",
|
|
22
|
+
"extract",
|
|
23
|
+
"improve",
|
|
24
|
+
// Semi-automated / tool-driven.
|
|
25
|
+
"feedback",
|
|
26
|
+
// Human-initiated / CLI-driven.
|
|
27
|
+
"propose",
|
|
28
|
+
"remember",
|
|
29
|
+
"import",
|
|
30
|
+
// Internal / system.
|
|
31
|
+
"distill_quality_rejected",
|
|
32
|
+
"schema-repair",
|
|
33
|
+
];
|
|
34
|
+
/** Automated sources that SHOULD include a `sourceRun` for PROV-DM traceability. */
|
|
35
|
+
export const AUTOMATED_PROPOSAL_SOURCES = [
|
|
36
|
+
"reflect",
|
|
37
|
+
"distill",
|
|
38
|
+
"consolidate",
|
|
39
|
+
"extract",
|
|
40
|
+
"improve",
|
|
41
|
+
"schema-repair",
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Check whether a string is a valid {@link ProposalSource}.
|
|
45
|
+
* Unknown source values are accepted with a runtime warning rather than a hard
|
|
46
|
+
* error, to allow extensions without breaking existing callers.
|
|
47
|
+
*/
|
|
48
|
+
export function isValidProposalSource(source) {
|
|
49
|
+
return PROPOSAL_SOURCES.includes(source);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check whether a source value is an automated source requiring `sourceRun`.
|
|
53
|
+
*/
|
|
54
|
+
export function isAutomatedProposalSource(source) {
|
|
55
|
+
return AUTOMATED_PROPOSAL_SOURCES.includes(source);
|
|
56
|
+
}
|