@crown-dev-studios/review-council 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.
- package/README.md +170 -0
- package/SKILL.md +262 -0
- package/dist/cli.js +9 -0
- package/dist/interaction-queue.js +50 -0
- package/dist/orchestrate-review-council.js +772 -0
- package/dist/render-review-html.js +307 -0
- package/dist/review-session.js +77 -0
- package/dist/schemas.js +67 -0
- package/dist/types.js +1 -0
- package/package.json +48 -0
- package/references/cli-integration.md +177 -0
- package/references/output-contract.md +158 -0
- package/schemas/judge-done.schema.json +48 -0
- package/schemas/judge-verdict.schema.json +132 -0
- package/schemas/review-done.schema.json +42 -0
- package/schemas/review-findings.schema.json +114 -0
- package/templates/judge.md +51 -0
- package/templates/report.html +401 -0
- package/templates/reviewer-export.md +50 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src data:" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
|
+
<title>__TITLE__</title>
|
|
8
|
+
<style>
|
|
9
|
+
:root {
|
|
10
|
+
color-scheme: light;
|
|
11
|
+
--bg: #f6f2ea;
|
|
12
|
+
--surface: #fffdfa;
|
|
13
|
+
--surface-2: #f1e7d8;
|
|
14
|
+
--ink: #1f1a17;
|
|
15
|
+
--muted: #6f6258;
|
|
16
|
+
--line: #d9c5ab;
|
|
17
|
+
--accent: #9c4f21;
|
|
18
|
+
--accent-soft: #f0d5bf;
|
|
19
|
+
--good: #2d6a4f;
|
|
20
|
+
--warn: #9a6b00;
|
|
21
|
+
--bad: #9f2f2f;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
* {
|
|
25
|
+
box-sizing: border-box;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
body {
|
|
29
|
+
margin: 0;
|
|
30
|
+
font-family: "Iowan Old Style", "Palatino Linotype", Georgia, serif;
|
|
31
|
+
color: var(--ink);
|
|
32
|
+
background:
|
|
33
|
+
radial-gradient(circle at top left, rgba(156, 79, 33, 0.12), transparent 28%),
|
|
34
|
+
linear-gradient(180deg, #fbf7f1 0%, var(--bg) 100%);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
main {
|
|
38
|
+
max-width: 1440px;
|
|
39
|
+
margin: 0 auto;
|
|
40
|
+
padding: 32px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
h1,
|
|
44
|
+
h2,
|
|
45
|
+
h3 {
|
|
46
|
+
margin: 0 0 12px;
|
|
47
|
+
line-height: 1.1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
p,
|
|
51
|
+
li,
|
|
52
|
+
td,
|
|
53
|
+
th,
|
|
54
|
+
pre {
|
|
55
|
+
font-size: 15px;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.hero {
|
|
59
|
+
display: grid;
|
|
60
|
+
gap: 16px;
|
|
61
|
+
padding: 24px;
|
|
62
|
+
border: 1px solid var(--line);
|
|
63
|
+
border-radius: 20px;
|
|
64
|
+
background: rgba(255, 253, 250, 0.92);
|
|
65
|
+
box-shadow: 0 24px 48px rgba(68, 43, 24, 0.08);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.meta {
|
|
69
|
+
color: var(--muted);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.chips {
|
|
73
|
+
display: flex;
|
|
74
|
+
flex-wrap: wrap;
|
|
75
|
+
gap: 8px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.chip {
|
|
79
|
+
display: inline-flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
padding: 6px 10px;
|
|
82
|
+
border-radius: 999px;
|
|
83
|
+
border: 1px solid var(--line);
|
|
84
|
+
background: var(--surface-2);
|
|
85
|
+
font-size: 13px;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.grid {
|
|
89
|
+
display: grid;
|
|
90
|
+
gap: 20px;
|
|
91
|
+
margin-top: 24px;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.grid.two {
|
|
95
|
+
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.grid.three {
|
|
99
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.card {
|
|
103
|
+
padding: 20px;
|
|
104
|
+
border: 1px solid var(--line);
|
|
105
|
+
border-radius: 18px;
|
|
106
|
+
background: var(--surface);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.card h2 {
|
|
110
|
+
font-size: 22px;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.status-grid {
|
|
114
|
+
display: grid;
|
|
115
|
+
gap: 12px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.status-row {
|
|
119
|
+
display: flex;
|
|
120
|
+
justify-content: space-between;
|
|
121
|
+
gap: 16px;
|
|
122
|
+
padding: 12px 14px;
|
|
123
|
+
border-radius: 14px;
|
|
124
|
+
background: #fbf7f1;
|
|
125
|
+
border: 1px solid var(--line);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.status-row strong {
|
|
129
|
+
font-size: 14px;
|
|
130
|
+
text-transform: uppercase;
|
|
131
|
+
letter-spacing: 0.04em;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.status-success {
|
|
135
|
+
color: var(--good);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.status-failed {
|
|
139
|
+
color: var(--bad);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.status-pending {
|
|
143
|
+
color: var(--warn);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
table {
|
|
147
|
+
width: 100%;
|
|
148
|
+
border-collapse: collapse;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
th,
|
|
152
|
+
td {
|
|
153
|
+
border-bottom: 1px solid var(--line);
|
|
154
|
+
padding: 10px 12px;
|
|
155
|
+
text-align: left;
|
|
156
|
+
vertical-align: top;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
th {
|
|
160
|
+
color: var(--muted);
|
|
161
|
+
font-size: 13px;
|
|
162
|
+
text-transform: uppercase;
|
|
163
|
+
letter-spacing: 0.04em;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.severity {
|
|
167
|
+
font-weight: 700;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.severity.p1 {
|
|
171
|
+
color: var(--bad);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.severity.p2 {
|
|
175
|
+
color: var(--warn);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.severity.p3 {
|
|
179
|
+
color: var(--good);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
pre {
|
|
183
|
+
margin: 0;
|
|
184
|
+
padding: 16px;
|
|
185
|
+
border-radius: 14px;
|
|
186
|
+
overflow-x: auto;
|
|
187
|
+
border: 1px solid var(--line);
|
|
188
|
+
background: #faf4ec;
|
|
189
|
+
white-space: pre-wrap;
|
|
190
|
+
word-break: break-word;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.markdown {
|
|
194
|
+
color: var(--ink);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.markdown > :first-child {
|
|
198
|
+
margin-top: 0;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.markdown > :last-child {
|
|
202
|
+
margin-bottom: 0;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.markdown p,
|
|
206
|
+
.markdown ul,
|
|
207
|
+
.markdown ol,
|
|
208
|
+
.markdown blockquote,
|
|
209
|
+
.markdown pre {
|
|
210
|
+
margin: 0 0 14px;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.markdown ul,
|
|
214
|
+
.markdown ol {
|
|
215
|
+
padding-left: 22px;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.markdown li + li {
|
|
219
|
+
margin-top: 8px;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.markdown h1,
|
|
223
|
+
.markdown h2,
|
|
224
|
+
.markdown h3,
|
|
225
|
+
.markdown h4,
|
|
226
|
+
.markdown h5,
|
|
227
|
+
.markdown h6 {
|
|
228
|
+
margin: 22px 0 12px;
|
|
229
|
+
line-height: 1.15;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.markdown h1 {
|
|
233
|
+
font-size: 28px;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.markdown h2 {
|
|
237
|
+
font-size: 22px;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.markdown h3 {
|
|
241
|
+
font-size: 18px;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.markdown code {
|
|
245
|
+
padding: 0.15em 0.4em;
|
|
246
|
+
border-radius: 6px;
|
|
247
|
+
background: var(--surface-2);
|
|
248
|
+
border: 1px solid var(--line);
|
|
249
|
+
font-family: "SFMono-Regular", "SF Mono", Consolas, monospace;
|
|
250
|
+
font-size: 0.92em;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.markdown pre code {
|
|
254
|
+
display: block;
|
|
255
|
+
padding: 0;
|
|
256
|
+
border: 0;
|
|
257
|
+
background: transparent;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.markdown blockquote {
|
|
261
|
+
padding: 12px 16px;
|
|
262
|
+
border-left: 4px solid var(--accent);
|
|
263
|
+
background: #faf1e7;
|
|
264
|
+
color: var(--muted);
|
|
265
|
+
border-radius: 0 12px 12px 0;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.markdown a {
|
|
269
|
+
color: var(--accent);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.empty {
|
|
273
|
+
color: var(--muted);
|
|
274
|
+
font-style: italic;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.status-details {
|
|
278
|
+
display: block;
|
|
279
|
+
font-size: 12px;
|
|
280
|
+
color: var(--muted);
|
|
281
|
+
margin-top: 2px;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.diagnostic-block {
|
|
285
|
+
padding: 14px;
|
|
286
|
+
border: 1px solid var(--bad);
|
|
287
|
+
border-radius: 14px;
|
|
288
|
+
background: #fdf2f2;
|
|
289
|
+
margin-bottom: 12px;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.diagnostic-block h3 {
|
|
293
|
+
color: var(--bad);
|
|
294
|
+
text-transform: uppercase;
|
|
295
|
+
font-size: 14px;
|
|
296
|
+
letter-spacing: 0.04em;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.stderr-excerpt {
|
|
300
|
+
font-size: 13px;
|
|
301
|
+
background: #fff0f0;
|
|
302
|
+
border-color: var(--bad);
|
|
303
|
+
max-height: 300px;
|
|
304
|
+
overflow-y: auto;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.log-paths {
|
|
308
|
+
display: flex;
|
|
309
|
+
flex-direction: column;
|
|
310
|
+
gap: 4px;
|
|
311
|
+
margin-top: 8px;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
.log-paths code {
|
|
315
|
+
font-size: 12px;
|
|
316
|
+
color: var(--muted);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
@media (max-width: 720px) {
|
|
320
|
+
main {
|
|
321
|
+
padding: 18px;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
</style>
|
|
325
|
+
</head>
|
|
326
|
+
<body>
|
|
327
|
+
<main>
|
|
328
|
+
<section class="hero">
|
|
329
|
+
<div>
|
|
330
|
+
<h1>__HEADING__</h1>
|
|
331
|
+
<p class="meta">__META__</p>
|
|
332
|
+
</div>
|
|
333
|
+
<div class="chips">__CHIPS__</div>
|
|
334
|
+
</section>
|
|
335
|
+
|
|
336
|
+
<section class="grid two">
|
|
337
|
+
<article class="card">
|
|
338
|
+
<h2>Judge Summary</h2>
|
|
339
|
+
<div class="markdown">__JUDGE_SUMMARY__</div>
|
|
340
|
+
</article>
|
|
341
|
+
<article class="card">
|
|
342
|
+
<h2>Stage Status</h2>
|
|
343
|
+
<div class="status-grid">__STATUS_ROWS__</div>
|
|
344
|
+
</article>
|
|
345
|
+
</section>
|
|
346
|
+
|
|
347
|
+
<section class="grid" style="display: __DIAGNOSTICS_DISPLAY__">
|
|
348
|
+
<article class="card">
|
|
349
|
+
<h2>Diagnostics</h2>
|
|
350
|
+
__DIAGNOSTICS_CONTENT__
|
|
351
|
+
</article>
|
|
352
|
+
</section>
|
|
353
|
+
|
|
354
|
+
<section class="grid">
|
|
355
|
+
<article class="card">
|
|
356
|
+
<h2>Candidate Findings</h2>
|
|
357
|
+
<table>
|
|
358
|
+
<thead>
|
|
359
|
+
<tr>
|
|
360
|
+
<th>Reviewer</th>
|
|
361
|
+
<th>Severity</th>
|
|
362
|
+
<th>Title</th>
|
|
363
|
+
<th>Confidence</th>
|
|
364
|
+
<th>Files</th>
|
|
365
|
+
</tr>
|
|
366
|
+
</thead>
|
|
367
|
+
<tbody>__CANDIDATE_ROWS__</tbody>
|
|
368
|
+
</table>
|
|
369
|
+
</article>
|
|
370
|
+
</section>
|
|
371
|
+
|
|
372
|
+
<section class="grid">
|
|
373
|
+
<article class="card">
|
|
374
|
+
<h2>Judge Verdict</h2>
|
|
375
|
+
<table>
|
|
376
|
+
<thead>
|
|
377
|
+
<tr>
|
|
378
|
+
<th>Status</th>
|
|
379
|
+
<th>Title</th>
|
|
380
|
+
<th>Reason</th>
|
|
381
|
+
<th>Priority</th>
|
|
382
|
+
</tr>
|
|
383
|
+
</thead>
|
|
384
|
+
<tbody>__VERDICT_ROWS__</tbody>
|
|
385
|
+
</table>
|
|
386
|
+
</article>
|
|
387
|
+
</section>
|
|
388
|
+
|
|
389
|
+
<section class="grid two">
|
|
390
|
+
<article class="card">
|
|
391
|
+
<h2>Claude Report</h2>
|
|
392
|
+
<div class="markdown">__CLAUDE_REPORT__</div>
|
|
393
|
+
</article>
|
|
394
|
+
<article class="card">
|
|
395
|
+
<h2>Codex Report</h2>
|
|
396
|
+
<div class="markdown">__CODEX_REPORT__</div>
|
|
397
|
+
</article>
|
|
398
|
+
</section>
|
|
399
|
+
</main>
|
|
400
|
+
</body>
|
|
401
|
+
</html>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# {{REVIEWER_NAME}} Review Export
|
|
2
|
+
|
|
3
|
+
You are the {{REVIEWER_NAME}} reviewer inside Review Council.
|
|
4
|
+
|
|
5
|
+
## Target
|
|
6
|
+
|
|
7
|
+
{{TARGET}}
|
|
8
|
+
|
|
9
|
+
## Review Identity
|
|
10
|
+
|
|
11
|
+
- Review ID: `{{REVIEW_ID}}`
|
|
12
|
+
- Run ID: `{{RUN_ID}}`
|
|
13
|
+
|
|
14
|
+
## Artifact Directory
|
|
15
|
+
|
|
16
|
+
{{ARTIFACT_DIR}}
|
|
17
|
+
|
|
18
|
+
## Required Behavior
|
|
19
|
+
|
|
20
|
+
- Review the target thoroughly: bugs, regressions, security issues, performance issues, architecture risks, and missing tests
|
|
21
|
+
- Do not create authoritative files in `todos/`
|
|
22
|
+
- Do not modify code unless explicitly asked elsewhere
|
|
23
|
+
- Keep all raw artifacts inside `{{ARTIFACT_DIR}}`
|
|
24
|
+
- Treat the explicit `review_id` as canonical. Every JSON artifact must include `review_id: "{{REVIEW_ID}}"` and `run_id: "{{RUN_ID}}"`.
|
|
25
|
+
|
|
26
|
+
## Required Outputs
|
|
27
|
+
|
|
28
|
+
1. Write a human-readable review to:
|
|
29
|
+
`{{ARTIFACT_DIR}}/report.md`
|
|
30
|
+
2. Write structured findings JSON matching:
|
|
31
|
+
`{{SCHEMA_PATH}}`
|
|
32
|
+
to:
|
|
33
|
+
`{{ARTIFACT_DIR}}/findings.json`
|
|
34
|
+
3. Write a completion sentinel to:
|
|
35
|
+
`{{ARTIFACT_DIR}}/done.json`
|
|
36
|
+
|
|
37
|
+
## done.json Shape
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"review_id": "{{REVIEW_ID}}",
|
|
42
|
+
"run_id": "{{RUN_ID}}",
|
|
43
|
+
"reviewer": "{{REVIEWER_NAME_LOWER}}",
|
|
44
|
+
"status": "complete",
|
|
45
|
+
"completed_at": "ISO-8601",
|
|
46
|
+
"finding_count": 0
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
If you find no issues, still write all three files with an empty `findings` array.
|