@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,619 @@
|
|
|
1
|
+
# Prepare Commit Message Hook
|
|
2
|
+
|
|
3
|
+
This template provides guidance for implementing prepare-commit-msg git hooks that automatically generate or enhance commit messages.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Prepare-commit-msg hooks run before the commit message editor opens to:
|
|
8
|
+
- Pre-populate commit messages from branch names
|
|
9
|
+
- Add issue/ticket references automatically
|
|
10
|
+
- Insert commit templates
|
|
11
|
+
- Add metadata (branch, author, timestamps)
|
|
12
|
+
- Enforce commit message structure
|
|
13
|
+
|
|
14
|
+
## Agent Automation Commands
|
|
15
|
+
|
|
16
|
+
When implementing or modifying prepare-commit-msg hooks:
|
|
17
|
+
|
|
18
|
+
### Standard Usage
|
|
19
|
+
```bash
|
|
20
|
+
# Hook runs automatically before commit editor opens
|
|
21
|
+
git commit
|
|
22
|
+
|
|
23
|
+
# Skip hook if needed
|
|
24
|
+
git commit --no-verify -m "message"
|
|
25
|
+
|
|
26
|
+
# Use custom template
|
|
27
|
+
git commit --template=.gitmessage
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Hook Implementation Patterns
|
|
31
|
+
|
|
32
|
+
### Node.js Implementation (Recommended)
|
|
33
|
+
|
|
34
|
+
**Shell Wrapper** (`.git/hooks/prepare-commit-msg`):
|
|
35
|
+
```bash
|
|
36
|
+
#!/bin/sh
|
|
37
|
+
|
|
38
|
+
# Arguments:
|
|
39
|
+
# $1 = commit message file
|
|
40
|
+
# $2 = commit source (message, template, merge, squash, commit)
|
|
41
|
+
# $3 = commit SHA (for amend or commit -c)
|
|
42
|
+
|
|
43
|
+
# Find Node.js executable (cross-platform)
|
|
44
|
+
NODE_PATH=""
|
|
45
|
+
if command -v node >/dev/null 2>&1; then
|
|
46
|
+
NODE_PATH="node"
|
|
47
|
+
elif [ -f "/c/Program Files/nodejs/node.exe" ]; then
|
|
48
|
+
NODE_PATH="/c/Program Files/nodejs/node.exe"
|
|
49
|
+
elif [ -f "/usr/bin/node" ]; then
|
|
50
|
+
NODE_PATH="/usr/bin/node"
|
|
51
|
+
else
|
|
52
|
+
echo "Error: Node.js not found"
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
# Execute Node.js script
|
|
57
|
+
"$NODE_PATH" "$(dirname "$0")/prepare-commit-msg.js" "$@"
|
|
58
|
+
exit $?
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Node.js Script** (`.git/hooks/prepare-commit-msg.js`):
|
|
62
|
+
```javascript
|
|
63
|
+
#!/usr/bin/env node
|
|
64
|
+
|
|
65
|
+
const { execSync } = require('child_process');
|
|
66
|
+
const fs = require('fs');
|
|
67
|
+
|
|
68
|
+
const [, , messageFile, source, sha] = process.argv;
|
|
69
|
+
|
|
70
|
+
function getCurrentBranch() {
|
|
71
|
+
return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function extractIssueNumber(branchName) {
|
|
75
|
+
// Extract issue number from branch names like:
|
|
76
|
+
// - feature/123-user-auth
|
|
77
|
+
// - bugfix/456-memory-leak
|
|
78
|
+
// - PROJ-789-api-update
|
|
79
|
+
const patterns = [
|
|
80
|
+
/\/(\d+)-/, // feature/123-name
|
|
81
|
+
/\/([A-Z]+-\d+)-/, // feature/PROJ-123-name
|
|
82
|
+
/#(\d+)/, // feature/#123
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
for (const pattern of patterns) {
|
|
86
|
+
const match = branchName.match(pattern);
|
|
87
|
+
if (match) {
|
|
88
|
+
return match[1];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function extractScope(branchName) {
|
|
96
|
+
// Extract scope from branch names like:
|
|
97
|
+
// - feature/auth/login
|
|
98
|
+
// - fix/api/validation
|
|
99
|
+
const match = branchName.match(/^[^/]+\/([^/]+)\//);
|
|
100
|
+
return match ? match[1] : null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function getCommitType(branchName) {
|
|
104
|
+
const branchTypes = {
|
|
105
|
+
feature: 'feat',
|
|
106
|
+
feat: 'feat',
|
|
107
|
+
bugfix: 'fix',
|
|
108
|
+
fix: 'fix',
|
|
109
|
+
hotfix: 'fix',
|
|
110
|
+
docs: 'docs',
|
|
111
|
+
refactor: 'refactor',
|
|
112
|
+
perf: 'perf',
|
|
113
|
+
test: 'test',
|
|
114
|
+
chore: 'chore',
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
for (const [key, type] of Object.entries(branchTypes)) {
|
|
118
|
+
if (branchName.startsWith(key)) {
|
|
119
|
+
return type;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function main() {
|
|
127
|
+
// Skip for merge, squash, or amend commits
|
|
128
|
+
if (source === 'merge' || source === 'squash' || source === 'commit') {
|
|
129
|
+
process.exit(0);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Skip if message already provided via -m flag
|
|
133
|
+
if (source === 'message') {
|
|
134
|
+
process.exit(0);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const branch = getCurrentBranch();
|
|
138
|
+
const currentMessage = fs.readFileSync(messageFile, 'utf-8');
|
|
139
|
+
|
|
140
|
+
// Skip if message already has content (not default template)
|
|
141
|
+
if (currentMessage.trim() && !currentMessage.startsWith('#')) {
|
|
142
|
+
process.exit(0);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Build enhanced commit message
|
|
146
|
+
let newMessage = '';
|
|
147
|
+
|
|
148
|
+
// Add conventional commit prefix if possible
|
|
149
|
+
const commitType = getCommitType(branch);
|
|
150
|
+
const scope = extractScope(branch);
|
|
151
|
+
|
|
152
|
+
if (commitType) {
|
|
153
|
+
newMessage += commitType;
|
|
154
|
+
if (scope) {
|
|
155
|
+
newMessage += `(${scope})`;
|
|
156
|
+
}
|
|
157
|
+
newMessage += ': ';
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Add placeholder for subject
|
|
161
|
+
newMessage += '<subject>\n\n';
|
|
162
|
+
|
|
163
|
+
// Add body template
|
|
164
|
+
newMessage += '# Why (motivation for this change):\n';
|
|
165
|
+
newMessage += '# - \n\n';
|
|
166
|
+
|
|
167
|
+
newMessage += '# What (summary of changes):\n';
|
|
168
|
+
newMessage += '# - \n\n';
|
|
169
|
+
|
|
170
|
+
// Add issue reference if found
|
|
171
|
+
const issueNumber = extractIssueNumber(branch);
|
|
172
|
+
if (issueNumber) {
|
|
173
|
+
newMessage += `# Refs #${issueNumber}\n`;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Add commit message guidelines
|
|
177
|
+
newMessage += '\n# Commit Message Guidelines:\n';
|
|
178
|
+
newMessage += '# - Use imperative mood ("add" not "added" or "adds")\n';
|
|
179
|
+
newMessage += '# - First line should be < 50 chars\n';
|
|
180
|
+
newMessage += '# - Separate subject from body with blank line\n';
|
|
181
|
+
newMessage += '# - Wrap body at 72 chars\n';
|
|
182
|
+
newMessage += `# - Branch: ${branch}\n`;
|
|
183
|
+
|
|
184
|
+
fs.writeFileSync(messageFile, newMessage);
|
|
185
|
+
process.exit(0);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
main();
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Shell-Only Implementation (Simple)
|
|
192
|
+
|
|
193
|
+
**`.git/hooks/prepare-commit-msg`**:
|
|
194
|
+
```bash
|
|
195
|
+
#!/bin/sh
|
|
196
|
+
|
|
197
|
+
COMMIT_MSG_FILE=$1
|
|
198
|
+
COMMIT_SOURCE=$2
|
|
199
|
+
SHA=$3
|
|
200
|
+
|
|
201
|
+
# Skip for merge commits
|
|
202
|
+
if [ "$COMMIT_SOURCE" = "merge" ]; then
|
|
203
|
+
exit 0
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
# Skip if message already provided
|
|
207
|
+
if [ "$COMMIT_SOURCE" = "message" ]; then
|
|
208
|
+
exit 0
|
|
209
|
+
fi
|
|
210
|
+
|
|
211
|
+
# Get current branch
|
|
212
|
+
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
213
|
+
|
|
214
|
+
# Extract issue number from branch (e.g., feature/123-user-auth)
|
|
215
|
+
ISSUE=$(echo "$BRANCH" | grep -oE '[0-9]+' | head -1)
|
|
216
|
+
|
|
217
|
+
# Add issue reference if found
|
|
218
|
+
if [ -n "$ISSUE" ]; then
|
|
219
|
+
echo "" >> "$COMMIT_MSG_FILE"
|
|
220
|
+
echo "Refs #$ISSUE" >> "$COMMIT_MSG_FILE"
|
|
221
|
+
fi
|
|
222
|
+
|
|
223
|
+
exit 0
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Best Practices
|
|
227
|
+
|
|
228
|
+
### ✅ DO Include in Prepare-Commit-Msg
|
|
229
|
+
|
|
230
|
+
1. **Issue References from Branch**
|
|
231
|
+
```javascript
|
|
232
|
+
const issue = extractIssueNumber(branch);
|
|
233
|
+
if (issue) {
|
|
234
|
+
message += `\nRefs #${issue}`;
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
2. **Conventional Commit Type**
|
|
239
|
+
```javascript
|
|
240
|
+
const type = getCommitType(branch); // feat, fix, etc.
|
|
241
|
+
if (type) {
|
|
242
|
+
message = `${type}: ${message}`;
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
3. **Scope from Branch**
|
|
247
|
+
```javascript
|
|
248
|
+
const scope = extractScope(branch); // api, ui, auth
|
|
249
|
+
if (scope) {
|
|
250
|
+
message = `${type}(${scope}): ${message}`;
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
4. **Commit Template**
|
|
255
|
+
```javascript
|
|
256
|
+
message += '\n# Why:\n# - \n\n';
|
|
257
|
+
message += '# What:\n# - \n';
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
5. **Helpful Guidelines**
|
|
261
|
+
```javascript
|
|
262
|
+
message += '\n# Guidelines:\n';
|
|
263
|
+
message += '# - Use imperative mood\n';
|
|
264
|
+
message += '# - Keep first line < 50 chars\n';
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### ❌ DON'T Include in Prepare-Commit-Msg
|
|
268
|
+
|
|
269
|
+
1. **Complete Messages** - Let developers write the description
|
|
270
|
+
2. **Validation** - Use commit-msg hook for validation
|
|
271
|
+
3. **External API Calls** - Keep hook fast
|
|
272
|
+
4. **Interactive Prompts** - Hook runs non-interactively
|
|
273
|
+
|
|
274
|
+
## Branch Naming Patterns
|
|
275
|
+
|
|
276
|
+
### Recommended Branch Naming
|
|
277
|
+
|
|
278
|
+
**With Issue Numbers**:
|
|
279
|
+
```
|
|
280
|
+
feature/123-user-authentication
|
|
281
|
+
bugfix/456-memory-leak
|
|
282
|
+
hotfix/789-critical-security
|
|
283
|
+
docs/321-api-documentation
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**With Scope**:
|
|
287
|
+
```
|
|
288
|
+
feature/auth/oauth-integration
|
|
289
|
+
fix/api/validation-error
|
|
290
|
+
refactor/ui/button-component
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Jira/Linear Style**:
|
|
294
|
+
```
|
|
295
|
+
feature/PROJ-123-user-login
|
|
296
|
+
fix/PROJ-456-api-timeout
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Extraction Logic
|
|
300
|
+
|
|
301
|
+
```javascript
|
|
302
|
+
function extractFromBranch(branch) {
|
|
303
|
+
// Pattern 1: type/number-description
|
|
304
|
+
let match = branch.match(/^([^/]+)\/(\d+)-(.+)$/);
|
|
305
|
+
if (match) {
|
|
306
|
+
return {
|
|
307
|
+
type: mapType(match[1]), // feature -> feat
|
|
308
|
+
issue: match[2], // 123
|
|
309
|
+
description: match[3], // user-authentication
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Pattern 2: type/scope/description
|
|
314
|
+
match = branch.match(/^([^/]+)\/([^/]+)\/(.+)$/);
|
|
315
|
+
if (match) {
|
|
316
|
+
return {
|
|
317
|
+
type: mapType(match[1]), // feature -> feat
|
|
318
|
+
scope: match[2], // auth
|
|
319
|
+
description: match[3], // oauth-integration
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Pattern 3: type/PROJ-number-description
|
|
324
|
+
match = branch.match(/^([^/]+)\/([A-Z]+-\d+)-(.+)$/);
|
|
325
|
+
if (match) {
|
|
326
|
+
return {
|
|
327
|
+
type: mapType(match[1]), // feature -> feat
|
|
328
|
+
issue: match[2], // PROJ-123
|
|
329
|
+
description: match[3], // user-login
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Advanced Patterns
|
|
338
|
+
|
|
339
|
+
### Add Co-Authors from Git Config
|
|
340
|
+
|
|
341
|
+
```javascript
|
|
342
|
+
function getTeamMembers() {
|
|
343
|
+
// Read from .git/config or custom config file
|
|
344
|
+
const config = fs.readFileSync('.git/config', 'utf-8');
|
|
345
|
+
const members = [];
|
|
346
|
+
|
|
347
|
+
const matches = config.matchAll(/co-author-(\w+) = (.+) <(.+)>/g);
|
|
348
|
+
for (const match of matches) {
|
|
349
|
+
members.push({ name: match[2], email: match[3] });
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return members;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function addCoAuthors(message) {
|
|
356
|
+
const members = getTeamMembers();
|
|
357
|
+
if (members.length > 0) {
|
|
358
|
+
message += '\n\n# Co-Authors (uncomment if applicable):\n';
|
|
359
|
+
members.forEach(m => {
|
|
360
|
+
message += `# Co-authored-by: ${m.name} <${m.email}>\n`;
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
return message;
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Add Related Files
|
|
368
|
+
|
|
369
|
+
```javascript
|
|
370
|
+
function getStagedFiles() {
|
|
371
|
+
const output = execSync('git diff --cached --name-only', { encoding: 'utf-8' });
|
|
372
|
+
return output.trim().split('\n').filter(f => f);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function addFilesSummary(message) {
|
|
376
|
+
const files = getStagedFiles();
|
|
377
|
+
if (files.length > 0) {
|
|
378
|
+
message += '\n# Files changed:\n';
|
|
379
|
+
files.forEach(f => {
|
|
380
|
+
message += `# ${f}\n`;
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
return message;
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Add Recent Commits Context
|
|
388
|
+
|
|
389
|
+
```javascript
|
|
390
|
+
function getRecentCommits(count = 5) {
|
|
391
|
+
const output = execSync(`git log -${count} --oneline`, { encoding: 'utf-8' });
|
|
392
|
+
return output.trim().split('\n');
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function addCommitContext(message) {
|
|
396
|
+
const commits = getRecentCommits();
|
|
397
|
+
message += '\n# Recent commits:\n';
|
|
398
|
+
commits.forEach(c => {
|
|
399
|
+
message += `# ${c}\n`;
|
|
400
|
+
});
|
|
401
|
+
return message;
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Branch-Specific Templates
|
|
406
|
+
|
|
407
|
+
```javascript
|
|
408
|
+
function getTemplate(branch) {
|
|
409
|
+
if (branch === 'main' || branch === 'master') {
|
|
410
|
+
return {
|
|
411
|
+
requireIssue: true,
|
|
412
|
+
requireBreakingChange: true,
|
|
413
|
+
template: 'production',
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (branch.startsWith('hotfix/')) {
|
|
418
|
+
return {
|
|
419
|
+
requireIssue: true,
|
|
420
|
+
urgent: true,
|
|
421
|
+
template: 'hotfix',
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if (branch.startsWith('feature/')) {
|
|
426
|
+
return {
|
|
427
|
+
requireIssue: false,
|
|
428
|
+
template: 'feature',
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return { template: 'default' };
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## Commit Message Templates
|
|
437
|
+
|
|
438
|
+
### Feature Template
|
|
439
|
+
|
|
440
|
+
```
|
|
441
|
+
feat(<scope>): <subject>
|
|
442
|
+
|
|
443
|
+
## Why
|
|
444
|
+
- Motivation for this feature
|
|
445
|
+
- Problem it solves
|
|
446
|
+
|
|
447
|
+
## What
|
|
448
|
+
- Summary of implementation
|
|
449
|
+
- Key changes made
|
|
450
|
+
|
|
451
|
+
## How to Test
|
|
452
|
+
- Steps to verify functionality
|
|
453
|
+
|
|
454
|
+
Refs #<issue>
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### Bugfix Template
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
fix(<scope>): <subject>
|
|
461
|
+
|
|
462
|
+
## Problem
|
|
463
|
+
- Description of bug
|
|
464
|
+
- Steps to reproduce
|
|
465
|
+
- Expected vs actual behavior
|
|
466
|
+
|
|
467
|
+
## Solution
|
|
468
|
+
- How bug was fixed
|
|
469
|
+
- Root cause identified
|
|
470
|
+
|
|
471
|
+
## Testing
|
|
472
|
+
- Verification steps
|
|
473
|
+
- Regression testing done
|
|
474
|
+
|
|
475
|
+
Fixes #<issue>
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### Hotfix Template
|
|
479
|
+
|
|
480
|
+
```
|
|
481
|
+
fix!: <critical-issue>
|
|
482
|
+
|
|
483
|
+
CRITICAL HOTFIX
|
|
484
|
+
|
|
485
|
+
## Issue
|
|
486
|
+
- Production problem description
|
|
487
|
+
- Impact and severity
|
|
488
|
+
|
|
489
|
+
## Fix
|
|
490
|
+
- Immediate solution applied
|
|
491
|
+
- Temporary vs permanent fix
|
|
492
|
+
|
|
493
|
+
## Verification
|
|
494
|
+
- Testing performed
|
|
495
|
+
- Rollback plan
|
|
496
|
+
|
|
497
|
+
Fixes #<issue>
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
## Troubleshooting
|
|
501
|
+
|
|
502
|
+
### Template Not Appearing
|
|
503
|
+
|
|
504
|
+
**Causes**:
|
|
505
|
+
1. Hook permissions incorrect
|
|
506
|
+
2. Source type is 'message' (using -m flag)
|
|
507
|
+
3. Merge/squash commit
|
|
508
|
+
|
|
509
|
+
**Solutions**:
|
|
510
|
+
```bash
|
|
511
|
+
# Check permissions
|
|
512
|
+
chmod +x .git/hooks/prepare-commit-msg
|
|
513
|
+
|
|
514
|
+
# Test manually
|
|
515
|
+
.git/hooks/prepare-commit-msg .git/COMMIT_EDITMSG template
|
|
516
|
+
|
|
517
|
+
# Check source type in hook
|
|
518
|
+
echo "Source: $2" >> /tmp/hook-debug.log
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### Issue Number Not Extracted
|
|
522
|
+
|
|
523
|
+
**Issue**: Branch name doesn't match regex
|
|
524
|
+
|
|
525
|
+
**Solution**: Add more patterns:
|
|
526
|
+
```javascript
|
|
527
|
+
const patterns = [
|
|
528
|
+
/\/(\d+)-/, // feature/123-name
|
|
529
|
+
/\/([A-Z]+-\d+)-/, // feature/PROJ-123-name
|
|
530
|
+
/#(\d+)/, // feature/#123
|
|
531
|
+
/^(\d+)-/, // 123-feature-name
|
|
532
|
+
/\[(\d+)\]/, // feature-[123]-name
|
|
533
|
+
/([A-Z]{2,}-\d+)/, // JIRA-123
|
|
534
|
+
];
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### Template Overrides User Message
|
|
538
|
+
|
|
539
|
+
**Issue**: Hook overwrites existing message
|
|
540
|
+
|
|
541
|
+
**Solution**: Check if message already exists:
|
|
542
|
+
```javascript
|
|
543
|
+
const currentMessage = fs.readFileSync(messageFile, 'utf-8');
|
|
544
|
+
|
|
545
|
+
// Skip if message has content (not just comments)
|
|
546
|
+
if (currentMessage.trim() && !currentMessage.startsWith('#')) {
|
|
547
|
+
process.exit(0);
|
|
548
|
+
}
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
## Integration with Tools
|
|
552
|
+
|
|
553
|
+
### Git Config Template
|
|
554
|
+
|
|
555
|
+
```bash
|
|
556
|
+
# Set global commit template
|
|
557
|
+
git config --global commit.template ~/.gitmessage
|
|
558
|
+
|
|
559
|
+
# Create template file
|
|
560
|
+
cat > ~/.gitmessage << 'EOF'
|
|
561
|
+
# <type>(<scope>): <subject>
|
|
562
|
+
|
|
563
|
+
# Why:
|
|
564
|
+
# -
|
|
565
|
+
|
|
566
|
+
# What:
|
|
567
|
+
# -
|
|
568
|
+
|
|
569
|
+
# Refs #
|
|
570
|
+
EOF
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### Commitizen Integration
|
|
574
|
+
|
|
575
|
+
```bash
|
|
576
|
+
# Install commitizen
|
|
577
|
+
npm install --save-dev commitizen cz-conventional-changelog
|
|
578
|
+
|
|
579
|
+
# Configure
|
|
580
|
+
echo '{"path": "cz-conventional-changelog"}' > .czrc
|
|
581
|
+
|
|
582
|
+
# Use instead of git commit
|
|
583
|
+
npx cz
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
## Integration with Rulebook
|
|
587
|
+
|
|
588
|
+
If using `@hivehub/rulebook`, prepare-commit-msg hooks are automatically generated:
|
|
589
|
+
|
|
590
|
+
```bash
|
|
591
|
+
# Initialize with hooks
|
|
592
|
+
npx @hivehub/rulebook init
|
|
593
|
+
|
|
594
|
+
# Configuration in .rulebook
|
|
595
|
+
{
|
|
596
|
+
"hooks": {
|
|
597
|
+
"prepareCommitMsg": {
|
|
598
|
+
"enabled": true,
|
|
599
|
+
"extractIssue": true,
|
|
600
|
+
"addTemplate": true,
|
|
601
|
+
"addGuidelines": true
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
## Common Pitfalls
|
|
608
|
+
|
|
609
|
+
1. **❌ Overwriting existing messages**: Check if message already exists
|
|
610
|
+
2. **❌ Slow execution**: Avoid external API calls
|
|
611
|
+
3. **❌ Complex regex**: Test branch name patterns thoroughly
|
|
612
|
+
4. **❌ No escape for merge commits**: Check source type
|
|
613
|
+
5. **❌ Not skipping -m commits**: Check if source is 'message'
|
|
614
|
+
|
|
615
|
+
## Related Templates
|
|
616
|
+
|
|
617
|
+
- See `/rulebook/COMMIT_MSG.md` for commit message validation
|
|
618
|
+
- See `/rulebook/GIT.md` for git workflow and branch naming
|
|
619
|
+
- See `/rulebook/PRE_COMMIT.md` for pre-commit checks
|