squads-cli 0.6.2 → 0.7.0
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 +196 -1152
- package/dist/auth-YW3UPFSB.js +23 -0
- package/dist/autonomy-BWTVDEAT.js +102 -0
- package/dist/autonomy-BWTVDEAT.js.map +1 -0
- package/dist/chunk-3KCWNZWW.js +401 -0
- package/dist/chunk-3KCWNZWW.js.map +1 -0
- package/dist/chunk-67RO2HKR.js +174 -0
- package/dist/chunk-67RO2HKR.js.map +1 -0
- package/dist/chunk-7JVD7RD4.js +275 -0
- package/dist/chunk-7JVD7RD4.js.map +1 -0
- package/dist/chunk-BODLDQY7.js +452 -0
- package/dist/chunk-BODLDQY7.js.map +1 -0
- package/dist/chunk-FFFCFZ6A.js +121 -0
- package/dist/chunk-FFFCFZ6A.js.map +1 -0
- package/dist/chunk-FIWT2NMM.js +165 -0
- package/dist/chunk-FIWT2NMM.js.map +1 -0
- package/dist/chunk-L6GQCHDF.js +222 -0
- package/dist/chunk-L6GQCHDF.js.map +1 -0
- package/dist/{chunk-O7UV3FWI.js → chunk-LDM62TIX.js} +2 -2
- package/dist/chunk-LDM62TIX.js.map +1 -0
- package/dist/chunk-LOA3KWYJ.js +294 -0
- package/dist/chunk-LOA3KWYJ.js.map +1 -0
- package/dist/chunk-NA45DFXY.js +616 -0
- package/dist/chunk-NA45DFXY.js.map +1 -0
- package/dist/{chunk-4CMAEQQY.js → chunk-NQN6JPI7.js} +4 -3
- package/dist/chunk-NQN6JPI7.js.map +1 -0
- package/dist/chunk-OQJHPULO.js +103 -0
- package/dist/chunk-OQJHPULO.js.map +1 -0
- package/dist/chunk-QHNUMM4V.js +87 -0
- package/dist/chunk-QHNUMM4V.js.map +1 -0
- package/dist/chunk-RM6BWILN.js +74 -0
- package/dist/chunk-RM6BWILN.js.map +1 -0
- package/dist/chunk-WBR5J7EX.js +90 -0
- package/dist/chunk-WBR5J7EX.js.map +1 -0
- package/dist/chunk-Z2UKDBNL.js +162 -0
- package/dist/chunk-Z2UKDBNL.js.map +1 -0
- package/dist/cli.js +2136 -12600
- package/dist/cli.js.map +1 -1
- package/dist/context-M2A2DOFV.js +291 -0
- package/dist/context-M2A2DOFV.js.map +1 -0
- package/dist/context-feed-JMNW4GAM.js +391 -0
- package/dist/context-feed-JMNW4GAM.js.map +1 -0
- package/dist/cost-N37I4UTA.js +274 -0
- package/dist/cost-N37I4UTA.js.map +1 -0
- package/dist/create-554W5HNU.js +286 -0
- package/dist/create-554W5HNU.js.map +1 -0
- package/dist/daemon-XWPQPPPN.js +546 -0
- package/dist/daemon-XWPQPPPN.js.map +1 -0
- package/dist/dashboard-L7YKVQEB.js +945 -0
- package/dist/dashboard-L7YKVQEB.js.map +1 -0
- package/dist/dashboard-MFNRLCEE.js +794 -0
- package/dist/dashboard-MFNRLCEE.js.map +1 -0
- package/dist/doctor-RG75M5RO.js +346 -0
- package/dist/doctor-RG75M5RO.js.map +1 -0
- package/dist/env-config-KCLDBKYX.js +21 -0
- package/dist/exec-JQKBF7BL.js +197 -0
- package/dist/exec-JQKBF7BL.js.map +1 -0
- package/dist/feedback-KA2UYBZG.js +229 -0
- package/dist/feedback-KA2UYBZG.js.map +1 -0
- package/dist/github-UQTM5KMS.js +23 -0
- package/dist/goal-EOPC5ZCD.js +168 -0
- package/dist/goal-EOPC5ZCD.js.map +1 -0
- package/dist/health-3FZDOSR5.js +209 -0
- package/dist/health-3FZDOSR5.js.map +1 -0
- package/dist/history-TFVXJEDH.js +229 -0
- package/dist/history-TFVXJEDH.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init-UOWTNMIE.js +747 -0
- package/dist/init-UOWTNMIE.js.map +1 -0
- package/dist/kpi-2SQ2WCVT.js +413 -0
- package/dist/kpi-2SQ2WCVT.js.map +1 -0
- package/dist/learn-6ERTERAO.js +269 -0
- package/dist/learn-6ERTERAO.js.map +1 -0
- package/dist/list-KSOMUBMB.js +92 -0
- package/dist/list-KSOMUBMB.js.map +1 -0
- package/dist/login-ST6PAXYE.js +155 -0
- package/dist/login-ST6PAXYE.js.map +1 -0
- package/dist/memory-3CSNKXIL.js +562 -0
- package/dist/memory-3CSNKXIL.js.map +1 -0
- package/dist/progress-FKG4V2VH.js +202 -0
- package/dist/progress-FKG4V2VH.js.map +1 -0
- package/dist/providers-66PDCORB.js +65 -0
- package/dist/providers-66PDCORB.js.map +1 -0
- package/dist/results-2MJFLWEO.js +224 -0
- package/dist/results-2MJFLWEO.js.map +1 -0
- package/dist/run-72OQLH5A.js +2685 -0
- package/dist/run-72OQLH5A.js.map +1 -0
- package/dist/session-6H67XPAQ.js +64 -0
- package/dist/session-6H67XPAQ.js.map +1 -0
- package/dist/{chunk-NHGLXN2F.js → sessions-GVQIMN4W.js} +23 -459
- package/dist/sessions-GVQIMN4W.js.map +1 -0
- package/dist/{squad-parser-4BI3G4RS.js → squad-parser-CM3HOIWM.js} +2 -2
- package/dist/squad-parser-CM3HOIWM.js.map +1 -0
- package/dist/stats-ONZI557Q.js +335 -0
- package/dist/stats-ONZI557Q.js.map +1 -0
- package/dist/status-FYH42FTB.js +346 -0
- package/dist/status-FYH42FTB.js.map +1 -0
- package/dist/sync-HJZJNXHW.js +800 -0
- package/dist/sync-HJZJNXHW.js.map +1 -0
- package/dist/update-B4WMUOPO.js +83 -0
- package/dist/update-B4WMUOPO.js.map +1 -0
- package/dist/{update-ALJKFFM7.js → update-L7FGHN6W.js} +2 -2
- package/dist/update-L7FGHN6W.js.map +1 -0
- package/package.json +18 -10
- package/dist/chunk-4CMAEQQY.js.map +0 -1
- package/dist/chunk-NHGLXN2F.js.map +0 -1
- package/dist/chunk-O7UV3FWI.js.map +0 -1
- package/dist/sessions-6PB7ALCE.js +0 -16
- /package/dist/{sessions-6PB7ALCE.js.map → auth-YW3UPFSB.js.map} +0 -0
- /package/dist/{squad-parser-4BI3G4RS.js.map → env-config-KCLDBKYX.js.map} +0 -0
- /package/dist/{update-ALJKFFM7.js.map → github-UQTM5KMS.js.map} +0 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
formatDuration,
|
|
4
|
+
formatRelativeTime,
|
|
5
|
+
getExecutionStats,
|
|
6
|
+
listExecutions
|
|
7
|
+
} from "./chunk-67RO2HKR.js";
|
|
8
|
+
import {
|
|
9
|
+
Events,
|
|
10
|
+
track
|
|
11
|
+
} from "./chunk-L6GQCHDF.js";
|
|
12
|
+
import "./chunk-ZTQ7ISUR.js";
|
|
13
|
+
import {
|
|
14
|
+
RESET,
|
|
15
|
+
bold,
|
|
16
|
+
box,
|
|
17
|
+
colors,
|
|
18
|
+
gradient,
|
|
19
|
+
icons,
|
|
20
|
+
padEnd,
|
|
21
|
+
writeLine
|
|
22
|
+
} from "./chunk-N7KDWU4W.js";
|
|
23
|
+
import "./chunk-7OCVIDC7.js";
|
|
24
|
+
|
|
25
|
+
// src/commands/exec.ts
|
|
26
|
+
async function execListCommand(options = {}) {
|
|
27
|
+
await track(Events.CLI_EXEC, { action: "list", squad: options.squad });
|
|
28
|
+
const listOptions = {
|
|
29
|
+
squad: options.squad,
|
|
30
|
+
agent: options.agent,
|
|
31
|
+
limit: options.limit || 20
|
|
32
|
+
};
|
|
33
|
+
if (options.status) {
|
|
34
|
+
listOptions.status = options.status;
|
|
35
|
+
}
|
|
36
|
+
const executions = listExecutions(listOptions);
|
|
37
|
+
if (options.json) {
|
|
38
|
+
console.log(JSON.stringify(executions, null, 2));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
writeLine();
|
|
42
|
+
writeLine(` ${gradient("squads")} ${colors.dim}exec list${RESET}${options.squad ? ` ${colors.cyan}${options.squad}${RESET}` : ""}`);
|
|
43
|
+
writeLine();
|
|
44
|
+
if (executions.length === 0) {
|
|
45
|
+
writeLine(` ${colors.dim}No executions found${RESET}`);
|
|
46
|
+
writeLine();
|
|
47
|
+
writeLine(` ${colors.dim}Executions are logged when running agents:${RESET}`);
|
|
48
|
+
writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} --execute`);
|
|
49
|
+
writeLine();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const w = { agent: 22, status: 12, duration: 10, time: 14, id: 18 };
|
|
53
|
+
const tableWidth = w.agent + w.status + w.duration + w.time + w.id + 8;
|
|
54
|
+
writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
|
|
55
|
+
const header = ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd("AGENT", w.agent)}${RESET}${bold}${padEnd("STATUS", w.status)}${RESET}${bold}${padEnd("DURATION", w.duration)}${RESET}${bold}${padEnd("TIME", w.time)}${RESET}${bold}ID${RESET} ${colors.purple}${box.vertical}${RESET}`;
|
|
56
|
+
writeLine(header);
|
|
57
|
+
writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
|
|
58
|
+
for (const exec of executions) {
|
|
59
|
+
const agentName = `${exec.squad}/${exec.agent}`;
|
|
60
|
+
const truncatedAgent = agentName.length > w.agent - 1 ? agentName.slice(0, w.agent - 4) + "..." : agentName;
|
|
61
|
+
const statusIcon = exec.status === "running" ? icons.running : exec.status === "completed" ? icons.success : icons.error;
|
|
62
|
+
const statusColor = exec.status === "running" ? colors.yellow : exec.status === "completed" ? colors.green : colors.red;
|
|
63
|
+
const statusStr = `${statusColor}${statusIcon} ${exec.status}${RESET}`;
|
|
64
|
+
const durationStr = formatDuration(exec.durationMs);
|
|
65
|
+
const timeStr = formatRelativeTime(exec.startTime);
|
|
66
|
+
const shortId = exec.id.slice(0, 16);
|
|
67
|
+
const row = ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(truncatedAgent, w.agent)}${RESET}${padEnd(statusStr, w.status + 10)}${padEnd(durationStr, w.duration)}${colors.dim}${padEnd(timeStr, w.time)}${RESET}${colors.dim}${shortId}${RESET} ${colors.purple}${box.vertical}${RESET}`;
|
|
68
|
+
writeLine(row);
|
|
69
|
+
}
|
|
70
|
+
writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
|
|
71
|
+
writeLine();
|
|
72
|
+
const stats = getExecutionStats(listOptions);
|
|
73
|
+
const parts = [];
|
|
74
|
+
if (stats.running > 0) parts.push(`${colors.yellow}${stats.running} running${RESET}`);
|
|
75
|
+
if (stats.completed > 0) parts.push(`${colors.green}${stats.completed} completed${RESET}`);
|
|
76
|
+
if (stats.failed > 0) parts.push(`${colors.red}${stats.failed} failed${RESET}`);
|
|
77
|
+
if (parts.length > 0) {
|
|
78
|
+
writeLine(` ${parts.join(` ${colors.dim}|${RESET} `)}`);
|
|
79
|
+
if (stats.avgDurationMs) {
|
|
80
|
+
writeLine(` ${colors.dim}Avg duration: ${formatDuration(stats.avgDurationMs)}${RESET}`);
|
|
81
|
+
}
|
|
82
|
+
writeLine();
|
|
83
|
+
}
|
|
84
|
+
writeLine(` ${colors.dim}$${RESET} squads exec show ${colors.cyan}<id>${RESET} ${colors.dim}Execution details${RESET}`);
|
|
85
|
+
writeLine(` ${colors.dim}$${RESET} squads exec --json ${colors.dim}JSON output${RESET}`);
|
|
86
|
+
writeLine();
|
|
87
|
+
}
|
|
88
|
+
async function execShowCommand(executionId, options = {}) {
|
|
89
|
+
await track(Events.CLI_EXEC, { action: "show", id: executionId });
|
|
90
|
+
const executions = listExecutions();
|
|
91
|
+
const matches = executions.filter(
|
|
92
|
+
(e) => e.id === executionId || e.id.startsWith(executionId)
|
|
93
|
+
);
|
|
94
|
+
if (matches.length === 0) {
|
|
95
|
+
writeLine();
|
|
96
|
+
writeLine(` ${colors.red}Execution not found: ${executionId}${RESET}`);
|
|
97
|
+
writeLine();
|
|
98
|
+
writeLine(` ${colors.dim}List recent executions:${RESET}`);
|
|
99
|
+
writeLine(` ${colors.dim}$${RESET} squads exec list`);
|
|
100
|
+
writeLine();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (matches.length > 1) {
|
|
104
|
+
writeLine();
|
|
105
|
+
writeLine(` ${colors.yellow}Multiple matches for "${executionId}":${RESET}`);
|
|
106
|
+
for (const m of matches.slice(0, 5)) {
|
|
107
|
+
writeLine(` ${colors.dim}${m.id}${RESET} - ${m.squad}/${m.agent}`);
|
|
108
|
+
}
|
|
109
|
+
writeLine();
|
|
110
|
+
writeLine(` ${colors.dim}Provide a more specific ID${RESET}`);
|
|
111
|
+
writeLine();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const exec = matches[0];
|
|
115
|
+
if (options.json) {
|
|
116
|
+
console.log(JSON.stringify(exec, null, 2));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
writeLine();
|
|
120
|
+
writeLine(` ${gradient("squads")} ${colors.dim}exec show${RESET}`);
|
|
121
|
+
writeLine();
|
|
122
|
+
writeLine(` ${bold}${exec.squad}/${exec.agent}${RESET}`);
|
|
123
|
+
writeLine(` ${colors.dim}${exec.id}${RESET}`);
|
|
124
|
+
writeLine();
|
|
125
|
+
const statusIcon = exec.status === "running" ? icons.running : exec.status === "completed" ? icons.success : icons.error;
|
|
126
|
+
const statusColor = exec.status === "running" ? colors.yellow : exec.status === "completed" ? colors.green : colors.red;
|
|
127
|
+
writeLine(` ${bold}Status${RESET} ${statusColor}${statusIcon} ${exec.status}${RESET}`);
|
|
128
|
+
writeLine(` ${bold}Task Type${RESET} ${exec.taskType}`);
|
|
129
|
+
writeLine(` ${bold}Trigger${RESET} ${exec.trigger}`);
|
|
130
|
+
writeLine();
|
|
131
|
+
writeLine(` ${bold}Started${RESET} ${exec.startTime}`);
|
|
132
|
+
if (exec.endTime) {
|
|
133
|
+
writeLine(` ${bold}Completed${RESET} ${exec.endTime}`);
|
|
134
|
+
}
|
|
135
|
+
if (exec.durationMs) {
|
|
136
|
+
writeLine(` ${bold}Duration${RESET} ${formatDuration(exec.durationMs)}`);
|
|
137
|
+
}
|
|
138
|
+
writeLine();
|
|
139
|
+
if (exec.outcome) {
|
|
140
|
+
writeLine(` ${bold}Outcome${RESET}`);
|
|
141
|
+
writeLine(` ${colors.dim}${exec.outcome}${RESET}`);
|
|
142
|
+
writeLine();
|
|
143
|
+
}
|
|
144
|
+
if (exec.error) {
|
|
145
|
+
writeLine(` ${bold}Error${RESET}`);
|
|
146
|
+
writeLine(` ${colors.red}${exec.error}${RESET}`);
|
|
147
|
+
writeLine();
|
|
148
|
+
}
|
|
149
|
+
writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}${exec.squad}${RESET} ${colors.dim}Squad memory${RESET}`);
|
|
150
|
+
writeLine(` ${colors.dim}$${RESET} squads exec list --squad ${colors.cyan}${exec.squad}${RESET} ${colors.dim}Squad history${RESET}`);
|
|
151
|
+
writeLine();
|
|
152
|
+
}
|
|
153
|
+
async function execStatsCommand(options = {}) {
|
|
154
|
+
await track(Events.CLI_EXEC, { action: "stats", squad: options.squad });
|
|
155
|
+
const listOptions = {
|
|
156
|
+
squad: options.squad
|
|
157
|
+
};
|
|
158
|
+
const stats = getExecutionStats(listOptions);
|
|
159
|
+
if (options.json) {
|
|
160
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
writeLine();
|
|
164
|
+
writeLine(` ${gradient("squads")} ${colors.dim}exec stats${RESET}${options.squad ? ` ${colors.cyan}${options.squad}${RESET}` : ""}`);
|
|
165
|
+
writeLine();
|
|
166
|
+
writeLine(` ${bold}Total${RESET} ${stats.total}`);
|
|
167
|
+
writeLine(` ${colors.yellow}Running${RESET} ${stats.running}`);
|
|
168
|
+
writeLine(` ${colors.green}Completed${RESET} ${stats.completed}`);
|
|
169
|
+
writeLine(` ${colors.red}Failed${RESET} ${stats.failed}`);
|
|
170
|
+
writeLine();
|
|
171
|
+
if (stats.avgDurationMs) {
|
|
172
|
+
writeLine(` ${bold}Avg Duration${RESET} ${formatDuration(stats.avgDurationMs)}`);
|
|
173
|
+
writeLine();
|
|
174
|
+
}
|
|
175
|
+
const squadEntries = Object.entries(stats.bySquad).sort((a, b) => b[1] - a[1]).slice(0, 5);
|
|
176
|
+
if (squadEntries.length > 0) {
|
|
177
|
+
writeLine(` ${bold}By Squad${RESET}`);
|
|
178
|
+
for (const [squad, count] of squadEntries) {
|
|
179
|
+
writeLine(` ${colors.cyan}${squad}${RESET}: ${count}`);
|
|
180
|
+
}
|
|
181
|
+
writeLine();
|
|
182
|
+
}
|
|
183
|
+
const agentEntries = Object.entries(stats.byAgent).sort((a, b) => b[1] - a[1]).slice(0, 5);
|
|
184
|
+
if (agentEntries.length > 0) {
|
|
185
|
+
writeLine(` ${bold}Top Agents${RESET}`);
|
|
186
|
+
for (const [agent, count] of agentEntries) {
|
|
187
|
+
writeLine(` ${colors.cyan}${agent}${RESET}: ${count}`);
|
|
188
|
+
}
|
|
189
|
+
writeLine();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export {
|
|
193
|
+
execListCommand,
|
|
194
|
+
execShowCommand,
|
|
195
|
+
execStatsCommand
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=exec-JQKBF7BL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/exec.ts"],"sourcesContent":["/**\n * squads exec - Execution history commands\n *\n * Enables agents to introspect past executions for self-improvement.\n * Part of RFC #110 Phase 2.\n */\n\nimport { track, Events } from '../lib/telemetry.js';\nimport {\n listExecutions,\n getExecutionStats,\n formatDuration,\n formatRelativeTime,\n Execution,\n ExecutionListOptions,\n} from '../lib/executions.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n writeLine,\n icons,\n} from '../lib/terminal.js';\n\ninterface ListOptions {\n squad?: string;\n agent?: string;\n status?: string;\n limit?: number;\n json?: boolean;\n}\n\ninterface ShowOptions {\n json?: boolean;\n}\n\n/**\n * squads exec list - List recent executions\n */\nexport async function execListCommand(options: ListOptions = {}): Promise<void> {\n await track(Events.CLI_EXEC, { action: 'list', squad: options.squad });\n\n const listOptions: ExecutionListOptions = {\n squad: options.squad,\n agent: options.agent,\n limit: options.limit || 20,\n };\n\n if (options.status) {\n listOptions.status = options.status as Execution['status'];\n }\n\n const executions = listExecutions(listOptions);\n\n if (options.json) {\n console.log(JSON.stringify(executions, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}exec list${RESET}${options.squad ? ` ${colors.cyan}${options.squad}${RESET}` : ''}`);\n writeLine();\n\n if (executions.length === 0) {\n writeLine(` ${colors.dim}No executions found${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Executions are logged when running agents:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads run ${colors.cyan}<squad>${RESET} --execute`);\n writeLine();\n return;\n }\n\n // Table header\n const w = { agent: 22, status: 12, duration: 10, time: 14, id: 18 };\n const tableWidth = w.agent + w.status + w.duration + w.time + w.id + 8;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('AGENT', w.agent)}${RESET}` +\n `${bold}${padEnd('STATUS', w.status)}${RESET}` +\n `${bold}${padEnd('DURATION', w.duration)}${RESET}` +\n `${bold}${padEnd('TIME', w.time)}${RESET}` +\n `${bold}ID${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const exec of executions) {\n const agentName = `${exec.squad}/${exec.agent}`;\n const truncatedAgent = agentName.length > w.agent - 1\n ? agentName.slice(0, w.agent - 4) + '...'\n : agentName;\n\n const statusIcon = exec.status === 'running' ? icons.running :\n exec.status === 'completed' ? icons.success : icons.error;\n const statusColor = exec.status === 'running' ? colors.yellow :\n exec.status === 'completed' ? colors.green : colors.red;\n\n const statusStr = `${statusColor}${statusIcon} ${exec.status}${RESET}`;\n const durationStr = formatDuration(exec.durationMs);\n const timeStr = formatRelativeTime(exec.startTime);\n const shortId = exec.id.slice(0, 16);\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(truncatedAgent, w.agent)}${RESET}` +\n `${padEnd(statusStr, w.status + 10)}` + // +10 for ANSI codes\n `${padEnd(durationStr, w.duration)}` +\n `${colors.dim}${padEnd(timeStr, w.time)}${RESET}` +\n `${colors.dim}${shortId}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show stats summary\n const stats = getExecutionStats(listOptions);\n const parts: string[] = [];\n if (stats.running > 0) parts.push(`${colors.yellow}${stats.running} running${RESET}`);\n if (stats.completed > 0) parts.push(`${colors.green}${stats.completed} completed${RESET}`);\n if (stats.failed > 0) parts.push(`${colors.red}${stats.failed} failed${RESET}`);\n\n if (parts.length > 0) {\n writeLine(` ${parts.join(` ${colors.dim}|${RESET} `)}`);\n if (stats.avgDurationMs) {\n writeLine(` ${colors.dim}Avg duration: ${formatDuration(stats.avgDurationMs)}${RESET}`);\n }\n writeLine();\n }\n\n // Show commands\n writeLine(` ${colors.dim}$${RESET} squads exec show ${colors.cyan}<id>${RESET} ${colors.dim}Execution details${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads exec --json ${colors.dim}JSON output${RESET}`);\n writeLine();\n}\n\n/**\n * squads exec show <id> - Show execution details\n */\nexport async function execShowCommand(executionId: string, options: ShowOptions = {}): Promise<void> {\n await track(Events.CLI_EXEC, { action: 'show', id: executionId });\n\n // Support partial ID matching\n const executions = listExecutions();\n const matches = executions.filter(e =>\n e.id === executionId || e.id.startsWith(executionId)\n );\n\n if (matches.length === 0) {\n writeLine();\n writeLine(` ${colors.red}Execution not found: ${executionId}${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}List recent executions:${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads exec list`);\n writeLine();\n return;\n }\n\n if (matches.length > 1) {\n writeLine();\n writeLine(` ${colors.yellow}Multiple matches for \"${executionId}\":${RESET}`);\n for (const m of matches.slice(0, 5)) {\n writeLine(` ${colors.dim}${m.id}${RESET} - ${m.squad}/${m.agent}`);\n }\n writeLine();\n writeLine(` ${colors.dim}Provide a more specific ID${RESET}`);\n writeLine();\n return;\n }\n\n const exec = matches[0];\n\n if (options.json) {\n console.log(JSON.stringify(exec, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}exec show${RESET}`);\n writeLine();\n\n // Header\n writeLine(` ${bold}${exec.squad}/${exec.agent}${RESET}`);\n writeLine(` ${colors.dim}${exec.id}${RESET}`);\n writeLine();\n\n // Status with icon\n const statusIcon = exec.status === 'running' ? icons.running :\n exec.status === 'completed' ? icons.success : icons.error;\n const statusColor = exec.status === 'running' ? colors.yellow :\n exec.status === 'completed' ? colors.green : colors.red;\n\n writeLine(` ${bold}Status${RESET} ${statusColor}${statusIcon} ${exec.status}${RESET}`);\n writeLine(` ${bold}Task Type${RESET} ${exec.taskType}`);\n writeLine(` ${bold}Trigger${RESET} ${exec.trigger}`);\n writeLine();\n\n // Timing\n writeLine(` ${bold}Started${RESET} ${exec.startTime}`);\n if (exec.endTime) {\n writeLine(` ${bold}Completed${RESET} ${exec.endTime}`);\n }\n if (exec.durationMs) {\n writeLine(` ${bold}Duration${RESET} ${formatDuration(exec.durationMs)}`);\n }\n writeLine();\n\n // Outcome/Error\n if (exec.outcome) {\n writeLine(` ${bold}Outcome${RESET}`);\n writeLine(` ${colors.dim}${exec.outcome}${RESET}`);\n writeLine();\n }\n\n if (exec.error) {\n writeLine(` ${bold}Error${RESET}`);\n writeLine(` ${colors.red}${exec.error}${RESET}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}${exec.squad}${RESET} ${colors.dim}Squad memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads exec list --squad ${colors.cyan}${exec.squad}${RESET} ${colors.dim}Squad history${RESET}`);\n writeLine();\n}\n\n/**\n * squads exec stats - Show execution statistics\n */\nexport async function execStatsCommand(options: ListOptions = {}): Promise<void> {\n await track(Events.CLI_EXEC, { action: 'stats', squad: options.squad });\n\n const listOptions: ExecutionListOptions = {\n squad: options.squad,\n };\n\n const stats = getExecutionStats(listOptions);\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}exec stats${RESET}${options.squad ? ` ${colors.cyan}${options.squad}${RESET}` : ''}`);\n writeLine();\n\n writeLine(` ${bold}Total${RESET} ${stats.total}`);\n writeLine(` ${colors.yellow}Running${RESET} ${stats.running}`);\n writeLine(` ${colors.green}Completed${RESET} ${stats.completed}`);\n writeLine(` ${colors.red}Failed${RESET} ${stats.failed}`);\n writeLine();\n\n if (stats.avgDurationMs) {\n writeLine(` ${bold}Avg Duration${RESET} ${formatDuration(stats.avgDurationMs)}`);\n writeLine();\n }\n\n // Top squads by execution count\n const squadEntries = Object.entries(stats.bySquad).sort((a, b) => b[1] - a[1]).slice(0, 5);\n if (squadEntries.length > 0) {\n writeLine(` ${bold}By Squad${RESET}`);\n for (const [squad, count] of squadEntries) {\n writeLine(` ${colors.cyan}${squad}${RESET}: ${count}`);\n }\n writeLine();\n }\n\n // Top agents by execution count\n const agentEntries = Object.entries(stats.byAgent).sort((a, b) => b[1] - a[1]).slice(0, 5);\n if (agentEntries.length > 0) {\n writeLine(` ${bold}Top Agents${RESET}`);\n for (const [agent, count] of agentEntries) {\n writeLine(` ${colors.cyan}${agent}${RESET}: ${count}`);\n }\n writeLine();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
Events,
|
|
4
|
+
track
|
|
5
|
+
} from "./chunk-L6GQCHDF.js";
|
|
6
|
+
import {
|
|
7
|
+
loadSquad
|
|
8
|
+
} from "./chunk-LDM62TIX.js";
|
|
9
|
+
import {
|
|
10
|
+
appendToMemory,
|
|
11
|
+
findMemoryDir
|
|
12
|
+
} from "./chunk-ZTQ7ISUR.js";
|
|
13
|
+
import {
|
|
14
|
+
RESET,
|
|
15
|
+
bold,
|
|
16
|
+
box,
|
|
17
|
+
colors,
|
|
18
|
+
gradient,
|
|
19
|
+
icons,
|
|
20
|
+
padEnd,
|
|
21
|
+
writeLine
|
|
22
|
+
} from "./chunk-N7KDWU4W.js";
|
|
23
|
+
import "./chunk-7OCVIDC7.js";
|
|
24
|
+
|
|
25
|
+
// src/commands/feedback.ts
|
|
26
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "fs";
|
|
27
|
+
import { join, dirname } from "path";
|
|
28
|
+
function getFeedbackPath(squadName) {
|
|
29
|
+
const memoryDir = findMemoryDir();
|
|
30
|
+
if (!memoryDir) return null;
|
|
31
|
+
const squad = loadSquad(squadName);
|
|
32
|
+
const agentName = squad?.agents[0]?.name || `${squadName}-lead`;
|
|
33
|
+
return join(memoryDir, squadName, agentName, "feedback.md");
|
|
34
|
+
}
|
|
35
|
+
function getOutputPath(squadName) {
|
|
36
|
+
const memoryDir = findMemoryDir();
|
|
37
|
+
if (!memoryDir) return null;
|
|
38
|
+
const squad = loadSquad(squadName);
|
|
39
|
+
const agentName = squad?.agents[0]?.name || `${squadName}-lead`;
|
|
40
|
+
return join(memoryDir, squadName, agentName, "output.md");
|
|
41
|
+
}
|
|
42
|
+
function getLastExecution(squadName) {
|
|
43
|
+
const outputPath = getOutputPath(squadName);
|
|
44
|
+
if (!outputPath || !existsSync(outputPath)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const content = readFileSync(outputPath, "utf-8");
|
|
48
|
+
const lines = content.split("\n");
|
|
49
|
+
let date = "unknown";
|
|
50
|
+
let summary = lines.slice(0, 5).join("\n");
|
|
51
|
+
const dateMatch = content.match(/(\d{4}-\d{2}-\d{2})/);
|
|
52
|
+
if (dateMatch) {
|
|
53
|
+
date = dateMatch[1];
|
|
54
|
+
}
|
|
55
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
56
|
+
if (titleMatch) {
|
|
57
|
+
summary = titleMatch[1];
|
|
58
|
+
}
|
|
59
|
+
return { date, summary };
|
|
60
|
+
}
|
|
61
|
+
function parseFeedbackHistory(content) {
|
|
62
|
+
const entries = [];
|
|
63
|
+
const sections = content.split(/---\n/).filter((s) => s.trim());
|
|
64
|
+
for (const section of sections) {
|
|
65
|
+
const dateMatch = section.match(/_Date:\s*(.+)_/);
|
|
66
|
+
const ratingMatch = section.match(/\*\*Rating\*\*:\s*(\d)\/5/);
|
|
67
|
+
const feedbackMatch = section.match(/\*\*Feedback\*\*:\s*(.+)/);
|
|
68
|
+
const executionMatch = section.match(/\*\*Execution\*\*:\s*(.+)/);
|
|
69
|
+
if (dateMatch && ratingMatch) {
|
|
70
|
+
const entry = {
|
|
71
|
+
date: dateMatch[1],
|
|
72
|
+
execution: executionMatch?.[1] || "unknown",
|
|
73
|
+
rating: parseInt(ratingMatch[1]),
|
|
74
|
+
feedback: feedbackMatch?.[1] || "",
|
|
75
|
+
learnings: []
|
|
76
|
+
};
|
|
77
|
+
const learningsMatch = section.match(/\*\*Learnings\*\*:\n((?:- .+\n?)+)/);
|
|
78
|
+
if (learningsMatch) {
|
|
79
|
+
entry.learnings = learningsMatch[1].split("\n").filter((l) => l.startsWith("- ")).map((l) => l.replace(/^- /, ""));
|
|
80
|
+
}
|
|
81
|
+
entries.push(entry);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return entries;
|
|
85
|
+
}
|
|
86
|
+
async function feedbackAddCommand(squadName, rating, feedback, options) {
|
|
87
|
+
await track(Events.CLI_FEEDBACK_ADD, { squad: squadName, rating: parseInt(rating) });
|
|
88
|
+
const feedbackPath = getFeedbackPath(squadName);
|
|
89
|
+
if (!feedbackPath) {
|
|
90
|
+
writeLine(` ${colors.red}Could not find memory directory${RESET}`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const ratingNum = parseInt(rating);
|
|
94
|
+
if (isNaN(ratingNum) || ratingNum < 1 || ratingNum > 5) {
|
|
95
|
+
writeLine(` ${colors.red}Rating must be 1-5${RESET}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const lastExec = getLastExecution(squadName);
|
|
99
|
+
const dir = dirname(feedbackPath);
|
|
100
|
+
if (!existsSync(dir)) {
|
|
101
|
+
mkdirSync(dir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
const date = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
104
|
+
let entry = `
|
|
105
|
+
---
|
|
106
|
+
_Date: ${date}_
|
|
107
|
+
|
|
108
|
+
`;
|
|
109
|
+
entry += `**Execution**: ${lastExec?.summary || "Manual feedback"}
|
|
110
|
+
`;
|
|
111
|
+
entry += `**Rating**: ${ratingNum}/5 ${"\u2605".repeat(ratingNum)}${"\u2606".repeat(5 - ratingNum)}
|
|
112
|
+
`;
|
|
113
|
+
entry += `**Feedback**: ${feedback}
|
|
114
|
+
`;
|
|
115
|
+
if (options.learning && options.learning.length > 0) {
|
|
116
|
+
entry += `**Learnings**:
|
|
117
|
+
`;
|
|
118
|
+
for (const learning of options.learning) {
|
|
119
|
+
entry += `- ${learning}
|
|
120
|
+
`;
|
|
121
|
+
}
|
|
122
|
+
const squad = loadSquad(squadName);
|
|
123
|
+
const agentName = squad?.agents[0]?.name || `${squadName}-lead`;
|
|
124
|
+
for (const learning of options.learning) {
|
|
125
|
+
await appendToMemory(squadName, agentName, "learnings", `From feedback (${date}): ${learning}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let existing = "";
|
|
129
|
+
if (existsSync(feedbackPath)) {
|
|
130
|
+
existing = readFileSync(feedbackPath, "utf-8");
|
|
131
|
+
} else {
|
|
132
|
+
existing = `# ${squadName} - Feedback Log
|
|
133
|
+
|
|
134
|
+
> Execution feedback and learnings
|
|
135
|
+
`;
|
|
136
|
+
}
|
|
137
|
+
writeFileSync(feedbackPath, existing + entry);
|
|
138
|
+
const stars = `${colors.yellow}${"\u2605".repeat(ratingNum)}${"\u2606".repeat(5 - ratingNum)}${RESET}`;
|
|
139
|
+
writeLine();
|
|
140
|
+
writeLine(` ${icons.success} Feedback recorded for ${colors.cyan}${squadName}${RESET}`);
|
|
141
|
+
writeLine(` Rating: ${stars}`);
|
|
142
|
+
writeLine(` ${feedback}`);
|
|
143
|
+
if (options.learning && options.learning.length > 0) {
|
|
144
|
+
writeLine(` ${colors.dim}+ ${options.learning.length} learning(s) added${RESET}`);
|
|
145
|
+
}
|
|
146
|
+
writeLine();
|
|
147
|
+
}
|
|
148
|
+
async function feedbackShowCommand(squadName, options) {
|
|
149
|
+
await track(Events.CLI_FEEDBACK_SHOW, { squad: squadName });
|
|
150
|
+
const feedbackPath = getFeedbackPath(squadName);
|
|
151
|
+
if (!feedbackPath || !existsSync(feedbackPath)) {
|
|
152
|
+
writeLine(` ${colors.yellow}No feedback recorded for ${squadName}${RESET}`);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const content = readFileSync(feedbackPath, "utf-8");
|
|
156
|
+
const entries = parseFeedbackHistory(content);
|
|
157
|
+
const limit = options.limit ? parseInt(options.limit) : 5;
|
|
158
|
+
const recent = entries.slice(-limit).reverse();
|
|
159
|
+
writeLine();
|
|
160
|
+
writeLine(` ${gradient("squads")} ${colors.dim}feedback${RESET} ${colors.cyan}${squadName}${RESET}`);
|
|
161
|
+
writeLine();
|
|
162
|
+
if (recent.length === 0) {
|
|
163
|
+
writeLine(` ${colors.dim}No feedback entries yet${RESET}`);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;
|
|
167
|
+
writeLine(` ${colors.dim}Average: ${avgRating.toFixed(1)}/5 (${entries.length} entries)${RESET}`);
|
|
168
|
+
writeLine();
|
|
169
|
+
for (const entry of recent) {
|
|
170
|
+
const stars = `${colors.yellow}${"\u2605".repeat(entry.rating)}${"\u2606".repeat(5 - entry.rating)}${RESET}`;
|
|
171
|
+
writeLine(` ${colors.dim}${entry.date}${RESET} ${stars}`);
|
|
172
|
+
writeLine(` ${entry.feedback}`);
|
|
173
|
+
if (entry.learnings && entry.learnings.length > 0) {
|
|
174
|
+
for (const learning of entry.learnings) {
|
|
175
|
+
writeLine(` ${colors.green}\u2192 ${learning}${RESET}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
writeLine();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function feedbackStatsCommand() {
|
|
182
|
+
await track(Events.CLI_FEEDBACK_STATS);
|
|
183
|
+
const memoryDir = findMemoryDir();
|
|
184
|
+
if (!memoryDir) {
|
|
185
|
+
writeLine(` ${colors.red}Could not find memory directory${RESET}`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
writeLine();
|
|
189
|
+
writeLine(` ${gradient("squads")} ${colors.dim}feedback stats${RESET}`);
|
|
190
|
+
writeLine();
|
|
191
|
+
const squads = readdirSync(memoryDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
|
|
192
|
+
const w = { squad: 18, avg: 12, count: 8, trend: 6 };
|
|
193
|
+
const tableWidth = w.squad + w.avg + w.count + w.trend + 4;
|
|
194
|
+
writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
|
|
195
|
+
const header = ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd("SQUAD", w.squad)}${RESET}${bold}${padEnd("AVG", w.avg)}${RESET}${bold}${padEnd("COUNT", w.count)}${RESET}${bold}TREND${RESET} ${colors.purple}${box.vertical}${RESET}`;
|
|
196
|
+
writeLine(header);
|
|
197
|
+
writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
|
|
198
|
+
for (const squad of squads) {
|
|
199
|
+
const feedbackPath = getFeedbackPath(squad);
|
|
200
|
+
if (!feedbackPath || !existsSync(feedbackPath)) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const content = readFileSync(feedbackPath, "utf-8");
|
|
204
|
+
const entries = parseFeedbackHistory(content);
|
|
205
|
+
if (entries.length === 0) continue;
|
|
206
|
+
const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;
|
|
207
|
+
let trend = `${colors.dim}\u2192${RESET}`;
|
|
208
|
+
if (entries.length >= 4) {
|
|
209
|
+
const recent = entries.slice(-3).reduce((s, e) => s + e.rating, 0) / 3;
|
|
210
|
+
const older = entries.slice(-6, -3).reduce((s, e) => s + e.rating, 0) / Math.min(3, entries.slice(-6, -3).length);
|
|
211
|
+
if (recent > older + 0.3) trend = `${colors.green}\u2191${RESET}`;
|
|
212
|
+
else if (recent < older - 0.3) trend = `${colors.red}\u2193${RESET}`;
|
|
213
|
+
}
|
|
214
|
+
const stars = `${colors.yellow}${"\u2605".repeat(Math.round(avgRating))}${"\u2606".repeat(5 - Math.round(avgRating))}${RESET}`;
|
|
215
|
+
const row = ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(squad, w.squad)}${RESET}${padEnd(stars, w.avg + 20)}${padEnd(String(entries.length), w.count)}${trend} ${colors.purple}${box.vertical}${RESET}`;
|
|
216
|
+
writeLine(row);
|
|
217
|
+
}
|
|
218
|
+
writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
|
|
219
|
+
writeLine();
|
|
220
|
+
writeLine(` ${colors.dim}$${RESET} squads feedback show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad feedback${RESET}`);
|
|
221
|
+
writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}<squad>${RESET} ${colors.dim}Add new feedback${RESET}`);
|
|
222
|
+
writeLine();
|
|
223
|
+
}
|
|
224
|
+
export {
|
|
225
|
+
feedbackAddCommand,
|
|
226
|
+
feedbackShowCommand,
|
|
227
|
+
feedbackStatsCommand
|
|
228
|
+
};
|
|
229
|
+
//# sourceMappingURL=feedback-KA2UYBZG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/feedback.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { findMemoryDir, appendToMemory } from '../lib/memory.js';\nimport { loadSquad } from '../lib/squad-parser.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { track, Events } from '../lib/telemetry.js';\n\nexport interface FeedbackEntry {\n date: string;\n execution: string;\n rating: number; // 1-5\n feedback: string;\n learnings?: string[];\n}\n\nfunction getFeedbackPath(squadName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n\n // Find the lead agent for this squad\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n return join(memoryDir, squadName, agentName, 'feedback.md');\n}\n\nfunction getOutputPath(squadName: string): string | null {\n const memoryDir = findMemoryDir();\n if (!memoryDir) return null;\n\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n return join(memoryDir, squadName, agentName, 'output.md');\n}\n\nfunction getLastExecution(squadName: string): { date: string; summary: string } | null {\n const outputPath = getOutputPath(squadName);\n if (!outputPath || !existsSync(outputPath)) {\n return null;\n }\n\n const content = readFileSync(outputPath, 'utf-8');\n const lines = content.split('\\n');\n\n // Try to extract date from content\n let date = 'unknown';\n let summary = lines.slice(0, 5).join('\\n');\n\n // Look for date patterns\n const dateMatch = content.match(/(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) {\n date = dateMatch[1];\n }\n\n // Look for title\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n if (titleMatch) {\n summary = titleMatch[1];\n }\n\n return { date, summary };\n}\n\nfunction parseFeedbackHistory(content: string): FeedbackEntry[] {\n const entries: FeedbackEntry[] = [];\n const sections = content.split(/---\\n/).filter(s => s.trim());\n\n for (const section of sections) {\n const dateMatch = section.match(/_Date:\\s*(.+)_/);\n const ratingMatch = section.match(/\\*\\*Rating\\*\\*:\\s*(\\d)\\/5/);\n const feedbackMatch = section.match(/\\*\\*Feedback\\*\\*:\\s*(.+)/);\n const executionMatch = section.match(/\\*\\*Execution\\*\\*:\\s*(.+)/);\n\n if (dateMatch && ratingMatch) {\n const entry: FeedbackEntry = {\n date: dateMatch[1],\n execution: executionMatch?.[1] || 'unknown',\n rating: parseInt(ratingMatch[1]),\n feedback: feedbackMatch?.[1] || '',\n learnings: [],\n };\n\n // Extract learnings\n const learningsMatch = section.match(/\\*\\*Learnings\\*\\*:\\n((?:- .+\\n?)+)/);\n if (learningsMatch) {\n entry.learnings = learningsMatch[1]\n .split('\\n')\n .filter(l => l.startsWith('- '))\n .map(l => l.replace(/^- /, ''));\n }\n\n entries.push(entry);\n }\n }\n\n return entries;\n}\n\nexport async function feedbackAddCommand(\n squadName: string,\n rating: string,\n feedback: string,\n options: { learning?: string[] }\n): Promise<void> {\n await track(Events.CLI_FEEDBACK_ADD, { squad: squadName, rating: parseInt(rating) });\n const feedbackPath = getFeedbackPath(squadName);\n if (!feedbackPath) {\n writeLine(` ${colors.red}Could not find memory directory${RESET}`);\n return;\n }\n\n const ratingNum = parseInt(rating);\n if (isNaN(ratingNum) || ratingNum < 1 || ratingNum > 5) {\n writeLine(` ${colors.red}Rating must be 1-5${RESET}`);\n return;\n }\n\n // Get last execution for context\n const lastExec = getLastExecution(squadName);\n\n // Ensure directory exists\n const dir = dirname(feedbackPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Build feedback entry\n const date = new Date().toISOString().split('T')[0];\n let entry = `\\n---\\n_Date: ${date}_\\n\\n`;\n entry += `**Execution**: ${lastExec?.summary || 'Manual feedback'}\\n`;\n entry += `**Rating**: ${ratingNum}/5 ${'★'.repeat(ratingNum)}${'☆'.repeat(5 - ratingNum)}\\n`;\n entry += `**Feedback**: ${feedback}\\n`;\n\n if (options.learning && options.learning.length > 0) {\n entry += `**Learnings**:\\n`;\n for (const learning of options.learning) {\n entry += `- ${learning}\\n`;\n }\n\n // Also add learnings to the learnings file\n const squad = loadSquad(squadName);\n const agentName = squad?.agents[0]?.name || `${squadName}-lead`;\n\n for (const learning of options.learning) {\n await appendToMemory(squadName, agentName, 'learnings', `From feedback (${date}): ${learning}`);\n }\n }\n\n // Append to feedback file\n let existing = '';\n if (existsSync(feedbackPath)) {\n existing = readFileSync(feedbackPath, 'utf-8');\n } else {\n existing = `# ${squadName} - Feedback Log\\n\\n> Execution feedback and learnings\\n`;\n }\n\n writeFileSync(feedbackPath, existing + entry);\n\n // Display\n const stars = `${colors.yellow}${'★'.repeat(ratingNum)}${'☆'.repeat(5 - ratingNum)}${RESET}`;\n\n writeLine();\n writeLine(` ${icons.success} Feedback recorded for ${colors.cyan}${squadName}${RESET}`);\n writeLine(` Rating: ${stars}`);\n writeLine(` ${feedback}`);\n if (options.learning && options.learning.length > 0) {\n writeLine(` ${colors.dim}+ ${options.learning.length} learning(s) added${RESET}`);\n }\n writeLine();\n}\n\nexport async function feedbackShowCommand(\n squadName: string,\n options: { limit?: string }\n): Promise<void> {\n await track(Events.CLI_FEEDBACK_SHOW, { squad: squadName });\n const feedbackPath = getFeedbackPath(squadName);\n if (!feedbackPath || !existsSync(feedbackPath)) {\n writeLine(` ${colors.yellow}No feedback recorded for ${squadName}${RESET}`);\n return;\n }\n\n const content = readFileSync(feedbackPath, 'utf-8');\n const entries = parseFeedbackHistory(content);\n\n const limit = options.limit ? parseInt(options.limit) : 5;\n const recent = entries.slice(-limit).reverse();\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}feedback${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n if (recent.length === 0) {\n writeLine(` ${colors.dim}No feedback entries yet${RESET}`);\n return;\n }\n\n // Calculate average rating\n const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;\n\n writeLine(` ${colors.dim}Average: ${avgRating.toFixed(1)}/5 (${entries.length} entries)${RESET}`);\n writeLine();\n\n for (const entry of recent) {\n const stars = `${colors.yellow}${'★'.repeat(entry.rating)}${'☆'.repeat(5 - entry.rating)}${RESET}`;\n writeLine(` ${colors.dim}${entry.date}${RESET} ${stars}`);\n writeLine(` ${entry.feedback}`);\n if (entry.learnings && entry.learnings.length > 0) {\n for (const learning of entry.learnings) {\n writeLine(` ${colors.green}→ ${learning}${RESET}`);\n }\n }\n writeLine();\n }\n}\n\nexport async function feedbackStatsCommand(): Promise<void> {\n await track(Events.CLI_FEEDBACK_STATS);\n const memoryDir = findMemoryDir();\n if (!memoryDir) {\n writeLine(` ${colors.red}Could not find memory directory${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}feedback stats${RESET}`);\n writeLine();\n\n const squads = readdirSync(memoryDir, { withFileTypes: true })\n .filter(e => e.isDirectory())\n .map(e => e.name);\n\n // Table\n const w = { squad: 18, avg: 12, count: 8, trend: 6 };\n const tableWidth = w.squad + w.avg + w.count + w.trend + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('AVG', w.avg)}${RESET}` +\n `${bold}${padEnd('COUNT', w.count)}${RESET}` +\n `${bold}TREND${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const squad of squads) {\n const feedbackPath = getFeedbackPath(squad);\n if (!feedbackPath || !existsSync(feedbackPath)) {\n continue;\n }\n\n const content = readFileSync(feedbackPath, 'utf-8');\n const entries = parseFeedbackHistory(content);\n\n if (entries.length === 0) continue;\n\n const avgRating = entries.reduce((sum, e) => sum + e.rating, 0) / entries.length;\n\n // Calculate trend (last 3 vs previous)\n let trend = `${colors.dim}→${RESET}`;\n if (entries.length >= 4) {\n const recent = entries.slice(-3).reduce((s, e) => s + e.rating, 0) / 3;\n const older = entries.slice(-6, -3).reduce((s, e) => s + e.rating, 0) / Math.min(3, entries.slice(-6, -3).length);\n if (recent > older + 0.3) trend = `${colors.green}↑${RESET}`;\n else if (recent < older - 0.3) trend = `${colors.red}↓${RESET}`;\n }\n\n const stars = `${colors.yellow}${'★'.repeat(Math.round(avgRating))}${'☆'.repeat(5 - Math.round(avgRating))}${RESET}`;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(stars, w.avg + 20)}` + // extra for color codes\n `${padEnd(String(entries.length), w.count)}` +\n `${trend}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads feedback show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad feedback${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feedback add ${colors.cyan}<squad>${RESET} ${colors.dim}Add new feedback${RESET}`);\n writeLine();\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
createGitHubRepo,
|
|
4
|
+
detectGitHubOrg,
|
|
5
|
+
detectGitHubRepo,
|
|
6
|
+
getBotGhEnv,
|
|
7
|
+
getBotGitEnv,
|
|
8
|
+
getBotPushUrl,
|
|
9
|
+
getCoAuthorTrailer,
|
|
10
|
+
getGitHubAppToken
|
|
11
|
+
} from "./chunk-FIWT2NMM.js";
|
|
12
|
+
import "./chunk-7OCVIDC7.js";
|
|
13
|
+
export {
|
|
14
|
+
createGitHubRepo,
|
|
15
|
+
detectGitHubOrg,
|
|
16
|
+
detectGitHubRepo,
|
|
17
|
+
getBotGhEnv,
|
|
18
|
+
getBotGitEnv,
|
|
19
|
+
getBotPushUrl,
|
|
20
|
+
getCoAuthorTrailer,
|
|
21
|
+
getGitHubAppToken
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=github-UQTM5KMS.js.map
|