@weareikko/code-review 0.8.2 → 0.8.3

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 CHANGED
@@ -5,15 +5,19 @@
5
5
  [![Size](https://img.shields.io/bundlephobia/minzip/@weareikko/code-review?style=flat&colorB=3e63dd&colorA=414853&label=size)](https://bundlephobia.com/package/@weareikko/code-review)
6
6
  ![Codecov](https://img.shields.io/codecov/c/github/weareikko/code-review?style=flat&colorB=3e63dd&colorA=414853)
7
7
 
8
- Run an agent-driven code review in GitLab CI, parse inline comments, post deduplicated merge request discussions, and report per-run token usage and cost.
8
+ Run an agent-driven code review on **GitLab merge requests and GitHub pull requests** — the same review engine on both. It parses inline comments, posts deduplicated review discussions, upserts a summary, and reports per-run token usage and cost. The platform is auto-detected from the environment (GitLab CI vs. GitHub Actions) and can be forced with `--platform github|gitlab`.
9
9
 
10
- The reviewer reads the MR **title and description** as the author's declared intent: it checks the diff against the stated purpose and flags code/intent mismatches (the change does something the description never claimed, or omits something it promised) as a first-class finding. A missing or empty description degrades gracefully — the review still runs.
10
+ The reviewer reads the merge/pull request **title and description** as the author's declared intent: it reads the diff against the stated purpose and surfaces code/intent mismatches (the change does something the description never claimed, or omits something it promised) as a summary note. A missing or empty description degrades gracefully — the review still runs.
11
11
 
12
12
  ## Requirements
13
13
 
14
14
  - Node.js `>=24`
15
- - `git` available in the runtime
16
- - A pipeline running in a merge request context (`CI_PROJECT_ID`, `CI_MERGE_REQUEST_IID`)
15
+ - `git` available in the runtime (full history — the review diffs against the merge base)
16
+ - A run in one of the two supported contexts, which the tool auto-detects:
17
+ - **GitLab CI** in a merge-request pipeline (`GITLAB_CI`, `CI_PROJECT_ID`, `CI_MERGE_REQUEST_IID`), or
18
+ - **GitHub Actions** on a `pull_request` event (`GITHUB_ACTIONS`, `GITHUB_REPOSITORY`, the PR number)
19
+
20
+ Detection precedence: an explicit `--platform github|gitlab` (or `CODE_REVIEW_PLATFORM`) always wins; otherwise `GITHUB_ACTIONS=true` selects GitHub and `GITLAB_CI=true` (or a present `CI_PROJECT_ID` / `CI_SERVER_URL`) selects GitLab; failing that, the tool infers the platform from whichever side's identifiers are present.
17
21
 
18
22
  ## Install / Run
19
23
 
@@ -79,13 +83,17 @@ review:
79
83
  - review-usage.json
80
84
  ```
81
85
 
82
- ## GitHub Actions
86
+ ## GitHub Actions example
87
+
88
+ On GitHub the same engine reviews **pull requests** — auto-detected from the Actions environment (`GITHUB_ACTIONS`, `GITHUB_REPOSITORY`, the `pull_request` event); pass `--platform github` to force it. Findings post as one batched PR review with inline comments plus an upserted summary comment.
83
89
 
84
- The same reviewer also reviews **GitHub pull requests** — the engine is platform-agnostic and auto-detects GitHub from the Actions environment (`GITHUB_ACTIONS`, `GITHUB_REPOSITORY`, the `pull_request` event). Set `--platform github` to force it.
90
+ ### Composite action (recommended)
85
91
 
86
- ### Reusable workflow (simplest)
92
+ The bundled composite action is the primary path: it checks out the repository, sets up Node, installs the CLI, and runs the review in one step. It needs:
87
93
 
88
- The quickest way to enable reviews in a repo is the bundled reusable workflow. Add a tiny caller and let it check out the code, install the CLI, and run the review for you:
94
+ - **Permissions:** `pull-requests: write` (to post the review and summary) and `contents: read` (to check out the code). The default `GITHUB_TOKEN` is enough; the action reads it as `${{ github.token }}` by default.
95
+ - **Full git history:** the action checks out the repository by default with `fetch-depth: 0` so the merge-base diff and commit log resolve (tune with `fetch-depth`, or set `checkout: false` and check out yourself first).
96
+ - **A model + its key:** pass the model via the `model` input and the provider's key via the `api-key` input (or expose the provider's standard env var, e.g. `ANTHROPIC_API_KEY`, to the step).
89
97
 
90
98
  ```yml
91
99
  name: code-review
@@ -98,19 +106,25 @@ permissions:
98
106
 
99
107
  jobs:
100
108
  review:
101
- uses: weareikko/code-review/.github/workflows/code-review.yml@0.8.2 # pin to a release tag
102
- secrets: inherit
109
+ runs-on: ubuntu-latest
110
+ steps:
111
+ # Checkout (full history) is bundled — no separate checkout step needed.
112
+ # Opt out with `checkout: false` if your job already checked out the code.
113
+ - uses: weareikko/code-review@0.8.2 # pin to a release tag
114
+ with:
115
+ model: anthropic/claude-sonnet-4-5
116
+ api-key: ${{ secrets.ANTHROPIC_API_KEY }}
117
+ # github-token defaults to ${{ github.token }}
118
+ # args: --min-severity warn --dry-run
103
119
  ```
104
120
 
105
- It reads review settings from repo/org **variables** (`CODE_REVIEW_MODEL`, `CODE_REVIEW_DEPTH`, `CODE_REVIEW_THINKING_LEVEL`, `CODE_REVIEW_VERIFY_MODEL`) and provider credentials from **secrets** named with the `CODE_REVIEW_` prefix (e.g. `CODE_REVIEW_ANTHROPIC_API_KEY`), which the CLI's env shim de-prefixes for the provider. `secrets: inherit` is required so the reusable workflow can see them. Optional `with:` inputs: `model` (overrides the `CODE_REVIEW_MODEL` variable), `version`, `node-version`, `working-directory`, `args`, and `runs-on`.
121
+ Inputs: `model` (required), `api-key`, `github-token` (default `${{ github.token }}`), `version` (npm dist-tag/version, default `latest`), `node-version` (default `24`), `working-directory`, `args` (extra CLI flags forwarded verbatim), `checkout` (default `true` — bundled repository checkout), and `fetch-depth` (default `0` — full history, required for the merge-base diff).
106
122
 
107
- ### Composite action
123
+ Because the composite action references your secrets directly (`${{ secrets.ANTHROPIC_API_KEY }}`), it works from **any** repository, including consumers in a different organization from this one.
108
124
 
109
- For more control, use the bundled composite action directly. It needs:
125
+ ### Reusable workflow (same org/enterprise)
110
126
 
111
- - **Permissions:** `pull-requests: write` (to post the review and summary) and `contents: read` (to check out the code). The default `GITHUB_TOKEN` is enough; the action reads it as `${{ github.token }}` by default.
112
- - **Full git history:** the bundled checkout uses `fetch-depth: 0` so the merge-base diff and commit log resolve (tune with `fetch-depth`, or set `checkout: false` and check out yourself).
113
- - **A model + its key:** pass the model via the `model` input and the provider's key via the `api-key` input (or expose the provider's standard env var, e.g. `ANTHROPIC_API_KEY`, to the step).
127
+ The bundled reusable workflow lets a caller enable reviews with no `steps:` of its own — it checks out the code, installs the CLI, and runs the review for you:
114
128
 
115
129
  ```yml
116
130
  name: code-review
@@ -123,24 +137,23 @@ permissions:
123
137
 
124
138
  jobs:
125
139
  review:
126
- runs-on: ubuntu-latest
127
- steps:
128
- # Checkout (full history) is bundled — opt out with `checkout: false` if
129
- # your job already checked out the code with its own options.
130
- - uses: weareikko/code-review@main # pin to a release tag in production
131
- with:
132
- model: anthropic/claude-sonnet-4-5
133
- api-key: ${{ secrets.ANTHROPIC_API_KEY }}
134
- # github-token defaults to ${{ github.token }}
135
- # args: --min-severity warn --dry-run
140
+ uses: weareikko/code-review/.github/workflows/code-review.yml@0.8.2 # pin to a release tag
141
+ secrets: inherit
136
142
  ```
137
143
 
138
- Inputs: `model` (required), `api-key`, `github-token` (default `${{ github.token }}`), `version` (npm dist-tag/version, default `latest`), `node-version` (default `24`), `working-directory`, `args` (extra CLI flags forwarded verbatim), `checkout` (default `true` — bundled repository checkout), and `fetch-depth` (default `0` — full history, required for the merge-base diff).
144
+ It reads review settings from repo/org **variables** (`CODE_REVIEW_MODEL`, `CODE_REVIEW_DEPTH`, `CODE_REVIEW_THINKING_LEVEL`, `CODE_REVIEW_VERIFY_MODEL`) and provider credentials from **secrets** named with the `CODE_REVIEW_` prefix (e.g. `CODE_REVIEW_ANTHROPIC_API_KEY`), which the CLI's env shim de-prefixes for the provider. Optional `with:` inputs: `model` (overrides the `CODE_REVIEW_MODEL` variable), `version`, `node-version`, `working-directory`, `args`, and `runs-on`.
139
145
 
140
- Prefer to run the CLI directly (no composite action)? `GITHUB_TOKEN`, `GITHUB_REPOSITORY`, and the PR number are read straight from the Actions environment:
146
+ > **Caveat — `secrets: inherit` is same-organization (or enterprise) only.** Organization secrets are **not** inherited across organizations, so this pattern only works when the caller repository lives in the same org (or enterprise) as `weareikko/code-review`. Cross-organization consumers must use the **composite action** above, which references their own secrets directly. (The reusable workflow relies on `secrets: inherit` and declares no `workflow_call.secrets`, so there is no explicit-secrets path for it.)
147
+
148
+ ### Running the CLI directly
149
+
150
+ Prefer no action at all? `GITHUB_TOKEN`, `GITHUB_REPOSITORY`, and the PR number are read straight from the Actions environment. Check out the code first (full history) so the merge-base diff resolves:
141
151
 
142
152
  ```yml
143
- - uses: actions/setup-node@v4
153
+ - uses: actions/checkout@v5
154
+ with:
155
+ fetch-depth: 0
156
+ - uses: actions/setup-node@v5
144
157
  with:
145
158
  node-version: 24
146
159
  - run: npx @weareikko/code-review
@@ -159,17 +172,17 @@ The README covers getting started. Reference material lives in [`docs/`](https:/
159
172
  - [Skills](https://github.com/weareikko/code-review/blob/main/docs/skills.md) — built-in, external (`npm:`/`file:`/`git:`), and project auto-discovered review skills.
160
173
  - [Multi-stage review](https://github.com/weareikko/code-review/blob/main/docs/multi-stage-review.md) — the staged Find / Verify / Synthesize pipeline behind `--review-depth`.
161
174
  - [Observability](https://github.com/weareikko/code-review/blob/main/docs/observability.md) — diagnostics-channel tracing and the opt-in OpenTelemetry bridge (spans, metrics, logs).
162
- - [Output format](https://github.com/weareikko/code-review/blob/main/docs/output-format.md) — inline-comment shape, MR-level summary note, footer, and duplicate prevention.
175
+ - [Output format](https://github.com/weareikko/code-review/blob/main/docs/output-format.md) — inline-comment shape, the upserted summary (a note on GitLab, an issue comment on GitHub), footer, and duplicate prevention.
163
176
 
164
177
  ## Configuration
165
178
 
166
- The CLI auto-resolves most values from GitLab CI variables and provider-standard env vars. The two things you must provide are a model and its provider's API key:
179
+ The CLI auto-resolves most values from the CI environment (GitLab CI variables or the GitHub Actions context) and provider-standard env vars. The two things you must provide are a model and its provider's API key:
167
180
 
168
181
  ```bash
169
182
  code-review --model anthropic/claude-sonnet-4-5 --api-key "$ANTHROPIC_API_KEY"
170
183
  ```
171
184
 
172
- Equivalently, set `CODE_REVIEW_MODEL` and the provider's key (e.g. `ANTHROPIC_API_KEY`) as CI/CD variables. Common knobs include `--min-severity`, `--thinking`, `--posting-mode draft`, `--no-summary`, and `--dry-run`. See the full [environment-variable and flag reference](https://github.com/weareikko/code-review/blob/main/docs/configuration.md).
185
+ Equivalently, set `CODE_REVIEW_MODEL` and the provider's key (e.g. `ANTHROPIC_API_KEY`) as CI/CD variables (GitLab) or repository/organization variables and secrets (GitHub). Common knobs include `--min-severity`, `--thinking`, `--posting-mode draft`, `--no-summary`, and `--dry-run`. See the full [environment-variable and flag reference](https://github.com/weareikko/code-review/blob/main/docs/configuration.md).
173
186
 
174
187
  ## Providers
175
188
 
@@ -182,7 +195,7 @@ Equivalently, set `CODE_REVIEW_MODEL` and the provider's key (e.g. `ANTHROPIC_AP
182
195
  - parsed comment payload
183
196
  - computed fingerprints
184
197
  - duplicate status
185
- - final GitLab discussion payload
198
+ - final platform-specific posting payload (a GitLab discussion payload, or a GitHub review-comment payload)
186
199
  - `review-usage.json`: token and cost breakdown for the run (`tokens.{input,output,cacheRead,cacheWrite,total}`, `cost.{input,output,cacheRead,cacheWrite,total}`, `model`)
187
200
 
188
201
  The CLI also prints a one-line summary at the end of the run:
@@ -198,15 +211,17 @@ Use these files for CI debugging and auditing.
198
211
  - **`Node.js >=24 is required`**
199
212
  - Use `node:24` (or newer) in CI.
200
213
  - **`Missing required configuration`**
201
- - Provide required flags or ensure CI vars are available (`CI_PROJECT_ID`, `CI_MERGE_REQUEST_IID`, token, API key).
214
+ - Provide required flags or ensure the platform's identifiers/token are available: on GitLab `CI_PROJECT_ID`, `CI_MERGE_REQUEST_IID`, and a GitLab token; on GitHub `GITHUB_REPOSITORY`, the PR number, and `GITHUB_TOKEN`. A model and its API key are required on both.
215
+ - **`Could not detect the review platform` / `Ambiguous review platform`**
216
+ - Set `--platform github|gitlab` (or `CODE_REVIEW_PLATFORM`) to force the platform.
202
217
  - **`--min-severity must be one of: info, warn, critical`**
203
218
  - Fix `--min-severity` or `CODE_REVIEW_MIN_SEVERITY`.
204
219
  - **Git history errors / merge-base failures**
205
- - Set `GIT_DEPTH: 0`.
220
+ - Fetch full history: `GIT_DEPTH: 0` on GitLab, `fetch-depth: 0` on `actions/checkout` (the composite action does this by default).
206
221
  - Ensure source and target branches are fetchable from `origin`.
207
- - **GitLab API 401/403 when posting**
208
- - Ensure token has rights to read MR metadata/discussions and create MR discussions.
209
- - If using `CI_JOB_TOKEN`, ensure your GitLab project settings allow required API access.
222
+ - **API 401/403 when posting**
223
+ - GitLab: ensure the token can read MR metadata/discussions and create MR discussions; with `CI_JOB_TOKEN`, check that project settings allow the required API access.
224
+ - GitHub: ensure the token has `pull-requests: write` (the default `GITHUB_TOKEN` with that permission is enough).
210
225
  - **No comments posted**
211
226
  - Check `review-comments.json` for `duplicate: true` or empty parsed comments.
212
227
  - Run with `--dry-run` and inspect `code-review.md` formatting (`== Inline Comments ==`).
@@ -155,6 +155,20 @@ function parseNextLink(header) {
155
155
  }
156
156
  return null;
157
157
  }
158
+ var REVIEW_THREADS_QUERY = `
159
+ query ($owner: String!, $repo: String!, $pull: Int!, $cursor: String) {
160
+ repository(owner: $owner, name: $repo) {
161
+ pullRequest(number: $pull) {
162
+ reviewThreads(first: 100, after: $cursor) {
163
+ pageInfo { hasNextPage endCursor }
164
+ nodes {
165
+ isResolved
166
+ comments(first: 100) { nodes { databaseId } }
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }`;
158
172
  var GitHubClient = class {
159
173
  base;
160
174
  token;
@@ -290,6 +304,65 @@ var GitHubClient = class {
290
304
  getCurrentUser() {
291
305
  return this.request("/user");
292
306
  }
307
+ /**
308
+ * Derive the GraphQL endpoint from the REST base. github.com exposes GraphQL
309
+ * at `<origin>/graphql`, while GitHub Enterprise Server exposes it at
310
+ * `<origin>/api/graphql` (its REST base is `<origin>/api/v3`).
311
+ */
312
+ graphqlEndpoint() {
313
+ if (this.base.endsWith("/api/v3")) return `${this.base.slice(0, -7)}/api/graphql`;
314
+ return `${this.base}/graphql`;
315
+ }
316
+ async graphql(query, variables) {
317
+ const url = this.graphqlEndpoint();
318
+ const response = await this.fetchWithTimeout(url, {
319
+ method: "POST",
320
+ headers: this.headers({ "Content-Type": "application/json" }),
321
+ body: JSON.stringify({
322
+ query,
323
+ variables
324
+ })
325
+ }, "POST", "/graphql");
326
+ if (!response.ok) this.failure("POST", "/graphql", response, await response.text());
327
+ const text = await response.text();
328
+ const parsed = JSON.parse(text);
329
+ if (parsed.errors && parsed.errors.length > 0) throw new GitHubApiError(`GitHub API POST /graphql failed: ${parsed.errors.map((e) => e.message ?? "").join("; ")}`, {
330
+ method: "POST",
331
+ path: "/graphql",
332
+ responseBody: text,
333
+ hint: "Ensure the token can read pull-request review threads (pull-requests: read / repo scope)."
334
+ });
335
+ return parsed.data;
336
+ }
337
+ /**
338
+ * Return the database IDs of review comments that belong to a **resolved**
339
+ * review thread. GitHub's REST comment endpoints omit thread-resolution state;
340
+ * it is only exposed via GraphQL `reviewThreads.isResolved`. Callers use this
341
+ * set to mark normalized notes resolved so resolved threads are excluded from
342
+ * summary carry-over and prior-thread context. Paginates over threads.
343
+ */
344
+ async listResolvedReviewCommentIds(owner, repo, pull) {
345
+ const resolved = /* @__PURE__ */ new Set();
346
+ let cursor = null;
347
+ let hasNext = true;
348
+ while (hasNext) {
349
+ const threads = (await this.graphql(REVIEW_THREADS_QUERY, {
350
+ owner,
351
+ repo,
352
+ pull,
353
+ cursor
354
+ })).repository?.pullRequest?.reviewThreads;
355
+ if (!threads) break;
356
+ for (const thread of threads.nodes ?? []) {
357
+ if (!thread.isResolved) continue;
358
+ for (const comment of thread.comments?.nodes ?? []) if (typeof comment.databaseId === "number") resolved.add(comment.databaseId);
359
+ }
360
+ hasNext = threads.pageInfo?.hasNextPage ?? false;
361
+ cursor = threads.pageInfo?.endCursor ?? null;
362
+ if (!cursor) hasNext = false;
363
+ }
364
+ return resolved;
365
+ }
293
366
  };
294
367
  //#endregion
295
368
  //#region src/fingerprints.ts
@@ -470,7 +543,7 @@ function buildSummaryBody(summary, costFooter, options = {}) {
470
543
  return `${withFooter}\n\n${buildSummaryHistoryBlock(historyEntries)}`;
471
544
  }
472
545
  function buildReviewedCommitFooter(commitSha) {
473
- return `Reviewed by ${PRODUCT_LINK} v0.8.2 for commit ${commitSha}.`;
546
+ return `Reviewed by ${PRODUCT_LINK} v0.8.3 for commit ${commitSha}.`;
474
547
  }
475
548
  function extractReviewedCommitSha(body) {
476
549
  return REVIEWED_COMMIT_FOOTER_PATTERN.exec(body)?.[1] ?? null;
@@ -4836,7 +4909,7 @@ async function loadDefaultRuntime() {
4836
4909
  const [sdkNode, resources, semconv] = modules;
4837
4910
  const serviceResource = resources.resourceFromAttributes({
4838
4911
  [semconv.ATTR_SERVICE_NAME ?? "service.name"]: SERVICE_NAME,
4839
- [semconv.ATTR_SERVICE_VERSION ?? "service.version"]: "0.8.2"
4912
+ [semconv.ATTR_SERVICE_VERSION ?? "service.version"]: "0.8.3"
4840
4913
  });
4841
4914
  process.env.OTEL_METRICS_EXPORTER = process.env.OTEL_METRICS_EXPORTER ?? "otlp";
4842
4915
  process.env.OTEL_LOGS_EXPORTER = process.env.OTEL_LOGS_EXPORTER ?? "otlp";
@@ -5268,7 +5341,7 @@ function boldCommentTitle(body) {
5268
5341
  */
5269
5342
  function buildCommentBody(body, commitSha, confidence) {
5270
5343
  const confidenceLine = `_Confidence: ${confidence}._`;
5271
- const footer = `<sub>Reviewed by ${PRODUCT_LINK} v0.8.2 for commit ${commitSha}.</sub>`;
5344
+ const footer = `<sub>Reviewed by ${PRODUCT_LINK} v0.8.3 for commit ${commitSha}.</sub>`;
5272
5345
  return `${boldCommentTitle(body.trim())}\n\n${confidenceLine}\n\n---\n\n${footer}`;
5273
5346
  }
5274
5347
  function buildPayload(comment, body, refs, resolved) {
@@ -5431,8 +5504,12 @@ function reviewCommentPosition(comment) {
5431
5504
  * The fingerprint markers, summary marker, and reviewed-commit footer are HTML
5432
5505
  * comments that render identically on GitHub, so `extractExistingFingerprints`,
5433
5506
  * `findExistingSummaryNote`, and the reviewed-commit scan all work as-is.
5507
+ *
5508
+ * `resolvedCommentIds` carries the database ids of comments in resolved review
5509
+ * threads (from the GraphQL `reviewThreads` query, since REST omits resolution),
5510
+ * so each note gets a `resolved` flag mirroring GitLab's per-note field.
5434
5511
  */
5435
- function normalizeGitHubDiscussions(reviewComments, issueComments) {
5512
+ function normalizeGitHubDiscussions(reviewComments, issueComments, resolvedCommentIds = /* @__PURE__ */ new Set()) {
5436
5513
  const threads = /* @__PURE__ */ new Map();
5437
5514
  const order = [];
5438
5515
  for (const comment of reviewComments) {
@@ -5446,6 +5523,7 @@ function normalizeGitHubDiscussions(reviewComments, issueComments) {
5446
5523
  notes.push({
5447
5524
  id: comment.id,
5448
5525
  body: comment.body ?? "",
5526
+ resolved: resolvedCommentIds.has(comment.id),
5449
5527
  position: reviewCommentPosition(comment)
5450
5528
  });
5451
5529
  }
@@ -5512,8 +5590,12 @@ var GitHubPlatform = class {
5512
5590
  return refs;
5513
5591
  }
5514
5592
  async getDiscussions() {
5515
- const [reviewComments, issueComments] = await Promise.all([this.client.listReviewComments(this.owner, this.repo, this.pull), this.client.listIssueComments(this.owner, this.repo, this.pull)]);
5516
- return normalizeGitHubDiscussions(reviewComments, issueComments);
5593
+ const [reviewComments, issueComments, resolvedCommentIds] = await Promise.all([
5594
+ this.client.listReviewComments(this.owner, this.repo, this.pull),
5595
+ this.client.listIssueComments(this.owner, this.repo, this.pull),
5596
+ this.client.listResolvedReviewCommentIds(this.owner, this.repo, this.pull)
5597
+ ]);
5598
+ return normalizeGitHubDiscussions(reviewComments, issueComments, resolvedCommentIds);
5517
5599
  }
5518
5600
  buildComments(comments, diff, refs, existingFingerprints) {
5519
5601
  this.commitId = refs.head_sha;
@@ -6346,10 +6428,10 @@ async function main(argv = process.argv.slice(2)) {
6346
6428
  return;
6347
6429
  }
6348
6430
  if (argv.includes("--version") || argv.includes("-v")) {
6349
- console.log("0.8.2");
6431
+ console.log("0.8.3");
6350
6432
  return;
6351
6433
  }
6352
- process.stderr.write(`[code-review] @weareikko/code-review v0.8.2\n`);
6434
+ process.stderr.write(`[code-review] @weareikko/code-review v0.8.3\n`);
6353
6435
  assertNodeVersion();
6354
6436
  applyCodeReviewEnvPrefix();
6355
6437
  applyDefaultCacheRetention();
@@ -6372,4 +6454,4 @@ if (isDirectRun()) main().catch((error) => {
6372
6454
  //#endregion
6373
6455
  export { normalizeBody as $, SUMMARY_HISTORY_END as A, buildSummaryHistoryEntries as B, createDiagnosticContext as C, traceDiagnosticPhase as D, traceDiagnostic as E, SUMMARY_MARKER as F, findExistingSummaryNoteId as G, extractSummaryHistoryEntries as H, buildArchivedSummaryEntry as I, upsertSummaryNote as J, stripSummaryHistory as K, buildReviewedCommitFooter as L, SUMMARY_HISTORY_ENTRY_START as M, SUMMARY_HISTORY_LIMIT as N, normalizeSeverity as O, SUMMARY_HISTORY_START as P, fingerprints as Q, buildSizeNoticeBlock as R, DIAGNOSTIC_CHANNEL_PREFIX as S, diagnosticChannels as T, findExistingReviewedCommitSha as U, extractReviewedCommitSha as V, findExistingSummaryNote as W, extractDiffHunkContext as X, appendFingerprintMarkers as Y, extractExistingFingerprints as Z, resolveNpmSkillDir as _, main as a, parseReviewMarkdownWithWarnings as b, buildGeneratedComments as c, startOtelBridge as d, sha256 as et, filterDiff as f, parseSkillSpec as g, loadNamedSkill as h, formatUsageLine as i, SUMMARY_HISTORY_ENTRY_END as j, toGitLabReviewSeverity as k, buildPayload as l, gitSkillCacheKey as m, formatPerModelUsage as n, run as o, runReview as p, stripSummaryMarker as q, formatSkillsFooter as r, withHttpStamping as s, countPostedBySeverity as t, isOtelEnabled as u, resolveSkillCacheDir as v, createDiagnosticRunId as w, DIAGNOSTIC_CHANNEL_NAMES as x, parseReviewMarkdown as y, buildSummaryBody as z };
6374
6456
 
6375
- //# sourceMappingURL=cli-DBkaU14C.js.map
6457
+ //# sourceMappingURL=cli-CICuhytH.js.map