@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,333 @@
|
|
|
1
|
+
<!-- C:START -->
|
|
2
|
+
# C Project Rules
|
|
3
|
+
|
|
4
|
+
## Agent Automation Commands
|
|
5
|
+
|
|
6
|
+
**CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Complete quality check sequence:
|
|
10
|
+
clang-format --dry-run --Werror src/**/*.c # Format check
|
|
11
|
+
make lint # Linting (if configured)
|
|
12
|
+
make test # All tests (100% pass)
|
|
13
|
+
make # Build verification
|
|
14
|
+
|
|
15
|
+
# Memory safety (recommended):
|
|
16
|
+
valgrind --leak-check=full ./build/test # Memory leak check
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## C Configuration
|
|
20
|
+
|
|
21
|
+
**CRITICAL**: Use C11 or C17 standard with strict warnings enabled.
|
|
22
|
+
|
|
23
|
+
- **Standard**: C11 or C17
|
|
24
|
+
- **Compiler**: GCC 11+ or Clang 14+
|
|
25
|
+
- **Build System**: CMake 3.20+ (recommended) or Make
|
|
26
|
+
- **Warnings**: Treat all warnings as errors
|
|
27
|
+
- **Sanitizers**: ASAN, UBSAN for memory safety
|
|
28
|
+
|
|
29
|
+
### CMakeLists.txt Requirements
|
|
30
|
+
|
|
31
|
+
```cmake
|
|
32
|
+
cmake_minimum_required(VERSION 3.20)
|
|
33
|
+
project(YourProject C)
|
|
34
|
+
|
|
35
|
+
set(CMAKE_C_STANDARD 17)
|
|
36
|
+
set(CMAKE_C_STANDARD_REQUIRED ON)
|
|
37
|
+
set(CMAKE_C_EXTENSIONS OFF)
|
|
38
|
+
|
|
39
|
+
# Compiler warnings
|
|
40
|
+
if(MSVC)
|
|
41
|
+
add_compile_options(/W4 /WX)
|
|
42
|
+
else()
|
|
43
|
+
add_compile_options(-Wall -Wextra -Werror -pedantic)
|
|
44
|
+
endif()
|
|
45
|
+
|
|
46
|
+
# Enable sanitizers in Debug mode
|
|
47
|
+
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
48
|
+
add_compile_options(-fsanitize=address,undefined)
|
|
49
|
+
add_link_options(-fsanitize=address,undefined)
|
|
50
|
+
endif()
|
|
51
|
+
|
|
52
|
+
# Source files
|
|
53
|
+
add_executable(${PROJECT_NAME} src/main.c src/module.c)
|
|
54
|
+
|
|
55
|
+
# Include directories
|
|
56
|
+
target_include_directories(${PROJECT_NAME} PUBLIC include)
|
|
57
|
+
|
|
58
|
+
# Enable testing
|
|
59
|
+
enable_testing()
|
|
60
|
+
add_subdirectory(tests)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Code Quality Standards
|
|
64
|
+
|
|
65
|
+
### Mandatory Quality Checks
|
|
66
|
+
|
|
67
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
68
|
+
|
|
69
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
73
|
+
|
|
74
|
+
# 1. Format check (matches workflow - use --dry-run, not -i!)
|
|
75
|
+
clang-format --dry-run --Werror src/**/*.c include/**/*.h tests/**/*.c
|
|
76
|
+
|
|
77
|
+
# 2. Static analysis (matches workflow)
|
|
78
|
+
clang-tidy src/**/*.c -- -std=c17 -Wall -Wextra -Werror
|
|
79
|
+
|
|
80
|
+
# 3. Build with warnings as errors (matches workflow)
|
|
81
|
+
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Werror -Wall -Wextra -pedantic"
|
|
82
|
+
cmake --build build
|
|
83
|
+
|
|
84
|
+
# 4. Run all tests (MUST pass 100% - matches workflow)
|
|
85
|
+
ctest --test-dir build --output-on-failure --verbose
|
|
86
|
+
|
|
87
|
+
# 5. Check with Address Sanitizer (matches workflow)
|
|
88
|
+
cmake -B build-asan -DCMAKE_BUILD_TYPE=Debug \
|
|
89
|
+
-DCMAKE_C_FLAGS="-fsanitize=address,undefined -g"
|
|
90
|
+
cmake --build build-asan
|
|
91
|
+
ctest --test-dir build-asan --output-on-failure
|
|
92
|
+
|
|
93
|
+
# 6. Check with Valgrind (matches workflow)
|
|
94
|
+
valgrind --leak-check=full --error-exitcode=1 ./build/YourProject
|
|
95
|
+
|
|
96
|
+
# 7. Check coverage (matches workflow)
|
|
97
|
+
cmake -B build-cov -DCMAKE_BUILD_TYPE=Coverage \
|
|
98
|
+
-DCMAKE_C_FLAGS="-fprofile-arcs -ftest-coverage"
|
|
99
|
+
cmake --build build-cov
|
|
100
|
+
ctest --test-dir build-cov
|
|
101
|
+
gcov build-cov/CMakeFiles/YourProject.dir/src/*.gcno
|
|
102
|
+
lcov --capture --directory build-cov --output-file coverage.info
|
|
103
|
+
lcov --list coverage.info
|
|
104
|
+
|
|
105
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
109
|
+
|
|
110
|
+
**Why This Matters:**
|
|
111
|
+
- Running different commands locally than in CI causes "works on my machine" failures
|
|
112
|
+
- CI/CD failures happen when local checks differ from workflows
|
|
113
|
+
- Example: Using `clang-format -i` locally but `--dry-run --Werror` in CI = failure
|
|
114
|
+
- Example: Missing `-Werror` flag = warnings pass locally but fail in CI
|
|
115
|
+
- Example: Skipping sanitizers locally = CI catches memory bugs, use-after-free, buffer overflows
|
|
116
|
+
- Example: Not running Valgrind = memory leaks pass locally but fail in CI
|
|
117
|
+
|
|
118
|
+
### Formatting
|
|
119
|
+
|
|
120
|
+
- Use clang-format for consistent code style
|
|
121
|
+
- Configuration in `.clang-format`
|
|
122
|
+
- Check formatting in CI (don't auto-format)
|
|
123
|
+
|
|
124
|
+
Example `.clang-format`:
|
|
125
|
+
```yaml
|
|
126
|
+
Language: C
|
|
127
|
+
BasedOnStyle: LLVM
|
|
128
|
+
IndentWidth: 4
|
|
129
|
+
ColumnLimit: 100
|
|
130
|
+
AllowShortFunctionsOnASingleLine: Empty
|
|
131
|
+
BreakBeforeBraces: Attach
|
|
132
|
+
AlignConsecutiveMacros: true
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Static Analysis
|
|
136
|
+
|
|
137
|
+
- Use clang-tidy for static analysis
|
|
138
|
+
- Configuration in `.clang-tidy`
|
|
139
|
+
- Enable modernize and bugprone checks
|
|
140
|
+
|
|
141
|
+
Example `.clang-tidy`:
|
|
142
|
+
```yaml
|
|
143
|
+
Checks: >
|
|
144
|
+
-*,
|
|
145
|
+
bugprone-*,
|
|
146
|
+
clang-analyzer-*,
|
|
147
|
+
modernize-*,
|
|
148
|
+
readability-*,
|
|
149
|
+
performance-*,
|
|
150
|
+
portability-*
|
|
151
|
+
|
|
152
|
+
CheckOptions:
|
|
153
|
+
- key: readability-identifier-naming.FunctionCase
|
|
154
|
+
value: lower_case
|
|
155
|
+
- key: readability-identifier-naming.VariableCase
|
|
156
|
+
value: lower_case
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Testing
|
|
160
|
+
|
|
161
|
+
- **Framework**: Unity, Check, or CTest
|
|
162
|
+
- **Location**: `/tests` directory
|
|
163
|
+
- **Coverage**: Must meet threshold (80%+)
|
|
164
|
+
- **Sanitizers**: ASAN, UBSAN, Valgrind
|
|
165
|
+
- **Memory Safety**: Zero memory leaks
|
|
166
|
+
|
|
167
|
+
Example Unity test:
|
|
168
|
+
```c
|
|
169
|
+
#include "unity.h"
|
|
170
|
+
#include "module.h"
|
|
171
|
+
|
|
172
|
+
void setUp(void) {
|
|
173
|
+
// Setup before each test
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
void tearDown(void) {
|
|
177
|
+
// Cleanup after each test
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
void test_function_should_return_expected_value(void) {
|
|
181
|
+
int result = my_function(10);
|
|
182
|
+
TEST_ASSERT_EQUAL_INT(20, result);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
void test_function_should_handle_null_pointer(void) {
|
|
186
|
+
TEST_ASSERT_NULL(my_function_with_null(NULL));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
int main(void) {
|
|
190
|
+
UNITY_BEGIN();
|
|
191
|
+
RUN_TEST(test_function_should_return_expected_value);
|
|
192
|
+
RUN_TEST(test_function_should_handle_null_pointer);
|
|
193
|
+
return UNITY_END();
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Memory Safety
|
|
198
|
+
|
|
199
|
+
**CRITICAL**: Always check for memory issues.
|
|
200
|
+
|
|
201
|
+
### Required Checks
|
|
202
|
+
|
|
203
|
+
1. **Address Sanitizer (ASAN)**:
|
|
204
|
+
```bash
|
|
205
|
+
gcc -fsanitize=address -g -o program main.c
|
|
206
|
+
./program
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
2. **Undefined Behavior Sanitizer (UBSAN)**:
|
|
210
|
+
```bash
|
|
211
|
+
gcc -fsanitize=undefined -g -o program main.c
|
|
212
|
+
./program
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
3. **Valgrind**:
|
|
216
|
+
```bash
|
|
217
|
+
valgrind --leak-check=full --show-leak-kinds=all ./program
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
4. **Static Analysis**:
|
|
221
|
+
```bash
|
|
222
|
+
clang-tidy src/**/*.c
|
|
223
|
+
cppcheck --enable=all --error-exitcode=1 src/
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Common Memory Issues to Prevent
|
|
227
|
+
|
|
228
|
+
```c
|
|
229
|
+
// ❌ BAD: Memory leak
|
|
230
|
+
char *buffer = malloc(100);
|
|
231
|
+
// ... use buffer ...
|
|
232
|
+
// Missing free()
|
|
233
|
+
|
|
234
|
+
// ✅ GOOD: Proper cleanup
|
|
235
|
+
char *buffer = malloc(100);
|
|
236
|
+
if (buffer == NULL) {
|
|
237
|
+
return ERROR_NO_MEMORY;
|
|
238
|
+
}
|
|
239
|
+
// ... use buffer ...
|
|
240
|
+
free(buffer);
|
|
241
|
+
buffer = NULL;
|
|
242
|
+
|
|
243
|
+
// ❌ BAD: Use after free
|
|
244
|
+
char *ptr = malloc(10);
|
|
245
|
+
free(ptr);
|
|
246
|
+
strcpy(ptr, "test"); // UNDEFINED BEHAVIOR!
|
|
247
|
+
|
|
248
|
+
// ✅ GOOD: NULL after free
|
|
249
|
+
char *ptr = malloc(10);
|
|
250
|
+
free(ptr);
|
|
251
|
+
ptr = NULL;
|
|
252
|
+
if (ptr != NULL) {
|
|
253
|
+
strcpy(ptr, "test");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// ❌ BAD: Buffer overflow
|
|
257
|
+
char buffer[10];
|
|
258
|
+
strcpy(buffer, "This is too long"); // BUFFER OVERFLOW!
|
|
259
|
+
|
|
260
|
+
// ✅ GOOD: Bounds checking
|
|
261
|
+
char buffer[10];
|
|
262
|
+
strncpy(buffer, "Safe", sizeof(buffer) - 1);
|
|
263
|
+
buffer[sizeof(buffer) - 1] = '\0';
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Best Practices
|
|
267
|
+
|
|
268
|
+
### DO's ✅
|
|
269
|
+
|
|
270
|
+
- **CHECK** return values from all functions
|
|
271
|
+
- **VALIDATE** all pointer arguments for NULL
|
|
272
|
+
- **FREE** all allocated memory
|
|
273
|
+
- **USE** const for immutable pointers
|
|
274
|
+
- **LIMIT** variable scope
|
|
275
|
+
- **ZERO** memory after free for security
|
|
276
|
+
- **BOUNDS** check all array accesses
|
|
277
|
+
- **SANITIZE** all inputs
|
|
278
|
+
|
|
279
|
+
### DON'Ts ❌
|
|
280
|
+
|
|
281
|
+
- **NEVER** ignore compiler warnings
|
|
282
|
+
- **NEVER** assume malloc succeeds
|
|
283
|
+
- **NEVER** use gets() (use fgets())
|
|
284
|
+
- **NEVER** use strcpy() (use strncpy() or strlcpy())
|
|
285
|
+
- **NEVER** use sprintf() (use snprintf())
|
|
286
|
+
- **NEVER** dereference NULL pointers
|
|
287
|
+
- **NEVER** return pointers to stack variables
|
|
288
|
+
- **NEVER** skip sanitizer checks
|
|
289
|
+
|
|
290
|
+
## Security Guidelines
|
|
291
|
+
|
|
292
|
+
1. **Input Validation**: Validate all external inputs
|
|
293
|
+
2. **Buffer Safety**: Always check bounds
|
|
294
|
+
3. **Integer Overflow**: Check arithmetic operations
|
|
295
|
+
4. **Format String**: Never use user input as format string
|
|
296
|
+
5. **Memory Zeroization**: Zero sensitive data after use
|
|
297
|
+
|
|
298
|
+
Example secure code:
|
|
299
|
+
```c
|
|
300
|
+
#include <string.h>
|
|
301
|
+
#include <stdlib.h>
|
|
302
|
+
#include <stdio.h>
|
|
303
|
+
|
|
304
|
+
// Secure string copy with bounds checking
|
|
305
|
+
int safe_strcpy(char *dest, size_t dest_size, const char *src) {
|
|
306
|
+
if (dest == NULL || src == NULL || dest_size == 0) {
|
|
307
|
+
return -1;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
size_t src_len = strlen(src);
|
|
311
|
+
if (src_len >= dest_size) {
|
|
312
|
+
return -1; // Not enough space
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
strncpy(dest, src, dest_size - 1);
|
|
316
|
+
dest[dest_size - 1] = '\0';
|
|
317
|
+
return 0;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Secure memory cleanup
|
|
321
|
+
void secure_free(void **ptr, size_t size) {
|
|
322
|
+
if (ptr == NULL || *ptr == NULL) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Zero memory before free
|
|
327
|
+
memset(*ptr, 0, size);
|
|
328
|
+
free(*ptr);
|
|
329
|
+
*ptr = NULL;
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
<!-- C:END -->
|