rosett-ai 1.3.3

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 (527) hide show
  1. checksums.yaml +7 -0
  2. data/.ai-provenance.yml +119 -0
  3. data/.debride_whitelist +186 -0
  4. data/.fasterer.yml +29 -0
  5. data/.mdl_style.rb +10 -0
  6. data/.mdlrc +3 -0
  7. data/.mutant.yml +49 -0
  8. data/.namespace-allowlist +42 -0
  9. data/.reek.yml +1040 -0
  10. data/.rosett-ai/config.yml +3 -0
  11. data/.rspec +5 -0
  12. data/.rubocop.yml +380 -0
  13. data/.ruby-version +1 -0
  14. data/.yamllint +51 -0
  15. data/.yardopts +12 -0
  16. data/AI-DISCLOSURE.md +48 -0
  17. data/CHANGELOG.md +519 -0
  18. data/CLAUDE.md +141 -0
  19. data/CONTRIBUTING.md +734 -0
  20. data/INSTALL.md +154 -0
  21. data/LICENSE +674 -0
  22. data/LICENSE.md +675 -0
  23. data/QUICKSTART.md +73 -0
  24. data/README.md +366 -0
  25. data/Rakefile +200 -0
  26. data/SECURITY.md +114 -0
  27. data/bin/rai +1 -0
  28. data/cliff.toml +52 -0
  29. data/conf/adopt_redactions.yml +8 -0
  30. data/conf/behaviour/.gitkeep +0 -0
  31. data/conf/compliance/cra_rules.yml +25 -0
  32. data/conf/compliance/license_rules.yml +20 -0
  33. data/conf/design/aaif_alignment.yml +181 -0
  34. data/conf/design/ab_testing.yml +172 -0
  35. data/conf/design/accessibility.yml +84 -0
  36. data/conf/design/ai_authorship.yml +210 -0
  37. data/conf/design/ai_provenance.yml +224 -0
  38. data/conf/design/ai_tool_configuration.yml +207 -0
  39. data/conf/design/architecture.yml +139 -0
  40. data/conf/design/autocompletion.yml +115 -0
  41. data/conf/design/backward_compatibility.yml +112 -0
  42. data/conf/design/behaviour_composition.yml +246 -0
  43. data/conf/design/build_rake_extraction.yml +57 -0
  44. data/conf/design/ci_pipeline.yml +100 -0
  45. data/conf/design/claude_code_configuration.yml +157 -0
  46. data/conf/design/compiler.yml +128 -0
  47. data/conf/design/comply.yml +153 -0
  48. data/conf/design/content_packs.yml +84 -0
  49. data/conf/design/desktop_integration.yml +289 -0
  50. data/conf/design/distribution.yml +216 -0
  51. data/conf/design/doctor.yml +184 -0
  52. data/conf/design/documentation.yml +152 -0
  53. data/conf/design/engine_architecture.yml +257 -0
  54. data/conf/design/error_handling.yml +103 -0
  55. data/conf/design/feature_flags.yml +142 -0
  56. data/conf/design/git_hooks.yml +165 -0
  57. data/conf/design/gui_plugins.yml +475 -0
  58. data/conf/design/i18n.yml +84 -0
  59. data/conf/design/integration_testing.yml +56 -0
  60. data/conf/design/licensing_system.yml +88 -0
  61. data/conf/design/lifecycle_management.yml +208 -0
  62. data/conf/design/mcp_integration.yml +207 -0
  63. data/conf/design/mcp_settings.yml +126 -0
  64. data/conf/design/migration.yml +56 -0
  65. data/conf/design/monitoring_observability.yml +194 -0
  66. data/conf/design/namespace_cleanup.yml +145 -0
  67. data/conf/design/plugin_test_segregation.yml +145 -0
  68. data/conf/design/policy_management.yml +229 -0
  69. data/conf/design/project_management.yml +183 -0
  70. data/conf/design/rai_mcp_asset_discovery.yml +164 -0
  71. data/conf/design/rai_mcp_server.yml +605 -0
  72. data/conf/design/release_management.yml +117 -0
  73. data/conf/design/retrofit.yml +199 -0
  74. data/conf/design/retrospective_analyzer.yml +79 -0
  75. data/conf/design/scope_hierarchy.yml +352 -0
  76. data/conf/design/security.yml +115 -0
  77. data/conf/design/session_retrospective.yml +85 -0
  78. data/conf/design/smart_ui_feedback.yml +89 -0
  79. data/conf/design/structured_logging.yml +148 -0
  80. data/conf/design/styles.yml +123 -0
  81. data/conf/design/test_peer_review.yml +89 -0
  82. data/conf/design/testing.yml +136 -0
  83. data/conf/design/threat_model.yml +108 -0
  84. data/conf/design/ui_framework.yml +111 -0
  85. data/conf/design/usage_optimization.yml +122 -0
  86. data/conf/design/version_management.yml +60 -0
  87. data/conf/design/workflow.yml +227 -0
  88. data/conf/mcp/server_defaults.yml +42 -0
  89. data/conf/mcp/trust.yml +21 -0
  90. data/conf/packaging/core.yml +12 -0
  91. data/conf/packaging/gtk4.yml +11 -0
  92. data/conf/packaging/qt6.yml +11 -0
  93. data/conf/policy/default_deny_list.yml +197 -0
  94. data/conf/review/cli-command-audit.yml +857 -0
  95. data/conf/review/design-docs.yml +1064 -0
  96. data/conf/review/design-questionnaire.yml +153 -0
  97. data/conf/review/questionnaire.yml +146 -0
  98. data/conf/review/rosett-ai-core.yml +2919 -0
  99. data/conf/schemas/ai_config_schema.json +73 -0
  100. data/conf/schemas/behaviour_schema.json +132 -0
  101. data/conf/schemas/compliance_rule_schema.json +63 -0
  102. data/conf/schemas/content_pack_manifest_schema.json +51 -0
  103. data/conf/schemas/design_schema.json +210 -0
  104. data/conf/schemas/engine_manifest_schema.json +144 -0
  105. data/conf/schemas/lockfile_schema.json +74 -0
  106. data/conf/schemas/mcp_server_schema.json +48 -0
  107. data/conf/schemas/packaging_schema.json +70 -0
  108. data/conf/schemas/policy_schema.json +85 -0
  109. data/conf/schemas/provenance_schema.json +84 -0
  110. data/conf/schemas/rai_config_schema.json +56 -0
  111. data/conf/schemas/rai_project_schema.json +20 -0
  112. data/conf/schemas/scope_hierarchy_schema.json +49 -0
  113. data/conf/schemas/target_schema.json +67 -0
  114. data/conf/schemas/tooling_schema.json +65 -0
  115. data/conf/schemas/workflow_schema.json +112 -0
  116. data/conf/targets/agents_md.yml +17 -0
  117. data/conf/targets/claude.yml +12 -0
  118. data/conf/tooling/tools.yml +58 -0
  119. data/dist/rosett-ai-mcp.service +48 -0
  120. data/dist/rosett-ai-mcp.yml.default +45 -0
  121. data/doc/AAIF_POSITIONING.md +58 -0
  122. data/doc/ADOPT.md +224 -0
  123. data/doc/AI_PROVENANCE.md +139 -0
  124. data/doc/ARCHITECTURE.md +920 -0
  125. data/doc/BEHAVIOUR.md +409 -0
  126. data/doc/BUILD.md +138 -0
  127. data/doc/CI_CD_RECIPES.md +171 -0
  128. data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
  129. data/doc/COMMAND_ANALYSIS.md +229 -0
  130. data/doc/CONFIGURATION.md +281 -0
  131. data/doc/DESIGN_AUDIT.md +235 -0
  132. data/doc/DESIGN_PEER_REVIEW.md +771 -0
  133. data/doc/DESKTOP.md +447 -0
  134. data/doc/ENGINES.md +567 -0
  135. data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
  136. data/doc/FEATURE_AUDIT.md +218 -0
  137. data/doc/IMPLEMENTATION_PLAN.md +669 -0
  138. data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
  139. data/doc/MIGRATION_GUIDE.md +88 -0
  140. data/doc/PACKAGING.md +232 -0
  141. data/doc/PROJECT_DASHBOARD.md +153 -0
  142. data/doc/PULP_DEPLOYMENT.md +164 -0
  143. data/doc/QUALITY_FIX_SUMMARY.md +110 -0
  144. data/doc/QUICK_START.md +162 -0
  145. data/doc/REEK_CONFIGURATION.md +166 -0
  146. data/doc/REFERENCE.md +253 -0
  147. data/doc/REFERENCES.md +324 -0
  148. data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
  149. data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
  150. data/doc/SETUP.md +202 -0
  151. data/doc/TEST_PEER_REVIEW.md +152 -0
  152. data/doc/THREAT_MODEL.md +230 -0
  153. data/doc/USAGE.md +545 -0
  154. data/doc/USER_MANUAL.md +585 -0
  155. data/doc/ai_test_review_checklist.md +110 -0
  156. data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
  157. data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
  158. data/doc/changes/2026-02-20-security-implementation.md +281 -0
  159. data/doc/changes/2026-02-20-styles-implementation.md +220 -0
  160. data/doc/changes/2026-02-21-architecture-completion.md +95 -0
  161. data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
  162. data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
  163. data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
  164. data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
  165. data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
  166. data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
  167. data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
  168. data/doc/changes/2026-02-21-path-resolver.md +128 -0
  169. data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
  170. data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
  171. data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
  172. data/doc/context/SESSION-HANDOFF.md +69 -0
  173. data/doc/context/ai-engine-usage-trends-2026.md +80 -0
  174. data/doc/context/plan-pluggable-engines.md +590 -0
  175. data/doc/decisions/001-flog-deferred.md +32 -0
  176. data/doc/decisions/002-path-resolution-strategy.md +158 -0
  177. data/doc/decisions/003-ui-adapter-selection.md +193 -0
  178. data/doc/decisions/004-design-document-validation.md +179 -0
  179. data/doc/decisions/005-package-splitting-strategy.md +200 -0
  180. data/doc/decisions/006-multi-engine-architecture.md +147 -0
  181. data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
  182. data/doc/decisions/008-ci-bundler-strategy.md +129 -0
  183. data/doc/decisions/009-core-only-v1-release.md +60 -0
  184. data/doc/decisions/010-engine-debian-packaging.md +66 -0
  185. data/doc/decisions/011-context-aware-cli.md +71 -0
  186. data/doc/dependency_decisions.yml +247 -0
  187. data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
  188. data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
  189. data/doc/issues/003-smoke-test-false-positive.md +127 -0
  190. data/doc/issues/004-market-research-design-updates.md +109 -0
  191. data/doc/issues/005-compile-scope-coexistence.md +161 -0
  192. data/doc/locales/.gitkeep +0 -0
  193. data/doc/man/rai.1.ronn +505 -0
  194. data/doc/operations/packaging.md +133 -0
  195. data/doc/operations/rosett-ai-release.md +65 -0
  196. data/doc/reference/error-catalog.md +107 -0
  197. data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
  198. data/doc/reference/src/Pictures/cover.jpg +0 -0
  199. data/doc/reference/src/Pictures/head1.jpg +0 -0
  200. data/doc/reference/src/Pictures/head2.jpg +0 -0
  201. data/doc/reference/src/Pictures/head3.jpg +0 -0
  202. data/doc/reference/src/Pictures/head4.jpg +0 -0
  203. data/doc/reference/src/Pictures/head5.jpg +0 -0
  204. data/doc/reference/src/Pictures/head6.jpg +0 -0
  205. data/doc/reference/src/Pictures/head7.jpg +0 -0
  206. data/doc/reference/src/Pictures/head8.jpg +0 -0
  207. data/doc/reference/src/StyleInd.ist +4 -0
  208. data/doc/reference/src/bibliography.bib +79 -0
  209. data/doc/reference/src/main.tex +1288 -0
  210. data/doc/reference/src/structure.tex +303 -0
  211. data/doc/rosett-ai-bookmarks.html +301 -0
  212. data/kitchen.yml +46 -0
  213. data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
  214. data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
  215. data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
  216. data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
  217. data/lib/rosett_ai/ai_config/context_window.rb +55 -0
  218. data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
  219. data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
  220. data/lib/rosett_ai/ai_config/model_router.rb +121 -0
  221. data/lib/rosett_ai/ai_config/validator.rb +45 -0
  222. data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
  223. data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
  224. data/lib/rosett_ai/authorship/review_validator.rb +39 -0
  225. data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
  226. data/lib/rosett_ai/backup/compressor.rb +180 -0
  227. data/lib/rosett_ai/backup/destination.rb +91 -0
  228. data/lib/rosett_ai/behaviour/manager.rb +156 -0
  229. data/lib/rosett_ai/compiler/backend.rb +86 -0
  230. data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
  231. data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
  232. data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
  233. data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
  234. data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
  235. data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
  236. data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
  237. data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
  238. data/lib/rosett_ai/compiler/target_profile.rb +112 -0
  239. data/lib/rosett_ai/completion/generator.rb +101 -0
  240. data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
  241. data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
  242. data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
  243. data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
  244. data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
  245. data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
  246. data/lib/rosett_ai/comply/reporter.rb +113 -0
  247. data/lib/rosett_ai/comply/runner.rb +50 -0
  248. data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
  249. data/lib/rosett_ai/composition/composer.rb +158 -0
  250. data/lib/rosett_ai/composition/composition_result.rb +64 -0
  251. data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
  252. data/lib/rosett_ai/composition/lockfile.rb +103 -0
  253. data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
  254. data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
  255. data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
  256. data/lib/rosett_ai/config/compile_result.rb +37 -0
  257. data/lib/rosett_ai/config/compiler.rb +13 -0
  258. data/lib/rosett_ai/config/domain_transformer.rb +13 -0
  259. data/lib/rosett_ai/config/key_map.rb +13 -0
  260. data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
  261. data/lib/rosett_ai/config/scope_router.rb +13 -0
  262. data/lib/rosett_ai/config/secret_resolver.rb +125 -0
  263. data/lib/rosett_ai/configuration.rb +119 -0
  264. data/lib/rosett_ai/content/content_client.rb +60 -0
  265. data/lib/rosett_ai/content/pack_installer.rb +117 -0
  266. data/lib/rosett_ai/content/pack_manifest.rb +50 -0
  267. data/lib/rosett_ai/content/pack_registry.rb +68 -0
  268. data/lib/rosett_ai/content_packs/manager.rb +50 -0
  269. data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
  270. data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
  271. data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
  272. data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
  273. data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
  274. data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
  275. data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
  276. data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
  277. data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
  278. data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
  279. data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
  280. data/lib/rosett_ai/dbus/service.rb +121 -0
  281. data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
  282. data/lib/rosett_ai/deprecation.rb +79 -0
  283. data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
  284. data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
  285. data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
  286. data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
  287. data/lib/rosett_ai/doctor/check.rb +92 -0
  288. data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
  289. data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
  290. data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
  291. data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
  292. data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
  293. data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
  294. data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
  295. data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
  296. data/lib/rosett_ai/doctor.rb +81 -0
  297. data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
  298. data/lib/rosett_ai/documentation/translator.rb +62 -0
  299. data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
  300. data/lib/rosett_ai/engines/detector.rb +63 -0
  301. data/lib/rosett_ai/engines/registry.rb +50 -0
  302. data/lib/rosett_ai/error_handler.rb +139 -0
  303. data/lib/rosett_ai/exit_codes.rb +76 -0
  304. data/lib/rosett_ai/feature_flags.rb +102 -0
  305. data/lib/rosett_ai/formatting.rb +33 -0
  306. data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
  307. data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
  308. data/lib/rosett_ai/git_hooks/installer.rb +175 -0
  309. data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
  310. data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
  311. data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
  312. data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
  313. data/lib/rosett_ai/init/config_file_writer.rb +24 -0
  314. data/lib/rosett_ai/init/directory_builder.rb +38 -0
  315. data/lib/rosett_ai/init/file_copier.rb +95 -0
  316. data/lib/rosett_ai/init/global_initializer.rb +28 -0
  317. data/lib/rosett_ai/init/local_initializer.rb +27 -0
  318. data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
  319. data/lib/rosett_ai/init/project_initializer.rb +38 -0
  320. data/lib/rosett_ai/licensing/license_key.rb +139 -0
  321. data/lib/rosett_ai/licensing/license_store.rb +64 -0
  322. data/lib/rosett_ai/licensing/license_validator.rb +60 -0
  323. data/lib/rosett_ai/licensing/tier.rb +42 -0
  324. data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
  325. data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
  326. data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
  327. data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
  328. data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
  329. data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
  330. data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
  331. data/lib/rosett_ai/mcp/governance.rb +160 -0
  332. data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
  333. data/lib/rosett_ai/mcp/instructions.rb +266 -0
  334. data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
  335. data/lib/rosett_ai/mcp/keyfile.rb +221 -0
  336. data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
  337. data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
  338. data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
  339. data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
  340. data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
  341. data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
  342. data/lib/rosett_ai/mcp/plugins.rb +143 -0
  343. data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
  344. data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
  345. data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
  346. data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
  347. data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
  348. data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
  349. data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
  350. data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
  351. data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
  352. data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
  353. data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
  354. data/lib/rosett_ai/mcp/response_helper.rb +46 -0
  355. data/lib/rosett_ai/mcp/security_logger.rb +60 -0
  356. data/lib/rosett_ai/mcp/server.rb +212 -0
  357. data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
  358. data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
  359. data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
  360. data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
  361. data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
  362. data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
  363. data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
  364. data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
  365. data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
  366. data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
  367. data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
  368. data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
  369. data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
  370. data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
  371. data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
  372. data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
  373. data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
  374. data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
  375. data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
  376. data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
  377. data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
  378. data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
  379. data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
  380. data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
  381. data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
  382. data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
  383. data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
  384. data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
  385. data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
  386. data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
  387. data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
  388. data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
  389. data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
  390. data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
  391. data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
  392. data/lib/rosett_ai/migration/detector.rb +117 -0
  393. data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
  394. data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
  395. data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
  396. data/lib/rosett_ai/package_manager/apt.rb +108 -0
  397. data/lib/rosett_ai/package_manager/base.rb +68 -0
  398. data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
  399. data/lib/rosett_ai/packaging/variant_config.rb +92 -0
  400. data/lib/rosett_ai/path_resolver.rb +115 -0
  401. data/lib/rosett_ai/plugins/contract.rb +43 -0
  402. data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
  403. data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
  404. data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
  405. data/lib/rosett_ai/plugins/registry.rb +150 -0
  406. data/lib/rosett_ai/policy/auditor.rb +41 -0
  407. data/lib/rosett_ai/policy/deny_list.rb +71 -0
  408. data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
  409. data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
  410. data/lib/rosett_ai/policy/protected_files.rb +47 -0
  411. data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
  412. data/lib/rosett_ai/policy/validator.rb +35 -0
  413. data/lib/rosett_ai/profiler.rb +79 -0
  414. data/lib/rosett_ai/project/drift_detector.rb +126 -0
  415. data/lib/rosett_ai/project/manager.rb +115 -0
  416. data/lib/rosett_ai/project/sync_manager.rb +138 -0
  417. data/lib/rosett_ai/project/template_applier.rb +105 -0
  418. data/lib/rosett_ai/project_context.rb +82 -0
  419. data/lib/rosett_ai/provenance/entry.rb +63 -0
  420. data/lib/rosett_ai/provenance/file_source.rb +32 -0
  421. data/lib/rosett_ai/provenance/source.rb +62 -0
  422. data/lib/rosett_ai/provenance/store.rb +153 -0
  423. data/lib/rosett_ai/provenance/tracker.rb +62 -0
  424. data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
  425. data/lib/rosett_ai/provenance/validator.rb +45 -0
  426. data/lib/rosett_ai/quorum/collector.rb +59 -0
  427. data/lib/rosett_ai/quorum/comparator.rb +81 -0
  428. data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
  429. data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
  430. data/lib/rosett_ai/rai_config.rb +107 -0
  431. data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
  432. data/lib/rosett_ai/retrofit/engine.rb +171 -0
  433. data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
  434. data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
  435. data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
  436. data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
  437. data/lib/rosett_ai/retrofit/scanner.rb +47 -0
  438. data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
  439. data/lib/rosett_ai/secrets_resolver.rb +71 -0
  440. data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
  441. data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
  442. data/lib/rosett_ai/structured_logger.rb +110 -0
  443. data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
  444. data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
  445. data/lib/rosett_ai/telemetry/provider.rb +26 -0
  446. data/lib/rosett_ai/telemetry/reporter.rb +144 -0
  447. data/lib/rosett_ai/telemetry.rb +47 -0
  448. data/lib/rosett_ai/text_sanitizer.rb +62 -0
  449. data/lib/rosett_ai/thor/cli.rb +269 -0
  450. data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
  451. data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
  452. data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
  453. data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
  454. data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
  455. data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
  456. data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
  457. data/lib/rosett_ai/thor/tasks/config.rb +265 -0
  458. data/lib/rosett_ai/thor/tasks/content.rb +193 -0
  459. data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
  460. data/lib/rosett_ai/thor/tasks/design.rb +258 -0
  461. data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
  462. data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
  463. data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
  464. data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
  465. data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
  466. data/lib/rosett_ai/thor/tasks/init.rb +259 -0
  467. data/lib/rosett_ai/thor/tasks/license.rb +120 -0
  468. data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
  469. data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
  470. data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
  471. data/lib/rosett_ai/thor/tasks/project.rb +260 -0
  472. data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
  473. data/lib/rosett_ai/thor/tasks/release.rb +314 -0
  474. data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
  475. data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
  476. data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
  477. data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
  478. data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
  479. data/lib/rosett_ai/tooling/version_checker.rb +35 -0
  480. data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
  481. data/lib/rosett_ai/ui/base.rb +46 -0
  482. data/lib/rosett_ai/ui/gtk4.rb +98 -0
  483. data/lib/rosett_ai/ui/kde.rb +40 -0
  484. data/lib/rosett_ai/ui/qt6.rb +40 -0
  485. data/lib/rosett_ai/ui/registry.rb +60 -0
  486. data/lib/rosett_ai/ui/tty_helper.rb +74 -0
  487. data/lib/rosett_ai/ui/tui.rb +59 -0
  488. data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
  489. data/lib/rosett_ai/validators/design_validator.rb +17 -0
  490. data/lib/rosett_ai/validators/schema_validator.rb +84 -0
  491. data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
  492. data/lib/rosett_ai/version.rb +8 -0
  493. data/lib/rosett_ai/version_consistency_checker.rb +129 -0
  494. data/lib/rosett_ai/workflow/audit_log.rb +86 -0
  495. data/lib/rosett_ai/workflow/engine.rb +142 -0
  496. data/lib/rosett_ai/workflow/manager.rb +82 -0
  497. data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
  498. data/lib/rosett_ai/workflow/step_runner.rb +61 -0
  499. data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
  500. data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
  501. data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
  502. data/lib/rosett_ai/yaml_loader.rb +78 -0
  503. data/lib/rosett_ai.rb +221 -0
  504. data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
  505. data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
  506. data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
  507. data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
  508. data/lib/rubocop/rosett_ai.rb +9 -0
  509. data/lib/scripts/generated/docker_hub_tags.rb +126 -0
  510. data/locales/.gitkeep +0 -0
  511. data/locales/ar.yml +579 -0
  512. data/locales/en.yml +571 -0
  513. data/locales/fr.yml +567 -0
  514. data/packaging/build-engine-deb.sh +81 -0
  515. data/packaging/scripts/postinst +17 -0
  516. data/packaging/scripts/postrm +19 -0
  517. data/packaging/scripts/prerm +10 -0
  518. data/packaging/wrapper.sh.template +38 -0
  519. data/rosett-ai.gemspec +63 -0
  520. data/rules/.gitkeep +0 -0
  521. data/scripts/publish/pulp_upload.sh +123 -0
  522. data/settings.json +29 -0
  523. data/share/applications/be.neatnerds.rosettai.desktop +29 -0
  524. data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
  525. data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
  526. data/share/templates/behaviour/criticalthinking.yml +69 -0
  527. metadata +810 -0
data/doc/BEHAVIOUR.md ADDED
@@ -0,0 +1,409 @@
1
+ # Rosett-AI - Behaviour System
2
+
3
+ ## Overview
4
+
5
+ The behaviour system allows you to define and manage operational rules for Claude Code. Behaviours are stored as YAML files in `conf/behaviour/` and can be validated, displayed, and managed through the CLI.
6
+
7
+ ## Concepts
8
+
9
+ ### What is a Behaviour
10
+
11
+ A behaviour is a collection of rules that guide Claude Code's operation. Each behaviour file defines:
12
+
13
+ - **Name**: Unique identifier for the behaviour
14
+ - **Description**: Human-readable explanation
15
+ - **Rules**: Specific operational guidelines
16
+
17
+ ### Rule Priority
18
+
19
+ Rules have priorities from 1-100:
20
+
21
+ | Range | Description |
22
+ |-------|-------------|
23
+ | 90-100 | Critical - Always apply |
24
+ | 70-89 | High - Apply unless conflicting |
25
+ | 50-69 | Medium - Standard rules |
26
+ | 30-49 | Low - Apply when relevant |
27
+ | 1-29 | Minimal - Suggestions only |
28
+
29
+ ## File Structure
30
+
31
+ ### Location
32
+
33
+ Behaviour files can exist at two scope levels:
34
+
35
+ ```text
36
+ # Global behaviours (applied to all projects)
37
+ <rosett-ai-install>/conf/behaviour/
38
+
39
+ # Project behaviours (extend or override global)
40
+ <project>/.rosett-ai/conf/behaviour/
41
+ ```
42
+
43
+ When compiling from a project directory (one with `.rosett-ai/`), both scopes
44
+ are merged: global behaviours are included alongside project-specific
45
+ ones. If a project behaviour has the same filename as a global one,
46
+ the project version takes precedence.
47
+
48
+ See: `spec/rosett_ai/compiler/compilation_pipeline_spec.rb` — "multi-source
49
+ compilation" context for authoritative test cases.
50
+
51
+ ### Naming Convention
52
+
53
+ - Use snake_case for file names
54
+ - Extension must be `.yml`
55
+ - Name should describe the behaviour's purpose
56
+
57
+ Examples:
58
+
59
+ - `code_review.yml`
60
+ - `security_audit.yml`
61
+ - `documentation_standards.yml`
62
+
63
+ ### Schema
64
+
65
+ Behaviour files are validated against a JSON Schema definition stored at:
66
+
67
+ ```text
68
+ conf/schemas/behaviour_schema.json
69
+ ```
70
+
71
+ This external schema file is loaded at runtime by `RosettAi::Validators::BehaviourValidator`.
72
+ It uses [JSON Schema Draft 2020-12](https://json-schema.org/draft/2020-12/schema) and is
73
+ processed by the [json_schemer](https://rubygems.org/gems/json_schemer) gem.
74
+
75
+ The schema includes metadata in its `$comment` field:
76
+
77
+ | Key | Description |
78
+ |-----|-------------|
79
+ | `date` | Date the schema was last updated |
80
+ | `version` | Schema version (semantic versioning) |
81
+ | `source` | Originating project (`rosett-ai`) |
82
+ | `compatible_claude_code_versions` | Compatible rai version range |
83
+
84
+ #### Behaviour Fields
85
+
86
+ ```yaml
87
+ # Required fields
88
+ name: string # Unique identifier (1-100 chars)
89
+ description: string # What this behaviour does (min 1 char)
90
+ rules: array # List of rules (min 1 item)
91
+
92
+ # Optional fields
93
+ version: string # Semantic version (e.g., "1.0.0")
94
+ author: string # Creator's name/email
95
+ created_at: date # Creation date (YYYY-MM-DD)
96
+ modified_at: date # Last modification date (YYYY-MM-DD)
97
+ modified_by: string # Last modifier
98
+ sensitive: boolean # Exclude from API analysis during adopt (default: false)
99
+ used_in: array # Projects using this behaviour
100
+ ```
101
+
102
+ No additional properties are allowed beyond those listed above. See `conf/schemas/behaviour_schema.json` for the canonical schema definition.
103
+
104
+ #### Rule Fields
105
+
106
+ ```yaml
107
+ rules:
108
+ - id: string # Unique rule identifier (required)
109
+ description: string # What this rule does (required)
110
+ priority: integer # 1-100 (optional, default: 50)
111
+ enabled: boolean # Active or not (optional, default: true)
112
+ ```
113
+
114
+ #### Modifying the Schema
115
+
116
+ To change validation rules, edit `conf/schemas/behaviour_schema.json` directly.
117
+ After changes, update the `$comment.date` and `$comment.version` fields, then
118
+ run the test suite to verify nothing breaks:
119
+
120
+ ```bash
121
+ bundle exec rspec spec/rosett_ai/validators/behaviour_validator_spec.rb
122
+ ```
123
+
124
+ ## Creating Behaviours
125
+
126
+ ### Using the CLI
127
+
128
+ ```bash
129
+ bin/raictl behaviour manage add my_behaviour --description="Description here"
130
+ ```
131
+
132
+ This will:
133
+
134
+ 1. Create a template file in a temporary directory
135
+ 2. Open it in your `$EDITOR`
136
+ 3. Validate on save
137
+ 4. Copy to `conf/behaviour/` if valid
138
+
139
+ ### Manual Creation
140
+
141
+ Create a YAML file directly:
142
+
143
+ ```yaml
144
+ name: manual_behaviour
145
+ description: Manually created behaviour
146
+ version: 1.0.0
147
+ author: developer@neatnerds.be
148
+ created_at: "2025-01-17"
149
+ modified_at: "2025-01-17"
150
+ modified_by: developer@neatnerds.be
151
+ used_in: []
152
+ rules:
153
+ - id: rule_001
154
+ description: First rule description
155
+ priority: 50
156
+ enabled: true
157
+ ```
158
+
159
+ Then validate:
160
+
161
+ ```bash
162
+ bin/raictl behaviour validate manual_behaviour
163
+ ```
164
+
165
+ ## Example Behaviours
166
+
167
+ ### Code Review
168
+
169
+ ```yaml
170
+ name: code_review
171
+ description: Guidelines for reviewing code changes
172
+ version: 1.0.0
173
+ author: team@neatnerds.be
174
+ created_at: "2025-01-17"
175
+ modified_at: "2025-01-17"
176
+ modified_by: team@neatnerds.be
177
+ used_in:
178
+ - all_projects
179
+ rules:
180
+ - id: security_first
181
+ description: Check for security vulnerabilities before other concerns
182
+ priority: 95
183
+ enabled: true
184
+ - id: test_coverage
185
+ description: Ensure changes have appropriate test coverage
186
+ priority: 85
187
+ enabled: true
188
+ - id: code_style
189
+ description: Verify code follows project style guidelines
190
+ priority: 70
191
+ enabled: true
192
+ - id: documentation
193
+ description: Check that public APIs are documented
194
+ priority: 60
195
+ enabled: true
196
+ ```
197
+
198
+ ### Security Audit
199
+
200
+ ```yaml
201
+ name: security_audit
202
+ description: Security-focused code analysis rules
203
+ version: 1.0.0
204
+ author: security@neatnerds.be
205
+ created_at: "2025-01-17"
206
+ modified_at: "2025-01-17"
207
+ modified_by: security@neatnerds.be
208
+ used_in:
209
+ - production_apps
210
+ rules:
211
+ - id: injection_check
212
+ description: Scan for SQL/command injection vulnerabilities
213
+ priority: 100
214
+ enabled: true
215
+ - id: auth_verification
216
+ description: Verify authentication mechanisms
217
+ priority: 95
218
+ enabled: true
219
+ - id: data_exposure
220
+ description: Check for sensitive data exposure risks
221
+ priority: 90
222
+ enabled: true
223
+ - id: dependency_audit
224
+ description: Review third-party dependencies for known CVEs
225
+ priority: 85
226
+ enabled: true
227
+ ```
228
+
229
+ ## Validation
230
+
231
+ ### Automatic Validation
232
+
233
+ Files are validated when:
234
+
235
+ - Created via `behaviour manage add`
236
+ - Modified via `behaviour manage modify`
237
+ - CI/CD pipeline runs
238
+
239
+ ### Manual Validation
240
+
241
+ ```bash
242
+ # Validate all files
243
+ bin/raictl behaviour validate
244
+
245
+ # Validate specific file
246
+ bin/raictl behaviour validate code_review
247
+ ```
248
+
249
+ ### Validation Rules
250
+
251
+ 1. Required fields must be present
252
+ 2. `rules` array must have at least one item
253
+ 3. Each rule must have `id` and `description`
254
+ 4. `version` must follow semantic versioning
255
+ 5. `priority` must be between 1 and 100
256
+ 6. No additional properties allowed
257
+
258
+ ## Integration
259
+
260
+ ### In CLAUDE.md
261
+
262
+ Reference behaviours in your CLAUDE.md:
263
+
264
+ ```markdown
265
+ ## Active Behaviours
266
+
267
+ This project uses the following behaviours:
268
+ - code_review
269
+ - security_audit
270
+ ```
271
+
272
+ ### In Rules
273
+
274
+ Behaviours can be referenced in rule files:
275
+
276
+ ```yaml
277
+ # rules/project_rules.yml
278
+ includes:
279
+ - behaviour: code_review
280
+ - behaviour: security_audit
281
+ override:
282
+ - id: test_coverage
283
+ priority: 95 # Increase priority for this project
284
+ ```
285
+
286
+ ## Compiling Rules
287
+
288
+ The `compile` command renders behaviour YAML files into markdown rule files that Claude Code reads from `~/.claude/rules/`.
289
+
290
+ ### Usage
291
+
292
+ ```bash
293
+ # Compile all categories (auto-detects scope from working directory)
294
+ bin/raictl compile
295
+
296
+ # Dry run — show what would change
297
+ bin/raictl compile --simulate --verbose
298
+
299
+ # Compile with detailed output
300
+ bin/raictl compile --verbose
301
+
302
+ # Compile and write lockfile
303
+ bin/raictl compile --vendor
304
+ ```
305
+
306
+ ### Scope-Aware Compilation
307
+
308
+ When run from a project directory (containing `.rosett-ai/`), compile
309
+ automatically merges global and project-level behaviours:
310
+
311
+ ```bash
312
+ # From a project directory with .rosett-ai/conf/behaviour/api_rules.yml:
313
+ cd ~/projects/acme-api
314
+ rai compile --verbose
315
+ # Output includes BOTH global behaviours AND project-specific api_rules
316
+ ```
317
+
318
+ Project behaviours with the same filename as a global behaviour
319
+ override the global version. All other global behaviours are preserved.
320
+
321
+ See: `spec/rosett_ai/thor/tasks/compile_spec.rb` — "with scope detection"
322
+ and "with multi-source compilation" contexts.
323
+
324
+ ### How It Works
325
+
326
+ 1. Discovers compilable categories from all active source directories (global + project if applicable)
327
+ 2. Collects YAML files from each source; project-level files override global files with the same name
328
+ 3. Validates each YAML file against its schema
329
+ 4. Renders enabled rules (sorted by priority descending) into markdown
330
+ 5. Writes to `~/.claude/rules/<category>-<name>.md`
331
+ 6. Removes orphaned rule files that no longer have a source in any active scope
332
+
333
+ ### Idempotency
334
+
335
+ The compiler computes SHA256 checksums and only writes when content changes. Running `compile` twice produces no changes on the second run.
336
+
337
+ ### Lockfile
338
+
339
+ With `--vendor`, a `conf/compile.lock.yml` is written capturing the compiled state (versions, checksums, timestamps) for reproducibility.
340
+
341
+ ## Adopting Rules
342
+
343
+ The `adopt` command analyzes compiled rule files for inconsistencies, conflicts, harmful content, duplicates, and other issues using the Claude API.
344
+
345
+ ### Usage
346
+
347
+ ```bash
348
+ # Full API analysis
349
+ bin/raictl adopt
350
+
351
+ # Local-only structural checks (no API)
352
+ bin/raictl adopt --local
353
+
354
+ # Verbose output with details
355
+ bin/raictl adopt --verbose
356
+
357
+ # Show detailed explanations
358
+ bin/raictl adopt --elaborate --verbose
359
+ ```
360
+
361
+ ### Data Privacy
362
+
363
+ Four layers of privacy protection are available:
364
+
365
+ 1. **Opt-in per file** (default) — Add `sensitive: true` to a behaviour YAML to exclude it from API analysis
366
+ 2. **Redaction** — Configure patterns in `conf/adopt_redactions.yml` to replace sensitive content before sending to the API
367
+ 3. **Configurable endpoint** — Set `ANTHROPIC_API_BASE_URL` environment variable for Bedrock, Vertex, or proxy endpoints
368
+ 4. **Local-only mode** — Use `--local` flag to skip API calls entirely
369
+
370
+ ### Sensitive Files
371
+
372
+ Mark a behaviour file as sensitive to exclude it from API analysis:
373
+
374
+ ```yaml
375
+ name: internal_security
376
+ description: Internal security policies
377
+ sensitive: true
378
+ rules:
379
+ - id: sec_001
380
+ description: ...
381
+ ```
382
+
383
+ Sensitive files are still checked locally for structural issues.
384
+
385
+ ### Redaction
386
+
387
+ Configure `conf/adopt_redactions.yml` with regex patterns:
388
+
389
+ ```yaml
390
+ ---
391
+ patterns:
392
+ - pattern: '\b[A-Z0-9._%+-]+@company\.com\b'
393
+ replacement: '[EMAIL-REDACTED]'
394
+ - pattern: 'CompanyName'
395
+ replacement: '[COMPANY]'
396
+ ```
397
+
398
+ ### Caching
399
+
400
+ Results are cached in `conf/adopt.cache.yml`, keyed on the SHA256 of all analyzed file contents. Running `adopt` twice with unchanged files returns the cached result without an API call.
401
+
402
+ ## Best Practices
403
+
404
+ 1. **Keep behaviours focused**: One behaviour per concern
405
+ 2. **Use descriptive IDs**: `security_sql_injection` > `rule_1`
406
+ 3. **Document thoroughly**: Descriptions should be actionable
407
+ 4. **Version your changes**: Update version on modifications
408
+ 5. **Track usage**: Maintain `used_in` for dependency tracking
409
+ 6. **Review regularly**: Audit behaviours periodically
data/doc/BUILD.md ADDED
@@ -0,0 +1,138 @@
1
+ # Building rosett-ai Packages
2
+
3
+ This document describes how to build Debian packages for rosett-ai core and engine plugins.
4
+
5
+ ## Prerequisites
6
+
7
+ Install the following tools before building:
8
+
9
+ ```bash
10
+ # Debian build tools
11
+ sudo apt-get install fakeroot dpkg-dev rsync
12
+
13
+ # Ruby build (for core package only)
14
+ # Ensure ruby-build is on PATH (typically via rbenv)
15
+
16
+ # Install all gem dependencies (includes fpm from :build group)
17
+ bundle install
18
+ ```
19
+
20
+ ## Building rosett-ai Core
21
+
22
+ The core package bundles a self-contained Ruby runtime, the rosett-ai application,
23
+ vendored gems, and maintainer scripts into a Debian package at `/opt/rosett-ai`.
24
+
25
+ ```bash
26
+ cd rosett-ai/
27
+
28
+ # Default build (core variant)
29
+ bin/raictl build package
30
+
31
+ # With options
32
+ bin/raictl build package --clean --verbose
33
+ bin/raictl build package --variant gtk4
34
+ bin/raictl build package --variant qt6
35
+ bin/raictl build package --architecture arm64
36
+ bin/raictl build package --ruby-version 3.3.10
37
+ bin/raictl build package --output-dir /tmp/pkg
38
+ ```
39
+
40
+ ### Variants
41
+
42
+ | Variant | Package Name | Description |
43
+ |---------|-------------|-------------|
44
+ | `core` | `rosett-ai` | CLI + TUI (default) |
45
+ | `gtk4` | `rosett-ai-gtk4` | GTK4/Adwaita desktop interface |
46
+ | `qt6` | `rosett-ai-qt6` | Qt6/KDE desktop interface |
47
+
48
+ ## Building an Engine Plugin
49
+
50
+ Engine plugins are packaged as Debian packages that install their gem into the
51
+ raictl embedded Ruby's gem directory.
52
+
53
+ ```bash
54
+ # From the engine directory
55
+ cd rosett-ai-engine-claude/
56
+ rai build engine --verbose
57
+
58
+ # From the rosett-ai repo with --path
59
+ cd rosett-ai/
60
+ bin/raictl build engine --path ../rosett-ai-engine-claude --verbose
61
+
62
+ # Custom output and dependency version
63
+ rai build engine --output-dir /tmp/pkg --rosett-ai-min-version 1.0.0
64
+ ```
65
+
66
+ ### Options
67
+
68
+ | Option | Default | Description |
69
+ |--------|---------|-------------|
70
+ | `--path` | Current directory | Engine repo directory |
71
+ | `--verbose` | `false` | Show detailed build output |
72
+ | `--output-dir` | `pkg/` | Output directory for `.deb` |
73
+ | `--rosett-ai-min-version` | Current rai version | Minimum rosett-ai dependency |
74
+ | `--build-iteration` | `1` | Package iteration number |
75
+
76
+ ### How It Works
77
+
78
+ 1. Detects the engine gemspec (`rosett-ai-engine-*.gemspec`) in the target directory
79
+ 2. Extracts name and version from the gemspec (no hardcoded values)
80
+ 3. Derives Ruby ABI from the current runtime (`RbConfig::CONFIG['ruby_version']`)
81
+ 4. Runs `gem build` to produce a `.gem` file
82
+ 5. Creates a staging tree at `tmp/staging/opt/rosett-ai/embedded/lib/ruby/gems/<ABI>/`
83
+ 6. Installs the gem into the staging tree with `gem install --local`
84
+ 7. Packages with fpm, setting `--depends "rosett-ai (>= <version>)"`
85
+
86
+ ## Building All Packages
87
+
88
+ To build all packages (core + engines):
89
+
90
+ ```bash
91
+ #!/usr/bin/env ruby
92
+ # build_all.rb — build core + all engines
93
+
94
+ system('bin/raictl', 'build', 'package', '--verbose') || abort('Core build failed')
95
+
96
+ Dir.glob('../rosett-ai-engine-*/').each do |engine_dir|
97
+ name = File.basename(engine_dir)
98
+ puts "\nBuilding #{name}..."
99
+ system('bin/raictl', 'build', 'engine', '--path', engine_dir, '--verbose') || warn("#{name} failed")
100
+ end
101
+ ```
102
+
103
+ ## Version Management
104
+
105
+ Versions are never hardcoded in build scripts:
106
+
107
+ - **Core**: reads `RosettAi::VERSION` from `lib/rosett_ai/version.rb`
108
+ - **Engines**: parsed from the engine's gemspec (`spec.version`)
109
+ - **Ruby ABI**: derived from `RbConfig::CONFIG['ruby_version']` at build time
110
+ - **Ruby version**: read from `.ruby-version` (core only)
111
+
112
+ ## Package Layout
113
+
114
+ After installation, the rosett-ai package tree looks like:
115
+
116
+ ```text
117
+ /opt/rosett-ai/
118
+ bin/raictl # Wrapper script
119
+ app/ # Application source
120
+ embedded/ # Self-contained Ruby runtime
121
+ bin/ruby
122
+ lib/ruby/gems/3.3.10/
123
+ gems/
124
+ rosett-ai-engine-claude-1.0.0/
125
+ rosett-ai-engine-cursor-1.0.0/
126
+ ...
127
+ etc/ # Default configuration
128
+ /etc/rosett-ai/
129
+ settings.json # dpkg conffile (preserved on upgrade)
130
+ /usr/share/man/man1/
131
+ rai.1.gz # Man page
132
+ ```
133
+
134
+ ## CI/CD Integration
135
+
136
+ Engine builds in CI use the shared component from `ci-components/templates/rosett-ai-engine.yml`.
137
+ The `bin/raictl build engine` command is the canonical build method for both local
138
+ development and CI pipelines.
@@ -0,0 +1,171 @@
1
+ # CI/CD Recipes
2
+
3
+ Patterns and recipes for rosett-ai continuous integration and deployment.
4
+
5
+ ## Pipeline Architecture
6
+
7
+ The rosett-ai pipeline is split across multiple YAML files in
8
+ `.gitlab-ci-files/` for maintainability:
9
+
10
+ ```text
11
+ .gitlab-ci.yml # Root includes
12
+ ├── global/stages.yml # Stage ordering
13
+ ├── global/defaults.yml # Default image, cache, retry
14
+ ├── global/variables.yml # Shared CI variables
15
+ ├── global/resource-limits.yml # CPU/memory limits
16
+ ├── validate/*.yml # YAML, JSON, Ruby syntax, schemas
17
+ ├── code_quality/*.yml # RuboCop, Reek, Fasterer, Flay
18
+ ├── security_scan/*.yml # Bundler-audit, Trivy, Gitleaks
19
+ ├── test/*.yml # RSpec, Mutant
20
+ ├── build/package.yml # .deb packaging (amd64 + arm64)
21
+ ├── release/publish.yml # GitLab release creation
22
+ └── deploy/pulp.yml # Pulp repository publishing
23
+ ```
24
+
25
+ ## Stages
26
+
27
+ | Stage | Purpose | Example Jobs |
28
+ |-------|---------|--------------|
29
+ | `validate` | Syntax and schema validation | yaml, json, ruby-syntax, schemas |
30
+ | `code_quality` | Static analysis | rubocop, reek, fasterer, flay |
31
+ | `security_scan` | Vulnerability detection | bundler-audit, trivy, gitleaks |
32
+ | `test` | Functional testing | rspec, mutant |
33
+ | `build` | Package creation | amd64, arm64, smoke test |
34
+ | `deploy` | Repository publishing | pulp stable, pulp unstable |
35
+
36
+ ## Multi-Architecture Builds
37
+
38
+ The `.package_build_template` in `build/package.yml` supports parallel
39
+ architecture builds:
40
+
41
+ ```yaml
42
+ build:package:amd64:
43
+ extends: .package_build_template
44
+ variables:
45
+ PACKAGE_ARCH: "amd64"
46
+
47
+ build:package:arm64:
48
+ extends: .package_build_template
49
+ variables:
50
+ PACKAGE_ARCH: "arm64"
51
+ ```
52
+
53
+ ### Adding a New Architecture
54
+
55
+ 1. Add a new job extending `.package_build_template`
56
+ 2. Set `PACKAGE_ARCH` to the dpkg architecture name
57
+ 3. Add it to `build:package:release` needs list
58
+ 4. Ensure a CI runner with matching `tags` is available
59
+
60
+ ## Release Automation
61
+
62
+ Releases are triggered by annotated tags matching `v*.*.*`:
63
+
64
+ ```bash
65
+ # Prepare release (bumps VERSION, generates CHANGELOG)
66
+ bin/raictl release prepare minor
67
+
68
+ # Create annotated tag
69
+ bin/raictl release tag
70
+
71
+ # Push tag to trigger CI
72
+ git push origin --tags
73
+ ```
74
+
75
+ The pipeline then:
76
+
77
+ 1. Runs all quality gates (validate → test)
78
+ 2. Builds `.deb` packages for both architectures
79
+ 3. Collects artifacts with SHA256 checksums
80
+ 4. Creates a GitLab release with CHANGELOG notes
81
+ 5. Publishes to the Pulp stable repository
82
+
83
+ ## Smoke Testing
84
+
85
+ The `build:package:smoke_test` job installs the built `.deb` in a clean
86
+ `debian:bookworm` container with no pre-installed Ruby:
87
+
88
+ ```yaml
89
+ script:
90
+ - dpkg -i pkg/*.deb || apt-get install -fy
91
+ - rosett-ai version
92
+ - rai validate
93
+ - rai engines list
94
+ ```
95
+
96
+ This verifies the package is self-contained (embedded Ruby, all gems).
97
+
98
+ ## Cache Strategy
99
+
100
+ | Cache Key | Contents | Policy |
101
+ |-----------|----------|--------|
102
+ | `Gemfile.lock` hash | `vendor/bundle/` | pull |
103
+ | `package-${REF}` | Compiled Ruby in staging | pull-push |
104
+
105
+ The compiled Ruby cache avoids the ~13 minute compilation on every build.
106
+
107
+ ## Engine Gem CI
108
+
109
+ Engine gems use the shared CI component from `ci-components` (v1.0.1):
110
+
111
+ ```yaml
112
+ include:
113
+ - component: gitlab.neatnerds.be/neatnerds/NeatNerds-AI/ci-components/rosett-ai-engine@v1.0.1
114
+ ```
115
+
116
+ This provides standard jobs for: RuboCop, Reek, RSpec, Mutant, and
117
+ SimpleCov with tiered coverage thresholds.
118
+
119
+ ### Adding a New Engine
120
+
121
+ 1. Scaffold with `rosett-ai-dev-tools`: `rosett-ai-dev-tools scaffold engine <name>`
122
+ 2. The scaffold includes a `.gitlab-ci.yml` that references the shared component
123
+ 3. Push to GitLab and the pipeline runs automatically
124
+
125
+ ## Integration Testing (Future)
126
+
127
+ Integration tests require Docker (Phase 7):
128
+
129
+ ```yaml
130
+ integration:test_kitchen:
131
+ stage: test
132
+ image: docker:24
133
+ services:
134
+ - docker:24-dind
135
+ script:
136
+ - kitchen test
137
+ rules:
138
+ - if: $CI_COMMIT_TAG
139
+ ```
140
+
141
+ This will use Test Kitchen with a Debian container to verify:
142
+
143
+ - Package installation
144
+ - Engine detection
145
+ - Configuration compilation
146
+ - D-Bus service lifecycle
147
+
148
+ ## Security Scanning
149
+
150
+ | Scanner | What It Checks |
151
+ |---------|----------------|
152
+ | Bundler-audit | Known CVEs in gem dependencies |
153
+ | Ruby-audit | Ruby stdlib vulnerabilities |
154
+ | Trivy | Container image vulnerabilities |
155
+ | Gitleaks | Leaked secrets in git history |
156
+
157
+ ## Quality Gates
158
+
159
+ All quality gates must pass before merge:
160
+
161
+ | Gate | Threshold |
162
+ |------|-----------|
163
+ | RuboCop | 0 offenses |
164
+ | Reek | 0 warnings (with exclusions) |
165
+ | Fasterer | 0 offenses |
166
+ | Flay | mass threshold 16 |
167
+ | RSpec | 0 failures |
168
+ | SimpleCov | >= 87% line coverage |
169
+ | Mutant | All configured subjects |
170
+ | Bundler-audit | No known vulnerabilities |
171
+ | Gitleaks | No secrets detected |