rosett-ai 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. checksums.yaml +7 -0
  2. data/.ai-provenance.yml +119 -0
  3. data/.debride_whitelist +186 -0
  4. data/.fasterer.yml +29 -0
  5. data/.mdl_style.rb +10 -0
  6. data/.mdlrc +3 -0
  7. data/.mutant.yml +49 -0
  8. data/.namespace-allowlist +42 -0
  9. data/.reek.yml +1040 -0
  10. data/.rosett-ai/config.yml +3 -0
  11. data/.rspec +5 -0
  12. data/.rubocop.yml +380 -0
  13. data/.ruby-version +1 -0
  14. data/.yamllint +51 -0
  15. data/.yardopts +12 -0
  16. data/AI-DISCLOSURE.md +48 -0
  17. data/CHANGELOG.md +519 -0
  18. data/CLAUDE.md +141 -0
  19. data/CONTRIBUTING.md +734 -0
  20. data/INSTALL.md +154 -0
  21. data/LICENSE +674 -0
  22. data/LICENSE.md +675 -0
  23. data/QUICKSTART.md +73 -0
  24. data/README.md +366 -0
  25. data/Rakefile +200 -0
  26. data/SECURITY.md +114 -0
  27. data/bin/rai +1 -0
  28. data/cliff.toml +52 -0
  29. data/conf/adopt_redactions.yml +8 -0
  30. data/conf/behaviour/.gitkeep +0 -0
  31. data/conf/compliance/cra_rules.yml +25 -0
  32. data/conf/compliance/license_rules.yml +20 -0
  33. data/conf/design/aaif_alignment.yml +181 -0
  34. data/conf/design/ab_testing.yml +172 -0
  35. data/conf/design/accessibility.yml +84 -0
  36. data/conf/design/ai_authorship.yml +210 -0
  37. data/conf/design/ai_provenance.yml +224 -0
  38. data/conf/design/ai_tool_configuration.yml +207 -0
  39. data/conf/design/architecture.yml +139 -0
  40. data/conf/design/autocompletion.yml +115 -0
  41. data/conf/design/backward_compatibility.yml +112 -0
  42. data/conf/design/behaviour_composition.yml +246 -0
  43. data/conf/design/build_rake_extraction.yml +57 -0
  44. data/conf/design/ci_pipeline.yml +100 -0
  45. data/conf/design/claude_code_configuration.yml +157 -0
  46. data/conf/design/compiler.yml +128 -0
  47. data/conf/design/comply.yml +153 -0
  48. data/conf/design/content_packs.yml +84 -0
  49. data/conf/design/desktop_integration.yml +289 -0
  50. data/conf/design/distribution.yml +216 -0
  51. data/conf/design/doctor.yml +184 -0
  52. data/conf/design/documentation.yml +152 -0
  53. data/conf/design/engine_architecture.yml +257 -0
  54. data/conf/design/error_handling.yml +103 -0
  55. data/conf/design/feature_flags.yml +142 -0
  56. data/conf/design/git_hooks.yml +165 -0
  57. data/conf/design/gui_plugins.yml +475 -0
  58. data/conf/design/i18n.yml +84 -0
  59. data/conf/design/integration_testing.yml +56 -0
  60. data/conf/design/licensing_system.yml +88 -0
  61. data/conf/design/lifecycle_management.yml +208 -0
  62. data/conf/design/mcp_integration.yml +207 -0
  63. data/conf/design/mcp_settings.yml +126 -0
  64. data/conf/design/migration.yml +56 -0
  65. data/conf/design/monitoring_observability.yml +194 -0
  66. data/conf/design/namespace_cleanup.yml +145 -0
  67. data/conf/design/plugin_test_segregation.yml +145 -0
  68. data/conf/design/policy_management.yml +229 -0
  69. data/conf/design/project_management.yml +183 -0
  70. data/conf/design/rai_mcp_asset_discovery.yml +164 -0
  71. data/conf/design/rai_mcp_server.yml +605 -0
  72. data/conf/design/release_management.yml +117 -0
  73. data/conf/design/retrofit.yml +199 -0
  74. data/conf/design/retrospective_analyzer.yml +79 -0
  75. data/conf/design/scope_hierarchy.yml +352 -0
  76. data/conf/design/security.yml +115 -0
  77. data/conf/design/session_retrospective.yml +85 -0
  78. data/conf/design/smart_ui_feedback.yml +89 -0
  79. data/conf/design/structured_logging.yml +148 -0
  80. data/conf/design/styles.yml +123 -0
  81. data/conf/design/test_peer_review.yml +89 -0
  82. data/conf/design/testing.yml +136 -0
  83. data/conf/design/threat_model.yml +108 -0
  84. data/conf/design/ui_framework.yml +111 -0
  85. data/conf/design/usage_optimization.yml +122 -0
  86. data/conf/design/version_management.yml +60 -0
  87. data/conf/design/workflow.yml +227 -0
  88. data/conf/mcp/server_defaults.yml +42 -0
  89. data/conf/mcp/trust.yml +21 -0
  90. data/conf/packaging/core.yml +12 -0
  91. data/conf/packaging/gtk4.yml +11 -0
  92. data/conf/packaging/qt6.yml +11 -0
  93. data/conf/policy/default_deny_list.yml +197 -0
  94. data/conf/review/cli-command-audit.yml +857 -0
  95. data/conf/review/design-docs.yml +1064 -0
  96. data/conf/review/design-questionnaire.yml +153 -0
  97. data/conf/review/questionnaire.yml +146 -0
  98. data/conf/review/rosett-ai-core.yml +2919 -0
  99. data/conf/schemas/ai_config_schema.json +73 -0
  100. data/conf/schemas/behaviour_schema.json +132 -0
  101. data/conf/schemas/compliance_rule_schema.json +63 -0
  102. data/conf/schemas/content_pack_manifest_schema.json +51 -0
  103. data/conf/schemas/design_schema.json +210 -0
  104. data/conf/schemas/engine_manifest_schema.json +144 -0
  105. data/conf/schemas/lockfile_schema.json +74 -0
  106. data/conf/schemas/mcp_server_schema.json +48 -0
  107. data/conf/schemas/packaging_schema.json +70 -0
  108. data/conf/schemas/policy_schema.json +85 -0
  109. data/conf/schemas/provenance_schema.json +84 -0
  110. data/conf/schemas/rai_config_schema.json +56 -0
  111. data/conf/schemas/rai_project_schema.json +20 -0
  112. data/conf/schemas/scope_hierarchy_schema.json +49 -0
  113. data/conf/schemas/target_schema.json +67 -0
  114. data/conf/schemas/tooling_schema.json +65 -0
  115. data/conf/schemas/workflow_schema.json +112 -0
  116. data/conf/targets/agents_md.yml +17 -0
  117. data/conf/targets/claude.yml +12 -0
  118. data/conf/tooling/tools.yml +58 -0
  119. data/dist/rosett-ai-mcp.service +48 -0
  120. data/dist/rosett-ai-mcp.yml.default +45 -0
  121. data/doc/AAIF_POSITIONING.md +58 -0
  122. data/doc/ADOPT.md +224 -0
  123. data/doc/AI_PROVENANCE.md +139 -0
  124. data/doc/ARCHITECTURE.md +920 -0
  125. data/doc/BEHAVIOUR.md +409 -0
  126. data/doc/BUILD.md +138 -0
  127. data/doc/CI_CD_RECIPES.md +171 -0
  128. data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
  129. data/doc/COMMAND_ANALYSIS.md +229 -0
  130. data/doc/CONFIGURATION.md +281 -0
  131. data/doc/DESIGN_AUDIT.md +235 -0
  132. data/doc/DESIGN_PEER_REVIEW.md +771 -0
  133. data/doc/DESKTOP.md +447 -0
  134. data/doc/ENGINES.md +567 -0
  135. data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
  136. data/doc/FEATURE_AUDIT.md +218 -0
  137. data/doc/IMPLEMENTATION_PLAN.md +669 -0
  138. data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
  139. data/doc/MIGRATION_GUIDE.md +88 -0
  140. data/doc/PACKAGING.md +232 -0
  141. data/doc/PROJECT_DASHBOARD.md +153 -0
  142. data/doc/PULP_DEPLOYMENT.md +164 -0
  143. data/doc/QUALITY_FIX_SUMMARY.md +110 -0
  144. data/doc/QUICK_START.md +162 -0
  145. data/doc/REEK_CONFIGURATION.md +166 -0
  146. data/doc/REFERENCE.md +253 -0
  147. data/doc/REFERENCES.md +324 -0
  148. data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
  149. data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
  150. data/doc/SETUP.md +202 -0
  151. data/doc/TEST_PEER_REVIEW.md +152 -0
  152. data/doc/THREAT_MODEL.md +230 -0
  153. data/doc/USAGE.md +545 -0
  154. data/doc/USER_MANUAL.md +585 -0
  155. data/doc/ai_test_review_checklist.md +110 -0
  156. data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
  157. data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
  158. data/doc/changes/2026-02-20-security-implementation.md +281 -0
  159. data/doc/changes/2026-02-20-styles-implementation.md +220 -0
  160. data/doc/changes/2026-02-21-architecture-completion.md +95 -0
  161. data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
  162. data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
  163. data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
  164. data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
  165. data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
  166. data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
  167. data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
  168. data/doc/changes/2026-02-21-path-resolver.md +128 -0
  169. data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
  170. data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
  171. data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
  172. data/doc/context/SESSION-HANDOFF.md +69 -0
  173. data/doc/context/ai-engine-usage-trends-2026.md +80 -0
  174. data/doc/context/plan-pluggable-engines.md +590 -0
  175. data/doc/decisions/001-flog-deferred.md +32 -0
  176. data/doc/decisions/002-path-resolution-strategy.md +158 -0
  177. data/doc/decisions/003-ui-adapter-selection.md +193 -0
  178. data/doc/decisions/004-design-document-validation.md +179 -0
  179. data/doc/decisions/005-package-splitting-strategy.md +200 -0
  180. data/doc/decisions/006-multi-engine-architecture.md +147 -0
  181. data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
  182. data/doc/decisions/008-ci-bundler-strategy.md +129 -0
  183. data/doc/decisions/009-core-only-v1-release.md +60 -0
  184. data/doc/decisions/010-engine-debian-packaging.md +66 -0
  185. data/doc/decisions/011-context-aware-cli.md +71 -0
  186. data/doc/dependency_decisions.yml +247 -0
  187. data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
  188. data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
  189. data/doc/issues/003-smoke-test-false-positive.md +127 -0
  190. data/doc/issues/004-market-research-design-updates.md +109 -0
  191. data/doc/issues/005-compile-scope-coexistence.md +161 -0
  192. data/doc/locales/.gitkeep +0 -0
  193. data/doc/man/rai.1.ronn +505 -0
  194. data/doc/operations/packaging.md +133 -0
  195. data/doc/operations/rosett-ai-release.md +65 -0
  196. data/doc/reference/error-catalog.md +107 -0
  197. data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
  198. data/doc/reference/src/Pictures/cover.jpg +0 -0
  199. data/doc/reference/src/Pictures/head1.jpg +0 -0
  200. data/doc/reference/src/Pictures/head2.jpg +0 -0
  201. data/doc/reference/src/Pictures/head3.jpg +0 -0
  202. data/doc/reference/src/Pictures/head4.jpg +0 -0
  203. data/doc/reference/src/Pictures/head5.jpg +0 -0
  204. data/doc/reference/src/Pictures/head6.jpg +0 -0
  205. data/doc/reference/src/Pictures/head7.jpg +0 -0
  206. data/doc/reference/src/Pictures/head8.jpg +0 -0
  207. data/doc/reference/src/StyleInd.ist +4 -0
  208. data/doc/reference/src/bibliography.bib +79 -0
  209. data/doc/reference/src/main.tex +1288 -0
  210. data/doc/reference/src/structure.tex +303 -0
  211. data/doc/rosett-ai-bookmarks.html +301 -0
  212. data/kitchen.yml +46 -0
  213. data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
  214. data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
  215. data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
  216. data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
  217. data/lib/rosett_ai/ai_config/context_window.rb +55 -0
  218. data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
  219. data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
  220. data/lib/rosett_ai/ai_config/model_router.rb +121 -0
  221. data/lib/rosett_ai/ai_config/validator.rb +45 -0
  222. data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
  223. data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
  224. data/lib/rosett_ai/authorship/review_validator.rb +39 -0
  225. data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
  226. data/lib/rosett_ai/backup/compressor.rb +180 -0
  227. data/lib/rosett_ai/backup/destination.rb +91 -0
  228. data/lib/rosett_ai/behaviour/manager.rb +156 -0
  229. data/lib/rosett_ai/compiler/backend.rb +86 -0
  230. data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
  231. data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
  232. data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
  233. data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
  234. data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
  235. data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
  236. data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
  237. data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
  238. data/lib/rosett_ai/compiler/target_profile.rb +112 -0
  239. data/lib/rosett_ai/completion/generator.rb +101 -0
  240. data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
  241. data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
  242. data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
  243. data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
  244. data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
  245. data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
  246. data/lib/rosett_ai/comply/reporter.rb +113 -0
  247. data/lib/rosett_ai/comply/runner.rb +50 -0
  248. data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
  249. data/lib/rosett_ai/composition/composer.rb +158 -0
  250. data/lib/rosett_ai/composition/composition_result.rb +64 -0
  251. data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
  252. data/lib/rosett_ai/composition/lockfile.rb +103 -0
  253. data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
  254. data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
  255. data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
  256. data/lib/rosett_ai/config/compile_result.rb +37 -0
  257. data/lib/rosett_ai/config/compiler.rb +13 -0
  258. data/lib/rosett_ai/config/domain_transformer.rb +13 -0
  259. data/lib/rosett_ai/config/key_map.rb +13 -0
  260. data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
  261. data/lib/rosett_ai/config/scope_router.rb +13 -0
  262. data/lib/rosett_ai/config/secret_resolver.rb +125 -0
  263. data/lib/rosett_ai/configuration.rb +119 -0
  264. data/lib/rosett_ai/content/content_client.rb +60 -0
  265. data/lib/rosett_ai/content/pack_installer.rb +117 -0
  266. data/lib/rosett_ai/content/pack_manifest.rb +50 -0
  267. data/lib/rosett_ai/content/pack_registry.rb +68 -0
  268. data/lib/rosett_ai/content_packs/manager.rb +50 -0
  269. data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
  270. data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
  271. data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
  272. data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
  273. data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
  274. data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
  275. data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
  276. data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
  277. data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
  278. data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
  279. data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
  280. data/lib/rosett_ai/dbus/service.rb +121 -0
  281. data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
  282. data/lib/rosett_ai/deprecation.rb +79 -0
  283. data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
  284. data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
  285. data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
  286. data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
  287. data/lib/rosett_ai/doctor/check.rb +92 -0
  288. data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
  289. data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
  290. data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
  291. data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
  292. data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
  293. data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
  294. data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
  295. data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
  296. data/lib/rosett_ai/doctor.rb +81 -0
  297. data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
  298. data/lib/rosett_ai/documentation/translator.rb +62 -0
  299. data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
  300. data/lib/rosett_ai/engines/detector.rb +63 -0
  301. data/lib/rosett_ai/engines/registry.rb +50 -0
  302. data/lib/rosett_ai/error_handler.rb +139 -0
  303. data/lib/rosett_ai/exit_codes.rb +76 -0
  304. data/lib/rosett_ai/feature_flags.rb +102 -0
  305. data/lib/rosett_ai/formatting.rb +33 -0
  306. data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
  307. data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
  308. data/lib/rosett_ai/git_hooks/installer.rb +175 -0
  309. data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
  310. data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
  311. data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
  312. data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
  313. data/lib/rosett_ai/init/config_file_writer.rb +24 -0
  314. data/lib/rosett_ai/init/directory_builder.rb +38 -0
  315. data/lib/rosett_ai/init/file_copier.rb +95 -0
  316. data/lib/rosett_ai/init/global_initializer.rb +28 -0
  317. data/lib/rosett_ai/init/local_initializer.rb +27 -0
  318. data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
  319. data/lib/rosett_ai/init/project_initializer.rb +38 -0
  320. data/lib/rosett_ai/licensing/license_key.rb +139 -0
  321. data/lib/rosett_ai/licensing/license_store.rb +64 -0
  322. data/lib/rosett_ai/licensing/license_validator.rb +60 -0
  323. data/lib/rosett_ai/licensing/tier.rb +42 -0
  324. data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
  325. data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
  326. data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
  327. data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
  328. data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
  329. data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
  330. data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
  331. data/lib/rosett_ai/mcp/governance.rb +160 -0
  332. data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
  333. data/lib/rosett_ai/mcp/instructions.rb +266 -0
  334. data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
  335. data/lib/rosett_ai/mcp/keyfile.rb +221 -0
  336. data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
  337. data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
  338. data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
  339. data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
  340. data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
  341. data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
  342. data/lib/rosett_ai/mcp/plugins.rb +143 -0
  343. data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
  344. data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
  345. data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
  346. data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
  347. data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
  348. data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
  349. data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
  350. data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
  351. data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
  352. data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
  353. data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
  354. data/lib/rosett_ai/mcp/response_helper.rb +46 -0
  355. data/lib/rosett_ai/mcp/security_logger.rb +60 -0
  356. data/lib/rosett_ai/mcp/server.rb +212 -0
  357. data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
  358. data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
  359. data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
  360. data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
  361. data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
  362. data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
  363. data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
  364. data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
  365. data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
  366. data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
  367. data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
  368. data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
  369. data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
  370. data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
  371. data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
  372. data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
  373. data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
  374. data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
  375. data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
  376. data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
  377. data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
  378. data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
  379. data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
  380. data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
  381. data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
  382. data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
  383. data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
  384. data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
  385. data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
  386. data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
  387. data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
  388. data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
  389. data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
  390. data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
  391. data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
  392. data/lib/rosett_ai/migration/detector.rb +117 -0
  393. data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
  394. data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
  395. data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
  396. data/lib/rosett_ai/package_manager/apt.rb +108 -0
  397. data/lib/rosett_ai/package_manager/base.rb +68 -0
  398. data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
  399. data/lib/rosett_ai/packaging/variant_config.rb +92 -0
  400. data/lib/rosett_ai/path_resolver.rb +115 -0
  401. data/lib/rosett_ai/plugins/contract.rb +43 -0
  402. data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
  403. data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
  404. data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
  405. data/lib/rosett_ai/plugins/registry.rb +150 -0
  406. data/lib/rosett_ai/policy/auditor.rb +41 -0
  407. data/lib/rosett_ai/policy/deny_list.rb +71 -0
  408. data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
  409. data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
  410. data/lib/rosett_ai/policy/protected_files.rb +47 -0
  411. data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
  412. data/lib/rosett_ai/policy/validator.rb +35 -0
  413. data/lib/rosett_ai/profiler.rb +79 -0
  414. data/lib/rosett_ai/project/drift_detector.rb +126 -0
  415. data/lib/rosett_ai/project/manager.rb +115 -0
  416. data/lib/rosett_ai/project/sync_manager.rb +138 -0
  417. data/lib/rosett_ai/project/template_applier.rb +105 -0
  418. data/lib/rosett_ai/project_context.rb +82 -0
  419. data/lib/rosett_ai/provenance/entry.rb +63 -0
  420. data/lib/rosett_ai/provenance/file_source.rb +32 -0
  421. data/lib/rosett_ai/provenance/source.rb +62 -0
  422. data/lib/rosett_ai/provenance/store.rb +153 -0
  423. data/lib/rosett_ai/provenance/tracker.rb +62 -0
  424. data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
  425. data/lib/rosett_ai/provenance/validator.rb +45 -0
  426. data/lib/rosett_ai/quorum/collector.rb +59 -0
  427. data/lib/rosett_ai/quorum/comparator.rb +81 -0
  428. data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
  429. data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
  430. data/lib/rosett_ai/rai_config.rb +107 -0
  431. data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
  432. data/lib/rosett_ai/retrofit/engine.rb +171 -0
  433. data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
  434. data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
  435. data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
  436. data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
  437. data/lib/rosett_ai/retrofit/scanner.rb +47 -0
  438. data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
  439. data/lib/rosett_ai/secrets_resolver.rb +71 -0
  440. data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
  441. data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
  442. data/lib/rosett_ai/structured_logger.rb +110 -0
  443. data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
  444. data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
  445. data/lib/rosett_ai/telemetry/provider.rb +26 -0
  446. data/lib/rosett_ai/telemetry/reporter.rb +144 -0
  447. data/lib/rosett_ai/telemetry.rb +47 -0
  448. data/lib/rosett_ai/text_sanitizer.rb +62 -0
  449. data/lib/rosett_ai/thor/cli.rb +269 -0
  450. data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
  451. data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
  452. data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
  453. data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
  454. data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
  455. data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
  456. data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
  457. data/lib/rosett_ai/thor/tasks/config.rb +265 -0
  458. data/lib/rosett_ai/thor/tasks/content.rb +193 -0
  459. data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
  460. data/lib/rosett_ai/thor/tasks/design.rb +258 -0
  461. data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
  462. data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
  463. data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
  464. data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
  465. data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
  466. data/lib/rosett_ai/thor/tasks/init.rb +259 -0
  467. data/lib/rosett_ai/thor/tasks/license.rb +120 -0
  468. data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
  469. data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
  470. data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
  471. data/lib/rosett_ai/thor/tasks/project.rb +260 -0
  472. data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
  473. data/lib/rosett_ai/thor/tasks/release.rb +314 -0
  474. data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
  475. data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
  476. data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
  477. data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
  478. data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
  479. data/lib/rosett_ai/tooling/version_checker.rb +35 -0
  480. data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
  481. data/lib/rosett_ai/ui/base.rb +46 -0
  482. data/lib/rosett_ai/ui/gtk4.rb +98 -0
  483. data/lib/rosett_ai/ui/kde.rb +40 -0
  484. data/lib/rosett_ai/ui/qt6.rb +40 -0
  485. data/lib/rosett_ai/ui/registry.rb +60 -0
  486. data/lib/rosett_ai/ui/tty_helper.rb +74 -0
  487. data/lib/rosett_ai/ui/tui.rb +59 -0
  488. data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
  489. data/lib/rosett_ai/validators/design_validator.rb +17 -0
  490. data/lib/rosett_ai/validators/schema_validator.rb +84 -0
  491. data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
  492. data/lib/rosett_ai/version.rb +8 -0
  493. data/lib/rosett_ai/version_consistency_checker.rb +129 -0
  494. data/lib/rosett_ai/workflow/audit_log.rb +86 -0
  495. data/lib/rosett_ai/workflow/engine.rb +142 -0
  496. data/lib/rosett_ai/workflow/manager.rb +82 -0
  497. data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
  498. data/lib/rosett_ai/workflow/step_runner.rb +61 -0
  499. data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
  500. data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
  501. data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
  502. data/lib/rosett_ai/yaml_loader.rb +78 -0
  503. data/lib/rosett_ai.rb +221 -0
  504. data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
  505. data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
  506. data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
  507. data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
  508. data/lib/rubocop/rosett_ai.rb +9 -0
  509. data/lib/scripts/generated/docker_hub_tags.rb +126 -0
  510. data/locales/.gitkeep +0 -0
  511. data/locales/ar.yml +579 -0
  512. data/locales/en.yml +571 -0
  513. data/locales/fr.yml +567 -0
  514. data/packaging/build-engine-deb.sh +81 -0
  515. data/packaging/scripts/postinst +17 -0
  516. data/packaging/scripts/postrm +19 -0
  517. data/packaging/scripts/prerm +10 -0
  518. data/packaging/wrapper.sh.template +38 -0
  519. data/rosett-ai.gemspec +63 -0
  520. data/rules/.gitkeep +0 -0
  521. data/scripts/publish/pulp_upload.sh +123 -0
  522. data/settings.json +29 -0
  523. data/share/applications/be.neatnerds.rosettai.desktop +29 -0
  524. data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
  525. data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
  526. data/share/templates/behaviour/criticalthinking.yml +69 -0
  527. metadata +810 -0
@@ -0,0 +1,669 @@
1
+ # Rosett-AI v1.0.0 Implementation Plan
2
+
3
+ Engine-agnostic architecture pivot and desktop integration.
4
+
5
+ Decisions captured in: `doc/decisions/007-engine-agnostic-pivot.md`
6
+ Design document: `conf/design/engine_architecture.yml`
7
+ Conversation transcript: `2026-02-26 Q&A session (9 questions, all resolved)`
8
+
9
+ Last updated: 2026-03-05 (v1.0.0 tagged)
10
+
11
+ ---
12
+
13
+ ## Table of Contents
14
+
15
+ 1. [Decision Summary](#1-decision-summary)
16
+ 2. [Progress Overview](#2-progress-overview)
17
+ 3. [Dependency Graph](#3-dependency-graph)
18
+ 4. [Phase Details](#4-phase-details)
19
+ 5. [Branch Naming Convention](#5-branch-naming-convention)
20
+ 6. [Engine Architecture Diagram](#6-engine-architecture-diagram)
21
+ 7. [Layer Separation Diagram](#7-layer-separation-diagram)
22
+ 8. [Manual Tasks](#8-manual-tasks)
23
+
24
+ ---
25
+
26
+ ## 1. Decision Summary
27
+
28
+ | # | Topic | Decision |
29
+ |---|-------|---------|
30
+ | Q1 | Naming | "Rosett-AI" (keep `rosett-ai` acronym) |
31
+ | Q2 | Generic layer | Strict separation; capability manifests with compile-time warnings |
32
+ | Q3 | Engine architecture | Option C: engine-as-namespace-directory, optional components |
33
+ | Q4 | Config compilation | Moves inside each engine; `--target` → `--engine`; configurable default; autodetection; quorum as separate module |
34
+ | Q5 | Output paths | XDG-compliant (`~/.config/rosett-ai/`); engines deploy to tool-native paths |
35
+ | Q6 | Adopt system | Local-only default; `--api` opt-in; quorum-capable; anthropic gem out of core |
36
+ | Q7 | Scope & phasing | 5 phases: restructure → AGENTS.md → Ollama+GPT-NeoX → Goose+Aider → Cursor+Copilot+Windsurf |
37
+ | Q8 | Migration | Incremental (3 sub-phases for Phase 0); version 1.0.0 |
38
+ | Q9 | Desktop priority | Engine Phase 0 first, then Desktop Phase 1 immediately after; parallel thereafter |
39
+ | Q10 | KDE KCM | Deferred indefinitely — C++/QML complexity outside Ruby stack |
40
+ | Q11 | Goose/Aider executors | Folded into Engine Phase 4 alongside Cursor/Copilot/Windsurf |
41
+ | Q12 | GlobalShortcuts | Remains in Desktop Phase 1 scope as known gap |
42
+
43
+ ---
44
+
45
+ ## 2. Progress Overview
46
+
47
+ ### Completed Phases
48
+
49
+ | Phase | Branch | Merged | Specs |
50
+ |-------|--------|--------|-------|
51
+ | Engine 0a — Rename + v1.0.0 | `engine/0a-rename-code-companion` | 2026-02-26 | 251 |
52
+ | Engine 0b — Engine directories | `engine/0b-engine-directories` | 2026-02-26 | 966 |
53
+ | Engine 0c — XDG + --engine + detectors | `engine/0c-xdg-engine-flag-detectors` | 2026-02-26 | 1017 |
54
+ | Desktop 1 — D-Bus service | `desktop/1-dbus-service` | 2026-02-27 | ~1030 |
55
+ | Engine 1 — AGENTS.md | `engine/1-agents-md` | 2026-02-27 | 1061 |
56
+ | Desktop 2 — GTK4 app | `desktop/2-gtk4-app` | 2026-02-27 | ~1080 |
57
+ | Engine 2 — Ollama + GPT-NeoX | `engine/2-ollama-gpt-neox` | 2026-02-27 | ~1100 |
58
+ | Engine 3 — Goose + Aider (compilation) | `engine/3-goose-aider` | 2026-02-28 | ~1200 |
59
+ | Consistency review | `refactor/consistency-review` | 2026-02-28 | 1382 |
60
+ | Engine 4 — Cursor + Copilot + Windsurf + executors | `engine/4-cursor-copilot-windsurf` | 2026-03-02 | 1491 |
61
+ | v1.0.0 Release prep | `release/v1.0.0-core` | 2026-03-04 | 1574 |
62
+
63
+ ### v1.0.0 Release Phases (2026-03-04)
64
+
65
+ | Phase | Branch | Scope |
66
+ |-------|--------|-------|
67
+ | Design | `design/operations-monitoring-optimization` | Operations domain, monitoring + optimization design docs |
68
+ | Test Quality | `test/quality-baseline` | SimpleCov thresholds, fixtures, Mutant subject expansion |
69
+ | CI Pipeline | `ci/release-pipeline` | Validation includes, core-only rspec, smoke test, release-cli pin |
70
+ | Documentation | `docs/v1-release-polish` | Man page, USAGE.md, ADR-009, INSTALL, CONTRIBUTING, REFERENCES |
71
+ | Release Prep | `release/v1.0.0-core` | Core-only gemspec, Zeitwerk ignore, desktop graceful degradation, CHANGELOG |
72
+ | Final | `chore/v1-release-final` | Security scan hardening, AI provenance, quality gate, tag |
73
+
74
+ ### Backfill Branches (all merged)
75
+
76
+ | Branch | Scope |
77
+ |--------|-------|
78
+ | `backfill/executor-normalize` | Executor interface normalization |
79
+ | `backfill/capability-checker` | Compile-time capability warnings |
80
+ | `backfill/quorum-module` | Quorum dispatcher, collector, comparator |
81
+ | `backfill/dbus-desktop` | D-Bus stop, StatusNotifierItem, GTK4 preferences |
82
+ | `documentation` | 40 Mermaid diagrams across doc/ |
83
+
84
+ ### Engine Delivery Matrix
85
+
86
+ | Engine | Backend | Detector | Executor | Config Adapter | Quorum |
87
+ |--------|---------|----------|----------|----------------|--------|
88
+ | Claude | done | done | done | done | done |
89
+ | Generic | done | N/A | N/A | N/A | N/A |
90
+ | AGENTS.md | done | done | N/A | N/A | N/A |
91
+ | Ollama | done | done | done | N/A | done |
92
+ | GPT-NeoX | done | done | done | N/A | done |
93
+ | Goose | done | done | done | N/A | done |
94
+ | Aider | done | done | done | N/A | done |
95
+ | Cursor | done | done | N/A | N/A | N/A |
96
+ | Copilot | done | done | N/A | N/A | N/A |
97
+ | Windsurf | done | done | N/A | N/A | N/A |
98
+
99
+ ### Remaining Work
100
+
101
+ | Phase | Status | Risk | Priority |
102
+ |-------|--------|------|----------|
103
+ | Desktop 1 — GlobalShortcuts gap | Known gap | Low | When needed |
104
+ | Desktop 3 — KDE KCM | **Deferred indefinitely** | High | Low |
105
+
106
+ ---
107
+
108
+ ## 3. Dependency Graph
109
+
110
+ ```mermaid
111
+ graph TD
112
+ E0a["Engine 0a<br/>Rename + v1.0.0<br/>&#9745; DONE"]
113
+ E0b["Engine 0b<br/>engines/ structure<br/>&#9745; DONE"]
114
+ E0c["Engine 0c<br/>XDG + --engine + detectors<br/>&#9745; DONE"]
115
+ D1["Desktop 1<br/>D-Bus service<br/>&#9745; DONE (1 gap)"]
116
+ E1["Engine 1<br/>AGENTS.md<br/>&#9745; DONE"]
117
+ D2["Desktop 2<br/>GTK4 app<br/>&#9745; DONE"]
118
+ E2["Engine 2<br/>Ollama + GPT-NeoX<br/>&#9745; DONE"]
119
+ E3["Engine 3<br/>Goose + Aider (compile)<br/>&#9745; DONE"]
120
+ E4["Engine 4<br/>Cursor + Copilot + Windsurf<br/>+ Goose/Aider executors<br/>&#9745; DONE"]
121
+ REL["v1.0.0 Release<br/>Core-only split<br/>&#9745; DONE"]
122
+ D3["Desktop 3<br/>KDE KCM<br/>DEFERRED"]
123
+
124
+ E0a --> E0b
125
+ E0b --> E0c
126
+ E0c --> D1
127
+ E0c --> E1
128
+ D1 --> D2
129
+ E1 --> E2
130
+ E2 --> E3
131
+ E3 --> E4
132
+ E4 --> REL
133
+
134
+ style E0a fill:#2ecc71,stroke:#333,color:#000
135
+ style E0b fill:#2ecc71,stroke:#333,color:#000
136
+ style E0c fill:#2ecc71,stroke:#333,color:#000
137
+ style D1 fill:#2ecc71,stroke:#333,color:#000
138
+ style D2 fill:#2ecc71,stroke:#333,color:#000
139
+ style E1 fill:#2ecc71,stroke:#333,color:#000
140
+ style E2 fill:#2ecc71,stroke:#333,color:#000
141
+ style E3 fill:#2ecc71,stroke:#333,color:#000
142
+ style E4 fill:#2ecc71,stroke:#333,color:#000
143
+ style D3 fill:#95a5a6,stroke:#333,color:#000
144
+ ```
145
+
146
+ Legend:
147
+
148
+ - Green: Completed
149
+ - Grey: Deferred indefinitely
150
+
151
+ ---
152
+
153
+ ## 4. Phase Details
154
+
155
+ ### Engine Phase 0a — Rename + Version Bump
156
+
157
+ | Field | Value |
158
+ |-------|-------|
159
+ | Branch | `engine/0a-rename-code-companion` |
160
+ | Status | **DONE** — merged to main |
161
+ | Tests | 251 examples, 0 failures |
162
+
163
+ **Scope**:
164
+
165
+ - [x] `rosett-ai.gemspec`: summary → "Rosett-AI", description updated
166
+ - [x] `CLAUDE.md`: header and overview table
167
+ - [x] `CONTRIBUTING.md`: header
168
+ - [x] `INSTALL.md`: header and references (no occurrences found)
169
+ - [x] `doc/*.md`: all "Claude Companion" → "Code Companion" references
170
+ - [x] `locales/en.yml`, `locales/fr.yml`, `locales/ar.yml`: product name strings (no occurrences found)
171
+ - [x] `lib/rosett_ai/version.rb`: bump to `1.0.0`
172
+ - [x] `CHANGELOG.md`: v1.0.0 entry
173
+ - [x] All CLI `desc` strings in `lib/rosett_ai/thor/tasks/*.rb` and `lib/rosett_ai/thor/cli.rb`
174
+ - [x] `cliff.toml`: header text
175
+
176
+ ---
177
+
178
+ ### Engine Phase 0b — Create Engine Directory Structure
179
+
180
+ | Field | Value |
181
+ |-------|-------|
182
+ | Branch | `engine/0b-engine-directories` |
183
+ | Status | **DONE** — merged to main |
184
+ | Tests | 966 examples, 0 failures |
185
+
186
+ **Scope**:
187
+
188
+ - [x] Create `lib/rosett_ai/engines/` directory
189
+ - [x] Create `lib/rosett_ai/engines/claude/` with:
190
+ - `backend.rb` (moved from `lib/rosett_ai/compiler/backends/claude_backend.rb`)
191
+ - `config_compiler.rb` (moved from `lib/rosett_ai/config/compiler.rb`)
192
+ - `key_map.rb` (moved from `lib/rosett_ai/config/key_map.rb`)
193
+ - `scope_router.rb` (moved from `lib/rosett_ai/config/scope_router.rb`)
194
+ - `domain_transformer.rb` (moved from `lib/rosett_ai/config/domain_transformer.rb`)
195
+ - `executor.rb` (extracted from `lib/rosett_ai/adopter/rule_adopter.rb` Anthropic API code)
196
+ - [x] Create `lib/rosett_ai/engines/generic/` with:
197
+ - `backend.rb` (moved from `lib/rosett_ai/compiler/backends/generic_backend.rb`)
198
+ - [x] Create `conf/engines/claude/manifest.yml` and `conf/engines/generic/manifest.yml`
199
+ - [x] Create `lib/rosett_ai/engines/registry.rb` (engine discovery from directories)
200
+ - [x] Update `lib/rosett_ai/compiler/backend.rb` to delegate to engines
201
+ - [x] Move `anthropic` gem from core `rosett-ai.gemspec` to `Gemfile` engines group
202
+ - [x] Update all `require` paths (Zeitwerk handles autoload automatically)
203
+ - [x] Move `conf/claude_code/*.yml` → `conf/engines/claude/config/`
204
+ - [x] Move `conf/schemas/claude_code_config_schema.json` → `conf/engines/claude/schemas/config_schema.json`
205
+ - [x] Move `conf/targets/claude.yml` → `conf/engines/claude/target.yml`
206
+ - [x] Move `conf/targets/generic.yml` → `conf/engines/generic/target.yml`
207
+ - [x] Keep backward-compatible aliases for one release cycle (deprecated, remove in v1.1.0)
208
+ - [x] Update all specs to new paths
209
+
210
+ ---
211
+
212
+ ### Engine Phase 0c — XDG Paths + --engine Flag + Detectors
213
+
214
+ | Field | Value |
215
+ |-------|-------|
216
+ | Branch | `engine/0c-xdg-engine-flag-detectors` |
217
+ | Status | **DONE** — merged to main |
218
+ | Tests | 1017 examples, 0 failures |
219
+
220
+ **Scope**:
221
+
222
+ - [x] Update `PathResolver` to use XDG paths (`~/.config/rosett-ai/`) as rosett-ai home
223
+ - [x] Engine-specific path resolution delegates to each engine's `path_resolver.rb`
224
+ - [x] Rename `--target` to `--engine` in `lib/rosett_ai/thor/tasks/compile.rb`
225
+ - [x] Keep `--target` as deprecated alias (emit warning, remove in v1.1.0)
226
+ - [x] Create engine detector framework:
227
+ - `lib/rosett_ai/engines/detector.rb` (base class, reads manifest detection rules)
228
+ - `lib/rosett_ai/engines/claude/detector.rb` (checks `which claude`, `~/.claude/` exists)
229
+ - [x] Create `bin/raictl engines` CLI subcommand:
230
+ - `engines list` — show all known engines
231
+ - `engines detect` — probe system, report installed tools
232
+ - `engines status` — detected + configured + default
233
+ - [x] Create `~/.config/rosett-ai/config.yml` schema and loader (default engine, etc.)
234
+ - [x] Update `bin/raictl init` to suggest default engine based on autodetection
235
+ - [x] Update adopt to default to `--local` (remove Anthropic API as default path)
236
+ - [x] Add `--api` flag to adopt, wire to engine executor
237
+ - [x] Add `--strict` flag to compile (warnings → errors)
238
+ - [x] Create `conf/schemas/engine_manifest_schema.json` for manifest validation
239
+ - [x] Update CLAUDE.md CLI Usage section
240
+ - [x] Update man page `doc/man/rai.1.ronn`
241
+
242
+ ---
243
+
244
+ ### Desktop Phase 1 — D-Bus Service Foundation
245
+
246
+ | Field | Value |
247
+ |-------|-------|
248
+ | Branch | `desktop/1-dbus-service` |
249
+ | Status | **DONE** — merged to main (1 known gap: GlobalShortcuts) |
250
+ | Tests | D-Bus service specs, integration tests with dbus-daemon |
251
+
252
+ **Scope**: As defined in `conf/design/desktop_integration.yml` Phase 1:
253
+
254
+ - [x] `be.neatnerds.rosettai` D-Bus session bus service (ruby-dbus)
255
+ - [x] `be.neatnerds.rosettai.Manager` interface (Compile, SwitchContext, GetStatus, Shutdown, SetConfig, Version, ListEngines)
256
+ - [x] `be.neatnerds.rosettai.FocusMonitor` interface (GetCurrentFocus, FocusChanged signal)
257
+ - [x] StatusNotifierItem for system tray (`org.kde.StatusNotifierItem`)
258
+ - [x] FocusMonitor with compositor adapters (GNOME, KWin, sway, i3, Hyprland, X11)
259
+ - [ ] GlobalShortcuts portal registration (XDG portal `org.freedesktop.portal.GlobalShortcuts`) — **known gap, to be addressed**
260
+ - [x] CLI: `bin/raictl dbus start` to start service
261
+ - [x] CLI: `bin/raictl dbus stop` to stop service
262
+ - [x] CLI: `bin/raictl dbus status` to check service state
263
+ - [x] D-Bus service auto-activation `.service` file
264
+ - [x] Introspection XML for all interfaces
265
+ - [x] Graceful degradation if D-Bus session bus unavailable
266
+ - [x] Engine selector: Manager.Compile accepts engine parameter
267
+ - [x] Add `ruby-dbus` to gemspec (core dependency — D-Bus is transport, not engine-specific)
268
+
269
+ ---
270
+
271
+ ### Engine Phase 1 — AGENTS.md Engine
272
+
273
+ | Field | Value |
274
+ |-------|-------|
275
+ | Branch | `engine/1-agents-md` |
276
+ | Status | **DONE** — merged to main |
277
+ | Tests | 1061 examples, 0 failures |
278
+
279
+ **Scope**:
280
+
281
+ - [x] Create `lib/rosett_ai/engines/agents_md/`
282
+ - `backend.rb` — compile behaviour YAML to AGENTS.md format
283
+ - `manifest.yml` — capabilities (no settings, no executor)
284
+ - `detector.rb` — check for existing AGENTS.md in project root
285
+ - `validator.rb` — validate output against AGENTS.md spec
286
+ - [x] Create `conf/engines/agents_md/` (engine config, if any)
287
+ - [x] `bin/raictl compile --engine agents_md` produces valid AGENTS.md
288
+ - [x] Capability warnings for features AGENTS.md doesn't support
289
+ - [x] Specs and integration tests
290
+
291
+ ---
292
+
293
+ ### Desktop Phase 2 — GTK4 App (rosett-ai-gtk4)
294
+
295
+ | Field | Value |
296
+ |-------|-------|
297
+ | Branch | `desktop/2-gtk4-app` |
298
+ | Status | **DONE** — merged to main |
299
+ | Tests | GTK4 app specs, preferences dialog specs |
300
+
301
+ **Scope**: As defined in `conf/design/desktop_integration.yml` Phase 2.
302
+
303
+ **Delivered**:
304
+
305
+ - [x] `lib/rosett_ai/desktop/gtk4_app.rb` — main GTK4/Adwaita application window
306
+ - [x] `lib/rosett_ai/desktop/gtk4_preferences.rb` — preferences dialog with dynamic engine list
307
+ - [x] `lib/rosett_ai/desktop/dbus_client.rb` — D-Bus client for GUI ↔ service communication
308
+ - [x] `lib/rosett_ai/desktop/gui_logger.rb` — crash-proof GUI logging
309
+ - [x] `lib/rosett_ai/ui/gtk4.rb` — GTK4 UI adapter (tables, spinners, prompts)
310
+ - [x] CLI: `bin/raictl desktop gtk4` launches the application
311
+ - [x] GNOME HIG instant-apply preferences pattern
312
+ - [x] Graceful degradation if libadwaita/gtk4 gems unavailable
313
+
314
+ ---
315
+
316
+ ### Engine Phase 2 — Ollama + GPT-NeoX Engines
317
+
318
+ | Field | Value |
319
+ |-------|-------|
320
+ | Branch | `engine/2-ollama-gpt-neox` |
321
+ | Status | **DONE** — merged to main |
322
+ | Tests | Executor specs with mocked HTTP endpoints |
323
+
324
+ **Scope**:
325
+
326
+ - [x] Create `lib/rosett_ai/engines/ollama/`
327
+ - `detector.rb` — check `which ollama`, probe localhost:11434
328
+ - `executor.rb` — Ollama native API (`/api/generate`) + `analyze` method
329
+ - `backend.rb` — inherits from Generic backend
330
+ - `manifest.yml` — execution metadata, compilation via Generic backend
331
+ - `target.yml` — target profile for compilation
332
+ - [x] Create `lib/rosett_ai/engines/gpt_neox/`
333
+ - `detector.rb` — check for vLLM/TGI endpoint (configurable)
334
+ - `executor.rb` — OpenAI-compatible API, NeoX-specific params + `analyze` method
335
+ - `backend.rb` — inherits from Generic backend
336
+ - `manifest.yml` — independent from Ollama
337
+ - `target.yml` — target profile for compilation
338
+ - [x] Create `lib/rosett_ai/quorum/` module (initial implementation):
339
+ - `dispatcher.rb` — send adopt analysis to N engines in parallel (Thread-based)
340
+ - `collector.rb` — gather responses, normalize to common format
341
+ - `comparator.rb` — compare structured findings, cross-engine promotion
342
+ - `strategies/adopt.rb` — adopt-specific consensus orchestration
343
+ - [x] `lib/rosett_ai/adopter/executor_resolver.rb` — manifest-driven executor kwargs
344
+ - [x] `lib/rosett_ai/compiler/capability_checker.rb` — compile-time capability gap warnings
345
+ - [x] `bin/raictl adopt --api --quorum` works with local engines
346
+ - [x] Specs with mocked endpoints and quorum integration tests
347
+
348
+ ---
349
+
350
+ ### Engine Phase 3 — Goose + Aider Engines (Compilation)
351
+
352
+ | Field | Value |
353
+ |-------|-------|
354
+ | Branch | `engine/3-goose-aider` |
355
+ | Status | **DONE** — merged to main |
356
+ | Tests | Backend and detector specs for both engines |
357
+
358
+ **Scope** (compilation-focused — executors deferred to Phase 4):
359
+
360
+ - [x] Create `lib/rosett_ai/engines/goose/`
361
+ - `backend.rb` — compile behaviour YAML to `.goosehints` format
362
+ - `detector.rb` — check `which goose`, `~/.config/goose/` exists
363
+ - `manifest.yml` — compilation capabilities
364
+ - `target.yml` — target profile
365
+ - [x] Create `lib/rosett_ai/engines/aider/`
366
+ - `backend.rb` — compile behaviour YAML to `CONVENTIONS.md` format
367
+ - `detector.rb` — check `which aider`, `~/.aider.conf.yml` exists
368
+ - `manifest.yml` — compilation capabilities
369
+ - `target.yml` — target profile
370
+ - [x] Register both engines in `lib/rosett_ai/engines/registry.rb` (7 at time; expanded to 10 in Phase 4)
371
+ - [x] Cross-engine marker rejection tests
372
+ - [x] `bin/raictl compile --engine goose` produces `.goosehints`
373
+ - [x] `bin/raictl compile --engine aider` produces `CONVENTIONS.md`
374
+
375
+ **Deferred to Phase 4**: Goose/Aider executors, config adapters, quorum participation.
376
+
377
+ ---
378
+
379
+ ### Consistency Review
380
+
381
+ | Field | Value |
382
+ |-------|-------|
383
+ | Branch | `refactor/consistency-review` |
384
+ | Status | **DONE** — merged to main |
385
+ | Tests | 1382 examples, 0 failures |
386
+
387
+ Post-Engine-3 architectural review addressing 9 findings:
388
+
389
+ - [x] render() signature: category moved into data hash
390
+ - [x] Marker standardization: all engines use `<!-- rosett-ai-{engine}-managed -->`
391
+ - [x] Ollama/GPT-NeoX added to BACKENDS hash + target profiles
392
+ - [x] Capability warnings aggregated per-feature instead of per-file
393
+ - [x] Executor API key guard with `--local` hint
394
+ - [x] Bullet-list local analysis for AGENTS.md format rules
395
+ - [x] D-Bus ListEngines method with dynamic GTK4 engine combo
396
+ - [x] Documentation updated for engines (7 at time of review, later expanded to 10)
397
+
398
+ ---
399
+
400
+ ### Engine Phase 4 — Cursor + Copilot + Windsurf + Goose/Aider Executors
401
+
402
+ | Field | Value |
403
+ |-------|-------|
404
+ | Branch | `engine/4-cursor-copilot-windsurf` |
405
+ | Status | **DONE** — merged to main |
406
+ | Tests | 1491 examples, 0 failures, 5 pending |
407
+
408
+ **Scope — New compilation-only engines**:
409
+
410
+ - [x] Create `lib/rosett_ai/engines/cursor/` (backend, detector, manifest)
411
+ - Output: `.cursorrules` in project root
412
+ - Detector: check for `cursor` binary, `~/.cursor/` directory
413
+ - [x] Create `lib/rosett_ai/engines/copilot/` (backend, detector, manifest)
414
+ - Output: `.github/copilot-instructions.md`
415
+ - Detector: check for `.github/` config directory
416
+ - [x] Create `lib/rosett_ai/engines/windsurf/` (backend, detector, manifest)
417
+ - Output: `.windsurfrules` in project root
418
+ - Detector: check for `windsurf` binary
419
+ - [x] All three are non-invocable (no executor) — compilation only
420
+ - [x] Register in BACKENDS hash (10 total) and update target_schema.json
421
+ - [x] Update `bin/raictl engines list` to show all 10 engines
422
+
423
+ **Scope — Goose/Aider executor support** (folded from Phase 3):
424
+
425
+ - [x] Create `lib/rosett_ai/engines/goose/executor.rb` — CLI subprocess executor (`Open3.capture3`)
426
+ - [x] Create `lib/rosett_ai/engines/aider/executor.rb` — CLI subprocess executor (`Open3.capture3`)
427
+ - [x] New `api_type: cli` category in engine manifests for subprocess-based executors
428
+ - [x] Enable quorum participation for both engines
429
+ - [x] Update manifests to declare executor capability
430
+
431
+ **Scope — Shared**:
432
+
433
+ - [x] Update `engine_manifest_schema.json` — `api_type: cli` + `cli_binary`
434
+ - [x] Update `target_schema.json` — backend enum includes cursor, copilot, windsurf
435
+ - [x] ExecutorResolver CLI branch — `binary:` kwarg for cli-type executors
436
+ - [x] Specs for all new backends, detectors, and executors
437
+
438
+ ---
439
+
440
+ ### Desktop Phase 3 — KDE KCM Module (rosett-ai-kde) — DEFERRED
441
+
442
+ | Field | Value |
443
+ |-------|-------|
444
+ | Branch | `desktop/3-kde-kcm` |
445
+ | Status | **Deferred indefinitely** |
446
+ | Reason | C++/QML falls outside the Ruby stack; high risk, low priority |
447
+
448
+ This phase requires KDE Frameworks and a compiled C++/QML KCM module, which
449
+ is architecturally different from the rest of rosett-ai. Placeholder UI adapters
450
+ exist in `lib/rosett_ai/ui/kde.rb` and `lib/rosett_ai/ui/qt6.rb` for future use.
451
+
452
+ The D-Bus service (`be.neatnerds.rosettai`) provides a stable IPC contract
453
+ that any future KDE integration can consume without changes to rosett-ai core.
454
+
455
+ ---
456
+
457
+ ## 5. Branch Naming Convention
458
+
459
+ ```text
460
+ # Completed
461
+ engine/0a-rename-code-companion
462
+ engine/0b-engine-directories
463
+ engine/0c-xdg-engine-flag-detectors
464
+ engine/1-agents-md
465
+ engine/2-ollama-gpt-neox
466
+ engine/3-goose-aider
467
+ desktop/1-dbus-service
468
+ desktop/2-gtk4-app
469
+ backfill/executor-normalize
470
+ backfill/capability-checker
471
+ backfill/quorum-module
472
+ backfill/dbus-desktop
473
+ documentation
474
+ refactor/consistency-review
475
+
476
+ # Engine Phase 4
477
+ engine/4-cursor-copilot-windsurf
478
+ ```
479
+
480
+ Each branch merges to `main` via MR. No long-lived feature branches.
481
+ Each MR must pass all CI gates before merge.
482
+
483
+ Backfill branches address gaps from earlier phases discovered before
484
+ starting the next major phase. They branch from the last completed
485
+ engine phase and merge back to main.
486
+
487
+ ---
488
+
489
+ ## 6. Engine Architecture Diagram
490
+
491
+ ```mermaid
492
+ graph TB
493
+ subgraph "Generic Layer (Human Intent)"
494
+ B["conf/behaviour/*.yml"]
495
+ D["conf/design/*.yml"]
496
+ S["conf/schemas/*.json"]
497
+ end
498
+
499
+ subgraph "Engine Registry"
500
+ R["lib/rosett_ai/engines/registry.rb"]
501
+ end
502
+
503
+ subgraph "Engines (10 total)"
504
+ subgraph "Claude Engine"
505
+ CB["backend.rb"]
506
+ CC["config_adapter.rb"]
507
+ CD["detector.rb"]
508
+ CE["executor.rb"]
509
+ CM["manifest.yml"]
510
+ end
511
+ subgraph "AGENTS.md Engine"
512
+ AB["backend.rb"]
513
+ AD["detector.rb"]
514
+ AM["manifest.yml"]
515
+ end
516
+ subgraph "Goose Engine"
517
+ GB["backend.rb"]
518
+ GD["detector.rb"]
519
+ GE["executor.rb"]
520
+ GM["manifest.yml"]
521
+ end
522
+ subgraph "Aider Engine"
523
+ IB["backend.rb"]
524
+ ID["detector.rb"]
525
+ IE["executor.rb"]
526
+ IM["manifest.yml"]
527
+ end
528
+ subgraph "Ollama Engine"
529
+ OD["detector.rb"]
530
+ OE["executor.rb"]
531
+ OM["manifest.yml"]
532
+ end
533
+ subgraph "GPT-NeoX Engine"
534
+ ND["detector.rb"]
535
+ NE["executor.rb"]
536
+ NM["manifest.yml"]
537
+ end
538
+ subgraph "Cursor Engine"
539
+ UB["backend.rb"]
540
+ UD["detector.rb"]
541
+ UM["manifest.yml"]
542
+ end
543
+ subgraph "Copilot Engine"
544
+ PB["backend.rb"]
545
+ PD["detector.rb"]
546
+ PM["manifest.yml"]
547
+ end
548
+ subgraph "Windsurf Engine"
549
+ WB["backend.rb"]
550
+ WD["detector.rb"]
551
+ WM["manifest.yml"]
552
+ end
553
+ end
554
+
555
+ subgraph "Quorum Module"
556
+ QD["dispatcher.rb"]
557
+ QC["comparator.rb"]
558
+ end
559
+
560
+ subgraph "Output (Tool-Native Paths)"
561
+ O1["~/.claude/rules/*.md"]
562
+ O2["./AGENTS.md"]
563
+ O3["(quorum results)"]
564
+ O4["./.cursorrules"]
565
+ O5["./.goosehints"]
566
+ O6["./CONVENTIONS.md"]
567
+ O7[".github/copilot-instructions.md"]
568
+ O8["./.windsurfrules"]
569
+ end
570
+
571
+ B --> R
572
+ D --> R
573
+ R --> CB --> O1
574
+ R --> CC
575
+ R --> AB --> O2
576
+ R --> GB --> O5
577
+ R --> IB --> O6
578
+ R --> UB --> O4
579
+ R --> PB --> O7
580
+ R --> WB --> O8
581
+ CE --> QD
582
+ GE --> QD
583
+ IE --> QD
584
+ OE --> QD
585
+ NE --> QD
586
+ QD --> QC --> O3
587
+
588
+ style B fill:#f9f,stroke:#333
589
+ style D fill:#f9f,stroke:#333
590
+ style S fill:#f9f,stroke:#333
591
+ style R fill:#ffd700,stroke:#333
592
+ style QD fill:#ff6347,stroke:#333
593
+ style QC fill:#ff6347,stroke:#333
594
+ ```
595
+
596
+ ---
597
+
598
+ ## 7. Layer Separation Diagram
599
+
600
+ ```mermaid
601
+ graph LR
602
+ subgraph "Layer 1: Human Intent"
603
+ direction TB
604
+ L1A["Behaviour YAML<br/>(rules, ethics, workflows)"]
605
+ L1B["Design YAML<br/>(architecture, constraints)"]
606
+ L1C["Schemas JSON<br/>(validation)"]
607
+ end
608
+
609
+ subgraph "Layer 2: Engine Translation"
610
+ direction TB
611
+ L2A["Engine Backend<br/>(compile)"]
612
+ L2B["Config Adapter<br/>(settings)"]
613
+ L2C["Path Resolver<br/>(where to write)"]
614
+ end
615
+
616
+ subgraph "Layer 3: Tool-Native Output"
617
+ direction TB
618
+ L3A["CLAUDE.md + rules/"]
619
+ L3B["settings.json"]
620
+ L3C[".cursorrules"]
621
+ L3D["AGENTS.md"]
622
+ L3E[".goosehints"]
623
+ L3F["CONVENTIONS.md"]
624
+ L3G["copilot-instructions.md"]
625
+ L3H[".windsurfrules"]
626
+ end
627
+
628
+ L1A --> L2A
629
+ L1B --> L2A
630
+ L2A --> L2C
631
+ L2B --> L2C
632
+ L2C --> L3A
633
+ L2C --> L3B
634
+ L2C --> L3C
635
+ L2C --> L3D
636
+ L2C --> L3E
637
+ L2C --> L3F
638
+ L2C --> L3G
639
+ L2C --> L3H
640
+
641
+ style L1A fill:#e6f3ff,stroke:#333
642
+ style L1B fill:#e6f3ff,stroke:#333
643
+ style L1C fill:#e6f3ff,stroke:#333
644
+ style L2A fill:#fff3e6,stroke:#333
645
+ style L2B fill:#fff3e6,stroke:#333
646
+ style L2C fill:#fff3e6,stroke:#333
647
+ style L3A fill:#e6ffe6,stroke:#333
648
+ style L3B fill:#e6ffe6,stroke:#333
649
+ style L3C fill:#e6ffe6,stroke:#333
650
+ style L3D fill:#e6ffe6,stroke:#333
651
+ style L3E fill:#e6ffe6,stroke:#333
652
+ style L3F fill:#e6ffe6,stroke:#333
653
+ style L3G fill:#e6ffe6,stroke:#333
654
+ style L3H fill:#e6ffe6,stroke:#333
655
+ ```
656
+
657
+ ---
658
+
659
+ ## 8. Manual Tasks
660
+
661
+ These tasks require human action outside the codebase:
662
+
663
+ | Task | Owner | When | Status |
664
+ |------|-------|------|--------|
665
+ | Update GitLab project description (remove "Claude", reflect "Code Companion") | hugo | After Engine 0a merges | Done |
666
+ | Configure GitLab CI runners for D-Bus integration tests | hugo | Before Desktop 1 | Verify |
667
+ | Register `be.neatnerds.rosettai` bus name with freedesktop.org (optional) | hugo | Before Desktop 1 release | Pending |
668
+ | Set up APT repository for v1.0.0 packages | hugo | Before first v1.x release | Pending |
669
+ | Implement GlobalShortcuts portal registration | dev | Desktop 1 gap | Pending |