@monoes/monomindcli 1.9.16 → 1.10.0
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/_repeat.md +182 -39
- package/.claude/commands/mastermind/architect.md +17 -11
- package/.claude/commands/mastermind/brain.md +4 -0
- package/.claude/commands/mastermind/build.md +4 -0
- package/.claude/commands/mastermind/content.md +4 -0
- package/.claude/commands/mastermind/createorg.md +5 -3
- package/.claude/commands/mastermind/finance.md +4 -0
- package/.claude/commands/mastermind/idea.md +4 -0
- package/.claude/commands/mastermind/marketing.md +4 -0
- package/.claude/commands/mastermind/master.md +100 -46
- package/.claude/commands/mastermind/ops.md +4 -0
- package/.claude/commands/mastermind/release.md +4 -0
- package/.claude/commands/mastermind/research.md +4 -0
- package/.claude/commands/mastermind/review.md +4 -0
- package/.claude/commands/mastermind/runorg.md +5 -3
- package/.claude/commands/mastermind/sales.md +4 -0
- package/.claude/commands/mastermind/techport.md +9 -0
- package/.claude/commands/monomind/do.md +5 -1
- package/.claude/commands/monomind/idea.md +5 -1
- package/.claude/commands/monomind/improve.md +5 -1
- package/.claude/commands/monomind/repeat.md +85 -29
- package/.claude/commands/monomind/review.md +6 -2
- package/.claude/commands/monomind/understand.md +10 -8
- package/.claude/helpers/extras-registry.json +235 -235
- package/.claude/helpers/graphify-freshen.cjs +13 -1
- package/.claude/helpers/hook-handler.cjs +1 -1
- package/.claude/helpers/router.cjs +4 -1
- package/.claude/skills/mastermind/_protocol.md +37 -21
- package/.claude/skills/mastermind/access.md +236 -0
- package/.claude/skills/mastermind/activity.md +191 -0
- package/.claude/skills/mastermind/adapter-manager.md +259 -0
- package/.claude/skills/mastermind/adapters.md +204 -0
- package/.claude/skills/mastermind/agent-detail.md +242 -0
- package/.claude/skills/mastermind/agents.md +178 -0
- package/.claude/skills/mastermind/approval-detail.md +259 -0
- package/.claude/skills/mastermind/approve.md +181 -0
- package/.claude/skills/mastermind/architect.md +24 -8
- package/.claude/skills/mastermind/backup.md +197 -0
- package/.claude/skills/mastermind/bootstrap.md +190 -0
- package/.claude/skills/mastermind/budgets.md +237 -0
- package/.claude/skills/mastermind/companies.md +256 -0
- package/.claude/skills/mastermind/costs.md +151 -0
- package/.claude/skills/mastermind/createorg.md +23 -5
- package/.claude/skills/mastermind/diagnose.md +249 -0
- package/.claude/skills/mastermind/env.md +198 -0
- package/.claude/skills/mastermind/environments.md +250 -0
- package/.claude/skills/mastermind/export.md +324 -0
- package/.claude/skills/mastermind/goal-detail.md +255 -0
- package/.claude/skills/mastermind/goals.md +149 -0
- package/.claude/skills/mastermind/heartbeat.md +164 -0
- package/.claude/skills/mastermind/idea.md +318 -186
- package/.claude/skills/mastermind/import.md +281 -0
- package/.claude/skills/mastermind/inbox.md +214 -0
- package/.claude/skills/mastermind/instance-settings.md +315 -0
- package/.claude/skills/mastermind/instance.md +231 -0
- package/.claude/skills/mastermind/invite-landing.md +227 -0
- package/.claude/skills/mastermind/invites.md +254 -0
- package/.claude/skills/mastermind/issue-detail.md +291 -0
- package/.claude/skills/mastermind/issues.md +235 -0
- package/.claude/skills/mastermind/join-queue.md +170 -0
- package/.claude/skills/mastermind/liveness.md +392 -0
- package/.claude/skills/mastermind/memory.md +321 -0
- package/.claude/skills/mastermind/my-issues.md +146 -0
- package/.claude/skills/mastermind/new-agent.md +241 -0
- package/.claude/skills/mastermind/org-chart.md +207 -0
- package/.claude/skills/mastermind/org-settings.md +217 -0
- package/.claude/skills/mastermind/plan-to-tasks.md +136 -0
- package/.claude/skills/mastermind/plugin-manager.md +241 -0
- package/.claude/skills/mastermind/plugin-settings.md +273 -0
- package/.claude/skills/mastermind/plugins.md +190 -0
- package/.claude/skills/mastermind/profile.md +187 -0
- package/.claude/skills/mastermind/project-detail.md +249 -0
- package/.claude/skills/mastermind/project-workspace.md +244 -0
- package/.claude/skills/mastermind/projects.md +164 -0
- package/.claude/skills/mastermind/routine-detail.md +253 -0
- package/.claude/skills/mastermind/routines.md +202 -0
- package/.claude/skills/mastermind/runorg.md +74 -9
- package/.claude/skills/mastermind/search.md +186 -0
- package/.claude/skills/mastermind/secrets.md +199 -0
- package/.claude/skills/mastermind/skills.md +156 -0
- package/.claude/skills/mastermind/tasks.md +149 -0
- package/.claude/skills/mastermind/techport.md +5 -5
- package/.claude/skills/mastermind/threads.md +259 -0
- package/.claude/skills/mastermind/tree-control.md +250 -0
- package/.claude/skills/mastermind/wiki.md +314 -0
- package/.claude/skills/mastermind/workspace-detail.md +317 -0
- package/.claude/skills/mastermind/workspaces.md +261 -0
- package/.claude/skills/mastermind/worktree.md +187 -0
- package/dist/src/init/executor.js +8 -8
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +12 -0
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/ui/.monomind/data/ranked-context.json +1 -1
- package/dist/src/ui/.monomind/loops/mastermind-review-1778664132789.json +16 -0
- package/dist/src/ui/.monomind/sessions/current.json +5 -5
- package/dist/src/ui/.monomind/sessions/session-1776778451399.json +15 -0
- package/dist/src/ui/dashboard.html +3030 -181
- package/dist/src/ui/data/mastermind-events.jsonl +8 -0
- package/dist/src/ui/data/mastermind-sessions.json +1 -0
- package/dist/src/ui/server.mjs +738 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/.claude/skills/.monomind/data/ranked-context.json +0 -5
- package/.claude/skills/.monomind/sessions/current.json +0 -13
- package/.claude/skills/.monomind/sessions/session-1777829336455.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777831614725.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777832095857.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777839814183.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777841847131.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777843309463.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777880867159.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777881884593.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777884090471.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777884808221.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777885672155.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777886852818.json +0 -15
- package/.claude/skills/.monomind/sessions/session-1777896532690.json +0 -15
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mastermind-secrets
|
|
3
|
+
description: Mastermind secrets — manage org-scoped API keys and secrets consumed by agents. Store, rotate, list, and audit secrets without exposing values in logs or state files.
|
|
4
|
+
type: domain-skill
|
|
5
|
+
default_mode: confirm
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Mastermind Secrets
|
|
9
|
+
|
|
10
|
+
This skill is invoked by `mastermind:secrets` or directly via `/mastermind:secrets`.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Inputs
|
|
15
|
+
|
|
16
|
+
- `brain_context`: BRAIN CONTEXT block
|
|
17
|
+
- `org_name`: org to manage secrets for
|
|
18
|
+
- `action`: list | set | rotate | revoke | audit
|
|
19
|
+
- `secret_name`: name/key of the secret (e.g. `OPENAI_API_KEY`, `SLACK_WEBHOOK`)
|
|
20
|
+
- `secret_value`: value to store (only ever passed as env var reference, NEVER hardcoded)
|
|
21
|
+
- `provider`: local | env | vault (default: local)
|
|
22
|
+
- `caller`: command | master
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Step 0 — Brain Load (standalone only)
|
|
27
|
+
|
|
28
|
+
If `caller` is not "command", load brain context following _protocol.md Brain Load Procedure with namespace: `ops`.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## SECURITY RULES (always enforced)
|
|
33
|
+
|
|
34
|
+
- NEVER print secret values to stdout
|
|
35
|
+
- NEVER store secret values in state files (store only masked references: `sk-ant-***...***`)
|
|
36
|
+
- NEVER commit secrets to git
|
|
37
|
+
- Secrets passed as `secret_value` MUST come from env vars (`$MY_KEY`), NOT inline strings
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Step 1 — Load Secrets Registry
|
|
42
|
+
|
|
43
|
+
The secrets registry stores **metadata only** (name, provider, masked hint, rotation date):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
secretsFile=".monomind/orgs/${org_name}-secrets.json"
|
|
47
|
+
[ ! -f "$secretsFile" ] && echo '{"secrets":[]}' > "$secretsFile"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Actual secret values live in:
|
|
51
|
+
- `local`: `.monomind/orgs/.secrets/<org_name>/<name>` (chmod 600, gitignored)
|
|
52
|
+
- `env`: environment variable `ORG_<ORG_NAME_UPPER>_<SECRET_NAME_UPPER>`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Step 2 — Execute Action
|
|
57
|
+
|
|
58
|
+
### list (default)
|
|
59
|
+
|
|
60
|
+
Show all registered secrets for this org (metadata only, masked values):
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
jq -r '
|
|
64
|
+
.secrets[] |
|
|
65
|
+
"[\(.name)] provider=\(.provider) hint=\(.masked_hint // "***") set=\(.set_at // "unknown") rotated=\(.rotated_at // "never")"
|
|
66
|
+
' "$secretsFile" 2>/dev/null || echo "No secrets registered."
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Render as:
|
|
70
|
+
```
|
|
71
|
+
SECRETS — org: <org_name>
|
|
72
|
+
──────────────────────────────────────────────
|
|
73
|
+
NAME PROVIDER VALUE HINT SET ROTATED
|
|
74
|
+
ANTHROPIC_API_KEY local sk-ant-***... 2 days ago —
|
|
75
|
+
SLACK_WEBHOOK env https://hooks 1 week ago —
|
|
76
|
+
GITHUB_TOKEN local ghp_***... 3 days ago 1 day ago
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### set
|
|
80
|
+
|
|
81
|
+
Store a secret value. Always source from env var:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Validate secret_name (alphanumeric + underscore only)
|
|
85
|
+
echo "$secret_name" | grep -qE '^[A-Z][A-Z0-9_]{0,63}$' || { echo "ERROR: secret_name must be uppercase letters, digits, underscores only."; exit 1; }
|
|
86
|
+
|
|
87
|
+
# Create secure storage dir
|
|
88
|
+
secretDir=".monomind/orgs/.secrets/${org_name}"
|
|
89
|
+
mkdir -p "$secretDir"
|
|
90
|
+
chmod 700 "$secretDir"
|
|
91
|
+
|
|
92
|
+
# Write value from env var reference — NEVER inline
|
|
93
|
+
if [ -z "${secret_value}" ]; then
|
|
94
|
+
echo "ERROR: Pass the secret value as an env var: secret_value=\$MY_VAR /mastermind:secrets --action set"
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
secretFile="${secretDir}/${secret_name}"
|
|
99
|
+
printf '%s' "$secret_value" > "$secretFile"
|
|
100
|
+
chmod 600 "$secretFile"
|
|
101
|
+
|
|
102
|
+
# Store masked hint (first 6 chars + ***)
|
|
103
|
+
hint="${secret_value:0:6}***...${secret_value: -3}"
|
|
104
|
+
|
|
105
|
+
# Register in secrets metadata
|
|
106
|
+
tmp="${secretsFile}.tmp"
|
|
107
|
+
jq --arg name "$secret_name" \
|
|
108
|
+
--arg provider "${provider:-local}" \
|
|
109
|
+
--arg hint "$hint" \
|
|
110
|
+
--arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
111
|
+
'.secrets = [.secrets[] | select(.name != $name)] +
|
|
112
|
+
[{"name":$name,"provider":$provider,"masked_hint":$hint,"set_at":$ts}]' \
|
|
113
|
+
"$secretsFile" > "$tmp" && mv "$tmp" "$secretsFile"
|
|
114
|
+
|
|
115
|
+
echo "Secret $secret_name stored (provider: ${provider:-local})"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Ensure `.monomind/orgs/.secrets/` is in `.gitignore`:
|
|
119
|
+
```bash
|
|
120
|
+
grep -q '.monomind/orgs/.secrets' .gitignore 2>/dev/null || echo '.monomind/orgs/.secrets/' >> .gitignore
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### rotate
|
|
124
|
+
|
|
125
|
+
Generate a new value from env var and update:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# Same as set but also records rotated_at
|
|
129
|
+
tmp="${secretsFile}.tmp"
|
|
130
|
+
jq --arg name "$secret_name" --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
131
|
+
'.secrets = [.secrets[] | if .name == $name then .rotated_at = $ts | .set_at = $ts else . end]' \
|
|
132
|
+
"$secretsFile" > "$tmp" && mv "$tmp" "$secretsFile"
|
|
133
|
+
# Then re-run the set logic above with new value
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### revoke
|
|
137
|
+
|
|
138
|
+
Remove secret value and registry entry:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
rm -f ".monomind/orgs/.secrets/${org_name}/${secret_name}"
|
|
142
|
+
tmp="${secretsFile}.tmp"
|
|
143
|
+
jq --arg name "$secret_name" '.secrets = [.secrets[] | select(.name != $name)]' \
|
|
144
|
+
"$secretsFile" > "$tmp" && mv "$tmp" "$secretsFile"
|
|
145
|
+
echo "Secret $secret_name revoked."
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### audit
|
|
149
|
+
|
|
150
|
+
Show which agents reference each secret in their adapter_config or responsibilities:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
orgFile=".monomind/orgs/${org_name}.json"
|
|
154
|
+
echo "=== SECRET USAGE AUDIT — org: $org_name ==="
|
|
155
|
+
jq -r '.roles[] | "\(.id): \(.responsibilities | join(", "))"' "$orgFile" | \
|
|
156
|
+
while IFS=: read -r role resp; do
|
|
157
|
+
refs=$(jq -r '.secrets[].name' "$secretsFile" | while read -r sname; do
|
|
158
|
+
echo "$resp" | grep -q "$sname" && echo " → $sname"
|
|
159
|
+
done)
|
|
160
|
+
[ -n "$refs" ] && echo "$role$refs"
|
|
161
|
+
done
|
|
162
|
+
echo "(Audit checks responsibilities text only — review agent prompts manually for additional references)"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## How Agents Access Secrets
|
|
168
|
+
|
|
169
|
+
Agents spawned by the boss should read secrets via:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Read from local storage (not env):
|
|
173
|
+
secret=$(cat ".monomind/orgs/.secrets/${orgName}/${SECRET_NAME}" 2>/dev/null)
|
|
174
|
+
[ -z "$secret" ] && secret="${!SECRET_NAME}" # Fallback to env var
|
|
175
|
+
|
|
176
|
+
# Use in API calls:
|
|
177
|
+
curl -H "Authorization: Bearer $secret" ...
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Never store secret values in memory namespace or state files.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Step 3 — Return Output
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
domain: ops
|
|
188
|
+
status: complete
|
|
189
|
+
action: <action>
|
|
190
|
+
org: <org_name>
|
|
191
|
+
secret_name: <name if applicable>
|
|
192
|
+
secrets_count: <N>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Step 4 — Brain Write (standalone only)
|
|
198
|
+
|
|
199
|
+
If `caller` is not "command", follow _protocol.md Brain Write Procedure for domain `ops`.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mastermind-skills
|
|
3
|
+
description: Mastermind skills — list, sync, and map skills available to org agents. Scans .claude/skills/ directory and shows which roles have access to which skill domains.
|
|
4
|
+
type: domain-skill
|
|
5
|
+
default_mode: auto
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Mastermind Skills
|
|
9
|
+
|
|
10
|
+
This skill is invoked by `mastermind:skills` or directly via `/mastermind:skills`.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Inputs
|
|
15
|
+
|
|
16
|
+
- `brain_context`: BRAIN CONTEXT block (injected by command, or loaded below if standalone)
|
|
17
|
+
- `org_name`: org to inspect skills for (optional — shows all skills if omitted)
|
|
18
|
+
- `action`: list | sync | map | enable | disable
|
|
19
|
+
- `skill_name`: skill slug (required for enable/disable)
|
|
20
|
+
- `role_id`: role to map skill to (optional)
|
|
21
|
+
- `caller`: command | master
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Step 0 — Brain Load (standalone only)
|
|
26
|
+
|
|
27
|
+
If `caller` is not "command", load brain context following _protocol.md Brain Load Procedure with namespace: `ops`.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Step 1 — Scan Skills Directory
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
skillsDir=".claude/skills"
|
|
35
|
+
[ ! -d "$skillsDir" ] && { echo "ERROR: No .claude/skills/ directory found."; exit 1; }
|
|
36
|
+
|
|
37
|
+
# List all skill files recursively
|
|
38
|
+
allSkills=$(find "$skillsDir" -name "*.md" ! -name "_*" | sort)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Step 2 — Execute Action
|
|
44
|
+
|
|
45
|
+
### list (default)
|
|
46
|
+
|
|
47
|
+
Display all available skills with metadata:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
echo "AVAILABLE SKILLS"
|
|
51
|
+
echo "────────────────────────────────────────────────────────"
|
|
52
|
+
printf "%-30s %-15s %-10s %s\n" "NAME" "TYPE" "MODE" "DESCRIPTION"
|
|
53
|
+
echo "────────────────────────────────────────────────────────"
|
|
54
|
+
|
|
55
|
+
for f in $allSkills; do
|
|
56
|
+
skillSlug=$(basename "$f" .md)
|
|
57
|
+
domain=$(dirname "$f" | sed "s|$skillsDir/||")
|
|
58
|
+
skillType=$(grep -m1 "^type:" "$f" 2>/dev/null | awk '{print $2}')
|
|
59
|
+
skillMode=$(grep -m1 "^default_mode:" "$f" 2>/dev/null | awk '{print $2}')
|
|
60
|
+
skillDesc=$(grep -m1 "^description:" "$f" 2>/dev/null | sed 's/^description: //' | cut -c1-60)
|
|
61
|
+
printf "%-30s %-15s %-10s %s\n" "${domain}:${skillSlug}" "${skillType:-skill}" "${skillMode:-auto}" "$skillDesc"
|
|
62
|
+
done
|
|
63
|
+
|
|
64
|
+
echo ""
|
|
65
|
+
echo "Total: $(echo "$allSkills" | wc -l | tr -d ' ') skills"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### map
|
|
69
|
+
|
|
70
|
+
Show which skills are mapped to each role in the org:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
orgFile=".monomind/orgs/${org_name}.json"
|
|
74
|
+
[ ! -f "$orgFile" ] && { echo "ERROR: Org '$org_name' not found."; exit 1; }
|
|
75
|
+
|
|
76
|
+
echo "SKILL MAP — org: $org_name"
|
|
77
|
+
echo "────────────────────────────────────────────────────────"
|
|
78
|
+
|
|
79
|
+
jq -r '.roles[] | "[\(.id)] \(.title) agent_type=\(.agent_type)"' "$orgFile" | while IFS= read -r line; do
|
|
80
|
+
echo "$line"
|
|
81
|
+
roleId=$(echo "$line" | grep -o '^\[[^]]*\]' | tr -d '[]')
|
|
82
|
+
# Show skills configured for this role
|
|
83
|
+
mappedSkills=$(jq -r --arg id "$roleId" \
|
|
84
|
+
'.roles[] | select(.id == $id) | .skills // [] | join(", ")' \
|
|
85
|
+
"$orgFile" 2>/dev/null)
|
|
86
|
+
if [ -n "$mappedSkills" ] && [ "$mappedSkills" != "null" ]; then
|
|
87
|
+
echo " Skills: $mappedSkills"
|
|
88
|
+
else
|
|
89
|
+
echo " Skills: (inherited from agent_type)"
|
|
90
|
+
fi
|
|
91
|
+
echo ""
|
|
92
|
+
done
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### sync
|
|
96
|
+
|
|
97
|
+
Refresh the skill registry by re-scanning `.claude/skills/` and updating org config with available skill slugs:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
skillsDir=".claude/skills"
|
|
101
|
+
skillList=$(find "$skillsDir" -name "*.md" ! -name "_*" -exec basename {} .md \; | sort | jq -Rsc 'split("\n") | map(select(. != ""))')
|
|
102
|
+
|
|
103
|
+
if [ -n "$org_name" ]; then
|
|
104
|
+
orgFile=".monomind/orgs/${org_name}.json"
|
|
105
|
+
tmp="${orgFile}.tmp"
|
|
106
|
+
jq --argjson skills "$skillList" '.available_skills = $skills' "$orgFile" > "$tmp" && mv "$tmp" "$orgFile"
|
|
107
|
+
echo "Synced $(echo "$skillList" | jq 'length') skills → org: $org_name"
|
|
108
|
+
else
|
|
109
|
+
echo "Available skills:"
|
|
110
|
+
echo "$skillList" | jq -r '.[]'
|
|
111
|
+
echo ""
|
|
112
|
+
echo "Pass --org <name> to sync skills into a specific org config."
|
|
113
|
+
fi
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### enable / disable
|
|
117
|
+
|
|
118
|
+
Add or remove a skill from a role's allowed list:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
orgFile=".monomind/orgs/${org_name}.json"
|
|
122
|
+
[ ! -f "$orgFile" ] && { echo "ERROR: Org '$org_name' not found."; exit 1; }
|
|
123
|
+
[ -z "$skill_name" ] && { echo "ERROR: --skill-name required."; exit 1; }
|
|
124
|
+
[ -z "$role_id" ] && { echo "ERROR: --role-id required for enable/disable."; exit 1; }
|
|
125
|
+
|
|
126
|
+
tmp="${orgFile}.tmp"
|
|
127
|
+
if [ "$action" = "enable" ]; then
|
|
128
|
+
jq --arg id "$role_id" --arg skill "$skill_name" \
|
|
129
|
+
'.roles = [.roles[] | if .id == $id then .skills = ((.skills // []) + [$skill] | unique) else . end]' \
|
|
130
|
+
"$orgFile" > "$tmp" && mv "$tmp" "$orgFile"
|
|
131
|
+
echo "Enabled skill '$skill_name' for role '$role_id'"
|
|
132
|
+
else
|
|
133
|
+
jq --arg id "$role_id" --arg skill "$skill_name" \
|
|
134
|
+
'.roles = [.roles[] | if .id == $id then .skills = ((.skills // []) | map(select(. != $skill))) else . end]' \
|
|
135
|
+
"$orgFile" > "$tmp" && mv "$tmp" "$orgFile"
|
|
136
|
+
echo "Disabled skill '$skill_name' for role '$role_id'"
|
|
137
|
+
fi
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Step 3 — Return Output
|
|
143
|
+
|
|
144
|
+
```yaml
|
|
145
|
+
domain: ops
|
|
146
|
+
status: complete
|
|
147
|
+
action: <action>
|
|
148
|
+
org: <org_name if provided>
|
|
149
|
+
skills_found: <N>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Step 4 — Brain Write (standalone only)
|
|
155
|
+
|
|
156
|
+
If `caller` is not "command", follow _protocol.md Brain Write Procedure for domain `ops`.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mastermind-tasks
|
|
3
|
+
description: Mastermind tasks — view, create, assign, and move tasks on an org's task board. Supports parent-child chains, goal linkage, and status filtering.
|
|
4
|
+
type: domain-skill
|
|
5
|
+
default_mode: auto
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Mastermind Tasks
|
|
9
|
+
|
|
10
|
+
This skill is invoked by `mastermind:tasks` or directly via `/mastermind:tasks`.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Inputs
|
|
15
|
+
|
|
16
|
+
- `brain_context`: BRAIN CONTEXT block
|
|
17
|
+
- `org_name`: org whose board to manage
|
|
18
|
+
- `action`: list | create | assign | move | close | chain
|
|
19
|
+
- `task_title`: title for create
|
|
20
|
+
- `task_id`: card id for assign/move/close
|
|
21
|
+
- `role_id`: role to assign the task to
|
|
22
|
+
- `parent_id`: parent task id (for hierarchical task chains)
|
|
23
|
+
- `goal_ref`: goal slug this task contributes to (links task to goal)
|
|
24
|
+
- `status`: todo | doing | done (for move)
|
|
25
|
+
- `caller`: command | master
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Step 0 — Brain Load (standalone only)
|
|
30
|
+
|
|
31
|
+
If `caller` is not "command", load brain context following _protocol.md Brain Load Procedure with namespace: `ops`.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step 1 — Load Org Config
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
orgFile=".monomind/orgs/${org_name}.json"
|
|
39
|
+
board_id=$(jq -r '.board_id // empty' "$orgFile")
|
|
40
|
+
todo_col=$(jq -r '.todo_col_id // empty' "$orgFile")
|
|
41
|
+
doing_col=$(jq -r '.doing_col_id // empty' "$orgFile")
|
|
42
|
+
done_col=$(jq -r '.done_col_id // empty' "$orgFile")
|
|
43
|
+
|
|
44
|
+
[ -z "$board_id" ] && { echo "ERROR: org config missing board_id — run /mastermind:createorg to rebuild."; exit 1; }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Step 2 — Execute Action
|
|
50
|
+
|
|
51
|
+
### list (default)
|
|
52
|
+
|
|
53
|
+
Show all tasks grouped by column with role labels and parent chains:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
echo "=== TODO ==="
|
|
57
|
+
monotask card list $board_id --col $todo_col --json | jq -r '.[] | "[\(.id)] \(.title) role=\(.labels // [] | map(select(startswith("role:"))) | .[0] // "unassigned")"'
|
|
58
|
+
|
|
59
|
+
echo "=== DOING ==="
|
|
60
|
+
monotask card list $board_id --col $doing_col --json | jq -r '.[] | "[\(.id)] \(.title) role=\(.labels // [] | map(select(startswith("role:"))) | .[0] // "unassigned")"'
|
|
61
|
+
|
|
62
|
+
echo "=== DONE ==="
|
|
63
|
+
monotask card list $board_id --col $done_col --json | jq -r '.[] | "[\(.id)] \(.title)"'
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Render as:
|
|
67
|
+
```
|
|
68
|
+
TASKS — org: <org_name>
|
|
69
|
+
──────────────────────────────────────────────
|
|
70
|
+
TODO (N)
|
|
71
|
+
[abc123] Write homepage copy → role:content-writer
|
|
72
|
+
[def456] └─ Draft hero section → role:content-writer (child of abc123)
|
|
73
|
+
|
|
74
|
+
DOING (N)
|
|
75
|
+
[ghi789] Review brand guidelines → role:reviewer
|
|
76
|
+
|
|
77
|
+
DONE (N)
|
|
78
|
+
[jkl012] Research competitor sites
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### create
|
|
82
|
+
|
|
83
|
+
Create a task card and optionally link it to a parent or goal:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
CARD_ID=$(monotask card create $board_id $todo_col "$task_title" --json | jq -r .id)
|
|
87
|
+
[ -n "$role_id" ] && monotask card label add $board_id $CARD_ID "role:${role_id}"
|
|
88
|
+
[ -n "$parent_id" ] && monotask card subtask add $board_id $CARD_ID $board_id $todo_col "$task_title" --json
|
|
89
|
+
[ -n "$goal_ref" ] && monotask card label add $board_id $CARD_ID "goal:${goal_ref}"
|
|
90
|
+
echo "Created task: $CARD_ID"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Emit `org:task:created` event to dashboard.
|
|
94
|
+
|
|
95
|
+
### assign
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
[ -n "$role_id" ] && monotask card label add $board_id $task_id "role:${role_id}"
|
|
99
|
+
echo "Assigned task $task_id to role $role_id"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### move
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
case "$status" in
|
|
106
|
+
todo) col_target=$todo_col ;;
|
|
107
|
+
doing) col_target=$doing_col ;;
|
|
108
|
+
done) col_target=$done_col ;;
|
|
109
|
+
esac
|
|
110
|
+
monotask card move $board_id $task_id $col_target
|
|
111
|
+
echo "Moved task $task_id to $status"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Emit `org:task:moved` event.
|
|
115
|
+
|
|
116
|
+
### chain
|
|
117
|
+
|
|
118
|
+
Build a task chain (parent → child sequence) from a list of task titles:
|
|
119
|
+
|
|
120
|
+
Parse `task_title` as newline-separated titles. Create each card in order, linking each as a prerequisite of the next:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
prev_id=""
|
|
124
|
+
while IFS= read -r title; do
|
|
125
|
+
CARD_ID=$(monotask card create $board_id $todo_col "$title" --json | jq -r .id)
|
|
126
|
+
[ -n "$role_id" ] && monotask card label add $board_id $CARD_ID "role:${role_id}"
|
|
127
|
+
[ -n "$prev_id" ] && monotask card prerequisite add $board_id $CARD_ID $board_id $prev_id
|
|
128
|
+
prev_id=$CARD_ID
|
|
129
|
+
echo " Created: [$CARD_ID] $title"
|
|
130
|
+
done <<< "$task_title"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Step 3 — Return Output
|
|
136
|
+
|
|
137
|
+
```yaml
|
|
138
|
+
domain: ops
|
|
139
|
+
status: complete
|
|
140
|
+
action: <action>
|
|
141
|
+
org: <org_name>
|
|
142
|
+
task_id: <task_id if applicable>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Step 4 — Brain Write (standalone only)
|
|
148
|
+
|
|
149
|
+
If `caller` is not "command", follow _protocol.md Brain Write Procedure for domain `ops`.
|
|
@@ -67,7 +67,7 @@ HINT_TERMS="{focus_hint}"
|
|
|
67
67
|
# If HINT_TERMS is empty or unset (no focus_hint provided), default to: core architecture skills commands hooks agents
|
|
68
68
|
[ -z "$HINT_TERMS" ] && HINT_TERMS="core architecture skills commands hooks agents"
|
|
69
69
|
HINT_PATTERN=$(echo "$HINT_TERMS" | tr ' ' '|')
|
|
70
|
-
find
|
|
70
|
+
find .claude -name "*.md" \
|
|
71
71
|
| xargs grep -liE "$HINT_PATTERN" 2>/dev/null | head -20
|
|
72
72
|
```
|
|
73
73
|
|
|
@@ -78,7 +78,7 @@ find /Users/morteza/Desktop/tools/monobrain/.claude -name "*.md" \
|
|
|
78
78
|
Extract the real conventions — not the stated ones — from the codebase itself:
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
BASE
|
|
81
|
+
BASE=packages/@monomind/cli/src
|
|
82
82
|
|
|
83
83
|
# File name convention
|
|
84
84
|
find "$BASE" -name "*.ts" | grep -v dist | sed 's|.*/||' | \
|
|
@@ -144,7 +144,7 @@ Domain vocab: Agent, Memory, Swarm, Config, Node, Graph, Session, Task, Wo
|
|
|
144
144
|
### 0C — Dependency Direction Constraints
|
|
145
145
|
|
|
146
146
|
```bash
|
|
147
|
-
BASE
|
|
147
|
+
BASE=packages/@monomind/cli/src
|
|
148
148
|
|
|
149
149
|
# Map import directions by directory layer
|
|
150
150
|
for dir in types utils core commands services; do
|
|
@@ -161,7 +161,7 @@ Extract the implied layering from the import ratio. High `imported_by` → leaf/
|
|
|
161
161
|
### 0D — Build Monomind Vocabulary Name Set (for collision detection)
|
|
162
162
|
|
|
163
163
|
```bash
|
|
164
|
-
grep -rhn "^export"
|
|
164
|
+
grep -rhn "^export" packages/@monomind/cli/src \
|
|
165
165
|
--include="*.ts" | grep -v dist | \
|
|
166
166
|
grep -oE "(class|interface|function|const|type|enum) [A-Z][A-Za-z0-9]+" | awk '{print $2}' | sort -u \
|
|
167
167
|
> /tmp/monomind_names.txt
|
|
@@ -655,7 +655,7 @@ else
|
|
|
655
655
|
fi
|
|
656
656
|
|
|
657
657
|
# 2. TypeScript validity
|
|
658
|
-
|
|
658
|
+
npx tsc --noEmit --project packages/@monomind/cli/tsconfig.json 2>&1 | tail -10
|
|
659
659
|
|
|
660
660
|
# 3. Convention spot check
|
|
661
661
|
cat {written_file} | grep -E "^export class|^export interface|^export function" | head -20
|