claude-code-superkit 0.0.0-stage → 1.5.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/LICENSE +21 -0
- package/README.md +374 -2
- package/bin/cli.js +153 -0
- package/bin/inject-tokens.js +224 -0
- package/bin/measure-tokens.js +17 -0
- package/bin/superkit-counts-verify.sh +30 -0
- package/lib/codex.js +246 -0
- package/lib/docs-scaffold.js +147 -0
- package/lib/installer.js +499 -0
- package/lib/prompts.js +51 -0
- package/lib/settings-builder.js +51 -0
- package/lib/superpowers.js +99 -0
- package/lib/utils.js +117 -0
- package/lib/validator.js +84 -0
- package/package.json +49 -4
- package/packages/codex/AGENTS.md +396 -0
- package/packages/codex/INSTALL.md +342 -0
- package/packages/codex/config.toml +22 -0
- package/packages/codex/hooks/superkit.mjs +203 -0
- package/packages/codex/hooks.json +30 -0
- package/packages/codex/legacy-baseline.json +88 -0
- package/packages/codex/native-skills.txt +65 -0
- package/packages/codex/rules/default.rules +565 -0
- package/packages/codex/skills/ai-slop-cleaner/SKILL.md +44 -0
- package/packages/codex/skills/api-contract-sync/SKILL.md +96 -0
- package/packages/codex/skills/architect/SKILL.md +49 -0
- package/packages/codex/skills/audit-backend/SKILL.md +80 -0
- package/packages/codex/skills/audit-frontend/SKILL.md +82 -0
- package/packages/codex/skills/audit-infra/SKILL.md +87 -0
- package/packages/codex/skills/audit-orchestrator/SKILL.md +114 -0
- package/packages/codex/skills/behavioral-nudge-engine/SKILL.md +110 -0
- package/packages/codex/skills/benchmark/SKILL.md +49 -0
- package/packages/codex/skills/bot-reviewer/SKILL.md +94 -0
- package/packages/codex/skills/code-reviewer/SKILL.md +67 -0
- package/packages/codex/skills/codebase-onboarding-engineer/SKILL.md +46 -0
- package/packages/codex/skills/comment-rot-analyzer/SKILL.md +75 -0
- package/packages/codex/skills/commit-helper/SKILL.md +101 -0
- package/packages/codex/skills/critic/SKILL.md +56 -0
- package/packages/codex/skills/database-reviewer/SKILL.md +79 -0
- package/packages/codex/skills/debug-observer/SKILL.md +107 -0
- package/packages/codex/skills/dependency-checker/SKILL.md +69 -0
- package/packages/codex/skills/design-system-reviewer/SKILL.md +121 -0
- package/packages/codex/skills/dev-orchestrator/SKILL.md +304 -0
- package/packages/codex/skills/docs-reviewer/SKILL.md +86 -0
- package/packages/codex/skills/drizzle-orm-expert/SKILL.md +246 -0
- package/packages/codex/skills/e2e-test-generator/SKILL.md +95 -0
- package/packages/codex/skills/evaluator/SKILL.md +63 -0
- package/packages/codex/skills/frontend-perf-reviewer/SKILL.md +95 -0
- package/packages/codex/skills/frontend-ui-color-reviewer/SKILL.md +68 -0
- package/packages/codex/skills/frontend-ui-design-critic/SKILL.md +99 -0
- package/packages/codex/skills/frontend-ui-interaction-reviewer/SKILL.md +102 -0
- package/packages/codex/skills/frontend-ui-motion-reviewer/SKILL.md +85 -0
- package/packages/codex/skills/frontend-ui-reviewer/SKILL.md +81 -0
- package/packages/codex/skills/frontend-ui-typography-reviewer/SKILL.md +62 -0
- package/packages/codex/skills/gltf-debugging/SKILL.md +128 -0
- package/packages/codex/skills/go-benchmark/SKILL.md +217 -0
- package/packages/codex/skills/go-concurrency-reviewer/SKILL.md +113 -0
- package/packages/codex/skills/go-error-reviewer/SKILL.md +107 -0
- package/packages/codex/skills/go-grpc-patterns/SKILL.md +285 -0
- package/packages/codex/skills/go-modernizer/SKILL.md +111 -0
- package/packages/codex/skills/go-observability-reviewer/SKILL.md +121 -0
- package/packages/codex/skills/go-performance-reviewer/SKILL.md +112 -0
- package/packages/codex/skills/go-reviewer/SKILL.md +109 -0
- package/packages/codex/skills/go-samber-do/SKILL.md +158 -0
- package/packages/codex/skills/go-samber-lo/SKILL.md +178 -0
- package/packages/codex/skills/go-samber-oops/SKILL.md +174 -0
- package/packages/codex/skills/goal-verifier/SKILL.md +53 -0
- package/packages/codex/skills/health-checker/SKILL.md +109 -0
- package/packages/codex/skills/html-to-3d-texture/SKILL.md +153 -0
- package/packages/codex/skills/impeccable-craft/SKILL.md +101 -0
- package/packages/codex/skills/lint-runner/SKILL.md +85 -0
- package/packages/codex/skills/migrate/SKILL.md +60 -0
- package/packages/codex/skills/migration-reviewer/SKILL.md +88 -0
- package/packages/codex/skills/minimal-change-engineer/SKILL.md +44 -0
- package/packages/codex/skills/new-migration/SKILL.md +59 -0
- package/packages/codex/skills/nextjs-supabase-auth/SKILL.md +227 -0
- package/packages/codex/skills/output-enforcement/SKILL.md +71 -0
- package/packages/codex/skills/plan-checker/SKILL.md +53 -0
- package/packages/codex/skills/postgresql-optimization/SKILL.md +159 -0
- package/packages/codex/skills/pre-deploy-validator/SKILL.md +111 -0
- package/packages/codex/skills/presentation-reviewer/SKILL.md +88 -0
- package/packages/codex/skills/product-3d-lighting/SKILL.md +137 -0
- package/packages/codex/skills/project-architecture/SKILL.md +52 -0
- package/packages/codex/skills/py-reviewer/SKILL.md +100 -0
- package/packages/codex/skills/r3f-scene-reviewer/SKILL.md +88 -0
- package/packages/codex/skills/r3f-scroll-driven-3d/SKILL.md +162 -0
- package/packages/codex/skills/reality-checker/SKILL.md +61 -0
- package/packages/codex/skills/redis-patterns/SKILL.md +260 -0
- package/packages/codex/skills/review-orchestrator/SKILL.md +151 -0
- package/packages/codex/skills/rs-reviewer/SKILL.md +98 -0
- package/packages/codex/skills/ru-text/SKILL.md +132 -0
- package/packages/codex/skills/scaffold-endpoint/SKILL.md +44 -0
- package/packages/codex/skills/security-scanner/SKILL.md +94 -0
- package/packages/codex/skills/silent-failure-hunter/SKILL.md +176 -0
- package/packages/codex/skills/telegram-bot-builder/SKILL.md +120 -0
- package/packages/codex/skills/test-generator/SKILL.md +79 -0
- package/packages/codex/skills/test-runner/SKILL.md +101 -0
- package/packages/codex/skills/threejs-color-management/SKILL.md +97 -0
- package/packages/codex/skills/tree-generator/SKILL.md +63 -0
- package/packages/codex/skills/ts-reviewer/SKILL.md +90 -0
- package/packages/codex/skills/ui-design-reviewer/SKILL.md +89 -0
- package/packages/codex/skills/ui-reviewer/SKILL.md +103 -0
- package/packages/codex/skills/visual-reviewer/SKILL.md +85 -0
- package/packages/codex/skills/writing-agents/SKILL.md +165 -0
- package/packages/codex/skills/writing-commands/SKILL.md +173 -0
- package/packages/core/CLAUDE.md +118 -0
- package/packages/core/INTERNAL-FILES +16 -0
- package/packages/core/agents/ai-slop-cleaner.md +187 -0
- package/packages/core/agents/api-contract-sync.md +127 -0
- package/packages/core/agents/architect.md +205 -0
- package/packages/core/agents/audit-backend.md +137 -0
- package/packages/core/agents/audit-frontend.md +129 -0
- package/packages/core/agents/audit-infra.md +182 -0
- package/packages/core/agents/behavioral-nudge-engine.md +170 -0
- package/packages/core/agents/code-reviewer.md +195 -0
- package/packages/core/agents/codebase-onboarding-engineer.md +172 -0
- package/packages/core/agents/comment-rot-analyzer.md +115 -0
- package/packages/core/agents/critic.md +172 -0
- package/packages/core/agents/database-reviewer.md +201 -0
- package/packages/core/agents/debug-observer.md +261 -0
- package/packages/core/agents/dependency-checker.md +199 -0
- package/packages/core/agents/docs-reviewer.md +206 -0
- package/packages/core/agents/e2e-test-generator.md +261 -0
- package/packages/core/agents/evaluator.md +141 -0
- package/packages/core/agents/goal-verifier.md +130 -0
- package/packages/core/agents/health-checker.md +194 -0
- package/packages/core/agents/migration-reviewer.md +161 -0
- package/packages/core/agents/minimal-change-engineer.md +219 -0
- package/packages/core/agents/plan-checker.md +139 -0
- package/packages/core/agents/pre-deploy-validator.md +189 -0
- package/packages/core/agents/reality-checker.md +175 -0
- package/packages/core/agents/scaffold-endpoint.md +162 -0
- package/packages/core/agents/security-scanner.md +236 -0
- package/packages/core/agents/silent-failure-hunter.md +276 -0
- package/packages/core/agents/test-generator.md +146 -0
- package/packages/core/agents/tree-generator.md +141 -0
- package/packages/core/agents/ui-reviewer.md +172 -0
- package/packages/core/agents/visual-reviewer.md +211 -0
- package/packages/core/commands/audit.md +166 -0
- package/packages/core/commands/benchmark.md +130 -0
- package/packages/core/commands/commit.md +148 -0
- package/packages/core/commands/dev.md +302 -0
- package/packages/core/commands/docs-init.md +75 -0
- package/packages/core/commands/lint.md +137 -0
- package/packages/core/commands/migrate.md +146 -0
- package/packages/core/commands/new-migration.md +182 -0
- package/packages/core/commands/pair.md +209 -0
- package/packages/core/commands/review.md +195 -0
- package/packages/core/commands/security-scan.md +142 -0
- package/packages/core/commands/superkit-evolve.md +231 -0
- package/packages/core/commands/superkit-init.md +274 -0
- package/packages/core/commands/test.md +108 -0
- package/packages/core/commands/workflow.md +150 -0
- package/packages/core/docs/guide/01-getting-started.md +41 -0
- package/packages/core/docs-templates/README.md +33 -0
- package/packages/core/docs-templates/adr-template.md +62 -0
- package/packages/core/docs-templates/architecture/api-contracts.md +26 -0
- package/packages/core/docs-templates/architecture/api-reference.md +48 -0
- package/packages/core/docs-templates/architecture/auth-and-sessions.md +38 -0
- package/packages/core/docs-templates/architecture/backend-layers.md +42 -0
- package/packages/core/docs-templates/architecture/data-flow.md +26 -0
- package/packages/core/docs-templates/architecture/database-schema.md +51 -0
- package/packages/core/docs-templates/architecture/deployment.md +41 -0
- package/packages/core/docs-templates/architecture/frontend-state.md +46 -0
- package/packages/core/helpers/statusline.cjs +370 -0
- package/packages/core/hooks/CHAIN-SEMANTICS.md +84 -0
- package/packages/core/hooks/audit-settings-source.sh +98 -0
- package/packages/core/hooks/audit-trail.sh +120 -0
- package/packages/core/hooks/block-dangerous-git.sh +189 -0
- package/packages/core/hooks/bundle-import-check.sh +64 -0
- package/packages/core/hooks/compact-state-inject.sh +84 -0
- package/packages/core/hooks/config-protection.sh +68 -0
- package/packages/core/hooks/console-log-warning.sh +28 -0
- package/packages/core/hooks/context-monitor.sh +35 -0
- package/packages/core/hooks/dev-edit-counter.sh +59 -0
- package/packages/core/hooks/dev-marker-set.sh +55 -0
- package/packages/core/hooks/dev-required-on-commit.sh +426 -0
- package/packages/core/hooks/doc-check-on-commit.sh +396 -0
- package/packages/core/hooks/edit-streak-check.sh +63 -0
- package/packages/core/hooks/evolve-check.sh +78 -0
- package/packages/core/hooks/gateguard-pre-edit.sh +154 -0
- package/packages/core/hooks/gateguard-record-facts.sh +37 -0
- package/packages/core/hooks/intake-classifier.py +449 -0
- package/packages/core/hooks/lib/profile.sh +141 -0
- package/packages/core/hooks/loop-guard.sh +75 -0
- package/packages/core/hooks/migration-safety.sh +56 -0
- package/packages/core/hooks/plan-completion-gate.sh +61 -0
- package/packages/core/hooks/pre-compact-save.sh +89 -0
- package/packages/core/hooks/security-patterns.sh +119 -0
- package/packages/core/hooks/session-context-restore.sh +76 -0
- package/packages/core/hooks/subagent-stop-validate.sh +73 -0
- package/packages/core/hooks/superkit-counts-verify.sh +346 -0
- package/packages/core/hooks/superkit-update.sh +367 -0
- package/packages/core/hooks/tests/README.md +42 -0
- package/packages/core/hooks/tests/audit-trail-chain_test.sh +62 -0
- package/packages/core/hooks/tests/block-dangerous-git_test.sh +144 -0
- package/packages/core/hooks/tests/chain-semantics/h1.sh +11 -0
- package/packages/core/hooks/tests/chain-semantics/h2.sh +9 -0
- package/packages/core/hooks/tests/chain-semantics/h3.sh +11 -0
- package/packages/core/hooks/tests/chain-semantics/run-experiment.sh +65 -0
- package/packages/core/hooks/tests/chain-semantics/settings-experiment.json +15 -0
- package/packages/core/hooks/tests/counts-verify_test.sh +118 -0
- package/packages/core/hooks/tests/dev-required-on-commit_test.sh +207 -0
- package/packages/core/hooks/tests/dev-required-wip-on-main_test.sh +20 -0
- package/packages/core/hooks/tests/doc-check-on-commit_test.sh +122 -0
- package/packages/core/hooks/tests/edit-streak-check_test.sh +106 -0
- package/packages/core/hooks/tests/internal-manifest_test.sh +130 -0
- package/packages/core/hooks/tests/json-path_test.sh +108 -0
- package/packages/core/hooks/tests/mirror-invariants_test.sh +139 -0
- package/packages/core/hooks/tests/nudge-throttle_test.sh +95 -0
- package/packages/core/hooks/tests/profile-helper_test.sh +21 -0
- package/packages/core/hooks/tests/run-all.sh +47 -0
- package/packages/core/hooks/tests/session-key-helper_test.sh +17 -0
- package/packages/core/hooks/tests/superkit-update_test.sh +311 -0
- package/packages/core/hooks/tests/warn-visibility_test.sh +59 -0
- package/packages/core/hooks/user-intent-detect.sh +44 -0
- package/packages/core/hooks/verify-hooks.sh +69 -0
- package/packages/core/rules/auto-commands.md +124 -0
- package/packages/core/rules/coding-style.md +68 -0
- package/packages/core/rules/dev-workflow.md +77 -0
- package/packages/core/rules/documentation.md +106 -0
- package/packages/core/rules/frontend-aesthetics.md +53 -0
- package/packages/core/rules/git-workflow.md +14 -0
- package/packages/core/rules/security.md +29 -0
- package/packages/core/rules/superkit-integrity.md +114 -0
- package/packages/core/settings.json +229 -0
- package/packages/core/skills/drizzle-orm-expert/SKILL.md +260 -0
- package/packages/core/skills/nextjs-supabase-auth/SKILL.md +259 -0
- package/packages/core/skills/postgresql-optimization/SKILL.md +150 -0
- package/packages/core/skills/project-architecture/SKILL.md +31 -0
- package/packages/core/skills/project-scanner/SKILL.md +132 -0
- package/packages/core/skills/redis-patterns/SKILL.md +261 -0
- package/packages/core/skills/ru-text/SKILL.md +156 -0
- package/packages/core/skills/telegram-bot-builder/SKILL.md +145 -0
- package/packages/core/skills/writing-agents/SKILL.md +220 -0
- package/packages/core/skills/writing-commands/SKILL.md +176 -0
- package/packages/core/skills/writing-hooks/SKILL.md +335 -0
- package/packages/extras/bot-reviewer.md +279 -0
- package/packages/extras/design-system-reviewer.md +234 -0
- package/packages/extras/red-blue-auditor/README.md +117 -0
- package/packages/extras/red-blue-auditor/agent.md +128 -0
- package/packages/extras/red-blue-auditor/patterns/agent-config.txt +4 -0
- package/packages/extras/red-blue-auditor/patterns/hook-injection.txt +8 -0
- package/packages/extras/red-blue-auditor/patterns/mcp-risk.txt +5 -0
- package/packages/extras/red-blue-auditor/patterns/permission-abuse.txt +6 -0
- package/packages/extras/red-blue-auditor/patterns/secrets.txt +17 -0
- package/packages/extras/red-blue-auditor/scan.sh +88 -0
- package/packages/extras/skillsmp-search/SKILL.md +134 -0
- package/packages/frontend-3d/README.md +62 -0
- package/packages/frontend-3d/agents/frontend-perf-reviewer.md +164 -0
- package/packages/frontend-3d/agents/presentation-reviewer.md +146 -0
- package/packages/frontend-3d/agents/r3f-scene-reviewer.md +128 -0
- package/packages/frontend-3d/agents/ui-design-reviewer.md +169 -0
- package/packages/frontend-3d/commands/capture-screen.md +166 -0
- package/packages/frontend-3d/hooks/bundle-size-warn.sh +93 -0
- package/packages/frontend-3d/hooks/gsap-pattern-check.sh +74 -0
- package/packages/frontend-3d/hooks/r3f-color-check.sh +76 -0
- package/packages/frontend-3d/hooks/tailwind-version-guard.sh +98 -0
- package/packages/frontend-3d/rules/frontend-aesthetics-3d.md +81 -0
- package/packages/frontend-3d/rules/gsap-conventions.md +129 -0
- package/packages/frontend-3d/rules/threejs-conventions.md +116 -0
- package/packages/frontend-3d/skills/gltf-debugging/SKILL.md +145 -0
- package/packages/frontend-3d/skills/html-to-3d-texture/SKILL.md +183 -0
- package/packages/frontend-3d/skills/output-enforcement/SKILL.md +79 -0
- package/packages/frontend-3d/skills/product-3d-lighting/SKILL.md +166 -0
- package/packages/frontend-3d/skills/r3f-scroll-driven-3d/SKILL.md +209 -0
- package/packages/frontend-3d/skills/threejs-color-management/SKILL.md +111 -0
- package/packages/frontend-ui/NOTICE.md +99 -0
- package/packages/frontend-ui/README.md +59 -0
- package/packages/frontend-ui/agents/ui-color-reviewer.md +174 -0
- package/packages/frontend-ui/agents/ui-design-critic.md +198 -0
- package/packages/frontend-ui/agents/ui-interaction-reviewer.md +259 -0
- package/packages/frontend-ui/agents/ui-motion-reviewer.md +266 -0
- package/packages/frontend-ui/agents/ui-reviewer.md +251 -0
- package/packages/frontend-ui/agents/ui-typography-reviewer.md +222 -0
- package/packages/frontend-ui/hooks/tests/ui-animation-easing-check_test.sh +78 -0
- package/packages/frontend-ui/hooks/tests/ui-banned-fonts-check_test.sh +77 -0
- package/packages/frontend-ui/hooks/tests/ui-color-check_test.sh +75 -0
- package/packages/frontend-ui/hooks/ui-animation-easing-check.sh +86 -0
- package/packages/frontend-ui/hooks/ui-banned-fonts-check.sh +90 -0
- package/packages/frontend-ui/hooks/ui-color-check.sh +102 -0
- package/packages/frontend-ui/rules/color-and-contrast.md +230 -0
- package/packages/frontend-ui/rules/frontend-design-aesthetics.md +124 -0
- package/packages/frontend-ui/rules/interaction-polish.md +335 -0
- package/packages/frontend-ui/rules/motion-and-animation.md +283 -0
- package/packages/frontend-ui/rules/spatial-and-layout.md +212 -0
- package/packages/frontend-ui/rules/typography-guidelines.md +185 -0
- package/packages/frontend-ui/rules/ui-anti-patterns.md +309 -0
- package/packages/frontend-ui/settings.json +24 -0
- package/packages/frontend-ui/skills/impeccable-craft/SKILL.md +187 -0
- package/packages/gan/README.md +232 -0
- package/packages/gan/agents/gan-evaluator.md +214 -0
- package/packages/gan/agents/gan-generator.md +171 -0
- package/packages/gan/agents/gan-planner.md +206 -0
- package/packages/gan/rubrics/functionality.md +66 -0
- package/packages/gan/rubrics/ui-quality.md +77 -0
- package/packages/gan/skills/gan-evaluator/SKILL.md +91 -0
- package/packages/gan/skills/gan-generator/SKILL.md +72 -0
- package/packages/gan/skills/gan-planner/SKILL.md +93 -0
- package/packages/stack-agents/go/go-concurrency-reviewer.md +210 -0
- package/packages/stack-agents/go/go-error-reviewer.md +187 -0
- package/packages/stack-agents/go/go-modernizer.md +160 -0
- package/packages/stack-agents/go/go-observability-reviewer.md +185 -0
- package/packages/stack-agents/go/go-performance-reviewer.md +160 -0
- package/packages/stack-agents/go/go-reviewer.md +277 -0
- package/packages/stack-agents/go/references/benchmark-methodology.md +280 -0
- package/packages/stack-agents/go/references/channel-patterns.md +384 -0
- package/packages/stack-agents/go/references/cli-cobra-viper.md +190 -0
- package/packages/stack-agents/go/references/code-style.md +262 -0
- package/packages/stack-agents/go/references/context-propagation.md +317 -0
- package/packages/stack-agents/go/references/data-structures.md +315 -0
- package/packages/stack-agents/go/references/database-patterns.md +334 -0
- package/packages/stack-agents/go/references/design-patterns.md +411 -0
- package/packages/stack-agents/go/references/di-frameworks.md +146 -0
- package/packages/stack-agents/go/references/error-creation.md +251 -0
- package/packages/stack-agents/go/references/error-inspection.md +348 -0
- package/packages/stack-agents/go/references/error-wrapping.md +230 -0
- package/packages/stack-agents/go/references/gopls-driving.md +62 -0
- package/packages/stack-agents/go/references/goroutine-lifecycle.md +351 -0
- package/packages/stack-agents/go/references/graphql-patterns.md +221 -0
- package/packages/stack-agents/go/references/grpc-patterns.md +373 -0
- package/packages/stack-agents/go/references/modernize-guide.md +522 -0
- package/packages/stack-agents/go/references/module-management.md +191 -0
- package/packages/stack-agents/go/references/naming-conventions.md +176 -0
- package/packages/stack-agents/go/references/observability-pipeline.md +352 -0
- package/packages/stack-agents/go/references/performance-profiling.md +250 -0
- package/packages/stack-agents/go/references/refactoring-mechanics.md +127 -0
- package/packages/stack-agents/go/references/rest-openapi-patterns.md +160 -0
- package/packages/stack-agents/go/references/samber-do.md +201 -0
- package/packages/stack-agents/go/references/samber-libraries.md +363 -0
- package/packages/stack-agents/go/references/samber-lo.md +260 -0
- package/packages/stack-agents/go/references/samber-oops.md +200 -0
- package/packages/stack-agents/go/references/security-checklist.md +441 -0
- package/packages/stack-agents/go/references/standard-stdlib-now.md +181 -0
- package/packages/stack-agents/go/references/stay-updated.md +147 -0
- package/packages/stack-agents/go/references/structs-interfaces.md +312 -0
- package/packages/stack-agents/go/references/sync-primitives.md +395 -0
- package/packages/stack-agents/go/references/testing-patterns.md +483 -0
- package/packages/stack-agents/go/references/troubleshooting.md +98 -0
- package/packages/stack-agents/python/py-reviewer.md +194 -0
- package/packages/stack-agents/rust/rs-reviewer.md +188 -0
- package/packages/stack-agents/typescript/ts-reviewer.md +135 -0
- package/packages/stack-hooks/go/go-context-check-on-edit.sh +56 -0
- package/packages/stack-hooks/go/go-error-check-on-edit.sh +54 -0
- package/packages/stack-hooks/go/go-format-on-edit.sh +32 -0
- package/packages/stack-hooks/go/go-safety-check-on-edit.sh +54 -0
- package/packages/stack-hooks/go/go-vet-on-edit.sh +61 -0
- package/packages/stack-hooks/go/golangci-lint-on-edit.sh +54 -0
- package/packages/stack-hooks/python/ruff-on-edit.sh +67 -0
- package/packages/stack-hooks/rust/cargo-check-on-edit.sh +64 -0
- package/packages/stack-hooks/typescript/typecheck-on-edit.sh +76 -0
- package/packages/stack-rules/go/go-conventions.md +44 -0
- package/packages/stack-rules/go/go-safety.md +35 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Naming Conventions
|
|
2
|
+
|
|
3
|
+
> Reference document for go-reviewer. Loaded on demand via Read tool.
|
|
4
|
+
|
|
5
|
+
## MixedCaps Rules
|
|
6
|
+
|
|
7
|
+
Go uses MixedCaps (exported) and mixedCaps (unexported). Never use snake_case or SCREAMING_SNAKE_CASE for any identifier.
|
|
8
|
+
|
|
9
|
+
```go
|
|
10
|
+
// CORRECT
|
|
11
|
+
type UserService struct{}
|
|
12
|
+
func (s *UserService) FindByID(id int64) (*User, error)
|
|
13
|
+
var maxRetryCount = 3
|
|
14
|
+
|
|
15
|
+
// WRONG
|
|
16
|
+
type user_service struct{} // snake_case
|
|
17
|
+
func find_by_id() // snake_case
|
|
18
|
+
var MAX_RETRY_COUNT = 3 // screaming snake
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Package Naming
|
|
22
|
+
|
|
23
|
+
| Rule | Good | Bad | Why |
|
|
24
|
+
|------|------|-----|-----|
|
|
25
|
+
| Lowercase, single word | `user`, `auth`, `store` | `userStore`, `user_store` | Go convention |
|
|
26
|
+
| No util/common/base/misc | `strings`, `bytes` | `util`, `common`, `helpers` | Names should describe what, not how |
|
|
27
|
+
| No plural unless collection | `user` (package) | `users` (package) | Package name joins with exported names |
|
|
28
|
+
| Short, concise | `io`, `os`, `fmt` | `inputoutput`, `operatingsystem` | Brevity is a Go value |
|
|
29
|
+
| No stuttering with exports | `http.Client` | `http.HTTPClient` | Package name is already context |
|
|
30
|
+
|
|
31
|
+
```go
|
|
32
|
+
// CORRECT — package name provides context
|
|
33
|
+
package user
|
|
34
|
+
type Service struct{} // used as user.Service
|
|
35
|
+
type Repository struct{} // used as user.Repository
|
|
36
|
+
|
|
37
|
+
// WRONG — stuttering
|
|
38
|
+
package user
|
|
39
|
+
type UserService struct{} // user.UserService stutters
|
|
40
|
+
type UserRepository struct{} // user.UserRepository stutters
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Interface Naming
|
|
44
|
+
|
|
45
|
+
Interfaces follow the **-er** suffix convention and should be **small** (1-3 methods). Define interfaces on the **consumer side**, not the provider side.
|
|
46
|
+
|
|
47
|
+
```go
|
|
48
|
+
// CORRECT — small, -er suffix, consumer-defined
|
|
49
|
+
type Reader interface {
|
|
50
|
+
Read(p []byte) (n int, err error)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type Stringer interface {
|
|
54
|
+
String() string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
type UserFinder interface {
|
|
58
|
+
FindByID(ctx context.Context, id int64) (*User, error)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// WRONG — too large, provider-side, no -er suffix
|
|
62
|
+
type UserOperations interface {
|
|
63
|
+
Create(ctx context.Context, u *User) error
|
|
64
|
+
Update(ctx context.Context, u *User) error
|
|
65
|
+
Delete(ctx context.Context, id int64) error
|
|
66
|
+
FindByID(ctx context.Context, id int64) (*User, error)
|
|
67
|
+
FindAll(ctx context.Context) ([]*User, error)
|
|
68
|
+
Search(ctx context.Context, q string) ([]*User, error)
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Decision table — interface size:**
|
|
73
|
+
|
|
74
|
+
| Methods | Pattern | Example |
|
|
75
|
+
|---------|---------|---------|
|
|
76
|
+
| 1 | `-er` suffix | `Reader`, `Writer`, `Closer` |
|
|
77
|
+
| 2-3 | Compound `-er` or descriptive | `ReadWriter`, `UserFinder` |
|
|
78
|
+
| 4+ | Split into smaller interfaces | Compose via embedding |
|
|
79
|
+
|
|
80
|
+
## Error Variable Naming
|
|
81
|
+
|
|
82
|
+
```go
|
|
83
|
+
// Sentinel errors: Err + condition
|
|
84
|
+
var ErrNotFound = errors.New("not found")
|
|
85
|
+
var ErrAlreadyExists = errors.New("already exists")
|
|
86
|
+
var ErrInvalidInput = errors.New("invalid input")
|
|
87
|
+
|
|
88
|
+
// Error types: suffix with Error
|
|
89
|
+
type ValidationError struct {
|
|
90
|
+
Field string
|
|
91
|
+
Message string
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
type NotFoundError struct {
|
|
95
|
+
Entity string
|
|
96
|
+
ID int64
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Receiver Naming
|
|
101
|
+
|
|
102
|
+
Receivers use **1-2 character** abbreviations derived from the type name. Never use `this` or `self`.
|
|
103
|
+
|
|
104
|
+
```go
|
|
105
|
+
// CORRECT
|
|
106
|
+
func (s *UserService) FindByID(id int64) (*User, error)
|
|
107
|
+
func (r *Repository) Save(u *User) error
|
|
108
|
+
func (c *Client) Do(req *Request) (*Response, error)
|
|
109
|
+
func (b *Builder) WithTimeout(d time.Duration) *Builder
|
|
110
|
+
|
|
111
|
+
// WRONG
|
|
112
|
+
func (self *UserService) FindByID(id int64) (*User, error)
|
|
113
|
+
func (this *Repository) Save(u *User) error
|
|
114
|
+
func (userService *UserService) FindByID(id int64) (*User, error)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Receiver abbreviation rules:**
|
|
118
|
+
- First letter of type: `s` for `Service`, `r` for `Repository`
|
|
119
|
+
- Two letters if ambiguous: `us` for `UserService` if `s` is taken
|
|
120
|
+
- Consistent across all methods of the same type
|
|
121
|
+
|
|
122
|
+
## Acronym Rules
|
|
123
|
+
|
|
124
|
+
Acronyms are **all caps** regardless of position. Never mix case within an acronym.
|
|
125
|
+
|
|
126
|
+
| Acronym | Exported | Unexported | Wrong |
|
|
127
|
+
|---------|----------|------------|-------|
|
|
128
|
+
| ID | `UserID` | `userID` | `UserId`, `userId` |
|
|
129
|
+
| URL | `ServerURL` | `serverURL` | `ServerUrl`, `serverUrl` |
|
|
130
|
+
| HTTP | `HTTPClient` | `httpClient` | `HttpClient`, `httpClient` (when exported) |
|
|
131
|
+
| API | `APIServer` | `apiServer` | `ApiServer` |
|
|
132
|
+
| SQL | `SQLQuery` | `sqlQuery` | `SqlQuery` |
|
|
133
|
+
| JSON | `JSONEncoder` | `jsonEncoder` | `JsonEncoder` |
|
|
134
|
+
| XML | `XMLParser` | `xmlParser` | `XmlParser` |
|
|
135
|
+
| TCP | `TCPConn` | `tcpConn` | `TcpConn` |
|
|
136
|
+
|
|
137
|
+
```go
|
|
138
|
+
// CORRECT
|
|
139
|
+
func ParseURL(rawURL string) (*URL, error)
|
|
140
|
+
func (c *Client) SetHTTPTimeout(d time.Duration)
|
|
141
|
+
type JSONResponse struct {
|
|
142
|
+
UserID int64 `json:"user_id"`
|
|
143
|
+
APIURL string `json:"api_url"`
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// WRONG
|
|
147
|
+
func ParseUrl(rawUrl string) (*Url, error)
|
|
148
|
+
func (c *Client) SetHttpTimeout(d time.Duration)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Stuttering Avoidance
|
|
152
|
+
|
|
153
|
+
The package name is part of every qualified reference. Never repeat it in exported names.
|
|
154
|
+
|
|
155
|
+
```go
|
|
156
|
+
// Package http
|
|
157
|
+
http.Client // not http.HTTPClient
|
|
158
|
+
http.Server // not http.HTTPServer
|
|
159
|
+
http.Request // not http.HTTPRequest
|
|
160
|
+
|
|
161
|
+
// Package user
|
|
162
|
+
user.Service // not user.UserService
|
|
163
|
+
user.Repository // not user.UserRepository
|
|
164
|
+
user.NotFoundError // not user.UserNotFoundError
|
|
165
|
+
|
|
166
|
+
// Package config
|
|
167
|
+
config.Load() // not config.LoadConfig()
|
|
168
|
+
config.Default() // not config.DefaultConfig()
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## When to Use
|
|
172
|
+
|
|
173
|
+
Apply these rules when reviewing any Go code for naming issues. Flag violations as:
|
|
174
|
+
- **CRITICAL**: Stuttering in public API, snake_case in exported names
|
|
175
|
+
- **WARNING**: Wrong acronym casing, receiver named `self`/`this`, large interfaces
|
|
176
|
+
- **SUGGESTION**: Verbose package names, receiver names longer than 2 chars
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
# Observability Pipeline
|
|
2
|
+
|
|
3
|
+
> Reference document for go-observability-reviewer. Loaded on demand via Read tool.
|
|
4
|
+
|
|
5
|
+
## slog Handler Chain
|
|
6
|
+
|
|
7
|
+
Handlers process log records in a chain. Order matters for performance: cheap filters first, expensive operations last.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Record → Sampling → Formatting → Routing → Sinks
|
|
11
|
+
↓ ↓ ↓ ↓
|
|
12
|
+
Drop 90% of Add JSON Split by File, stdout,
|
|
13
|
+
DEBUG records format level network
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Handler Setup
|
|
17
|
+
|
|
18
|
+
```go
|
|
19
|
+
import (
|
|
20
|
+
"log/slog"
|
|
21
|
+
"os"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
// Production: JSON to stdout (container logs → log aggregator)
|
|
25
|
+
func NewProductionLogger() *slog.Logger {
|
|
26
|
+
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
|
|
27
|
+
Level: slog.LevelInfo,
|
|
28
|
+
AddSource: true, // adds source file:line
|
|
29
|
+
})
|
|
30
|
+
return slog.New(handler)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Development: human-readable text
|
|
34
|
+
func NewDevLogger() *slog.Logger {
|
|
35
|
+
handler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
|
|
36
|
+
Level: slog.LevelDebug,
|
|
37
|
+
})
|
|
38
|
+
return slog.New(handler)
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Custom Sampling Handler
|
|
43
|
+
|
|
44
|
+
```go
|
|
45
|
+
type SamplingHandler struct {
|
|
46
|
+
inner slog.Handler
|
|
47
|
+
rate float64 // 0.0 to 1.0
|
|
48
|
+
minLevel slog.Level
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func (h *SamplingHandler) Enabled(ctx context.Context, level slog.Level) bool {
|
|
52
|
+
if level >= h.minLevel {
|
|
53
|
+
return true // always log WARN+
|
|
54
|
+
}
|
|
55
|
+
return rand.Float64() < h.rate // sample DEBUG/INFO
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
func (h *SamplingHandler) Handle(ctx context.Context, r slog.Record) error {
|
|
59
|
+
return h.inner.Handle(ctx, r)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
func (h *SamplingHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
|
|
63
|
+
return &SamplingHandler{inner: h.inner.WithAttrs(attrs), rate: h.rate, minLevel: h.minLevel}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
func (h *SamplingHandler) WithGroup(name string) slog.Handler {
|
|
67
|
+
return &SamplingHandler{inner: h.inner.WithGroup(name), rate: h.rate, minLevel: h.minLevel}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Structured Logging Best Practices
|
|
72
|
+
|
|
73
|
+
```go
|
|
74
|
+
// CORRECT — structured key-value pairs
|
|
75
|
+
logger.Info("user created",
|
|
76
|
+
"user_id", user.ID,
|
|
77
|
+
"email", user.Email,
|
|
78
|
+
"duration_ms", time.Since(start).Milliseconds(),
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
// CORRECT — with group
|
|
82
|
+
logger.WithGroup("request").Info("handled",
|
|
83
|
+
"method", r.Method,
|
|
84
|
+
"path", r.URL.Path,
|
|
85
|
+
"status", status,
|
|
86
|
+
"latency_ms", latency.Milliseconds(),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
// WRONG — unstructured string formatting
|
|
90
|
+
logger.Info(fmt.Sprintf("user %d created in %v", user.ID, elapsed))
|
|
91
|
+
|
|
92
|
+
// WRONG — sensitive data in logs
|
|
93
|
+
logger.Info("auth", "password", req.Password, "token", token)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Prometheus Patterns
|
|
97
|
+
|
|
98
|
+
### Metric Types
|
|
99
|
+
|
|
100
|
+
| Type | Use When | Example |
|
|
101
|
+
|------|----------|---------|
|
|
102
|
+
| Counter | Monotonically increasing | Total requests, errors, bytes sent |
|
|
103
|
+
| Gauge | Can go up and down | Active connections, queue depth |
|
|
104
|
+
| Histogram | Distribution of values | Request duration, response size |
|
|
105
|
+
| Summary | Client-side quantiles | Rarely used — prefer Histogram |
|
|
106
|
+
|
|
107
|
+
### Registration and Usage
|
|
108
|
+
|
|
109
|
+
```go
|
|
110
|
+
import "github.com/prometheus/client_golang/prometheus"
|
|
111
|
+
|
|
112
|
+
var (
|
|
113
|
+
requestsTotal = prometheus.NewCounterVec(
|
|
114
|
+
prometheus.CounterOpts{
|
|
115
|
+
Namespace: "myapp",
|
|
116
|
+
Subsystem: "http",
|
|
117
|
+
Name: "requests_total",
|
|
118
|
+
Help: "Total HTTP requests by method, path, and status.",
|
|
119
|
+
},
|
|
120
|
+
[]string{"method", "path", "status"},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
requestDuration = prometheus.NewHistogramVec(
|
|
124
|
+
prometheus.HistogramOpts{
|
|
125
|
+
Namespace: "myapp",
|
|
126
|
+
Subsystem: "http",
|
|
127
|
+
Name: "request_duration_seconds",
|
|
128
|
+
Help: "HTTP request duration in seconds.",
|
|
129
|
+
Buckets: []float64{.001, .005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10},
|
|
130
|
+
},
|
|
131
|
+
[]string{"method", "path"},
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
activeConnections = prometheus.NewGauge(
|
|
135
|
+
prometheus.GaugeOpts{
|
|
136
|
+
Namespace: "myapp",
|
|
137
|
+
Subsystem: "server",
|
|
138
|
+
Name: "active_connections",
|
|
139
|
+
Help: "Number of active connections.",
|
|
140
|
+
},
|
|
141
|
+
)
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
func init() {
|
|
145
|
+
prometheus.MustRegister(requestsTotal, requestDuration, activeConnections)
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Middleware Integration
|
|
150
|
+
|
|
151
|
+
```go
|
|
152
|
+
func MetricsMiddleware(next http.Handler) http.Handler {
|
|
153
|
+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
154
|
+
start := time.Now()
|
|
155
|
+
wrapped := &statusRecorder{ResponseWriter: w, status: 200}
|
|
156
|
+
|
|
157
|
+
next.ServeHTTP(wrapped, r)
|
|
158
|
+
|
|
159
|
+
duration := time.Since(start).Seconds()
|
|
160
|
+
path := normalizePath(r.URL.Path) // prevent cardinality explosion
|
|
161
|
+
|
|
162
|
+
requestsTotal.WithLabelValues(r.Method, path, strconv.Itoa(wrapped.status)).Inc()
|
|
163
|
+
requestDuration.WithLabelValues(r.Method, path).Observe(duration)
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Label Cardinality Rules
|
|
169
|
+
|
|
170
|
+
| Rule | Good | Bad |
|
|
171
|
+
|------|------|-----|
|
|
172
|
+
| Bounded label values | `method: GET/POST/PUT/DELETE` | `user_id: 1, 2, ..., 1M` |
|
|
173
|
+
| Normalize paths | `/api/users/{id}` | `/api/users/12345` |
|
|
174
|
+
| Max ~10 values per label | `status: 2xx, 3xx, 4xx, 5xx` | `status: 200, 201, 204, 301, ...` |
|
|
175
|
+
| No UUIDs or IDs in labels | Use log correlation instead | `request_id` as label |
|
|
176
|
+
|
|
177
|
+
### Histogram Bucket Selection
|
|
178
|
+
|
|
179
|
+
| Use Case | Buckets |
|
|
180
|
+
|----------|---------|
|
|
181
|
+
| Fast API (p99 < 100ms) | `.001, .005, .01, .025, .05, .1, .25, .5, 1` |
|
|
182
|
+
| Standard API (p99 < 1s) | `.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10` |
|
|
183
|
+
| Batch/background jobs | `.1, .5, 1, 5, 10, 30, 60, 120, 300` |
|
|
184
|
+
| File upload/download | `.1, .5, 1, 5, 10, 30, 60, 120, 300, 600` |
|
|
185
|
+
|
|
186
|
+
## OpenTelemetry Setup
|
|
187
|
+
|
|
188
|
+
### Tracer Provider
|
|
189
|
+
|
|
190
|
+
```go
|
|
191
|
+
import (
|
|
192
|
+
"go.opentelemetry.io/otel"
|
|
193
|
+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
|
194
|
+
"go.opentelemetry.io/otel/sdk/resource"
|
|
195
|
+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
|
196
|
+
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
func initTracer(ctx context.Context) (func(context.Context) error, error) {
|
|
200
|
+
exporter, err := otlptracegrpc.New(ctx,
|
|
201
|
+
otlptracegrpc.WithEndpoint("otel-collector:4317"),
|
|
202
|
+
otlptracegrpc.WithInsecure(),
|
|
203
|
+
)
|
|
204
|
+
if err != nil {
|
|
205
|
+
return nil, fmt.Errorf("create exporter: %w", err)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
tp := sdktrace.NewTracerProvider(
|
|
209
|
+
sdktrace.WithBatcher(exporter),
|
|
210
|
+
sdktrace.WithResource(resource.NewWithAttributes(
|
|
211
|
+
semconv.SchemaURL,
|
|
212
|
+
semconv.ServiceNameKey.String("myapp"),
|
|
213
|
+
semconv.ServiceVersionKey.String("1.0.0"),
|
|
214
|
+
semconv.DeploymentEnvironmentKey.String("production"),
|
|
215
|
+
)),
|
|
216
|
+
sdktrace.WithSampler(sdktrace.ParentBased(
|
|
217
|
+
sdktrace.TraceIDRatioBased(0.1), // sample 10%
|
|
218
|
+
)),
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
otel.SetTracerProvider(tp)
|
|
222
|
+
return tp.Shutdown, nil
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Context Propagation in HTTP
|
|
227
|
+
|
|
228
|
+
```go
|
|
229
|
+
import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
|
230
|
+
|
|
231
|
+
// Client — inject trace context into outgoing requests
|
|
232
|
+
client := &http.Client{
|
|
233
|
+
Transport: otelhttp.NewTransport(http.DefaultTransport),
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Server — extract trace context from incoming requests
|
|
237
|
+
handler := otelhttp.NewHandler(mux, "server")
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Manual Span Creation
|
|
241
|
+
|
|
242
|
+
```go
|
|
243
|
+
func (s *Service) ProcessOrder(ctx context.Context, orderID int64) error {
|
|
244
|
+
ctx, span := otel.Tracer("myapp").Start(ctx, "ProcessOrder")
|
|
245
|
+
defer span.End()
|
|
246
|
+
|
|
247
|
+
span.SetAttributes(
|
|
248
|
+
attribute.Int64("order.id", orderID),
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
if err := s.validate(ctx, orderID); err != nil {
|
|
252
|
+
span.RecordError(err)
|
|
253
|
+
span.SetStatus(codes.Error, err.Error())
|
|
254
|
+
return err
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return s.execute(ctx, orderID)
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## pprof Endpoints
|
|
262
|
+
|
|
263
|
+
```go
|
|
264
|
+
import "net/http/pprof"
|
|
265
|
+
|
|
266
|
+
// Separate debug server (recommended for production)
|
|
267
|
+
go func() {
|
|
268
|
+
debugMux := http.NewServeMux()
|
|
269
|
+
debugMux.HandleFunc("/debug/pprof/", pprof.Index)
|
|
270
|
+
debugMux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
|
|
271
|
+
debugMux.HandleFunc("/debug/pprof/profile", pprof.Profile)
|
|
272
|
+
debugMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
|
|
273
|
+
debugMux.HandleFunc("/debug/pprof/trace", pprof.Trace)
|
|
274
|
+
http.ListenAndServe("localhost:6060", debugMux) // localhost only!
|
|
275
|
+
}()
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**Enable block/mutex profiling (off by default):**
|
|
279
|
+
|
|
280
|
+
```go
|
|
281
|
+
runtime.SetBlockProfileRate(1) // 1 = every block event
|
|
282
|
+
runtime.SetMutexProfileFraction(5) // 1/5 of mutex events
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## Health Checks
|
|
286
|
+
|
|
287
|
+
### Liveness vs Readiness
|
|
288
|
+
|
|
289
|
+
| Endpoint | Purpose | Checks | K8s Probe |
|
|
290
|
+
|----------|---------|--------|-----------|
|
|
291
|
+
| `/health` | Is the process alive? | Process up, not deadlocked | `livenessProbe` |
|
|
292
|
+
| `/ready` | Can it serve traffic? | DB connected, cache warm, deps OK | `readinessProbe` |
|
|
293
|
+
|
|
294
|
+
```go
|
|
295
|
+
func (s *Server) healthHandler(w http.ResponseWriter, r *http.Request) {
|
|
296
|
+
w.Header().Set("Content-Type", "application/json")
|
|
297
|
+
w.WriteHeader(http.StatusOK)
|
|
298
|
+
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
func (s *Server) readyHandler(w http.ResponseWriter, r *http.Request) {
|
|
302
|
+
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
|
|
303
|
+
defer cancel()
|
|
304
|
+
|
|
305
|
+
checks := map[string]error{
|
|
306
|
+
"database": s.db.Ping(ctx),
|
|
307
|
+
"cache": s.cache.Ping(ctx),
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
status := http.StatusOK
|
|
311
|
+
result := make(map[string]string)
|
|
312
|
+
for name, err := range checks {
|
|
313
|
+
if err != nil {
|
|
314
|
+
status = http.StatusServiceUnavailable
|
|
315
|
+
result[name] = err.Error()
|
|
316
|
+
} else {
|
|
317
|
+
result[name] = "ok"
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
w.Header().Set("Content-Type", "application/json")
|
|
322
|
+
w.WriteHeader(status)
|
|
323
|
+
json.NewEncoder(w).Encode(result)
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Kubernetes Probe Config
|
|
328
|
+
|
|
329
|
+
```yaml
|
|
330
|
+
livenessProbe:
|
|
331
|
+
httpGet:
|
|
332
|
+
path: /health
|
|
333
|
+
port: 8080
|
|
334
|
+
initialDelaySeconds: 5
|
|
335
|
+
periodSeconds: 10
|
|
336
|
+
failureThreshold: 3
|
|
337
|
+
|
|
338
|
+
readinessProbe:
|
|
339
|
+
httpGet:
|
|
340
|
+
path: /ready
|
|
341
|
+
port: 8080
|
|
342
|
+
initialDelaySeconds: 10
|
|
343
|
+
periodSeconds: 5
|
|
344
|
+
failureThreshold: 3
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## When to Use
|
|
348
|
+
|
|
349
|
+
Apply when reviewing observability setup and instrumentation. Flag violations as:
|
|
350
|
+
- **CRITICAL**: No structured logging (fmt.Printf in production), unbounded label cardinality, sensitive data in logs/metrics
|
|
351
|
+
- **WARNING**: Missing health/readiness endpoints, no request duration metrics, pprof exposed publicly
|
|
352
|
+
- **SUGGESTION**: Could add sampling handler, trace context propagation, histogram bucket tuning
|