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
@@ -0,0 +1,920 @@
1
+ # Architecture
2
+
3
+ ## System Overview
4
+
5
+ raictl (Rosett-AI) is an engine-agnostic configuration management tool.
6
+ It separates **human intent** (generic YAML) from **engine translation** (tool-specific
7
+ compilation) from **tool-native output** (deployed files).
8
+
9
+ ```mermaid
10
+ graph TB
11
+ subgraph Layer1["Layer 1: Human Intent"]
12
+ BEHAV["conf/behaviour/*.yml<br/>Operational rules"]
13
+ DESIGN["conf/design/*.yml<br/>Design documents"]
14
+ TOOL["conf/tooling/*.yml<br/>CI tooling"]
15
+ end
16
+
17
+ subgraph Layer2["Layer 2: Engine Translation"]
18
+ PIPELINE["Compiler::CompilationPipeline"]
19
+ BACKEND["Engine Backend"]
20
+ MANIFEST["Engine Manifest"]
21
+ PROFILE["Target Profile"]
22
+ end
23
+
24
+ subgraph Layer3["Layer 3: Tool-Native Output"]
25
+ CLAUDE_OUT["~/.claude/rules/*.md"]
26
+ CURSOR_OUT[".cursorrules"]
27
+ COPILOT_OUT[".github/copilot-instructions.md"]
28
+ WINDSURF_OUT[".windsurfrules"]
29
+ AGENTS_OUT["./AGENTS.md"]
30
+ GOOSE_OUT[".goosehints"]
31
+ AIDER_OUT["CONVENTIONS.md"]
32
+ OLLAMA_OUT["Ollama modelfile"]
33
+ NEOX_OUT["vLLM prompt"]
34
+ GENERIC_OUT["*.md (generic)"]
35
+ end
36
+
37
+ BEHAV --> PIPELINE
38
+ DESIGN --> PIPELINE
39
+ TOOL --> PIPELINE
40
+ PIPELINE --> BACKEND
41
+ MANIFEST --> BACKEND
42
+ PROFILE --> BACKEND
43
+ BACKEND --> CLAUDE_OUT
44
+ BACKEND --> CURSOR_OUT
45
+ BACKEND --> COPILOT_OUT
46
+ BACKEND --> WINDSURF_OUT
47
+ BACKEND --> AGENTS_OUT
48
+ BACKEND --> GOOSE_OUT
49
+ BACKEND --> AIDER_OUT
50
+ BACKEND --> OLLAMA_OUT
51
+ BACKEND --> NEOX_OUT
52
+ BACKEND --> GENERIC_OUT
53
+ ```
54
+
55
+ ## Class Hierarchy
56
+
57
+ ### Core Module Tree
58
+
59
+ ```mermaid
60
+ classDiagram
61
+ direction TB
62
+
63
+ class RosettAi {
64
+ +root() Pathname
65
+ +logger() Logger
66
+ +VERSION String
67
+ }
68
+
69
+ class Configuration {
70
+ +settings() Hash
71
+ +local_settings() Hash
72
+ +merged_settings() Hash
73
+ +behaviour_files() Array
74
+ +reload!()
75
+ }
76
+
77
+ class PathResolver {
78
+ +claude_home() Pathname
79
+ +claude_rules_dir() Pathname
80
+ +rai_config_home() Pathname
81
+ +project_claude_md() Pathname
82
+ }
83
+
84
+ class RaiConfig {
85
+ +load() Hash
86
+ +default_engine String
87
+ +cache_enabled Boolean
88
+ }
89
+
90
+ class YamlLoader {
91
+ +load_file(path) Hash
92
+ -check_file_size!(path)
93
+ -check_depth!(data)
94
+ -check_key_count!(data)
95
+ MAX_FILE_SIZE = 1MB
96
+ MAX_NESTING = 10
97
+ MAX_KEYS = 1000
98
+ }
99
+
100
+ class TextSanitizer {
101
+ +sanitize(text) String
102
+ }
103
+
104
+ RosettAi --> Configuration
105
+ RosettAi --> PathResolver
106
+ RosettAi --> RaiConfig
107
+ RosettAi --> YamlLoader
108
+ RosettAi --> TextSanitizer
109
+ ```
110
+
111
+ ### Compiler Pipeline
112
+
113
+ ```mermaid
114
+ classDiagram
115
+ direction TB
116
+
117
+ class CompilationPipeline {
118
+ +compile(behaviours, engine) Array~CompiledOutput~
119
+ +compile_all(engine) Array~CompiledOutput~
120
+ }
121
+
122
+ class BehaviourCompiler {
123
+ +compile(behaviour, backend) CompiledOutput
124
+ }
125
+
126
+ class CompiledOutput {
127
+ +filename String
128
+ +content String
129
+ +source String
130
+ +category String
131
+ +name String
132
+ +version String
133
+ }
134
+
135
+ class Backend {
136
+ <<abstract>>
137
+ +render(behaviour) String
138
+ +file_extension() String
139
+ +metadata_comment(source, category, version) String
140
+ }
141
+
142
+ class TargetProfile {
143
+ +name String
144
+ +output_dir Pathname
145
+ +file_extension String
146
+ }
147
+
148
+ class LocaleCompiler {
149
+ +compile(locale, format) String
150
+ }
151
+
152
+ CompilationPipeline --> BehaviourCompiler
153
+ CompilationPipeline --> TargetProfile
154
+ BehaviourCompiler --> Backend
155
+ BehaviourCompiler --> CompiledOutput
156
+ ```
157
+
158
+ ### Engine Backends
159
+
160
+ ```mermaid
161
+ classDiagram
162
+ direction TB
163
+
164
+ class Backend {
165
+ <<abstract>>
166
+ +render(behaviour) String
167
+ +file_extension() String
168
+ }
169
+
170
+ class ClaudeBackend {
171
+ +render(behaviour) String
172
+ +file_extension() ".md"
173
+ -metadata_header(source, category, version) String
174
+ -priority_annotation(rule) String
175
+ }
176
+
177
+ class AgentsMdBackend {
178
+ +render(behaviour) String
179
+ +file_extension() ".md"
180
+ -bullet_list_rules(rules) String
181
+ -instructions_heading() String
182
+ }
183
+
184
+ class GenericBackend {
185
+ +render(behaviour) String
186
+ +file_extension() ".md"
187
+ }
188
+
189
+ class OllamaBackend {
190
+ +render(behaviour) String
191
+ +file_extension() ".txt"
192
+ }
193
+
194
+ class GptNeoxBackend {
195
+ +render(behaviour) String
196
+ +file_extension() ".txt"
197
+ }
198
+
199
+ class GooseBackend {
200
+ +render(behaviour) String
201
+ +file_extension() ".md"
202
+ }
203
+
204
+ class AiderBackend {
205
+ +render(behaviour) String
206
+ +file_extension() ".md"
207
+ }
208
+
209
+ class CursorBackend {
210
+ +render(behaviour) String
211
+ +file_extension() ".md"
212
+ }
213
+
214
+ class CopilotBackend {
215
+ +render(behaviour) String
216
+ +file_extension() ".md"
217
+ }
218
+
219
+ class WindsurfBackend {
220
+ +render(behaviour) String
221
+ +file_extension() ".md"
222
+ }
223
+
224
+ Backend <|-- ClaudeBackend
225
+ Backend <|-- AgentsMdBackend
226
+ Backend <|-- GenericBackend
227
+ Backend <|-- OllamaBackend
228
+ Backend <|-- GptNeoxBackend
229
+ Backend <|-- GooseBackend
230
+ Backend <|-- AiderBackend
231
+ Backend <|-- CursorBackend
232
+ Backend <|-- CopilotBackend
233
+ Backend <|-- WindsurfBackend
234
+ ```
235
+
236
+ ### Validator Hierarchy
237
+
238
+ ```mermaid
239
+ classDiagram
240
+ direction TB
241
+
242
+ class SchemaValidator {
243
+ +valid?(path) Boolean
244
+ +validate(path) Array~String~
245
+ +errors Array~String~
246
+ -load_schema() Hash
247
+ -validate_schema(content)
248
+ }
249
+
250
+ class BehaviourValidator {
251
+ schema = "behaviour_schema.json"
252
+ }
253
+
254
+ class DesignValidator {
255
+ schema = "design_schema.json"
256
+ }
257
+
258
+ class ToolingValidator {
259
+ schema = "tooling_schema.json"
260
+ }
261
+
262
+ SchemaValidator <|-- BehaviourValidator
263
+ SchemaValidator <|-- DesignValidator
264
+ SchemaValidator <|-- ToolingValidator
265
+ ```
266
+
267
+ ### UI Adapter Registry
268
+
269
+ ```mermaid
270
+ classDiagram
271
+ direction TB
272
+
273
+ class Registry {
274
+ +register(name, klass)$
275
+ +resolve(name) Base
276
+ +available() Array~String~
277
+ +registered?(name) Boolean
278
+ +reset!()
279
+ }
280
+
281
+ class Base {
282
+ <<abstract>>
283
+ +display_table(data)
284
+ +display_list(data)
285
+ +prompt_confirm(message) Boolean
286
+ +spinner(message)
287
+ }
288
+
289
+ class Tui {
290
+ Rainbow + TTY integration
291
+ }
292
+ class AccessibleTui {
293
+ Screen reader compatible
294
+ }
295
+ class Gtk4 {
296
+ GTK4/Adwaita adapter
297
+ }
298
+ class Qt6 {
299
+ Qt6 adapter
300
+ }
301
+ class Kde {
302
+ KDE KCM adapter
303
+ }
304
+
305
+ Registry --> Base
306
+ Base <|-- Tui
307
+ Base <|-- AccessibleTui
308
+ Base <|-- Gtk4
309
+ Base <|-- Qt6
310
+ Base <|-- Kde
311
+ ```
312
+
313
+ ### Licensing System
314
+
315
+ ```mermaid
316
+ classDiagram
317
+ direction TB
318
+
319
+ class LicenseKey {
320
+ +decode(key_string) Hash
321
+ +valid?() Boolean
322
+ +tier() String
323
+ +expired?() Boolean
324
+ +within_grace?() Boolean
325
+ PUBLIC_KEY Ed25519
326
+ GRACE_PERIOD = 14d
327
+ }
328
+
329
+ class LicenseValidator {
330
+ +validate(key) Result
331
+ +tier_for(key) Tier
332
+ }
333
+
334
+ class LicenseStore {
335
+ +save(key)
336
+ +load() LicenseKey
337
+ +remove()
338
+ }
339
+
340
+ class Tier {
341
+ +name String
342
+ +features Array
343
+ FREE = "free"
344
+ PRO = "pro"
345
+ ENTERPRISE = "enterprise"
346
+ }
347
+
348
+ LicenseValidator --> LicenseKey
349
+ LicenseValidator --> LicenseStore
350
+ LicenseValidator --> Tier
351
+ ```
352
+
353
+ ## Engine Architecture
354
+
355
+ ### Engine Component Structure
356
+
357
+ Each engine is a separate gem (`rosett-ai-engine-<name>`) with optional components,
358
+ discovered at runtime by `RosettAi::Plugins::Registry.discover!`:
359
+
360
+ ```mermaid
361
+ graph TB
362
+ subgraph Core["rosett-ai core"]
363
+ REG["RosettAi::Plugins::Registry<br/>discover! / register / resolve"]
364
+ BASE["Base classes:<br/>Compiler::Backend<br/>Engines::Detector<br/>Engines::BaseConfigCompiler"]
365
+ end
366
+
367
+ subgraph Gems["External Engine Gems (rosett-ai-engine-*)"]
368
+ GEM_CLAUDE["rosett-ai-engine-claude<br/>backend, detector, executor,<br/>config_compiler, key_map, scope_router"]
369
+ GEM_GENERIC["rosett-ai-engine-generic<br/>backend"]
370
+ GEM_AGENTS["rosett-ai-engine-agents-md<br/>backend, detector"]
371
+ GEM_OTHERS["rosett-ai-engine-{cursor,copilot,windsurf}<br/>backend, detector"]
372
+ GEM_EXEC["rosett-ai-engine-{goose,aider,ollama,gpt-neox}<br/>backend, detector, executor"]
373
+ GEM_ACME["rosett-ai-engine-acme (example)<br/>backend, detector"]
374
+ end
375
+
376
+ REG -->|Gem.find_files| Gems
377
+ BASE -.->|inherits| Gems
378
+ ```
379
+
380
+ ### Engine Detection Flow
381
+
382
+ ```mermaid
383
+ flowchart TD
384
+ A[bin/raictl engines detect] --> B[Load all manifests]
385
+ B --> C{For each engine}
386
+ C --> D[Check cli_binary in PATH]
387
+ D --> E{Found?}
388
+ E -->|Yes| F[Check config_dir exists]
389
+ E -->|No| G[Mark not detected]
390
+ F --> H{Exists?}
391
+ H -->|Yes| I[Mark detected + available]
392
+ H -->|No| J[Mark partially detected]
393
+ G --> C
394
+ I --> C
395
+ J --> C
396
+ C -->|Done| K[Return detection results]
397
+ ```
398
+
399
+ ### Compilation Pipeline
400
+
401
+ ```mermaid
402
+ sequenceDiagram
403
+ participant User
404
+ participant CLI as Thor::CLI
405
+ participant Pipeline as CompilationPipeline
406
+ participant Loader as YamlLoader
407
+ participant Backend as Engine::Backend
408
+ participant FS as Filesystem
409
+
410
+ User->>CLI: bin/raictl compile --engine agents_md
411
+ CLI->>Pipeline: compile_all(engine: "agents_md")
412
+ Pipeline->>Loader: load_file(conf/behaviour/*.yml)
413
+ Loader-->>Pipeline: behaviour_data[]
414
+
415
+ loop Each behaviour
416
+ Pipeline->>Backend: render(behaviour)
417
+ Backend-->>Pipeline: CompiledOutput
418
+ end
419
+
420
+ Pipeline->>FS: write(output_dir/filename)
421
+ FS-->>Pipeline: success
422
+ Pipeline-->>CLI: results[]
423
+ CLI-->>User: "Compiled 5 files to ./AGENTS.md"
424
+ ```
425
+
426
+ ## Desktop Architecture
427
+
428
+ ### D-Bus Service Stack
429
+
430
+ ```mermaid
431
+ graph TB
432
+ subgraph Apps["Desktop Applications"]
433
+ GTK4_APP["GTK4 App<br/>(RosettAi::Desktop::Gtk4App)"]
434
+ QT6_APP["Qt6 App<br/>(future)"]
435
+ THIRD["Third-party clients"]
436
+ end
437
+
438
+ subgraph IPC["D-Bus Session Bus"]
439
+ BUS["be.neatnerds.rosettai<br/>/be/neatnerds/rosett-ai"]
440
+ end
441
+
442
+ subgraph Service["D-Bus Service"]
443
+ MGR["ManagerInterface<br/>Compile, SwitchContext, GetStatus"]
444
+ FOCUS_IF["FocusMonitorInterface<br/>GetCurrentFocus, FocusChanged signal"]
445
+ end
446
+
447
+ subgraph Adapters["Focus Adapters"]
448
+ GNOME["GnomeAdapter"]
449
+ KWIN["KwinAdapter"]
450
+ I3["I3Adapter"]
451
+ HYPR["HyprlandAdapter"]
452
+ X11["X11Adapter"]
453
+ end
454
+
455
+ subgraph Detect["CompositorDetector"]
456
+ DET["detect() -> :gnome | :kde | :i3 | :hyprland | :x11"]
457
+ end
458
+
459
+ GTK4_APP -->|D-Bus calls| BUS
460
+ QT6_APP -->|D-Bus calls| BUS
461
+ THIRD -->|D-Bus calls| BUS
462
+ BUS --> MGR
463
+ BUS --> FOCUS_IF
464
+ FOCUS_IF --> GNOME
465
+ FOCUS_IF --> KWIN
466
+ FOCUS_IF --> I3
467
+ FOCUS_IF --> HYPR
468
+ FOCUS_IF --> X11
469
+ DET --> FOCUS_IF
470
+ ```
471
+
472
+ ### GTK4 Safety Architecture
473
+
474
+ ```mermaid
475
+ flowchart TB
476
+ subgraph UserAction["User Interaction"]
477
+ CLICK["Button Click"]
478
+ MENU["Menu Selection"]
479
+ PREF["Preference Change"]
480
+ end
481
+
482
+ subgraph Safety["Safety Wrappers"]
483
+ SA["safe_action(name)"]
484
+ SC["safe_callback(name)"]
485
+ end
486
+
487
+ subgraph Logging["GuiLogger"]
488
+ LOG["JSON Lines Output"]
489
+ FILE["Log File"]
490
+ STDERR["stderr"]
491
+ end
492
+
493
+ subgraph Error["Error Handling"]
494
+ RESCUE["rescue StandardError"]
495
+ DIALOG["show_error_dialog()"]
496
+ TOAST["show_toast()"]
497
+ end
498
+
499
+ subgraph Logic["Business Logic"]
500
+ DBUS["DbusClient<br/>(never raises)"]
501
+ DEFAULTS["Safe Defaults<br/>SAFE_STATUS, SAFE_FOCUS"]
502
+ end
503
+
504
+ CLICK --> SA
505
+ MENU --> SA
506
+ PREF --> SC
507
+ SA --> LOG
508
+ SC --> LOG
509
+ LOG --> FILE
510
+ LOG --> STDERR
511
+ SA --> RESCUE
512
+ SC --> RESCUE
513
+ RESCUE -->|success| Logic
514
+ RESCUE -->|error| DIALOG
515
+ DIALOG --> TOAST
516
+ DBUS --> DEFAULTS
517
+ ```
518
+
519
+ ## Configuration Flow
520
+
521
+ ### Configuration Hierarchy
522
+
523
+ ```mermaid
524
+ flowchart LR
525
+ subgraph Sources["Configuration Sources"]
526
+ direction TB
527
+ S1["settings.json<br/>(global)"]
528
+ S2["settings.local.json<br/>(local overrides)"]
529
+ S3["Group CLAUDE.md"]
530
+ S4["Project CLAUDE.md"]
531
+ end
532
+
533
+ subgraph Merge["Deep Merge"]
534
+ M["Later overrides earlier"]
535
+ end
536
+
537
+ subgraph Output["Effective Config"]
538
+ O["Merged settings"]
539
+ end
540
+
541
+ S1 --> M
542
+ S2 --> M
543
+ S3 --> M
544
+ S4 --> M
545
+ M --> O
546
+ ```
547
+
548
+ ### Path Resolution
549
+
550
+ ```mermaid
551
+ flowchart TB
552
+ subgraph PathResolver
553
+ direction TB
554
+ CLAUDE_DOMAIN["Claude Domain<br/>~/.claude/"]
555
+ RAI_DOMAIN["rosett-ai Domain (XDG)<br/>~/.config/rosett-ai/"]
556
+ end
557
+
558
+ subgraph Claude["Claude Paths"]
559
+ CR["~/.claude/rules/"]
560
+ CS["~/.claude/settings.json"]
561
+ CM["./CLAUDE.md"]
562
+ end
563
+
564
+ subgraph NNCC["rosett-ai Paths"]
565
+ NC["~/.config/rosett-ai/config.yml"]
566
+ NB["~/.config/rosett-ai/conf/behaviour/"]
567
+ ND["~/.config/rosett-ai/conf/design/"]
568
+ end
569
+
570
+ subgraph EngineNative["Engine-Native Paths"]
571
+ EN1["~/.claude/rules/ (Claude)"]
572
+ EN2["./AGENTS.md (AGENTS.md)"]
573
+ EN3["./.cursorrules (Cursor)"]
574
+ EN4["./.github/copilot-instructions.md"]
575
+ end
576
+
577
+ CLAUDE_DOMAIN --> Claude
578
+ RAI_DOMAIN --> NNCC
579
+ PathResolver --> EngineNative
580
+ ```
581
+
582
+ ## Dependency Graph
583
+
584
+ ### Runtime Dependencies
585
+
586
+ ```mermaid
587
+ graph LR
588
+ NNCC((rosett-ai))
589
+ NNCC --> ZEIT[zeitwerk ~> 2.6]
590
+ NNCC --> THOR[thor ~> 1.3]
591
+ NNCC --> RAIN[rainbow ~> 3.1]
592
+ NNCC --> JSCH[json_schemer ~> 0.2]
593
+ NNCC --> JWT[jwt ~> 2.8]
594
+ NNCC --> ED25[ed25519 ~> 1.3]
595
+ NNCC --> RDBUS[ruby-dbus ~> 0.24]
596
+ NNCC --> I18N[i18n ~> 1.14]
597
+
598
+ subgraph Optional
599
+ ANTH[anthropic ~> 1.16]
600
+ ADW[adwaita ~> 4.3]
601
+ FPM[fpm ~> 1.17]
602
+ end
603
+
604
+ NNCC -.->|engines group| ANTH
605
+ NNCC -.->|desktop group| ADW
606
+ NNCC -.->|build group| FPM
607
+ ```
608
+
609
+ ### Development Dependencies
610
+
611
+ ```mermaid
612
+ graph LR
613
+ DEV((dev/test))
614
+ DEV --> RSPEC[rspec]
615
+ DEV --> RCOP[rubocop<br/>+ plugins]
616
+ DEV --> REEK[reek]
617
+ DEV --> MUTANT[mutant-rspec]
618
+ DEV --> SIMP[simplecov]
619
+ DEV --> FBOT[factory_bot]
620
+ DEV --> RANTLY[rantly]
621
+ DEV --> AUDIT[bundler-audit<br/>ruby_audit]
622
+ DEV --> FLAY[flay]
623
+ DEV --> YARD[yard]
624
+ DEV --> RONN[ronn-ng]
625
+ DEV --> WEBM[webmock]
626
+ ```
627
+
628
+ ## Git History
629
+
630
+ ### Commit Timeline
631
+
632
+ ```mermaid
633
+ gitgraph
634
+ commit id: "init" tag: "v0.1.0"
635
+ branch critical_thinking
636
+ commit id: "criticalthinking"
637
+ checkout main
638
+ merge critical_thinking
639
+ commit id: "adopt+backup"
640
+ branch packaging_fpm
641
+ commit id: "fpm packaging"
642
+ checkout main
643
+ merge packaging_fpm
644
+ commit id: "tooling"
645
+ commit id: "ci fixes"
646
+ branch design_implementation
647
+ commit id: "design docs P1-P5"
648
+ checkout main
649
+ merge design_implementation
650
+ commit id: "desktop+refs"
651
+ commit id: "ADR-007" tag: "v1.0.0"
652
+ branch engine/0a-rename
653
+ commit id: "rename to rosett-ai"
654
+ checkout main
655
+ branch engine/0b-dirs
656
+ commit id: "engine dirs"
657
+ checkout main
658
+ branch engine/0c-xdg
659
+ commit id: "XDG+detect"
660
+ checkout main
661
+ branch engine/1-agents-md
662
+ commit id: "AGENTS.md engine"
663
+ checkout main
664
+ merge engine/1-agents-md
665
+ commit id: "D-Bus service"
666
+ commit id: "GTK4 app"
667
+ commit id: "Ollama+GPT-NeoX"
668
+ commit id: "merge D2+E2"
669
+ commit id: "GTK4 hardening"
670
+ branch backfill/quorum-module
671
+ commit id: "executor normalize"
672
+ commit id: "capability checker"
673
+ commit id: "quorum module"
674
+ checkout main
675
+ merge backfill/quorum-module
676
+ branch backfill/dbus-desktop
677
+ commit id: "D-Bus stop+SNI+prefs"
678
+ checkout main
679
+ merge backfill/dbus-desktop
680
+ branch documentation
681
+ commit id: "docs update"
682
+ checkout main
683
+ merge documentation
684
+ branch engine/3-goose-aider
685
+ commit id: "Goose+Aider compile"
686
+ checkout main
687
+ merge engine/3-goose-aider
688
+ branch refactor/consistency-review
689
+ commit id: "consistency review"
690
+ checkout main
691
+ merge refactor/consistency-review
692
+ branch engine/4-cursor-copilot-windsurf
693
+ commit id: "Cursor+Copilot+Windsurf"
694
+ commit id: "Goose+Aider executors"
695
+ checkout main
696
+ merge engine/4-cursor-copilot-windsurf
697
+ ```
698
+
699
+ ### Key Milestones
700
+
701
+ ```mermaid
702
+ timeline
703
+ title rosett-ai Project History
704
+ section Foundation
705
+ Feb 2026 : Initial CLI
706
+ : Behaviour management
707
+ : Adopt command
708
+ : Backup system
709
+ section Design
710
+ Feb 18 : FPM packaging
711
+ Feb 19 : Testing infrastructure
712
+ Feb 20 : Security + Styles
713
+ Feb 21 : Architecture P1-P5
714
+ : CI Pipeline
715
+ : Compiler pipeline
716
+ section v1.0.0 Pivot
717
+ Feb 26 : ADR-007 Engine-agnostic
718
+ : Rename to rosett-ai
719
+ : Engine directories
720
+ : XDG + detection
721
+ : AGENTS.md engine
722
+ section Desktop + Engines
723
+ Feb 27-28 : D-Bus service
724
+ : GTK4/Adwaita app
725
+ : Ollama engine
726
+ : GPT-NeoX engine
727
+ : GTK4 hardening
728
+ section Backfill + Engine 3
729
+ Feb 28 : Executor normalization
730
+ : Capability checker
731
+ : Quorum module
732
+ : D-Bus stop command
733
+ : StatusNotifierItem
734
+ : GTK4 preference callbacks
735
+ : Documentation (40 diagrams)
736
+ : Goose + Aider compilation
737
+ : Consistency review
738
+ section Engine 4
739
+ Mar 2 : Cursor engine
740
+ : Copilot engine
741
+ : Windsurf engine
742
+ : Goose CLI executor
743
+ : Aider CLI executor
744
+ : 10 engines total
745
+ section v1.0.0 Release
746
+ Mar 4 : Operations design domain
747
+ : Monitoring + optimization docs
748
+ : SimpleCov thresholds
749
+ : CI pipeline hardening
750
+ : Core-only gemspec split
751
+ : ADR-009 core release
752
+ Mar 5 : Security scan hardening
753
+ : AI provenance documentation
754
+ : Full quality gate verification
755
+ : v1.0.0 tagged
756
+ ```
757
+
758
+ ### Backfill Branches
759
+
760
+ Between Engine Phase 2 and Engine Phase 3, six gaps from earlier phases were
761
+ addressed across two backfill branches:
762
+
763
+ | Branch | Items | Merged |
764
+ |--------|-------|--------|
765
+ | `backfill/quorum-module` | ExecutorResolver, CapabilityChecker, Quorum module | Fast-forward into main |
766
+ | `backfill/dbus-desktop` | D-Bus stop, StatusNotifierItem, GTK4 preferences | Merge commit into main |
767
+
768
+ The intermediate branches `backfill/executor-normalize` and
769
+ `backfill/capability-checker` were subsets rolled into `backfill/quorum-module`.
770
+
771
+ ```mermaid
772
+ flowchart LR
773
+ subgraph BF1["backfill/quorum-module"]
774
+ direction TB
775
+ E1["fix: normalize executor<br/>interface across engines"]
776
+ E2["feat: capability warnings<br/>during compilation"]
777
+ E3["feat: quorum multi-engine<br/>adopt analysis"]
778
+ E1 --> E2 --> E3
779
+ end
780
+
781
+ subgraph BF2["backfill/dbus-desktop"]
782
+ direction TB
783
+ D1["feat: D-Bus stop command"]
784
+ D2["feat: StatusNotifierItem"]
785
+ D3["feat: GTK4 preference callbacks"]
786
+ D1 --- D2 --- D3
787
+ end
788
+
789
+ MAIN1["main<br/>(GTK4 hardening)"] --> BF1
790
+ MAIN1 --> BF2
791
+ BF1 --> MAIN2["main<br/>(merged)"]
792
+ BF2 --> MAIN2
793
+
794
+ style BF1 fill:#e6ffe6,stroke:#333
795
+ style BF2 fill:#e6f3ff,stroke:#333
796
+ ```
797
+
798
+ ## Security Architecture
799
+
800
+ ### Trust Boundaries
801
+
802
+ ```mermaid
803
+ flowchart TB
804
+ subgraph Untrusted["Untrusted Input"]
805
+ YAML_IN["YAML files"]
806
+ USER_IN["CLI arguments"]
807
+ DBUS_IN["D-Bus messages"]
808
+ API_IN["API responses"]
809
+ end
810
+
811
+ subgraph Validation["Validation Layer"]
812
+ YL["YamlLoader<br/>Size + depth + key limits"]
813
+ SV["SchemaValidator<br/>JSON Schema checks"]
814
+ TS["TextSanitizer<br/>Content filtering"]
815
+ RC["RuboCop Cops<br/>ShellInterpolation<br/>UnsafeYamlLoad"]
816
+ end
817
+
818
+ subgraph Trusted["Trusted Core"]
819
+ COMP_T["Compiler"]
820
+ CONFIG_T["Configuration"]
821
+ LICENSE_T["License Validator"]
822
+ end
823
+
824
+ subgraph Output["Output Boundaries"]
825
+ FS_OUT["Filesystem<br/>(whitelisted dirs only)"]
826
+ DBUS_OUT["D-Bus signals"]
827
+ LOG_OUT["Logs<br/>(no secrets)"]
828
+ end
829
+
830
+ YAML_IN --> YL
831
+ USER_IN --> TS
832
+ DBUS_IN --> SV
833
+ API_IN --> TS
834
+ YL --> Trusted
835
+ SV --> Trusted
836
+ TS --> Trusted
837
+ Trusted --> FS_OUT
838
+ Trusted --> DBUS_OUT
839
+ Trusted --> LOG_OUT
840
+ ```
841
+
842
+ ### Security Rules
843
+
844
+ | Rule | Enforcement |
845
+ |------|-------------|
846
+ | YAML.safe_load only | Custom RuboCop cop `RosettAi/UnsafeYamlLoad` |
847
+ | Array-form system() | Custom RuboCop cop `RosettAi/ShellInterpolation` |
848
+ | File writes to whitelisted dirs | PathResolver + Configuration |
849
+ | Secrets never logged | MaskingSecretResolver |
850
+ | Secrets 0600 permissions | LicenseStore |
851
+ | Max YAML size 1MB | YamlLoader |
852
+ | Max YAML nesting 10 | YamlLoader |
853
+ | Max YAML keys 1000 | YamlLoader |
854
+ | Ed25519-signed JWT | LicenseKey |
855
+
856
+ ## Test Architecture
857
+
858
+ ```mermaid
859
+ pie title Test Distribution (119 spec files, 1574 examples)
860
+ "Thor CLI Tasks" : 18
861
+ "Engine Backends" : 17
862
+ "Compiler" : 6
863
+ "D-Bus + Desktop" : 8
864
+ "Validators" : 4
865
+ "Licensing" : 4
866
+ "Content" : 4
867
+ "Config" : 6
868
+ "UI" : 7
869
+ "Quorum" : 4
870
+ "Adopter" : 3
871
+ "Other (i18n, backup, etc.)" : 38
872
+ ```
873
+
874
+ ### Testing Strategy
875
+
876
+ ```mermaid
877
+ flowchart LR
878
+ subgraph Unit["Unit Tests"]
879
+ RSPEC["RSpec<br/>1574 examples"]
880
+ end
881
+
882
+ subgraph Quality["Code Quality"]
883
+ RCOP2["RuboCop"]
884
+ REEK2["Reek"]
885
+ FLAY2["Flay"]
886
+ end
887
+
888
+ subgraph Mutation["Mutation Testing"]
889
+ MUT["Mutant<br/>97.83% coverage"]
890
+ end
891
+
892
+ subgraph Security2["Security"]
893
+ BA["bundler-audit"]
894
+ RA["ruby-audit"]
895
+ GL["gitleaks"]
896
+ end
897
+
898
+ subgraph Property["Property-Based"]
899
+ RANT["Rantly<br/>yaml_loader_property_spec"]
900
+ end
901
+
902
+ Unit --> Quality
903
+ Quality --> Mutation
904
+ Quality --> Security2
905
+ Unit --> Property
906
+ ```
907
+
908
+ ---
909
+
910
+ ### Core-Only Packaging (ADR-009)
911
+
912
+ The v1.0.0 release ships as core-only. Desktop dependencies (`ruby-dbus`,
913
+ `i3ipc`) are moved to the `:desktop` Bundler group and excluded from the
914
+ gemspec. Zeitwerk conditionally ignores `rosett-ai/dbus` and `rosett-ai/desktop` when
915
+ `ruby-dbus` is unavailable. Desktop features are delivered via the separate
916
+ `rosett-ai-gtk4` package.
917
+
918
+ ---
919
+
920
+ *Generated: 2026-03-05 | rosett-ai v1.0.0 | Branch: main*