@geekbeer/minion 3.59.4 → 3.59.10
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/core/meetings/meeting-mcp-server.js +40 -3
- package/core/meetings/meeting-prompt.js +8 -0
- package/docs/api-reference.md +51 -7
- package/docs/task-guides.md +70 -0
- package/linux/meeting-runner.js +1 -0
- package/linux/routes/chat.js +4 -1
- package/package.json +1 -1
- package/rules/core.md +10 -4
- package/win/meeting-runner.js +1 -0
- package/win/minion-cli.ps1 +19 -5
- package/win/routes/chat.js +4 -1
|
@@ -17,7 +17,15 @@
|
|
|
17
17
|
*
|
|
18
18
|
* meeting_leave()
|
|
19
19
|
* Records left_at for this minion. Returns { ok: true }; claude should
|
|
20
|
-
* exit its participation loop after this call.
|
|
20
|
+
* exit its participation loop after this call. **Does NOT delete the
|
|
21
|
+
* meeting room** — only this minion's own departure is recorded.
|
|
22
|
+
*
|
|
23
|
+
* meeting_end()
|
|
24
|
+
* End and delete the meeting room (host minion only). Cascades to
|
|
25
|
+
* participants/messages and pushes end-notices to all other minions
|
|
26
|
+
* so their tmux sessions terminate. Returns { ok: true } or 403 if
|
|
27
|
+
* the calling minion is not the host. Use this when YOU created the
|
|
28
|
+
* meeting (via POST /api/minion/meetings) and the discussion is over.
|
|
21
29
|
*
|
|
22
30
|
* Environment (passed by meeting-runner):
|
|
23
31
|
* MINION_MEETING_ID - meeting UUID
|
|
@@ -105,6 +113,22 @@ async function leave() {
|
|
|
105
113
|
return { ok: true }
|
|
106
114
|
}
|
|
107
115
|
|
|
116
|
+
async function endMeeting() {
|
|
117
|
+
const { resp, data } = await hqFetch(`/api/minion/meetings/${MEETING_ID}`, {
|
|
118
|
+
method: 'DELETE',
|
|
119
|
+
})
|
|
120
|
+
if (resp.status === 404 || data.meeting_ended) {
|
|
121
|
+
return { ok: true, meeting_ended: true }
|
|
122
|
+
}
|
|
123
|
+
if (resp.status === 403) {
|
|
124
|
+
throw new Error(data.error || 'Only the host minion can end this meeting')
|
|
125
|
+
}
|
|
126
|
+
if (!resp.ok) {
|
|
127
|
+
throw new Error(data.error || `end failed: ${resp.status}`)
|
|
128
|
+
}
|
|
129
|
+
return { ok: true }
|
|
130
|
+
}
|
|
131
|
+
|
|
108
132
|
// --- Tool definitions --------------------------------------------------------
|
|
109
133
|
|
|
110
134
|
function toolsList() {
|
|
@@ -143,8 +167,19 @@ function toolsList() {
|
|
|
143
167
|
{
|
|
144
168
|
name: 'meeting_leave',
|
|
145
169
|
description:
|
|
146
|
-
'Leave the meeting
|
|
147
|
-
'
|
|
170
|
+
'Leave the meeting (depart, do NOT delete the room). Records your left_at. ' +
|
|
171
|
+
'Use this when you have been excused but the meeting continues without you. ' +
|
|
172
|
+
'If you are the host and the discussion is over, call meeting_end instead.',
|
|
173
|
+
inputSchema: { type: 'object', properties: {} },
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: 'meeting_end',
|
|
177
|
+
description:
|
|
178
|
+
'End and delete the meeting room (host minion only). Cascades to participants ' +
|
|
179
|
+
'and messages and shuts down every other minion in the room. Call this when ' +
|
|
180
|
+
'YOU created the meeting and the discussion is concluded — meeting_leave only ' +
|
|
181
|
+
'records your own departure and leaves the room hanging. Fails with 403 if you ' +
|
|
182
|
+
'are not the host.',
|
|
148
183
|
inputSchema: { type: 'object', properties: {} },
|
|
149
184
|
},
|
|
150
185
|
]
|
|
@@ -160,6 +195,8 @@ async function handleToolCall(name, args) {
|
|
|
160
195
|
return getState()
|
|
161
196
|
case 'meeting_leave':
|
|
162
197
|
return leave()
|
|
198
|
+
case 'meeting_end':
|
|
199
|
+
return endMeeting()
|
|
163
200
|
default:
|
|
164
201
|
throw new Error(`Unknown tool: ${name}`)
|
|
165
202
|
}
|
|
@@ -34,6 +34,14 @@ function buildMeetingKickoffPrompt({ meetingId, title, purpose, host, selfName,
|
|
|
34
34
|
'5. `meeting_wait_for_next_message` の戻り値が `{ meeting_ended: true }` になったら',
|
|
35
35
|
' `meeting_leave` を呼んでループを終了する',
|
|
36
36
|
'',
|
|
37
|
+
'## ミーティングの終了 (leave と end の使い分け)',
|
|
38
|
+
'',
|
|
39
|
+
'- **`meeting_leave`**: 自分だけ退席する。ルームは残り、他参加者は続行可能。',
|
|
40
|
+
' 「あなただけ退席してOK」と明示された時のみ使う。',
|
|
41
|
+
'- **`meeting_end`**: ルームを削除して全員を解散する。**ホストのみ呼び出せる** (403になる)。',
|
|
42
|
+
' あなたが招集したミーティングで議論が終わったら `meeting_end` を呼ぶこと。',
|
|
43
|
+
' `meeting_leave` だけだとルームが孤児として残り続けるので注意。',
|
|
44
|
+
'',
|
|
37
45
|
'## 発言ガイドライン',
|
|
38
46
|
'- 1回の発言は **2-3 文以内** を基本とする (会議でだらだら話さない)',
|
|
39
47
|
'- 議論を前進させる発言を優先する (賛否・確認・代替案・質問)',
|
package/docs/api-reference.md
CHANGED
|
@@ -1046,14 +1046,54 @@ Claudeへの注入例:
|
|
|
1046
1046
|
- Linuxミニオン: `tmux ls | grep '^bt-'` でセッション一覧。WSターミナルからアタッチ可能。
|
|
1047
1047
|
- Windowsミニオン: `wsl tmux ls | grep '^bt-'` で確認 (or HQ ダッシュボードのターミナル一覧で `wsl-tmux` タイプとして表示)。
|
|
1048
1048
|
|
|
1049
|
-
|
|
1049
|
+
ミニオン用スプリント API (v3.59.9〜):
|
|
1050
1050
|
|
|
1051
1051
|
| Method | Endpoint | Description |
|
|
1052
1052
|
|--------|----------|-------------|
|
|
1053
|
-
| GET | `/api/projects/:projectId/sprints` |
|
|
1053
|
+
| GET | `/api/minion/projects/:projectId/sprints` | 一覧 (`?status=planned\|active\|completed` で絞り込み可) |
|
|
1054
|
+
| POST | `/api/minion/projects/:projectId/sprints` | 作成 (作成者は `created_by_minion_id` に記録される) |
|
|
1055
|
+
| GET | `/api/minion/projects/:projectId/sprints/:sprintId` | 詳細 |
|
|
1056
|
+
| PATCH | `/api/minion/projects/:projectId/sprints/:sprintId` | 更新 (status遷移含む) |
|
|
1057
|
+
| DELETE | `/api/minion/projects/:projectId/sprints/:sprintId` | 削除 (`planned` のみ可) |
|
|
1054
1058
|
|
|
1055
|
-
|
|
1056
|
-
|
|
1059
|
+
POST body:
|
|
1060
|
+
```json
|
|
1061
|
+
{
|
|
1062
|
+
"name": "Sprint 1", // required
|
|
1063
|
+
"goal": "結合テスト完了" // optional
|
|
1064
|
+
}
|
|
1065
|
+
```
|
|
1066
|
+
作成時の `status` は常に `planned`。HQダッシュボードで一覧/編集できる。
|
|
1067
|
+
|
|
1068
|
+
PATCH body (status 遷移):
|
|
1069
|
+
```json
|
|
1070
|
+
// planned -> active
|
|
1071
|
+
{ "status": "active" }
|
|
1072
|
+
// → タスクが1件もないと 422 {"error": "sprint_has_no_tasks"}
|
|
1073
|
+
// → DoR 違反 (全タスクに assignee_minion_id + 1件以上の acceptance_criteria が必要) なら
|
|
1074
|
+
// 422 {"error": "definition_of_ready_unmet", "violations": [{task_id, title, missing[]}]}
|
|
1075
|
+
// → 別の active スプリントが既にあると 409 (active_sprint がエラーに同梱される)
|
|
1076
|
+
// 成功時は started_at が自動セットされる
|
|
1077
|
+
|
|
1078
|
+
// active -> completed
|
|
1079
|
+
{ "status": "completed", "unfinished_tasks_action": "return_to_backlog" }
|
|
1080
|
+
// or
|
|
1081
|
+
{ "status": "completed", "unfinished_tasks_action": "carry_over" }
|
|
1082
|
+
// → carry_over の場合、未完タスクは最新の planned スプリントに移動 (無い場合 422)
|
|
1083
|
+
// → return_to_backlog (デフォルト) の場合、未完タスクは sprint_id=null & status='backlog' に戻る
|
|
1084
|
+
// 成功時は completed_at が自動セットされる
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
その他の更新項目 (status と独立に同一PATCHで可):
|
|
1088
|
+
- `name` (空文字不可)
|
|
1089
|
+
- `goal` (null可)
|
|
1090
|
+
|
|
1091
|
+
**重要なルール:**
|
|
1092
|
+
- `planned -> active` または `active -> completed` 以外の status 遷移は 400。
|
|
1093
|
+
- DELETE は `planned` 状態のみ許可 (`active`/`completed` は不可)。
|
|
1094
|
+
- 削除しても紐づくタスクは残る (`sprint_id` だけ NULL になる)。
|
|
1095
|
+
|
|
1096
|
+
状況確認用には標準のタスクAPIで `?sprint_id=<uuid>` を使えば所属タスクを取得できる。
|
|
1057
1097
|
|
|
1058
1098
|
### Project Milestones
|
|
1059
1099
|
|
|
@@ -1989,13 +2029,17 @@ hq note search <project_id> "キーワード"
|
|
|
1989
2029
|
|
|
1990
2030
|
### Meeting Rooms 🧪 (HQ, experimental, v3.59.0〜)
|
|
1991
2031
|
|
|
1992
|
-
ミーティング機能はミニオン上の `meeting` MCP サーバーが叩く HQ
|
|
2032
|
+
ミーティング機能はミニオン上の `meeting` MCP サーバーが叩く HQ エンドポイント。**参加中**の操作は MCP ツール経由で自動的に叩かれるが、**自分で会議を招集する**場合 (例: PMミニオンが朝会を主催) は `POST /api/minion/meetings` をルーティン/スキルから直接叩く。
|
|
1993
2033
|
|
|
1994
2034
|
| Method | Endpoint | Description |
|
|
1995
2035
|
|--------|----------|-------------|
|
|
2036
|
+
| POST | `/api/minion/meetings` | **会議室を作成して参加者を招待する。** Body: `{project_id, title, purpose?, invitees?: [{type: 'user'\|'minion', id}]}`。呼び出し元ミニオンは自動でホスト+参加者になる。プロジェクトメンバーかつ `experimental_meetings` 有効ワークスペースで動作 |
|
|
1996
2037
|
| GET | `/api/minion/meetings/:id` | ミーティングのメタデータ + 参加者一覧。`meeting_get_state` ツールから呼ばれる |
|
|
1997
2038
|
| GET | `/api/minion/meetings/:id/messages?after=<iso>&wait=true` | long-poll で次の発言を待機 (最大 ~25秒)。404 = 会議終了 |
|
|
1998
2039
|
| POST | `/api/minion/meetings/:id/messages` | 発言。Body: `{text}` |
|
|
1999
|
-
| POST | `/api/minion/meetings/:id` | アクション。Body: `{action: 'leave' \| 'heartbeat'}` |
|
|
2040
|
+
| POST | `/api/minion/meetings/:id` | アクション。Body: `{action: 'leave' \| 'heartbeat'}`。`leave` は自分の `left_at` を記録するだけでルームは残る |
|
|
2041
|
+
| DELETE | `/api/minion/meetings/:id` | **ルームを削除して会議を終了する** (ホストミニオン限定、403 if not host)。CASCADE で participants/messages 削除 + 他参加ミニオンに終了通知 push |
|
|
2042
|
+
|
|
2043
|
+
参加中の操作 (GET state / long-poll messages / speak / leave / end / heartbeat) は MCP ツール (`meeting_get_state`, `meeting_wait_for_next_message`, `meeting_speak`, `meeting_leave`, `meeting_end`) として claude に公開されるため、直接叩く必要はない。会議の**作成**だけはルーティン/スキルから明示的に叩く必要がある (作成後は HQ がプッシュした招待で各ミニオンに mt-* tmux セッションが立ち上がる)。
|
|
2000
2044
|
|
|
2001
|
-
|
|
2045
|
+
**leave と end の違い**: `meeting_leave` は自分だけ退席するアクション (ルームは残る)、`meeting_end` (DELETE) はルームごと削除して全員解散させるアクション (ホストミニオン限定)。自分が招集した会議が終わったら必ず `meeting_end` を呼ばないとルームが孤児として残る。
|
package/docs/task-guides.md
CHANGED
|
@@ -702,6 +702,44 @@ curl -X PATCH "$HQ_URL/api/minion/projects/<project-id>/milestones/<m-id>" \
|
|
|
702
702
|
-d '{"status":"in_progress"}'
|
|
703
703
|
```
|
|
704
704
|
|
|
705
|
+
#### 4. スプリント管理 (v3.59.9〜)
|
|
706
|
+
|
|
707
|
+
スプリントはアジャイル運用の単位で、`planned -> active -> completed` の3状態を持つ。
|
|
708
|
+
1プロジェクトにつき `active` は1つだけ。スプリントを `active` にするとボードタスクの
|
|
709
|
+
自動着手 (`board-task-poller`) が起動する。
|
|
710
|
+
|
|
711
|
+
```bash
|
|
712
|
+
# 1. プランドスプリントを作成
|
|
713
|
+
curl -X POST "$HQ_URL/api/minion/projects/<project-id>/sprints" \
|
|
714
|
+
-H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
|
|
715
|
+
-d '{"name":"Sprint 1","goal":"MVP のログイン/サインアップ実装完了"}'
|
|
716
|
+
# レスポンスの id を <sprint-id> として控える
|
|
717
|
+
|
|
718
|
+
# 2. スプリントにタスクをアサイン (タスク作成時 or 更新時)
|
|
719
|
+
curl -X PATCH "$HQ_URL/api/minion/projects/<project-id>/tasks/<task-id>" \
|
|
720
|
+
-H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
|
|
721
|
+
-d '{"sprint_id":"<sprint-id>","acceptance_criteria":[{"id":"...","text":"...","checked":false}]}'
|
|
722
|
+
|
|
723
|
+
# 3. スプリント開始 (DoR チェックが入る — 全タスクに assignee_minion_id + acceptance_criteria 必須)
|
|
724
|
+
curl -X PATCH "$HQ_URL/api/minion/projects/<project-id>/sprints/<sprint-id>" \
|
|
725
|
+
-H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
|
|
726
|
+
-d '{"status":"active"}'
|
|
727
|
+
# 422 {"error":"sprint_has_no_tasks"} → タスクを1件以上追加してから再試行
|
|
728
|
+
# 422 {"error":"definition_of_ready_unmet","violations":[...]} → violations[] の missing を埋めてから再試行
|
|
729
|
+
|
|
730
|
+
# 4. スプリント完了 (未完タスクをバックログに戻すか、次の planned スプリントに持ち越す)
|
|
731
|
+
curl -X PATCH "$HQ_URL/api/minion/projects/<project-id>/sprints/<sprint-id>" \
|
|
732
|
+
-H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
|
|
733
|
+
-d '{"status":"completed","unfinished_tasks_action":"return_to_backlog"}'
|
|
734
|
+
# unfinished_tasks_action: "carry_over" にすると最新の planned スプリントへ移動 (無ければ 422)
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
**スプリント運用のガイドライン:**
|
|
738
|
+
- スプリントを `active` 化する前に、所属タスクが全て **assignee_minion_id を持ち、かつ acceptance_criteria が1件以上** あることを確認する (DoR)。違反タスクは PATCH レスポンスの `violations[]` に列挙される。
|
|
739
|
+
- 既に別のスプリントが `active` だと 409 が返る (`active_sprint` フィールドに既存スプリントが入る)。先にそれを `completed` にする必要がある。
|
|
740
|
+
- DELETE は `planned` 状態のみ可。`active` や `completed` のスプリントは削除できない。
|
|
741
|
+
- スプリント完了時、未完タスクのデフォルト挙動は `return_to_backlog` (status=`backlog`、sprint_id=null)。
|
|
742
|
+
|
|
705
743
|
### Engineer ロールの典型操作
|
|
706
744
|
|
|
707
745
|
#### 1. 自分にアサインされたタスクを取得
|
|
@@ -821,6 +859,38 @@ curl -H "Authorization: Bearer $API_TOKEN" http://localhost:8080/api/meetings/ac
|
|
|
821
859
|
|
|
822
860
|
セッション復帰機構は未実装。tmux/claude が落ちた場合は再起動されず、新しい招待を待つ。
|
|
823
861
|
|
|
862
|
+
### ミーティングを自分で招集する (v3.59.6〜)
|
|
863
|
+
|
|
864
|
+
PMロール等で「自分が会議を主催したい」場合は HQ の `POST /api/minion/meetings` を直接叩く。呼び出し元ミニオンは自動でホスト + 参加者になり、`invitees` で指定した他ミニオン・人間が `meeting_participants` に挿入される。他ミニオンへの招待は HQ がプッシュするので、こちら側で追加処理は不要。
|
|
865
|
+
|
|
866
|
+
```bash
|
|
867
|
+
curl -X POST "$HQ_URL/api/minion/meetings" \
|
|
868
|
+
-H "Authorization: Bearer $API_TOKEN" \
|
|
869
|
+
-H "Content-Type: application/json" \
|
|
870
|
+
-d '{
|
|
871
|
+
"project_id": "<project-uuid>",
|
|
872
|
+
"title": "朝会 2026-05-15",
|
|
873
|
+
"purpose": "前日進捗の共有とブロッカーの洗い出し",
|
|
874
|
+
"invitees": [
|
|
875
|
+
{"type": "minion", "id": "<other-minion-uuid>"},
|
|
876
|
+
{"type": "user", "id": "<user-uuid>"}
|
|
877
|
+
]
|
|
878
|
+
}'
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
**前提条件:**
|
|
882
|
+
- 自分がそのプロジェクトの `project_members` に登録されていること (403 が返るならPMに依頼)
|
|
883
|
+
- プロジェクトが所属する workspace の `feature_flags.experimental_meetings = true` (人間管理者しか有効化できない)
|
|
884
|
+
- 作成成功後、自分自身のミニオンにも招待が届き `mt-{id8}` tmux セッションが起動する
|
|
885
|
+
|
|
886
|
+
**会議の終了 (ホストの責務):**
|
|
887
|
+
自分が招集した会議で議論が終わったら、MCP ツール `meeting_end` を呼んでルームを削除する。`meeting_leave` は自分が退席するだけでルームは残るため、ホストが leave で抜けるとルームが孤児になり HQ ダッシュボードのアクティブ会議室一覧に居座り続ける。`meeting_end` は ホストミニオン限定 (それ以外は 403)。
|
|
888
|
+
|
|
889
|
+
```
|
|
890
|
+
meeting_end() # DELETE /api/minion/meetings/:id を裏で叩く
|
|
891
|
+
# → 全参加ミニオンに終了通知が push され、各 mt-* tmux が終了する
|
|
892
|
+
```
|
|
893
|
+
|
|
824
894
|
## ツール・MCPサーバーのインストール
|
|
825
895
|
|
|
826
896
|
スキルが `requires` で宣言している MCP サーバーや CLI ツールが不足している場合は、`~/.minion/docs/environment-setup.md` の手順に従ってインストールする。
|
package/linux/meeting-runner.js
CHANGED
|
@@ -165,6 +165,7 @@ async function runMeeting({ meetingId, title, purpose, host, hqUrl, selfName, ro
|
|
|
165
165
|
'mcp__meeting__meeting_speak',
|
|
166
166
|
'mcp__meeting__meeting_get_state',
|
|
167
167
|
'mcp__meeting__meeting_leave',
|
|
168
|
+
'mcp__meeting__meeting_end',
|
|
168
169
|
].join(',')
|
|
169
170
|
const llmCommand = `${claudeBin} -p --mcp-config "${mcpConfigFile}" --allowedTools "${allowedTools}" < "${promptFile}"`
|
|
170
171
|
|
package/linux/routes/chat.js
CHANGED
|
@@ -458,8 +458,11 @@ async function buildContextPrefix(message, context, sessionId, workspaceId, refe
|
|
|
458
458
|
` POST \$HQ_URL/api/minion/projects/${context.projectId}/tasks # 作成 (body: title, description?, status?, priority?, milestone_id?, sprint_id?, parent_task_id?, assignee_minion_id?, due_date?, acceptance_criteria?)`,
|
|
459
459
|
` PATCH \$HQ_URL/api/minion/projects/${context.projectId}/tasks/<id> # 更新 (status変更で status_changed_at がサーバ自動更新、acceptance_criteria/sprint_id も更新可。AC更新時は既存idを保持)`,
|
|
460
460
|
` GET \$HQ_URL/api/minion/projects/${context.projectId}/milestones # マイルストーン一覧`,
|
|
461
|
+
` GET \$HQ_URL/api/minion/projects/${context.projectId}/sprints # スプリント一覧 (?status=planned|active|completed で絞り込み可)`,
|
|
462
|
+
` POST \$HQ_URL/api/minion/projects/${context.projectId}/sprints # 作成 (body: name, goal?) — 初期 status は planned`,
|
|
463
|
+
` PATCH \$HQ_URL/api/minion/projects/${context.projectId}/sprints/<id># 更新 (status遷移: planned→active で DoR 検証、active→completed で unfinished_tasks_action=carry_over|return_to_backlog 指定可)`,
|
|
461
464
|
` GET \$HQ_URL/api/minion/projects/${context.projectId}/health # 健康度サマリ (overdue/stalled/マイルストーン進捗。progress_pct は leaf タスク基準)`,
|
|
462
|
-
`タスクは5段階Kanban (backlog→todo→doing→review→done)、親子は2階層まで(孫不可)。priority は low|normal|high|urgent (可視化+フィルタ用)。親EPICに milestone_id
|
|
465
|
+
`タスクは5段階Kanban (backlog→todo→doing→review→done)、親子は2階層まで(孫不可)。priority は low|normal|high|urgent (可視化+フィルタ用)。親EPICに milestone_id を付ければ子タスクも進捗に自動反映される。スプリントは1プロジェクトにつき active=1つだけ、DoR (全タスクに assignee_minion_id + acceptance_criteria) を満たすと active 化可能。詳細は ~/.minion/docs/api-reference.md の「Project Tasks」「Project Milestones」「Project Sprints」「Project Health」を参照。`,
|
|
463
466
|
`取得した内容をもとに回答してください。`
|
|
464
467
|
)
|
|
465
468
|
}
|
package/package.json
CHANGED
package/rules/core.md
CHANGED
|
@@ -33,15 +33,16 @@ Minion
|
|
|
33
33
|
- **script ノード (v3.54.0〜)** は LLM を使わない決定的処理用。`script_runtime` (`'python'` or `'node'`) と `script_source` を指定。input_data を stdin で JSON 受け取り → output_data を stdout に JSON 出力する規約。outgoing edge に contract を貼れば transform と同じ runtime validation が走る。LLMトークンを節約したい・出力ブレを許容できない定型処理に使う。詳細は `~/.minion/docs/task-guides.md` の「Script ノード」を参照
|
|
34
34
|
- **fan_out の incoming edge に contract を貼る場合**、`fan_out_source` が指すフィールドが contract 内に `type='array'` として宣言されている必要がある(静的検証で弾かれる)
|
|
35
35
|
- **Routine**: ミニオンスコープ。ミニオンローカルの定期タスク。
|
|
36
|
-
- **Project Tasks / Milestones**: プロジェクトスコープ。**人間+ミニオンが共有するタスクボード**(5段階Kanban: `backlog`→`todo`→`doing`→`review`→`done`)
|
|
37
|
-
- PMロールは朝のチェックで `/health`
|
|
36
|
+
- **Project Tasks / Milestones / Sprints**: プロジェクトスコープ。**人間+ミニオンが共有するタスクボード**(5段階Kanban: `backlog`→`todo`→`doing`→`review`→`done`)、ロードマップ(マイルストーン)、アジャイル運用単位(スプリント)。ミニオンは `/api/minion/projects/:projectId/{tasks,milestones,sprints,health}` で操作可能。
|
|
37
|
+
- PMロールは朝のチェックで `/health` を叩いて遅延・停滞タスクを把握、ユーザー要望をエピック+子タスクに分解、スプリントに割り当てて active 化
|
|
38
38
|
- Engineerロールは `?assignee_minion_id=$MINION_ID` で自分のタスクを取得し、着手時に `status: doing` へ更新(以降 `status_changed_at` がサーバ側で自動更新され、停滞検出に使われる)
|
|
39
39
|
- 親子は2階層のみ(孫タスク禁止)、担当は **ミニオン or 人間** の二択
|
|
40
40
|
- **priority**: `low` / `normal` / `high` / `urgent` (default `normal`)。可視化とフィルタ用途(並び順は `sort_order` が優先)
|
|
41
41
|
- **`milestone_id` は親 EPIC に付ければ配下の子タスクも自動的にその進捗に含まれる**(effective milestone)。子を個別にひもづけ直す必要はない。`/health` は leaf タスク基準で `progress_pct` を算出する
|
|
42
42
|
- **タスク検索**: `?q=<keyword>` でタイトル+説明の部分一致検索(pg_trgm、日本語OK)、`?priority=high,urgent` でカンマ区切り複数指定
|
|
43
|
+
- **スプリント**: `planned -> active -> completed` の3状態。1プロジェクトにつき `active` は1つだけ。`planned -> active` 遷移時に DoR (全タスクに `assignee_minion_id` + 1件以上の `acceptance_criteria`) を検証し、満たさないと 422 で `violations[]` が返る。`active -> completed` 時は `unfinished_tasks_action` で未完タスクの扱いを選択 (`return_to_backlog` (default) / `carry_over`)
|
|
43
44
|
- **`[task:UUID]` チケットタグ**: HQチャットでユーザーがチケットを指す際に使う形式。受信メッセージに含まれる場合、HQが解決した詳細がプロンプト先頭の「参照チケット」ブロックに同梱される。応答内でチケットへ言及する際にも同タグを使ってよい(HQ側でチップに描画される)
|
|
44
|
-
- 詳細は `~/.minion/docs/api-reference.md` の「Project Tasks」「Project Milestones」「Project Health」と `~/.minion/docs/task-guides.md` の「プロジェクトタスク管理」を参照
|
|
45
|
+
- 詳細は `~/.minion/docs/api-reference.md` の「Project Tasks」「Project Milestones」「Project Sprints」「Project Health」と `~/.minion/docs/task-guides.md` の「プロジェクトタスク管理」を参照
|
|
45
46
|
- **Workspace**: ミニオンは複数のワークスペースに所属でき、スキルやプロジェクトはワークスペース単位でスコープされる。チャットセッションもワークスペース別に分離される。所属ワークスペースはハートビートで自動同期され、`hq list workspaces` で確認できる。
|
|
46
47
|
- ミニオンは複数プロジェクトに `pm`、`engineer`、`accountant` として参加できる。
|
|
47
48
|
|
|
@@ -279,7 +280,7 @@ Routine 実行中は以下もtmuxセッション環境で利用可能:
|
|
|
279
280
|
|
|
280
281
|
## Meeting Participation (ミーティング参加, experimental, v3.59.0〜)
|
|
281
282
|
|
|
282
|
-
HQ からミーティング招待 (`POST /api/meetings/invitations`) を受け取ると、専用 tmux セッション `mt-{meetingId8}` で claude が起動し、`meeting` MCP
|
|
283
|
+
HQ からミーティング招待 (`POST /api/meetings/invitations`) を受け取ると、専用 tmux セッション `mt-{meetingId8}` で claude が起動し、`meeting` MCP サーバー経由で会議に参加する。**自分から会議を招集する** (`POST $HQ_URL/api/minion/meetings`) ことも可能 (v3.59.6〜、PMロール推奨)。詳細は `~/.minion/docs/task-guides.md` の「ミーティングを自分で招集する」を参照。
|
|
283
284
|
|
|
284
285
|
**基本ループ:**
|
|
285
286
|
1. `meeting_get_state` で参加者・目的・タイトルを把握
|
|
@@ -291,6 +292,11 @@ HQ からミーティング招待 (`POST /api/meetings/invitations`) を受け
|
|
|
291
292
|
4. 応答すべきなら `meeting_speak` で **1-3 文程度** の発言を送信
|
|
292
293
|
5. 戻り値が `{ meeting_ended: true }` になったら `meeting_leave` を呼んで終了
|
|
293
294
|
|
|
295
|
+
**`meeting_leave` と `meeting_end` の使い分け** (v3.59.7〜):
|
|
296
|
+
- `meeting_leave` = 自分だけ退席。ルームは残り議論は続行
|
|
297
|
+
- `meeting_end` = ルームごと削除して全員解散 (**ホストミニオンのみ**、403になる)
|
|
298
|
+
- 自分が招集した会議で議論が終わったら **必ず `meeting_end`** を呼ぶこと。`meeting_leave` だけだとルームが孤児として残る
|
|
299
|
+
|
|
294
300
|
**振る舞いのルール:**
|
|
295
301
|
- 発言は短く保つ (会議でだらだら話さない)
|
|
296
302
|
- 他のミニオンの発言と重複しない (既に同じ趣旨を誰かが言っていたら追従しない)
|
package/win/meeting-runner.js
CHANGED
|
@@ -130,6 +130,7 @@ async function runMeeting({ meetingId, title, purpose, host, hqUrl, selfName, ro
|
|
|
130
130
|
'mcp__meeting__meeting_speak',
|
|
131
131
|
'mcp__meeting__meeting_get_state',
|
|
132
132
|
'mcp__meeting__meeting_leave',
|
|
133
|
+
'mcp__meeting__meeting_end',
|
|
133
134
|
].join(',')
|
|
134
135
|
|
|
135
136
|
await fs.writeFile(
|
package/win/minion-cli.ps1
CHANGED
|
@@ -48,10 +48,15 @@ $needsAdmin = $Command -in $adminRequired
|
|
|
48
48
|
# `stop --force` rewrites NSSM AppExit config and may need to kill processes
|
|
49
49
|
# owned by the service account → requires Administrator.
|
|
50
50
|
if ($Command -eq 'stop' -and $Force) { $needsAdmin = $true }
|
|
51
|
+
# `restart --all` triggers the MinionVNC schtask which is registered with
|
|
52
|
+
# /RL HIGHEST, so schtasks /Run requires Administrator.
|
|
53
|
+
if ($Command -eq 'restart' -and $All) { $needsAdmin = $true }
|
|
51
54
|
if ($needsAdmin) {
|
|
52
55
|
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
|
|
53
56
|
if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
|
54
|
-
$label = if ($Command -eq 'stop' -and $Force) { 'stop --force' }
|
|
57
|
+
$label = if ($Command -eq 'stop' -and $Force) { 'stop --force' }
|
|
58
|
+
elseif ($Command -eq 'restart' -and $All) { 'restart --all' }
|
|
59
|
+
else { $Command }
|
|
55
60
|
Write-Host "ERROR: '$label' requires Administrator privileges." -ForegroundColor Red
|
|
56
61
|
Write-Host " Right-click PowerShell and select 'Run as administrator'." -ForegroundColor Yellow
|
|
57
62
|
exit 1
|
|
@@ -614,9 +619,17 @@ function Restart-AllMinionServices {
|
|
|
614
619
|
}
|
|
615
620
|
|
|
616
621
|
# Step 5: Re-trigger user-session logon tasks. schtasks /Run is a no-op if
|
|
617
|
-
# the task is already running
|
|
618
|
-
|
|
619
|
-
|
|
622
|
+
# the task is already running. MinionVNC is /RL HIGHEST so we require
|
|
623
|
+
# Administrator at the entry point (see needsAdmin check above), which
|
|
624
|
+
# is what allows this /Run to succeed.
|
|
625
|
+
foreach ($task in @('MinionVNC', 'MinionWSL')) {
|
|
626
|
+
$output = & schtasks /Run /TN $task 2>&1
|
|
627
|
+
if ($LASTEXITCODE -eq 0) {
|
|
628
|
+
Write-Host "Triggered logon task: $task"
|
|
629
|
+
} else {
|
|
630
|
+
Write-Warn "Logon task '$task' could not be triggered: $output"
|
|
631
|
+
}
|
|
632
|
+
}
|
|
620
633
|
|
|
621
634
|
Write-Host "All minion services restarted"
|
|
622
635
|
}
|
|
@@ -1874,7 +1887,7 @@ switch ($Command) {
|
|
|
1874
1887
|
Write-Host " stop Stop the minion-agent service (graceful)"
|
|
1875
1888
|
Write-Host " stop --force Force-stop all minion services & processes (admin required)"
|
|
1876
1889
|
Write-Host " restart Restart the minion-agent service"
|
|
1877
|
-
Write-Host " restart --all Restart all minion services
|
|
1890
|
+
Write-Host " restart --all Restart all minion services + logon tasks (admin required)"
|
|
1878
1891
|
Write-Host " status Show agent service status"
|
|
1879
1892
|
Write-Host " health Check agent health endpoint"
|
|
1880
1893
|
Write-Host " daemons Show all daemon service status"
|
|
@@ -1902,5 +1915,6 @@ switch ($Command) {
|
|
|
1902
1915
|
Write-Host " minion-cloudflared, then re-trigger MinionVNC/MinionWSL"
|
|
1903
1916
|
Write-Host " logon tasks. Use after Windows Update or when only"
|
|
1904
1917
|
Write-Host " some services came back online."
|
|
1918
|
+
Write-Host " Requires Administrator (MinionVNC schtask is /RL HIGHEST)."
|
|
1905
1919
|
}
|
|
1906
1920
|
}
|
package/win/routes/chat.js
CHANGED
|
@@ -519,8 +519,11 @@ async function buildContextPrefix(message, context, sessionId, workspaceId, refe
|
|
|
519
519
|
` POST \$HQ_URL/api/minion/projects/${context.projectId}/tasks # 作成 (body: title, description?, status?, priority?, milestone_id?, sprint_id?, parent_task_id?, assignee_minion_id?, due_date?, acceptance_criteria?)`,
|
|
520
520
|
` PATCH \$HQ_URL/api/minion/projects/${context.projectId}/tasks/<id> # 更新 (status変更で status_changed_at がサーバ自動更新、acceptance_criteria/sprint_id も更新可。AC更新時は既存idを保持)`,
|
|
521
521
|
` GET \$HQ_URL/api/minion/projects/${context.projectId}/milestones # マイルストーン一覧`,
|
|
522
|
+
` GET \$HQ_URL/api/minion/projects/${context.projectId}/sprints # スプリント一覧 (?status=planned|active|completed で絞り込み可)`,
|
|
523
|
+
` POST \$HQ_URL/api/minion/projects/${context.projectId}/sprints # 作成 (body: name, goal?) — 初期 status は planned`,
|
|
524
|
+
` PATCH \$HQ_URL/api/minion/projects/${context.projectId}/sprints/<id># 更新 (status遷移: planned→active で DoR 検証、active→completed で unfinished_tasks_action=carry_over|return_to_backlog 指定可)`,
|
|
522
525
|
` GET \$HQ_URL/api/minion/projects/${context.projectId}/health # 健康度サマリ (overdue/stalled/マイルストーン進捗。progress_pct は leaf タスク基準)`,
|
|
523
|
-
`タスクは5段階Kanban (backlog→todo→doing→review→done)、親子は2階層まで(孫不可)。priority は low|normal|high|urgent (可視化+フィルタ用)。親EPICに milestone_id
|
|
526
|
+
`タスクは5段階Kanban (backlog→todo→doing→review→done)、親子は2階層まで(孫不可)。priority は low|normal|high|urgent (可視化+フィルタ用)。親EPICに milestone_id を付ければ子タスクも進捗に自動反映される。スプリントは1プロジェクトにつき active=1つだけ、DoR (全タスクに assignee_minion_id + acceptance_criteria) を満たすと active 化可能。詳細は ~/.minion/docs/api-reference.md の「Project Tasks」「Project Milestones」「Project Sprints」「Project Health」を参照。`,
|
|
524
527
|
`取得した内容をもとに回答してください。`
|
|
525
528
|
)
|
|
526
529
|
}
|