@hivehub/rulebook 1.2.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.
- package/LICENSE +191 -0
- package/README.md +539 -0
- package/dist/agents/claude-code.d.ts +69 -0
- package/dist/agents/claude-code.d.ts.map +1 -0
- package/dist/agents/claude-code.js +180 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/cursor-agent.d.ts +184 -0
- package/dist/agents/cursor-agent.d.ts.map +1 -0
- package/dist/agents/cursor-agent.js +299 -0
- package/dist/agents/cursor-agent.js.map +1 -0
- package/dist/agents/gemini-cli.d.ts +69 -0
- package/dist/agents/gemini-cli.d.ts.map +1 -0
- package/dist/agents/gemini-cli.js +180 -0
- package/dist/agents/gemini-cli.js.map +1 -0
- package/dist/cli/commands.d.ts +57 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1370 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/docs-prompts.d.ts +3 -0
- package/dist/cli/docs-prompts.d.ts.map +1 -0
- package/dist/cli/docs-prompts.js +45 -0
- package/dist/cli/docs-prompts.js.map +1 -0
- package/dist/cli/prompts.d.ts +6 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +376 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/core/agent-manager.d.ts +89 -0
- package/dist/core/agent-manager.d.ts.map +1 -0
- package/dist/core/agent-manager.js +546 -0
- package/dist/core/agent-manager.js.map +1 -0
- package/dist/core/auto-fixer.d.ts +14 -0
- package/dist/core/auto-fixer.d.ts.map +1 -0
- package/dist/core/auto-fixer.js +207 -0
- package/dist/core/auto-fixer.js.map +1 -0
- package/dist/core/changelog-generator.d.ts +44 -0
- package/dist/core/changelog-generator.d.ts.map +1 -0
- package/dist/core/changelog-generator.js +222 -0
- package/dist/core/changelog-generator.js.map +1 -0
- package/dist/core/cli-bridge.d.ts +113 -0
- package/dist/core/cli-bridge.d.ts.map +1 -0
- package/dist/core/cli-bridge.js +1094 -0
- package/dist/core/cli-bridge.js.map +1 -0
- package/dist/core/config-manager.d.ts +65 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +266 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/coverage-checker.d.ts +14 -0
- package/dist/core/coverage-checker.d.ts.map +1 -0
- package/dist/core/coverage-checker.js +176 -0
- package/dist/core/coverage-checker.js.map +1 -0
- package/dist/core/custom-templates.d.ts +27 -0
- package/dist/core/custom-templates.d.ts.map +1 -0
- package/dist/core/custom-templates.js +122 -0
- package/dist/core/custom-templates.js.map +1 -0
- package/dist/core/dependency-checker.d.ts +21 -0
- package/dist/core/dependency-checker.d.ts.map +1 -0
- package/dist/core/dependency-checker.js +247 -0
- package/dist/core/dependency-checker.js.map +1 -0
- package/dist/core/detector.d.ts +3 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +1443 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/docs-generator.d.ts +9 -0
- package/dist/core/docs-generator.d.ts.map +1 -0
- package/dist/core/docs-generator.js +531 -0
- package/dist/core/docs-generator.js.map +1 -0
- package/dist/core/generator.d.ts +16 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +561 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/gitignore-generator.d.ts +13 -0
- package/dist/core/gitignore-generator.d.ts.map +1 -0
- package/dist/core/gitignore-generator.js +307 -0
- package/dist/core/gitignore-generator.js.map +1 -0
- package/dist/core/health-scorer.d.ts +22 -0
- package/dist/core/health-scorer.d.ts.map +1 -0
- package/dist/core/health-scorer.js +395 -0
- package/dist/core/health-scorer.js.map +1 -0
- package/dist/core/logger.d.ts +116 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +289 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/merger.d.ts +6 -0
- package/dist/core/merger.d.ts.map +1 -0
- package/dist/core/merger.js +131 -0
- package/dist/core/merger.js.map +1 -0
- package/dist/core/migrator.d.ts +19 -0
- package/dist/core/migrator.d.ts.map +1 -0
- package/dist/core/migrator.js +102 -0
- package/dist/core/migrator.js.map +1 -0
- package/dist/core/minimal-scaffolder.d.ts +8 -0
- package/dist/core/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/minimal-scaffolder.js +51 -0
- package/dist/core/minimal-scaffolder.js.map +1 -0
- package/dist/core/modern-console-new.d.ts +81 -0
- package/dist/core/modern-console-new.d.ts.map +1 -0
- package/dist/core/modern-console-new.js +340 -0
- package/dist/core/modern-console-new.js.map +1 -0
- package/dist/core/modern-console.d.ts +99 -0
- package/dist/core/modern-console.d.ts.map +1 -0
- package/dist/core/modern-console.js +568 -0
- package/dist/core/modern-console.js.map +1 -0
- package/dist/core/openspec-manager.d.ts +133 -0
- package/dist/core/openspec-manager.d.ts.map +1 -0
- package/dist/core/openspec-manager.js +605 -0
- package/dist/core/openspec-manager.js.map +1 -0
- package/dist/core/openspec-migrator.d.ts +27 -0
- package/dist/core/openspec-migrator.d.ts.map +1 -0
- package/dist/core/openspec-migrator.js +255 -0
- package/dist/core/openspec-migrator.js.map +1 -0
- package/dist/core/task-manager.d.ts +65 -0
- package/dist/core/task-manager.d.ts.map +1 -0
- package/dist/core/task-manager.js +318 -0
- package/dist/core/task-manager.js.map +1 -0
- package/dist/core/test-task-manager.d.ts +49 -0
- package/dist/core/test-task-manager.d.ts.map +1 -0
- package/dist/core/test-task-manager.js +121 -0
- package/dist/core/test-task-manager.js.map +1 -0
- package/dist/core/validator.d.ts +21 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +177 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/version-bumper.d.ts +19 -0
- package/dist/core/version-bumper.d.ts.map +1 -0
- package/dist/core/version-bumper.js +180 -0
- package/dist/core/version-bumper.js.map +1 -0
- package/dist/core/watcher.d.ts +9 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +22 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/core/workflow-generator.d.ts +10 -0
- package/dist/core/workflow-generator.d.ts.map +1 -0
- package/dist/core/workflow-generator.js +279 -0
- package/dist/core/workflow-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers/archive-task.d.ts +17 -0
- package/dist/mcp/handlers/archive-task.d.ts.map +1 -0
- package/dist/mcp/handlers/archive-task.js +36 -0
- package/dist/mcp/handlers/archive-task.js.map +1 -0
- package/dist/mcp/handlers/create-task.d.ts +17 -0
- package/dist/mcp/handlers/create-task.d.ts.map +1 -0
- package/dist/mcp/handlers/create-task.js +56 -0
- package/dist/mcp/handlers/create-task.js.map +1 -0
- package/dist/mcp/handlers/list-tasks.d.ts +22 -0
- package/dist/mcp/handlers/list-tasks.d.ts.map +1 -0
- package/dist/mcp/handlers/list-tasks.js +42 -0
- package/dist/mcp/handlers/list-tasks.js.map +1 -0
- package/dist/mcp/handlers/show-task.d.ts +25 -0
- package/dist/mcp/handlers/show-task.d.ts.map +1 -0
- package/dist/mcp/handlers/show-task.js +43 -0
- package/dist/mcp/handlers/show-task.js.map +1 -0
- package/dist/mcp/handlers/update-task.d.ts +17 -0
- package/dist/mcp/handlers/update-task.d.ts.map +1 -0
- package/dist/mcp/handlers/update-task.js +35 -0
- package/dist/mcp/handlers/update-task.js.map +1 -0
- package/dist/mcp/handlers/validate-task.d.ts +15 -0
- package/dist/mcp/handlers/validate-task.d.ts.map +1 -0
- package/dist/mcp/handlers/validate-task.js +27 -0
- package/dist/mcp/handlers/validate-task.js.map +1 -0
- package/dist/mcp/rulebook-config.d.ts +22 -0
- package/dist/mcp/rulebook-config.d.ts.map +1 -0
- package/dist/mcp/rulebook-config.js +65 -0
- package/dist/mcp/rulebook-config.js.map +1 -0
- package/dist/mcp/rulebook-server.d.ts +4 -0
- package/dist/mcp/rulebook-server.d.ts.map +1 -0
- package/dist/mcp/rulebook-server.js +246 -0
- package/dist/mcp/rulebook-server.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file-system.d.ts +9 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +51 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/git-hooks.d.ts +8 -0
- package/dist/utils/git-hooks.d.ts.map +1 -0
- package/dist/utils/git-hooks.js +440 -0
- package/dist/utils/git-hooks.js.map +1 -0
- package/dist/utils/rulesignore.d.ts +9 -0
- package/dist/utils/rulesignore.d.ts.map +1 -0
- package/dist/utils/rulesignore.js +42 -0
- package/dist/utils/rulesignore.js.map +1 -0
- package/package.json +106 -0
- package/templates/cli/AIDER.md +49 -0
- package/templates/cli/AMAZON_Q.md +25 -0
- package/templates/cli/AUGGIE.md +32 -0
- package/templates/cli/CLAUDE.md +32 -0
- package/templates/cli/CLAUDE_CODE.md +35 -0
- package/templates/cli/CLINE.md +32 -0
- package/templates/cli/CODEBUDDY.md +20 -0
- package/templates/cli/CODEIUM.md +20 -0
- package/templates/cli/CODEX.md +21 -0
- package/templates/cli/CONTINUE.md +34 -0
- package/templates/cli/CURSOR_CLI.md +28 -0
- package/templates/cli/FACTORY.md +18 -0
- package/templates/cli/GEMINI.md +35 -0
- package/templates/cli/KILOCODE.md +18 -0
- package/templates/cli/OPENCODE.md +18 -0
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -0
- package/templates/commands/rulebook-task-apply.md +67 -0
- package/templates/commands/rulebook-task-archive.md +70 -0
- package/templates/commands/rulebook-task-create.md +93 -0
- package/templates/commands/rulebook-task-list.md +42 -0
- package/templates/commands/rulebook-task-show.md +52 -0
- package/templates/commands/rulebook-task-validate.md +53 -0
- package/templates/core/AGENT_AUTOMATION.md +184 -0
- package/templates/core/DAG.md +304 -0
- package/templates/core/DOCUMENTATION_RULES.md +37 -0
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -0
- package/templates/core/RULEBOOK.md +1874 -0
- package/templates/frameworks/ANGULAR.md +36 -0
- package/templates/frameworks/DJANGO.md +83 -0
- package/templates/frameworks/ELECTRON.md +147 -0
- package/templates/frameworks/FLASK.md +38 -0
- package/templates/frameworks/FLUTTER.md +55 -0
- package/templates/frameworks/JQUERY.md +32 -0
- package/templates/frameworks/LARAVEL.md +38 -0
- package/templates/frameworks/NESTJS.md +43 -0
- package/templates/frameworks/NEXTJS.md +127 -0
- package/templates/frameworks/NUXT.md +40 -0
- package/templates/frameworks/RAILS.md +66 -0
- package/templates/frameworks/REACT.md +38 -0
- package/templates/frameworks/REACT_NATIVE.md +47 -0
- package/templates/frameworks/SPRING.md +39 -0
- package/templates/frameworks/SYMFONY.md +36 -0
- package/templates/frameworks/VUE.md +36 -0
- package/templates/frameworks/ZEND.md +35 -0
- package/templates/git/CI_CD_PATTERNS.md +661 -0
- package/templates/git/GITHUB_ACTIONS.md +728 -0
- package/templates/git/GITLAB_CI.md +730 -0
- package/templates/git/GIT_WORKFLOW.md +1157 -0
- package/templates/git/SECRETS_MANAGEMENT.md +585 -0
- package/templates/hooks/COMMIT_MSG.md +530 -0
- package/templates/hooks/POST_CHECKOUT.md +546 -0
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -0
- package/templates/hooks/PRE_COMMIT.md +414 -0
- package/templates/hooks/PRE_PUSH.md +601 -0
- package/templates/hooks/csharp-pre-commit.sh +23 -0
- package/templates/hooks/csharp-pre-push.sh +23 -0
- package/templates/hooks/dart-pre-commit.sh +30 -0
- package/templates/hooks/dart-pre-push.sh +25 -0
- package/templates/hooks/elixir-pre-commit.sh +32 -0
- package/templates/hooks/elixir-pre-push.sh +31 -0
- package/templates/hooks/erlang-pre-commit.sh +30 -0
- package/templates/hooks/erlang-pre-push.sh +37 -0
- package/templates/hooks/go-pre-commit.sh +40 -0
- package/templates/hooks/go-pre-push.sh +31 -0
- package/templates/hooks/haskell-pre-commit.sh +41 -0
- package/templates/hooks/haskell-pre-push.sh +37 -0
- package/templates/hooks/java-pre-commit.sh +34 -0
- package/templates/hooks/java-pre-push.sh +24 -0
- package/templates/hooks/kotlin-pre-commit.sh +32 -0
- package/templates/hooks/kotlin-pre-push.sh +16 -0
- package/templates/hooks/php-pre-commit.sh +36 -0
- package/templates/hooks/php-pre-push.sh +26 -0
- package/templates/hooks/python-pre-commit.sh +51 -0
- package/templates/hooks/python-pre-push.sh +25 -0
- package/templates/hooks/ruby-pre-commit.sh +33 -0
- package/templates/hooks/ruby-pre-push.sh +32 -0
- package/templates/hooks/rust-pre-commit.sh +30 -0
- package/templates/hooks/rust-pre-push.sh +30 -0
- package/templates/hooks/scala-pre-commit.sh +32 -0
- package/templates/hooks/scala-pre-push.sh +24 -0
- package/templates/hooks/swift-pre-commit.sh +25 -0
- package/templates/hooks/swift-pre-push.sh +23 -0
- package/templates/hooks/typescript-pre-commit.sh +37 -0
- package/templates/hooks/typescript-pre-push.sh +36 -0
- package/templates/ides/COPILOT.md +37 -0
- package/templates/ides/CURSOR.md +43 -0
- package/templates/ides/JETBRAINS_AI.md +35 -0
- package/templates/ides/REPLIT.md +36 -0
- package/templates/ides/TABNINE.md +29 -0
- package/templates/ides/VSCODE.md +40 -0
- package/templates/ides/WINDSURF.md +36 -0
- package/templates/ides/ZED.md +32 -0
- package/templates/languages/ADA.md +58 -0
- package/templates/languages/C.md +333 -0
- package/templates/languages/CPP.md +743 -0
- package/templates/languages/CSHARP.md +417 -0
- package/templates/languages/DART.md +332 -0
- package/templates/languages/ELIXIR.md +454 -0
- package/templates/languages/ERLANG.md +361 -0
- package/templates/languages/GO.md +645 -0
- package/templates/languages/HASKELL.md +177 -0
- package/templates/languages/JAVA.md +607 -0
- package/templates/languages/JAVASCRIPT.md +631 -0
- package/templates/languages/JULIA.md +97 -0
- package/templates/languages/KOTLIN.md +511 -0
- package/templates/languages/LISP.md +100 -0
- package/templates/languages/LUA.md +74 -0
- package/templates/languages/OBJECTIVEC.md +90 -0
- package/templates/languages/PHP.md +416 -0
- package/templates/languages/PYTHON.md +682 -0
- package/templates/languages/R.md +350 -0
- package/templates/languages/RUBY.md +421 -0
- package/templates/languages/RUST.md +477 -0
- package/templates/languages/SAS.md +73 -0
- package/templates/languages/SCALA.md +348 -0
- package/templates/languages/SOLIDITY.md +580 -0
- package/templates/languages/SQL.md +137 -0
- package/templates/languages/SWIFT.md +466 -0
- package/templates/languages/TYPESCRIPT.md +591 -0
- package/templates/languages/ZIG.md +265 -0
- package/templates/modules/ATLASSIAN.md +255 -0
- package/templates/modules/CONTEXT7.md +54 -0
- package/templates/modules/FIGMA.md +267 -0
- package/templates/modules/GITHUB_MCP.md +64 -0
- package/templates/modules/GRAFANA.md +328 -0
- package/templates/modules/NOTION.md +247 -0
- package/templates/modules/PLAYWRIGHT.md +90 -0
- package/templates/modules/RULEBOOK_MCP.md +156 -0
- package/templates/modules/SERENA.md +337 -0
- package/templates/modules/SUPABASE.md +223 -0
- package/templates/modules/SYNAP.md +69 -0
- package/templates/modules/VECTORIZER.md +63 -0
- package/templates/services/AZURE_BLOB.md +184 -0
- package/templates/services/CASSANDRA.md +239 -0
- package/templates/services/DYNAMODB.md +308 -0
- package/templates/services/ELASTICSEARCH.md +347 -0
- package/templates/services/GCS.md +178 -0
- package/templates/services/INFLUXDB.md +265 -0
- package/templates/services/KAFKA.md +341 -0
- package/templates/services/MARIADB.md +183 -0
- package/templates/services/MEMCACHED.md +242 -0
- package/templates/services/MINIO.md +201 -0
- package/templates/services/MONGODB.md +268 -0
- package/templates/services/MYSQL.md +358 -0
- package/templates/services/NEO4J.md +247 -0
- package/templates/services/ORACLE.md +290 -0
- package/templates/services/POSTGRESQL.md +326 -0
- package/templates/services/RABBITMQ.md +286 -0
- package/templates/services/REDIS.md +292 -0
- package/templates/services/S3.md +298 -0
- package/templates/services/SQLITE.md +294 -0
- package/templates/services/SQLSERVER.md +294 -0
- package/templates/workflows/codespell.yml +31 -0
- package/templates/workflows/cpp-lint.yml +47 -0
- package/templates/workflows/cpp-publish.yml +119 -0
- package/templates/workflows/cpp-test.yml +77 -0
- package/templates/workflows/dotnet-lint.yml +29 -0
- package/templates/workflows/dotnet-publish.yml +40 -0
- package/templates/workflows/dotnet-test.yml +41 -0
- package/templates/workflows/elixir-lint.yml +45 -0
- package/templates/workflows/elixir-publish.yml +49 -0
- package/templates/workflows/elixir-test.yml +54 -0
- package/templates/workflows/erlang-lint.yml +47 -0
- package/templates/workflows/erlang-test.yml +62 -0
- package/templates/workflows/go-lint.yml +39 -0
- package/templates/workflows/go-publish.yml +95 -0
- package/templates/workflows/go-test.yml +59 -0
- package/templates/workflows/java-lint.yml +60 -0
- package/templates/workflows/java-publish.yml +120 -0
- package/templates/workflows/java-test.yml +85 -0
- package/templates/workflows/kotlin-lint.yml +34 -0
- package/templates/workflows/kotlin-publish.yml +56 -0
- package/templates/workflows/kotlin-test.yml +48 -0
- package/templates/workflows/php-lint.yml +39 -0
- package/templates/workflows/php-publish.yml +50 -0
- package/templates/workflows/php-test.yml +54 -0
- package/templates/workflows/python-lint.yml +47 -0
- package/templates/workflows/python-publish.yml +91 -0
- package/templates/workflows/python-test.yml +59 -0
- package/templates/workflows/rust-lint.yml +54 -0
- package/templates/workflows/rust-publish.yml +66 -0
- package/templates/workflows/rust-test.yml +75 -0
- package/templates/workflows/solidity-lint.yml +41 -0
- package/templates/workflows/solidity-test.yml +47 -0
- package/templates/workflows/swift-lint.yml +32 -0
- package/templates/workflows/swift-publish.yml +58 -0
- package/templates/workflows/swift-test.yml +44 -0
- package/templates/workflows/typescript-lint.yml +61 -0
- package/templates/workflows/typescript-publish.yml +60 -0
- package/templates/workflows/typescript-test.yml +73 -0
- package/templates/workflows/zig-lint.yml +27 -0
- package/templates/workflows/zig-test.yml +40 -0
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
<!-- GO:START -->
|
|
2
|
+
# Go Project Rules
|
|
3
|
+
|
|
4
|
+
## Agent Automation Commands
|
|
5
|
+
|
|
6
|
+
**CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Complete quality check sequence:
|
|
10
|
+
gofmt -l . # Format check (should be empty)
|
|
11
|
+
golangci-lint run # Linting
|
|
12
|
+
go vet ./... # Static analysis
|
|
13
|
+
go test ./... -v -race -coverprofile=coverage.out # Tests + race detection
|
|
14
|
+
go tool cover -func=coverage.out # Coverage (95%+ required)
|
|
15
|
+
go build ./... # Build verification
|
|
16
|
+
|
|
17
|
+
# Security audit:
|
|
18
|
+
go list -json -m all | nancy sleuth # Vulnerability scan
|
|
19
|
+
go list -u -m all # Check outdated deps
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Go Version
|
|
23
|
+
|
|
24
|
+
**CRITICAL**: Use Go 1.21+ for modern features and performance.
|
|
25
|
+
|
|
26
|
+
- **Minimum Version**: Go 1.21+
|
|
27
|
+
- **Recommended**: Go 1.22+
|
|
28
|
+
- **Module System**: Go modules enabled
|
|
29
|
+
|
|
30
|
+
### Formatting
|
|
31
|
+
|
|
32
|
+
- Use `gofmt` or `goimports` for code formatting
|
|
33
|
+
- Standard Go formatting is non-negotiable
|
|
34
|
+
- Format before committing: `gofmt -w .`
|
|
35
|
+
- CI must check formatting: `gofmt -l . | wc -l` should be 0
|
|
36
|
+
|
|
37
|
+
### Linting
|
|
38
|
+
|
|
39
|
+
- Use `golangci-lint` with recommended linters
|
|
40
|
+
- Configuration in `.golangci.yml`
|
|
41
|
+
- Must pass with no issues
|
|
42
|
+
- Enable linters: govet, errcheck, staticcheck, gosimple, unused
|
|
43
|
+
|
|
44
|
+
Example `.golangci.yml`:
|
|
45
|
+
```yaml
|
|
46
|
+
linters:
|
|
47
|
+
enable:
|
|
48
|
+
- govet
|
|
49
|
+
- errcheck
|
|
50
|
+
- staticcheck
|
|
51
|
+
- gosimple
|
|
52
|
+
- unused
|
|
53
|
+
- gosec
|
|
54
|
+
- gocyclo
|
|
55
|
+
- gofmt
|
|
56
|
+
- goimports
|
|
57
|
+
|
|
58
|
+
linters-settings:
|
|
59
|
+
gocyclo:
|
|
60
|
+
min-complexity: 15
|
|
61
|
+
govet:
|
|
62
|
+
check-shadowing: true
|
|
63
|
+
|
|
64
|
+
issues:
|
|
65
|
+
exclude-use-default: false
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Testing
|
|
69
|
+
|
|
70
|
+
- **Framework**: Standard testing package
|
|
71
|
+
- **Location**: `*_test.go` files in same package
|
|
72
|
+
- **Coverage**: Must meet project threshold (default 95%)
|
|
73
|
+
- **Table-Driven Tests**: Use for multiple test cases
|
|
74
|
+
- **Subtests**: Use `t.Run()` for organized tests
|
|
75
|
+
|
|
76
|
+
Example test structure:
|
|
77
|
+
```go
|
|
78
|
+
package mypackage
|
|
79
|
+
|
|
80
|
+
import (
|
|
81
|
+
"testing"
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
func TestMyFunction(t *testing.T) {
|
|
85
|
+
tests := []struct {
|
|
86
|
+
name string
|
|
87
|
+
input string
|
|
88
|
+
want string
|
|
89
|
+
wantErr bool
|
|
90
|
+
}{
|
|
91
|
+
{"valid input", "test", "TEST", false},
|
|
92
|
+
{"empty input", "", "", true},
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
for _, tt := range tests {
|
|
96
|
+
t.Run(tt.name, func(t *testing.T) {
|
|
97
|
+
got, err := MyFunction(tt.input)
|
|
98
|
+
if (err != nil) != tt.wantErr {
|
|
99
|
+
t.Errorf("MyFunction() error = %v, wantErr %v", err, tt.wantErr)
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
if got != tt.want {
|
|
103
|
+
t.Errorf("MyFunction() = %v, want %v", got, tt.want)
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Test Categories: S2S and Slow Tests
|
|
111
|
+
|
|
112
|
+
**CRITICAL**: Tests must be categorized based on execution time and dependencies.
|
|
113
|
+
|
|
114
|
+
#### Test Time Limits
|
|
115
|
+
|
|
116
|
+
- **Fast Tests**: Must complete in ≤ 10-20 seconds
|
|
117
|
+
- **Slow Tests**: Any test taking > 10-20 seconds must be marked as slow
|
|
118
|
+
- **S2S Tests**: Tests requiring active server/database must be isolated and run on-demand
|
|
119
|
+
|
|
120
|
+
#### S2S (Server-to-Server) Tests
|
|
121
|
+
|
|
122
|
+
**Tests that require active servers, databases, or external services must be isolated using build tags.**
|
|
123
|
+
|
|
124
|
+
**Implementation**:
|
|
125
|
+
|
|
126
|
+
1. **Use build tags to isolate S2S tests**:
|
|
127
|
+
```go
|
|
128
|
+
// +build s2s
|
|
129
|
+
|
|
130
|
+
package mypackage
|
|
131
|
+
|
|
132
|
+
import (
|
|
133
|
+
"testing"
|
|
134
|
+
"os"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
func TestDatabaseConnection(t *testing.T) {
|
|
138
|
+
// Requires active database server
|
|
139
|
+
if os.Getenv("RUN_S2S_TESTS") == "" {
|
|
140
|
+
t.Skip("S2S tests disabled. Set RUN_S2S_TESTS=1 to enable.")
|
|
141
|
+
}
|
|
142
|
+
db := connectToDatabase()
|
|
143
|
+
// ... test implementation
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
func TestAPIIntegration(t *testing.T) {
|
|
147
|
+
// Requires active API server
|
|
148
|
+
if os.Getenv("RUN_S2S_TESTS") == "" {
|
|
149
|
+
t.Skip("S2S tests disabled. Set RUN_S2S_TESTS=1 to enable.")
|
|
150
|
+
}
|
|
151
|
+
client := createAPIClient()
|
|
152
|
+
// ... test implementation
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
2. **Regular tests (without build tag)**:
|
|
157
|
+
```go
|
|
158
|
+
// Regular fast test (always runs)
|
|
159
|
+
package mypackage
|
|
160
|
+
|
|
161
|
+
import "testing"
|
|
162
|
+
|
|
163
|
+
func TestLocalComputation(t *testing.T) {
|
|
164
|
+
// Fast test, no external dependencies
|
|
165
|
+
result := computeLocally("input")
|
|
166
|
+
if result != "expected" {
|
|
167
|
+
t.Errorf("Expected 'expected', got %v", result)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
3. **Run tests**:
|
|
173
|
+
```bash
|
|
174
|
+
# Regular tests (excludes S2S)
|
|
175
|
+
go test ./...
|
|
176
|
+
|
|
177
|
+
# Include S2S tests (requires active servers)
|
|
178
|
+
RUN_S2S_TESTS=1 go test -tags s2s ./...
|
|
179
|
+
|
|
180
|
+
# Run only S2S tests
|
|
181
|
+
RUN_S2S_TESTS=1 go test -tags s2s ./... -run TestDatabase
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### Slow Tests
|
|
185
|
+
|
|
186
|
+
**Tests that take > 10-20 seconds must be marked and run separately.**
|
|
187
|
+
|
|
188
|
+
**Implementation**:
|
|
189
|
+
|
|
190
|
+
1. **Use build tags for slow tests**:
|
|
191
|
+
```go
|
|
192
|
+
// +build slow
|
|
193
|
+
|
|
194
|
+
package mypackage
|
|
195
|
+
|
|
196
|
+
import (
|
|
197
|
+
"testing"
|
|
198
|
+
"time"
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
func TestHeavyComputation(t *testing.T) {
|
|
202
|
+
// Takes 30+ seconds
|
|
203
|
+
start := time.Now()
|
|
204
|
+
result := processLargeDataset()
|
|
205
|
+
duration := time.Since(start)
|
|
206
|
+
|
|
207
|
+
if result == nil {
|
|
208
|
+
t.Error("Expected result, got nil")
|
|
209
|
+
}
|
|
210
|
+
t.Logf("Test completed in %v", duration)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
func TestLargeFileProcessing(t *testing.T) {
|
|
214
|
+
// Processes large files, takes > 20 seconds
|
|
215
|
+
result := processFile("large_file.dat")
|
|
216
|
+
if !result.Success {
|
|
217
|
+
t.Error("File processing failed")
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
2. **Alternative: Use environment variable**:
|
|
223
|
+
```go
|
|
224
|
+
package mypackage
|
|
225
|
+
|
|
226
|
+
import (
|
|
227
|
+
"os"
|
|
228
|
+
"testing"
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
func TestHeavyComputation(t *testing.T) {
|
|
232
|
+
if os.Getenv("RUN_SLOW_TESTS") == "" {
|
|
233
|
+
t.Skip("Slow tests disabled. Set RUN_SLOW_TESTS=1 to enable.")
|
|
234
|
+
}
|
|
235
|
+
// Heavy computation test
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
3. **Run tests**:
|
|
240
|
+
```bash
|
|
241
|
+
# Regular tests (excludes slow and S2S)
|
|
242
|
+
go test ./...
|
|
243
|
+
|
|
244
|
+
# Include slow tests
|
|
245
|
+
RUN_SLOW_TESTS=1 go test -tags slow ./...
|
|
246
|
+
|
|
247
|
+
# Run both S2S and slow tests
|
|
248
|
+
RUN_S2S_TESTS=1 RUN_SLOW_TESTS=1 go test -tags "s2s slow" ./...
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
4. **Add Makefile targets**:
|
|
252
|
+
```makefile
|
|
253
|
+
.PHONY: test test-s2s test-slow test-all
|
|
254
|
+
|
|
255
|
+
test:
|
|
256
|
+
go test ./...
|
|
257
|
+
|
|
258
|
+
test-s2s:
|
|
259
|
+
RUN_S2S_TESTS=1 go test -tags s2s ./...
|
|
260
|
+
|
|
261
|
+
test-slow:
|
|
262
|
+
RUN_SLOW_TESTS=1 go test -tags slow ./...
|
|
263
|
+
|
|
264
|
+
test-all:
|
|
265
|
+
RUN_S2S_TESTS=1 RUN_SLOW_TESTS=1 go test -tags "s2s slow" ./...
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
5. **Set timeouts in test functions**:
|
|
269
|
+
```go
|
|
270
|
+
func TestWithTimeout(t *testing.T) {
|
|
271
|
+
done := make(chan bool)
|
|
272
|
+
go func() {
|
|
273
|
+
// Long-running test
|
|
274
|
+
result := heavyOperation()
|
|
275
|
+
done <- (result != nil)
|
|
276
|
+
}()
|
|
277
|
+
|
|
278
|
+
select {
|
|
279
|
+
case success := <-done:
|
|
280
|
+
if !success {
|
|
281
|
+
t.Error("Test failed")
|
|
282
|
+
}
|
|
283
|
+
case <-time.After(60 * time.Second):
|
|
284
|
+
t.Fatal("Test timeout after 60 seconds")
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
#### Best Practices
|
|
290
|
+
|
|
291
|
+
- ✅ **Always run fast tests** in CI/CD by default
|
|
292
|
+
- ✅ **Isolate S2S tests** - never run them in standard test suite
|
|
293
|
+
- ✅ **Mark slow tests** - prevent CI/CD timeouts
|
|
294
|
+
- ✅ **Document requirements** - specify which servers/services are needed for S2S tests
|
|
295
|
+
- ✅ **Use build tags** - `// +build s2s` and `// +build slow`
|
|
296
|
+
- ✅ **Use environment variables** - Check `RUN_S2S_TESTS` and `RUN_SLOW_TESTS`
|
|
297
|
+
- ✅ **Set timeouts** - Use `time.After()` or `context.WithTimeout()` for long-running tests
|
|
298
|
+
- ✅ **Skip conditionally** - Use `t.Skip()` when services are unavailable
|
|
299
|
+
- ❌ **Never mix** fast and slow/S2S tests in same test run
|
|
300
|
+
- ❌ **Never require** external services for standard test suite
|
|
301
|
+
- ❌ **Never exceed** 10-20 seconds for regular tests
|
|
302
|
+
|
|
303
|
+
## Dependency Management
|
|
304
|
+
|
|
305
|
+
**CRITICAL**: Use Go modules for dependency management.
|
|
306
|
+
|
|
307
|
+
### go.mod and go.sum
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# Initialize module
|
|
311
|
+
go mod init github.com/username/project
|
|
312
|
+
|
|
313
|
+
# Add dependency
|
|
314
|
+
go get github.com/package/name@latest
|
|
315
|
+
|
|
316
|
+
# Update dependencies
|
|
317
|
+
go get -u ./...
|
|
318
|
+
go mod tidy
|
|
319
|
+
|
|
320
|
+
# Verify dependencies
|
|
321
|
+
go mod verify
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Dependency Guidelines
|
|
325
|
+
|
|
326
|
+
1. **Check for latest versions**:
|
|
327
|
+
- Use Context7 MCP tool if available
|
|
328
|
+
- Check pkg.go.dev for documentation
|
|
329
|
+
- Review changelog for breaking changes
|
|
330
|
+
|
|
331
|
+
2. **Version Selection**:
|
|
332
|
+
- ✅ Use latest stable versions
|
|
333
|
+
- ✅ Pin to specific versions for reproducibility
|
|
334
|
+
- ✅ Keep dependencies updated regularly
|
|
335
|
+
- ✅ Use `go mod tidy` to remove unused
|
|
336
|
+
- ❌ Don't use deprecated packages
|
|
337
|
+
- ❌ Don't vendor unless necessary
|
|
338
|
+
|
|
339
|
+
## Error Handling
|
|
340
|
+
|
|
341
|
+
- Always return errors, don't panic
|
|
342
|
+
- Use custom error types with `fmt.Errorf`
|
|
343
|
+
- Wrap errors with context: `fmt.Errorf("operation failed: %w", err)`
|
|
344
|
+
- Check all errors, never ignore
|
|
345
|
+
- Use `errors.Is()` and `errors.As()` for error checking
|
|
346
|
+
|
|
347
|
+
Example:
|
|
348
|
+
```go
|
|
349
|
+
package mypackage
|
|
350
|
+
|
|
351
|
+
import (
|
|
352
|
+
"errors"
|
|
353
|
+
"fmt"
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
var (
|
|
357
|
+
ErrInvalidInput = errors.New("invalid input")
|
|
358
|
+
ErrNotFound = errors.New("not found")
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
func ProcessData(input string) (string, error) {
|
|
362
|
+
if input == "" {
|
|
363
|
+
return "", fmt.Errorf("process data: %w", ErrInvalidInput)
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
result, err := doSomething(input)
|
|
367
|
+
if err != nil {
|
|
368
|
+
return "", fmt.Errorf("failed to process: %w", err)
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return result, nil
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## Documentation
|
|
376
|
+
|
|
377
|
+
- **Package docs**: Use package comments
|
|
378
|
+
- **Function docs**: Document all exported functions
|
|
379
|
+
- **Examples**: Include in doc comments (will run as tests)
|
|
380
|
+
- **Run godoc**: `go doc -all`
|
|
381
|
+
|
|
382
|
+
Example:
|
|
383
|
+
```go
|
|
384
|
+
// Package auth provides authentication and authorization utilities.
|
|
385
|
+
//
|
|
386
|
+
// This package implements JWT-based authentication following OAuth 2.0
|
|
387
|
+
// standards. All functions are thread-safe.
|
|
388
|
+
package auth
|
|
389
|
+
|
|
390
|
+
// Authenticate verifies user credentials and returns a JWT token.
|
|
391
|
+
//
|
|
392
|
+
// The token is valid for 24 hours and includes the user's ID and roles.
|
|
393
|
+
//
|
|
394
|
+
// Example:
|
|
395
|
+
//
|
|
396
|
+
// token, err := Authenticate("user@example.com", "password")
|
|
397
|
+
// if err != nil {
|
|
398
|
+
// log.Fatal(err)
|
|
399
|
+
// }
|
|
400
|
+
// fmt.Println("Token:", token)
|
|
401
|
+
//
|
|
402
|
+
// Returns an error if credentials are invalid or database is unreachable.
|
|
403
|
+
func Authenticate(email, password string) (string, error) {
|
|
404
|
+
// Implementation
|
|
405
|
+
return "", nil
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
## Project Structure
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
project/
|
|
413
|
+
├── go.mod # Module definition
|
|
414
|
+
├── go.sum # Dependency checksums (commit this)
|
|
415
|
+
├── README.md # Project overview (allowed in root)
|
|
416
|
+
├── CHANGELOG.md # Version history (allowed in root)
|
|
417
|
+
├── AGENTS.md # AI assistant rules (allowed in root)
|
|
418
|
+
├── LICENSE # Project license (allowed in root)
|
|
419
|
+
├── CONTRIBUTING.md # Contribution guidelines (allowed in root)
|
|
420
|
+
├── CODE_OF_CONDUCT.md # Code of conduct (allowed in root)
|
|
421
|
+
├── SECURITY.md # Security policy (allowed in root)
|
|
422
|
+
├── cmd/
|
|
423
|
+
│ └── myapp/
|
|
424
|
+
│ └── main.go # Application entry point
|
|
425
|
+
├── internal/ # Private packages
|
|
426
|
+
│ └── module/
|
|
427
|
+
│ ├── module.go
|
|
428
|
+
│ └── module_test.go
|
|
429
|
+
├── pkg/ # Public packages
|
|
430
|
+
│ └── api/
|
|
431
|
+
│ ├── api.go
|
|
432
|
+
│ └── api_test.go
|
|
433
|
+
├── tests/ # Integration tests
|
|
434
|
+
└── docs/ # Documentation
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
## Concurrency
|
|
438
|
+
|
|
439
|
+
- Use goroutines for concurrent operations
|
|
440
|
+
- Use channels for communication
|
|
441
|
+
- Use `sync.WaitGroup` for synchronization
|
|
442
|
+
- Use context for cancellation and timeouts
|
|
443
|
+
- Avoid shared memory, prefer channels
|
|
444
|
+
|
|
445
|
+
Example:
|
|
446
|
+
```go
|
|
447
|
+
func ProcessConcurrently(items []string) ([]Result, error) {
|
|
448
|
+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
449
|
+
defer cancel()
|
|
450
|
+
|
|
451
|
+
results := make(chan Result, len(items))
|
|
452
|
+
errors := make(chan error, len(items))
|
|
453
|
+
|
|
454
|
+
var wg sync.WaitGroup
|
|
455
|
+
for _, item := range items {
|
|
456
|
+
wg.Add(1)
|
|
457
|
+
go func(item string) {
|
|
458
|
+
defer wg.Done()
|
|
459
|
+
|
|
460
|
+
select {
|
|
461
|
+
case <-ctx.Done():
|
|
462
|
+
errors <- ctx.Err()
|
|
463
|
+
return
|
|
464
|
+
default:
|
|
465
|
+
result, err := processItem(item)
|
|
466
|
+
if err != nil {
|
|
467
|
+
errors <- err
|
|
468
|
+
return
|
|
469
|
+
}
|
|
470
|
+
results <- result
|
|
471
|
+
}
|
|
472
|
+
}(item)
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
wg.Wait()
|
|
476
|
+
close(results)
|
|
477
|
+
close(errors)
|
|
478
|
+
|
|
479
|
+
// Collect results
|
|
480
|
+
var finalResults []Result
|
|
481
|
+
for r := range results {
|
|
482
|
+
finalResults = append(finalResults, r)
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Check for errors
|
|
486
|
+
for err := range errors {
|
|
487
|
+
if err != nil {
|
|
488
|
+
return nil, err
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return finalResults, nil
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
## CI/CD Requirements
|
|
497
|
+
|
|
498
|
+
Must include GitHub Actions workflows for:
|
|
499
|
+
|
|
500
|
+
1. **Testing** (`go-test.yml`):
|
|
501
|
+
- Test on ubuntu-latest, windows-latest, macos-latest
|
|
502
|
+
- Test on Go 1.21, 1.22
|
|
503
|
+
- Upload coverage reports
|
|
504
|
+
|
|
505
|
+
2. **Linting** (`go-lint.yml`):
|
|
506
|
+
- Format check: `gofmt -l .`
|
|
507
|
+
- Lint: `golangci-lint run`
|
|
508
|
+
- Vet: `go vet ./...`
|
|
509
|
+
|
|
510
|
+
3. **Build** (`go-build.yml`):
|
|
511
|
+
- Build: `go build ./...`
|
|
512
|
+
- Verify binaries work
|
|
513
|
+
|
|
514
|
+
## Module Publication
|
|
515
|
+
|
|
516
|
+
### Publishing Go Modules
|
|
517
|
+
|
|
518
|
+
Go modules are published via Git tags and automatically indexed by pkg.go.dev.
|
|
519
|
+
|
|
520
|
+
**Prerequisites:**
|
|
521
|
+
1. Public Git repository (GitHub, GitLab, etc.)
|
|
522
|
+
2. Proper go.mod configuration
|
|
523
|
+
3. Semantic versioning tags
|
|
524
|
+
|
|
525
|
+
**go.mod Configuration:**
|
|
526
|
+
|
|
527
|
+
```go
|
|
528
|
+
module github.com/your-org/your-module
|
|
529
|
+
|
|
530
|
+
go 1.22
|
|
531
|
+
|
|
532
|
+
require (
|
|
533
|
+
github.com/example/dependency v1.2.3
|
|
534
|
+
)
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
**Publishing Workflow:**
|
|
538
|
+
|
|
539
|
+
1. Ensure go.mod is correct:
|
|
540
|
+
```bash
|
|
541
|
+
go mod tidy
|
|
542
|
+
go mod verify
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
2. Run quality checks:
|
|
546
|
+
```bash
|
|
547
|
+
go fmt ./...
|
|
548
|
+
go vet ./...
|
|
549
|
+
golangci-lint run
|
|
550
|
+
go test -v -race ./...
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
3. Create semantic version tag:
|
|
554
|
+
```bash
|
|
555
|
+
git tag v1.0.0
|
|
556
|
+
git push origin v1.0.0
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
4. pkg.go.dev automatically indexes the module
|
|
560
|
+
5. Verify at: `https://pkg.go.dev/github.com/your-org/your-module@v1.0.0`
|
|
561
|
+
|
|
562
|
+
**Publishing Checklist:**
|
|
563
|
+
|
|
564
|
+
- ✅ All tests passing (`go test ./...`)
|
|
565
|
+
- ✅ No race conditions (`go test -race ./...`)
|
|
566
|
+
- ✅ Code formatted (`go fmt ./...`)
|
|
567
|
+
- ✅ No vet warnings (`go vet ./...`)
|
|
568
|
+
- ✅ golangci-lint passes
|
|
569
|
+
- ✅ go.mod is tidy (`go mod tidy`)
|
|
570
|
+
- ✅ README.md with examples
|
|
571
|
+
- ✅ LICENSE file present
|
|
572
|
+
- ✅ Semantic version tag (v1.0.0)
|
|
573
|
+
- ✅ CHANGELOG.md updated
|
|
574
|
+
|
|
575
|
+
**Semantic Versioning:**
|
|
576
|
+
|
|
577
|
+
Go uses semantic versioning strictly:
|
|
578
|
+
|
|
579
|
+
- **v1.0.0** - First stable release
|
|
580
|
+
- **v1.1.0** - New features (backwards compatible)
|
|
581
|
+
- **v1.0.1** - Bug fixes
|
|
582
|
+
- **v2.0.0** - Breaking changes (requires /v2 in module path)
|
|
583
|
+
|
|
584
|
+
**Major Version Updates (v2+):**
|
|
585
|
+
|
|
586
|
+
For v2 and above, update module path:
|
|
587
|
+
|
|
588
|
+
```go
|
|
589
|
+
// go.mod
|
|
590
|
+
module github.com/your-org/your-module/v2
|
|
591
|
+
|
|
592
|
+
go 1.22
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
**Module Documentation:**
|
|
596
|
+
|
|
597
|
+
Write godoc-compatible comments:
|
|
598
|
+
|
|
599
|
+
```go
|
|
600
|
+
// Package yourmodule provides functionality for X, Y, and Z.
|
|
601
|
+
//
|
|
602
|
+
// Basic usage:
|
|
603
|
+
//
|
|
604
|
+
// import "github.com/your-org/your-module"
|
|
605
|
+
//
|
|
606
|
+
// result, err := yourmodule.Process("input")
|
|
607
|
+
// if err != nil {
|
|
608
|
+
// log.Fatal(err)
|
|
609
|
+
// }
|
|
610
|
+
package yourmodule
|
|
611
|
+
|
|
612
|
+
// Process handles the input and returns a result.
|
|
613
|
+
//
|
|
614
|
+
// Example:
|
|
615
|
+
//
|
|
616
|
+
// result, err := Process("hello")
|
|
617
|
+
// if err != nil {
|
|
618
|
+
// return err
|
|
619
|
+
// }
|
|
620
|
+
// fmt.Println(result)
|
|
621
|
+
func Process(input string) (string, error) {
|
|
622
|
+
// Implementation
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
**GOPROXY:**
|
|
627
|
+
|
|
628
|
+
Go modules are automatically cached in public proxies:
|
|
629
|
+
- https://proxy.golang.org (default)
|
|
630
|
+
- https://goproxy.io
|
|
631
|
+
- https://goproxy.cn
|
|
632
|
+
|
|
633
|
+
No manual publication needed!
|
|
634
|
+
|
|
635
|
+
**Retraction:**
|
|
636
|
+
|
|
637
|
+
To retract a published version:
|
|
638
|
+
|
|
639
|
+
```go
|
|
640
|
+
// go.mod
|
|
641
|
+
retract v1.0.5 // Critical bug in processing
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
<!-- GO:END -->
|
|
645
|
+
|