Free SKILL.md scraped from GitHub. Clone the repo or copy the file directly into your Claude Code skills directory.
npx versuz@latest install bug-fixgit clone https://github.com/daytonaio/daytona.gitcp daytona/guides/typescript/flue/.agents/skills/bug-fix/SKILL.md ~/.claude/skills/bug-fix/SKILL.md---
name: bug-fix
description: Reproduce a GitHub issue with a failing test, implement the minimal fix, verify tests pass, and open a pull request. Use this skill when given an issue number and a working checkout of the target repository.
---
You are operating inside a Daytona sandbox with a freshly-cloned checkout of `{{repo}}` at the current working directory. Dependencies are already installed using **{{packageManager}}** (use `{{packageManager}} test`, `{{packageManager}} run <script>`, etc. throughout; never substitute another tool).
The repo you're working in (`{{repo}}`) is the **fork** that will receive your branch + PR. The issue lives on **`{{issueRepo}}`** (typically the upstream parent of `{{repo}}`, since GitHub disables issues on forks by default). Treat them as two separate concerns: read the issue from `{{issueRepo}}`, push and PR against `{{repo}}`.
Your task: fix issue **#{{issueNumber}}** end-to-end. Issue payload:
```json
{{issueData}}
```
Follow these phases in order. Do not skip phases. Do not combine phases.
**Work directly in this session.** Do NOT call the `task` tool to delegate this skill (or any of its phases) to a sub-agent. You have full access to `read`, `write`, `edit`, `bash`, `grep`, and `glob` tools here, plus the entire repository checkout in the current working directory. Delegating wastes round-trips and quickly hits Flue's task-depth limit.
## Phase 1: Understand
1. Read the issue body carefully. Identify the **expected behavior**, the **actual behavior**, and any **reproduction steps** the reporter mentioned.
2. Inspect the project layout: read `package.json`, `README.md`, and `AGENTS.md` if present. Identify the test framework (vitest, jest, node:test, tsx test runner, etc.) and the test command.
3. Locate the source file(s) most likely involved in the bug. Read them fully — do not skim.
4. Read at least one existing test file to learn the project's testing conventions (file naming, import style, assertion library).
## Phase 2: Reproduce
1. Create a new git branch named `flue/fix-issue-{{issueNumber}}`.
2. Write a **single, focused test** that asserts the expected behavior described in the issue. The test must currently fail because of the bug.
3. Run the test command. **The test must fail.** If it passes, you have not reproduced the bug — re-read the issue and try again.
4. Save the failing test output. You will reference it in the PR body.
## Phase 3: Fix
1. Make the **minimal** code change required to make the failing test pass.
2. Do not refactor unrelated code. Do not reformat untouched files. Do not edit lockfiles.
3. Run the full test suite. **All tests must pass**, including pre-existing ones.
## Phase 4: Pull Request
1. Stage and commit the changes with a clear conventional-style message:
`fix: <one-line summary> (#{{issueNumber}})`
2. Push the branch to the fork (`{{repo}}`): `git push origin flue/fix-issue-{{issueNumber}}`.
3. Open a pull request **against the fork's own default branch** (not upstream). Pin both `--repo` and `--base` explicitly so `gh` doesn't accidentally target `{{issueRepo}}`:
```
gh pr create --repo {{repo}} \
--base $(gh repo view {{repo}} --json defaultBranchRef --jq '.defaultBranchRef.name') \
--head flue/fix-issue-{{issueNumber}} \
--title "fix: <summary>" \
--body "..."
```
Use this PR body structure:
```
Closes {{issueRepo}}#{{issueNumber}}
## Reproduction
<paste the failing test output captured in Phase 2>
## Fix
<one paragraph explaining the root cause and the change>
## Verification
<paste the passing test output from Phase 3>
---
Generated by a Flue + Daytona bug-fix agent.
```
The cross-repo `Closes {{issueRepo}}#{{issueNumber}}` reference is required because the PR lives on the fork (`{{repo}}`) but the issue lives on the upstream (`{{issueRepo}}`). A bare `Closes #{{issueNumber}}` would point at the fork's own issue tracker, which is empty by default.
## Output
Return a structured result with these fields:
- `branch`: the branch name you created
- `prUrl`: the URL of the pull request you opened
- `testFile`: the path of the test file you added or modified
- `filesChanged`: the array of file paths you changed (relative to repo root)
- `summary`: one sentence describing the root cause and your fix
## Hard rules
- Do NOT use the `task` tool. Work directly in this session.
- The failing test MUST fail before the fix and MUST pass after the fix. No exceptions.
- The fix must be minimal. If you find yourself touching more than two source files, stop and reconsider.
- Never disable, skip, or delete pre-existing tests.
- Never use `--force` on git push. Push to a fresh branch.
- If the issue is ambiguous or you cannot reproduce it after one honest attempt, return early with `{ branch: "", prUrl: "", testFile: "", filesChanged: [], summary: "<what context is missing>" }`. Do not fabricate.