소스 정보
- 저장소
- github/gh-aw
- 최근 소스 활동
- 2026년 5월 31일 01:30
- 감지된 SKILL.md 언어
- 영어
- 스타
- 5,404
- 포크
- 588
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SKILL.md 표시 중
SKILL.md
소스 지침 · 읽기 전용 미리보기- name
- go-codemod
- description
- Implement and test Go codemods for the gh aw fix command.
# Go Codemod Implementation Guide
Use this skill when adding or updating codemods used by `gh aw fix`.
## Understand the fix pipeline first
1. Review `pkg/cli/fix_command.go` to understand execution flow:
- codemods are loaded once via `GetAllCodemods()`
- each codemod is applied in registry order
- frontmatter is re-parsed before each codemod
- codemods must return `(newContent, applied, error)` and be safe for no-op input
2. Review the codemod registry in `pkg/cli/fix_codemods.go`.
3. Review helper utilities in `pkg/cli/yaml_frontmatter_utils.go` and reusable codemod helper constructors in `pkg/cli/codemod_factory.go`.
## Implementation steps
1. Create a new codemod file in `pkg/cli/` named `codemod_<feature>.go`.
2. Add a package logger with `logger.New("cli:codemod_<feature>")`.
3. Implement `get<Feature>Codemod() Codemod` and populate all metadata fields:
- `ID` (stable, unique)
- `Name` (human-readable)
- `Description` (clear migration behavior)
- `IntroducedIn` (release version)
4. In `Apply`:
- check frontmatter preconditions first
- return unchanged content and `applied=false` when migration is not needed
- transform only frontmatter using `applyFrontmatterLineTransform` from `pkg/cli/yaml_frontmatter_utils.go`
- preserve comments/formatting/markdown body
- avoid lossy rewrites and avoid touching unrelated keys
5. Prefer existing helpers before writing custom parsing logic:
- `findAndReplaceInLine`
- `removeFieldFromBlock`
- `removeParentBlockIfTrulyEmpty`
- `newFieldRemovalCodemod`
- `newMoveTopLevelKeyToOnBlockCodemod`
6. If the codemod depends on external data or side effects, inject dependencies through a `...WithDeps` constructor so tests can mock behavior.
7. Register the codemod in `pkg/cli/fix_codemods.go` within `GetAllCodemods()`.
## Testing requirements
Create `pkg/cli/codemod_<feature>_test.go` and cover:
1. Metadata correctness (`ID`, `Name`, `Description`, `IntroducedIn`, `Apply != nil`).
2. Happy path migration with expected output.
3. No-op behavior when deprecated input is absent.
4. Idempotence behavior (already-migrated input remains unchanged).
5. Preservation guarantees:
- inline comments
- indentation
- markdown body after frontmatter
6. Edge cases specific to the codemod (nested fields, mixed forms, ordering constraints, strict-mode checks, etc.).
7. Dependency-injection behavior if `...WithDeps` exists (success and fallback/error paths).
When complexity is high (expression rewriting, parser-like behavior), add fuzz tests in `codemod_<feature>_fuzz_test.go` using the pattern in `pkg/cli/codemod_steps_run_secrets_env_fuzz_test.go`.
## Registry/order tests
After adding a codemod, update `pkg/cli/fix_codemods_test.go`:
1. Expected codemod IDs list.
2. Expected codemod order list.
Order matters because codemods run sequentially and later codemods observe prior transformations.
## Validation commands
Run targeted checks first:
1. `go test -v ./pkg/cli -run Codemod -count=1`
2. `go test -v ./pkg/cli -run Fix -count=1`
Then run repository standards:
3. `make build`
4. `make test-unit`
5. `make lint`
## Quality bar
A codemod is ready only when it is:
- deterministic
- safe on repeated runs
- conservative (no unrelated rewrites)
- fully covered by tests for migration and no-op paths
- registered and order-verified in fix codemod registry tests
GitHub에서 보기