@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,546 @@
|
|
|
1
|
+
# Post-Checkout Hook
|
|
2
|
+
|
|
3
|
+
This template provides guidance for implementing post-checkout git hooks that automate tasks after branch checkouts or clones.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Post-checkout hooks run automatically after `git checkout` or `git clone` to:
|
|
8
|
+
- Install/update dependencies automatically
|
|
9
|
+
- Clean up build artifacts from previous branch
|
|
10
|
+
- Update database schema
|
|
11
|
+
- Reset development environment
|
|
12
|
+
- Notify about branch-specific requirements
|
|
13
|
+
|
|
14
|
+
## Agent Automation Commands
|
|
15
|
+
|
|
16
|
+
When implementing or modifying post-checkout hooks:
|
|
17
|
+
|
|
18
|
+
### TypeScript/JavaScript Projects
|
|
19
|
+
```bash
|
|
20
|
+
# Manual dependency install after checkout
|
|
21
|
+
npm install
|
|
22
|
+
|
|
23
|
+
# Clean build artifacts
|
|
24
|
+
rm -rf dist/ node_modules/.cache
|
|
25
|
+
|
|
26
|
+
# Database migrations
|
|
27
|
+
npm run db:migrate
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Python Projects
|
|
31
|
+
```bash
|
|
32
|
+
# Install dependencies
|
|
33
|
+
pip install -r requirements.txt
|
|
34
|
+
|
|
35
|
+
# Or with poetry
|
|
36
|
+
poetry install
|
|
37
|
+
|
|
38
|
+
# Database migrations
|
|
39
|
+
python manage.py migrate
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Rust Projects
|
|
43
|
+
```bash
|
|
44
|
+
# Update dependencies
|
|
45
|
+
cargo update
|
|
46
|
+
|
|
47
|
+
# Clean build cache
|
|
48
|
+
cargo clean
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Hook Implementation Patterns
|
|
52
|
+
|
|
53
|
+
### Cross-Platform Node.js Hook (Recommended)
|
|
54
|
+
|
|
55
|
+
**Shell Wrapper** (`.git/hooks/post-checkout`):
|
|
56
|
+
```bash
|
|
57
|
+
#!/bin/sh
|
|
58
|
+
|
|
59
|
+
# Arguments:
|
|
60
|
+
# $1 = ref of previous HEAD
|
|
61
|
+
# $2 = ref of new HEAD
|
|
62
|
+
# $3 = flag (1 = branch checkout, 0 = file checkout)
|
|
63
|
+
|
|
64
|
+
# Find Node.js executable (cross-platform)
|
|
65
|
+
NODE_PATH=""
|
|
66
|
+
if command -v node >/dev/null 2>&1; then
|
|
67
|
+
NODE_PATH="node"
|
|
68
|
+
elif [ -f "/c/Program Files/nodejs/node.exe" ]; then
|
|
69
|
+
NODE_PATH="/c/Program Files/nodejs/node.exe"
|
|
70
|
+
elif [ -f "/usr/bin/node" ]; then
|
|
71
|
+
NODE_PATH="/usr/bin/node"
|
|
72
|
+
else
|
|
73
|
+
echo "Error: Node.js not found"
|
|
74
|
+
exit 1
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# Execute Node.js script
|
|
78
|
+
"$NODE_PATH" "$(dirname "$0")/post-checkout.js" "$1" "$2" "$3"
|
|
79
|
+
exit $?
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Node.js Script** (`.git/hooks/post-checkout.js`):
|
|
83
|
+
```javascript
|
|
84
|
+
#!/usr/bin/env node
|
|
85
|
+
|
|
86
|
+
const { spawn } = require('child_process');
|
|
87
|
+
const fs = require('fs');
|
|
88
|
+
const path = require('path');
|
|
89
|
+
|
|
90
|
+
const [, , prevHead, newHead, branchCheckoutFlag] = process.argv;
|
|
91
|
+
|
|
92
|
+
function runCommand(command, args) {
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
console.log(`Running: ${command} ${args.join(' ')}`);
|
|
95
|
+
const proc = spawn(command, args, {
|
|
96
|
+
stdio: 'inherit',
|
|
97
|
+
shell: true,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
proc.on('close', (code) => {
|
|
101
|
+
if (code !== 0) reject(new Error(`Command failed: ${command}`));
|
|
102
|
+
else resolve();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function main() {
|
|
108
|
+
// Only run for branch checkouts, not file checkouts
|
|
109
|
+
if (branchCheckoutFlag === '0') {
|
|
110
|
+
console.log('File checkout detected, skipping post-checkout hook');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
console.log('\nš Post-checkout hook running...\n');
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
// Check if package.json changed
|
|
118
|
+
const packageJsonChanged = await hasFileChanged('package.json', prevHead, newHead);
|
|
119
|
+
const packageLockChanged = await hasFileChanged('package-lock.json', prevHead, newHead);
|
|
120
|
+
|
|
121
|
+
if (packageJsonChanged || packageLockChanged) {
|
|
122
|
+
console.log('š¦ Dependencies changed, running npm install...');
|
|
123
|
+
await runCommand('npm', ['install']);
|
|
124
|
+
} else {
|
|
125
|
+
console.log('ā
No dependency changes detected');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Clean build artifacts if switching branches
|
|
129
|
+
if (fs.existsSync('dist')) {
|
|
130
|
+
console.log('š§¹ Cleaning build artifacts...');
|
|
131
|
+
fs.rmSync('dist', { recursive: true, force: true });
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Check for .env.example updates
|
|
135
|
+
const envExampleChanged = await hasFileChanged('.env.example', prevHead, newHead);
|
|
136
|
+
if (envExampleChanged && fs.existsSync('.env.example') && !fs.existsSync('.env')) {
|
|
137
|
+
console.log('āļø .env.example updated, consider updating .env');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
console.log('\nā
Post-checkout complete!\n');
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error('ā ļø Post-checkout hook failed:', error.message);
|
|
143
|
+
// Don't fail the checkout
|
|
144
|
+
process.exit(0);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function hasFileChanged(filepath, prevRef, newRef) {
|
|
149
|
+
return new Promise((resolve) => {
|
|
150
|
+
const proc = spawn('git', ['diff', '--name-only', prevRef, newRef, '--', filepath], {
|
|
151
|
+
shell: true,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
let output = '';
|
|
155
|
+
proc.stdout.on('data', (data) => {
|
|
156
|
+
output += data.toString();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
proc.on('close', () => {
|
|
160
|
+
resolve(output.trim() !== '');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
main();
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Shell-Only Implementation (Simple)
|
|
169
|
+
|
|
170
|
+
**`.git/hooks/post-checkout`**:
|
|
171
|
+
```bash
|
|
172
|
+
#!/bin/sh
|
|
173
|
+
|
|
174
|
+
# Arguments:
|
|
175
|
+
# $1 = ref of previous HEAD
|
|
176
|
+
# $2 = ref of new HEAD
|
|
177
|
+
# $3 = flag (1 = branch checkout, 0 = file checkout)
|
|
178
|
+
|
|
179
|
+
PREV_HEAD=$1
|
|
180
|
+
NEW_HEAD=$2
|
|
181
|
+
BRANCH_CHECKOUT=$3
|
|
182
|
+
|
|
183
|
+
# Only run for branch checkouts
|
|
184
|
+
if [ "$BRANCH_CHECKOUT" = "0" ]; then
|
|
185
|
+
exit 0
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
echo "š Post-checkout hook running..."
|
|
189
|
+
|
|
190
|
+
# Check if package.json changed
|
|
191
|
+
if git diff --name-only $PREV_HEAD $NEW_HEAD | grep -q "package.json\|package-lock.json"; then
|
|
192
|
+
echo "š¦ Dependencies changed, running npm install..."
|
|
193
|
+
npm install
|
|
194
|
+
else
|
|
195
|
+
echo "ā
No dependency changes detected"
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# Clean build artifacts
|
|
199
|
+
if [ -d "dist" ]; then
|
|
200
|
+
echo "š§¹ Cleaning build artifacts..."
|
|
201
|
+
rm -rf dist/
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
echo "ā
Post-checkout complete!"
|
|
205
|
+
exit 0
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Best Practices
|
|
209
|
+
|
|
210
|
+
### ā
DO Include in Post-Checkout
|
|
211
|
+
|
|
212
|
+
1. **Dependency Installation** (Smart)
|
|
213
|
+
```javascript
|
|
214
|
+
// Only if package.json changed
|
|
215
|
+
if (packageJsonChanged) {
|
|
216
|
+
await runCommand('npm', ['install']);
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
2. **Clean Build Artifacts**
|
|
221
|
+
```javascript
|
|
222
|
+
// Remove stale build files
|
|
223
|
+
if (fs.existsSync('dist')) {
|
|
224
|
+
fs.rmSync('dist', { recursive: true });
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
3. **Database Migrations** (Optional)
|
|
229
|
+
```javascript
|
|
230
|
+
// Check if migrations changed
|
|
231
|
+
const migrationsChanged = await hasFileChanged('migrations/', prevHead, newHead);
|
|
232
|
+
if (migrationsChanged) {
|
|
233
|
+
await runCommand('npm', ['run', 'db:migrate']);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
4. **Environment Notifications**
|
|
238
|
+
```javascript
|
|
239
|
+
// Warn about .env changes
|
|
240
|
+
if (envExampleChanged) {
|
|
241
|
+
console.log('ā ļø .env.example updated - review your .env file');
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
5. **Git LFS Files** (If using Git LFS)
|
|
246
|
+
```bash
|
|
247
|
+
git lfs pull
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### ā DON'T Include in Post-Checkout
|
|
251
|
+
|
|
252
|
+
1. **Slow Operations** (> 1 minute)
|
|
253
|
+
- Full test suite
|
|
254
|
+
- Large data downloads
|
|
255
|
+
- Complete rebuilds
|
|
256
|
+
|
|
257
|
+
2. **Interactive Operations**
|
|
258
|
+
- User prompts
|
|
259
|
+
- Manual confirmations
|
|
260
|
+
- OAuth flows
|
|
261
|
+
|
|
262
|
+
3. **Destructive Operations Without Confirmation**
|
|
263
|
+
- Dropping databases
|
|
264
|
+
- Deleting user data
|
|
265
|
+
- Resetting configurations
|
|
266
|
+
|
|
267
|
+
4. **External Service Calls**
|
|
268
|
+
- Deployment triggers
|
|
269
|
+
- API notifications
|
|
270
|
+
- Third-party webhooks
|
|
271
|
+
|
|
272
|
+
## Language-Specific Patterns
|
|
273
|
+
|
|
274
|
+
### TypeScript/JavaScript (npm/pnpm/yarn)
|
|
275
|
+
|
|
276
|
+
**Smart Dependency Installation**:
|
|
277
|
+
```javascript
|
|
278
|
+
async function updateDependencies() {
|
|
279
|
+
// Check if package manager files changed
|
|
280
|
+
const filesChanged = await Promise.all([
|
|
281
|
+
hasFileChanged('package.json', prevHead, newHead),
|
|
282
|
+
hasFileChanged('package-lock.json', prevHead, newHead),
|
|
283
|
+
hasFileChanged('pnpm-lock.yaml', prevHead, newHead),
|
|
284
|
+
hasFileChanged('yarn.lock', prevHead, newHead),
|
|
285
|
+
]);
|
|
286
|
+
|
|
287
|
+
if (filesChanged.some(changed => changed)) {
|
|
288
|
+
// Detect package manager
|
|
289
|
+
if (fs.existsSync('pnpm-lock.yaml')) {
|
|
290
|
+
await runCommand('pnpm', ['install']);
|
|
291
|
+
} else if (fs.existsSync('yarn.lock')) {
|
|
292
|
+
await runCommand('yarn', ['install']);
|
|
293
|
+
} else {
|
|
294
|
+
await runCommand('npm', ['install']);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Clean Node.js Cache**:
|
|
301
|
+
```javascript
|
|
302
|
+
// Clean stale cache
|
|
303
|
+
if (fs.existsSync('node_modules/.cache')) {
|
|
304
|
+
fs.rmSync('node_modules/.cache', { recursive: true });
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Python (pip/poetry/pipenv)
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
#!/bin/sh
|
|
312
|
+
|
|
313
|
+
# Check if requirements changed
|
|
314
|
+
if git diff --name-only $PREV_HEAD $NEW_HEAD | grep -q "requirements.txt\|pyproject.toml\|Pipfile"; then
|
|
315
|
+
echo "š¦ Dependencies changed..."
|
|
316
|
+
|
|
317
|
+
# Detect package manager
|
|
318
|
+
if [ -f "poetry.lock" ]; then
|
|
319
|
+
poetry install
|
|
320
|
+
elif [ -f "Pipfile" ]; then
|
|
321
|
+
pipenv install
|
|
322
|
+
else
|
|
323
|
+
pip install -r requirements.txt
|
|
324
|
+
fi
|
|
325
|
+
fi
|
|
326
|
+
|
|
327
|
+
# Run migrations if using Django
|
|
328
|
+
if [ -f "manage.py" ]; then
|
|
329
|
+
if git diff --name-only $PREV_HEAD $NEW_HEAD | grep -q "migrations/"; then
|
|
330
|
+
echo "šļø Running database migrations..."
|
|
331
|
+
python manage.py migrate
|
|
332
|
+
fi
|
|
333
|
+
fi
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Rust (cargo)
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
#!/bin/sh
|
|
340
|
+
|
|
341
|
+
# Check if dependencies changed
|
|
342
|
+
if git diff --name-only $PREV_HEAD $NEW_HEAD | grep -q "Cargo.toml\|Cargo.lock"; then
|
|
343
|
+
echo "š¦ Dependencies changed, updating..."
|
|
344
|
+
cargo update
|
|
345
|
+
fi
|
|
346
|
+
|
|
347
|
+
# Clean build artifacts
|
|
348
|
+
if [ -d "target" ]; then
|
|
349
|
+
echo "š§¹ Cleaning build artifacts..."
|
|
350
|
+
cargo clean
|
|
351
|
+
fi
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Go
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
#!/bin/sh
|
|
358
|
+
|
|
359
|
+
# Check if dependencies changed
|
|
360
|
+
if git diff --name-only $PREV_HEAD $NEW_HEAD | grep -q "go.mod\|go.sum"; then
|
|
361
|
+
echo "š¦ Dependencies changed..."
|
|
362
|
+
go mod download
|
|
363
|
+
go mod verify
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
# Clean build artifacts
|
|
367
|
+
if [ -d "bin" ]; then
|
|
368
|
+
rm -rf bin/
|
|
369
|
+
fi
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Advanced Patterns
|
|
373
|
+
|
|
374
|
+
### Branch-Specific Actions
|
|
375
|
+
|
|
376
|
+
```javascript
|
|
377
|
+
async function main() {
|
|
378
|
+
const currentBranch = await getCurrentBranch();
|
|
379
|
+
|
|
380
|
+
// Production branch - extra checks
|
|
381
|
+
if (currentBranch === 'main' || currentBranch === 'master') {
|
|
382
|
+
console.log('ā ļø You are on production branch!');
|
|
383
|
+
console.log('š” Run tests before pushing: npm test');
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Development branch - setup dev environment
|
|
387
|
+
if (currentBranch === 'develop') {
|
|
388
|
+
console.log('š§ Setting up development environment...');
|
|
389
|
+
if (!fs.existsSync('.env')) {
|
|
390
|
+
fs.copyFileSync('.env.example', '.env');
|
|
391
|
+
console.log('ā
Created .env from .env.example');
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Feature branch - notify about base branch
|
|
396
|
+
if (currentBranch.startsWith('feature/')) {
|
|
397
|
+
console.log(`š” Feature branch detected: ${currentBranch}`);
|
|
398
|
+
console.log('š” Remember to rebase from develop regularly');
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
async function getCurrentBranch() {
|
|
403
|
+
return new Promise((resolve) => {
|
|
404
|
+
const proc = spawn('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { shell: true });
|
|
405
|
+
let output = '';
|
|
406
|
+
proc.stdout.on('data', (data) => { output += data.toString(); });
|
|
407
|
+
proc.on('close', () => { resolve(output.trim()); });
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Notify About Conflicting Files
|
|
413
|
+
|
|
414
|
+
```javascript
|
|
415
|
+
async function checkForConflicts() {
|
|
416
|
+
return new Promise((resolve) => {
|
|
417
|
+
const proc = spawn('git', ['diff', '--name-only', '--diff-filter=U'], { shell: true });
|
|
418
|
+
let output = '';
|
|
419
|
+
proc.stdout.on('data', (data) => { output += data.toString(); });
|
|
420
|
+
proc.on('close', () => {
|
|
421
|
+
const conflicts = output.trim().split('\n').filter(f => f);
|
|
422
|
+
if (conflicts.length > 0) {
|
|
423
|
+
console.log('\nā ļø MERGE CONFLICTS DETECTED:');
|
|
424
|
+
conflicts.forEach(file => console.log(` - ${file}`));
|
|
425
|
+
console.log('\nš” Resolve conflicts before continuing\n');
|
|
426
|
+
}
|
|
427
|
+
resolve();
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Update Git Submodules
|
|
434
|
+
|
|
435
|
+
```bash
|
|
436
|
+
#!/bin/sh
|
|
437
|
+
|
|
438
|
+
# Check if .gitmodules changed
|
|
439
|
+
if git diff --name-only $PREV_HEAD $NEW_HEAD | grep -q ".gitmodules"; then
|
|
440
|
+
echo "š¦ Submodules changed, updating..."
|
|
441
|
+
git submodule update --init --recursive
|
|
442
|
+
fi
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
## Troubleshooting
|
|
446
|
+
|
|
447
|
+
### Hook Running Too Slowly
|
|
448
|
+
|
|
449
|
+
**Issue**: Checkout takes too long
|
|
450
|
+
|
|
451
|
+
**Solutions**:
|
|
452
|
+
1. Only run operations when files actually changed
|
|
453
|
+
2. Run npm/pip install in background
|
|
454
|
+
3. Skip hook for file checkouts (check `$3` flag)
|
|
455
|
+
4. Add timeout to prevent hanging
|
|
456
|
+
|
|
457
|
+
```javascript
|
|
458
|
+
// Run with timeout
|
|
459
|
+
const timeout = 60000; // 60 seconds
|
|
460
|
+
const controller = new AbortController();
|
|
461
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
462
|
+
|
|
463
|
+
try {
|
|
464
|
+
await runCommand('npm', ['install'], { signal: controller.signal });
|
|
465
|
+
} catch (error) {
|
|
466
|
+
if (error.name === 'AbortError') {
|
|
467
|
+
console.log('ā ļø Install timed out, continuing...');
|
|
468
|
+
}
|
|
469
|
+
} finally {
|
|
470
|
+
clearTimeout(timeoutId);
|
|
471
|
+
}
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### Dependencies Not Installing
|
|
475
|
+
|
|
476
|
+
**Issue**: npm install fails silently
|
|
477
|
+
|
|
478
|
+
**Solutions**:
|
|
479
|
+
1. Check exit codes: `|| exit 1` (but don't fail checkout)
|
|
480
|
+
2. Log errors clearly
|
|
481
|
+
3. Provide manual command to run
|
|
482
|
+
|
|
483
|
+
```javascript
|
|
484
|
+
try {
|
|
485
|
+
await runCommand('npm', ['install']);
|
|
486
|
+
} catch (error) {
|
|
487
|
+
console.error('ā ļø Failed to install dependencies');
|
|
488
|
+
console.error('š” Run manually: npm install');
|
|
489
|
+
// Don't exit 1 - don't block checkout
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Hook Not Running
|
|
494
|
+
|
|
495
|
+
**Causes**:
|
|
496
|
+
1. File permissions incorrect
|
|
497
|
+
2. Shebang missing
|
|
498
|
+
3. Syntax errors in script
|
|
499
|
+
|
|
500
|
+
**Solutions**:
|
|
501
|
+
```bash
|
|
502
|
+
# Fix permissions
|
|
503
|
+
chmod +x .git/hooks/post-checkout
|
|
504
|
+
|
|
505
|
+
# Test manually
|
|
506
|
+
.git/hooks/post-checkout prev_ref new_ref 1
|
|
507
|
+
|
|
508
|
+
# Check for syntax errors
|
|
509
|
+
node .git/hooks/post-checkout.js prev_ref new_ref 1
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
## Common Pitfalls
|
|
513
|
+
|
|
514
|
+
1. **ā Failing checkout on errors**: Always exit 0 (don't block checkout)
|
|
515
|
+
2. **ā Running for file checkouts**: Check flag `$3 == 1`
|
|
516
|
+
3. **ā No progress indication**: Log what's happening
|
|
517
|
+
4. **ā Installing deps every time**: Only when files changed
|
|
518
|
+
5. **ā Interactive operations**: No user prompts allowed
|
|
519
|
+
6. **ā Not handling errors gracefully**: Log and continue
|
|
520
|
+
|
|
521
|
+
## Integration with Rulebook
|
|
522
|
+
|
|
523
|
+
If using `@hivehub/rulebook`, post-checkout hooks are automatically generated:
|
|
524
|
+
|
|
525
|
+
```bash
|
|
526
|
+
# Initialize with hooks
|
|
527
|
+
npx @hivehub/rulebook init
|
|
528
|
+
|
|
529
|
+
# Configuration in .rulebook
|
|
530
|
+
{
|
|
531
|
+
"hooks": {
|
|
532
|
+
"postCheckout": {
|
|
533
|
+
"enabled": true,
|
|
534
|
+
"autoInstall": true,
|
|
535
|
+
"cleanArtifacts": true
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
## Related Templates
|
|
542
|
+
|
|
543
|
+
- See `/rulebook/PRE_COMMIT.md` for pre-commit quality checks
|
|
544
|
+
- See `/rulebook/PRE_PUSH.md` for pre-push validation
|
|
545
|
+
- See `/rulebook/GIT.md` for git workflow
|
|
546
|
+
- See language-specific templates for dependency management commands
|