feat: /assign self-assignment for good first issue (#62)#64
Open
rtibblesbot wants to merge 12 commits intolearningequality:mainfrom
Open
feat: /assign self-assignment for good first issue (#62)#64rtibblesbot wants to merge 12 commits intolearningequality:mainfrom
rtibblesbot wants to merge 12 commits intolearningequality:mainfrom
Conversation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rningequality#62) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ality#62) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…equality#62) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove unused `labels` parameter from `makeContext`, unused `opts` parameter from paginate mock, and unused `mockGithub` helper function. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rningequality#62) getRecentUnassignments could return multiple unassignment events for the same issue if a user was assigned/unassigned multiple times within the cooldown window, inflating the slot count and unfairly blocking contributors. Deduplicate by issueUrl, keeping the most recent event. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ity#62) - Extract sendAssignReplyAndNotify to reduce duplication in handleAssignCommand - Add getLabels utility for fetching labels once and checking multiple - Parallelize getRecentUnassignments across repos with Promise.all - Extract shared mockCore test helper to test-helpers.js Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ingequality#62) The `shouldSendBotReply` keyword GFI condition used `!isIssueAssignedToSomeoneElse` which is true both when unassigned and when assigned to the commenter. This caused an already-assigned contributor using keywords to get a misleading "comment /assign to assign yourself" message. Add `isUnassigned` parameter to distinguish the two cases, and add a test verifying the fix. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The yarn.lock was not committed when jest was added to devDependencies in package.json. Without this update, `yarn install --frozen-lockfile` fails in CI workflows. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements the
/assignself-assignment mechanism forgood first issueissues, as agreed in #47.Contributors can comment
/assignon issues labeledhelp wanted+good first issueto self-assign, subject to a 2-issue cross-repo limit and 7-day cooldown on recently dropped issues. The bot posts a guidance comment when thegood first issuelabel is applied, and keyword-based assignment requests on GFI issues now include/assignguidance.All
/assignSlack notifications route to#support-dev-notificationsonly.References
Reviewer guidance
Manual testing is done in test-actions. Temporarily update reusable workflow references to point to this branch.
Key test scenarios:
/assignon an unassignedhelp wanted+good first issueissue → bot assigns and confirms/assignwhen at the 2-issue limit → bot declines with assignment list and cooldown infogood first issuelabel to ahelp wantedissue → bot posts guidance comment/assignguidanceRisky areas:
scripts/utils.js:getRecentUnassignments) — depends on GitHub search indexing latency and timeline event formatscripts/utils.js~line 320) — ensures multiple assign/unassign cycles on the same issue count as one slot/assigndecision tree inhandleAssignCommand(scripts/contributor-issue-comment.js) — many branches with specific Slack routing per pathAI usage
Built entirely by Claude Code following a detailed implementation plan (see
PLAN/index.md). Each task was implemented incrementally with tests written alongside. Code was reviewed for correctness after each step, and all 34 tests pass.@rtibblesbot's comments are generated by an LLM, and should be evaluated accordingly
How was this generated?