@arvoretech/hub 0.12.1 → 0.13.1
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.
|
@@ -117,7 +117,7 @@ async function checkAndAutoRegenerate(hubDir) {
|
|
|
117
117
|
return;
|
|
118
118
|
}
|
|
119
119
|
console.log(chalk.yellow("\n Detected outdated configs, auto-regenerating..."));
|
|
120
|
-
const { generators: generators2 } = await import("./generate-
|
|
120
|
+
const { generators: generators2 } = await import("./generate-3UEFSWPT.js");
|
|
121
121
|
const generator = generators2[result.editor];
|
|
122
122
|
if (!generator) {
|
|
123
123
|
console.log(chalk.red(` Unknown editor '${result.editor}' in cache. Run 'hub generate' manually.`));
|
|
@@ -968,6 +968,88 @@ tools:
|
|
|
968
968
|
${body.trim()}
|
|
969
969
|
`;
|
|
970
970
|
}
|
|
971
|
+
function hasAgentTeamsLeadMcp(mcps) {
|
|
972
|
+
if (!mcps) return false;
|
|
973
|
+
const proxyMcp = mcps.find((m) => m.upstreams && m.upstreams.length > 0);
|
|
974
|
+
const directMatch = mcps.some((m) => m.name === "agent-teams-lead");
|
|
975
|
+
const upstreamMatch = proxyMcp?.upstreams?.includes("agent-teams-lead") ?? false;
|
|
976
|
+
return directMatch || upstreamMatch;
|
|
977
|
+
}
|
|
978
|
+
function buildAgentTeamsSection(mcps) {
|
|
979
|
+
if (!hasAgentTeamsLeadMcp(mcps)) return "";
|
|
980
|
+
return `
|
|
981
|
+
## Agent Teams
|
|
982
|
+
|
|
983
|
+
This workspace has agent teams support via the \`agent-teams-lead\` MCP. You can act as a team lead, spawning multiple AI teammates that work in parallel on different tasks.
|
|
984
|
+
|
|
985
|
+
**When to use agent teams** instead of sub-agents:
|
|
986
|
+
- Tasks that benefit from parallel exploration (research, review, debugging)
|
|
987
|
+
- Cross-layer work (frontend + backend + tests simultaneously)
|
|
988
|
+
- Work where teammates need to communicate and coordinate with each other
|
|
989
|
+
|
|
990
|
+
**How it works:**
|
|
991
|
+
1. Use \`spawn_team\` to create a team with an objective and list of teammates (each referencing an agent file)
|
|
992
|
+
2. Use \`create_task\` to add tasks to the shared task list (tasks can have dependencies and exclusive file paths)
|
|
993
|
+
3. Teammates automatically claim pending tasks, do the work, and mark them complete
|
|
994
|
+
4. Use \`send_message\` to communicate with teammates (or broadcast to all)
|
|
995
|
+
5. Use \`wait_for_team\` to block until all tasks are resolved or teammates finish
|
|
996
|
+
6. Use \`team_status\` to check progress, task states, and unread messages
|
|
997
|
+
7. Use \`read_artifact\` to read outputs published by teammates
|
|
998
|
+
|
|
999
|
+
**Available tools:** \`spawn_team\`, \`add_teammate\`, \`remove_teammate\`, \`create_task\`, \`team_status\`, \`send_message\`, \`wait_for_team\`, \`read_artifact\`.
|
|
1000
|
+
|
|
1001
|
+
**Best practices:**
|
|
1002
|
+
- Create tasks IMMEDIATELY after spawning the team (teammates start looking for tasks right away)
|
|
1003
|
+
- Use \`exclusive_paths\` on tasks to prevent file conflicts between teammates
|
|
1004
|
+
- Use \`depends_on\` to chain tasks that must run in order
|
|
1005
|
+
- Keep 2-3 tasks per teammate for good throughput
|
|
1006
|
+
- Send a broadcast message after creating tasks to notify teammates
|
|
1007
|
+
- Always call \`wait_for_team\` after creating tasks to monitor completion`;
|
|
1008
|
+
}
|
|
1009
|
+
function hasAgentTeamsChatMcp(mcps) {
|
|
1010
|
+
if (!mcps) return false;
|
|
1011
|
+
const proxyMcp = mcps.find((m) => m.upstreams && m.upstreams.length > 0);
|
|
1012
|
+
const directMatch = mcps.some((m) => m.name === "agent-teams-chat");
|
|
1013
|
+
const upstreamMatch = proxyMcp?.upstreams?.includes("agent-teams-chat") ?? false;
|
|
1014
|
+
return directMatch || upstreamMatch;
|
|
1015
|
+
}
|
|
1016
|
+
function buildAgentTeamsChatSection(mcps) {
|
|
1017
|
+
if (!hasAgentTeamsChatMcp(mcps)) return "";
|
|
1018
|
+
return `
|
|
1019
|
+
## Agent Chat (Cross-Developer Communication)
|
|
1020
|
+
|
|
1021
|
+
You can communicate with agents from other developers on the team via the \`agent-teams-chat\` MCP. This is NOT the same as agent teams (which coordinates teammates within your own session). Agent chat lets you talk to agents running in other people's workspaces through Slack threads.
|
|
1022
|
+
|
|
1023
|
+
**When to use agent chat:**
|
|
1024
|
+
- You need context or help from another developer's agent (e.g. "Hey, Jo\xE3o's agent \u2014 what was the decision on the auth migration?")
|
|
1025
|
+
- Coordinating cross-developer work asynchronously (e.g. "I'm changing the API contract, heads up")
|
|
1026
|
+
- Sharing decisions, blockers, or discoveries that affect the whole team
|
|
1027
|
+
- Asking questions that another developer's agent might already know the answer to
|
|
1028
|
+
|
|
1029
|
+
**How it works:**
|
|
1030
|
+
1. Use \`open_thread\` to start a new conversation thread about a topic
|
|
1031
|
+
2. Use \`reply_to_thread\` to respond in an existing thread
|
|
1032
|
+
3. Use \`read_thread\` to catch up on what others have said
|
|
1033
|
+
4. Use \`list_threads\` to see recent conversations in the channel
|
|
1034
|
+
5. Use \`find_thread\` to search for threads by topic or content
|
|
1035
|
+
|
|
1036
|
+
**Available tools:** \`open_thread\`, \`reply_to_thread\`, \`read_thread\`, \`list_threads\`, \`find_thread\`.
|
|
1037
|
+
|
|
1038
|
+
**Message format:** Messages are automatically formatted with your identity (e.g. \`\u{1F916} *Jo\xE3o's Agent* \u2014 your message here\`). Other agents' messages will show their owner's name.
|
|
1039
|
+
|
|
1040
|
+
**IMPORTANT \u2014 Proactive message checking:**
|
|
1041
|
+
- When you open or reply to a thread, periodically check for new replies using \`read_thread\` with the \`since\` parameter set to the last message timestamp you saw
|
|
1042
|
+
- After sending a message that expects a response, wait a reasonable time (30-60 seconds) then check for replies
|
|
1043
|
+
- At the start of a task, use \`list_threads\` to check if there are recent threads relevant to your current work
|
|
1044
|
+
- If you're waiting on another agent's input, poll the thread every 30-60 seconds until you get a response or a reasonable timeout (5 minutes)
|
|
1045
|
+
|
|
1046
|
+
**Best practices:**
|
|
1047
|
+
- Search for existing threads before opening a new one on the same topic
|
|
1048
|
+
- Keep messages concise and actionable
|
|
1049
|
+
- Use threads to maintain context \u2014 avoid top-level messages for replies
|
|
1050
|
+
- Read the thread before replying to avoid repeating what others said
|
|
1051
|
+
- When starting a task that touches shared code, check recent threads for relevant context`;
|
|
1052
|
+
}
|
|
971
1053
|
function buildMcpToolsSection(mcps) {
|
|
972
1054
|
if (!mcps || mcps.length === 0) return "";
|
|
973
1055
|
const proxyMcp = mcps.find((m) => m.upstreams && m.upstreams.length > 0);
|
|
@@ -1108,6 +1190,10 @@ Available tools: \`search_memories\`, \`get_memory\`, \`add_memory\`, \`list_mem
|
|
|
1108
1190
|
}
|
|
1109
1191
|
const designSectionOpenCode = buildDesignSection(config);
|
|
1110
1192
|
if (designSectionOpenCode) sections.push(designSectionOpenCode);
|
|
1193
|
+
const agentTeamsSectionOpenCode = buildAgentTeamsSection(config.mcps);
|
|
1194
|
+
if (agentTeamsSectionOpenCode) sections.push(agentTeamsSectionOpenCode);
|
|
1195
|
+
const agentTeamsChatSectionOpenCode = buildAgentTeamsChatSection(config.mcps);
|
|
1196
|
+
if (agentTeamsChatSectionOpenCode) sections.push(agentTeamsChatSectionOpenCode);
|
|
1111
1197
|
sections.push(`
|
|
1112
1198
|
## Troubleshooting and Debugging
|
|
1113
1199
|
|
|
@@ -1401,6 +1487,10 @@ Available tools: \`search_memories\`, \`get_memory\`, \`add_memory\`, \`list_mem
|
|
|
1401
1487
|
}
|
|
1402
1488
|
const designSectionKiro = buildDesignSection(config);
|
|
1403
1489
|
if (designSectionKiro) sections.push(designSectionKiro);
|
|
1490
|
+
const agentTeamsSectionKiro = buildAgentTeamsSection(config.mcps);
|
|
1491
|
+
if (agentTeamsSectionKiro) sections.push(agentTeamsSectionKiro);
|
|
1492
|
+
const agentTeamsChatSectionKiro = buildAgentTeamsChatSection(config.mcps);
|
|
1493
|
+
if (agentTeamsChatSectionKiro) sections.push(agentTeamsChatSectionKiro);
|
|
1404
1494
|
sections.push(`
|
|
1405
1495
|
## Troubleshooting and Debugging
|
|
1406
1496
|
|
|
@@ -1589,6 +1679,10 @@ Available tools: \`search_memories\`, \`get_memory\`, \`add_memory\`, \`list_mem
|
|
|
1589
1679
|
}
|
|
1590
1680
|
const designSectionCursor = buildDesignSection(config);
|
|
1591
1681
|
if (designSectionCursor) sections.push(designSectionCursor);
|
|
1682
|
+
const agentTeamsSectionCursor = buildAgentTeamsSection(config.mcps);
|
|
1683
|
+
if (agentTeamsSectionCursor) sections.push(agentTeamsSectionCursor);
|
|
1684
|
+
const agentTeamsChatSectionCursor = buildAgentTeamsChatSection(config.mcps);
|
|
1685
|
+
if (agentTeamsChatSectionCursor) sections.push(agentTeamsChatSectionCursor);
|
|
1592
1686
|
sections.push(`
|
|
1593
1687
|
## Troubleshooting and Debugging
|
|
1594
1688
|
|
package/dist/config/index.d.ts
CHANGED
|
@@ -194,6 +194,8 @@ declare const mcp: {
|
|
|
194
194
|
googleChat(overrides?: MCPOverrides): MCPConfig;
|
|
195
195
|
playwright(overrides?: MCPOverrides): MCPConfig;
|
|
196
196
|
context7(overrides?: MCPOverrides): MCPConfig;
|
|
197
|
+
agentTeamsLead(overrides?: MCPOverrides): MCPConfig;
|
|
198
|
+
agentTeamsChat(overrides?: MCPOverrides): MCPConfig;
|
|
197
199
|
proxy(name: string, overrides: MCPOverrides & {
|
|
198
200
|
upstreams: string[];
|
|
199
201
|
}): MCPConfig;
|
package/dist/config/index.js
CHANGED
|
@@ -194,6 +194,22 @@ var mcp = {
|
|
|
194
194
|
...overrides
|
|
195
195
|
};
|
|
196
196
|
},
|
|
197
|
+
agentTeamsLead(overrides) {
|
|
198
|
+
return {
|
|
199
|
+
name: "agent-teams-lead",
|
|
200
|
+
package: "@arvoretech/agent-teams-lead-mcp",
|
|
201
|
+
...overrides,
|
|
202
|
+
env: { ...overrides?.env }
|
|
203
|
+
};
|
|
204
|
+
},
|
|
205
|
+
agentTeamsChat(overrides) {
|
|
206
|
+
return {
|
|
207
|
+
name: "agent-teams-chat",
|
|
208
|
+
package: "@arvoretech/agent-teams-chat-mcp",
|
|
209
|
+
...overrides,
|
|
210
|
+
env: { ...overrides?.env }
|
|
211
|
+
};
|
|
212
|
+
},
|
|
197
213
|
proxy(name, overrides) {
|
|
198
214
|
return {
|
|
199
215
|
name,
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
checkAndAutoRegenerate,
|
|
4
4
|
generateCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-EEGDGBJL.js";
|
|
6
6
|
import {
|
|
7
7
|
loadHubConfig,
|
|
8
8
|
resolveConfigPath
|
|
@@ -761,6 +761,8 @@ var AVAILABLE_MCPS = [
|
|
|
761
761
|
{ name: "meet-transcriptions", description: "Semantic search across meeting transcriptions" },
|
|
762
762
|
{ name: "google-chat", description: "Google Chat spaces, members, and messages" },
|
|
763
763
|
{ name: "tempmail", description: "Temporary email for testing" },
|
|
764
|
+
{ name: "agent-teams-lead", description: "Spawn AI teammate teams that work in parallel on tasks" },
|
|
765
|
+
{ name: "agent-teams-chat", description: "Cross-developer agent communication via Slack threads" },
|
|
764
766
|
{ name: "mcp-proxy", description: "Proxy gateway that reduces token usage via mcp_search/mcp_call" }
|
|
765
767
|
];
|
|
766
768
|
|
|
@@ -1275,6 +1277,8 @@ var MCP_HELPER_MAP = {
|
|
|
1275
1277
|
"google-chat": { helper: "mcp.googleChat", hasNameArg: false },
|
|
1276
1278
|
playwright: { helper: "mcp.playwright", hasNameArg: false },
|
|
1277
1279
|
context7: { helper: "mcp.context7", hasNameArg: false },
|
|
1280
|
+
"agent-teams-lead": { helper: "mcp.agentTeamsLead", hasNameArg: false },
|
|
1281
|
+
"agent-teams-chat": { helper: "mcp.agentTeamsChat", hasNameArg: false },
|
|
1278
1282
|
"mcp-proxy": { helper: "mcp.proxy", hasNameArg: true }
|
|
1279
1283
|
};
|
|
1280
1284
|
function buildTypeScriptConfig(state) {
|