rosett-ai 1.3.3 → 1.5.9
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 +398 -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 +87 -4
- 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
|
@@ -23,6 +23,8 @@ module RosettAi
|
|
|
23
23
|
|
|
24
24
|
Related commands: detect, status, plugins
|
|
25
25
|
LONGDESC
|
|
26
|
+
# List available items.
|
|
27
|
+
# @return [void]
|
|
26
28
|
def list
|
|
27
29
|
rows = RosettAi::Engines::Registry.available.map do |name|
|
|
28
30
|
manifest = RosettAi::Engines::Registry.manifest(name)
|
|
@@ -51,6 +53,8 @@ module RosettAi
|
|
|
51
53
|
|
|
52
54
|
Related commands: list, status, plugins
|
|
53
55
|
LONGDESC
|
|
56
|
+
# Detect available engines on the system.
|
|
57
|
+
# @return [Array<Hash>]
|
|
54
58
|
def detect
|
|
55
59
|
rows = RosettAi::Engines::Registry.available.filter_map do |name|
|
|
56
60
|
manifest = RosettAi::Engines::Registry.manifest(name)
|
|
@@ -85,6 +89,8 @@ module RosettAi
|
|
|
85
89
|
|
|
86
90
|
Related commands: list, detect, plugins
|
|
87
91
|
LONGDESC
|
|
92
|
+
# Return the current status.
|
|
93
|
+
# @return [String]
|
|
88
94
|
def status
|
|
89
95
|
default_engine = RosettAi.rai_config.default_engine
|
|
90
96
|
puts "#{t('default_engine')}: #{Rainbow(default_engine).bright}"
|
|
@@ -120,6 +126,8 @@ module RosettAi
|
|
|
120
126
|
|
|
121
127
|
Related commands: list, detect, status
|
|
122
128
|
LONGDESC
|
|
129
|
+
# List installed engine plugins.
|
|
130
|
+
# @return [void]
|
|
123
131
|
def plugins
|
|
124
132
|
plugin_engines = RosettAi::Plugins::Registry.available(:engine)
|
|
125
133
|
|
|
@@ -35,6 +35,8 @@ module RosettAi
|
|
|
35
35
|
Related: hooks uninstall, hooks status
|
|
36
36
|
LONGDESC
|
|
37
37
|
method_option :verbose, type: :boolean, default: false, desc: 'Show detailed output'
|
|
38
|
+
# Install the component.
|
|
39
|
+
# @return [void]
|
|
38
40
|
def install
|
|
39
41
|
config = load_hooks_config
|
|
40
42
|
return exit_with_error(t('no_config')) if config.empty?
|
|
@@ -61,6 +63,8 @@ module RosettAi
|
|
|
61
63
|
|
|
62
64
|
Related: hooks install, hooks status
|
|
63
65
|
LONGDESC
|
|
66
|
+
# Remove the installed hooks.
|
|
67
|
+
# @return [void]
|
|
64
68
|
def uninstall
|
|
65
69
|
installer = build_installer({})
|
|
66
70
|
results = installer.uninstall
|
|
@@ -81,6 +85,8 @@ module RosettAi
|
|
|
81
85
|
Related: hooks status, hooks install
|
|
82
86
|
LONGDESC
|
|
83
87
|
method_option :format, type: :string, default: 'table', enum: ['table', 'json'], desc: 'Output format'
|
|
88
|
+
# List available items.
|
|
89
|
+
# @return [void]
|
|
84
90
|
def list
|
|
85
91
|
installer = build_installer({})
|
|
86
92
|
hooks = installer.list
|
|
@@ -111,6 +117,8 @@ module RosettAi
|
|
|
111
117
|
Related: hooks install, hooks list
|
|
112
118
|
LONGDESC
|
|
113
119
|
method_option :format, type: :string, default: 'table', enum: ['table', 'json'], desc: 'Output format'
|
|
120
|
+
# Return the current status.
|
|
121
|
+
# @return [String]
|
|
114
122
|
def status
|
|
115
123
|
config = load_hooks_config
|
|
116
124
|
installer = RosettAi::GitHooks::Installer.new(
|
|
@@ -31,6 +31,10 @@ module RosettAi
|
|
|
31
31
|
|
|
32
32
|
Related commands: status, deactivate
|
|
33
33
|
LONGDESC
|
|
34
|
+
# Activate a license key.
|
|
35
|
+
#
|
|
36
|
+
# @param raw_key [Object] the raw key
|
|
37
|
+
# @return [void]
|
|
34
38
|
def activate(raw_key)
|
|
35
39
|
key = RosettAi::Licensing::LicenseKey.new(raw_key)
|
|
36
40
|
key.decode
|
|
@@ -54,6 +58,8 @@ module RosettAi
|
|
|
54
58
|
|
|
55
59
|
Related commands: activate, deactivate
|
|
56
60
|
LONGDESC
|
|
61
|
+
# Return the current status.
|
|
62
|
+
# @return [String]
|
|
57
63
|
def status
|
|
58
64
|
result = RosettAi::Licensing::LicenseValidator.new.validate
|
|
59
65
|
|
|
@@ -77,6 +83,8 @@ module RosettAi
|
|
|
77
83
|
|
|
78
84
|
Related commands: activate, status
|
|
79
85
|
LONGDESC
|
|
86
|
+
# Deactivate the current license.
|
|
87
|
+
# @return [void]
|
|
80
88
|
def deactivate
|
|
81
89
|
store = RosettAi::Licensing::LicenseStore.new
|
|
82
90
|
|
|
@@ -7,6 +7,7 @@ require 'terminal-table'
|
|
|
7
7
|
|
|
8
8
|
module RosettAi
|
|
9
9
|
module Thor
|
|
10
|
+
# CLI subcommand task implementations.
|
|
10
11
|
module Tasks
|
|
11
12
|
# Thor CLI for MCP server and administration.
|
|
12
13
|
#
|
|
@@ -44,6 +45,8 @@ module RosettAi
|
|
|
44
45
|
method_option :allow_remote, type: :boolean, default: false, desc: 'Allow non-localhost binding'
|
|
45
46
|
method_option :config, type: :string, desc: 'Path to server config YAML'
|
|
46
47
|
method_option :plugin, type: :array, default: [], desc: 'Plugin names to load'
|
|
48
|
+
# Start the MCP JSON-RPC server.
|
|
49
|
+
# @return [void]
|
|
47
50
|
def serve
|
|
48
51
|
server = RosettAi::Mcp::Server.new(
|
|
49
52
|
config_path: options[:config],
|
|
@@ -85,6 +88,8 @@ module RosettAi
|
|
|
85
88
|
Related: mcp status, mcp validate
|
|
86
89
|
LONGDESC
|
|
87
90
|
method_option :format, type: :string, default: 'table', enum: ['table', 'json'], desc: 'Output format'
|
|
91
|
+
# List available items.
|
|
92
|
+
# @return [void]
|
|
88
93
|
def list
|
|
89
94
|
registry = build_registry
|
|
90
95
|
servers = registry.list
|
|
@@ -112,6 +117,8 @@ module RosettAi
|
|
|
112
117
|
Related: mcp list, mcp status
|
|
113
118
|
LONGDESC
|
|
114
119
|
method_option :format, type: :string, default: 'table', enum: ['table', 'json'], desc: 'Output format'
|
|
120
|
+
# Validate the input and return any errors.
|
|
121
|
+
# @return [Array<Hash>]
|
|
115
122
|
def validate
|
|
116
123
|
registry = build_registry
|
|
117
124
|
validator = RosettAi::Mcp::Admin::SchemaValidator.new
|
|
@@ -137,6 +144,8 @@ module RosettAi
|
|
|
137
144
|
Related: mcp list, mcp validate
|
|
138
145
|
LONGDESC
|
|
139
146
|
method_option :format, type: :string, default: 'table', enum: ['table', 'json'], desc: 'Output format'
|
|
147
|
+
# Return the current status.
|
|
148
|
+
# @return [String]
|
|
140
149
|
def status
|
|
141
150
|
registry = build_registry
|
|
142
151
|
checker = RosettAi::Mcp::Admin::HealthChecker.new
|
|
@@ -166,6 +175,8 @@ module RosettAi
|
|
|
166
175
|
Related: mcp validate, mcp status
|
|
167
176
|
LONGDESC
|
|
168
177
|
method_option :format, type: :string, default: 'json', enum: ['table', 'json'], desc: 'Output format'
|
|
178
|
+
# Run a security audit on MCP configuration.
|
|
179
|
+
# @return [void]
|
|
169
180
|
def audit
|
|
170
181
|
registry = build_registry
|
|
171
182
|
checker = RosettAi::Mcp::Admin::HealthChecker.new
|
|
@@ -192,6 +203,11 @@ module RosettAi
|
|
|
192
203
|
method_option :transport, type: :string, default: 'stdio',
|
|
193
204
|
enum: ['stdio', 'http', 'streamable-http'],
|
|
194
205
|
desc: 'Transport type'
|
|
206
|
+
# Add a new entry.
|
|
207
|
+
#
|
|
208
|
+
# @param name [Object] the name
|
|
209
|
+
# @param uri [Object] the uri
|
|
210
|
+
# @return [void]
|
|
195
211
|
def add(name, uri)
|
|
196
212
|
installer = build_installer
|
|
197
213
|
result = installer.install(name: name, uri: uri, transport: options[:transport])
|
|
@@ -219,6 +235,10 @@ module RosettAi
|
|
|
219
235
|
Related: mcp add, mcp list
|
|
220
236
|
LONGDESC
|
|
221
237
|
method_option :force, type: :boolean, default: false, desc: 'Force removal of managed servers'
|
|
238
|
+
# Remove the component.
|
|
239
|
+
#
|
|
240
|
+
# @param name [Object] the name
|
|
241
|
+
# @return [void]
|
|
222
242
|
def remove(name)
|
|
223
243
|
installer = build_installer
|
|
224
244
|
result = installer.remove(name: name, force: options[:force])
|
|
@@ -247,6 +267,8 @@ module RosettAi
|
|
|
247
267
|
LONGDESC
|
|
248
268
|
method_option :format, type: :string, default: 'table', enum: ['table', 'json'], desc: 'Output format'
|
|
249
269
|
map 'trust-sources' => :trust_sources
|
|
270
|
+
# List trusted MCP sources.
|
|
271
|
+
# @return [void]
|
|
250
272
|
def trust_sources
|
|
251
273
|
manager = build_trust_manager
|
|
252
274
|
sources = manager.list
|
|
@@ -267,6 +289,10 @@ module RosettAi
|
|
|
267
289
|
LONGDESC
|
|
268
290
|
method_option :description, type: :string, default: 'User-trusted domain', desc: 'Trust source description'
|
|
269
291
|
map 'trust-add' => :trust_add
|
|
292
|
+
# Add a trusted MCP source.
|
|
293
|
+
#
|
|
294
|
+
# @param domain [Object] the domain
|
|
295
|
+
# @return [void]
|
|
270
296
|
def trust_add(domain)
|
|
271
297
|
manager = build_trust_manager
|
|
272
298
|
manager.add_trust(domain, description: options[:description])
|
|
@@ -287,6 +313,10 @@ module RosettAi
|
|
|
287
313
|
Related: mcp trust-add, mcp trust-sources
|
|
288
314
|
LONGDESC
|
|
289
315
|
map 'trust-remove' => :trust_remove
|
|
316
|
+
# Remove a trusted MCP source.
|
|
317
|
+
#
|
|
318
|
+
# @param domain [Object] the domain
|
|
319
|
+
# @return [void]
|
|
290
320
|
def trust_remove(domain)
|
|
291
321
|
manager = build_trust_manager
|
|
292
322
|
if manager.remove_trust(domain)
|
|
@@ -308,6 +338,8 @@ module RosettAi
|
|
|
308
338
|
|
|
309
339
|
raictl mcp tools
|
|
310
340
|
LONGDESC
|
|
341
|
+
# List registered MCP tools.
|
|
342
|
+
# @return [void]
|
|
311
343
|
def tools
|
|
312
344
|
server = RosettAi::Mcp::Server.new
|
|
313
345
|
tool_list = server.tools
|
|
@@ -334,6 +366,8 @@ module RosettAi
|
|
|
334
366
|
method_option :name, type: :string, required: true, desc: 'Key name'
|
|
335
367
|
method_option :keyfile, type: :string, default: RosettAi::Mcp::Keyfile::DEFAULT_FILENAME, desc: 'Keyfile path'
|
|
336
368
|
map 'generate-key' => :generate_key
|
|
369
|
+
# Generate a new MCP API key.
|
|
370
|
+
# @return [void]
|
|
337
371
|
def generate_key
|
|
338
372
|
path = RosettAi::Mcp::Keyfile.create_if_missing(options[:keyfile])
|
|
339
373
|
plaintext = RosettAi::Mcp::KeyHasher.generate_key
|
|
@@ -362,6 +396,8 @@ module RosettAi
|
|
|
362
396
|
LONGDESC
|
|
363
397
|
method_option :keyfile, type: :string, default: RosettAi::Mcp::Keyfile::DEFAULT_FILENAME, desc: 'Keyfile path'
|
|
364
398
|
map 'list-keys' => :list_keys
|
|
399
|
+
# List all MCP API keys.
|
|
400
|
+
# @return [void]
|
|
365
401
|
def list_keys
|
|
366
402
|
path = File.expand_path(options[:keyfile])
|
|
367
403
|
unless File.exist?(path)
|
|
@@ -399,6 +435,8 @@ module RosettAi
|
|
|
399
435
|
method_option :name, type: :string, required: true, desc: 'Key name to revoke'
|
|
400
436
|
method_option :keyfile, type: :string, default: RosettAi::Mcp::Keyfile::DEFAULT_FILENAME, desc: 'Keyfile path'
|
|
401
437
|
map 'revoke-key' => :revoke_key
|
|
438
|
+
# Revoke an MCP API key.
|
|
439
|
+
# @return [void]
|
|
402
440
|
def revoke_key
|
|
403
441
|
keyfile = RosettAi::Mcp::Keyfile.new(File.expand_path(options[:keyfile]))
|
|
404
442
|
keyfile.load!
|
|
@@ -425,6 +463,8 @@ module RosettAi
|
|
|
425
463
|
method_option :name, type: :string, required: true, desc: 'Key name to rotate'
|
|
426
464
|
method_option :keyfile, type: :string, default: RosettAi::Mcp::Keyfile::DEFAULT_FILENAME, desc: 'Keyfile path'
|
|
427
465
|
map 'rotate-key' => :rotate_key
|
|
466
|
+
# Rotate an MCP API key.
|
|
467
|
+
# @return [void]
|
|
428
468
|
def rotate_key
|
|
429
469
|
keyfile = RosettAi::Mcp::Keyfile.new(File.expand_path(options[:keyfile]))
|
|
430
470
|
keyfile.load!
|
|
@@ -36,6 +36,8 @@ module RosettAi
|
|
|
36
36
|
LONGDESC
|
|
37
37
|
option :workspace, type: :string, desc: 'Scan and migrate all .nncc/ dirs under PATH'
|
|
38
38
|
option :dry_run, type: :boolean, default: false, desc: 'Show what would be migrated'
|
|
39
|
+
# Execute the legacy configuration migration.
|
|
40
|
+
# @return [void]
|
|
39
41
|
def run_migrate
|
|
40
42
|
migrate_xdg_config
|
|
41
43
|
migrate_projects
|
|
@@ -16,6 +16,7 @@ module RosettAi
|
|
|
16
16
|
# @author hugo
|
|
17
17
|
# @author claude
|
|
18
18
|
class Plugins < ::Thor
|
|
19
|
+
# @return [Array] Set of permitted type values.
|
|
19
20
|
VALID_TYPES = ['engine', 'gui', 'mcp'].freeze
|
|
20
21
|
|
|
21
22
|
desc 'list TYPE', 'List installed plugins of a given type (engine, gui, mcp)'
|
|
@@ -28,6 +29,10 @@ module RosettAi
|
|
|
28
29
|
|
|
29
30
|
Related: plugins install, plugins remove, engines list
|
|
30
31
|
LONGDESC
|
|
32
|
+
# List available items.
|
|
33
|
+
#
|
|
34
|
+
# @param type [Object] the type
|
|
35
|
+
# @return [void]
|
|
31
36
|
def list(type)
|
|
32
37
|
validate_type!(type)
|
|
33
38
|
type_sym = type.to_sym
|
|
@@ -58,6 +63,11 @@ module RosettAi
|
|
|
58
63
|
|
|
59
64
|
Related: plugins remove, plugins list
|
|
60
65
|
LONGDESC
|
|
66
|
+
# Install the component.
|
|
67
|
+
#
|
|
68
|
+
# @param type [Object] the type
|
|
69
|
+
# @param name [Object] the name
|
|
70
|
+
# @return [void]
|
|
61
71
|
def install(type, name)
|
|
62
72
|
validate_type!(type)
|
|
63
73
|
package = plugin_package_name(type, name)
|
|
@@ -85,6 +95,11 @@ module RosettAi
|
|
|
85
95
|
|
|
86
96
|
Related: plugins install, plugins list
|
|
87
97
|
LONGDESC
|
|
98
|
+
# Remove the component.
|
|
99
|
+
#
|
|
100
|
+
# @param type [Object] the type
|
|
101
|
+
# @param name [Object] the name
|
|
102
|
+
# @return [void]
|
|
88
103
|
def remove(type, name)
|
|
89
104
|
validate_type!(type)
|
|
90
105
|
package = plugin_package_name(type, name)
|
|
@@ -30,6 +30,8 @@ module RosettAi
|
|
|
30
30
|
LONGDESC
|
|
31
31
|
method_option :format, type: :string, enum: ['table', 'json'], default: 'table',
|
|
32
32
|
desc: 'Output format'
|
|
33
|
+
# Return the current status.
|
|
34
|
+
# @return [String]
|
|
33
35
|
def status
|
|
34
36
|
manager = RosettAi::Project::Manager.new(project_root: resolve_project_root)
|
|
35
37
|
result = manager.status
|
|
@@ -50,6 +52,8 @@ module RosettAi
|
|
|
50
52
|
|
|
51
53
|
raictl project info
|
|
52
54
|
LONGDESC
|
|
55
|
+
# Display project information.
|
|
56
|
+
# @return [void]
|
|
53
57
|
def info
|
|
54
58
|
manager = RosettAi::Project::Manager.new(project_root: resolve_project_root)
|
|
55
59
|
result = manager.info
|
|
@@ -114,6 +118,8 @@ module RosettAi
|
|
|
114
118
|
desc: 'Drift type to detect (default: both)'
|
|
115
119
|
method_option :format, type: :string, enum: ['table', 'json'], default: 'table',
|
|
116
120
|
desc: 'Output format'
|
|
121
|
+
# Check for project configuration drift.
|
|
122
|
+
# @return [void]
|
|
117
123
|
def drift
|
|
118
124
|
root = resolve_project_root
|
|
119
125
|
validate_project!(root)
|
|
@@ -149,6 +155,8 @@ module RosettAi
|
|
|
149
155
|
desc: 'Apply breaking changes without prompting'
|
|
150
156
|
method_option :simulate, type: :boolean, default: false,
|
|
151
157
|
desc: 'Preview changes without applying'
|
|
158
|
+
# Synchronize project configuration.
|
|
159
|
+
# @return [void]
|
|
152
160
|
def sync
|
|
153
161
|
sync_mgr = RosettAi::Project::SyncManager.new(
|
|
154
162
|
project_root: resolve_project_root,
|
|
@@ -30,6 +30,8 @@ module RosettAi
|
|
|
30
30
|
|
|
31
31
|
Related commands: validate, show, log
|
|
32
32
|
LONGDESC
|
|
33
|
+
# Initialize the provenance file in the current project.
|
|
34
|
+
# @return [void]
|
|
33
35
|
def init
|
|
34
36
|
store = build_store
|
|
35
37
|
store.init
|
|
@@ -55,6 +57,8 @@ module RosettAi
|
|
|
55
57
|
|
|
56
58
|
Related commands: init, show, log
|
|
57
59
|
LONGDESC
|
|
60
|
+
# Validate the input and return any errors.
|
|
61
|
+
# @return [Array<Hash>]
|
|
58
62
|
def validate
|
|
59
63
|
store = build_store
|
|
60
64
|
data = store.read
|
|
@@ -92,6 +96,8 @@ module RosettAi
|
|
|
92
96
|
Related commands: init, validate, log
|
|
93
97
|
LONGDESC
|
|
94
98
|
method_option :file, type: :string, desc: 'Show provenance for a specific file'
|
|
99
|
+
# Display detailed information for the named item.
|
|
100
|
+
# @return [void]
|
|
95
101
|
def show(commit = nil)
|
|
96
102
|
store = build_store
|
|
97
103
|
entries = if options[:file]
|
|
@@ -133,6 +139,8 @@ module RosettAi
|
|
|
133
139
|
Related commands: init, validate, show
|
|
134
140
|
LONGDESC
|
|
135
141
|
method_option :role, type: :string, desc: 'Filter by AI role'
|
|
142
|
+
# Display the provenance log.
|
|
143
|
+
# @return [void]
|
|
136
144
|
def log
|
|
137
145
|
store = build_store
|
|
138
146
|
entries = store.read['entries'].reverse
|
|
@@ -19,8 +19,10 @@ module RosettAi
|
|
|
19
19
|
#
|
|
20
20
|
# Design reference: conf/design/release_management.yml
|
|
21
21
|
class Release < ::Thor
|
|
22
|
+
# @return [Array] Allowed release version bump levels.
|
|
22
23
|
VALID_LEVELS = ['major', 'minor', 'patch'].freeze
|
|
23
24
|
|
|
25
|
+
# @return [Array] Release verification gate definitions.
|
|
24
26
|
VERIFICATION_GATES = [
|
|
25
27
|
['rspec', ['bundle', 'exec', 'rspec', '--format', 'progress']],
|
|
26
28
|
['rubocop', ['bundle', 'exec', 'rubocop', '--format', 'simple']],
|
|
@@ -51,6 +53,10 @@ module RosettAi
|
|
|
51
53
|
LONGDESC
|
|
52
54
|
method_option :skip_verify, type: :boolean, default: false,
|
|
53
55
|
desc: 'Skip verification suite (NOT recommended)'
|
|
56
|
+
# Prepare the release artifacts.
|
|
57
|
+
#
|
|
58
|
+
# @param level [Object] the level
|
|
59
|
+
# @return [void]
|
|
54
60
|
def prepare(level)
|
|
55
61
|
validate_level!(level)
|
|
56
62
|
ensure_clean_working_tree!
|
|
@@ -108,6 +114,8 @@ module RosettAi
|
|
|
108
114
|
|
|
109
115
|
Related commands: prepare, tag
|
|
110
116
|
LONGDESC
|
|
117
|
+
# Return the current status.
|
|
118
|
+
# @return [String]
|
|
111
119
|
def status
|
|
112
120
|
version = current_version
|
|
113
121
|
last_tag = latest_tag
|
|
@@ -38,6 +38,8 @@ module RosettAi
|
|
|
38
38
|
desc: 'Overwrite existing Rosett-AI YAML files'
|
|
39
39
|
method_option :simulate, type: :boolean, default: false,
|
|
40
40
|
desc: 'Show what would be generated without writing'
|
|
41
|
+
# Convert native configs to rosett-ai YAML format.
|
|
42
|
+
# @return [void]
|
|
41
43
|
def convert
|
|
42
44
|
output_dir = resolve_output_dir
|
|
43
45
|
engine = RosettAi::Retrofit::Engine.new(
|
|
@@ -54,6 +56,8 @@ module RosettAi
|
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
desc 'engines', 'List available retrofit engines'
|
|
59
|
+
# List available retrofit engine parsers.
|
|
60
|
+
# @return [void]
|
|
57
61
|
def engines
|
|
58
62
|
available = RosettAi::Retrofit::Engine.available_engines
|
|
59
63
|
if available.empty?
|
|
@@ -15,6 +15,7 @@ module RosettAi
|
|
|
15
15
|
class Validate < ::Thor
|
|
16
16
|
default_task :all
|
|
17
17
|
|
|
18
|
+
# @return [Array] Validation category names.
|
|
18
19
|
CATEGORIES = [
|
|
19
20
|
{ name: 'behaviour', dir: 'conf/behaviour', validator: 'BehaviourValidator' },
|
|
20
21
|
{ name: 'design', dir: 'conf/design', validator: 'DesignValidator' },
|
|
@@ -27,6 +27,8 @@ module RosettAi
|
|
|
27
27
|
|
|
28
28
|
raictl workflow list
|
|
29
29
|
LONGDESC
|
|
30
|
+
# List available items.
|
|
31
|
+
# @return [void]
|
|
30
32
|
def list
|
|
31
33
|
files = discover_workflows
|
|
32
34
|
if files.empty?
|
|
@@ -60,6 +62,10 @@ module RosettAi
|
|
|
60
62
|
|
|
61
63
|
raictl workflow validate release
|
|
62
64
|
LONGDESC
|
|
65
|
+
# Validate the input and return any errors.
|
|
66
|
+
#
|
|
67
|
+
# @param name [Object] the name
|
|
68
|
+
# @return [Array<Hash>]
|
|
63
69
|
def validate(name)
|
|
64
70
|
path = resolve_workflow(name)
|
|
65
71
|
engine = RosettAi::Workflow::Engine.new(workflow_path: path)
|
|
@@ -83,6 +89,10 @@ module RosettAi
|
|
|
83
89
|
|
|
84
90
|
raictl workflow simulate release
|
|
85
91
|
LONGDESC
|
|
92
|
+
# Simulate workflow execution without applying changes.
|
|
93
|
+
#
|
|
94
|
+
# @param name [Object] the name
|
|
95
|
+
# @return [void]
|
|
86
96
|
def simulate(name)
|
|
87
97
|
path = resolve_workflow(name)
|
|
88
98
|
engine = RosettAi::Workflow::Engine.new(workflow_path: path)
|
|
@@ -113,6 +123,10 @@ module RosettAi
|
|
|
113
123
|
desc: 'Resume from last completed step'
|
|
114
124
|
method_option :format, type: :string, enum: ['table', 'json'], default: 'table',
|
|
115
125
|
desc: 'Output format'
|
|
126
|
+
# Execute the named workflow.
|
|
127
|
+
#
|
|
128
|
+
# @param name [Object] the name
|
|
129
|
+
# @return [void]
|
|
116
130
|
def execute(name)
|
|
117
131
|
path = resolve_workflow(name)
|
|
118
132
|
audit_path = resolve_audit_log_path(name)
|
|
@@ -12,10 +12,19 @@ module RosettAi
|
|
|
12
12
|
# ANSI escape sequences. Auto-selected when assistive technology is
|
|
13
13
|
# detected (ORCA_RUNNING, BRLTTY_TTY).
|
|
14
14
|
class AccessibleTui < Tui
|
|
15
|
+
# Render content in the UI backend.
|
|
16
|
+
#
|
|
17
|
+
# @param content [Object] the content
|
|
18
|
+
# @return [void]
|
|
15
19
|
def render(content)
|
|
16
20
|
$stdout.puts(RosettAi::TextSanitizer.strip_ansi(String(content)))
|
|
17
21
|
end
|
|
18
22
|
|
|
23
|
+
# Render a table in the UI backend.
|
|
24
|
+
#
|
|
25
|
+
# @param headers [Object] the headers
|
|
26
|
+
# @param rows [Object] the rows
|
|
27
|
+
# @return [void]
|
|
19
28
|
def display_table(headers, rows)
|
|
20
29
|
widths = compute_column_widths(headers, rows)
|
|
21
30
|
|
|
@@ -27,6 +36,10 @@ module RosettAi
|
|
|
27
36
|
rows.each { |row| $stdout.puts(format_row(row, widths)) }
|
|
28
37
|
end
|
|
29
38
|
|
|
39
|
+
# Display a spinner during a long-running operation.
|
|
40
|
+
#
|
|
41
|
+
# @param message [Object] the message
|
|
42
|
+
# @return [void]
|
|
30
43
|
def show_spinner(message)
|
|
31
44
|
$stdout.puts("Processing: #{message}...")
|
|
32
45
|
result = yield
|
|
@@ -37,6 +50,11 @@ module RosettAi
|
|
|
37
50
|
raise e
|
|
38
51
|
end
|
|
39
52
|
|
|
53
|
+
# Announce a message to the user via the UI backend.
|
|
54
|
+
#
|
|
55
|
+
# @param message [Object] the message
|
|
56
|
+
# @param priority [Object] the priority
|
|
57
|
+
# @return [void]
|
|
40
58
|
def announce(message, priority: :polite)
|
|
41
59
|
prefix = priority == :assertive ? '[ASSERTIVE]' : '[POLITE]'
|
|
42
60
|
warn("#{prefix} #{message}")
|
data/lib/rosett_ai/ui/base.rb
CHANGED
|
@@ -11,6 +11,7 @@ module RosettAi
|
|
|
11
11
|
# implement the required methods. The shared example
|
|
12
12
|
# 'a UI implementation' verifies conformance.
|
|
13
13
|
class Base
|
|
14
|
+
# @return [Array] Rtl locales constant.
|
|
14
15
|
RTL_LOCALES = ['ar', 'he', 'fa', 'ur'].freeze
|
|
15
16
|
|
|
16
17
|
def render(content)
|
|
@@ -37,6 +38,8 @@ module RosettAi
|
|
|
37
38
|
ENV.key?('ORCA_RUNNING') || ENV.key?('BRLTTY_TTY')
|
|
38
39
|
end
|
|
39
40
|
|
|
41
|
+
# Return the text direction for the current locale.
|
|
42
|
+
# @return [Symbol]
|
|
40
43
|
def text_direction(locale = nil)
|
|
41
44
|
lang = locale || ENV.fetch('LANG', 'en')[0, 2]
|
|
42
45
|
RTL_LOCALES.include?(lang) ? :rtl : :ltr
|
data/lib/rosett_ai/ui/gtk4.rb
CHANGED
|
@@ -15,6 +15,7 @@ module RosettAi
|
|
|
15
15
|
# Methods raise RosettAi::Error with install instructions if the gem
|
|
16
16
|
# is not available at runtime.
|
|
17
17
|
class Gtk4 < Base
|
|
18
|
+
# @return [String] Error message when the UI backend is not available.
|
|
18
19
|
UNAVAILABLE_MESSAGE = 'GTK4 adapter requires the gtk4 gem. Install: gem install gtk4'
|
|
19
20
|
|
|
20
21
|
def self.available?
|
|
@@ -24,6 +25,10 @@ module RosettAi
|
|
|
24
25
|
false
|
|
25
26
|
end
|
|
26
27
|
|
|
28
|
+
# Render content in the UI backend.
|
|
29
|
+
#
|
|
30
|
+
# @param content [Object] the content
|
|
31
|
+
# @return [void]
|
|
27
32
|
def render(content)
|
|
28
33
|
require_gtk4!
|
|
29
34
|
text_view = ::Gtk::TextView.new
|
|
@@ -32,6 +37,11 @@ module RosettAi
|
|
|
32
37
|
text_view
|
|
33
38
|
end
|
|
34
39
|
|
|
40
|
+
# Render a table in the UI backend.
|
|
41
|
+
#
|
|
42
|
+
# @param headers [Object] the headers
|
|
43
|
+
# @param rows [Object] the rows
|
|
44
|
+
# @return [void]
|
|
35
45
|
def display_table(headers, rows)
|
|
36
46
|
require_gtk4!
|
|
37
47
|
store = build_list_store(headers.length)
|
|
@@ -49,6 +59,10 @@ module RosettAi
|
|
|
49
59
|
dialog
|
|
50
60
|
end
|
|
51
61
|
|
|
62
|
+
# Display a spinner during a long-running operation.
|
|
63
|
+
#
|
|
64
|
+
# @param _message [Object] the message
|
|
65
|
+
# @return [void]
|
|
52
66
|
def show_spinner(_message)
|
|
53
67
|
require_gtk4!
|
|
54
68
|
spinner = ::Gtk::Spinner.new
|
|
@@ -58,6 +72,11 @@ module RosettAi
|
|
|
58
72
|
result
|
|
59
73
|
end
|
|
60
74
|
|
|
75
|
+
# Announce a message to the user via the UI backend.
|
|
76
|
+
#
|
|
77
|
+
# @param message [Object] the message
|
|
78
|
+
# @param priority [Object] the priority
|
|
79
|
+
# @return [void]
|
|
61
80
|
def announce(message, priority: :polite)
|
|
62
81
|
warn("[GTK4:#{priority}] #{message}")
|
|
63
82
|
end
|
data/lib/rosett_ai/ui/kde.rb
CHANGED
|
@@ -12,6 +12,7 @@ module RosettAi
|
|
|
12
12
|
# KDE integration requires Qt6 bindings which do not exist for Ruby.
|
|
13
13
|
# This adapter serves as a placeholder for the rosett-ai-kde package concept.
|
|
14
14
|
class Kde < Base
|
|
15
|
+
# @return [String] Error message when the UI backend is not available.
|
|
15
16
|
UNAVAILABLE_MESSAGE = 'KDE adapter not available — Ruby Qt6/KDE bindings do not exist. Use GTK4 or TUI.'
|
|
16
17
|
|
|
17
18
|
def render(_content)
|
data/lib/rosett_ai/ui/qt6.rb
CHANGED
|
@@ -12,6 +12,7 @@ module RosettAi
|
|
|
12
12
|
# Ruby Qt6 bindings do not exist (qtbindings is unmaintained, Qt4-only).
|
|
13
13
|
# This adapter serves as a placeholder for the rosett-ai-qt6 package concept.
|
|
14
14
|
class Qt6 < Base
|
|
15
|
+
# @return [String] Error message when the UI backend is not available.
|
|
15
16
|
UNAVAILABLE_MESSAGE = 'Qt6 adapter not available — Ruby Qt6 bindings do not exist. Use GTK4 or TUI.'
|
|
16
17
|
|
|
17
18
|
def render(_content)
|
|
@@ -14,10 +14,19 @@ module RosettAi
|
|
|
14
14
|
@adapters = {}
|
|
15
15
|
|
|
16
16
|
class << self
|
|
17
|
+
# Register a new UI backend adapter.
|
|
18
|
+
#
|
|
19
|
+
# @param name [Symbol, String] adapter identifier
|
|
20
|
+
# @param adapter_class [Class] the adapter class
|
|
21
|
+
# @return [void]
|
|
17
22
|
def register(name, adapter_class)
|
|
18
23
|
@adapters[name.to_sym] = adapter_class
|
|
19
24
|
end
|
|
20
25
|
|
|
26
|
+
# Resolve a UI adapter by name, or use the default.
|
|
27
|
+
#
|
|
28
|
+
# @param name [Symbol, String, nil] adapter name, or nil for default
|
|
29
|
+
# @return [Object] instantiated adapter
|
|
21
30
|
def resolve(name = nil)
|
|
22
31
|
key = name&.to_sym || default_adapter
|
|
23
32
|
adapter_class = @adapters[key]
|
|
@@ -30,6 +39,9 @@ module RosettAi
|
|
|
30
39
|
adapter_class.new
|
|
31
40
|
end
|
|
32
41
|
|
|
42
|
+
# List all available UI adapter names.
|
|
43
|
+
#
|
|
44
|
+
# @return [Array<Symbol>]
|
|
33
45
|
def available
|
|
34
46
|
@adapters.keys
|
|
35
47
|
end
|
|
@@ -38,6 +50,9 @@ module RosettAi
|
|
|
38
50
|
@adapters.key?(name.to_sym)
|
|
39
51
|
end
|
|
40
52
|
|
|
53
|
+
# Clear all registered UI backends.
|
|
54
|
+
#
|
|
55
|
+
# @return [void]
|
|
41
56
|
def reset!
|
|
42
57
|
@adapters = {}
|
|
43
58
|
end
|