oh-my-customcode 0.1.1 → 0.1.3
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.
- package/README.md +45 -32
- package/dist/cli/index.js +12 -20
- package/dist/index.js +3 -3
- package/package.json +2 -2
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +25 -0
- package/templates/agents/index.yaml +6 -0
- package/templates/agents/infra-engineer/aws-expert/refs/aws/common-patterns.md +169 -0
- package/templates/agents/infra-engineer/aws-expert/refs/aws/index.yaml +26 -0
- package/templates/agents/infra-engineer/aws-expert/refs/aws/well-architected.md +143 -0
- package/templates/agents/infra-engineer/aws-expert/refs/aws-best-practices/SKILL.md +279 -0
- package/templates/agents/infra-engineer/aws-expert/refs/aws-best-practices/index.yaml +27 -0
- package/templates/agents/infra-engineer/docker-expert/refs/docker/compose-best-practices.md +284 -0
- package/templates/agents/infra-engineer/docker-expert/refs/docker/dockerfile-best-practices.md +262 -0
- package/templates/agents/infra-engineer/docker-expert/refs/docker/index.yaml +26 -0
- package/templates/agents/infra-engineer/docker-expert/refs/docker-best-practices/SKILL.md +274 -0
- package/templates/agents/infra-engineer/docker-expert/refs/docker-best-practices/index.yaml +26 -0
- package/templates/agents/manager/creator/refs/rules/MAY-optimization.md +93 -0
- package/templates/agents/manager/creator/refs/rules/MUST-agent-design.md +107 -0
- package/templates/agents/manager/creator/refs/rules/MUST-agent-identification.md +108 -0
- package/templates/agents/manager/creator/refs/rules/MUST-continuous-improvement.md +132 -0
- package/templates/agents/manager/creator/refs/rules/MUST-intent-transparency.md +199 -0
- package/templates/agents/manager/creator/refs/rules/MUST-language-policy.md +62 -0
- package/templates/agents/manager/creator/refs/rules/MUST-orchestrator-coordination.md +291 -0
- package/templates/agents/manager/creator/refs/rules/MUST-parallel-execution.md +341 -0
- package/templates/agents/manager/creator/refs/rules/MUST-permissions.md +84 -0
- package/templates/agents/manager/creator/refs/rules/MUST-safety.md +69 -0
- package/templates/agents/manager/creator/refs/rules/MUST-sync-verification.md +219 -0
- package/templates/agents/manager/creator/refs/rules/MUST-tool-identification.md +112 -0
- package/templates/agents/manager/creator/refs/rules/SHOULD-ecomode.md +145 -0
- package/templates/agents/manager/creator/refs/rules/SHOULD-error-handling.md +102 -0
- package/templates/agents/manager/creator/refs/rules/SHOULD-hud-statusline.md +89 -0
- package/templates/agents/manager/creator/refs/rules/SHOULD-interaction.md +103 -0
- package/templates/agents/manager/creator/refs/rules/SHOULD-memory-integration.md +114 -0
- package/templates/agents/manager/creator/refs/rules/SHOULD-pipeline-mode.md +165 -0
- package/templates/agents/manager/creator/refs/rules/index.yaml +125 -0
- package/templates/agents/manager/supplier/refs/guides/aws/common-patterns.md +169 -0
- package/templates/agents/manager/supplier/refs/guides/aws/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/guides/aws/well-architected.md +143 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/01-overview.md +42 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/03-tools.md +107 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/04-agent-skills.md +90 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/05-agent-sdk.md +129 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/06-mcp.md +165 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/07-prompt-engineering.md +100 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/08-testing.md +58 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/09-guardrails.md +80 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/10-monitoring.md +89 -0
- package/templates/agents/manager/supplier/refs/guides/claude-code/index.yaml +51 -0
- package/templates/agents/manager/supplier/refs/guides/docker/compose-best-practices.md +284 -0
- package/templates/agents/manager/supplier/refs/guides/docker/dockerfile-best-practices.md +262 -0
- package/templates/agents/manager/supplier/refs/guides/docker/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/guides/fastapi/best-practices.md +232 -0
- package/templates/agents/manager/supplier/refs/guides/fastapi/index.yaml +21 -0
- package/templates/agents/manager/supplier/refs/guides/go-backend/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/guides/go-backend/project-layout.md +243 -0
- package/templates/agents/manager/supplier/refs/guides/go-backend/uber-style.md +212 -0
- package/templates/agents/manager/supplier/refs/guides/golang/concurrency.md +282 -0
- package/templates/agents/manager/supplier/refs/guides/golang/effective-go.md +309 -0
- package/templates/agents/manager/supplier/refs/guides/golang/error-handling.md +250 -0
- package/templates/agents/manager/supplier/refs/guides/golang/index.yaml +27 -0
- package/templates/agents/manager/supplier/refs/guides/index.yaml +101 -0
- package/templates/agents/manager/supplier/refs/guides/kotlin/coding-conventions.md +247 -0
- package/templates/agents/manager/supplier/refs/guides/kotlin/idioms.md +234 -0
- package/templates/agents/manager/supplier/refs/guides/kotlin/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/guides/python/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/guides/python/pep8-style-guide.md +202 -0
- package/templates/agents/manager/supplier/refs/guides/python/zen-of-python.md +79 -0
- package/templates/agents/manager/supplier/refs/guides/rust/error-handling.md +262 -0
- package/templates/agents/manager/supplier/refs/guides/rust/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/guides/rust/ownership.md +180 -0
- package/templates/agents/manager/supplier/refs/guides/springboot/best-practices.md +361 -0
- package/templates/agents/manager/supplier/refs/guides/springboot/index.yaml +22 -0
- package/templates/agents/manager/supplier/refs/guides/typescript/advanced-types.md +225 -0
- package/templates/agents/manager/supplier/refs/guides/typescript/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/guides/typescript/type-system.md +219 -0
- package/templates/agents/manager/supplier/refs/guides/web-design/accessibility.md +66 -0
- package/templates/agents/manager/supplier/refs/guides/web-design/index.yaml +20 -0
- package/templates/agents/manager/supplier/refs/guides/web-design/performance.md +102 -0
- package/templates/agents/manager/supplier/refs/rules/MAY-optimization.md +93 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-agent-design.md +107 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-agent-identification.md +108 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-continuous-improvement.md +132 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-intent-transparency.md +199 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-language-policy.md +62 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-orchestrator-coordination.md +291 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-parallel-execution.md +341 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-permissions.md +84 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-safety.md +69 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-sync-verification.md +219 -0
- package/templates/agents/manager/supplier/refs/rules/MUST-tool-identification.md +112 -0
- package/templates/agents/manager/supplier/refs/rules/SHOULD-ecomode.md +145 -0
- package/templates/agents/manager/supplier/refs/rules/SHOULD-error-handling.md +102 -0
- package/templates/agents/manager/supplier/refs/rules/SHOULD-hud-statusline.md +89 -0
- package/templates/agents/manager/supplier/refs/rules/SHOULD-interaction.md +103 -0
- package/templates/agents/manager/supplier/refs/rules/SHOULD-memory-integration.md +114 -0
- package/templates/agents/manager/supplier/refs/rules/SHOULD-pipeline-mode.md +165 -0
- package/templates/agents/manager/supplier/refs/rules/index.yaml +125 -0
- package/templates/agents/manager/supplier/refs/skills/backend/fastapi-best-practices/SKILL.md +269 -0
- package/templates/agents/manager/supplier/refs/skills/backend/fastapi-best-practices/index.yaml +25 -0
- package/templates/agents/manager/supplier/refs/skills/backend/go-backend-best-practices/SKILL.md +337 -0
- package/templates/agents/manager/supplier/refs/skills/backend/go-backend-best-practices/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/skills/backend/springboot-best-practices/SKILL.md +356 -0
- package/templates/agents/manager/supplier/refs/skills/backend/springboot-best-practices/index.yaml +27 -0
- package/templates/agents/manager/supplier/refs/skills/development/go-best-practices/SKILL.md +202 -0
- package/templates/agents/manager/supplier/refs/skills/development/go-best-practices/index.yaml +25 -0
- package/templates/agents/manager/supplier/refs/skills/development/kotlin-best-practices/SKILL.md +255 -0
- package/templates/agents/manager/supplier/refs/skills/development/kotlin-best-practices/index.yaml +27 -0
- package/templates/agents/manager/supplier/refs/skills/development/python-best-practices/SKILL.md +221 -0
- package/templates/agents/manager/supplier/refs/skills/development/python-best-practices/index.yaml +25 -0
- package/templates/agents/manager/supplier/refs/skills/development/react-best-practices/SKILL.md +100 -0
- package/templates/agents/manager/supplier/refs/skills/development/react-best-practices/index.yaml +39 -0
- package/templates/agents/manager/supplier/refs/skills/development/rust-best-practices/SKILL.md +266 -0
- package/templates/agents/manager/supplier/refs/skills/development/rust-best-practices/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/skills/development/typescript-best-practices/SKILL.md +320 -0
- package/templates/agents/manager/supplier/refs/skills/development/typescript-best-practices/index.yaml +28 -0
- package/templates/agents/manager/supplier/refs/skills/development/vercel-deploy/SKILL.md +73 -0
- package/templates/agents/manager/supplier/refs/skills/development/vercel-deploy/index.yaml +30 -0
- package/templates/agents/manager/supplier/refs/skills/development/web-design-guidelines/SKILL.md +117 -0
- package/templates/agents/manager/supplier/refs/skills/development/web-design-guidelines/index.yaml +34 -0
- package/templates/agents/manager/supplier/refs/skills/index.yaml +129 -0
- package/templates/agents/manager/supplier/refs/skills/infrastructure/aws-best-practices/SKILL.md +279 -0
- package/templates/agents/manager/supplier/refs/skills/infrastructure/aws-best-practices/index.yaml +27 -0
- package/templates/agents/manager/supplier/refs/skills/infrastructure/docker-best-practices/SKILL.md +274 -0
- package/templates/agents/manager/supplier/refs/skills/infrastructure/docker-best-practices/index.yaml +26 -0
- package/templates/agents/manager/supplier/refs/skills/orchestration/intent-detection/SKILL.md +214 -0
- package/templates/agents/manager/supplier/refs/skills/orchestration/intent-detection/index.yaml +30 -0
- package/templates/agents/manager/supplier/refs/skills/orchestration/intent-detection/patterns/agent-triggers.yaml +342 -0
- package/templates/agents/manager/supplier/refs/skills/orchestration/pipeline-execution/SKILL.md +188 -0
- package/templates/agents/manager/supplier/refs/skills/orchestration/pipeline-execution/index.yaml +27 -0
- package/templates/agents/manager/supplier/refs/skills/system/memory-management/SKILL.md +194 -0
- package/templates/agents/manager/supplier/refs/skills/system/memory-management/index.yaml +30 -0
- package/templates/agents/manager/supplier/refs/skills/system/result-aggregation/SKILL.md +163 -0
- package/templates/agents/manager/supplier/refs/skills/system/result-aggregation/index.yaml +36 -0
- package/templates/agents/manager/updater/refs/rules/MAY-optimization.md +93 -0
- package/templates/agents/manager/updater/refs/rules/MUST-agent-design.md +107 -0
- package/templates/agents/manager/updater/refs/rules/MUST-agent-identification.md +108 -0
- package/templates/agents/manager/updater/refs/rules/MUST-continuous-improvement.md +132 -0
- package/templates/agents/manager/updater/refs/rules/MUST-intent-transparency.md +199 -0
- package/templates/agents/manager/updater/refs/rules/MUST-language-policy.md +62 -0
- package/templates/agents/manager/updater/refs/rules/MUST-orchestrator-coordination.md +291 -0
- package/templates/agents/manager/updater/refs/rules/MUST-parallel-execution.md +341 -0
- package/templates/agents/manager/updater/refs/rules/MUST-permissions.md +84 -0
- package/templates/agents/manager/updater/refs/rules/MUST-safety.md +69 -0
- package/templates/agents/manager/updater/refs/rules/MUST-sync-verification.md +219 -0
- package/templates/agents/manager/updater/refs/rules/MUST-tool-identification.md +112 -0
- package/templates/agents/manager/updater/refs/rules/SHOULD-ecomode.md +145 -0
- package/templates/agents/manager/updater/refs/rules/SHOULD-error-handling.md +102 -0
- package/templates/agents/manager/updater/refs/rules/SHOULD-hud-statusline.md +89 -0
- package/templates/agents/manager/updater/refs/rules/SHOULD-interaction.md +103 -0
- package/templates/agents/manager/updater/refs/rules/SHOULD-memory-integration.md +114 -0
- package/templates/agents/manager/updater/refs/rules/SHOULD-pipeline-mode.md +165 -0
- package/templates/agents/manager/updater/refs/rules/index.yaml +125 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MAY-optimization.md +93 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-agent-design.md +107 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-agent-identification.md +108 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-continuous-improvement.md +132 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-intent-transparency.md +199 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-language-policy.md +62 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-orchestrator-coordination.md +291 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-parallel-execution.md +341 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-permissions.md +84 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-safety.md +69 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-sync-verification.md +219 -0
- package/templates/agents/orchestrator/secretary/refs/rules/MUST-tool-identification.md +112 -0
- package/templates/agents/orchestrator/secretary/refs/rules/SHOULD-ecomode.md +145 -0
- package/templates/agents/orchestrator/secretary/refs/rules/SHOULD-error-handling.md +102 -0
- package/templates/agents/orchestrator/secretary/refs/rules/SHOULD-hud-statusline.md +89 -0
- package/templates/agents/orchestrator/secretary/refs/rules/SHOULD-interaction.md +103 -0
- package/templates/agents/orchestrator/secretary/refs/rules/SHOULD-memory-integration.md +114 -0
- package/templates/agents/orchestrator/secretary/refs/rules/SHOULD-pipeline-mode.md +165 -0
- package/templates/agents/orchestrator/secretary/refs/rules/index.yaml +125 -0
- package/templates/agents/sw-engineer/backend/fastapi-expert/refs/fastapi/best-practices.md +232 -0
- package/templates/agents/sw-engineer/backend/fastapi-expert/refs/fastapi/index.yaml +21 -0
- package/templates/agents/sw-engineer/backend/fastapi-expert/refs/fastapi-best-practices/SKILL.md +269 -0
- package/templates/agents/sw-engineer/backend/fastapi-expert/refs/fastapi-best-practices/index.yaml +25 -0
- package/templates/agents/sw-engineer/backend/go-backend-expert/refs/go-backend/index.yaml +26 -0
- package/templates/agents/sw-engineer/backend/go-backend-expert/refs/go-backend/project-layout.md +243 -0
- package/templates/agents/sw-engineer/backend/go-backend-expert/refs/go-backend/uber-style.md +212 -0
- package/templates/agents/sw-engineer/backend/go-backend-expert/refs/go-backend-best-practices/SKILL.md +337 -0
- package/templates/agents/sw-engineer/backend/go-backend-expert/refs/go-backend-best-practices/index.yaml +26 -0
- package/templates/agents/sw-engineer/backend/springboot-expert/refs/springboot/best-practices.md +361 -0
- package/templates/agents/sw-engineer/backend/springboot-expert/refs/springboot/index.yaml +22 -0
- package/templates/agents/sw-engineer/backend/springboot-expert/refs/springboot-best-practices/SKILL.md +356 -0
- package/templates/agents/sw-engineer/backend/springboot-expert/refs/springboot-best-practices/index.yaml +27 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/react-best-practices/SKILL.md +100 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/react-best-practices/index.yaml +39 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/vercel-deploy/SKILL.md +73 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/vercel-deploy/index.yaml +30 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/web-design/accessibility.md +66 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/web-design/index.yaml +20 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/web-design/performance.md +102 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/web-design-guidelines/SKILL.md +117 -0
- package/templates/agents/sw-engineer/frontend/vercel-agent/refs/web-design-guidelines/index.yaml +34 -0
- package/templates/agents/sw-engineer/language/golang-expert/refs/go-best-practices/SKILL.md +202 -0
- package/templates/agents/sw-engineer/language/golang-expert/refs/go-best-practices/index.yaml +25 -0
- package/templates/agents/sw-engineer/language/golang-expert/refs/golang/concurrency.md +282 -0
- package/templates/agents/sw-engineer/language/golang-expert/refs/golang/effective-go.md +309 -0
- package/templates/agents/sw-engineer/language/golang-expert/refs/golang/error-handling.md +250 -0
- package/templates/agents/sw-engineer/language/golang-expert/refs/golang/index.yaml +27 -0
- package/templates/agents/sw-engineer/language/kotlin-expert/refs/kotlin/coding-conventions.md +247 -0
- package/templates/agents/sw-engineer/language/kotlin-expert/refs/kotlin/idioms.md +234 -0
- package/templates/agents/sw-engineer/language/kotlin-expert/refs/kotlin/index.yaml +26 -0
- package/templates/agents/sw-engineer/language/kotlin-expert/refs/kotlin-best-practices/SKILL.md +255 -0
- package/templates/agents/sw-engineer/language/kotlin-expert/refs/kotlin-best-practices/index.yaml +27 -0
- package/templates/agents/sw-engineer/language/python-expert/refs/python/index.yaml +26 -0
- package/templates/agents/sw-engineer/language/python-expert/refs/python/pep8-style-guide.md +202 -0
- package/templates/agents/sw-engineer/language/python-expert/refs/python/zen-of-python.md +79 -0
- package/templates/agents/sw-engineer/language/python-expert/refs/python-best-practices/SKILL.md +221 -0
- package/templates/agents/sw-engineer/language/python-expert/refs/python-best-practices/index.yaml +25 -0
- package/templates/agents/sw-engineer/language/rust-expert/refs/rust/error-handling.md +262 -0
- package/templates/agents/sw-engineer/language/rust-expert/refs/rust/index.yaml +26 -0
- package/templates/agents/sw-engineer/language/rust-expert/refs/rust/ownership.md +180 -0
- package/templates/agents/sw-engineer/language/rust-expert/refs/rust-best-practices/SKILL.md +266 -0
- package/templates/agents/sw-engineer/language/rust-expert/refs/rust-best-practices/index.yaml +26 -0
- package/templates/agents/sw-engineer/language/typescript-expert/refs/typescript/advanced-types.md +225 -0
- package/templates/agents/sw-engineer/language/typescript-expert/refs/typescript/index.yaml +26 -0
- package/templates/agents/sw-engineer/language/typescript-expert/refs/typescript/type-system.md +219 -0
- package/templates/agents/sw-engineer/language/typescript-expert/refs/typescript-best-practices/SKILL.md +320 -0
- package/templates/agents/sw-engineer/language/typescript-expert/refs/typescript-best-practices/index.yaml +28 -0
- package/templates/agents/tutor/go-tutor/AGENT.md +130 -0
- package/templates/agents/tutor/go-tutor/index.yaml +48 -0
- package/templates/manifest.json +55 -0
- package/templates/skills/orchestration/intent-detection/patterns/agent-triggers.yaml +9 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Go Error Handling
|
|
2
|
+
|
|
3
|
+
> Reference for error handling patterns in Go
|
|
4
|
+
|
|
5
|
+
## Error Interface
|
|
6
|
+
|
|
7
|
+
```go
|
|
8
|
+
type error interface {
|
|
9
|
+
Error() string
|
|
10
|
+
}
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Errors are values. They can be stored, passed, and compared.
|
|
14
|
+
|
|
15
|
+
## Creating Errors
|
|
16
|
+
|
|
17
|
+
### Simple Errors
|
|
18
|
+
|
|
19
|
+
```go
|
|
20
|
+
import "errors"
|
|
21
|
+
|
|
22
|
+
err := errors.New("something went wrong")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Formatted Errors
|
|
26
|
+
|
|
27
|
+
```go
|
|
28
|
+
import "fmt"
|
|
29
|
+
|
|
30
|
+
err := fmt.Errorf("failed to process %s: %v", filename, err)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Custom Error Types
|
|
34
|
+
|
|
35
|
+
```go
|
|
36
|
+
type MyError struct {
|
|
37
|
+
Code int
|
|
38
|
+
Message string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func (e *MyError) Error() string {
|
|
42
|
+
return fmt.Sprintf("error %d: %s", e.Code, e.Message)
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Handling Errors
|
|
47
|
+
|
|
48
|
+
### Basic Pattern
|
|
49
|
+
|
|
50
|
+
```go
|
|
51
|
+
result, err := doSomething()
|
|
52
|
+
if err != nil {
|
|
53
|
+
return err
|
|
54
|
+
}
|
|
55
|
+
// use result
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Adding Context
|
|
59
|
+
|
|
60
|
+
```go
|
|
61
|
+
result, err := doSomething()
|
|
62
|
+
if err != nil {
|
|
63
|
+
return fmt.Errorf("doSomething failed: %w", err)
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Multiple Returns
|
|
68
|
+
|
|
69
|
+
```go
|
|
70
|
+
func divide(a, b float64) (float64, error) {
|
|
71
|
+
if b == 0 {
|
|
72
|
+
return 0, errors.New("division by zero")
|
|
73
|
+
}
|
|
74
|
+
return a / b, nil
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Error Wrapping (Go 1.13+)
|
|
79
|
+
|
|
80
|
+
### Wrapping Errors
|
|
81
|
+
|
|
82
|
+
```go
|
|
83
|
+
// Use %w verb to wrap
|
|
84
|
+
if err != nil {
|
|
85
|
+
return fmt.Errorf("operation failed: %w", err)
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Unwrapping Errors
|
|
90
|
+
|
|
91
|
+
```go
|
|
92
|
+
// errors.Unwrap returns the wrapped error
|
|
93
|
+
inner := errors.Unwrap(err)
|
|
94
|
+
|
|
95
|
+
// errors.Is checks if any error in chain matches
|
|
96
|
+
if errors.Is(err, os.ErrNotExist) {
|
|
97
|
+
// handle file not found
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// errors.As finds first error matching type
|
|
101
|
+
var pathErr *os.PathError
|
|
102
|
+
if errors.As(err, &pathErr) {
|
|
103
|
+
fmt.Println("failed path:", pathErr.Path)
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Sentinel Errors
|
|
108
|
+
|
|
109
|
+
```go
|
|
110
|
+
var (
|
|
111
|
+
ErrNotFound = errors.New("not found")
|
|
112
|
+
ErrUnauthorized = errors.New("unauthorized")
|
|
113
|
+
ErrInvalid = errors.New("invalid input")
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
func fetch(id string) (*Item, error) {
|
|
117
|
+
item, ok := store[id]
|
|
118
|
+
if !ok {
|
|
119
|
+
return nil, ErrNotFound
|
|
120
|
+
}
|
|
121
|
+
return item, nil
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Usage
|
|
125
|
+
item, err := fetch("123")
|
|
126
|
+
if errors.Is(err, ErrNotFound) {
|
|
127
|
+
// handle not found
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Error Handling Strategies
|
|
132
|
+
|
|
133
|
+
### Fail Fast
|
|
134
|
+
|
|
135
|
+
```go
|
|
136
|
+
func process() error {
|
|
137
|
+
if err := step1(); err != nil {
|
|
138
|
+
return err
|
|
139
|
+
}
|
|
140
|
+
if err := step2(); err != nil {
|
|
141
|
+
return err
|
|
142
|
+
}
|
|
143
|
+
return step3()
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Deferred Cleanup
|
|
148
|
+
|
|
149
|
+
```go
|
|
150
|
+
func processFile(path string) (err error) {
|
|
151
|
+
f, err := os.Open(path)
|
|
152
|
+
if err != nil {
|
|
153
|
+
return err
|
|
154
|
+
}
|
|
155
|
+
defer func() {
|
|
156
|
+
if cerr := f.Close(); cerr != nil && err == nil {
|
|
157
|
+
err = cerr
|
|
158
|
+
}
|
|
159
|
+
}()
|
|
160
|
+
// process file
|
|
161
|
+
return nil
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Error Aggregation
|
|
166
|
+
|
|
167
|
+
```go
|
|
168
|
+
type MultiError []error
|
|
169
|
+
|
|
170
|
+
func (m MultiError) Error() string {
|
|
171
|
+
var msgs []string
|
|
172
|
+
for _, err := range m {
|
|
173
|
+
msgs = append(msgs, err.Error())
|
|
174
|
+
}
|
|
175
|
+
return strings.Join(msgs, "; ")
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
func validateAll(items []Item) error {
|
|
179
|
+
var errs MultiError
|
|
180
|
+
for _, item := range items {
|
|
181
|
+
if err := validate(item); err != nil {
|
|
182
|
+
errs = append(errs, err)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if len(errs) > 0 {
|
|
186
|
+
return errs
|
|
187
|
+
}
|
|
188
|
+
return nil
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Panic and Recover
|
|
193
|
+
|
|
194
|
+
### When to Panic
|
|
195
|
+
|
|
196
|
+
- Unrecoverable errors during initialization
|
|
197
|
+
- Programming errors (nil pointer, out of bounds)
|
|
198
|
+
- Violation of invariants
|
|
199
|
+
|
|
200
|
+
```go
|
|
201
|
+
func MustCompile(pattern string) *Regexp {
|
|
202
|
+
re, err := Compile(pattern)
|
|
203
|
+
if err != nil {
|
|
204
|
+
panic(err)
|
|
205
|
+
}
|
|
206
|
+
return re
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Recovering from Panic
|
|
211
|
+
|
|
212
|
+
```go
|
|
213
|
+
func safeCall(fn func()) (err error) {
|
|
214
|
+
defer func() {
|
|
215
|
+
if r := recover(); r != nil {
|
|
216
|
+
err = fmt.Errorf("panic recovered: %v", r)
|
|
217
|
+
}
|
|
218
|
+
}()
|
|
219
|
+
fn()
|
|
220
|
+
return nil
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Package Boundary Rule
|
|
225
|
+
|
|
226
|
+
- Convert panics to errors at package boundaries
|
|
227
|
+
- Don't let panics escape your API
|
|
228
|
+
|
|
229
|
+
```go
|
|
230
|
+
func (s *Server) handleRequest(w http.ResponseWriter, r *http.Request) {
|
|
231
|
+
defer func() {
|
|
232
|
+
if err := recover(); err != nil {
|
|
233
|
+
log.Printf("panic: %v\n%s", err, debug.Stack())
|
|
234
|
+
http.Error(w, "Internal Server Error", 500)
|
|
235
|
+
}
|
|
236
|
+
}()
|
|
237
|
+
// handle request
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Best Practices
|
|
242
|
+
|
|
243
|
+
1. **Handle errors immediately** after the call
|
|
244
|
+
2. **Add context** when propagating errors
|
|
245
|
+
3. **Use error wrapping** with `%w` for error chains
|
|
246
|
+
4. **Define sentinel errors** for known conditions
|
|
247
|
+
5. **Don't ignore errors** (at minimum, log them)
|
|
248
|
+
6. **Prefer errors over panics** in library code
|
|
249
|
+
7. **Document error returns** in function comments
|
|
250
|
+
8. **Test error paths** as thoroughly as success paths
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Golang Guide
|
|
2
|
+
|
|
3
|
+
metadata:
|
|
4
|
+
name: golang
|
|
5
|
+
description: Go language reference documentation
|
|
6
|
+
|
|
7
|
+
source:
|
|
8
|
+
type: external
|
|
9
|
+
origin: go.dev
|
|
10
|
+
url: https://go.dev/doc/effective_go
|
|
11
|
+
last_fetched: "2026-01-22"
|
|
12
|
+
|
|
13
|
+
documents:
|
|
14
|
+
- name: effective-go
|
|
15
|
+
path: ./effective-go.md
|
|
16
|
+
description: Effective Go - official best practices guide
|
|
17
|
+
|
|
18
|
+
- name: concurrency
|
|
19
|
+
path: ./concurrency.md
|
|
20
|
+
description: Concurrency patterns and practices
|
|
21
|
+
|
|
22
|
+
- name: error-handling
|
|
23
|
+
path: ./error-handling.md
|
|
24
|
+
description: Error handling patterns
|
|
25
|
+
|
|
26
|
+
used_by:
|
|
27
|
+
- golang-expert
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Kotlin Coding Conventions
|
|
2
|
+
|
|
3
|
+
> Source: https://kotlinlang.org/docs/coding-conventions.html
|
|
4
|
+
|
|
5
|
+
## Source Code Organization
|
|
6
|
+
|
|
7
|
+
### Directory Structure
|
|
8
|
+
|
|
9
|
+
Follow package structure with common root omitted:
|
|
10
|
+
- `org.example.kotlin.network.socket` → `network/socket` subdirectory
|
|
11
|
+
|
|
12
|
+
### Source File Names
|
|
13
|
+
|
|
14
|
+
| Content | File Name |
|
|
15
|
+
|---------|-----------|
|
|
16
|
+
| Single class | `MyClass.kt` |
|
|
17
|
+
| Multiple declarations | `ProcessDeclarations.kt` |
|
|
18
|
+
| Platform-specific | `Platform.jvm.kt` |
|
|
19
|
+
|
|
20
|
+
### Class Layout
|
|
21
|
+
|
|
22
|
+
1. Property declarations and initializer blocks
|
|
23
|
+
2. Secondary constructors
|
|
24
|
+
3. Method declarations
|
|
25
|
+
4. Companion object
|
|
26
|
+
|
|
27
|
+
```kotlin
|
|
28
|
+
class MyClass(val name: String) {
|
|
29
|
+
// 1. Properties
|
|
30
|
+
private val items = mutableListOf<Item>()
|
|
31
|
+
|
|
32
|
+
init {
|
|
33
|
+
// initializer block
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 2. Secondary constructors
|
|
37
|
+
constructor() : this("default")
|
|
38
|
+
|
|
39
|
+
// 3. Methods
|
|
40
|
+
fun doSomething() { }
|
|
41
|
+
|
|
42
|
+
// 4. Companion object
|
|
43
|
+
companion object {
|
|
44
|
+
const val TAG = "MyClass"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Naming Conventions
|
|
50
|
+
|
|
51
|
+
| Element | Style | Example |
|
|
52
|
+
|---------|-------|---------|
|
|
53
|
+
| Packages | lowercase | `org.example.project` |
|
|
54
|
+
| Classes | UpperCamelCase | `DeclarationProcessor` |
|
|
55
|
+
| Functions | lowerCamelCase | `processDeclarations()` |
|
|
56
|
+
| Properties | lowerCamelCase | `declarationCount` |
|
|
57
|
+
| Constants | UPPER_SNAKE_CASE | `MAX_COUNT` |
|
|
58
|
+
| Backing properties | underscore prefix | `_elementList` |
|
|
59
|
+
|
|
60
|
+
### Acronyms
|
|
61
|
+
|
|
62
|
+
- 2 letters: both uppercase (`IOStream`)
|
|
63
|
+
- 3+ letters: capitalize first only (`XmlFormatter`)
|
|
64
|
+
|
|
65
|
+
## Formatting
|
|
66
|
+
|
|
67
|
+
### Indentation
|
|
68
|
+
|
|
69
|
+
```kotlin
|
|
70
|
+
if (elements != null) {
|
|
71
|
+
for (element in elements) {
|
|
72
|
+
// 4 spaces indentation
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Horizontal Whitespace
|
|
78
|
+
|
|
79
|
+
```kotlin
|
|
80
|
+
// Binary operators with spaces
|
|
81
|
+
val sum = a + b
|
|
82
|
+
|
|
83
|
+
// No space around range
|
|
84
|
+
for (i in 0..n) { }
|
|
85
|
+
|
|
86
|
+
// No space around dot
|
|
87
|
+
foo.bar().filter { it > 2 }
|
|
88
|
+
|
|
89
|
+
// Space after control keywords
|
|
90
|
+
if (condition) { }
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Colons
|
|
94
|
+
|
|
95
|
+
```kotlin
|
|
96
|
+
// Type and supertype: space before
|
|
97
|
+
abstract class Foo<out T : Any> : IFoo {
|
|
98
|
+
// Declaration and type: no space before
|
|
99
|
+
abstract fun foo(a: Int): T
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Function Signatures
|
|
104
|
+
|
|
105
|
+
```kotlin
|
|
106
|
+
// Short: single line
|
|
107
|
+
fun foo(a: Int): String = a.toString()
|
|
108
|
+
|
|
109
|
+
// Long: break parameters
|
|
110
|
+
fun longMethodName(
|
|
111
|
+
argument: ArgumentType = defaultValue,
|
|
112
|
+
argument2: AnotherArgumentType,
|
|
113
|
+
): ReturnType {
|
|
114
|
+
// body
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Trailing Commas
|
|
119
|
+
|
|
120
|
+
```kotlin
|
|
121
|
+
class Person(
|
|
122
|
+
val firstName: String,
|
|
123
|
+
val lastName: String,
|
|
124
|
+
val age: Int, // trailing comma
|
|
125
|
+
)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Idiomatic Patterns
|
|
129
|
+
|
|
130
|
+
### Immutability
|
|
131
|
+
|
|
132
|
+
```kotlin
|
|
133
|
+
// Prefer val
|
|
134
|
+
val name = "Kotlin"
|
|
135
|
+
|
|
136
|
+
// Prefer immutable collections
|
|
137
|
+
val items = listOf(1, 2, 3)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Default Parameters
|
|
141
|
+
|
|
142
|
+
```kotlin
|
|
143
|
+
// Prefer over overloads
|
|
144
|
+
fun read(
|
|
145
|
+
b: ByteArray,
|
|
146
|
+
off: Int = 0,
|
|
147
|
+
len: Int = b.size,
|
|
148
|
+
) { }
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Expression Bodies
|
|
152
|
+
|
|
153
|
+
```kotlin
|
|
154
|
+
// Prefer for simple functions
|
|
155
|
+
fun square(x: Int) = x * x
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Conditionals
|
|
159
|
+
|
|
160
|
+
```kotlin
|
|
161
|
+
// Use if for binary
|
|
162
|
+
return if (x) foo() else bar()
|
|
163
|
+
|
|
164
|
+
// Use when for multiple
|
|
165
|
+
return when (x) {
|
|
166
|
+
0 -> "zero"
|
|
167
|
+
1 -> "one"
|
|
168
|
+
else -> "many"
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Functional Operations
|
|
173
|
+
|
|
174
|
+
```kotlin
|
|
175
|
+
// Prefer
|
|
176
|
+
list.filter { it > 10 }
|
|
177
|
+
.map { it * 2 }
|
|
178
|
+
.take(5)
|
|
179
|
+
|
|
180
|
+
// Over manual loops
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Ranges
|
|
184
|
+
|
|
185
|
+
```kotlin
|
|
186
|
+
// Good: open-ended range
|
|
187
|
+
for (i in 0..<n) { }
|
|
188
|
+
|
|
189
|
+
// Avoid
|
|
190
|
+
for (i in 0..n - 1) { }
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Null Safety
|
|
194
|
+
|
|
195
|
+
```kotlin
|
|
196
|
+
// Safe call
|
|
197
|
+
val length = text?.length
|
|
198
|
+
|
|
199
|
+
// Elvis operator
|
|
200
|
+
val name = user?.name ?: "Unknown"
|
|
201
|
+
|
|
202
|
+
// Let for non-null
|
|
203
|
+
user?.let {
|
|
204
|
+
println("Hello, ${it.name}")
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Not-null assertion (use sparingly)
|
|
208
|
+
val name = user!!.name
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Documentation
|
|
212
|
+
|
|
213
|
+
```kotlin
|
|
214
|
+
/**
|
|
215
|
+
* Returns the absolute value of the given [number].
|
|
216
|
+
*/
|
|
217
|
+
fun abs(number: Int): Int = if (number < 0) -number else number
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* A group of *members*.
|
|
221
|
+
*
|
|
222
|
+
* This class has no useful logic; it's just a documentation example.
|
|
223
|
+
*
|
|
224
|
+
* @property name the name of this group.
|
|
225
|
+
* @constructor Creates an empty group.
|
|
226
|
+
*/
|
|
227
|
+
class Group(val name: String) {
|
|
228
|
+
/**
|
|
229
|
+
* Adds a [member] to this group.
|
|
230
|
+
* @return the new size of the group.
|
|
231
|
+
*/
|
|
232
|
+
fun add(member: Member): Int { ... }
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Avoid Redundant Constructs
|
|
237
|
+
|
|
238
|
+
```kotlin
|
|
239
|
+
// Avoid explicit Unit return
|
|
240
|
+
fun foo() { } // not: fun foo(): Unit { }
|
|
241
|
+
|
|
242
|
+
// Avoid semicolons
|
|
243
|
+
val x = 1 // not: val x = 1;
|
|
244
|
+
|
|
245
|
+
// Use simple string templates
|
|
246
|
+
"$name" // not: "${name}"
|
|
247
|
+
```
|