@prowi/deskcheck 0.1.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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +266 -0
  3. package/build/agents/executor-prompt.d.ts +10 -0
  4. package/build/agents/executor-prompt.d.ts.map +1 -0
  5. package/build/agents/executor-prompt.js +65 -0
  6. package/build/agents/executor-prompt.js.map +1 -0
  7. package/build/agents/orchestrator.d.ts +52 -0
  8. package/build/agents/orchestrator.d.ts.map +1 -0
  9. package/build/agents/orchestrator.js +343 -0
  10. package/build/agents/orchestrator.js.map +1 -0
  11. package/build/agents/planner.d.ts +28 -0
  12. package/build/agents/planner.d.ts.map +1 -0
  13. package/build/agents/planner.js +138 -0
  14. package/build/agents/planner.js.map +1 -0
  15. package/build/cli.d.ts +3 -0
  16. package/build/cli.d.ts.map +1 -0
  17. package/build/cli.js +467 -0
  18. package/build/cli.js.map +1 -0
  19. package/build/core/config.d.ts +16 -0
  20. package/build/core/config.d.ts.map +1 -0
  21. package/build/core/config.js +81 -0
  22. package/build/core/config.js.map +1 -0
  23. package/build/core/context-extractor.d.ts +17 -0
  24. package/build/core/context-extractor.d.ts.map +1 -0
  25. package/build/core/context-extractor.js +69 -0
  26. package/build/core/context-extractor.js.map +1 -0
  27. package/build/core/glob-matcher.d.ts +32 -0
  28. package/build/core/glob-matcher.d.ts.map +1 -0
  29. package/build/core/glob-matcher.js +51 -0
  30. package/build/core/glob-matcher.js.map +1 -0
  31. package/build/core/module-parser.d.ts +26 -0
  32. package/build/core/module-parser.d.ts.map +1 -0
  33. package/build/core/module-parser.js +98 -0
  34. package/build/core/module-parser.js.map +1 -0
  35. package/build/core/plan-builder.d.ts +12 -0
  36. package/build/core/plan-builder.d.ts.map +1 -0
  37. package/build/core/plan-builder.js +66 -0
  38. package/build/core/plan-builder.js.map +1 -0
  39. package/build/core/storage.d.ts +118 -0
  40. package/build/core/storage.d.ts.map +1 -0
  41. package/build/core/storage.js +590 -0
  42. package/build/core/storage.js.map +1 -0
  43. package/build/core/types.d.ts +268 -0
  44. package/build/core/types.d.ts.map +1 -0
  45. package/build/core/types.js +5 -0
  46. package/build/core/types.js.map +1 -0
  47. package/build/mcp/tools.d.ts +10 -0
  48. package/build/mcp/tools.d.ts.map +1 -0
  49. package/build/mcp/tools.js +354 -0
  50. package/build/mcp/tools.js.map +1 -0
  51. package/build/mcp-server.d.ts +3 -0
  52. package/build/mcp-server.d.ts.map +1 -0
  53. package/build/mcp-server.js +15 -0
  54. package/build/mcp-server.js.map +1 -0
  55. package/build/renderers/json.d.ts +4 -0
  56. package/build/renderers/json.d.ts.map +1 -0
  57. package/build/renderers/json.js +5 -0
  58. package/build/renderers/json.js.map +1 -0
  59. package/build/renderers/markdown.d.ts +4 -0
  60. package/build/renderers/markdown.d.ts.map +1 -0
  61. package/build/renderers/markdown.js +36 -0
  62. package/build/renderers/markdown.js.map +1 -0
  63. package/build/renderers/shared.d.ts +23 -0
  64. package/build/renderers/shared.d.ts.map +1 -0
  65. package/build/renderers/shared.js +30 -0
  66. package/build/renderers/shared.js.map +1 -0
  67. package/build/renderers/terminal.d.ts +4 -0
  68. package/build/renderers/terminal.d.ts.map +1 -0
  69. package/build/renderers/terminal.js +88 -0
  70. package/build/renderers/terminal.js.map +1 -0
  71. package/build/renderers/watch.d.ts +4 -0
  72. package/build/renderers/watch.d.ts.map +1 -0
  73. package/build/renderers/watch.js +119 -0
  74. package/build/renderers/watch.js.map +1 -0
  75. package/build/serve.d.ts +9 -0
  76. package/build/serve.d.ts.map +1 -0
  77. package/build/serve.js +249 -0
  78. package/build/serve.js.map +1 -0
  79. package/package.json +41 -0
  80. package/ui/dist/index.html +92 -0
package/build/serve.js ADDED
@@ -0,0 +1,249 @@
1
+ import http from "node:http";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { URL } from "node:url";
5
+ import { ReviewStorage } from "./core/storage.js";
6
+ // =============================================================================
7
+ // Response helpers
8
+ // =============================================================================
9
+ function sendJson(res, data, status = 200) {
10
+ const body = JSON.stringify(data);
11
+ res.writeHead(status, {
12
+ "Content-Type": "application/json",
13
+ "Access-Control-Allow-Origin": "*",
14
+ "Cache-Control": "no-cache",
15
+ });
16
+ res.end(body);
17
+ }
18
+ function sendHtml(res, html) {
19
+ res.writeHead(200, {
20
+ "Content-Type": "text/html; charset=utf-8",
21
+ "Access-Control-Allow-Origin": "*",
22
+ });
23
+ res.end(html);
24
+ }
25
+ function sendError(res, status, message) {
26
+ sendJson(res, { error: message }, status);
27
+ }
28
+ // =============================================================================
29
+ // Route handlers
30
+ // =============================================================================
31
+ function handleGetRuns(storage, res) {
32
+ const plans = storage.listPlans();
33
+ const runs = plans.map((planSummary) => {
34
+ let summary = null;
35
+ let completion = null;
36
+ // Enrich with results data if available
37
+ try {
38
+ const results = storage.getResults(planSummary.planId);
39
+ summary = results.summary;
40
+ completion = results.completion;
41
+ }
42
+ catch {
43
+ // No results file yet
44
+ }
45
+ // Enrich with plan data (tasks, modules, coverage)
46
+ let taskCount = 0;
47
+ let moduleCount = 0;
48
+ let moduleNames = [];
49
+ let matchedFiles = 0;
50
+ let unmatchedFiles = 0;
51
+ let sourceType = null;
52
+ let sourceTarget = null;
53
+ try {
54
+ const plan = storage.getPlan(planSummary.planId);
55
+ taskCount = Object.keys(plan.tasks).length;
56
+ moduleCount = Object.keys(plan.modules).length;
57
+ moduleNames = Object.keys(plan.modules).map((id) => id.split("/").pop() ?? id);
58
+ matchedFiles = plan.matched_files?.length ?? 0;
59
+ unmatchedFiles = plan.unmatched_files?.length ?? 0;
60
+ sourceType = plan.source?.type ?? null;
61
+ sourceTarget = plan.source?.target ?? null;
62
+ }
63
+ catch {
64
+ // Plan read error
65
+ }
66
+ return {
67
+ planId: planSummary.planId,
68
+ name: planSummary.name,
69
+ status: planSummary.status,
70
+ createdAt: planSummary.createdAt,
71
+ sourceType,
72
+ sourceTarget,
73
+ taskCount,
74
+ moduleCount,
75
+ moduleNames,
76
+ matchedFiles,
77
+ unmatchedFiles,
78
+ summary,
79
+ completion,
80
+ };
81
+ });
82
+ sendJson(res, runs);
83
+ }
84
+ function handleGetPlan(storage, res, planId) {
85
+ try {
86
+ const plan = storage.getPlan(planId);
87
+ sendJson(res, plan);
88
+ }
89
+ catch {
90
+ sendError(res, 404, `Plan not found: ${planId}`);
91
+ }
92
+ }
93
+ function handleGetResults(storage, res, planId) {
94
+ try {
95
+ const results = storage.getResults(planId);
96
+ sendJson(res, results);
97
+ }
98
+ catch {
99
+ sendError(res, 404, `Results not found for plan: ${planId}`);
100
+ }
101
+ }
102
+ function handleSSE(res, storageDir, planId) {
103
+ const planDir = path.join(storageDir, planId);
104
+ if (!fs.existsSync(planDir)) {
105
+ sendError(res, 404, `Plan not found: ${planId}`);
106
+ return;
107
+ }
108
+ res.writeHead(200, {
109
+ "Content-Type": "text/event-stream",
110
+ "Access-Control-Allow-Origin": "*",
111
+ "Cache-Control": "no-cache",
112
+ "Connection": "keep-alive",
113
+ });
114
+ // Send initial keepalive
115
+ res.write(": connected\n\n");
116
+ // Watch the plan directory for changes to plan.json or results.json
117
+ let debounceTimer = null;
118
+ let watcher = null;
119
+ try {
120
+ watcher = fs.watch(planDir, (_eventType, filename) => {
121
+ if (filename !== "plan.json" && filename !== "results.json")
122
+ return;
123
+ // Debounce: plan.json and results.json often update in quick succession
124
+ if (debounceTimer)
125
+ clearTimeout(debounceTimer);
126
+ debounceTimer = setTimeout(() => {
127
+ try {
128
+ res.write('data: {"type":"update"}\n\n');
129
+ }
130
+ catch {
131
+ // Client disconnected
132
+ cleanup();
133
+ }
134
+ }, 100);
135
+ });
136
+ }
137
+ catch {
138
+ // If fs.watch fails, fall back to polling
139
+ const pollInterval = setInterval(() => {
140
+ try {
141
+ res.write('data: {"type":"update"}\n\n');
142
+ }
143
+ catch {
144
+ clearInterval(pollInterval);
145
+ }
146
+ }, 2000);
147
+ res.on("close", () => {
148
+ clearInterval(pollInterval);
149
+ });
150
+ return;
151
+ }
152
+ function cleanup() {
153
+ if (debounceTimer)
154
+ clearTimeout(debounceTimer);
155
+ if (watcher) {
156
+ watcher.close();
157
+ watcher = null;
158
+ }
159
+ }
160
+ // Keep-alive every 30s to prevent proxy timeouts
161
+ const keepalive = setInterval(() => {
162
+ try {
163
+ res.write(": keepalive\n\n");
164
+ }
165
+ catch {
166
+ cleanup();
167
+ clearInterval(keepalive);
168
+ }
169
+ }, 30_000);
170
+ res.on("close", () => {
171
+ cleanup();
172
+ clearInterval(keepalive);
173
+ });
174
+ }
175
+ // =============================================================================
176
+ // URL parsing
177
+ // =============================================================================
178
+ /** Parse a URL path into segments, e.g. "/api/runs/abc/plan" -> ["api", "runs", "abc", "plan"]. */
179
+ function parseSegments(pathname) {
180
+ return pathname.split("/").filter((s) => s.length > 0);
181
+ }
182
+ // =============================================================================
183
+ // Server
184
+ // =============================================================================
185
+ /**
186
+ * Start the deskcheck web UI server.
187
+ *
188
+ * Serves a self-contained HTML dashboard at the root, a JSON API for run data,
189
+ * and SSE streams for live updates during execution.
190
+ */
191
+ export function startServer(config, projectRoot, port) {
192
+ const storageDir = path.join(projectRoot, config.storage_dir);
193
+ const storage = new ReviewStorage(storageDir);
194
+ const uiHtmlPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), "../ui/dist/index.html");
195
+ const server = http.createServer((req, res) => {
196
+ // Handle CORS preflight
197
+ if (req.method === "OPTIONS") {
198
+ res.writeHead(204, {
199
+ "Access-Control-Allow-Origin": "*",
200
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
201
+ "Access-Control-Allow-Headers": "Content-Type",
202
+ });
203
+ res.end();
204
+ return;
205
+ }
206
+ if (req.method !== "GET") {
207
+ sendError(res, 405, "Method not allowed");
208
+ return;
209
+ }
210
+ const parsedUrl = new URL(req.url ?? "/", `http://localhost:${port}`);
211
+ const segments = parseSegments(parsedUrl.pathname);
212
+ // GET / -> dashboard HTML (re-read on each request so UI rebuilds are picked up without restart)
213
+ if (segments.length === 0) {
214
+ const dashboardHtml = fs.readFileSync(uiHtmlPath, "utf-8");
215
+ sendHtml(res, dashboardHtml);
216
+ return;
217
+ }
218
+ // API routes all start with "api"
219
+ if (segments[0] !== "api") {
220
+ sendError(res, 404, "Not found");
221
+ return;
222
+ }
223
+ // GET /api/runs
224
+ if (segments.length === 2 && segments[1] === "runs") {
225
+ handleGetRuns(storage, res);
226
+ return;
227
+ }
228
+ // GET /api/runs/:id/plan
229
+ if (segments.length === 4 && segments[1] === "runs" && segments[3] === "plan") {
230
+ handleGetPlan(storage, res, decodeURIComponent(segments[2]));
231
+ return;
232
+ }
233
+ // GET /api/runs/:id/results
234
+ if (segments.length === 4 && segments[1] === "runs" && segments[3] === "results") {
235
+ handleGetResults(storage, res, decodeURIComponent(segments[2]));
236
+ return;
237
+ }
238
+ // GET /api/events/:id -> SSE stream
239
+ if (segments.length === 3 && segments[1] === "events") {
240
+ handleSSE(res, storageDir, decodeURIComponent(segments[2]));
241
+ return;
242
+ }
243
+ sendError(res, 404, "Not found");
244
+ });
245
+ server.listen(port, () => {
246
+ console.log(`Deskcheck UI: http://localhost:${port}`);
247
+ });
248
+ }
249
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@prowi/deskcheck",
3
+ "version": "0.1.0",
4
+ "description": "Modular code review tool powered by Claude Agent SDK — define review criteria as markdown, run them against your codebase, get structured findings with a web dashboard.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/Prowi-ApS/deskcheck.git"
9
+ },
10
+ "type": "module",
11
+ "bin": {
12
+ "deskcheck": "./build/cli.js",
13
+ "deskcheck-mcp": "./build/mcp-server.js"
14
+ },
15
+ "files": [
16
+ "build/",
17
+ "ui/dist/",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "dev": "tsc --watch",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "prepublishOnly": "npm run build && cd ui && npm ci && npx vite build"
27
+ },
28
+ "dependencies": {
29
+ "@anthropic-ai/claude-agent-sdk": "^0.2.79",
30
+ "@modelcontextprotocol/sdk": "^1.27.1",
31
+ "commander": "^13.0.0",
32
+ "gray-matter": "^4.0.3",
33
+ "minimatch": "^10.0.0",
34
+ "zod": "^4.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.0.0",
38
+ "typescript": "^5.8.0",
39
+ "vitest": "^3.0.0"
40
+ }
41
+ }