@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,421 @@
|
|
|
1
|
+
<!-- RUBY:START -->
|
|
2
|
+
# Ruby 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
|
+
bundle exec rubocop # Linting and formatting
|
|
11
|
+
bundle exec rspec # All tests (100% pass)
|
|
12
|
+
bundle exec rspec --format documentation # Test coverage
|
|
13
|
+
|
|
14
|
+
# Security audit:
|
|
15
|
+
bundle audit # Vulnerability scan
|
|
16
|
+
bundle outdated # Check outdated deps
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Ruby Configuration
|
|
20
|
+
|
|
21
|
+
**CRITICAL**: Use Ruby 3.2+ with RuboCop and modern tooling.
|
|
22
|
+
|
|
23
|
+
- **Version**: Ruby 3.2+
|
|
24
|
+
- **Recommended**: Ruby 3.3+
|
|
25
|
+
- **Style Guide**: Ruby Style Guide (RuboCop)
|
|
26
|
+
- **Testing**: RSpec (recommended) or Minitest
|
|
27
|
+
- **Type Checking**: RBS + Steep (optional but recommended)
|
|
28
|
+
|
|
29
|
+
### Gemfile Requirements
|
|
30
|
+
|
|
31
|
+
```ruby
|
|
32
|
+
source 'https://rubygems.org'
|
|
33
|
+
|
|
34
|
+
ruby '>= 3.2.0'
|
|
35
|
+
|
|
36
|
+
# Production dependencies
|
|
37
|
+
gem 'rake', '~> 13.0'
|
|
38
|
+
|
|
39
|
+
# Development dependencies
|
|
40
|
+
group :development do
|
|
41
|
+
gem 'rubocop', '~> 1.60', require: false
|
|
42
|
+
gem 'rubocop-performance', require: false
|
|
43
|
+
gem 'rubocop-rspec', require: false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Test dependencies
|
|
47
|
+
group :test do
|
|
48
|
+
gem 'rspec', '~> 3.12'
|
|
49
|
+
gem 'simplecov', require: false
|
|
50
|
+
gem 'simplecov-lcov', require: false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Both development and test
|
|
54
|
+
group :development, :test do
|
|
55
|
+
gem 'pry'
|
|
56
|
+
gem 'pry-byebug'
|
|
57
|
+
end
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Gemspec Requirements (for gems)
|
|
61
|
+
|
|
62
|
+
```ruby
|
|
63
|
+
Gem::Specification.new do |spec|
|
|
64
|
+
spec.name = 'your_gem'
|
|
65
|
+
spec.version = '0.1.0'
|
|
66
|
+
spec.authors = ['Your Name']
|
|
67
|
+
spec.email = ['you@example.com']
|
|
68
|
+
|
|
69
|
+
spec.summary = 'Brief summary'
|
|
70
|
+
spec.description = 'Longer description'
|
|
71
|
+
spec.homepage = 'https://github.com/you/your_gem'
|
|
72
|
+
spec.license = 'MIT'
|
|
73
|
+
spec.required_ruby_version = '>= 3.2.0'
|
|
74
|
+
|
|
75
|
+
spec.files = Dir.glob('{lib,bin}/**/*') + %w[README.md LICENSE.txt]
|
|
76
|
+
spec.bindir = 'exe'
|
|
77
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
78
|
+
spec.require_paths = ['lib']
|
|
79
|
+
|
|
80
|
+
spec.add_dependency 'rake', '~> 13.0'
|
|
81
|
+
|
|
82
|
+
spec.add_development_dependency 'rspec', '~> 3.12'
|
|
83
|
+
spec.add_development_dependency 'rubocop', '~> 1.60'
|
|
84
|
+
end
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Code Quality Standards
|
|
88
|
+
|
|
89
|
+
### Mandatory Quality Checks
|
|
90
|
+
|
|
91
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
92
|
+
|
|
93
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
97
|
+
|
|
98
|
+
# 1. Lint (MUST pass with no warnings - matches workflow)
|
|
99
|
+
bundle exec rubocop
|
|
100
|
+
|
|
101
|
+
# 2. Run all tests (MUST pass 100% - matches workflow)
|
|
102
|
+
bundle exec rspec
|
|
103
|
+
# or: bundle exec rake test (for Minitest)
|
|
104
|
+
|
|
105
|
+
# 3. Check coverage (MUST meet threshold - matches workflow)
|
|
106
|
+
COVERAGE=true bundle exec rspec
|
|
107
|
+
|
|
108
|
+
# 4. Security audit (matches workflow)
|
|
109
|
+
bundle exec bundler-audit check --update
|
|
110
|
+
|
|
111
|
+
# 5. Build gem (if gem project - matches workflow)
|
|
112
|
+
gem build *.gemspec
|
|
113
|
+
|
|
114
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
118
|
+
|
|
119
|
+
**Why This Matters:**
|
|
120
|
+
- Running different commands locally than in CI causes "works on my machine" failures
|
|
121
|
+
- CI/CD workflows will fail if commands don't match
|
|
122
|
+
- Example: Using `rubocop -a` (auto-correct) locally but `rubocop` in CI = failure
|
|
123
|
+
- Example: Missing security audit locally = CI catches vulnerabilities in dependencies
|
|
124
|
+
|
|
125
|
+
### Linting with RuboCop
|
|
126
|
+
|
|
127
|
+
- Configuration in `.rubocop.yml`
|
|
128
|
+
- Must pass with no offenses
|
|
129
|
+
- Auto-correct safe offenses only
|
|
130
|
+
|
|
131
|
+
Example `.rubocop.yml`:
|
|
132
|
+
```yaml
|
|
133
|
+
require:
|
|
134
|
+
- rubocop-performance
|
|
135
|
+
- rubocop-rspec
|
|
136
|
+
|
|
137
|
+
AllCops:
|
|
138
|
+
TargetRubyVersion: 3.2
|
|
139
|
+
NewCops: enable
|
|
140
|
+
Exclude:
|
|
141
|
+
- 'vendor/**/*'
|
|
142
|
+
- 'tmp/**/*'
|
|
143
|
+
- 'bin/**/*'
|
|
144
|
+
|
|
145
|
+
Style/StringLiterals:
|
|
146
|
+
EnforcedStyle: single_quotes
|
|
147
|
+
|
|
148
|
+
Metrics/MethodLength:
|
|
149
|
+
Max: 15
|
|
150
|
+
Exclude:
|
|
151
|
+
- 'spec/**/*'
|
|
152
|
+
|
|
153
|
+
Metrics/BlockLength:
|
|
154
|
+
Exclude:
|
|
155
|
+
- 'spec/**/*'
|
|
156
|
+
- '*.gemspec'
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Testing
|
|
160
|
+
|
|
161
|
+
- **Framework**: RSpec (recommended) or Minitest
|
|
162
|
+
- **Location**: `/spec` (RSpec) or `/test` (Minitest)
|
|
163
|
+
- **Coverage**: SimpleCov (80%+ threshold)
|
|
164
|
+
- **Focus**: Write descriptive specs
|
|
165
|
+
|
|
166
|
+
Example RSpec test:
|
|
167
|
+
```ruby
|
|
168
|
+
# spec/my_class_spec.rb
|
|
169
|
+
|
|
170
|
+
RSpec.describe MyClass do
|
|
171
|
+
let(:instance) { described_class.new(value: 'test') }
|
|
172
|
+
|
|
173
|
+
describe '#process' do
|
|
174
|
+
context 'with valid input' do
|
|
175
|
+
it 'returns processed value' do
|
|
176
|
+
result = instance.process('input')
|
|
177
|
+
expect(result).to eq('PROCESSED: input')
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
it 'handles empty strings' do
|
|
181
|
+
expect(instance.process('')).to be_nil
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
context 'with invalid input' do
|
|
186
|
+
it 'raises ArgumentError' do
|
|
187
|
+
expect { instance.process(nil) }.to raise_error(ArgumentError)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
describe '#validate' do
|
|
193
|
+
it 'returns true for valid data' do
|
|
194
|
+
expect(instance.validate('valid')).to be true
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it 'returns false for invalid data' do
|
|
198
|
+
expect(instance.validate('')).to be false
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Example Minitest:
|
|
205
|
+
```ruby
|
|
206
|
+
# test/my_class_test.rb
|
|
207
|
+
|
|
208
|
+
require 'test_helper'
|
|
209
|
+
|
|
210
|
+
class MyClassTest < Minitest::Test
|
|
211
|
+
def setup
|
|
212
|
+
@instance = MyClass.new(value: 'test')
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def test_process_returns_expected_value
|
|
216
|
+
result = @instance.process('input')
|
|
217
|
+
assert_equal 'PROCESSED: input', result
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def test_process_handles_empty_strings
|
|
221
|
+
assert_nil @instance.process('')
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def test_process_raises_on_nil
|
|
225
|
+
assert_raises(ArgumentError) { @instance.process(nil) }
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Coverage Configuration
|
|
231
|
+
|
|
232
|
+
Create `spec/spec_helper.rb`:
|
|
233
|
+
```ruby
|
|
234
|
+
if ENV['COVERAGE']
|
|
235
|
+
require 'simplecov'
|
|
236
|
+
require 'simplecov-lcov'
|
|
237
|
+
|
|
238
|
+
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
|
|
239
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
|
240
|
+
SimpleCov::Formatter::HTMLFormatter,
|
|
241
|
+
SimpleCov::Formatter::LcovFormatter
|
|
242
|
+
])
|
|
243
|
+
|
|
244
|
+
SimpleCov.start do
|
|
245
|
+
add_filter '/spec/'
|
|
246
|
+
add_filter '/test/'
|
|
247
|
+
|
|
248
|
+
minimum_coverage 80
|
|
249
|
+
minimum_coverage_by_file 70
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
require 'your_gem'
|
|
254
|
+
|
|
255
|
+
RSpec.configure do |config|
|
|
256
|
+
config.expect_with :rspec do |expectations|
|
|
257
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
config.mock_with :rspec do |mocks|
|
|
261
|
+
mocks.verify_partial_doubles = true
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
|
265
|
+
config.filter_run_when_matching :focus
|
|
266
|
+
config.example_status_persistence_file_path = 'spec/examples.txt'
|
|
267
|
+
config.disable_monkey_patching!
|
|
268
|
+
config.warnings = true
|
|
269
|
+
|
|
270
|
+
config.default_formatter = 'doc' if config.files_to_run.one?
|
|
271
|
+
config.profile_examples = 10
|
|
272
|
+
config.order = :random
|
|
273
|
+
Kernel.srand config.seed
|
|
274
|
+
end
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Dependency Management
|
|
278
|
+
|
|
279
|
+
### Using Bundler
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# Install dependencies
|
|
283
|
+
bundle install
|
|
284
|
+
|
|
285
|
+
# Update dependencies
|
|
286
|
+
bundle update
|
|
287
|
+
|
|
288
|
+
# Check for outdated gems
|
|
289
|
+
bundle outdated
|
|
290
|
+
|
|
291
|
+
# Security audit
|
|
292
|
+
bundle exec bundler-audit check --update
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Gemfile.lock
|
|
296
|
+
|
|
297
|
+
- **MUST** commit Gemfile.lock for applications
|
|
298
|
+
- For gems: Add to `.gitignore`
|
|
299
|
+
- Ensures reproducible builds
|
|
300
|
+
|
|
301
|
+
## Best Practices
|
|
302
|
+
|
|
303
|
+
### DO's ✅
|
|
304
|
+
|
|
305
|
+
- **USE** meaningful variable and method names
|
|
306
|
+
- **FOLLOW** Ruby naming conventions (snake_case)
|
|
307
|
+
- **WRITE** descriptive tests with context blocks
|
|
308
|
+
- **HANDLE** exceptions explicitly
|
|
309
|
+
- **VALIDATE** inputs
|
|
310
|
+
- **DOCUMENT** public APIs
|
|
311
|
+
- **USE** symbols for hash keys when possible
|
|
312
|
+
- **FREEZE** string literals in Ruby 3+
|
|
313
|
+
|
|
314
|
+
### DON'Ts ❌
|
|
315
|
+
|
|
316
|
+
- **NEVER** use global variables
|
|
317
|
+
- **NEVER** monkey-patch core classes without extreme caution
|
|
318
|
+
- **NEVER** skip tests
|
|
319
|
+
- **NEVER** commit `.byebug_history` or debug files
|
|
320
|
+
- **NEVER** use `eval` unless absolutely necessary
|
|
321
|
+
- **NEVER** ignore RuboCop offenses without justification
|
|
322
|
+
- **NEVER** commit with failing tests
|
|
323
|
+
|
|
324
|
+
Example code style:
|
|
325
|
+
```ruby
|
|
326
|
+
# ✅ GOOD: Clean Ruby code
|
|
327
|
+
class DataProcessor
|
|
328
|
+
def initialize(options = {})
|
|
329
|
+
@threshold = options.fetch(:threshold, 0.5)
|
|
330
|
+
@verbose = options.fetch(:verbose, false)
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def process(data)
|
|
334
|
+
validate_input!(data)
|
|
335
|
+
|
|
336
|
+
log('Processing data...') if @verbose
|
|
337
|
+
|
|
338
|
+
data.select { |item| item[:value] > @threshold }
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
private
|
|
342
|
+
|
|
343
|
+
def validate_input!(data)
|
|
344
|
+
raise ArgumentError, 'Data must be an array' unless data.is_a?(Array)
|
|
345
|
+
raise ArgumentError, 'Data cannot be empty' if data.empty?
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def log(message)
|
|
349
|
+
puts "[#{Time.now.iso8601}] #{message}"
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
# ❌ BAD: Poor practices
|
|
354
|
+
class DataProcessor
|
|
355
|
+
def process(data)
|
|
356
|
+
$threshold = 0.5 # DON'T use globals!
|
|
357
|
+
|
|
358
|
+
if data == nil # Use nil? method
|
|
359
|
+
return false
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
result = []
|
|
363
|
+
for item in data # Use .each or .map
|
|
364
|
+
if item[:value] > $threshold
|
|
365
|
+
result.push(item)
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
puts result # DON'T print in library code
|
|
370
|
+
result
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## CI/CD Requirements
|
|
376
|
+
|
|
377
|
+
Must include GitHub Actions workflows:
|
|
378
|
+
|
|
379
|
+
1. **Testing** (`ruby-test.yml`):
|
|
380
|
+
- Test on ubuntu-latest, windows-latest, macos-latest
|
|
381
|
+
- Ruby versions: 3.2, 3.3
|
|
382
|
+
- Upload coverage to Codecov
|
|
383
|
+
|
|
384
|
+
2. **Linting** (`ruby-lint.yml`):
|
|
385
|
+
- RuboCop checks
|
|
386
|
+
- Bundler audit for security
|
|
387
|
+
|
|
388
|
+
3. **Build** (`ruby-build.yml`):
|
|
389
|
+
- Build gem
|
|
390
|
+
- Verify gem structure
|
|
391
|
+
|
|
392
|
+
## Publishing to RubyGems
|
|
393
|
+
|
|
394
|
+
### Prerequisites
|
|
395
|
+
|
|
396
|
+
1. Create account at https://rubygems.org
|
|
397
|
+
2. Get API key: `gem signin`
|
|
398
|
+
3. Add `RUBYGEMS_API_KEY` to GitHub secrets
|
|
399
|
+
|
|
400
|
+
### Publishing Workflow
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
# 1. Update version in gemspec or version.rb
|
|
404
|
+
# 2. Update CHANGELOG.md
|
|
405
|
+
# 3. Run all quality checks
|
|
406
|
+
bundle exec rubocop
|
|
407
|
+
bundle exec rspec
|
|
408
|
+
gem build *.gemspec
|
|
409
|
+
|
|
410
|
+
# 4. Create git tag
|
|
411
|
+
git tag -a v1.0.0 -m "Release version 1.0.0"
|
|
412
|
+
|
|
413
|
+
# 5. Push (manual if SSH password)
|
|
414
|
+
# git push origin main
|
|
415
|
+
# git push origin v1.0.0
|
|
416
|
+
|
|
417
|
+
# 6. Publish to RubyGems (or use GitHub Actions)
|
|
418
|
+
gem push your_gem-1.0.0.gem
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
<!-- RUBY:END -->
|