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/QUICKSTART.md ADDED
@@ -0,0 +1,73 @@
1
+ # Quick Start
2
+
3
+ Get from zero to your first compiled rules in 5 minutes.
4
+
5
+ ## 1. Install
6
+
7
+ ```bash
8
+ sudo dpkg -i nncc_1.0.0-1_amd64.deb
9
+ sudo apt-get install -f # resolve dependencies
10
+ ```
11
+
12
+ ## 2. Initialize
13
+
14
+ ```bash
15
+ # Set up global ~/.claude/ structure
16
+ rai init --global
17
+
18
+ # (Optional) Set up project-local structure
19
+ rai init --local
20
+ ```
21
+
22
+ ## 3. Create a behaviour rule
23
+
24
+ ```bash
25
+ rai behaviour manage add my_first_rule
26
+ ```
27
+
28
+ Edit the created file at `conf/behaviour/my_first_rule.yml`:
29
+
30
+ ```yaml
31
+ name: my_first_rule
32
+ description: My first rai behaviour rule
33
+ version: 1.0.0
34
+ author: your_name
35
+ created_at: "2026-01-01"
36
+ modified_at: "2026-01-01"
37
+ modified_by: your_name
38
+ sensitive: false
39
+ used_in: []
40
+ rules:
41
+ - id: rule_001
42
+ description: Always explain your reasoning before making changes
43
+ priority: 50
44
+ enabled: true
45
+ ```
46
+
47
+ ## 4. Compile
48
+
49
+ ```bash
50
+ # Preview what would change
51
+ rai compile --simulate --verbose
52
+
53
+ # Compile rules to ~/.claude/rules/
54
+ rai compile --verbose
55
+ ```
56
+
57
+ ## 5. Verify
58
+
59
+ ```bash
60
+ # Check the generated files
61
+ ls ~/.claude/rules/
62
+
63
+ # Validate everything is consistent
64
+ rai validate
65
+ ```
66
+
67
+ ## Next Steps
68
+
69
+ - `rai compile --engine generic` to compile for non-Claude tools
70
+ - `rai design list` to explore design documents
71
+ - `rai adopt --verbose` to analyze your existing rules
72
+ - `man raictl` for the full manual
73
+ - See [INSTALL.md](INSTALL.md) for detailed installation options
data/README.md ADDED
@@ -0,0 +1,366 @@
1
+ # Rosett-AI
2
+
3
+ **Author rules once, compile to Claude Code, AGENTS.md, and more engines coming soon.**
4
+
5
+ raictl is an engine-agnostic configuration management tool for AI-assisted development workflows.
6
+ Define operational rules in generic YAML, then compile them to any supported AI tool's native format.
7
+ v1.2.0 ships with Claude Code and AGENTS.md engines.
8
+ Additional engines (Cursor, Copilot, Windsurf, Goose, Aider, Ollama, GPT-NeoX, Generic) are in development.
9
+
10
+ ```mermaid
11
+ graph LR
12
+ subgraph Input["Human Intent (YAML)"]
13
+ B[conf/behaviour/*.yml]
14
+ D[conf/design/*.yml]
15
+ end
16
+
17
+ subgraph rosett-ai["Rosett-AI Compiler"]
18
+ P[Compilation Pipeline]
19
+ end
20
+
21
+ subgraph Engines["Engine Backends"]
22
+ C[Claude Code]:::available
23
+ A[AGENTS.md]:::available
24
+ CU[Cursor]:::planned
25
+ CP[Copilot]:::planned
26
+ WS[Windsurf]:::planned
27
+ GO[Goose]:::planned
28
+ AI[Aider]:::planned
29
+ O[Ollama]:::planned
30
+ G[GPT-NeoX]:::planned
31
+ X[Generic]:::planned
32
+ end
33
+
34
+ B --> P
35
+ D --> P
36
+ P --> C
37
+ P --> A
38
+ P --> CU
39
+ P --> CP
40
+ P --> WS
41
+ P --> GO
42
+ P --> AI
43
+ P --> O
44
+ P --> G
45
+ P --> X
46
+
47
+ classDef available stroke:#22c55e,stroke-width:2px
48
+ classDef planned stroke:#94a3b8,stroke-width:1px,stroke-dasharray:5 5,fill:#f8fafc,color:#64748b
49
+ ```
50
+
51
+ | Field | Value |
52
+ |-------|-------|
53
+ | Version | <!-- rai:version -->1.2.0<!-- /rai:version --> |
54
+ | License | GPL-3.0-only |
55
+ | Ruby | 3.3.10 (rbenv) |
56
+ | Tests | <!-- rai:tests -->4672 RSpec specs<!-- /rai:tests --> |
57
+ | Author | Hugo Antonio Sepulveda Manriquez |
58
+
59
+ ## Quick Start
60
+
61
+ ### Install from RubyGems
62
+
63
+ ```bash
64
+ gem install rosett-ai
65
+ ```
66
+
67
+ ### Or install from .deb (Debian/Ubuntu)
68
+
69
+ ```bash
70
+ sudo dpkg -i rosett-ai_1.2.0-1_amd64.deb
71
+ ```
72
+
73
+ ### Initialize
74
+
75
+ ```bash
76
+ raictl init --global
77
+ ```
78
+
79
+ ### Write your first behaviour rule
80
+
81
+ ```bash
82
+ raictl behaviour manage add my_rules
83
+ ```
84
+
85
+ ### Compile to Claude Code
86
+
87
+ ```bash
88
+ raictl compile --verbose
89
+ ```
90
+
91
+ ### Verify
92
+
93
+ ```bash
94
+ ls ~/.claude/rules/
95
+ ```
96
+
97
+ ## Features
98
+
99
+ ```mermaid
100
+ mindmap
101
+ root((raictl))
102
+ Engine Backends
103
+ Claude Code ✓
104
+ AGENTS.md ✓
105
+ Cursor ○
106
+ Copilot ○
107
+ Windsurf ○
108
+ Goose ○
109
+ Aider ○
110
+ Ollama ○
111
+ GPT-NeoX ○
112
+ Generic ○
113
+ Desktop Integration
114
+ D-Bus IPC Service
115
+ GTK4/Adwaita App
116
+ Focus Monitoring
117
+ 5 Compositor Adapters
118
+ Configuration
119
+ Behaviour Rules
120
+ Design Documents
121
+ JSON Schema Validation
122
+ Configuration Hierarchy
123
+ Security
124
+ Ed25519 JWT Licensing
125
+ YAML DoS Prevention
126
+ Path Whitelisting
127
+ Custom RuboCop Cops
128
+ CLI
129
+ Compile / Validate / Adopt
130
+ Backup / Migrate / Doctor
131
+ Engine Detection
132
+ Accessibility
133
+ EN 301 549 Compliance
134
+ Accessible TUI
135
+ i18n (en, fr, ar)
136
+ ```
137
+
138
+ ### Core Capabilities
139
+
140
+ - **Engine-Agnostic Compilation** -- Write rules in generic YAML, compile to any AI tool
141
+ - **<!-- rai:engines -->2<!-- /rai:engines --> Available Engine Backends** -- Claude Code, AGENTS.md (8 more planned: Cursor, Copilot, Windsurf, Goose, Aider, Ollama, GPT-NeoX, Generic)
142
+ - **D-Bus Desktop Service** -- `be.neatnerds.rosettai` session bus with Manager and FocusMonitor interfaces
143
+ - **GTK4/Adwaita Application** -- Crash-proof GUI with `safe_action()` wrapper pattern
144
+ - **Behaviour Management** -- Priority-sorted rules (1-100 scale) with sensitivity filtering
145
+ - **Adopt Analysis** -- Local structural checks with optional API-powered analysis
146
+ - **Content Packs** -- Premium content delivery via Ed25519-signed JWT licensing
147
+ - **Debian Packaging** -- `.deb` packages via fpm for core, gtk4, and qt6 variants
148
+ - **i18n** -- Internationalisation with gettext/Qt locale compilation
149
+
150
+ ## Architecture Overview
151
+
152
+ ```mermaid
153
+ graph TB
154
+ subgraph CLI["CLI Layer (Thor)"]
155
+ BIN[bin/raictl]
156
+ THOR[RosettAi::Thor::CLI]
157
+ end
158
+
159
+ subgraph LIB["Library Layer"]
160
+ COMP[Compiler::Pipeline]
161
+ VALID[Validators]
162
+ CONFIG[Configuration]
163
+ PATH[PathResolver]
164
+ ADOPT[Adopter]
165
+ YAML[YamlLoader]
166
+ end
167
+
168
+ subgraph ENGINES["Engine Layer"]
169
+ CLAUDE[engines/claude/]:::available
170
+ AGENTS[engines/agents_md/]:::available
171
+ CURSOR[engines/cursor/]:::planned
172
+ COPILOT[engines/copilot/]:::planned
173
+ WINDSURF[engines/windsurf/]:::planned
174
+ GOOSE[engines/goose/]:::planned
175
+ AIDER[engines/aider/]:::planned
176
+ OLLAMA[engines/ollama/]:::planned
177
+ NEOX[engines/gpt_neox/]:::planned
178
+ GENERIC[engines/generic/]:::planned
179
+ end
180
+
181
+ subgraph DESKTOP["Desktop Layer"]
182
+ DBUS_SVC[D-Bus Service]
183
+ GTK4[GTK4 App]
184
+ FOCUS[Focus Monitor]
185
+ end
186
+
187
+ BIN --> THOR
188
+ THOR --> COMP
189
+ THOR --> VALID
190
+ THOR --> CONFIG
191
+ THOR --> ADOPT
192
+ COMP --> ENGINES
193
+ COMP --> YAML
194
+ VALID --> YAML
195
+ CONFIG --> PATH
196
+ DBUS_SVC --> COMP
197
+ GTK4 -->|D-Bus IPC| DBUS_SVC
198
+ FOCUS --> DBUS_SVC
199
+
200
+ classDef available stroke:#22c55e,stroke-width:2px
201
+ classDef planned stroke:#94a3b8,stroke-width:1px,stroke-dasharray:5 5,fill:#f8fafc,color:#64748b
202
+ ```
203
+
204
+ > **Legend:** Solid border = Available | Dashed border = Planned
205
+
206
+ ## CLI Commands
207
+
208
+ ```bash
209
+ # Compilation
210
+ raictl compile # Compile rules (default engine)
211
+ raictl compile --engine agents_md # Compile to AGENTS.md format
212
+ raictl compile --engine ollama # Compile for Ollama
213
+ raictl compile --strict # Treat warnings as errors
214
+ raictl compile --simulate --verbose # Dry run with diffs
215
+
216
+ # Engine management
217
+ raictl engines list # List all known engines
218
+ raictl engines detect # Detect installed engines
219
+ raictl engines status # Show default engine + detection
220
+
221
+ # Validation & analysis
222
+ raictl validate # Validate all config files
223
+ raictl adopt # Local-only structural checks
224
+ raictl adopt --api --verbose # Remote API analysis
225
+
226
+ # Configuration
227
+ raictl behaviour display # Show behaviour configuration
228
+ raictl config compile # Compile YAML scopes to JSON
229
+ raictl design list # List design documents
230
+
231
+ # Desktop
232
+ raictl dbus start # Start D-Bus service
233
+ raictl desktop gtk4 # Launch GTK4 application
234
+
235
+ # Backup
236
+ raictl backup --global --local # Back up all configurations
237
+ ```
238
+
239
+ See [USAGE.md](doc/USAGE.md) for the full command reference.
240
+
241
+ ## Documentation
242
+
243
+ | Document | Description |
244
+ |----------|-------------|
245
+ | [ARCHITECTURE.md](doc/ARCHITECTURE.md) | System architecture with Mermaid diagrams |
246
+ | [ENGINES.md](doc/ENGINES.md) | Engine backends and compilation targets |
247
+ | [DESKTOP.md](doc/DESKTOP.md) | D-Bus service and GTK4 desktop app |
248
+ | [SETUP.md](doc/SETUP.md) | Installation and setup guide |
249
+ | [USAGE.md](doc/USAGE.md) | CLI usage and examples |
250
+ | [CONFIGURATION.md](doc/CONFIGURATION.md) | Configuration reference |
251
+ | [BEHAVIOUR.md](doc/BEHAVIOUR.md) | Behaviour system documentation |
252
+ | [ADOPT.md](doc/ADOPT.md) | Adopt analysis documentation |
253
+ | [PACKAGING.md](doc/PACKAGING.md) | Debian packaging |
254
+ | [REFERENCES.md](doc/REFERENCES.md) | External references and bibliography |
255
+ | [IMPLEMENTATION_PLAN.md](doc/IMPLEMENTATION_PLAN.md) | Phased roadmap |
256
+ | [CONTRIBUTING.md](CONTRIBUTING.md) | Developer guide |
257
+
258
+ ### Architecture Decision Records
259
+
260
+ | ADR | Status | Decision |
261
+ |-----|--------|----------|
262
+ | [001](doc/decisions/001-flog-deferred.md) | Accepted | Defer Flog (covered by RuboCop) |
263
+ | [002](doc/decisions/002-path-resolution-strategy.md) | Accepted | Centralised PathResolver |
264
+ | [003](doc/decisions/003-ui-adapter-selection.md) | Accepted | 5-level UI cascade |
265
+ | [004](doc/decisions/004-design-document-validation.md) | Accepted | Generic SchemaValidator |
266
+ | [005](doc/decisions/005-package-splitting-strategy.md) | Accepted | Plugin gems in mono-repo |
267
+ | [006](doc/decisions/006-multi-engine-architecture.md) | Superseded | Multi-engine (see ADR-007) |
268
+ | [007](doc/decisions/007-engine-agnostic-pivot.md) | Accepted | Engine-agnostic pivot |
269
+
270
+ ## Project Structure
271
+
272
+ ```text
273
+ rosett-ai/
274
+ ├── bin/raictl # CLI executable
275
+ ├── lib/rosett_ai/ # Ruby library (4800+ LOC)
276
+ │ ├── engines/ # Engine backends
277
+ │ │ ├── claude/ # Claude Code engine (7 components)
278
+ │ │ ├── cursor/ # Cursor (Anysphere) engine
279
+ │ │ ├── copilot/ # GitHub Copilot engine
280
+ │ │ ├── windsurf/ # Windsurf (Codeium) engine
281
+ │ │ ├── agents_md/ # AGENTS.md engine
282
+ │ │ ├── goose/ # Goose (Block) engine
283
+ │ │ ├── aider/ # Aider engine
284
+ │ │ ├── generic/ # Generic markdown engine
285
+ │ │ ├── ollama/ # Ollama engine
286
+ │ │ └── gpt_neox/ # GPT-NeoX engine
287
+ │ ├── compiler/ # Compilation pipeline
288
+ │ ├── desktop/ # GTK4 app + GUI logger
289
+ │ ├── dbus/ # D-Bus service + focus adapters
290
+ │ ├── validators/ # Schema-based validators
291
+ │ ├── licensing/ # Ed25519 JWT license keys
292
+ │ ├── content/ # Content pack system
293
+ │ ├── backup/ # Backup with compression
294
+ │ ├── thor/tasks/ # 16 CLI subcommands
295
+ │ └── ui/ # UI adapter registry
296
+ ├── conf/ # Configuration
297
+ │ ├── behaviour/ # Behaviour YAML files
298
+ │ ├── design/ # Design documents (21 files)
299
+ │ ├── schemas/ # JSON Schemas (10 files)
300
+ │ ├── engines/ # Per-engine config
301
+ │ └── packaging/ # Package variant configs
302
+ ├── spec/ # RSpec tests (119 files)
303
+ ├── doc/ # Documentation
304
+ │ ├── decisions/ # ADRs (001-007)
305
+ │ └── changes/ # Implementation notes
306
+ ├── locales/ # i18n (en, fr, ar)
307
+ ├── packaging/ # Debian scripts
308
+ └── CLAUDE.md # Project instructions
309
+ ```
310
+
311
+ ## Development
312
+
313
+ ### Building from source
314
+
315
+ ```bash
316
+ git clone https://gitlab.com/neatnerds/foss/rosett-ai.git
317
+ cd rosett-ai
318
+ rbenv install 3.3.10
319
+ bundle install
320
+ overcommit --install
321
+ bin/raictl version
322
+ ```
323
+
324
+ ### Quality checks
325
+
326
+ ```bash
327
+ bundle exec rspec # Run tests
328
+ bundle exec rubocop # Lint
329
+ bundle exec reek # Code smell detection
330
+ bundle exec bundler-audit check # Security audit
331
+ ```
332
+
333
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the full developer guide.
334
+
335
+ ## Roadmap
336
+
337
+ ```mermaid
338
+ gantt
339
+ title Rosett-AI Development Roadmap
340
+ dateFormat YYYY-MM-DD
341
+ axisFormat %b %d
342
+
343
+ section Engine Phases
344
+ Phase 0a - Rename :done, e0a, 2026-02-26, 1d
345
+ Phase 0b - Engine dirs :done, e0b, after e0a, 1d
346
+ Phase 0c - XDG + detection :done, e0c, after e0b, 1d
347
+ Engine 1 - AGENTS.md :done, e1, after e0c, 1d
348
+ Engine 2 - Ollama + GPT-NeoX :done, e2, after e1, 1d
349
+ Engine 3 - Goose + Aider :done, e3, after e2, 1d
350
+ Engine 4 - Cursor + Copilot :done, e4, after e3, 1d
351
+
352
+ section Desktop Phases
353
+ Desktop 1 - D-Bus service :done, d1, after e0c, 1d
354
+ Desktop 2 - GTK4 app :done, d2, after d1, 1d
355
+ GTK4 hardening :done, d2h, after d2, 1d
356
+ Desktop 3 - KDE KCM :d3, after d2h, 5d
357
+ ```
358
+
359
+ ## License
360
+
361
+ GPL-3.0-only
362
+
363
+ ## Contact
364
+
365
+ - Author: hugo@neatnerds.be
366
+ - Support: query@neatnerds.be
data/Rakefile ADDED
@@ -0,0 +1,200 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-License-Identifier: GPL-3.0-only
4
+ # Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
5
+
6
+ require 'bundler/gem_tasks'
7
+ require 'rspec/core/rake_task'
8
+ require 'rubocop/rake_task'
9
+
10
+ RSpec::Core::RakeTask.new(:spec)
11
+ RuboCop::RakeTask.new
12
+
13
+ desc 'Run reek smell detector'
14
+ task :reek do
15
+ sh 'bundle', 'exec', 'reek', 'lib/rosett_ai.rb', 'lib/rosett_ai/'
16
+ end
17
+
18
+ desc 'Check dependency licenses for GPL-3.0 compatibility'
19
+ task :licenses do
20
+ sh 'bundle', 'exec', 'license_finder'
21
+ end
22
+
23
+ desc 'Detect potentially uncalled methods'
24
+ task :debride do
25
+ sh 'bundle', 'exec', 'debride', '-w', '.debride_whitelist', 'lib/'
26
+ end
27
+
28
+ desc 'Audit dependencies for known vulnerabilities'
29
+ task :bundler_audit do
30
+ sh 'bundle', 'exec', 'bundler-audit', 'check', '--update'
31
+ end
32
+
33
+ desc 'Detect structural code duplication'
34
+ task :flay do
35
+ sh 'bundle', 'exec', 'flay', '--mass', '16', 'lib/'
36
+ end
37
+
38
+ desc 'Run all quality gates'
39
+ task quality: [:spec, :rubocop, :reek, :licenses, :debride, :bundler_audit, :fasterer, :flay]
40
+
41
+ task default: :quality
42
+
43
+ namespace :docs do
44
+ desc 'Update all documentation'
45
+ task :update do
46
+ require_relative 'lib/rosett_ai'
47
+ RosettAi::Thor::Tasks::Documentation.new.update
48
+ end
49
+
50
+ desc 'Check documentation status'
51
+ task :status do
52
+ require_relative 'lib/rosett_ai'
53
+ RosettAi::Thor::Tasks::Documentation.new.status
54
+ end
55
+ end
56
+
57
+ namespace :man do
58
+ desc 'Build man pages from ronn source'
59
+ task :build do
60
+ require 'ronn'
61
+ source = File.expand_path('doc/man/rai.1.ronn', __dir__)
62
+ output_dir = File.expand_path('man/man1', __dir__)
63
+ FileUtils.mkdir_p(output_dir)
64
+
65
+ doc = Ronn::Document.new(source)
66
+ File.write(File.join(output_dir, 'rai.1'), doc.to_roff)
67
+ puts 'Generated man/man1/rai.1'
68
+ end
69
+ end
70
+
71
+ begin
72
+ require 'yard'
73
+ YARD::Rake::YardocTask.new(:yard) do |t|
74
+ t.files = ['lib/**/*.rb']
75
+ t.options = ['--output-dir', 'doc/api', '--markup', 'markdown', '--no-private']
76
+ end
77
+ rescue LoadError
78
+ desc 'Generate YARD documentation (yard gem not installed)'
79
+ task(:yard) { warn 'yard gem is not installed. Run: gem install yard' }
80
+ end
81
+
82
+ desc 'Generate CHANGELOG.md from conventional commits (requires git-cliff)'
83
+ task :changelog do
84
+ unless system('which git-cliff > /dev/null 2>&1')
85
+ warn 'git-cliff is not installed. See: https://git-cliff.org/docs/installation'
86
+ exit 1
87
+ end
88
+ system('git-cliff', '--config', 'cliff.toml', '--output', 'CHANGELOG.md') || exit(1)
89
+ puts 'Generated CHANGELOG.md'
90
+ end
91
+
92
+ desc 'Run fasterer performance suggestions'
93
+ task :fasterer do
94
+ require 'fasterer/cli'
95
+ Fasterer::CLI.execute
96
+ rescue LoadError
97
+ warn 'fasterer gem is not installed. Run: gem install fasterer'
98
+ end
99
+
100
+ namespace :behaviour do
101
+ desc 'Validate all behaviour files'
102
+ task :validate do
103
+ require_relative 'lib/rosett_ai'
104
+ RosettAi::Thor::Tasks::Behaviour.new.validate
105
+ end
106
+
107
+ desc 'List all behaviour files'
108
+ task :list do
109
+ require_relative 'lib/rosett_ai'
110
+ RosettAi::Thor::Tasks::Behaviour.new.list
111
+ end
112
+ end
113
+
114
+ namespace :build do
115
+ desc 'Build core .deb package (variant: core, gtk4, qt6)'
116
+ task :package, [:variant] do |_t, args|
117
+ require_relative 'lib/rosett_ai'
118
+ # Trigger Zeitwerk autoload of Build (which defines BuildPackage)
119
+ RosettAi::Thor::Tasks::Build # rubocop:disable Lint/Void
120
+ opts = build_package_opts(args)
121
+ RosettAi::Thor::Tasks::BuildPackage.new([], opts).invoke(:create)
122
+ end
123
+
124
+ desc 'Build engine plugin .deb package'
125
+ task :engine do
126
+ require_relative 'lib/rosett_ai'
127
+ RosettAi::Thor::Tasks::Build # rubocop:disable Lint/Void
128
+ RosettAi::Thor::Tasks::BuildEngine.new.invoke(:create)
129
+ end
130
+ end
131
+
132
+ # Build option flags from Rake args and environment variables.
133
+ # Usage:
134
+ # rake build:package # defaults
135
+ # rake build:package[gtk4] # variant only
136
+ # rake build:package VERBOSE=1 CLEAN=1 # flags via env
137
+ # rake build:package[gtk4] VERBOSE=1 CLEAN=1 # both
138
+ def build_package_opts(args)
139
+ opts = {}
140
+ opts[:variant] = args[:variant] if args[:variant]
141
+ opts[:verbose] = true if ENV['VERBOSE']
142
+ opts[:clean] = true if ENV['CLEAN']
143
+ opts[:ruby_version] = ENV['RUBY_VERSION'] if ENV['RUBY_VERSION']
144
+ opts[:architecture] = ENV['ARCHITECTURE'] if ENV['ARCHITECTURE']
145
+ opts[:output_dir] = ENV['OUTPUT_DIR'] if ENV['OUTPUT_DIR']
146
+ opts[:build_iteration] = ENV['BUILD_ITERATION'].to_i if ENV['BUILD_ITERATION']
147
+ opts
148
+ end
149
+
150
+ namespace :release do
151
+ desc 'Prepare release (level: major, minor, patch)'
152
+ task :prepare, [:level] do |_t, args|
153
+ require_relative 'lib/rosett_ai'
154
+ RosettAi::Thor::Tasks::Release.new.invoke(:prepare, [args[:level] || 'patch'])
155
+ end
156
+
157
+ desc 'Create annotated git tag from current VERSION'
158
+ task :tag do
159
+ require_relative 'lib/rosett_ai'
160
+ RosettAi::Thor::Tasks::Release.new.invoke(:tag)
161
+ end
162
+
163
+ desc 'Show release status (version, last tag, unreleased commits)'
164
+ task :status do
165
+ require_relative 'lib/rosett_ai'
166
+ RosettAi::Thor::Tasks::Release.new.invoke(:status)
167
+ end
168
+ end
169
+
170
+ namespace :readme do
171
+ desc 'Update README version, test count, and engine count from live sources'
172
+ task :update do
173
+ require_relative 'lib/rosett_ai/version'
174
+ require 'json'
175
+
176
+ readme_path = File.expand_path('README.md', __dir__)
177
+ content = File.read(readme_path)
178
+
179
+ # Version from constant
180
+ version = RosettAi::VERSION
181
+ content.gsub!(%r{<!-- rai:version -->.*?<!-- /rai:version -->},
182
+ "<!-- rai:version -->#{version}<!-- /rai:version -->")
183
+
184
+ # Test count via rspec --dry-run (COVERAGE=false suppresses SimpleCov noise in stdout)
185
+ env = { 'COVERAGE' => 'false' }
186
+ json_output = IO.popen(env, ['bundle', 'exec', 'rspec', '--dry-run', '--format', 'json'],
187
+ err: File::NULL, &:read)
188
+ test_count = JSON.parse(json_output).dig('summary', 'example_count')
189
+ content.gsub!(%r{<!-- rai:tests -->.*?<!-- /rai:tests -->},
190
+ "<!-- rai:tests -->#{test_count} RSpec specs<!-- /rai:tests -->")
191
+
192
+ # Engine count from target profiles
193
+ engine_count = Dir[File.expand_path('conf/targets/*.yml', __dir__)].size
194
+ content.gsub!(%r{<!-- rai:engines -->\d+<!-- /rai:engines -->},
195
+ "<!-- rai:engines -->#{engine_count}<!-- /rai:engines -->")
196
+
197
+ File.write(readme_path, content)
198
+ puts "README.md updated: v#{version}, #{test_count} specs, #{engine_count} engines"
199
+ end
200
+ end