docs: update Go code style guidelines and linting requirements
CI / changes (push) Successful in 8s
CI / commitlint (push) Has been skipped
CI / openapi (push) Successful in 27s
CI / web (push) Successful in 36s
CI / go (push) Successful in 54s
CI / bird2 (push) Successful in 16s
CI / release (push) Successful in 3m46s

- Enhanced AGENTS.md to include post-editing commands for Go code, specifying the use of `gofmt -w`, `go vet ./...`, and `scripts/lint-go.ps1`.
- Updated engineering rules in .cursor/rules/engineering.mdc to clarify the linting process and ensure consistency in Go code formatting.
- Improved documentation for CI checks related to Go code style and linting.
This commit is contained in:
Denozordec
2026-05-21 12:50:14 +07:00
parent b8170c4204
commit 6fa265a246
7 changed files with 81 additions and 40 deletions
+5 -4
View File
@@ -57,9 +57,9 @@ alwaysApply: true
## Code Style ## Code Style
**STYLE-01** | MUST | Go-код после `gofmt`; перед PR — `go vet ./...`. **STYLE-01** | MUST | Go-код после `gofmt`; перед PR — `go vet ./...`. Агент после правок Go: `gofmt -w` на изменённых файлах + `golangci-lint run` (или `scripts/lint-go.*`) до exit 0.
*Rationale:* единый стиль. *Rationale:* CI job `go` включает golangci-lint (gofmt).
*Проверка:* CI job `go`. *Проверка:* CI job `go`; `.cursor/rules/engineering.mdc` STYLE-01.
**STYLE-02** | MUST | Экспортируемые типы/функции публичных пакетов — godoc-комментарий. **STYLE-02** | MUST | Экспортируемые типы/функции публичных пакетов — godoc-комментарий.
*Rationale:* навигация по API пакетов. *Rationale:* навигация по API пакетов.
@@ -230,7 +230,8 @@ alwaysApply: true
go vet ./... go vet ./...
go test ./... -race -count=1 go test ./... -race -count=1
npx @redocly/cli lint docs/openapi.yaml npx @redocly/cli lint docs/openapi.yaml
# web: cd web; npm run check; npm run lint # web: cd web; npm run check; npm run lint (или scripts/lint-web.ps1)
# go fmt/lint: gofmt -w <files>; scripts/lint-go.ps1 (gofmt + vet + golangci-lint)
# birdfmt: go test ./internal/birdfmt/... -count=1 # birdfmt: go test ./internal/birdfmt/... -count=1
``` ```
+1
View File
@@ -51,6 +51,7 @@
- Консоль пользователя: **PowerShell**; пути в стиле `deploy\compose`. - Консоль пользователя: **PowerShell**; пути в стиле `deploy\compose`.
- Быстрый старт и переменные: [docs/quickstart.md](docs/quickstart.md), [README.md](README.md). - Быстрый старт и переменные: [docs/quickstart.md](docs/quickstart.md), [README.md](README.md).
- **Go:** после правок — `gofmt -w`, `go vet ./...`, `scripts/lint-go.ps1` (как CI golangci-lint).
## Язык документации проекта ## Язык документации проекта
+17 -17
View File
@@ -15,20 +15,20 @@ import (
// Config holds evobgp-agent serve settings. // Config holds evobgp-agent serve settings.
type Config struct { type Config struct {
Listen string Listen string
Secret string Secret string
ControlPlaneURL string ControlPlaneURL string
NodeToken string NodeToken string
SpeakerID string SpeakerID string
PubKeyB64 string PubKeyB64 string
PubKeyHex string PubKeyHex string
ExtractDir string ExtractDir string
BirdBin string BirdBin string
BirdcBin string BirdcBin string
Socket string Socket string
SyncTimeout time.Duration SyncTimeout time.Duration
LastSync func() (revisionID string, at time.Time) LastSync func() (revisionID string, at time.Time)
OnSyncSuccess func(revisionID string) OnSyncSuccess func(revisionID string)
} }
// Server serves Panel→Node internal API (Remnawave-style wake-up). // Server serves Panel→Node internal API (Remnawave-style wake-up).
@@ -107,9 +107,9 @@ func (s *Server) handleSync(w http.ResponseWriter, r *http.Request) {
s.cfg.OnSyncSuccess(res.RevisionID) s.cfg.OnSyncSuccess(res.RevisionID)
} }
writeJSON(w, http.StatusOK, map[string]any{ writeJSON(w, http.StatusOK, map[string]any{
"ok": true, "ok": true,
"applied_revision_id": res.RevisionID, "applied_revision_id": res.RevisionID,
"main_config": res.MainConfig, "main_config": res.MainConfig,
}) })
} }
+14 -14
View File
@@ -17,18 +17,18 @@ import (
// SyncConfig drives pull → verify → apply on a replica node. // SyncConfig drives pull → verify → apply on a replica node.
type SyncConfig struct { type SyncConfig struct {
BaseURL string BaseURL string
Token string Token string
SpeakerID string SpeakerID string
RevisionID string // empty = latest published on CP RevisionID string // empty = latest published on CP
PubKeyB64 string PubKeyB64 string
PubKeyHex string PubKeyHex string
ExtractDir string ExtractDir string
BundlePath string // temp file; default os.TempDir()/evobgp-bundle.tar.gz BundlePath string // temp file; default os.TempDir()/evobgp-bundle.tar.gz
BirdBin string BirdBin string
BirdcBin string BirdcBin string
Socket string Socket string
HTTPClient interface { HTTPClient interface {
Do(req interface{}) (interface{}, error) Do(req interface{}) (interface{}, error)
} }
Timeout time.Duration Timeout time.Duration
@@ -106,9 +106,9 @@ func SyncBundle(ctx context.Context, cfg SyncConfig) (SyncResult, error) {
// SyncResultJSON encodes SyncResult for HTTP responses. // SyncResultJSON encodes SyncResult for HTTP responses.
func SyncResultJSON(r SyncResult) ([]byte, error) { func SyncResultJSON(r SyncResult) ([]byte, error) {
return json.Marshal(map[string]any{ return json.Marshal(map[string]any{
"ok": true, "ok": true,
"applied_revision_id": r.RevisionID, "applied_revision_id": r.RevisionID,
"main_config": r.MainConfig, "main_config": r.MainConfig,
}) })
} }
+5 -5
View File
@@ -26,11 +26,11 @@ type Result struct {
// Options configures Panel→Node HTTP dispatch. // Options configures Panel→Node HTTP dispatch.
type Options struct { type Options struct {
HTTPClient *http.Client HTTPClient *http.Client
Timeout time.Duration Timeout time.Duration
MaxRetries int MaxRetries int
InsecureTLS bool InsecureTLS bool
RevisionID string RevisionID string
} }
func (o Options) client() *http.Client { func (o Options) client() *http.Client {
+19
View File
@@ -0,0 +1,19 @@
# Same gates as CI job go (subset): gofmt, vet, golangci-lint.
$ErrorActionPreference = 'Stop'
Set-Location (Join-Path $PSScriptRoot '..')
$unfmt = gofmt -l . 2>$null
if ($unfmt) {
Write-Error "gofmt: unformatted files:`n$unfmt"
}
go vet ./...
$golangci = Get-Command golangci-lint -ErrorAction SilentlyContinue
if (-not $golangci) {
$golangciPath = Join-Path $env:USERPROFILE 'go\bin\golangci-lint.exe'
if (Test-Path $golangciPath) { $golangci = @{ Source = $golangciPath } }
}
if ($golangci) {
& $golangci.Source run
} else {
Write-Warning 'lint-go: golangci-lint not found, skipping (CI will run it)'
}
+20
View File
@@ -0,0 +1,20 @@
#!/bin/sh
# Same gates as CI job go (subset before full test): gofmt, vet, golangci-lint.
set -euxo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
UNFMT="$(gofmt -l .)"
if [ -n "$UNFMT" ]; then
echo "gofmt: unformatted files:" >&2
echo "$UNFMT" >&2
exit 1
fi
go vet ./...
if command -v golangci-lint >/dev/null 2>&1; then
golangci-lint run
else
echo "lint-go: golangci-lint not in PATH, skipping (CI will run it)" >&2
fi