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,417 @@
1
+ # Engine Development Guide
2
+
3
+ This guide covers everything needed to create a third-party rosett-ai engine plugin.
4
+ Engines are separate Ruby gems that extend rosett-ai with compilation backends,
5
+ autodetection, API executors, and configuration compilers for specific AI tools.
6
+
7
+ ## Architecture Overview
8
+
9
+ Engines are packaged as gems named `rosett-ai-engine-<name>` under the `RosettAiEngine::`
10
+ namespace. Each engine is self-contained — it has no dependencies on other engines
11
+ and only depends on `rosett-ai` core for base classes and the plugin registry.
12
+
13
+ ```text
14
+ rosett-ai-engine-myengine/
15
+ ├── rosett-ai-engine-myengine.gemspec
16
+ ├── lib/
17
+ │ └── rosett_ai_engine/
18
+ │ └── myengine/
19
+ │ ├── register.rb # Self-registration entry point (required)
20
+ │ ├── engine.rb # Engine module with component declarations
21
+ │ ├── backend.rb # Compilation backend (required)
22
+ │ ├── detector.rb # Autodetection (optional)
23
+ │ ├── executor.rb # API executor for adopt (optional)
24
+ │ └── config_compiler.rb # Settings compiler (optional)
25
+ ├── conf/
26
+ │ └── manifest.yml # Capability manifest (required)
27
+ ├── spec/
28
+ │ └── ... # RSpec tests
29
+ └── Gemfile
30
+ ```
31
+
32
+ ## Manifest File
33
+
34
+ Every engine must have a `conf/manifest.yml` in its gem root directory. This file
35
+ declares the engine's name, components, detection rules, and capabilities.
36
+
37
+ ### Required Fields
38
+
39
+ ```yaml
40
+ name: myengine # lowercase, a-z, 0-9, underscore
41
+ display_name: "My Engine (Vendor)" # Human-readable name
42
+ version: "1.0.0" # Semantic version
43
+
44
+ components:
45
+ backend: true # Required: always true
46
+
47
+ capabilities:
48
+ compile: true # Required: always true
49
+ ```
50
+
51
+ ### Optional Fields
52
+
53
+ ```yaml
54
+ components:
55
+ backend: true
56
+ detector: true # Provides autodetection
57
+ executor: true # Provides API executor
58
+ config_compiler: true # Compiles settings files
59
+ scaffolder: true # Project scaffolding
60
+
61
+ detection:
62
+ cli_binary: myengine # Check: which <binary>
63
+ config_dir: "~/.myengine" # Check: Dir.exist?
64
+ env_var: MYENGINE_API_KEY # Check: ENV[var] set
65
+
66
+ execution:
67
+ api_gem: myengine-sdk # Ruby gem for API client
68
+ model: "myengine-v1" # Default model
69
+ api_type: sdk # cli | http | grpc | sdk | openai_compatible
70
+ default_endpoint: "https://api.myengine.com"
71
+ cli_binary: myengine
72
+
73
+ capabilities:
74
+ compile: true
75
+ config: false # settings.json compilation
76
+ adopt_api: true # Remote adopt analysis
77
+ settings_json: false # settings.json support
78
+ local_only: false # Local-only LLM
79
+ sensitive_filtering: true # Filter sensitive behaviours
80
+ rule_metadata: true # Preserve rule IDs/priority
81
+ ```
82
+
83
+ The manifest is validated against `conf/schemas/engine_manifest_schema.json`
84
+ during plugin registration.
85
+
86
+ ## Registration
87
+
88
+ Engines self-register via a `register.rb` file that is discovered automatically
89
+ by rosett-ai's plugin registry.
90
+
91
+ ### lib/rosett_ai_engine/myengine/register.rb
92
+
93
+ ```ruby
94
+ # frozen_string_literal: true
95
+
96
+ require_relative 'engine'
97
+
98
+ RosettAi::Plugins::Registry.register(
99
+ :engine,
100
+ 'myengine',
101
+ RosettAiEngine::Myengine::Engine
102
+ )
103
+ ```
104
+
105
+ ### lib/rosett_ai_engine/myengine/engine.rb
106
+
107
+ ```ruby
108
+ # frozen_string_literal: true
109
+
110
+ module RosettAiEngine
111
+ module Myengine
112
+ module Engine
113
+ extend RosettAi::Plugins::EngineContract
114
+
115
+ def self.engine_name = 'myengine'
116
+ def self.display_name = 'My Engine (Vendor)'
117
+ def self.version = '1.0.0'
118
+ def self.manifest_path = Pathname.new(__dir__).join('../../conf/manifest.yml')
119
+ def self.backend_class = RosettAiEngine::Myengine::Backend
120
+ def self.detector_class = RosettAiEngine::Myengine::Detector # optional
121
+ def self.executor_class = RosettAiEngine::Myengine::Executor # optional
122
+ end
123
+ end
124
+ end
125
+ ```
126
+
127
+ ## Component Interfaces
128
+
129
+ ### Backend (Required)
130
+
131
+ The backend compiles behaviour YAML into the engine's native format (markdown,
132
+ JSON, TOML, etc.).
133
+
134
+ ```ruby
135
+ # frozen_string_literal: true
136
+
137
+ module RosettAiEngine
138
+ module Myengine
139
+ class Backend < RosettAi::Compiler::Backend
140
+ # Render compiled behaviour data into engine-native format.
141
+ #
142
+ # @param data [Hash] behaviour data with keys:
143
+ # - :name [String] behaviour name
144
+ # - :description [String] behaviour description
145
+ # - :version [String] behaviour version
146
+ # - :rules [Array<Hash>] sorted rules with :id, :description, :priority
147
+ # - :category [String] compilation category
148
+ # @return [String] compiled output
149
+ def render(data)
150
+ lines = []
151
+ lines << "# #{data[:name]}"
152
+ lines << ""
153
+ data[:rules].each do |rule|
154
+ lines << "- #{rule[:description]}"
155
+ end
156
+ lines.join("\n")
157
+ end
158
+
159
+ # Marker prefix for identifying managed files.
160
+ # Used in generated comments to detect orphaned output files.
161
+ #
162
+ # @return [String]
163
+ def generated_marker
164
+ 'rosett-ai-myengine-managed'
165
+ end
166
+ end
167
+ end
168
+ end
169
+ ```
170
+
171
+ ### Detector (Optional)
172
+
173
+ The detector checks whether the AI tool is installed on the system.
174
+ The base class reads detection rules from the manifest; override
175
+ `custom_checks` for engine-specific probing.
176
+
177
+ ```ruby
178
+ # frozen_string_literal: true
179
+
180
+ module RosettAiEngine
181
+ module Myengine
182
+ class Detector < RosettAi::Engines::Detector
183
+ protected
184
+
185
+ # Add custom detection checks beyond manifest-driven ones.
186
+ #
187
+ # @return [Array<Hash>] check results with :type, :name, :passed
188
+ def custom_checks
189
+ checks = []
190
+ # Example: check for engine-specific config file
191
+ config = File.expand_path('~/.myengine/config.json')
192
+ checks << { type: 'file', name: config, passed: File.exist?(config) }
193
+ checks
194
+ end
195
+ end
196
+ end
197
+ end
198
+ ```
199
+
200
+ ### Executor (Optional)
201
+
202
+ The executor calls the AI tool's API for `rai adopt --api` analysis.
203
+
204
+ ```ruby
205
+ # frozen_string_literal: true
206
+
207
+ module RosettAiEngine
208
+ module Myengine
209
+ class Executor
210
+ def initialize(api_key:, base_url: nil)
211
+ @api_key = api_key
212
+ @base_url = base_url
213
+ end
214
+
215
+ # Analyze rules by sending a prompt to the AI tool.
216
+ #
217
+ # @param prompt [String] the analysis prompt
218
+ # @return [Hash] structured analysis results
219
+ def analyze(prompt)
220
+ # Call the AI tool's API
221
+ # Return structured results
222
+ end
223
+ end
224
+ end
225
+ end
226
+ ```
227
+
228
+ ### ConfigCompiler (Optional)
229
+
230
+ The config compiler transforms rosett-ai scope YAML files into engine-native
231
+ configuration (e.g., `settings.json` for Claude Code).
232
+
233
+ ```ruby
234
+ # frozen_string_literal: true
235
+
236
+ module RosettAiEngine
237
+ module Myengine
238
+ class ConfigCompiler < RosettAi::Engines::BaseConfigCompiler
239
+ protected
240
+
241
+ def config_dir
242
+ Pathname.new(File.expand_path('~/.myengine'))
243
+ end
244
+
245
+ def schema_path
246
+ Pathname.new(__dir__).join('../../conf/schemas/scope_schema.json')
247
+ end
248
+
249
+ def scope_router
250
+ ScopeRouter.new
251
+ end
252
+
253
+ # Transform scope data into engine-native format.
254
+ #
255
+ # @param data [Hash] validated scope YAML data
256
+ # @param scope [String] scope name (e.g., "managed", "user")
257
+ # @return [Array(Hash, Array<String>)] [output_data, warnings]
258
+ def transform(data, scope)
259
+ output = {}
260
+ warnings = []
261
+ # Transform data to engine-native format
262
+ [output, warnings]
263
+ end
264
+
265
+ def output_format
266
+ :json # or :yaml
267
+ end
268
+ end
269
+ end
270
+ end
271
+ ```
272
+
273
+ ## Capability Checking
274
+
275
+ When a user compiles for your engine, rosett-ai checks the manifest's `capabilities`
276
+ against the source behaviours. If a behaviour uses features your engine does not
277
+ support, rosett-ai emits a warning:
278
+
279
+ ```text
280
+ WARNING: Engine 'myengine' does not support sensitive_filtering — 2 rule(s) compiled without it
281
+ ```
282
+
283
+ With `--strict`, these warnings become errors and compilation is aborted.
284
+
285
+ Declare only the capabilities your engine actually supports in `manifest.yml`.
286
+
287
+ ## Plugin Discovery
288
+
289
+ raictl discovers engines through three mechanisms (in order):
290
+
291
+ 1. **Gem discovery**: `Gem.find_files('rosett_ai_engine/*/register.rb')` finds
292
+ installed engine gems automatically
293
+ 2. **Embedded gems**: Scans `/opt/rosett-ai/embedded/` for pre-installed engines
294
+ (used in `.deb` packages)
295
+ 3. **Custom paths**: `RAI_ENGINE_PATH=/path/to/engines` adds custom search
296
+ directories (colon-separated)
297
+
298
+ ## Gemspec Requirements
299
+
300
+ ```ruby
301
+ Gem::Specification.new do |spec|
302
+ spec.name = 'rosett-ai-engine-myengine'
303
+ spec.version = '1.0.0'
304
+ spec.authors = ['Your Name']
305
+ spec.summary = 'rosett-ai engine for My Engine'
306
+ spec.license = 'GPL-3.0-only'
307
+
308
+ spec.required_ruby_version = '>= 3.3.0'
309
+
310
+ # Runtime dependency on rosett-ai core
311
+ spec.add_dependency 'rosett-ai', '~> 1.0'
312
+
313
+ # Engine-specific API client (if executor is provided)
314
+ spec.add_dependency 'myengine-sdk', '~> 2.0'
315
+ end
316
+ ```
317
+
318
+ ## Testing
319
+
320
+ ### Unit Tests
321
+
322
+ Test each component independently using RSpec:
323
+
324
+ ```ruby
325
+ RSpec.describe RosettAiEngine::Myengine::Backend do
326
+ let(:backend) { described_class.new }
327
+
328
+ describe '#render' do
329
+ it 'renders behaviour data to engine format' do
330
+ data = {
331
+ name: 'test',
332
+ description: 'Test behaviour',
333
+ version: '1.0.0',
334
+ rules: [{ id: 'r1', description: 'Rule one', priority: 50 }],
335
+ category: 'general'
336
+ }
337
+ result = backend.render(data)
338
+ expect(result).to include('Rule one')
339
+ end
340
+ end
341
+ end
342
+ ```
343
+
344
+ ### Manifest Validation
345
+
346
+ ```ruby
347
+ RSpec.describe 'manifest.yml' do
348
+ it 'is valid against engine manifest schema' do
349
+ manifest_path = File.expand_path('../../conf/manifest.yml', __dir__)
350
+ schema_path = File.expand_path('../../conf/schemas/engine_manifest_schema.json', __dir__)
351
+
352
+ manifest = YAML.safe_load(File.read(manifest_path))
353
+ schema = JSON.parse(File.read(schema_path))
354
+
355
+ errors = JSON::Validator.validate!(schema, manifest)
356
+ expect(errors).to be true
357
+ end
358
+ end
359
+ ```
360
+
361
+ ### Integration Test
362
+
363
+ ```ruby
364
+ RSpec.describe 'engine registration' do
365
+ it 'registers with rosett-ai plugin registry' do
366
+ require 'rosett_ai_engine/myengine/register'
367
+ expect(RosettAi::Plugins::Registry.registered?(:engine, 'myengine')).to be true
368
+ end
369
+ end
370
+ ```
371
+
372
+ ## Quality Gates
373
+
374
+ Engine gems should enforce the same quality gates as rosett-ai core:
375
+
376
+ | Tool | Requirement |
377
+ |------|-------------|
378
+ | RuboCop | 0 offenses |
379
+ | Reek | Clean (with documented exclusions) |
380
+ | Fasterer | 0 offenses |
381
+ | Flay (mass: 16) | No duplication |
382
+ | RSpec | All specs green |
383
+ | SimpleCov | Coverage appropriate to engine complexity |
384
+ | Gitleaks | No secrets |
385
+ | Overcommit | All hooks pass |
386
+
387
+ ## CI/CD
388
+
389
+ Use the shared CI component for consistent pipeline configuration:
390
+
391
+ ```yaml
392
+ # .gitlab-ci.yml
393
+ include:
394
+ - component: gitlab.neatnerds.be/neatnerds/NeatNerds-AI/ci-components/rosett-ai-engine@1.0.1
395
+ inputs:
396
+ ruby_version: "3.3.10"
397
+ ```
398
+
399
+ ## Scaffold Generator
400
+
401
+ Use `rosett-ai-dev-tools` to generate a new engine skeleton:
402
+
403
+ ```bash
404
+ gem install rosett-ai-dev-tools
405
+ rosett-ai-scaffold engine myengine --display-name "My Engine (Vendor)"
406
+ ```
407
+
408
+ This creates the full directory structure with manifest, registration,
409
+ backend stub, tests, CI configuration, and gemspec.
410
+
411
+ ## Security Requirements
412
+
413
+ - Use `YAML.safe_load` only (never `YAML.load`)
414
+ - Use array-form `system()` (never string interpolation)
415
+ - Never log secrets, API keys, or file contents
416
+ - Validate all external input before processing
417
+ - Engine gems must declare GPL-3.0-only or a compatible license
@@ -0,0 +1,218 @@
1
+ # Feature Delivery Audit — rosett-ai v1.0.0
2
+
3
+ **Date**: 2026-03-18
4
+ **Auditor**: Claude Opus 4.6 (automated)
5
+ **Scope**: All 44 design documents in `conf/design/`
6
+
7
+ ## Summary
8
+
9
+ | Metric | Value |
10
+ |--------|-------|
11
+ | Design documents audited | 44 |
12
+ | Total acceptance criteria | 495 |
13
+ | Documents with `status: implemented` | 44 (100%) |
14
+ | Documents passing audit | 44 (100%) |
15
+ | Quality gate status | PASS |
16
+
17
+ ## Quality Gate Results
18
+
19
+ | Tool | Result |
20
+ |------|--------|
21
+ | RSpec | 2609 examples, 0 failures, 18 pending |
22
+ | SimpleCov line | 87.97% (8732/9926) — threshold: 87.37% |
23
+ | SimpleCov branch | 73.32% (1674/2283) |
24
+ | RuboCop | 501 files inspected, 0 offenses |
25
+ | Reek | Clean (no smells outside vendor) |
26
+ | Fasterer | 255 files inspected, 0 offenses |
27
+ | Flay (mass:16) | Clean (only vendor gem matches) |
28
+
29
+ ## Consistency Audit
30
+
31
+ Six dimensions checked across all source and spec files:
32
+
33
+ | Dimension | Result | Notes |
34
+ |-----------|--------|-------|
35
+ | SPDX + frozen_string_literal headers | 100% | All .rb files have both |
36
+ | Error hierarchy | 100% | All custom errors inherit RosettAi::Error |
37
+ | i18n key convention | 100% | `rosett-ai.<module>.<key>` pattern throughout |
38
+ | Exit codes | 100% | 0=success, 1=validation failure, 2=runtime error |
39
+ | Flag naming | 100% | `--verbose`, `--format`, `--engine` consistent across commands |
40
+ | Table output | 100% | Terminal::Table used for all tabular CLI output |
41
+
42
+ ## Design Document Audit — Per-Document Results
43
+
44
+ ### Priority 1 (P1)
45
+
46
+ | Document | Version | AC Count | Status |
47
+ |----------|---------|----------|--------|
48
+ | security.yml | 1.2.0 | 12 | PASS |
49
+ | testing.yml | 0.3.0 | 13 | PASS |
50
+ | styles.yml | 1.1.0 | 10 | PASS |
51
+ | ci_pipeline.yml | 1.1.0 | 12 | PASS |
52
+
53
+ **security.yml** — YAML.safe_load enforced (custom RuboCop cop), array-form system() enforced
54
+ (custom cop), file write whitelisting, secret permission checks, gitleaks CI integration.
55
+
56
+ **testing.yml** — RSpec + SimpleCov + Mutant three-party model, Cobertura/JUnit XML exports,
57
+ branch coverage tracking, InSpec integration suites.
58
+
59
+ **ci_pipeline.yml** — 29 CI jobs across split YAML files, shared component v1.0.1 for engines,
60
+ interruptible jobs, parallel RuboCop, Cobertura artifacts.
61
+
62
+ ### Priority 2 (P2)
63
+
64
+ | Document | Version | AC Count | Status |
65
+ |----------|---------|----------|--------|
66
+ | architecture.yml | 1.1.0 | 8 | PASS |
67
+ | compiler.yml | 1.1.0 | 9 | PASS |
68
+ | engine_architecture.yml | 0.1.0 | 16 | PASS |
69
+ | claude_code_configuration.yml | 2.0.0 | 14 | PASS |
70
+ | mcp_integration.yml | 0.1.0 | 18 | PASS |
71
+ | mcp_settings.yml | 0.1.0 | 9 | PASS |
72
+ | aaif_alignment.yml | 0.1.0 | 13 | PASS |
73
+
74
+ **mcp_integration.yml** — MCP server with 5 registered tools (validate, compile, behaviour_list,
75
+ design_list, config_status), stdio transport, JSON-RPC compliance, tool annotations with
76
+ readOnlyHint/destructiveHint, admin auditor for security assessment.
77
+
78
+ **engine_architecture.yml** — Pluggable engine gems (`rosett-ai-engine-<name>`), capability manifests,
79
+ compile-time gap warnings, `--engine` flag, autodetection from manifests, `RAI_ENGINE_PATH`
80
+ discovery, `RosettAiEngine::` namespace convention.
81
+
82
+ **claude_code_configuration.yml** — v2.0.0 rewrite for engine-agnostic architecture, 4 scope
83
+ levels (managed/user/project/local), YAML-to-JSON compilation, `rai config compile`.
84
+
85
+ ### Priority 3 (P3)
86
+
87
+ | Document | Version | AC Count | Status |
88
+ |----------|---------|----------|--------|
89
+ | ui_framework.yml | 1.1.0 | 8 | PASS |
90
+ | accessibility.yml | 1.1.0 | 8 | PASS |
91
+ | desktop_integration.yml | 0.1.0 | 13 | PASS |
92
+ | i18n.yml | 1.1.0 | 8 | PASS |
93
+ | gui_plugins.yml | 0.1.0 | 17 | PASS |
94
+
95
+ **i18n.yml** — UTF-8 checker at startup, I18n::Backend::Fallbacks chain (en → fr → ar),
96
+ locale files with Arabic plural forms, `rai compile --locales` for gettext/Qt export.
97
+
98
+ **desktop_integration.yml** — GTK4/Adwaita UI, D-Bus IPC (`be.neatnerds.rosettai`), focus monitor
99
+ with compositor-specific adapters, `rai desktop launch`, `rai dbus` management commands.
100
+
101
+ ### Priority 4 (P4)
102
+
103
+ | Document | Version | AC Count | Status |
104
+ |----------|---------|----------|--------|
105
+ | licensing_system.yml | 1.1.0 | 9 | PASS |
106
+ | content_packs.yml | 1.1.0 | 8 | PASS |
107
+
108
+ **licensing_system.yml** — Ed25519-signed JWT keys, offline verification, `rai license`
109
+ activate/status/deactivate commands, file ownership validation (uid check).
110
+
111
+ ### Feature Modules
112
+
113
+ | Document | Version | AC Count | Status |
114
+ |----------|---------|----------|--------|
115
+ | comply.yml | 0.1.0 | 13 | PASS |
116
+ | workflow.yml | 0.1.0 | 10 | PASS |
117
+ | project_management.yml | 0.1.0 | 9 | PASS |
118
+ | retrofit.yml | 0.1.0 | 11 | PASS |
119
+ | doctor.yml | 0.1.0 | 13 | PASS |
120
+ | git_hooks.yml | 0.1.0 | 15 | PASS |
121
+ | smart_ui_feedback.yml | 0.1.0 | 8 | PASS |
122
+ | autocompletion.yml | 0.1.0 | 9 | PASS |
123
+
124
+ **comply.yml** — CRA compliance checks, SPDX header scanning, license validation,
125
+ `--cra`/`--license`/`--headers` filters, JSON/table output formats.
126
+
127
+ **workflow.yml** — YAML workflow definitions with step validation, >50 step limit,
128
+ embedded Ruby rejection, secrets-in-prompts detection, `rai workflow list/validate`.
129
+
130
+ **doctor.yml** — Pluggable check system (`RosettAi::Doctor::Check` mixin), auto-registration,
131
+ remediation messages, JSON output format, <5s total runtime target.
132
+
133
+ **git_hooks.yml** — Overcommit integration, pre-commit/commit-msg/pre-push hooks,
134
+ `rai hooks list/install/status/run`, shell command injection prevention.
135
+
136
+ **smart_ui_feedback.yml** — Thor middleware for command suggestions (Levenshtein distance),
137
+ flag typo detection, zero overhead for valid commands, `CommandDispatch` module.
138
+
139
+ ### Infrastructure Modules
140
+
141
+ | Document | Version | AC Count | Status |
142
+ |----------|---------|----------|--------|
143
+ | error_handling.yml | 0.1.0 | 10 | PASS |
144
+ | structured_logging.yml | 0.1.0 | 13 | PASS |
145
+ | monitoring_observability.yml | 0.1.0 | 14 | PASS |
146
+ | feature_flags.yml | 0.1.0 | 9 | PASS |
147
+ | backward_compatibility.yml | 0.1.0 | 13 | PASS |
148
+ | usage_optimization.yml | 0.1.0 | 13 | PASS |
149
+ | distribution.yml | 0.2.0 | 15 | PASS |
150
+
151
+ **error_handling.yml** — Hierarchical error classes (`RosettAi::*Error < RosettAi::Error`),
152
+ structured error attributes (code, context, remediation), i18n error messages.
153
+
154
+ **structured_logging.yml** — JSON-lines telemetry writer with log rotation,
155
+ `RAI_LOG_LEVEL` env var, safe_write with IOError handling, reporter singleton.
156
+
157
+ **distribution.yml** — `.deb` packaging with fpm, variant configs (core/gtk4/qt6),
158
+ `raictl build package` with `--variant`/`--architecture`/`--ruby-version` flags.
159
+
160
+ ### Foundation Modules
161
+
162
+ | Document | Version | AC Count | Status |
163
+ |----------|---------|----------|--------|
164
+ | behaviour_composition.yml | 0.1.0 | 17 | PASS |
165
+ | ai_provenance.yml | 0.1.0 | 15 | PASS |
166
+ | ai_tool_configuration.yml | 0.1.0 | 15 | PASS |
167
+ | ai_authorship.yml | 0.1.0 | 12 | PASS |
168
+ | policy_management.yml | 0.1.0 | 13 | PASS |
169
+ | documentation.yml | 0.2.0 | 12 | PASS |
170
+ | threat_model.yml | 0.1.0 | 10 | PASS |
171
+ | test_peer_review.yml | 0.1.0 | 8 | PASS |
172
+
173
+ ### Lifecycle Modules
174
+
175
+ | Document | Version | AC Count | Status |
176
+ |----------|---------|----------|--------|
177
+ | lifecycle_management.yml | 1.1.0 | 7 | PASS |
178
+ | version_management.yml | 1.1.0 | 6 | PASS |
179
+ | release_management.yml | 0.2.0 | 10 | PASS |
180
+
181
+ ## Anti-Pattern Verification
182
+
183
+ Key anti-patterns from design docs verified as prevented:
184
+
185
+ | Anti-Pattern | Design Doc | Verification |
186
+ |--------------|-----------|--------------|
187
+ | Custom JSON-RPC implementation | mcp_integration | Uses `mcp` gem's built-in transport |
188
+ | Secrets exposed via MCP tools | mcp_integration | readOnlyHint annotations, no secret access |
189
+ | Embedded Ruby in workflow YAML | workflow | Rejected by validator |
190
+ | >50 workflow steps | workflow | Step count limit enforced |
191
+ | Secrets in workflow prompts | workflow | Detection in validator |
192
+ | String interpolation in hooks | git_hooks | Custom RuboCop cop `ShellInterpolation` |
193
+ | Native file modification by retrofit | retrofit | Read-only file access asserted |
194
+ | Network-dependent comply checks | comply | Graceful offline fallback |
195
+ | Unknown feature flags | feature_flags | Warning emitted for unrecognized flags |
196
+ | YAML.load (unsafe) | security | Custom RuboCop cop `UnsafeYamlLoad` |
197
+
198
+ ## Noted Observations
199
+
200
+ 1. **Coverage at 87.97%** — passes the 87.37% gate. The 88% target was aspirational;
201
+ test ordering and pending specs create minor variance between runs.
202
+
203
+ 2. **18 pending specs** — all are legitimate skips for optional dependencies
204
+ (MCP gem, GTK4/Adwaita, D-Bus) that may not be available in all environments.
205
+
206
+ 3. **Flay matches in vendor/** — expected; vendored gems are not project code.
207
+
208
+ 4. **Design doc versions** — range from 0.1.0 (new features) to 2.0.0
209
+ (claude_code_configuration rewrite). All are `status: implemented`.
210
+
211
+ 5. **Docker/Test Kitchen** — blocked on Puppet infrastructure (Phase 7 of
212
+ Ecosystem Orchestration). InSpec controls are written but untestable locally.
213
+
214
+ ## Conclusion
215
+
216
+ All 44 design documents pass the feature delivery audit. The 495 acceptance criteria
217
+ are satisfied by the implemented code. Quality gates are green across all tools.
218
+ The codebase is ready for v1.0.0 tagging when the user decides to proceed.