mirror of
https://github.com/anthropics/claude-code.git
synced 2026-05-08 16:12:41 +00:00
Compare commits
9 Commits
boris/limc
...
boris/iuni
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20ba9a34a5 | ||
|
|
fc8c10995f | ||
|
|
01fb7af5b3 | ||
|
|
afb0fc9156 | ||
|
|
370a97d939 | ||
|
|
f54569efd2 | ||
|
|
d8cf5a874c | ||
|
|
e499db6e9e | ||
|
|
5300e12135 |
2
.github/workflows/auto-close-duplicates.yml
vendored
2
.github/workflows/auto-close-duplicates.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
issues: read
|
issues: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
|
|||||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -1,5 +1,29 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 1.0.81
|
||||||
|
|
||||||
|
- Released output styles, including new built-in educational output styles "Explanatory" and "Learning". Docs: https://docs.anthropic.com/en/docs/claude-code/output-styles
|
||||||
|
- Agents: Fix custom agent loading when agent files are unparsable
|
||||||
|
|
||||||
|
## 1.0.80
|
||||||
|
|
||||||
|
- UI improvements: Fix text contrast for custom subagent colors and spinner rendering issues
|
||||||
|
|
||||||
|
## 1.0.77
|
||||||
|
|
||||||
|
- Bash tool: Fix heredoc and multiline string escaping, improve stderr redirection handling
|
||||||
|
- SDK: Add session support and permission denial tracking
|
||||||
|
- Fix token limit errors in conversation summarization
|
||||||
|
- Opus Plan Mode: New setting in `/model` to run Opus only in plan mode, Sonnet otherwise
|
||||||
|
|
||||||
|
## 1.0.73
|
||||||
|
|
||||||
|
- MCP: Support multiple config files with `--mcp-config file1.json file2.json`
|
||||||
|
- MCP: Press Esc to cancel OAuth authentication flows
|
||||||
|
- Bash: Improved command validation and reduced false security warnings
|
||||||
|
- UI: Enhanced spinner animations and status line visual hierarchy
|
||||||
|
- Linux: Added support for Alpine and musl-based distributions (requires separate ripgrep installation)
|
||||||
|
|
||||||
## 1.0.72
|
## 1.0.72
|
||||||
|
|
||||||
- Ask permissions: have Claude Code always ask for confirmation to use specific tools with /permissions
|
- Ask permissions: have Claude Code always ask for confirmation to use specific tools with /permissions
|
||||||
|
|||||||
@@ -47,8 +47,19 @@ async function githubRequest<T>(endpoint: string, token: string, method: string
|
|||||||
}
|
}
|
||||||
|
|
||||||
function extractDuplicateIssueNumber(commentBody: string): number | null {
|
function extractDuplicateIssueNumber(commentBody: string): number | null {
|
||||||
const match = commentBody.match(/#(\d+)/);
|
// Try to match #123 format first
|
||||||
return match ? parseInt(match[1], 10) : null;
|
let match = commentBody.match(/#(\d+)/);
|
||||||
|
if (match) {
|
||||||
|
return parseInt(match[1], 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to match GitHub issue URL format: https://github.com/owner/repo/issues/123
|
||||||
|
match = commentBody.match(/github\.com\/[^\/]+\/[^\/]+\/issues\/(\d+)/);
|
||||||
|
if (match) {
|
||||||
|
return parseInt(match[1], 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -82,46 +82,61 @@ Usage:
|
|||||||
Environment Variables:
|
Environment Variables:
|
||||||
GITHUB_TOKEN - GitHub personal access token with repo and actions permissions (required)
|
GITHUB_TOKEN - GitHub personal access token with repo and actions permissions (required)
|
||||||
DRY_RUN - Set to "false" to actually trigger workflows (default: true for safety)
|
DRY_RUN - Set to "false" to actually trigger workflows (default: true for safety)
|
||||||
DAYS_BACK - How many days back to look for old issues (default: 90)`);
|
MAX_ISSUE_NUMBER - Only process issues with numbers less than this value (default: 4050)`);
|
||||||
}
|
}
|
||||||
console.log("[DEBUG] GitHub token found");
|
console.log("[DEBUG] GitHub token found");
|
||||||
|
|
||||||
const owner = "anthropics";
|
const owner = "anthropics";
|
||||||
const repo = "claude-code";
|
const repo = "claude-code";
|
||||||
const dryRun = process.env.DRY_RUN !== "false";
|
const dryRun = process.env.DRY_RUN !== "false";
|
||||||
const daysBack = parseInt(process.env.DAYS_BACK || "90", 10);
|
const maxIssueNumber = parseInt(process.env.MAX_ISSUE_NUMBER || "4050", 10);
|
||||||
|
const minIssueNumber = parseInt(process.env.MIN_ISSUE_NUMBER || "1", 10);
|
||||||
|
|
||||||
console.log(`[DEBUG] Repository: ${owner}/${repo}`);
|
console.log(`[DEBUG] Repository: ${owner}/${repo}`);
|
||||||
console.log(`[DEBUG] Dry run mode: ${dryRun}`);
|
console.log(`[DEBUG] Dry run mode: ${dryRun}`);
|
||||||
console.log(`[DEBUG] Looking back ${daysBack} days`);
|
console.log(`[DEBUG] Looking at issues between #${minIssueNumber} and #${maxIssueNumber}`);
|
||||||
|
|
||||||
const cutoffDate = new Date();
|
console.log(`[DEBUG] Fetching issues between #${minIssueNumber} and #${maxIssueNumber}...`);
|
||||||
cutoffDate.setDate(cutoffDate.getDate() - daysBack);
|
|
||||||
|
|
||||||
console.log(`[DEBUG] Fetching issues created since ${cutoffDate.toISOString()}...`);
|
|
||||||
const allIssues: GitHubIssue[] = [];
|
const allIssues: GitHubIssue[] = [];
|
||||||
let page = 1;
|
let page = 1;
|
||||||
const perPage = 100;
|
const perPage = 100;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
const pageIssues: GitHubIssue[] = await githubRequest(
|
const pageIssues: GitHubIssue[] = await githubRequest(
|
||||||
`/repos/${owner}/${repo}/issues?state=all&per_page=${perPage}&page=${page}&since=${cutoffDate.toISOString()}`,
|
`/repos/${owner}/${repo}/issues?state=all&per_page=${perPage}&page=${page}&sort=created&direction=desc`,
|
||||||
token
|
token
|
||||||
);
|
);
|
||||||
|
|
||||||
if (pageIssues.length === 0) break;
|
if (pageIssues.length === 0) break;
|
||||||
|
|
||||||
allIssues.push(...pageIssues);
|
// Filter to only include issues within the specified range
|
||||||
|
const filteredIssues = pageIssues.filter(issue =>
|
||||||
|
issue.number >= minIssueNumber && issue.number < maxIssueNumber
|
||||||
|
);
|
||||||
|
allIssues.push(...filteredIssues);
|
||||||
|
|
||||||
|
// If the oldest issue in this page is still above our minimum, we need to continue
|
||||||
|
// but if the oldest issue is below our minimum, we can stop
|
||||||
|
const oldestIssueInPage = pageIssues[pageIssues.length - 1];
|
||||||
|
if (oldestIssueInPage && oldestIssueInPage.number >= maxIssueNumber) {
|
||||||
|
console.log(`[DEBUG] Oldest issue in page #${page} is #${oldestIssueInPage.number}, continuing...`);
|
||||||
|
} else if (oldestIssueInPage && oldestIssueInPage.number < minIssueNumber) {
|
||||||
|
console.log(`[DEBUG] Oldest issue in page #${page} is #${oldestIssueInPage.number}, below minimum, stopping`);
|
||||||
|
break;
|
||||||
|
} else if (filteredIssues.length === 0 && pageIssues.length > 0) {
|
||||||
|
console.log(`[DEBUG] No issues in page #${page} are in range #${minIssueNumber}-#${maxIssueNumber}, continuing...`);
|
||||||
|
}
|
||||||
|
|
||||||
page++;
|
page++;
|
||||||
|
|
||||||
// Safety limit to avoid infinite loops
|
// Safety limit to avoid infinite loops
|
||||||
if (page > 100) {
|
if (page > 200) {
|
||||||
console.log("[DEBUG] Reached page limit, stopping pagination");
|
console.log("[DEBUG] Reached page limit, stopping pagination");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`[DEBUG] Found ${allIssues.length} issues from the last ${daysBack} days`);
|
console.log(`[DEBUG] Found ${allIssues.length} issues between #${minIssueNumber} and #${maxIssueNumber}`);
|
||||||
|
|
||||||
let processedCount = 0;
|
let processedCount = 0;
|
||||||
let candidateCount = 0;
|
let candidateCount = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user