rosett-ai 1.3.3 → 1.5.9

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 (453) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +398 -22
  3. data/README.md +56 -42
  4. data/bin/raictl +13 -0
  5. data/conf/adopt_redactions.yml +2 -0
  6. data/conf/compliance/cra_rules.yml +2 -0
  7. data/conf/compliance/license_rules.yml +2 -0
  8. data/conf/mcp/server_defaults.yml +2 -0
  9. data/conf/mcp/trust.yml +1 -0
  10. data/conf/packaging/core.yml +2 -0
  11. data/conf/packaging/gtk4.yml +2 -0
  12. data/conf/packaging/qt6.yml +2 -0
  13. data/conf/policy/default_deny_list.yml +2 -0
  14. data/conf/review/cli-command-audit.yml +2 -0
  15. data/conf/review/design-docs.yml +2 -0
  16. data/conf/review/design-questionnaire.yml +2 -0
  17. data/conf/review/questionnaire.yml +2 -0
  18. data/conf/review/rosett-ai-core.yml +2 -0
  19. data/conf/schemas/ai_config_schema.json +14 -2
  20. data/conf/schemas/autoqueue.schema.json +153 -0
  21. data/conf/schemas/behaviour_schema.json +31 -7
  22. data/conf/schemas/compliance_rule_schema.json +17 -4
  23. data/conf/schemas/content_pack_manifest_schema.json +23 -4
  24. data/conf/schemas/design_schema.json +177 -42
  25. data/conf/schemas/engine_manifest_schema.json +22 -5
  26. data/conf/schemas/lockfile_schema.json +26 -4
  27. data/conf/schemas/mcp_server_schema.json +50 -9
  28. data/conf/schemas/packaging_schema.json +23 -5
  29. data/conf/schemas/policy_schema.json +35 -9
  30. data/conf/schemas/provenance_schema.json +33 -5
  31. data/conf/schemas/rai_config_schema.json +6 -2
  32. data/conf/schemas/rai_project_schema.json +8 -2
  33. data/conf/schemas/scope_hierarchy_schema.json +22 -5
  34. data/conf/schemas/target_schema.json +33 -6
  35. data/conf/schemas/tooling_schema.json +53 -12
  36. data/conf/schemas/workflow_schema.json +39 -9
  37. data/conf/targets/agents_md.yml +1 -0
  38. data/conf/targets/claude.yml +2 -0
  39. data/conf/tooling/tools.yml +2 -0
  40. data/lib/rosett_ai/adopter/local_analysis_collector.rb +5 -0
  41. data/lib/rosett_ai/adopter/rule_adopter.rb +40 -0
  42. data/lib/rosett_ai/ai_config/context_window.rb +3 -0
  43. data/lib/rosett_ai/ai_config/cost_controls.rb +1 -0
  44. data/lib/rosett_ai/ai_config/fallback_chain.rb +1 -0
  45. data/lib/rosett_ai/ai_config/model_router.rb +1 -0
  46. data/lib/rosett_ai/ai_config/validator.rb +2 -0
  47. data/lib/rosett_ai/authorship/attribution_compiler.rb +1 -0
  48. data/lib/rosett_ai/authorship/disclosure_policy.rb +2 -0
  49. data/lib/rosett_ai/authorship/review_validator.rb +1 -0
  50. data/lib/rosett_ai/authorship/trailer_generator.rb +1 -0
  51. data/lib/rosett_ai/backup/compressor.rb +3 -0
  52. data/lib/rosett_ai/backup/destination.rb +1 -0
  53. data/lib/rosett_ai/behaviour/manager.rb +1 -0
  54. data/lib/rosett_ai/compiler/backend.rb +3 -0
  55. data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +1 -0
  56. data/lib/rosett_ai/compiler/backends/claude_backend.rb +1 -0
  57. data/lib/rosett_ai/compiler/behaviour_compiler.rb +1 -0
  58. data/lib/rosett_ai/compiler/compilation_pipeline.rb +1 -7
  59. data/lib/rosett_ai/compiler/locale_compiler.rb +2 -0
  60. data/lib/rosett_ai/compiler/target_profile.rb +11 -0
  61. data/lib/rosett_ai/completion/generator.rb +2 -0
  62. data/lib/rosett_ai/completion/shells/zsh_generator.rb +1 -0
  63. data/lib/rosett_ai/comply/checkers/cra_checker.rb +1 -0
  64. data/lib/rosett_ai/comply/checkers/license_checker.rb +2 -0
  65. data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +4 -0
  66. data/lib/rosett_ai/comply/runner.rb +2 -0
  67. data/lib/rosett_ai/composition/composer.rb +1 -0
  68. data/lib/rosett_ai/composition/lockfile.rb +1 -0
  69. data/lib/rosett_ai/composition/merge_strategy.rb +1 -0
  70. data/lib/rosett_ai/config/masking_secret_resolver.rb +9 -0
  71. data/lib/rosett_ai/config/secret_resolver.rb +4 -0
  72. data/lib/rosett_ai/configuration.rb +4 -0
  73. data/lib/rosett_ai/content/content_client.rb +15 -0
  74. data/lib/rosett_ai/content/pack_installer.rb +1 -0
  75. data/lib/rosett_ai/content/pack_manifest.rb +21 -0
  76. data/lib/rosett_ai/content_packs/manager.rb +1 -0
  77. data/lib/rosett_ai/dbus/compositor_detector.rb +2 -0
  78. data/lib/rosett_ai/dbus/focus_adapters/base.rb +1 -0
  79. data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +5 -0
  80. data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +4 -0
  81. data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +4 -0
  82. data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +4 -0
  83. data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +4 -0
  84. data/lib/rosett_ai/dbus/focus_monitor_interface.rb +1 -0
  85. data/lib/rosett_ai/dbus/manager_interface.rb +1 -0
  86. data/lib/rosett_ai/dbus/plugin_manager_interface.rb +2 -0
  87. data/lib/rosett_ai/dbus/rate_limiter.rb +1 -0
  88. data/lib/rosett_ai/dbus/service.rb +3 -0
  89. data/lib/rosett_ai/dbus/status_notifier_interface.rb +14 -0
  90. data/lib/rosett_ai/desktop/dbus_client.rb +6 -0
  91. data/lib/rosett_ai/desktop/gtk4_app.rb +3 -0
  92. data/lib/rosett_ai/desktop/gtk4_preferences.rb +1 -0
  93. data/lib/rosett_ai/desktop/gui_logger.rb +2 -0
  94. data/lib/rosett_ai/doctor/check.rb +1 -1
  95. data/lib/rosett_ai/doctor/checks/cache_health_check.rb +1 -0
  96. data/lib/rosett_ai/doctor.rb +1 -0
  97. data/lib/rosett_ai/documentation/reference_compiler.rb +9 -0
  98. data/lib/rosett_ai/documentation/translator.rb +8 -0
  99. data/lib/rosett_ai/engines/base_config_compiler.rb +71 -1
  100. data/lib/rosett_ai/engines/detector.rb +5 -0
  101. data/lib/rosett_ai/engines/registry.rb +7 -0
  102. data/lib/rosett_ai/exit_codes.rb +6 -0
  103. data/lib/rosett_ai/formatting.rb +1 -0
  104. data/lib/rosett_ai/gem_consistency_checker.rb +6 -0
  105. data/lib/rosett_ai/git_hooks/chain_detector.rb +1 -0
  106. data/lib/rosett_ai/git_hooks/installer.rb +4 -0
  107. data/lib/rosett_ai/git_hooks/script_generator.rb +2 -0
  108. data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +6 -0
  109. data/lib/rosett_ai/i18n/utf8_checker.rb +1 -0
  110. data/lib/rosett_ai/init/config_file_writer.rb +4 -0
  111. data/lib/rosett_ai/init/directory_builder.rb +15 -0
  112. data/lib/rosett_ai/init/file_copier.rb +51 -0
  113. data/lib/rosett_ai/init/mcp_registrar.rb +1 -0
  114. data/lib/rosett_ai/init/project_initializer.rb +1 -0
  115. data/lib/rosett_ai/licensing/license_key.rb +4 -0
  116. data/lib/rosett_ai/licensing/license_store.rb +11 -0
  117. data/lib/rosett_ai/licensing/tier.rb +9 -0
  118. data/lib/rosett_ai/mcp/admin/auditor.rb +1 -0
  119. data/lib/rosett_ai/mcp/admin/health_checker.rb +1 -0
  120. data/lib/rosett_ai/mcp/admin/registry.rb +1 -0
  121. data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +27 -4
  122. data/lib/rosett_ai/mcp/enforcement/validator.rb +24 -3
  123. data/lib/rosett_ai/mcp/governance.rb +9 -0
  124. data/lib/rosett_ai/mcp/http_security_config.rb +22 -0
  125. data/lib/rosett_ai/mcp/key_hasher.rb +4 -2
  126. data/lib/rosett_ai/mcp/keyfile.rb +4 -0
  127. data/lib/rosett_ai/mcp/middleware/cors.rb +4 -0
  128. data/lib/rosett_ai/mcp/middleware/origin_validation.rb +1 -0
  129. data/lib/rosett_ai/mcp/middleware/rate_limit.rb +3 -0
  130. data/lib/rosett_ai/mcp/plugins.rb +1 -0
  131. data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +2 -0
  132. data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +3 -0
  133. data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +2 -0
  134. data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +2 -0
  135. data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +2 -0
  136. data/lib/rosett_ai/mcp/resources/config_resource.rb +2 -0
  137. data/lib/rosett_ai/mcp/resources/design_resource.rb +1 -0
  138. data/lib/rosett_ai/mcp/resources/hooks_resource.rb +3 -0
  139. data/lib/rosett_ai/mcp/resources/provenance_resource.rb +2 -0
  140. data/lib/rosett_ai/mcp/resources/rules_resource.rb +1 -0
  141. data/lib/rosett_ai/mcp/resources/schema_resource.rb +1 -0
  142. data/lib/rosett_ai/mcp/server.rb +7 -1
  143. data/lib/rosett_ai/mcp/settings/trust_manager.rb +3 -0
  144. data/lib/rosett_ai/mcp/tools/adopt_tool.rb +4 -0
  145. data/lib/rosett_ai/mcp/tools/backup_tool.rb +4 -0
  146. data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +4 -0
  147. data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +3 -0
  148. data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +5 -0
  149. data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +4 -0
  150. data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +4 -0
  151. data/lib/rosett_ai/mcp/tools/compile_tool.rb +4 -0
  152. data/lib/rosett_ai/mcp/tools/comply_tool.rb +4 -0
  153. data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +4 -0
  154. data/lib/rosett_ai/mcp/tools/config_status_tool.rb +3 -0
  155. data/lib/rosett_ai/mcp/tools/content_tool.rb +5 -0
  156. data/lib/rosett_ai/mcp/tools/context_query_tool.rb +4 -0
  157. data/lib/rosett_ai/mcp/tools/design_list_tool.rb +3 -0
  158. data/lib/rosett_ai/mcp/tools/design_show_tool.rb +4 -0
  159. data/lib/rosett_ai/mcp/tools/doctor_tool.rb +4 -0
  160. data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +3 -0
  161. data/lib/rosett_ai/mcp/tools/engines_tool.rb +5 -0
  162. data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +7 -0
  163. data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +33 -8
  164. data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +5 -0
  165. data/lib/rosett_ai/mcp/tools/init_tool.rb +5 -0
  166. data/lib/rosett_ai/mcp/tools/license_status_tool.rb +3 -0
  167. data/lib/rosett_ai/mcp/tools/project_tool.rb +5 -0
  168. data/lib/rosett_ai/mcp/tools/provenance_tool.rb +5 -0
  169. data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +3 -0
  170. data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +5 -0
  171. data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +4 -0
  172. data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +5 -0
  173. data/lib/rosett_ai/mcp/tools/tooling_tool.rb +5 -0
  174. data/lib/rosett_ai/mcp/tools/validate_tool.rb +4 -0
  175. data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +4 -0
  176. data/lib/rosett_ai/mcp/tools/workflow_tool.rb +5 -0
  177. data/lib/rosett_ai/migration/detector.rb +1 -0
  178. data/lib/rosett_ai/migration/nncc_config_migrator.rb +2 -0
  179. data/lib/rosett_ai/migration/xdg_migrator.rb +3 -1
  180. data/lib/rosett_ai/package_manager/apt.rb +5 -0
  181. data/lib/rosett_ai/package_manager/base.rb +1 -0
  182. data/lib/rosett_ai/package_manager/gem_backend.rb +1 -0
  183. data/lib/rosett_ai/packaging/variant_config.rb +12 -0
  184. data/lib/rosett_ai/plugins/contract.rb +1 -0
  185. data/lib/rosett_ai/plugins/engine_contract.rb +2 -0
  186. data/lib/rosett_ai/plugins/gui_contract.rb +2 -0
  187. data/lib/rosett_ai/plugins/mcp_contract.rb +2 -0
  188. data/lib/rosett_ai/plugins/registry.rb +10 -0
  189. data/lib/rosett_ai/policy/auditor.rb +1 -0
  190. data/lib/rosett_ai/policy/opt_out_scanner.rb +1 -0
  191. data/lib/rosett_ai/policy/tier_hierarchy.rb +2 -0
  192. data/lib/rosett_ai/policy/validator.rb +1 -0
  193. data/lib/rosett_ai/profiler.rb +7 -0
  194. data/lib/rosett_ai/project/drift_detector.rb +1 -0
  195. data/lib/rosett_ai/project/manager.rb +1 -0
  196. data/lib/rosett_ai/project/template_applier.rb +1 -0
  197. data/lib/rosett_ai/provenance/entry.rb +2 -0
  198. data/lib/rosett_ai/provenance/source.rb +1 -0
  199. data/lib/rosett_ai/provenance/store.rb +3 -0
  200. data/lib/rosett_ai/provenance/validator.rb +1 -0
  201. data/lib/rosett_ai/quorum/collector.rb +1 -0
  202. data/lib/rosett_ai/quorum/comparator.rb +2 -0
  203. data/lib/rosett_ai/quorum/strategies/adopt.rb +1 -0
  204. data/lib/rosett_ai/rai_config.rb +9 -0
  205. data/lib/rosett_ai/retrofit/engine.rb +2 -0
  206. data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +8 -0
  207. data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +10 -0
  208. data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +9 -0
  209. data/lib/rosett_ai/retrofit/secret_detector.rb +3 -0
  210. data/lib/rosett_ai/secrets_resolver.rb +1 -0
  211. data/lib/rosett_ai/session_hooks/installer.rb +130 -0
  212. data/lib/rosett_ai/smart_feedback/suggester.rb +4 -0
  213. data/lib/rosett_ai/smart_feedback/thor_middleware.rb +7 -0
  214. data/lib/rosett_ai/structured_logger.rb +1 -0
  215. data/lib/rosett_ai/telemetry/log_rotator.rb +1 -0
  216. data/lib/rosett_ai/telemetry.rb +1 -0
  217. data/lib/rosett_ai/thor/cli.rb +9 -0
  218. data/lib/rosett_ai/thor/tasks/adopt.rb +2 -0
  219. data/lib/rosett_ai/thor/tasks/backfill_user_yml.rb +207 -0
  220. data/lib/rosett_ai/thor/tasks/backup.rb +6 -0
  221. data/lib/rosett_ai/thor/tasks/behaviour.rb +12 -0
  222. data/lib/rosett_ai/thor/tasks/build.rb +87 -4
  223. data/lib/rosett_ai/thor/tasks/compile.rb +76 -32
  224. data/lib/rosett_ai/thor/tasks/completion.rb +9 -0
  225. data/lib/rosett_ai/thor/tasks/comply.rb +2 -0
  226. data/lib/rosett_ai/thor/tasks/config.rb +21 -5
  227. data/lib/rosett_ai/thor/tasks/content.rb +8 -0
  228. data/lib/rosett_ai/thor/tasks/dbus.rb +13 -0
  229. data/lib/rosett_ai/thor/tasks/design.rb +2 -0
  230. data/lib/rosett_ai/thor/tasks/desktop.rb +4 -0
  231. data/lib/rosett_ai/thor/tasks/doctor.rb +2 -0
  232. data/lib/rosett_ai/thor/tasks/documentation.rb +7 -0
  233. data/lib/rosett_ai/thor/tasks/engines.rb +8 -0
  234. data/lib/rosett_ai/thor/tasks/hooks.rb +8 -0
  235. data/lib/rosett_ai/thor/tasks/init.rb +1 -0
  236. data/lib/rosett_ai/thor/tasks/license.rb +8 -0
  237. data/lib/rosett_ai/thor/tasks/mcp.rb +40 -0
  238. data/lib/rosett_ai/thor/tasks/migrate.rb +2 -0
  239. data/lib/rosett_ai/thor/tasks/plugins.rb +15 -0
  240. data/lib/rosett_ai/thor/tasks/project.rb +8 -0
  241. data/lib/rosett_ai/thor/tasks/provenance.rb +8 -0
  242. data/lib/rosett_ai/thor/tasks/release.rb +8 -0
  243. data/lib/rosett_ai/thor/tasks/retrofit.rb +4 -0
  244. data/lib/rosett_ai/thor/tasks/validate.rb +1 -0
  245. data/lib/rosett_ai/thor/tasks/workflow.rb +14 -0
  246. data/lib/rosett_ai/tooling/version_checker.rb +1 -0
  247. data/lib/rosett_ai/ui/accessible_tui.rb +18 -0
  248. data/lib/rosett_ai/ui/base.rb +3 -0
  249. data/lib/rosett_ai/ui/gtk4.rb +19 -0
  250. data/lib/rosett_ai/ui/kde.rb +1 -0
  251. data/lib/rosett_ai/ui/qt6.rb +1 -0
  252. data/lib/rosett_ai/ui/registry.rb +15 -0
  253. data/lib/rosett_ai/ui/tui.rb +22 -0
  254. data/lib/rosett_ai/validators/behaviour_validator.rb +1 -0
  255. data/lib/rosett_ai/validators/design_validator.rb +2 -0
  256. data/lib/rosett_ai/validators/schema_validator.rb +4 -0
  257. data/lib/rosett_ai/validators/tooling_validator.rb +1 -0
  258. data/lib/rosett_ai/version.rb +2 -1
  259. data/lib/rosett_ai/version_consistency_checker.rb +6 -0
  260. data/lib/rosett_ai/workflow/engine.rb +1 -0
  261. data/lib/rosett_ai/workflow/manager.rb +1 -0
  262. data/lib/rosett_ai/workflow/schema_validator.rb +2 -0
  263. data/lib/rosett_ai/workflow/step_runner.rb +1 -0
  264. data/lib/rosett_ai/workflow/steps/rai_step.rb +1 -0
  265. data/lib/rosett_ai/yaml_loader.rb +2 -0
  266. data/lib/rosett_ai.rb +2 -0
  267. data/lib/scripts/generated/docker_hub_tags.rb +2 -0
  268. data/locales/ar.yml +2 -0
  269. data/locales/en.yml +5 -0
  270. data/locales/fr.yml +2 -0
  271. metadata +9 -189
  272. data/.ai-provenance.yml +0 -119
  273. data/.debride_whitelist +0 -186
  274. data/.fasterer.yml +0 -29
  275. data/.mdl_style.rb +0 -10
  276. data/.mdlrc +0 -3
  277. data/.mutant.yml +0 -49
  278. data/.namespace-allowlist +0 -42
  279. data/.reek.yml +0 -1040
  280. data/.rosett-ai/config.yml +0 -3
  281. data/.rspec +0 -5
  282. data/.rubocop.yml +0 -380
  283. data/.ruby-version +0 -1
  284. data/.yamllint +0 -51
  285. data/.yardopts +0 -12
  286. data/AI-DISCLOSURE.md +0 -48
  287. data/CLAUDE.md +0 -141
  288. data/CONTRIBUTING.md +0 -734
  289. data/INSTALL.md +0 -154
  290. data/LICENSE.md +0 -675
  291. data/QUICKSTART.md +0 -73
  292. data/Rakefile +0 -200
  293. data/SECURITY.md +0 -114
  294. data/cliff.toml +0 -52
  295. data/conf/behaviour/.gitkeep +0 -0
  296. data/conf/design/aaif_alignment.yml +0 -181
  297. data/conf/design/ab_testing.yml +0 -172
  298. data/conf/design/accessibility.yml +0 -84
  299. data/conf/design/ai_authorship.yml +0 -210
  300. data/conf/design/ai_provenance.yml +0 -224
  301. data/conf/design/ai_tool_configuration.yml +0 -207
  302. data/conf/design/architecture.yml +0 -139
  303. data/conf/design/autocompletion.yml +0 -115
  304. data/conf/design/backward_compatibility.yml +0 -112
  305. data/conf/design/behaviour_composition.yml +0 -246
  306. data/conf/design/build_rake_extraction.yml +0 -57
  307. data/conf/design/ci_pipeline.yml +0 -100
  308. data/conf/design/claude_code_configuration.yml +0 -157
  309. data/conf/design/compiler.yml +0 -128
  310. data/conf/design/comply.yml +0 -153
  311. data/conf/design/content_packs.yml +0 -84
  312. data/conf/design/desktop_integration.yml +0 -289
  313. data/conf/design/distribution.yml +0 -216
  314. data/conf/design/doctor.yml +0 -184
  315. data/conf/design/documentation.yml +0 -152
  316. data/conf/design/engine_architecture.yml +0 -257
  317. data/conf/design/error_handling.yml +0 -103
  318. data/conf/design/feature_flags.yml +0 -142
  319. data/conf/design/git_hooks.yml +0 -165
  320. data/conf/design/gui_plugins.yml +0 -475
  321. data/conf/design/i18n.yml +0 -84
  322. data/conf/design/integration_testing.yml +0 -56
  323. data/conf/design/licensing_system.yml +0 -88
  324. data/conf/design/lifecycle_management.yml +0 -208
  325. data/conf/design/mcp_integration.yml +0 -207
  326. data/conf/design/mcp_settings.yml +0 -126
  327. data/conf/design/migration.yml +0 -56
  328. data/conf/design/monitoring_observability.yml +0 -194
  329. data/conf/design/namespace_cleanup.yml +0 -145
  330. data/conf/design/plugin_test_segregation.yml +0 -145
  331. data/conf/design/policy_management.yml +0 -229
  332. data/conf/design/project_management.yml +0 -183
  333. data/conf/design/rai_mcp_asset_discovery.yml +0 -164
  334. data/conf/design/rai_mcp_server.yml +0 -605
  335. data/conf/design/release_management.yml +0 -117
  336. data/conf/design/retrofit.yml +0 -199
  337. data/conf/design/retrospective_analyzer.yml +0 -79
  338. data/conf/design/scope_hierarchy.yml +0 -352
  339. data/conf/design/security.yml +0 -115
  340. data/conf/design/session_retrospective.yml +0 -85
  341. data/conf/design/smart_ui_feedback.yml +0 -89
  342. data/conf/design/structured_logging.yml +0 -148
  343. data/conf/design/styles.yml +0 -123
  344. data/conf/design/test_peer_review.yml +0 -89
  345. data/conf/design/testing.yml +0 -136
  346. data/conf/design/threat_model.yml +0 -108
  347. data/conf/design/ui_framework.yml +0 -111
  348. data/conf/design/usage_optimization.yml +0 -122
  349. data/conf/design/version_management.yml +0 -60
  350. data/conf/design/workflow.yml +0 -227
  351. data/doc/AAIF_POSITIONING.md +0 -58
  352. data/doc/ADOPT.md +0 -224
  353. data/doc/AI_PROVENANCE.md +0 -139
  354. data/doc/ARCHITECTURE.md +0 -920
  355. data/doc/BEHAVIOUR.md +0 -409
  356. data/doc/BUILD.md +0 -138
  357. data/doc/CI_CD_RECIPES.md +0 -171
  358. data/doc/CLAUDE_SESSIONS_MOVED.md +0 -16
  359. data/doc/COMMAND_ANALYSIS.md +0 -229
  360. data/doc/CONFIGURATION.md +0 -281
  361. data/doc/DESIGN_AUDIT.md +0 -235
  362. data/doc/DESIGN_PEER_REVIEW.md +0 -771
  363. data/doc/DESKTOP.md +0 -447
  364. data/doc/ENGINES.md +0 -567
  365. data/doc/ENGINE_DEVELOPMENT_GUIDE.md +0 -417
  366. data/doc/FEATURE_AUDIT.md +0 -218
  367. data/doc/IMPLEMENTATION_PLAN.md +0 -669
  368. data/doc/INCIDENT_REPORT_2026-02-02.md +0 -251
  369. data/doc/MIGRATION_GUIDE.md +0 -88
  370. data/doc/PACKAGING.md +0 -232
  371. data/doc/PROJECT_DASHBOARD.md +0 -153
  372. data/doc/PULP_DEPLOYMENT.md +0 -164
  373. data/doc/QUALITY_FIX_SUMMARY.md +0 -110
  374. data/doc/QUICK_START.md +0 -162
  375. data/doc/REEK_CONFIGURATION.md +0 -166
  376. data/doc/REFERENCE.md +0 -253
  377. data/doc/REFERENCES.md +0 -324
  378. data/doc/SECURITY_REVIEW_CHECKLIST.md +0 -72
  379. data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +0 -359
  380. data/doc/SETUP.md +0 -202
  381. data/doc/TEST_PEER_REVIEW.md +0 -152
  382. data/doc/THREAT_MODEL.md +0 -230
  383. data/doc/USAGE.md +0 -545
  384. data/doc/USER_MANUAL.md +0 -585
  385. data/doc/ai_test_review_checklist.md +0 -110
  386. data/doc/changes/2026-02-18-packaging-fpm.md +0 -155
  387. data/doc/changes/2026-02-19-testing-infrastructure.md +0 -221
  388. data/doc/changes/2026-02-20-security-implementation.md +0 -281
  389. data/doc/changes/2026-02-20-styles-implementation.md +0 -220
  390. data/doc/changes/2026-02-21-architecture-completion.md +0 -95
  391. data/doc/changes/2026-02-21-architecture-ui-layer.md +0 -253
  392. data/doc/changes/2026-02-21-cc-config-implementation.md +0 -108
  393. data/doc/changes/2026-02-21-ci-pipeline-implementation.md +0 -214
  394. data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +0 -241
  395. data/doc/changes/2026-02-21-config-design-show-commands.md +0 -61
  396. data/doc/changes/2026-02-21-design-implementation-overview.md +0 -455
  397. data/doc/changes/2026-02-21-lifecycle-management.md +0 -196
  398. data/doc/changes/2026-02-21-path-resolver.md +0 -128
  399. data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +0 -45
  400. data/doc/changes/2026-03-01-ci-bundler-strategy.md +0 -120
  401. data/doc/changes/2026-03-20-security-hardening-phase2.md +0 -163
  402. data/doc/context/SESSION-HANDOFF.md +0 -69
  403. data/doc/context/ai-engine-usage-trends-2026.md +0 -80
  404. data/doc/context/plan-pluggable-engines.md +0 -590
  405. data/doc/decisions/001-flog-deferred.md +0 -32
  406. data/doc/decisions/002-path-resolution-strategy.md +0 -158
  407. data/doc/decisions/003-ui-adapter-selection.md +0 -193
  408. data/doc/decisions/004-design-document-validation.md +0 -179
  409. data/doc/decisions/005-package-splitting-strategy.md +0 -200
  410. data/doc/decisions/006-multi-engine-architecture.md +0 -147
  411. data/doc/decisions/007-engine-agnostic-pivot.md +0 -219
  412. data/doc/decisions/008-ci-bundler-strategy.md +0 -129
  413. data/doc/decisions/009-core-only-v1-release.md +0 -60
  414. data/doc/decisions/010-engine-debian-packaging.md +0 -66
  415. data/doc/decisions/011-context-aware-cli.md +0 -71
  416. data/doc/dependency_decisions.yml +0 -247
  417. data/doc/issues/001-wrapper-missing-environment-variables.md +0 -197
  418. data/doc/issues/002-embedded-ruby-wrong-prefix.md +0 -217
  419. data/doc/issues/003-smoke-test-false-positive.md +0 -127
  420. data/doc/issues/004-market-research-design-updates.md +0 -109
  421. data/doc/issues/005-compile-scope-coexistence.md +0 -161
  422. data/doc/locales/.gitkeep +0 -0
  423. data/doc/man/rai.1.ronn +0 -505
  424. data/doc/operations/packaging.md +0 -133
  425. data/doc/operations/rosett-ai-release.md +0 -65
  426. data/doc/reference/error-catalog.md +0 -107
  427. data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
  428. data/doc/reference/src/Pictures/cover.jpg +0 -0
  429. data/doc/reference/src/Pictures/head1.jpg +0 -0
  430. data/doc/reference/src/Pictures/head2.jpg +0 -0
  431. data/doc/reference/src/Pictures/head3.jpg +0 -0
  432. data/doc/reference/src/Pictures/head4.jpg +0 -0
  433. data/doc/reference/src/Pictures/head5.jpg +0 -0
  434. data/doc/reference/src/Pictures/head6.jpg +0 -0
  435. data/doc/reference/src/Pictures/head7.jpg +0 -0
  436. data/doc/reference/src/Pictures/head8.jpg +0 -0
  437. data/doc/reference/src/StyleInd.ist +0 -4
  438. data/doc/reference/src/bibliography.bib +0 -79
  439. data/doc/reference/src/main.tex +0 -1288
  440. data/doc/reference/src/structure.tex +0 -303
  441. data/doc/rosett-ai-bookmarks.html +0 -301
  442. data/kitchen.yml +0 -46
  443. data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
  444. data/locales/.gitkeep +0 -0
  445. data/packaging/build-engine-deb.sh +0 -81
  446. data/packaging/scripts/postinst +0 -17
  447. data/packaging/scripts/postrm +0 -19
  448. data/packaging/scripts/prerm +0 -10
  449. data/packaging/wrapper.sh.template +0 -38
  450. data/rosett-ai.gemspec +0 -63
  451. data/rules/.gitkeep +0 -0
  452. data/scripts/publish/pulp_upload.sh +0 -123
  453. data/settings.json +0 -29
@@ -5,6 +5,7 @@
5
5
 
6
6
  module RosettAi
7
7
  module Mcp
8
+ # MCP resource implementations for data access.
8
9
  module Resources
9
10
  # MCP resource provider for installed hook scripts.
10
11
  #
@@ -14,8 +15,10 @@ module RosettAi
14
15
  # @author hugo
15
16
  # @author claude
16
17
  class HooksResource
18
+ # @return [String] URI prefix for MCP resource discovery.
17
19
  URI_PREFIX = 'rosett-ai://hooks/'
18
20
 
21
+ # @return [Hash] Supported configuration scope names.
19
22
  SCOPES = {
20
23
  'global' => -> { RosettAi.paths.global_dir.join('hooks') },
21
24
  'project' => -> { RosettAi.context.project_root.join('.claude', 'hooks') }
@@ -13,7 +13,9 @@ module RosettAi
13
13
  # @author hugo
14
14
  # @author claude
15
15
  class ProvenanceResource
16
+ # @return [String] URI prefix for MCP resource discovery.
16
17
  URI_PREFIX = 'rosett-ai://provenance/'
18
+ # @return [String] Default provenance data filename.
17
19
  PROVENANCE_FILE = '.ai-provenance.yml'
18
20
 
19
21
  # Lists available provenance resources.
@@ -14,6 +14,7 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class RulesResource
17
+ # @return [String] URI prefix for MCP resource discovery.
17
18
  URI_PREFIX = 'rosett-ai://rules/'
18
19
 
19
20
  # Lists all available compiled rule resources.
@@ -14,6 +14,7 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class SchemaResource
17
+ # @return [String] URI prefix for MCP resource discovery.
17
18
  URI_PREFIX = 'rosett-ai://schema/'
18
19
 
19
20
  # Lists all available schema resources.
@@ -4,6 +4,7 @@
4
4
  # Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
5
5
 
6
6
  module RosettAi
7
+ # Model Context Protocol server and tool framework.
7
8
  module Mcp
8
9
  # MCP server for Rosett-AI — exposes validation, compilation, and
9
10
  # configuration management as MCP tools, resources, and prompts.
@@ -16,8 +17,11 @@ module RosettAi
16
17
  # @author hugo
17
18
  # @author claude
18
19
  class Server
20
+ # @return [String] Supported MCP protocol specification version.
19
21
  MCP_SPEC_VERSION = '2025-03-26'
22
+ # @return [Integer] Default port number for the server.
20
23
  DEFAULT_PORT = 8484
24
+ # @return [String] Default hostname for the server.
21
25
  DEFAULT_HOST = 'localhost'
22
26
 
23
27
  attr_reader :security_config
@@ -108,6 +112,8 @@ module RosettAi
108
112
 
109
113
  def ensure_http_available!
110
114
  require 'puma'
115
+ require 'puma/configuration'
116
+ require 'puma/launcher'
111
117
  require 'rackup'
112
118
  rescue LoadError => e
113
119
  raise RosettAi::McpError,
@@ -129,7 +135,7 @@ module RosettAi
129
135
  def build_rack_app
130
136
  server = build_server
131
137
  transport = ::MCP::Server::Transports::StreamableHTTPTransport.new(server)
132
- app = transport.method(:call)
138
+ app = ->(env) { transport.handle_request(Rack::Request.new(env)) }
133
139
  security = @security_config
134
140
 
135
141
  Rack::Builder.new do
@@ -5,6 +5,7 @@
5
5
 
6
6
  module RosettAi
7
7
  module Mcp
8
+ # MCP server settings and trust management.
8
9
  module Settings
9
10
  # Manages trust sources for MCP server installation.
10
11
  #
@@ -15,7 +16,9 @@ module RosettAi
15
16
  # @author hugo
16
17
  # @author claude
17
18
  class TrustManager
19
+ # @return [String] Configuration directory path.
18
20
  CONFIG_DIR = '.config/rosett-ai/mcp'
21
+ # @return [String] Filename for user trust configuration.
19
22
  USER_TRUST_FILE = 'user_trust.yml'
20
23
 
21
24
  # @param config_dir [Pathname, nil] override config directory
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class AdoptTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_adopt'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Run rai adopt analysis (local structural checks)'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class BackupTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_backup'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Create rai configuration backup'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => false,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class BehaviourDisplayTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_behaviour_display'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Display behaviour configuration overview'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class BehaviourListTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_behaviour_list'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'List all rai behaviour configuration files'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class BehaviourManageTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_behaviour_manage'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Add, modify, or delete rai behaviour files'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => false,
22
25
  'destructiveHint' => true,
@@ -24,8 +27,10 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Array] Set of permitted action values.
27
31
  VALID_ACTIONS = ['add', 'modify', 'delete'].freeze
28
32
 
33
+ # @return [Hash] JSON Schema defining the tool input parameters.
29
34
  INPUT_SCHEMA = {
30
35
  type: 'object',
31
36
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class BehaviourShowTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_behaviour_show'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Show details of a specific rai behaviour'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -17,9 +17,12 @@ module RosettAi
17
17
  # @author hugo
18
18
  # @author claude
19
19
  class CompileStatusTool
20
+ # @return [String] MCP tool identifier string.
20
21
  TOOL_NAME = 'rai_compile_status'
22
+ # @return [String] Human-readable description of this tool.
21
23
  DESCRIPTION = 'Show compiled rules staleness — source vs compiled checksums'
22
24
 
25
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
23
26
  ANNOTATIONS = {
24
27
  'readOnlyHint' => true,
25
28
  'destructiveHint' => false,
@@ -27,6 +30,7 @@ module RosettAi
27
30
  'openWorldHint' => false
28
31
  }.freeze
29
32
 
33
+ # @return [Hash] JSON Schema defining the tool input parameters.
30
34
  INPUT_SCHEMA = {
31
35
  type: 'object',
32
36
  properties: {
@@ -18,9 +18,12 @@ module RosettAi
18
18
  # @author hugo
19
19
  # @author claude
20
20
  class CompileTool
21
+ # @return [String] MCP tool identifier string.
21
22
  TOOL_NAME = 'rai_compile'
23
+ # @return [String] Human-readable description of this tool.
22
24
  DESCRIPTION = 'Compile rai behaviours to engine-native format'
23
25
 
26
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
24
27
  ANNOTATIONS = {
25
28
  'readOnlyHint' => false,
26
29
  'destructiveHint' => false,
@@ -28,6 +31,7 @@ module RosettAi
28
31
  'openWorldHint' => false
29
32
  }.freeze
30
33
 
34
+ # @return [Hash] JSON Schema defining the tool input parameters.
31
35
  INPUT_SCHEMA = {
32
36
  type: 'object',
33
37
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class ComplyTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_comply'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Run rosett-ai compliance checks (CRA, license, SPDX headers)'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class ConfigCompileTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_config_compile'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Compile rai configuration scopes to JSON settings'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => false,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class ConfigStatusTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_config_status'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Show rai configuration and project status'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class ContentTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_content'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'List, install, or update rai content packs'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => false,
22
25
  'destructiveHint' => false,
@@ -24,8 +27,10 @@ module RosettAi
24
27
  'openWorldHint' => true
25
28
  }.freeze
26
29
 
30
+ # @return [Array] Set of permitted action values.
27
31
  VALID_ACTIONS = ['list', 'install', 'update'].freeze
28
32
 
33
+ # @return [Hash] JSON Schema defining the tool input parameters.
29
34
  INPUT_SCHEMA = {
30
35
  type: 'object',
31
36
  properties: {
@@ -18,9 +18,12 @@ module RosettAi
18
18
  # @author hugo
19
19
  # @author claude
20
20
  class ContextQueryTool
21
+ # @return [String] MCP tool identifier string.
21
22
  TOOL_NAME = 'rai_context_query'
23
+ # @return [String] Human-readable description of this tool.
22
24
  DESCRIPTION = 'Query applicable rules for a file path, tool name, or action'
23
25
 
26
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
24
27
  ANNOTATIONS = {
25
28
  'readOnlyHint' => true,
26
29
  'destructiveHint' => false,
@@ -28,6 +31,7 @@ module RosettAi
28
31
  'openWorldHint' => false
29
32
  }.freeze
30
33
 
34
+ # @return [Hash] JSON Schema defining the tool input parameters.
31
35
  INPUT_SCHEMA = {
32
36
  type: 'object',
33
37
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class DesignListTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_design_list'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'List all rai design documents'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class DesignShowTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_design_show'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Show details of a specific rai design document'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class DoctorTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_doctor'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Run rosett-ai diagnostic checks'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,6 +27,7 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
31
  INPUT_SCHEMA = {
28
32
  type: 'object',
29
33
  properties: {
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class DocumentationStatusTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_documentation_status'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Show rai documentation status'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class EnginesTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rosett_ai_engines'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'List, detect, or show status of rai engines'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,8 +27,10 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Array] Set of permitted action values.
27
31
  VALID_ACTIONS = ['list', 'detect', 'status'].freeze
28
32
 
33
+ # @return [Hash] JSON Schema defining the tool input parameters.
29
34
  INPUT_SCHEMA = {
30
35
  type: 'object',
31
36
  properties: {
@@ -19,9 +19,12 @@ module RosettAi
19
19
  # @author hugo
20
20
  # @author claude
21
21
  class HookInstallTool
22
+ # @return [String] MCP tool identifier string.
22
23
  TOOL_NAME = 'rai_hook_install'
24
+ # @return [String] Human-readable description of this tool.
23
25
  DESCRIPTION = 'Install enforcement hook: generate script, write to disk, register in settings'
24
26
 
27
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
25
28
  ANNOTATIONS = {
26
29
  'readOnlyHint' => false,
27
30
  'destructiveHint' => true,
@@ -29,6 +32,7 @@ module RosettAi
29
32
  'openWorldHint' => false
30
33
  }.freeze
31
34
 
35
+ # @return [Hash] JSON Schema defining the tool input parameters.
32
36
  INPUT_SCHEMA = {
33
37
  type: 'object',
34
38
  properties: {
@@ -52,8 +56,11 @@ module RosettAi
52
56
  }
53
57
  }.freeze
54
58
 
59
+ # @return [String] Subdirectory name for hook scripts.
55
60
  HOOK_DIR_NAME = 'hooks'
61
+ # @return [String] Default filename for generated hook scripts.
56
62
  HOOK_FILENAME = 'rai-enforce.rb'
63
+ # @return [String] File extension appended to backup copies.
57
64
  BACKUP_SUFFIX = '.rai-backup'
58
65
 
59
66
  # Installs the enforcement hook.
@@ -21,9 +21,12 @@ module RosettAi
21
21
  # @author hugo
22
22
  # @author claude
23
23
  class HookPreviewTool
24
+ # @return [String] MCP tool identifier string.
24
25
  TOOL_NAME = 'rai_hook_preview'
26
+ # @return [String] Human-readable description of this tool.
25
27
  DESCRIPTION = 'Preview generated enforcement hook script (read-only, no side effects)'
26
28
 
29
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
27
30
  ANNOTATIONS = {
28
31
  'readOnlyHint' => true,
29
32
  'destructiveHint' => false,
@@ -31,6 +34,7 @@ module RosettAi
31
34
  'openWorldHint' => false
32
35
  }.freeze
33
36
 
37
+ # @return [Hash] JSON Schema defining the tool input parameters.
34
38
  INPUT_SCHEMA = {
35
39
  type: 'object',
36
40
  properties: {
@@ -88,27 +92,44 @@ module RosettAi
88
92
  #
89
93
  # @param behaviours [Array<Hash>]
90
94
  # @param rule_id [String, nil]
91
- # @return [Hash] :rules, :downgraded, :behaviour_name, :behaviour_version
95
+ # @return [Hash] :rules, :downgraded, :contextual_rules, :behaviour_name,
96
+ # :behaviour_version
92
97
  def validate_and_collect(behaviours, rule_id)
93
98
  validator = Enforcement::Validator.new
94
99
  all_rules = []
95
100
  all_downgraded = []
101
+ all_contextual = []
96
102
  names = []
97
103
 
98
104
  behaviours.each do |data|
99
- result = validator.validate(data)
100
- rules = result[:valid].select { |r| r[:type] == 'enforceable' }
101
- rules = rules.select { |r| r[:rule_id] == rule_id } if rule_id
102
- all_rules.concat(rules)
103
- all_downgraded.concat(result[:downgraded])
105
+ slices = collect_from_behaviour(validator, data, rule_id)
106
+ all_rules.concat(slices[:rules])
107
+ all_downgraded.concat(slices[:downgraded])
108
+ all_contextual.concat(slices[:contextual])
104
109
  names << data['name']
105
110
  end
106
111
 
107
112
  { rules: all_rules, downgraded: all_downgraded,
113
+ contextual_rules: all_contextual,
108
114
  behaviour_name: names.join(', '),
109
115
  behaviour_version: behaviours.first&.fetch('version', '0.0.0') || '0.0.0' }
110
116
  end
111
117
 
118
+ # Collects validated rules from a single behaviour, returned as slices.
119
+ #
120
+ # @param validator [Enforcement::Validator]
121
+ # @param data [Hash] behaviour data
122
+ # @param rule_id [String, nil] optional rule filter
123
+ # @return [Hash] :rules, :downgraded, :contextual arrays
124
+ def collect_from_behaviour(validator, data, rule_id)
125
+ result = validator.validate(data)
126
+ enforceable = result[:valid].select { |r| r[:type] == 'enforceable' }
127
+ enforceable = enforceable.select { |r| r[:rule_id] == rule_id } if rule_id
128
+ non_enforceable = result[:valid].reject { |r| r[:type] == 'enforceable' }
129
+ { rules: enforceable, downgraded: result[:downgraded],
130
+ contextual: result[:skipped] + non_enforceable }
131
+ end
132
+
112
133
  # Generates the hook script via HookGenerator.
113
134
  #
114
135
  # @param validated [Hash]
@@ -118,7 +139,8 @@ module RosettAi
118
139
  generator.generate(
119
140
  validated[:rules],
120
141
  behaviour_name: validated[:behaviour_name],
121
- behaviour_version: validated[:behaviour_version]
142
+ behaviour_version: validated[:behaviour_version],
143
+ contextual_rules: validated[:contextual_rules]
122
144
  )
123
145
  end
124
146
 
@@ -127,12 +149,15 @@ module RosettAi
127
149
  # @param scope [String, nil]
128
150
  # @return [Hash]
129
151
  def build_response(script, validated, scope)
152
+ contextual = validated[:contextual_rules] || []
130
153
  response = {
131
154
  script: script,
132
155
  rules_count: validated[:rules].size,
133
156
  behaviours: validated[:rules].map { |r| r[:behaviour] }.uniq,
134
157
  scope: scope || 'global',
135
- preview_only: true
158
+ preview_only: true,
159
+ contextual_count: contextual.size,
160
+ contextual_rules: contextual
136
161
  }
137
162
  response[:downgraded] = validated[:downgraded] unless validated[:downgraded].empty?
138
163
  response
@@ -14,9 +14,12 @@ module RosettAi
14
14
  # @author hugo
15
15
  # @author claude
16
16
  class HooksStatusTool
17
+ # @return [String] MCP tool identifier string.
17
18
  TOOL_NAME = 'rai_hooks_status'
19
+ # @return [String] Human-readable description of this tool.
18
20
  DESCRIPTION = 'Show git hooks list and installation status'
19
21
 
22
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
23
  ANNOTATIONS = {
21
24
  'readOnlyHint' => true,
22
25
  'destructiveHint' => false,
@@ -24,8 +27,10 @@ module RosettAi
24
27
  'openWorldHint' => false
25
28
  }.freeze
26
29
 
30
+ # @return [Array] Set of permitted action values.
27
31
  VALID_ACTIONS = ['list', 'status'].freeze
28
32
 
33
+ # @return [Hash] JSON Schema defining the tool input parameters.
29
34
  INPUT_SCHEMA = {
30
35
  type: 'object',
31
36
  properties: {
@@ -5,6 +5,7 @@
5
5
 
6
6
  module RosettAi
7
7
  module Mcp
8
+ # MCP tool implementations exposing raictl functionality.
8
9
  module Tools
9
10
  # MCP tool: initialize rosett-ai structure.
10
11
  #
@@ -14,9 +15,12 @@ module RosettAi
14
15
  # @author hugo
15
16
  # @author claude
16
17
  class InitTool
18
+ # @return [String] MCP tool identifier string.
17
19
  TOOL_NAME = 'rai_init'
20
+ # @return [String] Human-readable description of this tool.
18
21
  DESCRIPTION = 'Initialize rosett-ai directory structure (global, local, or project)'
19
22
 
23
+ # @return [Hash] MCP protocol annotations describing tool capabilities.
20
24
  ANNOTATIONS = {
21
25
  'readOnlyHint' => false,
22
26
  'destructiveHint' => false,
@@ -24,6 +28,7 @@ module RosettAi
24
28
  'openWorldHint' => false
25
29
  }.freeze
26
30
 
31
+ # @return [Hash] JSON Schema defining the tool input parameters.
27
32
  INPUT_SCHEMA = {
28
33
  type: 'object',
29
34
  properties: {