akm-cli 0.9.0-rc.9 → 0.9.1-beta.1
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 +1770 -44
- package/README.md +38 -47
- package/SECURITY.md +14 -1
- package/STABILITY.md +499 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -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 +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +74 -89
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +148 -88
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/llm-usage.js +2 -1
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +4 -122
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +160 -35
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +11 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +101 -55
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +254 -101
- package/dist/commands/improve/locks.js +7 -0
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +14 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/run-context.js +5 -0
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/session-asset.js +4 -0
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +51 -131
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +444 -88
- package/dist/commands/lint/types.js +22 -1
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +718 -279
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +30 -7
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +387 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +284 -423
- package/dist/commands/workflow-cli.js +181 -450
- package/dist/core/abort-deadline.js +28 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +67 -5
- package/dist/core/adapter/adapters/akm-adapter.js +60 -38
- package/dist/core/adapter/adapters/akm-lint.js +109 -42
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +54 -31
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +13 -6
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +29 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +218 -44
- package/dist/core/concurrent.js +32 -0
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +14 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +43 -12
- package/dist/core/events.js +76 -152
- package/dist/core/file-change.js +6 -5
- package/dist/core/file-lock.js +7 -1
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +6 -100
- package/dist/core/json-schema.js +327 -9
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/loopback.js +89 -0
- package/dist/core/migration-operation.js +33 -2
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/path-access.js +107 -0
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +98 -17
- package/dist/core/spawn-env.js +234 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db-scope.js +134 -0
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +182 -36
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-provenance.js +85 -0
- package/dist/core/write-source.js +778 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +17 -30
- package/dist/indexer/ensure-index.js +11 -3
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +33 -24
- package/dist/indexer/indexer.js +551 -253
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +15 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +107 -69
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/engine-resolution.js +24 -11
- package/dist/integrations/agent/model-aliases.js +1 -1
- package/dist/integrations/agent/profiles.js +23 -1
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +20 -93
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +132 -8
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -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 +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +56 -0
- package/dist/{migrate-storage-node.mjs → output/text/lint.js} +2 -5
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/{save.js → sync.js} +2 -2
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- 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 +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60972 -0
- package/dist/scripts/akm-migrate.js +60310 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- 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 +25 -23
- package/dist/sources/providers/git-stash.js +414 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +686 -282
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +13 -1
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +21 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +44 -8
- package/dist/storage/repositories/index-entries-repository.js +157 -241
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +118 -53
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/log-redaction.js +156 -0
- package/dist/tasks/parser.js +87 -160
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +209 -44
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +89 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/concurrency-policy.js +95 -1
- package/dist/workflows/exec/dispatch-redaction.js +114 -0
- package/dist/workflows/exec/exec-unit.js +542 -0
- package/dist/workflows/exec/frozen-judge.js +130 -32
- package/dist/workflows/exec/native-executor.js +513 -274
- package/dist/workflows/exec/param-secrets.js +12 -11
- package/dist/workflows/exec/run-workflow.js +496 -237
- package/dist/workflows/exec/step-work.js +616 -412
- package/dist/workflows/exec/unit-dispatch.js +34 -0
- package/dist/workflows/exec/unit-writer.js +53 -13
- package/dist/workflows/exec/worktree.js +454 -41
- package/dist/workflows/ir/compile.js +166 -271
- package/dist/workflows/ir/freeze.js +119 -42
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +129 -45
- package/dist/workflows/parser.js +1070 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +31 -10
- package/dist/workflows/renderer.js +123 -68
- package/dist/workflows/resource-limits.js +184 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +331 -132
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +47 -38
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +110 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +209 -27
- package/docs/migration/v0.7-to-v0.8.md +48 -48
- package/docs/migration/v0.8-to-v0.9.md +567 -209
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +19 -0
- package/docs/reference/bundle-types.md +19 -0
- package/docs/reference/cli.md +2342 -0
- package/docs/reference/configuration.md +371 -0
- package/docs/reference/data-and-telemetry.md +129 -46
- package/docs/reference/supported-formats.md +50 -0
- package/docs/reference/workflow-schema.md +1014 -0
- package/docs/reference/workflows.md +51 -0
- package/package.json +31 -13
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +89 -128
- package/schemas/akm-task.json +27 -5
- package/schemas/akm-workflow.json +157 -81
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1878
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1231
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -257
- package/dist/migrate/legacy/content-migration.js +0 -350
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -80
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -278
- package/dist/migrate/legacy/three-db-cutover.js +0 -845
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- 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/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { resolveStashDir } from "../../core/common.js";
|
|
15
15
|
import { loadConfig } from "../../core/config/config.js";
|
|
16
|
+
import { resolveWriteTarget } from "../../core/write-source.js";
|
|
16
17
|
import { withAssetMutationLease } from "../../indexer/index-writer-lock.js";
|
|
17
|
-
import { createProposal, diffProposal,
|
|
18
|
+
import { createProposal, diffProposal, isProposalSkipped, listProposals, preflightProposalPromotion, promoteProposal, proposalContent, recoverProposalTransactionsForStash, rejectProposalDurably, resolveProposalId, resolveProposalIdForReject, revertProposal, } from "./repository.js";
|
|
18
19
|
import { validateProposal } from "./validators/proposals.js";
|
|
19
20
|
// ── Shared helpers ──────────────────────────────────────────────────────────
|
|
20
21
|
function resolveStash(stashDir) {
|
|
@@ -22,6 +23,14 @@ function resolveStash(stashDir) {
|
|
|
22
23
|
return stashDir;
|
|
23
24
|
return resolveStashDir();
|
|
24
25
|
}
|
|
26
|
+
function resolveProposalQueue(stashDir, queue, config) {
|
|
27
|
+
if (stashDir)
|
|
28
|
+
return { stashDir };
|
|
29
|
+
if (!queue)
|
|
30
|
+
return { stashDir: resolveStash() };
|
|
31
|
+
const target = resolveWriteTarget(config ?? loadConfig(), queue);
|
|
32
|
+
return { stashDir: target.source.path, target };
|
|
33
|
+
}
|
|
25
34
|
/**
|
|
26
35
|
* Thin in-process read of the pending proposal queue, used by the health HTML
|
|
27
36
|
* report builder (#582) so it never shells out to `akm proposal list`.
|
|
@@ -34,7 +43,7 @@ export function listPendingProposals(stashDir) {
|
|
|
34
43
|
return listProposals(resolveStash(stashDir), { status: "pending" });
|
|
35
44
|
}
|
|
36
45
|
export function akmProposalList(options = {}) {
|
|
37
|
-
const stash =
|
|
46
|
+
const { stashDir: stash } = resolveProposalQueue(options.stashDir, options.queue, options.config);
|
|
38
47
|
// `--status accepted|rejected|reverted` implies archive-inclusion since the
|
|
39
48
|
// live queue only ever contains pending entries.
|
|
40
49
|
const includeArchive = options.includeArchive === true ||
|
|
@@ -50,19 +59,37 @@ export function akmProposalList(options = {}) {
|
|
|
50
59
|
return { schemaVersion: 1, totalCount: proposals.length, proposals };
|
|
51
60
|
}
|
|
52
61
|
export function akmProposalShow(options) {
|
|
53
|
-
const
|
|
54
|
-
const
|
|
62
|
+
const queue = resolveProposalQueue(options.stashDir, options.queue, options.config);
|
|
63
|
+
const stash = queue.stashDir;
|
|
64
|
+
const proposal = resolveProposalId(stash, options.id);
|
|
65
|
+
let validation = validateProposal(proposal);
|
|
66
|
+
// An explicit stashDir without config is an in-process storage test seam; it
|
|
67
|
+
// has no authenticated write-target context to preflight against.
|
|
68
|
+
if (validation.ok &&
|
|
69
|
+
proposal.status === "pending" &&
|
|
70
|
+
(options.config !== undefined || options.stashDir === undefined)) {
|
|
71
|
+
try {
|
|
72
|
+
preflightProposalPromotion(options.config ?? loadConfig(), proposal, { queueTarget: queue.target });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
validation = {
|
|
76
|
+
ok: false,
|
|
77
|
+
findings: [{ kind: "promotion", message: error instanceof Error ? error.message : String(error) }],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
55
81
|
return {
|
|
56
82
|
schemaVersion: 1,
|
|
57
83
|
proposal,
|
|
58
|
-
validation
|
|
84
|
+
validation,
|
|
59
85
|
};
|
|
60
86
|
}
|
|
61
87
|
export async function akmProposalAccept(options) {
|
|
62
|
-
const stash = resolveStash(options.stashDir);
|
|
63
88
|
const config = options.config ?? loadConfig();
|
|
89
|
+
const queue = resolveProposalQueue(options.stashDir, options.queue, config);
|
|
90
|
+
const stash = queue.stashDir;
|
|
64
91
|
const resolvedId = resolveProposalId(stash, options.id).id;
|
|
65
|
-
const result = await promoteProposal(stash, config, resolvedId, { target: options.target }, options.ctx);
|
|
92
|
+
const result = await promoteProposal(stash, config, resolvedId, { target: options.target, queueTarget: queue.target, gateDecision: options.gateDecision }, options.ctx);
|
|
66
93
|
return {
|
|
67
94
|
schemaVersion: 1,
|
|
68
95
|
ok: true,
|
|
@@ -74,11 +101,14 @@ export async function akmProposalAccept(options) {
|
|
|
74
101
|
}
|
|
75
102
|
export async function akmProposalReject(options) {
|
|
76
103
|
return withAssetMutationLease("proposal-reject", async () => {
|
|
77
|
-
const stash = resolveStash(options.stashDir);
|
|
78
104
|
const config = options.config ?? loadConfig();
|
|
79
|
-
const
|
|
105
|
+
const { stashDir: stash } = resolveProposalQueue(options.stashDir, options.queue, config);
|
|
106
|
+
// resolveProposalIdForReject tolerates a legacy row whose metadata fails
|
|
107
|
+
// strict decoding — resolveProposalId's exact-UUID match would otherwise
|
|
108
|
+
// throw here, before the terminal-status machinery even runs.
|
|
109
|
+
const proposalId = resolveProposalIdForReject(stash, options.id, options.ctx);
|
|
80
110
|
await recoverProposalTransactionsForStash(stash, config, options.ctx, proposalId);
|
|
81
|
-
const updated = rejectProposalDurably(stash, proposalId, options.reason, options.ctx);
|
|
111
|
+
const updated = rejectProposalDurably(stash, proposalId, options.reason, options.ctx, options.gateDecision);
|
|
82
112
|
return {
|
|
83
113
|
schemaVersion: 1,
|
|
84
114
|
ok: true,
|
|
@@ -90,10 +120,11 @@ export async function akmProposalReject(options) {
|
|
|
90
120
|
});
|
|
91
121
|
}
|
|
92
122
|
export function akmProposalDiff(options) {
|
|
93
|
-
const stash = resolveStash(options.stashDir);
|
|
94
123
|
const config = options.config ?? loadConfig();
|
|
124
|
+
const queue = resolveProposalQueue(options.stashDir, options.queue, config);
|
|
125
|
+
const stash = queue.stashDir;
|
|
95
126
|
const proposal = resolveProposalId(stash, options.id);
|
|
96
|
-
const diff = diffProposal(stash, config, proposal.id, { target: options.target });
|
|
127
|
+
const diff = diffProposal(stash, config, proposal.id, { target: options.target, queueTarget: queue.target });
|
|
97
128
|
return {
|
|
98
129
|
schemaVersion: 1,
|
|
99
130
|
id: proposal.id,
|
|
@@ -104,12 +135,15 @@ export function akmProposalDiff(options) {
|
|
|
104
135
|
};
|
|
105
136
|
}
|
|
106
137
|
export function akmProposalCreate(options) {
|
|
107
|
-
const
|
|
138
|
+
const queue = resolveProposalQueue(options.stashDir, options.queue, options.config);
|
|
139
|
+
const stash = queue.stashDir;
|
|
140
|
+
const target = options.target ?? (queue.target ? { source: queue.target.source.name, root: queue.target.source.path } : undefined);
|
|
108
141
|
// Manual proposal creation (via `akm proposal create`) always bypasses
|
|
109
142
|
// dedup/cooldown guards — the operator is explicitly requesting a proposal.
|
|
110
143
|
const result = createProposal(stash, {
|
|
111
144
|
ref: options.ref,
|
|
112
145
|
source: options.source,
|
|
146
|
+
...(target !== undefined ? { target } : {}),
|
|
113
147
|
...(options.sourceRun !== undefined ? { sourceRun: options.sourceRun } : {}),
|
|
114
148
|
payload: options.payload,
|
|
115
149
|
force: true,
|
|
@@ -137,10 +171,11 @@ export function akmProposalCreate(options) {
|
|
|
137
171
|
* `rejected`.
|
|
138
172
|
*/
|
|
139
173
|
export async function akmProposalRevert(options) {
|
|
140
|
-
const stash = resolveStash(options.stashDir);
|
|
141
174
|
const config = options.config ?? loadConfig();
|
|
175
|
+
const queue = resolveProposalQueue(options.stashDir, options.queue, config);
|
|
176
|
+
const stash = queue.stashDir;
|
|
142
177
|
const resolvedId = resolveProposalId(stash, options.id).id;
|
|
143
|
-
const result = await revertProposal(stash, config, resolvedId, { target: options.target }, options.ctx);
|
|
178
|
+
const result = await revertProposal(stash, config, resolvedId, { target: options.target, queueTarget: queue.target }, options.ctx);
|
|
144
179
|
return {
|
|
145
180
|
schemaVersion: 1,
|
|
146
181
|
ok: true,
|
|
@@ -158,7 +193,8 @@ export async function akmProposalRevert(options) {
|
|
|
158
193
|
* dry-run record shape. The destructive-confirmation prompt stays CLI-side.
|
|
159
194
|
*/
|
|
160
195
|
export async function bulkAdjudicateProposals(options) {
|
|
161
|
-
const
|
|
196
|
+
const config = options.config ?? loadConfig();
|
|
197
|
+
const { stashDir } = resolveProposalQueue(options.stashDir, options.queue, config);
|
|
162
198
|
const pending = listProposals(stashDir, { status: "pending" }).filter((p) => {
|
|
163
199
|
if (p.source !== options.generator)
|
|
164
200
|
return false;
|
|
@@ -180,10 +216,10 @@ export async function bulkAdjudicateProposals(options) {
|
|
|
180
216
|
results.push({ id: proposal.id, ref: proposal.ref, source: proposal.source, dryRun: true });
|
|
181
217
|
}
|
|
182
218
|
else if (options.action === "accept") {
|
|
183
|
-
results.push(await akmProposalAccept({ id: proposal.id, target: options.target }));
|
|
219
|
+
results.push(await akmProposalAccept({ stashDir, id: proposal.id, queue: options.queue, target: options.target, config }));
|
|
184
220
|
}
|
|
185
221
|
else {
|
|
186
|
-
results.push(await akmProposalReject({ id: proposal.id, reason: options.reason }));
|
|
222
|
+
results.push(await akmProposalReject({ stashDir, id: proposal.id, queue: options.queue, reason: options.reason, config }));
|
|
187
223
|
}
|
|
188
224
|
}
|
|
189
225
|
return { count: results.length, results };
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
* `akm proposal new` — the asset-authoring entry point (formerly the
|
|
6
|
+
* top-level `akm propose`, moved under the `proposal` group per the 0.9 CLI
|
|
7
|
+
* overhaul, S8). Shares no private helper with the proposal MANAGEMENT
|
|
8
|
+
* family (list/show/accept/reject/…, `./proposal-cli.ts`) — its path/name
|
|
9
|
+
* helpers come from the shared src/core/asset/asset-create.ts module.
|
|
10
|
+
*
|
|
11
|
+
* Keeps the inline `runWithJsonErrors` form (branches on the result and sets
|
|
12
|
+
* `process.exitCode` conditionally on a failed proposal) rather than
|
|
13
|
+
* migrating to `defineJsonCommand`, matching the original contribute-cli.ts
|
|
14
|
+
* rationale: `process.exitCode` (not `process.exit()`) so the process still
|
|
15
|
+
* exits via natural event-loop drain rather than skipping pending cleanup.
|
|
16
|
+
*/
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import { defineCommand } from "citty";
|
|
20
|
+
import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
|
|
21
|
+
import { EXIT_CODES, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
|
|
22
|
+
import { assertFlatAssetName, combineCreatePath, normalizeCreateSubPath } from "../../core/asset/asset-create.js";
|
|
23
|
+
import { UsageError } from "../../core/errors.js";
|
|
24
|
+
import { akmPropose } from "./propose.js";
|
|
25
|
+
const EXIT_GENERAL = EXIT_CODES.GENERAL;
|
|
26
|
+
export const proposeCommand = defineCommand({
|
|
27
|
+
meta: {
|
|
28
|
+
name: "new",
|
|
29
|
+
description: "Ask the configured agent CLI to author a brand-new asset and queue it as a proposal",
|
|
30
|
+
},
|
|
31
|
+
// Raw defineCommand: declare the global output flags so their space-separated
|
|
32
|
+
// values are consumed rather than shifting the `type` / `name` positionals.
|
|
33
|
+
args: {
|
|
34
|
+
...GLOBAL_OUTPUT_ARGS,
|
|
35
|
+
// Optional in citty so run() is invoked when omitted; we re-validate
|
|
36
|
+
// below to surface a structured UsageError (exit 2) instead of citty's
|
|
37
|
+
// default help-banner exit-0.
|
|
38
|
+
type: { type: "positional", description: "Asset type (skill, command, knowledge, lesson, ...)", required: false },
|
|
39
|
+
name: {
|
|
40
|
+
type: "positional",
|
|
41
|
+
description: "Asset name (flat, no '/'; use --path for a subdirectory)",
|
|
42
|
+
required: false,
|
|
43
|
+
},
|
|
44
|
+
path: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "Relative subdirectory under the type dir to place the proposed asset in (e.g. 'release'). The filename comes from the name.",
|
|
47
|
+
},
|
|
48
|
+
task: { type: "string", description: "Task description for the agent (what should the asset do?)" },
|
|
49
|
+
file: { type: "string", description: "Read the task or prompt text from a UTF-8 file" },
|
|
50
|
+
engine: { type: "string", description: "Engine to use (defaults to defaults.engine)" },
|
|
51
|
+
"timeout-ms": { type: "string", description: "Override the agent CLI timeout in milliseconds" },
|
|
52
|
+
},
|
|
53
|
+
async run({ args }) {
|
|
54
|
+
await runWithJsonErrors(async () => {
|
|
55
|
+
// citty silently shows help and exits 0 when required positionals are
|
|
56
|
+
// omitted. Re-validate explicitly so the exit code is 2 (USAGE) and a
|
|
57
|
+
// structured JSON error reaches scripted callers.
|
|
58
|
+
const taskFromFlag = typeof args.task === "string" ? args.task : undefined;
|
|
59
|
+
const fileFromFlag = typeof args.file === "string" ? args.file : undefined;
|
|
60
|
+
if (!args.type || !args.name || (!taskFromFlag && !fileFromFlag)) {
|
|
61
|
+
throw new UsageError("Usage: akm proposal new <type> <name> (--task '<task>' | --file <path>).", "MISSING_REQUIRED_ARGUMENT", "Provide the asset type, name, and exactly one of --task or --file.");
|
|
62
|
+
}
|
|
63
|
+
if (taskFromFlag && fileFromFlag) {
|
|
64
|
+
throw new UsageError("Pass exactly one of --task or --file.", "INVALID_FLAG_VALUE");
|
|
65
|
+
}
|
|
66
|
+
// `name` is flat; subdirectory placement is `--path`'s job.
|
|
67
|
+
assertFlatAssetName(String(args.name));
|
|
68
|
+
const proposedName = combineCreatePath(normalizeCreateSubPath(getStringArg(args, "path")), String(args.name));
|
|
69
|
+
const taskText = fileFromFlag ? fs.readFileSync(path.resolve(fileFromFlag), "utf8") : (taskFromFlag ?? "");
|
|
70
|
+
const timeoutMs = parsePositiveIntFlag(args["timeout-ms"], "--timeout-ms");
|
|
71
|
+
const result = await akmPropose({
|
|
72
|
+
type: String(args.type),
|
|
73
|
+
name: proposedName,
|
|
74
|
+
task: taskText,
|
|
75
|
+
engine: getStringArg(args, "engine"),
|
|
76
|
+
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
77
|
+
});
|
|
78
|
+
output("proposal-new", result);
|
|
79
|
+
if (result.ok === false) {
|
|
80
|
+
// Same reasoning as agentCommand in contribute-cli.ts: output() already
|
|
81
|
+
// ran, this is the last statement in the handler, so process.exitCode +
|
|
82
|
+
// return is equivalent without skipping any pending cleanup.
|
|
83
|
+
process.exitCode = EXIT_GENERAL;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
});
|
|
@@ -20,12 +20,14 @@ import { ConfigError, UsageError } from "../../core/errors.js";
|
|
|
20
20
|
import { appendEvent } from "../../core/events.js";
|
|
21
21
|
import { redactSensitiveText } from "../../core/redaction.js";
|
|
22
22
|
import { resolveStandardsContext } from "../../core/standards/resolve-standards-context.js";
|
|
23
|
-
import {
|
|
23
|
+
import { warn } from "../../core/warn.js";
|
|
24
|
+
import { deriveEntryProvenance } from "../../indexer/installations.js";
|
|
25
|
+
import { fallbackAnnouncement, NO_ENGINE_MESSAGE_SUFFIX, NO_ENGINE_REMEDY, withEngineFallback, } from "../../integrations/agent/engine-fallback.js";
|
|
24
26
|
import { resolveEngine } from "../../integrations/agent/engine-resolution.js";
|
|
25
27
|
import { buildProposePrompt, parseAgentProposalPayload } from "../../integrations/agent/prompts.js";
|
|
26
28
|
import { collectDispatchSensitiveValues, executeRunner } from "../../integrations/agent/runner-dispatch.js";
|
|
27
29
|
import { baseFailureFields, enoentHintMessage, isEnoentFailure } from "../agent/agent-support.js";
|
|
28
|
-
import { createProposal, isProposalSkipped, } from "./repository.js";
|
|
30
|
+
import { createProposal, isProposalSkipped, resolveProposalQueueTarget, } from "./repository.js";
|
|
29
31
|
function failureEnvelope(result, type, name, engine, fallbackReason = "non_zero_exit") {
|
|
30
32
|
return {
|
|
31
33
|
...baseFailureFields(result, fallbackReason),
|
|
@@ -44,8 +46,7 @@ function failureEnvelope(result, type, name, engine, fallbackReason = "non_zero_
|
|
|
44
46
|
* uses). Matches `createProposal`'s durable `proposals.ref` mint, so the entry
|
|
45
47
|
* event, the fallback ref, and the stored proposal all carry one spelling.
|
|
46
48
|
*/
|
|
47
|
-
function proposeItemRef(
|
|
48
|
-
const bundleId = deriveInstallations([{ path: stashDir, writable: true }])[0]?.id ?? slugForPath(stashDir);
|
|
49
|
+
function proposeItemRef(bundleId, type, name) {
|
|
49
50
|
return deriveEntryProvenance({ bundleId, componentId: bundleId, adapterId: "akm" }, type, name).itemRef;
|
|
50
51
|
}
|
|
51
52
|
/**
|
|
@@ -53,10 +54,10 @@ function proposeItemRef(stashDir, type, name) {
|
|
|
53
54
|
* fully-qualified item_ref the durable proposal is minted under
|
|
54
55
|
* (`proposeItemRef`), so the entry event and the stored proposal agree.
|
|
55
56
|
*/
|
|
56
|
-
function emitProposeInvoked(
|
|
57
|
+
function emitProposeInvoked(bundleId, options) {
|
|
57
58
|
appendEvent({
|
|
58
59
|
eventType: "propose_invoked",
|
|
59
|
-
ref: proposeItemRef(
|
|
60
|
+
ref: proposeItemRef(bundleId, options.type, options.name),
|
|
60
61
|
metadata: {
|
|
61
62
|
type: options.type,
|
|
62
63
|
name: options.name,
|
|
@@ -79,15 +80,21 @@ export async function akmPropose(options) {
|
|
|
79
80
|
throw new UsageError(`propose: unknown asset type "${options.type}". Known types: ${[...placementTypes()].sort().join(", ")}.`, "INVALID_FLAG_VALUE");
|
|
80
81
|
}
|
|
81
82
|
const stash = options.stashDir ?? resolveStashDir();
|
|
82
|
-
// 1.
|
|
83
|
-
emitProposeInvoked(stash, options);
|
|
84
|
-
// 2. Resolve the selected engine exactly once. Propose accepts either kind;
|
|
83
|
+
// 1. Resolve the selected engine and write target exactly once.
|
|
85
84
|
// the LLM arm uses the caller-specific plain-chat handler below.
|
|
86
85
|
const config = options.agentConfig ?? (await import("../../core/config/config.js")).loadConfig();
|
|
87
|
-
const
|
|
86
|
+
const target = resolveProposalQueueTarget(stash, config);
|
|
87
|
+
emitProposeInvoked(target.source, options);
|
|
88
|
+
const { config: engineConfig, fallbackEngineName } = withEngineFallback(config);
|
|
89
|
+
const engineName = options.engine ?? engineConfig.defaults?.engine;
|
|
90
|
+
// Announced, never silent: `options.engine` outranks the default, so the
|
|
91
|
+
// fallback is only reportable when it is the engine actually selected.
|
|
92
|
+
const engineAnnouncement = fallbackAnnouncement(fallbackEngineName, engineName);
|
|
93
|
+
if (engineAnnouncement)
|
|
94
|
+
warn(engineAnnouncement);
|
|
88
95
|
if (!engineName)
|
|
89
|
-
throw new ConfigError(
|
|
90
|
-
const runner = resolveEngine(engineName,
|
|
96
|
+
throw new ConfigError(`propose ${NO_ENGINE_MESSAGE_SUFFIX} ${NO_ENGINE_REMEDY}`, "INVALID_CONFIG_FILE");
|
|
97
|
+
const runner = resolveEngine(engineName, engineConfig);
|
|
91
98
|
const profile = runner.kind === "llm" ? undefined : runner.profile;
|
|
92
99
|
// 3. Build prompt.
|
|
93
100
|
// Synthesize a temp draft path so opencode can write the asset content
|
|
@@ -158,7 +165,7 @@ export async function akmPropose(options) {
|
|
|
158
165
|
const draftContent = fs.readFileSync(resolvedDraftPath, "utf8");
|
|
159
166
|
fs.unlinkSync(resolvedDraftPath);
|
|
160
167
|
payload = {
|
|
161
|
-
ref: proposeItemRef(
|
|
168
|
+
ref: proposeItemRef(target.source, options.type, options.name),
|
|
162
169
|
content: draftContent,
|
|
163
170
|
};
|
|
164
171
|
}
|
|
@@ -201,7 +208,7 @@ export async function akmPropose(options) {
|
|
|
201
208
|
// 6. Insert the proposal. Note: we allow the agent's `ref` to normalise the
|
|
202
209
|
// asset name (e.g. path-cleanup), but only after validating that the ref is
|
|
203
210
|
// well-formed and the type still matches the requested type.
|
|
204
|
-
const expectedRef = proposeItemRef(
|
|
211
|
+
const expectedRef = proposeItemRef(target.source, options.type, options.name);
|
|
205
212
|
let ref = expectedRef;
|
|
206
213
|
if (payload.ref) {
|
|
207
214
|
let parsedRef;
|
|
@@ -236,12 +243,13 @@ export async function akmPropose(options) {
|
|
|
236
243
|
...(result.stderr ? { stderr: result.stderr } : {}),
|
|
237
244
|
};
|
|
238
245
|
}
|
|
239
|
-
ref = proposeItemRef(
|
|
246
|
+
ref = proposeItemRef(target.source, parsedRef.type, parsedRef.name);
|
|
240
247
|
}
|
|
241
248
|
const createInput = {
|
|
242
249
|
ref,
|
|
243
250
|
source: "propose",
|
|
244
251
|
sourceRun: `propose-${Date.now()}`,
|
|
252
|
+
target,
|
|
245
253
|
// User-initiated proposals always bypass dedup/cooldown guards — the
|
|
246
254
|
// operator is explicitly asking for a new proposal.
|
|
247
255
|
force: true,
|