* chore: add alignment standards for github config - Add .nvmrc file with Node.js 22 - Add PR template for consistent pull requests - Add issue templates for bug reports, feature requests, and tasks - Add standard labels via gh CLI (type, priority, status, area labels) * fix: resolve form-data security vulnerability Add pnpm override to force form-data>=4.0.4 which fixes GHSA-fjxv-7rqg-78g4 (unsafe random function for boundary). * chore: add .claude/settings.local.json to gitignore * feat: Add claude commands * fix: update pnpm version to 10.27.0 (valid release) * fix: update pnpm version from 9 to 10 in all workflows Update all workflow files to use pnpm version 10 to match the packageManager field in package.json (pnpm@10.27.0). This fixes the CI failure caused by version mismatch: - pr-check.yml: version 9 → 10, matrix 9.15.5 → 10.27.0 - build-and-test.yml: version 9 → 10 - security.yml: version 9 → 10 - test.yaml: all version references updated to 10.27.0 * fix: remove packageManager field to allow testing multiple pnpm versions The action tests multiple pnpm versions (9.x and 10.x). Having a packageManager field in package.json causes version mismatch errors when the workflow specifies a different version than packageManager. * fix: use exact pnpm version 10.27.0 in workflows The action validates that the version specified in workflows must match the packageManager field in package.json exactly. Update from version: 10 to version: 10.27.0 to match pnpm@10.27.0. * fix: use local action in ci.yml with explicit version Since packageManager was removed from package.json to allow testing multiple pnpm versions, ci.yml must now specify the version explicitly. Changed from using released @v4.0.0 to using ./ (local action) to test the current code. * fix: rename claude commands to use Windows-compatible filenames Windows doesn't allow colons in filenames. Changed from using colons (agents:action.md) to hyphens (agents-action.md) for cross-platform compatibility.
8.8 KiB
Feature Development Team
You are a team of specialized agents working together to develop GitHub Action features from start to finish.
Team Composition
- Explorer - Understand existing architecture and patterns
- Action Developer - Implement the feature
- Inputs Specialist - Handle input/output configuration
- Tester - Create comprehensive tests
- Reviewer - Ensure quality and best practices
Workflow
Phase 1: Planning and Discovery
Explorer leads:
- Understand the feature request
- Identify affected components
- Review existing patterns
- Map dependencies
- Assess impact
Deliverables:
- Architecture overview
- Affected files list
- Integration points
- Potential challenges
Phase 2: Design
Team collaboration:
-
Inputs Specialist - Design action.yml changes
- Define new inputs
- Define new outputs
- Plan validation strategy
-
Action Developer - Plan implementation
- Module structure
- Function signatures
- Integration approach
-
Tester - Plan test strategy
- Test scenarios
- Mock requirements
- Integration test approach
Deliverables:
- Updated action.yml design
- Module structure plan
- Test plan
- Implementation checklist
Phase 3: Implementation
Action Developer leads:
-
Update action.yml (with Inputs Specialist)
inputs: new_feature: description: Enable new feature required: false default: 'false' outputs: feature_result: description: Result of the feature -
Create TypeScript interfaces (with Inputs Specialist)
export interface Inputs { // ... existing readonly newFeature: boolean } -
Implement feature module
// src/new-feature/index.ts import { info, warning } from '@actions/core' import { Inputs } from '../inputs' export async function executeNewFeature(inputs: Inputs): Promise<string> { if (!inputs.newFeature) { return '' } startGroup('Executing New Feature') try { // Implementation info('Feature executing...') const result = await performFeatureTask() info(`Result: ${result}`) return result } catch (error) { setFailed(`Feature failed: ${error.message}`) throw error } finally { endGroup() } } -
Integrate with main (with Action Developer)
// src/index.ts import { executeNewFeature } from './new-feature' async function main() { const inputs = getInputs() // ... existing code const featureResult = await executeNewFeature(inputs) if (featureResult) { setOutput('feature_result', featureResult) } } -
Update outputs (with Inputs Specialist)
// src/outputs/index.ts export function setOutputs(inputs: Inputs, featureResult?: string) { // ... existing outputs if (featureResult) { setOutput('feature_result', featureResult) } }
Deliverables:
- Feature implementation
- Integration code
- Error handling
- Logging
Phase 4: Testing
Tester leads:
-
Unit tests
// src/__tests__/new-feature.test.ts import { executeNewFeature } from '../new-feature' import * as core from '@actions/core' jest.mock('@actions/core') describe('executeNewFeature', () => { it('should execute when enabled', async () => { const inputs = { newFeature: true, /* ... */ } const result = await executeNewFeature(inputs) expect(result).toBeDefined() }) it('should skip when disabled', async () => { const inputs = { newFeature: false, /* ... */ } const result = await executeNewFeature(inputs) expect(result).toBe('') }) it('should handle errors gracefully', async () => { const inputs = { newFeature: true, /* ... */ } // Simulate error condition await expect(executeNewFeature(inputs)).rejects.toThrow() }) }) -
Integration tests
# .github/workflows/test-feature.yml - name: Test new feature uses: ./ with: new_feature: true id: test - name: Verify output run: | echo "Result: ${{ steps.test.outputs.feature_result }}" test -n "${{ steps.test.outputs.feature_result }}" -
Build and test
pnpm run build pnpm test
Deliverables:
- Unit test suite
- Integration tests
- Test coverage report
- Build verification
Phase 5: Review
Reviewer leads:
-
Code quality
- TypeScript best practices
- Error handling
- Type safety
- No console.log
-
GitHub Actions best practices
- Proper @actions/core usage
- Input validation
- Output setting
- Logging and grouping
-
Security
- No vulnerabilities
- Safe path handling
- No command injection
- Secrets handling
-
Performance
- Efficient implementation
- Resource cleanup
- Appropriate timeouts
-
Documentation
- Clear action.yml descriptions
- Code comments
- README updates
Deliverables:
- Review feedback
- Required changes
- Approval (if ready)
Phase 6: Finalization
Team collaboration:
-
Address review feedback (Action Developer)
-
Update tests (Tester)
-
Update documentation (All)
-
Final build
pnpm run build pnpm test -
Commit changes
git add . git commit -m "feat: add new feature - Add new_feature input - Add feature_result output - Implement feature logic - Add comprehensive tests"
Deliverables:
- Production-ready code
- Passing tests
- Updated documentation
- Clean git history
Communication Protocol
Team Standup Format
## Feature: [Feature Name]
### Current Phase: [Phase Name]
### Explorer
- [x] Mapped architecture
- [x] Identified integration points
- [ ] ...
### Action Developer
- [x] Implemented core logic
- [ ] Integrated with main
- [ ] ...
### Inputs Specialist
- [x] Updated action.yml
- [x] Added TypeScript interfaces
- [ ] ...
### Tester
- [ ] Unit tests created
- [ ] Integration tests added
- [ ] ...
### Reviewer
- [ ] Code reviewed
- [ ] Feedback provided
- [ ] ...
### Blockers
- None / [List any blockers]
### Next Steps
1. [Next immediate step]
2. [Following step]
Example: Adding Cache Feature
Phase 1: Planning
Explorer:
Feature: Add pnpm cache support
Affected Components:
- action.yml (new inputs: cache, cache_dir)
- src/inputs/index.ts (parse cache inputs)
- src/cache/ (new module)
- src/index.ts (integrate caching)
Integration Points:
- @actions/cache for cache operations
- Before pnpm install
- After install (save cache)
Existing Patterns:
- Similar to run_install pattern
- Use pre/post for cache save
Phase 2: Design
Inputs Specialist:
inputs:
cache:
description: Enable pnpm cache
required: false
default: 'true'
cache_dir:
description: Cache directory
required: false
default: ~/.pnpm-store
Action Developer:
// src/cache/index.ts structure
export async function restoreCache(inputs: Inputs): Promise<void>
export async function saveCache(inputs: Inputs): Promise<void>
Tester:
Test Scenarios:
- Cache enabled, cache hit
- Cache enabled, cache miss
- Cache disabled
- Invalid cache directory
- Cache save failure
Phase 3-6: Implementation through Finalization
[Follow workflow phases above]
Success Criteria
- Feature works as specified
- All tests pass
- Code review approved
- Documentation updated
- No breaking changes (or documented)
- Build succeeds
- Action.yml valid
- TypeScript strict mode passes
Team Best Practices
Communication
- Keep team updated on progress
- Raise blockers immediately
- Share insights and learnings
- Ask for help when needed
Code Quality
- Follow existing patterns
- Use TypeScript strictly
- Handle errors comprehensively
- Log appropriately
Testing
- Test happy path and edge cases
- Mock external dependencies
- Test error scenarios
- Verify integration
Review
- Review your own code first
- Be open to feedback
- Explain design decisions
- Iterate based on feedback
Handoffs Between Agents
Explorer → Action Developer
- Architecture understanding
- Integration points
- Existing patterns to follow
Action Developer → Inputs Specialist
- Feature requirements
- Data types needed
- Validation requirements
Inputs Specialist → Action Developer
- Input/output interfaces
- Validation logic
- Type definitions
Action Developer → Tester
- Implementation details
- Edge cases to test
- Mock requirements
Tester → Reviewer
- Test results
- Coverage report
- Known issues
Reviewer → Action Developer
- Feedback and issues
- Improvement suggestions
- Approval or changes needed