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,505 @@
1
+ nncc(1) -- NeatNerds Code Companion
2
+ ======================================
3
+
4
+ ## NAME
5
+
6
+ `nncc` - configuration management tool for AI-assisted development workflows
7
+
8
+ ## SYNOPSIS
9
+
10
+ `nncc` [--accessible] [--locale <locale>] [--ui <adapter>] <command> [<args>]
11
+
12
+ ## DESCRIPTION
13
+
14
+ **nncc** is a configuration management tool for AI-assisted development workflows.
15
+ It compiles YAML behaviour definitions into rule files for multiple AI engines, manages
16
+ design documents, validates configurations, and builds Debian packages.
17
+
18
+ raictl follows a security-first design with YAML safe loading, array-form shell
19
+ commands, and whitelisted file paths. All configurations are versioned and
20
+ validated against JSON Schema.
21
+
22
+ ## COMMANDS
23
+
24
+ ### Core Commands
25
+
26
+ * `version`:
27
+ Display the current nncc version and build information.
28
+
29
+ * `tree`:
30
+ Print a tree of all available commands with descriptions.
31
+
32
+ * `compile` [--verbose] [--simulate] [--vendor] [--engine <name>] [--strict] [--locales]:
33
+ Compile YAML behaviour configurations into markdown rule files. Use
34
+ `--simulate` for a dry run with diffs. Use `--vendor` to write a lockfile.
35
+ Use `--engine` to select the target engine (default: from config). Use
36
+ `--strict` to treat warnings as errors. Use `--locales` to compile locale
37
+ files to gettext and Qt formats. Available engines: `claude`
38
+ (default), `generic`, `agents_md`, `ollama`, `gpt_neox`, `goose`,
39
+ `aider`, `cursor`, `copilot`, `windsurf`.
40
+
41
+ * `validate`:
42
+ Validate all configuration files (behaviour, design, tooling) against
43
+ their respective JSON schemas. Reports per-category pass/fail counts
44
+ in a summary table.
45
+
46
+ * `init` --global|--local|--project [--no-compile]:
47
+ Initialize nncc directory structure. Use `--global` for ~/.claude/,
48
+ `--local` for project-level .claude/ structure, and `--project` to create
49
+ an `.nncc/` project structure with `config.yml` and conf subdirectories.
50
+ Engine detection runs automatically during init. Use `--no-compile` to
51
+ skip the rule compilation step.
52
+
53
+ ### Configuration Management
54
+
55
+ * `behaviour` display [--format table|json|yaml]:
56
+ Show current behaviour configuration as a table, JSON, or YAML.
57
+
58
+ * `behaviour` list:
59
+ List all behaviour files found in `conf/behaviour/`.
60
+
61
+ * `behaviour` show <name>:
62
+ Show details of a specific behaviour file including rules and metadata.
63
+
64
+ * `behaviour` validate [<name>]:
65
+ Validate behaviour file(s) against the behaviour schema. Validates all
66
+ files if no name is given, or a single file if <name> is specified.
67
+
68
+ * `behaviour` manage add <name> [--description <text>] [--author <name>]:
69
+ Create a new behaviour configuration file with a template structure.
70
+
71
+ * `behaviour` manage modify <name>:
72
+ Modify an existing behaviour file interactively.
73
+
74
+ * `behaviour` manage delete <name> [--force]:
75
+ Delete a behaviour file. Warns if the behaviour is referenced elsewhere.
76
+ Use `--force` to skip the confirmation prompt.
77
+
78
+ * `design` list:
79
+ List all design documents with name, version, status, domain, and priority.
80
+
81
+ * `design` show <name> [--full]:
82
+ Show a design document summary. Use `--full` to display intent,
83
+ constraints, acceptance criteria, examples, and anti-patterns.
84
+
85
+ * `design` validate [<name>]:
86
+ Validate design document(s) against the design schema.
87
+
88
+ * `config` show [--raw] [--engine <name>]:
89
+ Display compiled configuration for a scope with secrets masked.
90
+ Use `--raw` to show unmasked values.
91
+
92
+ * `config` compile [--verbose] [--simulate] [--scope <name>] [--engine <name>]:
93
+ Compile engine configuration YAML to native settings files (e.g.,
94
+ `settings.json` for Claude Code). Use `--scope` to compile a single scope
95
+ (managed, user, project, local). Use `--engine` to override the default
96
+ engine.
97
+
98
+ ### Operations
99
+
100
+ * `adopt` [--verbose] [--elaborate] [--api] [--quorum]:
101
+ Analyze compiled rule files for issues. Defaults to local-only structural
102
+ checks. Use `--api` to enable remote API analysis via the configured engine.
103
+ Use `--quorum` for multi-engine consensus analysis. Use `--elaborate` for
104
+ detailed findings.
105
+
106
+ * `engines` list:
107
+ List all known engines from the built-in manifest and plugin registry.
108
+
109
+ * `engines` detect:
110
+ Probe the system for installed engines (checks binaries, gems, configs).
111
+
112
+ * `engines` status:
113
+ Show the default engine and detection results for all engines.
114
+
115
+ * `engines` plugins:
116
+ Show registered plugin engines from the gem path.
117
+
118
+ * `backup` --global|--local [--compression <type>] [--compression-ratio <n>] [--destination <uri>]:
119
+ Back up nncc directory structure and assets. At least one of `--global`
120
+ or `--local` must be specified. Compression types: `zip` (default),
121
+ `tar.gz`, `tar.zst`. The `--destination` flag accepts `file://` URIs.
122
+
123
+ * `build` package [--verbose] [--clean] [--architecture <arch>] [--variant <name>] [--ruby-version <ver>] [--output-dir <dir>]:
124
+ Build a Debian `.deb` package using fpm and ruby-build. Available
125
+ variants: `core` (default), `gtk4`, `qt6`. The `--clean` flag removes
126
+ the staging directory before building. Internal command: only available
127
+ inside the rosett-ai repository.
128
+
129
+ * `build` engine [--verbose] [--path <dir>] [--output-dir <dir>] [--nncc-min-version <ver>]:
130
+ Build a `.deb` package for an rosett-ai engine plugin. Run from an engine
131
+ directory or specify `--path`. Sets minimum nncc version dependency
132
+ with `--nncc-min-version`.
133
+
134
+ * `tooling` validate-ci-yaml [--verbose]:
135
+ Validate GitLab CI YAML files for syntax errors. Checks `.gitlab-ci.yml`
136
+ and all included CI files.
137
+
138
+ * `tooling` validate [<name>]:
139
+ Validate tooling configuration files against the tooling schema.
140
+
141
+ * `tooling` check-versions [--verbose] [--gems]:
142
+ Check Ruby and gem version consistency across the codebase. Use `--gems`
143
+ to include gem version analysis.
144
+
145
+ * `dbus` status:
146
+ Show whether the `be.neatnerds.rosettai` D-Bus session service is running.
147
+
148
+ * `dbus` start [--daemonize]:
149
+ Start the D-Bus service with focus monitoring. Runs in the foreground
150
+ by default. Use `--daemonize` (`-d`) to run in the background.
151
+ Requires the `nncc-gtk4` package.
152
+
153
+ * `dbus` stop:
154
+ Send a shutdown signal to the running D-Bus service.
155
+
156
+ * `dbus` detect:
157
+ Detect the running compositor and show the selected focus adapter.
158
+
159
+ * `desktop` gtk4:
160
+ Launch the GTK4/Adwaita desktop application. Connects to the D-Bus
161
+ service for compile, status, and preference management. Requires the
162
+ `nncc-gtk4` package.
163
+
164
+ * `desktop` status:
165
+ Show desktop integration status (GTK4 availability, D-Bus service state).
166
+
167
+ * `documentation` update [--locale <locale>] [--all-locales] [--dry-run] [--skip-reference]:
168
+ Scan for documentation changes and apply updates. Detects undocumented
169
+ public methods, new behaviour files, and dependency changes. Use
170
+ `--skip-reference` to skip LaTeX reference compilation.
171
+
172
+ * `documentation` status:
173
+ Show documentation file count, modification dates, and configured locales.
174
+
175
+ * `documentation` translate [<file>] --to <locale> [--from <locale>]:
176
+ Translate documentation files to a target locale.
177
+
178
+ ### Compliance & Quality
179
+
180
+ * `comply` [--cra] [--license] [--headers] [--format table|json]:
181
+ Run compliance checks against project policies. Use `--cra` for
182
+ EU Cyber Resilience Act checks. Use `--license` for license
183
+ compatibility checks. Use `--headers` for SPDX header validation.
184
+
185
+ * `doctor` [--check <name>] [--format table|json]:
186
+ Run diagnostic checks on the nncc installation. Checks Ruby version,
187
+ gem dependencies, file permissions, D-Bus availability, engine
188
+ detection, and cache health. Use `--check` to run a single check.
189
+
190
+ ### Workflow & Project Management
191
+
192
+ * `workflow` list:
193
+ List available workflow definition files.
194
+
195
+ * `workflow` validate <name>:
196
+ Validate a workflow definition against the workflow schema.
197
+
198
+ * `workflow` simulate <name>:
199
+ Dry-run a workflow showing all steps without executing them.
200
+
201
+ * `workflow` execute <name> [--resume] [--format table|json]:
202
+ Execute a named workflow. Use `--resume` to continue from the last
203
+ successful step after a failure.
204
+
205
+ * `project` status [--format table|json]:
206
+ Show project status including health checks, engine, and configuration.
207
+
208
+ * `project` info:
209
+ Show project metadata (name, engine, template, behaviour/design counts).
210
+
211
+ * `project` apply-template <name> [--force] [--list]:
212
+ Apply a project template. Use `--list` to show available templates
213
+ without applying. Use `--force` to overwrite existing files.
214
+
215
+ * `project` drift [--type forward|template] [--format table|json]:
216
+ Detect configuration drift from the upstream template or from the
217
+ expected forward state.
218
+
219
+ * `project` sync [--force] [--simulate]:
220
+ Synchronize local configuration with upstream template updates.
221
+ Use `--simulate` for a dry run.
222
+
223
+ ### Integration
224
+
225
+ * `mcp` serve:
226
+ Start nncc as an MCP (Model Context Protocol) server on stdio transport.
227
+
228
+ * `mcp` list [--format table|json]:
229
+ List configured MCP servers.
230
+
231
+ * `mcp` validate [--format table|json]:
232
+ Validate MCP server configurations against the schema.
233
+
234
+ * `mcp` status [--format table|json]:
235
+ Show MCP server health status.
236
+
237
+ * `mcp` audit [--format table|json]:
238
+ Generate an MCP compliance audit report.
239
+
240
+ * `mcp` add <name> [--transport stdio|http|streamable-http]:
241
+ Install an MCP server from a trusted source.
242
+
243
+ * `mcp` remove <name> [--force]:
244
+ Remove a configured MCP server.
245
+
246
+ * `mcp` trust-sources [--format table|json]:
247
+ List configured trust sources for MCP server installation.
248
+
249
+ * `mcp` trust-add <domain> [--description <text>]:
250
+ Add a trusted domain for MCP server installation.
251
+
252
+ * `mcp` trust-remove <domain>:
253
+ Remove a trusted domain.
254
+
255
+ * `mcp` tools:
256
+ List available MCP tools from all configured servers.
257
+
258
+ * `hooks` install [--verbose]:
259
+ Install configured git hooks from `.nncc/config.yml`. Hooks are
260
+ defined in the project configuration and installed via the detected
261
+ hook manager (overcommit, husky, lefthook).
262
+
263
+ * `hooks` uninstall:
264
+ Remove nncc hooks and restore previous hooks.
265
+
266
+ * `hooks` list [--format table|json]:
267
+ Show installed nncc hooks.
268
+
269
+ * `hooks` status [--format table|json]:
270
+ Show hook installation status and detect drift from configuration.
271
+
272
+ * `plugins` list <type>:
273
+ List installed plugins of a given type. Valid types: `engine`, `gui`,
274
+ `mcp`.
275
+
276
+ * `plugins` install <type> <name>:
277
+ Install a plugin package (e.g., `plugins install engine ollama`).
278
+
279
+ * `plugins` remove <type> <name>:
280
+ Remove a plugin package.
281
+
282
+ * `retrofit` convert [--engine <name>...] [--force] [--simulate]:
283
+ Import native AI tool configurations into nncc YAML format. Reads
284
+ existing Claude Code, Cursor, or other tool configs and generates
285
+ equivalent nncc behaviour files. Use `--simulate` for a dry run.
286
+ Native files are never modified. This is the default subcommand.
287
+
288
+ * `retrofit` engines:
289
+ List available retrofit engine adapters.
290
+
291
+ * `completion` bash|zsh|fish:
292
+ Generate a shell completion script for the specified shell.
293
+ Output is written to stdout for piping.
294
+
295
+ * `completion` install [--shell <name>]:
296
+ Install the completion script to the standard system directory.
297
+ Auto-detects the current shell from `$SHELL` if `--shell` is not given.
298
+
299
+ ### AI Provenance
300
+
301
+ * `provenance` init:
302
+ Create `.ai-provenance.yml` in the current project root.
303
+
304
+ * `provenance` validate:
305
+ Validate all provenance entries and hash chain integrity.
306
+
307
+ * `provenance` show <commit> [--file <path>]:
308
+ Show provenance for a specific commit or all entries referencing a file.
309
+
310
+ * `provenance` log [--role <role>]:
311
+ Show all provenance entries in reverse chronological order. Filter by
312
+ AI role with `--role` (e.g., `AI-Co-Author`, `AI-Generated-By`).
313
+
314
+ ### Release Management
315
+
316
+ * `release` prepare <level> [--skip-verify]:
317
+ Prepare a release. Bumps version (major, minor, or patch), runs the
318
+ verification suite, generates CHANGELOG entries via git-cliff, and
319
+ creates a release commit. The `--skip-verify` flag skips the quality
320
+ gate suite (NOT recommended).
321
+
322
+ * `release` tag:
323
+ Create an annotated git tag from the current VERSION constant.
324
+
325
+ * `release` status:
326
+ Show current version, last tag, and number of unreleased commits.
327
+
328
+ ### Licensing
329
+
330
+ * `license` activate <key>:
331
+ Activate a license key for premium content pack access. The key is
332
+ verified using Ed25519 signature validation. Licenses control content
333
+ access only, never software functionality (GPL-3.0).
334
+
335
+ * `license` status:
336
+ Show current license status including tier and validity.
337
+
338
+ * `license` deactivate:
339
+ Remove the license key and revert to Community tier.
340
+
341
+ * `content` list [--available]:
342
+ Show installed content packs. Use `--available` to also show packs
343
+ available for download.
344
+
345
+ * `content` install <name>:
346
+ Download, verify signature, and install a content pack.
347
+
348
+ * `content` update:
349
+ Re-download all installed content packs (requires subscriber tier).
350
+
351
+ ## GLOBAL OPTIONS
352
+
353
+ * `--accessible`:
354
+ Enable accessible output mode (screen-reader friendly tables, ARIA
355
+ live regions, EN 301 549 compliant).
356
+
357
+ * `--locale`=<locale>:
358
+ Display output in specified locale (e.g., `en`, `fr`, `ar`).
359
+ Arabic locale uses right-to-left rendering.
360
+
361
+ * `--ui`=<adapter>:
362
+ UI adapter to use. One of: `tui` (default), `gtk4`, `qt6`, `kde`.
363
+
364
+ ## FILES
365
+
366
+ * `~/.config/nncc/config.yml`:
367
+ raictl runtime configuration (default engine, cache settings, detection).
368
+
369
+ * `~/.claude/`:
370
+ Global Claude Code configuration directory.
371
+
372
+ * `~/.claude/conf/behaviour/*.yml`:
373
+ Behaviour configuration files defining Claude operational rules.
374
+
375
+ * `~/.claude/conf/design/*.yml`:
376
+ Design documents specifying implementation standards.
377
+
378
+ * `~/.claude/conf/schemas/*.json`:
379
+ JSON Schema files for configuration validation.
380
+
381
+ * `~/.claude/rules/`:
382
+ Compiled rule files (generated by `nncc compile`).
383
+
384
+ * `~/.claude/settings.json`:
385
+ Global Claude Code settings.
386
+
387
+ * `.nncc/config.yml`:
388
+ Per-project configuration (project name, default engine, hooks).
389
+
390
+ * `.nncc/conf/behaviour/*.yml`:
391
+ Project-specific behaviour overrides.
392
+
393
+ * `.ai-provenance.yml`:
394
+ AI provenance tracking file (created by `nncc provenance init`).
395
+
396
+ * `/etc/nncc/settings.json`:
397
+ System-wide default settings (installed by .deb package).
398
+
399
+ ## EXIT STATUS
400
+
401
+ * `0`:
402
+ Success.
403
+
404
+ * `1`:
405
+ General error (validation failure, missing file, invalid argument).
406
+
407
+ * `2`:
408
+ Validation error (schema mismatch, invalid YAML).
409
+
410
+ * `3`:
411
+ Configuration error (missing scope, bad engine name).
412
+
413
+ * `4`:
414
+ Permission error (read-only directory, denied path).
415
+
416
+ * `5`:
417
+ Dependency error (missing gem, unavailable engine).
418
+
419
+ ## ENVIRONMENT
420
+
421
+ * `XDG_CONFIG_HOME`:
422
+ Base directory for nncc configuration (default: `~/.config`).
423
+ raictl stores its own config at `$XDG_CONFIG_HOME/nncc/config.yml`.
424
+
425
+ * `LANG`, `LC_ALL`:
426
+ Used for locale resolution when `--locale` is not specified.
427
+
428
+ * `NO_COLOR`:
429
+ When set, disables colour output (see https://no-color.org/).
430
+
431
+ * `RAI_TELEMETRY`:
432
+ Set to `1` to enable structured JSON Lines telemetry to stderr.
433
+
434
+ * `RAI_PROFILE`:
435
+ Set to `1` to print per-phase timing breakdown to stderr.
436
+
437
+ * `RAI_ENGINE_PATH`:
438
+ Colon-separated list of additional directories to search for engine
439
+ plugin gems.
440
+
441
+ * `RAI_LOG_LEVEL`:
442
+ Log verbosity. One of: `DEBUG`, `INFO`, `WARN`, `ERROR`.
443
+
444
+ * `RAI_LICENSE_KEY`:
445
+ License key for premium content pack access (alternative to
446
+ `license activate`).
447
+
448
+ * `RAI_ORIGINAL_PWD`:
449
+ Preserves the user's working directory when invoked via the `.deb`
450
+ wrapper script. Set automatically; do not override.
451
+
452
+ * `DBUS_SESSION_BUS_ADDRESS`:
453
+ D-Bus session bus address. Required for `dbus` and `desktop` commands.
454
+
455
+ ## EXAMPLES
456
+
457
+ Compile rules for the default engine:
458
+
459
+ $ nncc compile --verbose
460
+
461
+ Dry-run compilation for Cursor engine:
462
+
463
+ $ nncc compile --engine cursor --simulate --verbose
464
+
465
+ Validate all configuration files:
466
+
467
+ $ nncc validate
468
+
469
+ Initialize a new project:
470
+
471
+ $ cd my-project && nncc init --project
472
+
473
+ Run diagnostic checks:
474
+
475
+ $ nncc doctor
476
+
477
+ Check compliance:
478
+
479
+ $ nncc comply --cra --license --headers
480
+
481
+ Generate bash completion:
482
+
483
+ $ nncc completion bash > /usr/share/bash-completion/completions/nncc
484
+
485
+ Import existing Claude Code config:
486
+
487
+ $ nncc retrofit --engine claude --simulate
488
+
489
+ Start MCP server:
490
+
491
+ $ nncc mcp serve
492
+
493
+ ## SEE ALSO
494
+
495
+ claude(1), git-cliff(1), rubocop(1), ronn-ng(1)
496
+
497
+ Project repository: <https://gitlab.neatnerds.be/neatnerds/nncc>
498
+
499
+ ## AUTHORS
500
+
501
+ Hugo Antonio Sepulveda Manriquez <hugo@neatnerds.be>
502
+
503
+ ## LICENSE
504
+
505
+ GPL-3.0-only. See the LICENSE file in the project repository.
@@ -0,0 +1,133 @@
1
+ # Packaging Operations
2
+
3
+ How to build, verify, and install the Rosett-AI `.deb` package.
4
+
5
+ ## Building the .deb
6
+
7
+ Prerequisites: `fakeroot`, `dpkg-deb`, `rsync`, `ruby-build`, `fpm`.
8
+
9
+ ```bash
10
+ # Standard build (reuses cached Ruby if already compiled)
11
+ bundle exec raictl build package --verbose
12
+
13
+ # Clean build (recompiles Ruby from source)
14
+ bundle exec raictl build package --clean --verbose
15
+
16
+ # Build a specific variant
17
+ bundle exec raictl build package --variant gtk4 --verbose
18
+ ```
19
+
20
+ Output lands in `pkg/rosett-ai_<version>-<iteration>_<arch>.deb`.
21
+
22
+ ## Hermetic Path Guarantee
23
+
24
+ The build system ensures **no workstation-specific paths** leak into the package:
25
+
26
+ 1. **`embedded_env`** uses a hardcoded `HERMETIC_SYSTEM_PATH`
27
+ (`/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`)
28
+ instead of inheriting the builder's `$PATH`.
29
+
30
+ 2. **`APP_EXCLUDES`** strips developer-only directories (`.claude`,
31
+ `doc/claude-sessions`, `.git`, `spec`, `coverage`, etc.) from the
32
+ application source during rsync.
33
+
34
+ 3. **`clean_build_artifacts!`** removes native gem build debris
35
+ (`gem_make.out`, `mkmf.log`, `Makefile` in `ext/` directories) that
36
+ embed the build host's staging path. These files are not needed at
37
+ runtime.
38
+
39
+ 4. **BUNDLE_DEPLOYMENT=true** with a relative `vendor/bundle` path
40
+ ensures the `.bundle/config` inside the package is portable.
41
+
42
+ ## Verifying Hermetic Paths
43
+
44
+ After building, extract the package and check for leaked paths:
45
+
46
+ ```bash
47
+ # Extract without installing
48
+ mkdir /tmp/deb-check
49
+ dpkg-deb --fsys-tarfile pkg/rosett-ai_*.deb | tar xf - -C /tmp/deb-check
50
+
51
+ # Check for /home/ paths in text files (excluding binary .so and .ri)
52
+ grep -rl '/home/' /tmp/deb-check/opt/rosett-ai/app/ \
53
+ | grep -v '\.so$' | grep -v '\.ri$'
54
+
55
+ # Expected: only documentation files with example paths (SETUP.md, etc.)
56
+ # Unexpected: gem_make.out, mkmf.log, Makefile, .bundle/config
57
+
58
+ # Verify the wrapper script
59
+ grep '/home/' /tmp/deb-check/opt/rosett-ai/bin/raictl
60
+ # Expected: no output
61
+
62
+ # Verify .bundle/config uses relative paths
63
+ cat /tmp/deb-check/opt/rosett-ai/app/.bundle/config
64
+ # Expected: BUNDLE_PATH: "vendor/bundle" (relative, not absolute)
65
+
66
+ # Verify no .claude or session dirs shipped
67
+ ls /tmp/deb-check/opt/rosett-ai/app/.claude/ 2>&1
68
+ ls /tmp/deb-check/opt/rosett-ai/app/doc/claude-sessions/ 2>&1
69
+ # Expected: "No such file or directory" for both
70
+ ```
71
+
72
+ ## Installing on a Clean System
73
+
74
+ ```bash
75
+ sudo dpkg -i pkg/rosett-ai_1.2.0-1_amd64.deb
76
+
77
+ # Verify installation
78
+ raictl version # Should print 1.2.0
79
+ raictl compile --verbose # Should compile without errors
80
+ ```
81
+
82
+ The package installs to:
83
+
84
+ | Path | Contents |
85
+ |------|----------|
86
+ | `/opt/rosett-ai/embedded/` | Self-contained Ruby 3.3.10 runtime |
87
+ | `/opt/rosett-ai/app/` | Application source and vendored gems |
88
+ | `/opt/rosett-ai/bin/raictl` | Runtime wrapper script |
89
+ | `/opt/rosett-ai/etc/` | Default settings and BUILD_INFO |
90
+ | `/etc/rosett-ai/settings.json` | User-editable conffile |
91
+ | `/usr/local/bin/raictl` | Symlink (created by postinst) |
92
+ | `/usr/local/bin/rai` | Symlink (created by postinst) |
93
+ | `/usr/share/man/man1/rai.1.gz` | Man page |
94
+
95
+ ## Troubleshooting
96
+
97
+ ### `raictl: command not found`
98
+
99
+ The postinst script creates symlinks at `/usr/local/bin/`. If these are
100
+ missing, recreate manually:
101
+
102
+ ```bash
103
+ sudo ln -sf /opt/rosett-ai/bin/raictl /usr/local/bin/raictl
104
+ sudo ln -sf /opt/rosett-ai/bin/raictl /usr/local/bin/rai
105
+ ```
106
+
107
+ ### `cannot load such file -- bundler/setup`
108
+
109
+ The embedded Ruby cannot find its gems. Check:
110
+
111
+ ```bash
112
+ # Verify BUNDLE_PATH in the wrapper
113
+ grep BUNDLE_PATH /opt/rosett-ai/bin/raictl
114
+ # Should be: /opt/rosett-ai/app/vendor/bundle
115
+
116
+ # Verify gems are installed
117
+ ls /opt/rosett-ai/app/vendor/bundle/ruby/*/gems/ | head -5
118
+ ```
119
+
120
+ ### `libruby.so.3.3: cannot open shared object file`
121
+
122
+ The embedded `LD_LIBRARY_PATH` isn't being set. Verify the wrapper
123
+ script sets it to `/opt/rosett-ai/embedded/lib`.
124
+
125
+ ### Workstation paths in package (build regression)
126
+
127
+ If `grep -r '/home/' /opt/rosett-ai/` finds paths outside documentation,
128
+ the hermetic build guarantee has regressed. Check:
129
+
130
+ 1. `embedded_env` in `lib/rosett_ai/thor/tasks/build.rb` — must use
131
+ `HERMETIC_SYSTEM_PATH`, not `ENV.fetch('PATH')`
132
+ 2. `clean_build_artifacts!` stage — must run after `install_gems!`
133
+ 3. `APP_EXCLUDES` — must include `.claude` and `doc/claude-sessions`
@@ -0,0 +1,65 @@
1
+ # Rosett-AI Release Procedure
2
+
3
+ ## Prerequisites
4
+
5
+ - All tests pass: `bundle exec rspec`
6
+ - RuboCop clean: `bundle exec rubocop`
7
+ - No security vulnerabilities: `bundle exec bundler-audit check`
8
+ - Branch is up to date with main
9
+
10
+ ## Steps
11
+
12
+ ### 1. Version bump
13
+
14
+ ```bash
15
+ # Option A: Use raictl release
16
+ bin/raictl release prepare minor # or patch, major
17
+
18
+ # Option B: Manual
19
+ # Edit lib/rosett_ai/version.rb
20
+ # Update CHANGELOG.md
21
+ ```
22
+
23
+ ### 2. Verify
24
+
25
+ ```bash
26
+ bin/raictl version # Confirm new version
27
+ bin/raictl release status # Check commit count since last tag
28
+ bundle exec rspec # Full test suite
29
+ bin/raictl compile --verbose # Claude engine compiles
30
+ bin/raictl compile --engine agents_md --verbose # AGENTS.md engine compiles
31
+ ```
32
+
33
+ ### 3. Commit and push
34
+
35
+ ```bash
36
+ git add lib/rosett_ai/version.rb CHANGELOG.md
37
+ git commit -m "chore(release): bump version to X.Y.Z"
38
+ git push -u origin <branch>
39
+ ```
40
+
41
+ ### 4. Create merge request
42
+
43
+ ```bash
44
+ glab mr create --title "chore(release): vX.Y.Z" --description "Release X.Y.Z"
45
+ ```
46
+
47
+ ### 5. After merge: tag
48
+
49
+ ```bash
50
+ git checkout main && git pull
51
+ bin/raictl release tag # Creates annotated tag vX.Y.Z
52
+ git push --tags
53
+ ```
54
+
55
+ ### 6. Build .deb package (optional)
56
+
57
+ ```bash
58
+ bin/raictl build package --clean --verbose
59
+ # Output: pkg/rosett-ai_X.Y.Z_amd64.deb
60
+ ```
61
+
62
+ ### 7. Post-release
63
+
64
+ - Update OpenProject work packages to "Closed"
65
+ - Verify installed package: `raictl version`