claude-issue-solver 1.24.2 → 1.25.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/README.md CHANGED
@@ -279,6 +279,8 @@ Claude auto-detects whether you're reviewing your own PR or someone else's:
279
279
  cis config bot-token # Interactive setup with instructions
280
280
  ```
281
281
 
282
+ > **Note**: For private repos, use a **Classic Token** with `repo` scope. Fine-grained tokens don't work well for collaborator access to repos you don't own.
283
+
282
284
  ## Tips
283
285
 
284
286
  - PRs are created automatically when Claude makes commits - no need to wait until the end
@@ -198,16 +198,20 @@ ${chalk_1.default.bold('You have two options:')}\n`);
198
198
  }
199
199
  // Open GitHub token page
200
200
  console.log(chalk_1.default.bold('\nšŸ”‘ Creating a Personal Access Token\n'));
201
- console.log(`I'll open GitHub's token creation page. Create a token with:
201
+ console.log(`I'll open GitHub's token creation page.
202
202
 
203
- ${chalk_1.default.bold('Settings:')}
204
- • Token name: ${chalk_1.default.cyan('claude-issue-solver-bot')}
205
- • Expiration: ${chalk_1.default.cyan('90 days')} (or your preference)
206
- • Repository access: ${chalk_1.default.cyan('Only select repositories')} (pick your repos)
203
+ ${chalk_1.default.bold.yellow('āš ļø Use a Classic Token for private repos you don\'t own!')}
204
+ Fine-grained tokens don't work well for collaborator access.
207
205
 
208
- ${chalk_1.default.bold('Permissions needed:')}
209
- • ${chalk_1.default.cyan('Pull requests')}: Read and write
210
- • ${chalk_1.default.cyan('Contents')}: Read (to see PR diffs)
206
+ ${chalk_1.default.bold('Option 1: Classic Token')} ${chalk_1.default.green('(recommended for private repos)')}
207
+ • Click "${chalk_1.default.cyan('Generate new token (classic)')}"
208
+ • Note: ${chalk_1.default.cyan('claude-issue-solver-bot')}
209
+ • Expiration: ${chalk_1.default.cyan('90 days')}
210
+ • Scope: ${chalk_1.default.cyan('repo')} (full control of private repositories)
211
+
212
+ ${chalk_1.default.bold('Option 2: Fine-grained Token')} ${chalk_1.default.dim('(only for repos the bot owns)')}
213
+ • Repository access: ${chalk_1.default.cyan('All repositories')}
214
+ • Permissions: ${chalk_1.default.cyan('Pull requests')} (Read/write), ${chalk_1.default.cyan('Contents')} (Read)
211
215
  `);
212
216
  const { openBrowser } = await inquirer_1.default.prompt([
213
217
  {
@@ -218,7 +222,7 @@ ${chalk_1.default.bold('Permissions needed:')}
218
222
  },
219
223
  ]);
220
224
  if (openBrowser) {
221
- const tokenUrl = 'https://github.com/settings/personal-access-tokens/new';
225
+ const tokenUrl = 'https://github.com/settings/tokens';
222
226
  try {
223
227
  if (process.platform === 'darwin') {
224
228
  (0, child_process_1.execSync)(`open "${tokenUrl}"`, { stdio: 'pipe' });
@@ -321,7 +321,7 @@ function getRepoName(projectRoot) {
321
321
  }
322
322
  function getOpenPRs(projectRoot) {
323
323
  try {
324
- const output = (0, child_process_1.execSync)('gh pr list --state open --json number,title,headRefName --limit 50', {
324
+ const output = (0, child_process_1.execSync)('gh pr list --state open --json number,title,headRefName,reviewDecision --limit 50', {
325
325
  cwd: projectRoot,
326
326
  encoding: 'utf-8',
327
327
  stdio: ['pipe', 'pipe', 'pipe'],
@@ -333,6 +333,7 @@ function getOpenPRs(projectRoot) {
333
333
  return {
334
334
  ...pr,
335
335
  issueNumber: match ? parseInt(match[1], 10) : null,
336
+ reviewDecision: pr.reviewDecision,
336
337
  };
337
338
  });
338
339
  }
@@ -354,8 +355,22 @@ async function selectReviewCommand() {
354
355
  // Build choices for checkbox prompt
355
356
  const choices = prs.map((pr) => {
356
357
  const issueTag = pr.issueNumber ? chalk_1.default.dim(` (issue #${pr.issueNumber})`) : '';
358
+ let statusTag = '';
359
+ switch (pr.reviewDecision) {
360
+ case 'APPROVED':
361
+ statusTag = chalk_1.default.green(' āœ“ Approved');
362
+ break;
363
+ case 'CHANGES_REQUESTED':
364
+ statusTag = chalk_1.default.red(' āœ— Changes requested');
365
+ break;
366
+ case 'REVIEW_REQUIRED':
367
+ statusTag = chalk_1.default.yellow(' ā—‹ Review required');
368
+ break;
369
+ default:
370
+ statusTag = chalk_1.default.dim(' ā—‹ No reviews');
371
+ }
357
372
  return {
358
- name: `#${pr.number}\t${pr.title}${issueTag}`,
373
+ name: `#${pr.number}\t${pr.title}${issueTag}${statusTag}`,
359
374
  value: pr,
360
375
  checked: false,
361
376
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-issue-solver",
3
- "version": "1.24.2",
3
+ "version": "1.25.0",
4
4
  "description": "Automatically solve GitHub issues using Claude Code",
5
5
  "main": "dist/index.js",
6
6
  "bin": {