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.
- checksums.yaml +7 -0
- data/.ai-provenance.yml +119 -0
- data/.debride_whitelist +186 -0
- data/.fasterer.yml +29 -0
- data/.mdl_style.rb +10 -0
- data/.mdlrc +3 -0
- data/.mutant.yml +49 -0
- data/.namespace-allowlist +42 -0
- data/.reek.yml +1040 -0
- data/.rosett-ai/config.yml +3 -0
- data/.rspec +5 -0
- data/.rubocop.yml +380 -0
- data/.ruby-version +1 -0
- data/.yamllint +51 -0
- data/.yardopts +12 -0
- data/AI-DISCLOSURE.md +48 -0
- data/CHANGELOG.md +519 -0
- data/CLAUDE.md +141 -0
- data/CONTRIBUTING.md +734 -0
- data/INSTALL.md +154 -0
- data/LICENSE +674 -0
- data/LICENSE.md +675 -0
- data/QUICKSTART.md +73 -0
- data/README.md +366 -0
- data/Rakefile +200 -0
- data/SECURITY.md +114 -0
- data/bin/rai +1 -0
- data/cliff.toml +52 -0
- data/conf/adopt_redactions.yml +8 -0
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/compliance/cra_rules.yml +25 -0
- data/conf/compliance/license_rules.yml +20 -0
- data/conf/design/aaif_alignment.yml +181 -0
- data/conf/design/ab_testing.yml +172 -0
- data/conf/design/accessibility.yml +84 -0
- data/conf/design/ai_authorship.yml +210 -0
- data/conf/design/ai_provenance.yml +224 -0
- data/conf/design/ai_tool_configuration.yml +207 -0
- data/conf/design/architecture.yml +139 -0
- data/conf/design/autocompletion.yml +115 -0
- data/conf/design/backward_compatibility.yml +112 -0
- data/conf/design/behaviour_composition.yml +246 -0
- data/conf/design/build_rake_extraction.yml +57 -0
- data/conf/design/ci_pipeline.yml +100 -0
- data/conf/design/claude_code_configuration.yml +157 -0
- data/conf/design/compiler.yml +128 -0
- data/conf/design/comply.yml +153 -0
- data/conf/design/content_packs.yml +84 -0
- data/conf/design/desktop_integration.yml +289 -0
- data/conf/design/distribution.yml +216 -0
- data/conf/design/doctor.yml +184 -0
- data/conf/design/documentation.yml +152 -0
- data/conf/design/engine_architecture.yml +257 -0
- data/conf/design/error_handling.yml +103 -0
- data/conf/design/feature_flags.yml +142 -0
- data/conf/design/git_hooks.yml +165 -0
- data/conf/design/gui_plugins.yml +475 -0
- data/conf/design/i18n.yml +84 -0
- data/conf/design/integration_testing.yml +56 -0
- data/conf/design/licensing_system.yml +88 -0
- data/conf/design/lifecycle_management.yml +208 -0
- data/conf/design/mcp_integration.yml +207 -0
- data/conf/design/mcp_settings.yml +126 -0
- data/conf/design/migration.yml +56 -0
- data/conf/design/monitoring_observability.yml +194 -0
- data/conf/design/namespace_cleanup.yml +145 -0
- data/conf/design/plugin_test_segregation.yml +145 -0
- data/conf/design/policy_management.yml +229 -0
- data/conf/design/project_management.yml +183 -0
- data/conf/design/rai_mcp_asset_discovery.yml +164 -0
- data/conf/design/rai_mcp_server.yml +605 -0
- data/conf/design/release_management.yml +117 -0
- data/conf/design/retrofit.yml +199 -0
- data/conf/design/retrospective_analyzer.yml +79 -0
- data/conf/design/scope_hierarchy.yml +352 -0
- data/conf/design/security.yml +115 -0
- data/conf/design/session_retrospective.yml +85 -0
- data/conf/design/smart_ui_feedback.yml +89 -0
- data/conf/design/structured_logging.yml +148 -0
- data/conf/design/styles.yml +123 -0
- data/conf/design/test_peer_review.yml +89 -0
- data/conf/design/testing.yml +136 -0
- data/conf/design/threat_model.yml +108 -0
- data/conf/design/ui_framework.yml +111 -0
- data/conf/design/usage_optimization.yml +122 -0
- data/conf/design/version_management.yml +60 -0
- data/conf/design/workflow.yml +227 -0
- data/conf/mcp/server_defaults.yml +42 -0
- data/conf/mcp/trust.yml +21 -0
- data/conf/packaging/core.yml +12 -0
- data/conf/packaging/gtk4.yml +11 -0
- data/conf/packaging/qt6.yml +11 -0
- data/conf/policy/default_deny_list.yml +197 -0
- data/conf/review/cli-command-audit.yml +857 -0
- data/conf/review/design-docs.yml +1064 -0
- data/conf/review/design-questionnaire.yml +153 -0
- data/conf/review/questionnaire.yml +146 -0
- data/conf/review/rosett-ai-core.yml +2919 -0
- data/conf/schemas/ai_config_schema.json +73 -0
- data/conf/schemas/behaviour_schema.json +132 -0
- data/conf/schemas/compliance_rule_schema.json +63 -0
- data/conf/schemas/content_pack_manifest_schema.json +51 -0
- data/conf/schemas/design_schema.json +210 -0
- data/conf/schemas/engine_manifest_schema.json +144 -0
- data/conf/schemas/lockfile_schema.json +74 -0
- data/conf/schemas/mcp_server_schema.json +48 -0
- data/conf/schemas/packaging_schema.json +70 -0
- data/conf/schemas/policy_schema.json +85 -0
- data/conf/schemas/provenance_schema.json +84 -0
- data/conf/schemas/rai_config_schema.json +56 -0
- data/conf/schemas/rai_project_schema.json +20 -0
- data/conf/schemas/scope_hierarchy_schema.json +49 -0
- data/conf/schemas/target_schema.json +67 -0
- data/conf/schemas/tooling_schema.json +65 -0
- data/conf/schemas/workflow_schema.json +112 -0
- data/conf/targets/agents_md.yml +17 -0
- data/conf/targets/claude.yml +12 -0
- data/conf/tooling/tools.yml +58 -0
- data/dist/rosett-ai-mcp.service +48 -0
- data/dist/rosett-ai-mcp.yml.default +45 -0
- data/doc/AAIF_POSITIONING.md +58 -0
- data/doc/ADOPT.md +224 -0
- data/doc/AI_PROVENANCE.md +139 -0
- data/doc/ARCHITECTURE.md +920 -0
- data/doc/BEHAVIOUR.md +409 -0
- data/doc/BUILD.md +138 -0
- data/doc/CI_CD_RECIPES.md +171 -0
- data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
- data/doc/COMMAND_ANALYSIS.md +229 -0
- data/doc/CONFIGURATION.md +281 -0
- data/doc/DESIGN_AUDIT.md +235 -0
- data/doc/DESIGN_PEER_REVIEW.md +771 -0
- data/doc/DESKTOP.md +447 -0
- data/doc/ENGINES.md +567 -0
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
- data/doc/FEATURE_AUDIT.md +218 -0
- data/doc/IMPLEMENTATION_PLAN.md +669 -0
- data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
- data/doc/MIGRATION_GUIDE.md +88 -0
- data/doc/PACKAGING.md +232 -0
- data/doc/PROJECT_DASHBOARD.md +153 -0
- data/doc/PULP_DEPLOYMENT.md +164 -0
- data/doc/QUALITY_FIX_SUMMARY.md +110 -0
- data/doc/QUICK_START.md +162 -0
- data/doc/REEK_CONFIGURATION.md +166 -0
- data/doc/REFERENCE.md +253 -0
- data/doc/REFERENCES.md +324 -0
- data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
- data/doc/SETUP.md +202 -0
- data/doc/TEST_PEER_REVIEW.md +152 -0
- data/doc/THREAT_MODEL.md +230 -0
- data/doc/USAGE.md +545 -0
- data/doc/USER_MANUAL.md +585 -0
- data/doc/ai_test_review_checklist.md +110 -0
- data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
- data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
- data/doc/changes/2026-02-20-security-implementation.md +281 -0
- data/doc/changes/2026-02-20-styles-implementation.md +220 -0
- data/doc/changes/2026-02-21-architecture-completion.md +95 -0
- data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
- data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
- data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
- data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
- data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
- data/doc/changes/2026-02-21-path-resolver.md +128 -0
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
- data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
- data/doc/context/SESSION-HANDOFF.md +69 -0
- data/doc/context/ai-engine-usage-trends-2026.md +80 -0
- data/doc/context/plan-pluggable-engines.md +590 -0
- data/doc/decisions/001-flog-deferred.md +32 -0
- data/doc/decisions/002-path-resolution-strategy.md +158 -0
- data/doc/decisions/003-ui-adapter-selection.md +193 -0
- data/doc/decisions/004-design-document-validation.md +179 -0
- data/doc/decisions/005-package-splitting-strategy.md +200 -0
- data/doc/decisions/006-multi-engine-architecture.md +147 -0
- data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
- data/doc/decisions/008-ci-bundler-strategy.md +129 -0
- data/doc/decisions/009-core-only-v1-release.md +60 -0
- data/doc/decisions/010-engine-debian-packaging.md +66 -0
- data/doc/decisions/011-context-aware-cli.md +71 -0
- data/doc/dependency_decisions.yml +247 -0
- data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
- data/doc/issues/003-smoke-test-false-positive.md +127 -0
- data/doc/issues/004-market-research-design-updates.md +109 -0
- data/doc/issues/005-compile-scope-coexistence.md +161 -0
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +505 -0
- data/doc/operations/packaging.md +133 -0
- data/doc/operations/rosett-ai-release.md +65 -0
- data/doc/reference/error-catalog.md +107 -0
- 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 +4 -0
- data/doc/reference/src/bibliography.bib +79 -0
- data/doc/reference/src/main.tex +1288 -0
- data/doc/reference/src/structure.tex +303 -0
- data/doc/rosett-ai-bookmarks.html +301 -0
- data/kitchen.yml +46 -0
- data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
- data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
- data/lib/rosett_ai/ai_config/context_window.rb +55 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
- data/lib/rosett_ai/ai_config/model_router.rb +121 -0
- data/lib/rosett_ai/ai_config/validator.rb +45 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
- data/lib/rosett_ai/authorship/review_validator.rb +39 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
- data/lib/rosett_ai/backup/compressor.rb +180 -0
- data/lib/rosett_ai/backup/destination.rb +91 -0
- data/lib/rosett_ai/behaviour/manager.rb +156 -0
- data/lib/rosett_ai/compiler/backend.rb +86 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
- data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
- data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
- data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
- data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
- data/lib/rosett_ai/compiler/target_profile.rb +112 -0
- data/lib/rosett_ai/completion/generator.rb +101 -0
- data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
- data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
- data/lib/rosett_ai/comply/reporter.rb +113 -0
- data/lib/rosett_ai/comply/runner.rb +50 -0
- data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
- data/lib/rosett_ai/composition/composer.rb +158 -0
- data/lib/rosett_ai/composition/composition_result.rb +64 -0
- data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
- data/lib/rosett_ai/composition/lockfile.rb +103 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
- data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
- data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
- data/lib/rosett_ai/config/compile_result.rb +37 -0
- data/lib/rosett_ai/config/compiler.rb +13 -0
- data/lib/rosett_ai/config/domain_transformer.rb +13 -0
- data/lib/rosett_ai/config/key_map.rb +13 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
- data/lib/rosett_ai/config/scope_router.rb +13 -0
- data/lib/rosett_ai/config/secret_resolver.rb +125 -0
- data/lib/rosett_ai/configuration.rb +119 -0
- data/lib/rosett_ai/content/content_client.rb +60 -0
- data/lib/rosett_ai/content/pack_installer.rb +117 -0
- data/lib/rosett_ai/content/pack_manifest.rb +50 -0
- data/lib/rosett_ai/content/pack_registry.rb +68 -0
- data/lib/rosett_ai/content_packs/manager.rb +50 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
- data/lib/rosett_ai/dbus/service.rb +121 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
- data/lib/rosett_ai/deprecation.rb +79 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
- data/lib/rosett_ai/doctor/check.rb +92 -0
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
- data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
- data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
- data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
- data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
- data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
- data/lib/rosett_ai/doctor.rb +81 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
- data/lib/rosett_ai/documentation/translator.rb +62 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
- data/lib/rosett_ai/engines/detector.rb +63 -0
- data/lib/rosett_ai/engines/registry.rb +50 -0
- data/lib/rosett_ai/error_handler.rb +139 -0
- data/lib/rosett_ai/exit_codes.rb +76 -0
- data/lib/rosett_ai/feature_flags.rb +102 -0
- data/lib/rosett_ai/formatting.rb +33 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
- data/lib/rosett_ai/git_hooks/installer.rb +175 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
- data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
- data/lib/rosett_ai/init/config_file_writer.rb +24 -0
- data/lib/rosett_ai/init/directory_builder.rb +38 -0
- data/lib/rosett_ai/init/file_copier.rb +95 -0
- data/lib/rosett_ai/init/global_initializer.rb +28 -0
- data/lib/rosett_ai/init/local_initializer.rb +27 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
- data/lib/rosett_ai/init/project_initializer.rb +38 -0
- data/lib/rosett_ai/licensing/license_key.rb +139 -0
- data/lib/rosett_ai/licensing/license_store.rb +64 -0
- data/lib/rosett_ai/licensing/license_validator.rb +60 -0
- data/lib/rosett_ai/licensing/tier.rb +42 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
- data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
- data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
- data/lib/rosett_ai/mcp/governance.rb +160 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
- data/lib/rosett_ai/mcp/instructions.rb +266 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
- data/lib/rosett_ai/mcp/keyfile.rb +221 -0
- data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
- data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
- data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
- data/lib/rosett_ai/mcp/plugins.rb +143 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
- data/lib/rosett_ai/mcp/response_helper.rb +46 -0
- data/lib/rosett_ai/mcp/security_logger.rb +60 -0
- data/lib/rosett_ai/mcp/server.rb +212 -0
- data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
- data/lib/rosett_ai/migration/detector.rb +117 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
- data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
- data/lib/rosett_ai/package_manager/apt.rb +108 -0
- data/lib/rosett_ai/package_manager/base.rb +68 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
- data/lib/rosett_ai/packaging/variant_config.rb +92 -0
- data/lib/rosett_ai/path_resolver.rb +115 -0
- data/lib/rosett_ai/plugins/contract.rb +43 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
- data/lib/rosett_ai/plugins/registry.rb +150 -0
- data/lib/rosett_ai/policy/auditor.rb +41 -0
- data/lib/rosett_ai/policy/deny_list.rb +71 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
- data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
- data/lib/rosett_ai/policy/protected_files.rb +47 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
- data/lib/rosett_ai/policy/validator.rb +35 -0
- data/lib/rosett_ai/profiler.rb +79 -0
- data/lib/rosett_ai/project/drift_detector.rb +126 -0
- data/lib/rosett_ai/project/manager.rb +115 -0
- data/lib/rosett_ai/project/sync_manager.rb +138 -0
- data/lib/rosett_ai/project/template_applier.rb +105 -0
- data/lib/rosett_ai/project_context.rb +82 -0
- data/lib/rosett_ai/provenance/entry.rb +63 -0
- data/lib/rosett_ai/provenance/file_source.rb +32 -0
- data/lib/rosett_ai/provenance/source.rb +62 -0
- data/lib/rosett_ai/provenance/store.rb +153 -0
- data/lib/rosett_ai/provenance/tracker.rb +62 -0
- data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
- data/lib/rosett_ai/provenance/validator.rb +45 -0
- data/lib/rosett_ai/quorum/collector.rb +59 -0
- data/lib/rosett_ai/quorum/comparator.rb +81 -0
- data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
- data/lib/rosett_ai/rai_config.rb +107 -0
- data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
- data/lib/rosett_ai/retrofit/engine.rb +171 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
- data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
- data/lib/rosett_ai/retrofit/scanner.rb +47 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
- data/lib/rosett_ai/secrets_resolver.rb +71 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
- data/lib/rosett_ai/structured_logger.rb +110 -0
- data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
- data/lib/rosett_ai/telemetry/provider.rb +26 -0
- data/lib/rosett_ai/telemetry/reporter.rb +144 -0
- data/lib/rosett_ai/telemetry.rb +47 -0
- data/lib/rosett_ai/text_sanitizer.rb +62 -0
- data/lib/rosett_ai/thor/cli.rb +269 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
- data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
- data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
- data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
- data/lib/rosett_ai/thor/tasks/config.rb +265 -0
- data/lib/rosett_ai/thor/tasks/content.rb +193 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
- data/lib/rosett_ai/thor/tasks/design.rb +258 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
- data/lib/rosett_ai/thor/tasks/init.rb +259 -0
- data/lib/rosett_ai/thor/tasks/license.rb +120 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
- data/lib/rosett_ai/thor/tasks/project.rb +260 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
- data/lib/rosett_ai/thor/tasks/release.rb +314 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
- data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
- data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
- data/lib/rosett_ai/tooling/version_checker.rb +35 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
- data/lib/rosett_ai/ui/base.rb +46 -0
- data/lib/rosett_ai/ui/gtk4.rb +98 -0
- data/lib/rosett_ai/ui/kde.rb +40 -0
- data/lib/rosett_ai/ui/qt6.rb +40 -0
- data/lib/rosett_ai/ui/registry.rb +60 -0
- data/lib/rosett_ai/ui/tty_helper.rb +74 -0
- data/lib/rosett_ai/ui/tui.rb +59 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
- data/lib/rosett_ai/validators/design_validator.rb +17 -0
- data/lib/rosett_ai/validators/schema_validator.rb +84 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
- data/lib/rosett_ai/version.rb +8 -0
- data/lib/rosett_ai/version_consistency_checker.rb +129 -0
- data/lib/rosett_ai/workflow/audit_log.rb +86 -0
- data/lib/rosett_ai/workflow/engine.rb +142 -0
- data/lib/rosett_ai/workflow/manager.rb +82 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
- data/lib/rosett_ai/workflow/step_runner.rb +61 -0
- data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
- data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
- data/lib/rosett_ai/yaml_loader.rb +78 -0
- data/lib/rosett_ai.rb +221 -0
- data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
- data/lib/rubocop/rosett_ai.rb +9 -0
- data/lib/scripts/generated/docker_hub_tags.rb +126 -0
- data/locales/.gitkeep +0 -0
- data/locales/ar.yml +579 -0
- data/locales/en.yml +571 -0
- data/locales/fr.yml +567 -0
- data/packaging/build-engine-deb.sh +81 -0
- data/packaging/scripts/postinst +17 -0
- data/packaging/scripts/postrm +19 -0
- data/packaging/scripts/prerm +10 -0
- data/packaging/wrapper.sh.template +38 -0
- data/rosett-ai.gemspec +63 -0
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +123 -0
- data/settings.json +29 -0
- data/share/applications/be.neatnerds.rosettai.desktop +29 -0
- data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
- data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
- data/share/templates/behaviour/criticalthinking.yml +69 -0
- metadata +810 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# ADR-009: Core-Only v1.0.0 Release
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted (2026-03-04)
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
raictl v1.0.0 includes 10 engines, D-Bus service, GTK4 desktop app, and all
|
|
10
|
+
supporting infrastructure. The gemspec declares `ruby-dbus` (~> 0.24) and
|
|
11
|
+
`i3ipc` (~> 0.3) as runtime dependencies, but these are only used by the
|
|
12
|
+
desktop and D-Bus modules:
|
|
13
|
+
|
|
14
|
+
- `ruby-dbus`: `lib/rosett_ai/dbus/`, `lib/rosett_ai/desktop/dbus_client.rb`
|
|
15
|
+
- `i3ipc`: `lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb`
|
|
16
|
+
|
|
17
|
+
These gems pull in native extensions and system library dependencies
|
|
18
|
+
(`libgirepository1.0-dev` for GObject introspection) that are irrelevant
|
|
19
|
+
for users who only want the CLI compiler. Installing rosett-ai on a headless
|
|
20
|
+
CI runner or server should not require D-Bus development libraries.
|
|
21
|
+
|
|
22
|
+
The `adwaita` gem (GTK4 desktop UI) is already in a separate `:desktop`
|
|
23
|
+
Bundler group in the Gemfile and excluded from CI. But `ruby-dbus` and
|
|
24
|
+
`i3ipc` are in the gemspec itself, making them mandatory for all installs.
|
|
25
|
+
|
|
26
|
+
## Decision
|
|
27
|
+
|
|
28
|
+
Release v1.0.0 as **core-only**:
|
|
29
|
+
|
|
30
|
+
1. Move `ruby-dbus` and `i3ipc` from `rosett-ai.gemspec` to the `:desktop`
|
|
31
|
+
group in `Gemfile` (with `require: false`).
|
|
32
|
+
2. Add `loader.ignore` calls in `lib/rosett_ai.rb` to prevent Zeitwerk from
|
|
33
|
+
autoloading `rosett-ai/dbus` and `rosett-ai/desktop` when `ruby-dbus` is
|
|
34
|
+
unavailable.
|
|
35
|
+
3. Desktop CLI commands (`dbus start/stop`, `desktop gtk4`) print a
|
|
36
|
+
clear error message directing users to the `rosett-ai-gtk4` package.
|
|
37
|
+
4. The `.deb` package (`nncc_1.0.0-1_amd64.deb`) ships as core-only.
|
|
38
|
+
Desktop features will be available via a separate `rosett-ai-gtk4` package.
|
|
39
|
+
|
|
40
|
+
## Consequences
|
|
41
|
+
|
|
42
|
+
### Positive
|
|
43
|
+
|
|
44
|
+
- Core rosett-ai installs cleanly on headless systems (CI, servers, containers)
|
|
45
|
+
- No native extension compilation required for core functionality
|
|
46
|
+
- Cleaner dependency tree for the core `.deb` package
|
|
47
|
+
- Desktop components can evolve on their own release cadence
|
|
48
|
+
|
|
49
|
+
### Negative
|
|
50
|
+
|
|
51
|
+
- Users who previously ran `gem install rosett-ai` and used D-Bus features
|
|
52
|
+
will need to install `rosett-ai-gtk4` separately (no v0.x release exists,
|
|
53
|
+
so no actual migration impact)
|
|
54
|
+
- Two packages to maintain instead of one
|
|
55
|
+
|
|
56
|
+
### Neutral
|
|
57
|
+
|
|
58
|
+
- All 10 engines remain in core (they have no desktop dependencies)
|
|
59
|
+
- Desktop specs are excluded from core-only test runs but remain in
|
|
60
|
+
the full test suite
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# ADR 010: Engine Debian Packaging
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|----------|----------------------|
|
|
5
|
+
| Status | Accepted |
|
|
6
|
+
| Date | 2026-03-07 |
|
|
7
|
+
| Authors | Hugo Sepulveda |
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
The rosett-ai core package bundles an embedded Ruby runtime at `/opt/rosett-ai/embedded/`.
|
|
12
|
+
Engine gems (e.g. `rosett-ai-engine-claude`, `rosett-ai-engine-ollama`) are separate
|
|
13
|
+
repositories with their own gemspecs. During development, the core Gemfile
|
|
14
|
+
referenced them via `path: '../rosett-ai-engine-*'`, which:
|
|
15
|
+
|
|
16
|
+
1. Caused `bundle install --deployment` to fail in the staging tree (the sibling
|
|
17
|
+
directories don't exist after `rsync` copies the project).
|
|
18
|
+
2. Contradicted the pluggable architecture — engines should be independently
|
|
19
|
+
installable, not embedded in the core package.
|
|
20
|
+
|
|
21
|
+
## Decision
|
|
22
|
+
|
|
23
|
+
Each engine gem is packaged as its own `.deb` (architecture: `all`, since they
|
|
24
|
+
are pure Ruby) that installs into the rosett-ai embedded Ruby's gem directory:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
/opt/rosett-ai/embedded/lib/ruby/gems/3.3.10/
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
This allows the existing `Gem.find_files('rosett_ai_engine/*/register.rb')` discovery
|
|
31
|
+
mechanism to find engine plugins at runtime without any changes to the core.
|
|
32
|
+
|
|
33
|
+
### Core Gemfile
|
|
34
|
+
|
|
35
|
+
The core `Gemfile` no longer references engine gems. A `Gemfile.dev` (gitignored)
|
|
36
|
+
is provided for developers who need cross-repo testing.
|
|
37
|
+
|
|
38
|
+
### Build Script
|
|
39
|
+
|
|
40
|
+
A reusable `packaging/build-engine-deb.sh` script in the core repo accepts
|
|
41
|
+
`ENGINE_NAME` and `ENGINE_VERSION` environment variables. Each engine repo
|
|
42
|
+
contains a thin `packaging/build-deb.sh` wrapper that sets these variables and
|
|
43
|
+
delegates to the core script.
|
|
44
|
+
|
|
45
|
+
### Dependencies
|
|
46
|
+
|
|
47
|
+
Engine `.deb` packages declare `Depends: rosett-ai (>= 1.0.0)`. Engine-specific
|
|
48
|
+
runtime dependencies (e.g. `anthropic` for rosett-ai-engine-claude) are declared in
|
|
49
|
+
the engine's gemspec as `add_dependency`.
|
|
50
|
+
|
|
51
|
+
## Consequences
|
|
52
|
+
|
|
53
|
+
- Users install engines independently: `dpkg -i rosett-ai-engine-claude_1.0.0-1_all.deb`
|
|
54
|
+
- Engine updates don't require rebuilding the core package
|
|
55
|
+
- The core `.deb` is smaller and builds faster (no engine gems bundled)
|
|
56
|
+
- Developers use `BUNDLE_GEMFILE=Gemfile.dev bundle install` for local testing
|
|
57
|
+
- Engine gem dependencies are resolved at gem install time within the engine
|
|
58
|
+
`.deb` build, not at core build time
|
|
59
|
+
|
|
60
|
+
## Alternatives Considered
|
|
61
|
+
|
|
62
|
+
1. **Bundle all engines in core** — rejected: inflates package size, couples
|
|
63
|
+
release cycles, contradicts pluggable architecture.
|
|
64
|
+
2. **APT repository with engine packages** — deferred: requires infrastructure
|
|
65
|
+
setup. The current approach produces `.deb` files that can be hosted in any
|
|
66
|
+
APT repo when ready.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# ADR 011: Context-Aware CLI
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|----------|----------------------|
|
|
5
|
+
| Status | Accepted |
|
|
6
|
+
| Date | 2026-03-08 |
|
|
7
|
+
| Authors | Hugo Sepulveda |
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
rosett-ai's CLI was "rooted" to its own installation directory. Commands that read
|
|
12
|
+
configuration (design, behaviour, compile, validate) hardcoded
|
|
13
|
+
`RosettAi.root.join('conf', ...)` as the source path, which always resolved to
|
|
14
|
+
rosett-ai's own `conf/` directory regardless of `Dir.pwd`. This made rosett-ai unusable
|
|
15
|
+
as a per-project configuration management tool.
|
|
16
|
+
|
|
17
|
+
Additionally, commands like `build`, `release`, `dbus`, and `desktop` are
|
|
18
|
+
rosett-ai-internal development commands that clutter help output when invoked from
|
|
19
|
+
any other project.
|
|
20
|
+
|
|
21
|
+
## Decision
|
|
22
|
+
|
|
23
|
+
### Project marker: `.rosett-ai/` directory
|
|
24
|
+
|
|
25
|
+
A new `RosettAi::ProjectContext` class detects project context by walking up from
|
|
26
|
+
`Dir.pwd` looking for a `.rosett-ai/` directory (following the `.git/`, `.vscode/`,
|
|
27
|
+
`.idea/` convention).
|
|
28
|
+
|
|
29
|
+
Project structure created by `rai init --project`:
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
<project>/
|
|
33
|
+
.rosett-ai/
|
|
34
|
+
config.yml # Project marker + config (project_name, default_engine)
|
|
35
|
+
conf/
|
|
36
|
+
behaviour/ # Project-specific behaviours
|
|
37
|
+
design/ # Project-specific design docs
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Path resolution
|
|
41
|
+
|
|
42
|
+
- `RosettAi.conf_root` returns `.rosett-ai/` when inside a project, `RosettAi.root` otherwise
|
|
43
|
+
- Content directories (design, behaviour, tooling) resolve relative to `conf_root`
|
|
44
|
+
- Schemas always resolve from `RosettAi.root` (they are part of the tool, not the project)
|
|
45
|
+
|
|
46
|
+
### Command visibility
|
|
47
|
+
|
|
48
|
+
Internal commands (`build`, `release`, `documentation`, `dbus`, `desktop`) are:
|
|
49
|
+
|
|
50
|
+
- Hidden from `raictl help` output outside the rosett-ai repository
|
|
51
|
+
- Blocked with a clear error message when invoked directly
|
|
52
|
+
|
|
53
|
+
Detection uses `ProjectContext#nncc_internal?` which returns true only when the
|
|
54
|
+
detected project root equals `RosettAi.root`.
|
|
55
|
+
|
|
56
|
+
## Alternatives Considered
|
|
57
|
+
|
|
58
|
+
1. **`.rosett-ai.yml` file at project root** — Rejected because a hidden directory is
|
|
59
|
+
cleaner for housing multiple config files and subdirectories without cluttering
|
|
60
|
+
the project root.
|
|
61
|
+
|
|
62
|
+
2. **Explicit `--project-dir` flag on every command** — Rejected because it
|
|
63
|
+
violates the "works like git" principle and creates a poor user experience.
|
|
64
|
+
|
|
65
|
+
## Consequences
|
|
66
|
+
|
|
67
|
+
- Users can run `rai init --project` to set up per-project configuration
|
|
68
|
+
- `rai design list` from a project directory shows that project's design docs
|
|
69
|
+
- `rai compile` from a project directory compiles that project's configuration
|
|
70
|
+
- Internal commands remain accessible only from the rosett-ai repository itself
|
|
71
|
+
- Backward compatible: rosett-ai's own repository continues to work unchanged
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
- - :permit
|
|
3
|
+
- MIT
|
|
4
|
+
- :who:
|
|
5
|
+
:why:
|
|
6
|
+
:versions: []
|
|
7
|
+
:when: 2026-03-18 19:57:51.797624521 Z
|
|
8
|
+
- - :permit
|
|
9
|
+
- Apache-2.0
|
|
10
|
+
- :who:
|
|
11
|
+
:why:
|
|
12
|
+
:versions: []
|
|
13
|
+
:when: 2026-03-18 19:57:53.592238092 Z
|
|
14
|
+
- - :permit
|
|
15
|
+
- Apache 2.0
|
|
16
|
+
- :who:
|
|
17
|
+
:why:
|
|
18
|
+
:versions: []
|
|
19
|
+
:when: 2026-03-18 19:57:55.699515625 Z
|
|
20
|
+
- - :permit
|
|
21
|
+
- Apache License (2.0)
|
|
22
|
+
- :who:
|
|
23
|
+
:why:
|
|
24
|
+
:versions: []
|
|
25
|
+
:when: 2026-03-18 19:57:57.245428941 Z
|
|
26
|
+
- - :permit
|
|
27
|
+
- Simplified BSD
|
|
28
|
+
- :who:
|
|
29
|
+
:why:
|
|
30
|
+
:versions: []
|
|
31
|
+
:when: 2026-03-18 19:57:58.814909858 Z
|
|
32
|
+
- - :permit
|
|
33
|
+
- Simplified BSD, ruby
|
|
34
|
+
- :who:
|
|
35
|
+
:why:
|
|
36
|
+
:versions: []
|
|
37
|
+
:when: 2026-03-18 19:58:00.504702113 Z
|
|
38
|
+
- - :permit
|
|
39
|
+
- BSD-2-Clause
|
|
40
|
+
- :who:
|
|
41
|
+
:why:
|
|
42
|
+
:versions: []
|
|
43
|
+
:when: 2026-03-18 19:58:02.105176116 Z
|
|
44
|
+
- - :permit
|
|
45
|
+
- BSD-3-Clause
|
|
46
|
+
- :who:
|
|
47
|
+
:why:
|
|
48
|
+
:versions: []
|
|
49
|
+
:when: 2026-03-18 19:58:03.692853547 Z
|
|
50
|
+
- - :permit
|
|
51
|
+
- ISC
|
|
52
|
+
- :who:
|
|
53
|
+
:why:
|
|
54
|
+
:versions: []
|
|
55
|
+
:when: 2026-03-18 19:58:05.306220200 Z
|
|
56
|
+
- - :permit
|
|
57
|
+
- ruby
|
|
58
|
+
- :who:
|
|
59
|
+
:why:
|
|
60
|
+
:versions: []
|
|
61
|
+
:when: 2026-03-18 19:58:06.904808287 Z
|
|
62
|
+
- - :permit
|
|
63
|
+
- GPL-2.0
|
|
64
|
+
- :who:
|
|
65
|
+
:why:
|
|
66
|
+
:versions: []
|
|
67
|
+
:when: 2026-03-18 19:58:08.496153636 Z
|
|
68
|
+
- - :permit
|
|
69
|
+
- GPL-2.0-only
|
|
70
|
+
- :who:
|
|
71
|
+
:why:
|
|
72
|
+
:versions: []
|
|
73
|
+
:when: 2026-03-18 19:58:10.079398510 Z
|
|
74
|
+
- - :permit
|
|
75
|
+
- GPL-2.0-or-later
|
|
76
|
+
- :who:
|
|
77
|
+
:why:
|
|
78
|
+
:versions: []
|
|
79
|
+
:when: 2026-03-18 19:58:11.741292936 Z
|
|
80
|
+
- - :permit
|
|
81
|
+
- GPL-2.0-or-later, ruby
|
|
82
|
+
- :who:
|
|
83
|
+
:why:
|
|
84
|
+
:versions: []
|
|
85
|
+
:when: 2026-03-18 19:58:13.376744792 Z
|
|
86
|
+
- - :permit
|
|
87
|
+
- GPL-3.0
|
|
88
|
+
- :who:
|
|
89
|
+
:why:
|
|
90
|
+
:versions: []
|
|
91
|
+
:when: 2026-03-18 19:58:14.955539712 Z
|
|
92
|
+
- - :permit
|
|
93
|
+
- GPL-3.0-only
|
|
94
|
+
- :who:
|
|
95
|
+
:why:
|
|
96
|
+
:versions: []
|
|
97
|
+
:when: 2026-03-18 19:58:16.531696441 Z
|
|
98
|
+
- - :permit
|
|
99
|
+
- GPL-3.0-or-later
|
|
100
|
+
- :who:
|
|
101
|
+
:why:
|
|
102
|
+
:versions: []
|
|
103
|
+
:when: 2026-03-18 19:58:18.149338796 Z
|
|
104
|
+
- - :permit
|
|
105
|
+
- GPLv3
|
|
106
|
+
- :who:
|
|
107
|
+
:why:
|
|
108
|
+
:versions: []
|
|
109
|
+
:when: 2026-03-18 19:58:19.771117902 Z
|
|
110
|
+
- - :permit
|
|
111
|
+
- LGPL-2.1
|
|
112
|
+
- :who:
|
|
113
|
+
:why:
|
|
114
|
+
:versions: []
|
|
115
|
+
:when: 2026-03-18 19:58:21.317632867 Z
|
|
116
|
+
- - :permit
|
|
117
|
+
- LGPL-2.1-only
|
|
118
|
+
- :who:
|
|
119
|
+
:why:
|
|
120
|
+
:versions: []
|
|
121
|
+
:when: 2026-03-18 19:58:22.958385745 Z
|
|
122
|
+
- - :permit
|
|
123
|
+
- LGPL-2.1-or-later
|
|
124
|
+
- :who:
|
|
125
|
+
:why:
|
|
126
|
+
:versions: []
|
|
127
|
+
:when: 2026-03-18 19:58:24.580793979 Z
|
|
128
|
+
- - :permit
|
|
129
|
+
- LGPLv2+
|
|
130
|
+
- :who:
|
|
131
|
+
:why:
|
|
132
|
+
:versions: []
|
|
133
|
+
:when: 2026-03-18 19:58:26.719515734 Z
|
|
134
|
+
- - :permit
|
|
135
|
+
- LGPL-3.0
|
|
136
|
+
- :who:
|
|
137
|
+
:why:
|
|
138
|
+
:versions: []
|
|
139
|
+
:when: 2026-03-18 19:58:28.353411296 Z
|
|
140
|
+
- - :permit
|
|
141
|
+
- LGPL-3.0-only
|
|
142
|
+
- :who:
|
|
143
|
+
:why:
|
|
144
|
+
:versions: []
|
|
145
|
+
:when: 2026-03-18 19:58:29.972537844 Z
|
|
146
|
+
- - :permit
|
|
147
|
+
- LGPL-3+
|
|
148
|
+
- :who:
|
|
149
|
+
:why:
|
|
150
|
+
:versions: []
|
|
151
|
+
:when: 2026-03-18 19:58:31.574701526 Z
|
|
152
|
+
- - :permit
|
|
153
|
+
- LGPL-3.0+
|
|
154
|
+
- :who:
|
|
155
|
+
:why:
|
|
156
|
+
:versions: []
|
|
157
|
+
:when: 2026-03-18 19:58:33.196092605 Z
|
|
158
|
+
- - :permit
|
|
159
|
+
- LGPL-3+, ruby
|
|
160
|
+
- :who:
|
|
161
|
+
:why:
|
|
162
|
+
:versions: []
|
|
163
|
+
:when: 2026-03-18 19:58:34.827384942 Z
|
|
164
|
+
- - :permit
|
|
165
|
+
- LGPL-3.0+, ruby
|
|
166
|
+
- :who:
|
|
167
|
+
:why:
|
|
168
|
+
:versions: []
|
|
169
|
+
:when: 2026-03-18 19:58:36.496811805 Z
|
|
170
|
+
- - :permit
|
|
171
|
+
- LGPLv3+, ruby
|
|
172
|
+
- :who:
|
|
173
|
+
:why:
|
|
174
|
+
:versions: []
|
|
175
|
+
:when: 2026-03-18 19:58:38.115625313 Z
|
|
176
|
+
- - :permit
|
|
177
|
+
- Zlib
|
|
178
|
+
- :who:
|
|
179
|
+
:why:
|
|
180
|
+
:versions: []
|
|
181
|
+
:when: 2026-03-18 19:58:39.776177141 Z
|
|
182
|
+
- - :permit
|
|
183
|
+
- 0BSD
|
|
184
|
+
- :who:
|
|
185
|
+
:why:
|
|
186
|
+
:versions: []
|
|
187
|
+
:when: 2026-03-18 19:58:41.355632019 Z
|
|
188
|
+
- - :permit
|
|
189
|
+
- Unlicense
|
|
190
|
+
- :who:
|
|
191
|
+
:why:
|
|
192
|
+
:versions: []
|
|
193
|
+
:when: 2026-03-18 19:58:43.057876881 Z
|
|
194
|
+
- - :permit
|
|
195
|
+
- Artistic-1.0-Perl, GPL-2.0-or-later, MIT
|
|
196
|
+
- :who:
|
|
197
|
+
:why:
|
|
198
|
+
:versions: []
|
|
199
|
+
:when: 2026-03-18 19:58:44.637292334 Z
|
|
200
|
+
- - :permit
|
|
201
|
+
- MIT-like
|
|
202
|
+
- :who:
|
|
203
|
+
:why:
|
|
204
|
+
:versions: []
|
|
205
|
+
:when: 2026-03-18 19:58:46.185391276 Z
|
|
206
|
+
- - :approve
|
|
207
|
+
- mutant
|
|
208
|
+
- :who:
|
|
209
|
+
:why: Proprietary EULA (Schirp DSO Ltd), dev-only dependency for mutation testing
|
|
210
|
+
:versions: []
|
|
211
|
+
:when: 2026-03-18 19:58:57.638272693 Z
|
|
212
|
+
- - :approve
|
|
213
|
+
- mutant-rspec
|
|
214
|
+
- :who:
|
|
215
|
+
:why: Proprietary EULA, dev-only integration for mutation testing
|
|
216
|
+
:versions: []
|
|
217
|
+
:when: 2026-03-18 19:58:59.320586322 Z
|
|
218
|
+
- - :approve
|
|
219
|
+
- stud
|
|
220
|
+
- :who:
|
|
221
|
+
:why: Unknown license, transitive dependency of fpm (build-only)
|
|
222
|
+
:versions: []
|
|
223
|
+
:when: 2026-03-18 19:59:00.975313332 Z
|
|
224
|
+
- - :approve
|
|
225
|
+
- native-package-installer
|
|
226
|
+
- :who:
|
|
227
|
+
:why: LGPL-3+, GPL-3.0 compatible
|
|
228
|
+
:versions: []
|
|
229
|
+
:when: 2026-03-18 19:59:02.646765540 Z
|
|
230
|
+
- - :approve
|
|
231
|
+
- locale
|
|
232
|
+
- :who:
|
|
233
|
+
:why: LGPLv3+ ruby, GPL-3.0 compatible
|
|
234
|
+
:versions: []
|
|
235
|
+
:when: 2026-03-18 19:59:04.292348554 Z
|
|
236
|
+
- - :approve
|
|
237
|
+
- gettext
|
|
238
|
+
- :who:
|
|
239
|
+
:why: LGPL-3.0+ ruby, GPL-3.0 compatible
|
|
240
|
+
:versions: []
|
|
241
|
+
:when: 2026-03-18 19:59:05.925828383 Z
|
|
242
|
+
- - :approve
|
|
243
|
+
- pkg-config
|
|
244
|
+
- :who:
|
|
245
|
+
:why: LGPLv2+, GPL-3.0 compatible
|
|
246
|
+
:versions: []
|
|
247
|
+
:when: 2026-03-18 19:59:07.596953695 Z
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Issue 001: Wrapper script missing LD_LIBRARY_PATH and RUBYLIB
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------------|--------------------------------------------|
|
|
5
|
+
| Severity | **Critical** (application fails to launch) |
|
|
6
|
+
| Status | **Resolved** |
|
|
7
|
+
| Component | `packaging/wrapper.sh.template` |
|
|
8
|
+
| Affects | All builds (CI and local) |
|
|
9
|
+
| Found in | v1.0.0 (`nncc_1.0.0-1_amd64.deb`) |
|
|
10
|
+
| Resolved in | v1.1.0 |
|
|
11
|
+
|
|
12
|
+
## Resolution
|
|
13
|
+
|
|
14
|
+
Wrapper converted to `packaging/wrapper.sh.template` with `@@RUBY_ABI@@` and
|
|
15
|
+
`@@RUBY_ARCH@@` placeholders. The `install_wrapper!` build stage now queries the
|
|
16
|
+
just-compiled embedded Ruby for `RbConfig::CONFIG["ruby_version"]` and
|
|
17
|
+
`RbConfig::CONFIG["arch"]`, substituting them at build time. The template sets
|
|
18
|
+
`LD_LIBRARY_PATH`, `RUBYLIB`, `GEM_HOME`, and `GEM_PATH` with the correct paths,
|
|
19
|
+
eliminating the chicken-and-egg `ruby -e` subprocess call.
|
|
20
|
+
|
|
21
|
+
## Summary
|
|
22
|
+
|
|
23
|
+
The runtime wrapper script (`/opt/rosett-ai/bin/raictl`) does not set `LD_LIBRARY_PATH`
|
|
24
|
+
or `RUBYLIB`, causing two cascading failures that prevent the application from
|
|
25
|
+
starting.
|
|
26
|
+
|
|
27
|
+
## Symptoms
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
$ raictl version
|
|
31
|
+
`RubyGems' were not loaded.
|
|
32
|
+
`error_highlight' was not loaded.
|
|
33
|
+
`did_you_mean' was not loaded.
|
|
34
|
+
`syntax_suggest' was not loaded.
|
|
35
|
+
-e:1:in `<main>': uninitialized constant RbConfig (NameError)
|
|
36
|
+
`RubyGems' were not loaded.
|
|
37
|
+
...
|
|
38
|
+
/opt/rosett-ai/app/bin/raictl:10:in `require': cannot load such file -- bundler/setup (LoadError)
|
|
39
|
+
from /opt/rosett-ai/app/bin/raictl:10:in `<main>'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Root Cause Analysis
|
|
43
|
+
|
|
44
|
+
### Failure 1: `libruby.so.3.3` not found
|
|
45
|
+
|
|
46
|
+
The embedded Ruby binary at `/opt/rosett-ai/embedded/bin/ruby` links against
|
|
47
|
+
`libruby.so.3.3` dynamically. Its ELF `RUNPATH` is set to `/usr/local/lib`
|
|
48
|
+
(see [Issue 002](002-embedded-ruby-wrong-prefix.md) for why), but the actual
|
|
49
|
+
library resides at `/opt/rosett-ai/embedded/lib/libruby.so.3.3`.
|
|
50
|
+
|
|
51
|
+
**Evidence:**
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
$ ldd /opt/rosett-ai/embedded/bin/ruby
|
|
55
|
+
libruby.so.3.3 => not found
|
|
56
|
+
$ readelf -d /opt/rosett-ai/embedded/bin/ruby | grep RUNPATH
|
|
57
|
+
0x000000000000001d (RUNPATH) Library runpath: [/usr/local/lib]
|
|
58
|
+
$ ls /opt/rosett-ai/embedded/lib/libruby.so.3.3
|
|
59
|
+
/opt/rosett-ai/embedded/lib/libruby.so.3.3 -> libruby.so.3.3.10
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The user discovered that `export LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib/`
|
|
63
|
+
resolves this failure, but a second failure then emerges.
|
|
64
|
+
|
|
65
|
+
### Failure 2: Ruby standard library not on `$LOAD_PATH`
|
|
66
|
+
|
|
67
|
+
Even with `LD_LIBRARY_PATH` set, the Ruby binary's compiled-in `$LOAD_PATH`
|
|
68
|
+
points to `/usr/local/lib/ruby/...` instead of `/opt/rosett-ai/embedded/lib/ruby/...`:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
$ LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib \
|
|
72
|
+
/opt/rosett-ai/embedded/bin/ruby -e 'puts $LOAD_PATH'
|
|
73
|
+
/usr/local/lib/ruby/site_ruby/3.3.0
|
|
74
|
+
/usr/local/lib/ruby/site_ruby/3.3.0/x86_64-linux
|
|
75
|
+
/usr/local/lib/ruby/site_ruby
|
|
76
|
+
/usr/local/lib/ruby/vendor_ruby/3.3.0
|
|
77
|
+
/usr/local/lib/ruby/vendor_ruby/3.3.0/x86_64-linux
|
|
78
|
+
/usr/local/lib/ruby/vendor_ruby
|
|
79
|
+
/usr/local/lib/ruby/3.3.0
|
|
80
|
+
/usr/local/lib/ruby/3.3.0/x86_64-linux
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The actual standard library (including `rbconfig.rb`, `rubygems.rb`,
|
|
84
|
+
`bundler.rb`) exists at `/opt/rosett-ai/embedded/lib/ruby/3.3.0/` but Ruby cannot
|
|
85
|
+
find it. This causes:
|
|
86
|
+
|
|
87
|
+
- `RbConfig` to be undefined (it requires `rbconfig.rb` from the stdlib)
|
|
88
|
+
- RubyGems, error_highlight, did_you_mean, syntax_suggest all fail to load
|
|
89
|
+
- `bundler/setup` cannot be required
|
|
90
|
+
|
|
91
|
+
### Failure 3: Chicken-and-egg in GEM_HOME computation (line 11)
|
|
92
|
+
|
|
93
|
+
The wrapper script runs this **before** the main `exec` call:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
export GEM_HOME="${INSTALL_DIR}/embedded/lib/ruby/gems/$(${EMBEDDED_BIN}/ruby -e 'puts RbConfig::CONFIG["ruby_program_version"]')"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This subprocess invocation of `ruby` fails first (for the same reasons above),
|
|
100
|
+
which causes the entire wrapper to abort due to `set -e`.
|
|
101
|
+
|
|
102
|
+
## Proof: All failures resolved with correct environment
|
|
103
|
+
|
|
104
|
+
Setting `LD_LIBRARY_PATH` and `RUBYLIB` makes the full application work:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
$ LD_LIBRARY_PATH=/opt/rosett-ai/embedded/lib \
|
|
108
|
+
RUBYLIB=/opt/rosett-ai/embedded/lib/ruby/3.3.0:/opt/rosett-ai/embedded/lib/ruby/3.3.0/x86_64-linux \
|
|
109
|
+
GEM_HOME=/opt/rosett-ai/embedded/lib/ruby/gems/3.3.0 \
|
|
110
|
+
BUNDLE_GEMFILE=/opt/rosett-ai/app/Gemfile \
|
|
111
|
+
BUNDLE_PATH=/opt/rosett-ai/app/vendor/bundle \
|
|
112
|
+
BUNDLE_DEPLOYMENT=true \
|
|
113
|
+
/opt/rosett-ai/embedded/bin/ruby -I/opt/rosett-ai/app/lib /opt/rosett-ai/app/bin/raictl version
|
|
114
|
+
1.0.0
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Proposed Fix
|
|
118
|
+
|
|
119
|
+
Update `packaging/wrapper.sh` to set the missing environment variables and
|
|
120
|
+
eliminate the chicken-and-egg `ruby` subprocess call:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
#!/bin/bash
|
|
124
|
+
# Rosett-AI - Runtime wrapper
|
|
125
|
+
# Invoked as /opt/rosett-ai/bin/raictl, symlinked from /usr/local/bin/raictl
|
|
126
|
+
set -e
|
|
127
|
+
|
|
128
|
+
INSTALL_DIR="/opt/rosett-ai"
|
|
129
|
+
EMBEDDED_DIR="${INSTALL_DIR}/embedded"
|
|
130
|
+
EMBEDDED_BIN="${EMBEDDED_DIR}/bin"
|
|
131
|
+
EMBEDDED_LIB="${EMBEDDED_DIR}/lib"
|
|
132
|
+
APP_DIR="${INSTALL_DIR}/app"
|
|
133
|
+
|
|
134
|
+
# Ensure the embedded Ruby can find libruby.so
|
|
135
|
+
export LD_LIBRARY_PATH="${EMBEDDED_LIB}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
|
136
|
+
|
|
137
|
+
# Ensure the embedded Ruby can find its standard library
|
|
138
|
+
export RUBYLIB="${EMBEDDED_LIB}/ruby/3.3.0:${EMBEDDED_LIB}/ruby/3.3.0/x86_64-linux${RUBYLIB:+:$RUBYLIB}"
|
|
139
|
+
|
|
140
|
+
export PATH="${EMBEDDED_BIN}:${PATH}"
|
|
141
|
+
export GEM_HOME="${EMBEDDED_LIB}/ruby/gems/3.3.0"
|
|
142
|
+
export GEM_PATH="${GEM_HOME}"
|
|
143
|
+
export BUNDLE_GEMFILE="${APP_DIR}/Gemfile"
|
|
144
|
+
export BUNDLE_PATH="${APP_DIR}/vendor/bundle"
|
|
145
|
+
export BUNDLE_DEPLOYMENT="true"
|
|
146
|
+
|
|
147
|
+
cd "${APP_DIR}"
|
|
148
|
+
exec "${EMBEDDED_BIN}/ruby" -I"${APP_DIR}/lib" "${APP_DIR}/bin/raictl" "$@"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Key changes
|
|
152
|
+
|
|
153
|
+
| Change | Rationale |
|
|
154
|
+
|--------|-----------|
|
|
155
|
+
| Add `LD_LIBRARY_PATH` | Ensures dynamic linker finds `libruby.so.3.3` |
|
|
156
|
+
| Add `RUBYLIB` | Overrides compiled-in `$LOAD_PATH` to find stdlib |
|
|
157
|
+
| Hardcode `gems/3.3.0` in `GEM_HOME` | Eliminates failing `ruby -e` subprocess call |
|
|
158
|
+
|
|
159
|
+
### Trade-off: hardcoded version string
|
|
160
|
+
|
|
161
|
+
The original wrapper dynamically queried `RbConfig::CONFIG["ruby_program_version"]`
|
|
162
|
+
to avoid hardcoding `gems/3.3.0`. While elegant, this creates a circular
|
|
163
|
+
dependency: Ruby must work before we can query Ruby for its version. Since the
|
|
164
|
+
wrapper is generated at build time (see `install_wrapper!` in `build.rb`),
|
|
165
|
+
the version string can be templated during the build stage instead. See the
|
|
166
|
+
"Templated Wrapper" alternative below.
|
|
167
|
+
|
|
168
|
+
### Alternative: Templated wrapper (preferred)
|
|
169
|
+
|
|
170
|
+
Modify `install_wrapper!` in `lib/rosett_ai/thor/tasks/build.rb` to render the
|
|
171
|
+
wrapper from an ERB template with build-time values:
|
|
172
|
+
|
|
173
|
+
```ruby
|
|
174
|
+
def install_wrapper!
|
|
175
|
+
template = packaging_dir.join('wrapper.sh.erb')
|
|
176
|
+
dest = staging_install.join('bin', 'rosett-ai')
|
|
177
|
+
content = ERB.new(template.read).result_with_hash(
|
|
178
|
+
ruby_abi_version: '3.3.0',
|
|
179
|
+
ruby_arch: 'x86_64-linux'
|
|
180
|
+
)
|
|
181
|
+
File.write(dest, content)
|
|
182
|
+
FileUtils.chmod(0o755, dest)
|
|
183
|
+
end
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
This preserves the "no hardcoded version" design goal while avoiding the
|
|
187
|
+
chicken-and-egg problem.
|
|
188
|
+
|
|
189
|
+
## Affected Files
|
|
190
|
+
|
|
191
|
+
- `packaging/wrapper.sh` (or new `packaging/wrapper.sh.erb`)
|
|
192
|
+
- `lib/rosett_ai/thor/tasks/build.rb` (if using templated approach)
|
|
193
|
+
|
|
194
|
+
## Related Issues
|
|
195
|
+
|
|
196
|
+
- [002 - Embedded Ruby compiled with wrong prefix](002-embedded-ruby-wrong-prefix.md)
|
|
197
|
+
- [003 - Smoke test installs system Ruby masking failures](003-smoke-test-false-positive.md)
|