@agent-link/server 0.1.152 → 0.1.154
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/package.json +1 -1
- package/web/app.js +84 -13
- package/web/landing.html +11 -11
- package/web/landing.zh.html +11 -11
- package/web/modules/team.js +15 -2
- package/web/modules/teamTemplates.js +360 -0
- package/web/style.css +120 -0
package/package.json
CHANGED
package/web/app.js
CHANGED
|
@@ -19,6 +19,7 @@ import { createConnection } from './modules/connection.js';
|
|
|
19
19
|
import { createFileBrowser } from './modules/fileBrowser.js';
|
|
20
20
|
import { createFilePreview } from './modules/filePreview.js';
|
|
21
21
|
import { createTeam } from './modules/team.js';
|
|
22
|
+
import { TEMPLATES, TEMPLATE_KEYS, buildFullLeadPrompt } from './modules/teamTemplates.js';
|
|
22
23
|
import { createScrollManager, createHighlightScheduler, formatUsage } from './modules/appHelpers.js';
|
|
23
24
|
|
|
24
25
|
// ── App ─────────────────────────────────────────────────────────────────────
|
|
@@ -124,21 +125,33 @@ const App = {
|
|
|
124
125
|
|
|
125
126
|
// Team creation state
|
|
126
127
|
const teamInstruction = ref('');
|
|
128
|
+
const selectedTemplate = ref('custom');
|
|
129
|
+
const editedLeadPrompt = ref(TEMPLATES.custom.leadPrompt);
|
|
130
|
+
const leadPromptExpanded = ref(false);
|
|
127
131
|
const teamExamples = [
|
|
128
132
|
{
|
|
129
133
|
icon: '<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"/></svg>',
|
|
130
134
|
title: 'Full-stack App',
|
|
135
|
+
template: 'full-stack',
|
|
131
136
|
text: 'Build a single-page calculator app: one agent creates the HTML/CSS UI, one implements the JavaScript logic, and one writes tests.',
|
|
132
137
|
},
|
|
138
|
+
{
|
|
139
|
+
icon: '<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></svg>',
|
|
140
|
+
title: 'Research',
|
|
141
|
+
template: 'research',
|
|
142
|
+
text: 'Research this project\'s architecture: one agent analyzes the backend structure, one maps the frontend components, and one reviews the build and deployment pipeline. Produce a unified architecture report.',
|
|
143
|
+
},
|
|
133
144
|
{
|
|
134
145
|
icon: '<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>',
|
|
135
|
-
title: '
|
|
136
|
-
|
|
146
|
+
title: '代码审查',
|
|
147
|
+
template: 'code-review',
|
|
148
|
+
text: '审查当前项目的代码质量、安全漏洞和测试覆盖率,按严重程度生成分级报告,并给出修复建议。',
|
|
137
149
|
},
|
|
138
150
|
{
|
|
139
151
|
icon: '<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></svg>',
|
|
140
|
-
title: '
|
|
141
|
-
|
|
152
|
+
title: '技术文档',
|
|
153
|
+
template: 'content',
|
|
154
|
+
text: '为当前项目编写一份完整的技术文档:先调研项目结构和核心模块,然后撰写包含架构概览、API 参考和使用指南的文档,最后校审确保准确性和可读性。',
|
|
142
155
|
},
|
|
143
156
|
];
|
|
144
157
|
const kanbanExpanded = ref(false);
|
|
@@ -615,11 +628,35 @@ const App = {
|
|
|
615
628
|
teamExamples,
|
|
616
629
|
kanbanExpanded,
|
|
617
630
|
instructionExpanded,
|
|
631
|
+
selectedTemplate,
|
|
632
|
+
editedLeadPrompt,
|
|
633
|
+
leadPromptExpanded,
|
|
634
|
+
TEMPLATES,
|
|
635
|
+
TEMPLATE_KEYS,
|
|
636
|
+
onTemplateChange(key) {
|
|
637
|
+
selectedTemplate.value = key;
|
|
638
|
+
editedLeadPrompt.value = TEMPLATES[key].leadPrompt;
|
|
639
|
+
},
|
|
640
|
+
resetLeadPrompt() {
|
|
641
|
+
editedLeadPrompt.value = TEMPLATES[selectedTemplate.value].leadPrompt;
|
|
642
|
+
},
|
|
643
|
+
leadPromptPreview() {
|
|
644
|
+
const text = editedLeadPrompt.value || '';
|
|
645
|
+
return text.length > 80 ? text.slice(0, 80) + '...' : text;
|
|
646
|
+
},
|
|
618
647
|
launchTeamFromPanel() {
|
|
619
648
|
const inst = teamInstruction.value.trim();
|
|
620
649
|
if (!inst) return;
|
|
621
|
-
|
|
650
|
+
const tplKey = selectedTemplate.value;
|
|
651
|
+
const tpl = TEMPLATES[tplKey];
|
|
652
|
+
const agents = tpl.agents;
|
|
653
|
+
const leadPrompt = buildFullLeadPrompt(editedLeadPrompt.value, agents, inst);
|
|
654
|
+
team.launchTeam(inst, leadPrompt, agents);
|
|
622
655
|
teamInstruction.value = '';
|
|
656
|
+
// Reset template state for next time
|
|
657
|
+
selectedTemplate.value = 'custom';
|
|
658
|
+
editedLeadPrompt.value = TEMPLATES.custom.leadPrompt;
|
|
659
|
+
leadPromptExpanded.value = false;
|
|
623
660
|
},
|
|
624
661
|
formatTeamTime(ts) {
|
|
625
662
|
if (!ts) return '';
|
|
@@ -1052,13 +1089,47 @@ const App = {
|
|
|
1052
1089
|
<svg viewBox="0 0 24 24" width="28" height="28"><path fill="currentColor" opacity="0.5" d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg>
|
|
1053
1090
|
<h2>Launch Agent Team</h2>
|
|
1054
1091
|
</div>
|
|
1055
|
-
<p class="team-create-desc">
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1092
|
+
<p class="team-create-desc">Select a template, review the lead prompt, and describe your task.</p>
|
|
1093
|
+
|
|
1094
|
+
<!-- Template selector -->
|
|
1095
|
+
<div class="team-tpl-section">
|
|
1096
|
+
<label class="team-tpl-label">Template</label>
|
|
1097
|
+
<select class="team-tpl-select" :value="selectedTemplate" @change="onTemplateChange($event.target.value)">
|
|
1098
|
+
<option v-for="key in TEMPLATE_KEYS" :key="key" :value="key">{{ TEMPLATES[key].label }}</option>
|
|
1099
|
+
</select>
|
|
1100
|
+
<span class="team-tpl-desc">{{ TEMPLATES[selectedTemplate].description }}</span>
|
|
1101
|
+
</div>
|
|
1102
|
+
|
|
1103
|
+
<!-- Collapsible lead prompt -->
|
|
1104
|
+
<div class="team-lead-prompt-section">
|
|
1105
|
+
<div class="team-lead-prompt-header" @click="leadPromptExpanded = !leadPromptExpanded">
|
|
1106
|
+
<svg class="team-lead-prompt-arrow" :class="{ expanded: leadPromptExpanded }" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>
|
|
1107
|
+
<span class="team-lead-prompt-title">Lead Prompt</span>
|
|
1108
|
+
<span v-if="!leadPromptExpanded" class="team-lead-prompt-preview">{{ leadPromptPreview() }}</span>
|
|
1109
|
+
</div>
|
|
1110
|
+
<div v-if="leadPromptExpanded" class="team-lead-prompt-body">
|
|
1111
|
+
<textarea
|
|
1112
|
+
v-model="editedLeadPrompt"
|
|
1113
|
+
class="team-lead-prompt-textarea"
|
|
1114
|
+
rows="10"
|
|
1115
|
+
></textarea>
|
|
1116
|
+
<div class="team-lead-prompt-actions">
|
|
1117
|
+
<button class="team-lead-prompt-reset" @click="resetLeadPrompt()" title="Reset to template default">Reset</button>
|
|
1118
|
+
</div>
|
|
1119
|
+
</div>
|
|
1120
|
+
</div>
|
|
1121
|
+
|
|
1122
|
+
<!-- Task description -->
|
|
1123
|
+
<div class="team-tpl-section">
|
|
1124
|
+
<label class="team-tpl-label">Task Description</label>
|
|
1125
|
+
<textarea
|
|
1126
|
+
v-model="teamInstruction"
|
|
1127
|
+
class="team-create-textarea"
|
|
1128
|
+
placeholder="Describe the task for the team... e.g. 'Review the authentication module for security issues and fix any vulnerabilities found.'"
|
|
1129
|
+
rows="4"
|
|
1130
|
+
></textarea>
|
|
1131
|
+
</div>
|
|
1132
|
+
|
|
1062
1133
|
<div class="team-create-actions">
|
|
1063
1134
|
<button class="team-create-launch" :disabled="!teamInstruction.trim()" @click="launchTeamFromPanel()">
|
|
1064
1135
|
<svg viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></svg>
|
|
@@ -1077,7 +1148,7 @@ const App = {
|
|
|
1077
1148
|
<div class="team-example-title">{{ ex.title }}</div>
|
|
1078
1149
|
<div class="team-example-text">{{ ex.text }}</div>
|
|
1079
1150
|
</div>
|
|
1080
|
-
<button class="team-example-try" @click="teamInstruction = ex.text">Try it</button>
|
|
1151
|
+
<button class="team-example-try" @click="onTemplateChange(ex.template); teamInstruction = ex.text">Try it</button>
|
|
1081
1152
|
</div>
|
|
1082
1153
|
</div>
|
|
1083
1154
|
</div>
|
package/web/landing.html
CHANGED
|
@@ -1131,6 +1131,17 @@
|
|
|
1131
1131
|
<p>Run multiple conversations in parallel. Switch between tasks without losing context.</p>
|
|
1132
1132
|
</div>
|
|
1133
1133
|
|
|
1134
|
+
<!-- Any Device -->
|
|
1135
|
+
<div class="bento-card">
|
|
1136
|
+
<div class="bento-visual">
|
|
1137
|
+
<div class="bento-icon cyan">
|
|
1138
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line></svg>
|
|
1139
|
+
</div>
|
|
1140
|
+
</div>
|
|
1141
|
+
<h3>Any Device</h3>
|
|
1142
|
+
<p>Phone, tablet, laptop — any browser becomes your Claude Code terminal.</p>
|
|
1143
|
+
</div>
|
|
1144
|
+
|
|
1134
1145
|
<!-- Full Claude Code — wide -->
|
|
1135
1146
|
<div class="bento-card wide">
|
|
1136
1147
|
<div class="bento-visual">
|
|
@@ -1160,17 +1171,6 @@
|
|
|
1160
1171
|
<p>File editing, shell commands, search, multi-turn conversations — every capability, now in your browser.</p>
|
|
1161
1172
|
</div>
|
|
1162
1173
|
|
|
1163
|
-
<!-- Any Device -->
|
|
1164
|
-
<div class="bento-card">
|
|
1165
|
-
<div class="bento-visual">
|
|
1166
|
-
<div class="bento-icon cyan">
|
|
1167
|
-
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line></svg>
|
|
1168
|
-
</div>
|
|
1169
|
-
</div>
|
|
1170
|
-
<h3>Any Device</h3>
|
|
1171
|
-
<p>Phone, tablet, laptop — any browser becomes your Claude Code terminal.</p>
|
|
1172
|
-
</div>
|
|
1173
|
-
|
|
1174
1174
|
<!-- Self-hostable -->
|
|
1175
1175
|
<div class="bento-card">
|
|
1176
1176
|
<div class="bento-visual">
|
package/web/landing.zh.html
CHANGED
|
@@ -1130,6 +1130,17 @@
|
|
|
1130
1130
|
<p>同时跑多个对话,自由切换,互不干扰。</p>
|
|
1131
1131
|
</div>
|
|
1132
1132
|
|
|
1133
|
+
<!-- Any Device -->
|
|
1134
|
+
<div class="bento-card">
|
|
1135
|
+
<div class="bento-visual">
|
|
1136
|
+
<div class="bento-icon cyan">
|
|
1137
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line></svg>
|
|
1138
|
+
</div>
|
|
1139
|
+
</div>
|
|
1140
|
+
<h3>任何设备</h3>
|
|
1141
|
+
<p>手机、平板、笔记本 — 有浏览器就行,随时切到你的 Claude。</p>
|
|
1142
|
+
</div>
|
|
1143
|
+
|
|
1133
1144
|
<!-- Full Claude Code — wide -->
|
|
1134
1145
|
<div class="bento-card wide">
|
|
1135
1146
|
<div class="bento-visual">
|
|
@@ -1159,17 +1170,6 @@
|
|
|
1159
1170
|
<p>文件编辑、Shell 命令、代码搜索、多轮对话 — 所有能力,现在搬到了浏览器里。</p>
|
|
1160
1171
|
</div>
|
|
1161
1172
|
|
|
1162
|
-
<!-- Any Device -->
|
|
1163
|
-
<div class="bento-card">
|
|
1164
|
-
<div class="bento-visual">
|
|
1165
|
-
<div class="bento-icon cyan">
|
|
1166
|
-
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"></rect><line x1="12" y1="18" x2="12.01" y2="18"></line></svg>
|
|
1167
|
-
</div>
|
|
1168
|
-
</div>
|
|
1169
|
-
<h3>任何设备</h3>
|
|
1170
|
-
<p>手机、平板、笔记本 — 有浏览器就行,随时切到你的 Claude。</p>
|
|
1171
|
-
</div>
|
|
1172
|
-
|
|
1173
1173
|
<!-- Self-hostable -->
|
|
1174
1174
|
<div class="bento-card">
|
|
1175
1175
|
<div class="bento-visual">
|
package/web/modules/team.js
CHANGED
|
@@ -72,8 +72,15 @@ export function createTeam(deps) {
|
|
|
72
72
|
|
|
73
73
|
// ── Methods ──
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
/** Sync active team's status into the sidebar teamsList entry. */
|
|
76
|
+
function syncTeamsListStatus() {
|
|
77
|
+
if (!teamState.value) return;
|
|
78
|
+
const item = teamsList.value.find(t => t.teamId === teamState.value.teamId);
|
|
79
|
+
if (item) item.status = teamState.value.status;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function launchTeam(instruction, leadPrompt, agents) {
|
|
83
|
+
wsSend({ type: 'create_team', instruction, leadPrompt, agents });
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
function dissolveTeam() {
|
|
@@ -186,6 +193,7 @@ export function createTeam(deps) {
|
|
|
186
193
|
// Update team status to running when first subagent appears
|
|
187
194
|
if (teamState.value.status === 'planning') {
|
|
188
195
|
teamState.value.status = 'running';
|
|
196
|
+
syncTeamsListStatus();
|
|
189
197
|
}
|
|
190
198
|
return true;
|
|
191
199
|
}
|
|
@@ -216,12 +224,17 @@ export function createTeam(deps) {
|
|
|
216
224
|
if (!teamState.value || teamState.value.teamId !== msg.teamId) return false;
|
|
217
225
|
// Update with final state from server
|
|
218
226
|
teamState.value = msg.team;
|
|
227
|
+
syncTeamsListStatus();
|
|
219
228
|
return true;
|
|
220
229
|
}
|
|
221
230
|
|
|
222
231
|
case 'team_lead_status': {
|
|
223
232
|
if (!teamState.value || teamState.value.teamId !== msg.teamId) return false;
|
|
224
233
|
teamState.value.leadStatus = msg.leadStatus;
|
|
234
|
+
if (msg.teamStatus) {
|
|
235
|
+
teamState.value.status = msg.teamStatus;
|
|
236
|
+
syncTeamsListStatus();
|
|
237
|
+
}
|
|
225
238
|
return true;
|
|
226
239
|
}
|
|
227
240
|
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
// ── Team template definitions ──────────────────────────────────────────────
|
|
2
|
+
// Defines predefined agent roles and lead instructions for each template.
|
|
3
|
+
// These were previously in agent/src/team-templates.ts; now live in the
|
|
4
|
+
// web layer so the user can view, select, and edit before launching.
|
|
5
|
+
|
|
6
|
+
// ── Shared lead prompt rules ───────────────────────────────────────────────
|
|
7
|
+
// Appended to every lead prompt to enforce consistent behavior.
|
|
8
|
+
const LEAD_RULES = `
|
|
9
|
+
Rules you MUST follow:
|
|
10
|
+
- ALWAYS call the Agent tool with a descriptive, role-based name (e.g., "Security Auditor", "Backend Engineer") — never "Agent 1" or "worker".
|
|
11
|
+
- Maximize parallelism: spawn independent tasks simultaneously. Only serialize tasks that have true data dependencies.
|
|
12
|
+
- Before spawning agents, briefly state your plan: which agents you will spawn, what each will do, and which (if any) must wait for others.
|
|
13
|
+
- After all agents finish, produce a structured summary in Markdown with sections: ## Overview, ## What Was Done (per agent), ## Issues & Recommendations (if any).
|
|
14
|
+
- If an agent fails or returns poor-quality output, diagnose the issue and re-delegate with corrected instructions rather than accepting bad results.
|
|
15
|
+
- Keep each agent's scope focused — one clear responsibility per agent. Do not overload a single agent with unrelated subtasks.`;
|
|
16
|
+
|
|
17
|
+
export const TEMPLATES = {
|
|
18
|
+
custom: {
|
|
19
|
+
label: 'Custom',
|
|
20
|
+
description: 'General-purpose team — flexible workers for any task',
|
|
21
|
+
leadPrompt: `You are a team lead coordinating a multi-agent task.
|
|
22
|
+
|
|
23
|
+
Process:
|
|
24
|
+
1. ANALYZE — Read the user's request carefully. If the task involves a codebase, explore the relevant files to understand context before planning.
|
|
25
|
+
2. PLAN — Break the request into concrete subtasks. Identify dependencies (which tasks need another's output).
|
|
26
|
+
3. DELEGATE — Spawn independent subtasks IN PARALLEL using the Agent tool. For dependent tasks, wait for the prerequisite to complete, then spawn the next agent with that context.
|
|
27
|
+
4. SUPERVISE — Monitor agent outputs. If any agent's result is incomplete or incorrect, provide corrective follow-up.
|
|
28
|
+
5. SUMMARIZE — After all agents complete, synthesize a final report.
|
|
29
|
+
${LEAD_RULES}`,
|
|
30
|
+
agents: {
|
|
31
|
+
'worker-1': {
|
|
32
|
+
description: 'General-purpose agent for any assigned subtask',
|
|
33
|
+
prompt: 'You are a versatile agent. Complete the assigned task thoroughly, following the lead\'s instructions precisely. When finished, report what you did and any issues encountered.',
|
|
34
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
35
|
+
},
|
|
36
|
+
'worker-2': {
|
|
37
|
+
description: 'General-purpose agent for any assigned subtask',
|
|
38
|
+
prompt: 'You are a versatile agent. Complete the assigned task thoroughly, following the lead\'s instructions precisely. When finished, report what you did and any issues encountered.',
|
|
39
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
40
|
+
},
|
|
41
|
+
'worker-3': {
|
|
42
|
+
description: 'General-purpose agent for any assigned subtask',
|
|
43
|
+
prompt: 'You are a versatile agent. Complete the assigned task thoroughly, following the lead\'s instructions precisely. When finished, report what you did and any issues encountered.',
|
|
44
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
'code-review': {
|
|
50
|
+
label: 'Code Review',
|
|
51
|
+
description: 'Security, quality, and performance code audit team',
|
|
52
|
+
leadPrompt: `You are a team lead coordinating a comprehensive code review.
|
|
53
|
+
|
|
54
|
+
Process:
|
|
55
|
+
1. SCOPE — Explore the codebase structure to identify the files, modules, and directories that need review. Narrow the scope based on the user's request.
|
|
56
|
+
2. ASSIGN — Spawn each specialist reviewer IN PARALLEL, giving each one:
|
|
57
|
+
- The exact files/directories to review
|
|
58
|
+
- What to focus on (their specialty)
|
|
59
|
+
- The expected output format (a list of findings with file:line references, severity, and suggested fixes)
|
|
60
|
+
3. SYNTHESIZE — After all reviewers complete, merge their findings into a single prioritized report:
|
|
61
|
+
- ## Critical (must fix before shipping)
|
|
62
|
+
- ## High (should fix soon)
|
|
63
|
+
- ## Medium (improve when convenient)
|
|
64
|
+
- ## Low (nice-to-have / stylistic)
|
|
65
|
+
Remove duplicates across reviewers. If reviewers disagree, note the disagreement and your recommendation.
|
|
66
|
+
${LEAD_RULES}`,
|
|
67
|
+
agents: {
|
|
68
|
+
'security-reviewer': {
|
|
69
|
+
description: 'Security specialist — vulnerabilities, auth flaws, data exposure',
|
|
70
|
+
prompt: `You are a security auditor. Review the assigned code for:
|
|
71
|
+
- Injection vulnerabilities (SQL, XSS, command injection, path traversal)
|
|
72
|
+
- Authentication and authorization flaws
|
|
73
|
+
- Cryptographic misuse (weak algorithms, hardcoded secrets, improper key management)
|
|
74
|
+
- Data exposure (sensitive data in logs, error messages, or responses)
|
|
75
|
+
- Dependency vulnerabilities and unsafe deserialization
|
|
76
|
+
|
|
77
|
+
For each finding, report: file:line, severity (Critical/High/Medium/Low), description, and a concrete fix suggestion.`,
|
|
78
|
+
tools: ['Read', 'Grep', 'Glob'],
|
|
79
|
+
},
|
|
80
|
+
'quality-reviewer': {
|
|
81
|
+
description: 'Code quality specialist — patterns, maintainability, best practices',
|
|
82
|
+
prompt: `You are a code quality reviewer. Review the assigned code for:
|
|
83
|
+
- Code structure, naming conventions, and readability
|
|
84
|
+
- Error handling completeness and consistency
|
|
85
|
+
- DRY violations and unnecessary complexity
|
|
86
|
+
- Test coverage gaps
|
|
87
|
+
- API design issues and inconsistent interfaces
|
|
88
|
+
- Anti-patterns specific to the language/framework in use
|
|
89
|
+
|
|
90
|
+
For each finding, report: file:line, severity (High/Medium/Low), description, and a concrete improvement suggestion.`,
|
|
91
|
+
tools: ['Read', 'Grep', 'Glob'],
|
|
92
|
+
},
|
|
93
|
+
'performance-reviewer': {
|
|
94
|
+
description: 'Performance specialist — efficiency, memory, scalability',
|
|
95
|
+
prompt: `You are a performance reviewer. Review the assigned code for:
|
|
96
|
+
- Algorithm inefficiencies (unnecessary O(n²), redundant iterations)
|
|
97
|
+
- Memory leaks and excessive allocations
|
|
98
|
+
- Blocking operations in async contexts
|
|
99
|
+
- Missing caching opportunities
|
|
100
|
+
- Database query inefficiencies (N+1 queries, missing indexes)
|
|
101
|
+
- Bundle size and resource loading issues (for frontend code)
|
|
102
|
+
|
|
103
|
+
For each finding, report: file:line, severity (High/Medium/Low), description, estimated impact, and a concrete optimization suggestion.`,
|
|
104
|
+
tools: ['Read', 'Grep', 'Glob'],
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
'full-stack': {
|
|
110
|
+
label: 'Full-Stack',
|
|
111
|
+
description: 'Backend, frontend, and testing development team',
|
|
112
|
+
leadPrompt: `You are a team lead coordinating full-stack development.
|
|
113
|
+
|
|
114
|
+
Process:
|
|
115
|
+
1. ANALYZE — Explore the codebase to understand the existing architecture, patterns, frameworks, and conventions.
|
|
116
|
+
2. ARCHITECT — Before spawning any agent, define:
|
|
117
|
+
- API contracts (endpoints, request/response shapes)
|
|
118
|
+
- Shared data schemas and types
|
|
119
|
+
- File structure and naming conventions to follow
|
|
120
|
+
Write these specifications clearly — they will be passed to agents as context.
|
|
121
|
+
3. DELEGATE — Spawn agents respecting dependency order:
|
|
122
|
+
- If backend and frontend are independent (e.g., frontend can mock the API), spawn them IN PARALLEL.
|
|
123
|
+
- If frontend depends on backend output, spawn backend first, then pass its results to frontend.
|
|
124
|
+
- Spawn the test engineer last (or in parallel if they can write tests against the spec alone).
|
|
125
|
+
Give each agent the architectural decisions and contracts from step 2.
|
|
126
|
+
4. INTEGRATE — After all agents complete, verify their work is compatible. Check that API contracts match, imports resolve, and tests pass.
|
|
127
|
+
5. SUMMARIZE — Report what was built, any integration issues found, and next steps.
|
|
128
|
+
${LEAD_RULES}`,
|
|
129
|
+
agents: {
|
|
130
|
+
'backend-dev': {
|
|
131
|
+
description: 'Backend developer — API, database, server-side logic',
|
|
132
|
+
prompt: `You are a backend developer. Implement server-side features following the lead's architectural decisions. Responsibilities:
|
|
133
|
+
- API endpoints with proper validation and error handling
|
|
134
|
+
- Data models and database interactions
|
|
135
|
+
- Business logic and service layers
|
|
136
|
+
- Follow the project's existing patterns and conventions
|
|
137
|
+
|
|
138
|
+
Write clean, production-ready code. Report the files you created/modified and any decisions you made.`,
|
|
139
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
140
|
+
},
|
|
141
|
+
'frontend-dev': {
|
|
142
|
+
description: 'Frontend developer — UI, styling, client-side logic',
|
|
143
|
+
prompt: `You are a frontend developer. Build the user interface following the lead's design specifications. Responsibilities:
|
|
144
|
+
- UI components with proper state management
|
|
145
|
+
- Responsive layouts and accessible markup
|
|
146
|
+
- Client-side data fetching and API integration
|
|
147
|
+
- Follow the project's existing component patterns and styling conventions
|
|
148
|
+
|
|
149
|
+
Write clean, production-ready code. Report the files you created/modified and any decisions you made.`,
|
|
150
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
151
|
+
},
|
|
152
|
+
'test-engineer': {
|
|
153
|
+
description: 'Test engineer — unit tests, integration tests, QA',
|
|
154
|
+
prompt: `You are a test engineer. Write comprehensive tests for the implemented features. Responsibilities:
|
|
155
|
+
- Unit tests for individual functions and components
|
|
156
|
+
- Integration tests for API endpoints and data flows
|
|
157
|
+
- Edge case coverage (empty inputs, boundary values, error states)
|
|
158
|
+
- Use the project's existing test framework and patterns
|
|
159
|
+
|
|
160
|
+
Run the tests after writing them to verify they pass. Report the test results and any bugs found.`,
|
|
161
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob', 'Bash'],
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
debug: {
|
|
167
|
+
label: 'Debug',
|
|
168
|
+
description: 'Parallel hypothesis debugging team',
|
|
169
|
+
leadPrompt: `You are a team lead coordinating a debugging investigation.
|
|
170
|
+
|
|
171
|
+
Process:
|
|
172
|
+
1. UNDERSTAND — Analyze the bug report, error messages, and relevant code to build a clear picture of the problem. Identify the symptom, when it occurs, and what's expected vs. actual behavior.
|
|
173
|
+
2. HYPOTHESIZE — Formulate 3 distinct hypotheses about the root cause. Each hypothesis should target a different layer or mechanism (e.g., data flow, concurrency, configuration, external dependency).
|
|
174
|
+
3. INVESTIGATE — Spawn one investigator per hypothesis IN PARALLEL. Give each:
|
|
175
|
+
- The specific hypothesis to explore
|
|
176
|
+
- Exact files and code areas to examine
|
|
177
|
+
- Specific tests or commands to run for evidence
|
|
178
|
+
- Instruction to report findings as: Hypothesis, Evidence For/Against, Confidence Level (High/Medium/Low)
|
|
179
|
+
4. DIAGNOSE — Compare all investigators' findings. Identify the root cause (or the most likely one). If multiple hypotheses are plausible, note the evidence for each.
|
|
180
|
+
5. PRESCRIBE — Provide a concrete fix recommendation with the exact code changes needed.
|
|
181
|
+
${LEAD_RULES}`,
|
|
182
|
+
agents: {
|
|
183
|
+
'investigator-1': {
|
|
184
|
+
description: 'Debug investigator for hypothesis 1',
|
|
185
|
+
prompt: `You are a debugging investigator. The lead has assigned you a specific hypothesis about a bug's root cause. Your job:
|
|
186
|
+
1. Read the relevant code paths thoroughly
|
|
187
|
+
2. Look for evidence that supports or refutes the hypothesis
|
|
188
|
+
3. Run any diagnostic commands or tests the lead specified
|
|
189
|
+
4. Report your findings in this format:
|
|
190
|
+
- **Hypothesis**: (restate it)
|
|
191
|
+
- **Evidence For**: (what you found that supports it)
|
|
192
|
+
- **Evidence Against**: (what you found that contradicts it)
|
|
193
|
+
- **Confidence**: High / Medium / Low
|
|
194
|
+
- **Additional Observations**: (anything unexpected you discovered)`,
|
|
195
|
+
tools: ['Read', 'Grep', 'Glob', 'Bash'],
|
|
196
|
+
},
|
|
197
|
+
'investigator-2': {
|
|
198
|
+
description: 'Debug investigator for hypothesis 2',
|
|
199
|
+
prompt: `You are a debugging investigator. The lead has assigned you a specific hypothesis about a bug's root cause. Your job:
|
|
200
|
+
1. Read the relevant code paths thoroughly
|
|
201
|
+
2. Look for evidence that supports or refutes the hypothesis
|
|
202
|
+
3. Run any diagnostic commands or tests the lead specified
|
|
203
|
+
4. Report your findings in this format:
|
|
204
|
+
- **Hypothesis**: (restate it)
|
|
205
|
+
- **Evidence For**: (what you found that supports it)
|
|
206
|
+
- **Evidence Against**: (what you found that contradicts it)
|
|
207
|
+
- **Confidence**: High / Medium / Low
|
|
208
|
+
- **Additional Observations**: (anything unexpected you discovered)`,
|
|
209
|
+
tools: ['Read', 'Grep', 'Glob', 'Bash'],
|
|
210
|
+
},
|
|
211
|
+
'investigator-3': {
|
|
212
|
+
description: 'Debug investigator for hypothesis 3',
|
|
213
|
+
prompt: `You are a debugging investigator. The lead has assigned you a specific hypothesis about a bug's root cause. Your job:
|
|
214
|
+
1. Read the relevant code paths thoroughly
|
|
215
|
+
2. Look for evidence that supports or refutes the hypothesis
|
|
216
|
+
3. Run any diagnostic commands or tests the lead specified
|
|
217
|
+
4. Report your findings in this format:
|
|
218
|
+
- **Hypothesis**: (restate it)
|
|
219
|
+
- **Evidence For**: (what you found that supports it)
|
|
220
|
+
- **Evidence Against**: (what you found that contradicts it)
|
|
221
|
+
- **Confidence**: High / Medium / Low
|
|
222
|
+
- **Additional Observations**: (anything unexpected you discovered)`,
|
|
223
|
+
tools: ['Read', 'Grep', 'Glob', 'Bash'],
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
research: {
|
|
229
|
+
label: 'Research',
|
|
230
|
+
description: 'Deep research and analysis team — multi-angle investigation',
|
|
231
|
+
leadPrompt: `You are a team lead coordinating a deep research task.
|
|
232
|
+
|
|
233
|
+
Process:
|
|
234
|
+
1. SCOPE — Understand the research question. Identify the key dimensions or angles that need investigation (e.g., technical feasibility, existing solutions, trade-offs, best practices).
|
|
235
|
+
2. ASSIGN — Spawn researchers IN PARALLEL, each covering a different angle or subtopic. Give each:
|
|
236
|
+
- A clear research question or subtopic
|
|
237
|
+
- Where to look (codebase, documentation, file types, directories)
|
|
238
|
+
- The expected output format: a structured brief with findings, sources/references, and key takeaways
|
|
239
|
+
3. SYNTHESIZE — After all researchers complete, combine their findings into a comprehensive report:
|
|
240
|
+
- ## Executive Summary (2-3 key conclusions)
|
|
241
|
+
- ## Detailed Findings (organized by subtopic)
|
|
242
|
+
- ## Comparison / Trade-off Analysis (if applicable)
|
|
243
|
+
- ## Recommendations (actionable next steps, with rationale)
|
|
244
|
+
Resolve any contradictions between researchers' findings. Note confidence levels.
|
|
245
|
+
${LEAD_RULES}`,
|
|
246
|
+
agents: {
|
|
247
|
+
'researcher-1': {
|
|
248
|
+
description: 'Research analyst for subtopic or angle 1',
|
|
249
|
+
prompt: `You are a research analyst. The lead has assigned you a specific subtopic or angle to investigate. Your job:
|
|
250
|
+
1. Thoroughly explore the relevant code, files, and documentation
|
|
251
|
+
2. Analyze what you find — don't just describe, evaluate and draw conclusions
|
|
252
|
+
3. Report your findings in this format:
|
|
253
|
+
- **Topic**: (what you investigated)
|
|
254
|
+
- **Key Findings**: (numbered list of substantive findings)
|
|
255
|
+
- **Evidence**: (specific file references, code snippets, data points)
|
|
256
|
+
- **Assessment**: (your analysis and interpretation)
|
|
257
|
+
- **Open Questions**: (anything you couldn't determine)`,
|
|
258
|
+
tools: ['Read', 'Grep', 'Glob', 'Bash'],
|
|
259
|
+
},
|
|
260
|
+
'researcher-2': {
|
|
261
|
+
description: 'Research analyst for subtopic or angle 2',
|
|
262
|
+
prompt: `You are a research analyst. The lead has assigned you a specific subtopic or angle to investigate. Your job:
|
|
263
|
+
1. Thoroughly explore the relevant code, files, and documentation
|
|
264
|
+
2. Analyze what you find — don't just describe, evaluate and draw conclusions
|
|
265
|
+
3. Report your findings in this format:
|
|
266
|
+
- **Topic**: (what you investigated)
|
|
267
|
+
- **Key Findings**: (numbered list of substantive findings)
|
|
268
|
+
- **Evidence**: (specific file references, code snippets, data points)
|
|
269
|
+
- **Assessment**: (your analysis and interpretation)
|
|
270
|
+
- **Open Questions**: (anything you couldn't determine)`,
|
|
271
|
+
tools: ['Read', 'Grep', 'Glob', 'Bash'],
|
|
272
|
+
},
|
|
273
|
+
'researcher-3': {
|
|
274
|
+
description: 'Research analyst for subtopic or angle 3',
|
|
275
|
+
prompt: `You are a research analyst. The lead has assigned you a specific subtopic or angle to investigate. Your job:
|
|
276
|
+
1. Thoroughly explore the relevant code, files, and documentation
|
|
277
|
+
2. Analyze what you find — don't just describe, evaluate and draw conclusions
|
|
278
|
+
3. Report your findings in this format:
|
|
279
|
+
- **Topic**: (what you investigated)
|
|
280
|
+
- **Key Findings**: (numbered list of substantive findings)
|
|
281
|
+
- **Evidence**: (specific file references, code snippets, data points)
|
|
282
|
+
- **Assessment**: (your analysis and interpretation)
|
|
283
|
+
- **Open Questions**: (anything you couldn't determine)`,
|
|
284
|
+
tools: ['Read', 'Grep', 'Glob', 'Bash'],
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
content: {
|
|
290
|
+
label: 'Content',
|
|
291
|
+
description: 'Content creation pipeline — research, write, and review',
|
|
292
|
+
leadPrompt: `You are a team lead coordinating a content creation pipeline.
|
|
293
|
+
|
|
294
|
+
Process:
|
|
295
|
+
1. PLAN — Understand the content request: what type of content (documentation, article, report, spec), the target audience, and quality standards.
|
|
296
|
+
2. PIPELINE — Execute in dependency order:
|
|
297
|
+
a. Spawn the Researcher first to gather facts, references, and source material.
|
|
298
|
+
b. After research completes, spawn the Writer with the research output and clear instructions on structure, tone, and length.
|
|
299
|
+
c. After writing completes, spawn the Editor to review, fact-check, and polish.
|
|
300
|
+
3. FINALIZE — Review the editor's output. If there are significant issues, send corrective instructions to the writer or editor for another pass.
|
|
301
|
+
4. DELIVER — Present the final content with a brief summary of what was created and any notes about editorial decisions.
|
|
302
|
+
|
|
303
|
+
Note: This template uses a sequential pipeline (Research → Write → Edit) because each stage depends on the previous one's output. Do NOT spawn all agents in parallel.
|
|
304
|
+
${LEAD_RULES}`,
|
|
305
|
+
agents: {
|
|
306
|
+
'researcher': {
|
|
307
|
+
description: 'Content researcher — gathers source material and facts',
|
|
308
|
+
prompt: `You are a content researcher. Your job is to gather all the source material needed for a writing task. Responsibilities:
|
|
309
|
+
1. Search the codebase, documentation, and available resources for relevant information
|
|
310
|
+
2. Organize your findings into a structured research brief
|
|
311
|
+
3. Include specific references (file paths, code snippets, quotes) that the writer can use
|
|
312
|
+
4. Identify gaps — note anything you couldn't find that the writer should be aware of
|
|
313
|
+
|
|
314
|
+
Output a clear, organized research brief that a writer can work from directly.`,
|
|
315
|
+
tools: ['Read', 'Grep', 'Glob', 'Bash'],
|
|
316
|
+
},
|
|
317
|
+
'writer': {
|
|
318
|
+
description: 'Content writer — drafts structured, audience-appropriate content',
|
|
319
|
+
prompt: `You are a content writer. Using the research brief provided by the lead, draft the requested content. Responsibilities:
|
|
320
|
+
1. Follow the specified structure, tone, and format exactly
|
|
321
|
+
2. Use the research material — cite specific references, not vague claims
|
|
322
|
+
3. Write for the specified target audience
|
|
323
|
+
4. Create clear headings, logical flow, and concise prose
|
|
324
|
+
|
|
325
|
+
Output the complete draft. If writing to a file, report the file path.`,
|
|
326
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob'],
|
|
327
|
+
},
|
|
328
|
+
'editor': {
|
|
329
|
+
description: 'Content editor — reviews for accuracy, clarity, and polish',
|
|
330
|
+
prompt: `You are a content editor. Review and improve the draft provided by the lead. Responsibilities:
|
|
331
|
+
1. Fact-check: verify claims against the codebase/sources — flag any inaccuracies
|
|
332
|
+
2. Clarity: simplify convoluted sentences, remove jargon unless audience-appropriate
|
|
333
|
+
3. Structure: ensure logical flow, consistent heading hierarchy, no gaps in reasoning
|
|
334
|
+
4. Polish: fix grammar, spelling, formatting, and consistency
|
|
335
|
+
|
|
336
|
+
Apply your edits directly to the content. Report a summary of changes made and any issues you couldn't resolve.`,
|
|
337
|
+
tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob'],
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
/** Ordered list of template keys for the dropdown */
|
|
344
|
+
export const TEMPLATE_KEYS = ['custom', 'code-review', 'full-stack', 'debug', 'research', 'content'];
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Build the full lead prompt by appending agents list and user instruction.
|
|
348
|
+
*/
|
|
349
|
+
export function buildFullLeadPrompt(templateLeadPrompt, agents, instruction) {
|
|
350
|
+
const agentList = Object.entries(agents)
|
|
351
|
+
.map(([id, def]) => `- ${id}: ${def.description}`)
|
|
352
|
+
.join('\n');
|
|
353
|
+
|
|
354
|
+
return `${templateLeadPrompt}
|
|
355
|
+
|
|
356
|
+
Available agents (use the Agent tool to delegate to them):
|
|
357
|
+
${agentList}
|
|
358
|
+
|
|
359
|
+
User's request: "${instruction}"`;
|
|
360
|
+
}
|
package/web/style.css
CHANGED
|
@@ -2941,6 +2941,126 @@ body {
|
|
|
2941
2941
|
line-height: 1.4;
|
|
2942
2942
|
}
|
|
2943
2943
|
|
|
2944
|
+
/* ── Template selector ── */
|
|
2945
|
+
.team-tpl-section {
|
|
2946
|
+
margin-bottom: 14px;
|
|
2947
|
+
}
|
|
2948
|
+
.team-tpl-label {
|
|
2949
|
+
display: block;
|
|
2950
|
+
font-size: 0.8rem;
|
|
2951
|
+
font-weight: 600;
|
|
2952
|
+
color: var(--text-secondary);
|
|
2953
|
+
margin-bottom: 6px;
|
|
2954
|
+
text-transform: uppercase;
|
|
2955
|
+
letter-spacing: 0.03em;
|
|
2956
|
+
}
|
|
2957
|
+
.team-tpl-select {
|
|
2958
|
+
width: 100%;
|
|
2959
|
+
padding: 8px 10px;
|
|
2960
|
+
border: 1px solid var(--border);
|
|
2961
|
+
border-radius: 6px;
|
|
2962
|
+
background: var(--bg-secondary);
|
|
2963
|
+
color: var(--text-primary);
|
|
2964
|
+
font-size: 0.9rem;
|
|
2965
|
+
font-family: inherit;
|
|
2966
|
+
cursor: pointer;
|
|
2967
|
+
appearance: auto;
|
|
2968
|
+
}
|
|
2969
|
+
.team-tpl-select:focus {
|
|
2970
|
+
outline: none;
|
|
2971
|
+
border-color: var(--accent);
|
|
2972
|
+
}
|
|
2973
|
+
.team-tpl-desc {
|
|
2974
|
+
display: block;
|
|
2975
|
+
font-size: 0.78rem;
|
|
2976
|
+
color: var(--text-secondary);
|
|
2977
|
+
margin-top: 4px;
|
|
2978
|
+
}
|
|
2979
|
+
|
|
2980
|
+
/* ── Collapsible lead prompt ── */
|
|
2981
|
+
.team-lead-prompt-section {
|
|
2982
|
+
margin-bottom: 14px;
|
|
2983
|
+
border: 1px solid var(--border);
|
|
2984
|
+
border-radius: 8px;
|
|
2985
|
+
overflow: hidden;
|
|
2986
|
+
}
|
|
2987
|
+
.team-lead-prompt-header {
|
|
2988
|
+
display: flex;
|
|
2989
|
+
align-items: center;
|
|
2990
|
+
gap: 6px;
|
|
2991
|
+
padding: 8px 10px;
|
|
2992
|
+
cursor: pointer;
|
|
2993
|
+
user-select: none;
|
|
2994
|
+
background: var(--bg-secondary);
|
|
2995
|
+
}
|
|
2996
|
+
.team-lead-prompt-header:hover {
|
|
2997
|
+
background: var(--bg-hover);
|
|
2998
|
+
}
|
|
2999
|
+
.team-lead-prompt-arrow {
|
|
3000
|
+
transition: transform 0.15s;
|
|
3001
|
+
flex-shrink: 0;
|
|
3002
|
+
color: var(--text-secondary);
|
|
3003
|
+
}
|
|
3004
|
+
.team-lead-prompt-arrow.expanded {
|
|
3005
|
+
transform: rotate(90deg);
|
|
3006
|
+
}
|
|
3007
|
+
.team-lead-prompt-title {
|
|
3008
|
+
font-size: 0.8rem;
|
|
3009
|
+
font-weight: 600;
|
|
3010
|
+
color: var(--text-secondary);
|
|
3011
|
+
text-transform: uppercase;
|
|
3012
|
+
letter-spacing: 0.03em;
|
|
3013
|
+
flex-shrink: 0;
|
|
3014
|
+
}
|
|
3015
|
+
.team-lead-prompt-preview {
|
|
3016
|
+
font-size: 0.78rem;
|
|
3017
|
+
color: var(--text-tertiary, #666);
|
|
3018
|
+
overflow: hidden;
|
|
3019
|
+
text-overflow: ellipsis;
|
|
3020
|
+
white-space: nowrap;
|
|
3021
|
+
margin-left: 8px;
|
|
3022
|
+
}
|
|
3023
|
+
.team-lead-prompt-body {
|
|
3024
|
+
padding: 8px 10px;
|
|
3025
|
+
border-top: 1px solid var(--border);
|
|
3026
|
+
}
|
|
3027
|
+
.team-lead-prompt-textarea {
|
|
3028
|
+
width: 100%;
|
|
3029
|
+
padding: 10px;
|
|
3030
|
+
border: 1px solid var(--border);
|
|
3031
|
+
border-radius: 6px;
|
|
3032
|
+
background: var(--bg-primary);
|
|
3033
|
+
color: var(--text-primary);
|
|
3034
|
+
font-size: 0.82rem;
|
|
3035
|
+
font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
|
|
3036
|
+
resize: vertical;
|
|
3037
|
+
min-height: 160px;
|
|
3038
|
+
line-height: 1.5;
|
|
3039
|
+
}
|
|
3040
|
+
.team-lead-prompt-textarea:focus {
|
|
3041
|
+
outline: none;
|
|
3042
|
+
border-color: var(--accent);
|
|
3043
|
+
}
|
|
3044
|
+
.team-lead-prompt-actions {
|
|
3045
|
+
display: flex;
|
|
3046
|
+
justify-content: flex-end;
|
|
3047
|
+
margin-top: 6px;
|
|
3048
|
+
}
|
|
3049
|
+
.team-lead-prompt-reset {
|
|
3050
|
+
padding: 4px 12px;
|
|
3051
|
+
border: 1px solid var(--border);
|
|
3052
|
+
border-radius: 4px;
|
|
3053
|
+
background: transparent;
|
|
3054
|
+
color: var(--text-secondary);
|
|
3055
|
+
font-size: 0.78rem;
|
|
3056
|
+
cursor: pointer;
|
|
3057
|
+
transition: all 0.15s;
|
|
3058
|
+
}
|
|
3059
|
+
.team-lead-prompt-reset:hover {
|
|
3060
|
+
color: var(--text-primary);
|
|
3061
|
+
border-color: var(--text-secondary);
|
|
3062
|
+
}
|
|
3063
|
+
|
|
2944
3064
|
.team-create-textarea {
|
|
2945
3065
|
width: 100%;
|
|
2946
3066
|
padding: 12px;
|