rosett-ai 1.3.3 → 1.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +413 -22
- data/README.md +56 -42
- data/bin/raictl +13 -0
- data/conf/adopt_redactions.yml +2 -0
- data/conf/compliance/cra_rules.yml +2 -0
- data/conf/compliance/license_rules.yml +2 -0
- data/conf/mcp/server_defaults.yml +2 -0
- data/conf/mcp/trust.yml +1 -0
- data/conf/packaging/core.yml +2 -0
- data/conf/packaging/gtk4.yml +2 -0
- data/conf/packaging/qt6.yml +2 -0
- data/conf/policy/default_deny_list.yml +2 -0
- data/conf/review/cli-command-audit.yml +2 -0
- data/conf/review/design-docs.yml +2 -0
- data/conf/review/design-questionnaire.yml +2 -0
- data/conf/review/questionnaire.yml +2 -0
- data/conf/review/rosett-ai-core.yml +2 -0
- data/conf/schemas/ai_config_schema.json +14 -2
- data/conf/schemas/autoqueue.schema.json +153 -0
- data/conf/schemas/behaviour_schema.json +31 -7
- data/conf/schemas/compliance_rule_schema.json +17 -4
- data/conf/schemas/content_pack_manifest_schema.json +23 -4
- data/conf/schemas/design_schema.json +177 -42
- data/conf/schemas/engine_manifest_schema.json +22 -5
- data/conf/schemas/lockfile_schema.json +26 -4
- data/conf/schemas/mcp_server_schema.json +50 -9
- data/conf/schemas/packaging_schema.json +23 -5
- data/conf/schemas/policy_schema.json +35 -9
- data/conf/schemas/provenance_schema.json +33 -5
- data/conf/schemas/rai_config_schema.json +6 -2
- data/conf/schemas/rai_project_schema.json +8 -2
- data/conf/schemas/scope_hierarchy_schema.json +22 -5
- data/conf/schemas/target_schema.json +33 -6
- data/conf/schemas/tooling_schema.json +53 -12
- data/conf/schemas/workflow_schema.json +39 -9
- data/conf/targets/agents_md.yml +1 -0
- data/conf/targets/claude.yml +2 -0
- data/conf/tooling/tools.yml +2 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +5 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +40 -0
- data/lib/rosett_ai/ai_config/context_window.rb +3 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +1 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +1 -0
- data/lib/rosett_ai/ai_config/model_router.rb +1 -0
- data/lib/rosett_ai/ai_config/validator.rb +2 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +1 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +2 -0
- data/lib/rosett_ai/authorship/review_validator.rb +1 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +1 -0
- data/lib/rosett_ai/backup/compressor.rb +3 -0
- data/lib/rosett_ai/backup/destination.rb +1 -0
- data/lib/rosett_ai/behaviour/manager.rb +1 -0
- data/lib/rosett_ai/compiler/backend.rb +3 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +1 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +1 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +1 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +1 -7
- data/lib/rosett_ai/compiler/locale_compiler.rb +2 -0
- data/lib/rosett_ai/compiler/target_profile.rb +11 -0
- data/lib/rosett_ai/completion/generator.rb +2 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +1 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +1 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +2 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +4 -0
- data/lib/rosett_ai/comply/runner.rb +2 -0
- data/lib/rosett_ai/composition/composer.rb +1 -0
- data/lib/rosett_ai/composition/lockfile.rb +1 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +1 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +9 -0
- data/lib/rosett_ai/config/secret_resolver.rb +4 -0
- data/lib/rosett_ai/configuration.rb +4 -0
- data/lib/rosett_ai/content/content_client.rb +15 -0
- data/lib/rosett_ai/content/pack_installer.rb +1 -0
- data/lib/rosett_ai/content/pack_manifest.rb +21 -0
- data/lib/rosett_ai/content_packs/manager.rb +1 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +2 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +1 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +5 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +1 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +1 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +2 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +1 -0
- data/lib/rosett_ai/dbus/service.rb +3 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +14 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +6 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +3 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +1 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +2 -0
- data/lib/rosett_ai/doctor/check.rb +1 -1
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +1 -0
- data/lib/rosett_ai/doctor.rb +1 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +9 -0
- data/lib/rosett_ai/documentation/translator.rb +8 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +71 -1
- data/lib/rosett_ai/engines/detector.rb +5 -0
- data/lib/rosett_ai/engines/registry.rb +7 -0
- data/lib/rosett_ai/exit_codes.rb +6 -0
- data/lib/rosett_ai/formatting.rb +1 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +6 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +1 -0
- data/lib/rosett_ai/git_hooks/installer.rb +4 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +2 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +6 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +1 -0
- data/lib/rosett_ai/init/config_file_writer.rb +4 -0
- data/lib/rosett_ai/init/directory_builder.rb +15 -0
- data/lib/rosett_ai/init/file_copier.rb +51 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +1 -0
- data/lib/rosett_ai/init/project_initializer.rb +1 -0
- data/lib/rosett_ai/licensing/license_key.rb +4 -0
- data/lib/rosett_ai/licensing/license_store.rb +11 -0
- data/lib/rosett_ai/licensing/tier.rb +9 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +1 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +1 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +1 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +27 -4
- data/lib/rosett_ai/mcp/enforcement/validator.rb +24 -3
- data/lib/rosett_ai/mcp/governance.rb +9 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +22 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +4 -2
- data/lib/rosett_ai/mcp/keyfile.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +1 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +3 -0
- data/lib/rosett_ai/mcp/plugins.rb +1 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +3 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +3 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +1 -0
- data/lib/rosett_ai/mcp/server.rb +7 -1
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +3 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +7 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +33 -8
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +5 -0
- data/lib/rosett_ai/migration/detector.rb +1 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +2 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +3 -1
- data/lib/rosett_ai/package_manager/apt.rb +5 -0
- data/lib/rosett_ai/package_manager/base.rb +1 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +1 -0
- data/lib/rosett_ai/packaging/variant_config.rb +12 -0
- data/lib/rosett_ai/plugins/contract.rb +1 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +2 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +2 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +2 -0
- data/lib/rosett_ai/plugins/registry.rb +10 -0
- data/lib/rosett_ai/policy/auditor.rb +1 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +1 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +2 -0
- data/lib/rosett_ai/policy/validator.rb +1 -0
- data/lib/rosett_ai/profiler.rb +7 -0
- data/lib/rosett_ai/project/drift_detector.rb +1 -0
- data/lib/rosett_ai/project/manager.rb +1 -0
- data/lib/rosett_ai/project/template_applier.rb +1 -0
- data/lib/rosett_ai/provenance/entry.rb +2 -0
- data/lib/rosett_ai/provenance/source.rb +1 -0
- data/lib/rosett_ai/provenance/store.rb +3 -0
- data/lib/rosett_ai/provenance/validator.rb +1 -0
- data/lib/rosett_ai/quorum/collector.rb +1 -0
- data/lib/rosett_ai/quorum/comparator.rb +2 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +1 -0
- data/lib/rosett_ai/rai_config.rb +9 -0
- data/lib/rosett_ai/retrofit/engine.rb +2 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +8 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +10 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +9 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +3 -0
- data/lib/rosett_ai/secrets_resolver.rb +1 -0
- data/lib/rosett_ai/session_hooks/installer.rb +130 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +4 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +7 -0
- data/lib/rosett_ai/structured_logger.rb +1 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +1 -0
- data/lib/rosett_ai/telemetry.rb +1 -0
- data/lib/rosett_ai/thor/cli.rb +9 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +2 -0
- data/lib/rosett_ai/thor/tasks/backfill_user_yml.rb +207 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +6 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +12 -0
- data/lib/rosett_ai/thor/tasks/build.rb +106 -21
- data/lib/rosett_ai/thor/tasks/compile.rb +76 -32
- data/lib/rosett_ai/thor/tasks/completion.rb +9 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +2 -0
- data/lib/rosett_ai/thor/tasks/config.rb +21 -5
- data/lib/rosett_ai/thor/tasks/content.rb +8 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +13 -0
- data/lib/rosett_ai/thor/tasks/design.rb +2 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +4 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +2 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +7 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +8 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +8 -0
- data/lib/rosett_ai/thor/tasks/init.rb +1 -0
- data/lib/rosett_ai/thor/tasks/license.rb +8 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +40 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +2 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +15 -0
- data/lib/rosett_ai/thor/tasks/project.rb +8 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +8 -0
- data/lib/rosett_ai/thor/tasks/release.rb +8 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +4 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +1 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +14 -0
- data/lib/rosett_ai/tooling/version_checker.rb +1 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +18 -0
- data/lib/rosett_ai/ui/base.rb +3 -0
- data/lib/rosett_ai/ui/gtk4.rb +19 -0
- data/lib/rosett_ai/ui/kde.rb +1 -0
- data/lib/rosett_ai/ui/qt6.rb +1 -0
- data/lib/rosett_ai/ui/registry.rb +15 -0
- data/lib/rosett_ai/ui/tui.rb +22 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +1 -0
- data/lib/rosett_ai/validators/design_validator.rb +2 -0
- data/lib/rosett_ai/validators/schema_validator.rb +4 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +1 -0
- data/lib/rosett_ai/version.rb +2 -1
- data/lib/rosett_ai/version_consistency_checker.rb +6 -0
- data/lib/rosett_ai/workflow/engine.rb +1 -0
- data/lib/rosett_ai/workflow/manager.rb +1 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +2 -0
- data/lib/rosett_ai/workflow/step_runner.rb +1 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +1 -0
- data/lib/rosett_ai/yaml_loader.rb +2 -0
- data/lib/rosett_ai.rb +2 -0
- data/lib/scripts/generated/docker_hub_tags.rb +2 -0
- data/locales/ar.yml +2 -0
- data/locales/en.yml +5 -0
- data/locales/fr.yml +2 -0
- metadata +9 -189
- data/.ai-provenance.yml +0 -119
- data/.debride_whitelist +0 -186
- data/.fasterer.yml +0 -29
- data/.mdl_style.rb +0 -10
- data/.mdlrc +0 -3
- data/.mutant.yml +0 -49
- data/.namespace-allowlist +0 -42
- data/.reek.yml +0 -1040
- data/.rosett-ai/config.yml +0 -3
- data/.rspec +0 -5
- data/.rubocop.yml +0 -380
- data/.ruby-version +0 -1
- data/.yamllint +0 -51
- data/.yardopts +0 -12
- data/AI-DISCLOSURE.md +0 -48
- data/CLAUDE.md +0 -141
- data/CONTRIBUTING.md +0 -734
- data/INSTALL.md +0 -154
- data/LICENSE.md +0 -675
- data/QUICKSTART.md +0 -73
- data/Rakefile +0 -200
- data/SECURITY.md +0 -114
- data/cliff.toml +0 -52
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/design/aaif_alignment.yml +0 -181
- data/conf/design/ab_testing.yml +0 -172
- data/conf/design/accessibility.yml +0 -84
- data/conf/design/ai_authorship.yml +0 -210
- data/conf/design/ai_provenance.yml +0 -224
- data/conf/design/ai_tool_configuration.yml +0 -207
- data/conf/design/architecture.yml +0 -139
- data/conf/design/autocompletion.yml +0 -115
- data/conf/design/backward_compatibility.yml +0 -112
- data/conf/design/behaviour_composition.yml +0 -246
- data/conf/design/build_rake_extraction.yml +0 -57
- data/conf/design/ci_pipeline.yml +0 -100
- data/conf/design/claude_code_configuration.yml +0 -157
- data/conf/design/compiler.yml +0 -128
- data/conf/design/comply.yml +0 -153
- data/conf/design/content_packs.yml +0 -84
- data/conf/design/desktop_integration.yml +0 -289
- data/conf/design/distribution.yml +0 -216
- data/conf/design/doctor.yml +0 -184
- data/conf/design/documentation.yml +0 -152
- data/conf/design/engine_architecture.yml +0 -257
- data/conf/design/error_handling.yml +0 -103
- data/conf/design/feature_flags.yml +0 -142
- data/conf/design/git_hooks.yml +0 -165
- data/conf/design/gui_plugins.yml +0 -475
- data/conf/design/i18n.yml +0 -84
- data/conf/design/integration_testing.yml +0 -56
- data/conf/design/licensing_system.yml +0 -88
- data/conf/design/lifecycle_management.yml +0 -208
- data/conf/design/mcp_integration.yml +0 -207
- data/conf/design/mcp_settings.yml +0 -126
- data/conf/design/migration.yml +0 -56
- data/conf/design/monitoring_observability.yml +0 -194
- data/conf/design/namespace_cleanup.yml +0 -145
- data/conf/design/plugin_test_segregation.yml +0 -145
- data/conf/design/policy_management.yml +0 -229
- data/conf/design/project_management.yml +0 -183
- data/conf/design/rai_mcp_asset_discovery.yml +0 -164
- data/conf/design/rai_mcp_server.yml +0 -605
- data/conf/design/release_management.yml +0 -117
- data/conf/design/retrofit.yml +0 -199
- data/conf/design/retrospective_analyzer.yml +0 -79
- data/conf/design/scope_hierarchy.yml +0 -352
- data/conf/design/security.yml +0 -115
- data/conf/design/session_retrospective.yml +0 -85
- data/conf/design/smart_ui_feedback.yml +0 -89
- data/conf/design/structured_logging.yml +0 -148
- data/conf/design/styles.yml +0 -123
- data/conf/design/test_peer_review.yml +0 -89
- data/conf/design/testing.yml +0 -136
- data/conf/design/threat_model.yml +0 -108
- data/conf/design/ui_framework.yml +0 -111
- data/conf/design/usage_optimization.yml +0 -122
- data/conf/design/version_management.yml +0 -60
- data/conf/design/workflow.yml +0 -227
- data/doc/AAIF_POSITIONING.md +0 -58
- data/doc/ADOPT.md +0 -224
- data/doc/AI_PROVENANCE.md +0 -139
- data/doc/ARCHITECTURE.md +0 -920
- data/doc/BEHAVIOUR.md +0 -409
- data/doc/BUILD.md +0 -138
- data/doc/CI_CD_RECIPES.md +0 -171
- data/doc/CLAUDE_SESSIONS_MOVED.md +0 -16
- data/doc/COMMAND_ANALYSIS.md +0 -229
- data/doc/CONFIGURATION.md +0 -281
- data/doc/DESIGN_AUDIT.md +0 -235
- data/doc/DESIGN_PEER_REVIEW.md +0 -771
- data/doc/DESKTOP.md +0 -447
- data/doc/ENGINES.md +0 -567
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +0 -417
- data/doc/FEATURE_AUDIT.md +0 -218
- data/doc/IMPLEMENTATION_PLAN.md +0 -669
- data/doc/INCIDENT_REPORT_2026-02-02.md +0 -251
- data/doc/MIGRATION_GUIDE.md +0 -88
- data/doc/PACKAGING.md +0 -232
- data/doc/PROJECT_DASHBOARD.md +0 -153
- data/doc/PULP_DEPLOYMENT.md +0 -164
- data/doc/QUALITY_FIX_SUMMARY.md +0 -110
- data/doc/QUICK_START.md +0 -162
- data/doc/REEK_CONFIGURATION.md +0 -166
- data/doc/REFERENCE.md +0 -253
- data/doc/REFERENCES.md +0 -324
- data/doc/SECURITY_REVIEW_CHECKLIST.md +0 -72
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +0 -359
- data/doc/SETUP.md +0 -202
- data/doc/TEST_PEER_REVIEW.md +0 -152
- data/doc/THREAT_MODEL.md +0 -230
- data/doc/USAGE.md +0 -545
- data/doc/USER_MANUAL.md +0 -585
- data/doc/ai_test_review_checklist.md +0 -110
- data/doc/changes/2026-02-18-packaging-fpm.md +0 -155
- data/doc/changes/2026-02-19-testing-infrastructure.md +0 -221
- data/doc/changes/2026-02-20-security-implementation.md +0 -281
- data/doc/changes/2026-02-20-styles-implementation.md +0 -220
- data/doc/changes/2026-02-21-architecture-completion.md +0 -95
- data/doc/changes/2026-02-21-architecture-ui-layer.md +0 -253
- data/doc/changes/2026-02-21-cc-config-implementation.md +0 -108
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +0 -214
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +0 -241
- data/doc/changes/2026-02-21-config-design-show-commands.md +0 -61
- data/doc/changes/2026-02-21-design-implementation-overview.md +0 -455
- data/doc/changes/2026-02-21-lifecycle-management.md +0 -196
- data/doc/changes/2026-02-21-path-resolver.md +0 -128
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +0 -45
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +0 -120
- data/doc/changes/2026-03-20-security-hardening-phase2.md +0 -163
- data/doc/context/SESSION-HANDOFF.md +0 -69
- data/doc/context/ai-engine-usage-trends-2026.md +0 -80
- data/doc/context/plan-pluggable-engines.md +0 -590
- data/doc/decisions/001-flog-deferred.md +0 -32
- data/doc/decisions/002-path-resolution-strategy.md +0 -158
- data/doc/decisions/003-ui-adapter-selection.md +0 -193
- data/doc/decisions/004-design-document-validation.md +0 -179
- data/doc/decisions/005-package-splitting-strategy.md +0 -200
- data/doc/decisions/006-multi-engine-architecture.md +0 -147
- data/doc/decisions/007-engine-agnostic-pivot.md +0 -219
- data/doc/decisions/008-ci-bundler-strategy.md +0 -129
- data/doc/decisions/009-core-only-v1-release.md +0 -60
- data/doc/decisions/010-engine-debian-packaging.md +0 -66
- data/doc/decisions/011-context-aware-cli.md +0 -71
- data/doc/dependency_decisions.yml +0 -247
- data/doc/issues/001-wrapper-missing-environment-variables.md +0 -197
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +0 -217
- data/doc/issues/003-smoke-test-false-positive.md +0 -127
- data/doc/issues/004-market-research-design-updates.md +0 -109
- data/doc/issues/005-compile-scope-coexistence.md +0 -161
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +0 -505
- data/doc/operations/packaging.md +0 -133
- data/doc/operations/rosett-ai-release.md +0 -65
- data/doc/reference/error-catalog.md +0 -107
- data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
- data/doc/reference/src/Pictures/cover.jpg +0 -0
- data/doc/reference/src/Pictures/head1.jpg +0 -0
- data/doc/reference/src/Pictures/head2.jpg +0 -0
- data/doc/reference/src/Pictures/head3.jpg +0 -0
- data/doc/reference/src/Pictures/head4.jpg +0 -0
- data/doc/reference/src/Pictures/head5.jpg +0 -0
- data/doc/reference/src/Pictures/head6.jpg +0 -0
- data/doc/reference/src/Pictures/head7.jpg +0 -0
- data/doc/reference/src/Pictures/head8.jpg +0 -0
- data/doc/reference/src/StyleInd.ist +0 -4
- data/doc/reference/src/bibliography.bib +0 -79
- data/doc/reference/src/main.tex +0 -1288
- data/doc/reference/src/structure.tex +0 -303
- data/doc/rosett-ai-bookmarks.html +0 -301
- data/kitchen.yml +0 -46
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/locales/.gitkeep +0 -0
- data/packaging/build-engine-deb.sh +0 -81
- data/packaging/scripts/postinst +0 -17
- data/packaging/scripts/postrm +0 -19
- data/packaging/scripts/prerm +0 -10
- data/packaging/wrapper.sh.template +0 -38
- data/rosett-ai.gemspec +0 -63
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +0 -123
- data/settings.json +0 -29
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
module RosettAi
|
|
7
7
|
module Mcp
|
|
8
|
+
# MCP resource implementations for data access.
|
|
8
9
|
module Resources
|
|
9
10
|
# MCP resource provider for installed hook scripts.
|
|
10
11
|
#
|
|
@@ -14,8 +15,10 @@ module RosettAi
|
|
|
14
15
|
# @author hugo
|
|
15
16
|
# @author claude
|
|
16
17
|
class HooksResource
|
|
18
|
+
# @return [String] URI prefix for MCP resource discovery.
|
|
17
19
|
URI_PREFIX = 'rosett-ai://hooks/'
|
|
18
20
|
|
|
21
|
+
# @return [Hash] Supported configuration scope names.
|
|
19
22
|
SCOPES = {
|
|
20
23
|
'global' => -> { RosettAi.paths.global_dir.join('hooks') },
|
|
21
24
|
'project' => -> { RosettAi.context.project_root.join('.claude', 'hooks') }
|
|
@@ -13,7 +13,9 @@ module RosettAi
|
|
|
13
13
|
# @author hugo
|
|
14
14
|
# @author claude
|
|
15
15
|
class ProvenanceResource
|
|
16
|
+
# @return [String] URI prefix for MCP resource discovery.
|
|
16
17
|
URI_PREFIX = 'rosett-ai://provenance/'
|
|
18
|
+
# @return [String] Default provenance data filename.
|
|
17
19
|
PROVENANCE_FILE = '.ai-provenance.yml'
|
|
18
20
|
|
|
19
21
|
# Lists available provenance resources.
|
data/lib/rosett_ai/mcp/server.rb
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
|
|
5
5
|
|
|
6
6
|
module RosettAi
|
|
7
|
+
# Model Context Protocol server and tool framework.
|
|
7
8
|
module Mcp
|
|
8
9
|
# MCP server for Rosett-AI — exposes validation, compilation, and
|
|
9
10
|
# configuration management as MCP tools, resources, and prompts.
|
|
@@ -16,8 +17,11 @@ module RosettAi
|
|
|
16
17
|
# @author hugo
|
|
17
18
|
# @author claude
|
|
18
19
|
class Server
|
|
20
|
+
# @return [String] Supported MCP protocol specification version.
|
|
19
21
|
MCP_SPEC_VERSION = '2025-03-26'
|
|
22
|
+
# @return [Integer] Default port number for the server.
|
|
20
23
|
DEFAULT_PORT = 8484
|
|
24
|
+
# @return [String] Default hostname for the server.
|
|
21
25
|
DEFAULT_HOST = 'localhost'
|
|
22
26
|
|
|
23
27
|
attr_reader :security_config
|
|
@@ -108,6 +112,8 @@ module RosettAi
|
|
|
108
112
|
|
|
109
113
|
def ensure_http_available!
|
|
110
114
|
require 'puma'
|
|
115
|
+
require 'puma/configuration'
|
|
116
|
+
require 'puma/launcher'
|
|
111
117
|
require 'rackup'
|
|
112
118
|
rescue LoadError => e
|
|
113
119
|
raise RosettAi::McpError,
|
|
@@ -129,7 +135,7 @@ module RosettAi
|
|
|
129
135
|
def build_rack_app
|
|
130
136
|
server = build_server
|
|
131
137
|
transport = ::MCP::Server::Transports::StreamableHTTPTransport.new(server)
|
|
132
|
-
app = transport.
|
|
138
|
+
app = ->(env) { transport.handle_request(Rack::Request.new(env)) }
|
|
133
139
|
security = @security_config
|
|
134
140
|
|
|
135
141
|
Rack::Builder.new do
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
module RosettAi
|
|
7
7
|
module Mcp
|
|
8
|
+
# MCP server settings and trust management.
|
|
8
9
|
module Settings
|
|
9
10
|
# Manages trust sources for MCP server installation.
|
|
10
11
|
#
|
|
@@ -15,7 +16,9 @@ module RosettAi
|
|
|
15
16
|
# @author hugo
|
|
16
17
|
# @author claude
|
|
17
18
|
class TrustManager
|
|
19
|
+
# @return [String] Configuration directory path.
|
|
18
20
|
CONFIG_DIR = '.config/rosett-ai/mcp'
|
|
21
|
+
# @return [String] Filename for user trust configuration.
|
|
19
22
|
USER_TRUST_FILE = 'user_trust.yml'
|
|
20
23
|
|
|
21
24
|
# @param config_dir [Pathname, nil] override config directory
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class AdoptTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_adopt'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Run rai adopt analysis (local structural checks)'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class BackupTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_backup'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Create rai configuration backup'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => false,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class BehaviourDisplayTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_behaviour_display'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Display behaviour configuration overview'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class BehaviourListTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_behaviour_list'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'List all rai behaviour configuration files'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class BehaviourManageTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_behaviour_manage'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Add, modify, or delete rai behaviour files'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => false,
|
|
22
25
|
'destructiveHint' => true,
|
|
@@ -24,8 +27,10 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Array] Set of permitted action values.
|
|
27
31
|
VALID_ACTIONS = ['add', 'modify', 'delete'].freeze
|
|
28
32
|
|
|
33
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
29
34
|
INPUT_SCHEMA = {
|
|
30
35
|
type: 'object',
|
|
31
36
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class BehaviourShowTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_behaviour_show'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Show details of a specific rai behaviour'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -17,9 +17,12 @@ module RosettAi
|
|
|
17
17
|
# @author hugo
|
|
18
18
|
# @author claude
|
|
19
19
|
class CompileStatusTool
|
|
20
|
+
# @return [String] MCP tool identifier string.
|
|
20
21
|
TOOL_NAME = 'rai_compile_status'
|
|
22
|
+
# @return [String] Human-readable description of this tool.
|
|
21
23
|
DESCRIPTION = 'Show compiled rules staleness — source vs compiled checksums'
|
|
22
24
|
|
|
25
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
23
26
|
ANNOTATIONS = {
|
|
24
27
|
'readOnlyHint' => true,
|
|
25
28
|
'destructiveHint' => false,
|
|
@@ -27,6 +30,7 @@ module RosettAi
|
|
|
27
30
|
'openWorldHint' => false
|
|
28
31
|
}.freeze
|
|
29
32
|
|
|
33
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
30
34
|
INPUT_SCHEMA = {
|
|
31
35
|
type: 'object',
|
|
32
36
|
properties: {
|
|
@@ -18,9 +18,12 @@ module RosettAi
|
|
|
18
18
|
# @author hugo
|
|
19
19
|
# @author claude
|
|
20
20
|
class CompileTool
|
|
21
|
+
# @return [String] MCP tool identifier string.
|
|
21
22
|
TOOL_NAME = 'rai_compile'
|
|
23
|
+
# @return [String] Human-readable description of this tool.
|
|
22
24
|
DESCRIPTION = 'Compile rai behaviours to engine-native format'
|
|
23
25
|
|
|
26
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
24
27
|
ANNOTATIONS = {
|
|
25
28
|
'readOnlyHint' => false,
|
|
26
29
|
'destructiveHint' => false,
|
|
@@ -28,6 +31,7 @@ module RosettAi
|
|
|
28
31
|
'openWorldHint' => false
|
|
29
32
|
}.freeze
|
|
30
33
|
|
|
34
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
31
35
|
INPUT_SCHEMA = {
|
|
32
36
|
type: 'object',
|
|
33
37
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class ComplyTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_comply'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Run rosett-ai compliance checks (CRA, license, SPDX headers)'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class ConfigCompileTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_config_compile'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Compile rai configuration scopes to JSON settings'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => false,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class ConfigStatusTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_config_status'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Show rai configuration and project status'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class ContentTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_content'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'List, install, or update rai content packs'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => false,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,8 +27,10 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => true
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Array] Set of permitted action values.
|
|
27
31
|
VALID_ACTIONS = ['list', 'install', 'update'].freeze
|
|
28
32
|
|
|
33
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
29
34
|
INPUT_SCHEMA = {
|
|
30
35
|
type: 'object',
|
|
31
36
|
properties: {
|
|
@@ -18,9 +18,12 @@ module RosettAi
|
|
|
18
18
|
# @author hugo
|
|
19
19
|
# @author claude
|
|
20
20
|
class ContextQueryTool
|
|
21
|
+
# @return [String] MCP tool identifier string.
|
|
21
22
|
TOOL_NAME = 'rai_context_query'
|
|
23
|
+
# @return [String] Human-readable description of this tool.
|
|
22
24
|
DESCRIPTION = 'Query applicable rules for a file path, tool name, or action'
|
|
23
25
|
|
|
26
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
24
27
|
ANNOTATIONS = {
|
|
25
28
|
'readOnlyHint' => true,
|
|
26
29
|
'destructiveHint' => false,
|
|
@@ -28,6 +31,7 @@ module RosettAi
|
|
|
28
31
|
'openWorldHint' => false
|
|
29
32
|
}.freeze
|
|
30
33
|
|
|
34
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
31
35
|
INPUT_SCHEMA = {
|
|
32
36
|
type: 'object',
|
|
33
37
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class DesignListTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_design_list'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'List all rai design documents'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class DesignShowTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_design_show'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Show details of a specific rai design document'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class DoctorTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_doctor'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Run rosett-ai diagnostic checks'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,6 +27,7 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
31
|
INPUT_SCHEMA = {
|
|
28
32
|
type: 'object',
|
|
29
33
|
properties: {
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class DocumentationStatusTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_documentation_status'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Show rai documentation status'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class EnginesTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rosett_ai_engines'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'List, detect, or show status of rai engines'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,8 +27,10 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Array] Set of permitted action values.
|
|
27
31
|
VALID_ACTIONS = ['list', 'detect', 'status'].freeze
|
|
28
32
|
|
|
33
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
29
34
|
INPUT_SCHEMA = {
|
|
30
35
|
type: 'object',
|
|
31
36
|
properties: {
|
|
@@ -19,9 +19,12 @@ module RosettAi
|
|
|
19
19
|
# @author hugo
|
|
20
20
|
# @author claude
|
|
21
21
|
class HookInstallTool
|
|
22
|
+
# @return [String] MCP tool identifier string.
|
|
22
23
|
TOOL_NAME = 'rai_hook_install'
|
|
24
|
+
# @return [String] Human-readable description of this tool.
|
|
23
25
|
DESCRIPTION = 'Install enforcement hook: generate script, write to disk, register in settings'
|
|
24
26
|
|
|
27
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
25
28
|
ANNOTATIONS = {
|
|
26
29
|
'readOnlyHint' => false,
|
|
27
30
|
'destructiveHint' => true,
|
|
@@ -29,6 +32,7 @@ module RosettAi
|
|
|
29
32
|
'openWorldHint' => false
|
|
30
33
|
}.freeze
|
|
31
34
|
|
|
35
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
32
36
|
INPUT_SCHEMA = {
|
|
33
37
|
type: 'object',
|
|
34
38
|
properties: {
|
|
@@ -52,8 +56,11 @@ module RosettAi
|
|
|
52
56
|
}
|
|
53
57
|
}.freeze
|
|
54
58
|
|
|
59
|
+
# @return [String] Subdirectory name for hook scripts.
|
|
55
60
|
HOOK_DIR_NAME = 'hooks'
|
|
61
|
+
# @return [String] Default filename for generated hook scripts.
|
|
56
62
|
HOOK_FILENAME = 'rai-enforce.rb'
|
|
63
|
+
# @return [String] File extension appended to backup copies.
|
|
57
64
|
BACKUP_SUFFIX = '.rai-backup'
|
|
58
65
|
|
|
59
66
|
# Installs the enforcement hook.
|
|
@@ -21,9 +21,12 @@ module RosettAi
|
|
|
21
21
|
# @author hugo
|
|
22
22
|
# @author claude
|
|
23
23
|
class HookPreviewTool
|
|
24
|
+
# @return [String] MCP tool identifier string.
|
|
24
25
|
TOOL_NAME = 'rai_hook_preview'
|
|
26
|
+
# @return [String] Human-readable description of this tool.
|
|
25
27
|
DESCRIPTION = 'Preview generated enforcement hook script (read-only, no side effects)'
|
|
26
28
|
|
|
29
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
27
30
|
ANNOTATIONS = {
|
|
28
31
|
'readOnlyHint' => true,
|
|
29
32
|
'destructiveHint' => false,
|
|
@@ -31,6 +34,7 @@ module RosettAi
|
|
|
31
34
|
'openWorldHint' => false
|
|
32
35
|
}.freeze
|
|
33
36
|
|
|
37
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
34
38
|
INPUT_SCHEMA = {
|
|
35
39
|
type: 'object',
|
|
36
40
|
properties: {
|
|
@@ -88,27 +92,44 @@ module RosettAi
|
|
|
88
92
|
#
|
|
89
93
|
# @param behaviours [Array<Hash>]
|
|
90
94
|
# @param rule_id [String, nil]
|
|
91
|
-
# @return [Hash] :rules, :downgraded, :
|
|
95
|
+
# @return [Hash] :rules, :downgraded, :contextual_rules, :behaviour_name,
|
|
96
|
+
# :behaviour_version
|
|
92
97
|
def validate_and_collect(behaviours, rule_id)
|
|
93
98
|
validator = Enforcement::Validator.new
|
|
94
99
|
all_rules = []
|
|
95
100
|
all_downgraded = []
|
|
101
|
+
all_contextual = []
|
|
96
102
|
names = []
|
|
97
103
|
|
|
98
104
|
behaviours.each do |data|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
all_downgraded.concat(result[:downgraded])
|
|
105
|
+
slices = collect_from_behaviour(validator, data, rule_id)
|
|
106
|
+
all_rules.concat(slices[:rules])
|
|
107
|
+
all_downgraded.concat(slices[:downgraded])
|
|
108
|
+
all_contextual.concat(slices[:contextual])
|
|
104
109
|
names << data['name']
|
|
105
110
|
end
|
|
106
111
|
|
|
107
112
|
{ rules: all_rules, downgraded: all_downgraded,
|
|
113
|
+
contextual_rules: all_contextual,
|
|
108
114
|
behaviour_name: names.join(', '),
|
|
109
115
|
behaviour_version: behaviours.first&.fetch('version', '0.0.0') || '0.0.0' }
|
|
110
116
|
end
|
|
111
117
|
|
|
118
|
+
# Collects validated rules from a single behaviour, returned as slices.
|
|
119
|
+
#
|
|
120
|
+
# @param validator [Enforcement::Validator]
|
|
121
|
+
# @param data [Hash] behaviour data
|
|
122
|
+
# @param rule_id [String, nil] optional rule filter
|
|
123
|
+
# @return [Hash] :rules, :downgraded, :contextual arrays
|
|
124
|
+
def collect_from_behaviour(validator, data, rule_id)
|
|
125
|
+
result = validator.validate(data)
|
|
126
|
+
enforceable = result[:valid].select { |r| r[:type] == 'enforceable' }
|
|
127
|
+
enforceable = enforceable.select { |r| r[:rule_id] == rule_id } if rule_id
|
|
128
|
+
non_enforceable = result[:valid].reject { |r| r[:type] == 'enforceable' }
|
|
129
|
+
{ rules: enforceable, downgraded: result[:downgraded],
|
|
130
|
+
contextual: result[:skipped] + non_enforceable }
|
|
131
|
+
end
|
|
132
|
+
|
|
112
133
|
# Generates the hook script via HookGenerator.
|
|
113
134
|
#
|
|
114
135
|
# @param validated [Hash]
|
|
@@ -118,7 +139,8 @@ module RosettAi
|
|
|
118
139
|
generator.generate(
|
|
119
140
|
validated[:rules],
|
|
120
141
|
behaviour_name: validated[:behaviour_name],
|
|
121
|
-
behaviour_version: validated[:behaviour_version]
|
|
142
|
+
behaviour_version: validated[:behaviour_version],
|
|
143
|
+
contextual_rules: validated[:contextual_rules]
|
|
122
144
|
)
|
|
123
145
|
end
|
|
124
146
|
|
|
@@ -127,12 +149,15 @@ module RosettAi
|
|
|
127
149
|
# @param scope [String, nil]
|
|
128
150
|
# @return [Hash]
|
|
129
151
|
def build_response(script, validated, scope)
|
|
152
|
+
contextual = validated[:contextual_rules] || []
|
|
130
153
|
response = {
|
|
131
154
|
script: script,
|
|
132
155
|
rules_count: validated[:rules].size,
|
|
133
156
|
behaviours: validated[:rules].map { |r| r[:behaviour] }.uniq,
|
|
134
157
|
scope: scope || 'global',
|
|
135
|
-
preview_only: true
|
|
158
|
+
preview_only: true,
|
|
159
|
+
contextual_count: contextual.size,
|
|
160
|
+
contextual_rules: contextual
|
|
136
161
|
}
|
|
137
162
|
response[:downgraded] = validated[:downgraded] unless validated[:downgraded].empty?
|
|
138
163
|
response
|
|
@@ -14,9 +14,12 @@ module RosettAi
|
|
|
14
14
|
# @author hugo
|
|
15
15
|
# @author claude
|
|
16
16
|
class HooksStatusTool
|
|
17
|
+
# @return [String] MCP tool identifier string.
|
|
17
18
|
TOOL_NAME = 'rai_hooks_status'
|
|
19
|
+
# @return [String] Human-readable description of this tool.
|
|
18
20
|
DESCRIPTION = 'Show git hooks list and installation status'
|
|
19
21
|
|
|
22
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
23
|
ANNOTATIONS = {
|
|
21
24
|
'readOnlyHint' => true,
|
|
22
25
|
'destructiveHint' => false,
|
|
@@ -24,8 +27,10 @@ module RosettAi
|
|
|
24
27
|
'openWorldHint' => false
|
|
25
28
|
}.freeze
|
|
26
29
|
|
|
30
|
+
# @return [Array] Set of permitted action values.
|
|
27
31
|
VALID_ACTIONS = ['list', 'status'].freeze
|
|
28
32
|
|
|
33
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
29
34
|
INPUT_SCHEMA = {
|
|
30
35
|
type: 'object',
|
|
31
36
|
properties: {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
module RosettAi
|
|
7
7
|
module Mcp
|
|
8
|
+
# MCP tool implementations exposing raictl functionality.
|
|
8
9
|
module Tools
|
|
9
10
|
# MCP tool: initialize rosett-ai structure.
|
|
10
11
|
#
|
|
@@ -14,9 +15,12 @@ module RosettAi
|
|
|
14
15
|
# @author hugo
|
|
15
16
|
# @author claude
|
|
16
17
|
class InitTool
|
|
18
|
+
# @return [String] MCP tool identifier string.
|
|
17
19
|
TOOL_NAME = 'rai_init'
|
|
20
|
+
# @return [String] Human-readable description of this tool.
|
|
18
21
|
DESCRIPTION = 'Initialize rosett-ai directory structure (global, local, or project)'
|
|
19
22
|
|
|
23
|
+
# @return [Hash] MCP protocol annotations describing tool capabilities.
|
|
20
24
|
ANNOTATIONS = {
|
|
21
25
|
'readOnlyHint' => false,
|
|
22
26
|
'destructiveHint' => false,
|
|
@@ -24,6 +28,7 @@ module RosettAi
|
|
|
24
28
|
'openWorldHint' => false
|
|
25
29
|
}.freeze
|
|
26
30
|
|
|
31
|
+
# @return [Hash] JSON Schema defining the tool input parameters.
|
|
27
32
|
INPUT_SCHEMA = {
|
|
28
33
|
type: 'object',
|
|
29
34
|
properties: {
|