@monoes/monomindcli 2.16.3 → 2.16.4
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/.claude/commands/mastermind/createorg.md +2 -2
- package/.claude/commands/mastermind/help.md +5 -11
- package/.claude/commands/mastermind/master.md +1 -2
- package/.claude/commands/mastermind/orgs.md +1 -1
- package/.claude/commands/mastermind/orgstatus.md +1 -1
- package/.claude/commands/mastermind/runorg.md +2 -2
- package/.claude/commands/mastermind/stoporg.md +7 -11
- package/.claude/helpers/agent-registry.cjs +434 -0
- package/.claude/helpers/handlers/pick-core.cjs +20 -2
- package/.claude/helpers/handlers/session-restore-handler.cjs +4 -1
- package/.claude/helpers/jev-catalog.cjs +7 -3
- package/.claude/helpers/jev-picker.cjs +3 -1
- package/.claude/helpers/pick-rank.cjs +90 -4
- package/.claude/skills/mastermind-agents/SKILL.md +31 -38
- package/.claude/skills/mastermind-createorg/SKILL.md +3 -3
- package/.claude/skills/mastermind-env/SKILL.md +4 -18
- package/.claude/skills/mastermind-inbox/SKILL.md +31 -52
- package/.claude/skills/mastermind-instance/SKILL.md +7 -5
- package/.claude/skills/mastermind-new-agent/SKILL.md +3 -3
- package/.claude/skills/mastermind-org-settings/SKILL.md +3 -4
- package/.claude/skills/mastermind-orgs/SKILL.md +26 -32
- package/.claude/skills/mastermind-orgstatus/SKILL.md +49 -140
- package/.claude/skills/mastermind-runorg/SKILL.md +13 -13
- package/.claude/skills/mastermind-stoporg/SKILL.md +7 -62
- package/.claude/skills/mastermind-tasks/SKILL.md +6 -8
- package/README.md +28 -43
- package/dist/src/agents/registry-builder.d.ts +57 -21
- package/dist/src/agents/registry-builder.d.ts.map +1 -1
- package/dist/src/agents/registry-builder.js +41 -341
- package/dist/src/agents/registry-builder.js.map +1 -1
- package/dist/src/agents/registry-freshness.d.ts +4 -4
- package/dist/src/agents/registry-freshness.d.ts.map +1 -1
- package/dist/src/agents/registry-freshness.js +11 -60
- package/dist/src/agents/registry-freshness.js.map +1 -1
- package/dist/src/commands/doc.d.ts.map +1 -1
- package/dist/src/commands/doc.js +6 -15
- package/dist/src/commands/doc.js.map +1 -1
- package/dist/src/commands/doctor-pick-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-pick-checks.js +9 -41
- package/dist/src/commands/doctor-pick-checks.js.map +1 -1
- package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-project-checks.js +7 -5
- package/dist/src/commands/doctor-project-checks.js.map +1 -1
- package/dist/src/commands/hooks-routing-commands.d.ts.map +1 -1
- package/dist/src/commands/hooks-routing-commands.js +4 -3
- package/dist/src/commands/hooks-routing-commands.js.map +1 -1
- package/dist/src/commands/init-upgrade.d.ts.map +1 -1
- package/dist/src/commands/init-upgrade.js +4 -0
- package/dist/src/commands/init-upgrade.js.map +1 -1
- package/dist/src/commands/init-wizard.d.ts.map +1 -1
- package/dist/src/commands/init-wizard.js +7 -2
- package/dist/src/commands/init-wizard.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +16 -27
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +16 -21
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/commands/org.js +1 -1
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/decision/jev.d.ts +4 -0
- package/dist/src/decision/jev.d.ts.map +1 -1
- package/dist/src/decision/jev.js.map +1 -1
- package/dist/src/decision/pick-real.d.ts +93 -0
- package/dist/src/decision/pick-real.d.ts.map +1 -0
- package/dist/src/decision/pick-real.js +253 -0
- package/dist/src/decision/pick-real.js.map +1 -0
- package/dist/src/decision/picks.d.ts +1 -0
- package/dist/src/decision/picks.d.ts.map +1 -1
- package/dist/src/decision/picks.js +1 -0
- package/dist/src/decision/picks.js.map +1 -1
- package/dist/src/init/embeddings-step.d.ts +23 -0
- package/dist/src/init/embeddings-step.d.ts.map +1 -0
- package/dist/src/init/embeddings-step.js +53 -0
- package/dist/src/init/embeddings-step.js.map +1 -0
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +9 -1
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +4 -0
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/project-indexes.d.ts +19 -0
- package/dist/src/init/project-indexes.d.ts.map +1 -0
- package/dist/src/init/project-indexes.js +44 -0
- package/dist/src/init/project-indexes.js.map +1 -0
- package/dist/src/init/shared.d.ts +7 -2
- package/dist/src/init/shared.d.ts.map +1 -1
- package/dist/src/init/shared.js +7 -6
- package/dist/src/init/shared.js.map +1 -1
- package/dist/src/init/types.d.ts +13 -2
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +11 -3
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/init/upgrade.d.ts +3 -0
- package/dist/src/init/upgrade.d.ts.map +1 -1
- package/dist/src/init/upgrade.js +21 -6
- package/dist/src/init/upgrade.js.map +1 -1
- package/dist/src/init/write-antigravity.d.ts +1 -0
- package/dist/src/init/write-antigravity.d.ts.map +1 -1
- package/dist/src/init/write-antigravity.js +19 -1
- package/dist/src/init/write-antigravity.js.map +1 -1
- package/dist/src/init/write-claude.d.ts.map +1 -1
- package/dist/src/init/write-claude.js +8 -5
- package/dist/src/init/write-claude.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +14 -5
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +4 -3
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph/build-tools.js +16 -9
- package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -1
- package/dist/src/memory/embedding-operations.d.ts +0 -4
- package/dist/src/memory/embedding-operations.d.ts.map +1 -1
- package/dist/src/memory/embedding-operations.js +11 -85
- package/dist/src/memory/embedding-operations.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +7 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +15 -0
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/orgrt/bash-timeout.d.ts +17 -0
- package/dist/src/orgrt/bash-timeout.d.ts.map +1 -1
- package/dist/src/orgrt/bash-timeout.js +15 -0
- package/dist/src/orgrt/bash-timeout.js.map +1 -1
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +5 -2
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/task-match.d.ts +3 -1
- package/dist/src/orgrt/task-match.d.ts.map +1 -1
- package/dist/src/orgrt/task-match.js +12 -4
- package/dist/src/orgrt/task-match.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mastermind-orgs
|
|
3
|
-
description: Mastermind orgs — list all saved orgs with their status, schedule, and last
|
|
3
|
+
description: Mastermind orgs — list all saved orgs with their runtime status, schedule, and last run time. Flags crashed runs and config files still in the legacy format.
|
|
4
4
|
type: domain-skill
|
|
5
5
|
default_mode: auto
|
|
6
6
|
pick: low
|
|
@@ -43,10 +43,12 @@ fi
|
|
|
43
43
|
|
|
44
44
|
## Step 2 — Render Org Table
|
|
45
45
|
|
|
46
|
-
For each org file (skip state/approvals files), extract and display.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
For each org file (skip state/approvals files), extract and display. An org
|
|
47
|
+
carries `schedule` ("30m"/"2h") in the config and its live state in
|
|
48
|
+
`.monomind/orgs/<name>/runtime.json`. A config file with a `.loop` block is in
|
|
49
|
+
the legacy format — `monomind org run` converts it in memory (its
|
|
50
|
+
`loop.poll_interval_minutes` becomes the schedule), and `monomind org migrate
|
|
51
|
+
<name>` rewrites the file.
|
|
50
52
|
|
|
51
53
|
```bash
|
|
52
54
|
echo ""
|
|
@@ -59,34 +61,25 @@ for f in $orgFiles; do
|
|
|
59
61
|
schedule=$(jq -r '.schedule // empty' "$f" 2>/dev/null)
|
|
60
62
|
loop_interval=$(jq -r '.loop.poll_interval_minutes // empty' "$f" 2>/dev/null)
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
last_run=$(jq -r '.updated // "—"' "$rt" 2>/dev/null | sed 's/T/ /;s/\..*Z//' || echo "—")
|
|
64
|
+
# legacy-format config: the runtime turns loop.poll_interval_minutes into the schedule
|
|
65
|
+
[ -z "$schedule" ] && [ -n "$loop_interval" ] && schedule="${loop_interval}m"
|
|
66
|
+
interval="${schedule:-manual}"
|
|
67
|
+
[ -n "$loop_interval" ] && interval="${interval} (legacy)"
|
|
68
|
+
|
|
69
|
+
# live state is in runtime.json (crashed = running record, dead pid)
|
|
70
|
+
rt=".monomind/orgs/${name}/runtime.json"
|
|
71
|
+
rt_status=$(jq -r '.status // "never run"' "$rt" 2>/dev/null || echo "never run")
|
|
72
|
+
rt_pid=$(jq -r '.pid // 0' "$rt" 2>/dev/null || echo 0)
|
|
73
|
+
if [ "$rt_status" = "running" ] && [ "$rt_pid" -gt 0 ] && ! kill -0 "$rt_pid" 2>/dev/null; then
|
|
74
|
+
indicator="✗ crashed"
|
|
75
|
+
elif [ "$rt_status" = "running" ]; then
|
|
76
|
+
indicator="● running"
|
|
77
|
+
elif [ "$rt_status" = "never run" ]; then
|
|
78
|
+
indicator="· never run"
|
|
78
79
|
else
|
|
79
|
-
|
|
80
|
-
# legacy v1 scheduled org — state lives in the config's status field
|
|
81
|
-
interval="${loop_interval}m (v1)"
|
|
82
|
-
status=$(jq -r '.status // "—"' "$f" 2>/dev/null)
|
|
83
|
-
case "$status" in
|
|
84
|
-
active) indicator="● active" ;;
|
|
85
|
-
paused) indicator="⏸ paused" ;;
|
|
86
|
-
*) indicator="○ stopped" ;;
|
|
87
|
-
esac
|
|
88
|
-
last_run=$(jq -r '.loop.last_run // "—"' "$f" 2>/dev/null | sed 's/T/ /;s/Z//')
|
|
80
|
+
indicator="○ ${rt_status}"
|
|
89
81
|
fi
|
|
82
|
+
last_run=$(jq -r '.updated // "—"' "$rt" 2>/dev/null | sed 's/T/ /;s/\..*Z//' || echo "—")
|
|
90
83
|
|
|
91
84
|
printf "%-28s %-14s %-12s %-22s\n" "$name" "$indicator" "$interval" "$last_run"
|
|
92
85
|
echo " └ $goal"
|
|
@@ -108,7 +101,8 @@ COMMANDS
|
|
|
108
101
|
monomind org validate [name] Check config against the runtime schema
|
|
109
102
|
/mastermind:orgstatus --org <name> Detailed status, last runs, activity
|
|
110
103
|
/mastermind:createorg <goal> Create a new org
|
|
111
|
-
/mastermind:runorg --org <name>
|
|
104
|
+
/mastermind:runorg --org <name> Validate and start an org (converts legacy-format configs first)
|
|
105
|
+
monomind org migrate <name> Convert a legacy-format config file
|
|
112
106
|
```
|
|
113
107
|
|
|
114
108
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mastermind-orgstatus
|
|
3
|
-
description: Mastermind orgstatus — show detailed status for a single org including
|
|
3
|
+
description: Mastermind orgstatus — show detailed status for a single org including runtime state, schedule, config health, pending approvals, recent activity, and roles.
|
|
4
4
|
type: domain-skill
|
|
5
5
|
default_mode: auto
|
|
6
6
|
pick: low
|
|
@@ -40,32 +40,20 @@ orgFile=".monomind/orgs/${org_name}.json"
|
|
|
40
40
|
|
|
41
41
|
## Step 2 — Extract Fields
|
|
42
42
|
|
|
43
|
-
An org is
|
|
44
|
-
`.
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
An org's schedule is the top-level `schedule` field and its live state is
|
|
44
|
+
`.monomind/orgs/<name>/runtime.json`. A config file that still carries
|
|
45
|
+
`topology`, `board_id`, `loop`, or `agent_type` on roles is in the legacy
|
|
46
|
+
format: `monomind org run` converts it in memory (with a deprecation warning),
|
|
47
|
+
and `monomind org migrate <name>` rewrites the file.
|
|
47
48
|
|
|
48
49
|
```bash
|
|
49
50
|
name=$(jq -r '.name // "(unnamed)"' "$orgFile")
|
|
50
51
|
goal=$(jq -r '.goal // "(no goal set)"' "$orgFile")
|
|
51
|
-
status=$(jq -r '.status // "no-schedule"' "$orgFile")
|
|
52
52
|
role_count=$(jq '.roles | length' "$orgFile")
|
|
53
53
|
created_at=$(jq -r '.created_at // "-"' "$orgFile")
|
|
54
|
-
|
|
55
|
-
has_schedule=$(jq -r 'if .loop.poll_interval_minutes then "yes" else "no" end' "$orgFile")
|
|
56
|
-
|
|
57
|
-
# v2 fields
|
|
58
|
-
is_v2=$([ "$has_schedule" = "no" ] && echo yes || echo no)
|
|
59
|
-
v2_schedule=$(jq -r '.schedule // empty' "$orgFile")
|
|
54
|
+
schedule=$(jq -r '.schedule // empty' "$orgFile")
|
|
60
55
|
budget=$(jq -r '.run_config.budget_tokens // 1000000' "$orgFile")
|
|
61
|
-
|
|
62
|
-
# LEGACY-ORG-V1: remove this block when v1 orgs are gone
|
|
63
|
-
# v1 loop fields (legacy scheduled orgs only)
|
|
64
|
-
poll_interval=$(jq -r '.loop.poll_interval_minutes // ""' "$orgFile")
|
|
65
|
-
last_run=$(jq -r '.loop.last_run // "never"' "$orgFile")
|
|
66
|
-
next_run=$(jq -r '.loop.next_run // "not scheduled"' "$orgFile")
|
|
67
|
-
run_prompt_file=$(jq -r '.loop.run_prompt_file // ""' "$orgFile")
|
|
68
|
-
# end LEGACY-ORG-V1 loop-fields block
|
|
56
|
+
legacy_format=$(jq -r 'if has("topology") or has("board_id") or has("loop") or ([.roles[]? | has("agent_type")] | any) then "yes" else "no" end' "$orgFile")
|
|
69
57
|
|
|
70
58
|
rtFile=".monomind/orgs/${org_name}/runtime.json"
|
|
71
59
|
rt_status=$(jq -r '.status // "never run"' "$rtFile" 2>/dev/null || echo "never run")
|
|
@@ -90,88 +78,36 @@ echo " Created: $created_at"
|
|
|
90
78
|
echo " Roles: $role_count"
|
|
91
79
|
echo ""
|
|
92
80
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
echo ""
|
|
101
|
-
fi
|
|
102
|
-
|
|
103
|
-
# LEGACY-ORG-V1: remove this block when v1 orgs are gone
|
|
104
|
-
if [ "$has_schedule" = "yes" ]; then
|
|
105
|
-
echo "SCHEDULED LOOP"
|
|
106
|
-
echo "──────────────"
|
|
107
|
-
|
|
108
|
-
case "$status" in
|
|
109
|
-
active) echo " Status: ● ACTIVE — loop is running" ;;
|
|
110
|
-
stopped) echo " Status: ○ STOPPED — loop is not running" ;;
|
|
111
|
-
paused) echo " Status: ⏸ PAUSED — loop is alive but skipping iterations (HIL gate)" ;;
|
|
112
|
-
*) echo " Status: ? $status" ;;
|
|
113
|
-
esac
|
|
114
|
-
|
|
115
|
-
echo " Interval: every ${poll_interval} minutes"
|
|
116
|
-
echo " Last run: $last_run"
|
|
117
|
-
echo " Next run: $next_run"
|
|
118
|
-
echo " Prompt: $run_prompt_file"
|
|
119
|
-
echo ""
|
|
120
|
-
fi
|
|
81
|
+
echo "RUNTIME"
|
|
82
|
+
echo "───────"
|
|
83
|
+
echo " Status: $rt_status${rt_run:+ (run $rt_run)}"
|
|
84
|
+
echo " Updated: $rt_updated"
|
|
85
|
+
echo " Schedule: ${schedule:-manual — run with: monomind org run $name}"
|
|
86
|
+
echo " Budget: $budget tokens (split across roles)"
|
|
87
|
+
echo ""
|
|
121
88
|
|
|
122
89
|
echo "ROLES"
|
|
123
90
|
echo "─────"
|
|
124
|
-
jq -r '(.roles // [])[] | " • [\(.id)] \(.title // .id) → \(.
|
|
91
|
+
jq -r '(.roles // [])[] | " • [\(.id)] \(.title // .id) → \(.type // .agent_type // "specialist") (reports to: \(.reports_to // "top"))"' "$orgFile"
|
|
125
92
|
echo ""
|
|
126
93
|
|
|
127
94
|
echo "HEALTH"
|
|
128
95
|
echo "──────"
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
else
|
|
145
|
-
echo " Board: ✗ task board IDs missing — re-run /mastermind:createorg --name ${name} to rebuild"
|
|
146
|
-
fi
|
|
147
|
-
fi
|
|
148
|
-
|
|
149
|
-
# LEGACY-ORG-V1: remove this branch when v1 orgs are gone
|
|
150
|
-
# Pending approvals
|
|
151
|
-
approvalsFile=".monomind/orgs/${org_name}-approvals.json"
|
|
152
|
-
if [ -f "$approvalsFile" ]; then
|
|
153
|
-
pending=$(jq '(.approvals // []) | map(select(.status == "pending")) | length' "$approvalsFile")
|
|
154
|
-
[ "$pending" -gt 0 ] \
|
|
155
|
-
&& echo " Approvals: ⚠ ${pending} pending — /mastermind:approvev1 --org ${name} --action list" \
|
|
156
|
-
|| echo " Approvals: ✓ none pending"
|
|
157
|
-
else
|
|
158
|
-
echo " Approvals: ✓ no approvals file"
|
|
159
|
-
fi
|
|
160
|
-
|
|
161
|
-
# Stop file (pending stop signal) — v2 daemons poll <org>/stop; v1 used .stops/
|
|
162
|
-
[ -f ".monomind/orgs/${org_name}/stop" ] && echo " Stop file: ⚠ PRESENT (v2) — daemon will exit within 2s of seeing it"
|
|
163
|
-
# LEGACY-ORG-V1: remove this check when v1 orgs are gone
|
|
164
|
-
[ -f ".monomind/orgs/.stops/${org_name}.stop" ] && echo " Stop file: ⚠ PRESENT (v1 legacy path)"
|
|
165
|
-
|
|
166
|
-
# LEGACY-ORG-V1: remove this block when v1 orgs are gone
|
|
167
|
-
# Loop prompt file (scheduled orgs)
|
|
168
|
-
if [ "$has_schedule" = "yes" ]; then
|
|
169
|
-
if [ -n "$run_prompt_file" ] && [ -f "$run_prompt_file" ]; then
|
|
170
|
-
echo " Loop prompt: ✓ exists (${run_prompt_file})"
|
|
171
|
-
else
|
|
172
|
-
echo " Loop prompt: ✗ MISSING — scheduled org cannot self-perpetuate; re-create org or write prompt to ${run_prompt_file}"
|
|
173
|
-
fi
|
|
174
|
-
fi
|
|
96
|
+
# health = does the config still start? (schema + structural invariants)
|
|
97
|
+
npx -y monomind@latest org validate "$name" >/dev/null 2>&1 \
|
|
98
|
+
&& echo " Config: ✓ valid (monomind org validate)" \
|
|
99
|
+
|| echo " Config: ✗ INVALID — run: monomind org validate $name"
|
|
100
|
+
[ "$legacy_format" = "yes" ] \
|
|
101
|
+
&& echo " Format: ⚠ legacy config format — convert with: monomind org migrate $name"
|
|
102
|
+
|
|
103
|
+
# Pending tool approvals (the runtime's queue: .monomind/orgs/<name>/approvals.json)
|
|
104
|
+
pending=$(jq '[(.approvals // [])[] | select(.approved == null)] | length' ".monomind/orgs/${org_name}/approvals.json" 2>/dev/null || echo 0)
|
|
105
|
+
[ "$pending" -gt 0 ] \
|
|
106
|
+
&& echo " Approvals: ⚠ ${pending} pending — monomind org approvals ${name}" \
|
|
107
|
+
|| echo " Approvals: ✓ none pending"
|
|
108
|
+
|
|
109
|
+
# Stop file (pending stop signal) — the daemon polls <org>/stop
|
|
110
|
+
[ -f ".monomind/orgs/${org_name}/stop" ] && echo " Stop file: ⚠ PRESENT — daemon will exit within 2s of seeing it"
|
|
175
111
|
echo ""
|
|
176
112
|
```
|
|
177
113
|
|
|
@@ -180,31 +116,15 @@ echo ""
|
|
|
180
116
|
## Step 4 — Show Recent Activity (if available)
|
|
181
117
|
|
|
182
118
|
```bash
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
echo ""
|
|
193
|
-
fi
|
|
194
|
-
else
|
|
195
|
-
# LEGACY-ORG-V1: remove this branch when v1 orgs are gone
|
|
196
|
-
activityFile=".monomind/orgs/${org_name}-activity.jsonl"
|
|
197
|
-
if [ -f "$activityFile" ]; then
|
|
198
|
-
echo "RECENT ACTIVITY (last 5)"
|
|
199
|
-
echo "────────────────────────"
|
|
200
|
-
tail -5 "$activityFile" | while IFS= read -r line; do
|
|
201
|
-
ts=$(echo "$line" | jq -r '.ts // ""')
|
|
202
|
-
type=$(echo "$line" | jq -r '.type // ""')
|
|
203
|
-
pending=$(echo "$line" | jq -r '.pending // ""')
|
|
204
|
-
echo " $ts $type ${pending:+pending=$pending}"
|
|
205
|
-
done
|
|
206
|
-
echo ""
|
|
207
|
-
fi
|
|
119
|
+
# the durable record is bus.jsonl inside the most recent run directory
|
|
120
|
+
latest_bus=$(ls -t .monomind/orgs/"${org_name}"/run-*/bus.jsonl 2>/dev/null | head -1)
|
|
121
|
+
if [ -n "$latest_bus" ]; then
|
|
122
|
+
echo "RECENT ACTIVITY (last 5 bus events — $(dirname "$latest_bus" | xargs basename))"
|
|
123
|
+
echo "────────────────────────"
|
|
124
|
+
tail -5 "$latest_bus" | while IFS= read -r line; do
|
|
125
|
+
echo "$line" | jq -r '" \(.ts // "" | if type=="number" then (./1000 | todate) else . end) \(.type // "") \(.from // "")\(if .to then " → " + .to else "" end) \(.msg // .tool // "" | tostring | .[0:60])"' 2>/dev/null
|
|
126
|
+
done
|
|
127
|
+
echo ""
|
|
208
128
|
fi
|
|
209
129
|
```
|
|
210
130
|
|
|
@@ -215,26 +135,15 @@ fi
|
|
|
215
135
|
```bash
|
|
216
136
|
echo "ACTIONS"
|
|
217
137
|
echo "───────"
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
echo " Settings: /mastermind-org-settings --org $name"
|
|
228
|
-
# LEGACY-ORG-V1: remove the next two branches when v1 orgs are gone
|
|
229
|
-
elif [ "$has_schedule" = "yes" ]; then
|
|
230
|
-
case "$status" in
|
|
231
|
-
active|paused) echo " Stop loop: /mastermind:stoporg --org $name" ;;
|
|
232
|
-
stopped) echo " Start loop: /mastermind:runorg --org $name (v1 config — will auto-migrate)" ;;
|
|
233
|
-
esac
|
|
234
|
-
echo " Edit prompt: \$EDITOR $run_prompt_file"
|
|
235
|
-
else
|
|
236
|
-
echo " Run org: /mastermind:runorg --org $name (v1 config — will auto-migrate)"
|
|
237
|
-
fi
|
|
138
|
+
case "$rt_status" in
|
|
139
|
+
running*) echo " Stop: monomind org stop $name" ;;
|
|
140
|
+
crashed*) echo " Close out: monomind org mark-complete $name" ;;
|
|
141
|
+
*) echo " Run: monomind org run $name${schedule:+ (or host on schedule: monomind org serve)}" ;;
|
|
142
|
+
esac
|
|
143
|
+
echo " Logs: monomind org logs $name --follow"
|
|
144
|
+
echo " Report: monomind org report $name (add --all for run history)"
|
|
145
|
+
echo " Validate: monomind org validate $name"
|
|
146
|
+
echo " Settings: /mastermind-org-settings --org $name"
|
|
238
147
|
echo " All orgs: /mastermind:orgs"
|
|
239
148
|
echo ""
|
|
240
149
|
```
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mastermind-runorg
|
|
3
|
-
description: Start a saved org via the Org Runtime
|
|
3
|
+
description: Start a saved org via the Org Runtime daemon (monomind org run/serve). Converts legacy-format config files with monomind org migrate first.
|
|
4
4
|
type: domain-skill
|
|
5
5
|
default_mode: auto
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Mastermind Runorg
|
|
8
|
+
# Mastermind Runorg
|
|
9
9
|
|
|
10
|
-
Starts orgs
|
|
10
|
+
Starts orgs through the Org Runtime SDK daemon. Every role becomes a live
|
|
11
11
|
SDK session; events reach the dashboard through the daemon's own forwarder —
|
|
12
12
|
no curl emissions, no delivery gaps.
|
|
13
13
|
|
|
@@ -15,17 +15,18 @@ no curl emissions, no delivery gaps.
|
|
|
15
15
|
|
|
16
16
|
1. **Resolve the org.** `org_name` from params. List available orgs when missing:
|
|
17
17
|
`monomind org list`.
|
|
18
|
-
2. **
|
|
19
|
-
|
|
20
|
-
ids, one root, resolvable `reports_to`, parseable schedule)
|
|
21
|
-
schema validation even though it
|
|
18
|
+
2. **Detect the legacy config format.** Do NOT rely on `monomind org validate`
|
|
19
|
+
to catch legacy-format config files — one with no structural violations
|
|
20
|
+
(unique role ids, one root, resolvable `reports_to`, parseable schedule)
|
|
21
|
+
*passes* schema validation even though it still carries legacy fields.
|
|
22
|
+
Detect them directly:
|
|
22
23
|
`jq 'has("topology") or has("board_id") or has("loop") or ([.roles[]? | has("agent_type")] | any)' .monomind/orgs/<name>.json`
|
|
23
24
|
- `true` → step 3 (migrate first).
|
|
24
25
|
- `false` → step 4 (validate as-is).
|
|
25
|
-
3. **Migrate (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
3. **Migrate (legacy-format configs).** `monomind org migrate <name>` rewrites
|
|
27
|
+
the file in the current format — the original is kept as `<name>.v1.json`.
|
|
28
|
+
In confirm mode ask first; in auto mode migrate and state it. If migration
|
|
29
|
+
fails, stop and surface the error.
|
|
29
30
|
4. **Validate.** Run `monomind org validate <name>` on the config (post-migration
|
|
30
31
|
if step 3 ran).
|
|
31
32
|
- Valid → step 5.
|
|
@@ -55,8 +56,7 @@ no curl emissions, no delivery gaps.
|
|
|
55
56
|
`running`. Surface the dashboard link (`<CTRL_URL>/orgs`) and
|
|
56
57
|
`monomind org logs <name> --follow` as the tail command.
|
|
57
58
|
8. **Never** spawn a boss Task agent, create monotask boards, or emit
|
|
58
|
-
dashboard events manually.
|
|
59
|
-
behavior, direct them to `/mastermind:runorgv1` (deprecated).
|
|
59
|
+
dashboard events manually. The org daemon is the only way an org runs.
|
|
60
60
|
|
|
61
61
|
The org runtime does not read `<org>-issues.json`. Work is driven by the org
|
|
62
62
|
definition's roles and goal plus an optional `--task` string.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mastermind-stoporg
|
|
3
|
-
description: Mastermind stoporg — stop a running
|
|
3
|
+
description: Mastermind stoporg — stop a running org. Wraps monomind org stop, which writes the stop file the org daemon polls; the daemon exits within about 2 seconds.
|
|
4
4
|
type: domain-skill
|
|
5
5
|
default_mode: auto
|
|
6
6
|
pick: low
|
|
@@ -37,15 +37,8 @@ orgFile=".monomind/orgs/${org_name}.json"
|
|
|
37
37
|
}
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
current_status=$(jq -r '.status // "no-schedule"' "$orgFile")
|
|
43
|
-
has_schedule=$(jq -r 'if .loop.poll_interval_minutes then "yes" else "no" end' "$orgFile")
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
If `has_schedule == "no"` — this is a **v2 org** (Org Runtime v2 has `schedule`,
|
|
47
|
-
never `.loop`). Its daemon polls `.monomind/orgs/<name>/stop` every 2s, which is
|
|
48
|
-
exactly what `monomind org stop` writes — use the CLI, not the v1 `.stops/` path:
|
|
40
|
+
The org daemon polls `.monomind/orgs/<name>/stop` every 2s, which is exactly
|
|
41
|
+
what `monomind org stop` writes — use the CLI:
|
|
49
42
|
|
|
50
43
|
```bash
|
|
51
44
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
@@ -54,67 +47,19 @@ npx -y monomind@latest org stop "${org_name}" \
|
|
|
54
47
|
|| { mkdir -p ".monomind/orgs/${org_name}"; date -u +%Y-%m-%dT%H:%M:%SZ > ".monomind/orgs/${org_name}/stop"; }
|
|
55
48
|
# Also POST to the control server in case a dashboard-started instance is running
|
|
56
49
|
curl -s -X POST -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" "${CTRL_URL}/api/orgs/${org_name}/stop" >/dev/null 2>&1 || true
|
|
57
|
-
echo "Stop requested for org '${org_name}' (
|
|
58
|
-
```
|
|
59
|
-
- Exit.
|
|
60
|
-
|
|
61
|
-
<!-- LEGACY-ORG-V1: remove this branch when v1 orgs are gone -->
|
|
62
|
-
Everything below this point only runs for v1 orgs — v2 orgs already exited above.
|
|
63
|
-
|
|
64
|
-
If `current_status == "stopped"`:
|
|
65
|
-
- Print: "Org '<org_name>' is already stopped."
|
|
66
|
-
- Exit.
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
<!-- LEGACY-ORG-V1: remove this step when v1 orgs are gone -->
|
|
71
|
-
## Step 2 — Set Status to Stopped and Clear next_run (v1 only)
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
orgFile=".monomind/orgs/${org_name}.json"
|
|
75
|
-
tmp="${orgFile}.tmp"
|
|
76
|
-
# Clear next_run to avoid showing a stale future timestamp in orgstatus
|
|
77
|
-
jq '.status = "stopped" | if .loop then .loop.next_run = null else . end' "$orgFile" > "$tmp" && mv "$tmp" "$orgFile"
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
<!-- LEGACY-ORG-V1: remove this step when v1 orgs are gone -->
|
|
83
|
-
## Step 3 — Write Stop File (for any running boss agents, v1 only)
|
|
84
|
-
|
|
85
|
-
Any persistent boss agent checks for this file at the start of each loop iteration:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
mkdir -p .monomind/orgs/.stops
|
|
89
|
-
touch ".monomind/orgs/.stops/${org_name}.stop"
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
<!-- LEGACY-ORG-V1: remove this step when v1 orgs are gone -->
|
|
95
|
-
## Step 5 — Report to User (v1 only)
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
✓ Org "<org_name>" stopped.
|
|
99
|
-
|
|
100
|
-
Current status: stopped
|
|
101
|
-
The loop will exit at its next scheduled wakeup without rescheduling.
|
|
102
|
-
Loop fully dead within: ≤$(jq -r '.loop.poll_interval_minutes // "?"' "$orgFile") minutes
|
|
103
|
-
|
|
104
|
-
To restart: /mastermind:runorg --org <org_name>
|
|
105
|
-
Status: /mastermind:orgstatus --org <org_name>
|
|
50
|
+
echo "Stop requested for org '${org_name}' (the daemon exits within 2s)."
|
|
106
51
|
```
|
|
107
52
|
|
|
108
53
|
---
|
|
109
54
|
|
|
110
|
-
## Step
|
|
55
|
+
## Step 2 — Return Output
|
|
111
56
|
|
|
112
57
|
```yaml
|
|
113
58
|
domain: ops
|
|
114
59
|
status: complete
|
|
115
60
|
decisions:
|
|
116
61
|
- what: "Org <org_name> stopped"
|
|
117
|
-
why: "
|
|
62
|
+
why: "stop file written; the org daemon exits within 2s"
|
|
118
63
|
confidence: 1.0
|
|
119
64
|
outcome: shipped
|
|
120
65
|
next_actions:
|
|
@@ -124,6 +69,6 @@ next_actions:
|
|
|
124
69
|
|
|
125
70
|
---
|
|
126
71
|
|
|
127
|
-
## Step
|
|
72
|
+
## Step 3 — Brain Write (standalone only)
|
|
128
73
|
|
|
129
74
|
If `caller` is not "command", follow mastermind-protocol/SKILL.md Brain Write Procedure for domain `ops`.
|
|
@@ -6,10 +6,10 @@ default_mode: auto
|
|
|
6
6
|
pick: low
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
> **
|
|
10
|
-
>
|
|
11
|
-
> board
|
|
12
|
-
> `/mastermind-issues --action create --parent-id <id>`.
|
|
9
|
+
> **Writes to a monotask board, not to `<org>-issues.json`.** This skill only works
|
|
10
|
+
> on an org config that still carries a monotask `board_id` (the legacy config
|
|
11
|
+
> format); the Org Runtime never reads that board. For org issue tracking —
|
|
12
|
+
> including sub-issues — use `/mastermind-issues --action create --parent-id <id>`.
|
|
13
13
|
|
|
14
14
|
# Mastermind Tasks
|
|
15
15
|
|
|
@@ -41,16 +41,14 @@ If `caller` is not "command", load brain context following mastermind-protocol/S
|
|
|
41
41
|
## Step 1 — Load Org Config
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
|
-
#
|
|
45
|
-
# task model — boards belong to the legacy v1 runner, see runorgv1.
|
|
44
|
+
# board/column ids only exist on legacy-format org configs
|
|
46
45
|
orgFile=".monomind/orgs/${org_name}.json"
|
|
47
46
|
board_id=$(jq -r '.board_id // empty' "$orgFile")
|
|
48
47
|
todo_col=$(jq -r '.todo_col_id // empty' "$orgFile")
|
|
49
48
|
doing_col=$(jq -r '.doing_col_id // empty' "$orgFile")
|
|
50
49
|
done_col=$(jq -r '.done_col_id // empty' "$orgFile")
|
|
51
50
|
|
|
52
|
-
[ -z "$board_id" ] && { echo "ERROR: org config
|
|
53
|
-
# end LEGACY-ORG-V1
|
|
51
|
+
[ -z "$board_id" ] && { echo "ERROR: org config has no board_id — the Org Runtime does not use monotask boards. Use /mastermind-issues for org issues."; exit 1; }
|
|
54
52
|
```
|
|
55
53
|
|
|
56
54
|
---
|