@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,348 @@
|
|
|
1
|
+
<!-- SCALA:START -->
|
|
2
|
+
# Scala 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
|
+
sbt scalafmtCheckAll # Format check
|
|
11
|
+
sbt scalafix --check # Linting
|
|
12
|
+
sbt compile # Compilation check
|
|
13
|
+
sbt test # All tests (100% pass)
|
|
14
|
+
sbt coverage # Coverage (95%+ required)
|
|
15
|
+
|
|
16
|
+
# Security audit:
|
|
17
|
+
sbt dependencyCheck # Vulnerability scan
|
|
18
|
+
sbt dependencyUpdates # Check outdated deps
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Scala Configuration
|
|
22
|
+
|
|
23
|
+
**CRITICAL**: Use Scala 3.x with modern tooling and strict compiler flags.
|
|
24
|
+
|
|
25
|
+
- **Version**: Scala 3.3+
|
|
26
|
+
- **Build Tool**: sbt 1.9+ or Mill 0.11+
|
|
27
|
+
- **Formatting**: scalafmt
|
|
28
|
+
- **Linting**: scalafix + Wartremover
|
|
29
|
+
- **Testing**: ScalaTest, MUnit, or Specs2
|
|
30
|
+
|
|
31
|
+
### build.sbt Requirements
|
|
32
|
+
|
|
33
|
+
```scala
|
|
34
|
+
ThisBuild / organization := "com.yourcompany"
|
|
35
|
+
ThisBuild / scalaVersion := "3.3.1"
|
|
36
|
+
ThisBuild / version := "0.1.0-SNAPSHOT"
|
|
37
|
+
|
|
38
|
+
lazy val root = (project in file("."))
|
|
39
|
+
.settings(
|
|
40
|
+
name := "your-project",
|
|
41
|
+
|
|
42
|
+
// Compiler options
|
|
43
|
+
scalacOptions ++= Seq(
|
|
44
|
+
"-encoding", "UTF-8",
|
|
45
|
+
"-feature",
|
|
46
|
+
"-language:implicitConversions",
|
|
47
|
+
"-unchecked",
|
|
48
|
+
"-Werror",
|
|
49
|
+
"-Wunused:all",
|
|
50
|
+
"-Wvalue-discard",
|
|
51
|
+
"-Xfatal-warnings"
|
|
52
|
+
),
|
|
53
|
+
|
|
54
|
+
// Dependencies
|
|
55
|
+
libraryDependencies ++= Seq(
|
|
56
|
+
"org.scala-lang" %% "scala3-library" % scalaVersion.value,
|
|
57
|
+
|
|
58
|
+
// Test dependencies
|
|
59
|
+
"org.scalatest" %% "scalatest" % "3.2.17" % Test,
|
|
60
|
+
"org.scalatestplus" %% "scalacheck-1-17" % "3.2.17.0" % Test
|
|
61
|
+
),
|
|
62
|
+
|
|
63
|
+
// Test configuration
|
|
64
|
+
Test / testOptions += Tests.Argument("-oDF"),
|
|
65
|
+
Test / parallelExecution := false,
|
|
66
|
+
|
|
67
|
+
// Coverage
|
|
68
|
+
coverageMinimumStmtTotal := 80,
|
|
69
|
+
coverageFailOnMinimum := true,
|
|
70
|
+
coverageHighlighting := true
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
// Plugins
|
|
74
|
+
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2")
|
|
75
|
+
addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.11.1")
|
|
76
|
+
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.9")
|
|
77
|
+
addSbtPlugin("org.wartremover" % "sbt-wartremover" % "3.1.6")
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Code Quality Standards
|
|
81
|
+
|
|
82
|
+
### Mandatory Quality Checks
|
|
83
|
+
|
|
84
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
85
|
+
|
|
86
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Pre-Commit Checklist - sbt (MUST match .github/workflows/*.yml)
|
|
90
|
+
|
|
91
|
+
# 1. Format check (matches workflow - use Check, not format!)
|
|
92
|
+
sbt scalafmtCheckAll scalafmtSbtCheck
|
|
93
|
+
|
|
94
|
+
# 2. Lint with scalafix (matches workflow - use --check!)
|
|
95
|
+
sbt "scalafixAll --check"
|
|
96
|
+
|
|
97
|
+
# 3. Compile with fatal warnings (matches workflow)
|
|
98
|
+
sbt clean compile Test/compile
|
|
99
|
+
|
|
100
|
+
# 4. Run Wartremover (matches workflow)
|
|
101
|
+
sbt wartremoverCheck
|
|
102
|
+
|
|
103
|
+
# 5. Run all tests (MUST pass 100% - matches workflow)
|
|
104
|
+
sbt test
|
|
105
|
+
|
|
106
|
+
# 6. Check coverage (MUST meet threshold - matches workflow)
|
|
107
|
+
sbt clean coverage test coverageReport
|
|
108
|
+
sbt coverageAggregate
|
|
109
|
+
|
|
110
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
114
|
+
|
|
115
|
+
**Why This Matters:**
|
|
116
|
+
- Running different commands locally than in CI causes "works on my machine" failures
|
|
117
|
+
- CI/CD workflows will fail if commands don't match
|
|
118
|
+
- Example: Using `scalafmtAll` locally but `scalafmtCheckAll` in CI = failure
|
|
119
|
+
- Example: Using `scalafixAll` (applies fixes) locally but `scalafixAll --check` in CI = failure
|
|
120
|
+
- Example: Missing `wartremoverCheck` locally = CI catches code quality issues
|
|
121
|
+
|
|
122
|
+
### Formatting with scalafmt
|
|
123
|
+
|
|
124
|
+
- Configuration in `.scalafmt.conf`
|
|
125
|
+
- Consistent formatting across project
|
|
126
|
+
- Check in CI (don't auto-format)
|
|
127
|
+
|
|
128
|
+
Example `.scalafmt.conf`:
|
|
129
|
+
```conf
|
|
130
|
+
version = "3.7.17"
|
|
131
|
+
runner.dialect = scala3
|
|
132
|
+
maxColumn = 100
|
|
133
|
+
align.preset = more
|
|
134
|
+
align.multiline = false
|
|
135
|
+
assumeStandardLibraryStripMargin = true
|
|
136
|
+
docstrings.style = Asterisk
|
|
137
|
+
lineEndings = unix
|
|
138
|
+
includeCurlyBraceInSelectChains = false
|
|
139
|
+
danglingParentheses.preset = true
|
|
140
|
+
spaces.inImportCurlyBraces = false
|
|
141
|
+
optIn.annotationNewlines = true
|
|
142
|
+
rewrite.rules = [
|
|
143
|
+
RedundantBraces,
|
|
144
|
+
RedundantParens,
|
|
145
|
+
PreferCurlyFors,
|
|
146
|
+
SortModifiers
|
|
147
|
+
]
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Linting with Scalafix
|
|
151
|
+
|
|
152
|
+
- Configuration in `.scalafix.conf`
|
|
153
|
+
- Enforce code quality rules
|
|
154
|
+
- Prevent common bugs
|
|
155
|
+
|
|
156
|
+
Example `.scalafix.conf`:
|
|
157
|
+
```conf
|
|
158
|
+
rules = [
|
|
159
|
+
DisableSyntax,
|
|
160
|
+
LeakingImplicitClassVal,
|
|
161
|
+
NoAutoTupling,
|
|
162
|
+
NoValInForComprehension,
|
|
163
|
+
ProcedureSyntax,
|
|
164
|
+
RemoveUnused
|
|
165
|
+
]
|
|
166
|
+
|
|
167
|
+
DisableSyntax.noVars = true
|
|
168
|
+
DisableSyntax.noThrows = true
|
|
169
|
+
DisableSyntax.noNulls = true
|
|
170
|
+
DisableSyntax.noReturns = true
|
|
171
|
+
DisableSyntax.noWhileLoops = true
|
|
172
|
+
DisableSyntax.noAsInstanceOf = true
|
|
173
|
+
DisableSyntax.noIsInstanceOf = true
|
|
174
|
+
DisableSyntax.noXml = true
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Testing
|
|
178
|
+
|
|
179
|
+
- **Framework**: ScalaTest (recommended), MUnit, or Specs2
|
|
180
|
+
- **Location**: `/src/test/scala` directory
|
|
181
|
+
- **Coverage**: sbt-scoverage (80%+ threshold)
|
|
182
|
+
- **Property Testing**: ScalaCheck
|
|
183
|
+
|
|
184
|
+
Example ScalaTest:
|
|
185
|
+
```scala
|
|
186
|
+
import org.scalatest.flatspec.AnyFlatSpec
|
|
187
|
+
import org.scalatest.matchers.should.Matchers
|
|
188
|
+
import org.scalatest.BeforeAndAfterEach
|
|
189
|
+
|
|
190
|
+
class DataProcessorSpec extends AnyFlatSpec with Matchers with BeforeAndAfterEach {
|
|
191
|
+
|
|
192
|
+
var processor: DataProcessor = _
|
|
193
|
+
|
|
194
|
+
override def beforeEach(): Unit = {
|
|
195
|
+
processor = new DataProcessor(threshold = 0.5)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
override def afterEach(): Unit = {
|
|
199
|
+
// Cleanup
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
"DataProcessor" should "process valid input correctly" in {
|
|
203
|
+
val input = List(1, 2, 3, 4, 5)
|
|
204
|
+
val result = processor.process(input)
|
|
205
|
+
|
|
206
|
+
result should not be empty
|
|
207
|
+
result.length should be > 0
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
it should "handle empty input" in {
|
|
211
|
+
val result = processor.process(List.empty)
|
|
212
|
+
result shouldBe empty
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
it should "throw exception on null input" in {
|
|
216
|
+
assertThrows[IllegalArgumentException] {
|
|
217
|
+
processor.process(null)
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Example with MUnit:
|
|
224
|
+
```scala
|
|
225
|
+
import munit.FunSuite
|
|
226
|
+
|
|
227
|
+
class DataProcessorSuite extends FunSuite {
|
|
228
|
+
|
|
229
|
+
test("process should handle valid input") {
|
|
230
|
+
val processor = new DataProcessor(threshold = 0.5)
|
|
231
|
+
val input = List(1, 2, 3)
|
|
232
|
+
val result = processor.process(input)
|
|
233
|
+
|
|
234
|
+
assert(result.nonEmpty)
|
|
235
|
+
assertEquals(result.length, 3)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
test("process should handle empty input") {
|
|
239
|
+
val processor = new DataProcessor(threshold = 0.5)
|
|
240
|
+
val result = processor.process(List.empty)
|
|
241
|
+
|
|
242
|
+
assert(result.isEmpty)
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Type Safety
|
|
248
|
+
|
|
249
|
+
- Use case classes for immutable data
|
|
250
|
+
- Leverage sealed traits for ADTs
|
|
251
|
+
- Use Option instead of null
|
|
252
|
+
- Pattern matching for control flow
|
|
253
|
+
|
|
254
|
+
Example:
|
|
255
|
+
```scala
|
|
256
|
+
// Sealed trait for ADT
|
|
257
|
+
sealed trait Result[+A]
|
|
258
|
+
case class Success[A](value: A) extends Result[A]
|
|
259
|
+
case class Failure(error: String) extends Result[Nothing]
|
|
260
|
+
|
|
261
|
+
// Case class for data
|
|
262
|
+
case class User(
|
|
263
|
+
id: String,
|
|
264
|
+
name: String,
|
|
265
|
+
email: Option[String] = None,
|
|
266
|
+
age: Option[Int] = None
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
// Pattern matching
|
|
270
|
+
def handleResult[A](result: Result[A]): String = result match {
|
|
271
|
+
case Success(value) => s"Got value: $value"
|
|
272
|
+
case Failure(error) => s"Error: $error"
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Option handling
|
|
276
|
+
def getUserEmail(user: User): String =
|
|
277
|
+
user.email.getOrElse("no-email@example.com")
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Functional Programming
|
|
281
|
+
|
|
282
|
+
- Prefer immutability
|
|
283
|
+
- Use pure functions
|
|
284
|
+
- Avoid side effects
|
|
285
|
+
- Use for-comprehensions for monadic operations
|
|
286
|
+
|
|
287
|
+
Example:
|
|
288
|
+
```scala
|
|
289
|
+
// ✅ GOOD: Immutable, pure functions
|
|
290
|
+
class DataProcessor(threshold: Double) {
|
|
291
|
+
def process(data: List[Int]): List[Int] =
|
|
292
|
+
data.filter(_ > threshold)
|
|
293
|
+
|
|
294
|
+
def transform(data: List[Int]): List[String] =
|
|
295
|
+
data.map(x => s"Value: $x")
|
|
296
|
+
|
|
297
|
+
def pipeline(data: List[Int]): List[String] = for {
|
|
298
|
+
filtered <- Some(process(data))
|
|
299
|
+
transformed <- Some(transform(filtered))
|
|
300
|
+
} yield transformed
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ❌ BAD: Mutable, impure
|
|
304
|
+
class DataProcessor(var threshold: Double) {
|
|
305
|
+
var results: List[Int] = List.empty // Mutable state!
|
|
306
|
+
|
|
307
|
+
def process(data: List[Int]): Unit = { // Side effect!
|
|
308
|
+
results = data.filter(_ > threshold)
|
|
309
|
+
println(results) // More side effects!
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
## CI/CD Requirements
|
|
315
|
+
|
|
316
|
+
Must include GitHub Actions workflows:
|
|
317
|
+
|
|
318
|
+
1. **Testing** (`scala-test.yml`):
|
|
319
|
+
- Test on ubuntu-latest
|
|
320
|
+
- Scala versions: 3.3.x
|
|
321
|
+
- sbt test with coverage
|
|
322
|
+
|
|
323
|
+
2. **Linting** (`scala-lint.yml`):
|
|
324
|
+
- scalafmtCheckAll
|
|
325
|
+
- scalafixAll --check
|
|
326
|
+
- wartremoverCheck
|
|
327
|
+
|
|
328
|
+
3. **Build** (`scala-build.yml`):
|
|
329
|
+
- sbt compile
|
|
330
|
+
- sbt package
|
|
331
|
+
- Verify artifacts
|
|
332
|
+
|
|
333
|
+
## Publishing
|
|
334
|
+
|
|
335
|
+
### To Maven Central
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
# 1. Configure credentials in ~/.sbt/1.0/sonatype.sbt
|
|
339
|
+
# 2. Update version
|
|
340
|
+
# 3. Run quality checks
|
|
341
|
+
sbt clean scalafmtCheckAll test
|
|
342
|
+
|
|
343
|
+
# 4. Publish
|
|
344
|
+
sbt publishSigned
|
|
345
|
+
sbt sonatypeBundleRelease
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
<!-- SCALA:END -->
|