@chc880/everything-antigravity 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/assets/rules/common/coding-style.md +53 -0
  4. package/assets/rules/common/git-workflow.md +47 -0
  5. package/assets/rules/common/patterns.md +36 -0
  6. package/assets/rules/common/performance.md +21 -0
  7. package/assets/rules/common/security.md +34 -0
  8. package/assets/rules/common/testing.md +29 -0
  9. package/assets/rules/golang/coding-style.md +40 -0
  10. package/assets/rules/golang/patterns.md +44 -0
  11. package/assets/rules/golang/security.md +33 -0
  12. package/assets/rules/golang/testing.md +30 -0
  13. package/assets/rules/python/coding-style.md +52 -0
  14. package/assets/rules/python/patterns.md +39 -0
  15. package/assets/rules/python/security.md +30 -0
  16. package/assets/rules/python/testing.md +38 -0
  17. package/assets/rules/typescript/coding-style.md +44 -0
  18. package/assets/rules/typescript/patterns.md +50 -0
  19. package/assets/rules/typescript/security.md +27 -0
  20. package/assets/rules/typescript/testing.md +24 -0
  21. package/assets/skills/agent-guides/SKILL.md +40 -0
  22. package/assets/skills/agent-guides/references/architect.md +209 -0
  23. package/assets/skills/agent-guides/references/build-error-resolver.md +530 -0
  24. package/assets/skills/agent-guides/references/code-reviewer.md +102 -0
  25. package/assets/skills/agent-guides/references/database-reviewer.md +652 -0
  26. package/assets/skills/agent-guides/references/doc-updater.md +450 -0
  27. package/assets/skills/agent-guides/references/e2e-runner.md +795 -0
  28. package/assets/skills/agent-guides/references/go-build-resolver.md +366 -0
  29. package/assets/skills/agent-guides/references/go-reviewer.md +265 -0
  30. package/assets/skills/agent-guides/references/planner.md +117 -0
  31. package/assets/skills/agent-guides/references/python-reviewer.md +467 -0
  32. package/assets/skills/agent-guides/references/refactor-cleaner.md +304 -0
  33. package/assets/skills/agent-guides/references/security-reviewer.md +543 -0
  34. package/assets/skills/agent-guides/references/tdd-guide.md +278 -0
  35. package/assets/skills/backend-patterns/SKILL.md +587 -0
  36. package/assets/skills/clickhouse-io/SKILL.md +429 -0
  37. package/assets/skills/coding-standards/SKILL.md +520 -0
  38. package/assets/skills/cpp-testing/SKILL.md +322 -0
  39. package/assets/skills/django-patterns/SKILL.md +733 -0
  40. package/assets/skills/django-security/SKILL.md +592 -0
  41. package/assets/skills/django-tdd/SKILL.md +728 -0
  42. package/assets/skills/django-verification/SKILL.md +460 -0
  43. package/assets/skills/frontend-patterns/SKILL.md +631 -0
  44. package/assets/skills/golang-patterns/SKILL.md +673 -0
  45. package/assets/skills/golang-testing/SKILL.md +719 -0
  46. package/assets/skills/java-coding-standards/SKILL.md +138 -0
  47. package/assets/skills/jpa-patterns/SKILL.md +141 -0
  48. package/assets/skills/knowledge-management/SKILL.md +77 -0
  49. package/assets/skills/nutrient-document-processing/SKILL.md +165 -0
  50. package/assets/skills/postgres-patterns/SKILL.md +146 -0
  51. package/assets/skills/python-patterns/SKILL.md +749 -0
  52. package/assets/skills/python-testing/SKILL.md +815 -0
  53. package/assets/skills/security-hardening/SKILL.md +76 -0
  54. package/assets/skills/security-review/SKILL.md +494 -0
  55. package/assets/skills/security-review/cloud-infrastructure-security.md +361 -0
  56. package/assets/skills/springboot-patterns/SKILL.md +304 -0
  57. package/assets/skills/springboot-security/SKILL.md +119 -0
  58. package/assets/skills/springboot-tdd/SKILL.md +157 -0
  59. package/assets/skills/springboot-verification/SKILL.md +100 -0
  60. package/assets/skills/tdd-workflow/SKILL.md +409 -0
  61. package/assets/workflows/build-fix.md +50 -0
  62. package/assets/workflows/code-review.md +61 -0
  63. package/assets/workflows/e2e.md +65 -0
  64. package/assets/workflows/go-build.md +39 -0
  65. package/assets/workflows/go-review.md +44 -0
  66. package/assets/workflows/go-test.md +61 -0
  67. package/assets/workflows/plan.md +93 -0
  68. package/assets/workflows/python-review.md +95 -0
  69. package/assets/workflows/setup-pm.md +36 -0
  70. package/assets/workflows/tdd.md +75 -0
  71. package/assets/workflows/verify.md +81 -0
  72. package/bin/cli.js +69 -0
  73. package/lib/installer.js +301 -0
  74. package/package.json +34 -0
@@ -0,0 +1,673 @@
1
+ ---
2
+ name: golang-patterns
3
+ description: Idiomatic Go patterns, best practices, and conventions for building robust, efficient, and maintainable Go applications.
4
+ ---
5
+
6
+ # Go Development Patterns
7
+
8
+ Idiomatic Go patterns and best practices for building robust, efficient, and maintainable applications.
9
+
10
+ ## When to Activate
11
+
12
+ - Writing new Go code
13
+ - Reviewing Go code
14
+ - Refactoring existing Go code
15
+ - Designing Go packages/modules
16
+
17
+ ## Core Principles
18
+
19
+ ### 1. Simplicity and Clarity
20
+
21
+ Go favors simplicity over cleverness. Code should be obvious and easy to read.
22
+
23
+ ```go
24
+ // Good: Clear and direct
25
+ func GetUser(id string) (*User, error) {
26
+ user, err := db.FindUser(id)
27
+ if err != nil {
28
+ return nil, fmt.Errorf("get user %s: %w", id, err)
29
+ }
30
+ return user, nil
31
+ }
32
+
33
+ // Bad: Overly clever
34
+ func GetUser(id string) (*User, error) {
35
+ return func() (*User, error) {
36
+ if u, e := db.FindUser(id); e == nil {
37
+ return u, nil
38
+ } else {
39
+ return nil, e
40
+ }
41
+ }()
42
+ }
43
+ ```
44
+
45
+ ### 2. Make the Zero Value Useful
46
+
47
+ Design types so their zero value is immediately usable without initialization.
48
+
49
+ ```go
50
+ // Good: Zero value is useful
51
+ type Counter struct {
52
+ mu sync.Mutex
53
+ count int // zero value is 0, ready to use
54
+ }
55
+
56
+ func (c *Counter) Inc() {
57
+ c.mu.Lock()
58
+ c.count++
59
+ c.mu.Unlock()
60
+ }
61
+
62
+ // Good: bytes.Buffer works with zero value
63
+ var buf bytes.Buffer
64
+ buf.WriteString("hello")
65
+
66
+ // Bad: Requires initialization
67
+ type BadCounter struct {
68
+ counts map[string]int // nil map will panic
69
+ }
70
+ ```
71
+
72
+ ### 3. Accept Interfaces, Return Structs
73
+
74
+ Functions should accept interface parameters and return concrete types.
75
+
76
+ ```go
77
+ // Good: Accepts interface, returns concrete type
78
+ func ProcessData(r io.Reader) (*Result, error) {
79
+ data, err := io.ReadAll(r)
80
+ if err != nil {
81
+ return nil, err
82
+ }
83
+ return &Result{Data: data}, nil
84
+ }
85
+
86
+ // Bad: Returns interface (hides implementation details unnecessarily)
87
+ func ProcessData(r io.Reader) (io.Reader, error) {
88
+ // ...
89
+ }
90
+ ```
91
+
92
+ ## Error Handling Patterns
93
+
94
+ ### Error Wrapping with Context
95
+
96
+ ```go
97
+ // Good: Wrap errors with context
98
+ func LoadConfig(path string) (*Config, error) {
99
+ data, err := os.ReadFile(path)
100
+ if err != nil {
101
+ return nil, fmt.Errorf("load config %s: %w", path, err)
102
+ }
103
+
104
+ var cfg Config
105
+ if err := json.Unmarshal(data, &cfg); err != nil {
106
+ return nil, fmt.Errorf("parse config %s: %w", path, err)
107
+ }
108
+
109
+ return &cfg, nil
110
+ }
111
+ ```
112
+
113
+ ### Custom Error Types
114
+
115
+ ```go
116
+ // Define domain-specific errors
117
+ type ValidationError struct {
118
+ Field string
119
+ Message string
120
+ }
121
+
122
+ func (e *ValidationError) Error() string {
123
+ return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message)
124
+ }
125
+
126
+ // Sentinel errors for common cases
127
+ var (
128
+ ErrNotFound = errors.New("resource not found")
129
+ ErrUnauthorized = errors.New("unauthorized")
130
+ ErrInvalidInput = errors.New("invalid input")
131
+ )
132
+ ```
133
+
134
+ ### Error Checking with errors.Is and errors.As
135
+
136
+ ```go
137
+ func HandleError(err error) {
138
+ // Check for specific error
139
+ if errors.Is(err, sql.ErrNoRows) {
140
+ log.Println("No records found")
141
+ return
142
+ }
143
+
144
+ // Check for error type
145
+ var validationErr *ValidationError
146
+ if errors.As(err, &validationErr) {
147
+ log.Printf("Validation error on field %s: %s",
148
+ validationErr.Field, validationErr.Message)
149
+ return
150
+ }
151
+
152
+ // Unknown error
153
+ log.Printf("Unexpected error: %v", err)
154
+ }
155
+ ```
156
+
157
+ ### Never Ignore Errors
158
+
159
+ ```go
160
+ // Bad: Ignoring error with blank identifier
161
+ result, _ := doSomething()
162
+
163
+ // Good: Handle or explicitly document why it's safe to ignore
164
+ result, err := doSomething()
165
+ if err != nil {
166
+ return err
167
+ }
168
+
169
+ // Acceptable: When error truly doesn't matter (rare)
170
+ _ = writer.Close() // Best-effort cleanup, error logged elsewhere
171
+ ```
172
+
173
+ ## Concurrency Patterns
174
+
175
+ ### Worker Pool
176
+
177
+ ```go
178
+ func WorkerPool(jobs <-chan Job, results chan<- Result, numWorkers int) {
179
+ var wg sync.WaitGroup
180
+
181
+ for i := 0; i < numWorkers; i++ {
182
+ wg.Add(1)
183
+ go func() {
184
+ defer wg.Done()
185
+ for job := range jobs {
186
+ results <- process(job)
187
+ }
188
+ }()
189
+ }
190
+
191
+ wg.Wait()
192
+ close(results)
193
+ }
194
+ ```
195
+
196
+ ### Context for Cancellation and Timeouts
197
+
198
+ ```go
199
+ func FetchWithTimeout(ctx context.Context, url string) ([]byte, error) {
200
+ ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
201
+ defer cancel()
202
+
203
+ req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
204
+ if err != nil {
205
+ return nil, fmt.Errorf("create request: %w", err)
206
+ }
207
+
208
+ resp, err := http.DefaultClient.Do(req)
209
+ if err != nil {
210
+ return nil, fmt.Errorf("fetch %s: %w", url, err)
211
+ }
212
+ defer resp.Body.Close()
213
+
214
+ return io.ReadAll(resp.Body)
215
+ }
216
+ ```
217
+
218
+ ### Graceful Shutdown
219
+
220
+ ```go
221
+ func GracefulShutdown(server *http.Server) {
222
+ quit := make(chan os.Signal, 1)
223
+ signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
224
+
225
+ <-quit
226
+ log.Println("Shutting down server...")
227
+
228
+ ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
229
+ defer cancel()
230
+
231
+ if err := server.Shutdown(ctx); err != nil {
232
+ log.Fatalf("Server forced to shutdown: %v", err)
233
+ }
234
+
235
+ log.Println("Server exited")
236
+ }
237
+ ```
238
+
239
+ ### errgroup for Coordinated Goroutines
240
+
241
+ ```go
242
+ import "golang.org/x/sync/errgroup"
243
+
244
+ func FetchAll(ctx context.Context, urls []string) ([][]byte, error) {
245
+ g, ctx := errgroup.WithContext(ctx)
246
+ results := make([][]byte, len(urls))
247
+
248
+ for i, url := range urls {
249
+ i, url := i, url // Capture loop variables
250
+ g.Go(func() error {
251
+ data, err := FetchWithTimeout(ctx, url)
252
+ if err != nil {
253
+ return err
254
+ }
255
+ results[i] = data
256
+ return nil
257
+ })
258
+ }
259
+
260
+ if err := g.Wait(); err != nil {
261
+ return nil, err
262
+ }
263
+ return results, nil
264
+ }
265
+ ```
266
+
267
+ ### Avoiding Goroutine Leaks
268
+
269
+ ```go
270
+ // Bad: Goroutine leak if context is cancelled
271
+ func leakyFetch(ctx context.Context, url string) <-chan []byte {
272
+ ch := make(chan []byte)
273
+ go func() {
274
+ data, _ := fetch(url)
275
+ ch <- data // Blocks forever if no receiver
276
+ }()
277
+ return ch
278
+ }
279
+
280
+ // Good: Properly handles cancellation
281
+ func safeFetch(ctx context.Context, url string) <-chan []byte {
282
+ ch := make(chan []byte, 1) // Buffered channel
283
+ go func() {
284
+ data, err := fetch(url)
285
+ if err != nil {
286
+ return
287
+ }
288
+ select {
289
+ case ch <- data:
290
+ case <-ctx.Done():
291
+ }
292
+ }()
293
+ return ch
294
+ }
295
+ ```
296
+
297
+ ## Interface Design
298
+
299
+ ### Small, Focused Interfaces
300
+
301
+ ```go
302
+ // Good: Single-method interfaces
303
+ type Reader interface {
304
+ Read(p []byte) (n int, err error)
305
+ }
306
+
307
+ type Writer interface {
308
+ Write(p []byte) (n int, err error)
309
+ }
310
+
311
+ type Closer interface {
312
+ Close() error
313
+ }
314
+
315
+ // Compose interfaces as needed
316
+ type ReadWriteCloser interface {
317
+ Reader
318
+ Writer
319
+ Closer
320
+ }
321
+ ```
322
+
323
+ ### Define Interfaces Where They're Used
324
+
325
+ ```go
326
+ // In the consumer package, not the provider
327
+ package service
328
+
329
+ // UserStore defines what this service needs
330
+ type UserStore interface {
331
+ GetUser(id string) (*User, error)
332
+ SaveUser(user *User) error
333
+ }
334
+
335
+ type Service struct {
336
+ store UserStore
337
+ }
338
+
339
+ // Concrete implementation can be in another package
340
+ // It doesn't need to know about this interface
341
+ ```
342
+
343
+ ### Optional Behavior with Type Assertions
344
+
345
+ ```go
346
+ type Flusher interface {
347
+ Flush() error
348
+ }
349
+
350
+ func WriteAndFlush(w io.Writer, data []byte) error {
351
+ if _, err := w.Write(data); err != nil {
352
+ return err
353
+ }
354
+
355
+ // Flush if supported
356
+ if f, ok := w.(Flusher); ok {
357
+ return f.Flush()
358
+ }
359
+ return nil
360
+ }
361
+ ```
362
+
363
+ ## Package Organization
364
+
365
+ ### Standard Project Layout
366
+
367
+ ```text
368
+ myproject/
369
+ ├── cmd/
370
+ │ └── myapp/
371
+ │ └── main.go # Entry point
372
+ ├── internal/
373
+ │ ├── handler/ # HTTP handlers
374
+ │ ├── service/ # Business logic
375
+ │ ├── repository/ # Data access
376
+ │ └── config/ # Configuration
377
+ ├── pkg/
378
+ │ └── client/ # Public API client
379
+ ├── api/
380
+ │ └── v1/ # API definitions (proto, OpenAPI)
381
+ ├── testdata/ # Test fixtures
382
+ ├── go.mod
383
+ ├── go.sum
384
+ └── Makefile
385
+ ```
386
+
387
+ ### Package Naming
388
+
389
+ ```go
390
+ // Good: Short, lowercase, no underscores
391
+ package http
392
+ package json
393
+ package user
394
+
395
+ // Bad: Verbose, mixed case, or redundant
396
+ package httpHandler
397
+ package json_parser
398
+ package userService // Redundant 'Service' suffix
399
+ ```
400
+
401
+ ### Avoid Package-Level State
402
+
403
+ ```go
404
+ // Bad: Global mutable state
405
+ var db *sql.DB
406
+
407
+ func init() {
408
+ db, _ = sql.Open("postgres", os.Getenv("DATABASE_URL"))
409
+ }
410
+
411
+ // Good: Dependency injection
412
+ type Server struct {
413
+ db *sql.DB
414
+ }
415
+
416
+ func NewServer(db *sql.DB) *Server {
417
+ return &Server{db: db}
418
+ }
419
+ ```
420
+
421
+ ## Struct Design
422
+
423
+ ### Functional Options Pattern
424
+
425
+ ```go
426
+ type Server struct {
427
+ addr string
428
+ timeout time.Duration
429
+ logger *log.Logger
430
+ }
431
+
432
+ type Option func(*Server)
433
+
434
+ func WithTimeout(d time.Duration) Option {
435
+ return func(s *Server) {
436
+ s.timeout = d
437
+ }
438
+ }
439
+
440
+ func WithLogger(l *log.Logger) Option {
441
+ return func(s *Server) {
442
+ s.logger = l
443
+ }
444
+ }
445
+
446
+ func NewServer(addr string, opts ...Option) *Server {
447
+ s := &Server{
448
+ addr: addr,
449
+ timeout: 30 * time.Second, // default
450
+ logger: log.Default(), // default
451
+ }
452
+ for _, opt := range opts {
453
+ opt(s)
454
+ }
455
+ return s
456
+ }
457
+
458
+ // Usage
459
+ server := NewServer(":8080",
460
+ WithTimeout(60*time.Second),
461
+ WithLogger(customLogger),
462
+ )
463
+ ```
464
+
465
+ ### Embedding for Composition
466
+
467
+ ```go
468
+ type Logger struct {
469
+ prefix string
470
+ }
471
+
472
+ func (l *Logger) Log(msg string) {
473
+ fmt.Printf("[%s] %s\n", l.prefix, msg)
474
+ }
475
+
476
+ type Server struct {
477
+ *Logger // Embedding - Server gets Log method
478
+ addr string
479
+ }
480
+
481
+ func NewServer(addr string) *Server {
482
+ return &Server{
483
+ Logger: &Logger{prefix: "SERVER"},
484
+ addr: addr,
485
+ }
486
+ }
487
+
488
+ // Usage
489
+ s := NewServer(":8080")
490
+ s.Log("Starting...") // Calls embedded Logger.Log
491
+ ```
492
+
493
+ ## Memory and Performance
494
+
495
+ ### Preallocate Slices When Size is Known
496
+
497
+ ```go
498
+ // Bad: Grows slice multiple times
499
+ func processItems(items []Item) []Result {
500
+ var results []Result
501
+ for _, item := range items {
502
+ results = append(results, process(item))
503
+ }
504
+ return results
505
+ }
506
+
507
+ // Good: Single allocation
508
+ func processItems(items []Item) []Result {
509
+ results := make([]Result, 0, len(items))
510
+ for _, item := range items {
511
+ results = append(results, process(item))
512
+ }
513
+ return results
514
+ }
515
+ ```
516
+
517
+ ### Use sync.Pool for Frequent Allocations
518
+
519
+ ```go
520
+ var bufferPool = sync.Pool{
521
+ New: func() interface{} {
522
+ return new(bytes.Buffer)
523
+ },
524
+ }
525
+
526
+ func ProcessRequest(data []byte) []byte {
527
+ buf := bufferPool.Get().(*bytes.Buffer)
528
+ defer func() {
529
+ buf.Reset()
530
+ bufferPool.Put(buf)
531
+ }()
532
+
533
+ buf.Write(data)
534
+ // Process...
535
+ return buf.Bytes()
536
+ }
537
+ ```
538
+
539
+ ### Avoid String Concatenation in Loops
540
+
541
+ ```go
542
+ // Bad: Creates many string allocations
543
+ func join(parts []string) string {
544
+ var result string
545
+ for _, p := range parts {
546
+ result += p + ","
547
+ }
548
+ return result
549
+ }
550
+
551
+ // Good: Single allocation with strings.Builder
552
+ func join(parts []string) string {
553
+ var sb strings.Builder
554
+ for i, p := range parts {
555
+ if i > 0 {
556
+ sb.WriteString(",")
557
+ }
558
+ sb.WriteString(p)
559
+ }
560
+ return sb.String()
561
+ }
562
+
563
+ // Best: Use standard library
564
+ func join(parts []string) string {
565
+ return strings.Join(parts, ",")
566
+ }
567
+ ```
568
+
569
+ ## Go Tooling Integration
570
+
571
+ ### Essential Commands
572
+
573
+ ```bash
574
+ # Build and run
575
+ go build ./...
576
+ go run ./cmd/myapp
577
+
578
+ # Testing
579
+ go test ./...
580
+ go test -race ./...
581
+ go test -cover ./...
582
+
583
+ # Static analysis
584
+ go vet ./...
585
+ staticcheck ./...
586
+ golangci-lint run
587
+
588
+ # Module management
589
+ go mod tidy
590
+ go mod verify
591
+
592
+ # Formatting
593
+ gofmt -w .
594
+ goimports -w .
595
+ ```
596
+
597
+ ### Recommended Linter Configuration (.golangci.yml)
598
+
599
+ ```yaml
600
+ linters:
601
+ enable:
602
+ - errcheck
603
+ - gosimple
604
+ - govet
605
+ - ineffassign
606
+ - staticcheck
607
+ - unused
608
+ - gofmt
609
+ - goimports
610
+ - misspell
611
+ - unconvert
612
+ - unparam
613
+
614
+ linters-settings:
615
+ errcheck:
616
+ check-type-assertions: true
617
+ govet:
618
+ check-shadowing: true
619
+
620
+ issues:
621
+ exclude-use-default: false
622
+ ```
623
+
624
+ ## Quick Reference: Go Idioms
625
+
626
+ | Idiom | Description |
627
+ |-------|-------------|
628
+ | Accept interfaces, return structs | Functions accept interface params, return concrete types |
629
+ | Errors are values | Treat errors as first-class values, not exceptions |
630
+ | Don't communicate by sharing memory | Use channels for coordination between goroutines |
631
+ | Make the zero value useful | Types should work without explicit initialization |
632
+ | A little copying is better than a little dependency | Avoid unnecessary external dependencies |
633
+ | Clear is better than clever | Prioritize readability over cleverness |
634
+ | gofmt is no one's favorite but everyone's friend | Always format with gofmt/goimports |
635
+ | Return early | Handle errors first, keep happy path unindented |
636
+
637
+ ## Anti-Patterns to Avoid
638
+
639
+ ```go
640
+ // Bad: Naked returns in long functions
641
+ func process() (result int, err error) {
642
+ // ... 50 lines ...
643
+ return // What is being returned?
644
+ }
645
+
646
+ // Bad: Using panic for control flow
647
+ func GetUser(id string) *User {
648
+ user, err := db.Find(id)
649
+ if err != nil {
650
+ panic(err) // Don't do this
651
+ }
652
+ return user
653
+ }
654
+
655
+ // Bad: Passing context in struct
656
+ type Request struct {
657
+ ctx context.Context // Context should be first param
658
+ ID string
659
+ }
660
+
661
+ // Good: Context as first parameter
662
+ func ProcessRequest(ctx context.Context, id string) error {
663
+ // ...
664
+ }
665
+
666
+ // Bad: Mixing value and pointer receivers
667
+ type Counter struct{ n int }
668
+ func (c Counter) Value() int { return c.n } // Value receiver
669
+ func (c *Counter) Increment() { c.n++ } // Pointer receiver
670
+ // Pick one style and be consistent
671
+ ```
672
+
673
+ **Remember**: Go code should be boring in the best way - predictable, consistent, and easy to understand. When in doubt, keep it simple.