213 lines
7.0 KiB
Markdown
213 lines
7.0 KiB
Markdown
---
|
|
adapter:
|
|
language: go
|
|
display_name: "Go"
|
|
version: "1.0"
|
|
|
|
detection:
|
|
files: [go.mod, go.sum]
|
|
confidence: 0.95
|
|
|
|
commands:
|
|
build: "go build ./..."
|
|
test: "go test ./..."
|
|
lint: "golangci-lint run"
|
|
lint_arch: "make lint-arch"
|
|
format: "gofmt -w ."
|
|
start: null # Inferred from cmd/ structure or main.go
|
|
dev: null # Often uses "air" but not assumed
|
|
|
|
package_manager:
|
|
detection: [] # Go modules are built-in
|
|
default: "go"
|
|
install_command: "go mod download"
|
|
|
|
route_detection:
|
|
server_indicators:
|
|
- pattern: 'http\.ListenAndServe|http\.Server\{|\.Listen\('
|
|
description: "Standard library HTTP server"
|
|
frameworks: ["net/http"]
|
|
- pattern: 'gin\.Default|gin\.New'
|
|
description: "Gin web framework"
|
|
frameworks: ["gin"]
|
|
- pattern: 'chi\.NewRouter|chi\.NewMux'
|
|
description: "Chi router"
|
|
frameworks: ["chi"]
|
|
- pattern: 'echo\.New\(\)'
|
|
description: "Echo web framework"
|
|
frameworks: ["echo"]
|
|
- pattern: 'mux\.NewRouter'
|
|
description: "Gorilla Mux router"
|
|
frameworks: ["gorilla/mux"]
|
|
- pattern: 'fiber\.New\(\)'
|
|
description: "Fiber web framework"
|
|
frameworks: ["fiber"]
|
|
|
|
cli_indicators:
|
|
- pattern: 'github\.com/spf13/cobra'
|
|
description: "Cobra CLI framework"
|
|
frameworks: ["cobra"]
|
|
- pattern: 'github\.com/urfave/cli'
|
|
description: "urfave/cli framework"
|
|
frameworks: ["urfave/cli"]
|
|
- pattern: 'flag\.Parse\(\)|flag\.String\('
|
|
description: "Standard library flags"
|
|
frameworks: ["flag"]
|
|
|
|
frontend_indicators: [] # Go is not typically used for frontend
|
|
|
|
patterns:
|
|
# Chi router
|
|
- type: route
|
|
regex: 'r\.(Get|Post|Put|Delete|Patch|Head|Options)\s*\(\s*["\x27]([^"\x27]+)["\x27]'
|
|
groups: [method, path]
|
|
frameworks: ["chi"]
|
|
# Gin
|
|
- type: route
|
|
regex: '\.(GET|POST|PUT|DELETE|PATCH)\s*\(\s*["\x27]([^"\x27]+)["\x27]'
|
|
groups: [method, path]
|
|
frameworks: ["gin"]
|
|
# Echo
|
|
- type: route
|
|
regex: 'e\.(GET|POST|PUT|DELETE|PATCH)\s*\(\s*["\x27]([^"\x27]+)["\x27]'
|
|
groups: [method, path]
|
|
frameworks: ["echo"]
|
|
# Gorilla Mux
|
|
- type: route
|
|
regex: '\.HandleFunc\s*\(\s*["\x27]([^"\x27]+)["\x27].*\)\.(Methods)\s*\(\s*["\x27]([^"\x27]+)["\x27]\)'
|
|
groups: [path, _, method]
|
|
frameworks: ["gorilla/mux"]
|
|
# net/http
|
|
- type: route
|
|
regex: 'http\.HandleFunc\s*\(\s*["\x27]([^"\x27]+)["\x27]'
|
|
groups: [path]
|
|
frameworks: ["net/http"]
|
|
# Cobra CLI
|
|
- type: command
|
|
regex: '&cobra\.Command\s*\{\s*Use:\s*["\x27]([^"\x27\s]+)'
|
|
groups: [command_name]
|
|
frameworks: ["cobra"]
|
|
|
|
import_analysis:
|
|
list_packages: "go list -json ./..."
|
|
import_pattern: '"([^"]+)"'
|
|
source_extensions: [".go"]
|
|
module_root_file: "go.mod"
|
|
|
|
layer_conventions:
|
|
patterns:
|
|
- layer: 0
|
|
paths: ["internal/types", "types", "domain", "model", "entity"]
|
|
description: "Pure types, zero internal imports"
|
|
- layer: 1
|
|
paths: ["internal/utils", "utils", "pkg/utils", "lib"]
|
|
description: "Utilities, depend only on types"
|
|
- layer: 2
|
|
paths: ["internal/core", "core", "internal/service", "service"]
|
|
description: "Business logic, depend on types + utils"
|
|
- layer: 3
|
|
paths: ["internal/handler", "handler", "api", "internal/api"]
|
|
description: "HTTP/gRPC handlers, depend on core"
|
|
- layer: 4
|
|
paths: ["cmd"]
|
|
description: "Entry points, depend on everything"
|
|
|
|
dependency_detection:
|
|
manifest_file: "go.mod"
|
|
databases:
|
|
- pattern: "github.com/jackc/pgx|github.com/lib/pq"
|
|
type: "postgres"
|
|
default_port: 5432
|
|
- pattern: "github.com/go-sql-driver/mysql"
|
|
type: "mysql"
|
|
default_port: 3306
|
|
- pattern: "go.mongodb.org/mongo-driver"
|
|
type: "mongodb"
|
|
default_port: 27017
|
|
- pattern: "github.com/go-redis/redis|github.com/redis/go-redis"
|
|
type: "redis"
|
|
default_port: 6379
|
|
- pattern: "github.com/mattn/go-sqlite3|modernc.org/sqlite"
|
|
type: "sqlite"
|
|
default_port: 0
|
|
services:
|
|
- pattern: "github.com/segmentio/kafka-go|github.com/IBM/sarama"
|
|
type: "kafka"
|
|
default_port: 9092
|
|
- pattern: "github.com/rabbitmq/amqp091-go|github.com/streadway/amqp"
|
|
type: "rabbitmq"
|
|
default_port: 5672
|
|
- pattern: "github.com/nats-io/nats.go"
|
|
type: "nats"
|
|
default_port: 4222
|
|
- pattern: "github.com/elastic/go-elasticsearch"
|
|
type: "elasticsearch"
|
|
default_port: 9200
|
|
env_var_patterns:
|
|
- pattern: 'os\.Getenv\("([^"]+)"\)'
|
|
- pattern: 'os\.LookupEnv\("([^"]+)"\)'
|
|
- pattern: 'viper\.\w+\("([^"]+)"\)'
|
|
|
|
linter:
|
|
template_section: "go-linter"
|
|
script_extension: ".go"
|
|
run_command: "go run scripts/lint-deps.go"
|
|
|
|
naming:
|
|
file_pattern: "^[a-z][a-z0-9_]*\\.go$"
|
|
test_pattern: "^[a-z][a-z0-9_]*_test\\.go$"
|
|
directory_style: "snake_case"
|
|
|
|
ci:
|
|
github_actions:
|
|
image: "golang:1.22"
|
|
setup_steps:
|
|
- "uses: actions/setup-go@v5\n with:\n go-version: '1.22'"
|
|
cache_paths: ["~/go/pkg/mod", "~/.cache/go-build"]
|
|
---
|
|
|
|
# Go Adapter
|
|
|
|
## Server Start Command Inference
|
|
|
|
Priority order for detecting the server start command:
|
|
|
|
1. Existing `harness/config/environment.json` startup command, if present
|
|
2. `cmd/server/main.go` exists → `go run cmd/server/main.go`
|
|
3. `cmd/api/main.go` exists → `go run cmd/api/main.go`
|
|
4. `main.go` at root with `http` import → `go run main.go`
|
|
5. Fail with actionable error
|
|
|
|
## CLI Binary Inference
|
|
|
|
1. `cmd/cli/main.go` exists → `go build -o bin/cli cmd/cli/main.go`
|
|
2. `cmd/<name>/main.go` exists → `go build -o bin/<name> cmd/<name>/main.go`
|
|
3. `main.go` at root with `cobra`/`flag` import → `go build -o bin/app .`
|
|
|
|
## Testing Patterns
|
|
|
|
- Unit tests: `*_test.go` files alongside source
|
|
- Integration tests: `//go:build integration` build tag → `go test -tags=integration ./...`
|
|
- Table-driven tests are idiomatic
|
|
|
|
## Common Frameworks
|
|
|
|
| Framework | Detection Pattern | Route Style |
|
|
|-----------|------------------|-------------|
|
|
| chi | `github.com/go-chi/chi` | `r.Get("/path", handler)` |
|
|
| gin | `github.com/gin-gonic/gin` | `r.GET("/path", handler)` |
|
|
| echo | `github.com/labstack/echo` | `e.GET("/path", handler)` |
|
|
| fiber | `github.com/gofiber/fiber` | `app.Get("/path", handler)` |
|
|
| gorilla/mux | `github.com/gorilla/mux` | `r.HandleFunc("/path", handler).Methods("GET")` |
|
|
| net/http | stdlib | `http.HandleFunc("/path", handler)` |
|
|
|
|
## Structured Logging
|
|
|
|
Go projects should use structured loggers. Common patterns to detect:
|
|
- `go.uber.org/zap` → `zap.String()`, `zap.Int()`
|
|
- `log/slog` (stdlib) → `slog.Info()`, `slog.With()`
|
|
- `github.com/rs/zerolog` → `log.Info().Str().Msg()`
|
|
- `github.com/sirupsen/logrus` → `logrus.WithFields()`
|
|
|
|
Unstructured patterns to flag: `log.Printf`, `log.Println`, `log.Fatalf`, `fmt.Printf` (in non-CLI code)
|