@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,394 +1,444 @@
|
|
|
1
|
-
import { CliUsageError, isBlankInput
|
|
1
|
+
import { CliUsageError, isBlankInput } from "../usage.js";
|
|
2
2
|
import { parseTaskNamespaceSelector } from "../../task/catalog.js";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
needs: "repeat",
|
|
15
|
-
parent: "value",
|
|
16
|
-
supersedes: "repeat",
|
|
17
|
-
relates: "repeat",
|
|
18
|
-
body: "value",
|
|
19
|
-
note: "value",
|
|
20
|
-
actor: "value",
|
|
21
|
-
},
|
|
22
|
-
usage: `task add <TITLE> [--namespace <ns>] [--priority 0..3]
|
|
23
|
-
[--state open|in_progress|on_hold|done|drop]
|
|
24
|
-
[--note <text>] [--actor <actor>]
|
|
25
|
-
[--needs <TaskId>]... [--parent <TaskId>]
|
|
26
|
-
[--supersedes <TaskId>]... [--relates <TaskId>]...
|
|
27
|
-
[--body <text>]
|
|
28
|
-
task add [--namespace <ns>] [--actor <actor>] -`,
|
|
29
|
-
purpose: "Create a Task from flags or a Task document on stdin.",
|
|
30
|
-
},
|
|
31
|
-
show: {
|
|
32
|
-
arity: [1, Number.POSITIVE_INFINITY],
|
|
33
|
-
flags: COMMON,
|
|
34
|
-
usage: "task show <TaskId>...",
|
|
35
|
-
purpose: "Read one or more Tasks and their relationships.",
|
|
36
|
-
},
|
|
37
|
-
ls: {
|
|
38
|
-
arity: [0, 1],
|
|
39
|
-
flags: { ...COMMON, closed: "boolean", all: "boolean", world: "boolean", limit: "value" },
|
|
40
|
-
usage: "task ls [<namespace-selector>] [--closed | --all] [--world] [--limit <n>]",
|
|
41
|
-
purpose: "List Tasks in the selected namespace.",
|
|
42
|
-
details: [
|
|
43
|
-
"With no selector, lists the current directory Task context.",
|
|
44
|
-
"task/ selects the root namespace; --world lists every namespace in the current Task world.",
|
|
45
|
-
].join("\n"),
|
|
46
|
-
},
|
|
47
|
-
ready: {
|
|
48
|
-
arity: [0, 0],
|
|
49
|
-
flags: { ...COMMON, world: "boolean", parent: "value", limit: "value" },
|
|
50
|
-
usage: "task ready [--world] [--parent <TaskId>] [--limit <n>]",
|
|
51
|
-
purpose: "List open Tasks whose every dependency is complete or dropped.",
|
|
52
|
-
details: "--world lists every namespace in the current Task world.",
|
|
53
|
-
},
|
|
54
|
-
blocked: {
|
|
55
|
-
arity: [0, 0],
|
|
56
|
-
flags: { ...COMMON, world: "boolean", parent: "value", limit: "value" },
|
|
57
|
-
usage: "task blocked [--world] [--parent <TaskId>] [--limit <n>]",
|
|
58
|
-
purpose: "List Tasks with unmet dependencies.",
|
|
59
|
-
details: "--world lists every namespace in the current Task world.",
|
|
60
|
-
},
|
|
61
|
-
query: {
|
|
62
|
-
arity: [0, 0],
|
|
63
|
-
flags: { ...COMMON, where: "value", world: "boolean", sort: "value", limit: "value" },
|
|
64
|
-
usage: `task query [--where <expression>] [--world]
|
|
65
|
-
[--sort priority|created|updated|id] [--limit <n>]`,
|
|
66
|
-
purpose: "Filter and sort Tasks with a boolean expression.",
|
|
67
|
-
details: [
|
|
68
|
-
"fields: state priority title id parent under needs blocks ready blocked created updated",
|
|
69
|
-
"operators: = != < > <= >= ~ and or not ( )",
|
|
70
|
-
"sort: priority and created ascend; updated descends; id is lexical. Default: priority.",
|
|
71
|
-
"--world lists every namespace in the current Task world.",
|
|
72
|
-
"examples:",
|
|
73
|
-
" keiyaku task query --where 'priority <= 1 and ready' --world",
|
|
74
|
-
" keiyaku task query --where 'updated < 2026-08-06T00:00:00.000Z' --world",
|
|
75
|
-
].join("\n"),
|
|
76
|
-
},
|
|
77
|
-
tree: {
|
|
78
|
-
arity: [1, 1],
|
|
79
|
-
flags: COMMON,
|
|
80
|
-
usage: "task tree <TaskId>",
|
|
81
|
-
purpose: "Show a Task and its parent/child breakdown.",
|
|
82
|
-
},
|
|
83
|
-
doctor: {
|
|
84
|
-
arity: [0, 0],
|
|
85
|
-
flags: COMMON,
|
|
86
|
-
usage: "task doctor",
|
|
87
|
-
purpose: "Check Tasks for inconsistencies without changing them.",
|
|
88
|
-
},
|
|
89
|
-
update: {
|
|
90
|
-
arity: [1, 1],
|
|
91
|
-
flags: {
|
|
92
|
-
...COMMON,
|
|
93
|
-
title: "value",
|
|
94
|
-
body: "value",
|
|
95
|
-
append: "value",
|
|
96
|
-
note: "value",
|
|
97
|
-
priority: "value",
|
|
98
|
-
needs: "repeat",
|
|
99
|
-
"drop-needs": "repeat",
|
|
100
|
-
parent: "value",
|
|
101
|
-
"no-parent": "boolean",
|
|
102
|
-
supersedes: "repeat",
|
|
103
|
-
"drop-supersedes": "repeat",
|
|
104
|
-
relates: "repeat",
|
|
105
|
-
"drop-relates": "repeat",
|
|
106
|
-
},
|
|
107
|
-
usage: `task update <TaskId> [--title <text>] [--body <text>|- | --append <text>]
|
|
108
|
-
[--note <text>]
|
|
109
|
-
[--priority 0..3] [--needs <TaskId>]... [--drop-needs <TaskId>]...
|
|
110
|
-
[--parent <TaskId> | --no-parent]
|
|
111
|
-
[--supersedes <TaskId>]... [--drop-supersedes <TaskId>]...
|
|
112
|
-
[--relates <TaskId>]... [--drop-relates <TaskId>]...`,
|
|
113
|
-
purpose: "Change a Task's fields and relationships.",
|
|
114
|
-
details: [
|
|
115
|
-
"--body replaces the body; --append adds text after it, separated by a newline when needed.",
|
|
116
|
-
"--body - reads replacement body text from stdin.",
|
|
117
|
-
].join("\n"),
|
|
118
|
-
},
|
|
119
|
-
start: {
|
|
120
|
-
arity: [1, Number.POSITIVE_INFINITY],
|
|
121
|
-
flags: COMMON,
|
|
122
|
-
usage: "task start <TaskId>...",
|
|
123
|
-
purpose: "Move one or more open Tasks into progress.",
|
|
124
|
-
},
|
|
125
|
-
stop: {
|
|
126
|
-
arity: [1, 1],
|
|
127
|
-
flags: COMMON,
|
|
128
|
-
usage: "task stop <TaskId>",
|
|
129
|
-
purpose: "Return one in-progress Task to open.",
|
|
130
|
-
},
|
|
131
|
-
hold: {
|
|
132
|
-
arity: [1, Number.POSITIVE_INFINITY],
|
|
133
|
-
flags: COMMON,
|
|
134
|
-
usage: "task hold <TaskId>...",
|
|
135
|
-
purpose: "Put one or more Tasks on hold.",
|
|
136
|
-
},
|
|
137
|
-
resume: {
|
|
138
|
-
arity: [1, 1],
|
|
139
|
-
flags: COMMON,
|
|
140
|
-
usage: "task resume <TaskId>",
|
|
141
|
-
purpose: "Return one held Task to open.",
|
|
142
|
-
},
|
|
143
|
-
done: {
|
|
144
|
-
arity: [1, Number.POSITIVE_INFINITY],
|
|
145
|
-
flags: { ...COMMON, note: "value" },
|
|
146
|
-
usage: "task done <TaskId>... [--note <text>]",
|
|
147
|
-
purpose: "Mark one or more Tasks done.",
|
|
148
|
-
},
|
|
149
|
-
drop: {
|
|
150
|
-
arity: [1, Number.POSITIVE_INFINITY],
|
|
151
|
-
flags: { ...COMMON, note: "value" },
|
|
152
|
-
usage: "task drop <TaskId>... [--note <text>]",
|
|
153
|
-
purpose: "Mark one or more Tasks as no longer needed.",
|
|
154
|
-
},
|
|
155
|
-
context: {
|
|
156
|
-
arity: [0, 1],
|
|
157
|
-
flags: COMMON,
|
|
158
|
-
usage: "task context [<namespace>]",
|
|
159
|
-
purpose: "Set or read the default Task namespace for this directory.",
|
|
160
|
-
details: "Omit <namespace> to read the current context; use / to reset it to the root namespace.",
|
|
161
|
-
},
|
|
162
|
-
compose: {
|
|
163
|
-
arity: [0, 0],
|
|
164
|
-
stdin: "compose",
|
|
165
|
-
flags: { ...COMMON, actor: "value", plan: "boolean" },
|
|
166
|
-
usage: "task compose [--actor <actor>] [--plan] -",
|
|
167
|
-
purpose: "Create or update several Tasks from one document, with an optional preview.",
|
|
168
|
-
details: [
|
|
169
|
-
"nodes: + <Title> creates; @task/<id> modifies a pre-existing Task",
|
|
170
|
-
"properties: as = <alias>; state = open|in_progress|on_hold|done|drop; pri = 0..3; parent = <ref>|empty",
|
|
171
|
-
"relations: needs|supersedes|relates with =, +=, or -=",
|
|
172
|
-
"references: @task/... is pre-existing; ^alias is new in this document",
|
|
173
|
-
"body: body = clears; body <<TOKEN reads exact content to TOKEN",
|
|
174
|
-
"TOKEN: [A-Z][A-Z0-9_]* with length 3..32",
|
|
175
|
-
"example:",
|
|
176
|
-
" ns=feature",
|
|
177
|
-
" + Parent",
|
|
178
|
-
" as = parent",
|
|
179
|
-
" pri = 1",
|
|
180
|
-
" body <<BODY",
|
|
181
|
-
" Exact body bytes.",
|
|
182
|
-
" BODY",
|
|
183
|
-
" + Child",
|
|
184
|
-
" parent = ^parent",
|
|
185
|
-
].join("\n"),
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
export function isTaskAction(value) {
|
|
189
|
-
return value !== undefined && Object.hasOwn(TASK_COMMAND_SPECS, value);
|
|
3
|
+
import { taskRowViewLimit, tasksWithExecution, } from "../../task/index.js";
|
|
4
|
+
import { taskCompositionNamespaceHeader } from "../../task/compose-language.js";
|
|
5
|
+
import { resolveTaskNamespaceContext, writeTaskNamespaceContext } from "../../task/context.js";
|
|
6
|
+
import { displayContext, writeJson, writeStderr, writeStdout } from "../streams.js";
|
|
7
|
+
import { renderTaskCompose, renderTaskContext, renderTaskDoctor, renderTaskFailure, renderTaskIncompleteDiagnostic, renderTaskLifecycle, renderTaskList, renderTaskMutation, renderTaskShow, renderTaskTree, renderTaskUpdate, taskExitCode, } from "../render/task.js";
|
|
8
|
+
import { actorFromEdge } from "../actor.js";
|
|
9
|
+
import { taskQuerySelection } from "../../task/query.js";
|
|
10
|
+
export { renderTaskHelp } from "./task-grammar.js";
|
|
11
|
+
function value(command, name) {
|
|
12
|
+
const item = command.flags[name];
|
|
13
|
+
return typeof item === "string" ? item : undefined;
|
|
190
14
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
return `${spec.purpose}\n\n${renderTaskUsage(action)}${spec.details === undefined ? "" : `\n\n${spec.details}`}`;
|
|
195
|
-
}
|
|
196
|
-
return [
|
|
197
|
-
"usage keiyaku task <command> ...",
|
|
198
|
-
"",
|
|
199
|
-
"commands:",
|
|
200
|
-
...Object.values(TASK_COMMAND_SPECS).flatMap((spec) => spec.usage
|
|
201
|
-
.split("\n")
|
|
202
|
-
.map((line) => ` ${line}`)
|
|
203
|
-
.concat(` ${spec.purpose}`)),
|
|
204
|
-
].join("\n");
|
|
15
|
+
function values(command, name) {
|
|
16
|
+
const item = command.flags[name];
|
|
17
|
+
return Array.isArray(item) ? item : undefined;
|
|
205
18
|
}
|
|
206
|
-
|
|
207
|
-
return
|
|
208
|
-
.split("\n")
|
|
209
|
-
.map((line, index) => {
|
|
210
|
-
if (index === 0 || line.trimStart().startsWith("task ")) {
|
|
211
|
-
const command = line.trimStart().startsWith("task ") ? `keiyaku ${line.trim()}` : `keiyaku ${line}`;
|
|
212
|
-
return `${index === 0 ? "usage " : " "}${command}`;
|
|
213
|
-
}
|
|
214
|
-
return ` ${line.trim()}`;
|
|
215
|
-
})
|
|
216
|
-
.join("\n");
|
|
19
|
+
function namespace(raw) {
|
|
20
|
+
return raw === undefined ? undefined : raw === "/" ? [] : raw.split("/");
|
|
217
21
|
}
|
|
218
|
-
function
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
if (index === 0 || line.trimStart().startsWith("task "))
|
|
223
|
-
return `keiyaku ${line.trim()}`;
|
|
224
|
-
return ` ${line.trim()}`;
|
|
225
|
-
})
|
|
226
|
-
.join("\n");
|
|
22
|
+
function priority(raw) {
|
|
23
|
+
if (raw === undefined)
|
|
24
|
+
return undefined;
|
|
25
|
+
return Number(raw);
|
|
227
26
|
}
|
|
228
|
-
|
|
229
|
-
return
|
|
230
|
-
scope: `keiyaku task ${action}`,
|
|
231
|
-
accepts: taskUsage(action),
|
|
232
|
-
help: `keiyaku task ${action} --help`,
|
|
233
|
-
};
|
|
27
|
+
function ids(items) {
|
|
28
|
+
return items;
|
|
234
29
|
}
|
|
235
|
-
function
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
30
|
+
function limit(command) {
|
|
31
|
+
const raw = value(command, "limit");
|
|
32
|
+
return raw === undefined ? undefined : Number(raw);
|
|
33
|
+
}
|
|
34
|
+
function validateTaskRowView(command) {
|
|
35
|
+
if (command.action === "ls" ||
|
|
36
|
+
command.action === "ready" ||
|
|
37
|
+
command.action === "blocked" ||
|
|
38
|
+
command.action === "query")
|
|
39
|
+
taskRowViewLimit(limit(command));
|
|
40
|
+
}
|
|
41
|
+
function explicitListNamespace(command) {
|
|
42
|
+
return command.action === "ls" && command.positionals.length === 1
|
|
43
|
+
? parseTaskNamespaceSelector(command.positionals[0])
|
|
44
|
+
: undefined;
|
|
45
|
+
}
|
|
46
|
+
function taskStdinDiagnostic(command) {
|
|
47
|
+
switch (command.stdin) {
|
|
48
|
+
case "document":
|
|
49
|
+
return "task add requires a nonblank stdin document";
|
|
50
|
+
case "compose":
|
|
51
|
+
return "task compose requires a nonblank stdin document";
|
|
52
|
+
case "body":
|
|
53
|
+
return "task update --body requires a nonblank value";
|
|
54
|
+
case "append":
|
|
55
|
+
return "task update --append requires a nonblank value";
|
|
56
|
+
case "note":
|
|
57
|
+
return "task update --note requires a nonblank value";
|
|
58
|
+
default:
|
|
59
|
+
return undefined;
|
|
249
60
|
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The shared output primitive: one native answer, its matching rendered text, and the native exit
|
|
64
|
+
* classifier's verdict. JSON writes the untouched native value; text writes the rendered lines.
|
|
65
|
+
*/
|
|
66
|
+
function emitTask(output, result, project, code) {
|
|
67
|
+
if (output === "json")
|
|
68
|
+
writeJson(result);
|
|
250
69
|
else
|
|
251
|
-
|
|
70
|
+
writeStdout(project());
|
|
71
|
+
return code;
|
|
72
|
+
}
|
|
73
|
+
async function invokeAdd(input) {
|
|
74
|
+
const { tasks, command, current = [] } = input;
|
|
75
|
+
const selectedNamespace = namespace(value(command, "namespace")) ?? current;
|
|
76
|
+
const actor = input.actor;
|
|
77
|
+
if (command.stdin === "document") {
|
|
78
|
+
return tasks.addDocument({
|
|
79
|
+
markdown: input.stdin,
|
|
80
|
+
...(selectedNamespace === undefined ? {} : { namespace: selectedNamespace }),
|
|
81
|
+
...(actor === undefined ? {} : { actor }),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const body = value(command, "body"), note = value(command, "note"), initialState = value(command, "state"), selectedPriority = priority(value(command, "priority"));
|
|
85
|
+
const needs = ids(values(command, "needs")), parent = value(command, "parent");
|
|
86
|
+
const supersedes = ids(values(command, "supersedes")), relates = ids(values(command, "relates"));
|
|
87
|
+
return tasks.add({
|
|
88
|
+
title: command.positionals[0],
|
|
89
|
+
...(selectedNamespace === undefined ? {} : { namespace: selectedNamespace }),
|
|
90
|
+
...(body === undefined ? {} : { body }),
|
|
91
|
+
...(note === undefined ? {} : { note }),
|
|
92
|
+
...(initialState === undefined ? {} : { state: initialState }),
|
|
93
|
+
...(selectedPriority === undefined ? {} : { priority: selectedPriority }),
|
|
94
|
+
...(needs === undefined ? {} : { needs }),
|
|
95
|
+
...(parent === undefined ? {} : { parent: parent }),
|
|
96
|
+
...(supersedes === undefined ? {} : { supersedes }),
|
|
97
|
+
...(relates === undefined ? {} : { relates }),
|
|
98
|
+
...(actor === undefined ? {} : { actor }),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function invokeUpdate(input) {
|
|
102
|
+
const { tasks, command, stdin } = input;
|
|
103
|
+
const body = command.stdin === "body" ? stdin : value(command, "body"), appendBody = command.stdin === "append" ? stdin : value(command, "append");
|
|
104
|
+
const note = command.stdin === "note" ? stdin : value(command, "note");
|
|
105
|
+
const title = value(command, "title"), selectedPriority = priority(value(command, "priority"));
|
|
106
|
+
const addNeeds = ids(values(command, "needs")), dropNeeds = ids(values(command, "drop-needs"));
|
|
107
|
+
const parent = value(command, "parent"), addSupersedes = ids(values(command, "supersedes"));
|
|
108
|
+
const dropSupersedes = ids(values(command, "drop-supersedes")), addRelates = ids(values(command, "relates"));
|
|
109
|
+
const dropRelates = ids(values(command, "drop-relates"));
|
|
110
|
+
return tasks.task({ id: command.positionals[0] }).update({
|
|
111
|
+
...(title === undefined ? {} : { title }),
|
|
112
|
+
...(body === undefined ? {} : { body }),
|
|
113
|
+
...(appendBody === undefined ? {} : { appendBody }),
|
|
114
|
+
...(note === undefined ? {} : { note }),
|
|
115
|
+
...(selectedPriority === undefined ? {} : { priority: selectedPriority }),
|
|
116
|
+
...(addNeeds === undefined ? {} : { addNeeds }),
|
|
117
|
+
...(dropNeeds === undefined ? {} : { dropNeeds }),
|
|
118
|
+
...(command.flags["no-parent"] === true
|
|
119
|
+
? { parent: null }
|
|
120
|
+
: parent === undefined
|
|
121
|
+
? {}
|
|
122
|
+
: { parent: parent }),
|
|
123
|
+
...(addSupersedes === undefined ? {} : { addSupersedes }),
|
|
124
|
+
...(dropSupersedes === undefined ? {} : { dropSupersedes }),
|
|
125
|
+
...(addRelates === undefined ? {} : { addRelates }),
|
|
126
|
+
...(dropRelates === undefined ? {} : { dropRelates }),
|
|
127
|
+
});
|
|
252
128
|
}
|
|
253
|
-
function
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
129
|
+
function readScope(command, current) {
|
|
130
|
+
return command.flags.world === true ? { scope: "world" } : { namespace: current ?? [] };
|
|
131
|
+
}
|
|
132
|
+
/** One addressed read per caller-supplied id, in caller order; the native null survives to JSON. */
|
|
133
|
+
async function runShow(command, tasks) {
|
|
134
|
+
const handles = command.positionals.map((taskId) => tasks.task({ id: taskId }).id);
|
|
135
|
+
const details = [];
|
|
136
|
+
for (const id of handles)
|
|
137
|
+
details.push(await tasks.task({ id }).read());
|
|
138
|
+
const missing = details.findIndex((detail) => detail === null);
|
|
139
|
+
const code = missing >= 0 ? 1 : 0;
|
|
140
|
+
if (command.output === "json") {
|
|
141
|
+
writeJson(handles.length === 1 ? details[0] : details);
|
|
142
|
+
return code;
|
|
143
|
+
}
|
|
144
|
+
if (missing >= 0) {
|
|
145
|
+
const refusal = { kind: "refused", refusal: { kind: "task-missing", taskId: handles[missing] } };
|
|
146
|
+
return emitTask(command.output, refusal, () => renderTaskShow(refusal, displayContext()), code);
|
|
263
147
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
148
|
+
const found = details.filter((detail) => detail !== null);
|
|
149
|
+
const result = found.length === 1 ? found[0] : found;
|
|
150
|
+
return emitTask(command.output, result, () => renderTaskShow(result, displayContext()), code);
|
|
151
|
+
}
|
|
152
|
+
/** Presentation-only list scope the leaf acquired, never part of the native answer. */
|
|
153
|
+
function listPresentation(command) {
|
|
154
|
+
if (command.flags.world === true)
|
|
155
|
+
return "world";
|
|
156
|
+
const first = command.positionals[0];
|
|
157
|
+
return command.action === "ls" && first !== undefined ? { namespace: first } : "current";
|
|
271
158
|
}
|
|
272
|
-
function
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
159
|
+
async function runRead(input) {
|
|
160
|
+
const { tasks, command, current } = input;
|
|
161
|
+
const id = command.positionals[0];
|
|
162
|
+
const scope = listPresentation(command);
|
|
163
|
+
switch (command.action) {
|
|
164
|
+
case "ls": {
|
|
165
|
+
const result = await tasks.list({
|
|
166
|
+
selection: command.flags.all === true ? "all" : command.flags.closed === true ? "closed" : "active",
|
|
167
|
+
...(explicitListNamespace(command) === undefined
|
|
168
|
+
? readScope(command, current)
|
|
169
|
+
: { namespace: explicitListNamespace(command) }),
|
|
170
|
+
...(limit(command) === undefined ? {} : { limit: limit(command) }),
|
|
171
|
+
});
|
|
172
|
+
return emitTask(command.output, result, () => renderTaskList("ls", scope, result, displayContext()), taskExitCode(result));
|
|
173
|
+
}
|
|
174
|
+
case "ready": {
|
|
175
|
+
const result = await tasks.ready({
|
|
176
|
+
...readScope(command, current),
|
|
177
|
+
...(value(command, "parent") === undefined ? {} : { parent: value(command, "parent") }),
|
|
178
|
+
...(limit(command) === undefined ? {} : { limit: limit(command) }),
|
|
179
|
+
});
|
|
180
|
+
return emitTask(command.output, result, () => renderTaskList("ready", scope, result, displayContext()), taskExitCode(result));
|
|
181
|
+
}
|
|
182
|
+
case "blocked": {
|
|
183
|
+
const result = await tasks.blocked({
|
|
184
|
+
...readScope(command, current),
|
|
185
|
+
...(value(command, "parent") === undefined ? {} : { parent: value(command, "parent") }),
|
|
186
|
+
...(limit(command) === undefined ? {} : { limit: limit(command) }),
|
|
187
|
+
});
|
|
188
|
+
return emitTask(command.output, result, () => renderTaskList("blocked", scope, result, displayContext()), taskExitCode(result));
|
|
284
189
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
190
|
+
case "query": {
|
|
191
|
+
const result = await tasks.query({
|
|
192
|
+
where: taskQuerySelection(command.flags.all === true ? "all" : command.flags.closed === true ? "closed" : "active", command.where),
|
|
193
|
+
...readScope(command, current),
|
|
194
|
+
...(value(command, "sort") === undefined ? {} : { sort: value(command, "sort") }),
|
|
195
|
+
...(limit(command) === undefined ? {} : { limit: limit(command) }),
|
|
196
|
+
});
|
|
197
|
+
return emitTask(command.output, result, () => renderTaskList("query", scope, result, displayContext()), taskExitCode(result));
|
|
290
198
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
199
|
+
case "tree": {
|
|
200
|
+
const result = await tasks.task({ id }).tree();
|
|
201
|
+
return emitTask(command.output, result, () => renderTaskTree(result, displayContext()), taskExitCode(result));
|
|
202
|
+
}
|
|
203
|
+
case "doctor": {
|
|
204
|
+
const result = await tasks.doctor();
|
|
205
|
+
return emitTask(command.output, result, () => renderTaskDoctor(result), taskExitCode(result));
|
|
206
|
+
}
|
|
207
|
+
default:
|
|
208
|
+
throw new Error(`task action is not a read: ${command.action}`);
|
|
294
209
|
}
|
|
295
|
-
return { positionals, flags, ...(stdin === undefined ? {} : { stdin }) };
|
|
296
210
|
}
|
|
297
|
-
function
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if (Object.keys(flags).every((name) => name === "json"))
|
|
304
|
-
fail("task update requires at least one patch option");
|
|
211
|
+
function isWorldObservationAction(command) {
|
|
212
|
+
return (command.action === "ls" ||
|
|
213
|
+
command.action === "ready" ||
|
|
214
|
+
command.action === "blocked" ||
|
|
215
|
+
command.action === "query" ||
|
|
216
|
+
command.action === "doctor");
|
|
305
217
|
}
|
|
306
|
-
function
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
218
|
+
function missingTask(id) {
|
|
219
|
+
return { kind: "refused", refusal: { kind: "task-missing", taskId: id } };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* The one CLI edge mapping a Task action with no World to its native refusal answer, then through
|
|
223
|
+
* the matching action renderer and the native exit classifier.
|
|
224
|
+
*/
|
|
225
|
+
function missingWorld(command) {
|
|
226
|
+
const output = command.output;
|
|
227
|
+
if (command.action === "show") {
|
|
228
|
+
// An addressed missing read keeps its native null in JSON; text refuses without partial output.
|
|
229
|
+
if (output === "json") {
|
|
230
|
+
writeJson(command.positionals.length === 1 ? null : command.positionals.map(() => null));
|
|
231
|
+
return 1;
|
|
318
232
|
}
|
|
233
|
+
const refusal = missingTask(command.positionals[0]);
|
|
234
|
+
return emitTask(output, refusal, () => renderTaskShow(refusal, displayContext()), 1);
|
|
319
235
|
}
|
|
320
|
-
if (
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
236
|
+
if (isWorldObservationAction(command) || (command.action === "compose" && command.flags.plan === true)) {
|
|
237
|
+
if (output === "json")
|
|
238
|
+
writeJson({ kind: "absent" });
|
|
239
|
+
else
|
|
240
|
+
writeStdout("task world absent");
|
|
241
|
+
return 1;
|
|
326
242
|
}
|
|
327
|
-
if (
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
243
|
+
if (command.action === "context") {
|
|
244
|
+
const result = { kind: "accepted", value: { namespace: [], source: "default-root" } };
|
|
245
|
+
return emitTask(output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
|
|
246
|
+
}
|
|
247
|
+
if (command.action === "tree") {
|
|
248
|
+
const result = missingTask(command.positionals[0]);
|
|
249
|
+
return emitTask(output, result, () => renderTaskTree(result, displayContext()), taskExitCode(result));
|
|
250
|
+
}
|
|
251
|
+
if (command.action === "update") {
|
|
252
|
+
const result = missingTask(command.positionals[0]);
|
|
253
|
+
return emitTask(output, result, () => renderTaskUpdate(result, displayContext()), taskExitCode(result));
|
|
254
|
+
}
|
|
255
|
+
if (command.action === "start" ||
|
|
256
|
+
command.action === "stop" ||
|
|
257
|
+
command.action === "hold" ||
|
|
258
|
+
command.action === "resume") {
|
|
259
|
+
if (command.positionals.length === 1) {
|
|
260
|
+
const result = missingTask(command.positionals[0]);
|
|
261
|
+
return emitTask(output, result, () => renderTaskMutation(command.action, result, displayContext()), taskExitCode(result));
|
|
333
262
|
}
|
|
263
|
+
const result = {
|
|
264
|
+
items: command.positionals.map((id) => ({ id: id, outcome: missingTask(id) })),
|
|
265
|
+
};
|
|
266
|
+
return emitTask(output, result, () => renderTaskLifecycle(command.action, result, displayContext()), taskExitCode(result));
|
|
267
|
+
}
|
|
268
|
+
if (command.action === "done" || command.action === "drop") {
|
|
269
|
+
const result = {
|
|
270
|
+
items: command.positionals.map((id) => ({ id: id, outcome: missingTask(id) })),
|
|
271
|
+
};
|
|
272
|
+
return emitTask(output, result, () => renderTaskLifecycle(command.action, result, displayContext()), taskExitCode(result));
|
|
334
273
|
}
|
|
274
|
+
throw new Error(`task action has no missing-world answer: ${command.action}`);
|
|
335
275
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
276
|
+
/**
|
|
277
|
+
* One compose execution outcome: JSON keeps the untouched native value, while an incomplete text
|
|
278
|
+
* answer recovers its draft and puts the diagnostic on stderr.
|
|
279
|
+
*/
|
|
280
|
+
function emitCompose(output, result) {
|
|
281
|
+
if (output === "json") {
|
|
282
|
+
writeJson(result);
|
|
283
|
+
return taskExitCode(result);
|
|
284
|
+
}
|
|
285
|
+
if (result.kind === "incomplete") {
|
|
286
|
+
const diagnostic = renderTaskIncompleteDiagnostic(result);
|
|
287
|
+
if (diagnostic.length > 0)
|
|
288
|
+
writeStderr(diagnostic);
|
|
289
|
+
process.stdout.write(result.draft);
|
|
290
|
+
return taskExitCode(result);
|
|
291
|
+
}
|
|
292
|
+
writeStdout(renderTaskCompose(result, displayContext()));
|
|
293
|
+
return taskExitCode(result);
|
|
294
|
+
}
|
|
295
|
+
/** One plural Task lifecycle answer: every verb shares the same batch shape and renderer. */
|
|
296
|
+
async function runBatchLifecycle(tasks, command, verb) {
|
|
297
|
+
const note = value(command, "note");
|
|
298
|
+
const result = await tasks.batch({
|
|
299
|
+
verb,
|
|
300
|
+
ids: command.positionals,
|
|
301
|
+
...(note === undefined ? {} : { note }),
|
|
302
|
+
});
|
|
303
|
+
return emitTask(command.output, result, () => renderTaskLifecycle(verb, result, displayContext()), taskExitCode(result));
|
|
304
|
+
}
|
|
305
|
+
async function runMutation(input) {
|
|
306
|
+
const { tasks, command, current, stdin, composeMarkdown, composeNamespace } = input;
|
|
307
|
+
if (isWorldObservationAction(command) || command.action === "tree")
|
|
308
|
+
return await runRead(input);
|
|
309
|
+
switch (command.action) {
|
|
310
|
+
case "add": {
|
|
311
|
+
const result = await invokeAdd(input);
|
|
312
|
+
return emitTask(command.output, result, () => renderTaskMutation("add", result, displayContext()), taskExitCode(result));
|
|
313
|
+
}
|
|
314
|
+
case "update": {
|
|
315
|
+
const result = await invokeUpdate(input);
|
|
316
|
+
return emitTask(command.output, result, () => renderTaskUpdate(result, displayContext()), taskExitCode(result));
|
|
317
|
+
}
|
|
318
|
+
case "start":
|
|
319
|
+
case "stop":
|
|
320
|
+
case "resume": {
|
|
321
|
+
const result = await invokeLifecycle(tasks, command.positionals, command.positionals[0], command.action);
|
|
322
|
+
return emitTask(command.output, result, () => renderTaskLifecycle(command.action, result, displayContext()), taskExitCode(result));
|
|
323
|
+
}
|
|
324
|
+
case "hold":
|
|
325
|
+
case "done":
|
|
326
|
+
case "drop":
|
|
327
|
+
return await runBatchLifecycle(tasks, command, command.action);
|
|
328
|
+
case "context": {
|
|
329
|
+
const selected = namespace(command.positionals[0]);
|
|
330
|
+
if (selected !== undefined) {
|
|
331
|
+
await writeTaskNamespaceContext(input.context.writeRoot ?? input.context.directory, selected);
|
|
332
|
+
const resolved = await resolveTaskNamespaceContext(input.context);
|
|
333
|
+
if (typeof resolved === "object" && "kind" in resolved) {
|
|
334
|
+
const result = { kind: "refused", refusal: resolved };
|
|
335
|
+
return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
|
|
336
|
+
}
|
|
337
|
+
const result = { kind: "accepted", value: resolved };
|
|
338
|
+
return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
|
|
358
339
|
}
|
|
340
|
+
const result = {
|
|
341
|
+
kind: "accepted",
|
|
342
|
+
value: { namespace: current ?? [], source: "default-root" },
|
|
343
|
+
};
|
|
344
|
+
return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
|
|
359
345
|
}
|
|
360
|
-
|
|
361
|
-
|
|
346
|
+
case "compose": {
|
|
347
|
+
const result = await tasks.compose({
|
|
348
|
+
markdown: composeMarkdown ?? stdin ?? "",
|
|
349
|
+
namespace: composeNamespace ?? current ?? [],
|
|
350
|
+
...(input.actor === undefined ? {} : { actor: input.actor }),
|
|
351
|
+
...(command.flags.plan === true ? { plan: true } : {}),
|
|
352
|
+
});
|
|
353
|
+
return emitCompose(command.output, result);
|
|
354
|
+
}
|
|
355
|
+
default:
|
|
356
|
+
throw new Error(`task action has no invocation: ${command.action}`);
|
|
362
357
|
}
|
|
363
|
-
validateTaskReadFlags(action, flags, fail);
|
|
364
|
-
if (action === "update")
|
|
365
|
-
validateUpdate(scanned, fail);
|
|
366
358
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
359
|
+
function invokeLifecycle(tasks, taskIds, firstId, verb) {
|
|
360
|
+
return taskIds.length === 1 ? tasks.task({ id: firstId })[verb]() : tasks.batch({ verb, ids: taskIds });
|
|
361
|
+
}
|
|
362
|
+
function establishesWorld(command) {
|
|
363
|
+
return (command.action === "add" ||
|
|
364
|
+
(command.action === "compose" && command.flags.plan !== true) ||
|
|
365
|
+
(command.action === "context" && command.positionals.length > 0));
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* One CLI edge turning a namespace-context refusal into the addressed action's native refusal
|
|
369
|
+
* answer, rendered through the matching action renderer and classified natively.
|
|
370
|
+
*/
|
|
371
|
+
function refuseNamespace(command, refusal) {
|
|
372
|
+
const result = { kind: "refused", refusal };
|
|
373
|
+
switch (command.action) {
|
|
374
|
+
case "ls":
|
|
375
|
+
case "ready":
|
|
376
|
+
case "blocked":
|
|
377
|
+
case "query": {
|
|
378
|
+
const action = command.action;
|
|
379
|
+
return emitTask(command.output, result, () => renderTaskList(action, listPresentation(command), result, displayContext()), taskExitCode(result));
|
|
382
380
|
}
|
|
383
|
-
|
|
384
|
-
|
|
381
|
+
case "add":
|
|
382
|
+
return emitTask(command.output, result, () => renderTaskMutation("add", result, displayContext()), taskExitCode(result));
|
|
383
|
+
case "context":
|
|
384
|
+
return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
|
|
385
|
+
case "compose":
|
|
386
|
+
return emitTask(command.output, result, () => renderTaskFailure("compose", result, displayContext()), taskExitCode(result));
|
|
387
|
+
default:
|
|
388
|
+
throw new Error(`task action has no namespace refusal: ${command.action}`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// eslint-disable-next-line complexity -- this is the single CLI edge ordering world, context, forwarding, and local execution.
|
|
392
|
+
export async function runTaskCommand(command, coordinates, runtime) {
|
|
393
|
+
validateTaskRowView(command);
|
|
394
|
+
const stdinDiagnostic = taskStdinDiagnostic(command);
|
|
395
|
+
const stdin = stdinDiagnostic === undefined ? undefined : await runtime.readStdin();
|
|
396
|
+
if (stdinDiagnostic !== undefined && isBlankInput(stdin ?? ""))
|
|
397
|
+
throw new CliUsageError(stdinDiagnostic);
|
|
398
|
+
const planOnly = command.action === "compose" && command.flags.plan === true;
|
|
399
|
+
const composeMarkdown = command.action === "compose" ? stdin : undefined;
|
|
400
|
+
const composition = composeMarkdown === undefined ? undefined : taskCompositionNamespaceHeader(composeMarkdown);
|
|
401
|
+
const explicitNamespace = command.action === "add"
|
|
402
|
+
? namespace(value(command, "namespace"))
|
|
403
|
+
: command.action === "compose" && composition?.specified
|
|
404
|
+
? composition.namespace
|
|
405
|
+
: undefined;
|
|
406
|
+
const actor = actorFromEdge(typeof command.flags.actor === "string" ? command.flags.actor : undefined, runtime.environment);
|
|
407
|
+
const world = coordinates.world ??
|
|
408
|
+
(planOnly ? coordinates.candidateWorld : establishesWorld(command) ? await coordinates.establishWorld() : null);
|
|
409
|
+
if (world === null)
|
|
410
|
+
return missingWorld(command);
|
|
411
|
+
const tasks = tasksWithExecution(world, runtime.execution);
|
|
412
|
+
const contextSensitive = command.action === "context" ||
|
|
413
|
+
(command.action === "add" && explicitNamespace === undefined) ||
|
|
414
|
+
(command.action === "compose" && composition?.specified !== true) ||
|
|
415
|
+
(((command.action === "ls" && explicitListNamespace(command) === undefined) ||
|
|
416
|
+
command.action === "ready" ||
|
|
417
|
+
command.action === "blocked" ||
|
|
418
|
+
command.action === "query") &&
|
|
419
|
+
command.flags.world !== true);
|
|
420
|
+
let current;
|
|
421
|
+
if (contextSensitive) {
|
|
422
|
+
const resolved = await resolveTaskNamespaceContext(coordinates.taskContext);
|
|
423
|
+
if (typeof resolved === "object" && "kind" in resolved)
|
|
424
|
+
return refuseNamespace(command, resolved);
|
|
425
|
+
current = resolved.namespace;
|
|
426
|
+
if (command.action === "context" && command.positionals.length === 0) {
|
|
427
|
+
const result = { kind: "accepted", value: resolved };
|
|
428
|
+
return emitTask(command.output, result, () => renderTaskContext(result, displayContext()), taskExitCode(result));
|
|
385
429
|
}
|
|
386
430
|
}
|
|
387
|
-
|
|
388
|
-
command
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
431
|
+
if (command.action === "show")
|
|
432
|
+
return await runShow(command, tasks);
|
|
433
|
+
return await runMutation({
|
|
434
|
+
tasks,
|
|
435
|
+
command,
|
|
436
|
+
runtime,
|
|
437
|
+
context: coordinates.taskContext,
|
|
438
|
+
...(actor === undefined ? {} : { actor }),
|
|
439
|
+
...(current === undefined ? {} : { current }),
|
|
440
|
+
...(stdin === undefined ? {} : { stdin }),
|
|
441
|
+
...(composeMarkdown === undefined ? {} : { composeMarkdown }),
|
|
442
|
+
...(explicitNamespace === undefined ? {} : { composeNamespace: explicitNamespace }),
|
|
443
|
+
});
|
|
394
444
|
}
|