@urateam/core 0.1.29 → 0.1.30
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/__tests__/executor/review-feedback-prompt.test.js +6 -0
- package/dist/__tests__/executor/review-feedback-prompt.test.js.map +1 -1
- package/dist/__tests__/github-webhook.test.js +36 -0
- package/dist/__tests__/github-webhook.test.js.map +1 -1
- package/dist/__tests__/pipeline/pr-change-summary.test.d.ts +2 -0
- package/dist/__tests__/pipeline/pr-change-summary.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/pr-change-summary.test.js +282 -0
- package/dist/__tests__/pipeline/pr-change-summary.test.js.map +1 -0
- package/dist/__tests__/types.test.js +57 -0
- package/dist/__tests__/types.test.js.map +1 -1
- package/dist/executor/prompt/templates.d.ts.map +1 -1
- package/dist/executor/prompt/templates.js +4 -0
- package/dist/executor/prompt/templates.js.map +1 -1
- package/dist/pipeline/pr-change-summary.d.ts +47 -0
- package/dist/pipeline/pr-change-summary.d.ts.map +1 -0
- package/dist/pipeline/pr-change-summary.js +133 -0
- package/dist/pipeline/pr-change-summary.js.map +1 -0
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +39 -0
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/webhook/github-handler.d.ts +2 -0
- package/dist/webhook/github-handler.d.ts.map +1 -1
- package/dist/webhook/github-handler.js +4 -0
- package/dist/webhook/github-handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { HandoffArtifact } from "../types.js";
|
|
2
|
+
import type { ReviewFeedbackComment } from "../webhook/github-handler.js";
|
|
3
|
+
import type { addPRComment } from "../repo/github.js";
|
|
4
|
+
import type { Logger } from "pino";
|
|
5
|
+
export interface ChangeSummaryInput {
|
|
6
|
+
handoff: HandoffArtifact;
|
|
7
|
+
run: {
|
|
8
|
+
id: string;
|
|
9
|
+
totalInputTokens: number;
|
|
10
|
+
totalOutputTokens: number;
|
|
11
|
+
};
|
|
12
|
+
triggeringComments: ReviewFeedbackComment[];
|
|
13
|
+
dashboardBaseUrl: string;
|
|
14
|
+
/** PR URL — used as the base for fallback comment URL construction. */
|
|
15
|
+
prUrl?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Render the markdown body of the per-PR change-summary comment. Pure
|
|
19
|
+
* function — no I/O, no GitHub calls.
|
|
20
|
+
*/
|
|
21
|
+
export declare function renderChangeSummary(input: ChangeSummaryInput): string;
|
|
22
|
+
/**
|
|
23
|
+
* Thin dispatcher called from runner.onPipelineComplete. Decides whether to
|
|
24
|
+
* post the change summary, builds the input, calls renderChangeSummary, and
|
|
25
|
+
* posts via addPRComment. Best-effort: any failure is logged at warn level
|
|
26
|
+
* and the function returns (no throw).
|
|
27
|
+
*/
|
|
28
|
+
export interface MaybePostChangeSummaryDeps {
|
|
29
|
+
run: {
|
|
30
|
+
id: string;
|
|
31
|
+
runType?: string | null;
|
|
32
|
+
prUrl?: string | null;
|
|
33
|
+
feedbackContext?: string | null;
|
|
34
|
+
totalInputTokens: number;
|
|
35
|
+
totalOutputTokens: number;
|
|
36
|
+
};
|
|
37
|
+
handoff: HandoffArtifact | null | undefined;
|
|
38
|
+
prNumber: number | null;
|
|
39
|
+
owner: string;
|
|
40
|
+
repo: string;
|
|
41
|
+
octokit: Parameters<typeof addPRComment>[0];
|
|
42
|
+
postPRComment: typeof addPRComment;
|
|
43
|
+
dashboardBaseUrl: string;
|
|
44
|
+
logger: Pick<Logger, "info" | "warn" | "error">;
|
|
45
|
+
}
|
|
46
|
+
export declare function maybePostChangeSummary(deps: MaybePostChangeSummaryDeps): Promise<void>;
|
|
47
|
+
//# sourceMappingURL=pr-change-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-change-summary.d.ts","sourceRoot":"","sources":["../../src/pipeline/pr-change-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAsCnC,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,CAAC;IACzB,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,kBAAkB,EAAE,qBAAqB,EAAE,CAAC;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CA0DrE;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,OAAO,YAAY,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACjD;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,IAAI,CAAC,CAgFf"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown-special characters escaped before rendering user-controlled
|
|
3
|
+
* strings (author names, file paths, comment bodies). Conservative — escapes
|
|
4
|
+
* anything that could affect markdown rendering.
|
|
5
|
+
*/
|
|
6
|
+
// `.` is omitted from the escape set: it is only markdown-special at the
|
|
7
|
+
// start of a line in ordered-list contexts (e.g. `1.`) — not in author
|
|
8
|
+
// names or file-paths rendered inline within link text.
|
|
9
|
+
function escapeMd(s) {
|
|
10
|
+
return s.replace(/[\\`*_{}\[\]()<>#+\-!|]/g, (ch) => `\\${ch}`);
|
|
11
|
+
}
|
|
12
|
+
/** Collapse all newlines (and runs of whitespace) into single spaces. */
|
|
13
|
+
function singleLine(s) {
|
|
14
|
+
return s.replace(/\s+/g, " ").trim();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build a comment-URL fallback when ReviewFeedbackComment.htmlUrl is missing.
|
|
18
|
+
* Inline review comments (have filePath) are anchored to the Files Changed
|
|
19
|
+
* tab via #discussion_rNNN; general PR comments use #issuecomment-NNN.
|
|
20
|
+
*
|
|
21
|
+
* The base PR URL must be supplied via input.prUrl. If absent, returns "".
|
|
22
|
+
*/
|
|
23
|
+
function buildCommentUrl(prUrl, comment) {
|
|
24
|
+
if (comment.htmlUrl)
|
|
25
|
+
return comment.htmlUrl;
|
|
26
|
+
if (!prUrl)
|
|
27
|
+
return "";
|
|
28
|
+
const anchor = comment.filePath
|
|
29
|
+
? `#discussion_r${comment.commentId}`
|
|
30
|
+
: `#issuecomment-${comment.commentId}`;
|
|
31
|
+
return `${prUrl}${anchor}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Render the markdown body of the per-PR change-summary comment. Pure
|
|
35
|
+
* function — no I/O, no GitHub calls.
|
|
36
|
+
*/
|
|
37
|
+
export function renderChangeSummary(input) {
|
|
38
|
+
const { handoff, run, triggeringComments, dashboardBaseUrl, prUrl } = input;
|
|
39
|
+
const summary = singleLine(handoff.summary);
|
|
40
|
+
const ctx = handoff.context;
|
|
41
|
+
const addressedById = new Map();
|
|
42
|
+
for (const ac of ctx.addressedComments ?? []) {
|
|
43
|
+
addressedById.set(ac.commentId, ac.response);
|
|
44
|
+
}
|
|
45
|
+
const responseLines = triggeringComments.map((c) => {
|
|
46
|
+
const url = buildCommentUrl(prUrl, c);
|
|
47
|
+
const linkText = c.filePath
|
|
48
|
+
? `@${escapeMd(c.author)}'s comment on \`${escapeMd(c.filePath)}${c.lineNumber !== undefined ? `:${c.lineNumber}` : ""}\``
|
|
49
|
+
: `@${escapeMd(c.author)}'s general comment`;
|
|
50
|
+
const link = url ? `[${linkText}](${url})` : linkText;
|
|
51
|
+
const response = addressedById.get(c.commentId);
|
|
52
|
+
// Agent-emitted responses are interpolated raw — they are pipeline-
|
|
53
|
+
// controlled output (not third-party user input) and may legitimately
|
|
54
|
+
// contain markdown formatting (e.g. backticks for code references).
|
|
55
|
+
// The agent prompt instructs ≤12 words per response, limiting injection
|
|
56
|
+
// surface. If we ever discover prompt-injection paths from PR comments
|
|
57
|
+
// that survive into `response`, revisit this decision.
|
|
58
|
+
return response ? `- ${link} — ${response}` : `- ${link}`;
|
|
59
|
+
});
|
|
60
|
+
// Show the fallback disclaimer when there are triggering comments but none
|
|
61
|
+
// with a matched response.
|
|
62
|
+
const hasAnyResponse = Array.isArray(ctx.addressedComments) &&
|
|
63
|
+
ctx.addressedComments.length > 0 &&
|
|
64
|
+
triggeringComments.some((c) => addressedById.has(c.commentId));
|
|
65
|
+
const fallbackLine = triggeringComments.length > 0 && !hasAnyResponse
|
|
66
|
+
? "\n_(per-comment responses unavailable; see diff)_"
|
|
67
|
+
: "";
|
|
68
|
+
const inResponseSection = triggeringComments.length > 0
|
|
69
|
+
? `\n**In response to:**\n${responseLines.join("\n")}${fallbackLine}\n`
|
|
70
|
+
: "";
|
|
71
|
+
// File paths rendered inside backtick code spans — no markdown escaping needed.
|
|
72
|
+
const filesSection = handoff.filesChanged.length > 0
|
|
73
|
+
? `\n**Files changed:**\n${handoff.filesChanged.map((f) => `- \`${f}\``).join("\n")}\n`
|
|
74
|
+
: "";
|
|
75
|
+
const runLink = dashboardBaseUrl
|
|
76
|
+
? `[${run.id}](${dashboardBaseUrl}/runs/${run.id})`
|
|
77
|
+
: run.id;
|
|
78
|
+
const footer = `\n<sub>Run ${runLink} · auto-generated</sub>`;
|
|
79
|
+
return `## 🤖 Addressed PR feedback\n\n${summary}\n${inResponseSection}${filesSection}${footer}`;
|
|
80
|
+
}
|
|
81
|
+
export async function maybePostChangeSummary(deps) {
|
|
82
|
+
const { run, handoff, prNumber, owner, repo, octokit, postPRComment, dashboardBaseUrl, logger, } = deps;
|
|
83
|
+
if (run.runType !== "review-feedback")
|
|
84
|
+
return;
|
|
85
|
+
if (!run.prUrl || prNumber === null) {
|
|
86
|
+
logger.info({ runId: run.id }, "skipped change summary: no PR URL on run");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (!handoff) {
|
|
90
|
+
logger.info({ runId: run.id }, "skipped change summary: no handoff persisted");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
let triggeringComments = [];
|
|
94
|
+
if (run.feedbackContext) {
|
|
95
|
+
try {
|
|
96
|
+
const parsed = JSON.parse(run.feedbackContext);
|
|
97
|
+
if (Array.isArray(parsed))
|
|
98
|
+
triggeringComments = parsed;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
logger.error({
|
|
102
|
+
runId: run.id,
|
|
103
|
+
err: err instanceof Error ? err.message : String(err),
|
|
104
|
+
}, "failed to parse feedback_context — posting degraded change summary");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
let body;
|
|
108
|
+
try {
|
|
109
|
+
body = renderChangeSummary({
|
|
110
|
+
handoff,
|
|
111
|
+
run: {
|
|
112
|
+
id: run.id,
|
|
113
|
+
totalInputTokens: run.totalInputTokens,
|
|
114
|
+
totalOutputTokens: run.totalOutputTokens,
|
|
115
|
+
},
|
|
116
|
+
triggeringComments,
|
|
117
|
+
dashboardBaseUrl,
|
|
118
|
+
prUrl: run.prUrl,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
logger.error({ runId: run.id, err: err instanceof Error ? err.message : String(err) }, "failed to render change summary — skipping post");
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
await postPRComment(octokit, owner, repo, prNumber, body);
|
|
127
|
+
logger.info({ runId: run.id, prNumber }, "posted PR change summary for review-feedback run");
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
logger.warn({ runId: run.id, prNumber, err: err instanceof Error ? err.message : String(err) }, "PR change summary post failed (non-fatal)");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=pr-change-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-change-summary.js","sourceRoot":"","sources":["../../src/pipeline/pr-change-summary.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,yEAAyE;AACzE,uEAAuE;AACvE,wDAAwD;AACxD,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,yEAAyE;AACzE,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CACtB,KAAyB,EACzB,OAA8B;IAE9B,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;QAC7B,CAAC,CAAC,gBAAgB,OAAO,CAAC,SAAS,EAAE;QACrC,CAAC,CAAC,iBAAiB,OAAO,CAAC,SAAS,EAAE,CAAC;IACzC,OAAO,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;AAC7B,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAE5E,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAC5B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QAC7C,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjD,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ;YACzB,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAC3D,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EACpD,IAAI;YACN,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,oEAAoE;QACpE,sEAAsE;QACtE,oEAAoE;QACpE,wEAAwE;QACxE,uEAAuE;QACvE,uDAAuD;QACvD,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,2BAA2B;IAC3B,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACpC,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAChC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjE,MAAM,YAAY,GAChB,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc;QAC9C,CAAC,CAAC,mDAAmD;QACrD,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,iBAAiB,GACrB,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,CAAC,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI;QACvE,CAAC,CAAC,EAAE,CAAC;IAET,gFAAgF;IAChF,MAAM,YAAY,GAChB,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QAC7B,CAAC,CAAC,yBAAyB,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACvF,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,OAAO,GAAG,gBAAgB;QAC9B,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,gBAAgB,SAAS,GAAG,CAAC,EAAE,GAAG;QACnD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACX,MAAM,MAAM,GAAG,cAAc,OAAO,yBAAyB,CAAC;IAE9D,OAAO,kCAAkC,OAAO,KAAK,iBAAiB,GAAG,YAAY,GAAG,MAAM,EAAE,CAAC;AACnG,CAAC;AA2BD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAgC;IAEhC,MAAM,EACJ,GAAG,EACH,OAAO,EACP,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,MAAM,GACP,GAAG,IAAI,CAAC;IAET,IAAI,GAAG,CAAC,OAAO,KAAK,iBAAiB;QAAE,OAAO;IAE9C,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,EACjB,0CAA0C,CAC3C,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,EACjB,8CAA8C,CAC/C,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,kBAAkB,GAA4B,EAAE,CAAC;IACrD,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAY,CAAC;YAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,kBAAkB,GAAG,MAAiC,CAAC;QACpF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CACV;gBACE,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACtD,EACD,oEAAoE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,mBAAmB,CAAC;YACzB,OAAO;YACP,GAAG,EAAE;gBACH,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;gBACtC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;aACzC;YACD,kBAAkB;YAClB,gBAAgB;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CACV,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACxE,iDAAiD,CAClD,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,EAC3B,kDAAkD,CACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAClF,2CAA2C,CAC5C,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAEV,QAAQ,EAGR,cAAc,EAId,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAS,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline/runner.js
CHANGED
|
@@ -12,6 +12,7 @@ import { postFanoutCommentsToPR } from "../executor/review/post-fanout-comments.
|
|
|
12
12
|
import { extractHandoff } from "../executor/extract-handoff.js";
|
|
13
13
|
import { DEFAULT_AGENT_CLAUDE_MD } from "../executor/agent-config.js";
|
|
14
14
|
import { generatePRDescription } from "./pr-description.js";
|
|
15
|
+
import { maybePostChangeSummary } from "./pr-change-summary.js";
|
|
15
16
|
import { access, writeFile, appendFile } from "node:fs/promises";
|
|
16
17
|
import { join, resolve } from "node:path";
|
|
17
18
|
import { homedir } from "node:os";
|
|
@@ -388,6 +389,7 @@ export class PipelineRunner {
|
|
|
388
389
|
const run = this.buildPipelineRun(runId, issue, pipelineKey, repoConfig, branch);
|
|
389
390
|
run.prUrl = prUrl;
|
|
390
391
|
run.runType = "review-feedback";
|
|
392
|
+
run.feedbackContext = JSON.stringify(feedbackComments);
|
|
391
393
|
// Register in activeFeedbackRuns BEFORE enqueue so rate-limit check works
|
|
392
394
|
this.activeFeedbackRuns.set(prUrl, runId);
|
|
393
395
|
this.queue
|
|
@@ -1736,6 +1738,43 @@ export class PipelineRunner {
|
|
|
1736
1738
|
runLog.warn({ err: err instanceof Error ? err.message : String(err) }, "BEC-175: PR cost summary post failed (non-fatal)");
|
|
1737
1739
|
}
|
|
1738
1740
|
}
|
|
1741
|
+
// PR change-summary comment for review-feedback runs. Always-on (no env
|
|
1742
|
+
// flag) — a review-feedback run only exists because a human asked for
|
|
1743
|
+
// changes, so silent shipping is a bug.
|
|
1744
|
+
if (run.runType === "review-feedback" &&
|
|
1745
|
+
prUrl &&
|
|
1746
|
+
repoConfig.provider !== "gitlab" &&
|
|
1747
|
+
this.githubConfig) {
|
|
1748
|
+
try {
|
|
1749
|
+
const summaryPrMatch = prUrl.match(/\/pull\/(\d+)/);
|
|
1750
|
+
const summaryPrNumber = summaryPrMatch
|
|
1751
|
+
? parseInt(summaryPrMatch[1], 10)
|
|
1752
|
+
: null;
|
|
1753
|
+
const { owner: csOwner, repo: csRepo } = parseRepoUrl(repoConfig.url);
|
|
1754
|
+
const csOctokit = await createGitHubClient(this.githubConfig);
|
|
1755
|
+
await maybePostChangeSummary({
|
|
1756
|
+
run: {
|
|
1757
|
+
id: run.id,
|
|
1758
|
+
runType: run.runType,
|
|
1759
|
+
prUrl: run.prUrl,
|
|
1760
|
+
feedbackContext: run.feedbackContext ?? null,
|
|
1761
|
+
totalInputTokens: run.totalInputTokens,
|
|
1762
|
+
totalOutputTokens: run.totalOutputTokens,
|
|
1763
|
+
},
|
|
1764
|
+
handoff: handoff ?? null,
|
|
1765
|
+
prNumber: summaryPrNumber,
|
|
1766
|
+
owner: csOwner,
|
|
1767
|
+
repo: csRepo,
|
|
1768
|
+
octokit: csOctokit,
|
|
1769
|
+
postPRComment: addPRComment,
|
|
1770
|
+
dashboardBaseUrl: process.env.URATEAM_DASHBOARD_URL ?? "",
|
|
1771
|
+
logger: runLog,
|
|
1772
|
+
});
|
|
1773
|
+
}
|
|
1774
|
+
catch (err) {
|
|
1775
|
+
runLog.warn({ err: err instanceof Error ? err.message : String(err) }, "PR change summary post failed (non-fatal)");
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1739
1778
|
}
|
|
1740
1779
|
catch (error) {
|
|
1741
1780
|
// If failPipeline was already called inside the push queue (e.g. failOnAutoCommit
|