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/ENGINES.md ADDED
@@ -0,0 +1,567 @@
1
+ # Engines
2
+
3
+ raictl uses a pluggable engine architecture. Each engine translates generic YAML
4
+ rules into a specific AI tool's native format.
5
+
6
+ Engines are distributed as **external gems** (`rosett-ai-engine-<name>`) that
7
+ self-register with rosett-ai core's plugin registry at load time. Core provides
8
+ the base classes and contracts; each gem owns its backend, detector, executor,
9
+ config compiler, manifests, schemas, and specs.
10
+
11
+ ## Plugin Discovery
12
+
13
+ ```mermaid
14
+ graph TB
15
+ subgraph Core["rosett-ai core"]
16
+ REG["RosettAi::Plugins::Registry"]
17
+ DISC["discover! → Gem.find_files('rosett_ai_engine/*/register.rb')"]
18
+ CONTRACT["RosettAi::Plugins::EngineContract"]
19
+ BASE["RosettAi::Engines::BaseConfigCompiler"]
20
+ end
21
+
22
+ subgraph Gems["External Engine Gems"]
23
+ GEM_C["rosett-ai-engine-claude<br/>lib/rosett_ai_engine/claude/register.rb"]
24
+ GEM_O["rosett-ai-engine-*<br/>lib/rosett_ai_engine/*/register.rb"]
25
+ end
26
+
27
+ subgraph Engines["Discovered Engine Gems"]
28
+ CLAUDE["rosett-ai-engine-claude"]
29
+ GENERIC["rosett-ai-engine-generic"]
30
+ AGENTS["rosett-ai-engine-agents-md"]
31
+ CURSOR["rosett-ai-engine-cursor"]
32
+ COPILOT["rosett-ai-engine-copilot"]
33
+ WINDSURF["rosett-ai-engine-windsurf"]
34
+ GOOSE["rosett-ai-engine-goose"]
35
+ AIDER["rosett-ai-engine-aider"]
36
+ OLLAMA["rosett-ai-engine-ollama"]
37
+ NEOX["rosett-ai-engine-gpt-neox"]
38
+ ACME["rosett-ai-engine-acme (example)"]
39
+ end
40
+
41
+ DISC --> GEM_C
42
+ DISC --> GEM_O
43
+ GEM_C -->|register :engine| REG
44
+ GEM_O -->|register :engine| REG
45
+ REG --> Engines
46
+ CONTRACT -.->|implements| GEM_C
47
+ BASE -.->|inherits| GEM_C
48
+ ```
49
+
50
+ ## Plugin Types
51
+
52
+ raictl supports three plugin contract types:
53
+
54
+ | Type | Contract Module | Discovery Pattern | Gem Prefix |
55
+ |------|----------------|-------------------|------------|
56
+ | Engine | `RosettAi::Plugins::EngineContract` | `rosett_ai_engine/*/register.rb` | `rosett-ai-engine-` |
57
+ | GUI | `RosettAi::Plugins::GuiContract` | `rosett_ai_gui/*/register.rb` | `rosett-ai-gui-` |
58
+ | MCP | `RosettAi::Plugins::McpContract` | `rosett_ai_mcp/*/register.rb` | `rosett-ai-mcp-` |
59
+
60
+ ## Engine Registry
61
+
62
+ All engines are external gems discovered dynamically by
63
+ `RosettAi::Plugins::Registry.discover!` via `Gem.find_files`. Core contains
64
+ no built-in engine code — only base classes (`RosettAi::Compiler::Backend`,
65
+ `RosettAi::Engines::Detector`, `RosettAi::Engines::BaseConfigCompiler`) and
66
+ deprecated constant aliases for backward compatibility.
67
+
68
+ ## Engine Comparison
69
+
70
+ | Feature | Claude | Cursor | Copilot | Windsurf | AGENTS.md | Goose | Aider | Generic | Ollama | GPT-NeoX |
71
+ |---------|--------|--------|---------|----------|-----------|-------|-------|---------|--------|----------|
72
+ | Backend | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
73
+ | Detector | Yes | Yes | Yes | Yes | Yes | Yes | Yes | -- | Yes | Yes |
74
+ | Executor | Yes | -- | -- | -- | -- | Yes (CLI) | Yes (CLI) | -- | Yes | Yes |
75
+ | Config Compiler | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
76
+ | Key Map | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
77
+ | Scope Router | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
78
+ | Domain Transformer | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
79
+ | Manifest | Yes | Yes | Yes | Yes | Yes | Yes | Yes | -- | Yes | Yes |
80
+ | Output Format | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown |
81
+ | Rule IDs | Yes | No | No | No | No | No | No | No | No | No |
82
+ | Priority Annotations | Yes | No | No | No | Sorted | No | No | No | No | No |
83
+ | Metadata Comments | HTML | None | None | None | None | None | None | None | None | None |
84
+
85
+ ## Engine Component Diagram
86
+
87
+ ```mermaid
88
+ graph TB
89
+ subgraph Required["Required Components"]
90
+ BACK["backend.rb<br/>Renders YAML → output format"]
91
+ end
92
+
93
+ subgraph Detection["Detection (optional)"]
94
+ DET["detector.rb<br/>Checks if AI tool is installed"]
95
+ MANIF["manifest.yml<br/>Capabilities + detection rules"]
96
+ end
97
+
98
+ subgraph Config["Config (optional, Claude only)"]
99
+ CC["config_compiler.rb"]
100
+ KM["key_map.rb"]
101
+ SR["scope_router.rb"]
102
+ DT["domain_transformer.rb"]
103
+ end
104
+
105
+ subgraph Execution["Execution (optional)"]
106
+ EXEC["executor.rb<br/>API (HTTP/SDK) or CLI subprocess<br/>invocation for quorum"]
107
+ end
108
+
109
+ Required --- Detection
110
+ Required --- Config
111
+ Required --- Execution
112
+ ```
113
+
114
+ ## Claude Engine
115
+
116
+ The Claude engine is the most feature-rich, handling both rule compilation
117
+ and Claude Code settings management.
118
+
119
+ ### Components
120
+
121
+ ```text
122
+ lib/rosett_ai/engines/claude/
123
+ ├── backend.rb # Markdown with HTML comment metadata
124
+ ├── config_compiler.rb # YAML scope → JSON settings
125
+ ├── detector.rb # Detects claude binary + ~/.claude/
126
+ ├── domain_transformer.rb # Transform keys between domains
127
+ ├── executor.rb # Invoke Claude API (anthropic gem)
128
+ ├── key_map.rb # Map YAML keys → JSON settings keys
129
+ └── scope_router.rb # Route settings to correct scope file
130
+ ```
131
+
132
+ ### Compilation Output Format
133
+
134
+ ```markdown
135
+ <!-- rosett-ai-claude-managed -->
136
+ <!-- Source: conf/behaviour/security.yml -->
137
+ <!-- Category: behaviour | Version: 1.1.0 -->
138
+
139
+ # security
140
+
141
+ Security rules for Claude Code
142
+
143
+ ## Rules
144
+
145
+ ### rule_001 (priority: 90)
146
+
147
+ Always use YAML.safe_load — never YAML.load
148
+
149
+ ### rule_002 (priority: 85)
150
+
151
+ Use array-form system() — never string interpolation
152
+ ```
153
+
154
+ ### Config Compilation Flow
155
+
156
+ ```mermaid
157
+ sequenceDiagram
158
+ participant CLI
159
+ participant Compiler as ConfigCompiler
160
+ participant ScopeRouter
161
+ participant KeyMap
162
+ participant FS as Filesystem
163
+
164
+ CLI->>Compiler: compile(scope: "managed")
165
+ Compiler->>ScopeRouter: route(scope)
166
+ ScopeRouter-->>Compiler: conf/engines/claude/config/managed.yml
167
+ Compiler->>Compiler: load YAML
168
+ Compiler->>KeyMap: transform(yaml_keys)
169
+ KeyMap-->>Compiler: json_keys
170
+ Compiler->>FS: write settings.json
171
+ FS-->>Compiler: success
172
+ Compiler-->>CLI: CompileResult
173
+ ```
174
+
175
+ ### Detection Logic
176
+
177
+ ```mermaid
178
+ flowchart TD
179
+ A[Detect Claude] --> B{claude binary in PATH?}
180
+ B -->|Yes| C{~/.claude/ exists?}
181
+ B -->|No| D[Not detected]
182
+ C -->|Yes| E{~/.claude/settings.json exists?}
183
+ C -->|No| F[Partially detected]
184
+ E -->|Yes| G[Fully detected + available]
185
+ E -->|No| F
186
+ ```
187
+
188
+ ## AGENTS.md Engine
189
+
190
+ Compiles rules into the [AGENTS.md](https://github.com/anthropics/agents-md)
191
+ format — bullet-list rules under an `## Instructions` heading. No rule IDs,
192
+ no metadata, priority-sorted.
193
+
194
+ ### Components
195
+
196
+ ```text
197
+ lib/rosett_ai/engines/agents_md/
198
+ ├── backend.rb # Bullet-list renderer
199
+ └── detector.rb # Always available (no external tool needed)
200
+ ```
201
+
202
+ ### Output Format
203
+
204
+ ```markdown
205
+ ## Instructions
206
+
207
+ - Always use YAML.safe_load — never YAML.load
208
+ - Use array-form system() — never string interpolation
209
+ - All external input must be validated before use
210
+ ```
211
+
212
+ ### Design Decisions
213
+
214
+ ```mermaid
215
+ flowchart LR
216
+ A[Rules YAML] --> B{Has priority?}
217
+ B -->|Yes| C[Sort descending]
218
+ B -->|No| D[Default priority 50]
219
+ C --> E[Render as bullet list]
220
+ D --> E
221
+ E --> F[Prepend '## Instructions']
222
+ F --> G[Write AGENTS.md]
223
+ ```
224
+
225
+ ## Generic Engine
226
+
227
+ Minimal engine producing plain markdown without tool-specific formatting.
228
+ Useful for engines not yet supported or for human-readable documentation.
229
+
230
+ ### Components
231
+
232
+ ```text
233
+ lib/rosett_ai/engines/generic/
234
+ └── backend.rb # Plain markdown renderer
235
+ ```
236
+
237
+ ## Ollama Engine
238
+
239
+ Compiles rules into prompts suitable for Ollama's local LLM serving.
240
+
241
+ ### Components
242
+
243
+ ```text
244
+ lib/rosett_ai/engines/ollama/
245
+ ├── backend.rb # Ollama-compatible text renderer
246
+ ├── detector.rb # Detects ollama binary + localhost:11434
247
+ └── executor.rb # Invokes Ollama API for quorum
248
+ ```
249
+
250
+ ### Detection Logic
251
+
252
+ ```mermaid
253
+ flowchart TD
254
+ A[Detect Ollama] --> B{ollama binary in PATH?}
255
+ B -->|Yes| C{localhost:11434 responding?}
256
+ B -->|No| D[Not detected]
257
+ C -->|Yes| E[Fully detected + available]
258
+ C -->|No| F[Binary found, server not running]
259
+ ```
260
+
261
+ ## GPT-NeoX Engine
262
+
263
+ Compiles rules into prompts for GPT-NeoX models served via vLLM.
264
+ Separate from Ollama for deployment independence.
265
+
266
+ ### Components
267
+
268
+ ```text
269
+ lib/rosett_ai/engines/gpt_neox/
270
+ ├── backend.rb # vLLM-compatible text renderer
271
+ ├── detector.rb # Detects vLLM endpoint via env/config
272
+ └── executor.rb # Invokes vLLM API for quorum
273
+ ```
274
+
275
+ ### Detection Logic
276
+
277
+ ```mermaid
278
+ flowchart TD
279
+ A[Detect GPT-NeoX] --> B{VLLM_ENDPOINT env var set?}
280
+ B -->|Yes| C{Endpoint responding?}
281
+ B -->|No| D{Config has vllm_endpoint?}
282
+ C -->|Yes| E[Fully detected]
283
+ C -->|No| F[Configured but unreachable]
284
+ D -->|Yes| C
285
+ D -->|No| G[Not detected]
286
+ ```
287
+
288
+ ## Goose Engine
289
+
290
+ Compiles rules into markdown for [Goose](https://block.github.io/goose/) by Block.
291
+ Uses the generic backend with a Goose-specific managed marker. Supports
292
+ quorum participation via CLI subprocess executor.
293
+
294
+ ### Components
295
+
296
+ ```text
297
+ lib/rosett_ai/engines/goose/
298
+ ├── backend.rb # Goose-compatible markdown renderer
299
+ ├── detector.rb # Detects goose binary + ~/.config/goose/
300
+ └── executor.rb # CLI subprocess executor (Open3.capture3)
301
+ ```
302
+
303
+ ### Output Marker
304
+
305
+ ```markdown
306
+ <!-- rosett-ai-goose-managed -->
307
+ ```
308
+
309
+ ### Detection Logic
310
+
311
+ ```mermaid
312
+ flowchart TD
313
+ A[Detect Goose] --> B{goose binary in PATH?}
314
+ B -->|Yes| C{~/.config/goose/ exists?}
315
+ B -->|No| D[Not detected]
316
+ C -->|Yes| E[Fully detected + available]
317
+ C -->|No| F[Binary found, no config]
318
+ ```
319
+
320
+ ### Executor
321
+
322
+ CLI subprocess executor using `Open3.capture3` with `GOOSE_MODE=auto`.
323
+ Prompts passed via tempfile. Returns structured JSON for quorum aggregation.
324
+
325
+ ## Aider Engine
326
+
327
+ Compiles rules into markdown for [Aider](https://aider.chat/), the AI pair
328
+ programming tool. Uses the generic backend with an Aider-specific managed marker.
329
+ Supports quorum participation via CLI subprocess executor.
330
+
331
+ ### Components
332
+
333
+ ```text
334
+ lib/rosett_ai/engines/aider/
335
+ ├── backend.rb # Aider-compatible markdown renderer
336
+ ├── detector.rb # Detects aider binary
337
+ └── executor.rb # CLI subprocess executor (Open3.capture3)
338
+ ```
339
+
340
+ ### Output Marker
341
+
342
+ ```markdown
343
+ <!-- rosett-ai-aider-managed -->
344
+ ```
345
+
346
+ ### Executor
347
+
348
+ CLI subprocess executor using `Open3.capture3` with
349
+ `--message-file <tempfile> --no-auto-commits --no-git --yes`.
350
+ Returns structured JSON for quorum aggregation.
351
+
352
+ ## Cursor Engine
353
+
354
+ Compiles rules into a `.cursorrules` file for [Cursor](https://cursor.com/) by
355
+ Anysphere. Compilation-only engine (no executor).
356
+
357
+ ### Components
358
+
359
+ ```text
360
+ lib/rosett_ai/engines/cursor/
361
+ ├── backend.rb # Cursor-compatible markdown renderer
362
+ └── detector.rb # Detects cursor binary + ~/.cursor/
363
+ ```
364
+
365
+ ### Output Marker
366
+
367
+ ```markdown
368
+ <!-- rosett-ai-cursor-managed -->
369
+ ```
370
+
371
+ ### Detection Logic
372
+
373
+ ```mermaid
374
+ flowchart TD
375
+ A[Detect Cursor] --> B{cursor binary in PATH?}
376
+ B -->|Yes| C{~/.cursor/ exists?}
377
+ B -->|No| D[Not detected]
378
+ C -->|Yes| E[Fully detected + available]
379
+ C -->|No| F[Binary found, no config]
380
+ ```
381
+
382
+ ## Copilot Engine
383
+
384
+ Compiles rules into `.github/copilot-instructions.md` for
385
+ [GitHub Copilot](https://github.com/features/copilot).
386
+ Compilation-only engine (no executor).
387
+
388
+ ### Components
389
+
390
+ ```text
391
+ lib/rosett_ai/engines/copilot/
392
+ ├── backend.rb # Copilot-compatible markdown renderer
393
+ └── detector.rb # Detects .github/ config directory
394
+ ```
395
+
396
+ ### Output Marker
397
+
398
+ ```markdown
399
+ <!-- rosett-ai-copilot-managed -->
400
+ ```
401
+
402
+ ### Detection Logic
403
+
404
+ ```mermaid
405
+ flowchart TD
406
+ A[Detect Copilot] --> B{.github/ directory exists?}
407
+ B -->|Yes| C[Detected — advisory only]
408
+ B -->|No| D[Not detected]
409
+ ```
410
+
411
+ ## Windsurf Engine
412
+
413
+ Compiles rules into a `.windsurfrules` file for
414
+ [Windsurf](https://codeium.com/windsurf) by Codeium.
415
+ Compilation-only engine (no executor).
416
+
417
+ ### Components
418
+
419
+ ```text
420
+ lib/rosett_ai/engines/windsurf/
421
+ ├── backend.rb # Windsurf-compatible markdown renderer
422
+ └── detector.rb # Detects windsurf binary
423
+ ```
424
+
425
+ ### Output Marker
426
+
427
+ ```markdown
428
+ <!-- rosett-ai-windsurf-managed -->
429
+ ```
430
+
431
+ ### Detection Logic
432
+
433
+ ```mermaid
434
+ flowchart TD
435
+ A[Detect Windsurf] --> B{windsurf binary in PATH?}
436
+ B -->|Yes| C[Detected + available]
437
+ B -->|No| D[Not detected]
438
+ ```
439
+
440
+ ## Capability Manifests
441
+
442
+ Each engine declares capabilities via `conf/engines/<name>/manifest.yml`:
443
+
444
+ ```yaml
445
+ name: agents_md
446
+ display_name: "AGENTS.md"
447
+ version: "1.0.0"
448
+
449
+ detection:
450
+ always_available: true
451
+
452
+ capabilities:
453
+ compile_rules: true
454
+ compile_config: false
455
+ sensitive_filtering: false
456
+ rule_ids: false
457
+ priority_annotations: false
458
+ metadata_comments: false
459
+
460
+ execution:
461
+ api_gem: null
462
+ cli_binary: null
463
+ structured_output: false
464
+ ```
465
+
466
+ ### Capability Gap Warnings
467
+
468
+ ```mermaid
469
+ flowchart TD
470
+ A[Compile request] --> B{Load manifest}
471
+ B --> C{Behaviour has sensitive: true?}
472
+ C -->|Yes| D{Engine supports sensitive_filtering?}
473
+ C -->|No| E[Proceed normally]
474
+ D -->|Yes| F[Apply redaction + compile]
475
+ D -->|No| G{--strict mode?}
476
+ G -->|Yes| H[ERROR: capability gap]
477
+ G -->|No| I["WARN: included without redaction"]
478
+ I --> J[Compile anyway]
479
+ ```
480
+
481
+ ## Executor Resolution
482
+
483
+ All engines with an executor implement a uniform `analyze(prompt)` method that
484
+ returns structured JSON with `findings`, `overall_status`, and `summary` keys.
485
+ The `ExecutorResolver` selects the correct constructor kwargs based on the
486
+ engine manifest's `execution` section:
487
+
488
+ ```mermaid
489
+ flowchart TD
490
+ A[RuleAdopter.resolve_executor] --> B[ExecutorResolver.new]
491
+ B --> C{Read manifest execution}
492
+ C -->|api_gem set| D["Pass api_key:, base_url:<br/>(SDK-based: Claude)"]
493
+ C -->|api_type: http| E["Pass endpoint:, model:<br/>(HTTP API: Ollama, GPT-NeoX)"]
494
+ C -->|api_type: cli| F2["Pass binary:<br/>(CLI subprocess: Goose, Aider)"]
495
+ D --> F[Executor.new with kwargs]
496
+ E --> F
497
+ F2 --> F
498
+ F --> G[executor.analyze prompt]
499
+ G --> H["JSON {findings, overall_status, summary}"]
500
+ ```
501
+
502
+ ## Quorum Module
503
+
504
+ The quorum module dispatches adopt analysis to multiple engines in parallel
505
+ and aggregates their findings. Requires `--api --quorum` flags.
506
+
507
+ ```mermaid
508
+ flowchart LR
509
+ subgraph Dispatch["Dispatcher"]
510
+ D1["Thread per engine"]
511
+ end
512
+
513
+ subgraph Collect["Collector"]
514
+ C1["Normalize responses"]
515
+ end
516
+
517
+ subgraph Compare["Comparator"]
518
+ CP1["Cross-engine: promoted"]
519
+ CP2["Single-engine: annotated"]
520
+ end
521
+
522
+ PROMPT["Adopt prompt"] --> Dispatch
523
+ Dispatch --> |Claude| Collect
524
+ Dispatch --> |Goose| Collect
525
+ Dispatch --> |Aider| Collect
526
+ Dispatch --> |Ollama| Collect
527
+ Dispatch --> |GPT-NeoX| Collect
528
+ Collect --> Compare
529
+ Compare --> RESULT["Aggregated findings"]
530
+ ```
531
+
532
+ ### Components
533
+
534
+ ```text
535
+ lib/rosett_ai/quorum/
536
+ ├── collector.rb # Normalize per-engine responses
537
+ ├── comparator.rb # Aggregate cross-engine findings
538
+ ├── dispatcher.rb # Thread-based parallel dispatch
539
+ └── strategies/
540
+ └── adopt.rb # Adopt-specific orchestration
541
+ ```
542
+
543
+ ### Usage
544
+
545
+ ```bash
546
+ # Single engine (default)
547
+ bin/raictl adopt --api
548
+
549
+ # Multi-engine quorum analysis
550
+ bin/raictl adopt --api --quorum
551
+ ```
552
+
553
+ ## Adding a New Engine
554
+
555
+ 1. Create directory: `lib/rosett_ai/engines/<name>/`
556
+ 2. Implement `backend.rb` (required)
557
+ 3. Optionally add `detector.rb`, `executor.rb`, `manifest.yml`
558
+ 4. Register in `lib/rosett_ai/engines/registry.rb`
559
+ 5. Add target profile in `conf/targets/<name>.yml` (if different output dir)
560
+ 6. Add specs in `spec/rosett_ai/engines/<name>/`
561
+ 7. Use shared examples: `it_behaves_like 'a compiler backend'`
562
+
563
+ See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide.
564
+
565
+ ---
566
+
567
+ *Generated: 2026-03-02 | rosett-ai v1.0.0*