Files
everything-claude-code/.opencode/commands/go-test.md
Affaan Mustafa 6d440c036d feat: complete OpenCode plugin support with hooks, tools, and commands
Major OpenCode integration overhaul:

- llms.txt: Comprehensive OpenCode documentation for LLMs (642 lines)
- .opencode/plugins/ecc-hooks.ts: All Claude Code hooks translated to OpenCode's plugin system
- .opencode/tools/*.ts: 3 custom tools (run-tests, check-coverage, security-audit)
- .opencode/commands/*.md: All 24 commands in OpenCode format
- .opencode/package.json: npm package structure for opencode-ecc
- .opencode/index.ts: Main plugin entry point

- Delete incorrect LIMITATIONS.md (hooks ARE supported via plugins)
- Rewrite MIGRATION.md with correct hook event mapping
- Update README.md OpenCode section to show full feature parity

OpenCode has 20+ events vs Claude Code's 3 phases:
- PreToolUse → tool.execute.before
- PostToolUse → tool.execute.after
- Stop → session.idle
- SessionStart → session.created
- SessionEnd → session.deleted
- Plus: file.edited, file.watcher.updated, permission.asked, todo.updated

- 12 agents: Full parity
- 24 commands: Full parity (+1 from original 23)
- 16 skills: Full parity
- Hooks: OpenCode has MORE (20+ events vs 3 phases)
- Custom Tools: 3 native OpenCode tools

The OpenCode configuration can now be:
1. Used directly: cd everything-claude-code && opencode
2. Installed via npm: npm install opencode-ecc
2026-02-05 05:14:33 -08:00

132 lines
2.5 KiB
Markdown

---
description: Go TDD workflow with table-driven tests
agent: tdd-guide
subtask: true
---
# Go Test Command
Implement using Go TDD methodology: $ARGUMENTS
## Your Task
Apply test-driven development with Go idioms:
1. **Define types** - Interfaces and structs
2. **Write table-driven tests** - Comprehensive coverage
3. **Implement minimal code** - Pass the tests
4. **Benchmark** - Verify performance
## TDD Cycle for Go
### Step 1: Define Interface
```go
type Calculator interface {
Calculate(input Input) (Output, error)
}
type Input struct {
// fields
}
type Output struct {
// fields
}
```
### Step 2: Table-Driven Tests
```go
func TestCalculate(t *testing.T) {
tests := []struct {
name string
input Input
want Output
wantErr bool
}{
{
name: "valid input",
input: Input{...},
want: Output{...},
},
{
name: "invalid input",
input: Input{...},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Calculate(tt.input)
if (err != nil) != tt.wantErr {
t.Errorf("Calculate() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Calculate() = %v, want %v", got, tt.want)
}
})
}
}
```
### Step 3: Run Tests (RED)
```bash
go test -v ./...
```
### Step 4: Implement (GREEN)
```go
func Calculate(input Input) (Output, error) {
// Minimal implementation
}
```
### Step 5: Benchmark
```go
func BenchmarkCalculate(b *testing.B) {
input := Input{...}
for i := 0; i < b.N; i++ {
Calculate(input)
}
}
```
## Go Testing Commands
```bash
# Run all tests
go test ./...
# Run with verbose output
go test -v ./...
# Run with coverage
go test -cover ./...
# Run with race detector
go test -race ./...
# Run benchmarks
go test -bench=. ./...
# Generate coverage report
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
```
## Test File Organization
```
package/
├── calculator.go # Implementation
├── calculator_test.go # Tests
├── testdata/ # Test fixtures
│ └── input.json
└── mock_test.go # Mock implementations
```
---
**TIP**: Use `testify/assert` for cleaner assertions, or stick with stdlib for simplicity.