@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,601 @@
|
|
|
1
|
+
# Pre-Push Hook
|
|
2
|
+
|
|
3
|
+
This template provides guidance for implementing pre-push git hooks that enforce comprehensive quality gates before code is pushed to remote repositories.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Pre-push hooks run automatically before pushing commits to ensure:
|
|
8
|
+
- All tests pass (unit, integration, E2E)
|
|
9
|
+
- Build succeeds without errors
|
|
10
|
+
- Code coverage meets thresholds
|
|
11
|
+
- No broken dependencies
|
|
12
|
+
- Quality gates are met before sharing code
|
|
13
|
+
|
|
14
|
+
## Agent Automation Commands
|
|
15
|
+
|
|
16
|
+
When implementing or modifying pre-push hooks, use these patterns:
|
|
17
|
+
|
|
18
|
+
### TypeScript/JavaScript Projects
|
|
19
|
+
```bash
|
|
20
|
+
# Full quality check
|
|
21
|
+
npm run build && npm test && npm run test:coverage
|
|
22
|
+
|
|
23
|
+
# Skip hook (emergency only)
|
|
24
|
+
git push --no-verify
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Python Projects
|
|
28
|
+
```bash
|
|
29
|
+
# Full quality check
|
|
30
|
+
pytest --cov --cov-fail-under=95
|
|
31
|
+
|
|
32
|
+
# Skip hook (emergency only)
|
|
33
|
+
git push --no-verify
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Rust Projects
|
|
37
|
+
```bash
|
|
38
|
+
# Full quality check
|
|
39
|
+
cargo build --release && cargo test --all
|
|
40
|
+
|
|
41
|
+
# Skip hook (emergency only)
|
|
42
|
+
git push --no-verify
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Go Projects
|
|
46
|
+
```bash
|
|
47
|
+
# Full quality check
|
|
48
|
+
go build ./... && go test ./... -cover
|
|
49
|
+
|
|
50
|
+
# Skip hook (emergency only)
|
|
51
|
+
git push --no-verify
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Hook Implementation Patterns
|
|
55
|
+
|
|
56
|
+
### Cross-Platform Node.js Hook (Recommended)
|
|
57
|
+
|
|
58
|
+
**Shell Wrapper** (`.git/hooks/pre-push`):
|
|
59
|
+
```bash
|
|
60
|
+
#!/bin/sh
|
|
61
|
+
|
|
62
|
+
# Find Node.js executable (cross-platform)
|
|
63
|
+
NODE_PATH=""
|
|
64
|
+
if command -v node >/dev/null 2>&1; then
|
|
65
|
+
NODE_PATH="node"
|
|
66
|
+
elif [ -f "/c/Program Files/nodejs/node.exe" ]; then
|
|
67
|
+
NODE_PATH="/c/Program Files/nodejs/node.exe"
|
|
68
|
+
elif [ -f "/usr/bin/node" ]; then
|
|
69
|
+
NODE_PATH="/usr/bin/node"
|
|
70
|
+
else
|
|
71
|
+
echo "Error: Node.js not found"
|
|
72
|
+
exit 1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# Execute Node.js script
|
|
76
|
+
"$NODE_PATH" "$(dirname "$0")/pre-push.js"
|
|
77
|
+
exit $?
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Node.js Script** (`.git/hooks/pre-push.js`):
|
|
81
|
+
```javascript
|
|
82
|
+
#!/usr/bin/env node
|
|
83
|
+
|
|
84
|
+
const { spawn } = require('child_process');
|
|
85
|
+
|
|
86
|
+
function runCommand(command, args) {
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const proc = spawn(command, args, {
|
|
89
|
+
stdio: 'inherit',
|
|
90
|
+
shell: true,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
proc.on('close', (code) => {
|
|
94
|
+
if (code !== 0) reject(new Error(`Command failed: ${command} ${args.join(' ')}`));
|
|
95
|
+
else resolve();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function main() {
|
|
101
|
+
console.log('🚀 Running pre-push checks...\n');
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
// Build check (FIRST - fastest to fail)
|
|
105
|
+
console.log('🔨 Building project...');
|
|
106
|
+
await runCommand('npm', ['run', 'build']);
|
|
107
|
+
|
|
108
|
+
// Tests
|
|
109
|
+
console.log('\n🧪 Running tests...');
|
|
110
|
+
await runCommand('npm', ['test']);
|
|
111
|
+
|
|
112
|
+
// Coverage check
|
|
113
|
+
console.log('\n📊 Checking coverage...');
|
|
114
|
+
await runCommand('npm', ['run', 'test:coverage']);
|
|
115
|
+
|
|
116
|
+
console.log('\n✅ Pre-push checks passed! Safe to push.\n');
|
|
117
|
+
process.exit(0);
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.error('\n❌ Pre-push checks failed!');
|
|
120
|
+
console.error('💡 Fix the issues or use --no-verify to skip (not recommended)\n');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
main();
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Shell-Only Hook (Simple)
|
|
129
|
+
|
|
130
|
+
**`.git/hooks/pre-push`**:
|
|
131
|
+
```bash
|
|
132
|
+
#!/bin/sh
|
|
133
|
+
|
|
134
|
+
echo "🚀 Running pre-push checks..."
|
|
135
|
+
|
|
136
|
+
# Build check (FIRST)
|
|
137
|
+
echo "🔨 Building project..."
|
|
138
|
+
npm run build || exit 1
|
|
139
|
+
|
|
140
|
+
# Tests
|
|
141
|
+
echo "🧪 Running tests..."
|
|
142
|
+
npm test || exit 1
|
|
143
|
+
|
|
144
|
+
# Coverage
|
|
145
|
+
echo "📊 Checking coverage..."
|
|
146
|
+
npm run test:coverage || exit 1
|
|
147
|
+
|
|
148
|
+
echo "✅ Pre-push checks passed! Safe to push."
|
|
149
|
+
exit 0
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Best Practices
|
|
153
|
+
|
|
154
|
+
### ✅ DO Include in Pre-Push
|
|
155
|
+
|
|
156
|
+
1. **Build Verification** (FIRST - fast failure)
|
|
157
|
+
```javascript
|
|
158
|
+
// TypeScript/JavaScript
|
|
159
|
+
await runCommand('npm', ['run', 'build']);
|
|
160
|
+
|
|
161
|
+
// Rust
|
|
162
|
+
await runCommand('cargo', ['build', '--release']);
|
|
163
|
+
|
|
164
|
+
// Go
|
|
165
|
+
await runCommand('go', ['build', './...']);
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
2. **Complete Test Suite**
|
|
169
|
+
- Unit tests
|
|
170
|
+
- Integration tests
|
|
171
|
+
- E2E tests (if fast enough)
|
|
172
|
+
- Snapshot tests
|
|
173
|
+
```javascript
|
|
174
|
+
await runCommand('npm', ['test', '--', '--run']);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
3. **Coverage Enforcement**
|
|
178
|
+
```javascript
|
|
179
|
+
// Fail if coverage < 95%
|
|
180
|
+
await runCommand('npm', ['run', 'test:coverage']);
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
4. **Dependency Checks** (Optional)
|
|
184
|
+
```javascript
|
|
185
|
+
// Check for vulnerabilities
|
|
186
|
+
await runCommand('npm', ['audit']);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
5. **Progressive Checks** (Fail Fast)
|
|
190
|
+
```javascript
|
|
191
|
+
// Order matters - fastest/most likely to fail first
|
|
192
|
+
await runCommand('npm', ['run', 'build']); // Fast, catches syntax
|
|
193
|
+
await runCommand('npm', ['test']); // Medium, catches logic
|
|
194
|
+
await runCommand('npm', ['run', 'test:e2e']); // Slow, catches integration
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### ❌ DON'T Include in Pre-Push
|
|
198
|
+
|
|
199
|
+
1. **Deployment Operations**
|
|
200
|
+
- Actual deployment to production/staging
|
|
201
|
+
- Database migrations
|
|
202
|
+
- External service updates
|
|
203
|
+
|
|
204
|
+
2. **Extremely Slow Operations** (> 10 minutes)
|
|
205
|
+
- Move to CI/CD pipeline instead
|
|
206
|
+
- Visual regression testing with thousands of snapshots
|
|
207
|
+
- Performance benchmarks across multiple environments
|
|
208
|
+
|
|
209
|
+
3. **Interactive Operations**
|
|
210
|
+
- User prompts
|
|
211
|
+
- Manual approvals
|
|
212
|
+
- OAuth flows
|
|
213
|
+
|
|
214
|
+
## Language-Specific Patterns
|
|
215
|
+
|
|
216
|
+
### TypeScript/JavaScript (npm/pnpm/yarn)
|
|
217
|
+
|
|
218
|
+
**Minimal** (Fast projects < 1 minute):
|
|
219
|
+
```bash
|
|
220
|
+
#!/bin/sh
|
|
221
|
+
npm run build && npm test
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Standard** (Most projects):
|
|
225
|
+
```bash
|
|
226
|
+
#!/bin/sh
|
|
227
|
+
npm run build && npm test && npm run test:coverage
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**Comprehensive** (Critical projects):
|
|
231
|
+
```bash
|
|
232
|
+
#!/bin/sh
|
|
233
|
+
# Build
|
|
234
|
+
npm run build || exit 1
|
|
235
|
+
|
|
236
|
+
# Tests
|
|
237
|
+
npm test || exit 1
|
|
238
|
+
|
|
239
|
+
# Coverage
|
|
240
|
+
npm run test:coverage || exit 1
|
|
241
|
+
|
|
242
|
+
# Audit
|
|
243
|
+
npm audit --audit-level=high || exit 1
|
|
244
|
+
|
|
245
|
+
# Type check (if not in build)
|
|
246
|
+
npm run type-check || exit 1
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**package.json scripts**:
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"scripts": {
|
|
253
|
+
"build": "tsc",
|
|
254
|
+
"test": "vitest run",
|
|
255
|
+
"test:coverage": "vitest run --coverage",
|
|
256
|
+
"test:e2e": "playwright test"
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Python (poetry/pip)
|
|
262
|
+
|
|
263
|
+
**Standard**:
|
|
264
|
+
```bash
|
|
265
|
+
#!/bin/sh
|
|
266
|
+
echo "🚀 Running pre-push checks..."
|
|
267
|
+
|
|
268
|
+
# Tests with coverage
|
|
269
|
+
pytest --cov --cov-fail-under=95 || exit 1
|
|
270
|
+
|
|
271
|
+
echo "✅ Pre-push checks passed!"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Comprehensive**:
|
|
275
|
+
```bash
|
|
276
|
+
#!/bin/sh
|
|
277
|
+
# Type check
|
|
278
|
+
mypy . || exit 1
|
|
279
|
+
|
|
280
|
+
# Tests with coverage
|
|
281
|
+
pytest --cov --cov-fail-under=95 || exit 1
|
|
282
|
+
|
|
283
|
+
# Check for security issues
|
|
284
|
+
safety check || exit 1
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Rust (cargo)
|
|
288
|
+
|
|
289
|
+
**Standard**:
|
|
290
|
+
```bash
|
|
291
|
+
#!/bin/sh
|
|
292
|
+
echo "🚀 Running pre-push checks..."
|
|
293
|
+
|
|
294
|
+
# Build (release mode)
|
|
295
|
+
cargo build --release || exit 1
|
|
296
|
+
|
|
297
|
+
# Tests
|
|
298
|
+
cargo test --all || exit 1
|
|
299
|
+
|
|
300
|
+
echo "✅ Pre-push checks passed!"
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Comprehensive**:
|
|
304
|
+
```bash
|
|
305
|
+
#!/bin/sh
|
|
306
|
+
# Build
|
|
307
|
+
cargo build --release || exit 1
|
|
308
|
+
|
|
309
|
+
# Tests
|
|
310
|
+
cargo test --all || exit 1
|
|
311
|
+
|
|
312
|
+
# Coverage
|
|
313
|
+
cargo llvm-cov --all --lcov --output-path lcov.info || exit 1
|
|
314
|
+
|
|
315
|
+
# Security audit
|
|
316
|
+
cargo audit || exit 1
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Go
|
|
320
|
+
|
|
321
|
+
**Standard**:
|
|
322
|
+
```bash
|
|
323
|
+
#!/bin/sh
|
|
324
|
+
echo "🚀 Running pre-push checks..."
|
|
325
|
+
|
|
326
|
+
# Build
|
|
327
|
+
go build ./... || exit 1
|
|
328
|
+
|
|
329
|
+
# Tests with coverage
|
|
330
|
+
go test ./... -cover -coverprofile=coverage.out || exit 1
|
|
331
|
+
|
|
332
|
+
# Check coverage threshold
|
|
333
|
+
go tool cover -func=coverage.out | grep total | awk '{print $3}' | \
|
|
334
|
+
sed 's/%//' | awk '{if ($1 < 95) exit 1}'
|
|
335
|
+
|
|
336
|
+
echo "✅ Pre-push checks passed!"
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Performance Optimization
|
|
340
|
+
|
|
341
|
+
### Parallel Execution
|
|
342
|
+
|
|
343
|
+
**Node.js** (using Promise.all):
|
|
344
|
+
```javascript
|
|
345
|
+
async function main() {
|
|
346
|
+
try {
|
|
347
|
+
// Build must complete first
|
|
348
|
+
await runCommand('npm', ['run', 'build']);
|
|
349
|
+
|
|
350
|
+
// Run tests and audit in parallel
|
|
351
|
+
await Promise.all([
|
|
352
|
+
runCommand('npm', ['test']),
|
|
353
|
+
runCommand('npm', ['audit', '--audit-level=high']),
|
|
354
|
+
]);
|
|
355
|
+
|
|
356
|
+
console.log('✅ All checks passed!');
|
|
357
|
+
} catch (error) {
|
|
358
|
+
console.error('❌ Checks failed!');
|
|
359
|
+
process.exit(1);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Caching Results
|
|
365
|
+
|
|
366
|
+
```javascript
|
|
367
|
+
const fs = require('fs');
|
|
368
|
+
const crypto = require('crypto');
|
|
369
|
+
|
|
370
|
+
function getFilesHash(files) {
|
|
371
|
+
const content = files.map(f => fs.readFileSync(f, 'utf8')).join('');
|
|
372
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
async function main() {
|
|
376
|
+
const srcFiles = fs.readdirSync('src').map(f => `src/${f}`);
|
|
377
|
+
const currentHash = getFilesHash(srcFiles);
|
|
378
|
+
const cacheFile = '.git/hooks/cache/build-hash';
|
|
379
|
+
|
|
380
|
+
if (fs.existsSync(cacheFile)) {
|
|
381
|
+
const cachedHash = fs.readFileSync(cacheFile, 'utf8');
|
|
382
|
+
if (cachedHash === currentHash) {
|
|
383
|
+
console.log('⚡ No changes detected, skipping build...');
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
await runCommand('npm', ['run', 'build']);
|
|
389
|
+
fs.writeFileSync(cacheFile, currentHash);
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### Skip Checks for Specific Branches
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
#!/bin/sh
|
|
397
|
+
|
|
398
|
+
# Get current branch
|
|
399
|
+
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
400
|
+
|
|
401
|
+
# Skip checks for WIP branches
|
|
402
|
+
if echo "$BRANCH" | grep -q "^wip/"; then
|
|
403
|
+
echo "⚠️ WIP branch detected, skipping pre-push checks"
|
|
404
|
+
exit 0
|
|
405
|
+
fi
|
|
406
|
+
|
|
407
|
+
# Run full checks for main/master
|
|
408
|
+
if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
|
|
409
|
+
echo "🚀 Main branch detected, running comprehensive checks..."
|
|
410
|
+
npm run build && npm test && npm run test:coverage && npm audit
|
|
411
|
+
exit $?
|
|
412
|
+
fi
|
|
413
|
+
|
|
414
|
+
# Standard checks for feature branches
|
|
415
|
+
npm run build && npm test
|
|
416
|
+
exit $?
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## Troubleshooting
|
|
420
|
+
|
|
421
|
+
### Hook Too Slow (> 5 minutes)
|
|
422
|
+
|
|
423
|
+
**Solutions**:
|
|
424
|
+
1. **Move slowest tests to CI/CD**
|
|
425
|
+
- Keep pre-push under 5 minutes
|
|
426
|
+
- Run E2E/visual tests only in CI
|
|
427
|
+
|
|
428
|
+
2. **Use test sharding**
|
|
429
|
+
```bash
|
|
430
|
+
# Split tests across multiple processes
|
|
431
|
+
npm test -- --shard=1/4 &
|
|
432
|
+
npm test -- --shard=2/4 &
|
|
433
|
+
npm test -- --shard=3/4 &
|
|
434
|
+
npm test -- --shard=4/4 &
|
|
435
|
+
wait
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
3. **Cache build artifacts**
|
|
439
|
+
```bash
|
|
440
|
+
# Only rebuild if sources changed
|
|
441
|
+
if [ .git/hooks/cache/build -ot src/ ]; then
|
|
442
|
+
npm run build
|
|
443
|
+
fi
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### Tests Pass Locally But Fail on Push
|
|
447
|
+
|
|
448
|
+
**Causes**:
|
|
449
|
+
1. Uncommitted files affecting tests
|
|
450
|
+
2. Environment variables missing
|
|
451
|
+
3. Database state issues
|
|
452
|
+
|
|
453
|
+
**Solutions**:
|
|
454
|
+
```bash
|
|
455
|
+
# Run tests in clean environment
|
|
456
|
+
git stash --include-untracked
|
|
457
|
+
npm test
|
|
458
|
+
git stash pop
|
|
459
|
+
|
|
460
|
+
# Or use git worktree
|
|
461
|
+
git worktree add .git/hooks/test-workspace HEAD
|
|
462
|
+
cd .git/hooks/test-workspace
|
|
463
|
+
npm test
|
|
464
|
+
cd ../../..
|
|
465
|
+
rm -rf .git/hooks/test-workspace
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Coverage Threshold Not Met
|
|
469
|
+
|
|
470
|
+
**Issue**: Coverage drops below threshold
|
|
471
|
+
|
|
472
|
+
**Solutions**:
|
|
473
|
+
1. **Identify uncovered code**
|
|
474
|
+
```bash
|
|
475
|
+
npm run test:coverage -- --reporter=html
|
|
476
|
+
open coverage/index.html
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
2. **Exclude test files from coverage**
|
|
480
|
+
```javascript
|
|
481
|
+
// vitest.config.ts
|
|
482
|
+
coverage: {
|
|
483
|
+
exclude: ['**/*.test.ts', '**/*.spec.ts', 'tests/**']
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
3. **Add missing tests before push**
|
|
488
|
+
```bash
|
|
489
|
+
# Find files with low coverage
|
|
490
|
+
npm run test:coverage | grep -E "^[^|]*\|[^|]*\|[^|]*[0-9]{1,2}\."
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Build Fails Only in Hook
|
|
494
|
+
|
|
495
|
+
**Causes**:
|
|
496
|
+
1. Different Node.js version
|
|
497
|
+
2. Missing environment variables
|
|
498
|
+
3. Stale node_modules
|
|
499
|
+
|
|
500
|
+
**Solutions**:
|
|
501
|
+
```bash
|
|
502
|
+
# Use same Node.js version as development
|
|
503
|
+
nvm use $(cat .nvmrc)
|
|
504
|
+
npm run build
|
|
505
|
+
|
|
506
|
+
# Clear cache and reinstall
|
|
507
|
+
rm -rf node_modules package-lock.json
|
|
508
|
+
npm install
|
|
509
|
+
npm run build
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
## Emergency Bypass
|
|
513
|
+
|
|
514
|
+
When you MUST push despite failing checks:
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
# Skip pre-push hook (use sparingly!)
|
|
518
|
+
git push --no-verify
|
|
519
|
+
|
|
520
|
+
# Or set environment variable
|
|
521
|
+
HUSKY_SKIP_HOOKS=1 git push
|
|
522
|
+
|
|
523
|
+
# Or disable temporarily
|
|
524
|
+
mv .git/hooks/pre-push .git/hooks/pre-push.disabled
|
|
525
|
+
git push
|
|
526
|
+
mv .git/hooks/pre-push.disabled .git/hooks/pre-push
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
**⚠️ WARNING**: Only bypass hooks for genuine emergencies. Fix the underlying issues immediately after.
|
|
530
|
+
|
|
531
|
+
## Common Pitfalls
|
|
532
|
+
|
|
533
|
+
1. **❌ Hook takes > 10 minutes**: Too slow, move to CI/CD
|
|
534
|
+
2. **❌ Not failing fast**: Run build first (catches syntax errors quickly)
|
|
535
|
+
3. **❌ Running checks twice**: Pre-commit already did lint/format
|
|
536
|
+
4. **❌ Not testing in clean state**: Uncommitted files affect results
|
|
537
|
+
5. **❌ No escape hatch**: Always allow `--no-verify` for emergencies
|
|
538
|
+
6. **❌ Unclear progress**: Add console.log for each step
|
|
539
|
+
7. **❌ Not checking exit codes**: Use `|| exit 1` or check `$?`
|
|
540
|
+
|
|
541
|
+
## Integration with CI/CD
|
|
542
|
+
|
|
543
|
+
Pre-push hooks are a LOCAL safety net. CI/CD provides the FINAL verification:
|
|
544
|
+
|
|
545
|
+
```yaml
|
|
546
|
+
# .github/workflows/ci.yml
|
|
547
|
+
name: CI
|
|
548
|
+
on: [push, pull_request]
|
|
549
|
+
|
|
550
|
+
jobs:
|
|
551
|
+
test:
|
|
552
|
+
runs-on: ubuntu-latest
|
|
553
|
+
steps:
|
|
554
|
+
- uses: actions/checkout@v3
|
|
555
|
+
- name: Install dependencies
|
|
556
|
+
run: npm install
|
|
557
|
+
- name: Build
|
|
558
|
+
run: npm run build
|
|
559
|
+
- name: Test
|
|
560
|
+
run: npm test
|
|
561
|
+
- name: Coverage
|
|
562
|
+
run: npm run test:coverage
|
|
563
|
+
- name: Upload coverage
|
|
564
|
+
uses: codecov/codecov-action@v3
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
**Philosophy**:
|
|
568
|
+
- Pre-push: Fast checks (< 5 min) to catch obvious issues
|
|
569
|
+
- CI/CD: Comprehensive checks (10-30 min) to verify everything
|
|
570
|
+
|
|
571
|
+
## Integration with Rulebook
|
|
572
|
+
|
|
573
|
+
If using `@hivehub/rulebook`, pre-push hooks are automatically generated:
|
|
574
|
+
|
|
575
|
+
```bash
|
|
576
|
+
# Initialize project with hooks
|
|
577
|
+
npx @hivehub/rulebook init
|
|
578
|
+
|
|
579
|
+
# Hooks are created with language-specific checks
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
Hook configuration in `.rulebook`:
|
|
583
|
+
```json
|
|
584
|
+
{
|
|
585
|
+
"hooks": {
|
|
586
|
+
"prePush": {
|
|
587
|
+
"enabled": true,
|
|
588
|
+
"checks": ["build", "test", "coverage"],
|
|
589
|
+
"coverageThreshold": 95
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
## Related Templates
|
|
596
|
+
|
|
597
|
+
- See `/rulebook/PRE_COMMIT.md` for fast quality checks before commit
|
|
598
|
+
- See `/rulebook/QUALITY_ENFORCEMENT.md` for quality standards
|
|
599
|
+
- See `/rulebook/GIT.md` for git workflow and conventions
|
|
600
|
+
- See `/rulebook/GITHUB_ACTIONS.md` for CI/CD integration
|
|
601
|
+
- See language-specific templates for test commands and coverage tools
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# C# Pre-Commit Hook
|
|
3
|
+
# Generated by @hivellm/rulebook
|
|
4
|
+
|
|
5
|
+
echo "🔍 Running C# pre-commit checks..."
|
|
6
|
+
|
|
7
|
+
# Format check
|
|
8
|
+
echo " → Format checking..."
|
|
9
|
+
dotnet format --verify-no-changes || {
|
|
10
|
+
echo "❌ Format check failed. Run: dotnet format"
|
|
11
|
+
exit 1
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
# Tests
|
|
15
|
+
echo " → Running tests..."
|
|
16
|
+
dotnet test || {
|
|
17
|
+
echo "❌ Tests failed"
|
|
18
|
+
exit 1
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
echo "✅ All C# pre-commit checks passed!"
|
|
22
|
+
exit 0
|
|
23
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# C# Pre-Push Hook
|
|
3
|
+
# Generated by @hivellm/rulebook
|
|
4
|
+
|
|
5
|
+
echo "🚀 Running C# pre-push checks..."
|
|
6
|
+
|
|
7
|
+
# Build release
|
|
8
|
+
echo " → Building release..."
|
|
9
|
+
dotnet build -c Release || {
|
|
10
|
+
echo "❌ Release build failed"
|
|
11
|
+
exit 1
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
# Full test suite
|
|
15
|
+
echo " → Running full test suite..."
|
|
16
|
+
dotnet test --no-build -c Release || {
|
|
17
|
+
echo "❌ Tests failed"
|
|
18
|
+
exit 1
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
echo "✅ All C# pre-push checks passed!"
|
|
22
|
+
exit 0
|
|
23
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Dart Pre-Commit Hook
|
|
3
|
+
# Generated by @hivellm/rulebook
|
|
4
|
+
|
|
5
|
+
echo "🔍 Running Dart pre-commit checks..."
|
|
6
|
+
|
|
7
|
+
# Format check
|
|
8
|
+
echo " → Format checking..."
|
|
9
|
+
dart format --set-exit-if-changed . || {
|
|
10
|
+
echo "❌ Format check failed. Run: dart format ."
|
|
11
|
+
exit 1
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
# Analyze
|
|
15
|
+
echo " → Analyzing..."
|
|
16
|
+
dart analyze --fatal-infos || {
|
|
17
|
+
echo "❌ Analysis failed"
|
|
18
|
+
exit 1
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
# Tests
|
|
22
|
+
echo " → Running tests..."
|
|
23
|
+
dart test || {
|
|
24
|
+
echo "❌ Tests failed"
|
|
25
|
+
exit 1
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
echo "✅ All Dart pre-commit checks passed!"
|
|
29
|
+
exit 0
|
|
30
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Dart Pre-Push Hook
|
|
3
|
+
# Generated by @hivellm/rulebook
|
|
4
|
+
|
|
5
|
+
echo "🚀 Running Dart pre-push checks..."
|
|
6
|
+
|
|
7
|
+
# Full test suite with coverage
|
|
8
|
+
echo " → Running tests with coverage..."
|
|
9
|
+
dart test --coverage=coverage || {
|
|
10
|
+
echo "❌ Tests failed"
|
|
11
|
+
exit 1
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
# If Flutter project
|
|
15
|
+
if grep -q "flutter:" pubspec.yaml 2>/dev/null; then
|
|
16
|
+
echo " → Running Flutter tests..."
|
|
17
|
+
flutter test || {
|
|
18
|
+
echo "❌ Flutter tests failed"
|
|
19
|
+
exit 1
|
|
20
|
+
}
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
echo "✅ All Dart pre-push checks passed!"
|
|
24
|
+
exit 0
|
|
25
|
+
|