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,19 @@
1
+ #!/bin/bash
2
+ # Rosett-AI - Post-removal script
3
+ set -e
4
+
5
+ INSTALL_DIR="/opt/rosett-ai"
6
+ CONFIG_DIR="/etc/rosett-ai"
7
+
8
+ case "$1" in
9
+ purge)
10
+ # Remove configuration and installation directories entirely
11
+ [ -d "${CONFIG_DIR}" ] && rm -rf "${CONFIG_DIR}"
12
+ [ -d "${INSTALL_DIR}" ] && rm -rf "${INSTALL_DIR}"
13
+ ;;
14
+ remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
15
+ # Keep configuration files on plain remove/upgrade
16
+ ;;
17
+ esac
18
+
19
+ exit 0
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+ # Rosett-AI - Pre-removal script
3
+ set -e
4
+
5
+ # Remove PATH symlinks
6
+ for link in /usr/local/bin/raictl /usr/local/bin/rai /usr/local/bin/rosett-ai; do
7
+ [ -L "$link" ] && rm -f "$link"
8
+ done
9
+
10
+ exit 0
@@ -0,0 +1,38 @@
1
+ #!/bin/bash
2
+ # Rosett-AI - Runtime wrapper
3
+ # Invoked as /opt/rosett-ai/bin/raictl, symlinked from /usr/local/bin/raictl
4
+ #
5
+ # @@RUBY_ABI@@ and @@RUBY_ARCH@@ are substituted at build time by
6
+ # install_wrapper! in lib/rosett_ai/thor/tasks/build.rb
7
+ set -e
8
+
9
+ INSTALL_DIR="/opt/rosett-ai"
10
+ EMBEDDED_DIR="${INSTALL_DIR}/embedded"
11
+ EMBEDDED_BIN="${EMBEDDED_DIR}/bin"
12
+ EMBEDDED_LIB="${EMBEDDED_DIR}/lib"
13
+ APP_DIR="${INSTALL_DIR}/app"
14
+
15
+ # Ensure the embedded Ruby can find libruby.so
16
+ export LD_LIBRARY_PATH="${EMBEDDED_LIB}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
17
+
18
+ # Ensure the embedded Ruby can find its standard library
19
+ export RUBYLIB="${EMBEDDED_LIB}/ruby/@@RUBY_ABI@@:${EMBEDDED_LIB}/ruby/@@RUBY_ABI@@/@@RUBY_ARCH@@${RUBYLIB:+:$RUBYLIB}"
20
+
21
+ export PATH="${EMBEDDED_BIN}:${PATH}"
22
+ export GEM_HOME="${EMBEDDED_LIB}/ruby/gems/@@RUBY_ABI@@"
23
+ export GEM_PATH="${GEM_HOME}"
24
+ export BUNDLE_GEMFILE="${APP_DIR}/Gemfile"
25
+ export BUNDLE_PATH="${APP_DIR}/vendor/bundle"
26
+ export BUNDLE_DEPLOYMENT="true"
27
+
28
+ # Ensure UTF-8 locale (raictl requires it)
29
+ : "${LANG:=en_US.UTF-8}"
30
+ : "${LC_ALL:=$LANG}"
31
+ export LANG LC_ALL
32
+
33
+ # Preserve the user's working directory before cd-ing into the app tree.
34
+ # ProjectContext reads RAI_ORIGINAL_PWD to resolve the correct project.
35
+ export RAI_ORIGINAL_PWD="${PWD}"
36
+
37
+ cd "${APP_DIR}"
38
+ exec "${EMBEDDED_BIN}/ruby" -I"${APP_DIR}/lib" "${APP_DIR}/bin/raictl" "$@"
data/rosett-ai.gemspec ADDED
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-License-Identifier: GPL-3.0-only
4
+ # Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
5
+
6
+ require_relative 'lib/rosett_ai/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'rosett-ai'
10
+ spec.version = RosettAi::VERSION
11
+ spec.authors = ['Hugo Antonio Sepulveda Manriquez']
12
+ spec.email = ['query@neatnerds.be']
13
+
14
+ spec.summary = 'Rosett-AI — author AI assistant rules once, compile to many'
15
+ spec.description = 'Configuration management tool for AI-assisted development workflows. ' \
16
+ 'Author rules once, compile to Claude Code, Cursor, AGENTS.md, and more.'
17
+ spec.homepage = 'https://gitlab.neatnerds.be/foss/rosett-ai/rosett-ai'
18
+ spec.license = 'GPL-3.0-only'
19
+ spec.required_ruby_version = '>= 3.3.0'
20
+
21
+ spec.metadata['homepage_uri'] = spec.homepage
22
+ spec.metadata['source_code_uri'] = spec.homepage
23
+
24
+ spec.files = Dir.chdir(__dir__) do
25
+ files = if File.directory?('.git')
26
+ `git ls-files -z`.split("\x0")
27
+ else
28
+ Dir.glob('**/*', File::FNM_DOTMATCH).select { |f| File.file?(f) }
29
+ end
30
+ files.reject do |f|
31
+ (File.expand_path(f) == __FILE__) ||
32
+ f.start_with?('bin/', 'test/', 'spec/', 'features/', '.git', '.gitlab-ci', 'appveyor', 'Gemfile') ||
33
+ (f.start_with?('conf/behaviour/') && f != 'conf/behaviour/.gitkeep') ||
34
+ f.start_with?('doc/claude-sessions/', 'doc/context/memory/') ||
35
+ f.start_with?('.claude/', '.overcommit.yml', 'Dockerfile', 'TODO.md', 'SESSION_NOTES.md') ||
36
+ f.end_with?('.jsonl', '.mv2')
37
+ end
38
+ end
39
+ spec.bindir = 'bin'
40
+ spec.executables = ['rai']
41
+ spec.require_paths = ['lib']
42
+
43
+ # Runtime dependencies
44
+ spec.add_dependency 'ed25519', '~> 1.4'
45
+ spec.add_dependency 'faraday', '~> 2.14'
46
+ spec.add_dependency 'gettext', '~> 3.5'
47
+ spec.add_dependency 'i18n', '~> 1.14'
48
+ spec.add_dependency 'json', '~> 2.19'
49
+ spec.add_dependency 'json_schemer', '~> 2.5'
50
+ spec.add_dependency 'jwt', '~> 2.10'
51
+ spec.add_dependency 'jwt-eddsa', '~> 0.9'
52
+ spec.add_dependency 'paint', '~> 2.3'
53
+ spec.add_dependency 'rainbow', '~> 3.1'
54
+ spec.add_dependency 'rubyzip', '~> 2.4'
55
+ spec.add_dependency 'terminal-table', '~> 4.0'
56
+ spec.add_dependency 'thor', '~> 1.5'
57
+ spec.add_dependency 'tty-prompt', '~> 0.23'
58
+ spec.add_dependency 'tty-spinner', '~> 0.9'
59
+ spec.add_dependency 'zeitwerk', '~> 2.7'
60
+
61
+ # Optional MCP server support (loaded on demand via require 'mcp')
62
+ spec.add_dependency 'mcp', '~> 0.9.2'
63
+ end
data/rules/.gitkeep ADDED
File without changes
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
4
+ #
5
+ # Upload .deb packages to Pulp 3 repository.
6
+ #
7
+ # Required environment variables:
8
+ # PULP_API_URL — Pulp 3 API base URL
9
+ # PULP_API_TOKEN — Bearer authentication token
10
+ # PULP_CHANNEL — Channel name (stable, unstable)
11
+ # PULP_DISTRIBUTION — Debian distribution (bookworm)
12
+ #
13
+ # Expected directory layout:
14
+ # release/*.deb — for stable (tag) builds
15
+ # pkg/*.deb — for unstable (main) builds
16
+ #
17
+ set -euo pipefail
18
+
19
+ # --- Validation ---
20
+
21
+ : "${PULP_API_URL:?PULP_API_URL is required}"
22
+ : "${PULP_API_TOKEN:?PULP_API_TOKEN is required}" # gitleaks:allow
23
+ : "${PULP_CHANNEL:?PULP_CHANNEL is required (stable or unstable)}"
24
+ : "${PULP_DISTRIBUTION:=${PULP_DISTRIBUTION:-bookworm}}"
25
+
26
+ readonly API="${PULP_API_URL}/pulp/api/v3"
27
+ readonly AUTH_HEADER="Authorization: Bearer ${PULP_API_TOKEN}"
28
+
29
+ # --- Locate packages ---
30
+
31
+ if [ "${PULP_CHANNEL}" = "stable" ] && [ -d release ]; then
32
+ DEB_DIR="release"
33
+ elif [ -d pkg ]; then
34
+ DEB_DIR="pkg"
35
+ else
36
+ echo "ERROR: No package directory found (release/ or pkg/)" >&2
37
+ exit 1
38
+ fi
39
+
40
+ DEB_FILES=("${DEB_DIR}"/*.deb)
41
+ if [ ${#DEB_FILES[@]} -eq 0 ]; then
42
+ echo "ERROR: No .deb files found in ${DEB_DIR}/" >&2
43
+ exit 1
44
+ fi
45
+
46
+ echo "Found ${#DEB_FILES[@]} package(s) in ${DEB_DIR}/"
47
+
48
+ # --- GPG sign packages ---
49
+
50
+ for deb in "${DEB_FILES[@]}"; do
51
+ echo "Signing ${deb}..."
52
+ dpkg-sig --sign builder "${deb}"
53
+ dpkg-sig --verify "${deb}"
54
+ done
55
+
56
+ # --- Upload to Pulp ---
57
+
58
+ REPO_NAME="nncc-${PULP_CHANNEL}"
59
+
60
+ # Look up the repository href
61
+ REPO_HREF=$(curl -s -H "${AUTH_HEADER}" \
62
+ "${API}/repositories/deb/apt/?name=${REPO_NAME}" \
63
+ | jq -r '.results[0].pulp_href // empty')
64
+
65
+ if [ -z "${REPO_HREF}" ]; then
66
+ echo "ERROR: Repository '${REPO_NAME}' not found in Pulp" >&2
67
+ echo "Create it first: pulp deb repository create --name ${REPO_NAME}" >&2
68
+ exit 1
69
+ fi
70
+
71
+ echo "Repository: ${REPO_NAME} (${REPO_HREF})"
72
+
73
+ for deb in "${DEB_FILES[@]}"; do
74
+ echo "Uploading $(basename "${deb}")..."
75
+
76
+ # Create artifact
77
+ ARTIFACT_HREF=$(curl -s -H "${AUTH_HEADER}" \
78
+ -F "file=@${deb}" \
79
+ "${API}/artifacts/" \
80
+ | jq -r '.pulp_href')
81
+
82
+ if [ -z "${ARTIFACT_HREF}" ] || [ "${ARTIFACT_HREF}" = "null" ]; then
83
+ echo "ERROR: Failed to upload artifact for ${deb}" >&2
84
+ exit 1
85
+ fi
86
+
87
+ # Create content unit from artifact
88
+ TASK_HREF=$(curl -s -H "${AUTH_HEADER}" \
89
+ -H "Content-Type: application/json" \
90
+ -d "{\"artifact\": \"${ARTIFACT_HREF}\", \"relative_path\": \"$(basename "${deb}")\"}" \
91
+ "${API}/content/deb/packages/" \
92
+ | jq -r '.task // empty')
93
+
94
+ if [ -n "${TASK_HREF}" ]; then
95
+ echo " Waiting for content creation task..."
96
+ # Poll task until complete (max 60s)
97
+ for i in $(seq 1 12); do
98
+ STATE=$(curl -s -H "${AUTH_HEADER}" "${API}${TASK_HREF}" | jq -r '.state')
99
+ if [ "${STATE}" = "completed" ]; then
100
+ break
101
+ elif [ "${STATE}" = "failed" ]; then
102
+ echo "ERROR: Content creation failed" >&2
103
+ curl -s -H "${AUTH_HEADER}" "${API}${TASK_HREF}" | jq '.error'
104
+ exit 1
105
+ fi
106
+ sleep 5
107
+ done
108
+ fi
109
+
110
+ echo " Uploaded: $(basename "${deb}")"
111
+ done
112
+
113
+ # --- Publish ---
114
+
115
+ echo "Publishing repository..."
116
+ PUBLICATION_HREF=$(curl -s -H "${AUTH_HEADER}" \
117
+ -H "Content-Type: application/json" \
118
+ -d "{\"repository\": \"${REPO_HREF}\"}" \
119
+ "${API}/publications/deb/apt/" \
120
+ | jq -r '.task // .pulp_href // empty')
121
+
122
+ echo "Publication triggered: ${PUBLICATION_HREF}"
123
+ echo "Done. Packages available at: https://repo.neatnerds.be/${PULP_CHANNEL}"
data/settings.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(rbenv versions:*)",
5
+ "Bash(rbenv install:*)",
6
+ "Bash(bundle:*)",
7
+ "Bash(gem:*)",
8
+ "Bash(bin/raictl:*)",
9
+ "Bash(yamllint:*)",
10
+ "WebSearch",
11
+ "WebFetch(domain:rubygems.org)",
12
+ "Bash(overcommit --run:*)"
13
+ ],
14
+ "deny": [
15
+ "Read(~/.ssh/**)",
16
+ "Read(~/.gnupg/**)",
17
+ "Read(~/.credentials.json)",
18
+ "Read(~/.claude/.credentials.json)",
19
+ "Read(~/**/.env)",
20
+ "Read(~/**/.env.*)",
21
+ "Read(~/**/secrets/**)",
22
+ "Read(~/.keepass.*/**)",
23
+ "Read(~/**/credentials.json)",
24
+ "Read(~/**/*.pem)",
25
+ "Read(~/**/*.key)"
26
+ ],
27
+ "additionalDirectories": []
28
+ }
29
+ }
@@ -0,0 +1,29 @@
1
+ [Desktop Entry]
2
+ Type=Application
3
+ Name=NeatNerds Code Companion
4
+ GenericName=AI Configuration Tool
5
+ Comment=Manage AI-assisted development configuration
6
+ Exec=nncc desktop gtk4
7
+ Icon=be.neatnerds.rosettai
8
+ Terminal=false
9
+ Categories=Development;Utility;
10
+ Keywords=AI;Claude;Configuration;Development;
11
+ StartupNotify=true
12
+ DBusActivatable=true
13
+
14
+ # GNOME-specific
15
+ X-GNOME-UsesNotifications=true
16
+
17
+ # Translation hints
18
+ X-Ubuntu-Gettext-Domain=nncc
19
+
20
+ # Actions
21
+ Actions=compile;status;
22
+
23
+ [Desktop Action compile]
24
+ Name=Compile Rules
25
+ Exec=nncc compile
26
+
27
+ [Desktop Action status]
28
+ Name=Show Status
29
+ Exec=nncc dbus status
@@ -0,0 +1,103 @@
1
+ <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
2
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
3
+ <node name="/be/neatnerds/nncc">
4
+ <interface name="be.neatnerds.rosettai.Manager">
5
+ <method name="Compile">
6
+ <arg name="engine" type="s" direction="in">
7
+ <doc:doc><doc:summary>Engine name (claude, generic, agents_md)</doc:summary></doc:doc>
8
+ </arg>
9
+ <arg name="result" type="s" direction="out">
10
+ <doc:doc><doc:summary>Compilation result message</doc:summary></doc:doc>
11
+ </arg>
12
+ </method>
13
+
14
+ <method name="SwitchContext">
15
+ <arg name="context_name" type="s" direction="in">
16
+ <doc:doc><doc:summary>Context name to switch to</doc:summary></doc:doc>
17
+ </arg>
18
+ </method>
19
+
20
+ <method name="GetStatus">
21
+ <arg name="status" type="a{sv}" direction="out">
22
+ <doc:doc><doc:summary>Status dictionary with version, running, current_context, pid, dbus_name</doc:summary></doc:doc>
23
+ </arg>
24
+ </method>
25
+
26
+ <method name="Shutdown">
27
+ <doc:doc><doc:summary>Initiate graceful service shutdown</doc:summary></doc:doc>
28
+ </method>
29
+
30
+ <method name="SetConfig">
31
+ <arg name="key" type="s" direction="in">
32
+ <doc:doc><doc:summary>Configuration key (e.g. default_engine)</doc:summary></doc:doc>
33
+ </arg>
34
+ <arg name="value" type="s" direction="in">
35
+ <doc:doc><doc:summary>New value for the configuration key</doc:summary></doc:doc>
36
+ </arg>
37
+ <arg name="result" type="s" direction="out">
38
+ <doc:doc><doc:summary>Result message (OK or Error)</doc:summary></doc:doc>
39
+ </arg>
40
+ </method>
41
+
42
+ <method name="ListEngines">
43
+ <arg name="engines" type="a(ss)" direction="out">
44
+ <doc:doc><doc:summary>Array of (name, display_name) tuples for available engines</doc:summary></doc:doc>
45
+ </arg>
46
+ </method>
47
+
48
+ <property name="Version" type="s" access="read">
49
+ <doc:doc><doc:summary>Service version string</doc:summary></doc:doc>
50
+ </property>
51
+
52
+ <signal name="ContextChanged">
53
+ <arg name="context_name" type="s">
54
+ <doc:doc><doc:summary>New context name after switch</doc:summary></doc:doc>
55
+ </arg>
56
+ </signal>
57
+ </interface>
58
+
59
+ <interface name="be.neatnerds.rosettai.FocusMonitor">
60
+ <method name="GetCurrentFocus">
61
+ <arg name="app_id" type="s" direction="out">
62
+ <doc:doc><doc:summary>Current focused application identifier</doc:summary></doc:doc>
63
+ </arg>
64
+ <arg name="title" type="s" direction="out">
65
+ <doc:doc><doc:summary>Current focused window title</doc:summary></doc:doc>
66
+ </arg>
67
+ </method>
68
+
69
+ <signal name="FocusChanged">
70
+ <arg name="app_id" type="s">
71
+ <doc:doc><doc:summary>Application identifier of newly focused window</doc:summary></doc:doc>
72
+ </arg>
73
+ <arg name="title" type="s">
74
+ <doc:doc><doc:summary>Title of newly focused window</doc:summary></doc:doc>
75
+ </arg>
76
+ </signal>
77
+ </interface>
78
+
79
+ <interface name="org.kde.StatusNotifierItem">
80
+ <method name="Activate">
81
+ <arg name="x" type="i" direction="in"/>
82
+ <arg name="y" type="i" direction="in"/>
83
+ </method>
84
+
85
+ <method name="ContextMenu">
86
+ <arg name="x" type="i" direction="in"/>
87
+ <arg name="y" type="i" direction="in"/>
88
+ </method>
89
+
90
+ <property name="Id" type="s" access="read"/>
91
+ <property name="Category" type="s" access="read"/>
92
+ <property name="Status" type="s" access="read"/>
93
+ <property name="Title" type="s" access="read"/>
94
+ <property name="IconName" type="s" access="read"/>
95
+ <property name="ToolTip" type="(sa(iiay)ss)" access="read"/>
96
+
97
+ <signal name="NewStatus">
98
+ <arg name="status" type="s"/>
99
+ </signal>
100
+
101
+ <signal name="NewTitle"/>
102
+ </interface>
103
+ </node>
@@ -0,0 +1,3 @@
1
+ [D-BUS Service]
2
+ Name=be.neatnerds.rosettai
3
+ Exec=/usr/bin/nncc dbus start
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: criticalthinking
3
+ description: >-
4
+ AI critical thinking rules — challenge assumptions, verify claims,
5
+ enforce methodology discipline, and search for contradictory evidence.
6
+ This is a starter template. Customise it for your workflow.
7
+ version: 1.1.0
8
+ author: rosett-ai
9
+ created_at: '2026-01-25'
10
+ modified_at: '2026-04-14'
11
+ modified_by: rosett-ai
12
+ sensitive: false
13
+ used_in: []
14
+ rules:
15
+ - id: rule_001
16
+ description: |
17
+ Use critical thinking at all times. Avoid pleasing the user —
18
+ instead, challenge ideas and assumptions with factual reasoning.
19
+ priority: 50
20
+ enabled: true
21
+ - id: rule_002
22
+ description: |
23
+ When challenging the user, always back up claims with factual
24
+ references: links to documentation, source material, articles,
25
+ mathematical proofs, or other verifiable information.
26
+ priority: 50
27
+ enabled: true
28
+ - id: rule_003
29
+ description: |
30
+ When a plan or brief specifies a methodology (TDD, design-first,
31
+ documentation-first), do not silently deviate from that methodology
32
+ for speed or convenience. If tempted to skip a mandated step
33
+ (e.g., writing implementation before tests when TDD is specified),
34
+ stop and flag the deviation to the user before proceeding.
35
+ Silently optimising for throughput at the expense of stated
36
+ methodology is a critical thinking failure, not an efficiency gain.
37
+ priority: 70
38
+ enabled: true
39
+ - id: rule_004
40
+ description: |
41
+ When asked to continue beyond the planned scope of a session or
42
+ sprint (e.g., "do the next phase too", "keep going"), evaluate
43
+ whether this removes quality gates that the plan designed in
44
+ (inter-session reviews, human checkpoints, course corrections).
45
+ If it does, flag it explicitly before proceeding. Do not silently
46
+ comply with scope expansion that eliminates oversight mechanisms.
47
+ priority: 65
48
+ enabled: true
49
+ - id: rule_005
50
+ description: |
51
+ When claiming compatibility with, or making assertions about, an
52
+ external tool, API, file format, or protocol, verify the claim
53
+ against the actual artifact — not infer it from documentation,
54
+ naming conventions, or prior assumptions. Read the real config
55
+ file. Call the real API. Parse the real output. An unverified
56
+ compatibility claim is worse than no claim because it creates
57
+ false confidence.
58
+ priority: 60
59
+ enabled: true
60
+ - id: rule_006
61
+ description: |
62
+ When presenting completion status ("done", "all targets met",
63
+ "complete"), actively search for evidence that contradicts the
64
+ claim before presenting it. Check: are there untested code paths?
65
+ Do the numbers actually add up? Was it verified on a real system
66
+ or only in mocked tests? The review process, not the user, should
67
+ catch these gaps.
68
+ priority: 65
69
+ enabled: true