uilint 0.2.108 → 0.2.110
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/dist/chunk-6CC356LV.js +206 -0
- package/dist/chunk-6CC356LV.js.map +1 -0
- package/dist/index.js +299 -147
- package/dist/index.js.map +1 -1
- package/dist/render-KO44SVF3.js +393 -0
- package/dist/render-KO44SVF3.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getDashboardStore
|
|
4
|
+
} from "./chunk-6CC356LV.js";
|
|
5
|
+
|
|
6
|
+
// src/commands/serve/dashboard/render.tsx
|
|
7
|
+
import { render } from "ink";
|
|
8
|
+
|
|
9
|
+
// src/commands/serve/dashboard/ServeDashboard.tsx
|
|
10
|
+
import { useState as useState2, useEffect as useEffect2, useCallback } from "react";
|
|
11
|
+
import { Box as Box7, useInput, useApp } from "ink";
|
|
12
|
+
|
|
13
|
+
// src/commands/serve/dashboard/components/ServerHeader.tsx
|
|
14
|
+
import { Box, Text } from "ink";
|
|
15
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
+
function ServerHeader({
|
|
17
|
+
port,
|
|
18
|
+
isRunning
|
|
19
|
+
}) {
|
|
20
|
+
const url = `ws://localhost:${port}`;
|
|
21
|
+
const statusColor = isRunning ? "green" : "red";
|
|
22
|
+
const statusIcon = isRunning ? "\u25CF" : "\u25CB";
|
|
23
|
+
return /* @__PURE__ */ jsxs(
|
|
24
|
+
Box,
|
|
25
|
+
{
|
|
26
|
+
borderStyle: "single",
|
|
27
|
+
borderColor: "cyan",
|
|
28
|
+
paddingX: 1,
|
|
29
|
+
justifyContent: "space-between",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: "cyan", children: "UILint Server" }),
|
|
32
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
33
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: url }),
|
|
34
|
+
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
35
|
+
/* @__PURE__ */ jsx(Text, { color: statusColor, children: statusIcon })
|
|
36
|
+
] })
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/commands/serve/dashboard/components/WorkspaceInfo.tsx
|
|
43
|
+
import { Box as Box2, Text as Text2 } from "ink";
|
|
44
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
45
|
+
function truncatePath(path, maxLen = 60) {
|
|
46
|
+
if (path.length <= maxLen) return path;
|
|
47
|
+
return "..." + path.slice(-(maxLen - 3));
|
|
48
|
+
}
|
|
49
|
+
function WorkspaceInfo({
|
|
50
|
+
workspaceRoot,
|
|
51
|
+
appRoot
|
|
52
|
+
}) {
|
|
53
|
+
if (!workspaceRoot && !appRoot) {
|
|
54
|
+
return /* @__PURE__ */ jsx2(Box2, { paddingX: 1, children: /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Initializing..." }) });
|
|
55
|
+
}
|
|
56
|
+
return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
|
|
57
|
+
/* @__PURE__ */ jsxs2(Box2, { children: [
|
|
58
|
+
/* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Workspace: " }),
|
|
59
|
+
/* @__PURE__ */ jsx2(Text2, { children: truncatePath(workspaceRoot || "") })
|
|
60
|
+
] }),
|
|
61
|
+
appRoot && appRoot !== workspaceRoot && /* @__PURE__ */ jsxs2(Box2, { children: [
|
|
62
|
+
/* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "App Root: " }),
|
|
63
|
+
/* @__PURE__ */ jsx2(Text2, { children: truncatePath(appRoot) })
|
|
64
|
+
] })
|
|
65
|
+
] });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/commands/serve/dashboard/components/StatsBar.tsx
|
|
69
|
+
import { useState, useEffect } from "react";
|
|
70
|
+
import { Box as Box3, Text as Text3 } from "ink";
|
|
71
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
72
|
+
function formatUptime(startTime) {
|
|
73
|
+
const diff = Date.now() - startTime.getTime();
|
|
74
|
+
const seconds = Math.floor(diff / 1e3);
|
|
75
|
+
const minutes = Math.floor(seconds / 60);
|
|
76
|
+
const hours = Math.floor(minutes / 60);
|
|
77
|
+
if (hours > 0) {
|
|
78
|
+
return `${hours}h ${minutes % 60}m`;
|
|
79
|
+
}
|
|
80
|
+
if (minutes > 0) {
|
|
81
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
82
|
+
}
|
|
83
|
+
return `${seconds}s`;
|
|
84
|
+
}
|
|
85
|
+
function StatsBar({
|
|
86
|
+
connectedClients,
|
|
87
|
+
subscriptions,
|
|
88
|
+
cacheEntries,
|
|
89
|
+
startTime
|
|
90
|
+
}) {
|
|
91
|
+
const [, setTick] = useState(0);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const timer = setInterval(() => {
|
|
94
|
+
setTick((t) => t + 1);
|
|
95
|
+
}, 1e3);
|
|
96
|
+
return () => clearInterval(timer);
|
|
97
|
+
}, []);
|
|
98
|
+
return /* @__PURE__ */ jsxs3(
|
|
99
|
+
Box3,
|
|
100
|
+
{
|
|
101
|
+
borderStyle: "single",
|
|
102
|
+
borderColor: "gray",
|
|
103
|
+
paddingX: 1,
|
|
104
|
+
justifyContent: "space-between",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsxs3(Box3, { gap: 2, children: [
|
|
107
|
+
/* @__PURE__ */ jsxs3(Box3, { children: [
|
|
108
|
+
/* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "Clients: " }),
|
|
109
|
+
/* @__PURE__ */ jsx3(Text3, { bold: true, color: connectedClients > 0 ? "green" : "gray", children: connectedClients })
|
|
110
|
+
] }),
|
|
111
|
+
/* @__PURE__ */ jsxs3(Box3, { children: [
|
|
112
|
+
/* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "Subs: " }),
|
|
113
|
+
/* @__PURE__ */ jsx3(Text3, { children: subscriptions })
|
|
114
|
+
] })
|
|
115
|
+
] }),
|
|
116
|
+
/* @__PURE__ */ jsxs3(Box3, { gap: 2, children: [
|
|
117
|
+
/* @__PURE__ */ jsxs3(Box3, { children: [
|
|
118
|
+
/* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "Cache: " }),
|
|
119
|
+
/* @__PURE__ */ jsx3(Text3, { children: cacheEntries })
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsxs3(Box3, { children: [
|
|
122
|
+
/* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "Uptime: " }),
|
|
123
|
+
/* @__PURE__ */ jsx3(Text3, { children: formatUptime(startTime) })
|
|
124
|
+
] })
|
|
125
|
+
] })
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// src/commands/serve/dashboard/components/BackgroundTasks.tsx
|
|
132
|
+
import { Box as Box4, Text as Text4 } from "ink";
|
|
133
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
134
|
+
function ProgressBar({
|
|
135
|
+
progress,
|
|
136
|
+
width = 20
|
|
137
|
+
}) {
|
|
138
|
+
const filled = Math.round(progress / 100 * width);
|
|
139
|
+
const empty = width - filled;
|
|
140
|
+
return /* @__PURE__ */ jsxs4(Text4, { children: [
|
|
141
|
+
/* @__PURE__ */ jsx4(Text4, { color: "cyan", children: "\u2588".repeat(filled) }),
|
|
142
|
+
/* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "\u2591".repeat(empty) })
|
|
143
|
+
] });
|
|
144
|
+
}
|
|
145
|
+
function TaskRow({ task }) {
|
|
146
|
+
const statusIcon = {
|
|
147
|
+
idle: "\u25CB",
|
|
148
|
+
// hollow circle
|
|
149
|
+
running: "\u25CF",
|
|
150
|
+
// filled circle
|
|
151
|
+
complete: "\u2713",
|
|
152
|
+
// checkmark
|
|
153
|
+
error: "\u2717"
|
|
154
|
+
// x mark
|
|
155
|
+
}[task.status];
|
|
156
|
+
const statusColor = {
|
|
157
|
+
idle: "gray",
|
|
158
|
+
running: "cyan",
|
|
159
|
+
complete: "green",
|
|
160
|
+
error: "red"
|
|
161
|
+
}[task.status];
|
|
162
|
+
return /* @__PURE__ */ jsxs4(Box4, { children: [
|
|
163
|
+
/* @__PURE__ */ jsxs4(Text4, { color: statusColor, children: [
|
|
164
|
+
statusIcon,
|
|
165
|
+
" "
|
|
166
|
+
] }),
|
|
167
|
+
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
168
|
+
task.name,
|
|
169
|
+
": "
|
|
170
|
+
] }),
|
|
171
|
+
task.status === "running" && task.progress !== void 0 ? /* @__PURE__ */ jsxs4(Box4, { gap: 1, children: [
|
|
172
|
+
/* @__PURE__ */ jsx4(ProgressBar, { progress: task.progress, width: 15 }),
|
|
173
|
+
/* @__PURE__ */ jsxs4(Text4, { dimColor: true, children: [
|
|
174
|
+
task.progress.toFixed(0),
|
|
175
|
+
"%",
|
|
176
|
+
task.current !== void 0 && task.total !== void 0 ? ` (${task.current}/${task.total})` : ""
|
|
177
|
+
] })
|
|
178
|
+
] }) : task.status === "complete" ? /* @__PURE__ */ jsx4(Text4, { color: "green", children: "Complete" }) : task.status === "error" ? /* @__PURE__ */ jsx4(Text4, { color: "red", children: task.error || "Failed" }) : /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: task.message || "Idle" })
|
|
179
|
+
] });
|
|
180
|
+
}
|
|
181
|
+
function BackgroundTasks({
|
|
182
|
+
tasks
|
|
183
|
+
}) {
|
|
184
|
+
const taskArray = Array.from(tasks.values());
|
|
185
|
+
if (taskArray.length === 0) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return /* @__PURE__ */ jsxs4(
|
|
189
|
+
Box4,
|
|
190
|
+
{
|
|
191
|
+
flexDirection: "column",
|
|
192
|
+
borderStyle: "single",
|
|
193
|
+
borderColor: "gray",
|
|
194
|
+
paddingX: 1,
|
|
195
|
+
children: [
|
|
196
|
+
/* @__PURE__ */ jsx4(Text4, { bold: true, dimColor: true, children: "Background Tasks" }),
|
|
197
|
+
taskArray.map((task) => /* @__PURE__ */ jsx4(TaskRow, { task }, task.id))
|
|
198
|
+
]
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// src/commands/serve/dashboard/components/ActivityLog.tsx
|
|
204
|
+
import { Box as Box5, Text as Text5 } from "ink";
|
|
205
|
+
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
206
|
+
function formatTime(date) {
|
|
207
|
+
return date.toLocaleTimeString("en-US", {
|
|
208
|
+
hour12: false,
|
|
209
|
+
hour: "2-digit",
|
|
210
|
+
minute: "2-digit",
|
|
211
|
+
second: "2-digit"
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function getTypeDisplay(type) {
|
|
215
|
+
const displays = {
|
|
216
|
+
"lint:file": { label: "lint", color: "blue" },
|
|
217
|
+
"lint:element": { label: "lint", color: "blue" },
|
|
218
|
+
"lint:done": { label: "lint", color: "green" },
|
|
219
|
+
subscribe: { label: "sub", color: "cyan" },
|
|
220
|
+
"cache:invalidate": { label: "cache", color: "yellow" },
|
|
221
|
+
"vision:analyze": { label: "vision", color: "magenta" },
|
|
222
|
+
"vision:done": { label: "vision", color: "green" },
|
|
223
|
+
"vision:check": { label: "vision", color: "magenta" },
|
|
224
|
+
"config:set": { label: "config", color: "yellow" },
|
|
225
|
+
"rule:config:set": { label: "rule", color: "yellow" },
|
|
226
|
+
"screenshot:save": { label: "screen", color: "cyan" },
|
|
227
|
+
"screenshot:saved": { label: "screen", color: "green" },
|
|
228
|
+
"coverage:request": { label: "cov", color: "blue" },
|
|
229
|
+
"coverage:result": { label: "cov", color: "green" },
|
|
230
|
+
"file:changed": { label: "change", color: "yellow" },
|
|
231
|
+
"client:connect": { label: "client", color: "green" },
|
|
232
|
+
"client:disconnect": { label: "client", color: "red" },
|
|
233
|
+
error: { label: "error", color: "red" },
|
|
234
|
+
warning: { label: "warn", color: "yellow" },
|
|
235
|
+
info: { label: "info", color: "gray" }
|
|
236
|
+
};
|
|
237
|
+
return displays[type] || { label: type, color: "gray" };
|
|
238
|
+
}
|
|
239
|
+
function ActivityRow({
|
|
240
|
+
entry,
|
|
241
|
+
verbose
|
|
242
|
+
}) {
|
|
243
|
+
const { label, color } = getTypeDisplay(entry.type);
|
|
244
|
+
return /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", children: [
|
|
245
|
+
/* @__PURE__ */ jsxs5(Box5, { children: [
|
|
246
|
+
/* @__PURE__ */ jsxs5(Text5, { dimColor: true, children: [
|
|
247
|
+
formatTime(entry.timestamp),
|
|
248
|
+
" "
|
|
249
|
+
] }),
|
|
250
|
+
/* @__PURE__ */ jsx5(Text5, { color, bold: true, children: label.padEnd(7) }),
|
|
251
|
+
/* @__PURE__ */ jsx5(Text5, { color: entry.isError ? "red" : entry.isWarning ? "yellow" : void 0, children: entry.message })
|
|
252
|
+
] }),
|
|
253
|
+
verbose && entry.detail && /* @__PURE__ */ jsx5(Box5, { paddingLeft: 16, children: /* @__PURE__ */ jsx5(Text5, { dimColor: true, children: entry.detail }) })
|
|
254
|
+
] });
|
|
255
|
+
}
|
|
256
|
+
function ActivityLog({
|
|
257
|
+
activities,
|
|
258
|
+
maxVisible = 15,
|
|
259
|
+
verbose = false
|
|
260
|
+
}) {
|
|
261
|
+
const visibleActivities = activities.slice(0, maxVisible);
|
|
262
|
+
const hasMore = activities.length > maxVisible;
|
|
263
|
+
return /* @__PURE__ */ jsxs5(
|
|
264
|
+
Box5,
|
|
265
|
+
{
|
|
266
|
+
flexDirection: "column",
|
|
267
|
+
borderStyle: "single",
|
|
268
|
+
borderColor: "gray",
|
|
269
|
+
paddingX: 1,
|
|
270
|
+
flexGrow: 1,
|
|
271
|
+
children: [
|
|
272
|
+
/* @__PURE__ */ jsxs5(Box5, { justifyContent: "space-between", children: [
|
|
273
|
+
/* @__PURE__ */ jsx5(Text5, { bold: true, dimColor: true, children: "Activity" }),
|
|
274
|
+
hasMore && /* @__PURE__ */ jsxs5(Text5, { dimColor: true, children: [
|
|
275
|
+
"+",
|
|
276
|
+
activities.length - maxVisible,
|
|
277
|
+
" more"
|
|
278
|
+
] })
|
|
279
|
+
] }),
|
|
280
|
+
visibleActivities.length === 0 ? /* @__PURE__ */ jsx5(Text5, { dimColor: true, children: "No activity yet..." }) : visibleActivities.map((entry) => /* @__PURE__ */ jsx5(ActivityRow, { entry, verbose }, entry.id))
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// src/commands/serve/dashboard/components/HelpBar.tsx
|
|
287
|
+
import { Box as Box6, Text as Text6 } from "ink";
|
|
288
|
+
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
289
|
+
function HelpBar({ verbose }) {
|
|
290
|
+
return /* @__PURE__ */ jsxs6(Box6, { borderStyle: "single", borderColor: "gray", paddingX: 1, gap: 2, children: [
|
|
291
|
+
/* @__PURE__ */ jsxs6(Box6, { children: [
|
|
292
|
+
/* @__PURE__ */ jsx6(Text6, { bold: true, color: "cyan", children: "q" }),
|
|
293
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: " quit" })
|
|
294
|
+
] }),
|
|
295
|
+
/* @__PURE__ */ jsxs6(Box6, { children: [
|
|
296
|
+
/* @__PURE__ */ jsx6(Text6, { bold: true, color: "cyan", children: "c" }),
|
|
297
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: " clear log" })
|
|
298
|
+
] }),
|
|
299
|
+
/* @__PURE__ */ jsxs6(Box6, { children: [
|
|
300
|
+
/* @__PURE__ */ jsx6(Text6, { bold: true, color: "cyan", children: "v" }),
|
|
301
|
+
/* @__PURE__ */ jsxs6(Text6, { dimColor: true, children: [
|
|
302
|
+
" verbose ",
|
|
303
|
+
verbose ? "(on)" : "(off)"
|
|
304
|
+
] })
|
|
305
|
+
] }),
|
|
306
|
+
/* @__PURE__ */ jsxs6(Box6, { children: [
|
|
307
|
+
/* @__PURE__ */ jsx6(Text6, { bold: true, color: "cyan", children: "r" }),
|
|
308
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: " rebuild index" })
|
|
309
|
+
] })
|
|
310
|
+
] });
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// src/commands/serve/dashboard/ServeDashboard.tsx
|
|
314
|
+
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
315
|
+
function ServeDashboard({
|
|
316
|
+
onQuit,
|
|
317
|
+
onRebuildIndex
|
|
318
|
+
}) {
|
|
319
|
+
const { exit } = useApp();
|
|
320
|
+
const store = getDashboardStore();
|
|
321
|
+
const [state, setState] = useState2(store.getState());
|
|
322
|
+
useEffect2(() => {
|
|
323
|
+
const unsubscribe = store.subscribe(() => {
|
|
324
|
+
setState(store.getState());
|
|
325
|
+
});
|
|
326
|
+
return unsubscribe;
|
|
327
|
+
}, [store]);
|
|
328
|
+
useInput(
|
|
329
|
+
useCallback(
|
|
330
|
+
(input, key) => {
|
|
331
|
+
if (input === "q" || key.ctrl && input === "c") {
|
|
332
|
+
onQuit?.();
|
|
333
|
+
exit();
|
|
334
|
+
} else if (input === "c") {
|
|
335
|
+
store.clearActivities();
|
|
336
|
+
} else if (input === "v") {
|
|
337
|
+
store.toggleVerbose();
|
|
338
|
+
} else if (input === "r") {
|
|
339
|
+
onRebuildIndex?.();
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
[exit, onQuit, onRebuildIndex, store]
|
|
343
|
+
)
|
|
344
|
+
);
|
|
345
|
+
return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", width: "100%", children: [
|
|
346
|
+
/* @__PURE__ */ jsx7(ServerHeader, { port: state.port, isRunning: state.isRunning }),
|
|
347
|
+
/* @__PURE__ */ jsx7(
|
|
348
|
+
WorkspaceInfo,
|
|
349
|
+
{
|
|
350
|
+
workspaceRoot: state.workspace?.workspaceRoot ?? null,
|
|
351
|
+
appRoot: state.workspace?.appRoot ?? null
|
|
352
|
+
}
|
|
353
|
+
),
|
|
354
|
+
/* @__PURE__ */ jsx7(
|
|
355
|
+
StatsBar,
|
|
356
|
+
{
|
|
357
|
+
connectedClients: state.stats.connectedClients,
|
|
358
|
+
subscriptions: state.stats.subscriptions,
|
|
359
|
+
cacheEntries: state.stats.cacheEntries,
|
|
360
|
+
startTime: state.stats.startTime
|
|
361
|
+
}
|
|
362
|
+
),
|
|
363
|
+
/* @__PURE__ */ jsx7(BackgroundTasks, { tasks: state.backgroundTasks }),
|
|
364
|
+
/* @__PURE__ */ jsx7(
|
|
365
|
+
ActivityLog,
|
|
366
|
+
{
|
|
367
|
+
activities: state.activities,
|
|
368
|
+
maxVisible: 15,
|
|
369
|
+
verbose: state.verbose
|
|
370
|
+
}
|
|
371
|
+
),
|
|
372
|
+
/* @__PURE__ */ jsx7(HelpBar, { verbose: state.verbose })
|
|
373
|
+
] });
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// src/commands/serve/dashboard/render.tsx
|
|
377
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
378
|
+
function renderDashboard(options = {}) {
|
|
379
|
+
const { unmount, waitUntilExit } = render(
|
|
380
|
+
/* @__PURE__ */ jsx8(
|
|
381
|
+
ServeDashboard,
|
|
382
|
+
{
|
|
383
|
+
onQuit: options.onQuit,
|
|
384
|
+
onRebuildIndex: options.onRebuildIndex
|
|
385
|
+
}
|
|
386
|
+
)
|
|
387
|
+
);
|
|
388
|
+
return { unmount, waitUntilExit };
|
|
389
|
+
}
|
|
390
|
+
export {
|
|
391
|
+
renderDashboard
|
|
392
|
+
};
|
|
393
|
+
//# sourceMappingURL=render-KO44SVF3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/serve/dashboard/render.tsx","../src/commands/serve/dashboard/ServeDashboard.tsx","../src/commands/serve/dashboard/components/ServerHeader.tsx","../src/commands/serve/dashboard/components/WorkspaceInfo.tsx","../src/commands/serve/dashboard/components/StatsBar.tsx","../src/commands/serve/dashboard/components/BackgroundTasks.tsx","../src/commands/serve/dashboard/components/ActivityLog.tsx","../src/commands/serve/dashboard/components/HelpBar.tsx"],"sourcesContent":["/**\n * Render the dashboard using Ink\n */\n\nimport React from \"react\";\nimport { render } from \"ink\";\nimport { ServeDashboard } from \"./ServeDashboard.js\";\n\nexport interface RenderOptions {\n onQuit?: () => void;\n onRebuildIndex?: () => void;\n}\n\n/**\n * Render the dashboard and return cleanup function\n */\nexport function renderDashboard(options: RenderOptions = {}): {\n unmount: () => void;\n waitUntilExit: () => Promise<void>;\n} {\n const { unmount, waitUntilExit } = render(\n <ServeDashboard\n onQuit={options.onQuit}\n onRebuildIndex={options.onRebuildIndex}\n />\n );\n\n return { unmount, waitUntilExit };\n}\n","/**\n * ServeDashboard - main Ink component for the WebSocket server CLI dashboard\n */\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport { Box, useInput, useApp } from \"ink\";\nimport {\n ServerHeader,\n WorkspaceInfo,\n StatsBar,\n BackgroundTasks,\n ActivityLog,\n HelpBar,\n} from \"./components/index.js\";\nimport type { DashboardState } from \"./types.js\";\nimport { getDashboardStore } from \"./store.js\";\n\nexport interface ServeDashboardProps {\n /** Callback when user requests to quit */\n onQuit?: () => void;\n /** Callback when user requests to rebuild index */\n onRebuildIndex?: () => void;\n}\n\nexport function ServeDashboard({\n onQuit,\n onRebuildIndex,\n}: ServeDashboardProps): React.ReactElement {\n const { exit } = useApp();\n const store = getDashboardStore();\n\n // Subscribe to store updates\n const [state, setState] = useState<DashboardState>(store.getState());\n\n useEffect(() => {\n const unsubscribe = store.subscribe(() => {\n setState(store.getState());\n });\n return unsubscribe;\n }, [store]);\n\n // Handle keyboard input\n useInput(\n useCallback(\n (input, key) => {\n if (input === \"q\" || (key.ctrl && input === \"c\")) {\n onQuit?.();\n exit();\n } else if (input === \"c\") {\n store.clearActivities();\n } else if (input === \"v\") {\n store.toggleVerbose();\n } else if (input === \"r\") {\n onRebuildIndex?.();\n }\n },\n [exit, onQuit, onRebuildIndex, store]\n )\n );\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <ServerHeader port={state.port} isRunning={state.isRunning} />\n\n <WorkspaceInfo\n workspaceRoot={state.workspace?.workspaceRoot ?? null}\n appRoot={state.workspace?.appRoot ?? null}\n />\n\n <StatsBar\n connectedClients={state.stats.connectedClients}\n subscriptions={state.stats.subscriptions}\n cacheEntries={state.stats.cacheEntries}\n startTime={state.stats.startTime}\n />\n\n <BackgroundTasks tasks={state.backgroundTasks} />\n\n <ActivityLog\n activities={state.activities}\n maxVisible={15}\n verbose={state.verbose}\n />\n\n <HelpBar verbose={state.verbose} />\n </Box>\n );\n}\n","/**\n * ServerHeader component - displays server status and URL\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport interface ServerHeaderProps {\n port: number;\n isRunning: boolean;\n}\n\nexport function ServerHeader({\n port,\n isRunning,\n}: ServerHeaderProps): React.ReactElement {\n const url = `ws://localhost:${port}`;\n const statusColor = isRunning ? \"green\" : \"red\";\n const statusIcon = isRunning ? \"\\u25CF\" : \"\\u25CB\"; // Filled/hollow circle\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text bold color=\"cyan\">\n UILint Server\n </Text>\n <Box>\n <Text dimColor>{url}</Text>\n <Text> </Text>\n <Text color={statusColor}>{statusIcon}</Text>\n </Box>\n </Box>\n );\n}\n","/**\n * WorkspaceInfo component - displays workspace and app root paths\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport interface WorkspaceInfoProps {\n workspaceRoot: string | null;\n appRoot: string | null;\n}\n\nfunction truncatePath(path: string, maxLen: number = 60): string {\n if (path.length <= maxLen) return path;\n return \"...\" + path.slice(-(maxLen - 3));\n}\n\nexport function WorkspaceInfo({\n workspaceRoot,\n appRoot,\n}: WorkspaceInfoProps): React.ReactElement {\n if (!workspaceRoot && !appRoot) {\n return (\n <Box paddingX={1}>\n <Text dimColor>Initializing...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text dimColor>Workspace: </Text>\n <Text>{truncatePath(workspaceRoot || \"\")}</Text>\n </Box>\n {appRoot && appRoot !== workspaceRoot && (\n <Box>\n <Text dimColor>App Root: </Text>\n <Text>{truncatePath(appRoot)}</Text>\n </Box>\n )}\n </Box>\n );\n}\n","/**\n * StatsBar component - displays server statistics\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport interface StatsBarProps {\n connectedClients: number;\n subscriptions: number;\n cacheEntries: number;\n startTime: Date;\n}\n\nfunction formatUptime(startTime: Date): string {\n const diff = Date.now() - startTime.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\nexport function StatsBar({\n connectedClients,\n subscriptions,\n cacheEntries,\n startTime,\n}: StatsBarProps): React.ReactElement {\n const [, setTick] = useState(0);\n\n // Update uptime display every second\n useEffect(() => {\n const timer = setInterval(() => {\n setTick((t) => t + 1);\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box gap={2}>\n <Box>\n <Text dimColor>Clients: </Text>\n <Text bold color={connectedClients > 0 ? \"green\" : \"gray\"}>\n {connectedClients}\n </Text>\n </Box>\n <Box>\n <Text dimColor>Subs: </Text>\n <Text>{subscriptions}</Text>\n </Box>\n </Box>\n <Box gap={2}>\n <Box>\n <Text dimColor>Cache: </Text>\n <Text>{cacheEntries}</Text>\n </Box>\n <Box>\n <Text dimColor>Uptime: </Text>\n <Text>{formatUptime(startTime)}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","/**\n * BackgroundTasks component - displays background task progress\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { BackgroundTask } from \"../types.js\";\n\nexport interface BackgroundTasksProps {\n tasks: Map<string, BackgroundTask>;\n}\n\nfunction ProgressBar({\n progress,\n width = 20,\n}: {\n progress: number;\n width?: number;\n}): React.ReactElement {\n const filled = Math.round((progress / 100) * width);\n const empty = width - filled;\n\n return (\n <Text>\n <Text color=\"cyan\">{\"\\u2588\".repeat(filled)}</Text>\n <Text dimColor>{\"\\u2591\".repeat(empty)}</Text>\n </Text>\n );\n}\n\nfunction TaskRow({ task }: { task: BackgroundTask }): React.ReactElement {\n const statusIcon = {\n idle: \"\\u25CB\", // hollow circle\n running: \"\\u25CF\", // filled circle\n complete: \"\\u2713\", // checkmark\n error: \"\\u2717\", // x mark\n }[task.status];\n\n const statusColor = {\n idle: \"gray\",\n running: \"cyan\",\n complete: \"green\",\n error: \"red\",\n }[task.status] as \"gray\" | \"cyan\" | \"green\" | \"red\";\n\n return (\n <Box>\n <Text color={statusColor}>{statusIcon} </Text>\n <Text>{task.name}: </Text>\n {task.status === \"running\" && task.progress !== undefined ? (\n <Box gap={1}>\n <ProgressBar progress={task.progress} width={15} />\n <Text dimColor>\n {task.progress.toFixed(0)}%\n {task.current !== undefined && task.total !== undefined\n ? ` (${task.current}/${task.total})`\n : \"\"}\n </Text>\n </Box>\n ) : task.status === \"complete\" ? (\n <Text color=\"green\">Complete</Text>\n ) : task.status === \"error\" ? (\n <Text color=\"red\">{task.error || \"Failed\"}</Text>\n ) : (\n <Text dimColor>{task.message || \"Idle\"}</Text>\n )}\n </Box>\n );\n}\n\nexport function BackgroundTasks({\n tasks,\n}: BackgroundTasksProps): React.ReactElement | null {\n const taskArray = Array.from(tasks.values());\n\n if (taskArray.length === 0) {\n return null;\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n >\n <Text bold dimColor>\n Background Tasks\n </Text>\n {taskArray.map((task) => (\n <TaskRow key={task.id} task={task} />\n ))}\n </Box>\n );\n}\n","/**\n * ActivityLog component - displays recent server activity\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { ActivityEntry, ActivityType } from \"../types.js\";\n\nexport interface ActivityLogProps {\n activities: ActivityEntry[];\n maxVisible?: number;\n verbose?: boolean;\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\nfunction getTypeDisplay(type: ActivityType): { label: string; color: string } {\n const displays: Record<ActivityType, { label: string; color: string }> = {\n \"lint:file\": { label: \"lint\", color: \"blue\" },\n \"lint:element\": { label: \"lint\", color: \"blue\" },\n \"lint:done\": { label: \"lint\", color: \"green\" },\n subscribe: { label: \"sub\", color: \"cyan\" },\n \"cache:invalidate\": { label: \"cache\", color: \"yellow\" },\n \"vision:analyze\": { label: \"vision\", color: \"magenta\" },\n \"vision:done\": { label: \"vision\", color: \"green\" },\n \"vision:check\": { label: \"vision\", color: \"magenta\" },\n \"config:set\": { label: \"config\", color: \"yellow\" },\n \"rule:config:set\": { label: \"rule\", color: \"yellow\" },\n \"screenshot:save\": { label: \"screen\", color: \"cyan\" },\n \"screenshot:saved\": { label: \"screen\", color: \"green\" },\n \"coverage:request\": { label: \"cov\", color: \"blue\" },\n \"coverage:result\": { label: \"cov\", color: \"green\" },\n \"file:changed\": { label: \"change\", color: \"yellow\" },\n \"client:connect\": { label: \"client\", color: \"green\" },\n \"client:disconnect\": { label: \"client\", color: \"red\" },\n error: { label: \"error\", color: \"red\" },\n warning: { label: \"warn\", color: \"yellow\" },\n info: { label: \"info\", color: \"gray\" },\n };\n\n return displays[type] || { label: type, color: \"gray\" };\n}\n\nfunction ActivityRow({\n entry,\n verbose,\n}: {\n entry: ActivityEntry;\n verbose?: boolean;\n}): React.ReactElement {\n const { label, color } = getTypeDisplay(entry.type);\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text dimColor>{formatTime(entry.timestamp)} </Text>\n <Text color={color as any} bold>\n {label.padEnd(7)}\n </Text>\n <Text color={entry.isError ? \"red\" : entry.isWarning ? \"yellow\" : undefined}>\n {entry.message}\n </Text>\n </Box>\n {verbose && entry.detail && (\n <Box paddingLeft={16}>\n <Text dimColor>{entry.detail}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\nexport function ActivityLog({\n activities,\n maxVisible = 15,\n verbose = false,\n}: ActivityLogProps): React.ReactElement {\n const visibleActivities = activities.slice(0, maxVisible);\n const hasMore = activities.length > maxVisible;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n flexGrow={1}\n >\n <Box justifyContent=\"space-between\">\n <Text bold dimColor>\n Activity\n </Text>\n {hasMore && (\n <Text dimColor>\n +{activities.length - maxVisible} more\n </Text>\n )}\n </Box>\n {visibleActivities.length === 0 ? (\n <Text dimColor>No activity yet...</Text>\n ) : (\n visibleActivities.map((entry) => (\n <ActivityRow key={entry.id} entry={entry} verbose={verbose} />\n ))\n )}\n </Box>\n );\n}\n","/**\n * HelpBar component - displays keyboard shortcuts\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport interface HelpBarProps {\n verbose: boolean;\n}\n\nexport function HelpBar({ verbose }: HelpBarProps): React.ReactElement {\n return (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1} gap={2}>\n <Box>\n <Text bold color=\"cyan\">\n q\n </Text>\n <Text dimColor> quit</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n c\n </Text>\n <Text dimColor> clear log</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n v\n </Text>\n <Text dimColor> verbose {verbose ? \"(on)\" : \"(off)\"}</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n r\n </Text>\n <Text dimColor> rebuild index</Text>\n </Box>\n </Box>\n );\n}\n"],"mappings":"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","names":["useState","useEffect","Box","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","jsx","jsxs","useState","useEffect","Box","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uilint",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.110",
|
|
4
4
|
"description": "CLI for UILint - AI-powered UI consistency checking",
|
|
5
5
|
"author": "Peter Suggate",
|
|
6
6
|
"repository": {
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
"react": "^19.2.3",
|
|
50
50
|
"typescript": "^5.9.3",
|
|
51
51
|
"ws": "^8.19.0",
|
|
52
|
-
"uilint-core": "0.2.
|
|
53
|
-
"uilint-duplicates": "0.2.
|
|
54
|
-
"uilint-eslint": "0.2.
|
|
52
|
+
"uilint-core": "0.2.110",
|
|
53
|
+
"uilint-duplicates": "0.2.110",
|
|
54
|
+
"uilint-eslint": "0.2.110"
|
|
55
55
|
},
|
|
56
56
|
"optionalDependencies": {
|
|
57
57
|
"@langfuse/client": "^4.5.1",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"ink-testing-library": "^4.0.0",
|
|
68
68
|
"tsup": "^8.5.1",
|
|
69
69
|
"vitest": "^4.0.17",
|
|
70
|
-
"uilint-react": "0.2.
|
|
70
|
+
"uilint-react": "0.2.110"
|
|
71
71
|
},
|
|
72
72
|
"keywords": [
|
|
73
73
|
"cli",
|