@hivehub/rulebook 2.1.0 → 3.0.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.
Files changed (187) hide show
  1. package/README.md +779 -661
  2. package/dist/cli/commands.d.ts +22 -0
  3. package/dist/cli/commands.d.ts.map +1 -1
  4. package/dist/cli/commands.js +291 -8
  5. package/dist/cli/commands.js.map +1 -1
  6. package/dist/core/claude-mcp.d.ts +32 -0
  7. package/dist/core/claude-mcp.d.ts.map +1 -0
  8. package/dist/core/claude-mcp.js +92 -0
  9. package/dist/core/claude-mcp.js.map +1 -0
  10. package/dist/core/config-manager.d.ts.map +1 -1
  11. package/dist/core/config-manager.js +27 -6
  12. package/dist/core/config-manager.js.map +1 -1
  13. package/dist/core/generator.d.ts.map +1 -1
  14. package/dist/core/generator.js +98 -49
  15. package/dist/core/generator.js.map +1 -1
  16. package/dist/core/migrator.d.ts +13 -0
  17. package/dist/core/migrator.d.ts.map +1 -1
  18. package/dist/core/migrator.js +76 -9
  19. package/dist/core/migrator.js.map +1 -1
  20. package/dist/core/openspec-migrator.d.ts +1 -1
  21. package/dist/core/openspec-migrator.d.ts.map +1 -1
  22. package/dist/core/openspec-migrator.js +14 -7
  23. package/dist/core/openspec-migrator.js.map +1 -1
  24. package/dist/core/workflow-generator.js +297 -261
  25. package/dist/core/workflow-generator.js.map +1 -1
  26. package/dist/index.js +40 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  29. package/dist/mcp/rulebook-server.js +255 -74
  30. package/dist/mcp/rulebook-server.js.map +1 -1
  31. package/dist/memory/hnsw-index.d.ts +63 -0
  32. package/dist/memory/hnsw-index.d.ts.map +1 -0
  33. package/dist/memory/hnsw-index.js +421 -0
  34. package/dist/memory/hnsw-index.js.map +1 -0
  35. package/dist/memory/memory-cache.d.ts +33 -0
  36. package/dist/memory/memory-cache.d.ts.map +1 -0
  37. package/dist/memory/memory-cache.js +85 -0
  38. package/dist/memory/memory-cache.js.map +1 -0
  39. package/dist/memory/memory-hooks.d.ts +42 -0
  40. package/dist/memory/memory-hooks.d.ts.map +1 -0
  41. package/dist/memory/memory-hooks.js +193 -0
  42. package/dist/memory/memory-hooks.js.map +1 -0
  43. package/dist/memory/memory-manager.d.ts +55 -0
  44. package/dist/memory/memory-manager.d.ts.map +1 -0
  45. package/dist/memory/memory-manager.js +209 -0
  46. package/dist/memory/memory-manager.js.map +1 -0
  47. package/dist/memory/memory-search.d.ts +42 -0
  48. package/dist/memory/memory-search.d.ts.map +1 -0
  49. package/dist/memory/memory-search.js +166 -0
  50. package/dist/memory/memory-search.js.map +1 -0
  51. package/dist/memory/memory-store.d.ts +59 -0
  52. package/dist/memory/memory-store.d.ts.map +1 -0
  53. package/dist/memory/memory-store.js +394 -0
  54. package/dist/memory/memory-store.js.map +1 -0
  55. package/dist/memory/memory-types.d.ts +69 -0
  56. package/dist/memory/memory-types.d.ts.map +1 -0
  57. package/dist/memory/memory-types.js +7 -0
  58. package/dist/memory/memory-types.js.map +1 -0
  59. package/dist/memory/memory-vectorizer.d.ts +29 -0
  60. package/dist/memory/memory-vectorizer.d.ts.map +1 -0
  61. package/dist/memory/memory-vectorizer.js +104 -0
  62. package/dist/memory/memory-vectorizer.js.map +1 -0
  63. package/dist/types.d.ts +7 -0
  64. package/dist/types.d.ts.map +1 -1
  65. package/package.json +107 -106
  66. package/templates/commands/rulebook-memory-save.md +48 -0
  67. package/templates/commands/rulebook-memory-search.md +47 -0
  68. package/templates/commands/rulebook-task-apply.md +2 -2
  69. package/templates/commands/rulebook-task-archive.md +2 -2
  70. package/templates/commands/rulebook-task-create.md +2 -2
  71. package/templates/commands/rulebook-task-list.md +2 -2
  72. package/templates/commands/rulebook-task-show.md +2 -2
  73. package/templates/commands/rulebook-task-validate.md +2 -2
  74. package/templates/git/CI_CD_PATTERNS.md +4 -4
  75. package/templates/git/GITHUB_ACTIONS.md +3 -3
  76. package/templates/git/GITLAB_CI.md +4 -4
  77. package/templates/git/SECRETS_MANAGEMENT.md +4 -4
  78. package/templates/hooks/COMMIT_MSG.md +4 -4
  79. package/templates/hooks/POST_CHECKOUT.md +3 -3
  80. package/templates/hooks/PREPARE_COMMIT_MSG.md +3 -3
  81. package/templates/hooks/PRE_COMMIT.md +4 -4
  82. package/templates/hooks/PRE_PUSH.md +4 -4
  83. package/templates/modules/MEMORY.md +63 -0
  84. package/templates/skills/cli/aider/SKILL.md +59 -0
  85. package/templates/skills/cli/amazon-q/SKILL.md +35 -0
  86. package/templates/skills/cli/auggie/SKILL.md +42 -0
  87. package/templates/skills/cli/claude/SKILL.md +42 -0
  88. package/templates/skills/cli/claude-code/SKILL.md +146 -0
  89. package/templates/skills/cli/cline/SKILL.md +42 -0
  90. package/templates/skills/cli/codebuddy/SKILL.md +30 -0
  91. package/templates/skills/cli/codeium/SKILL.md +30 -0
  92. package/templates/skills/cli/codex/SKILL.md +31 -0
  93. package/templates/skills/cli/continue/SKILL.md +44 -0
  94. package/templates/skills/cli/cursor-cli/SKILL.md +38 -0
  95. package/templates/skills/cli/factory/SKILL.md +28 -0
  96. package/templates/skills/cli/gemini/SKILL.md +45 -0
  97. package/templates/skills/cli/kilocode/SKILL.md +28 -0
  98. package/templates/skills/cli/opencode/SKILL.md +28 -0
  99. package/templates/skills/core/agent-automation/SKILL.md +194 -0
  100. package/templates/skills/core/dag/SKILL.md +314 -0
  101. package/templates/skills/core/documentation-rules/SKILL.md +47 -0
  102. package/templates/skills/core/quality-enforcement/SKILL.md +78 -0
  103. package/templates/skills/frameworks/angular/SKILL.md +46 -0
  104. package/templates/skills/frameworks/django/SKILL.md +93 -0
  105. package/templates/skills/frameworks/electron/SKILL.md +157 -0
  106. package/templates/skills/frameworks/flask/SKILL.md +48 -0
  107. package/templates/skills/frameworks/flutter/SKILL.md +65 -0
  108. package/templates/skills/frameworks/jquery/SKILL.md +42 -0
  109. package/templates/skills/frameworks/laravel/SKILL.md +48 -0
  110. package/templates/skills/frameworks/nestjs/SKILL.md +53 -0
  111. package/templates/skills/frameworks/nextjs/SKILL.md +137 -0
  112. package/templates/skills/frameworks/nuxt/SKILL.md +50 -0
  113. package/templates/skills/frameworks/rails/SKILL.md +76 -0
  114. package/templates/skills/frameworks/react/SKILL.md +48 -0
  115. package/templates/skills/frameworks/react-native/SKILL.md +57 -0
  116. package/templates/skills/frameworks/spring/SKILL.md +49 -0
  117. package/templates/skills/frameworks/symfony/SKILL.md +46 -0
  118. package/templates/skills/frameworks/vue/SKILL.md +46 -0
  119. package/templates/skills/frameworks/zend/SKILL.md +45 -0
  120. package/templates/skills/ides/copilot/SKILL.md +47 -0
  121. package/templates/skills/ides/cursor/SKILL.md +53 -0
  122. package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -0
  123. package/templates/skills/ides/replit/SKILL.md +46 -0
  124. package/templates/skills/ides/tabnine/SKILL.md +39 -0
  125. package/templates/skills/ides/vscode/SKILL.md +50 -0
  126. package/templates/skills/ides/windsurf/SKILL.md +46 -0
  127. package/templates/skills/ides/zed/SKILL.md +42 -0
  128. package/templates/skills/languages/ada/SKILL.md +68 -0
  129. package/templates/skills/languages/c/SKILL.md +343 -0
  130. package/templates/skills/languages/cpp/SKILL.md +753 -0
  131. package/templates/skills/languages/csharp/SKILL.md +427 -0
  132. package/templates/skills/languages/dart/SKILL.md +342 -0
  133. package/templates/skills/languages/elixir/SKILL.md +464 -0
  134. package/templates/skills/languages/erlang/SKILL.md +371 -0
  135. package/templates/skills/languages/go/SKILL.md +655 -0
  136. package/templates/skills/languages/haskell/SKILL.md +187 -0
  137. package/templates/skills/languages/java/SKILL.md +617 -0
  138. package/templates/skills/languages/javascript/SKILL.md +641 -0
  139. package/templates/skills/languages/julia/SKILL.md +107 -0
  140. package/templates/skills/languages/kotlin/SKILL.md +521 -0
  141. package/templates/skills/languages/lisp/SKILL.md +110 -0
  142. package/templates/skills/languages/lua/SKILL.md +84 -0
  143. package/templates/skills/languages/objectivec/SKILL.md +100 -0
  144. package/templates/skills/languages/php/SKILL.md +426 -0
  145. package/templates/skills/languages/python/SKILL.md +692 -0
  146. package/templates/skills/languages/r/SKILL.md +360 -0
  147. package/templates/skills/languages/ruby/SKILL.md +431 -0
  148. package/templates/skills/languages/rust/SKILL.md +487 -0
  149. package/templates/skills/languages/sas/SKILL.md +83 -0
  150. package/templates/skills/languages/scala/SKILL.md +358 -0
  151. package/templates/skills/languages/solidity/SKILL.md +590 -0
  152. package/templates/skills/languages/sql/SKILL.md +147 -0
  153. package/templates/skills/languages/swift/SKILL.md +476 -0
  154. package/templates/skills/languages/zig/SKILL.md +275 -0
  155. package/templates/skills/modules/atlassian/SKILL.md +265 -0
  156. package/templates/skills/modules/context7/SKILL.md +64 -0
  157. package/templates/skills/modules/figma/SKILL.md +277 -0
  158. package/templates/skills/modules/github-mcp/SKILL.md +74 -0
  159. package/templates/skills/modules/grafana/SKILL.md +338 -0
  160. package/templates/skills/modules/memory/SKILL.md +73 -0
  161. package/templates/skills/modules/notion/SKILL.md +257 -0
  162. package/templates/skills/modules/playwright/SKILL.md +100 -0
  163. package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -0
  164. package/templates/skills/modules/serena/SKILL.md +347 -0
  165. package/templates/skills/modules/supabase/SKILL.md +233 -0
  166. package/templates/skills/modules/synap/SKILL.md +79 -0
  167. package/templates/skills/modules/vectorizer/SKILL.md +73 -0
  168. package/templates/skills/services/azure-blob/SKILL.md +194 -0
  169. package/templates/skills/services/cassandra/SKILL.md +249 -0
  170. package/templates/skills/services/dynamodb/SKILL.md +318 -0
  171. package/templates/skills/services/elasticsearch/SKILL.md +357 -0
  172. package/templates/skills/services/gcs/SKILL.md +188 -0
  173. package/templates/skills/services/influxdb/SKILL.md +275 -0
  174. package/templates/skills/services/kafka/SKILL.md +351 -0
  175. package/templates/skills/services/mariadb/SKILL.md +193 -0
  176. package/templates/skills/services/memcached/SKILL.md +252 -0
  177. package/templates/skills/services/minio/SKILL.md +211 -0
  178. package/templates/skills/services/mongodb/SKILL.md +278 -0
  179. package/templates/skills/services/mysql/SKILL.md +368 -0
  180. package/templates/skills/services/neo4j/SKILL.md +257 -0
  181. package/templates/skills/services/oracle/SKILL.md +300 -0
  182. package/templates/skills/services/postgresql/SKILL.md +336 -0
  183. package/templates/skills/services/rabbitmq/SKILL.md +296 -0
  184. package/templates/skills/services/redis/SKILL.md +302 -0
  185. package/templates/skills/services/s3/SKILL.md +308 -0
  186. package/templates/skills/services/sqlite/SKILL.md +304 -0
  187. package/templates/skills/services/sqlserver/SKILL.md +304 -0
@@ -0,0 +1,360 @@
1
+ ---
2
+ name: "R"
3
+ description: "Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow)."
4
+ version: "1.0.0"
5
+ category: "languages"
6
+ author: "Rulebook"
7
+ tags: ["languages", "language"]
8
+ dependencies: []
9
+ conflicts: []
10
+ ---
11
+ <!-- R:START -->
12
+ # R Project Rules
13
+
14
+ ## Agent Automation Commands
15
+
16
+ **CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
17
+
18
+ ```bash
19
+ # Complete quality check sequence:
20
+ Rscript -e 'styler::style_pkg(dry="on")' # Format check
21
+ Rscript -e 'lintr::lint_package()' # Linting
22
+ R CMD check . # Full check
23
+ Rscript -e 'devtools::test()' # All tests
24
+
25
+ # Security audit:
26
+ Rscript -e 'pak::pkg_deps_explain()' # Dependency check
27
+ ```
28
+
29
+ ## R Configuration
30
+
31
+ **CRITICAL**: Use R 4.2+ with modern package development tools.
32
+
33
+ - **Version**: R 4.2+
34
+ - **Recommended**: R 4.3+
35
+ - **Style Guide**: tidyverse style guide
36
+ - **Testing**: testthat 3.x
37
+ - **Documentation**: roxygen2
38
+
39
+ ### DESCRIPTION File Requirements
40
+
41
+ ```
42
+ Package: yourpackage
43
+ Type: Package
44
+ Title: Your Package Title
45
+ Version: 0.1.0
46
+ Author: Your Name
47
+ Maintainer: Your Name <you@example.com>
48
+ Description: A comprehensive description of what your package does.
49
+ License: MIT + file LICENSE
50
+ Encoding: UTF-8
51
+ LazyData: true
52
+ Roxygen: list(markdown = TRUE)
53
+ RoxygenNote: 7.2.3
54
+ Depends:
55
+ R (>= 4.2)
56
+ Imports:
57
+ dplyr (>= 1.1.0),
58
+ ggplot2 (>= 3.4.0)
59
+ Suggests:
60
+ testthat (>= 3.0.0),
61
+ knitr,
62
+ rmarkdown
63
+ VignetteBuilder: knitr
64
+ ```
65
+
66
+ ## Code Quality Standards
67
+
68
+ ### Mandatory Quality Checks
69
+
70
+ **CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
71
+
72
+ **IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
73
+
74
+ ```bash
75
+ # Pre-Commit Checklist (MUST match .github/workflows/*.yml)
76
+
77
+ # 1. Format check (matches workflow - use dry="on"!)
78
+ Rscript -e "styler::style_pkg(dry = 'on')"
79
+
80
+ # 2. Lint (MUST pass with no warnings - matches workflow)
81
+ Rscript -e "lintr::lint_package()"
82
+
83
+ # 3. Run all tests (MUST pass 100% - matches workflow)
84
+ Rscript -e "devtools::test()"
85
+
86
+ # 4. Check package (matches workflow - strict CRAN checks)
87
+ R CMD build .
88
+ R CMD check *.tar.gz --as-cran --no-manual
89
+
90
+ # 5. Check coverage (MUST meet threshold)
91
+ Rscript -e "covr::package_coverage()"
92
+
93
+ # 6. Build documentation (matches workflow)
94
+ Rscript -e "devtools::document()"
95
+
96
+ # If ANY fails: ❌ DO NOT COMMIT - Fix first!
97
+ ```
98
+
99
+ **If ANY of these fail, you MUST fix the issues before committing.**
100
+
101
+ **Why This Matters:**
102
+ - Running different commands locally than in CI causes "works on my machine" failures
103
+ - CI/CD workflows will fail if commands don't match
104
+ - Example: Using `styler::style_pkg()` locally but `dry='on'` in CI = failure
105
+ - Example: Missing `--as-cran` flag = CRAN submission fails
106
+ - Example: Skipping lintr locally = CI catches style violations
107
+
108
+ ### Formatting
109
+
110
+ - Use `styler` for consistent code style
111
+ - Based on tidyverse style guide
112
+ - Configuration in `.lintr` file
113
+
114
+ Example `.lintr`:
115
+ ```
116
+ linters: linters_with_defaults(
117
+ line_length_linter(100),
118
+ object_name_linter = NULL,
119
+ cyclocomp_linter(25)
120
+ )
121
+ exclusions: list(
122
+ "tests/testthat.R"
123
+ )
124
+ ```
125
+
126
+ ### Documentation
127
+
128
+ - Use roxygen2 for function documentation
129
+ - All exported functions must be documented
130
+ - Include examples in documentation
131
+
132
+ Example roxygen2 documentation:
133
+ ```r
134
+ #' Process Data
135
+ #'
136
+ #' This function processes input data and returns cleaned results.
137
+ #'
138
+ #' @param data A data.frame with input data
139
+ #' @param threshold Numeric threshold value (default: 0.5)
140
+ #' @param verbose Logical; if TRUE, print progress messages
141
+ #'
142
+ #' @return A data.frame with processed data
143
+ #' @export
144
+ #'
145
+ #' @examples
146
+ #' data <- data.frame(x = 1:10, y = rnorm(10))
147
+ #' result <- process_data(data, threshold = 0.7)
148
+ process_data <- function(data, threshold = 0.5, verbose = FALSE) {
149
+ if (!is.data.frame(data)) {
150
+ stop("data must be a data.frame")
151
+ }
152
+
153
+ if (verbose) {
154
+ message("Processing data...")
155
+ }
156
+
157
+ # Implementation
158
+ return(data)
159
+ }
160
+ ```
161
+
162
+ ### Testing
163
+
164
+ - **Framework**: testthat 3.x
165
+ - **Location**: `/tests/testthat` directory
166
+ - **Coverage**: Must meet threshold (80%+)
167
+ - **File naming**: `test-*.R` for test files
168
+
169
+ Example test structure:
170
+ ```r
171
+ # tests/testthat/test-process.R
172
+
173
+ test_that("process_data handles valid input", {
174
+ data <- data.frame(x = 1:5, y = 1:5)
175
+ result <- process_data(data)
176
+
177
+ expect_s3_class(result, "data.frame")
178
+ expect_equal(nrow(result), 5)
179
+ })
180
+
181
+ test_that("process_data errors on invalid input", {
182
+ expect_error(
183
+ process_data("not a dataframe"),
184
+ "data must be a data.frame"
185
+ )
186
+ })
187
+
188
+ test_that("process_data respects threshold parameter", {
189
+ data <- data.frame(x = 1:10, y = rnorm(10))
190
+ result <- process_data(data, threshold = 0.7)
191
+
192
+ expect_true(all(result$y >= 0.7 | result$y <= -0.7))
193
+ })
194
+ ```
195
+
196
+ ## Package Development
197
+
198
+ ### Package Structure
199
+
200
+ ```
201
+ yourpackage/
202
+ ├── DESCRIPTION # Package metadata
203
+ ├── NAMESPACE # Auto-generated by roxygen2
204
+ ├── LICENSE # License file
205
+ ├── README.md # Package overview
206
+ ├── NEWS.md # Changelog
207
+ ├── R/
208
+ │ ├── package.R # Package-level documentation
209
+ │ ├── data.R # Data documentation
210
+ │ └── functions.R # Function implementations
211
+ ├── man/ # Auto-generated documentation
212
+ ├── tests/
213
+ │ ├── testthat.R
214
+ │ └── testthat/
215
+ │ ├── test-functions.R
216
+ │ └── test-data.R
217
+ ├── data/ # Package data
218
+ ├── inst/ # Installed files
219
+ └── vignettes/ # Long-form documentation
220
+ ```
221
+
222
+ ### Development Workflow
223
+
224
+ ```r
225
+ # Load package for development
226
+ devtools::load_all()
227
+
228
+ # Run tests
229
+ devtools::test()
230
+
231
+ # Check package
232
+ devtools::check()
233
+
234
+ # Generate documentation
235
+ devtools::document()
236
+
237
+ # Build package
238
+ devtools::build()
239
+
240
+ # Install locally
241
+ devtools::install()
242
+ ```
243
+
244
+ ## Dependencies
245
+
246
+ ### CRAN vs GitHub Packages
247
+
248
+ ```r
249
+ # From CRAN
250
+ install.packages("dplyr")
251
+
252
+ # From GitHub
253
+ devtools::install_github("tidyverse/dplyr")
254
+
255
+ # Specify in DESCRIPTION:
256
+ Imports:
257
+ dplyr (>= 1.1.0)
258
+ Remotes:
259
+ github::tidyverse/dplyr@main
260
+ ```
261
+
262
+ ## Best Practices
263
+
264
+ ### DO's ✅
265
+
266
+ - **USE** tidyverse principles
267
+ - **DOCUMENT** all exported functions
268
+ - **TEST** all functionality
269
+ - **CHECK** inputs with `stopifnot()` or custom validation
270
+ - **RETURN** consistent types
271
+ - **NAMESPACE** use explicit `::` for external functions
272
+ - **VECTORIZE** operations when possible
273
+
274
+ ### DON'Ts ❌
275
+
276
+ - **NEVER** use `T` or `F` (use `TRUE` and `FALSE`)
277
+ - **NEVER** use `attach()` or `<<-` in packages
278
+ - **NEVER** modify global options
279
+ - **NEVER** use `library()` inside functions
280
+ - **NEVER** leave `browser()` or `print()` debug code
281
+ - **NEVER** assume working directory
282
+
283
+ Example code style:
284
+ ```r
285
+ # ✅ GOOD: Proper function structure
286
+ process_data <- function(data, threshold = 0.5) {
287
+ # Input validation
288
+ stopifnot(
289
+ is.data.frame(data),
290
+ is.numeric(threshold),
291
+ threshold >= 0, threshold <= 1
292
+ )
293
+
294
+ # Use explicit namespace
295
+ result <- dplyr::filter(data, value > threshold)
296
+
297
+ return(result)
298
+ }
299
+
300
+ # ❌ BAD: Poor practices
301
+ process_data <- function(data, threshold = 0.5) {
302
+ library(dplyr) # DON'T load packages in functions!
303
+ attach(data) # NEVER use attach()!
304
+
305
+ result <- filter(data, value > threshold) # Unclear where filter comes from
306
+ result <<- result # DON'T use global assignment!
307
+
308
+ print(result) # Don't print inside functions
309
+ }
310
+ ```
311
+
312
+ ## CI/CD Requirements
313
+
314
+ Must include GitHub Actions workflows:
315
+
316
+ 1. **Testing** (`r-test.yml`):
317
+ - Test on ubuntu-latest, windows-latest, macos-latest
318
+ - R versions: release, devel
319
+ - Use R CMD check --as-cran
320
+ - Upload coverage to Codecov
321
+
322
+ 2. **Linting** (`r-lint.yml`):
323
+ - Run lintr checks
324
+ - Check style with styler
325
+ - Verify roxygen2 documentation
326
+
327
+ 3. **CRAN Check** (`r-cran.yml`):
328
+ - R CMD check with --as-cran
329
+ - Verify no NOTEs, WARNINGs, or ERRORs
330
+
331
+ ## Publishing to CRAN
332
+
333
+ ### Pre-Submission Checklist
334
+
335
+ - ✅ All tests passing
336
+ - ✅ R CMD check --as-cran passes with 0 NOTEs
337
+ - ✅ Package documentation complete
338
+ - ✅ NEWS.md updated
339
+ - ✅ README.md current
340
+ - ✅ Examples run successfully
341
+ - ✅ Vignettes build correctly
342
+ - ✅ Valid LICENSE file
343
+ - ✅ No submission policy violations
344
+
345
+ ### Submission Process
346
+
347
+ ```r
348
+ # 1. Final check
349
+ devtools::check(cran = TRUE)
350
+
351
+ # 2. Build package
352
+ devtools::build()
353
+
354
+ # 3. Submit to CRAN
355
+ devtools::submit_cran()
356
+
357
+ # 4. Respond to CRAN feedback promptly
358
+ ```
359
+
360
+ <!-- R:END -->