akm-cli 0.9.16 → 0.9.17-alpha.10
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 +2101 -0
- package/STABILITY.md +11 -10
- package/dist/akm +124 -193
- package/dist/akm-migrate +38 -19
- package/dist/assets/hints/cli-hints-full.md +6 -7
- package/dist/assets/improve-strategies/catchup.json +0 -3
- package/dist/assets/improve-strategies/consolidate.json +0 -1
- package/dist/assets/improve-strategies/default.json +1 -2
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
- package/dist/assets/improve-strategies/quick.json +1 -2
- package/dist/assets/improve-strategies/reflect-distill.json +1 -2
- package/dist/assets/improve-strategies/thorough.json +0 -3
- package/dist/assets/prompts/consolidate-pair.md +20 -0
- package/dist/assets/prompts/consolidate-system.md +4 -11
- package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
- package/dist/assets/templates/html/health.html +3 -5
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +6 -2
- package/dist/cli/unknown-flags.js +24 -1
- package/dist/cli.js +68 -10
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +6 -0
- package/dist/commands/health/archive-usage.js +92 -0
- package/dist/commands/health/checks.js +83 -74
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/data-dir-usage.js +25 -13
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +1 -42
- package/dist/commands/health/improve-metrics.js +136 -591
- package/dist/commands/health/md-report.js +1 -6
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +14 -120
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -74
- package/dist/commands/health.js +145 -143
- package/dist/commands/improve/consolidate/chunking.js +26 -117
- package/dist/commands/improve/consolidate/continuity-check.js +137 -0
- package/dist/commands/improve/consolidate/pair-pass.js +791 -0
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +589 -1127
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1041
- package/dist/commands/improve/eligibility.js +126 -390
- package/dist/commands/improve/execution.js +8 -10
- package/dist/commands/improve/extract-prompt.js +1 -2
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +75 -169
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +52 -4
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +480 -1074
- package/dist/commands/improve/ledger.js +119 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +415 -1073
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +16 -118
- package/dist/commands/improve/memory/memory-improve.js +266 -14
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -15
- package/dist/commands/improve/preparation.js +779 -2319
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +642 -1353
- package/dist/commands/improve/retrieval-gate.js +127 -0
- package/dist/commands/improve/retrieval-scope.js +92 -0
- package/dist/commands/improve/salience.js +41 -240
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +322 -0
- package/dist/commands/lint/base-linter.js +37 -15
- package/dist/commands/proposal/drain.js +261 -578
- package/dist/commands/proposal/proposal-cli.js +19 -20
- package/dist/commands/proposal/proposal-types.js +31 -24
- package/dist/commands/proposal/proposal.js +38 -8
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +1097 -1394
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +22 -89
- package/dist/commands/read/curate.js +105 -462
- package/dist/commands/read/knowledge.js +3 -2
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +57 -108
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +4 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +127 -29
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/source-manage.js +9 -2
- package/dist/commands/sources/stash-cli.js +24 -4
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +12 -13
- package/dist/commands/tasks/tasks.js +350 -936
- package/dist/commands/tasks/validate.js +26 -24
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +2 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +42 -12
- package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/asset-placement.js +4 -13
- package/dist/core/asset/frontmatter.js +106 -1
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +285 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +9 -34
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +184 -111
- package/dist/core/config/engine-semantics.js +0 -2
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +54 -125
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/index-config.js +9 -48
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-change.js +13 -5
- package/dist/core/file-lock.js +76 -173
- package/dist/core/improve-result.js +35 -7
- package/dist/core/improve-types.js +0 -1
- package/dist/core/logs-db.js +2 -2
- package/dist/core/loopback.js +7 -12
- package/dist/core/non-task-input.js +20 -0
- package/dist/core/parse.js +13 -16
- package/dist/core/paths.js +0 -24
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +123 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/time.js +0 -20
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +294 -1005
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/ensure-index.js +77 -73
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +141 -154
- package/dist/indexer/indexer.js +400 -1124
- package/dist/indexer/links/declared-links.js +90 -0
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +96 -90
- package/dist/indexer/passes/metadata.js +132 -219
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +2 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +190 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +36 -7
- package/dist/indexer/walk/walker.js +3 -4
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/client.js +18 -6
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +11 -17
- package/dist/llm/feature-gate.js +0 -8
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +25 -38
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +69 -31
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +48 -3
- package/dist/output/text/show-format.js +13 -17
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +42948 -92369
- package/dist/scripts/akm-migrate.js +42935 -92354
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/connection.js +5 -6
- package/dist/setup/steps/platforms.js +2 -2
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +83 -21
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +209 -0
- package/dist/storage/repositories/index-connection.js +39 -72
- package/dist/storage/repositories/index-entries-repository.js +131 -129
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +101 -268
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-links-repository.js +143 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +257 -325
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +104 -1
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/salience-repository.js +1 -19
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +130 -0
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +191 -302
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +141 -748
- package/dist/tasks/backends/schtasks.js +119 -623
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/run/load-task.js +1 -1
- package/dist/tasks/scheduler-binding.js +20 -238
- package/dist/tasks/scheduler-invocation.js +136 -244
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +368 -679
- package/dist/tasks/source/parse-task-source.js +55 -9
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +464 -88
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +43 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
- package/docs/reference/cli.md +232 -135
- package/docs/reference/configuration.md +71 -57
- package/docs/reference/data-and-telemetry.md +20 -21
- package/docs/reference/tasks.md +105 -39
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +115 -738
- package/schemas/akm-workflow.json +1 -0
- package/dist/assets/improve-strategies/graph-refresh.json +0 -15
- package/dist/assets/prompts/contradiction-judge.md +0 -33
- package/dist/assets/prompts/graph-extract-system.md +0 -1
- package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
- package/dist/assets/prompts/metadata-enhance-system.md +0 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -149
- package/dist/commands/improve/distill/promote-memory.js +0 -291
- package/dist/commands/improve/distill/quality-gate.js +0 -337
- package/dist/commands/improve/eval-cases.js +0 -52
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -31
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/db/graph-db.js +0 -444
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/graph/graph-extraction.js +0 -1108
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/search/ranking-types.js +0 -4
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/llm/graph-extract.js +0 -728
- package/dist/llm/metadata-enhance.js +0 -96
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/tasks/source/task-to-v3.js +0 -507
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -77
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
* `--format html` rendering primitives (#582).
|
|
6
6
|
*
|
|
7
7
|
* Templates live in `src/assets/templates/html/` (mirrored to
|
|
8
|
-
* `dist/assets/templates/html/` by `scripts/copy-assets.ts`).
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* `
|
|
13
|
-
*
|
|
8
|
+
* `dist/assets/templates/html/` by `scripts/copy-assets.ts`). `akm health` is
|
|
9
|
+
* the only command with a bespoke `<command>.html` template (substituted here
|
|
10
|
+
* via plain `%%TOKEN%%` string replacement — no template engine, by design);
|
|
11
|
+
* `src/cli/shared.ts`'s `output()` calls it directly for `command === "health"`
|
|
12
|
+
* and every other command falls back to `renderGenericHtml` (`./generic-render`).
|
|
13
|
+
* `--format html` therefore works for every command (D7) — this module's
|
|
14
|
+
* template path is just health's opt-in bespoke rendering, not a format-wide
|
|
15
|
+
* gate.
|
|
14
16
|
*/
|
|
15
17
|
import fs from "node:fs";
|
|
16
18
|
import path from "node:path";
|
|
@@ -81,10 +83,11 @@ function readTemplate(templatePath) {
|
|
|
81
83
|
}
|
|
82
84
|
}
|
|
83
85
|
/**
|
|
84
|
-
* Minimal HTML entity escaping for text interpolated into
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
86
|
+
* Minimal HTML entity escaping for text interpolated into a document — a
|
|
87
|
+
* template substitution here, or a value placed into `generic-render.ts`'s
|
|
88
|
+
* envelope rendering. Escapes the single quote as well as the double quote so
|
|
89
|
+
* escaped values are safe in both `"…"` and `'…'` attribute contexts, not only
|
|
90
|
+
* the double-quoted attributes the bundled templates use today.
|
|
88
91
|
*/
|
|
89
92
|
export function escapeHtml(value) {
|
|
90
93
|
return value
|
|
@@ -1,41 +1,12 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
|
|
5
|
-
* Per-command `md` / `html` renderer registries (D7).
|
|
6
|
-
*
|
|
7
|
-
* Mirrors `src/output/text/registry.ts`: a command may register a bespoke
|
|
8
|
-
* renderer for a document format, and anything unregistered falls back to the
|
|
9
|
-
* generic rendering of its shaped envelope (`./generic-render`). The fallback
|
|
10
|
-
* is what makes all six `--format` values universal; the registry is what lets
|
|
11
|
-
* a command that has something better to say — `akm health` and its report
|
|
12
|
-
* templates — say it without the output pipeline knowing that command exists.
|
|
13
|
-
*
|
|
14
|
-
* Kept separate from the module that dispatches through it so per-command
|
|
15
|
-
* renderer modules can import `registerMdRenderer` / `registerHtmlRenderer`
|
|
16
|
-
* without a cycle back into the pipeline, exactly as the text registry does.
|
|
17
|
-
*
|
|
18
|
-
* Returning `null` from a handler means "I have nothing special for this
|
|
19
|
-
* payload" and falls through to the generic renderer — `akm health` uses that
|
|
20
|
-
* to keep its bespoke tables for the shapes that have them while still
|
|
21
|
-
* rendering everything else.
|
|
22
|
-
*/
|
|
23
|
-
import { createCommandRegistry } from "./command-registry.js";
|
|
24
|
-
const MD_RENDERER_REGISTRY = createCommandRegistry();
|
|
25
|
-
const HTML_RENDERER_REGISTRY = createCommandRegistry();
|
|
4
|
+
const mdRenderers = new Map();
|
|
26
5
|
/** Register a Markdown renderer for a command name. */
|
|
27
6
|
export function registerMdRenderer(command, handler) {
|
|
28
|
-
|
|
7
|
+
mdRenderers.set(command, handler);
|
|
29
8
|
}
|
|
30
9
|
/** Look up a registered Markdown renderer, or `undefined` when unregistered. */
|
|
31
10
|
export function getMdRendererHandler(command) {
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
/** Register an HTML renderer for a command name. */
|
|
35
|
-
export function registerHtmlRenderer(command, handler) {
|
|
36
|
-
HTML_RENDERER_REGISTRY.register(command, handler);
|
|
37
|
-
}
|
|
38
|
-
/** Look up a registered HTML renderer, or `undefined` when unregistered. */
|
|
39
|
-
export function getHtmlRendererHandler(command) {
|
|
40
|
-
return HTML_RENDERER_REGISTRY.get(command);
|
|
11
|
+
return mdRenderers.get(command);
|
|
41
12
|
}
|
|
@@ -56,11 +56,25 @@ export function shapeProposalProducerOutput(result, detail) {
|
|
|
56
56
|
}
|
|
57
57
|
export function shapeProposalEntry(entry, detail) {
|
|
58
58
|
if (detail === "brief") {
|
|
59
|
-
|
|
59
|
+
// `proposal list`'s default detail level IS "brief" (no `--detail` flag
|
|
60
|
+
// given projects here, not "normal") — `retirement` itself is not
|
|
61
|
+
// projected until "normal", so a flagged retire proposal's risk would
|
|
62
|
+
// otherwise be invisible by default. A minimal boolean marker, not the
|
|
63
|
+
// full risk object, keeps brief's shape small while still letting a
|
|
64
|
+
// reviewer see it without an extra flag.
|
|
65
|
+
const retirement = entry.retirement;
|
|
66
|
+
return {
|
|
67
|
+
...pickFields(entry, ["id", "ref", "status", "source", "createdAt"]),
|
|
68
|
+
...(retirement?.continuityRisk ? { continuityRisk: true } : {}),
|
|
69
|
+
};
|
|
60
70
|
}
|
|
61
71
|
if (detail === "normal") {
|
|
62
72
|
// `confidence` and `gateDecision` (#577) explain why a proposal is pending,
|
|
63
73
|
// so they are projected at `normal` for `akm proposal list/show` when present.
|
|
74
|
+
// `retirement` (alpha.9) is the same kind of field for a consolidate
|
|
75
|
+
// `retire` proposal: without it, "list/show" carries no reason a reviewer
|
|
76
|
+
// could act on (its `payload.content` is empty by design — a retire
|
|
77
|
+
// proposal deletes, it does not write).
|
|
64
78
|
return pickFields(entry, [
|
|
65
79
|
"id",
|
|
66
80
|
"ref",
|
|
@@ -72,6 +86,7 @@ export function shapeProposalEntry(entry, detail) {
|
|
|
72
86
|
"confidence",
|
|
73
87
|
"gateDecision",
|
|
74
88
|
"review",
|
|
89
|
+
"retirement",
|
|
75
90
|
]);
|
|
76
91
|
}
|
|
77
92
|
// full: project everything including the payload.
|
|
@@ -87,6 +102,10 @@ export function shapeProposalEntry(entry, detail) {
|
|
|
87
102
|
"gateDecision",
|
|
88
103
|
"payload",
|
|
89
104
|
"review",
|
|
105
|
+
"retirement",
|
|
106
|
+
"retiredArchive",
|
|
107
|
+
"promotionSource",
|
|
108
|
+
"promotionSourceHash",
|
|
90
109
|
]);
|
|
91
110
|
}
|
|
92
111
|
export function shapeProposalListOutput(result, detail) {
|
|
@@ -284,40 +303,14 @@ export function shapeSearchHit(hit, detail) {
|
|
|
284
303
|
// `ref` is included at `brief` so agents can run `akm show <ref>` without
|
|
285
304
|
// needing --detail full or --shape agent (REC-03).
|
|
286
305
|
if (detail === "brief") {
|
|
287
|
-
return pickFields(hit, [
|
|
288
|
-
"type",
|
|
289
|
-
"name",
|
|
290
|
-
"ref",
|
|
291
|
-
"action",
|
|
292
|
-
"estimatedTokens",
|
|
293
|
-
"keys",
|
|
294
|
-
"selectedRef",
|
|
295
|
-
"parentRef",
|
|
296
|
-
"fragmentOrdinal",
|
|
297
|
-
"fragmentCount",
|
|
298
|
-
"parentEstimatedTokens",
|
|
299
|
-
]);
|
|
306
|
+
return pickFields(hit, ["type", "name", "ref", "action", "estimatedTokens", "keys"]);
|
|
300
307
|
}
|
|
301
308
|
if (detail === "normal") {
|
|
302
309
|
// `warnings` is projected at `normal` so non-fatal hit-level issues are
|
|
303
310
|
// visible without forcing callers up to `--detail full`. Optional
|
|
304
311
|
// `quality` (v1 spec §4.2) is also surfaced when present so callers
|
|
305
312
|
// can see why a `proposed` entry showed up under `--include-proposed`.
|
|
306
|
-
|
|
307
|
-
// AND->OR lexical ladder produced the hit; cheap compact enum, worth
|
|
308
|
-
// showing without requiring `--detail full`.
|
|
309
|
-
const shaped = capDescription(pickFields(hit, [
|
|
310
|
-
"type",
|
|
311
|
-
"name",
|
|
312
|
-
"description",
|
|
313
|
-
"action",
|
|
314
|
-
"score",
|
|
315
|
-
"estimatedTokens",
|
|
316
|
-
"warnings",
|
|
317
|
-
"quality",
|
|
318
|
-
"matchStage",
|
|
319
|
-
...FRAGMENT_PROVENANCE_FIELDS,
|
|
320
|
-
]), NORMAL_DESCRIPTION_LIMIT);
|
|
313
|
+
const shaped = capDescription(pickFields(hit, ["type", "name", "description", "action", "score", "estimatedTokens", "warnings", "quality"]), NORMAL_DESCRIPTION_LIMIT);
|
|
321
314
|
if (Array.isArray(hit.keys) && hit.keys.length > 0)
|
|
322
315
|
shaped.keys = hit.keys;
|
|
323
316
|
return shaped;
|
|
@@ -338,12 +331,6 @@ export function shapeSearchHitForAgent(hit) {
|
|
|
338
331
|
"score",
|
|
339
332
|
"estimatedTokens",
|
|
340
333
|
"keys",
|
|
341
|
-
// Issue #856: which stage of the progressive AND->OR lexical ladder
|
|
342
|
-
// produced this hit. Agents need this to gauge how much to trust a
|
|
343
|
-
// hit (a strict-AND match is stronger signal than an OR-fallback
|
|
344
|
-
// recovery match) without going to `--detail full`.
|
|
345
|
-
"matchStage",
|
|
346
|
-
...FRAGMENT_PROVENANCE_FIELDS,
|
|
347
334
|
]);
|
|
348
335
|
if (picked.editable !== false)
|
|
349
336
|
delete picked.editHint;
|
|
@@ -389,7 +376,7 @@ export function shapeShowOutput(result, detail, shape = "human") {
|
|
|
389
376
|
"workflowParameters",
|
|
390
377
|
"steps",
|
|
391
378
|
"keys",
|
|
392
|
-
"
|
|
379
|
+
"links",
|
|
393
380
|
...FRAGMENT_PROVENANCE_FIELDS,
|
|
394
381
|
...FRAGMENT_CONTEXT_FIELDS,
|
|
395
382
|
]);
|
|
@@ -413,7 +400,7 @@ export function shapeShowOutput(result, detail, shape = "human") {
|
|
|
413
400
|
"run",
|
|
414
401
|
"origin",
|
|
415
402
|
"keys",
|
|
416
|
-
"
|
|
403
|
+
"links",
|
|
417
404
|
...FRAGMENT_PROVENANCE_FIELDS,
|
|
418
405
|
...FRAGMENT_CONTEXT_FIELDS,
|
|
419
406
|
]);
|
|
@@ -442,7 +429,7 @@ export function shapeShowOutput(result, detail, shape = "human") {
|
|
|
442
429
|
"cwd",
|
|
443
430
|
"activeRun",
|
|
444
431
|
"keys",
|
|
445
|
-
"
|
|
432
|
+
"links",
|
|
446
433
|
...FRAGMENT_PROVENANCE_FIELDS,
|
|
447
434
|
...FRAGMENT_CONTEXT_FIELDS,
|
|
448
435
|
// ref, path, and editable are always projected — at every --detail level,
|
|
@@ -8,15 +8,6 @@
|
|
|
8
8
|
// envelope. Never overwrites an existing `shape`, `schemaVersion`, or `ok`;
|
|
9
9
|
// a command whose exit code grades the outcome emits through
|
|
10
10
|
// `outputWithExitCode` (src/cli/shared.ts), which sets `ok` from that code.
|
|
11
|
-
//
|
|
12
|
-
// Builds a shallow copy rather than mutating `result` in place: several
|
|
13
|
-
// command results (e.g. `akm task sync --dry-run`'s `SchedulerPlanPreview`,
|
|
14
|
-
// see src/tasks/scheduler-sync-preview.ts) are deliberately `Object.freeze`d
|
|
15
|
-
// by their producer as an immutability guarantee, and an in-place `obj.shape
|
|
16
|
-
// = …` assignment throws ("Attempting to define property on object that is
|
|
17
|
-
// not extensible") the moment it hits one. Copying tolerates both frozen and
|
|
18
|
-
// mutable inputs uniformly, and `output()` never uses the result's identity
|
|
19
|
-
// past this call, so a copy is safe here.
|
|
20
11
|
function makeStampHandler(command) {
|
|
21
12
|
return (result) => {
|
|
22
13
|
if (result === null || result === undefined)
|
|
@@ -39,6 +30,7 @@ const PASSTHROUGH_COMMANDS = [
|
|
|
39
30
|
"add",
|
|
40
31
|
"agent-result",
|
|
41
32
|
"bundle-create",
|
|
33
|
+
"bundle-rename",
|
|
42
34
|
"bundle-show",
|
|
43
35
|
"clone",
|
|
44
36
|
"command-dry-run",
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
|
|
4
|
+
import { formatBundleRenamePlain } from "./helpers.js";
|
|
5
|
+
export const bundleRenameFormatters = [
|
|
6
|
+
{ command: "bundle-rename", handler: (r) => formatBundleRenamePlain(r) },
|
|
7
|
+
];
|
|
@@ -20,11 +20,20 @@ export function formatInfoPlain(r) {
|
|
|
20
20
|
const lines = [];
|
|
21
21
|
if (r.version)
|
|
22
22
|
lines.push(`version: ${String(r.version)}`);
|
|
23
|
+
// Only present in infoCommand's own last-resort fallback (stash-cli.ts),
|
|
24
|
+
// when assembleInfo() itself threw — every field below it belongs to the
|
|
25
|
+
// normal shape and is absent there.
|
|
26
|
+
if (typeof r.error === "string")
|
|
27
|
+
lines.push(`error: ${r.error}`);
|
|
23
28
|
if (r.bundleDir)
|
|
24
29
|
lines.push(`bundleDir: ${String(r.bundleDir)}`);
|
|
25
30
|
if (r.defaultBundle !== undefined) {
|
|
26
31
|
lines.push(`defaultBundle: ${r.defaultBundle === null ? "(none)" : String(r.defaultBundle)}`);
|
|
27
32
|
}
|
|
33
|
+
if (typeof r.configError === "string")
|
|
34
|
+
lines.push(`configError: ${r.configError}`);
|
|
35
|
+
if (typeof r.bundleDirError === "string")
|
|
36
|
+
lines.push(`bundleDirError: ${r.bundleDirError}`);
|
|
28
37
|
if (Array.isArray(r.assetTypes) && r.assetTypes.length > 0) {
|
|
29
38
|
lines.push(`assetTypes: ${r.assetTypes.join(", ")}`);
|
|
30
39
|
}
|
|
@@ -270,32 +279,10 @@ export function formatSearchPlain(r, detail) {
|
|
|
270
279
|
// Optional v1 spec §4.2 quality marker (e.g. "curated" / "proposed").
|
|
271
280
|
if (typeof hit.quality === "string" && hit.quality)
|
|
272
281
|
lines.push(` quality: ${hit.quality}`);
|
|
273
|
-
// Issue #856: which stage of the progressive AND->OR lexical ladder
|
|
274
|
-
// produced this hit ("exact" | "prefix" | "relaxed").
|
|
275
|
-
if (typeof hit.matchStage === "string" && hit.matchStage)
|
|
276
|
-
lines.push(` matchStage: ${hit.matchStage}`);
|
|
277
282
|
// Surface optional hit-level warnings (v1 spec §4.2).
|
|
278
283
|
if (Array.isArray(hit.warnings) && hit.warnings.length > 0) {
|
|
279
284
|
lines.push(` warnings: ${hit.warnings.join("; ")}`);
|
|
280
285
|
}
|
|
281
|
-
const graph = typeof hit.graph === "object" && hit.graph !== null ? hit.graph : undefined;
|
|
282
|
-
if (graph) {
|
|
283
|
-
const entities = Array.isArray(graph.entities) ? graph.entities : [];
|
|
284
|
-
if (entities.length > 0) {
|
|
285
|
-
const matched = entities
|
|
286
|
-
.filter((entity) => String(entity.kind ?? "") === "matched")
|
|
287
|
-
.map((entity) => String(entity.name ?? "?"));
|
|
288
|
-
const neighbors = entities
|
|
289
|
-
.filter((entity) => String(entity.kind ?? "") !== "matched")
|
|
290
|
-
.map((entity) => String(entity.name ?? "?"));
|
|
291
|
-
lines.push(` graph: ${[
|
|
292
|
-
matched.length > 0 ? `query match=${matched.join(", ")}` : undefined,
|
|
293
|
-
neighbors.length > 0 ? `neighbors=${neighbors.join(", ")}` : undefined,
|
|
294
|
-
]
|
|
295
|
-
.filter(Boolean)
|
|
296
|
-
.join("; ")}`);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
286
|
if (detail === "full") {
|
|
300
287
|
if (hit.path)
|
|
301
288
|
lines.push(` path: ${String(hit.path)}`);
|
|
@@ -429,14 +416,6 @@ export function formatIndexPlain(r) {
|
|
|
429
416
|
for (const message of warnings)
|
|
430
417
|
out += `\n - ${String(message)}`;
|
|
431
418
|
}
|
|
432
|
-
const notices = Array.isArray(indexResult.notices) ? indexResult.notices : [];
|
|
433
|
-
for (const notice of notices) {
|
|
434
|
-
const severity = notice.severity === "info" ? "info" : "warning";
|
|
435
|
-
const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
|
|
436
|
-
out +=
|
|
437
|
-
`\n notice[${severity}] ${notice.code} adapter=${notice.adapter}${field}` +
|
|
438
|
-
(notice.message ? `: ${notice.message}` : "");
|
|
439
|
-
}
|
|
440
419
|
const verification = indexResult.verification;
|
|
441
420
|
if (verification?.ok === false && verification.message) {
|
|
442
421
|
out += `\nVerification: ${String(verification.message)}`;
|
|
@@ -556,7 +535,8 @@ export function formatAddPlain(r) {
|
|
|
556
535
|
const index = r.index;
|
|
557
536
|
const scanned = index?.directoriesScanned ?? 0;
|
|
558
537
|
const total = index?.totalEntries ?? 0;
|
|
559
|
-
const
|
|
538
|
+
const bundleSuffix = typeof r.bundleId === "string" && r.bundleId.length > 0 ? ` as bundle "${r.bundleId}"` : "";
|
|
539
|
+
const lines = [`Installed ${r.ref}${bundleSuffix} (${scanned} directories scanned, ${total} total assets indexed)`];
|
|
560
540
|
const warnings = index?.warnings;
|
|
561
541
|
if (Array.isArray(warnings) && warnings.length > 0) {
|
|
562
542
|
lines.push(`Warnings (${warnings.length}):`);
|
|
@@ -589,6 +569,64 @@ export function formatRemovePlain(r) {
|
|
|
589
569
|
const ok = r.ok !== false ? "OK" : "FAILED";
|
|
590
570
|
return `remove: ${target} ${ok}`;
|
|
591
571
|
}
|
|
572
|
+
export function formatBundleRenamePlain(r) {
|
|
573
|
+
const oldId = String(r.oldId ?? "?");
|
|
574
|
+
const newId = String(r.newId ?? "?");
|
|
575
|
+
const applied = r.applied === true;
|
|
576
|
+
const config = r.config ?? {};
|
|
577
|
+
const state = r.state ?? {};
|
|
578
|
+
const index = r.index ?? {};
|
|
579
|
+
const schedulerRefs = Array.isArray(config.schedulerRefs) ? config.schedulerRefs.length : 0;
|
|
580
|
+
const proposalRefs = Number(state.proposalRefs ?? 0);
|
|
581
|
+
const proposalTargets = Number(state.proposalTargets ?? 0);
|
|
582
|
+
const taskHistoryRefs = Number(state.taskHistoryRefs ?? 0);
|
|
583
|
+
const entries = Number(index.entries ?? 0);
|
|
584
|
+
const contentRefs = Array.isArray(r.contentRefs) ? r.contentRefs : [];
|
|
585
|
+
const nativeSchedulerRows = Array.isArray(r.nativeSchedulerRows) ? r.nativeSchedulerRows : [];
|
|
586
|
+
const verb = applied ? "Renamed" : "Would rename";
|
|
587
|
+
const lines = [
|
|
588
|
+
`${verb} bundle "${oldId}" to "${newId}" (${entries} index entries, ${schedulerRefs} scheduler ref(s), ` +
|
|
589
|
+
`${proposalRefs + proposalTargets} proposal reference(s), ${taskHistoryRefs} task-history row(s)).`,
|
|
590
|
+
];
|
|
591
|
+
if (!applied) {
|
|
592
|
+
lines.push("Re-run without --dry-run to apply. It also re-syncs native scheduler bindings under the new name.");
|
|
593
|
+
if (nativeSchedulerRows.length > 0) {
|
|
594
|
+
lines.push(`Native scheduler rows naming "${oldId}//" that the sync would replace:`);
|
|
595
|
+
for (const row of nativeSchedulerRows)
|
|
596
|
+
lines.push(` - ${String(row)}`);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
const taskSync = r.taskSync;
|
|
601
|
+
const syncResult = taskSync?.result;
|
|
602
|
+
if (syncResult) {
|
|
603
|
+
const installed = Array.isArray(syncResult.installed) ? syncResult.installed.length : 0;
|
|
604
|
+
const updated = Array.isArray(syncResult.updated) ? syncResult.updated.length : 0;
|
|
605
|
+
const removed = Array.isArray(syncResult.removed) ? syncResult.removed.length : 0;
|
|
606
|
+
const failures = Array.isArray(syncResult.failures)
|
|
607
|
+
? syncResult.failures
|
|
608
|
+
: [];
|
|
609
|
+
if (failures.length === 0) {
|
|
610
|
+
lines.push(`Native scheduler bindings re-synced under the new name (${installed} installed, ${updated} updated, ${removed} removed).`);
|
|
611
|
+
}
|
|
612
|
+
else {
|
|
613
|
+
lines.push(`Native scheduler sync after rename: ${installed} installed, ${updated} updated, ${removed} removed, ${failures.length} failed.`);
|
|
614
|
+
for (const failure of failures)
|
|
615
|
+
lines.push(` - ${failure.ref ?? failure.path}: ${failure.reason}`);
|
|
616
|
+
lines.push("Run `akm task sync` to retry.");
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
else if (taskSync?.ok === false && taskSync.error) {
|
|
620
|
+
lines.push(`Re-syncing native scheduler bindings failed: ${taskSync.error}. Run \`akm task sync\` to retry.`);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
if (contentRefs.length > 0) {
|
|
624
|
+
lines.push(`Content still spelling "${oldId}//" (not rewritten — edit these by hand):`);
|
|
625
|
+
for (const file of contentRefs)
|
|
626
|
+
lines.push(` - ${String(file)}`);
|
|
627
|
+
}
|
|
628
|
+
return lines.join("\n");
|
|
629
|
+
}
|
|
592
630
|
export function formatUpdatePlain(r) {
|
|
593
631
|
// R-015: `processed` alone conflated three cases into one empty array —
|
|
594
632
|
// a true no-op (--all with nothing configured), a source this call flatly
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*
|
|
16
16
|
* No registry imports — no circular dependencies.
|
|
17
17
|
*/
|
|
18
|
-
export { formatAddPlain, formatBundleShowPlain, formatClonePlain, formatConfigPlain, formatCuratePlain, formatEnvCreatePlain, formatEnvExportPlain, formatEnvListPlain, formatEnvRemovePlain, formatEventLine, formatEventsPlain, formatFeedbackPlain, formatImportPlain, formatIndexPlain, formatInfoPlain, formatInitPlain, formatListPlain, formatModelsListPlain, formatRegistryAddPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, formatRememberPlain, formatRemovePlain, formatSearchPlain, formatSyncPlain, formatUpdatePlain, formatUpgradePlain, } from "./command-format.js";
|
|
18
|
+
export { formatAddPlain, formatBundleRenamePlain, formatBundleShowPlain, formatClonePlain, formatConfigPlain, formatCuratePlain, formatEnvCreatePlain, formatEnvExportPlain, formatEnvListPlain, formatEnvRemovePlain, formatEventLine, formatEventsPlain, formatFeedbackPlain, formatImportPlain, formatIndexPlain, formatInfoPlain, formatInitPlain, formatListPlain, formatModelsListPlain, formatRegistryAddPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, formatRememberPlain, formatRemovePlain, formatSearchPlain, formatSyncPlain, formatUpdatePlain, formatUpgradePlain, } from "./command-format.js";
|
|
19
19
|
export { formatHealthPlain } from "./health-format.js";
|
|
20
20
|
export { formatLintPlain } from "./lint-format.js";
|
|
21
21
|
export { formatGateDecisionSummary, formatProposalAcceptPlain, formatProposalDiffPlain, formatProposalDrainPlain, formatProposalListPlain, formatProposalProducerPlain, formatProposalRejectPlain, formatProposalShowPlain, } from "./proposal-format.js";
|
|
@@ -18,27 +18,18 @@ export function formatMigratePlain(result) {
|
|
|
18
18
|
if (typeof plan.status !== "string")
|
|
19
19
|
return null;
|
|
20
20
|
const lines = [`${planGlyph(plan.status)} ${plan.status}`];
|
|
21
|
-
if (plan.
|
|
22
|
-
const tasks = plan.
|
|
23
|
-
lines.push(` task
|
|
24
|
-
}
|
|
25
|
-
if (plan.taskV4Migration) {
|
|
26
|
-
const tasks = plan.taskV4Migration;
|
|
27
|
-
lines.push(` task-v3->v4: ${tasks.changed} change, ${tasks.skipped} current, ${tasks.blocked} blocked`);
|
|
21
|
+
if (plan.taskFiles) {
|
|
22
|
+
const tasks = plan.taskFiles;
|
|
23
|
+
lines.push(` task files: ${tasks.changed} change, ${tasks.skipped} current, ${tasks.blocked} blocked`);
|
|
28
24
|
}
|
|
29
25
|
if (plan.blockers?.length) {
|
|
30
26
|
lines.push("", "blockers:", ...plan.blockers.map((blocker) => ` - ${blocker}`));
|
|
31
27
|
}
|
|
32
28
|
if (plan.backupPath) {
|
|
33
|
-
lines.push("", `backup
|
|
29
|
+
lines.push("", `backup: ${plan.backupPath}`);
|
|
34
30
|
}
|
|
35
31
|
if (plan.applied !== undefined)
|
|
36
|
-
lines.push(`applied
|
|
37
|
-
if (plan.taskV4BackupPath) {
|
|
38
|
-
lines.push(`backup (v3->v4): ${plan.taskV4BackupPath}`);
|
|
39
|
-
}
|
|
40
|
-
if (plan.taskV4Applied !== undefined)
|
|
41
|
-
lines.push(`applied (v3->v4): ${plan.taskV4Applied}`);
|
|
32
|
+
lines.push(`applied: ${plan.applied}`);
|
|
42
33
|
return lines.join("\n");
|
|
43
34
|
}
|
|
44
35
|
export const migrateFormatters = [
|
|
@@ -100,7 +100,16 @@ export function formatProposalListPlain(r) {
|
|
|
100
100
|
// #577: surface the gate verdict inline so the queue explains itself.
|
|
101
101
|
const gate = formatGateDecisionSummary(p.gateDecision);
|
|
102
102
|
const gateSuffix = gate ? ` ${gate}` : "";
|
|
103
|
-
|
|
103
|
+
// A retire proposal's continuityRisk excludes it from bulk accept —
|
|
104
|
+
// visible in the default list, not just `proposal show`, since the owner
|
|
105
|
+
// reviews the backlog list-first. `list`'s default (brief) shape
|
|
106
|
+
// projects a `continuityRisk: true` marker instead of the full
|
|
107
|
+
// `retirement` object (only present from `--detail normal` up), so both
|
|
108
|
+
// shapes are checked here.
|
|
109
|
+
const retirement = p.retirement;
|
|
110
|
+
const flagged = p.continuityRisk === true || Boolean(retirement?.continuityRisk);
|
|
111
|
+
const continuitySuffix = flagged ? " ⚠ continuity-risk" : "";
|
|
112
|
+
lines.push(`${id} [${status}] ${ref} source=${source} ${created}${gateSuffix}${continuitySuffix}`);
|
|
104
113
|
}
|
|
105
114
|
return lines.join("\n").trimEnd();
|
|
106
115
|
}
|
|
@@ -141,6 +150,43 @@ export function formatProposalShowPlain(r) {
|
|
|
141
150
|
if (review.decidedAt)
|
|
142
151
|
lines.push(`review.decidedAt: ${String(review.decidedAt)}`);
|
|
143
152
|
}
|
|
153
|
+
// alpha.9: a consolidate retire proposal writes no content (`payload.content`
|
|
154
|
+
// is empty by design) — this is the reason a reviewer needs instead. `diff`
|
|
155
|
+
// shows the body being retired.
|
|
156
|
+
const retirement = p.retirement;
|
|
157
|
+
if (retirement) {
|
|
158
|
+
lines.push(`retire: ${String(retirement.retiredRef)} -> ${String(retirement.successorRef)}`);
|
|
159
|
+
lines.push(`retire.label: ${String(retirement.judgeLabel)} (cosine=${String(retirement.cosine)})`);
|
|
160
|
+
lines.push(`retire.reason: ${String(retirement.judgeReason)}`);
|
|
161
|
+
// Item 1 (continuity check): flagged, but still minted — never swept by a
|
|
162
|
+
// bulk accept, only acceptable by id, so a reviewer must see it here.
|
|
163
|
+
const continuityRisk = retirement.continuityRisk;
|
|
164
|
+
if (continuityRisk) {
|
|
165
|
+
const failingQueries = typeof continuityRisk.failingQueries === "number" ? continuityRisk.failingQueries : 0;
|
|
166
|
+
const unverifiedQueries = typeof continuityRisk.unverifiedQueries === "number" ? continuityRisk.unverifiedQueries : 0;
|
|
167
|
+
const summary = [];
|
|
168
|
+
if (failingQueries > 0) {
|
|
169
|
+
summary.push(`${failingQueries} of the retired asset's own quer${failingQueries === 1 ? "y" : "ies"} would not have found the successor top 10`);
|
|
170
|
+
}
|
|
171
|
+
// S2: a query the search call never ran, or that fell back to
|
|
172
|
+
// keyword-only ranking, is never silently trusted OR silently
|
|
173
|
+
// dropped — it excludes the proposal from bulk accept on its own.
|
|
174
|
+
if (unverifiedQueries > 0) {
|
|
175
|
+
summary.push(`${unverifiedQueries} quer${unverifiedQueries === 1 ? "y" : "ies"} unverified (search failed or used the keyword-only fallback)`);
|
|
176
|
+
}
|
|
177
|
+
lines.push(`retire.continuityRisk: ${summary.join("; ")} — excluded from bulk accept`);
|
|
178
|
+
// N3 / S4: the actual failing query text, not just the count — a
|
|
179
|
+
// reviewer deciding whether to accept by id needs to see what would
|
|
180
|
+
// stop resolving, not just how many queries.
|
|
181
|
+
const ranks = Array.isArray(continuityRisk.ranks) ? continuityRisk.ranks : [];
|
|
182
|
+
for (const rank of ranks) {
|
|
183
|
+
const successorRank = rank.successorRank === null || rank.successorRank === undefined
|
|
184
|
+
? "absent from top 10"
|
|
185
|
+
: `#${String(rank.successorRank)}`;
|
|
186
|
+
lines.push(` - "${String(rank.query)}": retired #${String(rank.retiredRank)}, successor ${successorRank}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
144
190
|
const validation = r.validation;
|
|
145
191
|
if (validation) {
|
|
146
192
|
const findings = Array.isArray(validation.findings) ? validation.findings : [];
|
|
@@ -184,7 +230,6 @@ export function formatProposalRejectPlain(r) {
|
|
|
184
230
|
return `Rejected proposal ${String(r.id)} (${String(r.ref)})${reason}`;
|
|
185
231
|
}
|
|
186
232
|
export function formatProposalDrainPlain(r) {
|
|
187
|
-
const policy = String(r.policy ?? "?");
|
|
188
233
|
const applyMode = String(r.applyMode ?? "queue");
|
|
189
234
|
const promoted = Array.isArray(r.promoted) ? r.promoted : [];
|
|
190
235
|
const rejected = Array.isArray(r.rejected) ? r.rejected : [];
|
|
@@ -194,7 +239,7 @@ export function formatProposalDrainPlain(r) {
|
|
|
194
239
|
const failed = Array.isArray(r.failed) ? r.failed : [];
|
|
195
240
|
const prefix = r.dryRun === true ? "[dry-run] " : "";
|
|
196
241
|
const lines = [
|
|
197
|
-
`${prefix}Drained proposal queue (strategy=${String(r.strategy ?? "?")},
|
|
242
|
+
`${prefix}Drained proposal queue (strategy=${String(r.strategy ?? "?")}, applyMode=${applyMode})`,
|
|
198
243
|
` promoted: ${promoted.length}`,
|
|
199
244
|
` rejected: ${rejected.length}`,
|
|
200
245
|
` deferred: ${deferred.length}`,
|
|
@@ -54,17 +54,20 @@ export function formatShowPlain(r, detail) {
|
|
|
54
54
|
if (r.schemaVersion !== undefined)
|
|
55
55
|
lines.push(`schemaVersion: ${String(r.schemaVersion)}`);
|
|
56
56
|
}
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
if (related) {
|
|
57
|
+
const links = typeof r.links === "object" && r.links !== null ? r.links : undefined;
|
|
58
|
+
if (links) {
|
|
60
59
|
lines.push("");
|
|
61
|
-
lines.push(
|
|
62
|
-
for (const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
lines.push("links:");
|
|
61
|
+
for (const part of ["outgoing", "incoming", "unresolved"]) {
|
|
62
|
+
const groups = links[part];
|
|
63
|
+
if (typeof groups !== "object" || groups === null)
|
|
64
|
+
continue;
|
|
65
|
+
lines.push(` ${part}:`);
|
|
66
|
+
for (const [kind, group] of Object.entries(groups)) {
|
|
67
|
+
const refs = Array.isArray(group.refs) ? group.refs.map(String) : [];
|
|
68
|
+
const more = (group.total ?? refs.length) > refs.length ? ` (+${(group.total ?? 0) - refs.length} more)` : "";
|
|
69
|
+
lines.push(` ${kind}: ${refs.join(", ")}${more}`);
|
|
70
|
+
}
|
|
68
71
|
}
|
|
69
72
|
}
|
|
70
73
|
const payloads = [r.content, r.template, r.prompt].filter((value) => value != null).map(String);
|
|
@@ -98,10 +101,3 @@ export function formatShowPlain(r, detail) {
|
|
|
98
101
|
appendShowDirectives(lines, r);
|
|
99
102
|
return lines.length > 0 ? lines.join("\n") : null;
|
|
100
103
|
}
|
|
101
|
-
function formatRelatedLabel(hit) {
|
|
102
|
-
const ref = typeof hit.ref === "string" ? hit.ref : undefined;
|
|
103
|
-
if (ref)
|
|
104
|
-
return ref;
|
|
105
|
-
const pathValue = typeof hit.path === "string" ? hit.path : "?";
|
|
106
|
-
return pathValue.split("/").pop() ?? pathValue;
|
|
107
|
-
}
|
|
@@ -108,13 +108,6 @@ export function formatWorkflowStatusPlain(result) {
|
|
|
108
108
|
const attempts = typeof unit.attempts === "number" ? unit.attempts : undefined;
|
|
109
109
|
const suffix = attempts !== undefined && attempts > 1 ? `, attempt ${attempts}` : "";
|
|
110
110
|
lines.push(` - ${id} [${node}] (${status}${suffix})`);
|
|
111
|
-
// Codex round-3 finding B: a `running` claim gone silent past the check-in
|
|
112
|
-
// window — the process holding it likely died. Surface it (with the claim
|
|
113
|
-
// holder) so a human can reclaim/re-run the unit.
|
|
114
|
-
if (unit.stale === true) {
|
|
115
|
-
const holder = typeof unit.claimHolder === "string" && unit.claimHolder.trim() ? ` claimed by ${unit.claimHolder}` : "";
|
|
116
|
-
lines.push(` stale: claim went silent past the check-in window${holder} — its driver may have died`);
|
|
117
|
-
}
|
|
118
111
|
if (typeof unit.failureReason === "string" && unit.failureReason.trim()) {
|
|
119
112
|
lines.push(` failure_reason: ${unit.failureReason}`);
|
|
120
113
|
}
|
|
@@ -126,27 +119,8 @@ export function formatWorkflowStatusPlain(result) {
|
|
|
126
119
|
}
|
|
127
120
|
}
|
|
128
121
|
}
|
|
129
|
-
// Review C2: the check-in `continue` directive must survive plain-text
|
|
130
|
-
// rendering — JSON consumers saw `checkin` but the text path dropped it.
|
|
131
|
-
const checkinLine = formatWorkflowCheckinLine(result);
|
|
132
|
-
if (checkinLine) {
|
|
133
|
-
lines.push("");
|
|
134
|
-
lines.push(checkinLine);
|
|
135
|
-
}
|
|
136
122
|
return lines.join("\n");
|
|
137
123
|
}
|
|
138
|
-
/**
|
|
139
|
-
* Render the stalled-run check-in directive (#506) when present on a
|
|
140
|
-
* workflow-status result. Returns null when the run is healthy.
|
|
141
|
-
*/
|
|
142
|
-
function formatWorkflowCheckinLine(result) {
|
|
143
|
-
const checkin = typeof result.checkin === "object" && result.checkin !== null
|
|
144
|
-
? result.checkin
|
|
145
|
-
: undefined;
|
|
146
|
-
if (!checkin || typeof checkin.directive !== "string" || !checkin.directive.trim())
|
|
147
|
-
return null;
|
|
148
|
-
return checkin.directive.trim();
|
|
149
|
-
}
|
|
150
124
|
/**
|
|
151
125
|
* One `! lowering[<severity>] <code> (<adapter>[; <field>]): <message>` line
|
|
152
126
|
* from a `{code, severity, adapter, field?, message}` lowering notice, or
|
|
@@ -346,12 +320,6 @@ export function formatWorkflowPlanPlain(result) {
|
|
|
346
320
|
for (const [index, step] of steps.entries()) {
|
|
347
321
|
renderPlanStepLines(step, index + 1, lines);
|
|
348
322
|
}
|
|
349
|
-
const sourceReadSet = Array.isArray(result.sourceReadSet) ? result.sourceReadSet : [];
|
|
350
|
-
if (sourceReadSet.length > 0) {
|
|
351
|
-
lines.push("read set:");
|
|
352
|
-
for (const entry of sourceReadSet)
|
|
353
|
-
lines.push(` ${String(entry)}`);
|
|
354
|
-
}
|
|
355
323
|
const notices = Array.isArray(result.notices) ? result.notices : [];
|
|
356
324
|
if (notices.length > 0) {
|
|
357
325
|
lines.push("notices:");
|
package/dist/output/text.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { writeStdout } from "./stdout.js";
|
|
5
5
|
import { addFormatters } from "./text/add.js";
|
|
6
6
|
import { bundleCreateFormatters } from "./text/bundle-create.js";
|
|
7
|
+
import { bundleRenameFormatters } from "./text/bundle-rename.js";
|
|
7
8
|
import { bundleShowFormatters } from "./text/bundle-show.js";
|
|
8
9
|
import { cloneFormatters } from "./text/clone.js";
|
|
9
10
|
import { configFormatters } from "./text/config.js";
|
|
@@ -40,6 +41,7 @@ import { workflowFormatters } from "./text/workflow.js";
|
|
|
40
41
|
// compile instead of silently disappearing at runtime.
|
|
41
42
|
const BUILT_IN_TEXT_FORMATTERS = [
|
|
42
43
|
...bundleCreateFormatters,
|
|
44
|
+
...bundleRenameFormatters,
|
|
43
45
|
...bundleShowFormatters,
|
|
44
46
|
...indexFormatters,
|
|
45
47
|
...showFormatters,
|