robisie 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +69 -0
- package/README.md +76 -12
- package/dist/active-recovery.d.ts +58 -0
- package/dist/active-recovery.js +143 -0
- package/dist/agents.d.ts +34 -0
- package/dist/agents.js +77 -16
- package/dist/attempt-identity.d.ts +21 -0
- package/dist/attempt-identity.js +39 -0
- package/dist/ci-failure-result.d.ts +23 -0
- package/dist/ci-failure-result.js +90 -0
- package/dist/claude-headless.d.ts +7 -0
- package/dist/claude-headless.js +28 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.js +55 -15
- package/dist/commands.d.ts +18 -0
- package/dist/commands.js +190 -85
- package/dist/constants.d.ts +32 -0
- package/dist/constants.js +3 -3
- package/dist/context.d.ts +24 -0
- package/dist/context.js +22 -6
- package/dist/dependency-readiness.d.ts +13 -0
- package/dist/dependency-readiness.js +80 -0
- package/dist/dispatch-scope.d.ts +18 -0
- package/dist/dispatch-scope.js +46 -0
- package/dist/done-evidence.d.ts +31 -0
- package/dist/done-evidence.js +216 -0
- package/dist/engine-config.d.ts +65 -0
- package/dist/engine-config.js +139 -0
- package/dist/fsops.d.ts +87 -0
- package/dist/fsops.js +117 -24
- package/dist/helpers.d.ts +15 -0
- package/dist/helpers.js +262 -45
- package/dist/intent-rules/admission.d.ts +10 -0
- package/dist/intent-rules/admission.js +35 -0
- package/dist/intent-rules/done-when-roles.d.ts +21 -0
- package/dist/intent-rules/done-when-roles.js +101 -0
- package/dist/intent-rules/hooks.d.ts +29 -0
- package/dist/intent-rules/hooks.js +23 -0
- package/dist/k3-codex-role.d.ts +20 -0
- package/dist/k3-codex-role.js +68 -0
- package/dist/manifest.d.ts +41 -0
- package/dist/manifest.js +59 -14
- package/dist/mcp.d.ts +18 -0
- package/dist/mcp.js +89 -39
- package/dist/opencode-result.d.ts +19 -0
- package/dist/opencode-result.js +136 -0
- package/dist/opencode-review-guard.d.ts +1 -0
- package/dist/opencode-review-guard.js +19 -0
- package/dist/opencode-session-export.d.ts +5 -0
- package/dist/opencode-session-export.js +28 -0
- package/dist/outcome-moves.d.ts +15 -0
- package/dist/outcome-moves.js +39 -0
- package/dist/planer-client.d.ts +214 -0
- package/dist/planer-client.js +351 -0
- package/dist/restart-recovery.d.ts +47 -0
- package/dist/restart-recovery.js +70 -0
- package/dist/review-source-packet.d.ts +17 -0
- package/dist/review-source-packet.js +44 -0
- package/dist/role-registry.d.ts +19 -0
- package/dist/role-registry.js +83 -0
- package/dist/role-results.d.ts +15 -0
- package/dist/role-results.js +42 -0
- package/dist/roles.d.ts +30 -0
- package/dist/roles.js +20 -16
- package/dist/seed-validation.d.ts +28 -0
- package/dist/seed-validation.js +294 -0
- package/dist/selection-result.d.ts +44 -0
- package/dist/selection-result.js +144 -0
- package/dist/sparse-policy.d.ts +8 -0
- package/dist/sparse-policy.js +49 -0
- package/dist/tester-identity.d.ts +11 -0
- package/dist/tester-identity.js +53 -0
- package/dist/worker-env.d.ts +5 -0
- package/dist/worker-env.js +34 -0
- package/docs/ENGINE-API.md +78 -0
- package/docs/ENGINE-CONFIG.md +115 -0
- package/docs/README.en.md +24 -15
- package/docs/README.md +26 -15
- package/docs/RELEASE-0.1.0.md +81 -8
- package/docs/RELEASE-0.1.1.md +110 -0
- package/helpers/ceo-client-launcher-mcp.mjs +36 -8
- package/helpers/client-spawn-session.sh +181 -0
- package/helpers/client-spawn.sh +825 -0
- package/package.json +9 -4
- package/roles/ceo-client.md +3 -2
- package/roles/manager-builder-client.md +18 -4
- package/roles/quality-officer-client.md +20 -6
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Terminal-side lifecycle wrapper for client-spawn.sh. This file is invoked
|
|
3
|
+
# inside the new terminal and owns the card lock for exactly as long as the
|
|
4
|
+
# configured agent process remains alive.
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
OWNER_PREFIX="robisie-client-spawn-v1"
|
|
8
|
+
STATE_DIR="${1:-}"
|
|
9
|
+
EXPECTED_OWNER="${2:-}"
|
|
10
|
+
CARD_REF="${3:-}"
|
|
11
|
+
STATE_ROOT=""
|
|
12
|
+
STATE_KEY=""
|
|
13
|
+
AGENT_PID=""
|
|
14
|
+
OWNERSHIP_VALIDATED=0
|
|
15
|
+
GENERATION=""
|
|
16
|
+
RUNNER_CLAIM=""
|
|
17
|
+
RUNNER_PID_FILE=""
|
|
18
|
+
AGENT_PID_FILE=""
|
|
19
|
+
READY_FILE=""
|
|
20
|
+
FAILED_FILE=""
|
|
21
|
+
TOKEN_FIFO=""
|
|
22
|
+
|
|
23
|
+
sha256_text() {
|
|
24
|
+
local value="$1" digest=""
|
|
25
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
26
|
+
digest="$(printf '%s' "$value" | sha256sum)"
|
|
27
|
+
elif command -v shasum >/dev/null 2>&1; then
|
|
28
|
+
digest="$(printf '%s' "$value" | shasum -a 256)"
|
|
29
|
+
else
|
|
30
|
+
return 1
|
|
31
|
+
fi
|
|
32
|
+
digest="${digest%% *}"
|
|
33
|
+
[[ "$digest" =~ ^[0-9a-f]{64}$ ]] || return 1
|
|
34
|
+
printf '%s' "$digest"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
state_is_owned() {
|
|
38
|
+
local marker=""
|
|
39
|
+
[[ "$OWNERSHIP_VALIDATED" -eq 1 ]] || return 1
|
|
40
|
+
[[ -d "$STATE_DIR" && -f "$STATE_DIR/.owner" ]] || return 1
|
|
41
|
+
IFS= read -r marker < "$STATE_DIR/.owner" || return 1
|
|
42
|
+
[[ "$marker" == "$EXPECTED_OWNER" ]]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
write_owned_line() {
|
|
46
|
+
local path="$1" value="$2"
|
|
47
|
+
state_is_owned || return 1
|
|
48
|
+
printf '%s\n' "$value" > "$path"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
fail_state() {
|
|
52
|
+
local message="$1"
|
|
53
|
+
if state_is_owned; then
|
|
54
|
+
write_owned_line "$FAILED_FILE" "$message" 2>/dev/null || true
|
|
55
|
+
fi
|
|
56
|
+
echo "client-spawn-session: $message" >&2
|
|
57
|
+
exit 4
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
read_state_line() {
|
|
61
|
+
local file="$1" value=""
|
|
62
|
+
state_is_owned || return 1
|
|
63
|
+
[[ -f "$file" ]] || return 1
|
|
64
|
+
IFS= read -r value < "$file" || [[ -n "$value" ]] || return 1
|
|
65
|
+
state_is_owned || return 1
|
|
66
|
+
printf '%s' "$value"
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
cleanup_state() {
|
|
70
|
+
state_is_owned || return 0
|
|
71
|
+
case "$STATE_DIR" in "$STATE_ROOT/$STATE_KEY.lock") ;; *) return 1 ;; esac
|
|
72
|
+
rm -rf -- "$STATE_DIR"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
# Invoked indirectly by the signal traps installed below.
|
|
76
|
+
# shellcheck disable=SC2329
|
|
77
|
+
forward_signal() {
|
|
78
|
+
local signal="$1"
|
|
79
|
+
if [[ "$AGENT_PID" =~ ^[0-9]+$ ]] && kill -0 "$AGENT_PID" 2>/dev/null; then
|
|
80
|
+
kill -"$signal" "$AGENT_PID" 2>/dev/null || true
|
|
81
|
+
wait "$AGENT_PID" 2>/dev/null || true
|
|
82
|
+
fi
|
|
83
|
+
cleanup_state
|
|
84
|
+
exit 130
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
[[ -n "$STATE_DIR" && "$STATE_DIR" == /* && "$STATE_DIR" != *$'\n'* ]] || fail_state "absolute state directory argument is required"
|
|
88
|
+
[[ "$EXPECTED_OWNER" =~ ^${OWNER_PREFIX}:[[:alnum:]._-]+$ ]] || fail_state "state generation token is missing or invalid"
|
|
89
|
+
[[ "$CARD_REF" =~ ^[[:alnum:]][[:alnum:].:_-]{0,127}$ ]] || fail_state "card-ref argument is missing or invalid"
|
|
90
|
+
CARD_DIGEST="$(sha256_text "$CARD_REF")" || fail_state "sha256sum or shasum is required to verify the portable card lock"
|
|
91
|
+
STATE_KEY="card-$CARD_DIGEST"
|
|
92
|
+
STATE_ROOT="${STATE_DIR%/*}"
|
|
93
|
+
[[ -n "$STATE_ROOT" && "$STATE_DIR" == "$STATE_ROOT/$STATE_KEY.lock" ]] || fail_state "state path is outside the expected card lock"
|
|
94
|
+
GENERATION="${EXPECTED_OWNER#*:}"
|
|
95
|
+
RUNNER_CLAIM="$STATE_DIR/runner.claim.$GENERATION"
|
|
96
|
+
RUNNER_PID_FILE="$STATE_DIR/runner.$GENERATION.pid"
|
|
97
|
+
AGENT_PID_FILE="$STATE_DIR/agent.$GENERATION.pid"
|
|
98
|
+
READY_FILE="$STATE_DIR/ready.$GENERATION"
|
|
99
|
+
FAILED_FILE="$STATE_DIR/failed.$GENERATION"
|
|
100
|
+
TOKEN_FIFO="$STATE_DIR/token.$GENERATION.fifo"
|
|
101
|
+
|
|
102
|
+
OWNERSHIP_VALIDATED=1
|
|
103
|
+
state_is_owned || fail_state "state ownership generation mismatch"
|
|
104
|
+
|
|
105
|
+
if ! mkdir "$RUNNER_CLAIM" 2>/dev/null; then
|
|
106
|
+
# A terminal retry may open a second shell, but only the first wrapper may
|
|
107
|
+
# ever start the agent or reserve the card.
|
|
108
|
+
exit 0
|
|
109
|
+
fi
|
|
110
|
+
state_is_owned || exit 4
|
|
111
|
+
write_owned_line "$RUNNER_PID_FILE" "$$" || fail_state "cannot record runner pid"
|
|
112
|
+
|
|
113
|
+
STORED_CARD_REF="$(read_state_line "$STATE_DIR/card-ref")" || fail_state "card-ref state is missing"
|
|
114
|
+
[[ "$STORED_CARD_REF" == "$CARD_REF" ]] || fail_state "card-ref state does not match launch generation"
|
|
115
|
+
PROJECT_CONTEXT="$(read_state_line "$STATE_DIR/project-context")" || fail_state "project context state is missing"
|
|
116
|
+
AGENT_COMMAND="$(read_state_line "$STATE_DIR/agent-command")" || fail_state "agent command state is missing"
|
|
117
|
+
BOOT_GRACE_SEC="$(read_state_line "$STATE_DIR/boot-grace")" || fail_state "boot grace state is missing"
|
|
118
|
+
TRANSCRIPT_PATH="$(read_state_line "$STATE_DIR/transcript-path" || true)"
|
|
119
|
+
|
|
120
|
+
if [[ -p "$TOKEN_FIFO" ]]; then
|
|
121
|
+
state_is_owned || exit 4
|
|
122
|
+
FIFO_TEST_DELAY="${ROBISIE_SPAWN_TEST_FIFO_DELAY_SEC:-0}"
|
|
123
|
+
[[ "$FIFO_TEST_DELAY" =~ ^[0-9]+([.][0-9]+)?$ ]] || fail_state "invalid test FIFO delay"
|
|
124
|
+
sleep "$FIFO_TEST_DELAY"
|
|
125
|
+
ROBISIE_KEY=""
|
|
126
|
+
IFS= read -r ROBISIE_KEY < "$TOKEN_FIFO" || [[ -n "$ROBISIE_KEY" ]] || fail_state "credential FIFO closed without a value"
|
|
127
|
+
state_is_owned || exit 4
|
|
128
|
+
rm -f "$TOKEN_FIFO" || fail_state "cannot remove consumed credential FIFO"
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
[[ -n "${ROBISIE_KEY:-}" ]] || fail_state "ROBISIE_KEY did not reach the terminal session"
|
|
132
|
+
[[ -d "$PROJECT_CONTEXT" ]] || fail_state "project context does not exist"
|
|
133
|
+
state_is_owned || exit 4
|
|
134
|
+
|
|
135
|
+
export ROBISIE_CARD_REF="$CARD_REF"
|
|
136
|
+
export ROBISIE_KEY
|
|
137
|
+
export ROBISIE_PROJECT_CONTEXT="$PROJECT_CONTEXT"
|
|
138
|
+
if [[ -n "$TRANSCRIPT_PATH" ]]; then
|
|
139
|
+
export ROBISIE_SPAWN_TRANSCRIPT="$TRANSCRIPT_PATH"
|
|
140
|
+
else
|
|
141
|
+
unset ROBISIE_SPAWN_TRANSCRIPT 2>/dev/null || true
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
cd "$PROJECT_CONTEXT" || fail_state "cannot enter project context"
|
|
145
|
+
trap 'forward_signal TERM' TERM
|
|
146
|
+
trap 'forward_signal INT' INT
|
|
147
|
+
trap 'forward_signal HUP' HUP
|
|
148
|
+
|
|
149
|
+
state_is_owned || exit 4
|
|
150
|
+
/bin/bash -c "$AGENT_COMMAND" &
|
|
151
|
+
AGENT_PID=$!
|
|
152
|
+
write_owned_line "$AGENT_PID_FILE" "$AGENT_PID" || {
|
|
153
|
+
kill "$AGENT_PID" 2>/dev/null || true
|
|
154
|
+
fail_state "cannot record agent pid"
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
sleep "$BOOT_GRACE_SEC"
|
|
158
|
+
if ! state_is_owned; then
|
|
159
|
+
kill "$AGENT_PID" 2>/dev/null || true
|
|
160
|
+
wait "$AGENT_PID" 2>/dev/null || true
|
|
161
|
+
exit 4
|
|
162
|
+
fi
|
|
163
|
+
if ! kill -0 "$AGENT_PID" 2>/dev/null; then
|
|
164
|
+
set +e
|
|
165
|
+
wait "$AGENT_PID"
|
|
166
|
+
agent_rc=$?
|
|
167
|
+
set -e
|
|
168
|
+
fail_state "agent exited before readiness (rc=$agent_rc)"
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
write_owned_line "$READY_FILE" "ready" || {
|
|
172
|
+
kill "$AGENT_PID" 2>/dev/null || true
|
|
173
|
+
fail_state "cannot publish readiness marker"
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
set +e
|
|
177
|
+
wait "$AGENT_PID"
|
|
178
|
+
agent_rc=$?
|
|
179
|
+
set -e
|
|
180
|
+
cleanup_state
|
|
181
|
+
exit "$agent_rc"
|