@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,332 @@
|
|
|
1
|
+
<!-- DART:START -->
|
|
2
|
+
# Dart 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
|
+
dart format --set-exit-if-changed . # Format check
|
|
11
|
+
dart analyze --fatal-infos # Linting + analysis
|
|
12
|
+
dart test # All tests (100% pass)
|
|
13
|
+
dart test --coverage=coverage # Coverage check
|
|
14
|
+
|
|
15
|
+
# Security audit:
|
|
16
|
+
dart pub outdated # Check outdated deps
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Dart Configuration
|
|
20
|
+
|
|
21
|
+
**CRITICAL**: Use Dart 3.0+ with sound null safety and strict analysis.
|
|
22
|
+
|
|
23
|
+
- **Version**: Dart 3.0+
|
|
24
|
+
- **Recommended**: Dart 3.3+
|
|
25
|
+
- **Null Safety**: Sound null safety required
|
|
26
|
+
- **Analysis**: dart analyze with strict mode
|
|
27
|
+
- **Testing**: package:test
|
|
28
|
+
|
|
29
|
+
### pubspec.yaml Requirements
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
name: your_package
|
|
33
|
+
description: A comprehensive package description
|
|
34
|
+
version: 0.1.0
|
|
35
|
+
homepage: https://github.com/you/your_package
|
|
36
|
+
|
|
37
|
+
environment:
|
|
38
|
+
sdk: '>=3.0.0 <4.0.0'
|
|
39
|
+
|
|
40
|
+
dependencies:
|
|
41
|
+
http: ^1.1.0
|
|
42
|
+
|
|
43
|
+
dev_dependencies:
|
|
44
|
+
test: ^1.24.0
|
|
45
|
+
lints: ^3.0.0
|
|
46
|
+
coverage: ^1.7.0
|
|
47
|
+
dart_code_metrics: ^5.7.0
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### analysis_options.yaml Requirements
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
include: package:lints/recommended.yaml
|
|
54
|
+
|
|
55
|
+
analyzer:
|
|
56
|
+
language:
|
|
57
|
+
strict-casts: true
|
|
58
|
+
strict-inference: true
|
|
59
|
+
strict-raw-types: true
|
|
60
|
+
|
|
61
|
+
errors:
|
|
62
|
+
invalid_annotation_target: error
|
|
63
|
+
missing_required_param: error
|
|
64
|
+
missing_return: error
|
|
65
|
+
|
|
66
|
+
exclude:
|
|
67
|
+
- build/**
|
|
68
|
+
- .dart_tool/**
|
|
69
|
+
|
|
70
|
+
linter:
|
|
71
|
+
rules:
|
|
72
|
+
- always_declare_return_types
|
|
73
|
+
- always_require_non_null_named_parameters
|
|
74
|
+
- avoid_print
|
|
75
|
+
- avoid_relative_lib_imports
|
|
76
|
+
- avoid_returning_null_for_void
|
|
77
|
+
- avoid_slow_async_io
|
|
78
|
+
- avoid_types_as_parameter_names
|
|
79
|
+
- cancel_subscriptions
|
|
80
|
+
- close_sinks
|
|
81
|
+
- prefer_const_constructors
|
|
82
|
+
- prefer_final_fields
|
|
83
|
+
- prefer_final_locals
|
|
84
|
+
- sort_constructors_first
|
|
85
|
+
- unawaited_futures
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Code Quality Standards
|
|
89
|
+
|
|
90
|
+
### Mandatory Quality Checks
|
|
91
|
+
|
|
92
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
93
|
+
|
|
94
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
98
|
+
|
|
99
|
+
# 1. Format check (matches workflow - use --set-exit-if-changed!)
|
|
100
|
+
dart format --set-exit-if-changed --line-length 100 .
|
|
101
|
+
|
|
102
|
+
# 2. Analyze (MUST pass with no issues - matches workflow)
|
|
103
|
+
dart analyze --fatal-infos --fatal-warnings
|
|
104
|
+
|
|
105
|
+
# 3. Run all tests (MUST pass 100% - matches workflow)
|
|
106
|
+
dart test
|
|
107
|
+
|
|
108
|
+
# 4. Check coverage (MUST meet threshold - matches workflow)
|
|
109
|
+
dart test --coverage=coverage
|
|
110
|
+
dart pub global activate coverage
|
|
111
|
+
dart pub global run coverage:format_coverage \
|
|
112
|
+
--lcov --in=coverage --out=coverage/lcov.info --report-on=lib
|
|
113
|
+
|
|
114
|
+
# 5. Metrics check (matches workflow)
|
|
115
|
+
dart pub global activate dart_code_metrics
|
|
116
|
+
dart pub global run dart_code_metrics:metrics analyze lib
|
|
117
|
+
|
|
118
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
122
|
+
|
|
123
|
+
**Why This Matters:**
|
|
124
|
+
- Running different commands locally than in CI causes "works on my machine" failures
|
|
125
|
+
- CI/CD workflows will fail if commands don't match
|
|
126
|
+
- Example: Using `dart format .` locally but `dart format --set-exit-if-changed` in CI = failure
|
|
127
|
+
- Example: Missing `--fatal-infos` flag = warnings pass locally but fail in CI
|
|
128
|
+
|
|
129
|
+
### Testing
|
|
130
|
+
|
|
131
|
+
- **Framework**: package:test
|
|
132
|
+
- **Location**: `/test` directory
|
|
133
|
+
- **Coverage**: package:coverage (80%+ threshold)
|
|
134
|
+
- **Naming**: test files must end with `_test.dart`
|
|
135
|
+
|
|
136
|
+
Example test structure:
|
|
137
|
+
```dart
|
|
138
|
+
import 'package:test/test.dart';
|
|
139
|
+
import 'package:your_package/your_package.dart';
|
|
140
|
+
|
|
141
|
+
void main() {
|
|
142
|
+
group('DataProcessor', () {
|
|
143
|
+
late DataProcessor processor;
|
|
144
|
+
|
|
145
|
+
setUp(() {
|
|
146
|
+
processor = DataProcessor(threshold: 0.5);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
tearDown(() {
|
|
150
|
+
// Cleanup
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test('processes valid input correctly', () {
|
|
154
|
+
final input = [1, 2, 3, 4, 5];
|
|
155
|
+
final result = processor.process(input);
|
|
156
|
+
|
|
157
|
+
expect(result, isNotEmpty);
|
|
158
|
+
expect(result.length, greaterThan(0));
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test('handles empty input', () {
|
|
162
|
+
final result = processor.process([]);
|
|
163
|
+
expect(result, isEmpty);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('throws on null input', () {
|
|
167
|
+
expect(
|
|
168
|
+
() => processor.process(null as List<int>),
|
|
169
|
+
throwsA(isA<ArgumentError>()),
|
|
170
|
+
);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
group('Validator', () {
|
|
175
|
+
test('validates correct data', () {
|
|
176
|
+
expect(Validator.isValid('test'), isTrue);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test('rejects invalid data', () {
|
|
180
|
+
expect(Validator.isValid(''), isFalse);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Null Safety
|
|
187
|
+
|
|
188
|
+
- **REQUIRED**: Sound null safety for all code
|
|
189
|
+
- Use `?` for nullable types
|
|
190
|
+
- Use `!` operator sparingly
|
|
191
|
+
- Prefer null-aware operators
|
|
192
|
+
|
|
193
|
+
Example:
|
|
194
|
+
```dart
|
|
195
|
+
// ✅ GOOD: Proper null safety
|
|
196
|
+
class User {
|
|
197
|
+
final String id;
|
|
198
|
+
final String name;
|
|
199
|
+
final String? email; // Nullable
|
|
200
|
+
final int? age; // Nullable
|
|
201
|
+
|
|
202
|
+
User({
|
|
203
|
+
required this.id,
|
|
204
|
+
required this.name,
|
|
205
|
+
this.email,
|
|
206
|
+
this.age,
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
String getDisplayName() {
|
|
210
|
+
return email != null ? '$name <$email>' : name;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
int getAgeOrDefault() => age ?? 0;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ❌ BAD: Unsafe null handling
|
|
217
|
+
class User {
|
|
218
|
+
String id;
|
|
219
|
+
String name;
|
|
220
|
+
String email; // Should be nullable but isn't
|
|
221
|
+
|
|
222
|
+
User(this.id, this.name, this.email);
|
|
223
|
+
|
|
224
|
+
String getDisplayName() {
|
|
225
|
+
return '$name <$email>'; // Crash if email is null!
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Async Programming
|
|
231
|
+
|
|
232
|
+
- Always use `async`/`await`
|
|
233
|
+
- Handle Future errors with try/catch
|
|
234
|
+
- Use `unawaited()` to mark intentionally unawaited futures
|
|
235
|
+
|
|
236
|
+
Example:
|
|
237
|
+
```dart
|
|
238
|
+
// ✅ GOOD: Proper async handling
|
|
239
|
+
Future<List<User>> fetchUsers() async {
|
|
240
|
+
try {
|
|
241
|
+
final response = await http.get(Uri.parse('https://api.example.com/users'));
|
|
242
|
+
|
|
243
|
+
if (response.statusCode != 200) {
|
|
244
|
+
throw HttpException('Failed to load users: ${response.statusCode}');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
final List<dynamic> data = jsonDecode(response.body);
|
|
248
|
+
return data.map((json) => User.fromJson(json)).toList();
|
|
249
|
+
} catch (e) {
|
|
250
|
+
print('Error fetching users: $e');
|
|
251
|
+
rethrow;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ❌ BAD: No error handling
|
|
256
|
+
Future<List<User>> fetchUsers() async {
|
|
257
|
+
final response = await http.get(Uri.parse('https://api.example.com/users'));
|
|
258
|
+
final List<dynamic> data = jsonDecode(response.body); // Could crash!
|
|
259
|
+
return data.map((json) => User.fromJson(json)).toList();
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Best Practices
|
|
264
|
+
|
|
265
|
+
### DO's ✅
|
|
266
|
+
|
|
267
|
+
- **USE** sound null safety
|
|
268
|
+
- **USE** const constructors when possible
|
|
269
|
+
- **PREFER** final for variables
|
|
270
|
+
- **DOCUMENT** public APIs
|
|
271
|
+
- **HANDLE** errors explicitly
|
|
272
|
+
- **TEST** all code paths
|
|
273
|
+
- **USE** meaningful names
|
|
274
|
+
- **FOLLOW** dart_style guidelines
|
|
275
|
+
|
|
276
|
+
### DON'Ts ❌
|
|
277
|
+
|
|
278
|
+
- **NEVER** use `dynamic` unless absolutely necessary
|
|
279
|
+
- **NEVER** suppress analyzer warnings without justification
|
|
280
|
+
- **NEVER** use `print()` in production code (use logging)
|
|
281
|
+
- **NEVER** ignore lint warnings
|
|
282
|
+
- **NEVER** use deprecated APIs
|
|
283
|
+
- **NEVER** commit with failing tests
|
|
284
|
+
- **NEVER** use `!` operator without null check
|
|
285
|
+
|
|
286
|
+
## CI/CD Requirements
|
|
287
|
+
|
|
288
|
+
Must include GitHub Actions workflows:
|
|
289
|
+
|
|
290
|
+
1. **Testing** (`dart-test.yml`):
|
|
291
|
+
- Test on ubuntu-latest, windows-latest, macos-latest
|
|
292
|
+
- Dart versions: stable, beta
|
|
293
|
+
- Upload coverage
|
|
294
|
+
|
|
295
|
+
2. **Linting** (`dart-lint.yml`):
|
|
296
|
+
- dart format --set-exit-if-changed
|
|
297
|
+
- dart analyze --fatal-infos --fatal-warnings
|
|
298
|
+
|
|
299
|
+
3. **Build** (`dart-build.yml`):
|
|
300
|
+
- dart compile exe (for CLI apps)
|
|
301
|
+
- Verify output artifacts
|
|
302
|
+
|
|
303
|
+
## Publishing to pub.dev
|
|
304
|
+
|
|
305
|
+
### Prerequisites
|
|
306
|
+
|
|
307
|
+
1. Create account at https://pub.dev
|
|
308
|
+
2. Run `dart pub login`
|
|
309
|
+
3. Verify package name available
|
|
310
|
+
|
|
311
|
+
### Publishing Workflow
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
# 1. Update version in pubspec.yaml
|
|
315
|
+
# 2. Update CHANGELOG.md
|
|
316
|
+
# 3. Run all quality checks
|
|
317
|
+
dart format --set-exit-if-changed .
|
|
318
|
+
dart analyze --fatal-infos --fatal-warnings
|
|
319
|
+
dart test
|
|
320
|
+
|
|
321
|
+
# 4. Dry run
|
|
322
|
+
dart pub publish --dry-run
|
|
323
|
+
|
|
324
|
+
# 5. Publish
|
|
325
|
+
dart pub publish
|
|
326
|
+
|
|
327
|
+
# 6. Create git tag
|
|
328
|
+
git tag -a v1.0.0 -m "Release 1.0.0"
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
<!-- DART:END -->
|
|
332
|
+
|