monomind 2.3.2 → 2.3.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/README.md +37 -4
- package/package.json +1 -1
- package/packages/@monomind/cli/.claude/commands/mastermind/_repeat.md +9 -9
- package/packages/@monomind/cli/.claude/commands/mastermind/{approve.md → approvev1.md} +14 -11
- package/packages/@monomind/cli/.claude/commands/mastermind/architect.md +3 -3
- package/packages/@monomind/cli/.claude/commands/mastermind/createorg.md +4 -4
- package/packages/@monomind/cli/.claude/commands/mastermind/help.md +18 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/master.md +6 -6
- package/packages/@monomind/cli/.claude/commands/mastermind/repeat.md +5 -5
- package/packages/@monomind/cli/.claude/commands/mastermind/runorg.md +20 -108
- package/packages/@monomind/cli/.claude/commands/mastermind/runorgv1.md +159 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/stoporg.md +1 -1
- package/packages/@monomind/cli/.claude/helpers/control-start.cjs +52 -4
- package/packages/@monomind/cli/.claude/helpers/event-logger.cjs +9 -1
- package/packages/@monomind/cli/.claude/helpers/handlers/capture-handler.cjs +9 -1
- package/packages/@monomind/cli/.claude/helpers/handlers/route-handler.cjs +88 -15
- package/packages/@monomind/cli/.claude/helpers/handlers/session-restore-handler.cjs +25 -18
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/_protocol.md +1 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/_repeat.md +3 -3
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/adapters.md +1 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/agents.md +6 -2
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/{approve.md → approvev1.md} +8 -5
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/architect.md +8 -8
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/backup.md +1 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/bootstrap.md +1 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/costs.md +1 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/env.md +7 -2
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/{heartbeat.md → heartbeatv1.md} +9 -6
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/idea.md +1 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/inbox.md +14 -2
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/instance.md +3 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/monitor.md +2 -2
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/org-settings.md +5 -2
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/orgs.md +14 -13
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/orgstatus.md +19 -8
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/plugins.md +1 -1
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/projects.md +3 -0
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/runorg.md +37 -719
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/runorgv1.md +731 -0
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/stoporg.md +12 -5
- package/packages/@monomind/cli/.claude/skills/mastermind-skills/tasks.md +4 -1
- package/packages/@monomind/cli/README.md +37 -4
- package/packages/@monomind/cli/dist/src/commands/cleanup.js +30 -8
- package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.js +23 -10
- package/packages/@monomind/cli/dist/src/commands/org-observe.js +30 -26
- package/packages/@monomind/cli/dist/src/commands/org.js +52 -2
- package/packages/@monomind/cli/dist/src/knowledge/document-pipeline.js +0 -0
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +31 -12
- package/packages/@monomind/cli/dist/src/orgrt/daemon.js +45 -9
- package/packages/@monomind/cli/dist/src/orgrt/mailbox.d.ts +23 -0
- package/packages/@monomind/cli/dist/src/orgrt/mailbox.js +33 -1
- package/packages/@monomind/cli/dist/src/orgrt/migrate.d.ts +26 -0
- package/packages/@monomind/cli/dist/src/orgrt/migrate.js +111 -0
- package/packages/@monomind/cli/dist/src/orgrt/reporting.js +8 -1
- package/packages/@monomind/cli/dist/src/orgrt/session.js +8 -2
- package/packages/@monomind/cli/dist/src/ui/dashboard.html +44 -0
- package/packages/@monomind/cli/dist/src/ui/orgs.html +2 -2
- package/packages/@monomind/cli/dist/src/ui/server.mjs +86 -0
- package/packages/@monomind/cli/package.json +2 -2
|
@@ -67,7 +67,7 @@ If this skill is invoked directly (not by master):
|
|
|
67
67
|
```bash
|
|
68
68
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
69
69
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
70
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
70
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
71
71
|
-H "Content-Type: application/json" \
|
|
72
72
|
-d '{"type":"session:start","session":"<sessionId>","domain":"architect","ts":'"$(date +%s)"'000}' || true
|
|
73
73
|
```
|
|
@@ -104,7 +104,7 @@ If this skill is invoked directly (not by master):
|
|
|
104
104
|
```bash
|
|
105
105
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
106
106
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
107
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
107
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
108
108
|
-H "Content-Type: application/json" \
|
|
109
109
|
-d '{"type":"session:complete","session":"<sessionId>","domain":"architect","ts":'"$(date +%s)"'000}' || true
|
|
110
110
|
```
|
|
@@ -294,7 +294,7 @@ Then emit `agent:spawn` for the manager and spawn it. Before executing the curl
|
|
|
294
294
|
```bash
|
|
295
295
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
296
296
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
297
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
297
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
298
298
|
-H "Content-Type: application/json" \
|
|
299
299
|
-d '{"type":"agent:spawn","session":"<sessionId>","domain":"architect","agent":"<manager_agent_type lowercased and hyphenated, e.g. software-architect>","task":"coordinate architecture analysis","ts":'"$(date +%s)"'000}'
|
|
300
300
|
```
|
|
@@ -444,7 +444,7 @@ BEFORE spawning each agent, emit agent:spawn to the live dashboard. Before each
|
|
|
444
444
|
\`\`\`bash
|
|
445
445
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
446
446
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
447
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
447
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
448
448
|
-H "Content-Type: application/json" \
|
|
449
449
|
-d '{"type":"agent:spawn","session":"<sessionId>","domain":"architect","agent":"<subagent_type lowercased and hyphenated, e.g. software-architect>","task":"<stream-description>","ts":'"$(date +%s)"'000}'
|
|
450
450
|
\`\`\`
|
|
@@ -453,7 +453,7 @@ If handing off artifacts to another domain (e.g. build for refactoring implement
|
|
|
453
453
|
\`\`\`bash
|
|
454
454
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
455
455
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
456
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
456
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
457
457
|
-H "Content-Type: application/json" \
|
|
458
458
|
-d '{"type":"intercom","session":"<sessionId>","from":"architect","to":"<domain>","msg":"<msg>","ts":'"$(date +%s)"'000}'
|
|
459
459
|
\`\`\`
|
|
@@ -464,7 +464,7 @@ BEFORE returning, emit domain:complete to the live dashboard:
|
|
|
464
464
|
\`\`\`bash
|
|
465
465
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
466
466
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
467
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
467
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
468
468
|
-H "Content-Type: application/json" \
|
|
469
469
|
-d '{"type":"domain:complete","session":"<sessionId>","domain":"architect","status":"<choose: complete | partial | blocked>","artifacts":[],"decisions":[],"ts":'"$(date +%s)"'000}'
|
|
470
470
|
\`\`\`
|
|
@@ -552,7 +552,7 @@ Before executing the curl blocks below and when constructing the Task() descript
|
|
|
552
552
|
```bash
|
|
553
553
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
554
554
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
555
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
555
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
556
556
|
-H "Content-Type: application/json" \
|
|
557
557
|
-d '{"type":"agent:spawn","session":"<sessionId>","domain":"architect","agent":"<resolved agent slug, e.g. software-architect>","task":"<prompt>","ts":'"$(date +%s)"'000}'
|
|
558
558
|
```
|
|
@@ -568,7 +568,7 @@ Before executing the curl blocks below and when constructing the Task() descript
|
|
|
568
568
|
```bash
|
|
569
569
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
570
570
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
571
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
571
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
572
572
|
-H "Content-Type: application/json" \
|
|
573
573
|
-d '{"type":"domain:complete","session":"<sessionId>","domain":"architect","status":"complete","artifacts":[],"decisions":[],"ts":'"$(date +%s)"'000}'
|
|
574
574
|
```
|
|
@@ -93,7 +93,7 @@ Emit `org:backup:created` event:
|
|
|
93
93
|
```bash
|
|
94
94
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
95
95
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
96
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
96
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
97
97
|
-H "Content-Type: application/json" \
|
|
98
98
|
-d "$(jq -cn --arg org "$org_name" --arg file "$archiveName" \
|
|
99
99
|
'{type:"org:backup:created",org:$org,file:$file,ts:(now*1000|floor)}')" || true
|
|
@@ -151,7 +151,7 @@ Emit `org:bootstrap:complete` event:
|
|
|
151
151
|
```bash
|
|
152
152
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
153
153
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
154
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
154
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
155
155
|
-H "Content-Type: application/json" \
|
|
156
156
|
-d "$(jq -cn --arg org "$org_name" --arg boss "$boss_role_id" \
|
|
157
157
|
'{type:"org:bootstrap:complete",org:$org,boss:$boss,ts:(now*1000|floor)}')" || true
|
|
@@ -122,7 +122,7 @@ if [ "$budget" -gt 0 ] && [ -f "$stateFile" ]; then
|
|
|
122
122
|
echo "ALERT: Org $org_name has used $(awk -v t=$total -v b=$budget 'BEGIN{printf "%.1f", t/b*100}')% of budget"
|
|
123
123
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
124
124
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
125
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
125
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
126
126
|
-H "Content-Type: application/json" \
|
|
127
127
|
-d "$(jq -cn --arg org "$org_name" --argjson total $total --argjson budget $budget \
|
|
128
128
|
'{type:"org:budget:alert",org:$org,tokens_used:$total,budget:$budget,ts:(now*1000|floor)}')" || true
|
|
@@ -81,6 +81,7 @@ echo " namespace: org:${org_name}"
|
|
|
81
81
|
npx monomind@latest memory list --namespace "org:${org_name}" 2>/dev/null | wc -l | xargs echo " stored entries:"
|
|
82
82
|
echo ""
|
|
83
83
|
|
|
84
|
+
# LEGACY-ORG-V1: board_id/*_col_id only exist on the pre-v2 board-backed org shape
|
|
84
85
|
# Board config
|
|
85
86
|
echo "TASK BOARD"
|
|
86
87
|
echo "──────────"
|
|
@@ -90,6 +91,7 @@ echo " todo_col: $(jq -r '.todo_col_id // "NOT CONFIGURED"' "$orgFile")"
|
|
|
90
91
|
echo " doing_col: $(jq -r '.doing_col_id // "NOT CONFIGURED"' "$orgFile")"
|
|
91
92
|
echo " done_col: $(jq -r '.done_col_id // "NOT CONFIGURED"' "$orgFile")"
|
|
92
93
|
echo ""
|
|
94
|
+
# end LEGACY-ORG-V1 board block
|
|
93
95
|
|
|
94
96
|
# Run config
|
|
95
97
|
echo "RUN CONFIG"
|
|
@@ -129,9 +131,12 @@ for key in ANTHROPIC_API_KEY; do
|
|
|
129
131
|
fi
|
|
130
132
|
done
|
|
131
133
|
|
|
132
|
-
#
|
|
134
|
+
# LEGACY-ORG-V1: board_id belongs to the legacy v1 runner — see runorgv1. Org
|
|
135
|
+
# Runtime v2 configs have no board_id at all, so this check only applies to
|
|
136
|
+
# orgs still running the v1 board-backed shape.
|
|
133
137
|
board_id=$(jq -r '.board_id // empty' "$orgFile")
|
|
134
|
-
[ -z "$board_id" ] && { echo " ✗ MISSING: board_id —
|
|
138
|
+
[ -z "$board_id" ] && { echo " ✗ MISSING: board_id — boards belong to the legacy v1 runner, see runorgv1"; errors=$((errors + 1)); } || echo " ✓ board_id"
|
|
139
|
+
# end LEGACY-ORG-V1
|
|
135
140
|
|
|
136
141
|
# Check roles
|
|
137
142
|
role_count=$(jq '.roles | length' "$orgFile")
|
package/packages/@monomind/cli/.claude/skills/mastermind-skills/{heartbeat.md → heartbeatv1.md}
RENAMED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: mastermind-
|
|
3
|
-
description: Mastermind
|
|
2
|
+
name: mastermind-heartbeatv1
|
|
3
|
+
description: "LEGACY-ORG-V1 (2026-07): v2: send the role a chat message from the dashboard, or inspect with `monomind org logs <name>` — no skill needed. Mastermind heartbeatv1 — trigger a manual heartbeat for a specific agent in a running v1 (prompt-orchestrated) org. The agent wakes, checks its task queue, executes pending work, and reports back. Reach it only via `/mastermind:heartbeatv1`."
|
|
4
4
|
type: domain-skill
|
|
5
5
|
default_mode: auto
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Mastermind Heartbeat
|
|
8
|
+
# Mastermind Heartbeat (v1, legacy)
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
> **LEGACY-ORG-V1 — manual task-board wake-up for prompt-orchestrated v1 orgs. Reach it only via `/mastermind:heartbeatv1`.**
|
|
11
|
+
> v2 roles run as live SDK sessions with no poll/wake cycle to trigger — send the role a chat message from the dashboard, or inspect activity with `monomind org logs <name>`. This skill remains only for orgs not yet migrated off the v1 `board_id`/`topology` config shape.
|
|
12
|
+
|
|
13
|
+
This skill is invoked by `mastermind:heartbeatv1` or directly via `/mastermind:heartbeatv1`.
|
|
11
14
|
|
|
12
15
|
---
|
|
13
16
|
|
|
@@ -71,7 +74,7 @@ jq --arg id "$agent_id" --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --arg source "
|
|
|
71
74
|
|
|
72
75
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
73
76
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
74
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
77
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
75
78
|
-H "Content-Type: application/json" \
|
|
76
79
|
-d "$(jq -cn \
|
|
77
80
|
--arg org "$org_name" \
|
|
@@ -123,7 +126,7 @@ HEARTBEAT PROCEDURE:
|
|
|
123
126
|
|
|
124
127
|
4. Report completion — emit heartbeat:complete event:
|
|
125
128
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$(git rev-parse --show-toplevel 2>/dev/null || pwd)/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
126
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "Content-Type: application/json" \
|
|
129
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" -H "Content-Type: application/json" \
|
|
127
130
|
-d "$(jq -cn --arg org "${org_name}" --arg role "${agent_id}" --arg title "${agentTitle}" \
|
|
128
131
|
'{type:"org:heartbeat:complete",org:$org,role:$role,title:$title,ts:(now*1000|floor)}')" || true
|
|
129
132
|
|
|
@@ -1089,7 +1089,7 @@ if [ -n "$SESSION_ID" ]; then
|
|
|
1089
1089
|
--argjson next_actions '["<next_action_1>","<next_action_2>"]' \
|
|
1090
1090
|
'{domain:$domain,status:$status,artifacts:$artifacts,next_actions:$next_actions}' \
|
|
1091
1091
|
> "$MONO_DIR/sessions/${SESSION_ID}/idea.json"
|
|
1092
|
-
curl -s -o /dev/null -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
1092
|
+
curl -s -o /dev/null -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
1093
1093
|
-H "Content-Type: application/json" \
|
|
1094
1094
|
-d "$(jq -cn --arg sid "$SESSION_ID" --arg status "<status>" \
|
|
1095
1095
|
'{type:"domain:complete",session:$sid,domain:"idea",status:$status,ts:(now*1000|floor)}')" || true
|
|
@@ -54,17 +54,23 @@ for org in $orgs; do
|
|
|
54
54
|
stateFile=".monomind/orgs/${org}-state.json"
|
|
55
55
|
approvalsFile=".monomind/orgs/${org}-approvals.json"
|
|
56
56
|
|
|
57
|
+
# LEGACY-ORG-V1: approvals files only exist for the v1 prompt-orchestrated
|
|
58
|
+
# runner — see runorgv1 / approvev1.
|
|
57
59
|
# 1. Pending approvals
|
|
58
60
|
if [ -f "$approvalsFile" ]; then
|
|
59
61
|
pending=$(jq '[(.approvals // [])[] | select(.status == "pending")] | length' "$approvalsFile" 2>/dev/null || echo 0)
|
|
60
62
|
total_approvals=$((total_approvals + pending))
|
|
61
63
|
fi
|
|
64
|
+
# end LEGACY-ORG-V1
|
|
62
65
|
|
|
66
|
+
# LEGACY-ORG-V1: state-file "heartbeats" are the v1 scheduler's running-agent
|
|
67
|
+
# tracking — v2 runs live under .monomind/orgs/<name>/run-*/bus.jsonl instead.
|
|
63
68
|
# 2. Running agents (active heartbeats)
|
|
64
69
|
if [ -f "$stateFile" ]; then
|
|
65
70
|
running=$(jq '[.agents // {} | to_entries[] | select(.value.status == "running")] | length' "$stateFile" 2>/dev/null || echo 0)
|
|
66
71
|
total_heartbeats=$((total_heartbeats + running))
|
|
67
72
|
fi
|
|
73
|
+
# end LEGACY-ORG-V1
|
|
68
74
|
|
|
69
75
|
# 3. Budget alerts
|
|
70
76
|
budget=$(jq -r '.run_config.budget_tokens // 0' "$orgFile" 2>/dev/null || echo 0)
|
|
@@ -101,13 +107,16 @@ for org in $orgs; do
|
|
|
101
107
|
|
|
102
108
|
has_items=0
|
|
103
109
|
|
|
110
|
+
# LEGACY-ORG-V1: approvals belong to the v1 prompt-orchestrated runner
|
|
104
111
|
# Pending approvals
|
|
105
112
|
if [ -f "$approvalsFile" ]; then
|
|
106
113
|
pending_approvals=$(jq -r '(.approvals // [])[] | select(.status == "pending") | " [APPROVAL] [\(.id)] \(.agent_id): \(.title) risk=\(.risk_level // "low")"' \
|
|
107
114
|
"$approvalsFile" 2>/dev/null)
|
|
108
115
|
[ -n "$pending_approvals" ] && { has_items=1; echo "ORG: $org"; echo "$pending_approvals"; }
|
|
109
116
|
fi
|
|
117
|
+
# end LEGACY-ORG-V1
|
|
110
118
|
|
|
119
|
+
# LEGACY-ORG-V1: state-file heartbeats are the v1 scheduler's tracking
|
|
111
120
|
# Running agents
|
|
112
121
|
if [ -f "$stateFile" ]; then
|
|
113
122
|
running_agents=$(jq -r '
|
|
@@ -116,6 +125,7 @@ for org in $orgs; do
|
|
|
116
125
|
' "$stateFile" 2>/dev/null)
|
|
117
126
|
[ -n "$running_agents" ] && { has_items=1; [ $has_items -eq 1 ] || echo "ORG: $org"; echo "$running_agents"; }
|
|
118
127
|
fi
|
|
128
|
+
# end LEGACY-ORG-V1
|
|
119
129
|
|
|
120
130
|
[ $has_items -eq 1 ] && echo ""
|
|
121
131
|
done
|
|
@@ -127,13 +137,14 @@ fi
|
|
|
127
137
|
|
|
128
138
|
### filter: approvals only
|
|
129
139
|
|
|
140
|
+
<!-- LEGACY-ORG-V1: approvals belong to the v1 prompt-orchestrated runner — see runorgv1 / approvev1. -->
|
|
130
141
|
```bash
|
|
131
142
|
for org in $orgs; do
|
|
132
143
|
approvalsFile=".monomind/orgs/${org}-approvals.json"
|
|
133
144
|
[ -f "$approvalsFile" ] || continue
|
|
134
145
|
echo "=== $org ==="
|
|
135
146
|
jq -r '(.approvals // [])[] | select(.status == "pending") |
|
|
136
|
-
"[\(.id)] \(.agent_id): \(.title)\n Action: \(.action)\n Risk: \(.risk_level // "low")\n → /mastermind:
|
|
147
|
+
"[\(.id)] \(.agent_id): \(.title)\n Action: \(.action)\n Risk: \(.risk_level // "low")\n → /mastermind:approvev1 --org '"$org"' --action approve --approval-id \(.id)"
|
|
137
148
|
' "$approvalsFile" 2>/dev/null || echo " No pending approvals."
|
|
138
149
|
echo ""
|
|
139
150
|
done
|
|
@@ -141,6 +152,7 @@ done
|
|
|
141
152
|
|
|
142
153
|
### filter: heartbeats only
|
|
143
154
|
|
|
155
|
+
<!-- LEGACY-ORG-V1: state-file heartbeats are the v1 scheduler's running-agent tracking. -->
|
|
144
156
|
Show currently running agent heartbeats across all orgs:
|
|
145
157
|
|
|
146
158
|
```bash
|
|
@@ -181,7 +193,7 @@ From the inbox, the user can directly:
|
|
|
181
193
|
|
|
182
194
|
```bash
|
|
183
195
|
# Approve a pending request:
|
|
184
|
-
/mastermind:
|
|
196
|
+
/mastermind:approvev1 --org <org> --action approve --approval-id <id>
|
|
185
197
|
|
|
186
198
|
# Stop a running agent:
|
|
187
199
|
/mastermind:agents --org <org> --action pause --agent-id <id>
|
|
@@ -84,6 +84,7 @@ echo " Active orgs: $orgs"
|
|
|
84
84
|
|
|
85
85
|
### heartbeats
|
|
86
86
|
|
|
87
|
+
<!-- LEGACY-ORG-V1: role-level heartbeat scheduling is a v1 org concept — v2 orgs run on `schedule` via the daemon instead. -->
|
|
87
88
|
List all agents across all orgs that have scheduled heartbeats:
|
|
88
89
|
|
|
89
90
|
```bash
|
|
@@ -116,11 +117,12 @@ for orgF in .monomind/orgs/*.json; do
|
|
|
116
117
|
done
|
|
117
118
|
done
|
|
118
119
|
|
|
119
|
-
[ "$found" -eq 0 ] && echo " No scheduled heartbeat agents found. Configure via /mastermind:
|
|
120
|
+
[ "$found" -eq 0 ] && echo " No scheduled heartbeat agents found. Configure via /mastermind:heartbeatv1."
|
|
120
121
|
```
|
|
121
122
|
|
|
122
123
|
### toggle-heartbeat
|
|
123
124
|
|
|
125
|
+
<!-- LEGACY-ORG-V1: role-level heartbeat scheduling is a v1 org concept. -->
|
|
124
126
|
Enable or disable the scheduler heartbeat for a specific agent:
|
|
125
127
|
|
|
126
128
|
```bash
|
|
@@ -384,7 +384,7 @@ jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" '.last_tick = $ts' "$cfg" > "$tmp"
|
|
|
384
384
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
385
385
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
386
386
|
SESSION_ID="monitor-${name}-$(date -u +%Y%m%dT%H%M%S)"
|
|
387
|
-
curl -s -o /dev/null -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
387
|
+
curl -s -o /dev/null -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
388
388
|
-H "Content-Type: application/json" \
|
|
389
389
|
-d "$(jq -cn --arg sid "$SESSION_ID" --arg name "$name" \
|
|
390
390
|
'{type:"monitor:tick",session:$sid,monitor:$name,ts:(now*1000|floor)}')" || true
|
|
@@ -959,7 +959,7 @@ jq '.stats.done += 1' "$cfg" > "$tmp" && mv "$tmp" "$cfg"
|
|
|
959
959
|
|
|
960
960
|
**Emit dashboard event:**
|
|
961
961
|
```bash
|
|
962
|
-
curl -s -o /dev/null -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
962
|
+
curl -s -o /dev/null -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
963
963
|
-H "Content-Type: application/json" \
|
|
964
964
|
-d "$(jq -cn --arg sid "$SESSION_ID" --arg name "$name" --arg title "$task_title" \
|
|
965
965
|
'{type:"monitor:task:done",session:$sid,monitor:$name,task:$title,ts:(now*1000|floor)}')" || true
|
|
@@ -9,7 +9,10 @@ default_mode: confirm
|
|
|
9
9
|
|
|
10
10
|
This skill is invoked by `mastermind:org-settings` or directly via `/mastermind:org-settings`.
|
|
11
11
|
|
|
12
|
-
It edits `.monomind/orgs/<org_name>.json` in place, and only ever touches fields that `OrgDefSchema` (`packages/@monomind/cli/src/orgrt/types.ts`) actually defines — every field listed below is read by the daemon (`org.ts`/`daemon.ts`/`session.ts`) at `monomind org run`/`serve` time.
|
|
12
|
+
It edits `.monomind/orgs/<org_name>.json` in place, and only ever touches fields that `OrgDefSchema` (`packages/@monomind/cli/src/orgrt/types.ts`) actually defines — every field listed below is read by the daemon (`org.ts`/`daemon.ts`/`session.ts`) at `monomind org run`/`serve` time. Its primary edit flow targets v2 fields only: `name`, `goal`, `schedule`, and `run_config` (`budget_tokens`, `memory_namespace`, `max_turns_per_message`). Role edits are not yet supported by this skill's `edit` action — `roles` is shown read-only via `show`.
|
|
13
|
+
|
|
14
|
+
<!-- LEGACY-ORG-V1: remove this note when v1 orgs are gone -->
|
|
15
|
+
There is no `topology`, `governance`, `alert_threshold`, or `ceo_adapter` in Org Runtime v2 — those were v1 board/prompt-orchestration fields with no runtime effect and have been removed from this skill's edit surface. Use `/mastermind:org-settings` only for v2-shaped orgs; v1 orgs must go through `monomind org migrate` first.
|
|
13
16
|
|
|
14
17
|
---
|
|
15
18
|
|
|
@@ -161,7 +164,7 @@ Emit `org:settings:updated` event:
|
|
|
161
164
|
```bash
|
|
162
165
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
163
166
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
164
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
167
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
165
168
|
-H "Content-Type: application/json" \
|
|
166
169
|
-d "$(jq -cn --arg org "$org_name" --arg field "$field" --arg value "$value" \
|
|
167
170
|
'{type:"org:settings:updated",org:$org,field:$field,value:$value,ts:(now*1000|floor)}')" || true
|
|
@@ -58,18 +58,8 @@ for f in $orgFiles; do
|
|
|
58
58
|
schedule=$(jq -r '.schedule // empty' "$f" 2>/dev/null)
|
|
59
59
|
loop_interval=$(jq -r '.loop.poll_interval_minutes // empty' "$f" 2>/dev/null)
|
|
60
60
|
|
|
61
|
-
if [ -
|
|
62
|
-
#
|
|
63
|
-
interval="${loop_interval}m (v1)"
|
|
64
|
-
status=$(jq -r '.status // "—"' "$f" 2>/dev/null)
|
|
65
|
-
case "$status" in
|
|
66
|
-
active) indicator="● active" ;;
|
|
67
|
-
paused) indicator="⏸ paused" ;;
|
|
68
|
-
*) indicator="○ stopped" ;;
|
|
69
|
-
esac
|
|
70
|
-
last_run=$(jq -r '.loop.last_run // "—"' "$f" 2>/dev/null | sed 's/T/ /;s/Z//')
|
|
71
|
-
else
|
|
72
|
-
# v2 org — live state is in runtime.json (crashed = running record, dead pid)
|
|
61
|
+
if [ -z "$loop_interval" ]; then
|
|
62
|
+
# v2 org (default) — live state is in runtime.json (crashed = running record, dead pid)
|
|
73
63
|
interval="${schedule:-manual}"
|
|
74
64
|
rt=".monomind/orgs/${name}/runtime.json"
|
|
75
65
|
rt_status=$(jq -r '.status // "never run"' "$rt" 2>/dev/null || echo "never run")
|
|
@@ -84,6 +74,17 @@ for f in $orgFiles; do
|
|
|
84
74
|
indicator="○ ${rt_status}"
|
|
85
75
|
fi
|
|
86
76
|
last_run=$(jq -r '.updated // "—"' "$rt" 2>/dev/null | sed 's/T/ /;s/\..*Z//' || echo "—")
|
|
77
|
+
else
|
|
78
|
+
# LEGACY-ORG-V1: remove this branch when v1 orgs are gone
|
|
79
|
+
# legacy v1 scheduled org — state lives in the config's status field
|
|
80
|
+
interval="${loop_interval}m (v1)"
|
|
81
|
+
status=$(jq -r '.status // "—"' "$f" 2>/dev/null)
|
|
82
|
+
case "$status" in
|
|
83
|
+
active) indicator="● active" ;;
|
|
84
|
+
paused) indicator="⏸ paused" ;;
|
|
85
|
+
*) indicator="○ stopped" ;;
|
|
86
|
+
esac
|
|
87
|
+
last_run=$(jq -r '.loop.last_run // "—"' "$f" 2>/dev/null | sed 's/T/ /;s/Z//')
|
|
87
88
|
fi
|
|
88
89
|
|
|
89
90
|
printf "%-28s %-14s %-12s %-22s\n" "$name" "$indicator" "$interval" "$last_run"
|
|
@@ -106,7 +107,7 @@ COMMANDS
|
|
|
106
107
|
monomind org validate [name] Check config against the runtime schema
|
|
107
108
|
/mastermind:orgstatus --org <name> Detailed status, last runs, activity
|
|
108
109
|
/mastermind:createorg <goal> Create a new org
|
|
109
|
-
/mastermind:runorg --org <name> (
|
|
110
|
+
/mastermind:runorg --org <name> v2 delegator (auto-migrates v1 configs, then runs via the daemon)
|
|
110
111
|
```
|
|
111
112
|
|
|
112
113
|
---
|
|
@@ -51,17 +51,21 @@ status=$(jq -r '.status // "no-schedule"' "$orgFile")
|
|
|
51
51
|
role_count=$(jq '.roles | length' "$orgFile")
|
|
52
52
|
created_at=$(jq -r '.created_at // "-"' "$orgFile")
|
|
53
53
|
|
|
54
|
-
# v1 loop fields (legacy scheduled orgs only)
|
|
55
54
|
has_schedule=$(jq -r 'if .loop.poll_interval_minutes then "yes" else "no" end' "$orgFile")
|
|
56
|
-
poll_interval=$(jq -r '.loop.poll_interval_minutes // ""' "$orgFile")
|
|
57
|
-
last_run=$(jq -r '.loop.last_run // "never"' "$orgFile")
|
|
58
|
-
next_run=$(jq -r '.loop.next_run // "not scheduled"' "$orgFile")
|
|
59
|
-
run_prompt_file=$(jq -r '.loop.run_prompt_file // ""' "$orgFile")
|
|
60
55
|
|
|
61
56
|
# v2 fields
|
|
62
57
|
is_v2=$([ "$has_schedule" = "no" ] && echo yes || echo no)
|
|
63
58
|
v2_schedule=$(jq -r '.schedule // empty' "$orgFile")
|
|
64
59
|
budget=$(jq -r '.run_config.budget_tokens // 1000000' "$orgFile")
|
|
60
|
+
|
|
61
|
+
# LEGACY-ORG-V1: remove this block when v1 orgs are gone
|
|
62
|
+
# v1 loop fields (legacy scheduled orgs only)
|
|
63
|
+
poll_interval=$(jq -r '.loop.poll_interval_minutes // ""' "$orgFile")
|
|
64
|
+
last_run=$(jq -r '.loop.last_run // "never"' "$orgFile")
|
|
65
|
+
next_run=$(jq -r '.loop.next_run // "not scheduled"' "$orgFile")
|
|
66
|
+
run_prompt_file=$(jq -r '.loop.run_prompt_file // ""' "$orgFile")
|
|
67
|
+
# end LEGACY-ORG-V1 loop-fields block
|
|
68
|
+
|
|
65
69
|
rtFile=".monomind/orgs/${org_name}/runtime.json"
|
|
66
70
|
rt_status=$(jq -r '.status // "never run"' "$rtFile" 2>/dev/null || echo "never run")
|
|
67
71
|
rt_run=$(jq -r '.run // ""' "$rtFile" 2>/dev/null || echo "")
|
|
@@ -95,6 +99,7 @@ if [ "$is_v2" = "yes" ]; then
|
|
|
95
99
|
echo ""
|
|
96
100
|
fi
|
|
97
101
|
|
|
102
|
+
# LEGACY-ORG-V1: remove this block when v1 orgs are gone
|
|
98
103
|
if [ "$has_schedule" = "yes" ]; then
|
|
99
104
|
echo "SCHEDULED LOOP"
|
|
100
105
|
echo "──────────────"
|
|
@@ -127,6 +132,7 @@ if [ "$is_v2" = "yes" ]; then
|
|
|
127
132
|
&& echo " Config: ✓ valid (monomind org validate)" \
|
|
128
133
|
|| echo " Config: ✗ INVALID — run: monomind org validate $name"
|
|
129
134
|
else
|
|
135
|
+
# LEGACY-ORG-V1: remove this branch when v1 orgs are gone
|
|
130
136
|
# v1 health: board / column IDs
|
|
131
137
|
board_id=$(jq -r '.board_id // ""' "$orgFile")
|
|
132
138
|
todo_col=$(jq -r '.todo_col_id // ""' "$orgFile")
|
|
@@ -139,12 +145,13 @@ else
|
|
|
139
145
|
fi
|
|
140
146
|
fi
|
|
141
147
|
|
|
148
|
+
# LEGACY-ORG-V1: remove this branch when v1 orgs are gone
|
|
142
149
|
# Pending approvals
|
|
143
150
|
approvalsFile=".monomind/orgs/${org_name}-approvals.json"
|
|
144
151
|
if [ -f "$approvalsFile" ]; then
|
|
145
152
|
pending=$(jq '(.approvals // []) | map(select(.status == "pending")) | length' "$approvalsFile")
|
|
146
153
|
[ "$pending" -gt 0 ] \
|
|
147
|
-
&& echo " Approvals: ⚠ ${pending} pending — /mastermind:
|
|
154
|
+
&& echo " Approvals: ⚠ ${pending} pending — /mastermind:approvev1 --org ${name} --action list" \
|
|
148
155
|
|| echo " Approvals: ✓ none pending"
|
|
149
156
|
else
|
|
150
157
|
echo " Approvals: ✓ no approvals file"
|
|
@@ -152,8 +159,10 @@ fi
|
|
|
152
159
|
|
|
153
160
|
# Stop file (pending stop signal) — v2 daemons poll <org>/stop; v1 used .stops/
|
|
154
161
|
[ -f ".monomind/orgs/${org_name}/stop" ] && echo " Stop file: ⚠ PRESENT (v2) — daemon will exit within 2s of seeing it"
|
|
162
|
+
# LEGACY-ORG-V1: remove this check when v1 orgs are gone
|
|
155
163
|
[ -f ".monomind/orgs/.stops/${org_name}.stop" ] && echo " Stop file: ⚠ PRESENT (v1 legacy path)"
|
|
156
164
|
|
|
165
|
+
# LEGACY-ORG-V1: remove this block when v1 orgs are gone
|
|
157
166
|
# Loop prompt file (scheduled orgs)
|
|
158
167
|
if [ "$has_schedule" = "yes" ]; then
|
|
159
168
|
if [ -n "$run_prompt_file" ] && [ -f "$run_prompt_file" ]; then
|
|
@@ -182,6 +191,7 @@ if [ "$is_v2" = "yes" ]; then
|
|
|
182
191
|
echo ""
|
|
183
192
|
fi
|
|
184
193
|
else
|
|
194
|
+
# LEGACY-ORG-V1: remove this branch when v1 orgs are gone
|
|
185
195
|
activityFile=".monomind/orgs/${org_name}-activity.jsonl"
|
|
186
196
|
if [ -f "$activityFile" ]; then
|
|
187
197
|
echo "RECENT ACTIVITY (last 5)"
|
|
@@ -214,14 +224,15 @@ if [ "$is_v2" = "yes" ]; then
|
|
|
214
224
|
echo " Report: monomind org report $name (add --all for run history)"
|
|
215
225
|
echo " Validate: monomind org validate $name"
|
|
216
226
|
echo " Settings: /mastermind:org-settings --org $name"
|
|
227
|
+
# LEGACY-ORG-V1: remove the next two branches when v1 orgs are gone
|
|
217
228
|
elif [ "$has_schedule" = "yes" ]; then
|
|
218
229
|
case "$status" in
|
|
219
230
|
active|paused) echo " Stop loop: /mastermind:stoporg --org $name" ;;
|
|
220
|
-
stopped) echo " Start loop: /mastermind:runorg --org $name (
|
|
231
|
+
stopped) echo " Start loop: /mastermind:runorg --org $name (v1 config — will auto-migrate)" ;;
|
|
221
232
|
esac
|
|
222
233
|
echo " Edit prompt: \$EDITOR $run_prompt_file"
|
|
223
234
|
else
|
|
224
|
-
echo " Run org: /mastermind:runorg --org $name (
|
|
235
|
+
echo " Run org: /mastermind:runorg --org $name (v1 config — will auto-migrate)"
|
|
225
236
|
fi
|
|
226
237
|
echo " All orgs: /mastermind:orgs"
|
|
227
238
|
echo ""
|
|
@@ -130,7 +130,7 @@ Emit `org:plugin:installed` event:
|
|
|
130
130
|
```bash
|
|
131
131
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
132
132
|
CTRL_URL=$(jq -r '.url // "http://localhost:4242"' "$REPO_ROOT/.monomind/control.json" 2>/dev/null || echo "http://localhost:4242")
|
|
133
|
-
curl -s -X POST "${CTRL_URL}/api/mastermind/event" \
|
|
133
|
+
curl -s -X POST "${CTRL_URL}/api/mastermind/event" -H "x-monomind-token: $(cat "${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}/.monomind/dashboard-token" 2>/dev/null || true)" \
|
|
134
134
|
-H "Content-Type: application/json" \
|
|
135
135
|
-d "$(jq -cn --arg org "${org_name:-global}" --arg id "$pluginId" --arg pkg "$package_name" \
|
|
136
136
|
'{type:"org:plugin:installed",org:$org,plugin:$id,package:$pkg,ts:(now*1000|floor)}')" || true
|
|
@@ -112,6 +112,8 @@ Show project summary with linked tasks from the board:
|
|
|
112
112
|
project=$(jq --arg id "$project_id" '(.projects // [])[] | select(.id == $id)' "$projectsFile")
|
|
113
113
|
echo "$project" | jq .
|
|
114
114
|
|
|
115
|
+
# LEGACY-ORG-V1: board_id/*_col_id only exist on the pre-v2 board-backed org
|
|
116
|
+
# shape — see runorgv1.
|
|
115
117
|
# If board exists, count tasks tagged with this project
|
|
116
118
|
orgFile=".monomind/orgs/${org_name}.json"
|
|
117
119
|
board_id=$(jq -r '.board_id // empty' "$orgFile")
|
|
@@ -125,6 +127,7 @@ if [ -n "$board_id" ]; then
|
|
|
125
127
|
jq -r --arg p "project:$project_id" '[.[] | select((.labels // []) | index($p))] | length' 2>/dev/null
|
|
126
128
|
done
|
|
127
129
|
fi
|
|
130
|
+
# end LEGACY-ORG-V1
|
|
128
131
|
```
|
|
129
132
|
|
|
130
133
|
---
|