recoder-code 1.0.113
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/.babelrc +4 -0
- package/.claude/commands/commit-push-pr.md +19 -0
- package/.claude/commands/dedupe.md +38 -0
- package/.devcontainer/Dockerfile +91 -0
- package/.devcontainer/devcontainer.json +57 -0
- package/.devcontainer/init-firewall.sh +137 -0
- package/.gitattributes +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +188 -0
- package/.github/ISSUE_TEMPLATE/config.yml +17 -0
- package/.github/ISSUE_TEMPLATE/documentation.yml +117 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +132 -0
- package/.github/ISSUE_TEMPLATE/model_behavior.yml +220 -0
- package/.github/workflows/auto-close-duplicates.yml +31 -0
- package/.github/workflows/backfill-duplicate-comments.yml +44 -0
- package/.github/workflows/claude-dedupe-issues.yml +80 -0
- package/.github/workflows/claude-issue-triage.yml +106 -0
- package/.github/workflows/claude.yml +37 -0
- package/.github/workflows/issue-opened-dispatch.yml +28 -0
- package/.github/workflows/lock-closed-issues.yml +92 -0
- package/.github/workflows/log-issue-events.yml +40 -0
- package/CHANGELOG.md +646 -0
- package/KILO.md +1273 -0
- package/LICENSE.md +21 -0
- package/README.md +176 -0
- package/SECURITY.md +12 -0
- package/Script/run_devcontainer_claude_code.ps1 +152 -0
- package/api/githubApi.ts +144 -0
- package/babel.config.js +7 -0
- package/cli/.gitkeep +0 -0
- package/cli/auto-close-duplicates.ts +5 -0
- package/cli/configure.js +33 -0
- package/cli/list-models.js +48 -0
- package/cli/run.js +61 -0
- package/cli/set-api-key.js +26 -0
- package/config.json +4 -0
- package/demo.gif +0 -0
- package/examples/gpt-3.5-turbo.js +38 -0
- package/examples/gpt-4.js +38 -0
- package/examples/hooks/bash_command_validator_example.py +83 -0
- package/index.d.ts +3 -0
- package/index.js +62 -0
- package/jest.config.js +6 -0
- package/openapi.yaml +61 -0
- package/package.json +47 -0
- package/scripts/backfill-duplicate-comments.ts +213 -0
- package/tests/api-githubApi.test.ts +30 -0
- package/tests/auto-close-duplicates.test.ts +145 -0
- package/tests/cli-configure.test.ts +88 -0
- package/tests/cli-list-models.test.ts +44 -0
- package/tests/cli-run.test.ts +97 -0
- package/tests/cli-set-api-key.test.ts +54 -0
- package/tests/cli-validate-api-key.test.ts +52 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
name: ✨ Feature Request
|
|
2
|
+
description: Suggest a new feature or enhancement for Recoder Code
|
|
3
|
+
title: "[FEATURE] "
|
|
4
|
+
labels:
|
|
5
|
+
- enhancement
|
|
6
|
+
body:
|
|
7
|
+
- type: markdown
|
|
8
|
+
attributes:
|
|
9
|
+
value: |
|
|
10
|
+
## Thanks for suggesting a feature!
|
|
11
|
+
|
|
12
|
+
We love hearing ideas from our community. Please help us understand your use case by filling out the sections below.
|
|
13
|
+
Before submitting, please check if this feature has already been requested.
|
|
14
|
+
|
|
15
|
+
- type: checkboxes
|
|
16
|
+
id: preflight
|
|
17
|
+
attributes:
|
|
18
|
+
label: Preflight Checklist
|
|
19
|
+
options:
|
|
20
|
+
- label: I have searched [existing requests](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20label%3Aenhancement) and this feature hasn't been requested yet
|
|
21
|
+
required: true
|
|
22
|
+
- label: This is a single feature request (not multiple features)
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: problem
|
|
27
|
+
attributes:
|
|
28
|
+
label: Problem Statement
|
|
29
|
+
description: |
|
|
30
|
+
What problem are you trying to solve? Why do you need this feature?
|
|
31
|
+
Focus on the problem, not the solution. Help us understand your workflow.
|
|
32
|
+
placeholder: |
|
|
33
|
+
I often need to work with multiple projects simultaneously, but Recoder Code doesn't support...
|
|
34
|
+
|
|
35
|
+
When I'm debugging code, I find it difficult to...
|
|
36
|
+
|
|
37
|
+
The current workflow requires me to manually...
|
|
38
|
+
validations:
|
|
39
|
+
required: true
|
|
40
|
+
|
|
41
|
+
- type: textarea
|
|
42
|
+
id: solution
|
|
43
|
+
attributes:
|
|
44
|
+
label: Proposed Solution
|
|
45
|
+
description: |
|
|
46
|
+
How would you like this to work? Describe the ideal user experience.
|
|
47
|
+
Be specific about how you'd interact with this feature.
|
|
48
|
+
placeholder: |
|
|
49
|
+
I'd like to be able to run `claude --workspace project1,project2` to...
|
|
50
|
+
|
|
51
|
+
There should be a command or setting that allows...
|
|
52
|
+
|
|
53
|
+
The interface should show...
|
|
54
|
+
validations:
|
|
55
|
+
required: true
|
|
56
|
+
|
|
57
|
+
- type: textarea
|
|
58
|
+
id: alternatives
|
|
59
|
+
attributes:
|
|
60
|
+
label: Alternative Solutions
|
|
61
|
+
description: |
|
|
62
|
+
What alternatives have you considered or tried?
|
|
63
|
+
Are there workarounds you're currently using?
|
|
64
|
+
placeholder: |
|
|
65
|
+
I've tried using multiple terminal windows but...
|
|
66
|
+
|
|
67
|
+
Currently I work around this by...
|
|
68
|
+
|
|
69
|
+
Other tools solve this by...
|
|
70
|
+
validations:
|
|
71
|
+
required: false
|
|
72
|
+
|
|
73
|
+
- type: dropdown
|
|
74
|
+
id: priority
|
|
75
|
+
attributes:
|
|
76
|
+
label: Priority
|
|
77
|
+
description: How important is this feature to your workflow?
|
|
78
|
+
options:
|
|
79
|
+
- Critical - Blocking my work
|
|
80
|
+
- High - Significant impact on productivity
|
|
81
|
+
- Medium - Would be very helpful
|
|
82
|
+
- Low - Nice to have
|
|
83
|
+
validations:
|
|
84
|
+
required: true
|
|
85
|
+
|
|
86
|
+
- type: dropdown
|
|
87
|
+
id: category
|
|
88
|
+
attributes:
|
|
89
|
+
label: Feature Category
|
|
90
|
+
description: What area does this feature relate to?
|
|
91
|
+
options:
|
|
92
|
+
- CLI commands and flags
|
|
93
|
+
- Interactive mode (TUI)
|
|
94
|
+
- File operations
|
|
95
|
+
- API and model interactions
|
|
96
|
+
- MCP server integration
|
|
97
|
+
- Performance and speed
|
|
98
|
+
- Configuration and settings
|
|
99
|
+
- Developer tools/SDK
|
|
100
|
+
- Documentation
|
|
101
|
+
- Other
|
|
102
|
+
validations:
|
|
103
|
+
required: true
|
|
104
|
+
|
|
105
|
+
- type: textarea
|
|
106
|
+
id: use_case
|
|
107
|
+
attributes:
|
|
108
|
+
label: Use Case Example
|
|
109
|
+
description: |
|
|
110
|
+
Provide a concrete, real-world example of when you'd use this feature.
|
|
111
|
+
Walk us through a scenario step-by-step.
|
|
112
|
+
placeholder: |
|
|
113
|
+
Example scenario:
|
|
114
|
+
1. I'm working on a React app with a Node.js backend
|
|
115
|
+
2. I need to make changes to both frontend and backend
|
|
116
|
+
3. With this feature, I could...
|
|
117
|
+
4. This would save me time because...
|
|
118
|
+
validations:
|
|
119
|
+
required: false
|
|
120
|
+
|
|
121
|
+
- type: textarea
|
|
122
|
+
id: additional
|
|
123
|
+
attributes:
|
|
124
|
+
label: Additional Context
|
|
125
|
+
description: |
|
|
126
|
+
- Screenshots or mockups of the proposed feature
|
|
127
|
+
- Links to similar features in other tools
|
|
128
|
+
- Technical considerations or constraints
|
|
129
|
+
- Any other relevant information
|
|
130
|
+
placeholder: Add any other context, mockups, or examples here...
|
|
131
|
+
validations:
|
|
132
|
+
required: false
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
name: 🤖 Model Behavior Issue
|
|
2
|
+
description: Report unexpected Recoder model behavior, incorrect actions, or permission violations
|
|
3
|
+
title: "[MODEL] "
|
|
4
|
+
labels:
|
|
5
|
+
- model
|
|
6
|
+
body:
|
|
7
|
+
- type: markdown
|
|
8
|
+
attributes:
|
|
9
|
+
value: |
|
|
10
|
+
## Report Unexpected Model Behavior
|
|
11
|
+
|
|
12
|
+
Use this template when Recoder does something unexpected, makes unwanted changes, or behaves inconsistently with your instructions.
|
|
13
|
+
|
|
14
|
+
**This is for:** Unexpected actions, file modifications outside scope, ignoring instructions, making assumptions
|
|
15
|
+
**NOT for:** Crashes, API errors, or installation issues (use Bug Report instead)
|
|
16
|
+
|
|
17
|
+
- type: checkboxes
|
|
18
|
+
id: preflight
|
|
19
|
+
attributes:
|
|
20
|
+
label: Preflight Checklist
|
|
21
|
+
description: Please confirm before submitting
|
|
22
|
+
options:
|
|
23
|
+
- label: I have searched [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Amodel) for similar behavior reports
|
|
24
|
+
required: true
|
|
25
|
+
- label: This report does NOT contain sensitive information (API keys, passwords, etc.)
|
|
26
|
+
required: true
|
|
27
|
+
|
|
28
|
+
- type: dropdown
|
|
29
|
+
id: behavior_type
|
|
30
|
+
attributes:
|
|
31
|
+
label: Type of Behavior Issue
|
|
32
|
+
description: What category best describes the unexpected behavior?
|
|
33
|
+
options:
|
|
34
|
+
- Recoder modified files I didn't ask it to modify
|
|
35
|
+
- Recoder accessed files outside the working directory
|
|
36
|
+
- Recoder ignored my instructions or configuration
|
|
37
|
+
- Recoder reverted/undid previous changes without asking
|
|
38
|
+
- Recoder made incorrect assumptions about my project
|
|
39
|
+
- Recoder refused a reasonable request
|
|
40
|
+
- Recoder's behavior changed between sessions
|
|
41
|
+
- Subagent behaved unexpectedly
|
|
42
|
+
- Other unexpected behavior
|
|
43
|
+
validations:
|
|
44
|
+
required: true
|
|
45
|
+
|
|
46
|
+
- type: textarea
|
|
47
|
+
id: what_you_asked
|
|
48
|
+
attributes:
|
|
49
|
+
label: What You Asked Recoder to Do
|
|
50
|
+
description: Provide the exact prompt or command you gave
|
|
51
|
+
placeholder: |
|
|
52
|
+
I asked: "Update the README.md file to add installation instructions"
|
|
53
|
+
|
|
54
|
+
Or I ran: `claude "fix the bug in auth.js"`
|
|
55
|
+
validations:
|
|
56
|
+
required: true
|
|
57
|
+
|
|
58
|
+
- type: textarea
|
|
59
|
+
id: what_claude_did
|
|
60
|
+
attributes:
|
|
61
|
+
label: What Recoder Actually Did
|
|
62
|
+
description: Describe step-by-step what Recoder did instead
|
|
63
|
+
placeholder: |
|
|
64
|
+
1. Recoder read README.md
|
|
65
|
+
2. Instead of updating it, Recoder deleted the entire file
|
|
66
|
+
3. Created a new README from scratch with different content
|
|
67
|
+
4. Also modified package.json without being asked
|
|
68
|
+
5. Changed .gitignore file
|
|
69
|
+
validations:
|
|
70
|
+
required: true
|
|
71
|
+
|
|
72
|
+
- type: textarea
|
|
73
|
+
id: expected_behavior
|
|
74
|
+
attributes:
|
|
75
|
+
label: Expected Behavior
|
|
76
|
+
description: What should Recoder have done?
|
|
77
|
+
placeholder: |
|
|
78
|
+
Recoder should have:
|
|
79
|
+
1. Read the existing README.md
|
|
80
|
+
2. Added an "Installation" section
|
|
81
|
+
3. Only modified that single file
|
|
82
|
+
4. Not touched any other files
|
|
83
|
+
validations:
|
|
84
|
+
required: true
|
|
85
|
+
|
|
86
|
+
- type: textarea
|
|
87
|
+
id: files_affected
|
|
88
|
+
attributes:
|
|
89
|
+
label: Files Affected
|
|
90
|
+
description: |
|
|
91
|
+
List all files that were accessed or modified (even if you didn't expect them to be)
|
|
92
|
+
placeholder: |
|
|
93
|
+
Modified:
|
|
94
|
+
- README.md (deleted and recreated)
|
|
95
|
+
- package.json (version bumped - not requested)
|
|
96
|
+
- .gitignore (added entries - not requested)
|
|
97
|
+
|
|
98
|
+
Read (unexpectedly):
|
|
99
|
+
- /Users/me/.ssh/config
|
|
100
|
+
- ../../../parent-directory/secrets.env
|
|
101
|
+
render: shell
|
|
102
|
+
validations:
|
|
103
|
+
required: false
|
|
104
|
+
|
|
105
|
+
- type: dropdown
|
|
106
|
+
id: permission_mode
|
|
107
|
+
attributes:
|
|
108
|
+
label: Permission Mode
|
|
109
|
+
description: What permission settings were active?
|
|
110
|
+
options:
|
|
111
|
+
- Accept Edits was ON (auto-accepting changes)
|
|
112
|
+
- Accept Edits was OFF (manual approval required)
|
|
113
|
+
- I don't know / Not sure
|
|
114
|
+
validations:
|
|
115
|
+
required: true
|
|
116
|
+
|
|
117
|
+
- type: dropdown
|
|
118
|
+
id: reproducible
|
|
119
|
+
attributes:
|
|
120
|
+
label: Can You Reproduce This?
|
|
121
|
+
description: Does this happen consistently?
|
|
122
|
+
options:
|
|
123
|
+
- Yes, every time with the same prompt
|
|
124
|
+
- Sometimes (intermittent)
|
|
125
|
+
- No, only happened once
|
|
126
|
+
- Haven't tried to reproduce
|
|
127
|
+
validations:
|
|
128
|
+
required: true
|
|
129
|
+
|
|
130
|
+
- type: textarea
|
|
131
|
+
id: reproduction_steps
|
|
132
|
+
attributes:
|
|
133
|
+
label: Steps to Reproduce
|
|
134
|
+
description: If reproducible, provide minimal steps
|
|
135
|
+
placeholder: |
|
|
136
|
+
1. Create a new directory with a simple README.md
|
|
137
|
+
2. Ask Recoder Code to "improve the README"
|
|
138
|
+
3. Recoder will delete and recreate the file instead of editing
|
|
139
|
+
validations:
|
|
140
|
+
required: false
|
|
141
|
+
|
|
142
|
+
- type: dropdown
|
|
143
|
+
id: model
|
|
144
|
+
attributes:
|
|
145
|
+
label: Recoder Model
|
|
146
|
+
description: Which model were you using? (Run `/model` to check)
|
|
147
|
+
options:
|
|
148
|
+
- Sonnet
|
|
149
|
+
- Opus
|
|
150
|
+
- Haiku
|
|
151
|
+
- Not sure
|
|
152
|
+
- Other
|
|
153
|
+
validations:
|
|
154
|
+
required: true
|
|
155
|
+
|
|
156
|
+
- type: textarea
|
|
157
|
+
id: conversation_log
|
|
158
|
+
attributes:
|
|
159
|
+
label: Relevant Conversation
|
|
160
|
+
description: |
|
|
161
|
+
Include relevant parts of Recoder's responses, especially where it explains what it's doing
|
|
162
|
+
placeholder: |
|
|
163
|
+
Recoder said: "I'll help you update the README. Let me first delete the old one and create a fresh version..."
|
|
164
|
+
|
|
165
|
+
[Then proceeded to delete without asking for confirmation]
|
|
166
|
+
render: markdown
|
|
167
|
+
validations:
|
|
168
|
+
required: false
|
|
169
|
+
|
|
170
|
+
- type: dropdown
|
|
171
|
+
id: impact
|
|
172
|
+
attributes:
|
|
173
|
+
label: Impact
|
|
174
|
+
description: How severe was the impact of this behavior?
|
|
175
|
+
options:
|
|
176
|
+
- Critical - Data loss or corrupted project
|
|
177
|
+
- High - Significant unwanted changes
|
|
178
|
+
- Medium - Extra work to undo changes
|
|
179
|
+
- Low - Minor inconvenience
|
|
180
|
+
validations:
|
|
181
|
+
required: true
|
|
182
|
+
|
|
183
|
+
- type: input
|
|
184
|
+
id: version
|
|
185
|
+
attributes:
|
|
186
|
+
label: Recoder Code Version
|
|
187
|
+
description: Run `claude --version` and paste the output
|
|
188
|
+
placeholder: "e.g., 1.0.123 (Recoder Code)"
|
|
189
|
+
validations:
|
|
190
|
+
required: true
|
|
191
|
+
|
|
192
|
+
- type: dropdown
|
|
193
|
+
id: platform
|
|
194
|
+
attributes:
|
|
195
|
+
label: Platform
|
|
196
|
+
description: Which API platform are you using?
|
|
197
|
+
options:
|
|
198
|
+
- Anthropic API
|
|
199
|
+
- AWS Bedrock
|
|
200
|
+
- Google Vertex AI
|
|
201
|
+
- Other
|
|
202
|
+
validations:
|
|
203
|
+
required: true
|
|
204
|
+
|
|
205
|
+
- type: textarea
|
|
206
|
+
id: additional
|
|
207
|
+
attributes:
|
|
208
|
+
label: Additional Context
|
|
209
|
+
description: |
|
|
210
|
+
- Any patterns you've noticed
|
|
211
|
+
- Similar behavior in other sessions
|
|
212
|
+
- Specific file types or project structures that trigger this
|
|
213
|
+
- Screenshots if relevant
|
|
214
|
+
placeholder: |
|
|
215
|
+
This seems to happen more often with:
|
|
216
|
+
- Python projects
|
|
217
|
+
- When there are multiple similar files
|
|
218
|
+
- After long conversations
|
|
219
|
+
validations:
|
|
220
|
+
required: false
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Auto-close duplicate issues
|
|
2
|
+
description: Auto-closes issues that are duplicates of existing issues
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "0 9 * * *"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
auto-close-duplicates:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
timeout-minutes: 10
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
issues: write
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout repository
|
|
18
|
+
uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Setup Bun
|
|
21
|
+
uses: oven-sh/setup-bun@v2
|
|
22
|
+
with:
|
|
23
|
+
bun-version: latest
|
|
24
|
+
|
|
25
|
+
- name: Auto-close duplicate issues
|
|
26
|
+
run: bun run scripts/auto-close-duplicates.ts
|
|
27
|
+
env:
|
|
28
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
29
|
+
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
|
|
30
|
+
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
|
|
31
|
+
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Backfill Duplicate Comments
|
|
2
|
+
description: Triggers duplicate detection for old issues that don't have duplicate comments
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
inputs:
|
|
7
|
+
days_back:
|
|
8
|
+
description: 'How many days back to look for old issues'
|
|
9
|
+
required: false
|
|
10
|
+
default: '90'
|
|
11
|
+
type: string
|
|
12
|
+
dry_run:
|
|
13
|
+
description: 'Dry run mode (true to only log what would be done)'
|
|
14
|
+
required: false
|
|
15
|
+
default: 'true'
|
|
16
|
+
type: choice
|
|
17
|
+
options:
|
|
18
|
+
- 'true'
|
|
19
|
+
- 'false'
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
backfill-duplicate-comments:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
timeout-minutes: 30
|
|
25
|
+
permissions:
|
|
26
|
+
contents: read
|
|
27
|
+
issues: read
|
|
28
|
+
actions: write
|
|
29
|
+
|
|
30
|
+
steps:
|
|
31
|
+
- name: Checkout repository
|
|
32
|
+
uses: actions/checkout@v4
|
|
33
|
+
|
|
34
|
+
- name: Setup Bun
|
|
35
|
+
uses: oven-sh/setup-bun@v2
|
|
36
|
+
with:
|
|
37
|
+
bun-version: latest
|
|
38
|
+
|
|
39
|
+
- name: Backfill duplicate comments
|
|
40
|
+
run: bun run scripts/backfill-duplicate-comments.ts
|
|
41
|
+
env:
|
|
42
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
43
|
+
DAYS_BACK: ${{ inputs.days_back }}
|
|
44
|
+
DRY_RUN: ${{ inputs.dry_run }}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: Recoder Issue Dedupe
|
|
2
|
+
description: Automatically dedupe GitHub issues using Recoder Code
|
|
3
|
+
on:
|
|
4
|
+
issues:
|
|
5
|
+
types: [opened]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
issue_number:
|
|
9
|
+
description: 'Issue number to process for duplicate detection'
|
|
10
|
+
required: true
|
|
11
|
+
type: string
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude-dedupe-issues:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
timeout-minutes: 10
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
issues: write
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- name: Checkout repository
|
|
23
|
+
uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- name: Run Recoder Code slash command
|
|
26
|
+
uses: anthropics/claude-code-base-action@beta
|
|
27
|
+
with:
|
|
28
|
+
prompt: "/dedupe ${{ github.repository }}/issues/${{ github.event.issue.number || inputs.issue_number }}"
|
|
29
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
30
|
+
claude_env: |
|
|
31
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
32
|
+
|
|
33
|
+
- name: Log duplicate comment event to Statsig
|
|
34
|
+
if: always()
|
|
35
|
+
env:
|
|
36
|
+
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
|
37
|
+
run: |
|
|
38
|
+
ISSUE_NUMBER=${{ github.event.issue.number || inputs.issue_number }}
|
|
39
|
+
REPO=${{ github.repository }}
|
|
40
|
+
|
|
41
|
+
if [ -z "$STATSIG_API_KEY" ]; then
|
|
42
|
+
echo "STATSIG_API_KEY not found, skipping Statsig logging"
|
|
43
|
+
exit 0
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
# Prepare the event payload
|
|
47
|
+
EVENT_PAYLOAD=$(jq -n \
|
|
48
|
+
--arg issue_number "$ISSUE_NUMBER" \
|
|
49
|
+
--arg repo "$REPO" \
|
|
50
|
+
--arg triggered_by "${{ github.event_name }}" \
|
|
51
|
+
'{
|
|
52
|
+
events: [{
|
|
53
|
+
eventName: "github_duplicate_comment_added",
|
|
54
|
+
value: 1,
|
|
55
|
+
metadata: {
|
|
56
|
+
repository: $repo,
|
|
57
|
+
issue_number: ($issue_number | tonumber),
|
|
58
|
+
triggered_by: $triggered_by,
|
|
59
|
+
workflow_run_id: "${{ github.run_id }}"
|
|
60
|
+
},
|
|
61
|
+
time: (now | floor | tostring)
|
|
62
|
+
}]
|
|
63
|
+
}')
|
|
64
|
+
|
|
65
|
+
# Send to Statsig API
|
|
66
|
+
echo "Logging duplicate comment event to Statsig for issue #${ISSUE_NUMBER}"
|
|
67
|
+
|
|
68
|
+
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST https://events.statsigapi.net/v1/log_event \
|
|
69
|
+
-H "Content-Type: application/json" \
|
|
70
|
+
-H "STATSIG-API-KEY: ${STATSIG_API_KEY}" \
|
|
71
|
+
-d "$EVENT_PAYLOAD")
|
|
72
|
+
|
|
73
|
+
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
|
74
|
+
BODY=$(echo "$RESPONSE" | head -n-1)
|
|
75
|
+
|
|
76
|
+
if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 202 ]; then
|
|
77
|
+
echo "Successfully logged duplicate comment event for issue #${ISSUE_NUMBER}"
|
|
78
|
+
else
|
|
79
|
+
echo "Failed to log duplicate comment event for issue #${ISSUE_NUMBER}. HTTP ${HTTP_CODE}: ${BODY}"
|
|
80
|
+
fi
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
name: Recoder Issue Triage
|
|
2
|
+
description: Automatically triage GitHub issues using Recoder Code
|
|
3
|
+
on:
|
|
4
|
+
issues:
|
|
5
|
+
types: [opened]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
triage-issue:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
timeout-minutes: 10
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
issues: write
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout repository
|
|
17
|
+
uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Create triage prompt
|
|
20
|
+
run: |
|
|
21
|
+
mkdir -p /tmp/claude-prompts
|
|
22
|
+
cat > /tmp/claude-prompts/triage-prompt.txt << 'EOF'
|
|
23
|
+
You're an issue triage assistant for GitHub issues. Your task is to analyze the issue and select appropriate labels from the provided list.
|
|
24
|
+
|
|
25
|
+
IMPORTANT: Don't post any comments or messages to the issue. Your only action should be to apply labels.
|
|
26
|
+
|
|
27
|
+
Issue Information:
|
|
28
|
+
- REPO: ${{ github.repository }}
|
|
29
|
+
- ISSUE_NUMBER: ${{ github.event.issue.number }}
|
|
30
|
+
|
|
31
|
+
TASK OVERVIEW:
|
|
32
|
+
|
|
33
|
+
1. First, fetch the list of labels available in this repository by running: `gh label list`. Run exactly this command with nothing else.
|
|
34
|
+
|
|
35
|
+
2. Next, use the GitHub tools to get context about the issue:
|
|
36
|
+
- You have access to these tools:
|
|
37
|
+
- mcp__github__get_issue: Use this to retrieve the current issue's details including title, description, and existing labels
|
|
38
|
+
- mcp__github__get_issue_comments: Use this to read any discussion or additional context provided in the comments
|
|
39
|
+
- mcp__github__update_issue: Use this to apply labels to the issue (do not use this for commenting)
|
|
40
|
+
- mcp__github__search_issues: Use this to find similar issues that might provide context for proper categorization and to identify potential duplicate issues
|
|
41
|
+
- mcp__github__list_issues: Use this to understand patterns in how other issues are labeled
|
|
42
|
+
- Start by using mcp__github__get_issue to get the issue details
|
|
43
|
+
|
|
44
|
+
3. Analyze the issue content, considering:
|
|
45
|
+
- The issue title and description
|
|
46
|
+
- The type of issue (bug report, feature request, question, etc.)
|
|
47
|
+
- Technical areas mentioned
|
|
48
|
+
- Severity or priority indicators
|
|
49
|
+
- User impact
|
|
50
|
+
- Components affected
|
|
51
|
+
|
|
52
|
+
4. Select appropriate labels from the available labels list provided above:
|
|
53
|
+
- Choose labels that accurately reflect the issue's nature
|
|
54
|
+
- Be specific but comprehensive
|
|
55
|
+
- Select priority labels if you can determine urgency (high-priority, med-priority, or low-priority)
|
|
56
|
+
- Consider platform labels (android, ios) if applicable
|
|
57
|
+
- If you find similar issues using mcp__github__search_issues, consider using a "duplicate" label if appropriate. Only do so if the issue is a duplicate of another OPEN issue.
|
|
58
|
+
|
|
59
|
+
5. Apply the selected labels:
|
|
60
|
+
- Use mcp__github__update_issue to apply your selected labels
|
|
61
|
+
- DO NOT post any comments explaining your decision
|
|
62
|
+
- DO NOT communicate directly with users
|
|
63
|
+
- If no labels are clearly applicable, do not apply any labels
|
|
64
|
+
|
|
65
|
+
IMPORTANT GUIDELINES:
|
|
66
|
+
- Be thorough in your analysis
|
|
67
|
+
- Only select labels from the provided list above
|
|
68
|
+
- DO NOT post any comments to the issue
|
|
69
|
+
- Your ONLY action should be to apply labels using mcp__github__update_issue
|
|
70
|
+
- It's okay to not add any labels if none are clearly applicable
|
|
71
|
+
EOF
|
|
72
|
+
|
|
73
|
+
- name: Setup GitHub MCP Server
|
|
74
|
+
run: |
|
|
75
|
+
mkdir -p /tmp/mcp-config
|
|
76
|
+
cat > /tmp/mcp-config/mcp-servers.json << 'EOF'
|
|
77
|
+
{
|
|
78
|
+
"mcpServers": {
|
|
79
|
+
"github": {
|
|
80
|
+
"command": "docker",
|
|
81
|
+
"args": [
|
|
82
|
+
"run",
|
|
83
|
+
"-i",
|
|
84
|
+
"--rm",
|
|
85
|
+
"-e",
|
|
86
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN",
|
|
87
|
+
"ghcr.io/github/github-mcp-server:sha-7aced2b"
|
|
88
|
+
],
|
|
89
|
+
"env": {
|
|
90
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "${{ secrets.GITHUB_TOKEN }}"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
EOF
|
|
96
|
+
|
|
97
|
+
- name: Run Recoder Code for Issue Triage
|
|
98
|
+
uses: anthropics/claude-code-base-action@beta
|
|
99
|
+
with:
|
|
100
|
+
prompt_file: /tmp/claude-prompts/triage-prompt.txt
|
|
101
|
+
allowed_tools: "Bash(gh label list),mcp__github__get_issue,mcp__github__get_issue_comments,mcp__github__update_issue,mcp__github__search_issues,mcp__github__list_issues"
|
|
102
|
+
timeout_minutes: "5"
|
|
103
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
104
|
+
mcp_config: /tmp/mcp-config/mcp-servers.json
|
|
105
|
+
claude_env: |
|
|
106
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Recoder Code
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issue_comment:
|
|
5
|
+
types: [created]
|
|
6
|
+
pull_request_review_comment:
|
|
7
|
+
types: [created]
|
|
8
|
+
issues:
|
|
9
|
+
types: [opened, assigned]
|
|
10
|
+
pull_request_review:
|
|
11
|
+
types: [submitted]
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude:
|
|
15
|
+
if: |
|
|
16
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
17
|
+
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
18
|
+
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
|
19
|
+
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
pull-requests: read
|
|
24
|
+
issues: read
|
|
25
|
+
id-token: write
|
|
26
|
+
steps:
|
|
27
|
+
- name: Checkout repository
|
|
28
|
+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
|
29
|
+
with:
|
|
30
|
+
fetch-depth: 1
|
|
31
|
+
|
|
32
|
+
- name: Run Recoder Code
|
|
33
|
+
id: claude
|
|
34
|
+
uses: anthropics/claude-code-action@beta
|
|
35
|
+
with:
|
|
36
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
37
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Issue Opened Dispatch
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issues:
|
|
5
|
+
types: [opened]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
issues: read
|
|
9
|
+
actions: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
notify:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 1
|
|
15
|
+
steps:
|
|
16
|
+
- name: Process new issue
|
|
17
|
+
env:
|
|
18
|
+
ISSUE_URL: ${{ github.event.issue.html_url }}
|
|
19
|
+
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
|
20
|
+
ISSUE_TITLE: ${{ github.event.issue.title }}
|
|
21
|
+
TARGET_REPO: ${{ secrets.ISSUE_OPENED_DISPATCH_TARGET_REPO }}
|
|
22
|
+
GH_TOKEN: ${{ secrets.ISSUE_OPENED_DISPATCH_TOKEN }}
|
|
23
|
+
run: |
|
|
24
|
+
gh api repos/${TARGET_REPO}/dispatches \
|
|
25
|
+
-f event_type=issue_opened \
|
|
26
|
+
-f client_payload[issue_url]="${ISSUE_URL}" || {
|
|
27
|
+
exit 0
|
|
28
|
+
}
|