@vintasoftware/pr-review-canvas 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 (157) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +192 -0
  3. package/bin/pr-review.mjs +5 -0
  4. package/docs/reference.md +340 -0
  5. package/package.json +74 -0
  6. package/pr-review.config.example.yml +68 -0
  7. package/prompts/chat-seed.md +64 -0
  8. package/prompts/generation-format.md +255 -0
  9. package/prompts/generation-strict.md +34 -0
  10. package/prompts/generation-surfacing.md +67 -0
  11. package/prompts/layers-default.md +13 -0
  12. package/prompts/quality-standards.md +32 -0
  13. package/skills/pr-review-canvas/SKILL.md +177 -0
  14. package/src/acpx/acpx.ts +530 -0
  15. package/src/acpx/agents.ts +85 -0
  16. package/src/acpx/events.ts +216 -0
  17. package/src/acpx/ndjson.ts +69 -0
  18. package/src/acpx/preflight.ts +44 -0
  19. package/src/canvas/export.ts +95 -0
  20. package/src/canvas/import.ts +138 -0
  21. package/src/canvas/name.ts +55 -0
  22. package/src/canvas/zip.ts +123 -0
  23. package/src/chat/chat-manager.ts +389 -0
  24. package/src/chat/context.ts +160 -0
  25. package/src/chat/seed.ts +71 -0
  26. package/src/chat/threads.ts +114 -0
  27. package/src/cli.ts +199 -0
  28. package/src/commands.ts +424 -0
  29. package/src/config.ts +142 -0
  30. package/src/contract/api.ts +190 -0
  31. package/src/contract/canvas-manifest.ts +29 -0
  32. package/src/contract/chat.ts +76 -0
  33. package/src/contract/comments.ts +96 -0
  34. package/src/contract/discovery.ts +20 -0
  35. package/src/contract/generation-context.ts +77 -0
  36. package/src/contract/keys.ts +14 -0
  37. package/src/contract/links.ts +5 -0
  38. package/src/contract/mermaid-fences.ts +4 -0
  39. package/src/contract/review-artifact.ts +324 -0
  40. package/src/contract/settings.ts +144 -0
  41. package/src/contract/state.ts +46 -0
  42. package/src/contract/validation.ts +43 -0
  43. package/src/git/diff-collector.ts +151 -0
  44. package/src/git/git.ts +115 -0
  45. package/src/git/lang.ts +1 -0
  46. package/src/git/materialize.ts +79 -0
  47. package/src/git/patch-lines.ts +60 -0
  48. package/src/github/attachments.ts +288 -0
  49. package/src/github/capabilities.ts +112 -0
  50. package/src/github/comments.ts +132 -0
  51. package/src/github/gh.ts +196 -0
  52. package/src/github/post-comment.ts +104 -0
  53. package/src/github/post-review.ts +44 -0
  54. package/src/github/pr.ts +133 -0
  55. package/src/github/review-body.ts +72 -0
  56. package/src/github/threads.ts +63 -0
  57. package/src/paths.ts +10 -0
  58. package/src/project-config.ts +219 -0
  59. package/src/prompt-files.ts +26 -0
  60. package/src/review/diagram-nodes.ts +227 -0
  61. package/src/review/doctor.ts +139 -0
  62. package/src/review/glob.ts +33 -0
  63. package/src/review/install-skill.ts +107 -0
  64. package/src/review/normalize.ts +209 -0
  65. package/src/review/prepare.ts +165 -0
  66. package/src/review/prompt.ts +233 -0
  67. package/src/review/publish.ts +209 -0
  68. package/src/review/skill-command.ts +4 -0
  69. package/src/review/test-paths.ts +32 -0
  70. package/src/review/text-length.ts +15 -0
  71. package/src/review/trim-caps.ts +114 -0
  72. package/src/review/validate-folds.ts +110 -0
  73. package/src/review/validate.ts +520 -0
  74. package/src/server/app.ts +46 -0
  75. package/src/server/bundle.ts +266 -0
  76. package/src/server/capped-body.ts +62 -0
  77. package/src/server/context.ts +174 -0
  78. package/src/server/env.ts +7 -0
  79. package/src/server/errors.ts +65 -0
  80. package/src/server/html.ts +140 -0
  81. package/src/server/node-server.ts +42 -0
  82. package/src/server/routes/api.ts +256 -0
  83. package/src/server/routes/chat-routes.ts +221 -0
  84. package/src/server/routes/pages.ts +64 -0
  85. package/src/server/routes/review-routes.ts +245 -0
  86. package/src/server/routes/static.ts +114 -0
  87. package/src/server/security.ts +104 -0
  88. package/src/server/sse.ts +67 -0
  89. package/src/store/atomic-json.ts +68 -0
  90. package/src/store/canvas-store.ts +120 -0
  91. package/src/store/data-dir.ts +29 -0
  92. package/src/store/derived-store.ts +93 -0
  93. package/src/store/pr-store.ts +69 -0
  94. package/src/store/settings-store.ts +152 -0
  95. package/src/store/state-store.ts +121 -0
  96. package/static/js/anchors.js +141 -0
  97. package/static/js/api.js +542 -0
  98. package/static/js/app.js +418 -0
  99. package/static/js/ask.js +35 -0
  100. package/static/js/chat-context.js +137 -0
  101. package/static/js/chat-scroll.js +114 -0
  102. package/static/js/chat.js +843 -0
  103. package/static/js/code-folds.js +200 -0
  104. package/static/js/commands.js +110 -0
  105. package/static/js/comment-link.js +37 -0
  106. package/static/js/composer.js +241 -0
  107. package/static/js/contract-types.d.ts +59 -0
  108. package/static/js/deep-link.js +160 -0
  109. package/static/js/diagram.js +582 -0
  110. package/static/js/diff-decorations.js +204 -0
  111. package/static/js/diff-renderer.js +860 -0
  112. package/static/js/dom.js +145 -0
  113. package/static/js/download.js +52 -0
  114. package/static/js/empty-state.js +161 -0
  115. package/static/js/errors.js +135 -0
  116. package/static/js/fences.js +90 -0
  117. package/static/js/header.js +134 -0
  118. package/static/js/hunks.js +62 -0
  119. package/static/js/import-zone.js +95 -0
  120. package/static/js/interactions.js +952 -0
  121. package/static/js/keyboard.js +131 -0
  122. package/static/js/keys.js +97 -0
  123. package/static/js/lang.js +54 -0
  124. package/static/js/layers.js +596 -0
  125. package/static/js/links.js +150 -0
  126. package/static/js/markdown.js +232 -0
  127. package/static/js/mermaid-fences.js +55 -0
  128. package/static/js/nav.js +91 -0
  129. package/static/js/overview.js +85 -0
  130. package/static/js/points.js +247 -0
  131. package/static/js/progress.js +49 -0
  132. package/static/js/proposed-comment.js +133 -0
  133. package/static/js/quick-questions.js +216 -0
  134. package/static/js/regenerate.js +69 -0
  135. package/static/js/review-session.js +257 -0
  136. package/static/js/scroll-spy.js +66 -0
  137. package/static/js/selection.js +193 -0
  138. package/static/js/settings.js +206 -0
  139. package/static/js/signoff.js +171 -0
  140. package/static/js/skin.js +56 -0
  141. package/static/js/store.js +35 -0
  142. package/static/js/theme.js +56 -0
  143. package/static/js/threads.js +78 -0
  144. package/static/js/vendor.d.ts +15 -0
  145. package/static/styles/base.css +223 -0
  146. package/static/styles/chat-tools.css +130 -0
  147. package/static/styles/chat.css +140 -0
  148. package/static/styles/commands.css +156 -0
  149. package/static/styles/diff.css +258 -0
  150. package/static/styles/header.css +114 -0
  151. package/static/styles/layout.css +123 -0
  152. package/static/styles/panels.css +152 -0
  153. package/static/styles/responsive.css +80 -0
  154. package/static/styles/review-actions.css +124 -0
  155. package/static/styles/review.css +473 -0
  156. package/static/styles/skin-github.css +356 -0
  157. package/static/styles.css +14 -0
@@ -0,0 +1,356 @@
1
+ /* ---- GitHub skin ----
2
+ Loaded last so it repaints the terminal skin without the component files knowing about it.
3
+ Everything here hangs off `[data-skin="github"]` on <html>, and every color goes through
4
+ light-dark(), so the light/dark theme keeps working the same way in both skins.
5
+
6
+ What changes: Primer colors, rounded corners, hairline borders, real buttons in place of the
7
+ [ bracket ] commands, and softer spacing. What does not change: where anything sits on the
8
+ page. Rules here only repaint and re-space.
9
+
10
+ Dark is GitHub's "dark dimmed": a softer grey-blue ground rather than the near-black one. */
11
+
12
+ :root[data-skin="github"] {
13
+ --r: 6px;
14
+ --gap: 16px;
15
+ --main-pad: 16px 16px 40px;
16
+
17
+ /* Structure. `--ink` is the border color the component files draw with, and `--shadow` is the
18
+ offset drop shadow: transparent turns every hard shadow off at once. */
19
+ --ink: light-dark(#d1d9e0, #3d444d);
20
+ --line: light-dark(#d1d9e0, #3d444d);
21
+ --shadow: transparent;
22
+
23
+ --bg: light-dark(#ffffff, #212830);
24
+ --panel: light-dark(#ffffff, #212830);
25
+ --panel-2: light-dark(#f6f8fa, #262c36);
26
+ --fg: light-dark(#1f2328, #d1d7e0);
27
+ --fg-muted: light-dark(#59636e, #9198a1);
28
+ --fg-dim: light-dark(#818b98, #9198a1);
29
+
30
+ --accent: light-dark(#0969da, #539bf5);
31
+ --accent-bg: light-dark(#ddf4ff, rgba(65, 132, 228, 0.15));
32
+ --purple: light-dark(#8250df, #986ee2);
33
+ --annot-bg: light-dark(#fbefff, rgba(152, 110, 226, 0.15));
34
+ --ok: light-dark(#1a7f37, #57ab5a);
35
+ --bad: light-dark(#d1242f, #e5534b);
36
+ --warn: light-dark(#9a6700, #c69026);
37
+ --warn-bg: light-dark(#fff8c5, rgba(174, 124, 20, 0.15));
38
+ --progress: light-dark(#1f883d, #57ab5a);
39
+
40
+ --sev-blocker: light-dark(#cf222e, #e5534b);
41
+ --sev-major: light-dark(#bf8700, #c69026);
42
+ --sev-minor: light-dark(#818b98, #636e7b);
43
+ --sq-mark: light-dark(#ffffff, #212830);
44
+
45
+ --add-bg: light-dark(#e6ffec, #263834);
46
+ --add-w: light-dark(#abf2bc, rgba(87, 171, 90, 0.4));
47
+ --del-bg: light-dark(#ffebe9, rgba(229, 83, 75, 0.15));
48
+ --del-w: light-dark(#ffc1c0, rgba(229, 83, 75, 0.4));
49
+ --mv-bg: light-dark(#fbefff, rgba(152, 110, 226, 0.1));
50
+ --hunk-bg: light-dark(#ddf4ff, #253142);
51
+
52
+ /* Buttons. GitHub's default button is a filled box with a hairline; the primary one is green. */
53
+ --btn-bg: light-dark(#f6f8fa, #2a313c);
54
+ --btn-bg-hover: light-dark(#eff2f5, #3d444d);
55
+ --btn-primary: light-dark(#1f883d, #347d39);
56
+ --btn-primary-hover: light-dark(#1a7f37, #46954a);
57
+ --btn-primary-fg: #ffffff;
58
+ --drop-shadow: light-dark(0 8px 24px rgba(66, 74, 83, 0.24), 0 8px 24px rgba(28, 33, 40, 0.85));
59
+
60
+ /* Syntax tokens: GitHub's own light and dark code colors. */
61
+ --syn-comment: light-dark(#59636e, #9198a1);
62
+ --syn-keyword: light-dark(#cf222e, #f47067);
63
+ --syn-string: light-dark(#0a3069, #96d0ff);
64
+ --syn-number: light-dark(#0550ae, #6cb6ff);
65
+ --syn-title: light-dark(#8250df, #dcbdfb);
66
+ --syn-type: light-dark(#953800, #f69d50);
67
+ --syn-attr: light-dark(#0550ae, #6cb6ff);
68
+ --syn-tag: light-dark(#116329, #8ddb8c);
69
+ --syn-meta: light-dark(#0550ae, #6cb6ff);
70
+ }
71
+
72
+ /* ---- Header ---- */
73
+ [data-skin="github"] .hdr-bar {
74
+ background: light-dark(#ffffff, #151b23);
75
+ }
76
+
77
+ [data-skin="github"] .brand {
78
+ text-transform: none;
79
+ letter-spacing: normal;
80
+ font-size: 14px;
81
+ align-items: center;
82
+ }
83
+ [data-skin="github"] .brand .box {
84
+ border-width: 1px;
85
+ border-radius: var(--r);
86
+ background: var(--panel-2);
87
+ padding: 3px 8px;
88
+ }
89
+ /* The rainbow bar becomes the hairline that runs under GitHub's page header. */
90
+ [data-skin="github"] .stripe {
91
+ height: 1px;
92
+ background: var(--ink);
93
+ }
94
+ [data-skin="github"] .hdr-actions {
95
+ gap: 8px;
96
+ align-items: center;
97
+ }
98
+ [data-skin="github"] .hdr-title {
99
+ padding-bottom: 16px;
100
+ }
101
+
102
+ /* ---- Commands ---- */
103
+ [data-skin="github"] .cmd::before,
104
+ [data-skin="github"] .cmd::after {
105
+ content: none;
106
+ }
107
+ [data-skin="github"] .cmd {
108
+ font-weight: 500;
109
+ }
110
+ /* The header's commands read as GitHub's toolbar buttons; commands inside the page stay links. */
111
+ [data-skin="github"] .hdr-actions .cmd {
112
+ padding: 3px 12px;
113
+ border: 1px solid var(--line);
114
+ border-radius: var(--r);
115
+ background: var(--btn-bg);
116
+ color: var(--fg);
117
+ font-size: 12px;
118
+ line-height: 20px;
119
+ }
120
+ [data-skin="github"] .hdr-actions .cmd:hover {
121
+ background: var(--btn-bg-hover);
122
+ text-decoration: none;
123
+ }
124
+ [data-skin="github"] .hdr-actions .cmd:disabled,
125
+ [data-skin="github"] .hdr-actions .cmd[aria-disabled="true"] {
126
+ color: var(--fg-dim);
127
+ }
128
+ [data-skin="github"] .cmd.fill,
129
+ [data-skin="github"] .cmd.big {
130
+ border: 1px solid transparent;
131
+ border-radius: var(--r);
132
+ background: var(--btn-primary);
133
+ color: var(--btn-primary-fg);
134
+ box-shadow: none;
135
+ padding: 5px 16px;
136
+ }
137
+ [data-skin="github"] .cmd.big {
138
+ padding: 8px 20px;
139
+ font-size: 14px;
140
+ }
141
+ [data-skin="github"] .cmd.fill:hover,
142
+ [data-skin="github"] .cmd.big:hover,
143
+ [data-skin="github"] .cmd.fill:active {
144
+ background: var(--btn-primary-hover);
145
+ transform: none;
146
+ box-shadow: none;
147
+ }
148
+ [data-skin="github"] .chat-composer .cmd.fill {
149
+ box-shadow: none;
150
+ }
151
+
152
+ /* ---- Pills: GitHub's rounded labels, with the state ones filled ---- */
153
+ [data-skin="github"] .pill {
154
+ border-radius: 2em;
155
+ padding: 0 8px;
156
+ font-size: 12px;
157
+ line-height: 20px;
158
+ border-color: var(--line);
159
+ }
160
+ [data-skin="github"] .pill.open,
161
+ [data-skin="github"] .pill.merged,
162
+ [data-skin="github"] .pill.closed,
163
+ [data-skin="github"] .pill.draft {
164
+ border-color: transparent;
165
+ color: #ffffff;
166
+ }
167
+ [data-skin="github"] .pill.open {
168
+ background: light-dark(#1f883d, #347d39);
169
+ }
170
+ [data-skin="github"] .pill.merged {
171
+ background: light-dark(#8250df, #8256d0);
172
+ }
173
+ [data-skin="github"] .pill.closed {
174
+ background: light-dark(#cf222e, #c93c37);
175
+ }
176
+ [data-skin="github"] .pill.draft {
177
+ background: light-dark(#6e7781, #636e7b);
178
+ }
179
+ [data-skin="github"] .pill.risk,
180
+ [data-skin="github"] .pill.kind,
181
+ [data-skin="github"] .pill.agent {
182
+ background: var(--panel-2);
183
+ color: var(--fg-muted);
184
+ font-weight: 500;
185
+ }
186
+ [data-skin="github"] .pill.test-tag {
187
+ background: var(--accent-bg);
188
+ color: var(--accent);
189
+ border-color: transparent;
190
+ text-transform: none;
191
+ letter-spacing: normal;
192
+ font-size: 11px;
193
+ }
194
+
195
+ /* ---- Cards ---- */
196
+ [data-skin="github"] .panel,
197
+ [data-skin="github"] .layer,
198
+ [data-skin="github"] .diagram {
199
+ border-radius: var(--r);
200
+ }
201
+ [data-skin="github"] .panel-h,
202
+ [data-skin="github"] .layer-h,
203
+ [data-skin="github"] .diagram-h {
204
+ border-radius: calc(var(--r) - 1px) calc(var(--r) - 1px) 0 0;
205
+ }
206
+ [data-skin="github"] .chev {
207
+ color: var(--fg-muted);
208
+ }
209
+ [data-skin="github"] .summary h3,
210
+ [data-skin="github"] .judgment .lbl,
211
+ [data-skin="github"] .role,
212
+ [data-skin="github"] .diff th {
213
+ text-transform: none;
214
+ letter-spacing: normal;
215
+ }
216
+ [data-skin="github"] .summary h3 {
217
+ font-size: 14px;
218
+ color: var(--fg);
219
+ }
220
+ [data-skin="github"] .prose ul {
221
+ list-style: disc;
222
+ }
223
+ [data-skin="github"] .sq {
224
+ border-radius: 2px;
225
+ }
226
+ [data-skin="github"] .sevsum > .legend {
227
+ border-radius: var(--r);
228
+ box-shadow: var(--drop-shadow);
229
+ }
230
+ /* GitHub draws progress as a filled track rather than a hairline. */
231
+ [data-skin="github"] .pline {
232
+ background: var(--line);
233
+ border-radius: var(--r);
234
+ }
235
+ [data-skin="github"] .pline span {
236
+ border-radius: var(--r);
237
+ }
238
+
239
+ /* ---- Rail ---- */
240
+ [data-skin="github"] .tree a {
241
+ margin: 0 8px;
242
+ padding: 6px 8px;
243
+ border-radius: var(--r);
244
+ }
245
+ [data-skin="github"] .tree .layers a {
246
+ padding-left: 20px;
247
+ }
248
+ [data-skin="github"] .tree a[aria-current] {
249
+ background: var(--accent-bg);
250
+ box-shadow: inset 3px 0 0 var(--accent);
251
+ }
252
+
253
+ /* ---- Diff ---- */
254
+ [data-skin="github"] .plus {
255
+ border: 0;
256
+ border-radius: var(--r);
257
+ background: var(--accent);
258
+ color: #ffffff;
259
+ }
260
+ [data-skin="github"] .av {
261
+ border-radius: 50%;
262
+ border-color: var(--line);
263
+ background: var(--panel-2);
264
+ }
265
+ [data-skin="github"] tr.hunk td {
266
+ color: light-dark(#0550ae, #9198a1);
267
+ }
268
+
269
+ [data-skin="github"] .diff .ln {
270
+ border-right-color: light-dark(#d1d9e0, transparent);
271
+ }
272
+ [data-skin="github"] tr.add .ln {
273
+ background: light-dark(#e6ffec, #31503d);
274
+ color: light-dark(#818b98, #d1d7e0);
275
+ }
276
+ [data-skin="github"] tr.del .ln {
277
+ background: light-dark(#ffebe9, rgba(229, 83, 75, 0.3));
278
+ color: light-dark(#818b98, #d1d7e0);
279
+ }
280
+
281
+ /* ---- Boxes, menus, and overlays ---- */
282
+ [data-skin="github"] code,
283
+ [data-skin="github"] .snip,
284
+ [data-skin="github"] .ctx-chip,
285
+ [data-skin="github"] .diagram-src,
286
+ [data-skin="github"] .cmdbox code,
287
+ [data-skin="github"] .notice,
288
+ [data-skin="github"] .callout,
289
+ [data-skin="github"] .stale-bar,
290
+ [data-skin="github"] .proposed,
291
+ [data-skin="github"] .proposed-invalid,
292
+ [data-skin="github"] .drop,
293
+ [data-skin="github"] .prose pre,
294
+ [data-skin="github"] dialog.settings .panel-ro {
295
+ border-radius: var(--r);
296
+ }
297
+ [data-skin="github"] code {
298
+ border: 0;
299
+ background: light-dark(rgba(129, 139, 152, 0.2), rgba(99, 110, 123, 0.4));
300
+ padding: 0.2em 0.4em;
301
+ }
302
+ [data-skin="github"] .cmdbox code,
303
+ [data-skin="github"] .diagram-src {
304
+ background: var(--panel-2);
305
+ border: 1px solid var(--line);
306
+ }
307
+ [data-skin="github"] .drop {
308
+ border-width: 1px;
309
+ background: var(--panel-2);
310
+ }
311
+ [data-skin="github"] .drop:hover,
312
+ [data-skin="github"] .drop.over {
313
+ transform: none;
314
+ background: var(--accent-bg);
315
+ }
316
+ [data-skin="github"] .proposed,
317
+ [data-skin="github"] .cmd.unseen,
318
+ [data-skin="github"] .qq-menu {
319
+ border-width: 1px;
320
+ }
321
+ [data-skin="github"] .cmd.unseen,
322
+ [data-skin="github"] .qq-menu,
323
+ [data-skin="github"] .toast {
324
+ border-radius: var(--r);
325
+ box-shadow: var(--drop-shadow);
326
+ }
327
+ [data-skin="github"] select,
328
+ [data-skin="github"] input,
329
+ [data-skin="github"] textarea,
330
+ [data-skin="github"] .composer-box textarea,
331
+ [data-skin="github"] dialog.signoff-dialog textarea {
332
+ border-width: 1px;
333
+ border-color: var(--line);
334
+ border-radius: var(--r);
335
+ padding: 5px 12px;
336
+ }
337
+ [data-skin="github"] dialog {
338
+ border-width: 1px;
339
+ border-color: var(--line);
340
+ border-radius: 12px;
341
+ box-shadow: var(--drop-shadow);
342
+ }
343
+ [data-skin="github"] dialog::backdrop {
344
+ background: rgba(28, 33, 40, 0.6);
345
+ }
346
+
347
+ @media (max-width: 1000px) {
348
+ /* The rail is a strip of chips at this width; the current one is underlined, not filled. */
349
+ [data-skin="github"] .tree a {
350
+ margin: 0;
351
+ border-radius: var(--r);
352
+ }
353
+ [data-skin="github"] .tree a[aria-current] {
354
+ box-shadow: inset 0 -3px 0 var(--accent);
355
+ }
356
+ }
@@ -0,0 +1,14 @@
1
+ /* Keep this order: shared styles, components, responsive rules, interaction controls, and the
2
+ github skin last, because it repaints the rules above it. */
3
+ @import "./styles/base.css";
4
+ @import "./styles/commands.css";
5
+ @import "./styles/header.css";
6
+ @import "./styles/layout.css";
7
+ @import "./styles/review.css";
8
+ @import "./styles/diff.css";
9
+ @import "./styles/chat.css";
10
+ @import "./styles/panels.css";
11
+ @import "./styles/responsive.css";
12
+ @import "./styles/review-actions.css";
13
+ @import "./styles/chat-tools.css";
14
+ @import "./styles/skin-github.css";