@renaiss-shipflow/cli 0.10.0 → 0.11.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/client.d.ts +19 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +3 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/git-identity.d.ts +3 -0
- package/dist/commands/git-identity.d.ts.map +1 -0
- package/dist/commands/git-identity.js +77 -0
- package/dist/commands/git-identity.js.map +1 -0
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +49 -6
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +16 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +107 -3
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/stats.d.ts +7 -0
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +48 -1
- package/dist/commands/stats.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/escalation-format.d.ts +35 -2
- package/dist/escalation-format.d.ts.map +1 -1
- package/dist/escalation-format.js +81 -4
- package/dist/escalation-format.js.map +1 -1
- package/dist/gh.d.ts +40 -1
- package/dist/gh.d.ts.map +1 -1
- package/dist/gh.js +88 -3
- package/dist/gh.js.map +1 -1
- package/dist/git-local.d.ts +4 -0
- package/dist/git-local.d.ts.map +1 -1
- package/dist/git-local.js +37 -0
- package/dist/git-local.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/packet.d.ts +35 -1
- package/dist/packet.d.ts.map +1 -1
- package/dist/packet.js +91 -1
- package/dist/packet.js.map +1 -1
- package/dist/review-contract.d.ts +59 -0
- package/dist/review-contract.d.ts.map +1 -0
- package/dist/review-contract.js +129 -0
- package/dist/review-contract.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** Unified verdict vocabulary. The loop reviewer's `approve`/`request_changes`/
|
|
2
|
+
* `reject` plus the server's advisory `comment`. */
|
|
3
|
+
export type Verdict = "approve" | "comment" | "request_changes" | "reject";
|
|
4
|
+
/** Severity badge — byte-identical to the server's severityBadge(). */
|
|
5
|
+
export declare function severityBadge(severity: string): string;
|
|
6
|
+
/** CodeRabbit-style fix-size tag after the badge — mirrors the server. */
|
|
7
|
+
export declare function effortTag(effort?: string): string;
|
|
8
|
+
/** Verdict header, shared by the inline review body and any fallback comment. */
|
|
9
|
+
export declare function verdictHeader(verdict: Verdict): string;
|
|
10
|
+
export interface ReviewFinding {
|
|
11
|
+
path: string;
|
|
12
|
+
line: number;
|
|
13
|
+
severity: string;
|
|
14
|
+
issue: string;
|
|
15
|
+
why?: string;
|
|
16
|
+
fix?: string;
|
|
17
|
+
effort?: string;
|
|
18
|
+
suggestion?: string;
|
|
19
|
+
code?: string;
|
|
20
|
+
}
|
|
21
|
+
/** One finding's comment body — mirrors renderInlineFinding(): badge + effort +
|
|
22
|
+
* issue, why, fix, and a committable ```suggestion block when present. */
|
|
23
|
+
export declare function renderFindingBody(f: ReviewFinding): string;
|
|
24
|
+
/** Repo-relative path in one canonical shape: forward slashes, no leading
|
|
25
|
+
* "./". Applied to both diff keys and finding paths so `./src/x` / `src\\x`
|
|
26
|
+
* still anchor. NOT a filesystem realpath — diff paths aren't fs paths. */
|
|
27
|
+
export declare function normPath(p: string): string;
|
|
28
|
+
/** Map of path → set of new-file line numbers that GitHub will accept a
|
|
29
|
+
* RIGHT-side inline comment on (context + added lines). Mirrors the server's
|
|
30
|
+
* annotatePatch line numbering so a bad anchor can't 422 the whole review. */
|
|
31
|
+
export declare function diffAnchors(diff: string): Map<string, Set<number>>;
|
|
32
|
+
/** Partition findings into ones that anchor to a real diff line (postable
|
|
33
|
+
* inline) and ones that must fold into the summary body (bad line / file). */
|
|
34
|
+
export declare function splitAnchorable(findings: ReviewFinding[], anchors: Map<string, Set<number>>): {
|
|
35
|
+
inline: ReviewFinding[];
|
|
36
|
+
body: ReviewFinding[];
|
|
37
|
+
};
|
|
38
|
+
export interface ReviewComment {
|
|
39
|
+
path: string;
|
|
40
|
+
line: number;
|
|
41
|
+
side: "RIGHT";
|
|
42
|
+
body: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ReviewPayload {
|
|
45
|
+
event: "COMMENT";
|
|
46
|
+
body: string;
|
|
47
|
+
comments: ReviewComment[];
|
|
48
|
+
}
|
|
49
|
+
/** Build the GitHub "create review" payload: a COMMENT-event review (ShipFlow
|
|
50
|
+
* reviews are advisory — approval authority stays with the label gate, so the
|
|
51
|
+
* event is never APPROVE/REQUEST_CHANGES; the verdict lives in the header),
|
|
52
|
+
* with on-diff findings as inline comments and the rest folded into the body. */
|
|
53
|
+
export declare function buildReviewPayload(opts: {
|
|
54
|
+
summary: string;
|
|
55
|
+
verdict: Verdict;
|
|
56
|
+
findings: ReviewFinding[];
|
|
57
|
+
anchors: Map<string, Set<number>>;
|
|
58
|
+
}): ReviewPayload;
|
|
59
|
+
//# sourceMappingURL=review-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-contract.d.ts","sourceRoot":"","sources":["../src/review-contract.ts"],"names":[],"mappings":"AAKA;qDACqD;AACrD,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AAE3E,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAOtD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID;2EAC2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAS1D;AAED;;4EAE4E;AAC5E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1C;AAKD;;+EAE+E;AAC/E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAkBlE;AAED;+EAC+E;AAC/E,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAChC;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,IAAI,EAAE,aAAa,EAAE,CAAA;CAAE,CAQpD;AAED,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAC3F,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAAE;AAE7F;;;kFAGkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACnC,GAAG,aAAa,CAqBhB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Canonical review contract shared by the loop reviewer (this CLI) — the
|
|
2
|
+
// single source of truth for verdict vocabulary, severity badges, finding
|
|
3
|
+
// rendering, and diff anchoring, mirroring the server's runner_pr_review.go so
|
|
4
|
+
// the two reviewers post CONSISTENTLY (epic #96). Pure + testable; no I/O.
|
|
5
|
+
/** Severity badge — byte-identical to the server's severityBadge(). */
|
|
6
|
+
export function severityBadge(severity) {
|
|
7
|
+
switch (severity.trim().toLowerCase()) {
|
|
8
|
+
case "critical": return "🔴 **critical**";
|
|
9
|
+
case "high": return "🟠 **high**";
|
|
10
|
+
case "low": return "🔵 **low**";
|
|
11
|
+
default: return "🟡 **medium**";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** CodeRabbit-style fix-size tag after the badge — mirrors the server. */
|
|
15
|
+
export function effortTag(effort) {
|
|
16
|
+
switch ((effort ?? "").trim().toLowerCase()) {
|
|
17
|
+
case "quick": return " · ⚡ quick fix";
|
|
18
|
+
case "involved": return " · 🔨 involved";
|
|
19
|
+
default: return "";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Verdict header, shared by the inline review body and any fallback comment. */
|
|
23
|
+
export function verdictHeader(verdict) {
|
|
24
|
+
switch (verdict) {
|
|
25
|
+
case "approve": return "**✅ APPROVE — ShipFlow review**";
|
|
26
|
+
case "request_changes": return "**🔴 CHANGES REQUESTED — ShipFlow review**";
|
|
27
|
+
case "reject": return "**⛔ REJECT — ShipFlow review**";
|
|
28
|
+
default: return "**💬 ShipFlow review — comments**";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const REVIEW_MARKER = "<!-- shipflow:loop-review -->";
|
|
32
|
+
/** One finding's comment body — mirrors renderInlineFinding(): badge + effort +
|
|
33
|
+
* issue, why, fix, and a committable ```suggestion block when present. */
|
|
34
|
+
export function renderFindingBody(f) {
|
|
35
|
+
let b = `${severityBadge(f.severity)}${effortTag(f.effort)} ${f.issue}`;
|
|
36
|
+
if (f.why?.trim())
|
|
37
|
+
b += `\n\n${f.why.trim()}`;
|
|
38
|
+
if (f.fix?.trim())
|
|
39
|
+
b += `\n\n**Fix:** ${f.fix.trim()}`;
|
|
40
|
+
const sug = (f.suggestion ?? "").replace(/\n+$/, "");
|
|
41
|
+
const code = (f.code ?? "").replace(/\n+$/, "");
|
|
42
|
+
if (sug.trim())
|
|
43
|
+
b += `\n\`\`\`suggestion\n${sug}\n\`\`\``;
|
|
44
|
+
else if (code.trim())
|
|
45
|
+
b += `\n\`\`\`\n${code}\n\`\`\``;
|
|
46
|
+
return `${b}\n\n${REVIEW_MARKER}`;
|
|
47
|
+
}
|
|
48
|
+
/** Repo-relative path in one canonical shape: forward slashes, no leading
|
|
49
|
+
* "./". Applied to both diff keys and finding paths so `./src/x` / `src\\x`
|
|
50
|
+
* still anchor. NOT a filesystem realpath — diff paths aren't fs paths. */
|
|
51
|
+
export function normPath(p) {
|
|
52
|
+
return p.replace(/\\/g, "/").replace(/^\.\//, "").trim();
|
|
53
|
+
}
|
|
54
|
+
const HUNK_RE = /^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/;
|
|
55
|
+
const FILE_RE = /^\+\+\+ b\/(.+)$/;
|
|
56
|
+
/** Map of path → set of new-file line numbers that GitHub will accept a
|
|
57
|
+
* RIGHT-side inline comment on (context + added lines). Mirrors the server's
|
|
58
|
+
* annotatePatch line numbering so a bad anchor can't 422 the whole review. */
|
|
59
|
+
export function diffAnchors(diff) {
|
|
60
|
+
const out = new Map();
|
|
61
|
+
let path = "";
|
|
62
|
+
let ln = 0;
|
|
63
|
+
for (const raw of diff.split(/\r?\n/)) {
|
|
64
|
+
const fm = FILE_RE.exec(raw);
|
|
65
|
+
if (fm) {
|
|
66
|
+
path = normPath(fm[1]);
|
|
67
|
+
ln = 0;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const hm = HUNK_RE.exec(raw);
|
|
71
|
+
if (hm) {
|
|
72
|
+
ln = parseInt(hm[1], 10);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (!path || ln === 0)
|
|
76
|
+
continue;
|
|
77
|
+
if (raw.startsWith("-"))
|
|
78
|
+
continue; // removed: no RIGHT-side line
|
|
79
|
+
if (raw.startsWith("+") || raw.startsWith(" ")) {
|
|
80
|
+
if (!out.has(path))
|
|
81
|
+
out.set(path, new Set());
|
|
82
|
+
out.get(path).add(ln);
|
|
83
|
+
ln++;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
/** Partition findings into ones that anchor to a real diff line (postable
|
|
89
|
+
* inline) and ones that must fold into the summary body (bad line / file). */
|
|
90
|
+
export function splitAnchorable(findings, anchors) {
|
|
91
|
+
const inline = [];
|
|
92
|
+
const body = [];
|
|
93
|
+
for (const f of findings) {
|
|
94
|
+
if (f.line > 0 && anchors.get(normPath(f.path))?.has(f.line))
|
|
95
|
+
inline.push(f);
|
|
96
|
+
else
|
|
97
|
+
body.push(f);
|
|
98
|
+
}
|
|
99
|
+
return { inline, body };
|
|
100
|
+
}
|
|
101
|
+
/** Build the GitHub "create review" payload: a COMMENT-event review (ShipFlow
|
|
102
|
+
* reviews are advisory — approval authority stays with the label gate, so the
|
|
103
|
+
* event is never APPROVE/REQUEST_CHANGES; the verdict lives in the header),
|
|
104
|
+
* with on-diff findings as inline comments and the rest folded into the body. */
|
|
105
|
+
export function buildReviewPayload(opts) {
|
|
106
|
+
const { inline, body: unanchored } = splitAnchorable(opts.findings, opts.anchors);
|
|
107
|
+
const lines = [verdictHeader(opts.verdict)];
|
|
108
|
+
if (opts.summary.trim())
|
|
109
|
+
lines.push("", opts.summary.trim());
|
|
110
|
+
if (unanchored.length) {
|
|
111
|
+
lines.push("", "**Further findings (outside the annotated diff lines):**");
|
|
112
|
+
for (const f of unanchored) {
|
|
113
|
+
const anchor = f.line > 0 ? `${f.path}:${f.line}` : f.path;
|
|
114
|
+
const fbLines = renderFindingBody(f).split("\n\n" + REVIEW_MARKER)[0].split("\n");
|
|
115
|
+
lines.push(`- \`${anchor}\` — ${fbLines[0]}`);
|
|
116
|
+
// Indent why/fix/suggestion continuation two spaces so GitHub keeps them
|
|
117
|
+
// nested under the bullet instead of rendering as top-level paragraphs.
|
|
118
|
+
for (let i = 1; i < fbLines.length; i++)
|
|
119
|
+
lines.push(fbLines[i] ? ` ${fbLines[i]}` : "");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
lines.push("", REVIEW_MARKER);
|
|
123
|
+
return {
|
|
124
|
+
event: "COMMENT",
|
|
125
|
+
body: lines.join("\n"),
|
|
126
|
+
comments: inline.map((f) => ({ path: f.path, line: f.line, side: "RIGHT", body: renderFindingBody(f) })),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=review-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-contract.js","sourceRoot":"","sources":["../src/review-contract.ts"],"names":[],"mappings":"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"}
|