@etiquekit/etq 1.0.13 → 1.0.15
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/AGENTS.md +26 -19
- package/LICENSE +3 -2
- package/NOTICE +4 -6
- package/QuickStart.md +46 -35
- package/README.md +57 -55
- package/bin/etiquette +5 -1
- package/bin/etiquette-core +5 -1
- package/docs/ARCHITECTURE.md +17 -20
- package/docs/CONCEPTS.md +5 -5
- package/docs/CORE_PROFILE.md +15 -7
- package/docs/LANE_PROVISIONING.md +2 -7
- package/docs/README.md +14 -13
- package/docs/RELEASE_SURFACE_AUDIT.md +6 -7
- package/docs/SEAT_DISCIPLINE.md +91 -55
- package/docs/SEAT_PROVISIONING.md +19 -16
- package/docs/TEAM_HANDOFF.md +21 -21
- package/docs/WORKTREE_QOL.md +0 -7
- package/docs/contracts/ledger-entry/README.md +11 -11
- package/docs/contracts/ledger-entry/ledger-entry.v0.2.md +2 -2
- package/docs/contracts/ledger-entry/ledger-entry.v0.md +8 -8
- package/lib/etiquette-core.js +313 -0
- package/lib/etiquette.js +1151 -0
- package/package.json +13 -12
- package/templates/etiquette-vanilla-v0/README.md +3 -2
- package/templates/etiquette-vanilla-v0/source/control-seat/README.md +6 -0
- package/templates/etiquette-vanilla-v0/source/control-seat/bin/access-assurance-check +55 -0
- package/templates/etiquette-vanilla-v0/source/control-seat/bin/seat-doctor +5 -0
- package/templates/etiquette-vanilla-v0/source/control-seat/docs/work/access/ACCESS-ASSURANCE.md +39 -0
- package/templates/etiquette-vanilla-v0/source/control-seat/docs/work/access/workspace-secure-profile.v0.json +53 -0
- package/templates/etiquette-vanilla-v0/validate-vanilla.sh +5 -0
- package/templates/hosted-receiver/README.md +41 -0
- package/templates/hosted-receiver/w1-github-webhook-receiver.mjs +129 -0
- package/templates/seat-packs-v0/README.md +2 -3
- package/templates/seat-packs-v0/source/claude-code-seat/README.md +3 -3
- package/templates/seat-packs-v0/source/codex-seat/README.md +3 -3
- package/templates/seat-packs-v0/source/gemini-seat/README.md +3 -3
- package/templates/seat-packs-v0/source/ollama-seat/README.md +3 -3
- package/templates/seat-packs-v0/source/openrouter-seat/README.md +3 -3
- package/docs/CONCEPT_STATUS.md +0 -66
- package/packages/control/src/authority/lease.ts +0 -261
- package/packages/control/src/authority/node-delegation.ts +0 -257
- package/packages/control/src/authority/rig-conductor.ts +0 -632
- package/packages/control/src/cli/argv.ts +0 -155
- package/packages/control/src/cli/commands/console.ts +0 -200
- package/packages/control/src/cli/commands/dispatch-core.ts +0 -89
- package/packages/control/src/cli/commands/dispatch.ts +0 -279
- package/packages/control/src/cli/commands/harness.ts +0 -89
- package/packages/control/src/cli/commands/hook.ts +0 -50
- package/packages/control/src/cli/commands/ledger.ts +0 -91
- package/packages/control/src/cli/commands/local-workflow.ts +0 -4686
- package/packages/control/src/cli/commands/memory.ts +0 -445
- package/packages/control/src/cli/commands/release.ts +0 -108
- package/packages/control/src/cli/commands/rubric.ts +0 -103
- package/packages/control/src/cli/commands/seat.ts +0 -179
- package/packages/control/src/cli/commands/session.ts +0 -127
- package/packages/control/src/cli/commands/supervision.ts +0 -246
- package/packages/control/src/cli/commands/sync.ts +0 -119
- package/packages/control/src/cli/commands/workflow.ts +0 -86
- package/packages/control/src/cli/commands/workspace.ts +0 -50
- package/packages/control/src/cli/core-usage.ts +0 -34
- package/packages/control/src/cli/prompt.ts +0 -67
- package/packages/control/src/cli/supervision-deps.ts +0 -44
- package/packages/control/src/cli/usage.ts +0 -241
- package/packages/control/src/cli.ts +0 -207
- package/packages/control/src/core-cli.ts +0 -50
- package/packages/control/src/dispatch/decision.ts +0 -202
- package/packages/control/src/dispatch/projection.ts +0 -293
- package/packages/control/src/dispatch/record.ts +0 -153
- package/packages/control/src/engagement/project.ts +0 -170
- package/packages/control/src/fs.ts +0 -19
- package/packages/control/src/harness/pruning.ts +0 -406
- package/packages/control/src/hooks/dispatcher.ts +0 -117
- package/packages/control/src/hooks/outbox.ts +0 -86
- package/packages/control/src/hooks/sanitize.ts +0 -6
- package/packages/control/src/hooks/types.ts +0 -34
- package/packages/control/src/index.ts +0 -384
- package/packages/control/src/ledger/entry.ts +0 -303
- package/packages/control/src/ledger/indexer.ts +0 -542
- package/packages/control/src/memory/context.ts +0 -149
- package/packages/control/src/memory/drain-import.ts +0 -207
- package/packages/control/src/memory/indexer.ts +0 -284
- package/packages/control/src/memory/query.ts +0 -75
- package/packages/control/src/memory/sanitize.ts +0 -50
- package/packages/control/src/memory/sharded-drain-import.ts +0 -212
- package/packages/control/src/memory/status.ts +0 -211
- package/packages/control/src/memory/store-lifecycle.ts +0 -509
- package/packages/control/src/memory/store.ts +0 -284
- package/packages/control/src/memory/types.ts +0 -146
- package/packages/control/src/parity/surfaces.ts +0 -748
- package/packages/control/src/project.ts +0 -141
- package/packages/control/src/projection/local-ledger-view.ts +0 -373
- package/packages/control/src/projection/return-enforcement.ts +0 -48
- package/packages/control/src/projection/timeline-preview.ts +0 -539
- package/packages/control/src/projection/timeline.ts +0 -708
- package/packages/control/src/release/readiness.ts +0 -831
- package/packages/control/src/rubric/loader.ts +0 -326
- package/packages/control/src/rubric/promotion.ts +0 -54
- package/packages/control/src/rubric/runner.ts +0 -159
- package/packages/control/src/rubric/types.ts +0 -158
- package/packages/control/src/seat/owner-card.ts +0 -388
- package/packages/control/src/seat/readiness.ts +0 -834
- package/packages/control/src/session/runbook.ts +0 -431
- package/packages/control/src/shared/sanitize.ts +0 -49
- package/packages/control/src/supervision/action-classes.ts +0 -192
- package/packages/control/src/supervision/command-apply.ts +0 -378
- package/packages/control/src/supervision/errors.ts +0 -14
- package/packages/control/src/supervision/event-replay.ts +0 -155
- package/packages/control/src/supervision/events.ts +0 -109
- package/packages/control/src/supervision/index.ts +0 -16
- package/packages/control/src/supervision/manifest.ts +0 -127
- package/packages/control/src/supervision/paths.ts +0 -49
- package/packages/control/src/supervision/projection-adapter.ts +0 -274
- package/packages/control/src/supervision/projection.ts +0 -75
- package/packages/control/src/supervision/rebuild.ts +0 -99
- package/packages/control/src/supervision/session-open.ts +0 -131
- package/packages/control/src/supervision/session-read.ts +0 -99
- package/packages/control/src/supervision/sqlite-impl.ts +0 -71
- package/packages/control/src/supervision/sqlite.ts +0 -121
- package/packages/control/src/supervision/store-rows.ts +0 -371
- package/packages/control/src/supervision/turn-close.ts +0 -154
- package/packages/control/src/supervision/turn-open.ts +0 -284
- package/packages/control/src/sync/event-log-merge-driver.ts +0 -263
- package/packages/control/src/sync/join-plan.ts +0 -375
- package/packages/control/src/sync/outbox.ts +0 -492
- package/packages/control/src/workflow/evaluator.ts +0 -140
- package/packages/control/src/workflow/loader.ts +0 -200
- package/packages/control/src/workflow/types.ts +0 -90
- package/packages/control/src/workspace/authority.ts +0 -499
- package/packages/protocol/src/guards.ts +0 -119
- package/packages/protocol/src/huddle-board.ts +0 -198
- package/packages/protocol/src/huddle.ts +0 -295
- package/packages/protocol/src/incident.ts +0 -251
- package/packages/protocol/src/index.ts +0 -8
- package/packages/protocol/src/interfaces.ts +0 -107
- package/packages/protocol/src/packet-profile.ts +0 -195
- package/packages/protocol/src/state.ts +0 -81
- package/packages/protocol/src/types.ts +0 -434
- package/release/lineage.v0.json +0 -14
- package/scripts/release-candidate-verify.sh +0 -175
- package/scripts/release-checksum.sh +0 -25
- package/scripts/release-pack-canary.sh +0 -97
- package/scripts/release-scan.sh +0 -249
- package/scripts/release-sign.sh +0 -34
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'node:path';
|
|
2
|
-
import { requireString } from '../argv';
|
|
3
|
-
import { evaluateWorkflowCheck, explainWorkflowMode } from '../../workflow/evaluator';
|
|
4
|
-
import { loadWorkflowEnvelope, loadWorkflowMode } from '../../workflow/loader';
|
|
5
|
-
import { WORKFLOW_MODE_TYPES, type WorkflowModeType } from '../../workflow/types';
|
|
6
|
-
|
|
7
|
-
const WORKFLOW_VERBS = new Set(['validate', 'explain', 'check']);
|
|
8
|
-
|
|
9
|
-
export function isWorkflowCommand(command: string): boolean {
|
|
10
|
-
return command === 'workflow';
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function parseModeType(raw: string | undefined): WorkflowModeType {
|
|
14
|
-
if (!raw || !(WORKFLOW_MODE_TYPES as readonly string[]).includes(raw)) {
|
|
15
|
-
throw new Error(`workflow mode type must be one of: ${WORKFLOW_MODE_TYPES.join(', ')}`);
|
|
16
|
-
}
|
|
17
|
-
return raw as WorkflowModeType;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function renderValidate(mode: Awaited<ReturnType<typeof loadWorkflowMode>>): string {
|
|
21
|
-
return [
|
|
22
|
-
'workflow_mode_validate:',
|
|
23
|
-
` mode_id: ${mode.mode_id}`,
|
|
24
|
-
` mode_version: ${mode.mode_version}`,
|
|
25
|
-
` mode_type: ${mode.mode_type}`,
|
|
26
|
-
` authority_status: ${mode.authority_status}`,
|
|
27
|
-
` advisory_consensus_can_authorize: ${String(mode.grant.advisory_consensus_can_authorize)}`,
|
|
28
|
-
' can_authorize: false',
|
|
29
|
-
' can_attach_grant: false',
|
|
30
|
-
].join('\n');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function renderExplain(explanation: ReturnType<typeof explainWorkflowMode>): string {
|
|
34
|
-
return [
|
|
35
|
-
'workflow_mode_explain:',
|
|
36
|
-
` mode_type: ${explanation.mode_type}`,
|
|
37
|
-
` summary: ${explanation.summary}`,
|
|
38
|
-
` use_when: ${explanation.use_when.join(', ')}`,
|
|
39
|
-
` boundary: ${explanation.boundary.join(', ')}`,
|
|
40
|
-
].join('\n');
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function renderCheck(result: ReturnType<typeof evaluateWorkflowCheck>): string {
|
|
44
|
-
return [
|
|
45
|
-
'workflow_check:',
|
|
46
|
-
` task_ref: ${result.task_ref}`,
|
|
47
|
-
` mode_id: ${result.mode_id}`,
|
|
48
|
-
` mode_type: ${result.mode_type}`,
|
|
49
|
-
` recommendation: ${result.recommendation}`,
|
|
50
|
-
` missing: ${result.missing.join(', ') || 'none'}`,
|
|
51
|
-
` warnings: ${result.warnings.join(', ') || 'none'}`,
|
|
52
|
-
` can_authorize: ${String(result.authority_boundary.can_authorize)}`,
|
|
53
|
-
` can_attach_grant: ${String(result.authority_boundary.can_attach_grant)}`,
|
|
54
|
-
` consensus_can_authorize: ${String(result.authority_boundary.consensus_can_authorize)}`,
|
|
55
|
-
].join('\n');
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export async function dispatchWorkflow(
|
|
59
|
-
positionals: string[],
|
|
60
|
-
flags: Record<string, string | boolean>,
|
|
61
|
-
): Promise<void> {
|
|
62
|
-
const verb = positionals[1];
|
|
63
|
-
if (!verb || !WORKFLOW_VERBS.has(verb)) {
|
|
64
|
-
throw new Error(`workflow verb must be one of: ${[...WORKFLOW_VERBS].join(', ')}`);
|
|
65
|
-
}
|
|
66
|
-
const json = Boolean(flags.json);
|
|
67
|
-
|
|
68
|
-
if (verb === 'validate') {
|
|
69
|
-
const mode = await loadWorkflowMode(resolve(requireString(flags, 'mode')));
|
|
70
|
-
console.log(json ? JSON.stringify(mode, null, 2) : renderValidate(mode));
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (verb === 'explain') {
|
|
75
|
-
const explanation = explainWorkflowMode(parseModeType(positionals[2]));
|
|
76
|
-
console.log(json ? JSON.stringify(explanation, null, 2) : renderExplain(explanation));
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (verb === 'check') {
|
|
81
|
-
const mode = await loadWorkflowMode(resolve(requireString(flags, 'mode')));
|
|
82
|
-
const envelope = await loadWorkflowEnvelope(resolve(requireString(flags, 'task')));
|
|
83
|
-
const result = evaluateWorkflowCheck(mode, envelope);
|
|
84
|
-
console.log(json ? JSON.stringify(result, null, 2) : renderCheck(result));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'node:path';
|
|
2
|
-
import { requireString } from '../argv';
|
|
3
|
-
import { validateWorkspaceAuthorityFile } from '../../workspace/authority';
|
|
4
|
-
|
|
5
|
-
const WORKSPACE_VERBS = new Set(['authority']);
|
|
6
|
-
|
|
7
|
-
export function isWorkspaceCommand(command: string): boolean {
|
|
8
|
-
return command === 'workspace';
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function renderAuthority(result: Awaited<ReturnType<typeof validateWorkspaceAuthorityFile>>): string {
|
|
12
|
-
return [
|
|
13
|
-
'workspace_authority_validation:',
|
|
14
|
-
` workspace_id: ${result.workspace_id}`,
|
|
15
|
-
result.org_id ? ` org_id: ${result.org_id}` : undefined,
|
|
16
|
-
` verdict: ${result.verdict}`,
|
|
17
|
-
` authority_mode: ${result.authority_mode}`,
|
|
18
|
-
` canonical_location: ${result.canonical_location}`,
|
|
19
|
-
` creator_is_root_authority: ${String(result.creator_is_root_authority)}`,
|
|
20
|
-
` local_workspace_is_canonical: ${String(result.local_workspace_is_canonical)}`,
|
|
21
|
-
` org_workspace_is_canonical: ${String(result.org_workspace_is_canonical)}`,
|
|
22
|
-
` runtime_cell_can_mutate_canonical_truth: ${String(result.runtime_cell_can_mutate_canonical_truth)}`,
|
|
23
|
-
` owner_role: ${result.owner_role.role_id}`,
|
|
24
|
-
` owner_occupant: ${result.owner_role.occupant_principal}`,
|
|
25
|
-
` owner_replacement_policy: ${result.owner_role.replacement_policy}`,
|
|
26
|
-
` memory_stores: ${result.memory_summary.stores}`,
|
|
27
|
-
` filesystem_like_memory_stores: ${result.memory_summary.filesystem_like_stores}`,
|
|
28
|
-
` shared_read_write_memory_stores: ${result.memory_summary.shared_read_write_stores}`,
|
|
29
|
-
` consolidation_mode: ${result.memory_summary.consolidation_mode}`,
|
|
30
|
-
` runner_memory_boundary: ${result.memory_summary.runner_memory_boundary}`,
|
|
31
|
-
` consolidation_mutates_input_store: ${String(result.memory_summary.consolidation_mutates_input_store)}`,
|
|
32
|
-
' boundary: authority roots in the declared canonical workspace; memory/consolidation cannot authorize work',
|
|
33
|
-
].filter((line): line is string => Boolean(line)).join('\n');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export async function dispatchWorkspace(
|
|
37
|
-
positionals: string[],
|
|
38
|
-
flags: Record<string, string | boolean>,
|
|
39
|
-
): Promise<void> {
|
|
40
|
-
const verb = positionals[1];
|
|
41
|
-
if (!verb || !WORKSPACE_VERBS.has(verb)) {
|
|
42
|
-
throw new Error(`workspace verb must be one of: ${[...WORKSPACE_VERBS].join(', ')}`);
|
|
43
|
-
}
|
|
44
|
-
const json = Boolean(flags.json);
|
|
45
|
-
|
|
46
|
-
if (verb === 'authority') {
|
|
47
|
-
const result = await validateWorkspaceAuthorityFile(resolve(requireString(flags, 'profile')));
|
|
48
|
-
console.log(json ? JSON.stringify(result, null, 2) : renderAuthority(result));
|
|
49
|
-
}
|
|
50
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export function coreUsage(): string {
|
|
2
|
-
return [
|
|
3
|
-
'etiquette-core',
|
|
4
|
-
'',
|
|
5
|
-
'Bare-bones governance profile. Core governs; runtimes/adapters remain optional.',
|
|
6
|
-
'',
|
|
7
|
-
'usage (seat readiness):',
|
|
8
|
-
' etiquette-core seat readiness --seat <id> [--project <path>] [--json]',
|
|
9
|
-
' etiquette-core seat heartbeat [--project <path>] [--seat <id>] [--json]',
|
|
10
|
-
' etiquette-core seat status [--project <path>] [--json]',
|
|
11
|
-
'',
|
|
12
|
-
'usage (workflow mode checks):',
|
|
13
|
-
' etiquette-core workflow validate --mode <path> [--json]',
|
|
14
|
-
' etiquette-core workflow explain <deliberative|expedient|mixed> [--json]',
|
|
15
|
-
' etiquette-core workflow check --mode <path> --task <path> [--json]',
|
|
16
|
-
'',
|
|
17
|
-
'usage (rubrics):',
|
|
18
|
-
' etiquette-core rubric validate --rubric <path> [--json]',
|
|
19
|
-
' etiquette-core rubric sandbox --rubric <path> --fixtures <path> --run-by <seat> [--json]',
|
|
20
|
-
' etiquette-core rubric promote-check --rubric <path> --receipt <path> [--json]',
|
|
21
|
-
'',
|
|
22
|
-
'usage (operational dispatch):',
|
|
23
|
-
' etiquette-core session create --seat <id> --task <ref> [--project <path>] [--json]',
|
|
24
|
-
' etiquette-core session note --session <id> --section plan|tool|retry|evidence|note --message <text> [--project <path>] [--json]',
|
|
25
|
-
' etiquette-core session migrate-project [--project <path>] [--dry-run] [--json]',
|
|
26
|
-
' etiquette-core dispatch check --mode <path> --task <path> [--project <path>] [--json]',
|
|
27
|
-
' etiquette-core dispatch record --mode <path> --task <path> [--project <path>] [--json]',
|
|
28
|
-
'',
|
|
29
|
-
'usage (local ledger read model):',
|
|
30
|
-
' etiquette-core ledger index [--project <path>] [--json]',
|
|
31
|
-
' etiquette-core ledger search <query> [--project <path>] [--limit <n>] [--json]',
|
|
32
|
-
' etiquette-core ledger show <entry-or-ref-id> [--project <path>]',
|
|
33
|
-
].join('\n');
|
|
34
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { createInterface } from 'node:readline/promises';
|
|
2
|
-
import { stdin as input, stdout as output } from 'node:process';
|
|
3
|
-
|
|
4
|
-
export interface PromptIo {
|
|
5
|
-
inputIsTTY: boolean;
|
|
6
|
-
outputIsTTY: boolean;
|
|
7
|
-
ci: boolean;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function defaultPromptIo(): PromptIo {
|
|
11
|
-
return {
|
|
12
|
-
inputIsTTY: Boolean(input.isTTY),
|
|
13
|
-
outputIsTTY: Boolean(output.isTTY),
|
|
14
|
-
ci: Boolean(process.env.CI),
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function canPrompt(io: PromptIo = defaultPromptIo()): boolean {
|
|
19
|
-
return io.inputIsTTY && io.outputIsTTY && !io.ci;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function askChoice<T extends string>(inputPrompt: {
|
|
23
|
-
label: string;
|
|
24
|
-
choices: Array<{ value: T; label: string }>;
|
|
25
|
-
defaultValue: T;
|
|
26
|
-
io?: PromptIo;
|
|
27
|
-
}): Promise<T> {
|
|
28
|
-
if (!canPrompt(inputPrompt.io)) return inputPrompt.defaultValue;
|
|
29
|
-
const choices = inputPrompt.choices
|
|
30
|
-
.map((choice, index) => `${index + 1}) ${choice.label}`)
|
|
31
|
-
.join(' ');
|
|
32
|
-
const defaultIndex = inputPrompt.choices.findIndex((choice) => choice.value === inputPrompt.defaultValue) + 1;
|
|
33
|
-
const rl = createInterface({ input, output });
|
|
34
|
-
try {
|
|
35
|
-
const answer = (await rl.question(`${inputPrompt.label}\n${choices}\nSelect [${defaultIndex}]: `)).trim();
|
|
36
|
-
if (answer.length === 0) return inputPrompt.defaultValue;
|
|
37
|
-
const numeric = Number.parseInt(answer, 10);
|
|
38
|
-
if (Number.isInteger(numeric) && numeric >= 1 && numeric <= inputPrompt.choices.length) {
|
|
39
|
-
return inputPrompt.choices[numeric - 1].value;
|
|
40
|
-
}
|
|
41
|
-
const normalized = answer.toLowerCase();
|
|
42
|
-
const byValue = inputPrompt.choices.find((choice) => choice.value.toLowerCase() === normalized);
|
|
43
|
-
if (byValue) return byValue.value;
|
|
44
|
-
return inputPrompt.defaultValue;
|
|
45
|
-
} finally {
|
|
46
|
-
rl.close();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export async function askConfirm(inputPrompt: {
|
|
51
|
-
label: string;
|
|
52
|
-
defaultValue: boolean;
|
|
53
|
-
io?: PromptIo;
|
|
54
|
-
}): Promise<boolean> {
|
|
55
|
-
if (!canPrompt(inputPrompt.io)) return inputPrompt.defaultValue;
|
|
56
|
-
const suffix = inputPrompt.defaultValue ? '[Y/n]' : '[y/N]';
|
|
57
|
-
const rl = createInterface({ input, output });
|
|
58
|
-
try {
|
|
59
|
-
const answer = (await rl.question(`${inputPrompt.label} ${suffix} `)).trim().toLowerCase();
|
|
60
|
-
if (answer.length === 0) return inputPrompt.defaultValue;
|
|
61
|
-
if (answer === 'y' || answer === 'yes') return true;
|
|
62
|
-
if (answer === 'n' || answer === 'no') return false;
|
|
63
|
-
return inputPrompt.defaultValue;
|
|
64
|
-
} finally {
|
|
65
|
-
rl.close();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { resolve } from 'node:path';
|
|
4
|
-
import type { SupervisionDeps } from '../../../protocol/src/index';
|
|
5
|
-
import { openSupervisionSqlite } from '../supervision/index';
|
|
6
|
-
import { createSupervisionProjectionAdapter } from '../supervision/projection-adapter';
|
|
7
|
-
import { optionalString } from './argv';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Supervision `SupervisionDeps` factory + projection-dir resolver. Extracted
|
|
11
|
-
* from the former monolithic `cli.ts` so the supervision command dispatcher
|
|
12
|
-
* can import a pre-built adapter set without re-declaring the plumbing.
|
|
13
|
-
*/
|
|
14
|
-
export function makeSupervisionDeps(
|
|
15
|
-
projectionDir: string,
|
|
16
|
-
eventsPath: string,
|
|
17
|
-
): SupervisionDeps {
|
|
18
|
-
const adapter = createSupervisionProjectionAdapter({
|
|
19
|
-
projectionDir,
|
|
20
|
-
eventsPath,
|
|
21
|
-
});
|
|
22
|
-
return {
|
|
23
|
-
now: () => new Date(),
|
|
24
|
-
randomId: () => randomUUID(),
|
|
25
|
-
readFile: (path) => readFile(path, 'utf-8'),
|
|
26
|
-
writeFile: (path, contents) => writeFile(path, contents, 'utf-8'),
|
|
27
|
-
appendFile: (path, contents) => appendFile(path, contents, 'utf-8'),
|
|
28
|
-
mkdirp: async (path) => {
|
|
29
|
-
await mkdir(path, { recursive: true });
|
|
30
|
-
},
|
|
31
|
-
openSqlite: (path) => openSupervisionSqlite(path),
|
|
32
|
-
projectionAdapter: adapter,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function resolveProjectionDir(
|
|
37
|
-
flags: Record<string, string | boolean>,
|
|
38
|
-
campaignRoot: string,
|
|
39
|
-
sessionId: string,
|
|
40
|
-
): string {
|
|
41
|
-
const override = optionalString(flags, 'projection-dir');
|
|
42
|
-
if (override) return resolve(override);
|
|
43
|
-
return resolve(campaignRoot, '.etiquette', 'projections', sessionId);
|
|
44
|
-
}
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI usage text. Extracted from the former monolithic `cli.ts`.
|
|
3
|
-
*/
|
|
4
|
-
export function usage(): string {
|
|
5
|
-
return [
|
|
6
|
-
'etiquette',
|
|
7
|
-
'',
|
|
8
|
-
'Govern agent-assisted engineering work with seats, evidence, and promotion gates.',
|
|
9
|
-
'',
|
|
10
|
-
'Start here:',
|
|
11
|
-
' etiquette setup [--target auto|codex|claude-code|gemini|all] [--project <path>] [--yes]',
|
|
12
|
-
' etiquette handoff [--project <path>] [--profile solo|lead-review|codex-cc-gemini] [--task-prefix <id>]',
|
|
13
|
-
' etiquette init [--project <path>]',
|
|
14
|
-
' etiquette bootstrap local [--project <path>] [--profile solo|lead-review|codex-cc-gemini] [--ask]',
|
|
15
|
-
' etiquette whereami [--project <path>] [--seat <id>] [--task <ref>] [--json]',
|
|
16
|
-
' etiquette doctor [--project <path>]',
|
|
17
|
-
' etiquette status [--project <path>]',
|
|
18
|
-
'',
|
|
19
|
-
'Daily work:',
|
|
20
|
-
' etiquette join --seat <id> [--project <path>] [--json]',
|
|
21
|
-
' etiquette pickup --seat <id> --task <ref> --expect-project-id <id> [--project <path>] [--text|--json]',
|
|
22
|
-
' etiquette enter <task> --seat <id> --operator <principal> [--project <path>]',
|
|
23
|
-
' etiquette session create --seat <id> --task <ref> [--project <path>]',
|
|
24
|
-
' etiquette notify poll --seat <id> [--project <path>] [--after-seq <n>] [--json]',
|
|
25
|
-
' etiquette notify webhook github --payload <file> --delivery <id> --event push --signature-256 <sha256=...> [--json]',
|
|
26
|
-
' etiquette return check --task <ref> --seat <id> [--remote-runner] [--project <path>] [--json]',
|
|
27
|
-
' etiquette retire <path> --reason <kind> --evidence-ref <ref> --removed-by <seat> [--project <path>]',
|
|
28
|
-
' etiquette diagnostics runner-glitch --symptom <text> [--session <id>] [--project <path>]',
|
|
29
|
-
' etiquette diagnostics no-return --task <ref> --seat <id> [--project <path>] [--json]',
|
|
30
|
-
' etiquette dispatch scaffold [--project <path>] [--task-id <id>] [--seat <id>] [--out <dir>]',
|
|
31
|
-
' etiquette dispatch check --mode <path> --task <path> [--project <path>] [--json]',
|
|
32
|
-
' etiquette dispatch record --mode <path> --task <path> [--project <path>] [--json]',
|
|
33
|
-
' etiquette bus view [--project <path>] [--lane <id>] [--seat <id>] [--since <n>] [--format text|json|markdown]',
|
|
34
|
-
' etiquette timeline view [--project <path>] [--scope project|seat|lane|principal] [--seat <id>] [--lane <id>]',
|
|
35
|
-
' etiquette timeline preview [--project <path>] [--scope project|seat|lane|principal] [--seat <id>] [--lane <id>] [--host 127.0.0.1] [--port 4174] # loopback only',
|
|
36
|
-
' etiquette ledger index|search|show ...',
|
|
37
|
-
'',
|
|
38
|
-
'Seats and readiness:',
|
|
39
|
-
' etiquette seat readiness --seat <id> [--project <path>] [--json]',
|
|
40
|
-
' etiquette seat status [--project <path>] [--json]',
|
|
41
|
-
' etiquette seat owner-card --manifest <path> [--project <path>] [--json]',
|
|
42
|
-
'',
|
|
43
|
-
'Management views:',
|
|
44
|
-
' etiquette console board [--project <path>] [--seat <id>] [--text]',
|
|
45
|
-
' etiquette console serve [--project <path>] [--host 127.0.0.1] [--port 4173]',
|
|
46
|
-
'',
|
|
47
|
-
'Release checks:',
|
|
48
|
-
' etiquette release readiness [--project <path>] [--json]',
|
|
49
|
-
' etiquette release ga-readiness [--project <path>] --channel <name> --verify-tag-remote <remote> [--json]',
|
|
50
|
-
'',
|
|
51
|
-
'Advanced surfaces:',
|
|
52
|
-
' etiquette help advanced',
|
|
53
|
-
' etiquette-core help',
|
|
54
|
-
'',
|
|
55
|
-
'Authority boundary:',
|
|
56
|
-
' commands can initialize, check, record evidence, and project read models;',
|
|
57
|
-
' they do not grant authority, merge, close work, publish, or promote truth.',
|
|
58
|
-
].join('\n');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function advancedUsage(): string {
|
|
62
|
-
return [
|
|
63
|
-
'etiquette advanced command catalog',
|
|
64
|
-
'',
|
|
65
|
-
'usage (supervision — Phase 1, etiquette/internal/docs/supervision/PHASE1.md):',
|
|
66
|
-
' discipline session-open <session-id> --campaign-root <path> --objective <text> --lead <seat> --responder <seat>',
|
|
67
|
-
' --escalation-owner <seat> --time-cap <minutes> --turn-cap <n> --source-ref a,b [--topic <text>] [--seat-manifest <path>]',
|
|
68
|
-
' discipline session-status <session-id> --campaign-root <path> [--json] [--seat-manifest <path>]',
|
|
69
|
-
' discipline turn-open <session-id> --campaign-root <path> --owner <seat> --action-class <class>',
|
|
70
|
-
' --max-duration <minutes> --allowed-command a,b --repo-root a,b --owned-path a,b',
|
|
71
|
-
' --forbidden-path a,b --verify-command a,b [--requires-human-approval]',
|
|
72
|
-
' [--projection-policy on_state_change|on_command_only] [--seat-manifest <path>]',
|
|
73
|
-
' discipline turn-close <session-id> --campaign-root <path> --turn <turn-id>',
|
|
74
|
-
' --result <done|blocked|handed_off|stopped|timed_out> --summary <text> [--evidence-ref a,b]',
|
|
75
|
-
' discipline session-command <session-id> <command> --campaign-root <path>',
|
|
76
|
-
' [--actor <seat>] [--payload <json>] [--seat-manifest <path>]',
|
|
77
|
-
' discipline session-project <session-id> --campaign-root <path>',
|
|
78
|
-
' discipline session-rebuild <session-id> --campaign-root <path>',
|
|
79
|
-
' discipline seat-validate [--manifest <path>]',
|
|
80
|
-
'',
|
|
81
|
-
'usage (memory spine — local-first, compact-then-exact):',
|
|
82
|
-
' etiquette memory index [--project <path>] [--db <path>] [--local-private] [--json]',
|
|
83
|
-
' etiquette memory index --export [<dir>] --org-id <opaque-id> --confirm-shared-export',
|
|
84
|
-
' [--workspace-id <opaque-id>] [--project <path>] [--db <path>] [--json]',
|
|
85
|
-
' etiquette memory search <query> [--project <path>] [--db <path>] [--limit <n>] [--json]',
|
|
86
|
-
' etiquette memory show <capsule-id> [--project <path>] [--db <path>]',
|
|
87
|
-
' etiquette memory preflight <lane-or-task> [--project <path>] [--db <path>] [--limit <n>] [--json]',
|
|
88
|
-
' etiquette memory context [<query>] [--lane <ref>] [--task <ref>] [--query <text>]',
|
|
89
|
-
' [--workspace-id <opaque-id>] [--org-id <opaque-id>] [--project <path>] [--db <path>] [--limit <n>] [--json]',
|
|
90
|
-
' etiquette memory status [--project <path>] [--db <path>] [--root <path>] [--json]',
|
|
91
|
-
' etiquette memory store init --store <id> --scope org|workspace|lane|seat|session --access read_only|read_write',
|
|
92
|
-
' [--mount-mode filesystem_like|context_pack|mcp_resource] [--write-policy none|candidate_only|curator_promoted]',
|
|
93
|
-
' [--project <path>] [--root <path>] [--at <iso8601>] [--json]',
|
|
94
|
-
' etiquette memory store add --store <id> --path <repo-relative> --content <text> --evidence <type:ref,...>',
|
|
95
|
-
' [--project <path>] [--root <path>] [--at <iso8601>] [--json]',
|
|
96
|
-
' etiquette memory store list [--project <path>] [--root <path>] [--json]',
|
|
97
|
-
' etiquette memory store show --store <id> [--project <path>] [--root <path>] [--json]',
|
|
98
|
-
' etiquette memory consolidate --input <store-id,...> --out <store-id> [--project <path>] [--root <path>] [--at <iso8601>] [--json]',
|
|
99
|
-
' etiquette memory drain-import --from-project <child-path> --from-store <id> --to-store <id>',
|
|
100
|
-
' [--project <parent-path>] [--from-root <path>] [--to-root <path>] [--source-ref <ref>] [--target-ref <ref>]',
|
|
101
|
-
' [--path-prefix <repo-relative>] [--receipt <path>] [--at <iso8601>] [--json]',
|
|
102
|
-
' etiquette memory sharded-drain-import --shard <id=child-path,...> --from-store <id> --to-store <id>',
|
|
103
|
-
' [--project <parent-path>] [--target-ref <ref>] [--receipt-dir <repo-dir>] [--receipt <path>] [--json]',
|
|
104
|
-
' etiquette memory stale [--project <path>] [--db <path>] [--limit <n>] [--json]',
|
|
105
|
-
' etiquette memory rejected [--project <path>] [--db <path>] [--limit <n>] [--json]',
|
|
106
|
-
'',
|
|
107
|
-
'usage (console v0 - read-only local management view):',
|
|
108
|
-
' etiquette console snapshot [--project <path>] [--json]',
|
|
109
|
-
' etiquette console board [--project <path>] [--seat <id>] [--text]',
|
|
110
|
-
' etiquette console serve [--project <path>] [--host 127.0.0.1] [--port 4173]',
|
|
111
|
-
'',
|
|
112
|
-
'usage (local workspace workflow v0 - repo-local onboarding, no hidden authority):',
|
|
113
|
-
' etiquette setup [--target auto|all|codex|claude-code|gemini] [--project <path>]',
|
|
114
|
-
' [--dry-run] [--force] [--eject] [--json]',
|
|
115
|
-
' etiquette handoff [--project <path>] [--profile solo|lead-review|codex-cc-gemini] [--task-prefix <id>] [--json]',
|
|
116
|
-
' etiquette init [--project <path>]',
|
|
117
|
-
' etiquette bootstrap local [--project <path>] [--profile solo|lead-review|codex-cc-gemini] [--ask]',
|
|
118
|
-
' [--task-prefix <id>] [--lead-seat <id>] [--lead-principal <id>]',
|
|
119
|
-
' [--review-seat <id>] [--review-principal <id>] [--qa-seat <id>] [--qa-principal <id>]',
|
|
120
|
-
' [--bootstrap-seat <id>] [--bootstrap-principal <id>] [--no-qa] [--force] [--json]',
|
|
121
|
-
' etiquette whereami [--project <path>] [--seat <id>] [--task <ref>] [--json]',
|
|
122
|
-
' etiquette join --seat <id> [--project <path>] [--json]',
|
|
123
|
-
' etiquette pickup --seat <id> --task <ref> [--project <path>] [--text|--json]',
|
|
124
|
-
' etiquette enter <task> --seat <id> --operator <principal> [--project <path>]',
|
|
125
|
-
' etiquette session create --seat <id> --task <ref> [--session-id <id>] [--operator <id>]',
|
|
126
|
-
' [--owner <id>] [--target-ref <ref>] [--creation-mode explicit|dynamic] [--project <path>] [--json]',
|
|
127
|
-
' etiquette session note --session <id> --section plan|tool|retry|evidence|note --message <text>',
|
|
128
|
-
' [--project <path>] [--json]',
|
|
129
|
-
' etiquette session migrate-project [--project <path>] [--dry-run] [--json]',
|
|
130
|
-
' etiquette audit append --actor <id> --action <id> [--project <path>] [--refs a,b]',
|
|
131
|
-
' etiquette roster card validate --card <path>',
|
|
132
|
-
' etiquette roster enroll <seat> --card <path> --operator-principal <id> --execution-seat <id>',
|
|
133
|
-
' --as-role <role> --authority-scope <scope> --mode <mode> --orientation-ref <path> [--project <path>]',
|
|
134
|
-
' etiquette roster ready <seat> --ack-ref <ref> --orientation-ref <path> [--project <path>]',
|
|
135
|
-
' etiquette roster list|show|posture <seat> [--project <path>] [--json]',
|
|
136
|
-
' etiquette roster doctor [--project <path>] [--cards <dir>] [--json]',
|
|
137
|
-
' etiquette post --role <role> --lane <id> --from <seat> --to <seat> [--changes-state true|false] [--emit] [--project <path>]',
|
|
138
|
-
' etiquette post --profile <path> --draft --out <path> [profile field flags] [--force]',
|
|
139
|
-
' etiquette notify subscribe --seat <id> --lane <id> [--roles a,b] [--project <path>]',
|
|
140
|
-
' etiquette notify feed --seat <id> [--project <path>] [--text]',
|
|
141
|
-
' etiquette notify poll --seat <id> [--project <path>] [--after-seq <n>] [--limit <n>] [--text|--json]',
|
|
142
|
-
' etiquette notify queue --seat <id> [--project <path>] [--text|--json]',
|
|
143
|
-
' etiquette notify webhook github --payload <file> --delivery <id> --event push --signature-256 <sha256=...>',
|
|
144
|
-
' [--secret-env ETIQUETTE_GITHUB_WEBHOOK_SECRET] [--text|--json]',
|
|
145
|
-
' etiquette return check --task <ref> --seat <id> [--role any|implementation-return|review-return]',
|
|
146
|
-
' [--tier local-advisory|remote-runner-hard-gate] [--remote-runner] [--project <path>] [--json]',
|
|
147
|
-
' etiquette retire <path> --reason superseded|rejected|closed|duplicate --evidence-ref <ref>',
|
|
148
|
-
' --removed-by <seat> [--superseded-by <path>] [--project <path>] [--json]',
|
|
149
|
-
' etiquette trash list|show|restore|rebuild ... [--project <path>] [--json]',
|
|
150
|
-
' etiquette rig doctor [--project <path>]',
|
|
151
|
-
' etiquette bus status [n] [--project <path>] [--text]',
|
|
152
|
-
' etiquette bus inbox --addressee <seat> [--project <path>] [--text]',
|
|
153
|
-
' etiquette bus view [--project <path>] [--lane <id>] [--seat <id>] [--role <role>]',
|
|
154
|
-
' [--since <n|local://event/n>] [--until <n|local://event/n>] [--match <text>]',
|
|
155
|
-
' [--kind all|events|packets] [--limit <n>] [--format text|json|markdown]',
|
|
156
|
-
' etiquette timeline view [--project <path>] [--scope project|seat|lane|principal] [--seat <id>] [--lane <id>]',
|
|
157
|
-
' [--since <n|local://event/n>] [--until <n|local://event/n>] [--match <text>] [--limit <n>]',
|
|
158
|
-
' [--format text|json|markdown]',
|
|
159
|
-
' etiquette timeline preview [--project <path>] [--scope project|seat|lane|principal] [--seat <id>] [--lane <id>]',
|
|
160
|
-
' [--since <n|local://event/n>] [--until <n|local://event/n>] [--match <text>] [--limit <n>]',
|
|
161
|
-
' [--host 127.0.0.1] [--port 4174] # loopback only',
|
|
162
|
-
' etiquette diagnostics runner-glitch --symptom <text> [--runner <id>] [--session <id>]',
|
|
163
|
-
' [--command-ref <summary>] [--severity info|warning|blocked] [--project <path>] [--json]',
|
|
164
|
-
' etiquette diagnostics no-return --task <ref> --seat <id> [--role any|implementation-return|review-return]',
|
|
165
|
-
' [--project <path>] [--json]',
|
|
166
|
-
' etiquette status [--project <path>]',
|
|
167
|
-
'',
|
|
168
|
-
'usage (ledger retrieval v0.1 - local generated index, compact-then-exact):',
|
|
169
|
-
' etiquette ledger index [--project <path>] [--db <path>] [--json]',
|
|
170
|
-
' etiquette ledger search <query> [--project <path>] [--db <path>] [--limit <n>] [--json]',
|
|
171
|
-
' etiquette ledger search --topic <slug> [--project <path>] [--db <path>] [--limit <n>] [--json]',
|
|
172
|
-
' etiquette ledger show <entry-or-ref-id> [--project <path>] [--db <path>]',
|
|
173
|
-
'',
|
|
174
|
-
'usage (hook adapter v0.1 — optional, disabled-by-default, opt in via ETIQUETTE_HOOKS_ENABLED=1):',
|
|
175
|
-
' etiquette hook session_start [--workspace <id>] [--payload <json>]',
|
|
176
|
-
' etiquette hook user_prompt_submit [--workspace <id>] [--payload <json>]',
|
|
177
|
-
' etiquette hook post_tool_use [--workspace <id>] [--payload <json>]',
|
|
178
|
-
' etiquette hook stop [--workspace <id>] [--payload <json>]',
|
|
179
|
-
' etiquette hook session_end [--workspace <id>] [--payload <json>]',
|
|
180
|
-
'',
|
|
181
|
-
'usage (harness maintenance v0 - pruning receipts, inventory, and canary checks; no deletion authority):',
|
|
182
|
-
' etiquette harness receipt --receipt <path> [--json]',
|
|
183
|
-
' etiquette harness inventory --manifest <path> [--project <path>] [--json]',
|
|
184
|
-
' etiquette harness canary --receipt <path> [--json]',
|
|
185
|
-
'',
|
|
186
|
-
'usage (rubric runner v0.1 - local sandbox evidence, no authority activation):',
|
|
187
|
-
' etiquette rubric validate --rubric <path> [--json]',
|
|
188
|
-
' etiquette rubric sandbox --rubric <path> --fixtures <path> --run-by <seat>',
|
|
189
|
-
' [--environment local|sandbox-isolated] [--at <iso8601>] [--receipt <path>] [--json]',
|
|
190
|
-
' etiquette rubric promote-check --rubric <path> --receipt <path>',
|
|
191
|
-
' [--policy <path>] [--grant-ref <ref>] [--json]',
|
|
192
|
-
'',
|
|
193
|
-
'usage (release readiness v0 - package/channel checks, no publish authority):',
|
|
194
|
-
' etiquette release channels [--json]',
|
|
195
|
-
' etiquette release readiness [--project <path>] [--json] [--fail-on-blocked]',
|
|
196
|
-
' etiquette release ga-readiness [--project <path>] --channel <name>',
|
|
197
|
-
' --verify-tag-remote <remote> [--json] [--fail-on-blocked]',
|
|
198
|
-
'',
|
|
199
|
-
'usage (infra runtime — source-only, not shipped in the local devkit):',
|
|
200
|
-
' runtime verifier cells, kube plans, and EKS provisioning belong to an infra/runtime workspace.',
|
|
201
|
-
'',
|
|
202
|
-
'usage (seat capability heartbeat v0.1 - local-first routing metadata):',
|
|
203
|
-
' etiquette seat readiness --seat <id> [--project <path>] [--state <path>]',
|
|
204
|
-
' [--seat-type control_seat|execution_seat|review_seat|seat_maintainer]',
|
|
205
|
-
' [--execution-surface <opaque-id>] [--capability-source config|local_validation|seat_doctor|agent_self_declared]',
|
|
206
|
-
' [--operational-status operational|degraded|blocked|offline]',
|
|
207
|
-
' [--model-tier lite_fast|balanced|frontier_high_reasoning|local_unknown] [--model-id <opaque-id>]',
|
|
208
|
-
' [--active-workers <n>] [--max-recommended-workers <n>] [--supports-parallel true|false]',
|
|
209
|
-
' [--supported-strategies a,b] [--unsupported-strategies a,b] [--constraints a,b] [--json]',
|
|
210
|
-
' etiquette seat heartbeat [--project <path>] [--state <path>] [--seat <id>]',
|
|
211
|
-
' [--operational-status operational|degraded|blocked|offline] [--active-workers <n>] [--constraints a,b] [--json]',
|
|
212
|
-
' etiquette seat status [--project <path>] [--state <path>] [--json]',
|
|
213
|
-
' etiquette seat owner-card --manifest <path> [--project <path>] [--state <path>] [--at <iso8601>] [--json]',
|
|
214
|
-
'',
|
|
215
|
-
'usage (workflow mode consumer v0.1 - advisory-only policy preset checks):',
|
|
216
|
-
' etiquette workflow validate --mode <path> [--json]',
|
|
217
|
-
' etiquette workflow explain <deliberative|expedient|mixed> [--json]',
|
|
218
|
-
' etiquette workflow check --mode <path> --task <path> [--json]',
|
|
219
|
-
'',
|
|
220
|
-
'usage (workspace authority v0 - personal-local, org-remote, runtime-cell roots):',
|
|
221
|
-
' etiquette workspace authority --profile <path> [--json]',
|
|
222
|
-
'',
|
|
223
|
-
'usage (operational dispatch consumer v0 - advisory wiring, no execution):',
|
|
224
|
-
' etiquette dispatch scaffold [--project <path>] [--task-id <id>] [--seat <id>] [--out <dir>] [--json]',
|
|
225
|
-
' etiquette dispatch check --mode <path> --task <path> [--project <path>] [--state <path>]',
|
|
226
|
-
' [--sandbox-receipt <path>] [--strategy <id>] [--at <iso8601>] [--json]',
|
|
227
|
-
' etiquette dispatch record --mode <path> --task <path> [--project <path>] [--state <path>]',
|
|
228
|
-
' [--sandbox-receipt <path>] [--strategy <id>] [--at <iso8601>] [--recorded-by <seat>] [--json]',
|
|
229
|
-
' etiquette dispatch projection --record <path> [--artifact-ref <ref>] [--receipt-ref <repo-ref>]',
|
|
230
|
-
' [--status success|partial|blocked|failed] [--validation-summary <text>] [--json]',
|
|
231
|
-
'',
|
|
232
|
-
'usage (local-remote sync outbox v0 - local staging only, no network):',
|
|
233
|
-
' etiquette sync stage [--project <path>] [--outbox <path>] [--workspace-id <opaque-id>]',
|
|
234
|
-
' [--org-id <opaque-id>] [--seat-id <opaque-id>] [--at <iso8601>] [--json]',
|
|
235
|
-
' etiquette sync join-plan --invite <path> --joined-by <seat> --claim-ref <ref>',
|
|
236
|
-
' [--at <iso8601>] [--json]',
|
|
237
|
-
' etiquette sync git-driver-status [--project <path>] [--driver-name etqseq] [--json]',
|
|
238
|
-
' etiquette sync install-git-merge-driver [--project <path>] [--driver-name etqseq]',
|
|
239
|
-
' [--driver-command <command>] [--skip-git-config] [--json]',
|
|
240
|
-
].join('\n');
|
|
241
|
-
}
|