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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +413 -22
- data/README.md +56 -42
- data/bin/raictl +13 -0
- data/conf/adopt_redactions.yml +2 -0
- data/conf/compliance/cra_rules.yml +2 -0
- data/conf/compliance/license_rules.yml +2 -0
- data/conf/mcp/server_defaults.yml +2 -0
- data/conf/mcp/trust.yml +1 -0
- data/conf/packaging/core.yml +2 -0
- data/conf/packaging/gtk4.yml +2 -0
- data/conf/packaging/qt6.yml +2 -0
- data/conf/policy/default_deny_list.yml +2 -0
- data/conf/review/cli-command-audit.yml +2 -0
- data/conf/review/design-docs.yml +2 -0
- data/conf/review/design-questionnaire.yml +2 -0
- data/conf/review/questionnaire.yml +2 -0
- data/conf/review/rosett-ai-core.yml +2 -0
- data/conf/schemas/ai_config_schema.json +14 -2
- data/conf/schemas/autoqueue.schema.json +153 -0
- data/conf/schemas/behaviour_schema.json +31 -7
- data/conf/schemas/compliance_rule_schema.json +17 -4
- data/conf/schemas/content_pack_manifest_schema.json +23 -4
- data/conf/schemas/design_schema.json +177 -42
- data/conf/schemas/engine_manifest_schema.json +22 -5
- data/conf/schemas/lockfile_schema.json +26 -4
- data/conf/schemas/mcp_server_schema.json +50 -9
- data/conf/schemas/packaging_schema.json +23 -5
- data/conf/schemas/policy_schema.json +35 -9
- data/conf/schemas/provenance_schema.json +33 -5
- data/conf/schemas/rai_config_schema.json +6 -2
- data/conf/schemas/rai_project_schema.json +8 -2
- data/conf/schemas/scope_hierarchy_schema.json +22 -5
- data/conf/schemas/target_schema.json +33 -6
- data/conf/schemas/tooling_schema.json +53 -12
- data/conf/schemas/workflow_schema.json +39 -9
- data/conf/targets/agents_md.yml +1 -0
- data/conf/targets/claude.yml +2 -0
- data/conf/tooling/tools.yml +2 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +5 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +40 -0
- data/lib/rosett_ai/ai_config/context_window.rb +3 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +1 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +1 -0
- data/lib/rosett_ai/ai_config/model_router.rb +1 -0
- data/lib/rosett_ai/ai_config/validator.rb +2 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +1 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +2 -0
- data/lib/rosett_ai/authorship/review_validator.rb +1 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +1 -0
- data/lib/rosett_ai/backup/compressor.rb +3 -0
- data/lib/rosett_ai/backup/destination.rb +1 -0
- data/lib/rosett_ai/behaviour/manager.rb +1 -0
- data/lib/rosett_ai/compiler/backend.rb +3 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +1 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +1 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +1 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +1 -7
- data/lib/rosett_ai/compiler/locale_compiler.rb +2 -0
- data/lib/rosett_ai/compiler/target_profile.rb +11 -0
- data/lib/rosett_ai/completion/generator.rb +2 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +1 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +1 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +2 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +4 -0
- data/lib/rosett_ai/comply/runner.rb +2 -0
- data/lib/rosett_ai/composition/composer.rb +1 -0
- data/lib/rosett_ai/composition/lockfile.rb +1 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +1 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +9 -0
- data/lib/rosett_ai/config/secret_resolver.rb +4 -0
- data/lib/rosett_ai/configuration.rb +4 -0
- data/lib/rosett_ai/content/content_client.rb +15 -0
- data/lib/rosett_ai/content/pack_installer.rb +1 -0
- data/lib/rosett_ai/content/pack_manifest.rb +21 -0
- data/lib/rosett_ai/content_packs/manager.rb +1 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +2 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +1 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +5 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +1 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +1 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +2 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +1 -0
- data/lib/rosett_ai/dbus/service.rb +3 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +14 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +6 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +3 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +1 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +2 -0
- data/lib/rosett_ai/doctor/check.rb +1 -1
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +1 -0
- data/lib/rosett_ai/doctor.rb +1 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +9 -0
- data/lib/rosett_ai/documentation/translator.rb +8 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +71 -1
- data/lib/rosett_ai/engines/detector.rb +5 -0
- data/lib/rosett_ai/engines/registry.rb +7 -0
- data/lib/rosett_ai/exit_codes.rb +6 -0
- data/lib/rosett_ai/formatting.rb +1 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +6 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +1 -0
- data/lib/rosett_ai/git_hooks/installer.rb +4 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +2 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +6 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +1 -0
- data/lib/rosett_ai/init/config_file_writer.rb +4 -0
- data/lib/rosett_ai/init/directory_builder.rb +15 -0
- data/lib/rosett_ai/init/file_copier.rb +51 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +1 -0
- data/lib/rosett_ai/init/project_initializer.rb +1 -0
- data/lib/rosett_ai/licensing/license_key.rb +4 -0
- data/lib/rosett_ai/licensing/license_store.rb +11 -0
- data/lib/rosett_ai/licensing/tier.rb +9 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +1 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +1 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +1 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +27 -4
- data/lib/rosett_ai/mcp/enforcement/validator.rb +24 -3
- data/lib/rosett_ai/mcp/governance.rb +9 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +22 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +4 -2
- data/lib/rosett_ai/mcp/keyfile.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +1 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +3 -0
- data/lib/rosett_ai/mcp/plugins.rb +1 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +3 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +3 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +1 -0
- data/lib/rosett_ai/mcp/server.rb +7 -1
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +3 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +7 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +33 -8
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +5 -0
- data/lib/rosett_ai/migration/detector.rb +1 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +2 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +3 -1
- data/lib/rosett_ai/package_manager/apt.rb +5 -0
- data/lib/rosett_ai/package_manager/base.rb +1 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +1 -0
- data/lib/rosett_ai/packaging/variant_config.rb +12 -0
- data/lib/rosett_ai/plugins/contract.rb +1 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +2 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +2 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +2 -0
- data/lib/rosett_ai/plugins/registry.rb +10 -0
- data/lib/rosett_ai/policy/auditor.rb +1 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +1 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +2 -0
- data/lib/rosett_ai/policy/validator.rb +1 -0
- data/lib/rosett_ai/profiler.rb +7 -0
- data/lib/rosett_ai/project/drift_detector.rb +1 -0
- data/lib/rosett_ai/project/manager.rb +1 -0
- data/lib/rosett_ai/project/template_applier.rb +1 -0
- data/lib/rosett_ai/provenance/entry.rb +2 -0
- data/lib/rosett_ai/provenance/source.rb +1 -0
- data/lib/rosett_ai/provenance/store.rb +3 -0
- data/lib/rosett_ai/provenance/validator.rb +1 -0
- data/lib/rosett_ai/quorum/collector.rb +1 -0
- data/lib/rosett_ai/quorum/comparator.rb +2 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +1 -0
- data/lib/rosett_ai/rai_config.rb +9 -0
- data/lib/rosett_ai/retrofit/engine.rb +2 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +8 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +10 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +9 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +3 -0
- data/lib/rosett_ai/secrets_resolver.rb +1 -0
- data/lib/rosett_ai/session_hooks/installer.rb +130 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +4 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +7 -0
- data/lib/rosett_ai/structured_logger.rb +1 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +1 -0
- data/lib/rosett_ai/telemetry.rb +1 -0
- data/lib/rosett_ai/thor/cli.rb +9 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +2 -0
- data/lib/rosett_ai/thor/tasks/backfill_user_yml.rb +207 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +6 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +12 -0
- data/lib/rosett_ai/thor/tasks/build.rb +106 -21
- data/lib/rosett_ai/thor/tasks/compile.rb +76 -32
- data/lib/rosett_ai/thor/tasks/completion.rb +9 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +2 -0
- data/lib/rosett_ai/thor/tasks/config.rb +21 -5
- data/lib/rosett_ai/thor/tasks/content.rb +8 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +13 -0
- data/lib/rosett_ai/thor/tasks/design.rb +2 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +4 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +2 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +7 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +8 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +8 -0
- data/lib/rosett_ai/thor/tasks/init.rb +1 -0
- data/lib/rosett_ai/thor/tasks/license.rb +8 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +40 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +2 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +15 -0
- data/lib/rosett_ai/thor/tasks/project.rb +8 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +8 -0
- data/lib/rosett_ai/thor/tasks/release.rb +8 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +4 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +1 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +14 -0
- data/lib/rosett_ai/tooling/version_checker.rb +1 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +18 -0
- data/lib/rosett_ai/ui/base.rb +3 -0
- data/lib/rosett_ai/ui/gtk4.rb +19 -0
- data/lib/rosett_ai/ui/kde.rb +1 -0
- data/lib/rosett_ai/ui/qt6.rb +1 -0
- data/lib/rosett_ai/ui/registry.rb +15 -0
- data/lib/rosett_ai/ui/tui.rb +22 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +1 -0
- data/lib/rosett_ai/validators/design_validator.rb +2 -0
- data/lib/rosett_ai/validators/schema_validator.rb +4 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +1 -0
- data/lib/rosett_ai/version.rb +2 -1
- data/lib/rosett_ai/version_consistency_checker.rb +6 -0
- data/lib/rosett_ai/workflow/engine.rb +1 -0
- data/lib/rosett_ai/workflow/manager.rb +1 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +2 -0
- data/lib/rosett_ai/workflow/step_runner.rb +1 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +1 -0
- data/lib/rosett_ai/yaml_loader.rb +2 -0
- data/lib/rosett_ai.rb +2 -0
- data/lib/scripts/generated/docker_hub_tags.rb +2 -0
- data/locales/ar.yml +2 -0
- data/locales/en.yml +5 -0
- data/locales/fr.yml +2 -0
- metadata +9 -189
- data/.ai-provenance.yml +0 -119
- data/.debride_whitelist +0 -186
- data/.fasterer.yml +0 -29
- data/.mdl_style.rb +0 -10
- data/.mdlrc +0 -3
- data/.mutant.yml +0 -49
- data/.namespace-allowlist +0 -42
- data/.reek.yml +0 -1040
- data/.rosett-ai/config.yml +0 -3
- data/.rspec +0 -5
- data/.rubocop.yml +0 -380
- data/.ruby-version +0 -1
- data/.yamllint +0 -51
- data/.yardopts +0 -12
- data/AI-DISCLOSURE.md +0 -48
- data/CLAUDE.md +0 -141
- data/CONTRIBUTING.md +0 -734
- data/INSTALL.md +0 -154
- data/LICENSE.md +0 -675
- data/QUICKSTART.md +0 -73
- data/Rakefile +0 -200
- data/SECURITY.md +0 -114
- data/cliff.toml +0 -52
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/design/aaif_alignment.yml +0 -181
- data/conf/design/ab_testing.yml +0 -172
- data/conf/design/accessibility.yml +0 -84
- data/conf/design/ai_authorship.yml +0 -210
- data/conf/design/ai_provenance.yml +0 -224
- data/conf/design/ai_tool_configuration.yml +0 -207
- data/conf/design/architecture.yml +0 -139
- data/conf/design/autocompletion.yml +0 -115
- data/conf/design/backward_compatibility.yml +0 -112
- data/conf/design/behaviour_composition.yml +0 -246
- data/conf/design/build_rake_extraction.yml +0 -57
- data/conf/design/ci_pipeline.yml +0 -100
- data/conf/design/claude_code_configuration.yml +0 -157
- data/conf/design/compiler.yml +0 -128
- data/conf/design/comply.yml +0 -153
- data/conf/design/content_packs.yml +0 -84
- data/conf/design/desktop_integration.yml +0 -289
- data/conf/design/distribution.yml +0 -216
- data/conf/design/doctor.yml +0 -184
- data/conf/design/documentation.yml +0 -152
- data/conf/design/engine_architecture.yml +0 -257
- data/conf/design/error_handling.yml +0 -103
- data/conf/design/feature_flags.yml +0 -142
- data/conf/design/git_hooks.yml +0 -165
- data/conf/design/gui_plugins.yml +0 -475
- data/conf/design/i18n.yml +0 -84
- data/conf/design/integration_testing.yml +0 -56
- data/conf/design/licensing_system.yml +0 -88
- data/conf/design/lifecycle_management.yml +0 -208
- data/conf/design/mcp_integration.yml +0 -207
- data/conf/design/mcp_settings.yml +0 -126
- data/conf/design/migration.yml +0 -56
- data/conf/design/monitoring_observability.yml +0 -194
- data/conf/design/namespace_cleanup.yml +0 -145
- data/conf/design/plugin_test_segregation.yml +0 -145
- data/conf/design/policy_management.yml +0 -229
- data/conf/design/project_management.yml +0 -183
- data/conf/design/rai_mcp_asset_discovery.yml +0 -164
- data/conf/design/rai_mcp_server.yml +0 -605
- data/conf/design/release_management.yml +0 -117
- data/conf/design/retrofit.yml +0 -199
- data/conf/design/retrospective_analyzer.yml +0 -79
- data/conf/design/scope_hierarchy.yml +0 -352
- data/conf/design/security.yml +0 -115
- data/conf/design/session_retrospective.yml +0 -85
- data/conf/design/smart_ui_feedback.yml +0 -89
- data/conf/design/structured_logging.yml +0 -148
- data/conf/design/styles.yml +0 -123
- data/conf/design/test_peer_review.yml +0 -89
- data/conf/design/testing.yml +0 -136
- data/conf/design/threat_model.yml +0 -108
- data/conf/design/ui_framework.yml +0 -111
- data/conf/design/usage_optimization.yml +0 -122
- data/conf/design/version_management.yml +0 -60
- data/conf/design/workflow.yml +0 -227
- data/doc/AAIF_POSITIONING.md +0 -58
- data/doc/ADOPT.md +0 -224
- data/doc/AI_PROVENANCE.md +0 -139
- data/doc/ARCHITECTURE.md +0 -920
- data/doc/BEHAVIOUR.md +0 -409
- data/doc/BUILD.md +0 -138
- data/doc/CI_CD_RECIPES.md +0 -171
- data/doc/CLAUDE_SESSIONS_MOVED.md +0 -16
- data/doc/COMMAND_ANALYSIS.md +0 -229
- data/doc/CONFIGURATION.md +0 -281
- data/doc/DESIGN_AUDIT.md +0 -235
- data/doc/DESIGN_PEER_REVIEW.md +0 -771
- data/doc/DESKTOP.md +0 -447
- data/doc/ENGINES.md +0 -567
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +0 -417
- data/doc/FEATURE_AUDIT.md +0 -218
- data/doc/IMPLEMENTATION_PLAN.md +0 -669
- data/doc/INCIDENT_REPORT_2026-02-02.md +0 -251
- data/doc/MIGRATION_GUIDE.md +0 -88
- data/doc/PACKAGING.md +0 -232
- data/doc/PROJECT_DASHBOARD.md +0 -153
- data/doc/PULP_DEPLOYMENT.md +0 -164
- data/doc/QUALITY_FIX_SUMMARY.md +0 -110
- data/doc/QUICK_START.md +0 -162
- data/doc/REEK_CONFIGURATION.md +0 -166
- data/doc/REFERENCE.md +0 -253
- data/doc/REFERENCES.md +0 -324
- data/doc/SECURITY_REVIEW_CHECKLIST.md +0 -72
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +0 -359
- data/doc/SETUP.md +0 -202
- data/doc/TEST_PEER_REVIEW.md +0 -152
- data/doc/THREAT_MODEL.md +0 -230
- data/doc/USAGE.md +0 -545
- data/doc/USER_MANUAL.md +0 -585
- data/doc/ai_test_review_checklist.md +0 -110
- data/doc/changes/2026-02-18-packaging-fpm.md +0 -155
- data/doc/changes/2026-02-19-testing-infrastructure.md +0 -221
- data/doc/changes/2026-02-20-security-implementation.md +0 -281
- data/doc/changes/2026-02-20-styles-implementation.md +0 -220
- data/doc/changes/2026-02-21-architecture-completion.md +0 -95
- data/doc/changes/2026-02-21-architecture-ui-layer.md +0 -253
- data/doc/changes/2026-02-21-cc-config-implementation.md +0 -108
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +0 -214
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +0 -241
- data/doc/changes/2026-02-21-config-design-show-commands.md +0 -61
- data/doc/changes/2026-02-21-design-implementation-overview.md +0 -455
- data/doc/changes/2026-02-21-lifecycle-management.md +0 -196
- data/doc/changes/2026-02-21-path-resolver.md +0 -128
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +0 -45
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +0 -120
- data/doc/changes/2026-03-20-security-hardening-phase2.md +0 -163
- data/doc/context/SESSION-HANDOFF.md +0 -69
- data/doc/context/ai-engine-usage-trends-2026.md +0 -80
- data/doc/context/plan-pluggable-engines.md +0 -590
- data/doc/decisions/001-flog-deferred.md +0 -32
- data/doc/decisions/002-path-resolution-strategy.md +0 -158
- data/doc/decisions/003-ui-adapter-selection.md +0 -193
- data/doc/decisions/004-design-document-validation.md +0 -179
- data/doc/decisions/005-package-splitting-strategy.md +0 -200
- data/doc/decisions/006-multi-engine-architecture.md +0 -147
- data/doc/decisions/007-engine-agnostic-pivot.md +0 -219
- data/doc/decisions/008-ci-bundler-strategy.md +0 -129
- data/doc/decisions/009-core-only-v1-release.md +0 -60
- data/doc/decisions/010-engine-debian-packaging.md +0 -66
- data/doc/decisions/011-context-aware-cli.md +0 -71
- data/doc/dependency_decisions.yml +0 -247
- data/doc/issues/001-wrapper-missing-environment-variables.md +0 -197
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +0 -217
- data/doc/issues/003-smoke-test-false-positive.md +0 -127
- data/doc/issues/004-market-research-design-updates.md +0 -109
- data/doc/issues/005-compile-scope-coexistence.md +0 -161
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +0 -505
- data/doc/operations/packaging.md +0 -133
- data/doc/operations/rosett-ai-release.md +0 -65
- data/doc/reference/error-catalog.md +0 -107
- data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
- data/doc/reference/src/Pictures/cover.jpg +0 -0
- data/doc/reference/src/Pictures/head1.jpg +0 -0
- data/doc/reference/src/Pictures/head2.jpg +0 -0
- data/doc/reference/src/Pictures/head3.jpg +0 -0
- data/doc/reference/src/Pictures/head4.jpg +0 -0
- data/doc/reference/src/Pictures/head5.jpg +0 -0
- data/doc/reference/src/Pictures/head6.jpg +0 -0
- data/doc/reference/src/Pictures/head7.jpg +0 -0
- data/doc/reference/src/Pictures/head8.jpg +0 -0
- data/doc/reference/src/StyleInd.ist +0 -4
- data/doc/reference/src/bibliography.bib +0 -79
- data/doc/reference/src/main.tex +0 -1288
- data/doc/reference/src/structure.tex +0 -303
- data/doc/rosett-ai-bookmarks.html +0 -301
- data/kitchen.yml +0 -46
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/locales/.gitkeep +0 -0
- data/packaging/build-engine-deb.sh +0 -81
- data/packaging/scripts/postinst +0 -17
- data/packaging/scripts/postrm +0 -19
- data/packaging/scripts/prerm +0 -10
- data/packaging/wrapper.sh.template +0 -38
- data/rosett-ai.gemspec +0 -63
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +0 -123
- 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"
|
data/packaging/scripts/postinst
DELETED
|
@@ -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
|
data/packaging/scripts/postrm
DELETED
|
@@ -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
|
data/packaging/scripts/prerm
DELETED
|
@@ -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
|
-
}
|