@astrosheep/keiyaku 4.5.29 → 4.6.2
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/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +0 -13
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +47 -78
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/references/automation.md +54 -41
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-babysit/SKILL.md +10 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +27 -9
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +68 -71
- package/build/src/akuma/akuma-call.d.ts +53 -0
- package/build/src/akuma/akuma-call.js +113 -0
- package/build/src/akuma/akuma-instance.d.ts +20 -18
- package/build/src/akuma/akuma-instance.js +65 -175
- package/build/src/akuma/akuma-observe.d.ts +3 -21
- package/build/src/akuma/akuma-observe.js +7 -24
- package/build/src/akuma/{akuma-handle.d.ts → akuma-owner.d.ts} +55 -27
- package/build/src/akuma/{akuma-handle.js → akuma-owner.js} +24 -23
- package/build/src/akuma/akuma-selection-execution.d.ts +51 -0
- package/build/src/akuma/akuma-selection-execution.js +134 -0
- package/build/src/akuma/{fleet-execution.d.ts → akuma-wait.d.ts} +24 -44
- package/build/src/akuma/akuma-wait.js +113 -0
- package/build/src/akuma/akuma.d.ts +35 -89
- package/build/src/akuma/akuma.js +148 -30
- package/build/src/akuma/archetype.d.ts +12 -0
- package/build/src/akuma/archetype.js +47 -19
- package/build/src/akuma/body.d.ts +76 -36
- package/build/src/akuma/body.js +84 -49
- package/build/src/akuma/call-initial-tell.d.ts +131 -22
- package/build/src/akuma/call-initial-tell.js +31 -1
- package/build/src/akuma/call-request.d.ts +237 -31
- package/build/src/akuma/call-request.js +67 -94
- package/build/src/akuma/coordinate.d.ts +15 -5
- package/build/src/akuma/coordinate.js +12 -22
- package/build/src/akuma/dispatch-association.d.ts +1 -1
- package/build/src/akuma/dispatch-association.js +1 -10
- package/build/src/akuma/heart/activity-schema.d.ts +325 -0
- package/build/src/akuma/heart/activity-schema.js +53 -0
- package/build/src/akuma/heart/facts.d.ts +1 -6
- package/build/src/akuma/heart/index.d.ts +3 -1
- package/build/src/akuma/heart/index.js +4 -1
- package/build/src/akuma/heart/rows.d.ts +49 -2
- package/build/src/akuma/heart/rows.js +16 -2
- package/build/src/akuma/heart/soul.d.ts +1 -0
- package/build/src/akuma/heart/soul.js +6 -4
- package/build/src/akuma/heart/tells.d.ts +1 -0
- package/build/src/akuma/heart/tells.js +18 -0
- package/build/src/akuma/identity.d.ts +10 -7
- package/build/src/akuma/identity.js +23 -0
- package/build/src/akuma/index.d.ts +10 -8
- package/build/src/akuma/index.js +2 -2
- package/build/src/akuma/nuke.d.ts +3 -0
- package/build/src/akuma/nuke.js +13 -7
- package/build/src/akuma/projection.d.ts +0 -5
- package/build/src/akuma/projection.js +22 -43
- package/build/src/akuma/provider-recipe.d.ts +58 -13
- package/build/src/akuma/provider-recipe.js +62 -80
- package/build/src/akuma/provider.d.ts +6 -76
- package/build/src/akuma/provider.js +11 -219
- package/build/src/akuma/providers/acp/config.d.ts +2 -0
- package/build/src/akuma/providers/acp/config.js +26 -1
- package/build/src/akuma/providers/acp/core.d.ts +7 -0
- package/build/src/akuma/providers/acp/core.js +49 -18
- package/build/src/akuma/providers/acp/index.js +14 -6
- package/build/src/akuma/providers/grok-build/index.js +44 -13
- package/build/src/akuma/providers/index.d.ts +3 -3
- package/build/src/akuma/providers/index.js +2 -13
- package/build/src/akuma/providers/opencode-sdk/event-stream.d.ts +28 -0
- package/build/src/akuma/providers/opencode-sdk/event-stream.js +92 -0
- package/build/src/akuma/providers/opencode-sdk/events.d.ts +0 -1
- package/build/src/akuma/providers/opencode-sdk/index.js +200 -64
- package/build/src/akuma/providers/opencode-sdk/session.d.ts +41 -1
- package/build/src/akuma/providers/opencode-sdk/session.js +69 -2
- package/build/src/akuma/providers/pi/events.js +5 -2
- package/build/src/akuma/providers/pi/index.d.ts +3 -4
- package/build/src/akuma/providers/pi/index.js +99 -45
- package/build/src/akuma/publication.d.ts +84 -3
- package/build/src/akuma/publication.js +145 -2
- package/build/src/akuma/read-pool.d.ts +2 -0
- package/build/src/akuma/read-pool.js +15 -0
- package/build/src/akuma/request-rendezvous.js +10 -0
- package/build/src/akuma/request-serve.js +7 -0
- package/build/src/akuma/request-wire.d.ts +14 -26
- package/build/src/akuma/request-wire.js +4 -0
- package/build/src/akuma/requests.d.ts +0 -2
- package/build/src/akuma/requests.js +0 -17
- package/build/src/akuma/{fleet-observation.d.ts → selection-observation.d.ts} +37 -36
- package/build/src/akuma/selection-observation.js +65 -0
- package/build/src/akuma/{fleet-owner-port.d.ts → selection-owner-port.d.ts} +3 -3
- package/build/src/akuma/{fleet-owner-port.js → selection-owner-port.js} +11 -17
- package/build/src/akuma/{fleet-request.d.ts → selection-request.d.ts} +42 -82
- package/build/src/akuma/{fleet-request.js → selection-request.js} +92 -136
- package/build/src/akuma/turn-drive.js +73 -14
- package/build/src/akuma-body.js +91 -56
- package/build/src/body/amend.d.ts +5 -0
- package/build/src/body/amend.js +26 -50
- package/build/src/body/arc.d.ts +4 -2
- package/build/src/body/arc.js +19 -26
- package/build/src/body/criteria.d.ts +6 -0
- package/build/src/body/criteria.js +37 -0
- package/build/src/body/decode.js +5 -42
- package/build/src/body/region.d.ts +5 -0
- package/build/src/body/region.js +45 -2
- package/build/src/body/render.js +2 -4
- package/build/src/cli/activity.d.ts +26 -0
- package/build/src/cli/activity.js +75 -0
- package/build/src/cli/actor.d.ts +3 -1
- package/build/src/cli/actor.js +15 -2
- package/build/src/cli/commands/akuma-grammar.d.ts +75 -0
- package/build/src/cli/commands/akuma-grammar.js +414 -0
- package/build/src/cli/commands/akuma.d.ts +5 -69
- package/build/src/cli/commands/akuma.js +352 -319
- package/build/src/cli/commands/amend.d.ts +4 -5
- package/build/src/cli/commands/amend.js +1 -2
- package/build/src/cli/commands/bind.d.ts +4 -5
- package/build/src/cli/commands/bind.js +7 -10
- package/build/src/cli/commands/contract-grammar.d.ts +112 -0
- package/build/src/cli/commands/contract-grammar.js +282 -0
- package/build/src/cli/commands/contract-help.d.ts +17 -22
- package/build/src/cli/commands/contract-help.js +37 -24
- package/build/src/cli/commands/contract.d.ts +18 -97
- package/build/src/cli/commands/contract.js +621 -233
- package/build/src/cli/commands/install.d.ts +1 -1
- package/build/src/cli/commands/install.js +2 -2
- package/build/src/cli/commands/task-grammar.d.ts +19 -0
- package/build/src/cli/commands/task-grammar.js +438 -0
- package/build/src/cli/commands/task-query.js +23 -104
- package/build/src/cli/commands/task.d.ts +5 -20
- package/build/src/cli/commands/task.js +414 -364
- package/build/src/cli/coordinates.d.ts +10 -0
- package/build/src/cli/coordinates.js +20 -0
- package/build/src/cli/draft.d.ts +7 -1
- package/build/src/cli/main.js +10 -1
- package/build/src/cli/parse.d.ts +8 -9
- package/build/src/cli/parse.js +62 -62
- package/build/src/cli/render/akuma-activity.d.ts +54 -36
- package/build/src/cli/render/akuma-activity.js +262 -242
- package/build/src/cli/render/akuma-tool.d.ts +8 -4
- package/build/src/cli/render/akuma-tool.js +6 -5
- package/build/src/cli/render/akuma.d.ts +36 -16
- package/build/src/cli/render/akuma.js +65 -132
- package/build/src/cli/render/audit.d.ts +6 -2
- package/build/src/cli/render/audit.js +59 -28
- package/build/src/cli/render/catalog.d.ts +11 -2
- package/build/src/cli/render/catalog.js +75 -95
- package/build/src/cli/render/contract-history.d.ts +3 -1
- package/build/src/cli/render/contract-history.js +215 -22
- package/build/src/cli/render/contract-observation.d.ts +10 -5
- package/build/src/cli/render/contract-observation.js +29 -46
- package/build/src/cli/render/contract.d.ts +10 -3
- package/build/src/cli/render/contract.js +252 -103
- package/build/src/cli/render/effects.d.ts +26 -0
- package/build/src/cli/render/effects.js +41 -0
- package/build/src/cli/render/execution-progress.d.ts +18 -6
- package/build/src/cli/render/execution-progress.js +34 -31
- package/build/src/cli/render/kanshi-akuma.d.ts +1 -2
- package/build/src/cli/render/kanshi-akuma.js +5 -26
- package/build/src/cli/render/kanshi.js +107 -128
- package/build/src/cli/render/marks.d.ts +13 -0
- package/build/src/cli/render/marks.js +74 -0
- package/build/src/cli/render/nuke.js +18 -7
- package/build/src/cli/render/receipt.d.ts +10 -4
- package/build/src/cli/render/receipt.js +124 -44
- package/build/src/cli/render/reconcile.d.ts +5 -0
- package/build/src/cli/render/reconcile.js +152 -0
- package/build/src/cli/render/refusal.d.ts +21 -4
- package/build/src/cli/render/refusal.js +60 -33
- package/build/src/cli/render/region.js +3 -2
- package/build/src/cli/render/settings.js +2 -12
- package/build/src/cli/render/task.d.ts +37 -6
- package/build/src/cli/render/task.js +161 -157
- package/build/src/cli/render/terminal.d.ts +20 -1
- package/build/src/cli/render/terminal.js +92 -18
- package/build/src/cli/runtime.d.ts +32 -8
- package/build/src/cli/runtime.js +157 -165
- package/build/src/cli/selectors.d.ts +5 -2
- package/build/src/cli/selectors.js +11 -3
- package/build/src/cli/streams.d.ts +11 -0
- package/build/src/cli/streams.js +32 -0
- package/build/src/cli/usage.d.ts +2 -0
- package/build/src/cli/usage.js +12 -8
- package/build/src/contract-guidance.js +3 -7
- package/build/src/contract-worktree.d.ts +20 -28
- package/build/src/contract-worktree.js +18 -70
- package/build/src/coordination/durable-file.d.ts +2 -2
- package/build/src/coordination/durable-file.js +0 -27
- package/build/src/core/facts/codec.d.ts +1 -2
- package/build/src/core/facts/codec.js +6 -7
- package/build/src/core/facts/gate.d.ts +0 -1
- package/build/src/core/facts/gate.js +0 -82
- package/build/src/core/facts/types.d.ts +1 -2
- package/build/src/core/verbs/abandon.d.ts +2 -6
- package/build/src/core/verbs/abandon.js +0 -16
- package/build/src/core/verbs/amend.d.ts +0 -1
- package/build/src/core/verbs/amend.js +0 -20
- package/build/src/core/verbs/arc.d.ts +7 -8
- package/build/src/core/verbs/arc.js +2 -19
- package/build/src/core/verbs/attestation.d.ts +2 -6
- package/build/src/core/verbs/attestation.js +0 -16
- package/build/src/core/verbs/bind.d.ts +0 -1
- package/build/src/core/verbs/bind.js +0 -16
- package/build/src/core/verbs/deliver.d.ts +0 -1
- package/build/src/core/verbs/deliver.js +0 -16
- package/build/src/core/verbs/placement.d.ts +2 -1
- package/build/src/core/verbs/placement.js +10 -59
- package/build/src/git/admission.d.ts +6 -4
- package/build/src/git/admission.js +4 -0
- package/build/src/git/hooks.d.ts +55 -30
- package/build/src/git/hooks.js +30 -3
- package/build/src/git/identity.d.ts +6 -0
- package/build/src/git/identity.js +47 -0
- package/build/src/git/integration.d.ts +31 -13
- package/build/src/git/integration.js +32 -1
- package/build/src/git/nuke.d.ts +10 -1
- package/build/src/git/nuke.js +31 -11
- package/build/src/git/observe.js +2 -15
- package/build/src/git/private-state-seat.d.ts +6 -7
- package/build/src/git/private-state-seat.js +8 -6
- package/build/src/git/read-observation.d.ts +6 -1
- package/build/src/git/read-observation.js +81 -46
- package/build/src/git/reconcile.d.ts +117 -40
- package/build/src/git/reconcile.js +169 -40
- package/build/src/git/scratch.d.ts +7 -4
- package/build/src/git/scratch.js +28 -6
- package/build/src/git/target-placement.d.ts +53 -38
- package/build/src/git/target-placement.js +69 -54
- package/build/src/git/tender.d.ts +37 -28
- package/build/src/git/tender.js +39 -0
- package/build/src/git/terminal-reconcile.js +21 -23
- package/build/src/git/terminal-seal.d.ts +8 -6
- package/build/src/git/terminal-seal.js +10 -0
- package/build/src/git/workspace.d.ts +29 -15
- package/build/src/git/workspace.js +28 -2
- package/build/src/identity/normalize.js +19 -6
- package/build/src/index.d.ts +78 -7
- package/build/src/index.js +52 -4
- package/build/src/kanshi/read.d.ts +3 -3
- package/build/src/kanshi/read.js +21 -21
- package/build/src/kanshi/report.d.ts +9 -8
- package/build/src/kanshi/roster.d.ts +2 -0
- package/build/src/kanshi/roster.js +2 -0
- package/build/src/kanshi/select.js +7 -3
- package/build/src/library/address.d.ts +3 -7
- package/build/src/library/address.js +7 -7
- package/build/src/library/akuma-creation.d.ts +21 -32
- package/build/src/library/akuma-creation.js +148 -165
- package/build/src/library/akumas.d.ts +20 -22
- package/build/src/library/akumas.js +43 -20
- package/build/src/library/bind.d.ts +107 -13
- package/build/src/library/bind.js +29 -23
- package/build/src/library/continuation.d.ts +556 -28
- package/build/src/library/continuation.js +29 -54
- package/build/src/library/contract-composition.d.ts +40 -0
- package/build/src/library/contract-composition.js +105 -0
- package/build/src/library/contract-creation.d.ts +7 -0
- package/build/src/library/contract-creation.js +192 -0
- package/build/src/library/contract-execution.d.ts +29 -40
- package/build/src/library/contract-execution.js +503 -128
- package/build/src/library/contract-operations.d.ts +275 -134
- package/build/src/library/contract-operations.js +83 -92
- package/build/src/library/contract-outcomes.d.ts +71 -0
- package/build/src/library/contract-outcomes.js +32 -0
- package/build/src/library/contract-settings.d.ts +25 -0
- package/build/src/library/contract-settings.js +135 -0
- package/build/src/library/contract-types.d.ts +17 -38
- package/build/src/library/delivery.d.ts +530 -10
- package/build/src/library/delivery.js +20 -45
- package/build/src/library/input.d.ts +3 -1
- package/build/src/library/input.js +11 -16
- package/build/src/library/invocation.d.ts +87 -0
- package/build/src/library/invocation.js +290 -0
- package/build/src/library/keiyaku.d.ts +45 -22
- package/build/src/library/keiyaku.js +134 -8
- package/build/src/library/nuke.d.ts +2 -11
- package/build/src/library/nuke.js +70 -57
- package/build/src/library/outcome.d.ts +13196 -0
- package/build/src/library/outcome.js +487 -0
- package/build/src/library/reconcile.d.ts +96 -24
- package/build/src/library/reconcile.js +102 -42
- package/build/src/library/refusal.d.ts +470 -42
- package/build/src/library/refusal.js +55 -143
- package/build/src/library/region.d.ts +15 -7
- package/build/src/library/region.js +23 -3
- package/build/src/library/repo.d.ts +2 -12
- package/build/src/library/repo.js +1 -22
- package/build/src/library/selection.d.ts +121 -0
- package/build/src/library/{fleet.js → selection.js} +169 -152
- package/build/src/plugin/public.d.ts +2 -0
- package/build/src/protocol/abandon.d.ts +2 -2
- package/build/src/protocol/abandon.js +1 -0
- package/build/src/protocol/amend.js +1 -0
- package/build/src/protocol/arc.d.ts +6 -4
- package/build/src/protocol/attempt.d.ts +4 -2
- package/build/src/protocol/attempt.js +10 -0
- package/build/src/protocol/audit.d.ts +255 -52
- package/build/src/protocol/audit.js +63 -5
- package/build/src/protocol/bind.d.ts +18 -17
- package/build/src/protocol/bind.js +9 -28
- package/build/src/protocol/completion.d.ts +256 -22
- package/build/src/protocol/completion.js +100 -12
- package/build/src/protocol/deliver.d.ts +34 -23
- package/build/src/protocol/deliver.js +39 -25
- package/build/src/protocol/execution-observation.d.ts +36 -37
- package/build/src/protocol/execution-observation.js +7 -9
- package/build/src/protocol/intent.d.ts +101 -30
- package/build/src/protocol/intent.js +74 -1
- package/build/src/protocol/operations.d.ts +570 -64
- package/build/src/protocol/operations.js +189 -9
- package/build/src/protocol/outcome.d.ts +2 -1
- package/build/src/protocol/placement.d.ts +2 -2
- package/build/src/protocol/placement.js +3 -1
- package/build/src/protocol/progress.d.ts +108 -65
- package/build/src/protocol/progress.js +82 -132
- package/build/src/protocol/read/status.d.ts +4 -3
- package/build/src/protocol/read/status.js +6 -5
- package/build/src/protocol/reconcile.d.ts +3 -3
- package/build/src/protocol/reconcile.js +4 -0
- package/build/src/protocol/reintegrate.d.ts +2 -2
- package/build/src/protocol/review.d.ts +30 -12
- package/build/src/protocol/review.js +15 -24
- package/build/src/protocol/run.d.ts +34 -5
- package/build/src/protocol/run.js +24 -12
- package/build/src/runtime/proc/windows-launch.exe +0 -0
- package/build/src/settings.d.ts +0 -10
- package/build/src/settings.js +0 -76
- package/build/src/settlement/holder.d.ts +1 -1
- package/build/src/settlement/settle.d.ts +25 -16
- package/build/src/settlement/settle.js +80 -20
- package/build/src/task/board.d.ts +3 -1
- package/build/src/task/board.js +13 -17
- package/build/src/task/catalog.d.ts +0 -4
- package/build/src/task/catalog.js +0 -15
- package/build/src/task/compose-language.d.ts +19 -9
- package/build/src/task/compose-language.js +30 -20
- package/build/src/task/compose.d.ts +7 -37
- package/build/src/task/compose.js +20 -2
- package/build/src/task/created-observation.d.ts +0 -1
- package/build/src/task/created-observation.js +1 -4
- package/build/src/task/document.d.ts +12 -2
- package/build/src/task/document.js +4 -0
- package/build/src/task/identity.d.ts +4 -1
- package/build/src/task/identity.js +21 -17
- package/build/src/task/index.d.ts +36 -16
- package/build/src/task/index.js +103 -96
- package/build/src/task/lifecycle-operations.d.ts +1 -1
- package/build/src/task/mutation-result.d.ts +647 -586
- package/build/src/task/mutation-result.js +79 -46
- package/build/src/task/mutation.d.ts +298 -270
- package/build/src/task/mutation.js +93 -110
- package/build/src/task/operation-types.d.ts +6 -49
- package/build/src/task/operations.d.ts +2 -1
- package/build/src/task/operations.js +35 -12
- package/build/src/task/query.d.ts +9 -3
- package/build/src/task/query.js +42 -16
- package/build/src/task/store.d.ts +2 -1
- package/build/src/task/store.js +10 -14
- package/build/src/verification/declaration.d.ts +0 -1
- package/build/src/verification/declaration.js +1 -18
- package/build/src/verification/execution.d.ts +6 -2
- package/build/src/verification/observation.d.ts +1 -1
- package/package.json +2 -18
- package/build/src/akuma/akuma-product.d.ts +0 -58
- package/build/src/akuma/akuma-product.js +0 -276
- package/build/src/akuma/fleet-execution.js +0 -234
- package/build/src/akuma/fleet-observation.js +0 -97
- package/build/src/cli/accepted.d.ts +0 -24
- package/build/src/cli/accepted.js +0 -167
- package/build/src/cli/catalog.d.ts +0 -45
- package/build/src/cli/catalog.js +0 -1
- package/build/src/cli/commands/akuma-invoke.d.ts +0 -114
- package/build/src/cli/commands/akuma-invoke.js +0 -375
- package/build/src/cli/commands/contract-invoke.d.ts +0 -34
- package/build/src/cli/commands/contract-invoke.js +0 -259
- package/build/src/cli/commands/nuke.d.ts +0 -10
- package/build/src/cli/commands/nuke.js +0 -20
- package/build/src/cli/commands/status-set.d.ts +0 -4
- package/build/src/cli/commands/status-set.js +0 -52
- package/build/src/cli/commands/task-invoke.d.ts +0 -49
- package/build/src/cli/commands/task-invoke.js +0 -306
- package/build/src/cli/invoke.d.ts +0 -27
- package/build/src/cli/invoke.js +0 -521
- package/build/src/cli/render/board.d.ts +0 -3
- package/build/src/cli/render/board.js +0 -25
- package/build/src/cli/render/status-set.d.ts +0 -5
- package/build/src/cli/render/status-set.js +0 -19
- package/build/src/cli/render/text.d.ts +0 -3
- package/build/src/cli/render/text.js +0 -33
- package/build/src/cli/result.d.ts +0 -240
- package/build/src/cli/result.js +0 -1
- package/build/src/git/result-codec.d.ts +0 -29
- package/build/src/git/result-codec.js +0 -309
- package/build/src/kanshi/fleet.d.ts +0 -6
- package/build/src/kanshi/fleet.js +0 -27
- package/build/src/library/audit.d.ts +0 -29
- package/build/src/library/audit.js +0 -41
- package/build/src/library/composition.d.ts +0 -15
- package/build/src/library/composition.js +0 -28
- package/build/src/library/configuration.d.ts +0 -4
- package/build/src/library/configuration.js +0 -2
- package/build/src/library/contract-bind.d.ts +0 -31
- package/build/src/library/contract-bind.js +0 -140
- package/build/src/library/contract-forwarding.d.ts +0 -55
- package/build/src/library/contract-forwarding.js +0 -67
- package/build/src/library/contract-handle.d.ts +0 -50
- package/build/src/library/contract-handle.js +0 -385
- package/build/src/library/contract.d.ts +0 -46
- package/build/src/library/contract.js +0 -73
- package/build/src/library/execution-result.d.ts +0 -243
- package/build/src/library/execution-result.js +0 -101
- package/build/src/library/execution.d.ts +0 -8
- package/build/src/library/execution.js +0 -102
- package/build/src/library/fleet.d.ts +0 -83
- package/build/src/library/mutation.d.ts +0 -501
- package/build/src/library/mutation.js +0 -248
- package/build/src/library/result-codec.d.ts +0 -2
- package/build/src/library/result-codec.js +0 -12
- package/build/src/protocol/result-codec.d.ts +0 -23
- package/build/src/protocol/result-codec.js +0 -488
- package/build/src/settlement/result-codec.d.ts +0 -2
- package/build/src/settlement/result-codec.js +0 -56
- package/build/src/task/public.d.ts +0 -2
- package/build/src/task/public.js +0 -1
|
@@ -1,14 +1,38 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
command:
|
|
7
|
-
}
|
|
1
|
+
import { type LibraryExecution } from "../akuma/requests.js";
|
|
2
|
+
import type { ActorId } from "../index.js";
|
|
3
|
+
import type { ExecutionObserver } from "../protocol/execution-observation.js";
|
|
4
|
+
import { type ParsedCommand, type ParsedInvocation } from "./parse.js";
|
|
5
|
+
export type ParsedCommandInvocation = Extract<ParsedInvocation, {
|
|
6
|
+
command: ParsedCommand;
|
|
7
|
+
}>;
|
|
8
|
+
type ExecutionProgressDriver = Readonly<{
|
|
9
|
+
observe: ExecutionObserver;
|
|
10
|
+
finish: () => Promise<void>;
|
|
11
|
+
}>;
|
|
12
|
+
/** Everything one invocation's leaves need at the process edge; Product JSON never sees this. */
|
|
13
|
+
export type CliRuntime = Readonly<{
|
|
14
|
+
environment: NodeJS.ProcessEnv;
|
|
15
|
+
execution: LibraryExecution;
|
|
16
|
+
home?: string;
|
|
17
|
+
readStdin: () => Promise<string>;
|
|
18
|
+
signal: AbortSignal;
|
|
19
|
+
progress: () => Promise<ExecutionProgressDriver>;
|
|
20
|
+
actor?: ActorId;
|
|
21
|
+
}>;
|
|
22
|
+
export type CliRuntimeInput = Readonly<{
|
|
23
|
+
cwd?: string;
|
|
24
|
+
environment?: NodeJS.ProcessEnv;
|
|
25
|
+
readStdin?: () => Promise<string>;
|
|
26
|
+
actor?: ActorId;
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}>;
|
|
29
|
+
/** Builds the one live progress observer for an invocation; the leaf owns when it finishes. */
|
|
30
|
+
export declare function writeExecutionProgress(stream?: NodeJS.WritableStream): Promise<ExecutionProgressDriver>;
|
|
8
31
|
type AkumaFailureProjection = Readonly<{
|
|
9
32
|
body: string;
|
|
10
33
|
exitCode: 1 | 3;
|
|
11
34
|
}>;
|
|
35
|
+
/** Projection of one native Akuma addressing/observation failure into its stated refusal body. */
|
|
12
36
|
export declare function akumaFailureProjection(error: unknown, command: ParsedCommand): Promise<AkumaFailureProjection | undefined>;
|
|
13
|
-
export declare function runCliCommand(invocation:
|
|
37
|
+
export declare function runCliCommand(invocation: ParsedCommandInvocation, input?: CliRuntimeInput): Promise<number>;
|
|
14
38
|
export {};
|
package/build/src/cli/runtime.js
CHANGED
|
@@ -1,14 +1,46 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { AkumaNotBornError, AkumaObservationError } from "../akuma/akuma-errors.js";
|
|
2
|
+
import { AkumaArchetypeError } from "../akuma/archetype.js";
|
|
3
|
+
import { AKUMA_REQUESTS_ENV } from "../akuma/provider.js";
|
|
4
|
+
import { bodyRequestExecution, localExecutionContext } from "../akuma/requests.js";
|
|
5
|
+
import { AkumaAddressError, AkumaWorldScopeError } from "../library/address.js";
|
|
6
|
+
import { encodeFailureWire, KeiyakuError } from "../library/outcome.js";
|
|
7
|
+
import { isParsedAkumaCommand, runAkumaCommand } from "./commands/akuma.js";
|
|
8
|
+
import { admitBindMarkdown, runContractCommand, runContractHistoryCommand } from "./commands/contract.js";
|
|
9
|
+
import { installExitCode, installHarnesses, renderInstallText, } from "./commands/install.js";
|
|
10
|
+
import { runTaskCommand } from "./commands/task.js";
|
|
11
|
+
import { resolveInvocationCoordinates } from "./coordinates.js";
|
|
12
|
+
import { BindDraftError } from "./draft.js";
|
|
13
|
+
import { assertExplicitRepoUse, CliUsageError, usageGuideForCommand, } from "./parse.js";
|
|
14
|
+
import { createExecutionProgressRenderer } from "./render/execution-progress.js";
|
|
15
|
+
import { executionFailureLines } from "./render/receipt.js";
|
|
16
|
+
import { renderRefusal, renderStructuredRefusal } from "./render/refusal.js";
|
|
4
17
|
import { DEFAULT_CLI_COLUMNS, safeText } from "./render/terminal.js";
|
|
5
|
-
|
|
6
|
-
|
|
18
|
+
import { displayContext, writeJson, writeStderr, writeStdout } from "./streams.js";
|
|
19
|
+
function processStdin() {
|
|
20
|
+
return (async () => {
|
|
21
|
+
const chunks = [];
|
|
22
|
+
for await (const chunk of process.stdin)
|
|
23
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
24
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
25
|
+
})();
|
|
7
26
|
}
|
|
8
|
-
|
|
9
|
-
|
|
27
|
+
function memoized(reader) {
|
|
28
|
+
let value;
|
|
29
|
+
return () => (value ??= reader());
|
|
30
|
+
}
|
|
31
|
+
function executionForEnvironment(environment) {
|
|
32
|
+
return environment[AKUMA_REQUESTS_ENV] === undefined
|
|
33
|
+
? localExecutionContext()
|
|
34
|
+
: bodyRequestExecution({ directory: environment[AKUMA_REQUESTS_ENV] });
|
|
35
|
+
}
|
|
36
|
+
function homeFromEnvironment(environment) {
|
|
37
|
+
const mapped = environment.KEIYAKU_HOME?.trim();
|
|
38
|
+
return mapped === undefined || mapped.length === 0 ? undefined : mapped;
|
|
39
|
+
}
|
|
40
|
+
/** Builds the one live progress observer for an invocation; the leaf owns when it finishes. */
|
|
41
|
+
export async function writeExecutionProgress(stream = process.stderr) {
|
|
10
42
|
const terminal = stream;
|
|
11
|
-
|
|
43
|
+
const renderer = createExecutionProgressRenderer({
|
|
12
44
|
stream: terminal,
|
|
13
45
|
context: {
|
|
14
46
|
columns: terminal.isTTY === true && Number.isInteger(terminal.columns)
|
|
@@ -17,8 +49,11 @@ export async function writeExecutionProgress(events, stream = process.stderr) {
|
|
|
17
49
|
color: false,
|
|
18
50
|
},
|
|
19
51
|
});
|
|
52
|
+
return { observe: (event) => renderer.observe(event), finish: () => renderer.finish() };
|
|
20
53
|
}
|
|
21
|
-
function cliCancellation() {
|
|
54
|
+
function cliCancellation(signal) {
|
|
55
|
+
if (signal !== undefined)
|
|
56
|
+
return { signal, close: () => undefined };
|
|
22
57
|
const controller = new AbortController();
|
|
23
58
|
const cancel = () => controller.abort(new Error("CLI cancellation requested"));
|
|
24
59
|
process.once("SIGINT", cancel);
|
|
@@ -31,133 +66,48 @@ function cliCancellation() {
|
|
|
31
66
|
},
|
|
32
67
|
};
|
|
33
68
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
writeCliStream(process.stdout, JSON.stringify(result));
|
|
44
|
-
else if (command.action === "compose" &&
|
|
45
|
-
typeof result === "object" &&
|
|
46
|
-
result !== null &&
|
|
47
|
-
"kind" in result &&
|
|
48
|
-
result.kind === "incomplete") {
|
|
49
|
-
const diagnostic = renderTaskIncompleteDiagnostic(result);
|
|
50
|
-
if (diagnostic.length > 0)
|
|
51
|
-
writeCliStream(process.stderr, diagnostic);
|
|
52
|
-
process.stdout.write(result.draft);
|
|
53
|
-
}
|
|
54
|
-
else
|
|
55
|
-
writeCliStream(process.stdout, renderTaskText(command, result, context));
|
|
56
|
-
return taskExitCode(result);
|
|
57
|
-
}
|
|
58
|
-
function displayContext() {
|
|
59
|
-
return {
|
|
60
|
-
columns: process.stdout.isTTY === true && Number.isInteger(process.stdout.columns)
|
|
61
|
-
? process.stdout.columns
|
|
62
|
-
: DEFAULT_CLI_COLUMNS,
|
|
63
|
-
color: process.stdout.isTTY === true && process.env.NO_COLOR === undefined,
|
|
64
|
-
};
|
|
69
|
+
/** Bind's document admission runs before coordinate resolution so a malformed document refuses first. */
|
|
70
|
+
async function admitBindInput(command, invocation, runtime, processCwd) {
|
|
71
|
+
if (command.command !== "bind" || command.forkOf !== undefined)
|
|
72
|
+
return;
|
|
73
|
+
await admitBindMarkdown({
|
|
74
|
+
markdown: await runtime.readStdin(),
|
|
75
|
+
processCwd,
|
|
76
|
+
...(invocation.cwd === undefined ? {} : { cwd: invocation.cwd }),
|
|
77
|
+
});
|
|
65
78
|
}
|
|
66
|
-
async function
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
(akumaRawAnswer(result) !== undefined ||
|
|
71
|
-
(command.command === "history" && command.last && result.action === "history" && result.mode === "last"));
|
|
72
|
-
if (exact)
|
|
73
|
-
process.stdout.write(output);
|
|
79
|
+
async function runInstall(command, environment) {
|
|
80
|
+
const result = await installHarnesses(command.harnesses, environment);
|
|
81
|
+
if (command.output === "json")
|
|
82
|
+
writeJson(result);
|
|
74
83
|
else
|
|
75
|
-
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
function isAkumaOutput(command, result) {
|
|
79
|
-
if (isParsedAkumaCommand(command))
|
|
80
|
-
return true;
|
|
81
|
-
return (command.command === "status" &&
|
|
82
|
-
typeof result === "object" &&
|
|
83
|
-
result !== null &&
|
|
84
|
-
"kind" in result &&
|
|
85
|
-
result.kind === "akuma");
|
|
86
|
-
}
|
|
87
|
-
function invocationJson(result) {
|
|
88
|
-
switch (result.kind) {
|
|
89
|
-
case "guidance":
|
|
90
|
-
return { contract: result.contract, guidance: result.guidance };
|
|
91
|
-
case "catalog":
|
|
92
|
-
return result.catalog;
|
|
93
|
-
case "nuke":
|
|
94
|
-
return result.result;
|
|
95
|
-
case "region":
|
|
96
|
-
return result.region;
|
|
97
|
-
case "contract-history":
|
|
98
|
-
return result.history;
|
|
99
|
-
case "status":
|
|
100
|
-
return result.report;
|
|
101
|
-
case "status-set":
|
|
102
|
-
return result.entries;
|
|
103
|
-
default:
|
|
104
|
-
return result;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
async function invocationExitCode(result) {
|
|
108
|
-
if (result.kind === "nuke")
|
|
109
|
-
return (await import("./render/nuke.js")).nukeExitCode(result.result);
|
|
110
|
-
if (result.kind === "observation") {
|
|
111
|
-
const { worldObservationFailureText } = await import("./render/board.js");
|
|
112
|
-
return worldObservationFailureText(result) === undefined ? 0 : 1;
|
|
113
|
-
}
|
|
114
|
-
return result.kind === "refused" ? 1 : result.kind === "retry" ? 2 : 0;
|
|
115
|
-
}
|
|
116
|
-
async function writeResult(command, result) {
|
|
117
|
-
if (command.command === "install") {
|
|
118
|
-
const { installExitCode, renderInstallText } = await import("./commands/install.js");
|
|
119
|
-
const value = result;
|
|
120
|
-
writeCliStream(process.stdout, command.output === "json" ? JSON.stringify(value) : renderInstallText(value));
|
|
121
|
-
return installExitCode(value);
|
|
122
|
-
}
|
|
123
|
-
if (command.command === "task")
|
|
124
|
-
return await writeTask(command, result);
|
|
125
|
-
if (command.command === "settings") {
|
|
126
|
-
const { renderSettingsText, settingsJsonValue } = await import("./render/settings.js");
|
|
127
|
-
const value = result.value;
|
|
128
|
-
writeCliStream(process.stdout, command.output === "json"
|
|
129
|
-
? JSON.stringify(settingsJsonValue(value))
|
|
130
|
-
: renderSettingsText(value, displayContext().columns));
|
|
131
|
-
return 0;
|
|
132
|
-
}
|
|
133
|
-
if (isAkumaOutput(command, result))
|
|
134
|
-
return await writeAkuma(command, result);
|
|
135
|
-
const contractResult = result;
|
|
136
|
-
const { renderText } = await import("./render/text.js");
|
|
137
|
-
const json = command.output === "json";
|
|
138
|
-
const body = json ? JSON.stringify(invocationJson(contractResult)) : renderText(contractResult, displayContext());
|
|
139
|
-
writeCliStream(process.stdout, body);
|
|
140
|
-
return invocationExitCode(contractResult);
|
|
84
|
+
writeStdout(renderInstallText(result));
|
|
85
|
+
return installExitCode(result);
|
|
141
86
|
}
|
|
87
|
+
/** Projection of one native Akuma addressing/observation failure into its stated refusal body. */
|
|
142
88
|
export async function akumaFailureProjection(error, command) {
|
|
143
|
-
const [{ AkumaNotBornError, AkumaObservationError }, { AkumaAddressError, AkumaWorldScopeError }] = await Promise.all([import("../akuma/akuma-errors.js"), import("../library/address.js")]);
|
|
144
89
|
if (error instanceof AkumaNotBornError) {
|
|
145
90
|
return {
|
|
146
|
-
body: command.output === "json"
|
|
91
|
+
body: command.output === "json"
|
|
92
|
+
? error.message
|
|
93
|
+
: renderStructuredRefusal(command.command, "Akuma not found", [`id ${safeText(error.id)}`], usageGuideForCommand(command)),
|
|
147
94
|
exitCode: 1,
|
|
148
95
|
};
|
|
149
96
|
}
|
|
150
97
|
if (error instanceof AkumaAddressError) {
|
|
151
98
|
const body = error.refusal.kind === "akuma-alias-not-found"
|
|
152
|
-
?
|
|
153
|
-
:
|
|
99
|
+
? renderStructuredRefusal(command.command, "Akuma alias not found", [`alias ${safeText(error.refusal.alias)}`], usageGuideForCommand(command))
|
|
100
|
+
: renderStructuredRefusal(command.command, "invalid Akuma address", [`selector ${safeText(error.refusal.selector)}`], usageGuideForCommand(command));
|
|
154
101
|
return { body: command.output === "json" ? error.message : body, exitCode: 1 };
|
|
155
102
|
}
|
|
156
103
|
if (error instanceof AkumaWorldScopeError) {
|
|
157
104
|
return {
|
|
158
105
|
body: command.output === "json"
|
|
159
106
|
? JSON.stringify(error.refusal)
|
|
160
|
-
:
|
|
107
|
+
: renderStructuredRefusal(command.command, "Akuma not in this World", [
|
|
108
|
+
`ids ${error.refusal.ids.map((id) => safeText(id)).join(" · ")}`,
|
|
109
|
+
`world ${safeText(error.refusal.world)}`,
|
|
110
|
+
], usageGuideForCommand(command)),
|
|
161
111
|
exitCode: 1,
|
|
162
112
|
};
|
|
163
113
|
}
|
|
@@ -175,60 +125,102 @@ async function commandFailureText(error, command) {
|
|
|
175
125
|
const diagnostic = error instanceof Error ? error.message : String(error);
|
|
176
126
|
if (command.output === "json" || error instanceof CliUsageError)
|
|
177
127
|
return diagnostic;
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
128
|
+
if (error instanceof AkumaArchetypeError) {
|
|
129
|
+
if (command.command === "call") {
|
|
130
|
+
return renderStructuredRefusal("call", `Akuma not found · ${safeText(error.archetype)}`, ["available keiyaku ls aku/"], usageGuideForCommand(command));
|
|
131
|
+
}
|
|
132
|
+
return `× ${command.command} failed\n reason ${safeText(error.message)}`;
|
|
133
|
+
}
|
|
134
|
+
return `× ${command.command} failed\n reason ${safeText(diagnostic)}`;
|
|
135
|
+
}
|
|
136
|
+
function writeBindDraftFailure(error, command) {
|
|
137
|
+
const refusal = {
|
|
138
|
+
kind: "invalid-document",
|
|
139
|
+
diagnostic: error.original instanceof Error ? error.original.message : String(error.original),
|
|
140
|
+
};
|
|
141
|
+
if (command.output === "json")
|
|
142
|
+
writeJson({ kind: "refused", operation: "bind", refusal, draft: error.draft });
|
|
143
|
+
else
|
|
144
|
+
writeStdout(renderRefusal({ operation: "bind", refusal }, error.draft, displayContext()));
|
|
145
|
+
return error.original instanceof CliUsageError ? 64 : 1;
|
|
146
|
+
}
|
|
147
|
+
async function writeFailure(error, command) {
|
|
148
|
+
if (error instanceof BindDraftError)
|
|
149
|
+
return writeBindDraftFailure(error, command);
|
|
150
|
+
if (error instanceof KeiyakuError) {
|
|
151
|
+
const diagnostic = error.message;
|
|
152
|
+
if (command.output === "json")
|
|
153
|
+
writeJson(encodeFailureWire(error));
|
|
154
|
+
else if (error.outcome !== undefined) {
|
|
155
|
+
writeStdout(executionFailureLines(error.outcome, error.category, diagnostic, displayContext().columns).join("\n"));
|
|
185
156
|
}
|
|
186
|
-
|
|
187
|
-
|
|
157
|
+
else
|
|
158
|
+
writeStderr(`× ${command.command} failed\n reason ${safeText(diagnostic)}`);
|
|
159
|
+
return 3;
|
|
160
|
+
}
|
|
161
|
+
const akumaFailure = await akumaFailureProjection(error, command);
|
|
162
|
+
if (akumaFailure !== undefined) {
|
|
163
|
+
writeStderr(akumaFailure.body);
|
|
164
|
+
return akumaFailure.exitCode;
|
|
188
165
|
}
|
|
189
|
-
|
|
166
|
+
if (error instanceof AkumaArchetypeError && command.command === "call") {
|
|
167
|
+
if (command.output === "json")
|
|
168
|
+
writeJson({
|
|
169
|
+
kind: "refused",
|
|
170
|
+
diagnostic: "Akuma not found",
|
|
171
|
+
archetype: error.archetype,
|
|
172
|
+
available: "keiyaku ls aku/",
|
|
173
|
+
});
|
|
174
|
+
else
|
|
175
|
+
writeStdout(renderStructuredRefusal("call", `Akuma not found · ${safeText(error.archetype)}`, ["available keiyaku ls aku/"], usageGuideForCommand(command)));
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
if (command.output === "json")
|
|
179
|
+
writeJson(encodeFailureWire(error));
|
|
180
|
+
else
|
|
181
|
+
writeStderr(await commandFailureText(error, command));
|
|
182
|
+
return error instanceof CliUsageError ? 64 : 3;
|
|
190
183
|
}
|
|
191
|
-
export async function runCliCommand(invocation) {
|
|
184
|
+
export async function runCliCommand(invocation, input = {}) {
|
|
192
185
|
const command = invocation.command;
|
|
193
|
-
|
|
186
|
+
assertExplicitRepoUse(command, invocation.repo);
|
|
187
|
+
const environment = input.environment ?? process.env;
|
|
188
|
+
const home = homeFromEnvironment(environment);
|
|
189
|
+
const cancellation = cliCancellation(input.signal);
|
|
190
|
+
let progress;
|
|
191
|
+
const runtime = {
|
|
192
|
+
environment,
|
|
193
|
+
execution: executionForEnvironment(environment),
|
|
194
|
+
...(home === undefined ? {} : { home }),
|
|
195
|
+
readStdin: memoized(input.readStdin ?? processStdin),
|
|
196
|
+
signal: cancellation.signal,
|
|
197
|
+
progress: () => (progress ??= writeExecutionProgress()),
|
|
198
|
+
...(input.actor === undefined ? {} : { actor: input.actor }),
|
|
199
|
+
};
|
|
194
200
|
try {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
if (command.command === "install")
|
|
202
|
+
return await runInstall(command, environment);
|
|
203
|
+
await admitBindInput(command, invocation, runtime, input.cwd ?? process.cwd());
|
|
204
|
+
const coordinates = await resolveInvocationCoordinates({
|
|
205
|
+
processCwd: input.cwd ?? process.cwd(),
|
|
206
|
+
...(invocation.cwd === undefined ? {} : { cwd: invocation.cwd }),
|
|
207
|
+
...(invocation.repo === undefined ? {} : { repo: invocation.repo }),
|
|
208
|
+
...(invocation.workdir === undefined ? {} : { workdir: invocation.workdir }),
|
|
209
|
+
command,
|
|
210
|
+
}, environment);
|
|
211
|
+
if (command.command === "task")
|
|
212
|
+
return await runTaskCommand(command, coordinates, runtime);
|
|
213
|
+
if (isParsedAkumaCommand(command))
|
|
214
|
+
return await runAkumaCommand(command, coordinates, invocation.workdir, runtime);
|
|
215
|
+
if (command.command === "history" && "contract" in command)
|
|
216
|
+
return await runContractHistoryCommand(command, coordinates);
|
|
217
|
+
return await runContractCommand(command, coordinates, runtime);
|
|
202
218
|
}
|
|
203
219
|
catch (error) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (receipt !== undefined) {
|
|
207
|
-
const diagnostic = error instanceof Error ? error.message : String(error);
|
|
208
|
-
const { postAdmissionFailureCategory } = await import("../library/refusal.js");
|
|
209
|
-
const category = postAdmissionFailureCategory(error);
|
|
210
|
-
const { executionFailureLines } = await import("./render/receipt.js");
|
|
211
|
-
writeCliStream(process.stdout, command.output === "json"
|
|
212
|
-
? JSON.stringify({ kind: "execution-failed", category, diagnostic, receipt })
|
|
213
|
-
: executionFailureLines(receipt, category, diagnostic, displayContext().columns).join("\n"));
|
|
214
|
-
return 3;
|
|
215
|
-
}
|
|
216
|
-
const akumaFailure = await akumaFailureProjection(error, command);
|
|
217
|
-
if (akumaFailure !== undefined) {
|
|
218
|
-
writeCliStream(process.stderr, akumaFailure.body);
|
|
219
|
-
return akumaFailure.exitCode;
|
|
220
|
-
}
|
|
221
|
-
if (command.command === "bind") {
|
|
222
|
-
const { BindDraftError } = await import("./draft.js");
|
|
223
|
-
if (error instanceof BindDraftError) {
|
|
224
|
-
writeCliStream(process.stderr, await commandFailureText(error.original, command));
|
|
225
|
-
const { renderBindDraftReceipt } = await import("./render/refusal.js");
|
|
226
|
-
writeCliStream(process.stderr, renderBindDraftReceipt(error.draft));
|
|
227
|
-
return error.original instanceof CliUsageError ? 1 : 3;
|
|
228
|
-
}
|
|
220
|
+
if (error instanceof CliUsageError && error.guide === undefined) {
|
|
221
|
+
throw new CliUsageError(error.diagnostic, usageGuideForCommand(command));
|
|
229
222
|
}
|
|
230
|
-
|
|
231
|
-
return error instanceof CliUsageError ? 1 : 3;
|
|
223
|
+
return await writeFailure(error, command);
|
|
232
224
|
}
|
|
233
225
|
finally {
|
|
234
226
|
cancellation.close();
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { Keiyaku, type ContractBoard, type ContractId, type Repo } from "../index.js";
|
|
2
1
|
import { type ExecutionContext } from "../akuma/requests.js";
|
|
2
|
+
import type { ContractBoard, ContractId, Keiyaku, Repo } from "../index.js";
|
|
3
3
|
import type { KanshiReport } from "../kanshi/index.js";
|
|
4
|
-
|
|
4
|
+
type SelectedContract = Readonly<{
|
|
5
5
|
id: ContractId;
|
|
6
6
|
contract: Keiyaku;
|
|
7
7
|
}>;
|
|
8
8
|
export declare function contractFromInput(repo: Repo, value: string, execution?: ExecutionContext): SelectedContract;
|
|
9
9
|
export declare function resolveContextualContract(board: ContractBoard, selector: string | undefined, scope: string): ContractId;
|
|
10
|
+
/** Resolve one explicit, short, or worktree-contextual selector to its Contract id. */
|
|
11
|
+
export declare function resolveContractId(repo: Repo, selector: string | undefined, scope: string): Promise<ContractId>;
|
|
10
12
|
export declare function canonicalContractSelector(selector: string): ContractId;
|
|
11
13
|
export declare function resolveKanshiContract(report: KanshiReport, selector: string): string;
|
|
14
|
+
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
|
-
import { identitySegments } from "../identity/coordinates.js";
|
|
3
|
-
import { Keiyaku } from "../index.js";
|
|
4
2
|
import { localExecutionContext } from "../akuma/requests.js";
|
|
3
|
+
import { identitySegments } from "../identity/coordinates.js";
|
|
4
|
+
import { composeContractLibrary } from "../library/contract-composition.js";
|
|
5
|
+
import { createKeiyakuHandle } from "../library/keiyaku.js";
|
|
5
6
|
import { CliUsageError } from "./parse.js";
|
|
6
7
|
function selectorError(message) {
|
|
7
8
|
throw new CliUsageError(message);
|
|
@@ -16,7 +17,7 @@ function activeManagedCandidates(rows) {
|
|
|
16
17
|
export function contractFromInput(repo, value, execution = localExecutionContext()) {
|
|
17
18
|
try {
|
|
18
19
|
const id = value;
|
|
19
|
-
return { id, contract:
|
|
20
|
+
return { id, contract: composeContractLibrary(execution, createKeiyakuHandle).select({ repo, id }) };
|
|
20
21
|
}
|
|
21
22
|
catch (error) {
|
|
22
23
|
selectorError(error instanceof Error ? error.message : String(error));
|
|
@@ -49,6 +50,13 @@ export function resolveContextualContract(board, selector, scope) {
|
|
|
49
50
|
return resolveShortContract(board.rows, selector);
|
|
50
51
|
return selectorError(`contract selector must be kei/<contract-segment> or @<contract-segment>: ${selector}`);
|
|
51
52
|
}
|
|
53
|
+
/** Resolve one explicit, short, or worktree-contextual selector to its Contract id. */
|
|
54
|
+
export async function resolveContractId(repo, selector, scope) {
|
|
55
|
+
if (selector !== undefined && !selector.startsWith("@"))
|
|
56
|
+
return contractFromInput(repo, selector).id;
|
|
57
|
+
const { listKeiyaku } = await import("../library/contract-composition.js");
|
|
58
|
+
return resolveContextualContract(await listKeiyaku({ repo }), selector, scope);
|
|
59
|
+
}
|
|
52
60
|
export function canonicalContractSelector(selector) {
|
|
53
61
|
try {
|
|
54
62
|
identitySegments({ family: "kei", value: selector });
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type TextRenderContext } from "./render/terminal.js";
|
|
2
|
+
/** Append one complete line to a process stream unless the body already ends with a newline. */
|
|
3
|
+
export declare function writeCliStream(stream: NodeJS.WritableStream, body: string): void;
|
|
4
|
+
export declare function writeStdout(body: string): void;
|
|
5
|
+
export declare function writeStderr(body: string): void;
|
|
6
|
+
/** The product-result presentation context, measured from the stream that carries the result. */
|
|
7
|
+
export declare function displayContext(): TextRenderContext;
|
|
8
|
+
/** The live-progress context, measured from stderr where activity rows are written. */
|
|
9
|
+
export declare function resultContext(): TextRenderContext;
|
|
10
|
+
/** One JSON product answer, verbatim from the native value. */
|
|
11
|
+
export declare function writeJson(value: unknown): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DEFAULT_CLI_COLUMNS } from "./render/terminal.js";
|
|
2
|
+
/** Append one complete line to a process stream unless the body already ends with a newline. */
|
|
3
|
+
export function writeCliStream(stream, body) {
|
|
4
|
+
stream.write(body.endsWith("\n") ? body : `${body}\n`);
|
|
5
|
+
}
|
|
6
|
+
export function writeStdout(body) {
|
|
7
|
+
writeCliStream(process.stdout, body);
|
|
8
|
+
}
|
|
9
|
+
export function writeStderr(body) {
|
|
10
|
+
writeCliStream(process.stderr, body);
|
|
11
|
+
}
|
|
12
|
+
/** The product-result presentation context, measured from the stream that carries the result. */
|
|
13
|
+
export function displayContext() {
|
|
14
|
+
return {
|
|
15
|
+
columns: process.stdout.isTTY === true && Number.isInteger(process.stdout.columns)
|
|
16
|
+
? process.stdout.columns
|
|
17
|
+
: DEFAULT_CLI_COLUMNS,
|
|
18
|
+
color: process.stdout.isTTY === true && process.env.NO_COLOR === undefined,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** The live-progress context, measured from stderr where activity rows are written. */
|
|
22
|
+
export function resultContext() {
|
|
23
|
+
const tty = process.stderr.isTTY === true;
|
|
24
|
+
return {
|
|
25
|
+
columns: tty && Number.isInteger(process.stderr.columns) ? process.stderr.columns : DEFAULT_CLI_COLUMNS,
|
|
26
|
+
color: tty && process.env.NO_COLOR === undefined,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** One JSON product answer, verbatim from the native value. */
|
|
30
|
+
export function writeJson(value) {
|
|
31
|
+
writeStdout(JSON.stringify(value));
|
|
32
|
+
}
|
package/build/src/cli/usage.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export declare function acceptsFromUsage(usage: string): string;
|
|
|
11
11
|
export declare function commandGuide(commandPath: string, usage: string): CliUsageGuide;
|
|
12
12
|
export declare function unknownCommandGuide(guide: CliUsageGuide, given: string): CliUsageGuide;
|
|
13
13
|
export declare function renderUsageMessage(diagnostic: string, guide?: CliUsageGuide, kind?: "usage" | "selector"): string;
|
|
14
|
+
/** The acceptance grammar tail shared by usage and substantive refusals. */
|
|
15
|
+
export declare function usageAcceptanceLines(guide: CliUsageGuide): readonly string[];
|
|
14
16
|
export declare class CliUsageError extends Error {
|
|
15
17
|
readonly diagnostic: string;
|
|
16
18
|
readonly guide?: CliUsageGuide | undefined;
|
package/build/src/cli/usage.js
CHANGED
|
@@ -34,23 +34,27 @@ export function unknownCommandGuide(guide, given) {
|
|
|
34
34
|
}
|
|
35
35
|
export function renderUsageMessage(diagnostic, guide, kind = "usage") {
|
|
36
36
|
if (guide === undefined) {
|
|
37
|
-
return `× ${kind}\n
|
|
37
|
+
return `× ${kind}\n reason ${diagnostic}`;
|
|
38
38
|
}
|
|
39
39
|
const lines = [`× ${kind} ${guide.scope}`];
|
|
40
40
|
if (!guide.hideDiagnostic && diagnostic.length > 0) {
|
|
41
|
-
lines.push(`
|
|
41
|
+
lines.push(` reason ${diagnostic}`);
|
|
42
42
|
}
|
|
43
43
|
if (guide.given !== undefined) {
|
|
44
44
|
lines.push(` given ${guide.given}`);
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
lines.push(` accepts ${accepts[0]}`);
|
|
48
|
-
for (const part of accepts.slice(1)) {
|
|
49
|
-
lines.push(` ${part}`);
|
|
50
|
-
}
|
|
51
|
-
lines.push(` help ${guide.help}`);
|
|
46
|
+
lines.push(...usageAcceptanceLines(guide));
|
|
52
47
|
return lines.join("\n");
|
|
53
48
|
}
|
|
49
|
+
/** The acceptance grammar tail shared by usage and substantive refusals. */
|
|
50
|
+
export function usageAcceptanceLines(guide) {
|
|
51
|
+
const accepts = guide.accepts.split("\n");
|
|
52
|
+
return [
|
|
53
|
+
` accepts ${accepts[0]}`,
|
|
54
|
+
...accepts.slice(1).map((part) => ` ${part}`),
|
|
55
|
+
` help ${guide.help}`,
|
|
56
|
+
];
|
|
57
|
+
}
|
|
54
58
|
export class CliUsageError extends Error {
|
|
55
59
|
diagnostic;
|
|
56
60
|
guide;
|
|
@@ -89,7 +89,7 @@ export const CONTRACT_REVIEWER_SKILL = [
|
|
|
89
89
|
"",
|
|
90
90
|
"`keiyaku review` records a verdict on the whole Contract.",
|
|
91
91
|
"",
|
|
92
|
-
"Record `--satisfied` when you have verified two things and hold the evidence: the current worktree meets every Criterion, and the result actually achieves what the Objective set out to do. Criteria are the written checks; the Objective is the intent behind them — work that passes every check but misses the intent is not satisfied. If a delivered candidate, prerequisites, and all declared gates are in place, the Contract is
|
|
92
|
+
"Record `--satisfied` when you have verified two things and hold the evidence: the current worktree meets every Criterion, and the result actually achieves what the Objective set out to do. Criteria are the written checks; the Objective is the intent behind them — work that passes every check but misses the intent is not satisfied. If a delivered candidate, prerequisites, and all declared gates are in place, the Contract is accepted immediately and cannot be reopened.",
|
|
93
93
|
"",
|
|
94
94
|
"Record `--unsatisfied` when any Criterion is unmet, the work is incomplete, or the result does not achieve the Objective's intent — and state what is missing.",
|
|
95
95
|
"",
|
|
@@ -117,13 +117,9 @@ function renderArc(arc) {
|
|
|
117
117
|
"",
|
|
118
118
|
arc.title.trimEnd(),
|
|
119
119
|
"",
|
|
120
|
-
"###
|
|
120
|
+
"### Body",
|
|
121
121
|
"",
|
|
122
|
-
arc.
|
|
123
|
-
"",
|
|
124
|
-
"### Brief",
|
|
125
|
-
"",
|
|
126
|
-
arc.brief.trimEnd(),
|
|
122
|
+
arc.body.replace(/^(?:\r?\n)+/u, "").trimEnd(),
|
|
127
123
|
].join("\n");
|
|
128
124
|
}
|
|
129
125
|
const FULFILLMENT = [
|
|
@@ -1,35 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type ContractState } from "./core/facts/types.js";
|
|
3
3
|
import { type GitRepository } from "./git/process.js";
|
|
4
4
|
import { type PlaceRegister } from "./workspace-place.js";
|
|
5
|
-
export
|
|
6
|
-
kind: "
|
|
7
|
-
path:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export
|
|
17
|
-
kind: "contract-file"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
worktree: string;
|
|
24
|
-
path: string;
|
|
25
|
-
diagnostic: string;
|
|
26
|
-
}>;
|
|
27
|
-
export declare function decodeContractFileLag(value: unknown): ContractFileLag;
|
|
5
|
+
export declare const contractFileEffectSchema: z.ZodObject<{
|
|
6
|
+
kind: z.ZodLiteral<"contract-file">;
|
|
7
|
+
path: z.ZodString;
|
|
8
|
+
action: z.ZodEnum<{
|
|
9
|
+
created: "created";
|
|
10
|
+
updated: "updated";
|
|
11
|
+
unchanged: "unchanged";
|
|
12
|
+
removed: "removed";
|
|
13
|
+
}>;
|
|
14
|
+
}, z.core.$strict>;
|
|
15
|
+
export type ContractFileEffect = z.infer<typeof contractFileEffectSchema>;
|
|
16
|
+
export declare const contractFileLagSchema: z.ZodObject<{
|
|
17
|
+
kind: z.ZodLiteral<"contract-file-failed">;
|
|
18
|
+
worktree: z.ZodString;
|
|
19
|
+
path: z.ZodString;
|
|
20
|
+
diagnostic: z.ZodString;
|
|
21
|
+
}, z.core.$strict>;
|
|
22
|
+
export type ContractFileLag = z.infer<typeof contractFileLagSchema>;
|
|
28
23
|
export type ContractWorktreeResult = Readonly<{
|
|
29
24
|
effects: readonly ContractFileEffect[];
|
|
30
25
|
lag: readonly ContractFileLag[];
|
|
31
26
|
}>;
|
|
32
|
-
export declare function readContractAppointment(repository: GitRepository): Promise<ContractAppointment>;
|
|
33
|
-
export declare function withContractWorktreeAppointment<T>(repository: GitRepository, action: () => T | Promise<T>): Promise<T>;
|
|
34
|
-
export declare function releaseContractWorktree(repository: GitRepository, contract: ContractId): Promise<void>;
|
|
35
27
|
export declare function projectContractWorktree(repository: GitRepository, state: ContractState | null, register?: PlaceRegister, _onConflict?: (diagnostic: string) => never): Promise<ContractWorktreeResult>;
|