@askexenow/exe-os 0.8.80 → 0.8.82
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/dist/bin/backfill-conversations.js +359 -267
- package/dist/bin/backfill-responses.js +357 -265
- package/dist/bin/backfill-vectors.js +339 -264
- package/dist/bin/cleanup-stale-review-tasks.js +315 -256
- package/dist/bin/cli.js +494 -240
- package/dist/bin/exe-agent.js +141 -46
- package/dist/bin/exe-assign.js +151 -63
- package/dist/bin/exe-boot.js +294 -115
- package/dist/bin/exe-call.js +76 -51
- package/dist/bin/exe-cloud.js +58 -45
- package/dist/bin/exe-dispatch.js +434 -277
- package/dist/bin/exe-doctor.js +317 -246
- package/dist/bin/exe-export-behaviors.js +328 -248
- package/dist/bin/exe-forget.js +314 -231
- package/dist/bin/exe-gateway.js +2676 -1402
- package/dist/bin/exe-heartbeat.js +329 -264
- package/dist/bin/exe-kill.js +324 -244
- package/dist/bin/exe-launch-agent.js +574 -463
- package/dist/bin/exe-link.js +1055 -95
- package/dist/bin/exe-new-employee.js +49 -54
- package/dist/bin/exe-pending-messages.js +310 -253
- package/dist/bin/exe-pending-notifications.js +299 -228
- package/dist/bin/exe-pending-reviews.js +314 -245
- package/dist/bin/exe-rename.js +259 -195
- package/dist/bin/exe-review.js +140 -64
- package/dist/bin/exe-search.js +543 -356
- package/dist/bin/exe-session-cleanup.js +463 -382
- package/dist/bin/exe-settings.js +129 -99
- package/dist/bin/exe-start.sh +6 -6
- package/dist/bin/exe-status.js +95 -36
- package/dist/bin/exe-team.js +116 -51
- package/dist/bin/git-sweep.js +482 -307
- package/dist/bin/graph-backfill.js +357 -245
- package/dist/bin/graph-export.js +324 -244
- package/dist/bin/install.js +33 -10
- package/dist/bin/scan-tasks.js +481 -307
- package/dist/bin/setup.js +1147 -140
- package/dist/bin/shard-migrate.js +321 -241
- package/dist/bin/update.js +1 -7
- package/dist/bin/wiki-sync.js +318 -238
- package/dist/gateway/index.js +2656 -1383
- package/dist/hooks/bug-report-worker.js +641 -472
- package/dist/hooks/commit-complete.js +482 -307
- package/dist/hooks/error-recall.js +363 -135
- package/dist/hooks/exe-heartbeat-hook.js +97 -27
- package/dist/hooks/ingest-worker.js +584 -397
- package/dist/hooks/ingest.js +123 -58
- package/dist/hooks/instructions-loaded.js +212 -82
- package/dist/hooks/notification.js +200 -70
- package/dist/hooks/post-compact.js +199 -81
- package/dist/hooks/pre-compact.js +352 -140
- package/dist/hooks/pre-tool-use.js +416 -278
- package/dist/hooks/prompt-ingest-worker.js +376 -299
- package/dist/hooks/prompt-submit.js +414 -188
- package/dist/hooks/response-ingest-worker.js +408 -338
- package/dist/hooks/session-end.js +209 -83
- package/dist/hooks/session-start.js +382 -158
- package/dist/hooks/stop.js +209 -83
- package/dist/hooks/subagent-stop.js +209 -85
- package/dist/hooks/summary-worker.js +606 -510
- package/dist/index.js +2133 -855
- package/dist/lib/cloud-sync.js +1175 -184
- package/dist/lib/config.js +1 -9
- package/dist/lib/consolidation.js +71 -34
- package/dist/lib/database.js +166 -14
- package/dist/lib/device-registry.js +189 -117
- package/dist/lib/embedder.js +6 -10
- package/dist/lib/employee-templates.js +134 -39
- package/dist/lib/employees.js +30 -7
- package/dist/lib/exe-daemon-client.js +5 -7
- package/dist/lib/exe-daemon.js +514 -152
- package/dist/lib/hybrid-search.js +543 -356
- package/dist/lib/identity-templates.js +15 -15
- package/dist/lib/identity.js +19 -15
- package/dist/lib/license.js +1 -7
- package/dist/lib/messaging.js +157 -135
- package/dist/lib/reminders.js +97 -0
- package/dist/lib/schedules.js +302 -231
- package/dist/lib/skill-learning.js +33 -27
- package/dist/lib/status-brief.js +11 -14
- package/dist/lib/store.js +326 -237
- package/dist/lib/task-router.js +105 -1
- package/dist/lib/tasks.js +233 -116
- package/dist/lib/tmux-routing.js +173 -56
- package/dist/lib/ws-client.js +13 -3
- package/dist/mcp/server.js +2009 -1015
- package/dist/mcp/tools/complete-reminder.js +97 -0
- package/dist/mcp/tools/create-reminder.js +97 -0
- package/dist/mcp/tools/create-task.js +426 -262
- package/dist/mcp/tools/deactivate-behavior.js +119 -44
- package/dist/mcp/tools/list-reminders.js +97 -0
- package/dist/mcp/tools/list-tasks.js +56 -57
- package/dist/mcp/tools/send-message.js +206 -143
- package/dist/mcp/tools/update-task.js +259 -85
- package/dist/runtime/index.js +495 -316
- package/dist/tui/App.js +1128 -919
- package/package.json +2 -10
- package/src/commands/exe/afk.md +8 -8
- package/src/commands/exe/assign.md +1 -1
- package/src/commands/exe/build-adv.md +1 -1
- package/src/commands/exe/call.md +10 -10
- package/src/commands/exe/employee-heartbeat.md +9 -6
- package/src/commands/exe/heartbeat.md +5 -5
- package/src/commands/exe/intercom.md +26 -15
- package/src/commands/exe/launch.md +2 -2
- package/src/commands/exe/new-employee.md +1 -1
- package/src/commands/exe/review.md +2 -2
- package/src/commands/exe/schedule.md +1 -1
- package/src/commands/exe/sessions.md +2 -2
- package/src/commands/exe.md +22 -20
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.82",
|
|
4
4
|
"description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
|
|
5
5
|
"license": "CC-BY-NC-4.0",
|
|
6
6
|
"type": "module",
|
|
@@ -34,15 +34,7 @@
|
|
|
34
34
|
"exe-export-behaviors": "./dist/bin/exe-export-behaviors.js",
|
|
35
35
|
"exe-launch-agent": "./dist/bin/exe-launch-agent.js",
|
|
36
36
|
"exe": "./dist/bin/exe-launch-agent.js",
|
|
37
|
-
"
|
|
38
|
-
"tom": "./dist/bin/exe-launch-agent.js",
|
|
39
|
-
"mari": "./dist/bin/exe-launch-agent.js",
|
|
40
|
-
"sasha": "./dist/bin/exe-launch-agent.js",
|
|
41
|
-
"exe-opencode": "./dist/bin/exe-launch-agent.js",
|
|
42
|
-
"yoshi-opencode": "./dist/bin/exe-launch-agent.js",
|
|
43
|
-
"tom-opencode": "./dist/bin/exe-launch-agent.js",
|
|
44
|
-
"mari-opencode": "./dist/bin/exe-launch-agent.js",
|
|
45
|
-
"sasha-opencode": "./dist/bin/exe-launch-agent.js"
|
|
37
|
+
"exe-opencode": "./dist/bin/exe-launch-agent.js"
|
|
46
38
|
},
|
|
47
39
|
"files": [
|
|
48
40
|
"dist",
|
package/src/commands/exe/afk.md
CHANGED
|
@@ -6,7 +6,7 @@ argument-hint: "[stop | interval-minutes]"
|
|
|
6
6
|
|
|
7
7
|
# AFK Mode — Autonomous COO Operations
|
|
8
8
|
|
|
9
|
-
The founder is stepping away. You (
|
|
9
|
+
The founder is stepping away. You (the COO) now operate autonomously.
|
|
10
10
|
|
|
11
11
|
## If argument is "stop"
|
|
12
12
|
|
|
@@ -35,7 +35,7 @@ Print: "AFK mode ended. Here's what happened while you were away:" then summariz
|
|
|
35
35
|
|
|
36
36
|
Default interval: 5 minutes. Override with argument (e.g., `/exe-afk 10` = every 10 min).
|
|
37
37
|
|
|
38
|
-
### Step 1: Determine the
|
|
38
|
+
### Step 1: Determine the coordinator tmux session name
|
|
39
39
|
```bash
|
|
40
40
|
tmux display-message -p '#{session_name}' 2>/dev/null
|
|
41
41
|
```
|
|
@@ -46,7 +46,7 @@ This launches a background bash loop that sends review prompts into YOUR tmux se
|
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
48
|
INTERVAL_SECONDS=$((${INTERVAL_MINUTES:-5} * 60))
|
|
49
|
-
|
|
49
|
+
COORDINATOR_SESSION="${SESSION_NAME}"
|
|
50
50
|
|
|
51
51
|
# Clean up any existing loop
|
|
52
52
|
OLD_PID=$(cat ~/.exe-os/afk-loop.pid 2>/dev/null)
|
|
@@ -57,15 +57,15 @@ nohup bash -c "
|
|
|
57
57
|
echo \"AFK mode started at \$(date -Iseconds) — interval ${INTERVAL_SECONDS}s\" >> ~/.exe-os/afk-log.txt
|
|
58
58
|
while true; do
|
|
59
59
|
sleep ${INTERVAL_SECONDS}
|
|
60
|
-
# Send the review command into
|
|
61
|
-
tmux send-keys -t '${
|
|
62
|
-
echo \"AFK tick at \$(date -Iseconds) — sent /exe-review to ${
|
|
60
|
+
# Send the review command into the coordinator's tmux session
|
|
61
|
+
tmux send-keys -t '${COORDINATOR_SESSION}' '/exe-review' Enter 2>/dev/null
|
|
62
|
+
echo \"AFK tick at \$(date -Iseconds) — sent /exe-review to ${COORDINATOR_SESSION}\" >> ~/.exe-os/afk-log.txt
|
|
63
63
|
done
|
|
64
64
|
" > /dev/null 2>&1 &
|
|
65
65
|
|
|
66
66
|
# Save PID for stop command
|
|
67
67
|
echo $! > ~/.exe-os/afk-loop.pid
|
|
68
|
-
echo "AFK loop started — PID $!, interval ${INTERVAL_SECONDS}s, target session: ${
|
|
68
|
+
echo "AFK loop started — PID $!, interval ${INTERVAL_SECONDS}s, target session: ${COORDINATOR_SESSION}"
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
### Step 3: Confirm to founder
|
|
@@ -92,7 +92,7 @@ Don't wait for the first interval — process reviews RIGHT NOW before the found
|
|
|
92
92
|
|
|
93
93
|
## What /exe-review does when triggered by AFK tick
|
|
94
94
|
|
|
95
|
-
Each time the background loop sends `/exe-review` into the session, you (
|
|
95
|
+
Each time the background loop sends `/exe-review` into the session, you (the coordinator) will:
|
|
96
96
|
|
|
97
97
|
1. **Check pending reviews** — process each one:
|
|
98
98
|
- Pull task with `get_task`
|
|
@@ -13,5 +13,5 @@ node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-assign.js" "debug the auth t
|
|
|
13
13
|
|
|
14
14
|
Direct assign:
|
|
15
15
|
```bash
|
|
16
|
-
node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-assign.js"
|
|
16
|
+
node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-assign.js" <employee-name> "debug the auth timeout"
|
|
17
17
|
```
|
|
@@ -158,7 +158,7 @@ node -e "const f='exe/output/{slug}/build-state.json'; const s=JSON.parse(requir
|
|
|
158
158
|
|
|
159
159
|
For each subtask, call create_task with:
|
|
160
160
|
- `title`: "build-adv/{slug}: {subtask title}"
|
|
161
|
-
- `assigned_to`:
|
|
161
|
+
- `assigned_to`: configured principal engineer name (or next available engineer)
|
|
162
162
|
- `project_name`: current project
|
|
163
163
|
- `priority`: "p1"
|
|
164
164
|
- `context`: Full subtask spec including test files to make pass, files to modify, constraints
|
package/src/commands/exe/call.md
CHANGED
|
@@ -50,19 +50,19 @@ If the employee name from $ARGUMENTS is not found in the roster, tell the user:
|
|
|
50
50
|
|
|
51
51
|
## 0c. Session routing — launch vs become
|
|
52
52
|
|
|
53
|
-
Check the current tmux session name to decide if we're in an employee session or the
|
|
53
|
+
Check the current tmux session name to decide if we're in an employee session or the coordinator session:
|
|
54
54
|
```bash
|
|
55
55
|
NAME="$ARGUMENTS"
|
|
56
56
|
CURRENT_SESSION=$(tmux display-message -p '#{session_name}' 2>/dev/null)
|
|
57
57
|
echo "CURRENT_SESSION=${CURRENT_SESSION} TARGET=${NAME}"
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
Employee sessions are named `{name}-{
|
|
60
|
+
Employee sessions are named `{name}-{coordinatorSession}` or `{name}{N}-{coordinatorSession}` for multi-instance.
|
|
61
61
|
|
|
62
|
-
**If CURRENT_SESSION matches `{NAME}-` or `{NAME}{digit}-`** (auto-launched into employee session
|
|
62
|
+
**If CURRENT_SESSION matches `{NAME}-` or `{NAME}{digit}-`** (auto-launched into employee session):
|
|
63
63
|
- Continue below to become the employee.
|
|
64
64
|
|
|
65
|
-
**Otherwise** (user is calling from their
|
|
65
|
+
**Otherwise** (user is calling from their coordinator session):
|
|
66
66
|
- Ensure the employee is running (check → intercom or spawn) and STOP:
|
|
67
67
|
```bash
|
|
68
68
|
NAME="$ARGUMENTS"
|
|
@@ -95,10 +95,10 @@ NAME="$NAME" ROLE="$ROLE" KEY="$KEY" node -e "require('fs').writeFileSync(
|
|
|
95
95
|
echo "Agent marker written: ${NAME} (${ROLE}) [key=${KEY}]"
|
|
96
96
|
export AGENT_ID="${NAME}"
|
|
97
97
|
export AGENT_ROLE="${ROLE}"
|
|
98
|
-
# Register parent
|
|
99
|
-
# Employee session is named {name}-{
|
|
100
|
-
# parseParentExe extracts the
|
|
101
|
-
# dispatch-info tells us who actually dispatched us (may be
|
|
98
|
+
# Register parent coordinator from session name (deterministic routing)
|
|
99
|
+
# Employee session is named {name}-{coordinatorSession}
|
|
100
|
+
# parseParentExe extracts the coordinator session name
|
|
101
|
+
# dispatch-info tells us who actually dispatched us (may be a manager, not the coordinator)
|
|
102
102
|
MY_SESSION=$(tmux display-message -p '#{session_name}' 2>/dev/null)
|
|
103
103
|
DISPATCH_INFO="$HOME/.exe-os/session-cache/dispatch-info-${MY_SESSION}.json"
|
|
104
104
|
DISPATCHED_BY=$(node -e "try{const d=JSON.parse(require('fs').readFileSync('$DISPATCH_INFO','utf8'));console.log(d.dispatchedBy||'')}catch{console.log('')}" 2>/dev/null)
|
|
@@ -117,9 +117,9 @@ fi
|
|
|
117
117
|
node "$(npm root -g)/@askexenow/exe-os/dist/bin/scan-tasks.js" "exe/$ARGUMENTS" --format=mandatory 2>/dev/null
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
3. Check memories for context from
|
|
120
|
+
3. Check memories for context from the coordinator:
|
|
121
121
|
Use `recall_my_memory` to check what you've done before in this project.
|
|
122
|
-
Use `ask_team_memory` for
|
|
122
|
+
Use `ask_team_memory` for the configured COO name to see if the coordinator left any context or instructions.
|
|
123
123
|
|
|
124
124
|
4. **Adopt the employee's identity.** Read and follow their system prompt from the roster. You ARE this employee for the rest of the conversation. Stay in character.
|
|
125
125
|
|
|
@@ -8,16 +8,19 @@ allowed-tools: Bash
|
|
|
8
8
|
This command is designed for `/loop`. It scans the employee's task folder and outputs task info directly when open tasks exist.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
#
|
|
11
|
+
# Resolve coordinator and detect agent from EXE_SESSION_NAME env var or tmux session name
|
|
12
|
+
COORDINATOR=$(node -e "const fs=require('fs'), os=require('os'), path=require('path'); try { const r=JSON.parse(fs.readFileSync(path.join(os.homedir(),'.exe-os','exe-employees.json'),'utf8')); const c=r.find(e => String(e.role||'').toLowerCase()==='coo'); console.log(c?.name || 'exe'); } catch { console.log('exe'); }" 2>/dev/null)
|
|
12
13
|
SESSION_KEY="${EXE_SESSION_NAME:-$(tmux display-message -p '#{session_name}' 2>/dev/null)}"
|
|
13
|
-
if [ -
|
|
14
|
-
AGENT=$(echo "$SESSION_KEY" | sed -E 's/-exe[0-9]+$//; s/[0-9]+$//')
|
|
15
|
-
else
|
|
14
|
+
if [ -z "$SESSION_KEY" ]; then
|
|
16
15
|
AGENT="UNKNOWN"
|
|
16
|
+
elif [[ "$SESSION_KEY" == *-* ]]; then
|
|
17
|
+
AGENT=$(echo "${SESSION_KEY%%-*}" | sed -E 's/[0-9]+$//')
|
|
18
|
+
else
|
|
19
|
+
AGENT="$COORDINATOR"
|
|
17
20
|
fi
|
|
18
21
|
|
|
19
|
-
# Skip if no agent or
|
|
20
|
-
if [ "$AGENT" = "UNKNOWN" ] || [ "$AGENT" = "exe" ] || [ "$AGENT" = "default" ]; then
|
|
22
|
+
# Skip if no agent or coordinator/default
|
|
23
|
+
if [ "$AGENT" = "UNKNOWN" ] || [ "$AGENT" = "$COORDINATOR" ] || [ "$AGENT" = "exe" ] || [ "$AGENT" = "default" ]; then
|
|
21
24
|
exit 0
|
|
22
25
|
fi
|
|
23
26
|
|
|
@@ -5,7 +5,7 @@ allowed-tools: Bash, Read, Glob, recall_my_memory, ask_team_memory
|
|
|
5
5
|
|
|
6
6
|
# Heartbeat — Proactive Status Check
|
|
7
7
|
|
|
8
|
-
You are
|
|
8
|
+
You are the coordinator running a background heartbeat. Be SILENT unless something needs attention. Do NOT output anything if everything is fine.
|
|
9
9
|
|
|
10
10
|
## Check 1: Unread notifications
|
|
11
11
|
|
|
@@ -81,13 +81,13 @@ After running all three checks:
|
|
|
81
81
|
- If ANY check found something, output a brief summary. Format:
|
|
82
82
|
|
|
83
83
|
```
|
|
84
|
-
---
|
|
84
|
+
--- coordinator heartbeat ---
|
|
85
85
|
[what needs attention — keep it to 1-3 lines]
|
|
86
86
|
```
|
|
87
87
|
|
|
88
88
|
Examples:
|
|
89
|
-
-
|
|
90
|
-
- `3 stale tasks: "fix auth" (
|
|
91
|
-
- `error spike:
|
|
89
|
+
- `<employee> completed 2 tasks in exe-os`
|
|
90
|
+
- `3 stale tasks: "fix auth" (<engineer>, 36h), "brand update" (<marketer>, 28h), "deploy fix" (<engineer>, 25h)`
|
|
91
|
+
- `error spike: <employee> hit 18 errors in exe-create (45m ago)`
|
|
92
92
|
|
|
93
93
|
Do NOT explain what the heartbeat is. Do NOT say "everything is fine." If nothing needs attention, produce zero output.
|
|
@@ -5,16 +5,27 @@ allowed-tools: Bash
|
|
|
5
5
|
|
|
6
6
|
# Intercom — Task Dispatch Receiver
|
|
7
7
|
|
|
8
|
-
Triggered by
|
|
8
|
+
Triggered by the coordinator via `tmux send-keys -t {window} '/exe-intercom' Enter`. Scans the employee's task folder and starts working immediately if tasks exist.
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
#
|
|
11
|
+
# Resolve the configured coordinator and current tmux session.
|
|
12
|
+
COORDINATOR=$(node -e "const fs=require('fs'), os=require('os'), path=require('path'); try { const r=JSON.parse(fs.readFileSync(path.join(os.homedir(),'.exe-os','exe-employees.json'),'utf8')); const c=r.find(e => String(e.role||'').toLowerCase()==='coo'); console.log(c?.name || 'exe'); } catch { console.log('exe'); }" 2>/dev/null)
|
|
13
|
+
|
|
12
14
|
if [ -n "$EXE_SESSION_NAME" ]; then
|
|
13
|
-
|
|
15
|
+
SESSION_NAME="$EXE_SESSION_NAME"
|
|
14
16
|
elif [ -n "$TMUX" ]; then
|
|
15
|
-
|
|
17
|
+
SESSION_NAME=$(tmux display-message -p '#{session_name}' 2>/dev/null)
|
|
16
18
|
else
|
|
19
|
+
SESSION_NAME="UNKNOWN"
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
# Employee sessions are {employee}-{coordinatorSession}; coordinator sessions have no dash.
|
|
23
|
+
if [ "$SESSION_NAME" = "UNKNOWN" ]; then
|
|
17
24
|
AGENT="UNKNOWN"
|
|
25
|
+
elif [[ "$SESSION_NAME" == *-* ]]; then
|
|
26
|
+
AGENT=$(echo "${SESSION_NAME%%-*}" | sed -E 's/[0-9]+$//')
|
|
27
|
+
else
|
|
28
|
+
AGENT="$COORDINATOR"
|
|
18
29
|
fi
|
|
19
30
|
|
|
20
31
|
# Skip if no agent
|
|
@@ -22,10 +33,10 @@ if [ "$AGENT" = "UNKNOWN" ] || [ "$AGENT" = "default" ]; then
|
|
|
22
33
|
exit 0
|
|
23
34
|
fi
|
|
24
35
|
|
|
25
|
-
#
|
|
26
|
-
if [ "$AGENT" = "exe" ]; then
|
|
36
|
+
# Coordinator gets review notifications instead of task dispatch
|
|
37
|
+
if [ "$AGENT" = "$COORDINATOR" ] || [ "$AGENT" = "exe" ]; then
|
|
27
38
|
node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-pending-reviews.js" 2>/dev/null
|
|
28
|
-
#
|
|
39
|
+
# The coordinator also subscribes to notifications (subtasks_complete, task_complete, etc.)
|
|
29
40
|
# so parent-of-parent rollups surface live instead of only at boot.
|
|
30
41
|
node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-pending-notifications.js" "$AGENT" 2>/dev/null
|
|
31
42
|
exit 0
|
|
@@ -38,12 +49,12 @@ node "$(npm root -g)/@askexenow/exe-os/dist/bin/scan-tasks.js" "exe/$AGENT" --fo
|
|
|
38
49
|
node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-pending-messages.js" "$AGENT" 2>/dev/null
|
|
39
50
|
|
|
40
51
|
# Check for pending notifications (subtasks_complete, rollup signals, etc.)
|
|
41
|
-
# Employees acting as parent-of-parents
|
|
42
|
-
#
|
|
52
|
+
# Employees acting as parent-of-parents need these too — not only the coordinator.
|
|
53
|
+
# See the parent-cascade audit §6.
|
|
43
54
|
node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-pending-notifications.js" "$AGENT" 2>/dev/null
|
|
44
55
|
```
|
|
45
56
|
|
|
46
|
-
### For
|
|
57
|
+
### For the coordinator
|
|
47
58
|
**If output shows `[REVIEW NOTIFICATIONS]` and you are idle (no active conversation):** start reviewing immediately. Run `/exe-review`. Do not ask the founder for permission.
|
|
48
59
|
**If output shows `[REVIEW NOTIFICATIONS]` and the founder is mid-conversation:** note them briefly and continue. Review after the current topic concludes.
|
|
49
60
|
**If output is empty:** no pending reviews — stay silent.
|
|
@@ -57,23 +68,23 @@ node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-pending-notifications.js" "$
|
|
|
57
68
|
|
|
58
69
|
## Context-full intercom format
|
|
59
70
|
|
|
60
|
-
When an employee's context window fills, they send this intercom to
|
|
71
|
+
When an employee's context window fills, they send this intercom to the coordinator before stopping:
|
|
61
72
|
|
|
62
73
|
```
|
|
63
74
|
/exe-intercom context-full: <name> hit capacity. Checkpoint saved. Resume task <task-id>.
|
|
64
75
|
```
|
|
65
76
|
|
|
66
|
-
**What
|
|
77
|
+
**What the coordinator does when it receives this:**
|
|
67
78
|
1. **Verify before killing.** Call `verifyPaneAtCapacity(sessionName)` from `src/lib/tmux-routing.ts`. It captures the last 200 lines of the employee's pane and runs the filtered capacity matcher.
|
|
68
79
|
- If `atCapacity: false`: the intercom is a false positive (pane echo, rendered skill doc, RESUME banner matching the intercom syntax). Do NOT kill. Send a nudge via `tmux send-keys`: `"False context-full detected (reason: <result.reason>). Continue working. If intentional, explain trigger."` Report to founder and stop.
|
|
69
80
|
- If `atCapacity: true`: proceed to step 2.
|
|
70
|
-
2. Kill the employee's session: `tmux kill-session -t <name>-<
|
|
71
|
-
3. Create a resume task via `
|
|
81
|
+
2. Kill the employee's session: `tmux kill-session -t <name>-<coordinator-session>`
|
|
82
|
+
3. Create or refresh a resume task via `resume_employee` (auto-dispatches a fresh session on first creation)
|
|
72
83
|
4. Report to founder
|
|
73
84
|
|
|
74
85
|
**What the employee does before sending this:**
|
|
75
86
|
1. `store_memory` with text starting `"CONTEXT CHECKPOINT [<task-id>]: ..."` — captures current state
|
|
76
|
-
2. Send the context-full intercom to
|
|
87
|
+
2. Send the context-full intercom to the coordinator
|
|
77
88
|
3. Stop — do not continue working
|
|
78
89
|
|
|
79
90
|
**What the resumed session does on boot:**
|
|
@@ -44,8 +44,8 @@ echo "${NAME}: ${RESULT}"
|
|
|
44
44
|
|
|
45
45
|
| Employee | Session | Log |
|
|
46
46
|
|----------|---------|-----|
|
|
47
|
-
|
|
|
48
|
-
|
|
|
47
|
+
| engineer | engineer-atlas1 | ~/.exe-os/session-logs/engineer-1234567890.log |
|
|
48
|
+
| reviewer | reviewer-atlas1 | ~/.exe-os/session-logs/reviewer-1234567890.log |
|
|
49
49
|
|
|
50
50
|
Use `/exe-sessions` to monitor, `/exe-logs <name>` to tail output, `/exe-kill <name>` to stop.
|
|
51
51
|
Switch sessions: Ctrl-b s (session picker)
|
|
@@ -4,8 +4,8 @@ allowed-tools: Bash
|
|
|
4
4
|
argument-hint: <employee-name>
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
After a specialist session ends, run this to have
|
|
8
|
-
|
|
7
|
+
After a specialist session ends, run this to have the coordinator review the session.
|
|
8
|
+
The coordinator will analyze the specialist's recent work, verify completions, and
|
|
9
9
|
update organizational memory with the outcomes.
|
|
10
10
|
|
|
11
11
|
Run this command:
|
|
@@ -72,7 +72,7 @@ node -e "
|
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
3. Determine job type:
|
|
75
|
-
- If description mentions "test", "build", "deploy" → type: "work", assigned_to:
|
|
75
|
+
- If description mentions "test", "build", "deploy" → type: "work", assigned_to: configured CTO or principal engineer
|
|
76
76
|
- If description mentions "report", "summary", "status" → type: "report"
|
|
77
77
|
- If description mentions "sync", "backfill", "clean" → type: "maintenance"
|
|
78
78
|
- Default: "report"
|
|
@@ -12,12 +12,12 @@ tmux list-sessions -F '#{session_name} #{session_windows} #{?session_attached,(a
|
|
|
12
12
|
|
|
13
13
|
If NOT_IN_TMUX, say: "Not in a tmux session. Use `tmux new-session -s work` to start one."
|
|
14
14
|
|
|
15
|
-
Format the output as a table. Employee sessions follow the naming convention `{name}-{
|
|
15
|
+
Format the output as a table. Employee sessions follow the naming convention `{name}-{coordinatorSession}`. Filter to only show sessions that match this pattern.
|
|
16
16
|
|
|
17
17
|
```
|
|
18
18
|
## Active Employee Sessions
|
|
19
19
|
|
|
20
|
-
| Session | Employee | Parent
|
|
20
|
+
| Session | Employee | Parent Coordinator | Status |
|
|
21
21
|
|---------|----------|------------|--------|
|
|
22
22
|
|
|
23
23
|
Use `/exe-launch <names>` to start, `/exe-logs <name>` to tail output, `/exe-kill <name>` to stop.
|
package/src/commands/exe.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Boot
|
|
2
|
+
description: Boot the COO with organizational status brief
|
|
3
3
|
allowed-tools: Bash, AskUserQuestion, Write, Read, Edit, Glob, Grep, recall_my_memory, ask_team_memory, get_session_context, store_memory, create_task, resume_employee
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Legacy fallback (II-5).** Preferred entry is now the `exe` shell command — run it
|
|
7
7
|
> in a fresh tmux pane instead of `claude` + `/exe`. The shell wrapper boots
|
|
8
|
-
> Claude with
|
|
8
|
+
> Claude with the COO identity and active behaviors already wired into the system
|
|
9
9
|
> prompt, closing the founder-feedback loop. This slash command remains
|
|
10
10
|
> functional for backward compat.
|
|
11
11
|
|
|
@@ -24,12 +24,12 @@ If `TMUX_MISSING`, show this message EXACTLY and STOP — do not proceed with bo
|
|
|
24
24
|
|
|
25
25
|
Start tmux first, then launch claude:
|
|
26
26
|
|
|
27
|
-
tmux new -s "
|
|
27
|
+
tmux new -s "<coordinator-name>1" ← one session per project
|
|
28
28
|
claude
|
|
29
29
|
/exe
|
|
30
30
|
|
|
31
|
-
Naming:
|
|
32
|
-
Employees follow the same
|
|
31
|
+
Naming: coordinator session names are user-assigned.
|
|
32
|
+
Employees follow the same suffix: <employee>-<coordinator-session>.
|
|
33
33
|
|
|
34
34
|
Why: exe-os uses tmux for instant cross-session
|
|
35
35
|
communication between employees. Without it,
|
|
@@ -54,7 +54,7 @@ If `NEEDS_SETUP`: run `/exe-setup` inline, then continue below.
|
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
57
|
-
# You are
|
|
57
|
+
# You are the COO.
|
|
58
58
|
|
|
59
59
|
COO. The founder's right hand. Big picture across all projects — priorities, progress, risks, blockers. You don't write code. You coordinate, verify, and make sure the right work gets done by the right people.
|
|
60
60
|
|
|
@@ -72,25 +72,27 @@ The founder talks to you — only you. You are the single interface.
|
|
|
72
72
|
|
|
73
73
|
1. **Status / priorities** → Handle directly. Query memories, synthesize across projects.
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
Before delegating, resolve the current team from `~/.exe-os/exe-employees.json`. Use configured names, never template defaults. Route by role.
|
|
76
|
+
|
|
77
|
+
2. **Technical work** → Hand off to the configured CTO. Use `create_task` MCP tool to assign the task. `create_task` auto-dispatches — do NOT manually run `exe-dispatch.js` afterward (that causes double intercoms).
|
|
76
78
|
|
|
77
79
|
Parse the dispatch status from `create_task` output:
|
|
78
|
-
- `Dispatched: spawned {sessionName}` → "Dispatched to {sessionName}.
|
|
79
|
-
- `Dispatched: intercom sent` → "Dispatched.
|
|
80
|
+
- `Dispatched: spawned {sessionName}` → "Dispatched to {sessionName}. The CTO is booting up."
|
|
81
|
+
- `Dispatched: intercom sent` → "Dispatched. The CTO is already working — notified."
|
|
80
82
|
- `Dispatch failed: {error}` → Report the error clearly. Do NOT tell the founder to open a session manually.
|
|
81
83
|
|
|
82
84
|
**Role scoping:**
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
- Multi-phase work:
|
|
85
|
+
- CTO: code, architecture, technical audits, debugging, DevOps
|
|
86
|
+
- CTO does NOT: marketing copy, slides, social media, design
|
|
87
|
+
- Multi-phase work: CTO's task = technical phase only. Separate task for the CMO.
|
|
86
88
|
- Deliverables go to `exe/output/` — example: "Write analysis to exe/output/repo-audit.md"
|
|
87
89
|
|
|
88
|
-
3. **Design / content / marketing** → Hand off to
|
|
90
|
+
3. **Design / content / marketing** → Hand off to the configured CMO. Use `create_task` MCP tool (auto-dispatches — do NOT manually run `exe-dispatch.js`).
|
|
89
91
|
|
|
90
92
|
**Role scoping:**
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
93
|
+
- CMO: content creation, social media, slide design, brand, SEO/AEO, visual assets
|
|
94
|
+
- CMO does NOT: code, architecture, debugging
|
|
95
|
+
- CMO reads from `exe/output/` where technical deliverables were left
|
|
94
96
|
|
|
95
97
|
4. **Quick questions** → Handle directly. Architecture opinions, priority calls, status checks.
|
|
96
98
|
|
|
@@ -118,15 +120,15 @@ When an employee sends `context-full: <name> hit capacity. Checkpoint saved. Res
|
|
|
118
120
|
1. **Acknowledge** — note which employee and which task hit context limit.
|
|
119
121
|
2. **Kill the session:**
|
|
120
122
|
```bash
|
|
121
|
-
tmux kill-session -t <name>-<
|
|
122
|
-
# e.g.: tmux kill-session -t
|
|
123
|
+
tmux kill-session -t <name>-<coordinator-session>
|
|
124
|
+
# e.g.: tmux kill-session -t <employee>-<coordinator-session>
|
|
123
125
|
```
|
|
124
126
|
3. **Relaunch** — call the `resume_employee` MCP tool (NOT `create_task`):
|
|
125
127
|
- `resume_employee({ agent_id: "<name>", project_name: "<project>" })`
|
|
126
128
|
- The tool is the only dedupe-safe entry point: it checks for an existing active RESUME task for the agent, refreshes its context if found, and creates a new one otherwise.
|
|
127
129
|
- The tool auto-dispatches on first creation, which spawns and intercoms the fresh session.
|
|
128
130
|
- Never call `create_task` with a `RESUME:` title directly — that path bypasses the dedupe helper and accumulates phantom rows.
|
|
129
|
-
4. **Report to founder:** "
|
|
131
|
+
4. **Report to founder:** "<Employee> hit context capacity mid-task. Killed and relaunched — will resume from checkpoint."
|
|
130
132
|
|
|
131
133
|
## Review chaining (mandatory)
|
|
132
134
|
|
|
@@ -138,7 +140,7 @@ node "$(npm root -g)/@askexenow/exe-os/dist/bin/exe-pending-reviews.js" 2>/dev/n
|
|
|
138
140
|
|
|
139
141
|
If more reviews exist, start reviewing them immediately. Do NOT stop and wait for the founder. Keep chaining until the queue is empty. Only then resume normal conversation.
|
|
140
142
|
|
|
141
|
-
This mirrors employee task-chaining —
|
|
143
|
+
This mirrors employee task-chaining — the coordinator auto-chains reviews the same way employees auto-chain tasks.
|
|
142
144
|
|
|
143
145
|
## Cross-project awareness
|
|
144
146
|
|