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,60 @@
1
+ # ADR-009: Core-Only v1.0.0 Release
2
+
3
+ ## Status
4
+
5
+ Accepted (2026-03-04)
6
+
7
+ ## Context
8
+
9
+ raictl v1.0.0 includes 10 engines, D-Bus service, GTK4 desktop app, and all
10
+ supporting infrastructure. The gemspec declares `ruby-dbus` (~> 0.24) and
11
+ `i3ipc` (~> 0.3) as runtime dependencies, but these are only used by the
12
+ desktop and D-Bus modules:
13
+
14
+ - `ruby-dbus`: `lib/rosett_ai/dbus/`, `lib/rosett_ai/desktop/dbus_client.rb`
15
+ - `i3ipc`: `lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb`
16
+
17
+ These gems pull in native extensions and system library dependencies
18
+ (`libgirepository1.0-dev` for GObject introspection) that are irrelevant
19
+ for users who only want the CLI compiler. Installing rosett-ai on a headless
20
+ CI runner or server should not require D-Bus development libraries.
21
+
22
+ The `adwaita` gem (GTK4 desktop UI) is already in a separate `:desktop`
23
+ Bundler group in the Gemfile and excluded from CI. But `ruby-dbus` and
24
+ `i3ipc` are in the gemspec itself, making them mandatory for all installs.
25
+
26
+ ## Decision
27
+
28
+ Release v1.0.0 as **core-only**:
29
+
30
+ 1. Move `ruby-dbus` and `i3ipc` from `rosett-ai.gemspec` to the `:desktop`
31
+ group in `Gemfile` (with `require: false`).
32
+ 2. Add `loader.ignore` calls in `lib/rosett_ai.rb` to prevent Zeitwerk from
33
+ autoloading `rosett-ai/dbus` and `rosett-ai/desktop` when `ruby-dbus` is
34
+ unavailable.
35
+ 3. Desktop CLI commands (`dbus start/stop`, `desktop gtk4`) print a
36
+ clear error message directing users to the `rosett-ai-gtk4` package.
37
+ 4. The `.deb` package (`nncc_1.0.0-1_amd64.deb`) ships as core-only.
38
+ Desktop features will be available via a separate `rosett-ai-gtk4` package.
39
+
40
+ ## Consequences
41
+
42
+ ### Positive
43
+
44
+ - Core rosett-ai installs cleanly on headless systems (CI, servers, containers)
45
+ - No native extension compilation required for core functionality
46
+ - Cleaner dependency tree for the core `.deb` package
47
+ - Desktop components can evolve on their own release cadence
48
+
49
+ ### Negative
50
+
51
+ - Users who previously ran `gem install rosett-ai` and used D-Bus features
52
+ will need to install `rosett-ai-gtk4` separately (no v0.x release exists,
53
+ so no actual migration impact)
54
+ - Two packages to maintain instead of one
55
+
56
+ ### Neutral
57
+
58
+ - All 10 engines remain in core (they have no desktop dependencies)
59
+ - Desktop specs are excluded from core-only test runs but remain in
60
+ the full test suite
@@ -0,0 +1,66 @@
1
+ # ADR 010: Engine Debian Packaging
2
+
3
+ | Field | Value |
4
+ |----------|----------------------|
5
+ | Status | Accepted |
6
+ | Date | 2026-03-07 |
7
+ | Authors | Hugo Sepulveda |
8
+
9
+ ## Context
10
+
11
+ The rosett-ai core package bundles an embedded Ruby runtime at `/opt/rosett-ai/embedded/`.
12
+ Engine gems (e.g. `rosett-ai-engine-claude`, `rosett-ai-engine-ollama`) are separate
13
+ repositories with their own gemspecs. During development, the core Gemfile
14
+ referenced them via `path: '../rosett-ai-engine-*'`, which:
15
+
16
+ 1. Caused `bundle install --deployment` to fail in the staging tree (the sibling
17
+ directories don't exist after `rsync` copies the project).
18
+ 2. Contradicted the pluggable architecture — engines should be independently
19
+ installable, not embedded in the core package.
20
+
21
+ ## Decision
22
+
23
+ Each engine gem is packaged as its own `.deb` (architecture: `all`, since they
24
+ are pure Ruby) that installs into the rosett-ai embedded Ruby's gem directory:
25
+
26
+ ```text
27
+ /opt/rosett-ai/embedded/lib/ruby/gems/3.3.10/
28
+ ```
29
+
30
+ This allows the existing `Gem.find_files('rosett_ai_engine/*/register.rb')` discovery
31
+ mechanism to find engine plugins at runtime without any changes to the core.
32
+
33
+ ### Core Gemfile
34
+
35
+ The core `Gemfile` no longer references engine gems. A `Gemfile.dev` (gitignored)
36
+ is provided for developers who need cross-repo testing.
37
+
38
+ ### Build Script
39
+
40
+ A reusable `packaging/build-engine-deb.sh` script in the core repo accepts
41
+ `ENGINE_NAME` and `ENGINE_VERSION` environment variables. Each engine repo
42
+ contains a thin `packaging/build-deb.sh` wrapper that sets these variables and
43
+ delegates to the core script.
44
+
45
+ ### Dependencies
46
+
47
+ Engine `.deb` packages declare `Depends: rosett-ai (>= 1.0.0)`. Engine-specific
48
+ runtime dependencies (e.g. `anthropic` for rosett-ai-engine-claude) are declared in
49
+ the engine's gemspec as `add_dependency`.
50
+
51
+ ## Consequences
52
+
53
+ - Users install engines independently: `dpkg -i rosett-ai-engine-claude_1.0.0-1_all.deb`
54
+ - Engine updates don't require rebuilding the core package
55
+ - The core `.deb` is smaller and builds faster (no engine gems bundled)
56
+ - Developers use `BUNDLE_GEMFILE=Gemfile.dev bundle install` for local testing
57
+ - Engine gem dependencies are resolved at gem install time within the engine
58
+ `.deb` build, not at core build time
59
+
60
+ ## Alternatives Considered
61
+
62
+ 1. **Bundle all engines in core** — rejected: inflates package size, couples
63
+ release cycles, contradicts pluggable architecture.
64
+ 2. **APT repository with engine packages** — deferred: requires infrastructure
65
+ setup. The current approach produces `.deb` files that can be hosted in any
66
+ APT repo when ready.
@@ -0,0 +1,71 @@
1
+ # ADR 011: Context-Aware CLI
2
+
3
+ | Field | Value |
4
+ |----------|----------------------|
5
+ | Status | Accepted |
6
+ | Date | 2026-03-08 |
7
+ | Authors | Hugo Sepulveda |
8
+
9
+ ## Context
10
+
11
+ rosett-ai's CLI was "rooted" to its own installation directory. Commands that read
12
+ configuration (design, behaviour, compile, validate) hardcoded
13
+ `RosettAi.root.join('conf', ...)` as the source path, which always resolved to
14
+ rosett-ai's own `conf/` directory regardless of `Dir.pwd`. This made rosett-ai unusable
15
+ as a per-project configuration management tool.
16
+
17
+ Additionally, commands like `build`, `release`, `dbus`, and `desktop` are
18
+ rosett-ai-internal development commands that clutter help output when invoked from
19
+ any other project.
20
+
21
+ ## Decision
22
+
23
+ ### Project marker: `.rosett-ai/` directory
24
+
25
+ A new `RosettAi::ProjectContext` class detects project context by walking up from
26
+ `Dir.pwd` looking for a `.rosett-ai/` directory (following the `.git/`, `.vscode/`,
27
+ `.idea/` convention).
28
+
29
+ Project structure created by `rai init --project`:
30
+
31
+ ```text
32
+ <project>/
33
+ .rosett-ai/
34
+ config.yml # Project marker + config (project_name, default_engine)
35
+ conf/
36
+ behaviour/ # Project-specific behaviours
37
+ design/ # Project-specific design docs
38
+ ```
39
+
40
+ ### Path resolution
41
+
42
+ - `RosettAi.conf_root` returns `.rosett-ai/` when inside a project, `RosettAi.root` otherwise
43
+ - Content directories (design, behaviour, tooling) resolve relative to `conf_root`
44
+ - Schemas always resolve from `RosettAi.root` (they are part of the tool, not the project)
45
+
46
+ ### Command visibility
47
+
48
+ Internal commands (`build`, `release`, `documentation`, `dbus`, `desktop`) are:
49
+
50
+ - Hidden from `raictl help` output outside the rosett-ai repository
51
+ - Blocked with a clear error message when invoked directly
52
+
53
+ Detection uses `ProjectContext#nncc_internal?` which returns true only when the
54
+ detected project root equals `RosettAi.root`.
55
+
56
+ ## Alternatives Considered
57
+
58
+ 1. **`.rosett-ai.yml` file at project root** — Rejected because a hidden directory is
59
+ cleaner for housing multiple config files and subdirectories without cluttering
60
+ the project root.
61
+
62
+ 2. **Explicit `--project-dir` flag on every command** — Rejected because it
63
+ violates the "works like git" principle and creates a poor user experience.
64
+
65
+ ## Consequences
66
+
67
+ - Users can run `rai init --project` to set up per-project configuration
68
+ - `rai design list` from a project directory shows that project's design docs
69
+ - `rai compile` from a project directory compiles that project's configuration
70
+ - Internal commands remain accessible only from the rosett-ai repository itself
71
+ - Backward compatible: rosett-ai's own repository continues to work unchanged
@@ -0,0 +1,247 @@
1
+ ---
2
+ - - :permit
3
+ - MIT
4
+ - :who:
5
+ :why:
6
+ :versions: []
7
+ :when: 2026-03-18 19:57:51.797624521 Z
8
+ - - :permit
9
+ - Apache-2.0
10
+ - :who:
11
+ :why:
12
+ :versions: []
13
+ :when: 2026-03-18 19:57:53.592238092 Z
14
+ - - :permit
15
+ - Apache 2.0
16
+ - :who:
17
+ :why:
18
+ :versions: []
19
+ :when: 2026-03-18 19:57:55.699515625 Z
20
+ - - :permit
21
+ - Apache License (2.0)
22
+ - :who:
23
+ :why:
24
+ :versions: []
25
+ :when: 2026-03-18 19:57:57.245428941 Z
26
+ - - :permit
27
+ - Simplified BSD
28
+ - :who:
29
+ :why:
30
+ :versions: []
31
+ :when: 2026-03-18 19:57:58.814909858 Z
32
+ - - :permit
33
+ - Simplified BSD, ruby
34
+ - :who:
35
+ :why:
36
+ :versions: []
37
+ :when: 2026-03-18 19:58:00.504702113 Z
38
+ - - :permit
39
+ - BSD-2-Clause
40
+ - :who:
41
+ :why:
42
+ :versions: []
43
+ :when: 2026-03-18 19:58:02.105176116 Z
44
+ - - :permit
45
+ - BSD-3-Clause
46
+ - :who:
47
+ :why:
48
+ :versions: []
49
+ :when: 2026-03-18 19:58:03.692853547 Z
50
+ - - :permit
51
+ - ISC
52
+ - :who:
53
+ :why:
54
+ :versions: []
55
+ :when: 2026-03-18 19:58:05.306220200 Z
56
+ - - :permit
57
+ - ruby
58
+ - :who:
59
+ :why:
60
+ :versions: []
61
+ :when: 2026-03-18 19:58:06.904808287 Z
62
+ - - :permit
63
+ - GPL-2.0
64
+ - :who:
65
+ :why:
66
+ :versions: []
67
+ :when: 2026-03-18 19:58:08.496153636 Z
68
+ - - :permit
69
+ - GPL-2.0-only
70
+ - :who:
71
+ :why:
72
+ :versions: []
73
+ :when: 2026-03-18 19:58:10.079398510 Z
74
+ - - :permit
75
+ - GPL-2.0-or-later
76
+ - :who:
77
+ :why:
78
+ :versions: []
79
+ :when: 2026-03-18 19:58:11.741292936 Z
80
+ - - :permit
81
+ - GPL-2.0-or-later, ruby
82
+ - :who:
83
+ :why:
84
+ :versions: []
85
+ :when: 2026-03-18 19:58:13.376744792 Z
86
+ - - :permit
87
+ - GPL-3.0
88
+ - :who:
89
+ :why:
90
+ :versions: []
91
+ :when: 2026-03-18 19:58:14.955539712 Z
92
+ - - :permit
93
+ - GPL-3.0-only
94
+ - :who:
95
+ :why:
96
+ :versions: []
97
+ :when: 2026-03-18 19:58:16.531696441 Z
98
+ - - :permit
99
+ - GPL-3.0-or-later
100
+ - :who:
101
+ :why:
102
+ :versions: []
103
+ :when: 2026-03-18 19:58:18.149338796 Z
104
+ - - :permit
105
+ - GPLv3
106
+ - :who:
107
+ :why:
108
+ :versions: []
109
+ :when: 2026-03-18 19:58:19.771117902 Z
110
+ - - :permit
111
+ - LGPL-2.1
112
+ - :who:
113
+ :why:
114
+ :versions: []
115
+ :when: 2026-03-18 19:58:21.317632867 Z
116
+ - - :permit
117
+ - LGPL-2.1-only
118
+ - :who:
119
+ :why:
120
+ :versions: []
121
+ :when: 2026-03-18 19:58:22.958385745 Z
122
+ - - :permit
123
+ - LGPL-2.1-or-later
124
+ - :who:
125
+ :why:
126
+ :versions: []
127
+ :when: 2026-03-18 19:58:24.580793979 Z
128
+ - - :permit
129
+ - LGPLv2+
130
+ - :who:
131
+ :why:
132
+ :versions: []
133
+ :when: 2026-03-18 19:58:26.719515734 Z
134
+ - - :permit
135
+ - LGPL-3.0
136
+ - :who:
137
+ :why:
138
+ :versions: []
139
+ :when: 2026-03-18 19:58:28.353411296 Z
140
+ - - :permit
141
+ - LGPL-3.0-only
142
+ - :who:
143
+ :why:
144
+ :versions: []
145
+ :when: 2026-03-18 19:58:29.972537844 Z
146
+ - - :permit
147
+ - LGPL-3+
148
+ - :who:
149
+ :why:
150
+ :versions: []
151
+ :when: 2026-03-18 19:58:31.574701526 Z
152
+ - - :permit
153
+ - LGPL-3.0+
154
+ - :who:
155
+ :why:
156
+ :versions: []
157
+ :when: 2026-03-18 19:58:33.196092605 Z
158
+ - - :permit
159
+ - LGPL-3+, ruby
160
+ - :who:
161
+ :why:
162
+ :versions: []
163
+ :when: 2026-03-18 19:58:34.827384942 Z
164
+ - - :permit
165
+ - LGPL-3.0+, ruby
166
+ - :who:
167
+ :why:
168
+ :versions: []
169
+ :when: 2026-03-18 19:58:36.496811805 Z
170
+ - - :permit
171
+ - LGPLv3+, ruby
172
+ - :who:
173
+ :why:
174
+ :versions: []
175
+ :when: 2026-03-18 19:58:38.115625313 Z
176
+ - - :permit
177
+ - Zlib
178
+ - :who:
179
+ :why:
180
+ :versions: []
181
+ :when: 2026-03-18 19:58:39.776177141 Z
182
+ - - :permit
183
+ - 0BSD
184
+ - :who:
185
+ :why:
186
+ :versions: []
187
+ :when: 2026-03-18 19:58:41.355632019 Z
188
+ - - :permit
189
+ - Unlicense
190
+ - :who:
191
+ :why:
192
+ :versions: []
193
+ :when: 2026-03-18 19:58:43.057876881 Z
194
+ - - :permit
195
+ - Artistic-1.0-Perl, GPL-2.0-or-later, MIT
196
+ - :who:
197
+ :why:
198
+ :versions: []
199
+ :when: 2026-03-18 19:58:44.637292334 Z
200
+ - - :permit
201
+ - MIT-like
202
+ - :who:
203
+ :why:
204
+ :versions: []
205
+ :when: 2026-03-18 19:58:46.185391276 Z
206
+ - - :approve
207
+ - mutant
208
+ - :who:
209
+ :why: Proprietary EULA (Schirp DSO Ltd), dev-only dependency for mutation testing
210
+ :versions: []
211
+ :when: 2026-03-18 19:58:57.638272693 Z
212
+ - - :approve
213
+ - mutant-rspec
214
+ - :who:
215
+ :why: Proprietary EULA, dev-only integration for mutation testing
216
+ :versions: []
217
+ :when: 2026-03-18 19:58:59.320586322 Z
218
+ - - :approve
219
+ - stud
220
+ - :who:
221
+ :why: Unknown license, transitive dependency of fpm (build-only)
222
+ :versions: []
223
+ :when: 2026-03-18 19:59:00.975313332 Z
224
+ - - :approve
225
+ - native-package-installer
226
+ - :who:
227
+ :why: LGPL-3+, GPL-3.0 compatible
228
+ :versions: []
229
+ :when: 2026-03-18 19:59:02.646765540 Z
230
+ - - :approve
231
+ - locale
232
+ - :who:
233
+ :why: LGPLv3+ ruby, GPL-3.0 compatible
234
+ :versions: []
235
+ :when: 2026-03-18 19:59:04.292348554 Z
236
+ - - :approve
237
+ - gettext
238
+ - :who:
239
+ :why: LGPL-3.0+ ruby, GPL-3.0 compatible
240
+ :versions: []
241
+ :when: 2026-03-18 19:59:05.925828383 Z
242
+ - - :approve
243
+ - pkg-config
244
+ - :who:
245
+ :why: LGPLv2+, GPL-3.0 compatible
246
+ :versions: []
247
+ :when: 2026-03-18 19:59:07.596953695 Z
@@ -0,0 +1,197 @@
1
+ # Issue 001: Wrapper script missing LD_LIBRARY_PATH and RUBYLIB
2
+
3
+ | Field | Value |
4
+ |-------------|--------------------------------------------|
5
+ | Severity | **Critical** (application fails to launch) |
6
+ | Status | **Resolved** |
7
+ | Component | `packaging/wrapper.sh.template` |
8
+ | Affects | All builds (CI and local) |
9
+ | Found in | v1.0.0 (`nncc_1.0.0-1_amd64.deb`) |
10
+ | Resolved in | v1.1.0 |
11
+
12
+ ## Resolution
13
+
14
+ Wrapper converted to `packaging/wrapper.sh.template` with `@@RUBY_ABI@@` and
15
+ `@@RUBY_ARCH@@` placeholders. The `install_wrapper!` build stage now queries the
16
+ just-compiled embedded Ruby for `RbConfig::CONFIG["ruby_version"]` and
17
+ `RbConfig::CONFIG["arch"]`, substituting them at build time. The template sets
18
+ `LD_LIBRARY_PATH`, `RUBYLIB`, `GEM_HOME`, and `GEM_PATH` with the correct paths,
19
+ eliminating the chicken-and-egg `ruby -e` subprocess call.
20
+
21
+ ## Summary
22
+
23
+ The runtime wrapper script (`/opt/rosett-ai/bin/raictl`) does not set `LD_LIBRARY_PATH`
24
+ or `RUBYLIB`, causing two cascading failures that prevent the application from
25
+ starting.
26
+
27
+ ## Symptoms
28
+
29
+ ```text
30
+ $ raictl version
31
+ `RubyGems' were not loaded.
32
+ `error_highlight' was not loaded.
33
+ `did_you_mean' was not loaded.
34
+ `syntax_suggest' was not loaded.
35
+ -e:1:in `<main>': uninitialized constant RbConfig (NameError)
36
+ `RubyGems' were not loaded.
37
+ ...
38
+ /opt/rosett-ai/app/bin/raictl:10:in `require': cannot load such file -- bundler/setup (LoadError)
39
+ from /opt/rosett-ai/app/bin/raictl:10:in `<main>'
40
+ ```
41
+
42
+ ## Root Cause Analysis
43
+
44
+ ### Failure 1: `libruby.so.3.3` not found
45
+
46
+ The embedded Ruby binary at `/opt/rosett-ai/embedded/bin/ruby` links against
47
+ `libruby.so.3.3` dynamically. Its ELF `RUNPATH` is set to `/usr/local/lib`
48
+ (see [Issue 002](002-embedded-ruby-wrong-prefix.md) for why), but the actual
49
+ library resides at `/opt/rosett-ai/embedded/lib/libruby.so.3.3`.
50
+
51
+ **Evidence:**
52
+
53
+ ```text
54
+ $ ldd /opt/rosett-ai/embedded/bin/ruby
55
+ libruby.so.3.3 => not found
56
+ $ readelf -d /opt/rosett-ai/embedded/bin/ruby | grep RUNPATH
57
+ 0x000000000000001d (RUNPATH) Library runpath: [/usr/local/lib]
58
+ $ ls /opt/rosett-ai/embedded/lib/libruby.so.3.3
59
+ /opt/rosett-ai/embedded/lib/libruby.so.3.3 -> libruby.so.3.3.10
60
+ ```
61
+
62
+ The user discovered that `export LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib/`
63
+ resolves this failure, but a second failure then emerges.
64
+
65
+ ### Failure 2: Ruby standard library not on `$LOAD_PATH`
66
+
67
+ Even with `LD_LIBRARY_PATH` set, the Ruby binary's compiled-in `$LOAD_PATH`
68
+ points to `/usr/local/lib/ruby/...` instead of `/opt/rosett-ai/embedded/lib/ruby/...`:
69
+
70
+ ```text
71
+ $ LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib \
72
+ /opt/rosett-ai/embedded/bin/ruby -e 'puts $LOAD_PATH'
73
+ /usr/local/lib/ruby/site_ruby/3.3.0
74
+ /usr/local/lib/ruby/site_ruby/3.3.0/x86_64-linux
75
+ /usr/local/lib/ruby/site_ruby
76
+ /usr/local/lib/ruby/vendor_ruby/3.3.0
77
+ /usr/local/lib/ruby/vendor_ruby/3.3.0/x86_64-linux
78
+ /usr/local/lib/ruby/vendor_ruby
79
+ /usr/local/lib/ruby/3.3.0
80
+ /usr/local/lib/ruby/3.3.0/x86_64-linux
81
+ ```
82
+
83
+ The actual standard library (including `rbconfig.rb`, `rubygems.rb`,
84
+ `bundler.rb`) exists at `/opt/rosett-ai/embedded/lib/ruby/3.3.0/` but Ruby cannot
85
+ find it. This causes:
86
+
87
+ - `RbConfig` to be undefined (it requires `rbconfig.rb` from the stdlib)
88
+ - RubyGems, error_highlight, did_you_mean, syntax_suggest all fail to load
89
+ - `bundler/setup` cannot be required
90
+
91
+ ### Failure 3: Chicken-and-egg in GEM_HOME computation (line 11)
92
+
93
+ The wrapper script runs this **before** the main `exec` call:
94
+
95
+ ```bash
96
+ export GEM_HOME="${INSTALL_DIR}/embedded/lib/ruby/gems/$(${EMBEDDED_BIN}/ruby -e 'puts RbConfig::CONFIG["ruby_program_version"]')"
97
+ ```
98
+
99
+ This subprocess invocation of `ruby` fails first (for the same reasons above),
100
+ which causes the entire wrapper to abort due to `set -e`.
101
+
102
+ ## Proof: All failures resolved with correct environment
103
+
104
+ Setting `LD_LIBRARY_PATH` and `RUBYLIB` makes the full application work:
105
+
106
+ ```bash
107
+ $ LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib \
108
+ RUBYLIB=/opt/rosett-ai/embedded/lib/ruby/3.3.0:/opt/rosett-ai/embedded/lib/ruby/3.3.0/x86_64-linux \
109
+ GEM_HOME=/opt/rosett-ai/embedded/lib/ruby/gems/3.3.0 \
110
+ BUNDLE_GEMFILE=/opt/rosett-ai/app/Gemfile \
111
+ BUNDLE_PATH=/opt/rosett-ai/app/vendor/bundle \
112
+ BUNDLE_DEPLOYMENT=true \
113
+ /opt/rosett-ai/embedded/bin/ruby -I/opt/rosett-ai/app/lib /opt/rosett-ai/app/bin/raictl version
114
+ 1.0.0
115
+ ```
116
+
117
+ ## Proposed Fix
118
+
119
+ Update `packaging/wrapper.sh` to set the missing environment variables and
120
+ eliminate the chicken-and-egg `ruby` subprocess call:
121
+
122
+ ```bash
123
+ #!/bin/bash
124
+ # Rosett-AI - Runtime wrapper
125
+ # Invoked as /opt/rosett-ai/bin/raictl, symlinked from /usr/local/bin/raictl
126
+ set -e
127
+
128
+ INSTALL_DIR="/opt/rosett-ai"
129
+ EMBEDDED_DIR="${INSTALL_DIR}/embedded"
130
+ EMBEDDED_BIN="${EMBEDDED_DIR}/bin"
131
+ EMBEDDED_LIB="${EMBEDDED_DIR}/lib"
132
+ APP_DIR="${INSTALL_DIR}/app"
133
+
134
+ # Ensure the embedded Ruby can find libruby.so
135
+ export LD_LIBRARY_PATH="${EMBEDDED_LIB}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
136
+
137
+ # Ensure the embedded Ruby can find its standard library
138
+ export RUBYLIB="${EMBEDDED_LIB}/ruby/3.3.0:${EMBEDDED_LIB}/ruby/3.3.0/x86_64-linux${RUBYLIB:+:$RUBYLIB}"
139
+
140
+ export PATH="${EMBEDDED_BIN}:${PATH}"
141
+ export GEM_HOME="${EMBEDDED_LIB}/ruby/gems/3.3.0"
142
+ export GEM_PATH="${GEM_HOME}"
143
+ export BUNDLE_GEMFILE="${APP_DIR}/Gemfile"
144
+ export BUNDLE_PATH="${APP_DIR}/vendor/bundle"
145
+ export BUNDLE_DEPLOYMENT="true"
146
+
147
+ cd "${APP_DIR}"
148
+ exec "${EMBEDDED_BIN}/ruby" -I"${APP_DIR}/lib" "${APP_DIR}/bin/raictl" "$@"
149
+ ```
150
+
151
+ ### Key changes
152
+
153
+ | Change | Rationale |
154
+ |--------|-----------|
155
+ | Add `LD_LIBRARY_PATH` | Ensures dynamic linker finds `libruby.so.3.3` |
156
+ | Add `RUBYLIB` | Overrides compiled-in `$LOAD_PATH` to find stdlib |
157
+ | Hardcode `gems/3.3.0` in `GEM_HOME` | Eliminates failing `ruby -e` subprocess call |
158
+
159
+ ### Trade-off: hardcoded version string
160
+
161
+ The original wrapper dynamically queried `RbConfig::CONFIG["ruby_program_version"]`
162
+ to avoid hardcoding `gems/3.3.0`. While elegant, this creates a circular
163
+ dependency: Ruby must work before we can query Ruby for its version. Since the
164
+ wrapper is generated at build time (see `install_wrapper!` in `build.rb`),
165
+ the version string can be templated during the build stage instead. See the
166
+ "Templated Wrapper" alternative below.
167
+
168
+ ### Alternative: Templated wrapper (preferred)
169
+
170
+ Modify `install_wrapper!` in `lib/rosett_ai/thor/tasks/build.rb` to render the
171
+ wrapper from an ERB template with build-time values:
172
+
173
+ ```ruby
174
+ def install_wrapper!
175
+ template = packaging_dir.join('wrapper.sh.erb')
176
+ dest = staging_install.join('bin', 'rosett-ai')
177
+ content = ERB.new(template.read).result_with_hash(
178
+ ruby_abi_version: '3.3.0',
179
+ ruby_arch: 'x86_64-linux'
180
+ )
181
+ File.write(dest, content)
182
+ FileUtils.chmod(0o755, dest)
183
+ end
184
+ ```
185
+
186
+ This preserves the "no hardcoded version" design goal while avoiding the
187
+ chicken-and-egg problem.
188
+
189
+ ## Affected Files
190
+
191
+ - `packaging/wrapper.sh` (or new `packaging/wrapper.sh.erb`)
192
+ - `lib/rosett_ai/thor/tasks/build.rb` (if using templated approach)
193
+
194
+ ## Related Issues
195
+
196
+ - [002 - Embedded Ruby compiled with wrong prefix](002-embedded-ruby-wrong-prefix.md)
197
+ - [003 - Smoke test installs system Ruby masking failures](003-smoke-test-false-positive.md)