rosett-ai 1.3.3 → 1.5.10

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 (453) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +413 -22
  3. data/README.md +56 -42
  4. data/bin/raictl +13 -0
  5. data/conf/adopt_redactions.yml +2 -0
  6. data/conf/compliance/cra_rules.yml +2 -0
  7. data/conf/compliance/license_rules.yml +2 -0
  8. data/conf/mcp/server_defaults.yml +2 -0
  9. data/conf/mcp/trust.yml +1 -0
  10. data/conf/packaging/core.yml +2 -0
  11. data/conf/packaging/gtk4.yml +2 -0
  12. data/conf/packaging/qt6.yml +2 -0
  13. data/conf/policy/default_deny_list.yml +2 -0
  14. data/conf/review/cli-command-audit.yml +2 -0
  15. data/conf/review/design-docs.yml +2 -0
  16. data/conf/review/design-questionnaire.yml +2 -0
  17. data/conf/review/questionnaire.yml +2 -0
  18. data/conf/review/rosett-ai-core.yml +2 -0
  19. data/conf/schemas/ai_config_schema.json +14 -2
  20. data/conf/schemas/autoqueue.schema.json +153 -0
  21. data/conf/schemas/behaviour_schema.json +31 -7
  22. data/conf/schemas/compliance_rule_schema.json +17 -4
  23. data/conf/schemas/content_pack_manifest_schema.json +23 -4
  24. data/conf/schemas/design_schema.json +177 -42
  25. data/conf/schemas/engine_manifest_schema.json +22 -5
  26. data/conf/schemas/lockfile_schema.json +26 -4
  27. data/conf/schemas/mcp_server_schema.json +50 -9
  28. data/conf/schemas/packaging_schema.json +23 -5
  29. data/conf/schemas/policy_schema.json +35 -9
  30. data/conf/schemas/provenance_schema.json +33 -5
  31. data/conf/schemas/rai_config_schema.json +6 -2
  32. data/conf/schemas/rai_project_schema.json +8 -2
  33. data/conf/schemas/scope_hierarchy_schema.json +22 -5
  34. data/conf/schemas/target_schema.json +33 -6
  35. data/conf/schemas/tooling_schema.json +53 -12
  36. data/conf/schemas/workflow_schema.json +39 -9
  37. data/conf/targets/agents_md.yml +1 -0
  38. data/conf/targets/claude.yml +2 -0
  39. data/conf/tooling/tools.yml +2 -0
  40. data/lib/rosett_ai/adopter/local_analysis_collector.rb +5 -0
  41. data/lib/rosett_ai/adopter/rule_adopter.rb +40 -0
  42. data/lib/rosett_ai/ai_config/context_window.rb +3 -0
  43. data/lib/rosett_ai/ai_config/cost_controls.rb +1 -0
  44. data/lib/rosett_ai/ai_config/fallback_chain.rb +1 -0
  45. data/lib/rosett_ai/ai_config/model_router.rb +1 -0
  46. data/lib/rosett_ai/ai_config/validator.rb +2 -0
  47. data/lib/rosett_ai/authorship/attribution_compiler.rb +1 -0
  48. data/lib/rosett_ai/authorship/disclosure_policy.rb +2 -0
  49. data/lib/rosett_ai/authorship/review_validator.rb +1 -0
  50. data/lib/rosett_ai/authorship/trailer_generator.rb +1 -0
  51. data/lib/rosett_ai/backup/compressor.rb +3 -0
  52. data/lib/rosett_ai/backup/destination.rb +1 -0
  53. data/lib/rosett_ai/behaviour/manager.rb +1 -0
  54. data/lib/rosett_ai/compiler/backend.rb +3 -0
  55. data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +1 -0
  56. data/lib/rosett_ai/compiler/backends/claude_backend.rb +1 -0
  57. data/lib/rosett_ai/compiler/behaviour_compiler.rb +1 -0
  58. data/lib/rosett_ai/compiler/compilation_pipeline.rb +1 -7
  59. data/lib/rosett_ai/compiler/locale_compiler.rb +2 -0
  60. data/lib/rosett_ai/compiler/target_profile.rb +11 -0
  61. data/lib/rosett_ai/completion/generator.rb +2 -0
  62. data/lib/rosett_ai/completion/shells/zsh_generator.rb +1 -0
  63. data/lib/rosett_ai/comply/checkers/cra_checker.rb +1 -0
  64. data/lib/rosett_ai/comply/checkers/license_checker.rb +2 -0
  65. data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +4 -0
  66. data/lib/rosett_ai/comply/runner.rb +2 -0
  67. data/lib/rosett_ai/composition/composer.rb +1 -0
  68. data/lib/rosett_ai/composition/lockfile.rb +1 -0
  69. data/lib/rosett_ai/composition/merge_strategy.rb +1 -0
  70. data/lib/rosett_ai/config/masking_secret_resolver.rb +9 -0
  71. data/lib/rosett_ai/config/secret_resolver.rb +4 -0
  72. data/lib/rosett_ai/configuration.rb +4 -0
  73. data/lib/rosett_ai/content/content_client.rb +15 -0
  74. data/lib/rosett_ai/content/pack_installer.rb +1 -0
  75. data/lib/rosett_ai/content/pack_manifest.rb +21 -0
  76. data/lib/rosett_ai/content_packs/manager.rb +1 -0
  77. data/lib/rosett_ai/dbus/compositor_detector.rb +2 -0
  78. data/lib/rosett_ai/dbus/focus_adapters/base.rb +1 -0
  79. data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +5 -0
  80. data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +4 -0
  81. data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +4 -0
  82. data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +4 -0
  83. data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +4 -0
  84. data/lib/rosett_ai/dbus/focus_monitor_interface.rb +1 -0
  85. data/lib/rosett_ai/dbus/manager_interface.rb +1 -0
  86. data/lib/rosett_ai/dbus/plugin_manager_interface.rb +2 -0
  87. data/lib/rosett_ai/dbus/rate_limiter.rb +1 -0
  88. data/lib/rosett_ai/dbus/service.rb +3 -0
  89. data/lib/rosett_ai/dbus/status_notifier_interface.rb +14 -0
  90. data/lib/rosett_ai/desktop/dbus_client.rb +6 -0
  91. data/lib/rosett_ai/desktop/gtk4_app.rb +3 -0
  92. data/lib/rosett_ai/desktop/gtk4_preferences.rb +1 -0
  93. data/lib/rosett_ai/desktop/gui_logger.rb +2 -0
  94. data/lib/rosett_ai/doctor/check.rb +1 -1
  95. data/lib/rosett_ai/doctor/checks/cache_health_check.rb +1 -0
  96. data/lib/rosett_ai/doctor.rb +1 -0
  97. data/lib/rosett_ai/documentation/reference_compiler.rb +9 -0
  98. data/lib/rosett_ai/documentation/translator.rb +8 -0
  99. data/lib/rosett_ai/engines/base_config_compiler.rb +71 -1
  100. data/lib/rosett_ai/engines/detector.rb +5 -0
  101. data/lib/rosett_ai/engines/registry.rb +7 -0
  102. data/lib/rosett_ai/exit_codes.rb +6 -0
  103. data/lib/rosett_ai/formatting.rb +1 -0
  104. data/lib/rosett_ai/gem_consistency_checker.rb +6 -0
  105. data/lib/rosett_ai/git_hooks/chain_detector.rb +1 -0
  106. data/lib/rosett_ai/git_hooks/installer.rb +4 -0
  107. data/lib/rosett_ai/git_hooks/script_generator.rb +2 -0
  108. data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +6 -0
  109. data/lib/rosett_ai/i18n/utf8_checker.rb +1 -0
  110. data/lib/rosett_ai/init/config_file_writer.rb +4 -0
  111. data/lib/rosett_ai/init/directory_builder.rb +15 -0
  112. data/lib/rosett_ai/init/file_copier.rb +51 -0
  113. data/lib/rosett_ai/init/mcp_registrar.rb +1 -0
  114. data/lib/rosett_ai/init/project_initializer.rb +1 -0
  115. data/lib/rosett_ai/licensing/license_key.rb +4 -0
  116. data/lib/rosett_ai/licensing/license_store.rb +11 -0
  117. data/lib/rosett_ai/licensing/tier.rb +9 -0
  118. data/lib/rosett_ai/mcp/admin/auditor.rb +1 -0
  119. data/lib/rosett_ai/mcp/admin/health_checker.rb +1 -0
  120. data/lib/rosett_ai/mcp/admin/registry.rb +1 -0
  121. data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +27 -4
  122. data/lib/rosett_ai/mcp/enforcement/validator.rb +24 -3
  123. data/lib/rosett_ai/mcp/governance.rb +9 -0
  124. data/lib/rosett_ai/mcp/http_security_config.rb +22 -0
  125. data/lib/rosett_ai/mcp/key_hasher.rb +4 -2
  126. data/lib/rosett_ai/mcp/keyfile.rb +4 -0
  127. data/lib/rosett_ai/mcp/middleware/cors.rb +4 -0
  128. data/lib/rosett_ai/mcp/middleware/origin_validation.rb +1 -0
  129. data/lib/rosett_ai/mcp/middleware/rate_limit.rb +3 -0
  130. data/lib/rosett_ai/mcp/plugins.rb +1 -0
  131. data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +2 -0
  132. data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +3 -0
  133. data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +2 -0
  134. data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +2 -0
  135. data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +2 -0
  136. data/lib/rosett_ai/mcp/resources/config_resource.rb +2 -0
  137. data/lib/rosett_ai/mcp/resources/design_resource.rb +1 -0
  138. data/lib/rosett_ai/mcp/resources/hooks_resource.rb +3 -0
  139. data/lib/rosett_ai/mcp/resources/provenance_resource.rb +2 -0
  140. data/lib/rosett_ai/mcp/resources/rules_resource.rb +1 -0
  141. data/lib/rosett_ai/mcp/resources/schema_resource.rb +1 -0
  142. data/lib/rosett_ai/mcp/server.rb +7 -1
  143. data/lib/rosett_ai/mcp/settings/trust_manager.rb +3 -0
  144. data/lib/rosett_ai/mcp/tools/adopt_tool.rb +4 -0
  145. data/lib/rosett_ai/mcp/tools/backup_tool.rb +4 -0
  146. data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +4 -0
  147. data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +3 -0
  148. data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +5 -0
  149. data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +4 -0
  150. data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +4 -0
  151. data/lib/rosett_ai/mcp/tools/compile_tool.rb +4 -0
  152. data/lib/rosett_ai/mcp/tools/comply_tool.rb +4 -0
  153. data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +4 -0
  154. data/lib/rosett_ai/mcp/tools/config_status_tool.rb +3 -0
  155. data/lib/rosett_ai/mcp/tools/content_tool.rb +5 -0
  156. data/lib/rosett_ai/mcp/tools/context_query_tool.rb +4 -0
  157. data/lib/rosett_ai/mcp/tools/design_list_tool.rb +3 -0
  158. data/lib/rosett_ai/mcp/tools/design_show_tool.rb +4 -0
  159. data/lib/rosett_ai/mcp/tools/doctor_tool.rb +4 -0
  160. data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +3 -0
  161. data/lib/rosett_ai/mcp/tools/engines_tool.rb +5 -0
  162. data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +7 -0
  163. data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +33 -8
  164. data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +5 -0
  165. data/lib/rosett_ai/mcp/tools/init_tool.rb +5 -0
  166. data/lib/rosett_ai/mcp/tools/license_status_tool.rb +3 -0
  167. data/lib/rosett_ai/mcp/tools/project_tool.rb +5 -0
  168. data/lib/rosett_ai/mcp/tools/provenance_tool.rb +5 -0
  169. data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +3 -0
  170. data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +5 -0
  171. data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +4 -0
  172. data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +5 -0
  173. data/lib/rosett_ai/mcp/tools/tooling_tool.rb +5 -0
  174. data/lib/rosett_ai/mcp/tools/validate_tool.rb +4 -0
  175. data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +4 -0
  176. data/lib/rosett_ai/mcp/tools/workflow_tool.rb +5 -0
  177. data/lib/rosett_ai/migration/detector.rb +1 -0
  178. data/lib/rosett_ai/migration/nncc_config_migrator.rb +2 -0
  179. data/lib/rosett_ai/migration/xdg_migrator.rb +3 -1
  180. data/lib/rosett_ai/package_manager/apt.rb +5 -0
  181. data/lib/rosett_ai/package_manager/base.rb +1 -0
  182. data/lib/rosett_ai/package_manager/gem_backend.rb +1 -0
  183. data/lib/rosett_ai/packaging/variant_config.rb +12 -0
  184. data/lib/rosett_ai/plugins/contract.rb +1 -0
  185. data/lib/rosett_ai/plugins/engine_contract.rb +2 -0
  186. data/lib/rosett_ai/plugins/gui_contract.rb +2 -0
  187. data/lib/rosett_ai/plugins/mcp_contract.rb +2 -0
  188. data/lib/rosett_ai/plugins/registry.rb +10 -0
  189. data/lib/rosett_ai/policy/auditor.rb +1 -0
  190. data/lib/rosett_ai/policy/opt_out_scanner.rb +1 -0
  191. data/lib/rosett_ai/policy/tier_hierarchy.rb +2 -0
  192. data/lib/rosett_ai/policy/validator.rb +1 -0
  193. data/lib/rosett_ai/profiler.rb +7 -0
  194. data/lib/rosett_ai/project/drift_detector.rb +1 -0
  195. data/lib/rosett_ai/project/manager.rb +1 -0
  196. data/lib/rosett_ai/project/template_applier.rb +1 -0
  197. data/lib/rosett_ai/provenance/entry.rb +2 -0
  198. data/lib/rosett_ai/provenance/source.rb +1 -0
  199. data/lib/rosett_ai/provenance/store.rb +3 -0
  200. data/lib/rosett_ai/provenance/validator.rb +1 -0
  201. data/lib/rosett_ai/quorum/collector.rb +1 -0
  202. data/lib/rosett_ai/quorum/comparator.rb +2 -0
  203. data/lib/rosett_ai/quorum/strategies/adopt.rb +1 -0
  204. data/lib/rosett_ai/rai_config.rb +9 -0
  205. data/lib/rosett_ai/retrofit/engine.rb +2 -0
  206. data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +8 -0
  207. data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +10 -0
  208. data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +9 -0
  209. data/lib/rosett_ai/retrofit/secret_detector.rb +3 -0
  210. data/lib/rosett_ai/secrets_resolver.rb +1 -0
  211. data/lib/rosett_ai/session_hooks/installer.rb +130 -0
  212. data/lib/rosett_ai/smart_feedback/suggester.rb +4 -0
  213. data/lib/rosett_ai/smart_feedback/thor_middleware.rb +7 -0
  214. data/lib/rosett_ai/structured_logger.rb +1 -0
  215. data/lib/rosett_ai/telemetry/log_rotator.rb +1 -0
  216. data/lib/rosett_ai/telemetry.rb +1 -0
  217. data/lib/rosett_ai/thor/cli.rb +9 -0
  218. data/lib/rosett_ai/thor/tasks/adopt.rb +2 -0
  219. data/lib/rosett_ai/thor/tasks/backfill_user_yml.rb +207 -0
  220. data/lib/rosett_ai/thor/tasks/backup.rb +6 -0
  221. data/lib/rosett_ai/thor/tasks/behaviour.rb +12 -0
  222. data/lib/rosett_ai/thor/tasks/build.rb +106 -21
  223. data/lib/rosett_ai/thor/tasks/compile.rb +76 -32
  224. data/lib/rosett_ai/thor/tasks/completion.rb +9 -0
  225. data/lib/rosett_ai/thor/tasks/comply.rb +2 -0
  226. data/lib/rosett_ai/thor/tasks/config.rb +21 -5
  227. data/lib/rosett_ai/thor/tasks/content.rb +8 -0
  228. data/lib/rosett_ai/thor/tasks/dbus.rb +13 -0
  229. data/lib/rosett_ai/thor/tasks/design.rb +2 -0
  230. data/lib/rosett_ai/thor/tasks/desktop.rb +4 -0
  231. data/lib/rosett_ai/thor/tasks/doctor.rb +2 -0
  232. data/lib/rosett_ai/thor/tasks/documentation.rb +7 -0
  233. data/lib/rosett_ai/thor/tasks/engines.rb +8 -0
  234. data/lib/rosett_ai/thor/tasks/hooks.rb +8 -0
  235. data/lib/rosett_ai/thor/tasks/init.rb +1 -0
  236. data/lib/rosett_ai/thor/tasks/license.rb +8 -0
  237. data/lib/rosett_ai/thor/tasks/mcp.rb +40 -0
  238. data/lib/rosett_ai/thor/tasks/migrate.rb +2 -0
  239. data/lib/rosett_ai/thor/tasks/plugins.rb +15 -0
  240. data/lib/rosett_ai/thor/tasks/project.rb +8 -0
  241. data/lib/rosett_ai/thor/tasks/provenance.rb +8 -0
  242. data/lib/rosett_ai/thor/tasks/release.rb +8 -0
  243. data/lib/rosett_ai/thor/tasks/retrofit.rb +4 -0
  244. data/lib/rosett_ai/thor/tasks/validate.rb +1 -0
  245. data/lib/rosett_ai/thor/tasks/workflow.rb +14 -0
  246. data/lib/rosett_ai/tooling/version_checker.rb +1 -0
  247. data/lib/rosett_ai/ui/accessible_tui.rb +18 -0
  248. data/lib/rosett_ai/ui/base.rb +3 -0
  249. data/lib/rosett_ai/ui/gtk4.rb +19 -0
  250. data/lib/rosett_ai/ui/kde.rb +1 -0
  251. data/lib/rosett_ai/ui/qt6.rb +1 -0
  252. data/lib/rosett_ai/ui/registry.rb +15 -0
  253. data/lib/rosett_ai/ui/tui.rb +22 -0
  254. data/lib/rosett_ai/validators/behaviour_validator.rb +1 -0
  255. data/lib/rosett_ai/validators/design_validator.rb +2 -0
  256. data/lib/rosett_ai/validators/schema_validator.rb +4 -0
  257. data/lib/rosett_ai/validators/tooling_validator.rb +1 -0
  258. data/lib/rosett_ai/version.rb +2 -1
  259. data/lib/rosett_ai/version_consistency_checker.rb +6 -0
  260. data/lib/rosett_ai/workflow/engine.rb +1 -0
  261. data/lib/rosett_ai/workflow/manager.rb +1 -0
  262. data/lib/rosett_ai/workflow/schema_validator.rb +2 -0
  263. data/lib/rosett_ai/workflow/step_runner.rb +1 -0
  264. data/lib/rosett_ai/workflow/steps/rai_step.rb +1 -0
  265. data/lib/rosett_ai/yaml_loader.rb +2 -0
  266. data/lib/rosett_ai.rb +2 -0
  267. data/lib/scripts/generated/docker_hub_tags.rb +2 -0
  268. data/locales/ar.yml +2 -0
  269. data/locales/en.yml +5 -0
  270. data/locales/fr.yml +2 -0
  271. metadata +9 -189
  272. data/.ai-provenance.yml +0 -119
  273. data/.debride_whitelist +0 -186
  274. data/.fasterer.yml +0 -29
  275. data/.mdl_style.rb +0 -10
  276. data/.mdlrc +0 -3
  277. data/.mutant.yml +0 -49
  278. data/.namespace-allowlist +0 -42
  279. data/.reek.yml +0 -1040
  280. data/.rosett-ai/config.yml +0 -3
  281. data/.rspec +0 -5
  282. data/.rubocop.yml +0 -380
  283. data/.ruby-version +0 -1
  284. data/.yamllint +0 -51
  285. data/.yardopts +0 -12
  286. data/AI-DISCLOSURE.md +0 -48
  287. data/CLAUDE.md +0 -141
  288. data/CONTRIBUTING.md +0 -734
  289. data/INSTALL.md +0 -154
  290. data/LICENSE.md +0 -675
  291. data/QUICKSTART.md +0 -73
  292. data/Rakefile +0 -200
  293. data/SECURITY.md +0 -114
  294. data/cliff.toml +0 -52
  295. data/conf/behaviour/.gitkeep +0 -0
  296. data/conf/design/aaif_alignment.yml +0 -181
  297. data/conf/design/ab_testing.yml +0 -172
  298. data/conf/design/accessibility.yml +0 -84
  299. data/conf/design/ai_authorship.yml +0 -210
  300. data/conf/design/ai_provenance.yml +0 -224
  301. data/conf/design/ai_tool_configuration.yml +0 -207
  302. data/conf/design/architecture.yml +0 -139
  303. data/conf/design/autocompletion.yml +0 -115
  304. data/conf/design/backward_compatibility.yml +0 -112
  305. data/conf/design/behaviour_composition.yml +0 -246
  306. data/conf/design/build_rake_extraction.yml +0 -57
  307. data/conf/design/ci_pipeline.yml +0 -100
  308. data/conf/design/claude_code_configuration.yml +0 -157
  309. data/conf/design/compiler.yml +0 -128
  310. data/conf/design/comply.yml +0 -153
  311. data/conf/design/content_packs.yml +0 -84
  312. data/conf/design/desktop_integration.yml +0 -289
  313. data/conf/design/distribution.yml +0 -216
  314. data/conf/design/doctor.yml +0 -184
  315. data/conf/design/documentation.yml +0 -152
  316. data/conf/design/engine_architecture.yml +0 -257
  317. data/conf/design/error_handling.yml +0 -103
  318. data/conf/design/feature_flags.yml +0 -142
  319. data/conf/design/git_hooks.yml +0 -165
  320. data/conf/design/gui_plugins.yml +0 -475
  321. data/conf/design/i18n.yml +0 -84
  322. data/conf/design/integration_testing.yml +0 -56
  323. data/conf/design/licensing_system.yml +0 -88
  324. data/conf/design/lifecycle_management.yml +0 -208
  325. data/conf/design/mcp_integration.yml +0 -207
  326. data/conf/design/mcp_settings.yml +0 -126
  327. data/conf/design/migration.yml +0 -56
  328. data/conf/design/monitoring_observability.yml +0 -194
  329. data/conf/design/namespace_cleanup.yml +0 -145
  330. data/conf/design/plugin_test_segregation.yml +0 -145
  331. data/conf/design/policy_management.yml +0 -229
  332. data/conf/design/project_management.yml +0 -183
  333. data/conf/design/rai_mcp_asset_discovery.yml +0 -164
  334. data/conf/design/rai_mcp_server.yml +0 -605
  335. data/conf/design/release_management.yml +0 -117
  336. data/conf/design/retrofit.yml +0 -199
  337. data/conf/design/retrospective_analyzer.yml +0 -79
  338. data/conf/design/scope_hierarchy.yml +0 -352
  339. data/conf/design/security.yml +0 -115
  340. data/conf/design/session_retrospective.yml +0 -85
  341. data/conf/design/smart_ui_feedback.yml +0 -89
  342. data/conf/design/structured_logging.yml +0 -148
  343. data/conf/design/styles.yml +0 -123
  344. data/conf/design/test_peer_review.yml +0 -89
  345. data/conf/design/testing.yml +0 -136
  346. data/conf/design/threat_model.yml +0 -108
  347. data/conf/design/ui_framework.yml +0 -111
  348. data/conf/design/usage_optimization.yml +0 -122
  349. data/conf/design/version_management.yml +0 -60
  350. data/conf/design/workflow.yml +0 -227
  351. data/doc/AAIF_POSITIONING.md +0 -58
  352. data/doc/ADOPT.md +0 -224
  353. data/doc/AI_PROVENANCE.md +0 -139
  354. data/doc/ARCHITECTURE.md +0 -920
  355. data/doc/BEHAVIOUR.md +0 -409
  356. data/doc/BUILD.md +0 -138
  357. data/doc/CI_CD_RECIPES.md +0 -171
  358. data/doc/CLAUDE_SESSIONS_MOVED.md +0 -16
  359. data/doc/COMMAND_ANALYSIS.md +0 -229
  360. data/doc/CONFIGURATION.md +0 -281
  361. data/doc/DESIGN_AUDIT.md +0 -235
  362. data/doc/DESIGN_PEER_REVIEW.md +0 -771
  363. data/doc/DESKTOP.md +0 -447
  364. data/doc/ENGINES.md +0 -567
  365. data/doc/ENGINE_DEVELOPMENT_GUIDE.md +0 -417
  366. data/doc/FEATURE_AUDIT.md +0 -218
  367. data/doc/IMPLEMENTATION_PLAN.md +0 -669
  368. data/doc/INCIDENT_REPORT_2026-02-02.md +0 -251
  369. data/doc/MIGRATION_GUIDE.md +0 -88
  370. data/doc/PACKAGING.md +0 -232
  371. data/doc/PROJECT_DASHBOARD.md +0 -153
  372. data/doc/PULP_DEPLOYMENT.md +0 -164
  373. data/doc/QUALITY_FIX_SUMMARY.md +0 -110
  374. data/doc/QUICK_START.md +0 -162
  375. data/doc/REEK_CONFIGURATION.md +0 -166
  376. data/doc/REFERENCE.md +0 -253
  377. data/doc/REFERENCES.md +0 -324
  378. data/doc/SECURITY_REVIEW_CHECKLIST.md +0 -72
  379. data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +0 -359
  380. data/doc/SETUP.md +0 -202
  381. data/doc/TEST_PEER_REVIEW.md +0 -152
  382. data/doc/THREAT_MODEL.md +0 -230
  383. data/doc/USAGE.md +0 -545
  384. data/doc/USER_MANUAL.md +0 -585
  385. data/doc/ai_test_review_checklist.md +0 -110
  386. data/doc/changes/2026-02-18-packaging-fpm.md +0 -155
  387. data/doc/changes/2026-02-19-testing-infrastructure.md +0 -221
  388. data/doc/changes/2026-02-20-security-implementation.md +0 -281
  389. data/doc/changes/2026-02-20-styles-implementation.md +0 -220
  390. data/doc/changes/2026-02-21-architecture-completion.md +0 -95
  391. data/doc/changes/2026-02-21-architecture-ui-layer.md +0 -253
  392. data/doc/changes/2026-02-21-cc-config-implementation.md +0 -108
  393. data/doc/changes/2026-02-21-ci-pipeline-implementation.md +0 -214
  394. data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +0 -241
  395. data/doc/changes/2026-02-21-config-design-show-commands.md +0 -61
  396. data/doc/changes/2026-02-21-design-implementation-overview.md +0 -455
  397. data/doc/changes/2026-02-21-lifecycle-management.md +0 -196
  398. data/doc/changes/2026-02-21-path-resolver.md +0 -128
  399. data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +0 -45
  400. data/doc/changes/2026-03-01-ci-bundler-strategy.md +0 -120
  401. data/doc/changes/2026-03-20-security-hardening-phase2.md +0 -163
  402. data/doc/context/SESSION-HANDOFF.md +0 -69
  403. data/doc/context/ai-engine-usage-trends-2026.md +0 -80
  404. data/doc/context/plan-pluggable-engines.md +0 -590
  405. data/doc/decisions/001-flog-deferred.md +0 -32
  406. data/doc/decisions/002-path-resolution-strategy.md +0 -158
  407. data/doc/decisions/003-ui-adapter-selection.md +0 -193
  408. data/doc/decisions/004-design-document-validation.md +0 -179
  409. data/doc/decisions/005-package-splitting-strategy.md +0 -200
  410. data/doc/decisions/006-multi-engine-architecture.md +0 -147
  411. data/doc/decisions/007-engine-agnostic-pivot.md +0 -219
  412. data/doc/decisions/008-ci-bundler-strategy.md +0 -129
  413. data/doc/decisions/009-core-only-v1-release.md +0 -60
  414. data/doc/decisions/010-engine-debian-packaging.md +0 -66
  415. data/doc/decisions/011-context-aware-cli.md +0 -71
  416. data/doc/dependency_decisions.yml +0 -247
  417. data/doc/issues/001-wrapper-missing-environment-variables.md +0 -197
  418. data/doc/issues/002-embedded-ruby-wrong-prefix.md +0 -217
  419. data/doc/issues/003-smoke-test-false-positive.md +0 -127
  420. data/doc/issues/004-market-research-design-updates.md +0 -109
  421. data/doc/issues/005-compile-scope-coexistence.md +0 -161
  422. data/doc/locales/.gitkeep +0 -0
  423. data/doc/man/rai.1.ronn +0 -505
  424. data/doc/operations/packaging.md +0 -133
  425. data/doc/operations/rosett-ai-release.md +0 -65
  426. data/doc/reference/error-catalog.md +0 -107
  427. data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
  428. data/doc/reference/src/Pictures/cover.jpg +0 -0
  429. data/doc/reference/src/Pictures/head1.jpg +0 -0
  430. data/doc/reference/src/Pictures/head2.jpg +0 -0
  431. data/doc/reference/src/Pictures/head3.jpg +0 -0
  432. data/doc/reference/src/Pictures/head4.jpg +0 -0
  433. data/doc/reference/src/Pictures/head5.jpg +0 -0
  434. data/doc/reference/src/Pictures/head6.jpg +0 -0
  435. data/doc/reference/src/Pictures/head7.jpg +0 -0
  436. data/doc/reference/src/Pictures/head8.jpg +0 -0
  437. data/doc/reference/src/StyleInd.ist +0 -4
  438. data/doc/reference/src/bibliography.bib +0 -79
  439. data/doc/reference/src/main.tex +0 -1288
  440. data/doc/reference/src/structure.tex +0 -303
  441. data/doc/rosett-ai-bookmarks.html +0 -301
  442. data/kitchen.yml +0 -46
  443. data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
  444. data/locales/.gitkeep +0 -0
  445. data/packaging/build-engine-deb.sh +0 -81
  446. data/packaging/scripts/postinst +0 -17
  447. data/packaging/scripts/postrm +0 -19
  448. data/packaging/scripts/prerm +0 -10
  449. data/packaging/wrapper.sh.template +0 -38
  450. data/rosett-ai.gemspec +0 -63
  451. data/rules/.gitkeep +0 -0
  452. data/scripts/publish/pulp_upload.sh +0 -123
  453. data/settings.json +0 -29
data/kitchen.yml DELETED
@@ -1,46 +0,0 @@
1
- # SPDX-License-Identifier: GPL-3.0-only
2
- # SPDX-FileCopyrightText: 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
3
- #
4
- # Test Kitchen configuration for Rosett-AI package verification
5
- #
6
- # Prerequisites:
7
- # - Vagrant 2.3.x (MPL-2.0) with vagrant-libvirt plugin
8
- # - libvirt/QEMU/KVM installed and running
9
- # - Pre-built .deb in pkg/ (rake build:package)
10
- #
11
- # Usage:
12
- # bundle exec kitchen test debian-12
13
- # bundle exec kitchen converge debian-12
14
- # bundle exec kitchen verify debian-12
15
- # bundle exec kitchen destroy debian-12
16
-
17
- driver:
18
- name: vagrant
19
- provider: libvirt
20
-
21
- provisioner:
22
- name: shell
23
- script: test/integration/provision.sh
24
- data_path: pkg
25
-
26
- transport:
27
- name: ssh
28
-
29
- verifier:
30
- name: inspec
31
- sudo: false
32
-
33
- platforms:
34
- - name: debian-12
35
- driver:
36
- box: debian/bookworm64
37
-
38
- suites:
39
- - name: rai-context
40
- verifier:
41
- inspec_tests:
42
- - test/integration/rai_context
43
- - name: rai-commands
44
- verifier:
45
- inspec_tests:
46
- - test/integration/rai_commands
File without changes
data/locales/.gitkeep DELETED
File without changes
@@ -1,81 +0,0 @@
1
- #!/bin/bash
2
- # DEPRECATED: This script is replaced by 'bin/raictl build engine'.
3
- # Use: bin/raictl build engine --path /path/to/engine --verbose
4
- # Or from the engine directory: rai build engine --verbose
5
- # This script will be removed in the next release.
6
- #
7
- # Build a .deb package for a rosett-ai engine gem.
8
- #
9
- # Engine .debs install their gem (+ dependencies) into the rosett-ai embedded
10
- # Ruby's gem directory so that Gem.find_files('rosett_ai_engine/*/register.rb')
11
- # discovers them at runtime.
12
- #
13
- # Required environment variables:
14
- # ENGINE_NAME — gem name, e.g. "rosett-ai-engine-claude"
15
- # ENGINE_VERSION — gem version, e.g. "1.0.0"
16
- #
17
- # Optional:
18
- # RAI_MIN_VERSION — minimum rai version dependency (default: 1.0.0)
19
- # OUTPUT_DIR — output directory (default: pkg/)
20
- # RUBY_ABI — Ruby ABI version (default: 3.3.10)
21
- #
22
- # Usage from an engine repo:
23
- # ENGINE_NAME=rosett-ai-engine-acme ENGINE_VERSION=0.1.0 bash ../rosett-ai/packaging/build-engine-deb.sh
24
- #
25
- # SPDX-License-Identifier: GPL-3.0-only
26
- # Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
27
- set -euo pipefail
28
-
29
- echo "WARNING: This script is deprecated. Use 'bin/raictl build engine' instead." >&2
30
-
31
- : "${ENGINE_NAME:?ENGINE_NAME must be set (e.g. rosett-ai-engine-claude)}"
32
- : "${ENGINE_VERSION:?ENGINE_VERSION must be set (e.g. 1.0.0)}"
33
- : "${RAI_MIN_VERSION:=1.0.0}"
34
- : "${OUTPUT_DIR:=pkg}"
35
- : "${RUBY_ABI:=3.3.10}"
36
-
37
- GEM_INSTALL_DIR="/opt/rosett-ai/embedded/lib/ruby/gems/${RUBY_ABI}"
38
- STAGING_DIR="tmp/staging"
39
- STAGING_GEM_DIR="${STAGING_DIR}${GEM_INSTALL_DIR}"
40
-
41
- echo "Building ${ENGINE_NAME} ${ENGINE_VERSION} .deb package..."
42
-
43
- # Clean previous staging
44
- rm -rf "${STAGING_DIR}"
45
- mkdir -p "${STAGING_GEM_DIR}" "${OUTPUT_DIR}"
46
-
47
- # Build the .gem
48
- gem build "${ENGINE_NAME}.gemspec" --output="tmp/${ENGINE_NAME}-${ENGINE_VERSION}.gem"
49
-
50
- # Install gem into staging tree (--install-dir places it correctly)
51
- gem install \
52
- --local \
53
- --install-dir "${STAGING_GEM_DIR}" \
54
- --no-document \
55
- --ignore-dependencies \
56
- "tmp/${ENGINE_NAME}-${ENGINE_VERSION}.gem"
57
-
58
- # Build .deb with fpm
59
- fpm \
60
- -s dir \
61
- -t deb \
62
- --name "${ENGINE_NAME}" \
63
- --version "${ENGINE_VERSION}" \
64
- --iteration 1 \
65
- --maintainer 'NeatNerds <query@neatnerds.be>' \
66
- --vendor 'NeatNerds' \
67
- --description "rosett-ai engine plugin: ${ENGINE_NAME}" \
68
- --url "https://gitlab.neatnerds.be/neatnerds/${ENGINE_NAME}" \
69
- --license 'GPL-3.0-only' \
70
- --architecture all \
71
- --category devel \
72
- --depends "rosett-ai (>= ${RAI_MIN_VERSION})" \
73
- --directories "${GEM_INSTALL_DIR}" \
74
- --deb-compression xz \
75
- --package "${OUTPUT_DIR}/${ENGINE_NAME}_${ENGINE_VERSION}-1_all.deb" \
76
- --force \
77
- -C "${STAGING_DIR}" \
78
- .
79
-
80
- echo "Built: ${OUTPUT_DIR}/${ENGINE_NAME}_${ENGINE_VERSION}-1_all.deb"
81
- dpkg-deb --info "${OUTPUT_DIR}/${ENGINE_NAME}_${ENGINE_VERSION}-1_all.deb"
@@ -1,17 +0,0 @@
1
- #!/bin/bash
2
- # Rosett-AI - Post-installation script
3
- set -e
4
-
5
- INSTALL_DIR="/opt/rosett-ai"
6
- CONFIG_DIR="/etc/rosett-ai"
7
-
8
- # /etc/rosett-ai/settings.json is shipped in the package and managed by dpkg
9
- # as a conffile (user modifications are preserved on upgrade).
10
-
11
- # Create PATH-accessible symlinks
12
- ln -sf "${INSTALL_DIR}/bin/raictl" /usr/local/bin/raictl
13
- ln -sf "${INSTALL_DIR}/bin/raictl" /usr/local/bin/rai
14
- ln -sf "${INSTALL_DIR}/bin/raictl" /usr/local/bin/rosett-ai
15
- chmod 755 "${INSTALL_DIR}/bin/raictl"
16
-
17
- exit 0
@@ -1,19 +0,0 @@
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
@@ -1,10 +0,0 @@
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
@@ -1,38 +0,0 @@
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 DELETED
@@ -1,63 +0,0 @@
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 DELETED
File without changes
@@ -1,123 +0,0 @@
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 DELETED
@@ -1,29 +0,0 @@
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
- }