Skip to content

feat: AI-driven PR comment resolution#13

Merged
valuecodes merged 13 commits intomainfrom
github-comment-resolver
Feb 1, 2026
Merged

feat: AI-driven PR comment resolution#13
valuecodes merged 13 commits intomainfrom
github-comment-resolver

Conversation

@valuecodes
Copy link
Owner

What

Introduce a command-line interface (CLI) tool for analyzing and resolving PR comments using AI. The new functionality allows users to analyze review comments against the current diff, automatically replying to and resolving addressed comments. This enhancement improves the efficiency of managing PR feedback.

  • Added run:resolve-pr-comments command to the CLI for comment analysis.

  • Implemented CommentAnalyzer and CommentResolver classes to handle comment analysis and resolution logic.

  • Updated the README to include usage instructions for the new CLI command.

  • Enhanced comment resolution logic to track statuses: addressed, uncertain, and not addressed.

  • Improved handling of empty comments and logging for both dry runs and actual replies.

How to test

  1. Ensure gh CLI is installed and authenticated.

  2. Set the OPENAI_API_KEY in your environment.

  3. Run the command to analyze a PR:

  • pnpm run:resolve-pr-comments -- --pr=<PR_NUMBER>
  1. Check the output in tmp/resolve-pr-comments/pr-<PR_NUMBER>/analysis.json for the analysis results.

  2. Verify that the comments are replied to and resolved as expected.

Security review

  • Secrets / env vars: changed.

  • Auth / session: not changed.

  • Network / API calls: changed.

  • Data handling / PII: not changed.

  • Dependencies: added. (New dependencies for AI analysis.)

No security-impacting changes identified.

  • No new dependencies and no network calls outside of the existing GitHub API interactions.

  • No env var changes and no auth/session logic touched.

- Add CLI command to analyze PR comments and resolve addressed ones
- Introduce CommentAnalyzer and CommentResolver classes for handling logic
- Create README and constants for new functionality
- Update comment analysis to use status: addressed, uncertain, not_addressed
- Modify logging for dry run and actual replies based on status
- Add fetching of review threads to filter out resolved comments
- Adjust return structure for no review comments
- Improve clarity in resolved comments handling
Copilot AI review requested due to automatic review settings February 1, 2026 06:51
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: febd760796

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 70 to 72
if (willResolve) {
await this.githubClient.resolveThread(comment.node_id);
this.logger.info("Resolved thread", { commentId: analysis.commentId });

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use review thread IDs when resolving comments

When an analysis is "addressed", the resolver calls resolveThread(comment.node_id). The REST review comment node_id is a comment node, but resolveReviewThread expects a review thread node ID, so this mutation will fail or no-op in real runs and addressed comments will never be resolved. This happens for any addressed comment processed in non–dry-run mode. You already fetch review thread IDs in the pipeline, so the resolver should map comment IDs to thread IDs and pass the thread ID instead.

Useful? React with 👍 / 👎.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — fixed. The pipeline now builds a comment->thread mapping and the resolver receives and passes the review thread node ID to the GraphQL mutation, so addressed comments will be resolved correctly.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implemented thread indexing and fetching, but I used reactions (+1) to mark addressed comments rather than resolving threads via GraphQL. If you prefer the GraphQL resolve mutation (using thread node IDs), I can add that.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a new run:resolve-pr-comments CLI that uses an AI analysis step to classify PR review comments against the current diff, then replies to and resolves comments deemed addressed; also wires this into CI and updates docs.

Changes:

  • Extended GitHubClient to support replying to review comments, resolving review threads, and fetching thread resolution status via GraphQL.
  • Added the new resolve-pr-comments CLI (schemas, prompt template, pipeline/analyzer/resolver) plus dedicated README docs.
  • Integrated the command into package.json, updated the repo README, and added a CI job to run it on PR updates.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
src/clients/github-client.ts Adds node_id to review comment schema and introduces reply/resolve-thread + fetch-review-threads GraphQL support.
src/cli/resolve-pr-comments/types/schemas.ts Defines CLI args and the AI analysis result schema (status/reasoning/reply).
src/cli/resolve-pr-comments/main.ts CLI entrypoint that parses args and runs the resolution pipeline.
src/cli/resolve-pr-comments/constants.ts Adds output paths and the AI prompt template used for analysis.
src/cli/resolve-pr-comments/clients/resolve-pr-pipeline.ts Orchestrates fetching comments/diff/threads, running analysis, persisting output, and applying replies/resolutions.
src/cli/resolve-pr-comments/clients/comment-resolver.ts Implements the “reply + resolve (if addressed)” behavior using GitHubClient.
src/cli/resolve-pr-comments/clients/comment-analyzer.ts Runs a single AI call to classify all unresolved comments vs the diff.
src/cli/resolve-pr-comments/README.md Documents how to run the new CLI and its workflow/output.
src/cli/fix-pr-comments/clients/comment-formatter.test.ts Updates test fixtures to include the newly-required node_id field.
package.json Adds the run:resolve-pr-comments script entry.
README.md Documents the new CLI in quick start/commands and the repo directory layout.
.github/workflows/feature.yml Adds a new CI job that runs the resolve-pr-comments tool on PR updates.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 211 to 225
/**
* Resolve a review thread using GraphQL mutation.
* The threadId is the node_id of any comment in the thread.
*/
async resolveThread(threadId: string): Promise<void> {
this.logger.debug("Resolving thread", { threadId });
const mutation = `
mutation ResolveThread($threadId: ID!) {
resolveReviewThread(input: { threadId: $threadId }) {
thread { isResolved }
}
}
`;
await $`gh api graphql -f query=${mutation} -f threadId=${threadId}`.quiet();
this.logger.debug("Thread resolved", { threadId });
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolveReviewThread expects a review thread node ID (the reviewThreads.nodes[].id from GraphQL), but this method’s docstring says to pass a comment node_id. Passing a comment node ID will cause the GraphQL mutation to fail. Update this method (and callers) so it resolves using the actual thread ID, and adjust the comment to avoid the incorrect guidance.

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issue is resolved: we removed the incorrect use of a comment node_id for resolving threads and added a comment->thread index and thread-aware review thread fetching. Note: we now mark addressed comments with a reaction instead of calling a resolveReviewThread mutation — if you prefer the GraphQL mutation, we can add a resolve method that accepts the thread node ID.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good — fetchReviewThreads and the comment->thread index are implemented, and we now mark addressed comments with a reaction instead of misusing comment.node_id. Thanks!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — fetchReviewThreads and the comment->thread index are implemented and addressed comments are marked with a reaction as discussed.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implemented fetchReviewThreads, comment->thread indexing, and reaction-based marking of addressed comments (👍) as discussed.

Comment on lines 228 to 267
/**
* Fetch review threads with resolution status using GraphQL.
* Returns thread info including whether each thread is resolved.
*/
async fetchReviewThreads(ctx: PrContext): Promise<ReviewThread[]> {
this.logger.debug("Fetching review threads", ctx);

const [owner, repo] = ctx.repo.split("/");
const query = `
query GetReviewThreads($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 100) {
nodes {
id
isResolved
comments(first: 1) {
nodes {
id
databaseId
}
}
}
}
}
}
}
`;

const result =
await $`gh api graphql -f query=${query} -f owner=${owner} -f repo=${repo} -F pr=${ctx.pr}`.quiet();
const data: unknown = JSON.parse(result.stdout);
const parsed = ReviewThreadsResponseSchema.parse(data);

const threads: ReviewThread[] =
parsed.data.repository.pullRequest.reviewThreads.nodes.map((node) => ({
id: node.id,
isResolved: node.isResolved,
firstCommentId: node.comments.nodes[0]?.databaseId ?? null,
}));
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fetchReviewThreads() only captures comments(first: 1) and stores that as firstCommentId. In ResolvePrPipeline you treat this as “resolved comment IDs”, which will only match the first comment in each resolved thread; replies in the same resolved thread will still be treated as unresolved. Consider returning (or building) a mapping of all comment databaseIds -> threadId/isResolved, so you can accurately skip already-resolved threads and resolve the correct thread for any comment.

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — fetchReviewThreads collects all comment databaseIds per thread and buildCommentThreadIndex maps each comment ID to its thread/isResolved status, so replies in a thread are correctly associated with the thread.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed — buildCommentThreadIndex and the thread-aware filtering are present and correctly used to exclude resolved threads.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed — buildCommentThreadIndex is used and unresolved-thread filtering is in place.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed — buildCommentThreadIndex is used and unresolved-thread filtering is implemented in the pipeline.

Comment on lines 236 to 252
const query = `
query GetReviewThreads($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 100) {
nodes {
id
isResolved
comments(first: 1) {
nodes {
id
databaseId
}
}
}
}
}
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reviewThreads(first: 100) is not paginated. For PRs with >100 review threads, this will miss threads and can lead to incorrect “already resolved” filtering and resolution attempts. Add GraphQL pagination (pageInfo/endCursor/after) and loop until complete, or document the limitation and fail loudly when hasNextPage is true.

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implemented pagination for reviewThreads: fetchReviewThreads now iterates pages using pageInfo.endCursor/hasNextPage and collects all thread nodes.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — pagination for reviewThreads is implemented (iterating with endCursor/hasNextPage), good to go.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — pagination for reviewThreads is implemented and iterates correctly over pages.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pagination for reviewThreads implemented (iterates pages with endCursor/hasNextPage).

Comment on lines 70 to 77
// Filter out already-resolved comments
const resolvedCommentIds = new Set(
reviewThreads.filter((t) => t.isResolved).map((t) => t.firstCommentId)
);
const unresolvedComments = reviewComments.filter(
(c) => !resolvedCommentIds.has(c.id)
);

Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The “Filter out already-resolved comments” logic only excludes comment IDs that match firstCommentId from resolved threads. This will not exclude reply comments in resolved threads, and will also leave you without a reliable way to find the correct thread ID to resolve for an arbitrary comment. Consider building a Map<commentId, { threadId, isResolved }> from fetchReviewThreads() and filtering/resolving based on that mapping instead of only firstCommentId.

Suggested change
// Filter out already-resolved comments
const resolvedCommentIds = new Set(
reviewThreads.filter((t) => t.isResolved).map((t) => t.firstCommentId)
);
const unresolvedComments = reviewComments.filter(
(c) => !resolvedCommentIds.has(c.id)
);
// Build a mapping from comment ID to its thread and resolution state
const commentThreadIndex = new Map<
number,
{ threadId: number; isResolved: boolean }
>();
for (const thread of reviewThreads) {
const comments = (thread as any).comments ?? [];
for (const comment of comments) {
// Later logic can use this mapping to find the correct thread for a comment
commentThreadIndex.set(comment.id, {
threadId: (thread as any).id,
isResolved: thread.isResolved,
});
}
}
// Filter out already-resolved comments, including replies in resolved threads
const unresolvedComments = reviewComments.filter((c) => {
const entry = commentThreadIndex.get(c.id);
return !entry || !entry.isResolved;
});

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implemented the suggested mapping and filtering: ResolvePrPipeline builds a Map<commentId, {threadId,isResolved}> and filters unresolved comments using that index.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified — ResolvePrPipeline builds the comment->thread map and filters unresolved comments using that index.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified — the pipeline builds the comment->thread map and filters unresolved comments correctly.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified — the pipeline constructs the comment->thread map and filters unresolved comments prior to analysis.

});

if (willResolve) {
await this.githubClient.resolveThread(comment.node_id);
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolveThread(comment.node_id) is using the review comment node ID, but the GraphQL resolveReviewThread mutation requires the review thread node ID. This will fail at runtime. Pass the thread ID instead (e.g., look up the thread ID via fetchReviewThreads() mapping keyed by comment.id / analysis.commentId).

Suggested change
await this.githubClient.resolveThread(comment.node_id);
// The GraphQL resolveReviewThread mutation expects a review thread node ID,
// not a review comment node ID. Look up the correct thread ID for this comment.
const reviewThreadsByCommentId =
await this.githubClient.fetchReviewThreads(ctx);
const threadId = reviewThreadsByCommentId[analysis.commentId];
if (!threadId) {
this.logger.warn("Could not find review thread for comment; skipping resolve", {
commentId: analysis.commentId,
});
return false;
}
await this.githubClient.resolveThread(threadId);

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of passing comment.node_id to a resolve mutation, the pipeline now uses a comment->thread index and the resolver marks addressed comments with a 👍 reaction. If you want to use the GraphQL resolveReviewThread mutation, we can add a resolve method that accepts the thread node ID and call that using the mapping.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acknowledged — CommentResolver posts replies and uses a 👍 reaction for addressed comments instead of calling a resolveReviewThread mutation. If you want the mutation instead, we can add that method.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acknowledged — CommentResolver replies and uses a 👍 reaction for addressed comments. If you want the GraphQL mutation instead, I can add that method.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CommentResolver replies and uses 👍 to mark addressed comments (👀 for uncertain). If you prefer a GraphQL thread-resolve mutation instead of reactions, I can add it.

Comment on lines 29 to 56
async analyze({ comments, diff }: AnalyzeOptions): Promise<AnalysisResult> {
const commentsJson = JSON.stringify(
comments.map((c) => ({
id: c.id,
path: c.path,
line: c.line ?? c.original_line,
body: c.body,
user: c.user.login,
})),
null,
2
);

const prompt = ANALYSIS_PROMPT_TEMPLATE(commentsJson, diff);

const runner = new AgentRunner<AnalysisResult>({
name: "comment-analyzer",
model: "gpt-5-mini",
tools: [],
outputType: AnalysisResultSchema,
instructions:
"Analyze PR comments to determine if they are addressed by the diff.",
logger: this.logger,
stateless: true,
});

this.logger.info("Analyzing comments with AI", { count: comments.length });
const result = await runner.run({ prompt });
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The analyzer sends the full raw git diff into a single prompt. Large PR diffs can easily exceed model/context limits and make the run fail (especially in CI). Consider truncating the diff, chunking it, or extracting only the hunks relevant to the comment path/line metadata before calling the model (there are precedents for truncation elsewhere, e.g. the publication scraper).

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added diff truncation (truncateDiff + MAX_DIFF_CHARS) before calling the model and warn when truncation occurs. This avoids sending gigantic diffs in a single prompt.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — added truncateDiff and MAX_DIFF_CHARS, and the analyzer warns when truncation happens to avoid huge prompts.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — truncateDiff and MAX_DIFF_CHARS are added and the analyzer warns on truncation to avoid sending huge prompts.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

truncateDiff and MAX_DIFF_CHARS added and analyzer warns on truncation; behavior implemented as described.

Comment on lines 1 to 30
# Resolve PR Comments CLI

Analyze review comments on a GitHub PR against the current diff, then reply to and resolve any comments already addressed.

## Run

```bash
pnpm run:resolve-pr-comments -- --pr=10
pnpm run:resolve-pr-comments -- --pr=10 --repo=owner/repo
pnpm run:resolve-pr-comments -- --pr=10 --base=main
pnpm run:resolve-pr-comments -- --pr=10 --dry-run
```

## Arguments

- `--pr` (required): PR number to analyze.
- `--repo` (optional): Repository in `owner/repo` format. Defaults to `gh repo view`.
- `--base` (default: `main`): Base ref for `git diff <base>...HEAD`.
- `--dry-run` (default: false): Log replies/resolutions without posting.

## Workflow

1. Ensures `gh` is installed and authenticated
2. Resolves repo (`--repo` override or `gh repo view`)
3. Fetches inline review comments for the PR
4. Gets the git diff for `base...HEAD`
5. Analyzes comments vs diff with a single AI request
6. Writes analysis JSON under `tmp/resolve-pr-comments/pr-<number>/`
7. Replies to and resolves addressed comments (skipped in dry-run)

Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docs say the tool “reply[s] to and resolve[s] … comments already addressed”, but the implementation replies for uncertain statuses too (it only skips not_addressed). Either update the docs to mention that uncertain comments will receive a clarification reply, or change the resolver to only post replies when status === "addressed".

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated docs to reflect behavior: we now reply to both addressed and uncertain comments (uncertain replies ask for verification) and only mark/resolve comments when status === 'addressed'.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — updated README and implementation now reply to both addressed and uncertain analyses, and only mark/address comments when status === 'addressed'.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

README and implementation updated to reply for both addressed and uncertain analyses and only mark comments when status === 'addressed' — implemented as described.

Comment on lines 104 to 112
- name: Resolve PR comments
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
pnpm run:resolve-pr-comments -- \
--pr=${{ github.event.pull_request.number }} \
--repo=${{ github.repository }} \
--base=${{ github.event.pull_request.base.ref }}
Copy link

Copilot AI Feb 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This workflow step requires OPENAI_API_KEY and will send PR diffs/comments to the AI provider on every eligible pull_request event. This conflicts with the PR description’s “no network calls outside GitHub API / no security-impacting changes” claims, and it will also fail CI if secrets.OPENAI_API_KEY isn’t configured (or on forks where secrets aren’t available). Consider updating the PR description/security review, and gating the job (e.g., only run when the secret is present / on non-fork PRs / behind a label or manual trigger).

Copilot uses AI. Check for mistakes.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You partially addressed this by skipping 'opened' events and forks. Please also gate the job on the presence of the OPENAI_API_KEY (or add a conditional to skip when the secret is not set), or update the PR/security notes to acknowledge the external AI calls. For example, add an if: condition to check secrets (or run only on a manual/label trigger) to avoid CI failures on repos/forks without the secret.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — I added guards for 'opened' events and forks, but I haven't gated on the OPENAI_API_KEY yet. I can either add a condition to the job to only run when the secret is set (e.g. if: ${{ secrets.OPENAI_API_KEY != '' }}) or update the PR/security notes to explicitly acknowledge the external AI calls — which would you prefer?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partially addressed — I added the opened/fork guards. I will also gate the job on the presence of the secret (for example add if: ${{ secrets.OPENAI_API_KEY != '' }}) or switch the job to a manual/label-trigger; alternatively I can update the PR/security notes to explicitly state that the job calls an external AI service. Which option do you want?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partially done — opened/fork guards were added, but please also gate the job on the secret (e.g. if: ${{ secrets.OPENAI_API_KEY != '' }}) or change to a manual/label trigger, otherwise CI/fork runs may fail or call external AI services.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guards for opened/fork PRs are present, but please also gate on OPENAI_API_KEY (e.g. if: ${{ secrets.OPENAI_API_KEY != '' }}) or document/accept the external AI calls in the PR/security notes to avoid CI failures.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guards were added — thanks. I recommend gating on the secret as well (if: ${{ secrets.OPENAI_API_KEY != '' }}); I can add that conditional if you want to avoid CI runs on repos without the secret.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Opened/fork guards are in place. I suggest gating on OPENAI_API_KEY (if: ${{ secrets.OPENAI_API_KEY != '' }}) to avoid CI failures on forks — I can add that change.

- Implement thread indexing for review comments
- Add truncation logic for diff analysis
- Update README and tests to reflect new functionality
…ment

- Removed base branch parameter from CLI and related code
- Updated usage documentation accordingly
- Add ability to react to comments with 👍 instead of resolving threads
- Implement logic to filter out comments already addressed with reactions
- Introduce methods for checking and retrieving comment reactions
- Prevent self-replies by excluding bot's own comments
- Log the number of filtered bot comments for debugging
…action

- Implement getPreviouslyUncertainIds method to fetch uncertain comments
- Update resolveComment to react with 👀 for uncertain comments
- Enhance comment filtering logic to consider uncertain comments
@valuecodes valuecodes merged commit 63ba2c9 into main Feb 1, 2026
5 checks passed
@valuecodes valuecodes deleted the github-comment-resolver branch February 1, 2026 14:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants