@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,530 @@
|
|
|
1
|
+
# Commit Message Hook
|
|
2
|
+
|
|
3
|
+
This template provides guidance for implementing commit-msg git hooks that enforce commit message standards and conventions.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Commit-msg hooks run after commit message is entered to:
|
|
8
|
+
- Enforce conventional commit format
|
|
9
|
+
- Validate commit message structure
|
|
10
|
+
- Ensure clear, actionable commit messages
|
|
11
|
+
- Maintain consistent commit history
|
|
12
|
+
- Enable automated changelog generation
|
|
13
|
+
|
|
14
|
+
## Agent Automation Commands
|
|
15
|
+
|
|
16
|
+
When implementing or modifying commit-msg hooks, use these patterns:
|
|
17
|
+
|
|
18
|
+
### Standard Commit Format
|
|
19
|
+
```bash
|
|
20
|
+
# Conventional Commits format
|
|
21
|
+
git commit -m "feat: add user authentication"
|
|
22
|
+
git commit -m "fix: resolve memory leak in parser"
|
|
23
|
+
git commit -m "docs: update API documentation"
|
|
24
|
+
|
|
25
|
+
# With scope
|
|
26
|
+
git commit -m "feat(auth): add JWT token validation"
|
|
27
|
+
git commit -m "fix(api): handle null responses gracefully"
|
|
28
|
+
|
|
29
|
+
# With breaking change
|
|
30
|
+
git commit -m "feat!: redesign API endpoints" -m "BREAKING CHANGE: API v1 endpoints removed"
|
|
31
|
+
|
|
32
|
+
# Skip validation (emergency only)
|
|
33
|
+
git commit --no-verify -m "WIP: work in progress"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Conventional Commits Format
|
|
37
|
+
|
|
38
|
+
### Structure
|
|
39
|
+
```
|
|
40
|
+
<type>(<scope>): <subject>
|
|
41
|
+
|
|
42
|
+
<body>
|
|
43
|
+
|
|
44
|
+
<footer>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Required Components
|
|
48
|
+
|
|
49
|
+
**Type** (required): Must be one of:
|
|
50
|
+
- `feat`: New feature
|
|
51
|
+
- `fix`: Bug fix
|
|
52
|
+
- `docs`: Documentation only changes
|
|
53
|
+
- `style`: Code style changes (formatting, semicolons, etc.)
|
|
54
|
+
- `refactor`: Code change that neither fixes a bug nor adds a feature
|
|
55
|
+
- `perf`: Performance improvement
|
|
56
|
+
- `test`: Adding or updating tests
|
|
57
|
+
- `build`: Changes to build system or dependencies
|
|
58
|
+
- `ci`: Changes to CI configuration
|
|
59
|
+
- `chore`: Other changes that don't modify src or test files
|
|
60
|
+
- `revert`: Reverts a previous commit
|
|
61
|
+
|
|
62
|
+
**Subject** (required):
|
|
63
|
+
- Brief description (50 chars or less)
|
|
64
|
+
- Lowercase first letter
|
|
65
|
+
- No period at end
|
|
66
|
+
- Imperative mood ("add" not "added" or "adds")
|
|
67
|
+
|
|
68
|
+
**Scope** (optional):
|
|
69
|
+
- Noun describing section of codebase
|
|
70
|
+
- Examples: `api`, `ui`, `auth`, `parser`, `cli`
|
|
71
|
+
|
|
72
|
+
**Body** (optional):
|
|
73
|
+
- Detailed explanation
|
|
74
|
+
- Separate from subject with blank line
|
|
75
|
+
- Wrap at 72 characters
|
|
76
|
+
|
|
77
|
+
**Footer** (optional):
|
|
78
|
+
- Breaking changes: `BREAKING CHANGE: description`
|
|
79
|
+
- Issue references: `Closes #123, #456`
|
|
80
|
+
- Co-authors: `Co-authored-by: Name <email>`
|
|
81
|
+
|
|
82
|
+
### Examples
|
|
83
|
+
|
|
84
|
+
**Good Commits**:
|
|
85
|
+
```
|
|
86
|
+
feat(auth): add OAuth2 authentication
|
|
87
|
+
|
|
88
|
+
Implement OAuth2 flow with support for Google and GitHub providers.
|
|
89
|
+
Includes token refresh mechanism and secure storage.
|
|
90
|
+
|
|
91
|
+
Closes #234
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
fix: prevent race condition in task queue
|
|
96
|
+
|
|
97
|
+
Add mutex to protect concurrent access to task queue.
|
|
98
|
+
This resolves intermittent task duplication issues.
|
|
99
|
+
|
|
100
|
+
Fixes #567
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
docs: add contributing guidelines
|
|
105
|
+
|
|
106
|
+
Create CONTRIBUTING.md with:
|
|
107
|
+
- Code style requirements
|
|
108
|
+
- PR submission process
|
|
109
|
+
- Testing guidelines
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Bad Commits** (will be rejected):
|
|
113
|
+
```
|
|
114
|
+
❌ "Fixed stuff" # No type, unclear
|
|
115
|
+
❌ "feat: Added new feature." # Period at end, "Added" not imperative
|
|
116
|
+
❌ "WIP" # No type, not descriptive
|
|
117
|
+
❌ "Update files" # No type, too vague
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Hook Implementation Patterns
|
|
121
|
+
|
|
122
|
+
### Node.js Implementation (Recommended)
|
|
123
|
+
|
|
124
|
+
**Shell Wrapper** (`.git/hooks/commit-msg`):
|
|
125
|
+
```bash
|
|
126
|
+
#!/bin/sh
|
|
127
|
+
|
|
128
|
+
# Find Node.js executable (cross-platform)
|
|
129
|
+
NODE_PATH=""
|
|
130
|
+
if command -v node >/dev/null 2>&1; then
|
|
131
|
+
NODE_PATH="node"
|
|
132
|
+
elif [ -f "/c/Program Files/nodejs/node.exe" ]; then
|
|
133
|
+
NODE_PATH="/c/Program Files/nodejs/node.exe"
|
|
134
|
+
elif [ -f "/usr/bin/node" ]; then
|
|
135
|
+
NODE_PATH="/usr/bin/node"
|
|
136
|
+
else
|
|
137
|
+
echo "Error: Node.js not found"
|
|
138
|
+
exit 1
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
# Execute Node.js script with commit message file path
|
|
142
|
+
"$NODE_PATH" "$(dirname "$0")/commit-msg.js" "$1"
|
|
143
|
+
exit $?
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Node.js Script** (`.git/hooks/commit-msg.js`):
|
|
147
|
+
```javascript
|
|
148
|
+
#!/usr/bin/env node
|
|
149
|
+
|
|
150
|
+
const fs = require('fs');
|
|
151
|
+
|
|
152
|
+
// Conventional commit pattern
|
|
153
|
+
const PATTERN = /^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .{1,50}$/;
|
|
154
|
+
|
|
155
|
+
const TYPES = {
|
|
156
|
+
feat: 'A new feature',
|
|
157
|
+
fix: 'A bug fix',
|
|
158
|
+
docs: 'Documentation only changes',
|
|
159
|
+
style: 'Code style changes (formatting, semicolons, etc.)',
|
|
160
|
+
refactor: 'Code refactor without fixing bugs or adding features',
|
|
161
|
+
perf: 'Performance improvement',
|
|
162
|
+
test: 'Adding or updating tests',
|
|
163
|
+
build: 'Changes to build system or dependencies',
|
|
164
|
+
ci: 'Changes to CI configuration',
|
|
165
|
+
chore: 'Other changes (tooling, etc.)',
|
|
166
|
+
revert: 'Reverts a previous commit',
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
function validateCommitMessage(message) {
|
|
170
|
+
const lines = message.split('\n');
|
|
171
|
+
const subject = lines[0];
|
|
172
|
+
|
|
173
|
+
// Check if matches conventional commit format
|
|
174
|
+
if (!PATTERN.test(subject)) {
|
|
175
|
+
return {
|
|
176
|
+
valid: false,
|
|
177
|
+
errors: [
|
|
178
|
+
'Commit message does not follow Conventional Commits format.',
|
|
179
|
+
'',
|
|
180
|
+
'Expected format: <type>(<scope>): <subject>',
|
|
181
|
+
'',
|
|
182
|
+
'Valid types:',
|
|
183
|
+
...Object.entries(TYPES).map(([type, desc]) => ` ${type.padEnd(10)} - ${desc}`),
|
|
184
|
+
'',
|
|
185
|
+
'Examples:',
|
|
186
|
+
' feat: add user authentication',
|
|
187
|
+
' fix(api): resolve null pointer exception',
|
|
188
|
+
' docs: update README with installation steps',
|
|
189
|
+
'',
|
|
190
|
+
'Your message:',
|
|
191
|
+
` "${subject}"`,
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Check subject length
|
|
197
|
+
if (subject.length > 72) {
|
|
198
|
+
return {
|
|
199
|
+
valid: false,
|
|
200
|
+
errors: [
|
|
201
|
+
`Subject line too long (${subject.length} > 72 characters)`,
|
|
202
|
+
'Keep the subject line concise and under 72 characters.',
|
|
203
|
+
],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Check for period at end
|
|
208
|
+
if (subject.endsWith('.')) {
|
|
209
|
+
return {
|
|
210
|
+
valid: false,
|
|
211
|
+
errors: [
|
|
212
|
+
'Subject line should not end with a period.',
|
|
213
|
+
'',
|
|
214
|
+
'Correct format:',
|
|
215
|
+
` ${subject.slice(0, -1)}`,
|
|
216
|
+
],
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Check for capital letter after colon
|
|
221
|
+
const colonIndex = subject.indexOf(':');
|
|
222
|
+
if (colonIndex !== -1 && subject[colonIndex + 2] && subject[colonIndex + 2] !== subject[colonIndex + 2].toLowerCase()) {
|
|
223
|
+
return {
|
|
224
|
+
valid: false,
|
|
225
|
+
errors: [
|
|
226
|
+
'Subject should start with lowercase letter after colon.',
|
|
227
|
+
'',
|
|
228
|
+
'Correct format:',
|
|
229
|
+
` ${subject.slice(0, colonIndex + 2)}${subject[colonIndex + 2].toLowerCase()}${subject.slice(colonIndex + 3)}`,
|
|
230
|
+
],
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return { valid: true };
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function main() {
|
|
238
|
+
const messageFile = process.argv[2];
|
|
239
|
+
|
|
240
|
+
if (!messageFile) {
|
|
241
|
+
console.error('❌ No commit message file provided');
|
|
242
|
+
process.exit(1);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const message = fs.readFileSync(messageFile, 'utf-8').trim();
|
|
246
|
+
|
|
247
|
+
// Skip validation for merge commits, revert commits, etc.
|
|
248
|
+
if (message.startsWith('Merge') || message.startsWith('Revert')) {
|
|
249
|
+
process.exit(0);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const result = validateCommitMessage(message);
|
|
253
|
+
|
|
254
|
+
if (!result.valid) {
|
|
255
|
+
console.error('\n❌ Invalid commit message!\n');
|
|
256
|
+
console.error(result.errors.join('\n'));
|
|
257
|
+
console.error('\n💡 Use --no-verify to skip validation (not recommended)\n');
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
console.log('✅ Commit message valid');
|
|
262
|
+
process.exit(0);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
main();
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Shell-Only Implementation (Simple)
|
|
269
|
+
|
|
270
|
+
**`.git/hooks/commit-msg`**:
|
|
271
|
+
```bash
|
|
272
|
+
#!/bin/sh
|
|
273
|
+
|
|
274
|
+
# Read commit message
|
|
275
|
+
MESSAGE=$(cat "$1")
|
|
276
|
+
|
|
277
|
+
# Skip merge commits
|
|
278
|
+
if echo "$MESSAGE" | grep -q "^Merge"; then
|
|
279
|
+
exit 0
|
|
280
|
+
fi
|
|
281
|
+
|
|
282
|
+
# Check conventional commit format
|
|
283
|
+
if ! echo "$MESSAGE" | grep -qE "^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?: .{1,50}"; then
|
|
284
|
+
echo ""
|
|
285
|
+
echo "❌ Invalid commit message format!"
|
|
286
|
+
echo ""
|
|
287
|
+
echo "Expected: <type>(<scope>): <subject>"
|
|
288
|
+
echo ""
|
|
289
|
+
echo "Valid types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert"
|
|
290
|
+
echo ""
|
|
291
|
+
echo "Examples:"
|
|
292
|
+
echo " feat: add user authentication"
|
|
293
|
+
echo " fix(api): resolve null pointer"
|
|
294
|
+
echo " docs: update README"
|
|
295
|
+
echo ""
|
|
296
|
+
exit 1
|
|
297
|
+
fi
|
|
298
|
+
|
|
299
|
+
echo "✅ Commit message valid"
|
|
300
|
+
exit 0
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Advanced Validation Rules
|
|
304
|
+
|
|
305
|
+
### Check for Issue References
|
|
306
|
+
|
|
307
|
+
```javascript
|
|
308
|
+
function validateIssueReference(message, requiredForTypes = ['feat', 'fix']) {
|
|
309
|
+
const lines = message.split('\n');
|
|
310
|
+
const subject = lines[0];
|
|
311
|
+
const type = subject.match(/^([a-z]+)/)?.[1];
|
|
312
|
+
|
|
313
|
+
// Check if issue reference required for this type
|
|
314
|
+
if (requiredForTypes.includes(type)) {
|
|
315
|
+
const hasIssueRef = /(?:closes|fixes|resolves|refs?) #\d+/i.test(message);
|
|
316
|
+
|
|
317
|
+
if (!hasIssueRef) {
|
|
318
|
+
return {
|
|
319
|
+
valid: false,
|
|
320
|
+
errors: [
|
|
321
|
+
`Commit type '${type}' requires an issue reference.`,
|
|
322
|
+
'',
|
|
323
|
+
'Add to footer:',
|
|
324
|
+
' Closes #123',
|
|
325
|
+
' Fixes #456',
|
|
326
|
+
' Refs #789',
|
|
327
|
+
],
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return { valid: true };
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Check for Breaking Changes
|
|
337
|
+
|
|
338
|
+
```javascript
|
|
339
|
+
function validateBreakingChange(message) {
|
|
340
|
+
const hasBreakingIndicator = /^[a-z]+(\(.+\))?!:/.test(message);
|
|
341
|
+
const hasBreakingFooter = /BREAKING CHANGE:/m.test(message);
|
|
342
|
+
|
|
343
|
+
if (hasBreakingIndicator && !hasBreakingFooter) {
|
|
344
|
+
return {
|
|
345
|
+
valid: false,
|
|
346
|
+
errors: [
|
|
347
|
+
'Breaking change indicator (!) used but no BREAKING CHANGE footer found.',
|
|
348
|
+
'',
|
|
349
|
+
'Add to footer:',
|
|
350
|
+
' BREAKING CHANGE: description of what broke',
|
|
351
|
+
],
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return { valid: true };
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Check for Co-Authors
|
|
360
|
+
|
|
361
|
+
```javascript
|
|
362
|
+
function validateCoAuthors(message) {
|
|
363
|
+
const coAuthorLines = message.match(/^Co-authored-by: .+/gm) || [];
|
|
364
|
+
|
|
365
|
+
for (const line of coAuthorLines) {
|
|
366
|
+
// Validate email format
|
|
367
|
+
if (!/^Co-authored-by: .+ <.+@.+\..+>$/.test(line)) {
|
|
368
|
+
return {
|
|
369
|
+
valid: false,
|
|
370
|
+
errors: [
|
|
371
|
+
'Invalid Co-authored-by format.',
|
|
372
|
+
'',
|
|
373
|
+
'Expected format:',
|
|
374
|
+
' Co-authored-by: Name <email@example.com>',
|
|
375
|
+
'',
|
|
376
|
+
`Got: ${line}`,
|
|
377
|
+
],
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return { valid: true };
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Best Practices
|
|
387
|
+
|
|
388
|
+
### ✅ DO
|
|
389
|
+
|
|
390
|
+
1. **Keep subject line concise** (50 characters or less)
|
|
391
|
+
2. **Use imperative mood** ("add" not "added")
|
|
392
|
+
3. **Reference issues** in footer for feat/fix commits
|
|
393
|
+
4. **Document breaking changes** with BREAKING CHANGE footer
|
|
394
|
+
5. **Add body** for complex changes (explain why, not what)
|
|
395
|
+
6. **Use scopes** for multi-module projects
|
|
396
|
+
7. **Start with lowercase** after colon
|
|
397
|
+
|
|
398
|
+
### ❌ DON'T
|
|
399
|
+
|
|
400
|
+
1. **Don't end subject with period**
|
|
401
|
+
2. **Don't use past tense** ("added" or "adds")
|
|
402
|
+
3. **Don't be vague** ("fix stuff", "update files")
|
|
403
|
+
4. **Don't exceed 72 characters** in subject
|
|
404
|
+
5. **Don't mix multiple changes** in one commit
|
|
405
|
+
6. **Don't forget issue references** for bug fixes
|
|
406
|
+
7. **Don't capitalize** first word after colon
|
|
407
|
+
|
|
408
|
+
## Automated Commit Message Preparation
|
|
409
|
+
|
|
410
|
+
Use `prepare-commit-msg` hook to pre-populate message:
|
|
411
|
+
|
|
412
|
+
**`.git/hooks/prepare-commit-msg`**:
|
|
413
|
+
```bash
|
|
414
|
+
#!/bin/sh
|
|
415
|
+
|
|
416
|
+
# Get branch name
|
|
417
|
+
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
418
|
+
|
|
419
|
+
# Extract issue number from branch (e.g., feature/123-user-auth)
|
|
420
|
+
ISSUE=$(echo "$BRANCH" | grep -oE '[0-9]+' | head -1)
|
|
421
|
+
|
|
422
|
+
# Add issue reference if found
|
|
423
|
+
if [ -n "$ISSUE" ]; then
|
|
424
|
+
echo "" >> "$1"
|
|
425
|
+
echo "Refs #$ISSUE" >> "$1"
|
|
426
|
+
fi
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## Integration with Tools
|
|
430
|
+
|
|
431
|
+
### Commitlint (npm)
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
# Install
|
|
435
|
+
npm install --save-dev @commitlint/cli @commitlint/config-conventional
|
|
436
|
+
|
|
437
|
+
# Configure
|
|
438
|
+
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
|
|
439
|
+
|
|
440
|
+
# Create hook
|
|
441
|
+
echo "npx --no -- commitlint --edit \$1" > .git/hooks/commit-msg
|
|
442
|
+
chmod +x .git/hooks/commit-msg
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Husky + Commitlint
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
# Install
|
|
449
|
+
npm install --save-dev husky @commitlint/cli @commitlint/config-conventional
|
|
450
|
+
|
|
451
|
+
# Setup husky
|
|
452
|
+
npx husky init
|
|
453
|
+
|
|
454
|
+
# Add commit-msg hook
|
|
455
|
+
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## Troubleshooting
|
|
459
|
+
|
|
460
|
+
### Hook Not Running
|
|
461
|
+
|
|
462
|
+
**Solutions**:
|
|
463
|
+
1. Check permissions: `chmod +x .git/hooks/commit-msg`
|
|
464
|
+
2. Verify shebang: `#!/bin/sh`
|
|
465
|
+
3. Check file location: Must be `.git/hooks/commit-msg` (no extension)
|
|
466
|
+
|
|
467
|
+
### False Positives
|
|
468
|
+
|
|
469
|
+
**Issue**: Valid messages rejected
|
|
470
|
+
|
|
471
|
+
**Solutions**:
|
|
472
|
+
1. Adjust regex pattern for your team's conventions
|
|
473
|
+
2. Add exceptions for specific message patterns
|
|
474
|
+
3. Allow more types if needed (e.g., `wip`, `hotfix`)
|
|
475
|
+
|
|
476
|
+
### Merge Commits Failing
|
|
477
|
+
|
|
478
|
+
**Issue**: Merge commit messages rejected
|
|
479
|
+
|
|
480
|
+
**Solution**: Skip validation for merge commits:
|
|
481
|
+
```javascript
|
|
482
|
+
if (message.startsWith('Merge') || message.startsWith('Revert')) {
|
|
483
|
+
process.exit(0);
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
## Emergency Bypass
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
# Skip commit-msg validation
|
|
491
|
+
git commit --no-verify -m "Emergency fix"
|
|
492
|
+
|
|
493
|
+
# Or use environment variable
|
|
494
|
+
HUSKY_SKIP_HOOKS=1 git commit -m "message"
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
## Integration with Rulebook
|
|
498
|
+
|
|
499
|
+
If using `@hivehub/rulebook`, commit-msg hooks are automatically generated:
|
|
500
|
+
|
|
501
|
+
```bash
|
|
502
|
+
# Initialize with hooks
|
|
503
|
+
npx @hivehub/rulebook init
|
|
504
|
+
|
|
505
|
+
# Configuration in .rulebook
|
|
506
|
+
{
|
|
507
|
+
"hooks": {
|
|
508
|
+
"commitMsg": {
|
|
509
|
+
"enabled": true,
|
|
510
|
+
"enforceConventional": true,
|
|
511
|
+
"requireIssueRef": ["feat", "fix"]
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
## Common Pitfalls
|
|
518
|
+
|
|
519
|
+
1. **❌ Too strict validation**: Allow flexibility for trivial commits
|
|
520
|
+
2. **❌ No escape hatch**: Always allow `--no-verify`
|
|
521
|
+
3. **❌ Blocking merge commits**: Skip validation for merge/revert
|
|
522
|
+
4. **❌ Unclear error messages**: Show examples of valid format
|
|
523
|
+
5. **❌ Not documenting conventions**: Add CONTRIBUTING.md with examples
|
|
524
|
+
|
|
525
|
+
## Related Templates
|
|
526
|
+
|
|
527
|
+
- See `/rulebook/PRE_COMMIT.md` for quality checks before commit
|
|
528
|
+
- See `/rulebook/PREPARE_COMMIT_MSG.md` for auto-generating commit messages
|
|
529
|
+
- See `/rulebook/GIT.md` for git workflow and commit conventions
|
|
530
|
+
- See `/rulebook/DOCUMENTATION_RULES.md` for changelog generation from commits
|