rosett-ai 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. checksums.yaml +7 -0
  2. data/.ai-provenance.yml +119 -0
  3. data/.debride_whitelist +186 -0
  4. data/.fasterer.yml +29 -0
  5. data/.mdl_style.rb +10 -0
  6. data/.mdlrc +3 -0
  7. data/.mutant.yml +49 -0
  8. data/.namespace-allowlist +42 -0
  9. data/.reek.yml +1040 -0
  10. data/.rosett-ai/config.yml +3 -0
  11. data/.rspec +5 -0
  12. data/.rubocop.yml +380 -0
  13. data/.ruby-version +1 -0
  14. data/.yamllint +51 -0
  15. data/.yardopts +12 -0
  16. data/AI-DISCLOSURE.md +48 -0
  17. data/CHANGELOG.md +519 -0
  18. data/CLAUDE.md +141 -0
  19. data/CONTRIBUTING.md +734 -0
  20. data/INSTALL.md +154 -0
  21. data/LICENSE +674 -0
  22. data/LICENSE.md +675 -0
  23. data/QUICKSTART.md +73 -0
  24. data/README.md +366 -0
  25. data/Rakefile +200 -0
  26. data/SECURITY.md +114 -0
  27. data/bin/rai +1 -0
  28. data/cliff.toml +52 -0
  29. data/conf/adopt_redactions.yml +8 -0
  30. data/conf/behaviour/.gitkeep +0 -0
  31. data/conf/compliance/cra_rules.yml +25 -0
  32. data/conf/compliance/license_rules.yml +20 -0
  33. data/conf/design/aaif_alignment.yml +181 -0
  34. data/conf/design/ab_testing.yml +172 -0
  35. data/conf/design/accessibility.yml +84 -0
  36. data/conf/design/ai_authorship.yml +210 -0
  37. data/conf/design/ai_provenance.yml +224 -0
  38. data/conf/design/ai_tool_configuration.yml +207 -0
  39. data/conf/design/architecture.yml +139 -0
  40. data/conf/design/autocompletion.yml +115 -0
  41. data/conf/design/backward_compatibility.yml +112 -0
  42. data/conf/design/behaviour_composition.yml +246 -0
  43. data/conf/design/build_rake_extraction.yml +57 -0
  44. data/conf/design/ci_pipeline.yml +100 -0
  45. data/conf/design/claude_code_configuration.yml +157 -0
  46. data/conf/design/compiler.yml +128 -0
  47. data/conf/design/comply.yml +153 -0
  48. data/conf/design/content_packs.yml +84 -0
  49. data/conf/design/desktop_integration.yml +289 -0
  50. data/conf/design/distribution.yml +216 -0
  51. data/conf/design/doctor.yml +184 -0
  52. data/conf/design/documentation.yml +152 -0
  53. data/conf/design/engine_architecture.yml +257 -0
  54. data/conf/design/error_handling.yml +103 -0
  55. data/conf/design/feature_flags.yml +142 -0
  56. data/conf/design/git_hooks.yml +165 -0
  57. data/conf/design/gui_plugins.yml +475 -0
  58. data/conf/design/i18n.yml +84 -0
  59. data/conf/design/integration_testing.yml +56 -0
  60. data/conf/design/licensing_system.yml +88 -0
  61. data/conf/design/lifecycle_management.yml +208 -0
  62. data/conf/design/mcp_integration.yml +207 -0
  63. data/conf/design/mcp_settings.yml +126 -0
  64. data/conf/design/migration.yml +56 -0
  65. data/conf/design/monitoring_observability.yml +194 -0
  66. data/conf/design/namespace_cleanup.yml +145 -0
  67. data/conf/design/plugin_test_segregation.yml +145 -0
  68. data/conf/design/policy_management.yml +229 -0
  69. data/conf/design/project_management.yml +183 -0
  70. data/conf/design/rai_mcp_asset_discovery.yml +164 -0
  71. data/conf/design/rai_mcp_server.yml +605 -0
  72. data/conf/design/release_management.yml +117 -0
  73. data/conf/design/retrofit.yml +199 -0
  74. data/conf/design/retrospective_analyzer.yml +79 -0
  75. data/conf/design/scope_hierarchy.yml +352 -0
  76. data/conf/design/security.yml +115 -0
  77. data/conf/design/session_retrospective.yml +85 -0
  78. data/conf/design/smart_ui_feedback.yml +89 -0
  79. data/conf/design/structured_logging.yml +148 -0
  80. data/conf/design/styles.yml +123 -0
  81. data/conf/design/test_peer_review.yml +89 -0
  82. data/conf/design/testing.yml +136 -0
  83. data/conf/design/threat_model.yml +108 -0
  84. data/conf/design/ui_framework.yml +111 -0
  85. data/conf/design/usage_optimization.yml +122 -0
  86. data/conf/design/version_management.yml +60 -0
  87. data/conf/design/workflow.yml +227 -0
  88. data/conf/mcp/server_defaults.yml +42 -0
  89. data/conf/mcp/trust.yml +21 -0
  90. data/conf/packaging/core.yml +12 -0
  91. data/conf/packaging/gtk4.yml +11 -0
  92. data/conf/packaging/qt6.yml +11 -0
  93. data/conf/policy/default_deny_list.yml +197 -0
  94. data/conf/review/cli-command-audit.yml +857 -0
  95. data/conf/review/design-docs.yml +1064 -0
  96. data/conf/review/design-questionnaire.yml +153 -0
  97. data/conf/review/questionnaire.yml +146 -0
  98. data/conf/review/rosett-ai-core.yml +2919 -0
  99. data/conf/schemas/ai_config_schema.json +73 -0
  100. data/conf/schemas/behaviour_schema.json +132 -0
  101. data/conf/schemas/compliance_rule_schema.json +63 -0
  102. data/conf/schemas/content_pack_manifest_schema.json +51 -0
  103. data/conf/schemas/design_schema.json +210 -0
  104. data/conf/schemas/engine_manifest_schema.json +144 -0
  105. data/conf/schemas/lockfile_schema.json +74 -0
  106. data/conf/schemas/mcp_server_schema.json +48 -0
  107. data/conf/schemas/packaging_schema.json +70 -0
  108. data/conf/schemas/policy_schema.json +85 -0
  109. data/conf/schemas/provenance_schema.json +84 -0
  110. data/conf/schemas/rai_config_schema.json +56 -0
  111. data/conf/schemas/rai_project_schema.json +20 -0
  112. data/conf/schemas/scope_hierarchy_schema.json +49 -0
  113. data/conf/schemas/target_schema.json +67 -0
  114. data/conf/schemas/tooling_schema.json +65 -0
  115. data/conf/schemas/workflow_schema.json +112 -0
  116. data/conf/targets/agents_md.yml +17 -0
  117. data/conf/targets/claude.yml +12 -0
  118. data/conf/tooling/tools.yml +58 -0
  119. data/dist/rosett-ai-mcp.service +48 -0
  120. data/dist/rosett-ai-mcp.yml.default +45 -0
  121. data/doc/AAIF_POSITIONING.md +58 -0
  122. data/doc/ADOPT.md +224 -0
  123. data/doc/AI_PROVENANCE.md +139 -0
  124. data/doc/ARCHITECTURE.md +920 -0
  125. data/doc/BEHAVIOUR.md +409 -0
  126. data/doc/BUILD.md +138 -0
  127. data/doc/CI_CD_RECIPES.md +171 -0
  128. data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
  129. data/doc/COMMAND_ANALYSIS.md +229 -0
  130. data/doc/CONFIGURATION.md +281 -0
  131. data/doc/DESIGN_AUDIT.md +235 -0
  132. data/doc/DESIGN_PEER_REVIEW.md +771 -0
  133. data/doc/DESKTOP.md +447 -0
  134. data/doc/ENGINES.md +567 -0
  135. data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
  136. data/doc/FEATURE_AUDIT.md +218 -0
  137. data/doc/IMPLEMENTATION_PLAN.md +669 -0
  138. data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
  139. data/doc/MIGRATION_GUIDE.md +88 -0
  140. data/doc/PACKAGING.md +232 -0
  141. data/doc/PROJECT_DASHBOARD.md +153 -0
  142. data/doc/PULP_DEPLOYMENT.md +164 -0
  143. data/doc/QUALITY_FIX_SUMMARY.md +110 -0
  144. data/doc/QUICK_START.md +162 -0
  145. data/doc/REEK_CONFIGURATION.md +166 -0
  146. data/doc/REFERENCE.md +253 -0
  147. data/doc/REFERENCES.md +324 -0
  148. data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
  149. data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
  150. data/doc/SETUP.md +202 -0
  151. data/doc/TEST_PEER_REVIEW.md +152 -0
  152. data/doc/THREAT_MODEL.md +230 -0
  153. data/doc/USAGE.md +545 -0
  154. data/doc/USER_MANUAL.md +585 -0
  155. data/doc/ai_test_review_checklist.md +110 -0
  156. data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
  157. data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
  158. data/doc/changes/2026-02-20-security-implementation.md +281 -0
  159. data/doc/changes/2026-02-20-styles-implementation.md +220 -0
  160. data/doc/changes/2026-02-21-architecture-completion.md +95 -0
  161. data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
  162. data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
  163. data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
  164. data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
  165. data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
  166. data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
  167. data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
  168. data/doc/changes/2026-02-21-path-resolver.md +128 -0
  169. data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
  170. data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
  171. data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
  172. data/doc/context/SESSION-HANDOFF.md +69 -0
  173. data/doc/context/ai-engine-usage-trends-2026.md +80 -0
  174. data/doc/context/plan-pluggable-engines.md +590 -0
  175. data/doc/decisions/001-flog-deferred.md +32 -0
  176. data/doc/decisions/002-path-resolution-strategy.md +158 -0
  177. data/doc/decisions/003-ui-adapter-selection.md +193 -0
  178. data/doc/decisions/004-design-document-validation.md +179 -0
  179. data/doc/decisions/005-package-splitting-strategy.md +200 -0
  180. data/doc/decisions/006-multi-engine-architecture.md +147 -0
  181. data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
  182. data/doc/decisions/008-ci-bundler-strategy.md +129 -0
  183. data/doc/decisions/009-core-only-v1-release.md +60 -0
  184. data/doc/decisions/010-engine-debian-packaging.md +66 -0
  185. data/doc/decisions/011-context-aware-cli.md +71 -0
  186. data/doc/dependency_decisions.yml +247 -0
  187. data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
  188. data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
  189. data/doc/issues/003-smoke-test-false-positive.md +127 -0
  190. data/doc/issues/004-market-research-design-updates.md +109 -0
  191. data/doc/issues/005-compile-scope-coexistence.md +161 -0
  192. data/doc/locales/.gitkeep +0 -0
  193. data/doc/man/rai.1.ronn +505 -0
  194. data/doc/operations/packaging.md +133 -0
  195. data/doc/operations/rosett-ai-release.md +65 -0
  196. data/doc/reference/error-catalog.md +107 -0
  197. data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
  198. data/doc/reference/src/Pictures/cover.jpg +0 -0
  199. data/doc/reference/src/Pictures/head1.jpg +0 -0
  200. data/doc/reference/src/Pictures/head2.jpg +0 -0
  201. data/doc/reference/src/Pictures/head3.jpg +0 -0
  202. data/doc/reference/src/Pictures/head4.jpg +0 -0
  203. data/doc/reference/src/Pictures/head5.jpg +0 -0
  204. data/doc/reference/src/Pictures/head6.jpg +0 -0
  205. data/doc/reference/src/Pictures/head7.jpg +0 -0
  206. data/doc/reference/src/Pictures/head8.jpg +0 -0
  207. data/doc/reference/src/StyleInd.ist +4 -0
  208. data/doc/reference/src/bibliography.bib +79 -0
  209. data/doc/reference/src/main.tex +1288 -0
  210. data/doc/reference/src/structure.tex +303 -0
  211. data/doc/rosett-ai-bookmarks.html +301 -0
  212. data/kitchen.yml +46 -0
  213. data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
  214. data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
  215. data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
  216. data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
  217. data/lib/rosett_ai/ai_config/context_window.rb +55 -0
  218. data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
  219. data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
  220. data/lib/rosett_ai/ai_config/model_router.rb +121 -0
  221. data/lib/rosett_ai/ai_config/validator.rb +45 -0
  222. data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
  223. data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
  224. data/lib/rosett_ai/authorship/review_validator.rb +39 -0
  225. data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
  226. data/lib/rosett_ai/backup/compressor.rb +180 -0
  227. data/lib/rosett_ai/backup/destination.rb +91 -0
  228. data/lib/rosett_ai/behaviour/manager.rb +156 -0
  229. data/lib/rosett_ai/compiler/backend.rb +86 -0
  230. data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
  231. data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
  232. data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
  233. data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
  234. data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
  235. data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
  236. data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
  237. data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
  238. data/lib/rosett_ai/compiler/target_profile.rb +112 -0
  239. data/lib/rosett_ai/completion/generator.rb +101 -0
  240. data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
  241. data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
  242. data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
  243. data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
  244. data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
  245. data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
  246. data/lib/rosett_ai/comply/reporter.rb +113 -0
  247. data/lib/rosett_ai/comply/runner.rb +50 -0
  248. data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
  249. data/lib/rosett_ai/composition/composer.rb +158 -0
  250. data/lib/rosett_ai/composition/composition_result.rb +64 -0
  251. data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
  252. data/lib/rosett_ai/composition/lockfile.rb +103 -0
  253. data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
  254. data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
  255. data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
  256. data/lib/rosett_ai/config/compile_result.rb +37 -0
  257. data/lib/rosett_ai/config/compiler.rb +13 -0
  258. data/lib/rosett_ai/config/domain_transformer.rb +13 -0
  259. data/lib/rosett_ai/config/key_map.rb +13 -0
  260. data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
  261. data/lib/rosett_ai/config/scope_router.rb +13 -0
  262. data/lib/rosett_ai/config/secret_resolver.rb +125 -0
  263. data/lib/rosett_ai/configuration.rb +119 -0
  264. data/lib/rosett_ai/content/content_client.rb +60 -0
  265. data/lib/rosett_ai/content/pack_installer.rb +117 -0
  266. data/lib/rosett_ai/content/pack_manifest.rb +50 -0
  267. data/lib/rosett_ai/content/pack_registry.rb +68 -0
  268. data/lib/rosett_ai/content_packs/manager.rb +50 -0
  269. data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
  270. data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
  271. data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
  272. data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
  273. data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
  274. data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
  275. data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
  276. data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
  277. data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
  278. data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
  279. data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
  280. data/lib/rosett_ai/dbus/service.rb +121 -0
  281. data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
  282. data/lib/rosett_ai/deprecation.rb +79 -0
  283. data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
  284. data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
  285. data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
  286. data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
  287. data/lib/rosett_ai/doctor/check.rb +92 -0
  288. data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
  289. data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
  290. data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
  291. data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
  292. data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
  293. data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
  294. data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
  295. data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
  296. data/lib/rosett_ai/doctor.rb +81 -0
  297. data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
  298. data/lib/rosett_ai/documentation/translator.rb +62 -0
  299. data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
  300. data/lib/rosett_ai/engines/detector.rb +63 -0
  301. data/lib/rosett_ai/engines/registry.rb +50 -0
  302. data/lib/rosett_ai/error_handler.rb +139 -0
  303. data/lib/rosett_ai/exit_codes.rb +76 -0
  304. data/lib/rosett_ai/feature_flags.rb +102 -0
  305. data/lib/rosett_ai/formatting.rb +33 -0
  306. data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
  307. data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
  308. data/lib/rosett_ai/git_hooks/installer.rb +175 -0
  309. data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
  310. data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
  311. data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
  312. data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
  313. data/lib/rosett_ai/init/config_file_writer.rb +24 -0
  314. data/lib/rosett_ai/init/directory_builder.rb +38 -0
  315. data/lib/rosett_ai/init/file_copier.rb +95 -0
  316. data/lib/rosett_ai/init/global_initializer.rb +28 -0
  317. data/lib/rosett_ai/init/local_initializer.rb +27 -0
  318. data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
  319. data/lib/rosett_ai/init/project_initializer.rb +38 -0
  320. data/lib/rosett_ai/licensing/license_key.rb +139 -0
  321. data/lib/rosett_ai/licensing/license_store.rb +64 -0
  322. data/lib/rosett_ai/licensing/license_validator.rb +60 -0
  323. data/lib/rosett_ai/licensing/tier.rb +42 -0
  324. data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
  325. data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
  326. data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
  327. data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
  328. data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
  329. data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
  330. data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
  331. data/lib/rosett_ai/mcp/governance.rb +160 -0
  332. data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
  333. data/lib/rosett_ai/mcp/instructions.rb +266 -0
  334. data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
  335. data/lib/rosett_ai/mcp/keyfile.rb +221 -0
  336. data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
  337. data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
  338. data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
  339. data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
  340. data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
  341. data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
  342. data/lib/rosett_ai/mcp/plugins.rb +143 -0
  343. data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
  344. data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
  345. data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
  346. data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
  347. data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
  348. data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
  349. data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
  350. data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
  351. data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
  352. data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
  353. data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
  354. data/lib/rosett_ai/mcp/response_helper.rb +46 -0
  355. data/lib/rosett_ai/mcp/security_logger.rb +60 -0
  356. data/lib/rosett_ai/mcp/server.rb +212 -0
  357. data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
  358. data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
  359. data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
  360. data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
  361. data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
  362. data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
  363. data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
  364. data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
  365. data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
  366. data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
  367. data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
  368. data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
  369. data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
  370. data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
  371. data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
  372. data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
  373. data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
  374. data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
  375. data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
  376. data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
  377. data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
  378. data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
  379. data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
  380. data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
  381. data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
  382. data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
  383. data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
  384. data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
  385. data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
  386. data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
  387. data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
  388. data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
  389. data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
  390. data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
  391. data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
  392. data/lib/rosett_ai/migration/detector.rb +117 -0
  393. data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
  394. data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
  395. data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
  396. data/lib/rosett_ai/package_manager/apt.rb +108 -0
  397. data/lib/rosett_ai/package_manager/base.rb +68 -0
  398. data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
  399. data/lib/rosett_ai/packaging/variant_config.rb +92 -0
  400. data/lib/rosett_ai/path_resolver.rb +115 -0
  401. data/lib/rosett_ai/plugins/contract.rb +43 -0
  402. data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
  403. data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
  404. data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
  405. data/lib/rosett_ai/plugins/registry.rb +150 -0
  406. data/lib/rosett_ai/policy/auditor.rb +41 -0
  407. data/lib/rosett_ai/policy/deny_list.rb +71 -0
  408. data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
  409. data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
  410. data/lib/rosett_ai/policy/protected_files.rb +47 -0
  411. data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
  412. data/lib/rosett_ai/policy/validator.rb +35 -0
  413. data/lib/rosett_ai/profiler.rb +79 -0
  414. data/lib/rosett_ai/project/drift_detector.rb +126 -0
  415. data/lib/rosett_ai/project/manager.rb +115 -0
  416. data/lib/rosett_ai/project/sync_manager.rb +138 -0
  417. data/lib/rosett_ai/project/template_applier.rb +105 -0
  418. data/lib/rosett_ai/project_context.rb +82 -0
  419. data/lib/rosett_ai/provenance/entry.rb +63 -0
  420. data/lib/rosett_ai/provenance/file_source.rb +32 -0
  421. data/lib/rosett_ai/provenance/source.rb +62 -0
  422. data/lib/rosett_ai/provenance/store.rb +153 -0
  423. data/lib/rosett_ai/provenance/tracker.rb +62 -0
  424. data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
  425. data/lib/rosett_ai/provenance/validator.rb +45 -0
  426. data/lib/rosett_ai/quorum/collector.rb +59 -0
  427. data/lib/rosett_ai/quorum/comparator.rb +81 -0
  428. data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
  429. data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
  430. data/lib/rosett_ai/rai_config.rb +107 -0
  431. data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
  432. data/lib/rosett_ai/retrofit/engine.rb +171 -0
  433. data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
  434. data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
  435. data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
  436. data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
  437. data/lib/rosett_ai/retrofit/scanner.rb +47 -0
  438. data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
  439. data/lib/rosett_ai/secrets_resolver.rb +71 -0
  440. data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
  441. data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
  442. data/lib/rosett_ai/structured_logger.rb +110 -0
  443. data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
  444. data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
  445. data/lib/rosett_ai/telemetry/provider.rb +26 -0
  446. data/lib/rosett_ai/telemetry/reporter.rb +144 -0
  447. data/lib/rosett_ai/telemetry.rb +47 -0
  448. data/lib/rosett_ai/text_sanitizer.rb +62 -0
  449. data/lib/rosett_ai/thor/cli.rb +269 -0
  450. data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
  451. data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
  452. data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
  453. data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
  454. data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
  455. data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
  456. data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
  457. data/lib/rosett_ai/thor/tasks/config.rb +265 -0
  458. data/lib/rosett_ai/thor/tasks/content.rb +193 -0
  459. data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
  460. data/lib/rosett_ai/thor/tasks/design.rb +258 -0
  461. data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
  462. data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
  463. data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
  464. data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
  465. data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
  466. data/lib/rosett_ai/thor/tasks/init.rb +259 -0
  467. data/lib/rosett_ai/thor/tasks/license.rb +120 -0
  468. data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
  469. data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
  470. data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
  471. data/lib/rosett_ai/thor/tasks/project.rb +260 -0
  472. data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
  473. data/lib/rosett_ai/thor/tasks/release.rb +314 -0
  474. data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
  475. data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
  476. data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
  477. data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
  478. data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
  479. data/lib/rosett_ai/tooling/version_checker.rb +35 -0
  480. data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
  481. data/lib/rosett_ai/ui/base.rb +46 -0
  482. data/lib/rosett_ai/ui/gtk4.rb +98 -0
  483. data/lib/rosett_ai/ui/kde.rb +40 -0
  484. data/lib/rosett_ai/ui/qt6.rb +40 -0
  485. data/lib/rosett_ai/ui/registry.rb +60 -0
  486. data/lib/rosett_ai/ui/tty_helper.rb +74 -0
  487. data/lib/rosett_ai/ui/tui.rb +59 -0
  488. data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
  489. data/lib/rosett_ai/validators/design_validator.rb +17 -0
  490. data/lib/rosett_ai/validators/schema_validator.rb +84 -0
  491. data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
  492. data/lib/rosett_ai/version.rb +8 -0
  493. data/lib/rosett_ai/version_consistency_checker.rb +129 -0
  494. data/lib/rosett_ai/workflow/audit_log.rb +86 -0
  495. data/lib/rosett_ai/workflow/engine.rb +142 -0
  496. data/lib/rosett_ai/workflow/manager.rb +82 -0
  497. data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
  498. data/lib/rosett_ai/workflow/step_runner.rb +61 -0
  499. data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
  500. data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
  501. data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
  502. data/lib/rosett_ai/yaml_loader.rb +78 -0
  503. data/lib/rosett_ai.rb +221 -0
  504. data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
  505. data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
  506. data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
  507. data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
  508. data/lib/rubocop/rosett_ai.rb +9 -0
  509. data/lib/scripts/generated/docker_hub_tags.rb +126 -0
  510. data/locales/.gitkeep +0 -0
  511. data/locales/ar.yml +579 -0
  512. data/locales/en.yml +571 -0
  513. data/locales/fr.yml +567 -0
  514. data/packaging/build-engine-deb.sh +81 -0
  515. data/packaging/scripts/postinst +17 -0
  516. data/packaging/scripts/postrm +19 -0
  517. data/packaging/scripts/prerm +10 -0
  518. data/packaging/wrapper.sh.template +38 -0
  519. data/rosett-ai.gemspec +63 -0
  520. data/rules/.gitkeep +0 -0
  521. data/scripts/publish/pulp_upload.sh +123 -0
  522. data/settings.json +29 -0
  523. data/share/applications/be.neatnerds.rosettai.desktop +29 -0
  524. data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
  525. data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
  526. data/share/templates/behaviour/criticalthinking.yml +69 -0
  527. metadata +810 -0
data/locales/fr.yml ADDED
@@ -0,0 +1,567 @@
1
+ ---
2
+ fr:
3
+ rosett_ai:
4
+ meta:
5
+ direction: ltr
6
+ language_name: "French"
7
+ language_name_native: "Français"
8
+ cli:
9
+ version: "raictl version %{version}"
10
+ compile:
11
+ success: "Compilation de %{count} règle(s) réussie"
12
+ no_categories: "Aucune catégorie compilable trouvée."
13
+ simulate_prefix: "Simulerait"
14
+ discovered_categories: "Catégories découvertes :"
15
+ would_update: "Mettrait à jour : %{filename}"
16
+ would_create: "Créerait : %{filename}"
17
+ would_remove_orphan: "Supprimerait l'orphelin : %{filename}"
18
+ removed_orphan: "Orphelin supprimé : %{filename}"
19
+ unchanged: "Inchangé : %{filename}"
20
+ created: "Créé"
21
+ updated: "Mis à jour"
22
+ wrote_lockfile: "Fichier de verrouillage écrit : %{path}"
23
+ summary_title: "Résumé de la compilation"
24
+ action: "Action"
25
+ count: "Nombre"
26
+ locale_simulate: "Compilerait les fichiers de localisation aux formats gettext et Qt"
27
+ locale_gettext_compiled: "%{count} fichier(s) gettext compilé(s)"
28
+ locale_qt_compiled: "%{count} fichier(s) Qt Linguist compilé(s)"
29
+ target_deprecated: "[OBSOLÈTE] --target est obsolète, utilisez --engine à la place"
30
+ target_deprecated_strict: "--target est obsolète. Utilisez --engine à la place (mode --strict)"
31
+ engine_and_target_conflict: "Impossible d'utiliser --engine et --target ensemble. Utilisez --engine uniquement."
32
+ config:
33
+ scope_not_found: "Fichier de portée introuvable : %{path}. Portées valides : %{scopes}"
34
+ no_scopes: "Aucun fichier de portée trouvé dans conf/claude_code/"
35
+ compiled: "Compilé %{source} → %{target}"
36
+ config_updated: "Mis à jour %{source} → %{target}"
37
+ unchanged: "Inchangé : %{source}"
38
+ skipped: "Ignoré : %{source}"
39
+ summary_title: "Résumé de la compilation de configuration"
40
+ failed_compilation: "%{count} fichier(s) de portée en échec de compilation"
41
+ failed_to_compile: "Échec de la compilation de %{basename}"
42
+ no_config_compiler: "L'engine '%{engine}' ne prend pas en charge la compilation de configuration"
43
+ engine_not_found: "Engine '%{engine}' introuvable. %{hint}"
44
+ no_engines_hint: "Aucun plugin d'engine installé. Installez avec : apt install %{package}"
45
+ available_engines: "Engines disponibles : %{engines}"
46
+ design:
47
+ no_documents: "Aucun document de conception à valider."
48
+ validation_failed: "Échec de la validation"
49
+ not_found: "Document de conception '%{name}' introuvable."
50
+ no_documents_found: "Aucun document de conception trouvé."
51
+ valid: "VALIDE"
52
+ invalid: "INVALIDE"
53
+ title: "Documents de conception"
54
+ name: "Nom"
55
+ design_version: "Version"
56
+ status: "Statut"
57
+ domain: "Domaine"
58
+ priority: "Priorité"
59
+ intent: "Intention"
60
+ constraints: "Contraintes"
61
+ acceptance_criteria: "Critères d'acceptation"
62
+ dependencies: "Dépendances"
63
+ examples: "Exemples"
64
+ scenario: "Scénario :"
65
+ expected: "Attendu :"
66
+ not_expected: "Pas :"
67
+ anti_patterns: "Anti-patterns"
68
+ preferences: "Préférences"
69
+ behaviour:
70
+ no_files: "Aucun fichier de comportement trouvé dans conf/behaviour/"
71
+ no_files_short: "Aucun fichier de comportement trouvé."
72
+ not_found: "Comportement '%{name}' introuvable."
73
+ no_validate: "Aucun fichier de comportement à valider."
74
+ files_title: "Fichiers de comportement :"
75
+ table_title: "Configuration des comportements"
76
+ already_exists: "Le comportement '%{name}' existe déjà à %{path}"
77
+ created: "Comportement '%{name}' créé avec succès à %{path}"
78
+ updated: "Comportement '%{name}' mis à jour avec succès."
79
+ deleted: "Comportement '%{name}' supprimé."
80
+ validation_failed_label: "Échec de la validation :"
81
+ referenced_in: "Ce comportement est référencé dans :"
82
+ delete_confirm: "Êtes-vous sûr de vouloir supprimer '%{name}' ?"
83
+ valid: "VALIDE"
84
+ invalid: "INVALIDE"
85
+ validation_failed: "Échec de la validation"
86
+ yaml_syntax_error: "YAML malformé dans %{path} : %{detail}"
87
+ adopt:
88
+ no_files: "Aucun fichier de règle géré trouvé."
89
+ found_files: "%{count} fichier(s) de règle géré(s) trouvé(s)"
90
+ sensitive_skipped: "Fichiers sensibles ignorés : %{count}"
91
+ sensitive_label: "(sensible)"
92
+ local_checks: "Exécution des vérifications structurelles locales"
93
+ analyzing: "Analyse des règles..."
94
+ cached: "(en cache)"
95
+ cache_hit: "Cache trouvé — somme de contrôle correspondante"
96
+ done: "Terminé"
97
+ failed: "Échoué"
98
+ no_issues: "Aucun problème trouvé."
99
+ status_label: "Statut : %{status} %{summary}"
100
+ sensitive_skipped_title: "Fichiers sensibles (exclus de l'analyse API) :"
101
+ error_prefix: "Erreur : %{message}"
102
+ backup:
103
+ success: "Sauvegarde créée avec succès"
104
+ destination: "Destination : %{path}"
105
+ no_scope: "Erreur : au moins --global ou --local doit être spécifié."
106
+ no_files: "Aucun fichier à sauvegarder."
107
+ creating: "Création de l'archive de sauvegarde..."
108
+ compression_unavailable: "La compression '%{type}' n'est pas disponible sur ce système."
109
+ backup_failed: "Échec de la sauvegarde : %{message}"
110
+ summary_title: "Résumé de la sauvegarde"
111
+ status_unchanged: "OK (inchangé)"
112
+ status_created: "Créé"
113
+ status_updated: "Mis à jour"
114
+ files_archived: "Fichiers archivés"
115
+ archive_size: "Taille de l'archive"
116
+ internal_only: "La commande '%{command}' est disponible uniquement dans le dépôt rosett-ai."
117
+ build_package_internal_only: "La commande 'build package' est disponible uniquement dans le dépôt rosett-ai."
118
+ build_engine:
119
+ no_gemspec: "Aucun fichier rosett-ai-engine-*.gemspec trouvé dans %{dir}. Exécutez cette commande depuis un répertoire d'engine ou utilisez --path."
120
+ multiple_gemspecs: "Plusieurs fichiers rosett-ai-engine-*.gemspec trouvés dans %{dir}. Un seul attendu."
121
+ init:
122
+ no_scope: "Erreur : au moins --global, --local ou --project doit être spécifié."
123
+ global_init: "Initialisation de la structure globale ~/.claude/..."
124
+ local_init: "Initialisation de la structure locale .claude/..."
125
+ project_init: "Initialisation de la structure projet .rosett-ai/..."
126
+ project_exists: "La structure projet existe déjà : %{path}"
127
+ compiling: "Compilation des règles..."
128
+ done: "Terminé"
129
+ failed: "Échoué"
130
+ init_failed: "Échec de l'initialisation : %{message}"
131
+ compile_skipped_hint: "Exécutez 'raictl compile' après avoir installé un plugin d'engine."
132
+ summary_title: "Résumé de l'initialisation"
133
+ item: "Élément"
134
+ count: "Nombre"
135
+ dirs_created: "%{prefix} répertoires créés"
136
+ files_copied: "%{prefix} fichiers copiés"
137
+ config_created: "Fichier de configuration créé : %{path}"
138
+ config_exists: "Fichier de configuration existant : %{path}"
139
+ detected_engines_title: "Engines détectés :"
140
+ detected: "détecté"
141
+ not_detected: "non détecté"
142
+ edit_config_hint: "Éditez %{path} pour définir votre engine par défaut."
143
+ mcp_registered: "Serveur MCP rosett-ai enregistré dans %{path}"
144
+ mcp_already_registered: "Serveur MCP rosett-ai déjà enregistré"
145
+ mcp_skipped: "Enregistrement MCP ignoré : %{reason}"
146
+ validate:
147
+ valid: "VALIDE"
148
+ invalid: "INVALIDE"
149
+ summary_title: "Résumé de la validation"
150
+ category: "Catégorie"
151
+ files: "Fichiers"
152
+ passed: "Réussis"
153
+ failed_label: "Échoués"
154
+ status: "Statut"
155
+ ok: "OK"
156
+ fail: "ÉCHEC"
157
+ total: "Total"
158
+ validation_failed: "Échec de la validation"
159
+ documentation:
160
+ no_updates: "Aucune mise à jour de documentation nécessaire."
161
+ scan_complete: "Analyse terminée !"
162
+ updating: "Mise à jour de la documentation..."
163
+ done: "Terminé !"
164
+ pending_updates: "Mises à jour de documentation en attente :"
165
+ status_title: "Statut de la documentation"
166
+ doc_files: "Fichiers de documentation : %{count}"
167
+ configured_locales: "Langues configurées : %{count}"
168
+ undocumented: "Méthodes publiques non documentées"
169
+ not_in_behaviour_md: "Non documenté dans BEHAVIOUR.md"
170
+ gemfile_newer: "Gemfile plus récent que SETUP.md"
171
+ updating_api: "Mise à jour des docs API pour %{file} (%{target_locale})"
172
+ updating_behaviour: "Mise à jour des docs comportement pour %{file} (%{target_locale})"
173
+ updating_setup: "Mise à jour de SETUP.md (%{target_locale})"
174
+ translate_source_missing: "Fichier source introuvable : %{path}"
175
+ translate_done: "Traduit vers %{path}"
176
+ reference:
177
+ stale: "Le PDF de référence technique est obsolète (fichiers source modifiés)"
178
+ missing: "Le PDF de référence technique n'existe pas"
179
+ compiling: "Compilation de la référence technique LaTeX..."
180
+ compiled: "Référence technique compilée : %{path}"
181
+ tools_missing: "Chaîne LaTeX non disponible (manquant : %{tools}). Compilation de la référence ignorée."
182
+ tooling:
183
+ no_ci_files: "Aucun fichier YAML GitLab CI trouvé."
184
+ no_tooling_files: "Aucun fichier d'outillage à valider."
185
+ not_found: "Fichier d'outillage '%{name}' introuvable."
186
+ valid: "VALIDE"
187
+ invalid: "INVALIDE"
188
+ ok: "OK"
189
+ fail: "ÉCHEC"
190
+ ci_title: "Validation YAML GitLab CI"
191
+ ci_valid: "Valides"
192
+ ci_invalid: "Invalides"
193
+ version_title: "Vérification de cohérence des versions"
194
+ expected_version: "Version attendue"
195
+ total_references: "Références totales"
196
+ mismatches: "Incohérences"
197
+ mismatch: "INCOHÉRENCE"
198
+ missing: "MANQUANT"
199
+ conflict: "CONFLIT"
200
+ gem_title: "Cohérence des versions de gems"
201
+ gem_total: "Gems totales"
202
+ gem_ok: "OK"
203
+ gem_problems: "Problèmes"
204
+ gem_stale_refs: "Références obsolètes"
205
+ gem_stale_reference: "OBSOLÈTE"
206
+ gem_status_missing: "MANQUANT"
207
+ gem_status_conflict: "CONFLIT"
208
+ validation_failed: "Échec de la validation"
209
+ ci_validation_failed: "Échec de la validation CI YAML"
210
+ version_check_failed: "Échec de la vérification de cohérence des versions"
211
+ license:
212
+ activate:
213
+ success: "Licence activée : niveau %{tier}. Vous avez accès aux packs de contenu premium."
214
+ invalid: "Clé de licence invalide : %{reason}"
215
+ status:
216
+ title: "Statut de la licence"
217
+ tier_label: "Niveau"
218
+ valid_label: "Valide"
219
+ community: "Aucune clé de licence trouvée. Exécution en niveau Communautaire (fonctionnalité logicielle complète)."
220
+ warning_prefix: "Avertissement"
221
+ deactivate:
222
+ success: "Licence désactivée. Retour au niveau Communautaire."
223
+ not_found: "Aucune clé de licence trouvée."
224
+ content:
225
+ list:
226
+ header: "Packs de contenu installés"
227
+ available_header: "Packs de contenu disponibles"
228
+ no_packs: "Aucun pack de contenu installé."
229
+ name: "Nom"
230
+ version_col: "Version"
231
+ tier: "Niveau"
232
+ description: "Description"
233
+ install:
234
+ downloading: "Téléchargement de %{name}..."
235
+ verifying: "Vérification de la signature..."
236
+ success: "Installé %{name} v%{version} (%{behaviours} comportements, %{designs} conceptions)."
237
+ tampered: "Signature du pack de contenu invalide. Pack non installé."
238
+ tier_required: "%{name} nécessite le niveau %{required}. Votre niveau : %{current}."
239
+ not_found: "Pack de contenu '%{name}' introuvable."
240
+ update:
241
+ checking: "Vérification de %{name}..."
242
+ success: "Tous les packs de contenu mis à jour."
243
+ offline: "Impossible de joindre le serveur de contenu. Packs existants inchangés."
244
+ release:
245
+ prepare:
246
+ success: "Version v%{version} préparée avec succès."
247
+ next_steps: "Prochaines étapes : vérifier le commit, puis exécuter 'bin/raictl release tag' pour créer le tag v%{version}."
248
+ invalid_level: "Niveau de version '%{level}' invalide. Niveaux valides : %{valid}"
249
+ dirty_tree: "L'arbre de travail contient des modifications non commitées. Commitez ou cachez avant de publier."
250
+ running_gates: "Exécution de la suite de vérification..."
251
+ gates_passed: "Toutes les portes de vérification sont passées."
252
+ gate_ok: "OK"
253
+ gate_fail: "ÉCHOUÉ"
254
+ gate_abort: "La suite de vérification a échoué (%{gate}). Corrigez les problèmes avant de publier."
255
+ version_bumped: "Version mise à jour : %{old} → %{new}"
256
+ changelog_updated: "CHANGELOG.md mis à jour."
257
+ commit_created: "Commit de version créé pour v%{version}."
258
+ git_add_failed: "Git add a échoué pour les fichiers de version (version.rb, CHANGELOG.md)."
259
+ git_commit_failed: "Git commit a échoué (hook pre-commit rejeté ?)."
260
+ tag:
261
+ success: "Tag %{tag} créé."
262
+ exists: "Le tag %{tag} existe déjà."
263
+ git_tag_failed: "Git tag %{tag} a échoué."
264
+ status:
265
+ title: "Statut de la version"
266
+ version_label: "Version actuelle"
267
+ last_tag_label: "Dernier tag"
268
+ commits_label: "Commits depuis le tag"
269
+ no_tags: "(aucun)"
270
+ build:
271
+ summary_title: "Résumé de la compilation"
272
+ build_id: "ID de compilation"
273
+ architecture: "Architecture"
274
+ ruby_version: "Version Ruby"
275
+ stages: "Étapes"
276
+ result: "Résultat"
277
+ output: "Sortie"
278
+ build_log: "Journal de compilation"
279
+ duration: "Durée"
280
+ success: "RÉUSSI"
281
+ failed: "ÉCHOUÉ"
282
+ done: "Terminé"
283
+ engines:
284
+ list_title: "Engines disponibles"
285
+ detect_title: "Détection des engines"
286
+ status_title: "Statut des engines"
287
+ name: "Nom"
288
+ display_name: "Nom d'affichage"
289
+ version: "Version"
290
+ engine: "Engine"
291
+ check_type: "Vérification"
292
+ check_name: "Cible"
293
+ status: "Statut"
294
+ detected: "Détecté"
295
+ default: "Par défaut"
296
+ default_engine: "Engine par défaut"
297
+ found: "trouvé"
298
+ not_found: "introuvable"
299
+ yes: "oui"
300
+ no: "non"
301
+ no_detector: "n/a"
302
+ plugins_title: "Plugins d'engine enregistrés"
303
+ no_plugins: "Aucun plugin d'engine enregistré."
304
+ dbus:
305
+ status_title: "Statut du service D-Bus"
306
+ not_running: "Le service D-Bus n'est pas en cours d'exécution"
307
+ start_hint: "Démarrer avec : %{command}"
308
+ already_running: "Le service D-Bus est déjà en cours d'exécution"
309
+ starting: "Démarrage du service D-Bus..."
310
+ press_ctrl_c: "Appuyez sur Ctrl+C pour arrêter"
311
+ started_background: "Service D-Bus démarré en arrière-plan (PID : %{pid})"
312
+ stopped: "Service D-Bus arrêté"
313
+ start_failed: "Échec du démarrage du service D-Bus"
314
+ bus_unavailable: "Le bus de session D-Bus n'est pas disponible"
315
+ bus_unavailable_hint: "Assurez-vous que D-Bus est en cours d'exécution et que DBUS_SESSION_BUS_ADDRESS est défini."
316
+ error_querying: "Erreur lors de l'interrogation du service : %{message}"
317
+ detect_title: "Détection du compositeur"
318
+ detected: "Détecté"
319
+ adapter: "Adaptateur"
320
+ env_title: "Variables d'environnement"
321
+ adapter_none: "Aucun (compositeur inconnu)"
322
+ property: "Propriété"
323
+ value: "Valeur"
324
+ variable: "Variable"
325
+ not_set: "(non défini)"
326
+ missing_dependency: "Les fonctions bureau nécessitent la gem ruby-dbus. Installer avec : apt install rosett-ai-gtk4"
327
+ desktop:
328
+ status_title: "Statut de l'intégration bureau"
329
+ gtk4_label: "GTK4/Adwaita"
330
+ dbus_label: "Service D-Bus"
331
+ available: "Disponible"
332
+ not_installed: "Non installé"
333
+ running: "En cours d'exécution"
334
+ not_running: "Non exécuté"
335
+ to_enable_gtk4: "Pour activer le support GTK4 :"
336
+ install_adwaita: "gem install adwaita"
337
+ install_pkg: "Ou : apt install rosett-ai-gtk4"
338
+ to_start_dbus: "Pour démarrer le service D-Bus :"
339
+ unavailable: "GTK4/Adwaita n'est pas disponible."
340
+ plugins:
341
+ title: "Plugins installés"
342
+ no_plugins: "Aucun plugin %{type} enregistré."
343
+ name: "Nom"
344
+ display_name: "Nom d'affichage"
345
+ version: "Version"
346
+ type: "Type"
347
+ installing: "Installation de %{package}..."
348
+ installed: "%{package} installé avec succès."
349
+ install_failed: "Échec de l'installation de %{package}."
350
+ removing: "Suppression de %{package}..."
351
+ removed: "%{package} supprimé avec succès."
352
+ remove_failed: "Échec de la suppression de %{package}."
353
+ invalid_type: "Type de plugin invalide : %{type}. Types valides : engine, gui, mcp"
354
+ composition:
355
+ composing: "Composition de %{count} fichier(s) de comportement..."
356
+ scope_resolved: " %{name} : portée=%{scope} (%{count} règles)"
357
+ conflict_warning: "Avertissement : %{message}"
358
+ conflict_error: "Erreur : %{message}"
359
+ no_conflicts: "Aucun conflit d'identifiant de règle détecté."
360
+ conflicts_title: "Conflits d'identifiants de règles"
361
+ circular_dependency: "Dépendance circulaire détectée : %{cycle}"
362
+ lockfile_written: "Fichier de verrouillage écrit : %{path}"
363
+ lockfile_stale: "Les fichiers de comportement ont changé depuis le verrouillage — exécutez 'bin/raictl compile --vendor' pour mettre à jour."
364
+ lockfile_frozen: "Utilisation de la composition gelée du fichier de verrouillage."
365
+ sensitive_excluded: "Exclusion de %{count} règle(s) sensible(s) de la cible %{target}"
366
+ trace_header: "Trace de composition :"
367
+ trace_entry: " #%{position} : %{rule_id} ← %{behaviour} (portée=%{scope}, priorité=%{priority})"
368
+ security_override: "Impossible de remplacer la règle de sécurité %{rule_id} par une règle non sécuritaire de %{behaviour}"
369
+ provenance:
370
+ init_created: "Fichier de provenance créé : %{path}"
371
+ init_exists: "Le fichier de provenance existe déjà : %{path}"
372
+ entry_added: "Entrée de provenance ajoutée pour le commit %{commit}"
373
+ validate_valid: "Le fichier de provenance est valide (%{count} entrées)"
374
+ validate_invalid: "La validation de provenance a échoué :"
375
+ validate_error: " - %{error}"
376
+ show_commit_title: "Provenance du commit %{commit}"
377
+ show_file_title: "Provenance du fichier %{path}"
378
+ show_no_entries: "Aucune entrée de provenance trouvée"
379
+ show_entry: " %{role} : %{tool} (%{timestamp})"
380
+ file_not_found: "Fichier de provenance introuvable. Exécutez 'raictl provenance init' d'abord."
381
+ file_too_large: "Le fichier de provenance dépasse la limite de taille"
382
+ trailer_generated: "%{count} trailer(s) de commit généré(s)"
383
+ ai_config:
384
+ compile_start: "Compilation de la configuration IA pour le moteur '%{engine}'..."
385
+ model_resolved: " %{task} : %{tier} -> %{model}"
386
+ unsupported_warning: "Avertissement : %{message}"
387
+ compile_complete: "Configuration IA compilée (%{count} paramètres)"
388
+ validate_valid: "La configuration IA est valide"
389
+ validate_invalid: "La validation de la configuration IA a échoué :"
390
+ validate_error: " - %{error}"
391
+ fallback_warning: "Avertissement : %{message}"
392
+ strict_error: "Erreur (mode strict) : %{message}"
393
+ no_config: "Aucune configuration IA trouvée à %{path}"
394
+ authorship:
395
+ status_title: "Statut de la divulgation d'auteur"
396
+ disclosure_level: "Niveau de divulgation : %{level}"
397
+ no_provenance: "Aucune donnée de provenance disponible"
398
+ recent_attributions: "Attributions IA récentes :"
399
+ no_attributions: "Aucune attribution IA trouvée"
400
+ self_review_warning: "Auto-revue détectée : le relecteur correspond à l'auteur du commit"
401
+ self_review_error: "Auto-revue rejetée : le relecteur doit différer de l'auteur du commit (--strict)"
402
+ attribution_compiled: "Attribution d'auteur compilée pour %{engine}"
403
+ attribution_skipped: "Attribution d'auteur ignorée (divulgation : none)"
404
+ engine_no_trailers: "Le moteur '%{engine}' ne prend pas en charge les trailers de commit"
405
+ policy:
406
+ init_created: "Répertoire de politiques créé : %{path}"
407
+ init_exists: "Le répertoire de politiques existe déjà : %{path}"
408
+ validate_valid: "Le fichier de politique est valide"
409
+ validate_invalid: "La validation de la politique a échoué :"
410
+ validate_error: " - %{error}"
411
+ show_title: "Politiques actives"
412
+ show_tier: "Niveau : %{tier}"
413
+ show_scope: "Portée : %{scope}"
414
+ show_deny_patterns: "Liste de refus : %{count} motifs"
415
+ show_protected_files: "Fichiers protégés : %{count}"
416
+ audit_title: "Audit de conformité des politiques"
417
+ audit_deny_patterns: "Motifs de refus : %{count}"
418
+ audit_denied_files: "Fichiers refusés : %{count}"
419
+ audit_protected_files: "Fichiers protégés : %{count}"
420
+ audit_opted_out: "Fichiers exclus : %{count}"
421
+ audit_compliant: "Statut de conformité : RÉUSSI"
422
+ tighten_only_error: "Impossible de supprimer un motif de refus de la politique parente — resserrement uniquement"
423
+ no_policies: "Aucun fichier de politique trouvé. Exécutez 'raictl policy init' d'abord."
424
+ doctor:
425
+ unexpected_error: "Le contrôle a échoué de manière inattendue — voir les détails ci-dessus"
426
+ header:
427
+ check: "Contrôle"
428
+ status: "Statut"
429
+ details: "Détails"
430
+ summary:
431
+ all_pass: "Les %{total} contrôles sont passés"
432
+ warnings: "%{total} contrôles terminés, %{warn} avertissement(s)"
433
+ failures: "%{total} contrôles terminés, %{fail} échec(s)"
434
+ ruby_version:
435
+ match: "Ruby %{version}"
436
+ mismatch: "Ruby %{actual} en cours, %{expected} attendu"
437
+ install: "Installer Ruby %{version} via rbenv : rbenv install %{version}"
438
+ no_file: "Fichier .ruby-version introuvable"
439
+ create_file: "Créer .ruby-version avec la version Ruby attendue"
440
+ gem_dependencies:
441
+ all_installed: "Toutes les dépendances installées (%{count} gems chargées)"
442
+ missing: "Gems manquantes : %{gems}"
443
+ no_lockfile: "Gemfile.lock introuvable"
444
+ run_bundle: "Exécutez 'bundle install' pour installer les dépendances"
445
+ file_permissions:
446
+ writable: "Tous les répertoires de configuration sont accessibles en écriture"
447
+ not_writable: "Répertoires non accessibles en écriture : %{dirs}"
448
+ fix_permissions: "Corriger les permissions avec : chmod u+w <répertoire>"
449
+ dbus_availability:
450
+ available: "Bus de session D-Bus disponible"
451
+ unavailable: "Bus de session D-Bus non disponible"
452
+ install_dbus: "Installer D-Bus : apt install dbus et définir DBUS_SESSION_BUS_ADDRESS"
453
+ engine_detection:
454
+ found: "Moteurs détectés : %{engines}"
455
+ none_found: "Aucun moteur détecté"
456
+ install_engine: "Installer un moteur : apt install rosett-ai-engine-claude (ou un autre moteur)"
457
+ cache_health:
458
+ writable: "Répertoire de cache accessible en écriture : %{path}"
459
+ not_found: "Répertoire de cache introuvable : %{path}"
460
+ create_dir: "Créer le répertoire de cache : mkdir -p %{path}"
461
+ not_writable: "Répertoire de cache non accessible en écriture : %{path}"
462
+ fix_permissions: "Corriger les permissions du cache : chmod u+w %{path}"
463
+ stale_home_nncc:
464
+ clean: "Pas de répertoire .rosett-ai/ obsolète dans $HOME"
465
+ found: "Répertoire .rosett-ai/ obsolète à %{path} contient %{count} fichier(s) de comportement"
466
+ empty: "Répertoire .rosett-ai/ obsolète à %{path} (aucun fichier de comportement)"
467
+ remove: "Vérifier et supprimer le répertoire obsolète : rm -rf %{path}"
468
+ stale_config_nncc:
469
+ clean: "Pas de répertoire ~/.config/nncc/ obsolète"
470
+ found: "Répertoire ~/.config/nncc/ obsolète à %{path} contient %{count} fichier(s)"
471
+ empty: "Répertoire ~/.config/nncc/ obsolète à %{path} (vide)"
472
+ migrate: "Exécuter raictl migrate pour déplacer la configuration vers ~/.config/rosett-ai/"
473
+ comply:
474
+ summary:
475
+ all_pass: "%{total} vérifications : toutes réussies"
476
+ warnings: "%{total} vérifications : %{pass} réussies, %{warn} avertissements"
477
+ failures: "%{total} vérifications : %{pass} réussies, %{fail} échecs"
478
+ header:
479
+ id: "ID"
480
+ status: "Statut"
481
+ description: "Description"
482
+ details: "Détails"
483
+ workflow:
484
+ no_files: "Aucun fichier de workflow trouvé."
485
+ list_title: "Workflows disponibles"
486
+ name: "Nom"
487
+ version: "Version"
488
+ steps_count: "Étapes"
489
+ path: "Chemin"
490
+ valid: "Le workflow '%{name}' est valide."
491
+ invalid: "Le workflow '%{name}' contient des erreurs de validation :"
492
+ not_found: "Workflow '%{name}' introuvable."
493
+ simulate_header: "Simulation pour le workflow '%{name}' :"
494
+ run_title: "Workflow : %{name}"
495
+ step_label: "Étape"
496
+ status_label: "Statut"
497
+ message_label: "Message"
498
+ duration_label: "Durée"
499
+ run_summary: "%{total} étapes : %{pass} réussies, %{fail} échouées, %{skip} ignorées"
500
+ project:
501
+ info_title: "Informations du projet"
502
+ status_title: "Statut du projet"
503
+ name_label: "Projet"
504
+ engine_label: "Engine"
505
+ template_label: "Modèle"
506
+ behaviours_label: "Comportements"
507
+ designs_label: "Conceptions"
508
+ healthy: "Le projet est en bon état."
509
+ unhealthy: "Le projet a des problèmes :"
510
+ no_templates: "Aucun modèle de projet disponible."
511
+ templates_title: "Modèles disponibles :"
512
+ apply_summary: "%{applied} fichier(s) appliqué(s), %{skipped} fichier(s) ignoré(s)."
513
+ no_drift: "Aucune dérive détectée."
514
+ drift_detected: "%{count} fichier(s) avec dérive détecté(s)."
515
+ sync_summary: "%{updated} fichier(s) mis à jour, %{conflicts} conflit(s)."
516
+ simulate_prefix: "(simulation) "
517
+ retrofit:
518
+ no_engines: "Aucun adaptateur d'engine de rétro-ingénierie disponible."
519
+ engines_title: "Engines de rétro-ingénierie disponibles :"
520
+ simulate_prefix: "(simulation) "
521
+ summary: "%{generated} fichier(s) généré(s), %{skipped} fichier(s) ignoré(s), %{errors} erreur(s)."
522
+ hooks:
523
+ no_config: "Aucun hook configuré dans .rosett-ai/config.yml"
524
+ no_hooks_installed: "Aucun hook rai n'est actuellement installé."
525
+ detected_managers: "Gestionnaires de hooks détectés : %{managers}"
526
+ install_summary: "%{count} hook(s) installé(s)."
527
+ uninstall_summary: "%{count} hook(s) supprimé(s)."
528
+ mcp:
529
+ no_servers: "Aucun serveur MCP configuré."
530
+ serve_started: "Serveur MCP démarré sur le transport stdio."
531
+ audit_complete: "Audit terminé : %{total} serveur(s) vérifié(s)."
532
+ completion:
533
+ bash: "Script de complétion bash généré"
534
+ zsh: "Script de complétion zsh généré"
535
+ fish: "Script de complétion fish généré"
536
+ install_success: "Complétion %{shell} installée dans %{path}"
537
+ unsupported_shell: "Le shell %{shell} n'est pas supporté — disponibles : %{available}"
538
+ feature_flags:
539
+ not_enabled: "'raictl %{feature}' est expérimental et non activé. Activer avec : %{env_example}"
540
+ unknown_flag: "Attention : fonctionnalité expérimentale inconnue '%{flag}'. Fonctionnalités connues : %{known}"
541
+ validation:
542
+ required: "%{field} est requis"
543
+ invalid_format: "%{field} a un format invalide"
544
+ schema_error: "Échec de la validation du schéma : %{message}"
545
+ errors:
546
+ compile_error: "Échec de la compilation : %{message}"
547
+ yaml_syntax: "Erreur de syntaxe YAML dans %{file} : %{message}"
548
+ unknown_target: "Cible inconnue : %{name}"
549
+ permission_denied: "Autorisation refusée : %{path}"
550
+ error_handler:
551
+ error_prefix: "Erreur [%{code}]"
552
+ why_prefix: "Pourquoi"
553
+ fix_prefix: "Correction"
554
+ type_prefix: "Type"
555
+ backtrace_header: "Trace d'appels (10 premières lignes)"
556
+ exit_codes:
557
+ success: "Succès"
558
+ general: "Erreur générale"
559
+ validation: "Erreur de validation"
560
+ config: "Erreur de configuration"
561
+ permission: "Erreur de permission"
562
+ dependency: "Erreur de dépendance"
563
+ deprecation:
564
+ warning: "[OBSOLÈTE] %{feature} est obsolète depuis v%{since}, utilisez %{replacement} à la place. Sera supprimé dans v%{removal}."
565
+ migration:
566
+ missing_field: "Migration nécessaire : %{file} manque le champ requis '%{field}'."
567
+ deprecated_field: "Migration nécessaire : %{file} utilise le champ obsolète '%{field}', utilisez '%{replacement}' à la place."
@@ -0,0 +1,81 @@
1
+ #!/bin/bash
2
+ # DEPRECATED: This script is replaced by 'bin/raictl build engine'.
3
+ # Use: bin/raictl build engine --path /path/to/engine --verbose
4
+ # Or from the engine directory: rai build engine --verbose
5
+ # This script will be removed in the next release.
6
+ #
7
+ # Build a .deb package for a rosett-ai engine gem.
8
+ #
9
+ # Engine .debs install their gem (+ dependencies) into the rosett-ai embedded
10
+ # Ruby's gem directory so that Gem.find_files('rosett_ai_engine/*/register.rb')
11
+ # discovers them at runtime.
12
+ #
13
+ # Required environment variables:
14
+ # ENGINE_NAME — gem name, e.g. "rosett-ai-engine-claude"
15
+ # ENGINE_VERSION — gem version, e.g. "1.0.0"
16
+ #
17
+ # Optional:
18
+ # RAI_MIN_VERSION — minimum rai version dependency (default: 1.0.0)
19
+ # OUTPUT_DIR — output directory (default: pkg/)
20
+ # RUBY_ABI — Ruby ABI version (default: 3.3.10)
21
+ #
22
+ # Usage from an engine repo:
23
+ # ENGINE_NAME=rosett-ai-engine-acme ENGINE_VERSION=0.1.0 bash ../rosett-ai/packaging/build-engine-deb.sh
24
+ #
25
+ # SPDX-License-Identifier: GPL-3.0-only
26
+ # Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
27
+ set -euo pipefail
28
+
29
+ echo "WARNING: This script is deprecated. Use 'bin/raictl build engine' instead." >&2
30
+
31
+ : "${ENGINE_NAME:?ENGINE_NAME must be set (e.g. rosett-ai-engine-claude)}"
32
+ : "${ENGINE_VERSION:?ENGINE_VERSION must be set (e.g. 1.0.0)}"
33
+ : "${RAI_MIN_VERSION:=1.0.0}"
34
+ : "${OUTPUT_DIR:=pkg}"
35
+ : "${RUBY_ABI:=3.3.10}"
36
+
37
+ GEM_INSTALL_DIR="/opt/rosett-ai/embedded/lib/ruby/gems/${RUBY_ABI}"
38
+ STAGING_DIR="tmp/staging"
39
+ STAGING_GEM_DIR="${STAGING_DIR}${GEM_INSTALL_DIR}"
40
+
41
+ echo "Building ${ENGINE_NAME} ${ENGINE_VERSION} .deb package..."
42
+
43
+ # Clean previous staging
44
+ rm -rf "${STAGING_DIR}"
45
+ mkdir -p "${STAGING_GEM_DIR}" "${OUTPUT_DIR}"
46
+
47
+ # Build the .gem
48
+ gem build "${ENGINE_NAME}.gemspec" --output="tmp/${ENGINE_NAME}-${ENGINE_VERSION}.gem"
49
+
50
+ # Install gem into staging tree (--install-dir places it correctly)
51
+ gem install \
52
+ --local \
53
+ --install-dir "${STAGING_GEM_DIR}" \
54
+ --no-document \
55
+ --ignore-dependencies \
56
+ "tmp/${ENGINE_NAME}-${ENGINE_VERSION}.gem"
57
+
58
+ # Build .deb with fpm
59
+ fpm \
60
+ -s dir \
61
+ -t deb \
62
+ --name "${ENGINE_NAME}" \
63
+ --version "${ENGINE_VERSION}" \
64
+ --iteration 1 \
65
+ --maintainer 'NeatNerds <query@neatnerds.be>' \
66
+ --vendor 'NeatNerds' \
67
+ --description "rosett-ai engine plugin: ${ENGINE_NAME}" \
68
+ --url "https://gitlab.neatnerds.be/neatnerds/${ENGINE_NAME}" \
69
+ --license 'GPL-3.0-only' \
70
+ --architecture all \
71
+ --category devel \
72
+ --depends "rosett-ai (>= ${RAI_MIN_VERSION})" \
73
+ --directories "${GEM_INSTALL_DIR}" \
74
+ --deb-compression xz \
75
+ --package "${OUTPUT_DIR}/${ENGINE_NAME}_${ENGINE_VERSION}-1_all.deb" \
76
+ --force \
77
+ -C "${STAGING_DIR}" \
78
+ .
79
+
80
+ echo "Built: ${OUTPUT_DIR}/${ENGINE_NAME}_${ENGINE_VERSION}-1_all.deb"
81
+ dpkg-deb --info "${OUTPUT_DIR}/${ENGINE_NAME}_${ENGINE_VERSION}-1_all.deb"
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # Rosett-AI - Post-installation script
3
+ set -e
4
+
5
+ INSTALL_DIR="/opt/rosett-ai"
6
+ CONFIG_DIR="/etc/rosett-ai"
7
+
8
+ # /etc/rosett-ai/settings.json is shipped in the package and managed by dpkg
9
+ # as a conffile (user modifications are preserved on upgrade).
10
+
11
+ # Create PATH-accessible symlinks
12
+ ln -sf "${INSTALL_DIR}/bin/raictl" /usr/local/bin/raictl
13
+ ln -sf "${INSTALL_DIR}/bin/raictl" /usr/local/bin/rai
14
+ ln -sf "${INSTALL_DIR}/bin/raictl" /usr/local/bin/rosett-ai
15
+ chmod 755 "${INSTALL_DIR}/bin/raictl"
16
+
17
+ exit 0