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,112 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://gitlab.neatnerds.be/neatnerds/NeatNerds-AI/rosett-ai/schemas/workflow_schema.json",
4
+ "title": "Workflow Definition",
5
+ "description": "Schema for workflow YAML files — declarative multi-step workflow definitions.",
6
+ "$comment": {
7
+ "date": "2026-03-16",
8
+ "version": "1.0.0",
9
+ "source": "rosett-ai"
10
+ },
11
+ "type": "object",
12
+ "required": ["name", "version", "steps"],
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "name": {
16
+ "type": "string",
17
+ "minLength": 1,
18
+ "pattern": "^[a-z][a-z0-9_-]*$",
19
+ "description": "Workflow identifier"
20
+ },
21
+ "description": {
22
+ "type": "string",
23
+ "description": "Human-readable description"
24
+ },
25
+ "version": {
26
+ "type": "string",
27
+ "pattern": "^\\d+\\.\\d+\\.\\d+$"
28
+ },
29
+ "author": {
30
+ "type": "string"
31
+ },
32
+ "scope": {
33
+ "type": "string",
34
+ "enum": ["global", "local", "project"]
35
+ },
36
+ "network_required": {
37
+ "type": "boolean",
38
+ "default": false
39
+ },
40
+ "engine": {
41
+ "type": "string",
42
+ "description": "Default engine for prompt steps"
43
+ },
44
+ "required_capabilities": {
45
+ "type": "array",
46
+ "items": { "type": "string" }
47
+ },
48
+ "max_steps": {
49
+ "type": "integer",
50
+ "minimum": 1,
51
+ "maximum": 50,
52
+ "default": 50
53
+ },
54
+ "steps": {
55
+ "type": "array",
56
+ "minItems": 1,
57
+ "maxItems": 50,
58
+ "items": {
59
+ "type": "object",
60
+ "required": ["name", "type"],
61
+ "additionalProperties": false,
62
+ "properties": {
63
+ "name": {
64
+ "type": "string",
65
+ "minLength": 1
66
+ },
67
+ "type": {
68
+ "type": "string",
69
+ "enum": ["shell", "rosett-ai", "prompt"]
70
+ },
71
+ "command": {
72
+ "description": "Array of strings for shell steps, string for Rosett-AI steps",
73
+ "oneOf": [
74
+ { "type": "array", "items": { "type": "string" }, "minItems": 1 },
75
+ { "type": "string", "minLength": 1 }
76
+ ]
77
+ },
78
+ "prompt": {
79
+ "type": "string",
80
+ "description": "Prompt text for prompt-type steps"
81
+ },
82
+ "engine": {
83
+ "type": "string",
84
+ "description": "Engine override for this step"
85
+ },
86
+ "network_required": {
87
+ "type": "boolean"
88
+ },
89
+ "on_failure": {
90
+ "type": "string",
91
+ "enum": ["stop", "continue"],
92
+ "default": "stop"
93
+ }
94
+ }
95
+ }
96
+ },
97
+ "audit": {
98
+ "type": "object",
99
+ "additionalProperties": false,
100
+ "properties": {
101
+ "log_path": {
102
+ "type": "string"
103
+ },
104
+ "retention_days": {
105
+ "type": "integer",
106
+ "minimum": 1,
107
+ "default": 90
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
@@ -0,0 +1,17 @@
1
+ # SPDX-License-Identifier: GPL-3.0-only
2
+ # Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
3
+ #
4
+ # AGENTS.md compilation target profile.
5
+ # Compiles rai behaviour YAML into AGENTS.md format (AAIF v0.1.0).
6
+ ---
7
+ name: agents_md
8
+ description: "AGENTS.md format — AAIF-standard agent instruction file"
9
+ backend: agents_md
10
+ engine_version: "~> 1.0"
11
+ output_format: markdown
12
+ output_dir:
13
+ max_context_window:
14
+ rendering:
15
+ include_source_metadata: true
16
+ include_priority_annotations: false
17
+ include_generated_marker: true
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: claude
3
+ description: Claude Code (Anthropic) target
4
+ backend: claude
5
+ engine_version: ">=1.0.0"
6
+ output_format: markdown
7
+ output_dir: null
8
+ max_context_window: 200000
9
+ rendering:
10
+ include_source_metadata: true
11
+ include_priority_annotations: true
12
+ include_generated_marker: true
@@ -0,0 +1,58 @@
1
+ # Rosett-AI - Tool Registry
2
+ # This file defines CLI tools that can be managed by rai tooling commands.
3
+ # Each tool entry maps to package names across different package managers.
4
+
5
+ tools:
6
+ jq:
7
+ description: "Command-line JSON processor"
8
+ homepage: "https://jqlang.github.io/jq/"
9
+ category: json
10
+ permission_pattern: "Bash(jq:*)"
11
+ packages:
12
+ apt: jq
13
+ dnf: jq
14
+ pacman: jq
15
+ zypper: jq
16
+ brew: jq
17
+ snap: jq
18
+ nix: jq
19
+
20
+ yq:
21
+ description: "Command-line YAML/JSON/XML processor"
22
+ homepage: "https://github.com/mikefarah/yq"
23
+ category: yaml
24
+ permission_pattern: "Bash(yq:*)"
25
+ packages:
26
+ apt: yq
27
+ dnf: yq
28
+ pacman: go-yq
29
+ zypper: yq
30
+ brew: yq
31
+ snap: yq
32
+ nix: yq-go
33
+
34
+ ripgrep:
35
+ description: "Fast recursive grep replacement"
36
+ homepage: "https://github.com/BurntSushi/ripgrep"
37
+ category: search
38
+ permission_pattern: "Bash(rg:*)"
39
+ packages:
40
+ apt: ripgrep
41
+ dnf: ripgrep
42
+ pacman: ripgrep
43
+ zypper: ripgrep
44
+ brew: ripgrep
45
+ nix: ripgrep
46
+
47
+ fd:
48
+ description: "Simple, fast alternative to find"
49
+ homepage: "https://github.com/sharkdp/fd"
50
+ category: search
51
+ permission_pattern: "Bash(fd:*)"
52
+ packages:
53
+ apt: fd-find
54
+ dnf: fd-find
55
+ pacman: fd
56
+ zypper: fd
57
+ brew: fd
58
+ nix: fd
@@ -0,0 +1,48 @@
1
+ # systemd unit file for nncc MCP server (HTTP transport)
2
+ #
3
+ # Install: sudo cp dist/rosett-ai-mcp.service /etc/systemd/system/
4
+ # Enable: sudo systemctl enable nncc-mcp
5
+ # Start: sudo systemctl start nncc-mcp
6
+ #
7
+ # Configuration: /etc/nncc/mcp/server.yml
8
+ # Keyfile: /etc/nncc/mcp/nncc-mcp-keys.yml
9
+ #
10
+ # SPDX-License-Identifier: GPL-3.0-only
11
+
12
+ [Unit]
13
+ Description=NeatNerds Code Companion MCP Server
14
+ Documentation=man:nncc(1)
15
+ After=network.target
16
+
17
+ [Service]
18
+ Type=simple
19
+ User=nncc
20
+ Group=nncc
21
+ ExecStart=/usr/bin/nncc mcp serve --http --config /etc/nncc/mcp/server.yml
22
+ Restart=on-failure
23
+ RestartSec=5
24
+
25
+ # Security hardening
26
+ NoNewPrivileges=yes
27
+ ProtectSystem=strict
28
+ ProtectHome=yes
29
+ PrivateTmp=yes
30
+ PrivateDevices=yes
31
+ ProtectKernelTunables=yes
32
+ ProtectKernelModules=yes
33
+ ProtectControlGroups=yes
34
+ RestrictSUIDSGID=yes
35
+ RestrictNamespaces=yes
36
+ RestrictRealtime=yes
37
+ LockPersonality=yes
38
+ MemoryDenyWriteExecute=yes
39
+
40
+ # File access
41
+ ReadWritePaths=/var/lib/nncc /etc/nncc/mcp
42
+
43
+ # Resource limits
44
+ LimitNOFILE=1024
45
+ LimitNPROC=64
46
+
47
+ [Install]
48
+ WantedBy=multi-user.target
@@ -0,0 +1,45 @@
1
+ # nncc MCP server configuration
2
+ #
3
+ # Copy to one of:
4
+ # ~/.config/nncc/mcp/server.yml (user)
5
+ # /etc/nncc/mcp/server.yml (system)
6
+ # .nncc-mcp.yml (project)
7
+ #
8
+ # SPDX-License-Identifier: GPL-3.0-only
9
+ ---
10
+ http:
11
+ port: 8484
12
+ host: localhost
13
+
14
+ authentication:
15
+ type: api_key
16
+ key_source: auto
17
+ keyfile_path: /etc/nncc/mcp/nncc-mcp-keys.yml
18
+ # api_key_env: NNCC_MCP_API_KEY # Single-key fallback
19
+
20
+ origin:
21
+ allowed_origins:
22
+ - "http://localhost:*"
23
+ - "http://127.0.0.1:*"
24
+ strict_mode: false
25
+
26
+ rate_limiting:
27
+ enabled: true
28
+ unauthenticated_rpm: 60
29
+ authenticated_rpm: 300
30
+
31
+ cors:
32
+ enabled: false
33
+ # origins:
34
+ # - "http://localhost:3000"
35
+ # methods: [POST, GET, DELETE]
36
+ # headers: [Content-Type, Authorization, Accept, Mcp-Session-Id]
37
+ # max_age: 86400
38
+
39
+ max_request_size: 1048576 # 1 MB
40
+ content_type_enforcement: true
41
+
42
+ tls:
43
+ enabled: false
44
+ # cert_path: /etc/nncc/mcp/tls/cert.pem
45
+ # key_path: /etc/nncc/mcp/tls/key.pem
@@ -0,0 +1,58 @@
1
+ # AAIF Positioning — rosett-ai in the Agentic AI Foundation Ecosystem
2
+
3
+ ## Overview
4
+
5
+ raictl (Rosett-AI) fills a gap in the AAIF ecosystem that none of
6
+ the founding projects address: structured, validated, versioned, auditable
7
+ configuration management for AI agent workflows.
8
+
9
+ ## AAIF Ecosystem Role
10
+
11
+ | Project | Role | rosett-ai Relationship |
12
+ |---------|------|-------------------|
13
+ | MCP | Protocol for AI tool communication | rosett-ai is an MCP server + admin tool |
14
+ | AGENTS.md | Agent instruction file standard | rai compiles to AGENTS.md format |
15
+ | Goose | Multi-provider AI agent runtime | rosett-ai manages Goose configuration |
16
+ | rosett-ai | Configuration management layer | Orchestrates all of the above |
17
+
18
+ ## Compilation Targets
19
+
20
+ raictl supports multi-target compilation from a single source of truth:
21
+
22
+ ```bash
23
+ # Compile to AGENTS.md format
24
+ bin/raictl compile --engine agents_md
25
+
26
+ # Compile to Claude Code format (default)
27
+ bin/raictl compile --engine claude
28
+
29
+ # Compile to generic markdown
30
+ bin/raictl compile --engine generic
31
+ ```
32
+
33
+ ## AAIF Spec Versions
34
+
35
+ raictl tracks specific AAIF specification versions:
36
+
37
+ | Specification | Version | Status |
38
+ |--------------|---------|--------|
39
+ | MCP Protocol | 2025-03-26 | Implemented (mcp gem 0.8.0) |
40
+ | AGENTS.md | v0.1.0 | Implemented (built-in backend) |
41
+
42
+ ## License Compatibility
43
+
44
+ | Component | License | AAIF Compatible |
45
+ |-----------|---------|----------------|
46
+ | rosett-ai core | GPL-3.0-only | Independent project |
47
+ | MCP server (rosett-ai) | GPL-3.0-only | Uses mcp gem (MIT) |
48
+ | AGENTS.md backend | GPL-3.0-only | Output format is unlicensed standard |
49
+
50
+ ## Contribution Pathway
51
+
52
+ If contributing to the AAIF ecosystem:
53
+
54
+ 1. **rosett-ai-mcp extraction**: Extract MCP server components as Apache-2.0 library
55
+ 2. **AGENTS.md tools**: Validation and linting tools as standalone MIT/Apache-2.0
56
+ 3. **rosett-ai core**: Remains GPL-3.0-only (open-core model)
57
+
58
+ See `doc/LICENSING_AAIF_ANALYSIS.md` for detailed license compatibility analysis.
data/doc/ADOPT.md ADDED
@@ -0,0 +1,224 @@
1
+ # Rosett-AI - Adopt System
2
+
3
+ ## Overview
4
+
5
+ The `adopt` command analyzes compiled rule files in `~/.claude/rules/` for quality and safety issues.
6
+ It uses the Claude API to detect inconsistencies, conflicts, harmful content, jailbreaking attempts,
7
+ duplicates, and other problems across your rule set.
8
+
9
+ ## How It Works
10
+
11
+ 1. Discovers managed rule files (those with `<!-- Generated by rosett-ai` markers) in `~/.claude/rules/`
12
+ 2. Filters out files whose source behaviour YAML is marked `sensitive: true`
13
+ 3. Checks the cache — if file contents haven't changed since the last analysis, returns cached results
14
+ 4. Applies redaction patterns from `conf/adopt_redactions.yml` to file contents
15
+ 5. Sends redacted content to the Claude API for analysis
16
+ 6. Runs local structural checks on all files (including sensitive ones)
17
+ 7. Merges API and local findings into a unified report
18
+ 8. Caches the result for future runs
19
+
20
+ ## CLI Usage
21
+
22
+ ```bash
23
+ # Full API analysis
24
+ bin/raictl adopt
25
+
26
+ # Local-only structural checks (no API)
27
+ bin/raictl adopt --local
28
+
29
+ # Verbose output
30
+ bin/raictl adopt --verbose
31
+
32
+ # Detailed explanations
33
+ bin/raictl adopt --elaborate
34
+
35
+ # All flags combined
36
+ bin/raictl adopt --elaborate --verbose
37
+ ```
38
+
39
+ ### Flags
40
+
41
+ | Flag | Effect |
42
+ |------|--------|
43
+ | `--local` | Skip API calls, run structural checks only |
44
+ | `--verbose` | Show file counts, checksums, cache status, skipped sensitive files |
45
+ | `--elaborate` | Add an "Explanation" column to the findings table |
46
+
47
+ ## Finding Categories
48
+
49
+ The analysis detects these categories of issues:
50
+
51
+ | Category | Description |
52
+ |----------|-------------|
53
+ | `inconsistencies` | Rules that contradict each other in intent or wording |
54
+ | `conflicts` | Rules that directly conflict and cannot both be followed |
55
+ | `harmful` | Rules that instruct harmful actions |
56
+ | `illegal` | Rules that instruct illegal activities |
57
+ | `jailbreaking` | Rules that attempt to bypass AI safety measures |
58
+ | `rule_breaking` | Rules that instruct breaking other rules |
59
+ | `duplicates` | Rules with the same ID or identical descriptions across files |
60
+ | `other` | Other structural or content issues |
61
+
62
+ ### Severity Levels
63
+
64
+ | Severity | Meaning |
65
+ |----------|---------|
66
+ | `critical` | Must be fixed immediately — safety or compliance risk |
67
+ | `high` | Should be fixed — significant quality issue |
68
+ | `medium` | Worth addressing — potential confusion or redundancy |
69
+ | `low` | Minor observation — nice to fix |
70
+
71
+ ### Overall Status
72
+
73
+ | Status | Meaning |
74
+ |--------|---------|
75
+ | `pass` | No issues found |
76
+ | `warn` | Low or medium severity findings only |
77
+ | `fail` | High or critical severity findings |
78
+
79
+ ## Data Privacy
80
+
81
+ Four layers of protection ensure sensitive content is handled appropriately.
82
+
83
+ ### 1. Opt-in Per File (Default)
84
+
85
+ Add `sensitive: true` to a behaviour YAML file to exclude its compiled output from API analysis:
86
+
87
+ ```yaml
88
+ name: internal_security
89
+ description: Internal security policies
90
+ version: 1.0.0
91
+ sensitive: true
92
+ rules:
93
+ - id: sec_001
94
+ description: Internal policy details
95
+ priority: 90
96
+ enabled: true
97
+ ```
98
+
99
+ Sensitive files are still checked locally for structural issues (duplicate IDs, empty descriptions, missing priorities). They are reported as "skipped (sensitive)" in verbose output.
100
+
101
+ ### 2. Redaction
102
+
103
+ Configure regex patterns in `conf/adopt_redactions.yml` to replace sensitive content before it reaches the API:
104
+
105
+ ```yaml
106
+ ---
107
+ patterns:
108
+ - pattern: '\b[A-Z0-9._%+-]+@neatnerds\.be\b'
109
+ replacement: '[EMAIL-REDACTED]'
110
+ - pattern: 'NeatNerds'
111
+ replacement: '[COMPANY]'
112
+ - pattern: 'gitlab\.neatnerds\.be'
113
+ replacement: '[INTERNAL-URL]'
114
+ ```
115
+
116
+ Redaction is applied in-memory only — original files are never modified.
117
+
118
+ ### 3. Configurable Endpoint
119
+
120
+ Set the `ANTHROPIC_API_BASE_URL` environment variable to route API calls through a private endpoint:
121
+
122
+ ```bash
123
+ # Use AWS Bedrock
124
+ export ANTHROPIC_API_BASE_URL=https://bedrock-runtime.us-east-1.amazonaws.com
125
+
126
+ # Use a corporate proxy
127
+ export ANTHROPIC_API_BASE_URL=https://ai-proxy.internal.company.com
128
+ ```
129
+
130
+ ### 4. Local-Only Mode
131
+
132
+ Use `--local` to skip API calls entirely. Only structural checks are performed:
133
+
134
+ - Duplicate rule IDs across files
135
+ - Empty or blank rule descriptions
136
+ - Rules without priority set
137
+ - Identical rule descriptions across different rule IDs
138
+
139
+ ```bash
140
+ bin/raictl adopt --local --verbose
141
+ ```
142
+
143
+ ## Caching
144
+
145
+ Results are cached in `conf/adopt.cache.yml`. The cache key is a SHA256 hash of all analyzed file contents (after filtering sensitive files). When files haven't changed, the cached result is returned without an API call.
146
+
147
+ ### Cache Format
148
+
149
+ ```yaml
150
+ ---
151
+ checksum: "sha256hex..."
152
+ analyzed_at: "2026-01-29T12:00:00Z"
153
+ result:
154
+ findings: [...]
155
+ overall_status: pass
156
+ summary: "No issues detected"
157
+ ```
158
+
159
+ ### Invalidating the Cache
160
+
161
+ The cache is automatically invalidated when any managed rule file changes. To force a fresh analysis, delete the cache file:
162
+
163
+ ```bash
164
+ rm conf/adopt.cache.yml
165
+ bin/raictl adopt
166
+ ```
167
+
168
+ ## Local Structural Checks
169
+
170
+ These checks run on all files (including sensitive ones) regardless of `--local`:
171
+
172
+ | Check | Category | Severity |
173
+ |-------|----------|----------|
174
+ | Duplicate rule ID across files | `duplicates` | medium |
175
+ | Empty/blank rule description | `other` | medium |
176
+ | Missing priority | `other` | low |
177
+ | Identical descriptions on different rule IDs | `duplicates` | low |
178
+
179
+ ## Environment Variables
180
+
181
+ | Variable | Purpose | Required |
182
+ |----------|---------|----------|
183
+ | `ANTHROPIC_API_KEY` | API authentication key | Yes (API mode) |
184
+ | `ANTHROPIC_API_BASE_URL` | Custom API endpoint | No |
185
+
186
+ ## Workflow Integration
187
+
188
+ ### Recommended Workflow
189
+
190
+ ```bash
191
+ # 1. Compile behaviours to rules
192
+ bin/raictl compile --verbose
193
+
194
+ # 2. Run local checks first
195
+ bin/raictl adopt --local --verbose
196
+
197
+ # 3. Run full API analysis
198
+ bin/raictl adopt --verbose
199
+
200
+ # 4. Fix findings and recompile
201
+ bin/raictl compile --verbose
202
+
203
+ # 5. Verify fixes
204
+ bin/raictl adopt --verbose
205
+ ```
206
+
207
+ ### CI/CD Integration
208
+
209
+ ```bash
210
+ # In CI pipeline — local checks only (no API key needed)
211
+ bin/raictl adopt --local || exit 1
212
+
213
+ # Or with API key available
214
+ ANTHROPIC_API_KEY=$CI_ANTHROPIC_KEY bin/raictl adopt || exit 1
215
+ ```
216
+
217
+ ## Architecture
218
+
219
+ The adopt system consists of two components:
220
+
221
+ - **`RosettAi::Adopter::RuleAdopter`** (`lib/rosett_ai/adopter/rule_adopter.rb`) — Core logic for file discovery, caching, redaction, API interaction, and local analysis
222
+ - **`RosettAi::Thor::Tasks::Adopt`** (`lib/rosett_ai/thor/tasks/adopt.rb`) — Thor CLI task providing terminal output with tables, spinners, and colored status indicators
223
+
224
+ The adopter uses the official [Anthropic Ruby SDK](https://github.com/anthropics/anthropic-sdk-ruby) (`anthropic` gem v1.16+) for API communication.