@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,350 @@
|
|
|
1
|
+
<!-- R:START -->
|
|
2
|
+
# R 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
|
+
Rscript -e 'styler::style_pkg(dry="on")' # Format check
|
|
11
|
+
Rscript -e 'lintr::lint_package()' # Linting
|
|
12
|
+
R CMD check . # Full check
|
|
13
|
+
Rscript -e 'devtools::test()' # All tests
|
|
14
|
+
|
|
15
|
+
# Security audit:
|
|
16
|
+
Rscript -e 'pak::pkg_deps_explain()' # Dependency check
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## R Configuration
|
|
20
|
+
|
|
21
|
+
**CRITICAL**: Use R 4.2+ with modern package development tools.
|
|
22
|
+
|
|
23
|
+
- **Version**: R 4.2+
|
|
24
|
+
- **Recommended**: R 4.3+
|
|
25
|
+
- **Style Guide**: tidyverse style guide
|
|
26
|
+
- **Testing**: testthat 3.x
|
|
27
|
+
- **Documentation**: roxygen2
|
|
28
|
+
|
|
29
|
+
### DESCRIPTION File Requirements
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Package: yourpackage
|
|
33
|
+
Type: Package
|
|
34
|
+
Title: Your Package Title
|
|
35
|
+
Version: 0.1.0
|
|
36
|
+
Author: Your Name
|
|
37
|
+
Maintainer: Your Name <you@example.com>
|
|
38
|
+
Description: A comprehensive description of what your package does.
|
|
39
|
+
License: MIT + file LICENSE
|
|
40
|
+
Encoding: UTF-8
|
|
41
|
+
LazyData: true
|
|
42
|
+
Roxygen: list(markdown = TRUE)
|
|
43
|
+
RoxygenNote: 7.2.3
|
|
44
|
+
Depends:
|
|
45
|
+
R (>= 4.2)
|
|
46
|
+
Imports:
|
|
47
|
+
dplyr (>= 1.1.0),
|
|
48
|
+
ggplot2 (>= 3.4.0)
|
|
49
|
+
Suggests:
|
|
50
|
+
testthat (>= 3.0.0),
|
|
51
|
+
knitr,
|
|
52
|
+
rmarkdown
|
|
53
|
+
VignetteBuilder: knitr
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Code Quality Standards
|
|
57
|
+
|
|
58
|
+
### Mandatory Quality Checks
|
|
59
|
+
|
|
60
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
61
|
+
|
|
62
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
66
|
+
|
|
67
|
+
# 1. Format check (matches workflow - use dry="on"!)
|
|
68
|
+
Rscript -e "styler::style_pkg(dry = 'on')"
|
|
69
|
+
|
|
70
|
+
# 2. Lint (MUST pass with no warnings - matches workflow)
|
|
71
|
+
Rscript -e "lintr::lint_package()"
|
|
72
|
+
|
|
73
|
+
# 3. Run all tests (MUST pass 100% - matches workflow)
|
|
74
|
+
Rscript -e "devtools::test()"
|
|
75
|
+
|
|
76
|
+
# 4. Check package (matches workflow - strict CRAN checks)
|
|
77
|
+
R CMD build .
|
|
78
|
+
R CMD check *.tar.gz --as-cran --no-manual
|
|
79
|
+
|
|
80
|
+
# 5. Check coverage (MUST meet threshold)
|
|
81
|
+
Rscript -e "covr::package_coverage()"
|
|
82
|
+
|
|
83
|
+
# 6. Build documentation (matches workflow)
|
|
84
|
+
Rscript -e "devtools::document()"
|
|
85
|
+
|
|
86
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
90
|
+
|
|
91
|
+
**Why This Matters:**
|
|
92
|
+
- Running different commands locally than in CI causes "works on my machine" failures
|
|
93
|
+
- CI/CD workflows will fail if commands don't match
|
|
94
|
+
- Example: Using `styler::style_pkg()` locally but `dry='on'` in CI = failure
|
|
95
|
+
- Example: Missing `--as-cran` flag = CRAN submission fails
|
|
96
|
+
- Example: Skipping lintr locally = CI catches style violations
|
|
97
|
+
|
|
98
|
+
### Formatting
|
|
99
|
+
|
|
100
|
+
- Use `styler` for consistent code style
|
|
101
|
+
- Based on tidyverse style guide
|
|
102
|
+
- Configuration in `.lintr` file
|
|
103
|
+
|
|
104
|
+
Example `.lintr`:
|
|
105
|
+
```
|
|
106
|
+
linters: linters_with_defaults(
|
|
107
|
+
line_length_linter(100),
|
|
108
|
+
object_name_linter = NULL,
|
|
109
|
+
cyclocomp_linter(25)
|
|
110
|
+
)
|
|
111
|
+
exclusions: list(
|
|
112
|
+
"tests/testthat.R"
|
|
113
|
+
)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Documentation
|
|
117
|
+
|
|
118
|
+
- Use roxygen2 for function documentation
|
|
119
|
+
- All exported functions must be documented
|
|
120
|
+
- Include examples in documentation
|
|
121
|
+
|
|
122
|
+
Example roxygen2 documentation:
|
|
123
|
+
```r
|
|
124
|
+
#' Process Data
|
|
125
|
+
#'
|
|
126
|
+
#' This function processes input data and returns cleaned results.
|
|
127
|
+
#'
|
|
128
|
+
#' @param data A data.frame with input data
|
|
129
|
+
#' @param threshold Numeric threshold value (default: 0.5)
|
|
130
|
+
#' @param verbose Logical; if TRUE, print progress messages
|
|
131
|
+
#'
|
|
132
|
+
#' @return A data.frame with processed data
|
|
133
|
+
#' @export
|
|
134
|
+
#'
|
|
135
|
+
#' @examples
|
|
136
|
+
#' data <- data.frame(x = 1:10, y = rnorm(10))
|
|
137
|
+
#' result <- process_data(data, threshold = 0.7)
|
|
138
|
+
process_data <- function(data, threshold = 0.5, verbose = FALSE) {
|
|
139
|
+
if (!is.data.frame(data)) {
|
|
140
|
+
stop("data must be a data.frame")
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (verbose) {
|
|
144
|
+
message("Processing data...")
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# Implementation
|
|
148
|
+
return(data)
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Testing
|
|
153
|
+
|
|
154
|
+
- **Framework**: testthat 3.x
|
|
155
|
+
- **Location**: `/tests/testthat` directory
|
|
156
|
+
- **Coverage**: Must meet threshold (80%+)
|
|
157
|
+
- **File naming**: `test-*.R` for test files
|
|
158
|
+
|
|
159
|
+
Example test structure:
|
|
160
|
+
```r
|
|
161
|
+
# tests/testthat/test-process.R
|
|
162
|
+
|
|
163
|
+
test_that("process_data handles valid input", {
|
|
164
|
+
data <- data.frame(x = 1:5, y = 1:5)
|
|
165
|
+
result <- process_data(data)
|
|
166
|
+
|
|
167
|
+
expect_s3_class(result, "data.frame")
|
|
168
|
+
expect_equal(nrow(result), 5)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
test_that("process_data errors on invalid input", {
|
|
172
|
+
expect_error(
|
|
173
|
+
process_data("not a dataframe"),
|
|
174
|
+
"data must be a data.frame"
|
|
175
|
+
)
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
test_that("process_data respects threshold parameter", {
|
|
179
|
+
data <- data.frame(x = 1:10, y = rnorm(10))
|
|
180
|
+
result <- process_data(data, threshold = 0.7)
|
|
181
|
+
|
|
182
|
+
expect_true(all(result$y >= 0.7 | result$y <= -0.7))
|
|
183
|
+
})
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Package Development
|
|
187
|
+
|
|
188
|
+
### Package Structure
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
yourpackage/
|
|
192
|
+
├── DESCRIPTION # Package metadata
|
|
193
|
+
├── NAMESPACE # Auto-generated by roxygen2
|
|
194
|
+
├── LICENSE # License file
|
|
195
|
+
├── README.md # Package overview
|
|
196
|
+
├── NEWS.md # Changelog
|
|
197
|
+
├── R/
|
|
198
|
+
│ ├── package.R # Package-level documentation
|
|
199
|
+
│ ├── data.R # Data documentation
|
|
200
|
+
│ └── functions.R # Function implementations
|
|
201
|
+
├── man/ # Auto-generated documentation
|
|
202
|
+
├── tests/
|
|
203
|
+
│ ├── testthat.R
|
|
204
|
+
│ └── testthat/
|
|
205
|
+
│ ├── test-functions.R
|
|
206
|
+
│ └── test-data.R
|
|
207
|
+
├── data/ # Package data
|
|
208
|
+
├── inst/ # Installed files
|
|
209
|
+
└── vignettes/ # Long-form documentation
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Development Workflow
|
|
213
|
+
|
|
214
|
+
```r
|
|
215
|
+
# Load package for development
|
|
216
|
+
devtools::load_all()
|
|
217
|
+
|
|
218
|
+
# Run tests
|
|
219
|
+
devtools::test()
|
|
220
|
+
|
|
221
|
+
# Check package
|
|
222
|
+
devtools::check()
|
|
223
|
+
|
|
224
|
+
# Generate documentation
|
|
225
|
+
devtools::document()
|
|
226
|
+
|
|
227
|
+
# Build package
|
|
228
|
+
devtools::build()
|
|
229
|
+
|
|
230
|
+
# Install locally
|
|
231
|
+
devtools::install()
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Dependencies
|
|
235
|
+
|
|
236
|
+
### CRAN vs GitHub Packages
|
|
237
|
+
|
|
238
|
+
```r
|
|
239
|
+
# From CRAN
|
|
240
|
+
install.packages("dplyr")
|
|
241
|
+
|
|
242
|
+
# From GitHub
|
|
243
|
+
devtools::install_github("tidyverse/dplyr")
|
|
244
|
+
|
|
245
|
+
# Specify in DESCRIPTION:
|
|
246
|
+
Imports:
|
|
247
|
+
dplyr (>= 1.1.0)
|
|
248
|
+
Remotes:
|
|
249
|
+
github::tidyverse/dplyr@main
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Best Practices
|
|
253
|
+
|
|
254
|
+
### DO's ✅
|
|
255
|
+
|
|
256
|
+
- **USE** tidyverse principles
|
|
257
|
+
- **DOCUMENT** all exported functions
|
|
258
|
+
- **TEST** all functionality
|
|
259
|
+
- **CHECK** inputs with `stopifnot()` or custom validation
|
|
260
|
+
- **RETURN** consistent types
|
|
261
|
+
- **NAMESPACE** use explicit `::` for external functions
|
|
262
|
+
- **VECTORIZE** operations when possible
|
|
263
|
+
|
|
264
|
+
### DON'Ts ❌
|
|
265
|
+
|
|
266
|
+
- **NEVER** use `T` or `F` (use `TRUE` and `FALSE`)
|
|
267
|
+
- **NEVER** use `attach()` or `<<-` in packages
|
|
268
|
+
- **NEVER** modify global options
|
|
269
|
+
- **NEVER** use `library()` inside functions
|
|
270
|
+
- **NEVER** leave `browser()` or `print()` debug code
|
|
271
|
+
- **NEVER** assume working directory
|
|
272
|
+
|
|
273
|
+
Example code style:
|
|
274
|
+
```r
|
|
275
|
+
# ✅ GOOD: Proper function structure
|
|
276
|
+
process_data <- function(data, threshold = 0.5) {
|
|
277
|
+
# Input validation
|
|
278
|
+
stopifnot(
|
|
279
|
+
is.data.frame(data),
|
|
280
|
+
is.numeric(threshold),
|
|
281
|
+
threshold >= 0, threshold <= 1
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Use explicit namespace
|
|
285
|
+
result <- dplyr::filter(data, value > threshold)
|
|
286
|
+
|
|
287
|
+
return(result)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
# ❌ BAD: Poor practices
|
|
291
|
+
process_data <- function(data, threshold = 0.5) {
|
|
292
|
+
library(dplyr) # DON'T load packages in functions!
|
|
293
|
+
attach(data) # NEVER use attach()!
|
|
294
|
+
|
|
295
|
+
result <- filter(data, value > threshold) # Unclear where filter comes from
|
|
296
|
+
result <<- result # DON'T use global assignment!
|
|
297
|
+
|
|
298
|
+
print(result) # Don't print inside functions
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## CI/CD Requirements
|
|
303
|
+
|
|
304
|
+
Must include GitHub Actions workflows:
|
|
305
|
+
|
|
306
|
+
1. **Testing** (`r-test.yml`):
|
|
307
|
+
- Test on ubuntu-latest, windows-latest, macos-latest
|
|
308
|
+
- R versions: release, devel
|
|
309
|
+
- Use R CMD check --as-cran
|
|
310
|
+
- Upload coverage to Codecov
|
|
311
|
+
|
|
312
|
+
2. **Linting** (`r-lint.yml`):
|
|
313
|
+
- Run lintr checks
|
|
314
|
+
- Check style with styler
|
|
315
|
+
- Verify roxygen2 documentation
|
|
316
|
+
|
|
317
|
+
3. **CRAN Check** (`r-cran.yml`):
|
|
318
|
+
- R CMD check with --as-cran
|
|
319
|
+
- Verify no NOTEs, WARNINGs, or ERRORs
|
|
320
|
+
|
|
321
|
+
## Publishing to CRAN
|
|
322
|
+
|
|
323
|
+
### Pre-Submission Checklist
|
|
324
|
+
|
|
325
|
+
- ✅ All tests passing
|
|
326
|
+
- ✅ R CMD check --as-cran passes with 0 NOTEs
|
|
327
|
+
- ✅ Package documentation complete
|
|
328
|
+
- ✅ NEWS.md updated
|
|
329
|
+
- ✅ README.md current
|
|
330
|
+
- ✅ Examples run successfully
|
|
331
|
+
- ✅ Vignettes build correctly
|
|
332
|
+
- ✅ Valid LICENSE file
|
|
333
|
+
- ✅ No submission policy violations
|
|
334
|
+
|
|
335
|
+
### Submission Process
|
|
336
|
+
|
|
337
|
+
```r
|
|
338
|
+
# 1. Final check
|
|
339
|
+
devtools::check(cran = TRUE)
|
|
340
|
+
|
|
341
|
+
# 2. Build package
|
|
342
|
+
devtools::build()
|
|
343
|
+
|
|
344
|
+
# 3. Submit to CRAN
|
|
345
|
+
devtools::submit_cran()
|
|
346
|
+
|
|
347
|
+
# 4. Respond to CRAN feedback promptly
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
<!-- R:END -->
|