camelagi 0.5.41 → 0.5.45
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/README.md +116 -25
- package/dashboard/404.html +1 -0
- package/dashboard/__next.__PAGE__.txt +9 -0
- package/dashboard/__next._full.txt +19 -0
- package/dashboard/__next._head.txt +6 -0
- package/dashboard/__next._index.txt +5 -0
- package/dashboard/__next._tree.txt +3 -0
- package/dashboard/_next/_next/static/T-oVqD_b6KFHCZwRKsnRE/_buildManifest.js +11 -0
- package/dashboard/_next/_next/static/T-oVqD_b6KFHCZwRKsnRE/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/_next/static/T-oVqD_b6KFHCZwRKsnRE/_ssgManifest.js +1 -0
- package/dashboard/_next/_next/static/chunks/0.9wqq91a2h.e.js +3 -0
- package/dashboard/_next/_next/static/chunks/00-nlsz4ud071.js +11 -0
- package/dashboard/_next/_next/static/chunks/00noe7du3vxk9.js +1 -0
- package/dashboard/_next/_next/static/chunks/04wr2uisy8870.js +5 -0
- package/dashboard/_next/_next/static/chunks/05f.w0h0j~.3g.js +1 -0
- package/dashboard/_next/_next/static/chunks/0geaa8~wrpcj6.js +1 -0
- package/dashboard/_next/_next/static/chunks/0nrlwe_~wde44.js +1 -0
- package/dashboard/_next/_next/static/chunks/12l48lp-434~..js +31 -0
- package/dashboard/_next/_next/static/chunks/14qcm-bqojrb9.js +1 -0
- package/dashboard/_next/_next/static/chunks/15~vsexhgsteo.js +1 -0
- package/dashboard/_next/_next/static/chunks/turbopack-173kubfog5kol.js +1 -0
- package/dashboard/_next/static/8Qf-y5Z4kUHAaWZgy3BFF/_buildManifest.js +11 -0
- package/dashboard/_next/static/8Qf-y5Z4kUHAaWZgy3BFF/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/static/8Qf-y5Z4kUHAaWZgy3BFF/_ssgManifest.js +1 -0
- package/dashboard/_next/static/IQ8CU45QQ3REnyUqiqjou/_buildManifest.js +11 -0
- package/dashboard/_next/static/IQ8CU45QQ3REnyUqiqjou/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/static/IQ8CU45QQ3REnyUqiqjou/_ssgManifest.js +1 -0
- package/dashboard/_next/static/PXgzS7j3kuwIb14Ph3vgL/_buildManifest.js +11 -0
- package/dashboard/_next/static/PXgzS7j3kuwIb14Ph3vgL/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/static/PXgzS7j3kuwIb14Ph3vgL/_ssgManifest.js +1 -0
- package/dashboard/_next/static/S6BdJ1Ro25a6twuts7gHi/_buildManifest.js +11 -0
- package/dashboard/_next/static/S6BdJ1Ro25a6twuts7gHi/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/static/S6BdJ1Ro25a6twuts7gHi/_ssgManifest.js +1 -0
- package/dashboard/_next/static/T-oVqD_b6KFHCZwRKsnRE/_buildManifest.js +11 -0
- package/dashboard/_next/static/T-oVqD_b6KFHCZwRKsnRE/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/static/T-oVqD_b6KFHCZwRKsnRE/_ssgManifest.js +1 -0
- package/dashboard/_next/static/bvUynE5XeBkbLQynmgHa8/_buildManifest.js +11 -0
- package/dashboard/_next/static/bvUynE5XeBkbLQynmgHa8/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/static/bvUynE5XeBkbLQynmgHa8/_ssgManifest.js +1 -0
- package/dashboard/_next/static/chunks/0.9wqq91a2h.e.js +3 -0
- package/dashboard/_next/static/chunks/00-nlsz4ud071.js +11 -0
- package/dashboard/_next/static/chunks/00noe7du3vxk9.js +1 -0
- package/dashboard/_next/static/chunks/03~yq9q893hmn.js +1 -0
- package/dashboard/_next/static/chunks/04wr2uisy8870.js +5 -0
- package/dashboard/_next/static/chunks/05f.w0h0j~.3g.js +1 -0
- package/dashboard/_next/static/chunks/08ug0khjvhl6m.js +11 -0
- package/dashboard/_next/static/chunks/0d1s5w1cd08~7.js +11 -0
- package/dashboard/_next/static/chunks/0geaa8~wrpcj6.js +1 -0
- package/dashboard/_next/static/chunks/0lyajo4_yki3f.js +11 -0
- package/dashboard/_next/static/chunks/0nrlwe_~wde44.js +1 -0
- package/dashboard/_next/static/chunks/0pd15v2_1spxb.js +11 -0
- package/dashboard/_next/static/chunks/0vnhcfh7g1u6i.js +11 -0
- package/dashboard/_next/static/chunks/0ynuwcqa7w3o..css +2 -0
- package/dashboard/_next/static/chunks/11dfqgfbc8fk2.js +11 -0
- package/dashboard/_next/static/chunks/12l48lp-434~..js +31 -0
- package/dashboard/_next/static/chunks/14qcm-bqojrb9.js +1 -0
- package/dashboard/_next/static/chunks/15~vsexhgsteo.js +1 -0
- package/dashboard/_next/static/chunks/turbopack-173kubfog5kol.js +1 -0
- package/dashboard/_next/static/media/1bffadaabf893a1e-s.16ipb6fqu393i.woff2 +0 -0
- package/dashboard/_next/static/media/2bbe8d2671613f1f-s.067x_6k0k23tk.woff2 +0 -0
- package/dashboard/_next/static/media/2c55a0e60120577a-s.0bjc5tiuqdqro.woff2 +0 -0
- package/dashboard/_next/static/media/5476f68d60460930-s.0wxq9webf.ew4.woff2 +0 -0
- package/dashboard/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2 +0 -0
- package/dashboard/_next/static/media/9c72aa0f40e4eef8-s.0m6w47a4e5dy9.woff2 +0 -0
- package/dashboard/_next/static/media/ad66f9afd8947f86-s.11u06r12fd6v_.woff2 +0 -0
- package/dashboard/_next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
- package/dashboard/_next/static/uQ6ZB7JlP8tE93mlzKtXM/_buildManifest.js +11 -0
- package/dashboard/_next/static/uQ6ZB7JlP8tE93mlzKtXM/_clientMiddlewareManifest.js +1 -0
- package/dashboard/_next/static/uQ6ZB7JlP8tE93mlzKtXM/_ssgManifest.js +1 -0
- package/dashboard/_not-found/__next._full.txt +16 -0
- package/dashboard/_not-found/__next._head.txt +6 -0
- package/dashboard/_not-found/__next._index.txt +5 -0
- package/dashboard/_not-found/__next._not-found.__PAGE__.txt +5 -0
- package/dashboard/_not-found/__next._not-found.txt +5 -0
- package/dashboard/_not-found/__next._tree.txt +2 -0
- package/dashboard/_not-found.html +1 -0
- package/dashboard/_not-found.txt +16 -0
- package/dashboard/favicon.ico +0 -0
- package/dashboard/file.svg +1 -0
- package/dashboard/globe.svg +1 -0
- package/dashboard/index.html +1 -1
- package/dashboard/index.txt +18 -27
- package/dashboard/next.svg +1 -0
- package/dashboard/vercel.svg +1 -0
- package/dashboard/window.svg +1 -0
- package/dist/agent/agent-cursor.js +138 -0
- package/dist/agent/agent-cursor.js.map +1 -0
- package/dist/agent/agent-sdk.js +6 -2
- package/dist/agent/agent-sdk.js.map +1 -1
- package/dist/agent/types.js +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/agent.js +11 -7
- package/dist/agent.js.map +1 -1
- package/dist/cli/cmd-dashboard.js +63 -0
- package/dist/cli/cmd-dashboard.js.map +1 -0
- package/dist/cli/cmd-projects.js +128 -0
- package/dist/cli/cmd-projects.js.map +1 -0
- package/dist/cli/cmd-team.js +587 -0
- package/dist/cli/cmd-team.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/config.js +4 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/extensions/team-coordinator.js +63 -0
- package/dist/extensions/team-coordinator.js.map +1 -0
- package/dist/gateway/routes.js +167 -3
- package/dist/gateway/routes.js.map +1 -1
- package/dist/gateway/ws-handler.js +11 -3
- package/dist/gateway/ws-handler.js.map +1 -1
- package/dist/runtime/orchestrate.js +19 -8
- package/dist/runtime/orchestrate.js.map +1 -1
- package/dist/serve.js +15 -17
- package/dist/serve.js.map +1 -1
- package/dist/session.js +14 -2
- package/dist/session.js.map +1 -1
- package/dist/team.js +203 -0
- package/dist/team.js.map +1 -0
- package/dist/telegram/dir-browser.js +9 -0
- package/dist/telegram/dir-browser.js.map +1 -1
- package/dist/telegram/draft-stream.js +4 -2
- package/dist/telegram/draft-stream.js.map +1 -1
- package/dist/telegram/terminal.js +65 -31
- package/dist/telegram/terminal.js.map +1 -1
- package/dist/telegram.js +4 -3
- package/dist/telegram.js.map +1 -1
- package/dist/tools/admin.js +841 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/team.js +182 -0
- package/dist/tools/team.js.map +1 -0
- package/dist/tui/commands.js +15 -0
- package/dist/tui/commands.js.map +1 -1
- package/dist/tui/components/welcome.js +2 -1
- package/dist/tui/components/welcome.js.map +1 -1
- package/dist/tui/tui.js +13 -1
- package/dist/tui/tui.js.map +1 -1
- package/package.json +3 -1
- package/dashboard/_next/static/chunks/172-a2787ae03f0db2b4.js +0 -12
- package/dashboard/_next/static/chunks/239-49a9ac3789f8c41c.js +0 -1
- package/dashboard/_next/static/chunks/255-102f2e5b2e3dc2ef.js +0 -1
- package/dashboard/_next/static/chunks/413-89d8e4554f461999.js +0 -1
- package/dashboard/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +0 -1
- package/dashboard/_next/static/chunks/619-ba102abea3e3d0e4.js +0 -1
- package/dashboard/_next/static/chunks/909-aed3aa549e59d0fb.js +0 -1
- package/dashboard/_next/static/chunks/app/_not-found/page-121b856ce9a0ddcd.js +0 -1
- package/dashboard/_next/static/chunks/app/dashboard/agents/page-aa6e6fb2a1df7d63.js +0 -1
- package/dashboard/_next/static/chunks/app/dashboard/chat/page-feeb17fdc08b91e5.js +0 -1
- package/dashboard/_next/static/chunks/app/dashboard/config/page-afad9f4da82a343e.js +0 -1
- package/dashboard/_next/static/chunks/app/dashboard/layout-853ce5dfe3461735.js +0 -1
- package/dashboard/_next/static/chunks/app/dashboard/monitor/page-1b3d112c49b3a383.js +0 -1
- package/dashboard/_next/static/chunks/app/dashboard/page-b15605f3b21f7467.js +0 -1
- package/dashboard/_next/static/chunks/app/dashboard/sessions/page-e11d3f3e6ad99067.js +0 -1
- package/dashboard/_next/static/chunks/app/docs/[slug]/page-baf0632d98082d10.js +0 -1
- package/dashboard/_next/static/chunks/app/docs/page-5933496f46ff00ec.js +0 -1
- package/dashboard/_next/static/chunks/app/download/page-da533b5f543dfd66.js +0 -1
- package/dashboard/_next/static/chunks/app/layout-1112267c08c875b5.js +0 -1
- package/dashboard/_next/static/chunks/app/page-d69c17b39431e2c5.js +0 -1
- package/dashboard/_next/static/chunks/framework-de98b93a850cfc71.js +0 -1
- package/dashboard/_next/static/chunks/main-8d9a106db393efcf.js +0 -1
- package/dashboard/_next/static/chunks/main-app-e38cb42677e65e59.js +0 -1
- package/dashboard/_next/static/chunks/pages/_app-7d307437aca18ad4.js +0 -1
- package/dashboard/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +0 -1
- package/dashboard/_next/static/chunks/webpack-b2507a6fba7be451.js +0 -1
- package/dashboard/_next/static/css/c60b60dc84892a8b.css +0 -5
- package/dashboard/_next/static/css/d4ea3c83e49eb5e1.css +0 -4
- package/dashboard/_next/static/jjqY4ybx1hNTX-bnJfS2f/_buildManifest.js +0 -1
- package/dashboard/_next/static/jjqY4ybx1hNTX-bnJfS2f/_ssgManifest.js +0 -1
- package/dashboard/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dashboard/_next/static/media/4da3161b738b07dd-s.woff2 +0 -0
- package/dashboard/_next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dashboard/_next/static/media/af4bf8399d1aacdf-s.p.woff2 +0 -0
- package/dashboard/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- package/dashboard/_next/static/media/fb526027db1fc1ae-s.woff2 +0 -0
- package/dashboard/agents/index.html +0 -1
- package/dashboard/agents/index.txt +0 -28
- package/dashboard/chat/index.html +0 -1
- package/dashboard/chat/index.txt +0 -28
- package/dashboard/config/index.html +0 -1
- package/dashboard/config/index.txt +0 -28
- package/dashboard/monitor/index.html +0 -1
- package/dashboard/monitor/index.txt +0 -28
- package/dashboard/sessions/index.html +0 -1
- package/dashboard/sessions/index.txt +0 -28
- package/dist/cli/cmd-install.js +0 -80
- package/dist/cli/cmd-install.js.map +0 -1
- package/dist/telegram/bot-approval.js +0 -63
- package/dist/telegram/bot-approval.js.map +0 -1
- package/dist/telegram/pairing.js +0 -138
- package/dist/telegram/pairing.js.map +0 -1
- /package/dashboard/_next/{static/chunks/polyfills-42372ed130431b0a.js → _next/static/chunks/03~yq9q893hmn.js} +0 -0
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
import { register } from "./registry.js";
|
|
2
|
+
import { loadConfig, saveConfig, ensureDirs } from "../core/config.js";
|
|
3
|
+
import { seedAgentWorkspace } from "../workspace.js";
|
|
4
|
+
import { ensureTeamDir, teamPaths, readDiscussion, listInboxesWithUnread } from "../team.js";
|
|
5
|
+
import { hasFlag, getFlag } from "./parse.js";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { paths } from "../core/config.js";
|
|
9
|
+
// ─── Shared collaboration preamble (every role gets this) ────────────
|
|
10
|
+
const COLLAB_PREAMBLE = `# Collaboration protocol — READ FIRST
|
|
11
|
+
|
|
12
|
+
You are part of a team. Your peers run in parallel agent sessions and you
|
|
13
|
+
share a workspace at \`~/.camelagi/team/<team-id>/\`. There are exactly THREE
|
|
14
|
+
ways to talk to your peers — pick by latency:
|
|
15
|
+
|
|
16
|
+
| Tool | When to use |
|
|
17
|
+
|------|-------------|
|
|
18
|
+
| \`Agent({ subagent_type: "<peer>", prompt: "..." })\` | "I need their answer NOW to continue this turn." Spawns the peer synchronously inside your reply. They run, return text, you keep going. |
|
|
19
|
+
| \`team_send({ to: "<peer>", content: "..." })\` | "FYI / take it from here / picked up next time you wake." Drops a message in their inbox. Coordinator wakes idle agents within ~60s. |
|
|
20
|
+
| \`cron({ action: "add", agentId: "<peer>", schedule: "+1h", prompt: "..." })\` | "Do this LATER" (e.g. nightly run, retry in an hour, scheduled report). Don't use cron for handoffs that should happen now. |
|
|
21
|
+
|
|
22
|
+
## At the start of EVERY turn
|
|
23
|
+
|
|
24
|
+
1. \`team_recv()\` — read your inbox. Peers may have written to you while you slept. **If your inbox has work for you, prioritize it.**
|
|
25
|
+
2. \`team_log({ tailBytes: 4096 })\` — read the last few exchanges so you have context.
|
|
26
|
+
3. \`team_state({ action: "get" })\` — see the current task / branch / blockers.
|
|
27
|
+
|
|
28
|
+
## Sharing context
|
|
29
|
+
|
|
30
|
+
- \`team_broadcast(content)\` — post to the group log (no specific recipient).
|
|
31
|
+
- \`team_decision({ action: "add", content })\` — lock in a call. Append-only, becomes team contract.
|
|
32
|
+
- \`team_topic({ action: "write", topic, content })\` — long-form note (research, spec, plan).
|
|
33
|
+
- \`team_state({ action: "patch", content })\` — update the shared task board.
|
|
34
|
+
|
|
35
|
+
**Single source of truth:** the team workspace files. Don't claim "I told you" — write it down.
|
|
36
|
+
|
|
37
|
+
`;
|
|
38
|
+
const TEAM_ROLES = [
|
|
39
|
+
{
|
|
40
|
+
id: "manager",
|
|
41
|
+
name: "Manager",
|
|
42
|
+
description: "Coordinates the team — NEVER writes code",
|
|
43
|
+
thinking: "high",
|
|
44
|
+
effort: "high",
|
|
45
|
+
maxTurns: 15,
|
|
46
|
+
soul: COLLAB_PREAMBLE + `# Role: Manager
|
|
47
|
+
|
|
48
|
+
You coordinate the team. You **own \`team_state\`** — keep the task board accurate. You **don't write code, fix bugs, or run tests yourself.**
|
|
49
|
+
|
|
50
|
+
## What a coordinated turn looks like for you
|
|
51
|
+
|
|
52
|
+
1. \`team_recv\` (always) → \`team_log\` → \`team_state({action:"get"})\`.
|
|
53
|
+
2. Decide the next ONE concrete step. Update \`team_state({action:"set"})\`.
|
|
54
|
+
3. Delegate by latency:
|
|
55
|
+
- **Need an answer this turn?** \`Agent({ subagent_type: "researcher", prompt: "..." })\` or \`Agent({ subagent_type: "developer", prompt: "..." })\`.
|
|
56
|
+
- **Picked up after this turn?** \`team_send({ to: "developer", content: "implement X. branch already created." })\`.
|
|
57
|
+
- **Time-based?** \`cron(...)\`.
|
|
58
|
+
4. Lock big calls: \`team_decision({ action: "add", content: "..." })\`.
|
|
59
|
+
|
|
60
|
+
## What you do
|
|
61
|
+
|
|
62
|
+
- Read project state (git log, npm test, recent reports).
|
|
63
|
+
- Pick exactly one task at a time.
|
|
64
|
+
- Drive the workflow. Spawn researcher synchronously when you need information; team_send to developer when work is ready to start; coordinate reviewer/tester when developer finishes.
|
|
65
|
+
- Update state.md after every meaningful event.
|
|
66
|
+
|
|
67
|
+
## What you NEVER do
|
|
68
|
+
|
|
69
|
+
- Write or edit project code.
|
|
70
|
+
- Run \`npm test\` yourself — that's the tester.
|
|
71
|
+
- Approve / reject merges — that's the reviewer.
|
|
72
|
+
|
|
73
|
+
## When unsure
|
|
74
|
+
|
|
75
|
+
Spawn researcher synchronously, get their answer, decide, write a decision. Don't loop in cron for things that can be answered in this turn.
|
|
76
|
+
`,
|
|
77
|
+
tools: `# Manager tools
|
|
78
|
+
- Bash: git log, git branch, ls, cat (read-only analysis)
|
|
79
|
+
- Read: read project files
|
|
80
|
+
- cron: schedule other agents (THIS IS YOUR MAIN TOOL)
|
|
81
|
+
- Write: only for ~/.camelagi/pipeline/ files
|
|
82
|
+
`,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "researcher",
|
|
86
|
+
name: "Researcher",
|
|
87
|
+
description: "Researches ideas — NEVER writes code",
|
|
88
|
+
thinking: "high",
|
|
89
|
+
effort: "high",
|
|
90
|
+
maxTurns: 15,
|
|
91
|
+
soul: COLLAB_PREAMBLE + `# Role: Researcher
|
|
92
|
+
|
|
93
|
+
You investigate questions. You **don't write project code**, you don't run tests, you don't merge.
|
|
94
|
+
|
|
95
|
+
## What a turn looks like
|
|
96
|
+
|
|
97
|
+
1. \`team_recv\` → check what was asked.
|
|
98
|
+
2. WebSearch + WebFetch + Read project files for context.
|
|
99
|
+
3. Write findings to \`team_topic({ action: "write", topic: "<slug>", content: "..." })\` — long-form, structured.
|
|
100
|
+
4. Summarize back to whoever asked: if you were spawned via \`Agent\`, just return text. If you got the request via inbox, \`team_send({ to: "<requester>", content: "see topic <slug>; tl;dr: ..." })\`.
|
|
101
|
+
|
|
102
|
+
## Output shape
|
|
103
|
+
|
|
104
|
+
Topic note structure:
|
|
105
|
+
- **Question:** the original ask
|
|
106
|
+
- **Findings:** what you learned
|
|
107
|
+
- **Recommendation:** your call
|
|
108
|
+
- **Tradeoffs:** what to watch
|
|
109
|
+
- **Sources:** links
|
|
110
|
+
|
|
111
|
+
## What you NEVER do
|
|
112
|
+
|
|
113
|
+
- Write project code or edit project files.
|
|
114
|
+
- Make architectural decisions yourself (give recommendations, let manager call \`team_decision\`).
|
|
115
|
+
`,
|
|
116
|
+
tools: `# Researcher tools
|
|
117
|
+
- WebSearch: find information
|
|
118
|
+
- WebFetch: read web pages
|
|
119
|
+
- Read: read project files for context
|
|
120
|
+
- Write: ONLY to ~/.camelagi/pipeline/research/
|
|
121
|
+
`,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "developer",
|
|
125
|
+
name: "Developer",
|
|
126
|
+
description: "Writes code — NEVER reviews or tests",
|
|
127
|
+
thinking: "high",
|
|
128
|
+
effort: "max",
|
|
129
|
+
maxTurns: 40,
|
|
130
|
+
soul: COLLAB_PREAMBLE + `# Role: Developer
|
|
131
|
+
|
|
132
|
+
You implement code changes. You don't pick tasks, don't merge, don't review.
|
|
133
|
+
|
|
134
|
+
## What a turn looks like
|
|
135
|
+
|
|
136
|
+
1. \`team_recv\` (the plan probably arrived via inbox) → \`team_state({action:"get"})\` for current branch.
|
|
137
|
+
2. Read the plan / topic. \`git status\` to confirm clean working tree on the right branch.
|
|
138
|
+
3. Implement.
|
|
139
|
+
4. Need a clarification right now? \`Agent({ subagent_type: "researcher", prompt: "..." })\` for facts, \`Agent({ subagent_type: "manager", prompt: "..." })\` for scope decisions. Use these when waiting wastes time.
|
|
140
|
+
5. \`git commit\`. Then either:
|
|
141
|
+
- **Done & confident:** \`team_send({ to: "tester", content: "branch <x> ready for tests." })\`.
|
|
142
|
+
- **Done but uncertain:** \`team_send({ to: "reviewer", content: "branch <x>, please eyeball before tests." })\`.
|
|
143
|
+
- **Stuck after multiple attempts:** \`team_send({ to: "fixer", content: "blocked on <x>; tried <y, z>." })\` and stop.
|
|
144
|
+
6. Update \`team_state({action:"patch"})\` with what you did.
|
|
145
|
+
|
|
146
|
+
## Boundaries
|
|
147
|
+
|
|
148
|
+
- Don't run npm test as a verification gate — tester does that authoritatively in a worktree. You can run it locally to sanity-check, but don't claim "it passes" without the tester.
|
|
149
|
+
- Don't refactor things outside the plan. If the plan is wrong, ping manager.
|
|
150
|
+
`,
|
|
151
|
+
tools: `# Developer tools
|
|
152
|
+
- Read/Write/Edit: implement code
|
|
153
|
+
- Bash: git commit, npm test, npm run lint
|
|
154
|
+
- cron: schedule tester or fixer when done
|
|
155
|
+
`,
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "reviewer",
|
|
159
|
+
name: "Reviewer",
|
|
160
|
+
description: "Reviews code — NEVER writes or fixes",
|
|
161
|
+
thinking: "high",
|
|
162
|
+
effort: "high",
|
|
163
|
+
maxTurns: 15,
|
|
164
|
+
soul: COLLAB_PREAMBLE + `# Role: Reviewer
|
|
165
|
+
|
|
166
|
+
You read diffs and decide whether they're safe to merge. You don't write code, you don't fix.
|
|
167
|
+
|
|
168
|
+
## What a turn looks like
|
|
169
|
+
|
|
170
|
+
1. \`team_recv\` → \`team_state({action:"get"})\` for the branch under review.
|
|
171
|
+
2. \`git diff main...HEAD\` and read the plan / decisions.
|
|
172
|
+
3. Look for: security issues, logic errors, missing edge cases, scope drift, regressions.
|
|
173
|
+
4. **Need fresh test results?** Spawn synchronously: \`Agent({ subagent_type: "tester", prompt: "run full suite on branch <x>" })\` and read its return.
|
|
174
|
+
5. Decide & route:
|
|
175
|
+
- **APPROVE:** \`gh pr create\`, then \`team_decision({ action: "add", content: "Approved branch X — merged via #<pr>" })\` and \`team_send({ to: "manager", content: "merged" })\`.
|
|
176
|
+
- **REQUEST CHANGES:** \`team_topic({ action: "write", topic: "review-<branch>", content: "..." })\` with line-level feedback, then \`team_send({ to: "fixer", content: "changes needed; see topic review-<branch>" })\`.
|
|
177
|
+
- **REJECT:** \`team_decision({ action: "add", content: "Rejected branch X — reason: ..." })\` and \`team_send({ to: "manager", content: "rejected; see decisions" })\`.
|
|
178
|
+
|
|
179
|
+
## What you NEVER do
|
|
180
|
+
|
|
181
|
+
- Write or edit code.
|
|
182
|
+
- Skip testing on a non-trivial diff.
|
|
183
|
+
- Approve without reading the diff in full.
|
|
184
|
+
`,
|
|
185
|
+
tools: `# Reviewer tools
|
|
186
|
+
- Bash: git diff, git log, npm test, gh pr create
|
|
187
|
+
- Read: read files for context
|
|
188
|
+
- Write: ONLY to ~/.camelagi/pipeline/ files
|
|
189
|
+
- cron: schedule fixer if changes needed
|
|
190
|
+
`,
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
id: "tester",
|
|
194
|
+
name: "Tester",
|
|
195
|
+
description: "Tests code — NEVER writes or fixes",
|
|
196
|
+
thinking: "medium",
|
|
197
|
+
effort: "high",
|
|
198
|
+
maxTurns: 20,
|
|
199
|
+
soul: COLLAB_PREAMBLE + `# Role: Tester
|
|
200
|
+
|
|
201
|
+
You run the verification suite. You don't fix, you don't write features.
|
|
202
|
+
|
|
203
|
+
## What a turn looks like
|
|
204
|
+
|
|
205
|
+
1. \`team_recv\` → identify the branch to test.
|
|
206
|
+
2. Test in an isolated worktree:
|
|
207
|
+
\`\`\`bash
|
|
208
|
+
git worktree add /tmp/camelagi-test HEAD
|
|
209
|
+
cd /tmp/camelagi-test && npm ci
|
|
210
|
+
npm test && npm run lint && npm run build
|
|
211
|
+
\`\`\`
|
|
212
|
+
3. Write the full output to \`team_topic({ action: "write", topic: "test-<branch>", content: "..." })\`.
|
|
213
|
+
4. Route the result:
|
|
214
|
+
- **PASS:** \`team_send({ to: "reviewer", content: "tests green on branch <x>; see topic test-<x>" })\`.
|
|
215
|
+
- **FAIL:** \`team_send({ to: "fixer", content: "tests failed on branch <x>; see topic test-<x>" })\` and \`team_send({ to: "manager", content: "blocked on test failures" })\`.
|
|
216
|
+
5. \`git worktree remove /tmp/camelagi-test\`.
|
|
217
|
+
|
|
218
|
+
## Synchronous use case
|
|
219
|
+
|
|
220
|
+
If a reviewer or developer spawns you via \`Agent({ subagent_type: "tester" })\`, return the result text directly — they're waiting on you in their turn.
|
|
221
|
+
|
|
222
|
+
## What you NEVER do
|
|
223
|
+
|
|
224
|
+
- Edit project code (even to fix flaky tests — that's the fixer).
|
|
225
|
+
- Skip the worktree (running tests against the dev's working tree corrupts state).
|
|
226
|
+
`,
|
|
227
|
+
tools: `# Tester tools
|
|
228
|
+
- Bash: git worktree, npm test, npm run build
|
|
229
|
+
- Write: ONLY to ~/.camelagi/pipeline/test-results/
|
|
230
|
+
- cron: schedule reviewer or fixer
|
|
231
|
+
`,
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
id: "fixer",
|
|
235
|
+
name: "Fixer",
|
|
236
|
+
description: "Fixes failures — NEVER adds features",
|
|
237
|
+
thinking: "high",
|
|
238
|
+
effort: "max",
|
|
239
|
+
maxTurns: 30,
|
|
240
|
+
soul: COLLAB_PREAMBLE + `# Role: Fixer
|
|
241
|
+
|
|
242
|
+
You make broken things pass. You don't add features, don't refactor for taste, don't review.
|
|
243
|
+
|
|
244
|
+
## What a turn looks like
|
|
245
|
+
|
|
246
|
+
1. \`team_recv\` → identify what's broken.
|
|
247
|
+
2. Read the relevant topic (test-<branch> or review-<branch>) for the failure / feedback.
|
|
248
|
+
3. Find the root cause (don't paper over symptoms).
|
|
249
|
+
4. Make the **minimal** fix.
|
|
250
|
+
5. \`git commit -m "fix: <what>"\`.
|
|
251
|
+
6. \`team_send({ to: "tester", content: "fixed; please re-run on branch <x>" })\` — let tester verify, don't mark it green yourself.
|
|
252
|
+
|
|
253
|
+
## When stuck
|
|
254
|
+
|
|
255
|
+
- Try at most 3 attempts. If still failing, \`team_send({ to: "manager", content: "blocked on <x>; tried <y, z>; need decision" })\` and stop.
|
|
256
|
+
- Need fresh eyes mid-fix? \`Agent({ subagent_type: "researcher", prompt: "why does X behave like Y?" })\` synchronously.
|
|
257
|
+
|
|
258
|
+
## Boundaries
|
|
259
|
+
|
|
260
|
+
- Don't expand the diff beyond what's needed to fix.
|
|
261
|
+
- Don't claim the fix works without the tester re-running.
|
|
262
|
+
`,
|
|
263
|
+
tools: `# Fixer tools
|
|
264
|
+
- Read/Write/Edit: fix code
|
|
265
|
+
- Bash: npm test, npm run lint, git commit
|
|
266
|
+
- cron: schedule tester after fixing
|
|
267
|
+
`,
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
// ─── Pipeline cron ────────────────────────────────────────────────────
|
|
271
|
+
function buildPipelineCron(projectDir, schedule) {
|
|
272
|
+
return [{
|
|
273
|
+
id: "team-pipeline",
|
|
274
|
+
name: "Autonomous Pipeline",
|
|
275
|
+
schedule,
|
|
276
|
+
agentId: "manager",
|
|
277
|
+
enabled: false,
|
|
278
|
+
prompt: `Run your daily workflow for the project at: ${projectDir}
|
|
279
|
+
1. cd ${projectDir}
|
|
280
|
+
2. Read project state: git log --oneline -20, npm run lint, npm test
|
|
281
|
+
3. Check past reports in ~/.camelagi/pipeline/reports/
|
|
282
|
+
4. Pick ONE low-risk improvement task
|
|
283
|
+
5. Write a plan to ~/.camelagi/pipeline/active-plan.md
|
|
284
|
+
6. Create a branch: git checkout -b auto/$(date +%Y-%m-%d)-<short-description>
|
|
285
|
+
7. Schedule the developer using the cron tool with agentId: "developer"
|
|
286
|
+
8. Write today's report to ~/.camelagi/pipeline/reports/`,
|
|
287
|
+
}];
|
|
288
|
+
}
|
|
289
|
+
// ─── Command ──────────────────────────────────────────────────────────
|
|
290
|
+
register({
|
|
291
|
+
name: "team",
|
|
292
|
+
description: "Create an autonomous agent team in one command",
|
|
293
|
+
usage: `Usage: camelagi team [subcommand]
|
|
294
|
+
|
|
295
|
+
Subcommands:
|
|
296
|
+
(none) Interactive wizard
|
|
297
|
+
create Create team (non-interactive)
|
|
298
|
+
status Show team status
|
|
299
|
+
remove Remove team agents
|
|
300
|
+
|
|
301
|
+
Options:
|
|
302
|
+
--preset <id> full, core, dev (default: full)
|
|
303
|
+
--schedule <s> Pipeline schedule (default: 1d)
|
|
304
|
+
--model <m> Model for all agents
|
|
305
|
+
--dir <path> Project directory
|
|
306
|
+
--yes, -y Skip confirmations`,
|
|
307
|
+
run: async (args) => {
|
|
308
|
+
const p = await import("@clack/prompts");
|
|
309
|
+
ensureDirs();
|
|
310
|
+
if (args[0] === "status") {
|
|
311
|
+
await showStatus(p);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
if (args[0] === "remove") {
|
|
315
|
+
await removeTeam(p, args);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (args[0] === "create") {
|
|
319
|
+
await createNonInteractive(p, args);
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
await createInteractive(p);
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
// ─── Interactive ──────────────────────────────────────────────────────
|
|
326
|
+
async function createInteractive(p) {
|
|
327
|
+
p.intro("Autonomous Team Setup");
|
|
328
|
+
const config = loadConfig();
|
|
329
|
+
const existing = TEAM_ROLES.filter((r) => config.agents[r.id]);
|
|
330
|
+
if (existing.length > 0) {
|
|
331
|
+
const ok = await p.confirm({ message: `Overwrite ${existing.length} existing team agents?` });
|
|
332
|
+
if (p.isCancel(ok) || !ok) {
|
|
333
|
+
p.cancel("Cancelled.");
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Agents
|
|
338
|
+
const preset = await p.select({
|
|
339
|
+
message: "Team:",
|
|
340
|
+
options: [
|
|
341
|
+
{ value: "full", label: "Full Team (6 agents)", hint: "manager, researcher, developer, reviewer, tester, fixer" },
|
|
342
|
+
{ value: "core", label: "Core Team (3 agents)", hint: "manager, developer, reviewer" },
|
|
343
|
+
{ value: "custom", label: "Custom", hint: "pick individually" },
|
|
344
|
+
],
|
|
345
|
+
});
|
|
346
|
+
if (p.isCancel(preset))
|
|
347
|
+
return;
|
|
348
|
+
let roleIds;
|
|
349
|
+
if (preset === "custom") {
|
|
350
|
+
const sel = await p.multiselect({
|
|
351
|
+
message: "Select agents:",
|
|
352
|
+
options: TEAM_ROLES.map((r) => ({ value: r.id, label: r.name, hint: r.description })),
|
|
353
|
+
required: true,
|
|
354
|
+
});
|
|
355
|
+
if (p.isCancel(sel))
|
|
356
|
+
return;
|
|
357
|
+
roleIds = sel;
|
|
358
|
+
}
|
|
359
|
+
else if (preset === "core") {
|
|
360
|
+
roleIds = ["manager", "developer", "reviewer"];
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
roleIds = TEAM_ROLES.map((r) => r.id);
|
|
364
|
+
}
|
|
365
|
+
const roles = TEAM_ROLES.filter((r) => roleIds.includes(r.id));
|
|
366
|
+
// Directory
|
|
367
|
+
const dir = await p.text({ message: "Project directory:", initialValue: process.cwd() });
|
|
368
|
+
if (p.isCancel(dir))
|
|
369
|
+
return;
|
|
370
|
+
// Schedule
|
|
371
|
+
let schedule = "manual";
|
|
372
|
+
if (roleIds.includes("manager")) {
|
|
373
|
+
schedule = await p.select({
|
|
374
|
+
message: "Pipeline schedule:",
|
|
375
|
+
options: [
|
|
376
|
+
{ value: "1d", label: "Daily" },
|
|
377
|
+
{ value: "12h", label: "Twice daily" },
|
|
378
|
+
{ value: "manual", label: "Manual only" },
|
|
379
|
+
],
|
|
380
|
+
});
|
|
381
|
+
if (p.isCancel(schedule))
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
// Model
|
|
385
|
+
const { resolvePreset, fetchOpenRouterModels } = await import("../core/models.js");
|
|
386
|
+
const modelPreset = resolvePreset(config.provider, config.baseUrl);
|
|
387
|
+
let models = [...modelPreset.models];
|
|
388
|
+
if (config.baseUrl?.includes("openrouter") && config.apiKey) {
|
|
389
|
+
const sv = p.spinner();
|
|
390
|
+
sv.start("Fetching models...");
|
|
391
|
+
const live = await fetchOpenRouterModels(config.apiKey);
|
|
392
|
+
if (live.length > 0) {
|
|
393
|
+
const set = new Set(modelPreset.models);
|
|
394
|
+
models = [...modelPreset.models, ...live.map((m) => m.id).filter((id) => !set.has(id))];
|
|
395
|
+
}
|
|
396
|
+
sv.stop(`${models.length} models available`);
|
|
397
|
+
}
|
|
398
|
+
const modelOpts = models.map((m) => ({ value: m, label: m }));
|
|
399
|
+
if (!models.includes(config.model))
|
|
400
|
+
modelOpts.unshift({ value: config.model, label: config.model });
|
|
401
|
+
const modelMode = await p.select({
|
|
402
|
+
message: "Model:",
|
|
403
|
+
options: [
|
|
404
|
+
{ value: "same", label: "Same for all agents" },
|
|
405
|
+
{ value: "per", label: "Choose per agent" },
|
|
406
|
+
],
|
|
407
|
+
});
|
|
408
|
+
if (p.isCancel(modelMode))
|
|
409
|
+
return;
|
|
410
|
+
const modelMap = {};
|
|
411
|
+
if (modelMode === "same") {
|
|
412
|
+
const m = await p.select({ message: "Model:", options: modelOpts, initialValue: config.model });
|
|
413
|
+
if (p.isCancel(m))
|
|
414
|
+
return;
|
|
415
|
+
for (const r of roles)
|
|
416
|
+
modelMap[r.id] = m;
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
for (const r of roles) {
|
|
420
|
+
const m = await p.select({ message: `${r.name}:`, options: modelOpts, initialValue: config.model });
|
|
421
|
+
if (p.isCancel(m))
|
|
422
|
+
return;
|
|
423
|
+
modelMap[r.id] = m;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Confirm
|
|
427
|
+
p.log.step("Team:");
|
|
428
|
+
for (const r of roles)
|
|
429
|
+
p.log.message(` ${r.id.padEnd(12)} ${modelMap[r.id]}`);
|
|
430
|
+
const ok = await p.confirm({ message: "Create?" });
|
|
431
|
+
if (p.isCancel(ok) || !ok) {
|
|
432
|
+
p.cancel("Cancelled.");
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
const sv = p.spinner();
|
|
436
|
+
sv.start("Creating team...");
|
|
437
|
+
createTeam({ dir: dir, schedule: schedule === "manual" ? undefined : schedule, modelMap, roles });
|
|
438
|
+
sv.stop("Done!");
|
|
439
|
+
p.log.success(`${roles.length} agents created`);
|
|
440
|
+
p.outro("Run: npx tsx src/cli.ts serve");
|
|
441
|
+
}
|
|
442
|
+
// ─── Non-interactive ──────────────────────────────────────────────────
|
|
443
|
+
async function createNonInteractive(p, args) {
|
|
444
|
+
const config = loadConfig();
|
|
445
|
+
const dir = getFlag(args, "--dir") ?? process.cwd();
|
|
446
|
+
const schedule = getFlag(args, "--schedule") ?? "1d";
|
|
447
|
+
const model = getFlag(args, "--model") ?? config.model;
|
|
448
|
+
const skip = hasFlag(args, "--yes") || hasFlag(args, "-y");
|
|
449
|
+
const existing = TEAM_ROLES.filter((r) => config.agents[r.id]);
|
|
450
|
+
if (existing.length > 0 && !skip) {
|
|
451
|
+
const ok = await p.confirm({ message: `Overwrite ${existing.length} agents?` });
|
|
452
|
+
if (p.isCancel(ok) || !ok)
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
const modelMap = {};
|
|
456
|
+
for (const r of TEAM_ROLES)
|
|
457
|
+
modelMap[r.id] = model;
|
|
458
|
+
createTeam({ dir, schedule, modelMap, roles: TEAM_ROLES });
|
|
459
|
+
p.log.success(`${TEAM_ROLES.length} agents created`);
|
|
460
|
+
}
|
|
461
|
+
function createTeam(opts) {
|
|
462
|
+
const config = loadConfig();
|
|
463
|
+
const agents = { ...config.agents };
|
|
464
|
+
const pipelineDir = path.join(paths.configDir, "pipeline");
|
|
465
|
+
for (const sub of ["reports", "research", "test-results", "logs"]) {
|
|
466
|
+
fs.mkdirSync(path.join(pipelineDir, sub), { recursive: true });
|
|
467
|
+
}
|
|
468
|
+
for (const role of opts.roles) {
|
|
469
|
+
seedAgentWorkspace(role.id, role.name, role.description);
|
|
470
|
+
const agentDir = path.join(paths.configDir, "agents", role.id);
|
|
471
|
+
fs.writeFileSync(path.join(agentDir, "SOUL.md"), role.soul);
|
|
472
|
+
fs.writeFileSync(path.join(agentDir, "TOOLS.md"), role.tools);
|
|
473
|
+
const bp = path.join(agentDir, "BOOTSTRAP.md");
|
|
474
|
+
if (fs.existsSync(bp))
|
|
475
|
+
fs.unlinkSync(bp);
|
|
476
|
+
agents[role.id] = {
|
|
477
|
+
name: role.name,
|
|
478
|
+
admin: false,
|
|
479
|
+
model: opts.modelMap[role.id],
|
|
480
|
+
thinking: role.thinking,
|
|
481
|
+
effort: role.effort,
|
|
482
|
+
maxTurns: role.maxTurns,
|
|
483
|
+
workDir: opts.dir,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
// Build / update the teams[] entry. Default team id = "default" — there's
|
|
487
|
+
// exactly one team per CamelAGI instance for now (multi-team is a follow-up).
|
|
488
|
+
const teamId = opts.teamId ?? "default";
|
|
489
|
+
const memberIds = opts.roles.map((r) => r.id);
|
|
490
|
+
const coordinator = memberIds.includes("manager") ? "manager" : memberIds[0];
|
|
491
|
+
const otherTeams = (config.teams ?? []).filter((t) => t.id !== teamId);
|
|
492
|
+
const teamEntry = {
|
|
493
|
+
id: teamId,
|
|
494
|
+
name: opts.teamName ?? "Default Team",
|
|
495
|
+
members: memberIds,
|
|
496
|
+
coordinator,
|
|
497
|
+
createdAt: Date.now(),
|
|
498
|
+
};
|
|
499
|
+
// Seed the shared workspace dir (state.md, decisions.md, inboxes, etc.).
|
|
500
|
+
ensureTeamDir(teamId, memberIds);
|
|
501
|
+
const update = {
|
|
502
|
+
agents,
|
|
503
|
+
teams: [...otherTeams, teamEntry],
|
|
504
|
+
};
|
|
505
|
+
// Cron: always include the team-coordinator (60s inbox watcher), and
|
|
506
|
+
// optionally the daily pipeline kickoff.
|
|
507
|
+
const existingCron = config.cron.filter((j) => j.id !== "team-pipeline" && j.id !== "team-coordinator");
|
|
508
|
+
const newCron = [];
|
|
509
|
+
newCron.push(buildCoordinatorCron(teamId));
|
|
510
|
+
if (opts.schedule)
|
|
511
|
+
newCron.push(...buildPipelineCron(opts.dir, opts.schedule));
|
|
512
|
+
update.cron = [...existingCron, ...newCron];
|
|
513
|
+
saveConfig(update);
|
|
514
|
+
}
|
|
515
|
+
/** Coordinator cron — pings idle agents that have unread inbox messages.
|
|
516
|
+
* Runs every 60s. The agent it wakes is whichever member has unread messages
|
|
517
|
+
* (one wake per cron tick is enough; the agent will read its own inbox). */
|
|
518
|
+
function buildCoordinatorCron(teamId) {
|
|
519
|
+
return {
|
|
520
|
+
id: "team-coordinator",
|
|
521
|
+
name: `Team coordinator (${teamId})`,
|
|
522
|
+
schedule: "60s",
|
|
523
|
+
enabled: true,
|
|
524
|
+
// No agentId — this cron runs on the gateway's main runtime and uses the
|
|
525
|
+
// built-in inbox check. The handler is special-cased in extensions/cron.ts.
|
|
526
|
+
prompt: `__TEAM_COORDINATOR__:${teamId}`,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
// ─── Status ───────────────────────────────────────────────────────────
|
|
530
|
+
async function showStatus(p) {
|
|
531
|
+
const config = loadConfig();
|
|
532
|
+
const team = TEAM_ROLES.filter((r) => config.agents[r.id]);
|
|
533
|
+
if (team.length === 0) {
|
|
534
|
+
p.log.warn("No team. Run: camel team");
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
const teamEntry = (config.teams ?? [])[0];
|
|
538
|
+
const teamId = teamEntry?.id ?? "default";
|
|
539
|
+
p.log.step(`Team "${teamEntry?.name ?? teamId}" (${team.length} agents):`);
|
|
540
|
+
for (const r of team) {
|
|
541
|
+
const a = config.agents[r.id];
|
|
542
|
+
p.log.message(` ${r.id.padEnd(12)} ${a.model ?? config.model}`);
|
|
543
|
+
}
|
|
544
|
+
// Workspace + cron status
|
|
545
|
+
const tp = teamPaths(teamId);
|
|
546
|
+
p.log.step(`Workspace: ${tp.root}`);
|
|
547
|
+
const unread = listInboxesWithUnread(teamId);
|
|
548
|
+
if (unread.length === 0) {
|
|
549
|
+
p.log.message(` inbox: all clear`);
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
p.log.message(` inbox: ${unread.join(", ")} have unread`);
|
|
553
|
+
}
|
|
554
|
+
// Recent discussion tail
|
|
555
|
+
if (fs.existsSync(tp.discussion)) {
|
|
556
|
+
p.log.step(`Recent discussion (last ~2 KB):`);
|
|
557
|
+
const tail = readDiscussion(teamId, 2048).trim().split("\n").slice(-12).join("\n");
|
|
558
|
+
p.log.message(tail || "(empty)");
|
|
559
|
+
}
|
|
560
|
+
const coord = config.cron.find((j) => j.id === "team-coordinator");
|
|
561
|
+
const pipeline = config.cron.find((j) => j.id === "team-pipeline");
|
|
562
|
+
if (coord)
|
|
563
|
+
p.log.step(`Coordinator: ${coord.schedule} (${coord.enabled ? "enabled" : "disabled"})`);
|
|
564
|
+
if (pipeline)
|
|
565
|
+
p.log.step(`Pipeline kickoff: ${pipeline.schedule} (${pipeline.enabled ? "enabled" : "manual"})`);
|
|
566
|
+
}
|
|
567
|
+
// ─── Remove ───────────────────────────────────────────────────────────
|
|
568
|
+
async function removeTeam(p, args) {
|
|
569
|
+
const config = loadConfig();
|
|
570
|
+
const skip = hasFlag(args, "--yes") || hasFlag(args, "-y");
|
|
571
|
+
const team = TEAM_ROLES.filter((r) => config.agents[r.id]);
|
|
572
|
+
if (team.length === 0) {
|
|
573
|
+
p.log.info("No team agents.");
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
if (!skip) {
|
|
577
|
+
const ok = await p.confirm({ message: `Remove ${team.length} agents?` });
|
|
578
|
+
if (p.isCancel(ok) || !ok)
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
const agents = { ...config.agents };
|
|
582
|
+
for (const r of TEAM_ROLES)
|
|
583
|
+
delete agents[r.id];
|
|
584
|
+
saveConfig({ agents, cron: config.cron.filter((j) => j.id !== "team-pipeline") });
|
|
585
|
+
p.log.success(`Removed ${team.length} agents`);
|
|
586
|
+
}
|
|
587
|
+
//# sourceMappingURL=cmd-team.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd-team.js","sourceRoot":"","sources":["../../src/cli/cmd-team.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -25,6 +25,7 @@ import "./cli/cmd-status.js";
|
|
|
25
25
|
import "./cli/cmd-connect.js";
|
|
26
26
|
import "./cli/cmd-tailscale.js";
|
|
27
27
|
import "./cli/cmd-watch.js";
|
|
28
|
+
import "./cli/cmd-dashboard.js";
|
|
28
29
|
const args = process.argv.slice(2);
|
|
29
30
|
// Non-blocking update check on every invocation (skip if already running update)
|
|
30
31
|
if (args[0] !== "update") {
|
|
@@ -49,7 +50,7 @@ if (args[0] === "--help" || args[0] === "-h" || args.length === 0) {
|
|
|
49
50
|
};
|
|
50
51
|
const categorize = {
|
|
51
52
|
bootstrap: "Getting Started", setup: "Getting Started", chat: "Getting Started",
|
|
52
|
-
serve: "Server", daemon: "Server", logs: "Server", status: "Server", connect: "Server", tailscale: "Server", watch: "Server",
|
|
53
|
+
serve: "Server", dashboard: "Server", daemon: "Server", logs: "Server", status: "Server", connect: "Server", tailscale: "Server", watch: "Server",
|
|
53
54
|
agents: "Agents & Sessions", soul: "Agents & Sessions", sessions: "Agents & Sessions", pairing: "Agents & Sessions",
|
|
54
55
|
config: "Configuration", cron: "Configuration",
|
|
55
56
|
doctor: "Maintenance", reset: "Maintenance", install: "Maintenance", uninstall: "Maintenance",
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,4CAA4C;AAC5C,wDAAwD;AAExD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,8CAA8C;AAC9C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,wBAAwB,CAAC;AAChC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,wBAAwB,CAAC;AAChC,OAAO,qBAAqB,CAAC;AAC7B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,wBAAwB,CAAC;AAChC,OAAO,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|