@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,417 @@
|
|
|
1
|
+
<!-- CSHARP: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
|
+
dotnet format --verify-no-changes # Format check
|
|
11
|
+
dotnet build # Build + compile check
|
|
12
|
+
dotnet test # All tests (100% pass)
|
|
13
|
+
dotnet test --collect:"XPlat Code Coverage" # Coverage (95%+ required)
|
|
14
|
+
|
|
15
|
+
# Security audit:
|
|
16
|
+
dotnet list package --vulnerable # Vulnerability scan
|
|
17
|
+
dotnet list package --outdated # Check outdated deps
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## C# Configuration
|
|
21
|
+
|
|
22
|
+
**CRITICAL**: Use .NET 8+ with C# 12+.
|
|
23
|
+
|
|
24
|
+
- **Version**: .NET 8.0+
|
|
25
|
+
- **C# Version**: 12+
|
|
26
|
+
- **Target**: net8.0
|
|
27
|
+
- **Nullable**: Enabled
|
|
28
|
+
- **LangVersion**: latest
|
|
29
|
+
|
|
30
|
+
### Project File Requirements
|
|
31
|
+
|
|
32
|
+
```xml
|
|
33
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
34
|
+
<PropertyGroup>
|
|
35
|
+
<TargetFramework>net8.0</TargetFramework>
|
|
36
|
+
<LangVersion>latest</LangVersion>
|
|
37
|
+
<Nullable>enable</Nullable>
|
|
38
|
+
<ImplicitUsings>enable</ImplicitUsings>
|
|
39
|
+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
40
|
+
<AnalysisMode>All</AnalysisMode>
|
|
41
|
+
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
|
42
|
+
|
|
43
|
+
<!-- Package Metadata -->
|
|
44
|
+
<PackageId>Your.Package.Name</PackageId>
|
|
45
|
+
<Version>1.0.0</Version>
|
|
46
|
+
<Authors>Your Name</Authors>
|
|
47
|
+
<Company>Your Company</Company>
|
|
48
|
+
<Description>A short description of your package</Description>
|
|
49
|
+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
|
50
|
+
<PackageProjectUrl>https://github.com/your-org/your-project</PackageProjectUrl>
|
|
51
|
+
<RepositoryUrl>https://github.com/your-org/your-project</RepositoryUrl>
|
|
52
|
+
<RepositoryType>git</RepositoryType>
|
|
53
|
+
<PackageTags>your;tags</PackageTags>
|
|
54
|
+
|
|
55
|
+
<!-- Documentation -->
|
|
56
|
+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
|
57
|
+
<NoWarn>$(NoWarn);1591</NoWarn>
|
|
58
|
+
</PropertyGroup>
|
|
59
|
+
|
|
60
|
+
<ItemGroup>
|
|
61
|
+
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0">
|
|
62
|
+
<PrivateAssets>all</PrivateAssets>
|
|
63
|
+
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
|
64
|
+
</PackageReference>
|
|
65
|
+
</ItemGroup>
|
|
66
|
+
</Project>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Code Quality Standards
|
|
70
|
+
|
|
71
|
+
### Mandatory Quality Checks
|
|
72
|
+
|
|
73
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
74
|
+
|
|
75
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
79
|
+
|
|
80
|
+
# 1. Format check (matches workflow - use --verify-no-changes!)
|
|
81
|
+
dotnet format --verify-no-changes
|
|
82
|
+
|
|
83
|
+
# 2. Build (MUST pass with no warnings - matches workflow)
|
|
84
|
+
dotnet build --no-incremental --warnaserror
|
|
85
|
+
|
|
86
|
+
# 3. Run all tests (MUST pass 100% - matches workflow)
|
|
87
|
+
dotnet test --no-build
|
|
88
|
+
|
|
89
|
+
# 4. Check coverage (MUST meet threshold)
|
|
90
|
+
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
|
|
91
|
+
|
|
92
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
96
|
+
|
|
97
|
+
**Why This Matters:**
|
|
98
|
+
- CI/CD failures happen when local commands differ from workflows
|
|
99
|
+
- Example: Using `dotnet format` locally but `dotnet format --verify-no-changes` in CI = failure
|
|
100
|
+
- Example: Missing `--warnaserror` flag = warnings pass locally but fail in CI
|
|
101
|
+
|
|
102
|
+
### Code Style
|
|
103
|
+
|
|
104
|
+
Use `.editorconfig` for consistent code style:
|
|
105
|
+
|
|
106
|
+
```ini
|
|
107
|
+
root = true
|
|
108
|
+
|
|
109
|
+
[*]
|
|
110
|
+
charset = utf-8
|
|
111
|
+
indent_style = space
|
|
112
|
+
indent_size = 4
|
|
113
|
+
insert_final_newline = true
|
|
114
|
+
trim_trailing_whitespace = true
|
|
115
|
+
|
|
116
|
+
[*.{cs,csx,vb,vbx}]
|
|
117
|
+
indent_size = 4
|
|
118
|
+
|
|
119
|
+
# C# Code Style Rules
|
|
120
|
+
[*.cs]
|
|
121
|
+
# Organize usings
|
|
122
|
+
dotnet_sort_system_directives_first = true
|
|
123
|
+
dotnet_separate_import_directive_groups = false
|
|
124
|
+
|
|
125
|
+
# this. preferences
|
|
126
|
+
dotnet_style_qualification_for_field = false:warning
|
|
127
|
+
dotnet_style_qualification_for_property = false:warning
|
|
128
|
+
dotnet_style_qualification_for_method = false:warning
|
|
129
|
+
dotnet_style_qualification_for_event = false:warning
|
|
130
|
+
|
|
131
|
+
# Language keywords vs BCL types preferences
|
|
132
|
+
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
|
|
133
|
+
dotnet_style_predefined_type_for_member_access = true:warning
|
|
134
|
+
|
|
135
|
+
# Modifier preferences
|
|
136
|
+
dotnet_style_require_accessibility_modifiers = always:warning
|
|
137
|
+
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning
|
|
138
|
+
|
|
139
|
+
# Expression preferences
|
|
140
|
+
csharp_style_var_for_built_in_types = true:warning
|
|
141
|
+
csharp_style_var_when_type_is_apparent = true:warning
|
|
142
|
+
csharp_style_var_elsewhere = true:warning
|
|
143
|
+
|
|
144
|
+
# Pattern matching
|
|
145
|
+
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
|
|
146
|
+
csharp_style_pattern_matching_over_as_with_null_check = true:warning
|
|
147
|
+
|
|
148
|
+
# Null-checking preferences
|
|
149
|
+
csharp_style_throw_expression = true:warning
|
|
150
|
+
csharp_style_conditional_delegate_call = true:warning
|
|
151
|
+
|
|
152
|
+
# Code block preferences
|
|
153
|
+
csharp_prefer_braces = true:warning
|
|
154
|
+
csharp_prefer_simple_using_statement = true:warning
|
|
155
|
+
|
|
156
|
+
# Naming conventions
|
|
157
|
+
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
|
|
158
|
+
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
|
159
|
+
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
|
160
|
+
|
|
161
|
+
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
|
|
162
|
+
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
|
163
|
+
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
|
164
|
+
|
|
165
|
+
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
|
|
166
|
+
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
|
167
|
+
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
|
168
|
+
|
|
169
|
+
# Symbol specifications
|
|
170
|
+
dotnet_naming_symbols.interface.applicable_kinds = interface
|
|
171
|
+
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
|
172
|
+
|
|
173
|
+
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
|
174
|
+
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
|
175
|
+
|
|
176
|
+
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
|
177
|
+
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
|
178
|
+
|
|
179
|
+
# Naming styles
|
|
180
|
+
dotnet_naming_style.begins_with_i.required_prefix = I
|
|
181
|
+
dotnet_naming_style.begins_with_i.required_suffix =
|
|
182
|
+
dotnet_naming_style.begins_with_i.word_separator =
|
|
183
|
+
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
|
184
|
+
|
|
185
|
+
dotnet_naming_style.pascal_case.required_prefix =
|
|
186
|
+
dotnet_naming_style.pascal_case.required_suffix =
|
|
187
|
+
dotnet_naming_style.pascal_case.word_separator =
|
|
188
|
+
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Testing
|
|
192
|
+
|
|
193
|
+
- **Framework**: xUnit (recommended) or NUnit
|
|
194
|
+
- **Location**: Separate test project
|
|
195
|
+
- **Coverage**: Coverlet
|
|
196
|
+
- **Coverage Threshold**: 95%+
|
|
197
|
+
|
|
198
|
+
Example test structure:
|
|
199
|
+
```csharp
|
|
200
|
+
using Xunit;
|
|
201
|
+
|
|
202
|
+
namespace YourProject.Tests;
|
|
203
|
+
|
|
204
|
+
public class MyClassTests
|
|
205
|
+
{
|
|
206
|
+
[Fact]
|
|
207
|
+
public void Process_ValidInput_ReturnsExpectedResult()
|
|
208
|
+
{
|
|
209
|
+
// Arrange
|
|
210
|
+
var sut = new MyClass();
|
|
211
|
+
var input = "test";
|
|
212
|
+
|
|
213
|
+
// Act
|
|
214
|
+
var result = sut.Process(input);
|
|
215
|
+
|
|
216
|
+
// Assert
|
|
217
|
+
Assert.Equal("TEST", result);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
[Theory]
|
|
221
|
+
[InlineData("")]
|
|
222
|
+
[InlineData(null)]
|
|
223
|
+
public void Process_InvalidInput_ThrowsArgumentException(string input)
|
|
224
|
+
{
|
|
225
|
+
// Arrange
|
|
226
|
+
var sut = new MyClass();
|
|
227
|
+
|
|
228
|
+
// Act & Assert
|
|
229
|
+
Assert.Throws<ArgumentException>(() => sut.Process(input));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Documentation
|
|
235
|
+
|
|
236
|
+
- Use XML documentation comments
|
|
237
|
+
- Document all public APIs
|
|
238
|
+
- Include `<summary>`, `<param>`, `<returns>`, `<exception>`
|
|
239
|
+
|
|
240
|
+
Example:
|
|
241
|
+
```csharp
|
|
242
|
+
namespace YourProject;
|
|
243
|
+
|
|
244
|
+
/// <summary>
|
|
245
|
+
/// Provides functionality for processing data.
|
|
246
|
+
/// </summary>
|
|
247
|
+
public class MyClass
|
|
248
|
+
{
|
|
249
|
+
/// <summary>
|
|
250
|
+
/// Processes the input string and converts it to uppercase.
|
|
251
|
+
/// </summary>
|
|
252
|
+
/// <param name="input">The input string to process.</param>
|
|
253
|
+
/// <returns>The processed string in uppercase.</returns>
|
|
254
|
+
/// <exception cref="ArgumentException">Thrown when input is null or empty.</exception>
|
|
255
|
+
/// <example>
|
|
256
|
+
/// <code>
|
|
257
|
+
/// var processor = new MyClass();
|
|
258
|
+
/// var result = processor.Process("hello");
|
|
259
|
+
/// // result is "HELLO"
|
|
260
|
+
/// </code>
|
|
261
|
+
/// </example>
|
|
262
|
+
public string Process(string input)
|
|
263
|
+
{
|
|
264
|
+
if (string.IsNullOrEmpty(input))
|
|
265
|
+
{
|
|
266
|
+
throw new ArgumentException("Input cannot be null or empty.", nameof(input));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return input.ToUpperInvariant();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Project Structure
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
project/
|
|
278
|
+
├── src/
|
|
279
|
+
│ └── YourProject/
|
|
280
|
+
│ ├── YourProject.csproj
|
|
281
|
+
│ ├── Class1.cs
|
|
282
|
+
│ └── ...
|
|
283
|
+
├── tests/
|
|
284
|
+
│ └── YourProject.Tests/
|
|
285
|
+
│ ├── YourProject.Tests.csproj
|
|
286
|
+
│ ├── Class1Tests.cs
|
|
287
|
+
│ └── ...
|
|
288
|
+
├── docs/ # Project documentation
|
|
289
|
+
├── .editorconfig # Code style configuration
|
|
290
|
+
├── Directory.Build.props # Shared MSBuild properties
|
|
291
|
+
├── Directory.Packages.props # Central package management
|
|
292
|
+
├── YourProject.sln # Solution file
|
|
293
|
+
├── README.md # Project overview (allowed in root)
|
|
294
|
+
├── CHANGELOG.md # Version history (allowed in root)
|
|
295
|
+
└── LICENSE # Project license (allowed in root)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## Nullable Reference Types
|
|
299
|
+
|
|
300
|
+
- Enable nullable reference types
|
|
301
|
+
- Use `?` for nullable types
|
|
302
|
+
- Use null-forgiving operator `!` sparingly
|
|
303
|
+
|
|
304
|
+
Example:
|
|
305
|
+
```csharp
|
|
306
|
+
public class UserService
|
|
307
|
+
{
|
|
308
|
+
private readonly ILogger<UserService> _logger;
|
|
309
|
+
|
|
310
|
+
public UserService(ILogger<UserService> logger)
|
|
311
|
+
{
|
|
312
|
+
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
public User? FindUser(string? username)
|
|
316
|
+
{
|
|
317
|
+
if (string.IsNullOrEmpty(username))
|
|
318
|
+
{
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Implementation
|
|
323
|
+
return new User { Username = username };
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
public User GetUser(string username)
|
|
327
|
+
{
|
|
328
|
+
var user = FindUser(username);
|
|
329
|
+
return user ?? throw new InvalidOperationException("User not found");
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## Async/Await Best Practices
|
|
335
|
+
|
|
336
|
+
- Use `async`/`await` for I/O operations
|
|
337
|
+
- Don't block on async code
|
|
338
|
+
- Use `ConfigureAwait(false)` in libraries
|
|
339
|
+
- Return `Task` or `ValueTask`
|
|
340
|
+
|
|
341
|
+
Example:
|
|
342
|
+
```csharp
|
|
343
|
+
public class DataService
|
|
344
|
+
{
|
|
345
|
+
private readonly HttpClient _httpClient;
|
|
346
|
+
|
|
347
|
+
public async Task<string> FetchDataAsync(string url, CancellationToken cancellationToken = default)
|
|
348
|
+
{
|
|
349
|
+
var response = await _httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false);
|
|
350
|
+
response.EnsureSuccessStatusCode();
|
|
351
|
+
|
|
352
|
+
return await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## CI/CD Requirements
|
|
358
|
+
|
|
359
|
+
Must include GitHub Actions workflows for:
|
|
360
|
+
|
|
361
|
+
1. **Testing** (`dotnet-test.yml`):
|
|
362
|
+
- Test on ubuntu-latest, windows-latest, macos-latest
|
|
363
|
+
- Test on .NET 8.0
|
|
364
|
+
- Upload coverage reports
|
|
365
|
+
|
|
366
|
+
2. **Linting** (`dotnet-lint.yml`):
|
|
367
|
+
- Format check: `dotnet format --verify-no-changes`
|
|
368
|
+
- Build: `dotnet build --no-incremental`
|
|
369
|
+
- Analyzers enabled
|
|
370
|
+
|
|
371
|
+
## Package Publication
|
|
372
|
+
|
|
373
|
+
### Publishing to NuGet
|
|
374
|
+
|
|
375
|
+
**Prerequisites:**
|
|
376
|
+
1. Create account at https://www.nuget.org
|
|
377
|
+
2. Generate API key from account settings
|
|
378
|
+
3. Add `NUGET_API_KEY` to GitHub repository secrets
|
|
379
|
+
|
|
380
|
+
**Publishing Workflow:**
|
|
381
|
+
|
|
382
|
+
1. Update version in .csproj
|
|
383
|
+
2. Update CHANGELOG.md
|
|
384
|
+
3. Run quality checks:
|
|
385
|
+
```bash
|
|
386
|
+
dotnet format --verify-no-changes
|
|
387
|
+
dotnet build --configuration Release
|
|
388
|
+
dotnet test --configuration Release
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
4. Pack: `dotnet pack --configuration Release`
|
|
392
|
+
5. Create git tag: `git tag v1.0.0 && git push --tags`
|
|
393
|
+
6. GitHub Actions automatically publishes to NuGet
|
|
394
|
+
7. Or manual publish: `dotnet nuget push bin/Release/*.nupkg --api-key $NUGET_API_KEY --source https://api.nuget.org/v3/index.json`
|
|
395
|
+
|
|
396
|
+
**Publishing Checklist:**
|
|
397
|
+
|
|
398
|
+
- ✅ All tests passing
|
|
399
|
+
- ✅ Code formatted (`dotnet format`)
|
|
400
|
+
- ✅ No build warnings
|
|
401
|
+
- ✅ Version updated in .csproj
|
|
402
|
+
- ✅ CHANGELOG.md updated
|
|
403
|
+
- ✅ README.md up to date
|
|
404
|
+
- ✅ LICENSE file present
|
|
405
|
+
- ✅ XML documentation generated
|
|
406
|
+
- ✅ Package metadata complete
|
|
407
|
+
- ✅ Verify with `dotnet pack`
|
|
408
|
+
|
|
409
|
+
**Semantic Versioning:**
|
|
410
|
+
|
|
411
|
+
Use `<Version>` in .csproj with SemVer:
|
|
412
|
+
- **MAJOR**: Breaking API changes
|
|
413
|
+
- **MINOR**: New features (backwards compatible)
|
|
414
|
+
- **PATCH**: Bug fixes (backwards compatible)
|
|
415
|
+
|
|
416
|
+
<!-- CSHARP:END -->
|
|
417
|
+
|