@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.
Files changed (116) hide show
  1. package/dist/__tests__/action-parser.test.d.ts +2 -0
  2. package/dist/__tests__/action-parser.test.d.ts.map +1 -0
  3. package/dist/__tests__/action-parser.test.js +91 -0
  4. package/dist/__tests__/action-parser.test.js.map +1 -0
  5. package/dist/__tests__/migration-roles.test.d.ts +2 -0
  6. package/dist/__tests__/migration-roles.test.d.ts.map +1 -0
  7. package/dist/__tests__/migration-roles.test.js +213 -0
  8. package/dist/__tests__/migration-roles.test.js.map +1 -0
  9. package/dist/__tests__/retrospective.test.d.ts +2 -0
  10. package/dist/__tests__/retrospective.test.d.ts.map +1 -0
  11. package/dist/__tests__/retrospective.test.js +467 -0
  12. package/dist/__tests__/retrospective.test.js.map +1 -0
  13. package/dist/__tests__/role-loader.test.d.ts +2 -0
  14. package/dist/__tests__/role-loader.test.d.ts.map +1 -0
  15. package/dist/__tests__/role-loader.test.js +217 -0
  16. package/dist/__tests__/role-loader.test.js.map +1 -0
  17. package/dist/__tests__/swarm-coordinator-init.test.d.ts +2 -0
  18. package/dist/__tests__/swarm-coordinator-init.test.d.ts.map +1 -0
  19. package/dist/__tests__/swarm-coordinator-init.test.js +194 -0
  20. package/dist/__tests__/swarm-coordinator-init.test.js.map +1 -0
  21. package/dist/__tests__/swarm-coordinator-roleId.test.d.ts +2 -0
  22. package/dist/__tests__/swarm-coordinator-roleId.test.d.ts.map +1 -0
  23. package/dist/__tests__/swarm-coordinator-roleId.test.js +147 -0
  24. package/dist/__tests__/swarm-coordinator-roleId.test.js.map +1 -0
  25. package/dist/__tests__/template-loader.test.d.ts +2 -0
  26. package/dist/__tests__/template-loader.test.d.ts.map +1 -0
  27. package/dist/__tests__/template-loader.test.js +103 -0
  28. package/dist/__tests__/template-loader.test.js.map +1 -0
  29. package/dist/action-parser.d.ts.map +1 -1
  30. package/dist/action-parser.js +96 -6
  31. package/dist/action-parser.js.map +1 -1
  32. package/dist/index.d.ts +7 -3
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -2
  35. package/dist/index.js.map +1 -1
  36. package/dist/message-router.d.ts +6 -2
  37. package/dist/message-router.d.ts.map +1 -1
  38. package/dist/message-router.js +13 -7
  39. package/dist/message-router.js.map +1 -1
  40. package/dist/persistence.d.ts +1 -0
  41. package/dist/persistence.d.ts.map +1 -1
  42. package/dist/persistence.js +26 -3
  43. package/dist/persistence.js.map +1 -1
  44. package/dist/retrospective.d.ts +42 -0
  45. package/dist/retrospective.d.ts.map +1 -0
  46. package/dist/retrospective.js +307 -0
  47. package/dist/retrospective.js.map +1 -0
  48. package/dist/roles/role-loader.d.ts +12 -1
  49. package/dist/roles/role-loader.d.ts.map +1 -1
  50. package/dist/roles/role-loader.js +160 -7
  51. package/dist/roles/role-loader.js.map +1 -1
  52. package/dist/roles/types.d.ts +26 -2
  53. package/dist/roles/types.d.ts.map +1 -1
  54. package/dist/swarm-coordinator.d.ts +10 -2
  55. package/dist/swarm-coordinator.d.ts.map +1 -1
  56. package/dist/swarm-coordinator.js +267 -38
  57. package/dist/swarm-coordinator.js.map +1 -1
  58. package/dist/templates/template-loader.d.ts +20 -0
  59. package/dist/templates/template-loader.d.ts.map +1 -0
  60. package/dist/templates/template-loader.js +117 -0
  61. package/dist/templates/template-loader.js.map +1 -0
  62. package/dist/templates/types.d.ts +25 -0
  63. package/dist/templates/types.d.ts.map +1 -0
  64. package/dist/templates/types.js +2 -0
  65. package/dist/templates/types.js.map +1 -0
  66. package/dist/types.d.ts +13 -2
  67. package/dist/types.d.ts.map +1 -1
  68. package/package.json +17 -11
  69. package/roles/analyst-livermore.md +112 -0
  70. package/roles/designer-rams.md +266 -0
  71. package/roles/dev-torvalds.md +214 -0
  72. package/roles/developer.md +22 -1
  73. package/roles/director-jia.md +286 -0
  74. package/roles/editor-boyong.md +148 -0
  75. package/roles/macro-dalio.md +115 -0
  76. package/roles/planner-maoni.md +306 -0
  77. package/roles/pm-jobs.md +326 -0
  78. package/roles/preset-analyst-simons.md +55 -0
  79. package/roles/preset-architect-knuth.md +55 -0
  80. package/roles/preset-designer-norman.md +55 -0
  81. package/roles/preset-designer.md +55 -0
  82. package/roles/preset-dev-carmack.md +55 -0
  83. package/roles/preset-dev-gosling.md +55 -0
  84. package/roles/preset-developer.md +68 -0
  85. package/roles/preset-manager-grove.md +55 -0
  86. package/roles/preset-manager-musk.md +55 -0
  87. package/roles/preset-pm.md +105 -0
  88. package/roles/preset-researcher-feynman.md +55 -0
  89. package/roles/preset-reviewer.md +62 -0
  90. package/roles/preset-strategist-buffett.md +55 -0
  91. package/roles/preset-strategist-munger.md +55 -0
  92. package/roles/preset-strategist-sunzi.md +55 -0
  93. package/roles/preset-tester-beck.md +56 -0
  94. package/roles/preset-tester.md +63 -0
  95. package/roles/preset-writer-orwell.md +55 -0
  96. package/roles/preset-writer.md +55 -0
  97. package/roles/quant-simons.md +136 -0
  98. package/roles/queen.md +27 -1
  99. package/roles/reviewer-martin.md +200 -0
  100. package/roles/reviewer.md +18 -1
  101. package/roles/rhythm-tangsan.md +135 -0
  102. package/roles/risk-taleb.md +112 -0
  103. package/roles/script-shitiesheng.md +129 -0
  104. package/roles/storyboard-xuke.md +138 -0
  105. package/roles/strategist-soros.md +257 -0
  106. package/roles/tester-beck.md +232 -0
  107. package/roles/tester.md +19 -1
  108. package/roles/trader-jones.md +124 -0
  109. package/roles/vfx-guchangwei.md +129 -0
  110. package/roles/writer-zhouzi.md +144 -0
  111. package/templates/dev-team-pro.md +21 -0
  112. package/templates/dev-team.md +19 -0
  113. package/templates/minimal.md +14 -0
  114. package/templates/trading-team.md +22 -0
  115. package/templates/video-team.md +18 -0
  116. 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,EAAE,MAAM,YAAY,CAAC;AA0CjD;;;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;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,cAAc,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAIR"}
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
- /** Parse YAML frontmatter + markdown body from a role file. */
7
- function parseRoleFile(content) {
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) — handles flat key: value + arrays
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
- // Array value: [a, b, c]
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
- return definition.promptBody
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":"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"}
1
+ {"version":3,"file":"role-loader.js","sourceRoot":"","sources":["../../src/roles/role-loader.ts"],"names":[],"mappings":"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"}
@@ -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
- /** Capability tags */
12
- capabilities: string[];
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,sBAAsB;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB"}
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"}