@hivehub/rulebook 5.4.0 → 5.4.1

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 (454) hide show
  1. package/.claude/commands/analysis.md +35 -35
  2. package/.claude/commands/continue.md +33 -33
  3. package/.claude/commands/ralph-config.md +112 -112
  4. package/.claude/commands/ralph-history.md +110 -110
  5. package/.claude/commands/ralph-init.md +72 -72
  6. package/.claude/commands/ralph-pause-resume.md +105 -105
  7. package/.claude/commands/ralph-run.md +101 -101
  8. package/.claude/commands/ralph-status.md +76 -76
  9. package/.claude/commands/rulebook-decision-create.md +55 -55
  10. package/.claude/commands/rulebook-decision-list.md +15 -15
  11. package/.claude/commands/rulebook-knowledge-add.md +41 -41
  12. package/.claude/commands/rulebook-knowledge-list.md +15 -15
  13. package/.claude/commands/rulebook-learn-capture.md +48 -48
  14. package/.claude/commands/rulebook-learn-list.md +13 -13
  15. package/.claude/commands/rulebook-memory-save.md +48 -48
  16. package/.claude/commands/rulebook-memory-search.md +47 -47
  17. package/.claude/commands/rulebook-task-apply.md +67 -67
  18. package/.claude/commands/rulebook-task-archive.md +94 -94
  19. package/.claude/commands/rulebook-task-create.md +93 -93
  20. package/.claude/commands/rulebook-task-list.md +42 -42
  21. package/.claude/commands/rulebook-task-show.md +52 -52
  22. package/.claude/commands/rulebook-task-validate.md +53 -53
  23. package/.claude-plugin/marketplace.json +28 -28
  24. package/.claude-plugin/plugin.json +8 -8
  25. package/LICENSE +191 -191
  26. package/README.md +393 -393
  27. package/dist/index.js +0 -0
  28. package/dist/mcp/rulebook-server.js +0 -0
  29. package/package.json +22 -21
  30. package/templates/agents/accessibility-reviewer.md +43 -43
  31. package/templates/agents/api-designer.md +42 -42
  32. package/templates/agents/architect.md +51 -51
  33. package/templates/agents/build-engineer.md +36 -36
  34. package/templates/agents/code-reviewer.md +47 -47
  35. package/templates/agents/compiler/codegen-debugger.md +34 -34
  36. package/templates/agents/compiler/stdlib-engineer.md +28 -28
  37. package/templates/agents/compiler/test-coverage-guardian.md +31 -31
  38. package/templates/agents/context-intelligence.md +52 -52
  39. package/templates/agents/database-architect.md +41 -41
  40. package/templates/agents/devops-engineer.md +42 -42
  41. package/templates/agents/docs-writer.md +38 -38
  42. package/templates/agents/game-engine/cpp-core-expert.md +35 -35
  43. package/templates/agents/game-engine/render-engineer.md +22 -22
  44. package/templates/agents/game-engine/shader-engineer.md +38 -38
  45. package/templates/agents/game-engine/systems-integration.md +43 -43
  46. package/templates/agents/generic/code-reviewer.md +41 -41
  47. package/templates/agents/generic/docs-writer.md +25 -25
  48. package/templates/agents/generic/project-manager.md +36 -36
  49. package/templates/agents/generic/researcher.md +34 -34
  50. package/templates/agents/generic/test-engineer.md +41 -41
  51. package/templates/agents/i18n-engineer.md +42 -42
  52. package/templates/agents/implementer.md +42 -42
  53. package/templates/agents/migration-engineer.md +42 -42
  54. package/templates/agents/mobile/platform-specialist.md +22 -22
  55. package/templates/agents/mobile/ui-engineer.md +22 -22
  56. package/templates/agents/performance-engineer.md +49 -49
  57. package/templates/agents/refactoring-agent.md +41 -41
  58. package/templates/agents/researcher.md +38 -38
  59. package/templates/agents/security-reviewer.md +40 -40
  60. package/templates/agents/team-lead.md +37 -37
  61. package/templates/agents/tester.md +48 -48
  62. package/templates/agents/ux-reviewer.md +43 -43
  63. package/templates/agents/web-app/api-designer.md +22 -22
  64. package/templates/agents/web-app/backend-engineer.md +30 -30
  65. package/templates/agents/web-app/database-engineer.md +22 -22
  66. package/templates/agents/web-app/frontend-engineer.md +29 -29
  67. package/templates/agents/web-app/security-reviewer.md +32 -32
  68. package/templates/ci/rulebook-review.yml +26 -26
  69. package/templates/cli/AIDER.md +49 -49
  70. package/templates/cli/AMAZON_Q.md +25 -25
  71. package/templates/cli/AUGGIE.md +32 -32
  72. package/templates/cli/CLAUDE.md +117 -117
  73. package/templates/cli/CLINE.md +99 -99
  74. package/templates/cli/CODEBUDDY.md +20 -20
  75. package/templates/cli/CODEIUM.md +20 -20
  76. package/templates/cli/CODEX.md +21 -21
  77. package/templates/cli/CONTINUE.md +34 -34
  78. package/templates/cli/CURSOR_CLI.md +62 -62
  79. package/templates/cli/FACTORY.md +18 -18
  80. package/templates/cli/GEMINI.md +35 -35
  81. package/templates/cli/KILOCODE.md +18 -18
  82. package/templates/cli/OPENCODE.md +18 -18
  83. package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
  84. package/templates/cli/gemini-extension.json +77 -77
  85. package/templates/commands/rulebook-decision-create.md +55 -55
  86. package/templates/commands/rulebook-decision-list.md +15 -15
  87. package/templates/commands/rulebook-knowledge-add.md +41 -41
  88. package/templates/commands/rulebook-knowledge-list.md +15 -15
  89. package/templates/commands/rulebook-learn-capture.md +48 -48
  90. package/templates/commands/rulebook-learn-list.md +13 -13
  91. package/templates/commands/rulebook-memory-save.md +48 -48
  92. package/templates/commands/rulebook-memory-search.md +47 -47
  93. package/templates/commands/rulebook-task-apply.md +67 -67
  94. package/templates/commands/rulebook-task-archive.md +94 -94
  95. package/templates/commands/rulebook-task-create.md +93 -93
  96. package/templates/commands/rulebook-task-list.md +42 -42
  97. package/templates/commands/rulebook-task-show.md +52 -52
  98. package/templates/commands/rulebook-task-validate.md +53 -53
  99. package/templates/compact-context/_default.md +23 -23
  100. package/templates/compact-context/cpp.md +26 -26
  101. package/templates/compact-context/go.md +26 -26
  102. package/templates/compact-context/python.md +26 -26
  103. package/templates/compact-context/rust.md +28 -28
  104. package/templates/compact-context/typescript.md +29 -29
  105. package/templates/core/AGENTS_OVERRIDE.md +16 -16
  106. package/templates/core/AGENT_AUTOMATION.md +296 -296
  107. package/templates/core/CLAUDE_MD_v2.md +71 -71
  108. package/templates/core/DAG.md +304 -304
  109. package/templates/core/DECISIONS.md +38 -38
  110. package/templates/core/DOCUMENTATION_RULES.md +36 -36
  111. package/templates/core/KNOWLEDGE.md +49 -49
  112. package/templates/core/MULTI_AGENT.md +74 -74
  113. package/templates/core/PLANS.md +28 -28
  114. package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
  115. package/templates/core/RALPH.md +471 -471
  116. package/templates/core/RULEBOOK.md +1947 -1947
  117. package/templates/core/TIER1_PROHIBITIONS.md +154 -154
  118. package/templates/core/TOKEN_OPTIMIZATION.md +49 -49
  119. package/templates/core/WORKSPACE.md +69 -69
  120. package/templates/frameworks/ANGULAR.md +36 -36
  121. package/templates/frameworks/DJANGO.md +83 -83
  122. package/templates/frameworks/ELECTRON.md +147 -147
  123. package/templates/frameworks/FLASK.md +38 -38
  124. package/templates/frameworks/FLUTTER.md +55 -55
  125. package/templates/frameworks/JQUERY.md +32 -32
  126. package/templates/frameworks/LARAVEL.md +38 -38
  127. package/templates/frameworks/NESTJS.md +43 -43
  128. package/templates/frameworks/NEXTJS.md +127 -127
  129. package/templates/frameworks/NUXT.md +40 -40
  130. package/templates/frameworks/RAILS.md +66 -66
  131. package/templates/frameworks/REACT.md +38 -38
  132. package/templates/frameworks/REACT_NATIVE.md +47 -47
  133. package/templates/frameworks/SPRING.md +39 -39
  134. package/templates/frameworks/SYMFONY.md +36 -36
  135. package/templates/frameworks/VUE.md +36 -36
  136. package/templates/frameworks/ZEND.md +35 -35
  137. package/templates/git/CI_CD_PATTERNS.md +661 -661
  138. package/templates/git/GITHUB_ACTIONS.md +728 -728
  139. package/templates/git/GITLAB_CI.md +730 -730
  140. package/templates/git/GIT_WORKFLOW.md +1192 -1192
  141. package/templates/git/SECRETS_MANAGEMENT.md +585 -585
  142. package/templates/hooks/COMMIT_MSG.md +530 -530
  143. package/templates/hooks/POST_CHECKOUT.md +546 -546
  144. package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
  145. package/templates/hooks/PRE_COMMIT.md +414 -414
  146. package/templates/hooks/PRE_PUSH.md +601 -601
  147. package/templates/hooks/check-context-and-handoff.ps1 +58 -58
  148. package/templates/hooks/check-context-and-handoff.sh +76 -76
  149. package/templates/hooks/enforce-team-for-background-agents.ps1 +63 -63
  150. package/templates/hooks/enforce-team-for-background-agents.sh +55 -55
  151. package/templates/hooks/on-compact-reinject.sh +34 -34
  152. package/templates/hooks/resume-from-handoff.ps1 +40 -40
  153. package/templates/hooks/resume-from-handoff.sh +61 -61
  154. package/templates/hooks/terse-activate.ps1 +143 -143
  155. package/templates/hooks/terse-activate.sh +197 -197
  156. package/templates/hooks/terse-mode-tracker.ps1 +153 -153
  157. package/templates/hooks/terse-mode-tracker.sh +187 -187
  158. package/templates/ides/CONTINUE_RULES.md +16 -16
  159. package/templates/ides/COPILOT.md +37 -37
  160. package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
  161. package/templates/ides/CURSOR.md +43 -43
  162. package/templates/ides/GEMINI_RULES.md +17 -17
  163. package/templates/ides/JETBRAINS_AI.md +35 -35
  164. package/templates/ides/REPLIT.md +36 -36
  165. package/templates/ides/TABNINE.md +29 -29
  166. package/templates/ides/VSCODE.md +40 -40
  167. package/templates/ides/WINDSURF.md +36 -36
  168. package/templates/ides/WINDSURF_RULES.md +14 -14
  169. package/templates/ides/ZED.md +32 -32
  170. package/templates/ides/cursor-mdc/go.mdc +24 -24
  171. package/templates/ides/cursor-mdc/python.mdc +24 -24
  172. package/templates/ides/cursor-mdc/quality.mdc +25 -25
  173. package/templates/ides/cursor-mdc/ralph.mdc +39 -39
  174. package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
  175. package/templates/ides/cursor-mdc/rust.mdc +24 -24
  176. package/templates/ides/cursor-mdc/typescript.mdc +25 -25
  177. package/templates/languages/C.md +333 -333
  178. package/templates/languages/CPP.md +743 -743
  179. package/templates/languages/CSHARP.md +417 -417
  180. package/templates/languages/ELIXIR.md +454 -454
  181. package/templates/languages/ERLANG.md +361 -361
  182. package/templates/languages/GO.md +645 -645
  183. package/templates/languages/HASKELL.md +177 -177
  184. package/templates/languages/JAVA.md +607 -607
  185. package/templates/languages/JAVASCRIPT.md +631 -631
  186. package/templates/languages/JULIA.md +97 -97
  187. package/templates/languages/KOTLIN.md +511 -511
  188. package/templates/languages/LISP.md +100 -100
  189. package/templates/languages/LUA.md +74 -74
  190. package/templates/languages/OBJECTIVEC.md +90 -90
  191. package/templates/languages/PHP.md +416 -416
  192. package/templates/languages/PYTHON.md +682 -682
  193. package/templates/languages/RUBY.md +421 -421
  194. package/templates/languages/RUST.md +477 -477
  195. package/templates/languages/SAS.md +73 -73
  196. package/templates/languages/SCALA.md +348 -348
  197. package/templates/languages/SOLIDITY.md +580 -580
  198. package/templates/languages/SQL.md +137 -137
  199. package/templates/languages/SWIFT.md +466 -466
  200. package/templates/languages/TYPESCRIPT.md +591 -591
  201. package/templates/languages/ZIG.md +265 -265
  202. package/templates/modules/ATLASSIAN.md +255 -255
  203. package/templates/modules/CONTEXT7.md +54 -54
  204. package/templates/modules/FIGMA.md +267 -267
  205. package/templates/modules/GITHUB_MCP.md +64 -64
  206. package/templates/modules/GRAFANA.md +328 -328
  207. package/templates/modules/MEMORY.md +126 -126
  208. package/templates/modules/NOTION.md +247 -247
  209. package/templates/modules/PLAYWRIGHT.md +90 -90
  210. package/templates/modules/RULEBOOK_MCP.md +208 -208
  211. package/templates/modules/SERENA.md +337 -337
  212. package/templates/modules/SUPABASE.md +223 -223
  213. package/templates/modules/SYNAP.md +69 -69
  214. package/templates/modules/VECTORIZER.md +63 -63
  215. package/templates/modules/sequential-thinking.md +42 -42
  216. package/templates/ralph/ralph-history.bat +4 -4
  217. package/templates/ralph/ralph-history.sh +5 -5
  218. package/templates/ralph/ralph-init.bat +5 -5
  219. package/templates/ralph/ralph-init.sh +5 -5
  220. package/templates/ralph/ralph-pause.bat +5 -5
  221. package/templates/ralph/ralph-pause.sh +5 -5
  222. package/templates/ralph/ralph-run.bat +5 -5
  223. package/templates/ralph/ralph-run.sh +5 -5
  224. package/templates/ralph/ralph-status.bat +4 -4
  225. package/templates/ralph/ralph-status.sh +5 -5
  226. package/templates/rules/consult-analysis-before-implementing.md +23 -23
  227. package/templates/rules/cpp.md +46 -46
  228. package/templates/rules/csharp.md +44 -44
  229. package/templates/rules/diagnostic-first.md +39 -39
  230. package/templates/rules/fail-twice-escalate.md +46 -46
  231. package/templates/rules/follow-task-sequence.md +36 -36
  232. package/templates/rules/git-safety.md +29 -29
  233. package/templates/rules/go.md +40 -40
  234. package/templates/rules/incremental-implementation.md +56 -56
  235. package/templates/rules/incremental-tests.md +29 -29
  236. package/templates/rules/java.md +43 -43
  237. package/templates/rules/javascript.md +39 -39
  238. package/templates/rules/knowledge-base-usage.md +41 -41
  239. package/templates/rules/multi-agent-teams.md +75 -75
  240. package/templates/rules/no-deferred.md +31 -31
  241. package/templates/rules/no-shortcuts.md +30 -30
  242. package/templates/rules/python.md +43 -43
  243. package/templates/rules/research-first.md +30 -30
  244. package/templates/rules/respect-handoff-trigger.md +41 -41
  245. package/templates/rules/rust.md +40 -40
  246. package/templates/rules/sequential-editing.md +21 -21
  247. package/templates/rules/session-workflow.md +24 -24
  248. package/templates/rules/task-decomposition.md +32 -32
  249. package/templates/rules/typescript.md +40 -40
  250. package/templates/services/AZURE_BLOB.md +184 -184
  251. package/templates/services/CASSANDRA.md +239 -239
  252. package/templates/services/DATADOG.md +26 -26
  253. package/templates/services/DOCKER.md +124 -124
  254. package/templates/services/DOCKER_COMPOSE.md +168 -168
  255. package/templates/services/DYNAMODB.md +308 -308
  256. package/templates/services/ELASTICSEARCH.md +347 -347
  257. package/templates/services/GCS.md +178 -178
  258. package/templates/services/HELM.md +194 -194
  259. package/templates/services/INFLUXDB.md +265 -265
  260. package/templates/services/KAFKA.md +341 -341
  261. package/templates/services/KUBERNETES.md +208 -208
  262. package/templates/services/MARIADB.md +183 -183
  263. package/templates/services/MEMCACHED.md +242 -242
  264. package/templates/services/MINIO.md +201 -201
  265. package/templates/services/MONGODB.md +268 -268
  266. package/templates/services/MYSQL.md +358 -358
  267. package/templates/services/NEO4J.md +247 -247
  268. package/templates/services/OPENTELEMETRY.md +25 -25
  269. package/templates/services/ORACLE.md +290 -290
  270. package/templates/services/PINO.md +24 -24
  271. package/templates/services/POSTGRESQL.md +326 -326
  272. package/templates/services/PROMETHEUS.md +33 -33
  273. package/templates/services/RABBITMQ.md +286 -286
  274. package/templates/services/REDIS.md +292 -292
  275. package/templates/services/S3.md +298 -298
  276. package/templates/services/SENTRY.md +23 -23
  277. package/templates/services/SQLITE.md +294 -294
  278. package/templates/services/SQLSERVER.md +294 -294
  279. package/templates/services/WINSTON.md +30 -30
  280. package/templates/skills/cli/aider/SKILL.md +59 -59
  281. package/templates/skills/cli/amazon-q/SKILL.md +35 -35
  282. package/templates/skills/cli/auggie/SKILL.md +42 -42
  283. package/templates/skills/cli/claude/SKILL.md +42 -42
  284. package/templates/skills/cli/cline/SKILL.md +42 -42
  285. package/templates/skills/cli/codebuddy/SKILL.md +30 -30
  286. package/templates/skills/cli/codeium/SKILL.md +30 -30
  287. package/templates/skills/cli/codex/SKILL.md +31 -31
  288. package/templates/skills/cli/continue/SKILL.md +44 -44
  289. package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
  290. package/templates/skills/cli/factory/SKILL.md +28 -28
  291. package/templates/skills/cli/gemini/SKILL.md +45 -45
  292. package/templates/skills/cli/kilocode/SKILL.md +28 -28
  293. package/templates/skills/cli/opencode/SKILL.md +28 -28
  294. package/templates/skills/core/agent-automation/SKILL.md +194 -194
  295. package/templates/skills/core/dag/SKILL.md +314 -314
  296. package/templates/skills/core/documentation-rules/SKILL.md +46 -46
  297. package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
  298. package/templates/skills/core/rulebook/SKILL.md +176 -176
  299. package/templates/skills/core/rulebook-terse/SKILL.md +116 -116
  300. package/templates/skills/core/rulebook-terse-commit/SKILL.md +96 -96
  301. package/templates/skills/core/rulebook-terse-review/SKILL.md +112 -112
  302. package/templates/skills/dev/accessibility/SKILL.md +17 -17
  303. package/templates/skills/dev/analysis/SKILL.md +19 -19
  304. package/templates/skills/dev/api-design/SKILL.md +15 -15
  305. package/templates/skills/dev/architect/SKILL.md +17 -17
  306. package/templates/skills/dev/build-fix/SKILL.md +17 -17
  307. package/templates/skills/dev/db-design/SKILL.md +15 -15
  308. package/templates/skills/dev/debug/SKILL.md +16 -16
  309. package/templates/skills/dev/deploy/SKILL.md +17 -17
  310. package/templates/skills/dev/docs/SKILL.md +17 -17
  311. package/templates/skills/dev/handoff/SKILL.md +27 -27
  312. package/templates/skills/dev/migrate/SKILL.md +15 -15
  313. package/templates/skills/dev/perf/SKILL.md +17 -17
  314. package/templates/skills/dev/refactor/SKILL.md +17 -17
  315. package/templates/skills/dev/research/SKILL.md +14 -14
  316. package/templates/skills/dev/review/SKILL.md +18 -18
  317. package/templates/skills/dev/security-audit/SKILL.md +17 -17
  318. package/templates/skills/frameworks/angular/SKILL.md +46 -46
  319. package/templates/skills/frameworks/django/SKILL.md +93 -93
  320. package/templates/skills/frameworks/electron/SKILL.md +157 -157
  321. package/templates/skills/frameworks/flask/SKILL.md +48 -48
  322. package/templates/skills/frameworks/flutter/SKILL.md +65 -65
  323. package/templates/skills/frameworks/jquery/SKILL.md +42 -42
  324. package/templates/skills/frameworks/laravel/SKILL.md +48 -48
  325. package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
  326. package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
  327. package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
  328. package/templates/skills/frameworks/rails/SKILL.md +76 -76
  329. package/templates/skills/frameworks/react/SKILL.md +48 -48
  330. package/templates/skills/frameworks/react-native/SKILL.md +57 -57
  331. package/templates/skills/frameworks/spring/SKILL.md +49 -49
  332. package/templates/skills/frameworks/symfony/SKILL.md +46 -46
  333. package/templates/skills/frameworks/vue/SKILL.md +46 -46
  334. package/templates/skills/frameworks/zend/SKILL.md +45 -45
  335. package/templates/skills/ides/copilot/SKILL.md +47 -47
  336. package/templates/skills/ides/cursor/SKILL.md +53 -53
  337. package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
  338. package/templates/skills/ides/replit/SKILL.md +46 -46
  339. package/templates/skills/ides/tabnine/SKILL.md +39 -39
  340. package/templates/skills/ides/vscode/SKILL.md +50 -50
  341. package/templates/skills/ides/windsurf/SKILL.md +46 -46
  342. package/templates/skills/ides/zed/SKILL.md +42 -42
  343. package/templates/skills/languages/c/SKILL.md +343 -343
  344. package/templates/skills/languages/cpp/SKILL.md +753 -753
  345. package/templates/skills/languages/csharp/SKILL.md +427 -427
  346. package/templates/skills/languages/elixir/SKILL.md +464 -464
  347. package/templates/skills/languages/erlang/SKILL.md +371 -371
  348. package/templates/skills/languages/go/SKILL.md +655 -655
  349. package/templates/skills/languages/haskell/SKILL.md +187 -187
  350. package/templates/skills/languages/java/SKILL.md +617 -617
  351. package/templates/skills/languages/javascript/SKILL.md +641 -641
  352. package/templates/skills/languages/julia/SKILL.md +107 -107
  353. package/templates/skills/languages/kotlin/SKILL.md +521 -521
  354. package/templates/skills/languages/lisp/SKILL.md +110 -110
  355. package/templates/skills/languages/lua/SKILL.md +84 -84
  356. package/templates/skills/languages/objectivec/SKILL.md +100 -100
  357. package/templates/skills/languages/php/SKILL.md +426 -426
  358. package/templates/skills/languages/python/SKILL.md +692 -692
  359. package/templates/skills/languages/ruby/SKILL.md +431 -431
  360. package/templates/skills/languages/rust/SKILL.md +487 -487
  361. package/templates/skills/languages/sas/SKILL.md +83 -83
  362. package/templates/skills/languages/scala/SKILL.md +358 -358
  363. package/templates/skills/languages/solidity/SKILL.md +590 -590
  364. package/templates/skills/languages/sql/SKILL.md +147 -147
  365. package/templates/skills/languages/swift/SKILL.md +476 -476
  366. package/templates/skills/languages/typescript/SKILL.md +302 -302
  367. package/templates/skills/languages/zig/SKILL.md +275 -275
  368. package/templates/skills/modules/atlassian/SKILL.md +265 -265
  369. package/templates/skills/modules/context7/SKILL.md +64 -64
  370. package/templates/skills/modules/figma/SKILL.md +277 -277
  371. package/templates/skills/modules/github-mcp/SKILL.md +74 -74
  372. package/templates/skills/modules/grafana/SKILL.md +338 -338
  373. package/templates/skills/modules/memory/SKILL.md +73 -73
  374. package/templates/skills/modules/notion/SKILL.md +257 -257
  375. package/templates/skills/modules/playwright/SKILL.md +100 -100
  376. package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
  377. package/templates/skills/modules/serena/SKILL.md +347 -347
  378. package/templates/skills/modules/supabase/SKILL.md +233 -233
  379. package/templates/skills/modules/synap/SKILL.md +79 -79
  380. package/templates/skills/modules/vectorizer/SKILL.md +73 -73
  381. package/templates/skills/services/azure-blob/SKILL.md +194 -194
  382. package/templates/skills/services/cassandra/SKILL.md +249 -249
  383. package/templates/skills/services/dynamodb/SKILL.md +318 -318
  384. package/templates/skills/services/elasticsearch/SKILL.md +357 -357
  385. package/templates/skills/services/gcs/SKILL.md +188 -188
  386. package/templates/skills/services/influxdb/SKILL.md +275 -275
  387. package/templates/skills/services/kafka/SKILL.md +351 -351
  388. package/templates/skills/services/mariadb/SKILL.md +193 -193
  389. package/templates/skills/services/memcached/SKILL.md +252 -252
  390. package/templates/skills/services/minio/SKILL.md +211 -211
  391. package/templates/skills/services/mongodb/SKILL.md +278 -278
  392. package/templates/skills/services/mysql/SKILL.md +368 -368
  393. package/templates/skills/services/neo4j/SKILL.md +257 -257
  394. package/templates/skills/services/oracle/SKILL.md +300 -300
  395. package/templates/skills/services/postgresql/SKILL.md +336 -336
  396. package/templates/skills/services/rabbitmq/SKILL.md +296 -296
  397. package/templates/skills/services/redis/SKILL.md +302 -302
  398. package/templates/skills/services/s3/SKILL.md +308 -308
  399. package/templates/skills/services/sqlite/SKILL.md +304 -304
  400. package/templates/skills/services/sqlserver/SKILL.md +304 -304
  401. package/templates/skills/workflows/ralph/SKILL.md +309 -309
  402. package/templates/skills/workflows/ralph/install.sh +87 -87
  403. package/templates/skills/workflows/ralph/manifest.json +158 -158
  404. package/templates/workflows/codespell.yml +31 -31
  405. package/templates/workflows/cpp-lint.yml +47 -47
  406. package/templates/workflows/cpp-publish.yml +119 -119
  407. package/templates/workflows/cpp-test.yml +77 -77
  408. package/templates/workflows/dotnet-lint.yml +29 -29
  409. package/templates/workflows/dotnet-publish.yml +40 -40
  410. package/templates/workflows/dotnet-test.yml +41 -41
  411. package/templates/workflows/elixir-lint.yml +45 -45
  412. package/templates/workflows/elixir-publish.yml +49 -49
  413. package/templates/workflows/elixir-test.yml +54 -54
  414. package/templates/workflows/erlang-lint.yml +47 -47
  415. package/templates/workflows/erlang-test.yml +62 -62
  416. package/templates/workflows/go-lint.yml +39 -39
  417. package/templates/workflows/go-publish.yml +95 -95
  418. package/templates/workflows/go-test.yml +59 -59
  419. package/templates/workflows/java-lint.yml +60 -60
  420. package/templates/workflows/java-publish.yml +120 -120
  421. package/templates/workflows/java-test.yml +85 -85
  422. package/templates/workflows/kotlin-lint.yml +34 -34
  423. package/templates/workflows/kotlin-publish.yml +56 -56
  424. package/templates/workflows/kotlin-test.yml +48 -48
  425. package/templates/workflows/php-lint.yml +39 -39
  426. package/templates/workflows/php-publish.yml +50 -50
  427. package/templates/workflows/php-test.yml +54 -54
  428. package/templates/workflows/python-lint.yml +47 -47
  429. package/templates/workflows/python-publish.yml +91 -91
  430. package/templates/workflows/python-test.yml +59 -59
  431. package/templates/workflows/rust-lint.yml +54 -54
  432. package/templates/workflows/rust-publish.yml +66 -66
  433. package/templates/workflows/rust-test.yml +75 -75
  434. package/templates/workflows/solidity-lint.yml +41 -41
  435. package/templates/workflows/solidity-test.yml +47 -47
  436. package/templates/workflows/swift-lint.yml +32 -32
  437. package/templates/workflows/swift-publish.yml +58 -58
  438. package/templates/workflows/swift-test.yml +44 -44
  439. package/templates/workflows/typescript-publish.yml +60 -60
  440. package/templates/workflows/typescript-test.yml +73 -73
  441. package/templates/workflows/zig-lint.yml +27 -27
  442. package/templates/workflows/zig-test.yml +40 -40
  443. package/dist/hooks/terse-activate.d.ts +0 -59
  444. package/dist/hooks/terse-activate.d.ts.map +0 -1
  445. package/dist/hooks/terse-activate.js +0 -149
  446. package/dist/hooks/terse-activate.js.map +0 -1
  447. package/dist/hooks/terse-config.d.ts +0 -51
  448. package/dist/hooks/terse-config.d.ts.map +0 -1
  449. package/dist/hooks/terse-config.js +0 -130
  450. package/dist/hooks/terse-config.js.map +0 -1
  451. package/dist/hooks/terse-mode-tracker.d.ts +0 -78
  452. package/dist/hooks/terse-mode-tracker.d.ts.map +0 -1
  453. package/dist/hooks/terse-mode-tracker.js +0 -213
  454. package/dist/hooks/terse-mode-tracker.js.map +0 -1
@@ -1,753 +1,753 @@
1
- ---
2
- name: "C++"
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
- <!-- CPP:START -->
12
- # C/C++ 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
- clang-format --dry-run --Werror src/**/*.cpp # Format check
21
- clang-tidy src/**/*.cpp # Linting
22
- make test # All tests (100% pass)
23
- make # Build verification
24
-
25
- # Additional checks:
26
- cppcheck --enable=all src/ # Static analysis
27
- valgrind --leak-check=full ./build/test # Memory check
28
- ```
29
-
30
- ## C/C++ Configuration
31
-
32
- **CRITICAL**: Use C++20 or C++23 with modern CMake.
33
-
34
- - **C++ Standard**: C++20 or C++23
35
- - **CMake**: 3.25+
36
- - **Compiler**: GCC 11+, Clang 15+, or MSVC 19.30+
37
- - **Build System**: CMake (recommended) or Meson
38
- - **Package Manager**: Conan or vcpkg
39
-
40
- ### CMakeLists.txt Requirements
41
-
42
- ```cmake
43
- cmake_minimum_required(VERSION 3.25)
44
- project(YourProject VERSION 1.0.0 LANGUAGES CXX)
45
-
46
- # C++ Standard
47
- set(CMAKE_CXX_STANDARD 20)
48
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
49
- set(CMAKE_CXX_EXTENSIONS OFF)
50
-
51
- # Compiler warnings
52
- if(MSVC)
53
- add_compile_options(/W4 /WX)
54
- else()
55
- add_compile_options(-Wall -Wextra -Wpedantic -Werror)
56
- endif()
57
-
58
- # Export compile commands for tooling
59
- set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
60
-
61
- # Project options
62
- option(BUILD_TESTING "Build tests" ON)
63
- option(BUILD_DOCS "Build documentation" ON)
64
- option(ENABLE_SANITIZERS "Enable sanitizers" ON)
65
-
66
- # Dependencies (using FetchContent or find_package)
67
- include(FetchContent)
68
-
69
- FetchContent_Declare(
70
- googletest
71
- GIT_REPOSITORY https://github.com/google/googletest.git
72
- GIT_TAG v1.14.0
73
- )
74
- FetchContent_MakeAvailable(googletest)
75
-
76
- # Library
77
- add_library(${PROJECT_NAME}
78
- src/your_module.cpp
79
- src/your_module.hpp
80
- )
81
-
82
- target_include_directories(${PROJECT_NAME}
83
- PUBLIC
84
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
85
- $<INSTALL_INTERFACE:include>
86
- PRIVATE
87
- ${CMAKE_CURRENT_SOURCE_DIR}/src
88
- )
89
-
90
- # Enable sanitizers in debug
91
- if(ENABLE_SANITIZERS AND CMAKE_BUILD_TYPE MATCHES Debug)
92
- target_compile_options(${PROJECT_NAME} PRIVATE
93
- -fsanitize=address
94
- -fsanitize=undefined
95
- -fno-omit-frame-pointer
96
- )
97
- target_link_options(${PROJECT_NAME} PRIVATE
98
- -fsanitize=address
99
- -fsanitize=undefined
100
- )
101
- endif()
102
-
103
- # Tests
104
- if(BUILD_TESTING)
105
- enable_testing()
106
- add_subdirectory(tests)
107
- endif()
108
-
109
- # Installation
110
- install(TARGETS ${PROJECT_NAME}
111
- EXPORT ${PROJECT_NAME}Targets
112
- LIBRARY DESTINATION lib
113
- ARCHIVE DESTINATION lib
114
- RUNTIME DESTINATION bin
115
- INCLUDES DESTINATION include
116
- )
117
- ```
118
-
119
- ## Code Quality Standards
120
-
121
- ### Mandatory Quality Checks
122
-
123
- **CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
124
-
125
- **IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
126
-
127
- ```bash
128
- # Pre-Commit Checklist (MUST match .github/workflows/*.yml)
129
-
130
- # 1. Format check (matches workflow - use --dry-run, not -i!)
131
- clang-format --dry-run --Werror src/**/*.{cpp,hpp} tests/**/*.{cpp,hpp}
132
-
133
- # 2. Static analysis (matches workflow)
134
- clang-tidy src/**/*.cpp -- -std=c++20
135
-
136
- # 3. Build (MUST pass with no warnings - matches workflow)
137
- cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-Werror"
138
- cmake --build build
139
-
140
- # 4. Run all tests (MUST pass 100% - matches workflow)
141
- ctest --test-dir build --output-on-failure
142
-
143
- # 5. Check with sanitizers (matches workflow)
144
- cmake -B build-asan -DENABLE_SANITIZERS=ON
145
- cmake --build build-asan
146
- ctest --test-dir build-asan
147
-
148
- # 6. Check coverage (matches workflow)
149
- cmake -B build-cov -DCMAKE_BUILD_TYPE=Coverage
150
- cmake --build build-cov
151
- ctest --test-dir build-cov
152
- gcov build-cov/CMakeFiles/YourProject.dir/src/*.gcno
153
-
154
- # If ANY fails: ❌ DO NOT COMMIT - Fix first!
155
- ```
156
-
157
- **Why This Matters:**
158
- - CI/CD failures happen when local commands differ from workflows
159
- - Example: Using `clang-format -i` locally but `--dry-run --Werror` in CI = failure
160
- - Example: Missing `-Werror` flag = warnings pass locally but fail in CI
161
- - Example: Skipping sanitizers locally = CI catches memory bugs you missed
162
- ```
163
-
164
- **If ANY of these fail, you MUST fix the issues before committing.**
165
-
166
- ### Code Style
167
-
168
- Use `.clang-format` for consistent formatting:
169
-
170
- ```yaml
171
- ---
172
- Language: Cpp
173
- BasedOnStyle: Google
174
- IndentWidth: 4
175
- ColumnLimit: 100
176
- UseTab: Never
177
- PointerAlignment: Left
178
- ReferenceAlignment: Left
179
- DerivePointerAlignment: false
180
-
181
- # Includes
182
- SortIncludes: CaseInsensitive
183
- IncludeBlocks: Regroup
184
- IncludeCategories:
185
- - Regex: '^<.*\.h>'
186
- Priority: 1
187
- - Regex: '^<.*>'
188
- Priority: 2
189
- - Regex: '.*'
190
- Priority: 3
191
-
192
- # Braces
193
- BreakBeforeBraces: Attach
194
- AllowShortFunctionsOnASingleLine: Inline
195
- AllowShortIfStatementsOnASingleLine: Never
196
-
197
- # Spacing
198
- SpaceAfterCStyleCast: false
199
- SpaceAfterTemplateKeyword: true
200
- SpaceBeforeParens: ControlStatements
201
-
202
- # Modern C++
203
- Standard: c++20
204
- ```
205
-
206
- ### Static Analysis
207
-
208
- Use `.clang-tidy` for code analysis:
209
-
210
- ```yaml
211
- ---
212
- Checks: >
213
- *,
214
- -abseil-*,
215
- -altera-*,
216
- -android-*,
217
- -fuchsia-*,
218
- -google-*,
219
- -llvm-*,
220
- -llvmlibc-*,
221
- -zircon-*,
222
- -readability-identifier-length,
223
- -modernize-use-trailing-return-type
224
-
225
- CheckOptions:
226
- - key: readability-identifier-naming.NamespaceCase
227
- value: lower_case
228
- - key: readability-identifier-naming.ClassCase
229
- value: CamelCase
230
- - key: readability-identifier-naming.StructCase
231
- value: CamelCase
232
- - key: readability-identifier-naming.FunctionCase
233
- value: camelCase
234
- - key: readability-identifier-naming.VariableCase
235
- value: lower_case
236
- - key: readability-identifier-naming.ConstantCase
237
- value: UPPER_CASE
238
- - key: readability-identifier-naming.MemberCase
239
- value: lower_case_
240
- - key: readability-identifier-naming.PrivateMemberSuffix
241
- value: '_'
242
-
243
- WarningsAsErrors: '*'
244
- ```
245
-
246
- ### Testing
247
-
248
- - **Framework**: Google Test (recommended) or Catch2
249
- - **Location**: `tests/` directory
250
- - **Coverage**: gcov/lcov or llvm-cov
251
- - **Coverage Threshold**: 95%+
252
-
253
- Example test with Google Test:
254
-
255
- ```cpp
256
- #include <gtest/gtest.h>
257
- #include "your_module.hpp"
258
-
259
- namespace your_namespace::tests {
260
-
261
- class DataProcessorTest : public ::testing::Test {
262
- protected:
263
- void SetUp() override {
264
- processor = std::make_unique<DataProcessor>();
265
- }
266
-
267
- void TearDown() override {
268
- processor.reset();
269
- }
270
-
271
- std::unique_ptr<DataProcessor> processor;
272
- };
273
-
274
- TEST_F(DataProcessorTest, ProcessValidInput) {
275
- const std::string input = "hello";
276
- const auto result = processor->process(input);
277
-
278
- EXPECT_EQ(result, "HELLO");
279
- }
280
-
281
- TEST_F(DataProcessorTest, ProcessEmptyInputThrows) {
282
- EXPECT_THROW(
283
- processor->process(""),
284
- std::invalid_argument
285
- );
286
- }
287
-
288
- TEST_F(DataProcessorTest, ProcessLargeInput) {
289
- const std::string input(1000, 'a');
290
- const auto result = processor->process(input);
291
-
292
- ASSERT_EQ(result.size(), 1000);
293
- EXPECT_TRUE(std::all_of(result.begin(), result.end(),
294
- [](char c) { return std::isupper(c); }));
295
- }
296
-
297
- } // namespace your_namespace::tests
298
- ```
299
-
300
- ### Modern C++ Best Practices
301
-
302
- - Use RAII for resource management
303
- - Prefer `std::unique_ptr` and `std::shared_ptr` over raw pointers
304
- - Use `const` and `constexpr` liberally
305
- - Prefer `std::string_view` for read-only strings
306
- - Use range-based for loops
307
- - Use `auto` for type deduction when clear
308
- - Avoid manual memory management
309
-
310
- Example modern C++ code:
311
-
312
- ```cpp
313
- #pragma once
314
-
315
- #include <memory>
316
- #include <string>
317
- #include <string_view>
318
- #include <vector>
319
- #include <optional>
320
- #include <expected>
321
-
322
- namespace your_namespace {
323
-
324
- /// @brief Processes data with various transformations
325
- class DataProcessor {
326
- public:
327
- DataProcessor() = default;
328
- ~DataProcessor() = default;
329
-
330
- // Delete copy constructor and assignment
331
- DataProcessor(const DataProcessor&) = delete;
332
- DataProcessor& operator=(const DataProcessor&) = delete;
333
-
334
- // Default move constructor and assignment
335
- DataProcessor(DataProcessor&&) noexcept = default;
336
- DataProcessor& operator=(DataProcessor&&) noexcept = default;
337
-
338
- /// @brief Process input string to uppercase
339
- /// @param input The input string to process
340
- /// @return Processed string or error
341
- /// @throws std::invalid_argument if input is empty
342
- [[nodiscard]] std::string process(std::string_view input) const;
343
-
344
- /// @brief Find value in data
345
- /// @param data The data to search
346
- /// @param key The key to find
347
- /// @return Optional value if found
348
- [[nodiscard]] std::optional<std::string> findValue(
349
- const std::vector<std::pair<std::string, std::string>>& data,
350
- std::string_view key
351
- ) const;
352
-
353
- /// @brief Process multiple items
354
- /// @param items Items to process
355
- /// @return Processed items
356
- [[nodiscard]] std::vector<std::string> processMany(
357
- const std::vector<std::string>& items
358
- ) const;
359
-
360
- private:
361
- mutable std::mutex mutex_;
362
- };
363
-
364
- } // namespace your_namespace
365
- ```
366
-
367
- Implementation:
368
-
369
- ```cpp
370
- #include "your_module.hpp"
371
- #include <algorithm>
372
- #include <stdexcept>
373
- #include <cctype>
374
-
375
- namespace your_namespace {
376
-
377
- std::string DataProcessor::process(std::string_view input) const {
378
- if (input.empty()) {
379
- throw std::invalid_argument("Input cannot be empty");
380
- }
381
-
382
- std::string result;
383
- result.reserve(input.size());
384
-
385
- std::transform(input.begin(), input.end(),
386
- std::back_inserter(result),
387
- [](unsigned char c) { return std::toupper(c); });
388
-
389
- return result;
390
- }
391
-
392
- std::optional<std::string> DataProcessor::findValue(
393
- const std::vector<std::pair<std::string, std::string>>& data,
394
- std::string_view key
395
- ) const {
396
- auto it = std::find_if(data.begin(), data.end(),
397
- [key](const auto& pair) { return pair.first == key; });
398
-
399
- if (it != data.end()) {
400
- return it->second;
401
- }
402
-
403
- return std::nullopt;
404
- }
405
-
406
- std::vector<std::string> DataProcessor::processMany(
407
- const std::vector<std::string>& items
408
- ) const {
409
- std::vector<std::string> results;
410
- results.reserve(items.size());
411
-
412
- std::transform(items.begin(), items.end(),
413
- std::back_inserter(results),
414
- [this](const auto& item) { return process(item); });
415
-
416
- return results;
417
- }
418
-
419
- } // namespace your_namespace
420
- ```
421
-
422
- ## Documentation
423
-
424
- Use Doxygen for API documentation:
425
-
426
- ```cpp
427
- /**
428
- * @file your_module.hpp
429
- * @brief Data processing utilities
430
- * @author Your Name
431
- * @date 2024-10-23
432
- */
433
-
434
- /**
435
- * @class DataProcessor
436
- * @brief Processes various data formats
437
- *
438
- * This class provides thread-safe data processing capabilities.
439
- * All methods are const-correct and exception-safe.
440
- *
441
- * @example
442
- * @code{.cpp}
443
- * DataProcessor processor;
444
- * auto result = processor.process("hello");
445
- * assert(result == "HELLO");
446
- * @endcode
447
- */
448
- ```
449
-
450
- ### Doxyfile Configuration:
451
-
452
- ```
453
- PROJECT_NAME = "Your Project"
454
- PROJECT_NUMBER = 1.0.0
455
- OUTPUT_DIRECTORY = docs
456
- GENERATE_HTML = YES
457
- GENERATE_LATEX = NO
458
- EXTRACT_ALL = YES
459
- EXTRACT_PRIVATE = NO
460
- EXTRACT_STATIC = YES
461
- SOURCE_BROWSER = YES
462
- INLINE_SOURCES = YES
463
- RECURSIVE = YES
464
- ```
465
-
466
- ## Project Structure
467
-
468
- ```
469
- project/
470
- ├── CMakeLists.txt # CMake configuration
471
- ├── .clang-format # Code formatting rules
472
- ├── .clang-tidy # Static analysis rules
473
- ├── Doxyfile # Documentation config
474
- ├── conanfile.txt # Conan dependencies (optional)
475
- ├── vcpkg.json # vcpkg dependencies (optional)
476
- ├── README.md # Project overview
477
- ├── CHANGELOG.md # Version history
478
- ├── LICENSE # Project license
479
- ├── include/
480
- │ └── your_project/
481
- │ └── your_module.hpp # Public headers
482
- ├── src/
483
- │ └── your_module.cpp # Implementation
484
- ├── tests/
485
- │ ├── CMakeLists.txt
486
- │ └── test_your_module.cpp
487
- ├── benchmarks/ # Performance benchmarks
488
- │ └── benchmark_main.cpp
489
- └── docs/ # Project documentation
490
- ```
491
-
492
- ## Memory Safety
493
-
494
- - Use RAII for all resource management
495
- - Prefer stack allocation over heap
496
- - Use smart pointers for heap allocation
497
- - Never use raw `new`/`delete`
498
- - Use containers instead of manual arrays
499
- - Check all pointer dereferences
500
-
501
- Example:
502
-
503
- ```cpp
504
- // Good: RAII with smart pointers
505
- class FileManager {
506
- public:
507
- explicit FileManager(std::string_view filename)
508
- : file_(std::make_unique<std::ifstream>(filename.data())) {
509
- if (!file_->is_open()) {
510
- throw std::runtime_error("Failed to open file");
511
- }
512
- }
513
-
514
- // RAII - file automatically closed
515
- ~FileManager() = default;
516
-
517
- [[nodiscard]] std::string readLine() {
518
- std::string line;
519
- if (std::getline(*file_, line)) {
520
- return line;
521
- }
522
- throw std::runtime_error("Failed to read line");
523
- }
524
-
525
- private:
526
- std::unique_ptr<std::ifstream> file_;
527
- };
528
-
529
- // Bad: Manual memory management
530
- class BadFileManager {
531
- public:
532
- BadFileManager(const char* filename) {
533
- file = new std::ifstream(filename); // ❌ Manual allocation
534
- }
535
-
536
- ~BadFileManager() {
537
- delete file; // ❌ Manual deletion (error-prone)
538
- }
539
-
540
- private:
541
- std::ifstream* file; // ❌ Raw pointer
542
- };
543
- ```
544
-
545
- ## Error Handling
546
-
547
- - Use exceptions for exceptional cases
548
- - Use `std::expected` (C++23) or `std::optional` for expected failures
549
- - Create custom exception classes
550
- - Document all exceptions with `@throws`
551
-
552
- Example:
553
-
554
- ```cpp
555
- #include <stdexcept>
556
- #include <optional>
557
-
558
- namespace your_namespace {
559
-
560
- class ValidationError : public std::runtime_error {
561
- public:
562
- explicit ValidationError(std::string_view message, std::string_view field)
563
- : std::runtime_error(std::string(message))
564
- , field_(field) {}
565
-
566
- [[nodiscard]] const std::string& field() const noexcept { return field_; }
567
-
568
- private:
569
- std::string field_;
570
- };
571
-
572
- class DataValidator {
573
- public:
574
- /// @throws ValidationError if data is invalid
575
- void validate(std::string_view data) const {
576
- if (data.empty()) {
577
- throw ValidationError("Data cannot be empty", "data");
578
- }
579
- }
580
-
581
- /// @return Optional value if valid, nullopt otherwise
582
- [[nodiscard]] std::optional<int> tryParse(std::string_view str) const noexcept {
583
- try {
584
- return std::stoi(std::string(str));
585
- } catch (...) {
586
- return std::nullopt;
587
- }
588
- }
589
- };
590
-
591
- } // namespace your_namespace
592
- ```
593
-
594
- ## Threading & Concurrency
595
-
596
- - Use `std::thread`, `std::jthread` (C++20), or `std::async`
597
- - Use `std::mutex`, `std::shared_mutex` for synchronization
598
- - Prefer `std::atomic` for simple shared state
599
- - Use `std::lock_guard` or `std::scoped_lock`
600
-
601
- Example:
602
-
603
- ```cpp
604
- #include <mutex>
605
- #include <shared_mutex>
606
- #include <thread>
607
- #include <atomic>
608
-
609
- class ThreadSafeCounter {
610
- public:
611
- void increment() {
612
- std::scoped_lock lock(mutex_);
613
- ++counter_;
614
- }
615
-
616
- [[nodiscard]] int get() const {
617
- std::shared_lock lock(mutex_);
618
- return counter_;
619
- }
620
-
621
- private:
622
- mutable std::shared_mutex mutex_;
623
- int counter_{0};
624
- };
625
-
626
- // For simple atomics
627
- class AtomicCounter {
628
- public:
629
- void increment() noexcept {
630
- counter_.fetch_add(1, std::memory_order_relaxed);
631
- }
632
-
633
- [[nodiscard]] int get() const noexcept {
634
- return counter_.load(std::memory_order_relaxed);
635
- }
636
-
637
- private:
638
- std::atomic<int> counter_{0};
639
- };
640
- ```
641
-
642
- ## CI/CD Requirements
643
-
644
- Must include GitHub Actions workflows for:
645
-
646
- 1. **Testing** (`cpp-test.yml`):
647
- - Test on ubuntu-latest, windows-latest, macos-latest
648
- - Test with GCC, Clang, MSVC
649
- - Upload coverage reports
650
-
651
- 2. **Linting** (`cpp-lint.yml`):
652
- - clang-format check
653
- - clang-tidy analysis
654
- - cppcheck static analysis
655
-
656
- ## Package Publication
657
-
658
- ### Publishing C/C++ Libraries
659
-
660
- **Options:**
661
- 1. **Conan Center**: Public Conan repository
662
- 2. **vcpkg**: Microsoft's package manager
663
- 3. **GitHub Releases**: Binary releases
664
- 4. **Header-only**: Single-file distribution
665
-
666
- ### Conan Publication
667
-
668
- **conanfile.py:**
669
-
670
- ```python
671
- from conan import ConanFile
672
- from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout
673
-
674
- class YourProjectConan(ConanFile):
675
- name = "your-project"
676
- version = "1.0.0"
677
- license = "MIT"
678
- author = "Your Name your.email@example.com"
679
- url = "https://github.com/your-org/your-project"
680
- description = "Short description"
681
- topics = ("cpp", "library")
682
- settings = "os", "compiler", "build_type", "arch"
683
-
684
- options = {
685
- "shared": [True, False],
686
- "fPIC": [True, False]
687
- }
688
- default_options = {
689
- "shared": False,
690
- "fPIC": True
691
- }
692
-
693
- exports_sources = "CMakeLists.txt", "src/*", "include/*"
694
-
695
- def layout(self):
696
- cmake_layout(self)
697
-
698
- def generate(self):
699
- tc = CMakeToolchain(self)
700
- tc.generate()
701
-
702
- def build(self):
703
- cmake = CMake(self)
704
- cmake.configure()
705
- cmake.build()
706
-
707
- def package(self):
708
- cmake = CMake(self)
709
- cmake.install()
710
-
711
- def package_info(self):
712
- self.cpp_info.libs = ["your-project"]
713
- ```
714
-
715
- ### vcpkg Publication
716
-
717
- **vcpkg.json:**
718
-
719
- ```json
720
- {
721
- "name": "your-project",
722
- "version": "1.0.0",
723
- "description": "Short description",
724
- "homepage": "https://github.com/your-org/your-project",
725
- "license": "MIT",
726
- "dependencies": [
727
- {
728
- "name": "vcpkg-cmake",
729
- "host": true
730
- },
731
- {
732
- "name": "vcpkg-cmake-config",
733
- "host": true
734
- }
735
- ]
736
- }
737
- ```
738
-
739
- ### Publishing Checklist:
740
-
741
- - ✅ All tests passing with sanitizers
742
- - ✅ clang-tidy clean
743
- - ✅ clang-format applied
744
- - ✅ Documentation generated
745
- - ✅ Version updated in CMakeLists.txt
746
- - ✅ CHANGELOG.md updated
747
- - ✅ README.md with build instructions
748
- - ✅ LICENSE file present
749
- - ✅ CMake config for find_package support
750
- - ✅ Conan recipe or vcpkg portfile
751
-
752
- <!-- CPP:END -->
753
-
1
+ ---
2
+ name: "C++"
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
+ <!-- CPP:START -->
12
+ # C/C++ 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
+ clang-format --dry-run --Werror src/**/*.cpp # Format check
21
+ clang-tidy src/**/*.cpp # Linting
22
+ make test # All tests (100% pass)
23
+ make # Build verification
24
+
25
+ # Additional checks:
26
+ cppcheck --enable=all src/ # Static analysis
27
+ valgrind --leak-check=full ./build/test # Memory check
28
+ ```
29
+
30
+ ## C/C++ Configuration
31
+
32
+ **CRITICAL**: Use C++20 or C++23 with modern CMake.
33
+
34
+ - **C++ Standard**: C++20 or C++23
35
+ - **CMake**: 3.25+
36
+ - **Compiler**: GCC 11+, Clang 15+, or MSVC 19.30+
37
+ - **Build System**: CMake (recommended) or Meson
38
+ - **Package Manager**: Conan or vcpkg
39
+
40
+ ### CMakeLists.txt Requirements
41
+
42
+ ```cmake
43
+ cmake_minimum_required(VERSION 3.25)
44
+ project(YourProject VERSION 1.0.0 LANGUAGES CXX)
45
+
46
+ # C++ Standard
47
+ set(CMAKE_CXX_STANDARD 20)
48
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
49
+ set(CMAKE_CXX_EXTENSIONS OFF)
50
+
51
+ # Compiler warnings
52
+ if(MSVC)
53
+ add_compile_options(/W4 /WX)
54
+ else()
55
+ add_compile_options(-Wall -Wextra -Wpedantic -Werror)
56
+ endif()
57
+
58
+ # Export compile commands for tooling
59
+ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
60
+
61
+ # Project options
62
+ option(BUILD_TESTING "Build tests" ON)
63
+ option(BUILD_DOCS "Build documentation" ON)
64
+ option(ENABLE_SANITIZERS "Enable sanitizers" ON)
65
+
66
+ # Dependencies (using FetchContent or find_package)
67
+ include(FetchContent)
68
+
69
+ FetchContent_Declare(
70
+ googletest
71
+ GIT_REPOSITORY https://github.com/google/googletest.git
72
+ GIT_TAG v1.14.0
73
+ )
74
+ FetchContent_MakeAvailable(googletest)
75
+
76
+ # Library
77
+ add_library(${PROJECT_NAME}
78
+ src/your_module.cpp
79
+ src/your_module.hpp
80
+ )
81
+
82
+ target_include_directories(${PROJECT_NAME}
83
+ PUBLIC
84
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
85
+ $<INSTALL_INTERFACE:include>
86
+ PRIVATE
87
+ ${CMAKE_CURRENT_SOURCE_DIR}/src
88
+ )
89
+
90
+ # Enable sanitizers in debug
91
+ if(ENABLE_SANITIZERS AND CMAKE_BUILD_TYPE MATCHES Debug)
92
+ target_compile_options(${PROJECT_NAME} PRIVATE
93
+ -fsanitize=address
94
+ -fsanitize=undefined
95
+ -fno-omit-frame-pointer
96
+ )
97
+ target_link_options(${PROJECT_NAME} PRIVATE
98
+ -fsanitize=address
99
+ -fsanitize=undefined
100
+ )
101
+ endif()
102
+
103
+ # Tests
104
+ if(BUILD_TESTING)
105
+ enable_testing()
106
+ add_subdirectory(tests)
107
+ endif()
108
+
109
+ # Installation
110
+ install(TARGETS ${PROJECT_NAME}
111
+ EXPORT ${PROJECT_NAME}Targets
112
+ LIBRARY DESTINATION lib
113
+ ARCHIVE DESTINATION lib
114
+ RUNTIME DESTINATION bin
115
+ INCLUDES DESTINATION include
116
+ )
117
+ ```
118
+
119
+ ## Code Quality Standards
120
+
121
+ ### Mandatory Quality Checks
122
+
123
+ **CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
124
+
125
+ **IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
126
+
127
+ ```bash
128
+ # Pre-Commit Checklist (MUST match .github/workflows/*.yml)
129
+
130
+ # 1. Format check (matches workflow - use --dry-run, not -i!)
131
+ clang-format --dry-run --Werror src/**/*.{cpp,hpp} tests/**/*.{cpp,hpp}
132
+
133
+ # 2. Static analysis (matches workflow)
134
+ clang-tidy src/**/*.cpp -- -std=c++20
135
+
136
+ # 3. Build (MUST pass with no warnings - matches workflow)
137
+ cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-Werror"
138
+ cmake --build build
139
+
140
+ # 4. Run all tests (MUST pass 100% - matches workflow)
141
+ ctest --test-dir build --output-on-failure
142
+
143
+ # 5. Check with sanitizers (matches workflow)
144
+ cmake -B build-asan -DENABLE_SANITIZERS=ON
145
+ cmake --build build-asan
146
+ ctest --test-dir build-asan
147
+
148
+ # 6. Check coverage (matches workflow)
149
+ cmake -B build-cov -DCMAKE_BUILD_TYPE=Coverage
150
+ cmake --build build-cov
151
+ ctest --test-dir build-cov
152
+ gcov build-cov/CMakeFiles/YourProject.dir/src/*.gcno
153
+
154
+ # If ANY fails: ❌ DO NOT COMMIT - Fix first!
155
+ ```
156
+
157
+ **Why This Matters:**
158
+ - CI/CD failures happen when local commands differ from workflows
159
+ - Example: Using `clang-format -i` locally but `--dry-run --Werror` in CI = failure
160
+ - Example: Missing `-Werror` flag = warnings pass locally but fail in CI
161
+ - Example: Skipping sanitizers locally = CI catches memory bugs you missed
162
+ ```
163
+
164
+ **If ANY of these fail, you MUST fix the issues before committing.**
165
+
166
+ ### Code Style
167
+
168
+ Use `.clang-format` for consistent formatting:
169
+
170
+ ```yaml
171
+ ---
172
+ Language: Cpp
173
+ BasedOnStyle: Google
174
+ IndentWidth: 4
175
+ ColumnLimit: 100
176
+ UseTab: Never
177
+ PointerAlignment: Left
178
+ ReferenceAlignment: Left
179
+ DerivePointerAlignment: false
180
+
181
+ # Includes
182
+ SortIncludes: CaseInsensitive
183
+ IncludeBlocks: Regroup
184
+ IncludeCategories:
185
+ - Regex: '^<.*\.h>'
186
+ Priority: 1
187
+ - Regex: '^<.*>'
188
+ Priority: 2
189
+ - Regex: '.*'
190
+ Priority: 3
191
+
192
+ # Braces
193
+ BreakBeforeBraces: Attach
194
+ AllowShortFunctionsOnASingleLine: Inline
195
+ AllowShortIfStatementsOnASingleLine: Never
196
+
197
+ # Spacing
198
+ SpaceAfterCStyleCast: false
199
+ SpaceAfterTemplateKeyword: true
200
+ SpaceBeforeParens: ControlStatements
201
+
202
+ # Modern C++
203
+ Standard: c++20
204
+ ```
205
+
206
+ ### Static Analysis
207
+
208
+ Use `.clang-tidy` for code analysis:
209
+
210
+ ```yaml
211
+ ---
212
+ Checks: >
213
+ *,
214
+ -abseil-*,
215
+ -altera-*,
216
+ -android-*,
217
+ -fuchsia-*,
218
+ -google-*,
219
+ -llvm-*,
220
+ -llvmlibc-*,
221
+ -zircon-*,
222
+ -readability-identifier-length,
223
+ -modernize-use-trailing-return-type
224
+
225
+ CheckOptions:
226
+ - key: readability-identifier-naming.NamespaceCase
227
+ value: lower_case
228
+ - key: readability-identifier-naming.ClassCase
229
+ value: CamelCase
230
+ - key: readability-identifier-naming.StructCase
231
+ value: CamelCase
232
+ - key: readability-identifier-naming.FunctionCase
233
+ value: camelCase
234
+ - key: readability-identifier-naming.VariableCase
235
+ value: lower_case
236
+ - key: readability-identifier-naming.ConstantCase
237
+ value: UPPER_CASE
238
+ - key: readability-identifier-naming.MemberCase
239
+ value: lower_case_
240
+ - key: readability-identifier-naming.PrivateMemberSuffix
241
+ value: '_'
242
+
243
+ WarningsAsErrors: '*'
244
+ ```
245
+
246
+ ### Testing
247
+
248
+ - **Framework**: Google Test (recommended) or Catch2
249
+ - **Location**: `tests/` directory
250
+ - **Coverage**: gcov/lcov or llvm-cov
251
+ - **Coverage Threshold**: 95%+
252
+
253
+ Example test with Google Test:
254
+
255
+ ```cpp
256
+ #include <gtest/gtest.h>
257
+ #include "your_module.hpp"
258
+
259
+ namespace your_namespace::tests {
260
+
261
+ class DataProcessorTest : public ::testing::Test {
262
+ protected:
263
+ void SetUp() override {
264
+ processor = std::make_unique<DataProcessor>();
265
+ }
266
+
267
+ void TearDown() override {
268
+ processor.reset();
269
+ }
270
+
271
+ std::unique_ptr<DataProcessor> processor;
272
+ };
273
+
274
+ TEST_F(DataProcessorTest, ProcessValidInput) {
275
+ const std::string input = "hello";
276
+ const auto result = processor->process(input);
277
+
278
+ EXPECT_EQ(result, "HELLO");
279
+ }
280
+
281
+ TEST_F(DataProcessorTest, ProcessEmptyInputThrows) {
282
+ EXPECT_THROW(
283
+ processor->process(""),
284
+ std::invalid_argument
285
+ );
286
+ }
287
+
288
+ TEST_F(DataProcessorTest, ProcessLargeInput) {
289
+ const std::string input(1000, 'a');
290
+ const auto result = processor->process(input);
291
+
292
+ ASSERT_EQ(result.size(), 1000);
293
+ EXPECT_TRUE(std::all_of(result.begin(), result.end(),
294
+ [](char c) { return std::isupper(c); }));
295
+ }
296
+
297
+ } // namespace your_namespace::tests
298
+ ```
299
+
300
+ ### Modern C++ Best Practices
301
+
302
+ - Use RAII for resource management
303
+ - Prefer `std::unique_ptr` and `std::shared_ptr` over raw pointers
304
+ - Use `const` and `constexpr` liberally
305
+ - Prefer `std::string_view` for read-only strings
306
+ - Use range-based for loops
307
+ - Use `auto` for type deduction when clear
308
+ - Avoid manual memory management
309
+
310
+ Example modern C++ code:
311
+
312
+ ```cpp
313
+ #pragma once
314
+
315
+ #include <memory>
316
+ #include <string>
317
+ #include <string_view>
318
+ #include <vector>
319
+ #include <optional>
320
+ #include <expected>
321
+
322
+ namespace your_namespace {
323
+
324
+ /// @brief Processes data with various transformations
325
+ class DataProcessor {
326
+ public:
327
+ DataProcessor() = default;
328
+ ~DataProcessor() = default;
329
+
330
+ // Delete copy constructor and assignment
331
+ DataProcessor(const DataProcessor&) = delete;
332
+ DataProcessor& operator=(const DataProcessor&) = delete;
333
+
334
+ // Default move constructor and assignment
335
+ DataProcessor(DataProcessor&&) noexcept = default;
336
+ DataProcessor& operator=(DataProcessor&&) noexcept = default;
337
+
338
+ /// @brief Process input string to uppercase
339
+ /// @param input The input string to process
340
+ /// @return Processed string or error
341
+ /// @throws std::invalid_argument if input is empty
342
+ [[nodiscard]] std::string process(std::string_view input) const;
343
+
344
+ /// @brief Find value in data
345
+ /// @param data The data to search
346
+ /// @param key The key to find
347
+ /// @return Optional value if found
348
+ [[nodiscard]] std::optional<std::string> findValue(
349
+ const std::vector<std::pair<std::string, std::string>>& data,
350
+ std::string_view key
351
+ ) const;
352
+
353
+ /// @brief Process multiple items
354
+ /// @param items Items to process
355
+ /// @return Processed items
356
+ [[nodiscard]] std::vector<std::string> processMany(
357
+ const std::vector<std::string>& items
358
+ ) const;
359
+
360
+ private:
361
+ mutable std::mutex mutex_;
362
+ };
363
+
364
+ } // namespace your_namespace
365
+ ```
366
+
367
+ Implementation:
368
+
369
+ ```cpp
370
+ #include "your_module.hpp"
371
+ #include <algorithm>
372
+ #include <stdexcept>
373
+ #include <cctype>
374
+
375
+ namespace your_namespace {
376
+
377
+ std::string DataProcessor::process(std::string_view input) const {
378
+ if (input.empty()) {
379
+ throw std::invalid_argument("Input cannot be empty");
380
+ }
381
+
382
+ std::string result;
383
+ result.reserve(input.size());
384
+
385
+ std::transform(input.begin(), input.end(),
386
+ std::back_inserter(result),
387
+ [](unsigned char c) { return std::toupper(c); });
388
+
389
+ return result;
390
+ }
391
+
392
+ std::optional<std::string> DataProcessor::findValue(
393
+ const std::vector<std::pair<std::string, std::string>>& data,
394
+ std::string_view key
395
+ ) const {
396
+ auto it = std::find_if(data.begin(), data.end(),
397
+ [key](const auto& pair) { return pair.first == key; });
398
+
399
+ if (it != data.end()) {
400
+ return it->second;
401
+ }
402
+
403
+ return std::nullopt;
404
+ }
405
+
406
+ std::vector<std::string> DataProcessor::processMany(
407
+ const std::vector<std::string>& items
408
+ ) const {
409
+ std::vector<std::string> results;
410
+ results.reserve(items.size());
411
+
412
+ std::transform(items.begin(), items.end(),
413
+ std::back_inserter(results),
414
+ [this](const auto& item) { return process(item); });
415
+
416
+ return results;
417
+ }
418
+
419
+ } // namespace your_namespace
420
+ ```
421
+
422
+ ## Documentation
423
+
424
+ Use Doxygen for API documentation:
425
+
426
+ ```cpp
427
+ /**
428
+ * @file your_module.hpp
429
+ * @brief Data processing utilities
430
+ * @author Your Name
431
+ * @date 2024-10-23
432
+ */
433
+
434
+ /**
435
+ * @class DataProcessor
436
+ * @brief Processes various data formats
437
+ *
438
+ * This class provides thread-safe data processing capabilities.
439
+ * All methods are const-correct and exception-safe.
440
+ *
441
+ * @example
442
+ * @code{.cpp}
443
+ * DataProcessor processor;
444
+ * auto result = processor.process("hello");
445
+ * assert(result == "HELLO");
446
+ * @endcode
447
+ */
448
+ ```
449
+
450
+ ### Doxyfile Configuration:
451
+
452
+ ```
453
+ PROJECT_NAME = "Your Project"
454
+ PROJECT_NUMBER = 1.0.0
455
+ OUTPUT_DIRECTORY = docs
456
+ GENERATE_HTML = YES
457
+ GENERATE_LATEX = NO
458
+ EXTRACT_ALL = YES
459
+ EXTRACT_PRIVATE = NO
460
+ EXTRACT_STATIC = YES
461
+ SOURCE_BROWSER = YES
462
+ INLINE_SOURCES = YES
463
+ RECURSIVE = YES
464
+ ```
465
+
466
+ ## Project Structure
467
+
468
+ ```
469
+ project/
470
+ ├── CMakeLists.txt # CMake configuration
471
+ ├── .clang-format # Code formatting rules
472
+ ├── .clang-tidy # Static analysis rules
473
+ ├── Doxyfile # Documentation config
474
+ ├── conanfile.txt # Conan dependencies (optional)
475
+ ├── vcpkg.json # vcpkg dependencies (optional)
476
+ ├── README.md # Project overview
477
+ ├── CHANGELOG.md # Version history
478
+ ├── LICENSE # Project license
479
+ ├── include/
480
+ │ └── your_project/
481
+ │ └── your_module.hpp # Public headers
482
+ ├── src/
483
+ │ └── your_module.cpp # Implementation
484
+ ├── tests/
485
+ │ ├── CMakeLists.txt
486
+ │ └── test_your_module.cpp
487
+ ├── benchmarks/ # Performance benchmarks
488
+ │ └── benchmark_main.cpp
489
+ └── docs/ # Project documentation
490
+ ```
491
+
492
+ ## Memory Safety
493
+
494
+ - Use RAII for all resource management
495
+ - Prefer stack allocation over heap
496
+ - Use smart pointers for heap allocation
497
+ - Never use raw `new`/`delete`
498
+ - Use containers instead of manual arrays
499
+ - Check all pointer dereferences
500
+
501
+ Example:
502
+
503
+ ```cpp
504
+ // Good: RAII with smart pointers
505
+ class FileManager {
506
+ public:
507
+ explicit FileManager(std::string_view filename)
508
+ : file_(std::make_unique<std::ifstream>(filename.data())) {
509
+ if (!file_->is_open()) {
510
+ throw std::runtime_error("Failed to open file");
511
+ }
512
+ }
513
+
514
+ // RAII - file automatically closed
515
+ ~FileManager() = default;
516
+
517
+ [[nodiscard]] std::string readLine() {
518
+ std::string line;
519
+ if (std::getline(*file_, line)) {
520
+ return line;
521
+ }
522
+ throw std::runtime_error("Failed to read line");
523
+ }
524
+
525
+ private:
526
+ std::unique_ptr<std::ifstream> file_;
527
+ };
528
+
529
+ // Bad: Manual memory management
530
+ class BadFileManager {
531
+ public:
532
+ BadFileManager(const char* filename) {
533
+ file = new std::ifstream(filename); // ❌ Manual allocation
534
+ }
535
+
536
+ ~BadFileManager() {
537
+ delete file; // ❌ Manual deletion (error-prone)
538
+ }
539
+
540
+ private:
541
+ std::ifstream* file; // ❌ Raw pointer
542
+ };
543
+ ```
544
+
545
+ ## Error Handling
546
+
547
+ - Use exceptions for exceptional cases
548
+ - Use `std::expected` (C++23) or `std::optional` for expected failures
549
+ - Create custom exception classes
550
+ - Document all exceptions with `@throws`
551
+
552
+ Example:
553
+
554
+ ```cpp
555
+ #include <stdexcept>
556
+ #include <optional>
557
+
558
+ namespace your_namespace {
559
+
560
+ class ValidationError : public std::runtime_error {
561
+ public:
562
+ explicit ValidationError(std::string_view message, std::string_view field)
563
+ : std::runtime_error(std::string(message))
564
+ , field_(field) {}
565
+
566
+ [[nodiscard]] const std::string& field() const noexcept { return field_; }
567
+
568
+ private:
569
+ std::string field_;
570
+ };
571
+
572
+ class DataValidator {
573
+ public:
574
+ /// @throws ValidationError if data is invalid
575
+ void validate(std::string_view data) const {
576
+ if (data.empty()) {
577
+ throw ValidationError("Data cannot be empty", "data");
578
+ }
579
+ }
580
+
581
+ /// @return Optional value if valid, nullopt otherwise
582
+ [[nodiscard]] std::optional<int> tryParse(std::string_view str) const noexcept {
583
+ try {
584
+ return std::stoi(std::string(str));
585
+ } catch (...) {
586
+ return std::nullopt;
587
+ }
588
+ }
589
+ };
590
+
591
+ } // namespace your_namespace
592
+ ```
593
+
594
+ ## Threading & Concurrency
595
+
596
+ - Use `std::thread`, `std::jthread` (C++20), or `std::async`
597
+ - Use `std::mutex`, `std::shared_mutex` for synchronization
598
+ - Prefer `std::atomic` for simple shared state
599
+ - Use `std::lock_guard` or `std::scoped_lock`
600
+
601
+ Example:
602
+
603
+ ```cpp
604
+ #include <mutex>
605
+ #include <shared_mutex>
606
+ #include <thread>
607
+ #include <atomic>
608
+
609
+ class ThreadSafeCounter {
610
+ public:
611
+ void increment() {
612
+ std::scoped_lock lock(mutex_);
613
+ ++counter_;
614
+ }
615
+
616
+ [[nodiscard]] int get() const {
617
+ std::shared_lock lock(mutex_);
618
+ return counter_;
619
+ }
620
+
621
+ private:
622
+ mutable std::shared_mutex mutex_;
623
+ int counter_{0};
624
+ };
625
+
626
+ // For simple atomics
627
+ class AtomicCounter {
628
+ public:
629
+ void increment() noexcept {
630
+ counter_.fetch_add(1, std::memory_order_relaxed);
631
+ }
632
+
633
+ [[nodiscard]] int get() const noexcept {
634
+ return counter_.load(std::memory_order_relaxed);
635
+ }
636
+
637
+ private:
638
+ std::atomic<int> counter_{0};
639
+ };
640
+ ```
641
+
642
+ ## CI/CD Requirements
643
+
644
+ Must include GitHub Actions workflows for:
645
+
646
+ 1. **Testing** (`cpp-test.yml`):
647
+ - Test on ubuntu-latest, windows-latest, macos-latest
648
+ - Test with GCC, Clang, MSVC
649
+ - Upload coverage reports
650
+
651
+ 2. **Linting** (`cpp-lint.yml`):
652
+ - clang-format check
653
+ - clang-tidy analysis
654
+ - cppcheck static analysis
655
+
656
+ ## Package Publication
657
+
658
+ ### Publishing C/C++ Libraries
659
+
660
+ **Options:**
661
+ 1. **Conan Center**: Public Conan repository
662
+ 2. **vcpkg**: Microsoft's package manager
663
+ 3. **GitHub Releases**: Binary releases
664
+ 4. **Header-only**: Single-file distribution
665
+
666
+ ### Conan Publication
667
+
668
+ **conanfile.py:**
669
+
670
+ ```python
671
+ from conan import ConanFile
672
+ from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout
673
+
674
+ class YourProjectConan(ConanFile):
675
+ name = "your-project"
676
+ version = "1.0.0"
677
+ license = "MIT"
678
+ author = "Your Name your.email@example.com"
679
+ url = "https://github.com/your-org/your-project"
680
+ description = "Short description"
681
+ topics = ("cpp", "library")
682
+ settings = "os", "compiler", "build_type", "arch"
683
+
684
+ options = {
685
+ "shared": [True, False],
686
+ "fPIC": [True, False]
687
+ }
688
+ default_options = {
689
+ "shared": False,
690
+ "fPIC": True
691
+ }
692
+
693
+ exports_sources = "CMakeLists.txt", "src/*", "include/*"
694
+
695
+ def layout(self):
696
+ cmake_layout(self)
697
+
698
+ def generate(self):
699
+ tc = CMakeToolchain(self)
700
+ tc.generate()
701
+
702
+ def build(self):
703
+ cmake = CMake(self)
704
+ cmake.configure()
705
+ cmake.build()
706
+
707
+ def package(self):
708
+ cmake = CMake(self)
709
+ cmake.install()
710
+
711
+ def package_info(self):
712
+ self.cpp_info.libs = ["your-project"]
713
+ ```
714
+
715
+ ### vcpkg Publication
716
+
717
+ **vcpkg.json:**
718
+
719
+ ```json
720
+ {
721
+ "name": "your-project",
722
+ "version": "1.0.0",
723
+ "description": "Short description",
724
+ "homepage": "https://github.com/your-org/your-project",
725
+ "license": "MIT",
726
+ "dependencies": [
727
+ {
728
+ "name": "vcpkg-cmake",
729
+ "host": true
730
+ },
731
+ {
732
+ "name": "vcpkg-cmake-config",
733
+ "host": true
734
+ }
735
+ ]
736
+ }
737
+ ```
738
+
739
+ ### Publishing Checklist:
740
+
741
+ - ✅ All tests passing with sanitizers
742
+ - ✅ clang-tidy clean
743
+ - ✅ clang-format applied
744
+ - ✅ Documentation generated
745
+ - ✅ Version updated in CMakeLists.txt
746
+ - ✅ CHANGELOG.md updated
747
+ - ✅ README.md with build instructions
748
+ - ✅ LICENSE file present
749
+ - ✅ CMake config for find_package support
750
+ - ✅ Conan recipe or vcpkg portfile
751
+
752
+ <!-- CPP:END -->
753
+