@mclawnet/swarm 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/action-parser.test.d.ts +2 -0
- package/dist/__tests__/action-parser.test.d.ts.map +1 -0
- package/dist/__tests__/action-parser.test.js +91 -0
- package/dist/__tests__/action-parser.test.js.map +1 -0
- package/dist/__tests__/migration-roles.test.d.ts +2 -0
- package/dist/__tests__/migration-roles.test.d.ts.map +1 -0
- package/dist/__tests__/migration-roles.test.js +213 -0
- package/dist/__tests__/migration-roles.test.js.map +1 -0
- package/dist/__tests__/retrospective.test.d.ts +2 -0
- package/dist/__tests__/retrospective.test.d.ts.map +1 -0
- package/dist/__tests__/retrospective.test.js +467 -0
- package/dist/__tests__/retrospective.test.js.map +1 -0
- package/dist/__tests__/role-loader.test.d.ts +2 -0
- package/dist/__tests__/role-loader.test.d.ts.map +1 -0
- package/dist/__tests__/role-loader.test.js +217 -0
- package/dist/__tests__/role-loader.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-init.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-init.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-init.test.js +194 -0
- package/dist/__tests__/swarm-coordinator-init.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.js +147 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.js.map +1 -0
- package/dist/__tests__/template-loader.test.d.ts +2 -0
- package/dist/__tests__/template-loader.test.d.ts.map +1 -0
- package/dist/__tests__/template-loader.test.js +103 -0
- package/dist/__tests__/template-loader.test.js.map +1 -0
- package/dist/action-parser.d.ts.map +1 -1
- package/dist/action-parser.js +96 -6
- package/dist/action-parser.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/message-router.d.ts +6 -2
- package/dist/message-router.d.ts.map +1 -1
- package/dist/message-router.js +13 -7
- package/dist/message-router.js.map +1 -1
- package/dist/persistence.d.ts +1 -0
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +26 -3
- package/dist/persistence.js.map +1 -1
- package/dist/retrospective.d.ts +42 -0
- package/dist/retrospective.d.ts.map +1 -0
- package/dist/retrospective.js +307 -0
- package/dist/retrospective.js.map +1 -0
- package/dist/roles/role-loader.d.ts +12 -1
- package/dist/roles/role-loader.d.ts.map +1 -1
- package/dist/roles/role-loader.js +160 -7
- package/dist/roles/role-loader.js.map +1 -1
- package/dist/roles/types.d.ts +26 -2
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/swarm-coordinator.d.ts +10 -2
- package/dist/swarm-coordinator.d.ts.map +1 -1
- package/dist/swarm-coordinator.js +267 -38
- package/dist/swarm-coordinator.js.map +1 -1
- package/dist/templates/template-loader.d.ts +20 -0
- package/dist/templates/template-loader.d.ts.map +1 -0
- package/dist/templates/template-loader.js +117 -0
- package/dist/templates/template-loader.js.map +1 -0
- package/dist/templates/types.d.ts +25 -0
- package/dist/templates/types.d.ts.map +1 -0
- package/dist/templates/types.js +2 -0
- package/dist/templates/types.js.map +1 -0
- package/dist/types.d.ts +13 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -11
- package/roles/analyst-livermore.md +112 -0
- package/roles/designer-rams.md +266 -0
- package/roles/dev-torvalds.md +214 -0
- package/roles/developer.md +22 -1
- package/roles/director-jia.md +286 -0
- package/roles/editor-boyong.md +148 -0
- package/roles/macro-dalio.md +115 -0
- package/roles/planner-maoni.md +306 -0
- package/roles/pm-jobs.md +326 -0
- package/roles/preset-analyst-simons.md +55 -0
- package/roles/preset-architect-knuth.md +55 -0
- package/roles/preset-designer-norman.md +55 -0
- package/roles/preset-designer.md +55 -0
- package/roles/preset-dev-carmack.md +55 -0
- package/roles/preset-dev-gosling.md +55 -0
- package/roles/preset-developer.md +68 -0
- package/roles/preset-manager-grove.md +55 -0
- package/roles/preset-manager-musk.md +55 -0
- package/roles/preset-pm.md +105 -0
- package/roles/preset-researcher-feynman.md +55 -0
- package/roles/preset-reviewer.md +62 -0
- package/roles/preset-strategist-buffett.md +55 -0
- package/roles/preset-strategist-munger.md +55 -0
- package/roles/preset-strategist-sunzi.md +55 -0
- package/roles/preset-tester-beck.md +56 -0
- package/roles/preset-tester.md +63 -0
- package/roles/preset-writer-orwell.md +55 -0
- package/roles/preset-writer.md +55 -0
- package/roles/quant-simons.md +136 -0
- package/roles/queen.md +27 -1
- package/roles/reviewer-martin.md +200 -0
- package/roles/reviewer.md +18 -1
- package/roles/rhythm-tangsan.md +135 -0
- package/roles/risk-taleb.md +112 -0
- package/roles/script-shitiesheng.md +129 -0
- package/roles/storyboard-xuke.md +138 -0
- package/roles/strategist-soros.md +257 -0
- package/roles/tester-beck.md +232 -0
- package/roles/tester.md +19 -1
- package/roles/trader-jones.md +124 -0
- package/roles/vfx-guchangwei.md +129 -0
- package/roles/writer-zhouzi.md +144 -0
- package/templates/dev-team-pro.md +21 -0
- package/templates/dev-team.md +19 -0
- package/templates/minimal.md +14 -0
- package/templates/trading-team.md +22 -0
- package/templates/video-team.md +18 -0
- package/templates/writing-team.md +18 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { initDatabase } from "@mclawnet/memory";
|
|
3
|
+
import { MemoryStore } from "@mclawnet/memory";
|
|
4
|
+
import { EmbeddingService } from "@mclawnet/memory";
|
|
5
|
+
import { BUILTIN_ROLES, pruneMemories, createEmbeddingProviders } from "@mclawnet/memory";
|
|
6
|
+
import { createLogger } from "@mclawnet/logger";
|
|
7
|
+
const log = createLogger({ module: "retrospective" });
|
|
8
|
+
// ── Prompt ─────────────────────────────────────────────────────────
|
|
9
|
+
export const RETROSPECTIVE_PROMPT = `你是一个蜂群任务回顾专家。请分析以下蜂群任务的执行过程,聚焦团队协作层面的分析。
|
|
10
|
+
|
|
11
|
+
注意:个人技术经验由角色在运行时通过 MCP memory_store 工具自行保存,回顾不需要提取个人经验。
|
|
12
|
+
|
|
13
|
+
## 任务描述
|
|
14
|
+
{taskDescription}
|
|
15
|
+
|
|
16
|
+
## 参与角色
|
|
17
|
+
{roleList}
|
|
18
|
+
|
|
19
|
+
## 对话日志(按时间排序)
|
|
20
|
+
{messages}
|
|
21
|
+
|
|
22
|
+
## 要求
|
|
23
|
+
|
|
24
|
+
请输出 JSON 格式的回顾结果,聚焦团队协作分析:
|
|
25
|
+
|
|
26
|
+
1. **角色评估**:评估每个角色的表现
|
|
27
|
+
- qualityScore (0-1):工作质量,考虑正确性、完整性、沟通效率
|
|
28
|
+
- reworkCount:被要求返工的次数
|
|
29
|
+
2. **项目精华**:提取对项目整体有价值的架构决策、技术选型等
|
|
30
|
+
3. **跨角色协作模式**:识别角色间协作的模式或问题
|
|
31
|
+
- 协作模式(哪些角色组合效率高)
|
|
32
|
+
- 沟通效率(信息传递是否及时准确)
|
|
33
|
+
- 角色分配策略(任务分配是否合理)
|
|
34
|
+
- 失败教训(协作层面的问题)
|
|
35
|
+
4. **Skill 改进分析**:回顾本次蜂群任务中使用的 Skill,分析是否需要改进
|
|
36
|
+
对于每个被使用的 Skill,检查:
|
|
37
|
+
1. 该 Skill 的指引在本次任务中是否完全适用?
|
|
38
|
+
2. 是否有角色因为 Skill 指引不足/有误而走了弯路?
|
|
39
|
+
3. 是否有角色发现了 Skill 未覆盖的最佳实践?
|
|
40
|
+
只在有确凿证据时才输出 skillEvolutions,不要凭空产生。
|
|
41
|
+
|
|
42
|
+
输出纯 JSON(不要 markdown 代码块):
|
|
43
|
+
{
|
|
44
|
+
"taskSummary": "...",
|
|
45
|
+
"roleEvaluations": [{
|
|
46
|
+
"roleId": "role-developer",
|
|
47
|
+
"qualityScore": 0.85,
|
|
48
|
+
"reworkCount": 1
|
|
49
|
+
}],
|
|
50
|
+
"projectInsights": [{ "content": "...", "topic": "..." }],
|
|
51
|
+
"crossRolePatterns": ["..."],
|
|
52
|
+
"skillEvolutions": [{
|
|
53
|
+
"skillName": "skill-name",
|
|
54
|
+
"signal": "skill-error-fixed",
|
|
55
|
+
"problem": "具体问题描述",
|
|
56
|
+
"fix": "建议的修正",
|
|
57
|
+
"confidence": 0.8,
|
|
58
|
+
"evidence": "来自哪个角色的哪次交互"
|
|
59
|
+
}]
|
|
60
|
+
}`;
|
|
61
|
+
// ── Helpers ────────────────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Parse JSON from a string, stripping optional markdown code fencing.
|
|
64
|
+
*/
|
|
65
|
+
export function parseRetrospectiveJSON(raw) {
|
|
66
|
+
let cleaned = raw.trim();
|
|
67
|
+
// Strip markdown code fencing: ```json ... ``` or ``` ... ```
|
|
68
|
+
const fenceMatch = cleaned.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);
|
|
69
|
+
if (fenceMatch) {
|
|
70
|
+
cleaned = fenceMatch[1].trim();
|
|
71
|
+
}
|
|
72
|
+
const parsed = JSON.parse(cleaned);
|
|
73
|
+
return {
|
|
74
|
+
taskSummary: parsed.taskSummary ?? "",
|
|
75
|
+
roleEvaluations: parsed.roleEvaluations ?? [],
|
|
76
|
+
projectInsights: parsed.projectInsights ?? [],
|
|
77
|
+
crossRolePatterns: parsed.crossRolePatterns ?? [],
|
|
78
|
+
skillEvolutions: parsed.skillEvolutions ?? [],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build the retrospective prompt by filling in template placeholders.
|
|
83
|
+
*/
|
|
84
|
+
function buildPrompt(snapshot, messages) {
|
|
85
|
+
const taskDescription = snapshot.plan
|
|
86
|
+
? JSON.stringify(snapshot.plan)
|
|
87
|
+
: "No task description available";
|
|
88
|
+
const roleList = snapshot.roles
|
|
89
|
+
.map((r) => `- ${r.roleName} (${r.instanceId}): ${r.status}`)
|
|
90
|
+
.join("\n");
|
|
91
|
+
// Take last 200 messages and format them
|
|
92
|
+
const lastMessages = messages.slice(-200);
|
|
93
|
+
const formattedMessages = lastMessages
|
|
94
|
+
.map((msg) => {
|
|
95
|
+
const from = msg.from || "system";
|
|
96
|
+
const type = msg.type || "unknown";
|
|
97
|
+
const data = JSON.stringify(msg.data || msg).slice(0, 500);
|
|
98
|
+
return `[${from}] ${type}: ${data}`;
|
|
99
|
+
})
|
|
100
|
+
.join("\n");
|
|
101
|
+
return RETROSPECTIVE_PROMPT.replace("{taskDescription}", taskDescription)
|
|
102
|
+
.replace("{roleList}", roleList)
|
|
103
|
+
.replace("{messages}", formattedMessages);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Extract role name from instanceId (e.g. "dev-0" -> "developer", "qn-0" -> "queen").
|
|
107
|
+
* Falls back to the instanceId prefix if no match in snapshot roles.
|
|
108
|
+
*/
|
|
109
|
+
function resolveRoleName(roleId, snapshot) {
|
|
110
|
+
// roleId from the LLM is typically "role-developer" format
|
|
111
|
+
// But we also need to handle the case where the snapshot has role info
|
|
112
|
+
// The roleEvaluation.roleId from the LLM might be "role-developer" or just the roleName
|
|
113
|
+
const cleanId = roleId.replace(/^role-/, "");
|
|
114
|
+
// Check if it matches a known role in the snapshot
|
|
115
|
+
const matchedRole = snapshot.roles.find((r) => r.roleName === cleanId || r.instanceId === cleanId);
|
|
116
|
+
if (matchedRole)
|
|
117
|
+
return matchedRole.roleName;
|
|
118
|
+
// Check if it matches a BUILTIN_ROLES key
|
|
119
|
+
if (BUILTIN_ROLES[cleanId])
|
|
120
|
+
return cleanId;
|
|
121
|
+
return cleanId;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Fallback: produce basic retrospective when claude CLI is unavailable.
|
|
125
|
+
* Only extracts role stats and simple cross-role patterns — no personal experiences.
|
|
126
|
+
*/
|
|
127
|
+
export function fallbackExtraction(messages, snapshot) {
|
|
128
|
+
// Count report messages per role to estimate activity
|
|
129
|
+
const roleMsgCounts = new Map();
|
|
130
|
+
for (const msg of messages) {
|
|
131
|
+
const m = msg;
|
|
132
|
+
if (m.from) {
|
|
133
|
+
roleMsgCounts.set(m.from, (roleMsgCounts.get(m.from) ?? 0) + 1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const roleEvaluations = snapshot.roles.map((role) => {
|
|
137
|
+
const msgCount = roleMsgCounts.get(role.instanceId) ?? 0;
|
|
138
|
+
const mappedRoleId = BUILTIN_ROLES[role.roleName]?.id ?? `role-${role.roleName}`;
|
|
139
|
+
return {
|
|
140
|
+
roleId: mappedRoleId,
|
|
141
|
+
qualityScore: 0.5, // default — no LLM to evaluate
|
|
142
|
+
reworkCount: 0,
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
// Simple cross-role pattern: which roles were active
|
|
146
|
+
const activeRoles = snapshot.roles
|
|
147
|
+
.filter((r) => (roleMsgCounts.get(r.instanceId) ?? 0) > 0)
|
|
148
|
+
.map((r) => r.roleName);
|
|
149
|
+
const crossRolePatterns = activeRoles.length > 1
|
|
150
|
+
? [`Roles ${activeRoles.join(", ")} participated in this swarm`]
|
|
151
|
+
: [];
|
|
152
|
+
return {
|
|
153
|
+
taskSummary: "Retrospective generated via fallback (no LLM analysis available)",
|
|
154
|
+
roleEvaluations,
|
|
155
|
+
projectInsights: [],
|
|
156
|
+
crossRolePatterns,
|
|
157
|
+
skillEvolutions: [],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// ── DB persistence ─────────────────────────────────────────────────
|
|
161
|
+
async function persistToDb(result, swarmId, snapshot, dbPath, swarmStatus = "completed") {
|
|
162
|
+
const db = initDatabase(dbPath);
|
|
163
|
+
try {
|
|
164
|
+
const store = new MemoryStore(db);
|
|
165
|
+
const providers = createEmbeddingProviders();
|
|
166
|
+
const embeddingService = new EmbeddingService(db, providers);
|
|
167
|
+
// Write team-level experiences: crossRolePatterns + projectInsights
|
|
168
|
+
// These are collaboration insights only the retrospective can produce
|
|
169
|
+
const queenRoleId = BUILTIN_ROLES["queen"]?.id ?? "role-queen";
|
|
170
|
+
log.info({
|
|
171
|
+
swarmId,
|
|
172
|
+
crossRolePatterns: result.crossRolePatterns.length,
|
|
173
|
+
projectInsights: result.projectInsights.length,
|
|
174
|
+
roleEvaluations: result.roleEvaluations.length,
|
|
175
|
+
}, "persisting retrospective to memory.db");
|
|
176
|
+
for (const pattern of result.crossRolePatterns) {
|
|
177
|
+
await store.addMemoryWithEmbedding({
|
|
178
|
+
roleId: queenRoleId,
|
|
179
|
+
content: pattern,
|
|
180
|
+
type: "pattern",
|
|
181
|
+
level: "long-term",
|
|
182
|
+
domain: "collaboration",
|
|
183
|
+
importance: 0.7,
|
|
184
|
+
sourceSwarmIds: [swarmId],
|
|
185
|
+
}, embeddingService);
|
|
186
|
+
log.debug({ swarmId, domain: "collaboration" }, "wrote cross-role pattern");
|
|
187
|
+
}
|
|
188
|
+
for (const insight of result.projectInsights) {
|
|
189
|
+
await store.addMemoryWithEmbedding({
|
|
190
|
+
roleId: queenRoleId,
|
|
191
|
+
content: insight.content,
|
|
192
|
+
type: "experience",
|
|
193
|
+
level: "long-term",
|
|
194
|
+
domain: insight.topic || "architecture",
|
|
195
|
+
importance: 0.6,
|
|
196
|
+
sourceSwarmIds: [swarmId],
|
|
197
|
+
}, embeddingService);
|
|
198
|
+
log.debug({ swarmId, topic: insight.topic }, "wrote project insight");
|
|
199
|
+
}
|
|
200
|
+
// Prune memories for each role involved in the swarm
|
|
201
|
+
const vectorIndex = store.getVectorIndex();
|
|
202
|
+
const roleIdsInvolved = new Set();
|
|
203
|
+
for (const evaluation of result.roleEvaluations) {
|
|
204
|
+
const roleName = resolveRoleName(evaluation.roleId, snapshot);
|
|
205
|
+
const roleId = BUILTIN_ROLES[roleName]?.id ?? `role-${roleName}`;
|
|
206
|
+
roleIdsInvolved.add(roleId);
|
|
207
|
+
}
|
|
208
|
+
roleIdsInvolved.add(queenRoleId);
|
|
209
|
+
for (const roleId of roleIdsInvolved) {
|
|
210
|
+
const pruneResult = pruneMemories(roleId, db, vectorIndex);
|
|
211
|
+
log.debug({ roleId, ...pruneResult }, "post-retrospective pruning completed");
|
|
212
|
+
}
|
|
213
|
+
// Update role_stats for each evaluated role
|
|
214
|
+
const isFailure = swarmStatus === "failed";
|
|
215
|
+
for (const evaluation of result.roleEvaluations) {
|
|
216
|
+
const roleName = resolveRoleName(evaluation.roleId, snapshot);
|
|
217
|
+
const roleId = BUILTIN_ROLES[roleName]?.id ?? `role-${roleName}`;
|
|
218
|
+
log.debug({ roleId, qualityScore: evaluation.qualityScore, reworkCount: evaluation.reworkCount, isFailure }, "updating role_stats");
|
|
219
|
+
const existingStats = db
|
|
220
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
221
|
+
.get(roleId);
|
|
222
|
+
const now = Date.now();
|
|
223
|
+
if (existingStats) {
|
|
224
|
+
const tasksCompleted = existingStats.tasks_completed ?? 0;
|
|
225
|
+
const newAvg = ((existingStats.avg_quality_score ?? 0) * tasksCompleted +
|
|
226
|
+
evaluation.qualityScore) /
|
|
227
|
+
(tasksCompleted + 1);
|
|
228
|
+
const column = isFailure ? "tasks_failed" : "tasks_completed";
|
|
229
|
+
db.prepare(`UPDATE role_stats
|
|
230
|
+
SET ${column} = ${column} + 1,
|
|
231
|
+
avg_quality_score = @newAvg,
|
|
232
|
+
updated_at = @now
|
|
233
|
+
WHERE role_id = @roleId`).run({ roleId, newAvg, now });
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
const completed = isFailure ? 0 : 1;
|
|
237
|
+
const failed = isFailure ? 1 : 0;
|
|
238
|
+
db.prepare(`INSERT INTO role_stats (role_id, tasks_completed, tasks_failed, avg_quality_score, avg_rework_count, total_memories, domains, updated_at)
|
|
239
|
+
VALUES (@roleId, @completed, @failed, @score, 0, 0, NULL, @now)`).run({ roleId, completed, failed, score: evaluation.qualityScore, now });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
db.close();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// ── Main entry point ───────────────────────────────────────────────
|
|
248
|
+
export async function runRetrospective(options) {
|
|
249
|
+
const { swarmId, messages, snapshot, dbPath, swarmStatus = "completed" } = options;
|
|
250
|
+
if (messages.length === 0) {
|
|
251
|
+
log.info({ swarmId }, "no messages to analyze, skipping retrospective");
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
let result;
|
|
255
|
+
try {
|
|
256
|
+
// Build the prompt
|
|
257
|
+
const prompt = buildPrompt(snapshot, messages);
|
|
258
|
+
// Call claude CLI asynchronously — pass prompt via stdin to avoid shell injection
|
|
259
|
+
const stdout = await new Promise((resolve, reject) => {
|
|
260
|
+
const child = execFile("claude", ["-p", "-", "--output-format", "json"], { timeout: 120_000, maxBuffer: 10 * 1024 * 1024 }, (err, out) => {
|
|
261
|
+
if (err)
|
|
262
|
+
return reject(err);
|
|
263
|
+
resolve(out);
|
|
264
|
+
});
|
|
265
|
+
child.stdin.end(prompt);
|
|
266
|
+
});
|
|
267
|
+
// The claude CLI with --output-format json returns a JSON object
|
|
268
|
+
// where the actual text content is in result field or the text blocks
|
|
269
|
+
let jsonText = stdout.trim();
|
|
270
|
+
// claude --output-format json wraps the result — try to extract text content
|
|
271
|
+
try {
|
|
272
|
+
const cliOutput = JSON.parse(jsonText);
|
|
273
|
+
// claude CLI JSON output has a "result" field with the text
|
|
274
|
+
if (typeof cliOutput === "object" && cliOutput !== null) {
|
|
275
|
+
if (typeof cliOutput.result === "string") {
|
|
276
|
+
jsonText = cliOutput.result;
|
|
277
|
+
}
|
|
278
|
+
else if (typeof cliOutput.text === "string") {
|
|
279
|
+
jsonText = cliOutput.text;
|
|
280
|
+
}
|
|
281
|
+
else if (Array.isArray(cliOutput.content) &&
|
|
282
|
+
cliOutput.content[0]?.text) {
|
|
283
|
+
jsonText = cliOutput.content[0].text;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// Not valid JSON wrapper, use raw output
|
|
289
|
+
}
|
|
290
|
+
result = parseRetrospectiveJSON(jsonText);
|
|
291
|
+
log.info({ swarmId, roles: result.roleEvaluations.length }, "retrospective completed via LLM");
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
log.warn({ swarmId, err }, "claude CLI call failed, using fallback extraction");
|
|
295
|
+
result = fallbackExtraction(messages, snapshot);
|
|
296
|
+
}
|
|
297
|
+
// Persist to DB
|
|
298
|
+
try {
|
|
299
|
+
await persistToDb(result, swarmId, snapshot, dbPath, swarmStatus);
|
|
300
|
+
log.info({ swarmId }, "retrospective persisted to memory.db");
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
log.error({ swarmId, err }, "failed to persist retrospective to memory.db");
|
|
304
|
+
}
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=retrospective.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrospective.js","sourceRoot":"","sources":["../src/retrospective.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import type { RoleDefinition } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse YAML frontmatter + markdown body from a role file.
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Flat key: value fields
|
|
7
|
+
* - Inline arrays: [a, b, c]
|
|
8
|
+
* - Nested delegation map with role/purpose entries
|
|
9
|
+
* - Protocol list (YAML list of strings)
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseRoleFile(content: string): RoleDefinition;
|
|
2
12
|
/**
|
|
3
13
|
* Ensure user role directory exists and preset templates are copied.
|
|
4
14
|
* Returns the user roles directory path.
|
|
@@ -10,7 +20,8 @@ export declare function loadRole(roleName: string): RoleDefinition;
|
|
|
10
20
|
export declare function listRoles(): string[];
|
|
11
21
|
/**
|
|
12
22
|
* Build the full system prompt for a role instance.
|
|
13
|
-
* Substitutes {instanceId} and {roleList} placeholders
|
|
23
|
+
* Substitutes {instanceId} and {roleList} placeholders,
|
|
24
|
+
* then appends delegation relationships and protocol steps.
|
|
14
25
|
*/
|
|
15
26
|
export declare function buildRolePrompt(definition: RoleDefinition, instanceId: string, roleList: string): string;
|
|
16
27
|
//# sourceMappingURL=role-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role-loader.d.ts","sourceRoot":"","sources":["../../src/roles/role-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"role-loader.d.ts","sourceRoot":"","sources":["../../src/roles/role-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAkC,MAAM,YAAY,CAAC;AAKjF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAuJ7D;AAgBD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAmBlC;AAED,gHAAgH;AAChH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAYzD;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAoBpC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,cAAc,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CA8BR"}
|
|
@@ -3,41 +3,169 @@ import { join } from "node:path";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
const PRESET_DIR = join(import.meta.dirname ?? __dirname, "../../roles");
|
|
5
5
|
const USER_ROLES_DIR = join(homedir(), ".clawnet", "roles");
|
|
6
|
-
/**
|
|
7
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Parse YAML frontmatter + markdown body from a role file.
|
|
8
|
+
*
|
|
9
|
+
* Supports:
|
|
10
|
+
* - Flat key: value fields
|
|
11
|
+
* - Inline arrays: [a, b, c]
|
|
12
|
+
* - Nested delegation map with role/purpose entries
|
|
13
|
+
* - Protocol list (YAML list of strings)
|
|
14
|
+
*/
|
|
15
|
+
export function parseRoleFile(content) {
|
|
8
16
|
const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
9
17
|
if (!fmMatch) {
|
|
10
18
|
throw new Error("Invalid role file: missing YAML frontmatter");
|
|
11
19
|
}
|
|
12
20
|
const frontmatter = fmMatch[1];
|
|
13
21
|
const body = fmMatch[2].trim();
|
|
14
|
-
// Simple YAML parser (no dependency)
|
|
22
|
+
// Simple YAML parser (no dependency)
|
|
15
23
|
const meta = {};
|
|
24
|
+
const delegation = {};
|
|
25
|
+
const protocol = [];
|
|
26
|
+
let section = "none";
|
|
27
|
+
let delegationKey = null;
|
|
28
|
+
let currentEntry = null;
|
|
16
29
|
for (const line of frontmatter.split("\n")) {
|
|
30
|
+
// Top-level section headers: "delegation:" or "protocol:"
|
|
31
|
+
if (line.match(/^delegation:\s*$/)) {
|
|
32
|
+
section = "delegation";
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (line.match(/^protocol:\s*$/)) {
|
|
36
|
+
section = "protocol";
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Protocol list item: " - step text"
|
|
40
|
+
if (section === "protocol") {
|
|
41
|
+
const listItem = line.match(/^\s+-\s+(.+)$/);
|
|
42
|
+
if (listItem) {
|
|
43
|
+
protocol.push(listItem[1].trim());
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// Non-indented line ends protocol section
|
|
47
|
+
if (!line.match(/^\s/)) {
|
|
48
|
+
section = "none";
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Delegation section parsing
|
|
55
|
+
if (section === "delegation") {
|
|
56
|
+
// Flat delegation field: " reportsTo: queen" or " escalationTarget: true"
|
|
57
|
+
const flatDel = line.match(/^\s{2}(\w+):\s*(.+)$/);
|
|
58
|
+
if (flatDel && !line.match(/^\s{2}\w+:\s*$/)) {
|
|
59
|
+
// Flush any pending entry
|
|
60
|
+
if (currentEntry?.role && delegationKey) {
|
|
61
|
+
pushDelegationEntry(delegation, delegationKey, currentEntry);
|
|
62
|
+
currentEntry = null;
|
|
63
|
+
}
|
|
64
|
+
const [, key, val] = flatDel;
|
|
65
|
+
if (key === "reportsTo") {
|
|
66
|
+
delegation.reportsTo = val.trim().replace(/^["']|["']$/g, "");
|
|
67
|
+
}
|
|
68
|
+
else if (key === "escalationTarget") {
|
|
69
|
+
delegation.escalationTarget = val.trim() === "true";
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// This might be a delegation list header like "delegatesTo:" — check for empty val after colon
|
|
73
|
+
// But we already filtered those out. This handles the case where the key is
|
|
74
|
+
// a delegation list key that we haven't recognized yet.
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Delegation sub-section header: " delegatesTo:" / " collaboratesWith:" / " canRequestHelp:"
|
|
79
|
+
const subHeader = line.match(/^\s{2}(\w+):\s*$/);
|
|
80
|
+
if (subHeader) {
|
|
81
|
+
// Flush pending entry
|
|
82
|
+
if (currentEntry?.role && delegationKey) {
|
|
83
|
+
pushDelegationEntry(delegation, delegationKey, currentEntry);
|
|
84
|
+
currentEntry = null;
|
|
85
|
+
}
|
|
86
|
+
delegationKey = subHeader[1];
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// New list item in delegation sub-section: " - role: developer"
|
|
90
|
+
const roleItem = line.match(/^\s{4,}-\s+role:\s*(.+)$/);
|
|
91
|
+
if (roleItem && delegationKey) {
|
|
92
|
+
// Flush previous entry
|
|
93
|
+
if (currentEntry?.role) {
|
|
94
|
+
pushDelegationEntry(delegation, delegationKey, currentEntry);
|
|
95
|
+
}
|
|
96
|
+
currentEntry = { role: roleItem[1].trim() };
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
// Continuation of list item: " purpose: 编码任务"
|
|
100
|
+
if (currentEntry && line.match(/^\s{6,}\w+:/)) {
|
|
101
|
+
const propMatch = line.match(/^\s+(\w+):\s*(.+)$/);
|
|
102
|
+
if (propMatch) {
|
|
103
|
+
const [, key, val] = propMatch;
|
|
104
|
+
if (key === "purpose")
|
|
105
|
+
currentEntry.purpose = val.trim();
|
|
106
|
+
}
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Non-indented line ends delegation section
|
|
110
|
+
if (!line.match(/^\s/)) {
|
|
111
|
+
if (currentEntry?.role && delegationKey) {
|
|
112
|
+
pushDelegationEntry(delegation, delegationKey, currentEntry);
|
|
113
|
+
currentEntry = null;
|
|
114
|
+
}
|
|
115
|
+
delegationKey = null;
|
|
116
|
+
section = "none";
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Flat key: value (top-level)
|
|
17
123
|
const m = line.match(/^(\w+):\s*(.+)$/);
|
|
18
124
|
if (!m)
|
|
19
125
|
continue;
|
|
20
126
|
const [, key, rawVal] = m;
|
|
21
|
-
//
|
|
127
|
+
// Inline array: [a, b, c]
|
|
22
128
|
const arrMatch = rawVal.match(/^\[(.*)\]$/);
|
|
23
129
|
if (arrMatch) {
|
|
24
130
|
meta[key] = arrMatch[1].split(",").map((s) => s.trim());
|
|
25
131
|
}
|
|
26
132
|
else {
|
|
27
|
-
// Strip surrounding quotes
|
|
28
133
|
meta[key] = rawVal.replace(/^["']|["']$/g, "");
|
|
29
134
|
}
|
|
30
135
|
}
|
|
136
|
+
// Flush last delegation entry
|
|
137
|
+
if (currentEntry?.role && delegationKey) {
|
|
138
|
+
pushDelegationEntry(delegation, delegationKey, currentEntry);
|
|
139
|
+
}
|
|
140
|
+
const hasDelegation = delegation.reportsTo !== undefined ||
|
|
141
|
+
delegation.delegatesTo !== undefined ||
|
|
142
|
+
delegation.collaboratesWith !== undefined ||
|
|
143
|
+
delegation.canRequestHelp !== undefined ||
|
|
144
|
+
delegation.escalationTarget !== undefined;
|
|
31
145
|
return {
|
|
32
146
|
name: meta.name ?? "unknown",
|
|
33
147
|
shortName: meta.shortName ?? meta.name?.slice(0, 3) ?? "unk",
|
|
148
|
+
displayName: meta.displayName || undefined,
|
|
34
149
|
type: meta.type ?? "worker",
|
|
35
150
|
description: meta.description ?? "",
|
|
36
151
|
capabilities: Array.isArray(meta.capabilities) ? meta.capabilities : [],
|
|
37
152
|
color: meta.color ?? "#888888",
|
|
38
153
|
promptBody: body,
|
|
154
|
+
delegation: hasDelegation ? delegation : undefined,
|
|
155
|
+
protocol: protocol.length > 0 ? protocol : undefined,
|
|
39
156
|
};
|
|
40
157
|
}
|
|
158
|
+
function pushDelegationEntry(map, key, entry) {
|
|
159
|
+
if (key === "delegatesTo") {
|
|
160
|
+
(map.delegatesTo ??= []).push(entry);
|
|
161
|
+
}
|
|
162
|
+
else if (key === "collaboratesWith") {
|
|
163
|
+
(map.collaboratesWith ??= []).push(entry);
|
|
164
|
+
}
|
|
165
|
+
else if (key === "canRequestHelp") {
|
|
166
|
+
(map.canRequestHelp ??= []).push(entry);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
41
169
|
/**
|
|
42
170
|
* Ensure user role directory exists and preset templates are copied.
|
|
43
171
|
* Returns the user roles directory path.
|
|
@@ -93,11 +221,36 @@ export function listRoles() {
|
|
|
93
221
|
}
|
|
94
222
|
/**
|
|
95
223
|
* Build the full system prompt for a role instance.
|
|
96
|
-
* Substitutes {instanceId} and {roleList} placeholders
|
|
224
|
+
* Substitutes {instanceId} and {roleList} placeholders,
|
|
225
|
+
* then appends delegation relationships and protocol steps.
|
|
97
226
|
*/
|
|
98
227
|
export function buildRolePrompt(definition, instanceId, roleList) {
|
|
99
|
-
|
|
228
|
+
let prompt = definition.promptBody
|
|
100
229
|
.replace(/\{instanceId\}/g, instanceId)
|
|
101
230
|
.replace(/\{roleList\}/g, roleList);
|
|
231
|
+
// Inject delegation relationships
|
|
232
|
+
if (definition.delegation) {
|
|
233
|
+
const d = definition.delegation;
|
|
234
|
+
prompt += "\n\n### 协作关系\n";
|
|
235
|
+
if (d.reportsTo)
|
|
236
|
+
prompt += `- 汇报给: ${d.reportsTo}\n`;
|
|
237
|
+
if (d.delegatesTo?.length) {
|
|
238
|
+
prompt += `- 可委派给: ${d.delegatesTo.map((x) => `${x.role}(${x.purpose})`).join("、")}\n`;
|
|
239
|
+
}
|
|
240
|
+
if (d.collaboratesWith?.length) {
|
|
241
|
+
prompt += `- 协作对象: ${d.collaboratesWith.map((x) => `${x.role}(${x.purpose})`).join("、")}\n`;
|
|
242
|
+
}
|
|
243
|
+
if (d.canRequestHelp?.length) {
|
|
244
|
+
prompt += `- 可请求协助: ${d.canRequestHelp.map((x) => `${x.role}(${x.purpose})`).join("、")}\n`;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Inject protocol steps
|
|
248
|
+
if (definition.protocol?.length) {
|
|
249
|
+
prompt += "\n\n### 标准工作流程\n";
|
|
250
|
+
definition.protocol.forEach((step, i) => {
|
|
251
|
+
prompt += `${i + 1}. ${step}\n`;
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return prompt;
|
|
102
255
|
}
|
|
103
256
|
//# sourceMappingURL=role-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role-loader.js","sourceRoot":"","sources":["../../src/roles/role-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,aAAa,CAAC,CAAC;AACzE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAE5D
|
|
1
|
+
{"version":3,"file":"role-loader.js","sourceRoot":"","sources":["../../src/roles/role-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/roles/types.d.ts
CHANGED
|
@@ -1,18 +1,42 @@
|
|
|
1
|
+
/** Role-to-role relationship entry. */
|
|
2
|
+
export interface DelegationEntry {
|
|
3
|
+
role: string;
|
|
4
|
+
purpose: string;
|
|
5
|
+
}
|
|
6
|
+
/** Declares a role's collaboration relationships within a swarm. */
|
|
7
|
+
export interface DelegationMap {
|
|
8
|
+
/** Superior role this role reports to */
|
|
9
|
+
reportsTo?: string;
|
|
10
|
+
/** Roles this role can delegate work to */
|
|
11
|
+
delegatesTo?: DelegationEntry[];
|
|
12
|
+
/** Peer roles this role collaborates with */
|
|
13
|
+
collaboratesWith?: DelegationEntry[];
|
|
14
|
+
/** Roles this role can request help from */
|
|
15
|
+
canRequestHelp?: DelegationEntry[];
|
|
16
|
+
/** Whether this role is an escalation target */
|
|
17
|
+
escalationTarget?: boolean;
|
|
18
|
+
}
|
|
1
19
|
/** Parsed role definition from a markdown + YAML frontmatter file. */
|
|
2
20
|
export interface RoleDefinition {
|
|
3
21
|
/** Role template name, e.g. "developer" */
|
|
4
22
|
name: string;
|
|
5
23
|
/** Short name for instanceId prefix, e.g. "dev" */
|
|
6
24
|
shortName: string;
|
|
25
|
+
/** Display name for UI, e.g. "乔布斯PM" */
|
|
26
|
+
displayName?: string;
|
|
7
27
|
/** Role type */
|
|
8
28
|
type: "queen" | "worker";
|
|
9
29
|
/** Human-readable description */
|
|
10
30
|
description: string;
|
|
11
|
-
/**
|
|
12
|
-
capabilities
|
|
31
|
+
/** Optional descriptive capability tags (do not affect runtime behavior) */
|
|
32
|
+
capabilities?: string[];
|
|
13
33
|
/** Badge color for UI */
|
|
14
34
|
color: string;
|
|
15
35
|
/** Full prompt body (markdown after frontmatter) */
|
|
16
36
|
promptBody: string;
|
|
37
|
+
/** Collaboration relationships with other roles */
|
|
38
|
+
delegation?: DelegationMap;
|
|
39
|
+
/** Standard workflow steps for this role */
|
|
40
|
+
protocol?: string[];
|
|
17
41
|
}
|
|
18
42
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/roles/types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/roles/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,4CAA4C;IAC5C,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC;IACnC,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB"}
|