@astrosheep/keiyaku 2.9.11 → 2.9.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -85
- package/build/.tsbuildinfo +1 -1
- package/build/agents/call-terms.js +1 -0
- package/build/agents/providers/claude-agent-sdk/adapter.js +17 -4
- package/build/cli/commands/akuma/akuma/handler.js +2 -1
- package/build/cli/commands/akuma/akuma/meta.js +4 -3
- package/build/cli/commands/akuma/catalog.js +2 -0
- package/build/cli/commands/akuma/list/handler.js +1 -1
- package/build/cli/commands/akuma/list/meta-list.js +12 -0
- package/build/cli/commands/akuma/list/meta-ls.js +2 -2
- package/build/cli/commands/akuma.js +5 -0
- package/build/cli/commands/contract/amend/meta.js +4 -3
- package/build/cli/commands/contract/arc/meta.js +2 -0
- package/build/cli/commands/contract/audit/handler.js +28 -2
- package/build/cli/commands/contract/audit/meta.js +4 -3
- package/build/cli/commands/contract/bind/meta.js +4 -4
- package/build/cli/commands/contract/petition/handler.js +2 -1
- package/build/cli/commands/contract/petition/meta.js +2 -2
- package/build/cli/commands/contract/renew/handler.js +44 -3
- package/build/cli/commands/contract/renew/meta.js +5 -4
- package/build/cli/commands/metadata.js +14 -10
- package/build/cli/commands/projection/call/handler.js +1 -1
- package/build/cli/commands/projection/call/meta.js +1 -1
- package/build/cli/commands/projection/catalog.js +2 -2
- package/build/cli/commands/projection/{revive → fork}/handler.js +10 -5
- package/build/cli/commands/projection/fork/meta.js +12 -0
- package/build/cli/commands/projection/history/handler.js +46 -2
- package/build/cli/commands/projection/history/meta.js +3 -3
- package/build/cli/commands/projection/kill/handler.js +4 -5
- package/build/cli/commands/projection/kill/meta.js +2 -2
- package/build/cli/commands/projection/status/handler.js +29 -13
- package/build/cli/commands/projection/status/meta.js +14 -3
- package/build/cli/commands/projection/tell/handler.js +8 -4
- package/build/cli/commands/projection/tell/meta.js +1 -1
- package/build/cli/commands/projection/wait/handler.js +45 -20
- package/build/cli/commands/projection/wait/meta.js +1 -1
- package/build/cli/commands/shared.js +2 -2
- package/build/cli/commands/system/catalog.js +2 -0
- package/build/cli/commands/task/add/handler.js +28 -12
- package/build/cli/commands/task/add/meta.js +18 -6
- package/build/cli/commands/task/catalog.js +4 -0
- package/build/cli/commands/task/compose/handler.js +18 -0
- package/build/cli/commands/task/compose/meta.js +10 -0
- package/build/cli/commands/task/doctor/handler.js +2 -3
- package/build/cli/commands/task/doctor/meta.js +2 -2
- package/build/cli/commands/task/done/meta.js +2 -2
- package/build/cli/commands/task/drop/handler.js +7 -2
- package/build/cli/commands/task/drop/meta.js +6 -3
- package/build/cli/commands/task/hold/meta.js +2 -2
- package/build/cli/commands/task/log/meta.js +2 -2
- package/build/cli/commands/task/ls/meta.js +2 -2
- package/build/cli/commands/task/note/handler.js +6 -0
- package/build/cli/commands/task/note/meta.js +11 -0
- package/build/cli/commands/task/resume/meta.js +2 -2
- package/build/cli/commands/task/shared.js +29 -15
- package/build/cli/commands/task/show/meta.js +2 -2
- package/build/cli/commands/task/start/meta.js +2 -2
- package/build/cli/commands/task/stop/meta.js +2 -2
- package/build/cli/commands/task/update/meta.js +3 -2
- package/build/cli/commands/verification/handler.js +43 -0
- package/build/cli/commands/verification/meta.js +13 -0
- package/build/cli/completion.js +16 -13
- package/build/cli/flags.js +48 -12
- package/build/cli/help.js +29 -30
- package/build/cli/index.js +14 -8
- package/build/cli/parse-flags.js +60 -21
- package/build/cli/parse-metadata.js +10 -4
- package/build/cli/parse-selectors.js +22 -4
- package/build/cli/parse.js +43 -30
- package/build/cli/projection-address.js +7 -7
- package/build/cli/render/arc.js +12 -3
- package/build/cli/render/audit.js +2 -2
- package/build/cli/render/call.js +4 -4
- package/build/cli/render/kanshi.js +122 -85
- package/build/cli/render/misc.js +2 -2
- package/build/cli/render/petition.js +16 -1
- package/build/cli/render/projection-history.js +17 -4
- package/build/cli/render/shared.js +5 -5
- package/build/cli/render/status-indicator.js +47 -0
- package/build/cli/render/status.js +106 -76
- package/build/cli/render/success-response.js +20 -5
- package/build/cli/render/task.js +33 -5
- package/build/cli/render/tell.js +10 -4
- package/build/cli/render/tool-command-normalization.js +137 -0
- package/build/cli/render/tool-presentation.js +2 -1
- package/build/cli/render/verification.js +23 -0
- package/build/cli/render/wait.js +101 -33
- package/build/cli/types.js +2 -1
- package/build/config/akuma-loader.js +21 -1
- package/build/config/settings/knobs.js +7 -1
- package/build/config/settings/schema.js +10 -5
- package/build/core/addressing.js +3 -3
- package/build/core/amend.js +102 -17
- package/build/core/arc.js +4 -4
- package/build/core/audit/candidate.js +10 -18
- package/build/core/audit/coordinates.js +12 -17
- package/build/core/audit/evidence.js +6 -4
- package/build/core/audit/facade.js +3 -3
- package/build/core/audit/report.js +1 -1
- package/build/core/bind-reconciliation.js +42 -23
- package/build/core/bind.js +182 -81
- package/build/core/call/call.js +6 -7
- package/build/core/call/context.js +46 -33
- package/build/core/call/execution.js +21 -6
- package/build/core/call/prompt.js +11 -42
- package/build/core/contract-carrier-runtime.js +209 -105
- package/build/core/contract-carrier.js +156 -73
- package/build/core/contract-view.js +43 -6
- package/build/core/contract.js +2 -1
- package/build/core/derived-replay.js +168 -35
- package/build/core/draft.js +60 -27
- package/build/core/forfeit.js +1 -1
- package/build/core/lifecycle-history.js +13 -0
- package/build/core/lifecycle-recovery.js +32 -27
- package/build/core/lifecycle-runner.js +14 -14
- package/build/core/log.js +1 -1
- package/build/core/outcome-base.js +2 -2
- package/build/core/projection/akuma-name.js +43 -0
- package/build/core/projection/generation/database.js +141 -79
- package/build/core/projection/generation/ledger.js +91 -0
- package/build/core/projection/generation/model.js +19 -14
- package/build/core/projection/generation/projection-generation-continuation.js +1 -1
- package/build/core/projection/generation/projection-generation-doorbell.js +88 -0
- package/build/core/projection/generation/projection-generation-execution.js +24 -0
- package/build/core/projection/generation/projection-generation-identity.js +4 -0
- package/build/core/projection/generation/projection-generation-launcher.js +72 -138
- package/build/core/projection/generation/projection-generation-process.js +16 -15
- package/build/core/projection/generation/projection-generation-runner.js +132 -76
- package/build/core/projection/generation/projection-generation-runtime.js +10 -61
- package/build/core/projection/generation/protocol.js +68 -0
- package/build/core/projection/generation/store.js +17 -7
- package/build/core/projection/generation/transitions.js +24 -14
- package/build/core/projection/index.js +5 -5
- package/build/core/projection/projection-core.js +6 -2
- package/build/core/projection/projection-execution-observer.js +1 -1
- package/build/core/projection/projection-history.js +8 -8
- package/build/core/projection/projection-kill.js +20 -10
- package/build/core/projection/projection-life-observer.js +8 -8
- package/build/core/projection/projection-mint.js +6 -8
- package/build/core/projection/projection-status-observation.js +77 -8
- package/build/core/projection/projection-status.js +151 -4
- package/build/core/projection/projection-wait.js +48 -29
- package/build/core/projection/projection-wake.js +28 -88
- package/build/core/projection/tell/launch-store.js +1 -1
- package/build/core/projection/tell/store.js +1 -1
- package/build/core/renew-build.js +204 -74
- package/build/core/renew-plan.js +34 -9
- package/build/core/renew-rewrite.js +56 -15
- package/build/core/renew.js +39 -35
- package/build/core/repository-ledger/accepted-fold-read.js +6 -3
- package/build/core/repository-ledger/claim-evidence.js +1 -1
- package/build/core/repository-ledger/codec.js +11 -5
- package/build/core/repository-ledger/current-state-store.js +464 -349
- package/build/core/repository-ledger/fold-repository.js +5 -6
- package/build/core/repository-ledger/identity.js +60 -0
- package/build/core/repository-ledger/inventory.js +3 -3
- package/build/core/repository-ledger/read-model.js +57 -9
- package/build/core/repository-ledger/write-transaction.js +24 -17
- package/build/core/run-control/connection-bound-close.js +41 -0
- package/build/core/run-control/detached-lease-bootstrap.js +208 -0
- package/build/core/run-control/detached-process.js +14 -0
- package/build/core/run-control/index.js +6 -0
- package/build/core/{process-group.js → run-control/process-tree.js} +1 -1
- package/build/core/run-control/runner-lease.js +172 -0
- package/build/core/run-control/sqlite-process-lifetime-lock.js +174 -0
- package/build/core/seal.js +44 -32
- package/build/core/settlement/claim-delivery.js +22 -9
- package/build/core/settlement/claim.js +8 -6
- package/build/core/settlement/petition-claim-gates.js +9 -8
- package/build/core/settlement/petition-head-guard.js +5 -6
- package/build/core/settlement/petition-preview.js +21 -5
- package/build/core/settlement/petition.js +51 -17
- package/build/core/settlement/settlement.js +20 -15
- package/build/core/settlement/verdict.js +2 -2
- package/build/core/settlement/verification.js +492 -364
- package/build/core/status/board.js +184 -75
- package/build/core/status/drift.js +8 -10
- package/build/core/task/board.js +1 -0
- package/build/core/task/commands.js +25 -0
- package/build/core/task/compose.js +328 -0
- package/build/core/task/document.js +102 -39
- package/build/core/task/index.js +4 -3
- package/build/core/task/settlement-git.js +70 -30
- package/build/core/task/settlement-policy.js +27 -14
- package/build/core/task/source-board.js +1 -0
- package/build/core/task/task-bind-preparation.js +59 -9
- package/build/core/task/task-contract.js +2 -2
- package/build/core/task/task-git-store.js +1 -0
- package/build/core/task/task-store-repository.js +2 -0
- package/build/core/task/task.js +2 -2
- package/build/core/transcripts.js +4 -4
- package/build/core/verification-declaration.js +95 -0
- package/build/core/worktree-bootstrap.js +1 -1
- package/build/core/worktree-path.js +7 -11
- package/build/flow-error.js +15 -2
- package/build/generated/version.js +2 -2
- package/build/git/branches.js +41 -70
- package/build/git/commits.js +92 -21
- package/build/git/core.js +9 -161
- package/build/git/diff/preview.js +4 -4
- package/build/git/diff/read.js +4 -4
- package/build/git/diff/structured.js +5 -5
- package/build/git/process.js +229 -0
- package/build/git/refs.js +30 -5
- package/build/git/staging.js +39 -115
- package/build/git/streaming-batch.js +9 -16
- package/build/git/worktree.js +104 -91
- package/build/index.js +7 -0
- package/package.json +2 -2
- package/skills/keiyaku-akuma/SKILL.md +27 -21
- package/skills/keiyaku-task/SKILL.md +61 -5
- package/skills/keiyaku-workflow/SKILL.md +81 -26
- package/build/cli/commands/projection/revive/meta.js +0 -12
- package/build/core/projection/projection-life-protocol.js +0 -115
- package/build/core/projection/projection-runner-lock.js +0 -382
- package/build/core/projection/tell/database.js +0 -127
- package/build/core/settlement/verification-coordination.js +0 -305
- package/build/core/settlement/verification-supervisor.js +0 -275
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { appendTaskNote, resolveTaskCreator } from "../../../../core/task/index.js";
|
|
2
|
+
import { runTaskMutationCommand } from "../shared.js";
|
|
3
|
+
export const handler = async (stdin, flags, _signal, positional) => runTaskMutationCommand(flags, async (repository, cwd) => appendTaskNote(repository, positional[0], {
|
|
4
|
+
actor: await resolveTaskCreator(cwd),
|
|
5
|
+
text: stdin,
|
|
6
|
+
}));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const meta = {
|
|
2
|
+
command: "task note",
|
|
3
|
+
summary: "Append an immutable task note",
|
|
4
|
+
usage: ["keiyaku task note [-C|--cwd DIR] [--contract ADDR] COORDINATE TEXT|-"],
|
|
5
|
+
stdin: {
|
|
6
|
+
mode: "argument",
|
|
7
|
+
selector: { kind: "positional", index: 1, required: true, rejectBlank: true },
|
|
8
|
+
},
|
|
9
|
+
flags: ["cwd", "contract"],
|
|
10
|
+
purpose: "Record an append-only task journal fact.",
|
|
11
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const meta = {
|
|
2
2
|
command: "task resume",
|
|
3
3
|
summary: "Resume a task on hold",
|
|
4
|
-
usage: ["keiyaku task resume [-C|--cwd DIR] COORDINATE"],
|
|
4
|
+
usage: ["keiyaku task resume [-C|--cwd DIR] [--contract ADDR] COORDINATE"],
|
|
5
5
|
stdin: { mode: "argument" },
|
|
6
|
-
flags: ["cwd"],
|
|
6
|
+
flags: ["cwd", "contract"],
|
|
7
7
|
purpose: "Return an on-hold task to open.",
|
|
8
8
|
};
|
|
@@ -1,30 +1,44 @@
|
|
|
1
1
|
import { FlowError } from "../../../flow-error.js";
|
|
2
|
+
import { attachAddressCarrier, resolveExplicitContractAddressFromRead } from "../../../core/addressing.js";
|
|
3
|
+
import { readRepositoryLifecycle } from "../../../core/repository-ledger/read-model.js";
|
|
4
|
+
import { findRegisteredContractWorktreePathFromModel, stableRepoRoot } from "../../../core/worktree-path.js";
|
|
2
5
|
import { openTaskCommandRepository, parseTaskDocument, readTaskDoctor, taskCoordinateFromSourcePath, } from "../../../core/task/index.js";
|
|
3
6
|
import { deriveTaskDisplay, renderTaskList, renderTaskMutationRow, } from "../../render/task.js";
|
|
4
7
|
import { textResponse } from "../../render/shared.js";
|
|
5
8
|
import { effectiveDirectory } from "../shared.js";
|
|
6
|
-
/**
|
|
7
|
-
export async function
|
|
9
|
+
/** Resolve --contract to its one ledger-owned checkout before task access. */
|
|
10
|
+
export async function taskCommandDirectory(flags) {
|
|
8
11
|
const cwd = effectiveDirectory(flags);
|
|
12
|
+
if (flags.contractId === undefined)
|
|
13
|
+
return cwd;
|
|
14
|
+
const stableRoot = await stableRepoRoot(cwd);
|
|
15
|
+
const admitted = resolveExplicitContractAddressFromRead({
|
|
16
|
+
read: await readRepositoryLifecycle(stableRoot),
|
|
17
|
+
stableRoot,
|
|
18
|
+
workdir: cwd,
|
|
19
|
+
raw: flags.contractId,
|
|
20
|
+
source: flags.contractAddressSource ?? "explicit-flag",
|
|
21
|
+
});
|
|
22
|
+
const worktree = admitted.model.resources.worktree;
|
|
23
|
+
const lifecycle = admitted.model.phase;
|
|
24
|
+
if (!worktree || worktree.state !== "held") {
|
|
25
|
+
throw attachAddressCarrier(new FlowError("CONTRACT_WORKSPACE_UNAVAILABLE", `contract ${admitted.model.contract} has no materialized workspace for task commands (${lifecycle})`, { facts: { kind: "task_contract_workspace", contractId: admitted.model.contract, lifecycle, reason: "not-materialized" } }), admitted.address);
|
|
26
|
+
}
|
|
27
|
+
const registered = await findRegisteredContractWorktreePathFromModel(stableRoot, admitted.model);
|
|
28
|
+
if (!registered) {
|
|
29
|
+
throw attachAddressCarrier(new FlowError("CONTRACT_WORKSPACE_UNAVAILABLE", `contract ${admitted.model.contract} worktree is not a verified ledger-owned materialized checkout`, { facts: { kind: "task_contract_workspace", contractId: admitted.model.contract, lifecycle, reason: "unregistered" } }), admitted.address);
|
|
30
|
+
}
|
|
31
|
+
return registered;
|
|
32
|
+
}
|
|
33
|
+
/** Open the selected task command repository and run the verb. */
|
|
34
|
+
export async function withTaskCommandRepository(flags, run) {
|
|
35
|
+
const cwd = await taskCommandDirectory(flags);
|
|
9
36
|
return run(await openTaskCommandRepository(cwd), cwd);
|
|
10
37
|
}
|
|
11
38
|
/** Shared shell: open repository → mutate → renderTaskMutationRow receipt. */
|
|
12
39
|
export async function runTaskMutationCommand(flags, mutate) {
|
|
13
40
|
return textResponse(renderTaskMutationRow(await withTaskCommandRepository(flags, mutate)));
|
|
14
41
|
}
|
|
15
|
-
export function parseTaskAddInput(input) {
|
|
16
|
-
if (!input.trim())
|
|
17
|
-
throw new FlowError("EMPTY_PARAM", "task add input cannot be blank");
|
|
18
|
-
const lines = input.split(/\r?\n/);
|
|
19
|
-
const firstLine = lines[0]?.startsWith("# ") ? lines[0].slice(2) : lines[0];
|
|
20
|
-
const title = firstLine?.trim() ?? "";
|
|
21
|
-
if (!title)
|
|
22
|
-
throw new FlowError("EMPTY_PARAM", "task title cannot be blank");
|
|
23
|
-
if (lines.length > 1 && lines[1].trim() !== "") {
|
|
24
|
-
throw new FlowError("EMPTY_PARAM", "task add body must follow the title after a blank line");
|
|
25
|
-
}
|
|
26
|
-
return { title, body: lines.slice(2).join("\n") };
|
|
27
|
-
}
|
|
28
42
|
export function taskSelection(flags) {
|
|
29
43
|
return flags.all ? "all" : flags.done ? "done" : "default";
|
|
30
44
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const meta = {
|
|
2
2
|
command: "task show",
|
|
3
3
|
summary: "Show one task and its children tree",
|
|
4
|
-
usage: ["keiyaku task show [-C|--cwd DIR] COORDINATE [--json]"],
|
|
4
|
+
usage: ["keiyaku task show [-C|--cwd DIR] [--contract ADDR] COORDINATE [--json]"],
|
|
5
5
|
stdin: { mode: "argument" },
|
|
6
|
-
flags: ["cwd", "json"],
|
|
6
|
+
flags: ["cwd", "contract", "json"],
|
|
7
7
|
purpose: "Read one task and every descendant linked by parent edges.",
|
|
8
8
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const meta = {
|
|
2
2
|
command: "task start",
|
|
3
3
|
summary: "Start a task",
|
|
4
|
-
usage: ["keiyaku task start [-C|--cwd DIR] COORDINATE"],
|
|
4
|
+
usage: ["keiyaku task start [-C|--cwd DIR] [--contract ADDR] COORDINATE"],
|
|
5
5
|
stdin: { mode: "argument" },
|
|
6
|
-
flags: ["cwd"],
|
|
6
|
+
flags: ["cwd", "contract"],
|
|
7
7
|
purpose: "Move an open task to in_progress.",
|
|
8
8
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const meta = {
|
|
2
2
|
command: "task stop",
|
|
3
3
|
summary: "Stop a task",
|
|
4
|
-
usage: ["keiyaku task stop [-C|--cwd DIR] [COORDINATE]"],
|
|
4
|
+
usage: ["keiyaku task stop [-C|--cwd DIR] [--contract ADDR] [COORDINATE]"],
|
|
5
5
|
stdin: { mode: "argument" },
|
|
6
|
-
flags: ["cwd"],
|
|
6
|
+
flags: ["cwd", "contract"],
|
|
7
7
|
purpose: "Return an in-progress task to open.",
|
|
8
8
|
};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
export const TASK_UPDATE_EXPLICIT_CHANGE_ERROR = "task update requires an explicit change: --title, --body TEXT or --body -, --append TEXT|-, --pri, --needs/--drop-needs, --parent/--no-parent, --from, --supersedes/--drop-supersedes, or --relates-to/--drop-relates-to";
|
|
1
2
|
export const meta = {
|
|
2
3
|
command: "task update",
|
|
3
4
|
summary: "Update task facts",
|
|
4
|
-
usage: ["keiyaku task update [-C|--cwd DIR] COORDINATE [--title TEXT] [--body TEXT|-|--append TEXT|-] [--pri 0-3] [--needs COORDINATE] [--drop-needs COORDINATE] [--parent COORDINATE|--no-parent] [--from COORDINATE] [--supersedes COORDINATE] [--drop-supersedes COORDINATE] [--relates-to COORDINATE] [--drop-relates-to COORDINATE] [--json]"],
|
|
5
|
+
usage: ["keiyaku task update [-C|--cwd DIR] [--contract ADDR] COORDINATE [--title TEXT] [--body TEXT|-|--append TEXT|-] [--pri 0-3] [--needs COORDINATE] [--drop-needs COORDINATE] [--parent COORDINATE|--no-parent] [--from COORDINATE] [--supersedes COORDINATE] [--drop-supersedes COORDINATE] [--relates-to COORDINATE] [--drop-relates-to COORDINATE] [--json]"],
|
|
5
6
|
stdin: {
|
|
6
7
|
mode: "argument",
|
|
7
8
|
selector: { kind: "flag", names: ["taskBody", "taskAppend"], required: false, rejectBlank: false },
|
|
8
9
|
},
|
|
9
|
-
flags: ["cwd", "title", "body", "append", "pri", "needs", "drop-needs", "parent", "no-parent", "from", "supersedes", "drop-supersedes", "relates-to", "drop-relates-to", "json"],
|
|
10
|
+
flags: ["cwd", "contract", "title", "body", "append", "pri", "needs", "drop-needs", "parent", "no-parent", "from", "supersedes", "drop-supersedes", "relates-to", "drop-relates-to", "json"],
|
|
10
11
|
purpose: "Change mutable task facts.",
|
|
11
12
|
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readVerificationRun, requestVerificationRunCancellation, VerificationRunUnknownError, VerificationRunWaitTimeoutError, waitForVerificationRun, } from "../../../core/settlement/verification.js";
|
|
2
|
+
import { FlowError } from "../../../flow-error.js";
|
|
3
|
+
import { renderVerificationCli, verificationCancelModel, verificationStatusModel, verificationWaitModel, verificationWaitTimeoutModel, } from "../../render/verification.js";
|
|
4
|
+
import { projectDirectory } from "../shared.js";
|
|
5
|
+
export const handler = async (_stdin, flags, signal, positional) => {
|
|
6
|
+
const [operation, runId, ...extra] = positional;
|
|
7
|
+
if (!operation || !runId || extra.length > 0) {
|
|
8
|
+
throw new FlowError("EMPTY_PARAM", "verification requires wait, status, or cancel followed by one VerificationRun id");
|
|
9
|
+
}
|
|
10
|
+
// Honor --repo through the shared repository-resolution primitive.
|
|
11
|
+
const root = await projectDirectory(flags, "verification");
|
|
12
|
+
const json = flags.json === true;
|
|
13
|
+
if (operation === "wait") {
|
|
14
|
+
try {
|
|
15
|
+
// Observation only: timeout/abort end wait without requesting cancellation.
|
|
16
|
+
const terminal = await waitForVerificationRun({ root, runId, timeoutMs: flags.timeoutMs, signal });
|
|
17
|
+
return renderVerificationCli(verificationWaitModel(runId, terminal), json);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof VerificationRunUnknownError) {
|
|
21
|
+
throw new FlowError("UNKNOWN_ADDRESS", error.message);
|
|
22
|
+
}
|
|
23
|
+
if (!(error instanceof VerificationRunWaitTimeoutError))
|
|
24
|
+
throw error;
|
|
25
|
+
return renderVerificationCli(verificationWaitTimeoutModel(runId), json);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (operation === "status") {
|
|
29
|
+
const run = readVerificationRun(root, runId);
|
|
30
|
+
if (!run)
|
|
31
|
+
throw new FlowError("UNKNOWN_ADDRESS", `verification run '${runId}' does not exist`);
|
|
32
|
+
return renderVerificationCli(verificationStatusModel(run), json);
|
|
33
|
+
}
|
|
34
|
+
if (operation === "cancel") {
|
|
35
|
+
// Explicit cancel is the only mutating verification CLI path.
|
|
36
|
+
if (!readVerificationRun(root, runId)) {
|
|
37
|
+
throw new FlowError("UNKNOWN_ADDRESS", `verification run '${runId}' does not exist`);
|
|
38
|
+
}
|
|
39
|
+
const accepted = requestVerificationRunCancellation(root, runId);
|
|
40
|
+
return renderVerificationCli(verificationCancelModel(runId, accepted), json);
|
|
41
|
+
}
|
|
42
|
+
throw new FlowError("INVALID_USAGE", "verification operation must be wait, status, or cancel");
|
|
43
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const meta = {
|
|
2
|
+
command: "verification",
|
|
3
|
+
summary: "Observe or cancel one durable VerificationRun",
|
|
4
|
+
usage: [
|
|
5
|
+
"keiyaku verification wait RUN_ID [-C|--cwd DIR] [--repo DIR] [--timeout DURATION] [--json]",
|
|
6
|
+
"keiyaku verification cancel RUN_ID [-C|--cwd DIR] [--repo DIR] [--json]",
|
|
7
|
+
"keiyaku verification status RUN_ID [-C|--cwd DIR] [--repo DIR] [--json]",
|
|
8
|
+
],
|
|
9
|
+
stdin: { mode: "argument" },
|
|
10
|
+
flags: ["cwd", "repo", "timeout", "json"],
|
|
11
|
+
purpose: "Rejoin, inspect, or request cancellation of an addressable VerificationRun without inspecting runtime SQLite directly.",
|
|
12
|
+
completionRank: 11,
|
|
13
|
+
};
|
package/build/cli/completion.js
CHANGED
|
@@ -19,8 +19,8 @@ function topLevelCommands() {
|
|
|
19
19
|
function subcommandsFor(parent) {
|
|
20
20
|
return [...(getCommandMetadata(parent).subcommands ?? [])];
|
|
21
21
|
}
|
|
22
|
-
function
|
|
23
|
-
const metadata = allCommandMetadata().find((meta) => meta.command ===
|
|
22
|
+
function optionsForCommandContext(context) {
|
|
23
|
+
const metadata = allCommandMetadata().find((meta) => meta.command === context);
|
|
24
24
|
return metadata ? metadata.flags.map((flag) => `--${flag}`) : [];
|
|
25
25
|
}
|
|
26
26
|
function filterPrefix(items, word) {
|
|
@@ -40,22 +40,24 @@ export async function renderCompletionCandidates(input) {
|
|
|
40
40
|
if (word.startsWith("@")) {
|
|
41
41
|
return (await contractAddressCandidates(input.cwd, word)).join("\n");
|
|
42
42
|
}
|
|
43
|
-
|
|
43
|
+
const previous = input.previous ?? "";
|
|
44
|
+
const previousWord = previous.split(/\s+/).at(-1) ?? "";
|
|
45
|
+
if (previous === "call") {
|
|
44
46
|
return filterPrefix([...(await akumaCandidates(input.cwd, word)), "--alias"], word).join("\n");
|
|
45
47
|
}
|
|
46
|
-
if (
|
|
48
|
+
if (previous === "akuma") {
|
|
47
49
|
return filterPrefix(subcommandsFor("akuma"), word).join("\n");
|
|
48
50
|
}
|
|
49
|
-
if (
|
|
51
|
+
if (previous === "skills") {
|
|
50
52
|
return filterPrefix(subcommandsFor("skills"), word).join("\n");
|
|
51
53
|
}
|
|
52
|
-
if (
|
|
54
|
+
if (previous === "task") {
|
|
53
55
|
return filterPrefix(subcommandsFor("task"), word).join("\n");
|
|
54
56
|
}
|
|
55
|
-
if (
|
|
57
|
+
if (previousWord === "--filter") {
|
|
56
58
|
return filterPrefix([TASK_FILTER_COMPLETION], word).join("\n");
|
|
57
59
|
}
|
|
58
|
-
const options =
|
|
60
|
+
const options = previous ? optionsForCommandContext(previous) : [];
|
|
59
61
|
if (options.length > 0) {
|
|
60
62
|
return filterPrefix(options, word).join("\n");
|
|
61
63
|
}
|
|
@@ -66,8 +68,9 @@ export function renderCompletionScript(shell = "bash") {
|
|
|
66
68
|
return [
|
|
67
69
|
"#compdef keiyaku",
|
|
68
70
|
"_keiyaku() {",
|
|
69
|
-
" local -a candidates",
|
|
70
|
-
"
|
|
71
|
+
" local -a candidates context",
|
|
72
|
+
" context=\"${(j: :)words[2,CURRENT-1]}\"",
|
|
73
|
+
" candidates=(${(f)\"$(keiyaku completion --complete --word=\"${words[CURRENT]}\" --previous=\"${context}\" 2>/dev/null)\"})",
|
|
71
74
|
" compadd -- $candidates",
|
|
72
75
|
"}",
|
|
73
76
|
"_keiyaku \"$@\"",
|
|
@@ -75,13 +78,13 @@ export function renderCompletionScript(shell = "bash") {
|
|
|
75
78
|
}
|
|
76
79
|
return [
|
|
77
80
|
"_keiyaku_completion() {",
|
|
78
|
-
" local cur
|
|
81
|
+
" local cur context",
|
|
79
82
|
" cur=\"${COMP_WORDS[COMP_CWORD]}\"",
|
|
80
|
-
"
|
|
83
|
+
" context=\"${COMP_WORDS[*]:1:$((COMP_CWORD - 1))}\"",
|
|
81
84
|
" COMPREPLY=()",
|
|
82
85
|
" while IFS= read -r candidate; do",
|
|
83
86
|
" COMPREPLY+=(\"$candidate\")",
|
|
84
|
-
" done < <(keiyaku completion --complete --word=\"$cur\" --previous=\"$
|
|
87
|
+
" done < <(keiyaku completion --complete --word=\"$cur\" --previous=\"$context\" 2>/dev/null)",
|
|
85
88
|
"}",
|
|
86
89
|
"complete -F _keiyaku_completion keiyaku",
|
|
87
90
|
].join("\n");
|
package/build/cli/flags.js
CHANGED
|
@@ -47,6 +47,11 @@ export const FLAG_SPECS = {
|
|
|
47
47
|
placeholder: "DURATION",
|
|
48
48
|
description: "Wait at most a positive duration such as 45s, 5m, or 2h (maximum 24h).",
|
|
49
49
|
},
|
|
50
|
+
entry: {
|
|
51
|
+
kind: "value",
|
|
52
|
+
placeholder: "N",
|
|
53
|
+
description: "Select one zero-based retained history entry from an addressed projection.",
|
|
54
|
+
},
|
|
50
55
|
any: {
|
|
51
56
|
kind: "boolean",
|
|
52
57
|
description: "For a projection set, return when the first observed member reaches a terminal state.",
|
|
@@ -58,7 +63,7 @@ export const FLAG_SPECS = {
|
|
|
58
63
|
},
|
|
59
64
|
incognito: {
|
|
60
65
|
kind: "boolean",
|
|
61
|
-
description: "Do not persist response history and do not allow
|
|
66
|
+
description: "Do not persist response history and do not allow fork.",
|
|
62
67
|
},
|
|
63
68
|
bare: {
|
|
64
69
|
kind: "boolean",
|
|
@@ -103,7 +108,7 @@ export const FLAG_SPECS = {
|
|
|
103
108
|
scope: {
|
|
104
109
|
kind: "value",
|
|
105
110
|
placeholder: "GLOB",
|
|
106
|
-
description: "
|
|
111
|
+
description: "Add an ordered scope pattern to flag-generated bind Markdown. May be repeated.",
|
|
107
112
|
},
|
|
108
113
|
criteria: {
|
|
109
114
|
kind: "value",
|
|
@@ -138,6 +143,10 @@ export const FLAG_SPECS = {
|
|
|
138
143
|
kind: "boolean",
|
|
139
144
|
description: "Preview bind input or petition preflight without mutation.",
|
|
140
145
|
},
|
|
146
|
+
check: {
|
|
147
|
+
kind: "boolean",
|
|
148
|
+
description: "Derive and render the task composition without changing the board or Git state.",
|
|
149
|
+
},
|
|
141
150
|
"append-scope": {
|
|
142
151
|
kind: "value",
|
|
143
152
|
placeholder: "PATTERN",
|
|
@@ -147,6 +156,10 @@ export const FLAG_SPECS = {
|
|
|
147
156
|
kind: "boolean",
|
|
148
157
|
description: "Renew onto the current target before petitioning.",
|
|
149
158
|
},
|
|
159
|
+
audit: {
|
|
160
|
+
kind: "boolean",
|
|
161
|
+
description: "Run the ordinary read-only audit after a completed renew.",
|
|
162
|
+
},
|
|
150
163
|
continue: {
|
|
151
164
|
kind: "boolean",
|
|
152
165
|
description: "Continue from the derived renew conflict scratch.",
|
|
@@ -187,11 +200,29 @@ export const FLAG_SPECS = {
|
|
|
187
200
|
kind: "boolean",
|
|
188
201
|
description: "Render structured data as JSON.",
|
|
189
202
|
},
|
|
203
|
+
limit: {
|
|
204
|
+
kind: "value",
|
|
205
|
+
placeholder: "COUNT",
|
|
206
|
+
description: "Limit terminal rows in the Akuma roster.",
|
|
207
|
+
},
|
|
208
|
+
offset: {
|
|
209
|
+
kind: "value",
|
|
210
|
+
placeholder: "COUNT",
|
|
211
|
+
description: "Skip terminal rows in the Akuma roster.",
|
|
212
|
+
},
|
|
213
|
+
raw: {
|
|
214
|
+
kind: "boolean",
|
|
215
|
+
description: "Include retained raw event bodies when inspecting one history entry.",
|
|
216
|
+
},
|
|
190
217
|
"diff-budget": {
|
|
191
218
|
kind: "value",
|
|
192
219
|
placeholder: "BYTES",
|
|
193
220
|
description: "Set the audit raw-diff presentation budget in bytes.",
|
|
194
221
|
},
|
|
222
|
+
"skip-diff-body": {
|
|
223
|
+
kind: "boolean",
|
|
224
|
+
description: "Suppress raw diff hunk bodies from the human audit presentation without changing audit evidence or checks.",
|
|
225
|
+
},
|
|
195
226
|
done: {
|
|
196
227
|
kind: "boolean",
|
|
197
228
|
description: "Show terminal tasks.",
|
|
@@ -209,51 +240,51 @@ export const FLAG_SPECS = {
|
|
|
209
240
|
pri: {
|
|
210
241
|
kind: "value",
|
|
211
242
|
placeholder: "0-3",
|
|
212
|
-
description: "Set task priority
|
|
243
|
+
description: "Set task priority: 0 (highest) through 3 (lowest).",
|
|
213
244
|
},
|
|
214
245
|
needs: {
|
|
215
246
|
kind: "value",
|
|
216
247
|
placeholder: "ID",
|
|
217
|
-
description: "
|
|
248
|
+
description: "Order execution: this task needs another task first. May be repeated.",
|
|
218
249
|
},
|
|
219
250
|
"drop-needs": {
|
|
220
251
|
kind: "value",
|
|
221
252
|
placeholder: "ID",
|
|
222
|
-
description: "Remove
|
|
253
|
+
description: "Remove an execution-ordering dependency. May be repeated.",
|
|
223
254
|
},
|
|
224
255
|
parent: {
|
|
225
256
|
kind: "value",
|
|
226
257
|
placeholder: "ID",
|
|
227
|
-
description: "
|
|
258
|
+
description: "Organize task hierarchy under a parent task.",
|
|
228
259
|
},
|
|
229
260
|
"no-parent": {
|
|
230
261
|
kind: "boolean",
|
|
231
|
-
description: "Clear the parent task.",
|
|
262
|
+
description: "Clear the hierarchy parent task.",
|
|
232
263
|
},
|
|
233
264
|
from: {
|
|
234
265
|
kind: "value",
|
|
235
266
|
placeholder: "ID",
|
|
236
|
-
description: "
|
|
267
|
+
description: "Record work discovered while doing another task. May be repeated.",
|
|
237
268
|
},
|
|
238
269
|
supersedes: {
|
|
239
270
|
kind: "value",
|
|
240
271
|
placeholder: "ID",
|
|
241
|
-
description: "Record that this task
|
|
272
|
+
description: "Record that this task replaces another task. May be repeated.",
|
|
242
273
|
},
|
|
243
274
|
"drop-supersedes": {
|
|
244
275
|
kind: "value",
|
|
245
276
|
placeholder: "ID",
|
|
246
|
-
description: "Remove a
|
|
277
|
+
description: "Remove a replacement relation. May be repeated.",
|
|
247
278
|
},
|
|
248
279
|
"relates-to": {
|
|
249
280
|
kind: "value",
|
|
250
281
|
placeholder: "ID",
|
|
251
|
-
description: "Record
|
|
282
|
+
description: "Record a thematic relation without ordering or replacement. May be repeated.",
|
|
252
283
|
},
|
|
253
284
|
"drop-relates-to": {
|
|
254
285
|
kind: "value",
|
|
255
286
|
placeholder: "ID",
|
|
256
|
-
description: "Remove a
|
|
287
|
+
description: "Remove a thematic relation. May be repeated.",
|
|
257
288
|
},
|
|
258
289
|
title: {
|
|
259
290
|
kind: "value",
|
|
@@ -270,6 +301,11 @@ export const FLAG_SPECS = {
|
|
|
270
301
|
placeholder: "TEXT|-",
|
|
271
302
|
description: "Append a Markdown paragraph to the task body; literal - reads stdin.",
|
|
272
303
|
},
|
|
304
|
+
note: {
|
|
305
|
+
kind: "value",
|
|
306
|
+
placeholder: "TEXT|-",
|
|
307
|
+
description: "Append an immutable task note; literal - reads stdin.",
|
|
308
|
+
},
|
|
273
309
|
};
|
|
274
310
|
export const CONTROL_FLAGS = new Set(Object.keys(FLAG_SPECS));
|
|
275
311
|
export const VALUE_FLAGS = new Set(Object.entries(FLAG_SPECS)
|
package/build/cli/help.js
CHANGED
|
@@ -25,7 +25,7 @@ export function renderCliCommandHelp(_command, spec, flagSpecs) {
|
|
|
25
25
|
section(lines, "Purpose:", [spec.purpose]);
|
|
26
26
|
section(lines, "Subcommands:", spec.subcommands);
|
|
27
27
|
section(lines, "Input:", spec.input);
|
|
28
|
-
section(lines, "Options:", spec.flags.map((name) => `${flagUsage(name, flagSpecs)} ${spec.flagDescriptions?.[name] ?? flagSpecs[name]?.description ?? ""}`));
|
|
28
|
+
section(lines, "Options:", spec.flags.map((name) => `${spec.flagUsages?.[name] ?? flagUsage(name, flagSpecs)} ${spec.flagDescriptions?.[name] ?? flagSpecs[name]?.description ?? ""}`));
|
|
29
29
|
section(lines, "Notes:", spec.notes);
|
|
30
30
|
section(lines, "Examples:", spec.examples);
|
|
31
31
|
return lines.join("\n").trimEnd();
|
|
@@ -39,27 +39,27 @@ export function renderCliHelp(version) {
|
|
|
39
39
|
" keiyaku @<commission> <command> [flags]",
|
|
40
40
|
"",
|
|
41
41
|
"Flow:",
|
|
42
|
-
" bind ->
|
|
43
|
-
" optional: arc ->
|
|
42
|
+
" bind -> make and commit changes -> petition",
|
|
43
|
+
" optional: arc -> make and commit changes -> arc; renew when the target moves",
|
|
44
44
|
"",
|
|
45
45
|
"Commands:",
|
|
46
|
-
" bind Create a contract
|
|
47
|
-
" arc
|
|
48
|
-
" renew
|
|
49
|
-
" call Start an Akuma
|
|
50
|
-
" wait Wait for
|
|
51
|
-
"
|
|
52
|
-
" tell Send
|
|
53
|
-
" kill Stop
|
|
54
|
-
" log
|
|
55
|
-
" akuma Inspect
|
|
46
|
+
" bind Create a contract and its workspace.",
|
|
47
|
+
" arc Seal the current stage and begin another.",
|
|
48
|
+
" renew Refresh committed changes onto the contract target.",
|
|
49
|
+
" call Start an Akuma projection.",
|
|
50
|
+
" wait Wait for a projection.",
|
|
51
|
+
" fork Start a projection from a response artifact.",
|
|
52
|
+
" tell Send a message to a projection.",
|
|
53
|
+
" kill Stop a projection's active run.",
|
|
54
|
+
" log Show a contract history.",
|
|
55
|
+
" akuma Inspect available Akuma definitions.",
|
|
56
56
|
" skills Install bundled official skills.",
|
|
57
57
|
" amend Record an amendment.",
|
|
58
|
-
" petition
|
|
59
|
-
" forfeit
|
|
58
|
+
" petition Ask Keiyaku to settle a contract.",
|
|
59
|
+
" forfeit End a contract without claiming it.",
|
|
60
60
|
" guide Print workflow guidance.",
|
|
61
61
|
" completion Print shell completion.",
|
|
62
|
-
" status
|
|
62
|
+
" status Show contracts, tasks, and projections that need attention.",
|
|
63
63
|
" task Manage lightweight repository tasks.",
|
|
64
64
|
" dump-env Print the environment template.",
|
|
65
65
|
"",
|
|
@@ -67,12 +67,12 @@ export function renderCliHelp(version) {
|
|
|
67
67
|
" <> means required; [] means optional.",
|
|
68
68
|
" bind, arc, amend, and petition read document stdin only when literal `-` selects it.",
|
|
69
69
|
" call and tell require literal BODY or `-`; literal `-` selects stdin.",
|
|
70
|
-
"
|
|
70
|
+
" fork accepts an artifact plus optional BODY or `-`; unselected stdin is ignored.",
|
|
71
71
|
"",
|
|
72
72
|
"Configuration:",
|
|
73
|
-
" Akuma
|
|
73
|
+
" Akuma definitions <KEIYAKU_HOME>/akuma/*.md or .keiyaku/akuma/*.md",
|
|
74
74
|
" Settings <KEIYAKU_HOME>/settings.json or .keiyaku/settings.json",
|
|
75
|
-
" Inspect keiyaku akuma
|
|
75
|
+
" Inspect keiyaku akuma list | keiyaku akuma show NAME",
|
|
76
76
|
" Environment keiyaku dump-env",
|
|
77
77
|
" Full format README Configuration",
|
|
78
78
|
].join("\n");
|
|
@@ -81,18 +81,17 @@ export function buildKeiyakuGuide(version) {
|
|
|
81
81
|
return [
|
|
82
82
|
`# Keiyaku Guide (v${version})`,
|
|
83
83
|
"",
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
84
|
+
"A task is a planning item: it does not create a workspace or start work.",
|
|
85
|
+
"A contract is one bounded delivery with its own workspace. It begins bound and ends claimed when settlement lands it, or forfeited when it is ended without a claim.",
|
|
86
|
+
"An Akuma is a callable worker definition. A projection is one run of an Akuma.",
|
|
87
87
|
"",
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"- `status` is read-only and reports next actions, drift, queue state, and projections.",
|
|
88
|
+
"`bind -> make and commit changes -> petition`",
|
|
89
|
+
"",
|
|
90
|
+
"Binding a contract establishes its first delivery stage. A `seal` records that stage's committed changes and scope at a lifecycle boundary.",
|
|
91
|
+
"`arc` is an optional boundary: it seals the current stage and opens the next. Use arcs only for successive stages of one contract and one final settlement; they do not create separately claimable work.",
|
|
92
|
+
"When the contract target moves, `renew` refreshes the committed changes onto it and seals the refreshed current stage.",
|
|
93
|
+
"`petition` seals the current stage, runs the contract's settlement checks, and claims the contract only when they pass. If a settlement gate fails, the contract is not claimed; address the reported problem and petition again.",
|
|
94
|
+
"Use separate tasks and contracts for work with separate acceptance, ownership, or waiting needs. `status` shows the work that needs attention.",
|
|
96
95
|
].join("\n");
|
|
97
96
|
}
|
|
98
97
|
export function commandMetadata(command) {
|
package/build/cli/index.js
CHANGED
|
@@ -37,10 +37,10 @@ function prepareBindInput(stdin, flags, selectsStdin) {
|
|
|
37
37
|
const nonblankStdin = stdin.trim().length > 0;
|
|
38
38
|
const domainFlags = hasBindDomainFlags(flags);
|
|
39
39
|
if (flags.dryRun && flags.draftOnly) {
|
|
40
|
-
throw new FlowError("
|
|
40
|
+
throw new FlowError("INVALID_USAGE", "--dry-run cannot be combined with --draft-only");
|
|
41
41
|
}
|
|
42
42
|
if (selectsStdin && domainFlags) {
|
|
43
|
-
throw new FlowError("
|
|
43
|
+
throw new FlowError("INVALID_USAGE", "bind accepts either stdin Markdown or domain flags, not both");
|
|
44
44
|
}
|
|
45
45
|
if (domainFlags) {
|
|
46
46
|
const missing = [];
|
|
@@ -74,7 +74,10 @@ function prepareBindInput(stdin, flags, selectsStdin) {
|
|
|
74
74
|
if (flags.bindTaskIds !== undefined && flags.bindTaskIds.length > 0) {
|
|
75
75
|
return "";
|
|
76
76
|
}
|
|
77
|
-
|
|
77
|
+
const message = selectsStdin
|
|
78
|
+
? `No Markdown input received on stdin.\n\nExample:\n ${usageExample("bind")}`
|
|
79
|
+
: "bind requires literal '-' for Markdown input or the required domain flags";
|
|
80
|
+
throw new FlowError(selectsStdin ? "STDIN_EMPTY" : "EMPTY_PARAM", message);
|
|
78
81
|
}
|
|
79
82
|
return stdin;
|
|
80
83
|
}
|
|
@@ -217,9 +220,6 @@ async function resolveCliInput(parsed) {
|
|
|
217
220
|
const selected = selectedArgument(parsed);
|
|
218
221
|
const token = selected?.token;
|
|
219
222
|
const selectsStdin = token === "-";
|
|
220
|
-
if (selectsStdin && process.stdin.isTTY) {
|
|
221
|
-
throw new FlowError("EMPTY_PARAM", `${parsed.command} literal '-' requires piped stdin`);
|
|
222
|
-
}
|
|
223
223
|
const piped = selectsStdin ? await readStdin() : "";
|
|
224
224
|
const input = selectsStdin ? piped : token ?? "";
|
|
225
225
|
if (stdinMeta.selector?.required && token === undefined) {
|
|
@@ -231,8 +231,14 @@ async function resolveCliInput(parsed) {
|
|
|
231
231
|
if (token !== undefined && stdinMeta.selector?.rejectBlank && !input.trim()) {
|
|
232
232
|
const message = stdinMeta.mode === "document"
|
|
233
233
|
? `No Markdown input received on stdin.\n\nExample:\n ${usageExample(parsed.command)}`
|
|
234
|
-
:
|
|
235
|
-
|
|
234
|
+
: selectsStdin
|
|
235
|
+
? parsed.command === "task add"
|
|
236
|
+
? "task add received no task document on stdin"
|
|
237
|
+
: `${parsed.command} received no body on stdin`
|
|
238
|
+
: parsed.command === "task add"
|
|
239
|
+
? "task add title cannot be empty"
|
|
240
|
+
: `${parsed.command} body cannot be empty`;
|
|
241
|
+
throw new FlowError(selectsStdin ? "STDIN_EMPTY" : "EMPTY_PARAM", message);
|
|
236
242
|
}
|
|
237
243
|
return { stdin: input, flags: selected?.replace(input) ?? parsed.flags, selectsStdin };
|
|
238
244
|
}
|