vibe-squire 2.0.0 → 2.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/dist/generated/prisma/browser.d.ts +1 -0
- package/dist/generated/prisma/client.d.ts +1 -0
- package/dist/generated/prisma/internal/class.d.ts +3 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/class.js.map +1 -1
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +85 -1
- package/dist/generated/prisma/internal/prismaNamespace.js +10 -2
- package/dist/generated/prisma/internal/prismaNamespace.js.map +1 -1
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +9 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +10 -2
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/generated/prisma/models/DeclinedPullRequest.d.ts +342 -0
- package/dist/generated/prisma/models/DeclinedPullRequest.js +3 -0
- package/dist/generated/prisma/models/DeclinedPullRequest.js.map +1 -0
- package/dist/generated/prisma/models/PollRun.d.ts +77 -1
- package/dist/generated/prisma/models.d.ts +1 -0
- package/dist/settings/core-settings-group.service.d.ts +2 -0
- package/dist/settings/core-settings.schema.d.ts +4 -0
- package/dist/settings/core-settings.schema.js +19 -14
- package/dist/settings/core-settings.schema.js.map +1 -1
- package/dist/settings/core-settings.service.d.ts +1 -0
- package/dist/settings/core-settings.service.js +3 -0
- package/dist/settings/core-settings.service.js.map +1 -1
- package/dist/sync/poll-cycle/ensure-issue-for-pr.d.ts +1 -0
- package/dist/sync/poll-cycle/ensure-issue-for-pr.js +9 -0
- package/dist/sync/poll-cycle/ensure-issue-for-pr.js.map +1 -1
- package/dist/sync/poll-cycle/ensure-issue-outcome.d.ts +4 -0
- package/dist/sync/poll-cycle/finalize-successful-poll-cycle.d.ts +2 -0
- package/dist/sync/poll-cycle/finalize-successful-poll-cycle.js +15 -4
- package/dist/sync/poll-cycle/finalize-successful-poll-cycle.js.map +1 -1
- package/dist/sync/poll-cycle/process-poll-candidates.d.ts +2 -0
- package/dist/sync/poll-cycle/process-poll-candidates.js +16 -0
- package/dist/sync/poll-cycle/process-poll-candidates.js.map +1 -1
- package/dist/sync/poll-cycle/reconcile-removed-sync-rows.js +14 -0
- package/dist/sync/poll-cycle/reconcile-removed-sync-rows.js.map +1 -1
- package/dist/sync/poll-run-decisions.d.ts +2 -0
- package/dist/sync/poll-run-decisions.js +2 -0
- package/dist/sync/poll-run-decisions.js.map +1 -1
- package/dist/sync/poll-run-history.service.d.ts +4 -0
- package/dist/sync/poll-run-history.service.js +2 -0
- package/dist/sync/poll-run-history.service.js.map +1 -1
- package/dist/sync/poll-run-labels.js +2 -0
- package/dist/sync/poll-run-labels.js.map +1 -1
- package/dist/sync/pr-triage.controller.d.ts +18 -0
- package/dist/sync/pr-triage.controller.js +121 -0
- package/dist/sync/pr-triage.controller.js.map +1 -0
- package/dist/sync/pr-triage.service.d.ts +22 -0
- package/dist/sync/pr-triage.service.js +132 -0
- package/dist/sync/pr-triage.service.js.map +1 -0
- package/dist/sync/run-poll-cycle.service.js +6 -1
- package/dist/sync/run-poll-cycle.service.js.map +1 -1
- package/dist/sync/sync.module.js +4 -1
- package/dist/sync/sync.module.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/ui/activity-api.controller.d.ts +2 -0
- package/dist/ui/public/operator-activity.js +103 -3
- package/dist/ui/public/operator.css +15 -0
- package/dist/ui/ui-presenter.d.ts +2 -0
- package/dist/ui/ui-presenter.js +2 -0
- package/dist/ui/ui-presenter.js.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20260406120000_triage_mode/migration.sql +13 -0
- package/prisma/schema.prisma +10 -1
|
@@ -20,6 +20,8 @@ export declare class ActivityApiController {
|
|
|
20
20
|
skippedBoardLimit: number | null;
|
|
21
21
|
skippedAlreadyTracked: number | null;
|
|
22
22
|
skippedLinkedExisting: number | null;
|
|
23
|
+
skippedTriage: number | null;
|
|
24
|
+
skippedDeclined: number | null;
|
|
23
25
|
itemCount: number;
|
|
24
26
|
items: Array<{
|
|
25
27
|
prUrl: string;
|
|
@@ -13,9 +13,60 @@
|
|
|
13
13
|
return v == null ? '—' : String(v);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
var TRIAGEABLE_DECISIONS = {
|
|
17
|
+
skipped_triage: true,
|
|
18
|
+
skipped_board_limit: true,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
function isTriageable(decision) {
|
|
22
|
+
return TRIAGEABLE_DECISIONS[decision] === true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function triageSortKey(it) {
|
|
26
|
+
if (isTriageable(it.decision)) return 0;
|
|
27
|
+
if (it.decision === 'skipped_declined') return 1;
|
|
28
|
+
return 2;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function sortItemsForTriage(items) {
|
|
32
|
+
return items.slice().sort(function (a, b) {
|
|
33
|
+
var ka = triageSortKey(a);
|
|
34
|
+
var kb = triageSortKey(b);
|
|
35
|
+
if (ka !== kb) return ka - kb;
|
|
36
|
+
return (a.prNumber || 0) - (b.prNumber || 0);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function triageActionButtons(it) {
|
|
41
|
+
var url = esc(it.prUrl);
|
|
42
|
+
if (isTriageable(it.decision)) {
|
|
43
|
+
return (
|
|
44
|
+
'<div class="triage-actions" style="margin-top:0.3rem">' +
|
|
45
|
+
'<button class="btn btn-sm primary js-triage-accept" data-pr-url="' +
|
|
46
|
+
url +
|
|
47
|
+
'">Review</button> ' +
|
|
48
|
+
'<button class="btn btn-sm ghost js-triage-decline" data-pr-url="' +
|
|
49
|
+
url +
|
|
50
|
+
'">Decline</button>' +
|
|
51
|
+
'</div>'
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
if (it.decision === 'skipped_declined') {
|
|
55
|
+
return (
|
|
56
|
+
'<div class="triage-actions" style="margin-top:0.3rem">' +
|
|
57
|
+
'<button class="btn btn-sm ghost js-triage-reconsider" data-pr-url="' +
|
|
58
|
+
url +
|
|
59
|
+
'">Reconsider</button>' +
|
|
60
|
+
'</div>'
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
|
|
16
66
|
function renderItemsTable(items) {
|
|
17
67
|
if (!items || !items.length) return '';
|
|
18
|
-
var
|
|
68
|
+
var sorted = sortItemsForTriage(items);
|
|
69
|
+
var rows = sorted
|
|
19
70
|
.map(function (it) {
|
|
20
71
|
var detailParts = [];
|
|
21
72
|
if (it.kanbanIssueId) {
|
|
@@ -35,8 +86,15 @@
|
|
|
35
86
|
'<div class="muted" style="font-size:0.8rem">@' +
|
|
36
87
|
esc(it.authorLogin) +
|
|
37
88
|
'</div>';
|
|
89
|
+
var rowClass = isTriageable(it.decision)
|
|
90
|
+
? ' class="triage-pending-row"'
|
|
91
|
+
: it.decision === 'skipped_declined'
|
|
92
|
+
? ' class="triage-declined-row"'
|
|
93
|
+
: '';
|
|
38
94
|
return (
|
|
39
|
-
'<tr
|
|
95
|
+
'<tr' +
|
|
96
|
+
rowClass +
|
|
97
|
+
'>' +
|
|
40
98
|
'<td class="mono">' +
|
|
41
99
|
'<a href="' +
|
|
42
100
|
esc(it.prUrl) +
|
|
@@ -53,6 +111,7 @@
|
|
|
53
111
|
'</td>' +
|
|
54
112
|
'<td>' +
|
|
55
113
|
esc(it.decisionLabel) +
|
|
114
|
+
triageActionButtons(it) +
|
|
56
115
|
'</td>' +
|
|
57
116
|
'<td class="wrap muted">' +
|
|
58
117
|
detail +
|
|
@@ -113,7 +172,14 @@
|
|
|
113
172
|
fmtCount(r.skippedAlreadyTracked) +
|
|
114
173
|
' already tracked · ' +
|
|
115
174
|
fmtCount(r.skippedLinkedExisting) +
|
|
116
|
-
' linked existing
|
|
175
|
+
' linked existing' +
|
|
176
|
+
(r.skippedTriage
|
|
177
|
+
? ' · ' + fmtCount(r.skippedTriage) + ' pending triage'
|
|
178
|
+
: '') +
|
|
179
|
+
(r.skippedDeclined
|
|
180
|
+
? ' · ' + fmtCount(r.skippedDeclined) + ' declined'
|
|
181
|
+
: '') +
|
|
182
|
+
'</p>';
|
|
117
183
|
}
|
|
118
184
|
if (r.phase === 'aborted') {
|
|
119
185
|
summaryBody +=
|
|
@@ -215,6 +281,40 @@
|
|
|
215
281
|
}
|
|
216
282
|
}
|
|
217
283
|
|
|
284
|
+
function triageAction(endpoint, prUrl, btn) {
|
|
285
|
+
btn.disabled = true;
|
|
286
|
+
fetch('/api/pr/' + endpoint, {
|
|
287
|
+
method: 'POST',
|
|
288
|
+
headers: { 'Content-Type': 'application/json' },
|
|
289
|
+
body: JSON.stringify({ prUrl: prUrl }),
|
|
290
|
+
})
|
|
291
|
+
.then(function (res) {
|
|
292
|
+
if (!res.ok) throw new Error('HTTP ' + res.status);
|
|
293
|
+
void load();
|
|
294
|
+
})
|
|
295
|
+
.catch(function () {
|
|
296
|
+
btn.disabled = false;
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
root.addEventListener('click', function (e) {
|
|
301
|
+
var btn = e.target.closest('.js-triage-accept');
|
|
302
|
+
if (btn) {
|
|
303
|
+
triageAction('accept', btn.getAttribute('data-pr-url'), btn);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
btn = e.target.closest('.js-triage-decline');
|
|
307
|
+
if (btn) {
|
|
308
|
+
triageAction('decline', btn.getAttribute('data-pr-url'), btn);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
btn = e.target.closest('.js-triage-reconsider');
|
|
312
|
+
if (btn) {
|
|
313
|
+
triageAction('reconsider', btn.getAttribute('data-pr-url'), btn);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
|
|
218
318
|
Ui.onStatusSnapshot(function () {
|
|
219
319
|
void load();
|
|
220
320
|
});
|
|
@@ -704,3 +704,18 @@ textarea.input {
|
|
|
704
704
|
margin-top: 0.2rem;
|
|
705
705
|
max-width: 28rem;
|
|
706
706
|
}
|
|
707
|
+
|
|
708
|
+
/* Triage rows */
|
|
709
|
+
.triage-pending-row {
|
|
710
|
+
background: rgba(61, 159, 122, 0.06);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
.triage-declined-row {
|
|
714
|
+
opacity: 0.55;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
.triage-actions {
|
|
718
|
+
display: flex;
|
|
719
|
+
gap: 0.35rem;
|
|
720
|
+
flex-wrap: wrap;
|
|
721
|
+
}
|
|
@@ -19,6 +19,8 @@ export declare function presentActivityRunsForView(rows: PollRunRowForActivity[]
|
|
|
19
19
|
skippedBoardLimit: number | null;
|
|
20
20
|
skippedAlreadyTracked: number | null;
|
|
21
21
|
skippedLinkedExisting: number | null;
|
|
22
|
+
skippedTriage: number | null;
|
|
23
|
+
skippedDeclined: number | null;
|
|
22
24
|
itemCount: number;
|
|
23
25
|
items: Array<{
|
|
24
26
|
prUrl: string;
|
package/dist/ui/ui-presenter.js
CHANGED
|
@@ -36,6 +36,8 @@ function presentActivityRunsForView(rows) {
|
|
|
36
36
|
skippedBoardLimit: r.skippedBoardLimit,
|
|
37
37
|
skippedAlreadyTracked: r.skippedAlreadyTracked,
|
|
38
38
|
skippedLinkedExisting: r.skippedLinkedExisting,
|
|
39
|
+
skippedTriage: r.skippedTriage,
|
|
40
|
+
skippedDeclined: r.skippedDeclined,
|
|
39
41
|
itemCount: r.items.length,
|
|
40
42
|
items: r.items.map((i) => ({
|
|
41
43
|
prUrl: i.prUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-presenter.js","sourceRoot":"","sources":["../../src/ui/ui-presenter.ts"],"names":[],"mappings":";;;AAiBA,
|
|
1
|
+
{"version":3,"file":"ui-presenter.js","sourceRoot":"","sources":["../../src/ui/ui-presenter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "DeclinedPullRequest" (
|
|
3
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
4
|
+
"prUrl" TEXT NOT NULL,
|
|
5
|
+
"declinedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
6
|
+
);
|
|
7
|
+
|
|
8
|
+
-- CreateIndex
|
|
9
|
+
CREATE UNIQUE INDEX "DeclinedPullRequest_prUrl_key" ON "DeclinedPullRequest"("prUrl");
|
|
10
|
+
|
|
11
|
+
-- AlterTable: add triage counters to PollRun
|
|
12
|
+
ALTER TABLE "PollRun" ADD COLUMN "skippedTriage" INTEGER;
|
|
13
|
+
ALTER TABLE "PollRun" ADD COLUMN "skippedDeclined" INTEGER;
|
package/prisma/schema.prisma
CHANGED
|
@@ -60,6 +60,8 @@ model PollRun {
|
|
|
60
60
|
skippedBoardLimit Int?
|
|
61
61
|
skippedAlreadyTracked Int?
|
|
62
62
|
skippedLinkedExisting Int?
|
|
63
|
+
skippedTriage Int?
|
|
64
|
+
skippedDeclined Int?
|
|
63
65
|
items PollRunItem[]
|
|
64
66
|
|
|
65
67
|
@@index([startedAt(sort: Desc)])
|
|
@@ -75,7 +77,7 @@ model PollRunItem {
|
|
|
75
77
|
prNumber Int
|
|
76
78
|
prTitle String
|
|
77
79
|
authorLogin String?
|
|
78
|
-
/// created | already_tracked | linked_existing | skipped_unmapped | skipped_bot | skipped_board_limit
|
|
80
|
+
/// created | already_tracked | linked_existing | skipped_unmapped | skipped_bot | skipped_board_limit | skipped_triage | skipped_declined
|
|
79
81
|
decision String
|
|
80
82
|
detail String?
|
|
81
83
|
kanbanIssueId String?
|
|
@@ -83,6 +85,13 @@ model PollRunItem {
|
|
|
83
85
|
@@index([runId])
|
|
84
86
|
}
|
|
85
87
|
|
|
88
|
+
/// PRs the operator explicitly declined in triage mode (suppressed until PR leaves scout results).
|
|
89
|
+
model DeclinedPullRequest {
|
|
90
|
+
id String @id @default(cuid())
|
|
91
|
+
prUrl String @unique
|
|
92
|
+
declinedAt DateTime @default(now())
|
|
93
|
+
}
|
|
94
|
+
|
|
86
95
|
/// Tracks Kanban issues created for a GitHub PR (dedupe + reconciliation when PR leaves review queue).
|
|
87
96
|
model SyncedPullRequest {
|
|
88
97
|
id String @id @default(cuid())
|