rosett-ai 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.ai-provenance.yml +119 -0
- data/.debride_whitelist +186 -0
- data/.fasterer.yml +29 -0
- data/.mdl_style.rb +10 -0
- data/.mdlrc +3 -0
- data/.mutant.yml +49 -0
- data/.namespace-allowlist +42 -0
- data/.reek.yml +1040 -0
- data/.rosett-ai/config.yml +3 -0
- data/.rspec +5 -0
- data/.rubocop.yml +380 -0
- data/.ruby-version +1 -0
- data/.yamllint +51 -0
- data/.yardopts +12 -0
- data/AI-DISCLOSURE.md +48 -0
- data/CHANGELOG.md +519 -0
- data/CLAUDE.md +141 -0
- data/CONTRIBUTING.md +734 -0
- data/INSTALL.md +154 -0
- data/LICENSE +674 -0
- data/LICENSE.md +675 -0
- data/QUICKSTART.md +73 -0
- data/README.md +366 -0
- data/Rakefile +200 -0
- data/SECURITY.md +114 -0
- data/bin/rai +1 -0
- data/cliff.toml +52 -0
- data/conf/adopt_redactions.yml +8 -0
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/compliance/cra_rules.yml +25 -0
- data/conf/compliance/license_rules.yml +20 -0
- data/conf/design/aaif_alignment.yml +181 -0
- data/conf/design/ab_testing.yml +172 -0
- data/conf/design/accessibility.yml +84 -0
- data/conf/design/ai_authorship.yml +210 -0
- data/conf/design/ai_provenance.yml +224 -0
- data/conf/design/ai_tool_configuration.yml +207 -0
- data/conf/design/architecture.yml +139 -0
- data/conf/design/autocompletion.yml +115 -0
- data/conf/design/backward_compatibility.yml +112 -0
- data/conf/design/behaviour_composition.yml +246 -0
- data/conf/design/build_rake_extraction.yml +57 -0
- data/conf/design/ci_pipeline.yml +100 -0
- data/conf/design/claude_code_configuration.yml +157 -0
- data/conf/design/compiler.yml +128 -0
- data/conf/design/comply.yml +153 -0
- data/conf/design/content_packs.yml +84 -0
- data/conf/design/desktop_integration.yml +289 -0
- data/conf/design/distribution.yml +216 -0
- data/conf/design/doctor.yml +184 -0
- data/conf/design/documentation.yml +152 -0
- data/conf/design/engine_architecture.yml +257 -0
- data/conf/design/error_handling.yml +103 -0
- data/conf/design/feature_flags.yml +142 -0
- data/conf/design/git_hooks.yml +165 -0
- data/conf/design/gui_plugins.yml +475 -0
- data/conf/design/i18n.yml +84 -0
- data/conf/design/integration_testing.yml +56 -0
- data/conf/design/licensing_system.yml +88 -0
- data/conf/design/lifecycle_management.yml +208 -0
- data/conf/design/mcp_integration.yml +207 -0
- data/conf/design/mcp_settings.yml +126 -0
- data/conf/design/migration.yml +56 -0
- data/conf/design/monitoring_observability.yml +194 -0
- data/conf/design/namespace_cleanup.yml +145 -0
- data/conf/design/plugin_test_segregation.yml +145 -0
- data/conf/design/policy_management.yml +229 -0
- data/conf/design/project_management.yml +183 -0
- data/conf/design/rai_mcp_asset_discovery.yml +164 -0
- data/conf/design/rai_mcp_server.yml +605 -0
- data/conf/design/release_management.yml +117 -0
- data/conf/design/retrofit.yml +199 -0
- data/conf/design/retrospective_analyzer.yml +79 -0
- data/conf/design/scope_hierarchy.yml +352 -0
- data/conf/design/security.yml +115 -0
- data/conf/design/session_retrospective.yml +85 -0
- data/conf/design/smart_ui_feedback.yml +89 -0
- data/conf/design/structured_logging.yml +148 -0
- data/conf/design/styles.yml +123 -0
- data/conf/design/test_peer_review.yml +89 -0
- data/conf/design/testing.yml +136 -0
- data/conf/design/threat_model.yml +108 -0
- data/conf/design/ui_framework.yml +111 -0
- data/conf/design/usage_optimization.yml +122 -0
- data/conf/design/version_management.yml +60 -0
- data/conf/design/workflow.yml +227 -0
- data/conf/mcp/server_defaults.yml +42 -0
- data/conf/mcp/trust.yml +21 -0
- data/conf/packaging/core.yml +12 -0
- data/conf/packaging/gtk4.yml +11 -0
- data/conf/packaging/qt6.yml +11 -0
- data/conf/policy/default_deny_list.yml +197 -0
- data/conf/review/cli-command-audit.yml +857 -0
- data/conf/review/design-docs.yml +1064 -0
- data/conf/review/design-questionnaire.yml +153 -0
- data/conf/review/questionnaire.yml +146 -0
- data/conf/review/rosett-ai-core.yml +2919 -0
- data/conf/schemas/ai_config_schema.json +73 -0
- data/conf/schemas/behaviour_schema.json +132 -0
- data/conf/schemas/compliance_rule_schema.json +63 -0
- data/conf/schemas/content_pack_manifest_schema.json +51 -0
- data/conf/schemas/design_schema.json +210 -0
- data/conf/schemas/engine_manifest_schema.json +144 -0
- data/conf/schemas/lockfile_schema.json +74 -0
- data/conf/schemas/mcp_server_schema.json +48 -0
- data/conf/schemas/packaging_schema.json +70 -0
- data/conf/schemas/policy_schema.json +85 -0
- data/conf/schemas/provenance_schema.json +84 -0
- data/conf/schemas/rai_config_schema.json +56 -0
- data/conf/schemas/rai_project_schema.json +20 -0
- data/conf/schemas/scope_hierarchy_schema.json +49 -0
- data/conf/schemas/target_schema.json +67 -0
- data/conf/schemas/tooling_schema.json +65 -0
- data/conf/schemas/workflow_schema.json +112 -0
- data/conf/targets/agents_md.yml +17 -0
- data/conf/targets/claude.yml +12 -0
- data/conf/tooling/tools.yml +58 -0
- data/dist/rosett-ai-mcp.service +48 -0
- data/dist/rosett-ai-mcp.yml.default +45 -0
- data/doc/AAIF_POSITIONING.md +58 -0
- data/doc/ADOPT.md +224 -0
- data/doc/AI_PROVENANCE.md +139 -0
- data/doc/ARCHITECTURE.md +920 -0
- data/doc/BEHAVIOUR.md +409 -0
- data/doc/BUILD.md +138 -0
- data/doc/CI_CD_RECIPES.md +171 -0
- data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
- data/doc/COMMAND_ANALYSIS.md +229 -0
- data/doc/CONFIGURATION.md +281 -0
- data/doc/DESIGN_AUDIT.md +235 -0
- data/doc/DESIGN_PEER_REVIEW.md +771 -0
- data/doc/DESKTOP.md +447 -0
- data/doc/ENGINES.md +567 -0
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
- data/doc/FEATURE_AUDIT.md +218 -0
- data/doc/IMPLEMENTATION_PLAN.md +669 -0
- data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
- data/doc/MIGRATION_GUIDE.md +88 -0
- data/doc/PACKAGING.md +232 -0
- data/doc/PROJECT_DASHBOARD.md +153 -0
- data/doc/PULP_DEPLOYMENT.md +164 -0
- data/doc/QUALITY_FIX_SUMMARY.md +110 -0
- data/doc/QUICK_START.md +162 -0
- data/doc/REEK_CONFIGURATION.md +166 -0
- data/doc/REFERENCE.md +253 -0
- data/doc/REFERENCES.md +324 -0
- data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
- data/doc/SETUP.md +202 -0
- data/doc/TEST_PEER_REVIEW.md +152 -0
- data/doc/THREAT_MODEL.md +230 -0
- data/doc/USAGE.md +545 -0
- data/doc/USER_MANUAL.md +585 -0
- data/doc/ai_test_review_checklist.md +110 -0
- data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
- data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
- data/doc/changes/2026-02-20-security-implementation.md +281 -0
- data/doc/changes/2026-02-20-styles-implementation.md +220 -0
- data/doc/changes/2026-02-21-architecture-completion.md +95 -0
- data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
- data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
- data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
- data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
- data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
- data/doc/changes/2026-02-21-path-resolver.md +128 -0
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
- data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
- data/doc/context/SESSION-HANDOFF.md +69 -0
- data/doc/context/ai-engine-usage-trends-2026.md +80 -0
- data/doc/context/plan-pluggable-engines.md +590 -0
- data/doc/decisions/001-flog-deferred.md +32 -0
- data/doc/decisions/002-path-resolution-strategy.md +158 -0
- data/doc/decisions/003-ui-adapter-selection.md +193 -0
- data/doc/decisions/004-design-document-validation.md +179 -0
- data/doc/decisions/005-package-splitting-strategy.md +200 -0
- data/doc/decisions/006-multi-engine-architecture.md +147 -0
- data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
- data/doc/decisions/008-ci-bundler-strategy.md +129 -0
- data/doc/decisions/009-core-only-v1-release.md +60 -0
- data/doc/decisions/010-engine-debian-packaging.md +66 -0
- data/doc/decisions/011-context-aware-cli.md +71 -0
- data/doc/dependency_decisions.yml +247 -0
- data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
- data/doc/issues/003-smoke-test-false-positive.md +127 -0
- data/doc/issues/004-market-research-design-updates.md +109 -0
- data/doc/issues/005-compile-scope-coexistence.md +161 -0
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +505 -0
- data/doc/operations/packaging.md +133 -0
- data/doc/operations/rosett-ai-release.md +65 -0
- data/doc/reference/error-catalog.md +107 -0
- data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
- data/doc/reference/src/Pictures/cover.jpg +0 -0
- data/doc/reference/src/Pictures/head1.jpg +0 -0
- data/doc/reference/src/Pictures/head2.jpg +0 -0
- data/doc/reference/src/Pictures/head3.jpg +0 -0
- data/doc/reference/src/Pictures/head4.jpg +0 -0
- data/doc/reference/src/Pictures/head5.jpg +0 -0
- data/doc/reference/src/Pictures/head6.jpg +0 -0
- data/doc/reference/src/Pictures/head7.jpg +0 -0
- data/doc/reference/src/Pictures/head8.jpg +0 -0
- data/doc/reference/src/StyleInd.ist +4 -0
- data/doc/reference/src/bibliography.bib +79 -0
- data/doc/reference/src/main.tex +1288 -0
- data/doc/reference/src/structure.tex +303 -0
- data/doc/rosett-ai-bookmarks.html +301 -0
- data/kitchen.yml +46 -0
- data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
- data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
- data/lib/rosett_ai/ai_config/context_window.rb +55 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
- data/lib/rosett_ai/ai_config/model_router.rb +121 -0
- data/lib/rosett_ai/ai_config/validator.rb +45 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
- data/lib/rosett_ai/authorship/review_validator.rb +39 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
- data/lib/rosett_ai/backup/compressor.rb +180 -0
- data/lib/rosett_ai/backup/destination.rb +91 -0
- data/lib/rosett_ai/behaviour/manager.rb +156 -0
- data/lib/rosett_ai/compiler/backend.rb +86 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
- data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
- data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
- data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
- data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
- data/lib/rosett_ai/compiler/target_profile.rb +112 -0
- data/lib/rosett_ai/completion/generator.rb +101 -0
- data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
- data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
- data/lib/rosett_ai/comply/reporter.rb +113 -0
- data/lib/rosett_ai/comply/runner.rb +50 -0
- data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
- data/lib/rosett_ai/composition/composer.rb +158 -0
- data/lib/rosett_ai/composition/composition_result.rb +64 -0
- data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
- data/lib/rosett_ai/composition/lockfile.rb +103 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
- data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
- data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
- data/lib/rosett_ai/config/compile_result.rb +37 -0
- data/lib/rosett_ai/config/compiler.rb +13 -0
- data/lib/rosett_ai/config/domain_transformer.rb +13 -0
- data/lib/rosett_ai/config/key_map.rb +13 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
- data/lib/rosett_ai/config/scope_router.rb +13 -0
- data/lib/rosett_ai/config/secret_resolver.rb +125 -0
- data/lib/rosett_ai/configuration.rb +119 -0
- data/lib/rosett_ai/content/content_client.rb +60 -0
- data/lib/rosett_ai/content/pack_installer.rb +117 -0
- data/lib/rosett_ai/content/pack_manifest.rb +50 -0
- data/lib/rosett_ai/content/pack_registry.rb +68 -0
- data/lib/rosett_ai/content_packs/manager.rb +50 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
- data/lib/rosett_ai/dbus/service.rb +121 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
- data/lib/rosett_ai/deprecation.rb +79 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
- data/lib/rosett_ai/doctor/check.rb +92 -0
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
- data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
- data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
- data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
- data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
- data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
- data/lib/rosett_ai/doctor.rb +81 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
- data/lib/rosett_ai/documentation/translator.rb +62 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
- data/lib/rosett_ai/engines/detector.rb +63 -0
- data/lib/rosett_ai/engines/registry.rb +50 -0
- data/lib/rosett_ai/error_handler.rb +139 -0
- data/lib/rosett_ai/exit_codes.rb +76 -0
- data/lib/rosett_ai/feature_flags.rb +102 -0
- data/lib/rosett_ai/formatting.rb +33 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
- data/lib/rosett_ai/git_hooks/installer.rb +175 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
- data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
- data/lib/rosett_ai/init/config_file_writer.rb +24 -0
- data/lib/rosett_ai/init/directory_builder.rb +38 -0
- data/lib/rosett_ai/init/file_copier.rb +95 -0
- data/lib/rosett_ai/init/global_initializer.rb +28 -0
- data/lib/rosett_ai/init/local_initializer.rb +27 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
- data/lib/rosett_ai/init/project_initializer.rb +38 -0
- data/lib/rosett_ai/licensing/license_key.rb +139 -0
- data/lib/rosett_ai/licensing/license_store.rb +64 -0
- data/lib/rosett_ai/licensing/license_validator.rb +60 -0
- data/lib/rosett_ai/licensing/tier.rb +42 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
- data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
- data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
- data/lib/rosett_ai/mcp/governance.rb +160 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
- data/lib/rosett_ai/mcp/instructions.rb +266 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
- data/lib/rosett_ai/mcp/keyfile.rb +221 -0
- data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
- data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
- data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
- data/lib/rosett_ai/mcp/plugins.rb +143 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
- data/lib/rosett_ai/mcp/response_helper.rb +46 -0
- data/lib/rosett_ai/mcp/security_logger.rb +60 -0
- data/lib/rosett_ai/mcp/server.rb +212 -0
- data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
- data/lib/rosett_ai/migration/detector.rb +117 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
- data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
- data/lib/rosett_ai/package_manager/apt.rb +108 -0
- data/lib/rosett_ai/package_manager/base.rb +68 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
- data/lib/rosett_ai/packaging/variant_config.rb +92 -0
- data/lib/rosett_ai/path_resolver.rb +115 -0
- data/lib/rosett_ai/plugins/contract.rb +43 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
- data/lib/rosett_ai/plugins/registry.rb +150 -0
- data/lib/rosett_ai/policy/auditor.rb +41 -0
- data/lib/rosett_ai/policy/deny_list.rb +71 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
- data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
- data/lib/rosett_ai/policy/protected_files.rb +47 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
- data/lib/rosett_ai/policy/validator.rb +35 -0
- data/lib/rosett_ai/profiler.rb +79 -0
- data/lib/rosett_ai/project/drift_detector.rb +126 -0
- data/lib/rosett_ai/project/manager.rb +115 -0
- data/lib/rosett_ai/project/sync_manager.rb +138 -0
- data/lib/rosett_ai/project/template_applier.rb +105 -0
- data/lib/rosett_ai/project_context.rb +82 -0
- data/lib/rosett_ai/provenance/entry.rb +63 -0
- data/lib/rosett_ai/provenance/file_source.rb +32 -0
- data/lib/rosett_ai/provenance/source.rb +62 -0
- data/lib/rosett_ai/provenance/store.rb +153 -0
- data/lib/rosett_ai/provenance/tracker.rb +62 -0
- data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
- data/lib/rosett_ai/provenance/validator.rb +45 -0
- data/lib/rosett_ai/quorum/collector.rb +59 -0
- data/lib/rosett_ai/quorum/comparator.rb +81 -0
- data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
- data/lib/rosett_ai/rai_config.rb +107 -0
- data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
- data/lib/rosett_ai/retrofit/engine.rb +171 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
- data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
- data/lib/rosett_ai/retrofit/scanner.rb +47 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
- data/lib/rosett_ai/secrets_resolver.rb +71 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
- data/lib/rosett_ai/structured_logger.rb +110 -0
- data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
- data/lib/rosett_ai/telemetry/provider.rb +26 -0
- data/lib/rosett_ai/telemetry/reporter.rb +144 -0
- data/lib/rosett_ai/telemetry.rb +47 -0
- data/lib/rosett_ai/text_sanitizer.rb +62 -0
- data/lib/rosett_ai/thor/cli.rb +269 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
- data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
- data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
- data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
- data/lib/rosett_ai/thor/tasks/config.rb +265 -0
- data/lib/rosett_ai/thor/tasks/content.rb +193 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
- data/lib/rosett_ai/thor/tasks/design.rb +258 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
- data/lib/rosett_ai/thor/tasks/init.rb +259 -0
- data/lib/rosett_ai/thor/tasks/license.rb +120 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
- data/lib/rosett_ai/thor/tasks/project.rb +260 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
- data/lib/rosett_ai/thor/tasks/release.rb +314 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
- data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
- data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
- data/lib/rosett_ai/tooling/version_checker.rb +35 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
- data/lib/rosett_ai/ui/base.rb +46 -0
- data/lib/rosett_ai/ui/gtk4.rb +98 -0
- data/lib/rosett_ai/ui/kde.rb +40 -0
- data/lib/rosett_ai/ui/qt6.rb +40 -0
- data/lib/rosett_ai/ui/registry.rb +60 -0
- data/lib/rosett_ai/ui/tty_helper.rb +74 -0
- data/lib/rosett_ai/ui/tui.rb +59 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
- data/lib/rosett_ai/validators/design_validator.rb +17 -0
- data/lib/rosett_ai/validators/schema_validator.rb +84 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
- data/lib/rosett_ai/version.rb +8 -0
- data/lib/rosett_ai/version_consistency_checker.rb +129 -0
- data/lib/rosett_ai/workflow/audit_log.rb +86 -0
- data/lib/rosett_ai/workflow/engine.rb +142 -0
- data/lib/rosett_ai/workflow/manager.rb +82 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
- data/lib/rosett_ai/workflow/step_runner.rb +61 -0
- data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
- data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
- data/lib/rosett_ai/yaml_loader.rb +78 -0
- data/lib/rosett_ai.rb +221 -0
- data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
- data/lib/rubocop/rosett_ai.rb +9 -0
- data/lib/scripts/generated/docker_hub_tags.rb +126 -0
- data/locales/.gitkeep +0 -0
- data/locales/ar.yml +579 -0
- data/locales/en.yml +571 -0
- data/locales/fr.yml +567 -0
- data/packaging/build-engine-deb.sh +81 -0
- data/packaging/scripts/postinst +17 -0
- data/packaging/scripts/postrm +19 -0
- data/packaging/scripts/prerm +10 -0
- data/packaging/wrapper.sh.template +38 -0
- data/rosett-ai.gemspec +63 -0
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +123 -0
- data/settings.json +29 -0
- data/share/applications/be.neatnerds.rosettai.desktop +29 -0
- data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
- data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
- data/share/templates/behaviour/criticalthinking.yml +69 -0
- metadata +810 -0
data/doc/ENGINES.md
ADDED
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
# Engines
|
|
2
|
+
|
|
3
|
+
raictl uses a pluggable engine architecture. Each engine translates generic YAML
|
|
4
|
+
rules into a specific AI tool's native format.
|
|
5
|
+
|
|
6
|
+
Engines are distributed as **external gems** (`rosett-ai-engine-<name>`) that
|
|
7
|
+
self-register with rosett-ai core's plugin registry at load time. Core provides
|
|
8
|
+
the base classes and contracts; each gem owns its backend, detector, executor,
|
|
9
|
+
config compiler, manifests, schemas, and specs.
|
|
10
|
+
|
|
11
|
+
## Plugin Discovery
|
|
12
|
+
|
|
13
|
+
```mermaid
|
|
14
|
+
graph TB
|
|
15
|
+
subgraph Core["rosett-ai core"]
|
|
16
|
+
REG["RosettAi::Plugins::Registry"]
|
|
17
|
+
DISC["discover! → Gem.find_files('rosett_ai_engine/*/register.rb')"]
|
|
18
|
+
CONTRACT["RosettAi::Plugins::EngineContract"]
|
|
19
|
+
BASE["RosettAi::Engines::BaseConfigCompiler"]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
subgraph Gems["External Engine Gems"]
|
|
23
|
+
GEM_C["rosett-ai-engine-claude<br/>lib/rosett_ai_engine/claude/register.rb"]
|
|
24
|
+
GEM_O["rosett-ai-engine-*<br/>lib/rosett_ai_engine/*/register.rb"]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
subgraph Engines["Discovered Engine Gems"]
|
|
28
|
+
CLAUDE["rosett-ai-engine-claude"]
|
|
29
|
+
GENERIC["rosett-ai-engine-generic"]
|
|
30
|
+
AGENTS["rosett-ai-engine-agents-md"]
|
|
31
|
+
CURSOR["rosett-ai-engine-cursor"]
|
|
32
|
+
COPILOT["rosett-ai-engine-copilot"]
|
|
33
|
+
WINDSURF["rosett-ai-engine-windsurf"]
|
|
34
|
+
GOOSE["rosett-ai-engine-goose"]
|
|
35
|
+
AIDER["rosett-ai-engine-aider"]
|
|
36
|
+
OLLAMA["rosett-ai-engine-ollama"]
|
|
37
|
+
NEOX["rosett-ai-engine-gpt-neox"]
|
|
38
|
+
ACME["rosett-ai-engine-acme (example)"]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
DISC --> GEM_C
|
|
42
|
+
DISC --> GEM_O
|
|
43
|
+
GEM_C -->|register :engine| REG
|
|
44
|
+
GEM_O -->|register :engine| REG
|
|
45
|
+
REG --> Engines
|
|
46
|
+
CONTRACT -.->|implements| GEM_C
|
|
47
|
+
BASE -.->|inherits| GEM_C
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Plugin Types
|
|
51
|
+
|
|
52
|
+
raictl supports three plugin contract types:
|
|
53
|
+
|
|
54
|
+
| Type | Contract Module | Discovery Pattern | Gem Prefix |
|
|
55
|
+
|------|----------------|-------------------|------------|
|
|
56
|
+
| Engine | `RosettAi::Plugins::EngineContract` | `rosett_ai_engine/*/register.rb` | `rosett-ai-engine-` |
|
|
57
|
+
| GUI | `RosettAi::Plugins::GuiContract` | `rosett_ai_gui/*/register.rb` | `rosett-ai-gui-` |
|
|
58
|
+
| MCP | `RosettAi::Plugins::McpContract` | `rosett_ai_mcp/*/register.rb` | `rosett-ai-mcp-` |
|
|
59
|
+
|
|
60
|
+
## Engine Registry
|
|
61
|
+
|
|
62
|
+
All engines are external gems discovered dynamically by
|
|
63
|
+
`RosettAi::Plugins::Registry.discover!` via `Gem.find_files`. Core contains
|
|
64
|
+
no built-in engine code — only base classes (`RosettAi::Compiler::Backend`,
|
|
65
|
+
`RosettAi::Engines::Detector`, `RosettAi::Engines::BaseConfigCompiler`) and
|
|
66
|
+
deprecated constant aliases for backward compatibility.
|
|
67
|
+
|
|
68
|
+
## Engine Comparison
|
|
69
|
+
|
|
70
|
+
| Feature | Claude | Cursor | Copilot | Windsurf | AGENTS.md | Goose | Aider | Generic | Ollama | GPT-NeoX |
|
|
71
|
+
|---------|--------|--------|---------|----------|-----------|-------|-------|---------|--------|----------|
|
|
72
|
+
| Backend | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
|
|
73
|
+
| Detector | Yes | Yes | Yes | Yes | Yes | Yes | Yes | -- | Yes | Yes |
|
|
74
|
+
| Executor | Yes | -- | -- | -- | -- | Yes (CLI) | Yes (CLI) | -- | Yes | Yes |
|
|
75
|
+
| Config Compiler | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
|
|
76
|
+
| Key Map | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
|
|
77
|
+
| Scope Router | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
|
|
78
|
+
| Domain Transformer | Yes | -- | -- | -- | -- | -- | -- | -- | -- | -- |
|
|
79
|
+
| Manifest | Yes | Yes | Yes | Yes | Yes | Yes | Yes | -- | Yes | Yes |
|
|
80
|
+
| Output Format | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown | Markdown |
|
|
81
|
+
| Rule IDs | Yes | No | No | No | No | No | No | No | No | No |
|
|
82
|
+
| Priority Annotations | Yes | No | No | No | Sorted | No | No | No | No | No |
|
|
83
|
+
| Metadata Comments | HTML | None | None | None | None | None | None | None | None | None |
|
|
84
|
+
|
|
85
|
+
## Engine Component Diagram
|
|
86
|
+
|
|
87
|
+
```mermaid
|
|
88
|
+
graph TB
|
|
89
|
+
subgraph Required["Required Components"]
|
|
90
|
+
BACK["backend.rb<br/>Renders YAML → output format"]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
subgraph Detection["Detection (optional)"]
|
|
94
|
+
DET["detector.rb<br/>Checks if AI tool is installed"]
|
|
95
|
+
MANIF["manifest.yml<br/>Capabilities + detection rules"]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
subgraph Config["Config (optional, Claude only)"]
|
|
99
|
+
CC["config_compiler.rb"]
|
|
100
|
+
KM["key_map.rb"]
|
|
101
|
+
SR["scope_router.rb"]
|
|
102
|
+
DT["domain_transformer.rb"]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
subgraph Execution["Execution (optional)"]
|
|
106
|
+
EXEC["executor.rb<br/>API (HTTP/SDK) or CLI subprocess<br/>invocation for quorum"]
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
Required --- Detection
|
|
110
|
+
Required --- Config
|
|
111
|
+
Required --- Execution
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Claude Engine
|
|
115
|
+
|
|
116
|
+
The Claude engine is the most feature-rich, handling both rule compilation
|
|
117
|
+
and Claude Code settings management.
|
|
118
|
+
|
|
119
|
+
### Components
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
lib/rosett_ai/engines/claude/
|
|
123
|
+
├── backend.rb # Markdown with HTML comment metadata
|
|
124
|
+
├── config_compiler.rb # YAML scope → JSON settings
|
|
125
|
+
├── detector.rb # Detects claude binary + ~/.claude/
|
|
126
|
+
├── domain_transformer.rb # Transform keys between domains
|
|
127
|
+
├── executor.rb # Invoke Claude API (anthropic gem)
|
|
128
|
+
├── key_map.rb # Map YAML keys → JSON settings keys
|
|
129
|
+
└── scope_router.rb # Route settings to correct scope file
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Compilation Output Format
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
<!-- rosett-ai-claude-managed -->
|
|
136
|
+
<!-- Source: conf/behaviour/security.yml -->
|
|
137
|
+
<!-- Category: behaviour | Version: 1.1.0 -->
|
|
138
|
+
|
|
139
|
+
# security
|
|
140
|
+
|
|
141
|
+
Security rules for Claude Code
|
|
142
|
+
|
|
143
|
+
## Rules
|
|
144
|
+
|
|
145
|
+
### rule_001 (priority: 90)
|
|
146
|
+
|
|
147
|
+
Always use YAML.safe_load — never YAML.load
|
|
148
|
+
|
|
149
|
+
### rule_002 (priority: 85)
|
|
150
|
+
|
|
151
|
+
Use array-form system() — never string interpolation
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Config Compilation Flow
|
|
155
|
+
|
|
156
|
+
```mermaid
|
|
157
|
+
sequenceDiagram
|
|
158
|
+
participant CLI
|
|
159
|
+
participant Compiler as ConfigCompiler
|
|
160
|
+
participant ScopeRouter
|
|
161
|
+
participant KeyMap
|
|
162
|
+
participant FS as Filesystem
|
|
163
|
+
|
|
164
|
+
CLI->>Compiler: compile(scope: "managed")
|
|
165
|
+
Compiler->>ScopeRouter: route(scope)
|
|
166
|
+
ScopeRouter-->>Compiler: conf/engines/claude/config/managed.yml
|
|
167
|
+
Compiler->>Compiler: load YAML
|
|
168
|
+
Compiler->>KeyMap: transform(yaml_keys)
|
|
169
|
+
KeyMap-->>Compiler: json_keys
|
|
170
|
+
Compiler->>FS: write settings.json
|
|
171
|
+
FS-->>Compiler: success
|
|
172
|
+
Compiler-->>CLI: CompileResult
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Detection Logic
|
|
176
|
+
|
|
177
|
+
```mermaid
|
|
178
|
+
flowchart TD
|
|
179
|
+
A[Detect Claude] --> B{claude binary in PATH?}
|
|
180
|
+
B -->|Yes| C{~/.claude/ exists?}
|
|
181
|
+
B -->|No| D[Not detected]
|
|
182
|
+
C -->|Yes| E{~/.claude/settings.json exists?}
|
|
183
|
+
C -->|No| F[Partially detected]
|
|
184
|
+
E -->|Yes| G[Fully detected + available]
|
|
185
|
+
E -->|No| F
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## AGENTS.md Engine
|
|
189
|
+
|
|
190
|
+
Compiles rules into the [AGENTS.md](https://github.com/anthropics/agents-md)
|
|
191
|
+
format — bullet-list rules under an `## Instructions` heading. No rule IDs,
|
|
192
|
+
no metadata, priority-sorted.
|
|
193
|
+
|
|
194
|
+
### Components
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
lib/rosett_ai/engines/agents_md/
|
|
198
|
+
├── backend.rb # Bullet-list renderer
|
|
199
|
+
└── detector.rb # Always available (no external tool needed)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Output Format
|
|
203
|
+
|
|
204
|
+
```markdown
|
|
205
|
+
## Instructions
|
|
206
|
+
|
|
207
|
+
- Always use YAML.safe_load — never YAML.load
|
|
208
|
+
- Use array-form system() — never string interpolation
|
|
209
|
+
- All external input must be validated before use
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Design Decisions
|
|
213
|
+
|
|
214
|
+
```mermaid
|
|
215
|
+
flowchart LR
|
|
216
|
+
A[Rules YAML] --> B{Has priority?}
|
|
217
|
+
B -->|Yes| C[Sort descending]
|
|
218
|
+
B -->|No| D[Default priority 50]
|
|
219
|
+
C --> E[Render as bullet list]
|
|
220
|
+
D --> E
|
|
221
|
+
E --> F[Prepend '## Instructions']
|
|
222
|
+
F --> G[Write AGENTS.md]
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Generic Engine
|
|
226
|
+
|
|
227
|
+
Minimal engine producing plain markdown without tool-specific formatting.
|
|
228
|
+
Useful for engines not yet supported or for human-readable documentation.
|
|
229
|
+
|
|
230
|
+
### Components
|
|
231
|
+
|
|
232
|
+
```text
|
|
233
|
+
lib/rosett_ai/engines/generic/
|
|
234
|
+
└── backend.rb # Plain markdown renderer
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Ollama Engine
|
|
238
|
+
|
|
239
|
+
Compiles rules into prompts suitable for Ollama's local LLM serving.
|
|
240
|
+
|
|
241
|
+
### Components
|
|
242
|
+
|
|
243
|
+
```text
|
|
244
|
+
lib/rosett_ai/engines/ollama/
|
|
245
|
+
├── backend.rb # Ollama-compatible text renderer
|
|
246
|
+
├── detector.rb # Detects ollama binary + localhost:11434
|
|
247
|
+
└── executor.rb # Invokes Ollama API for quorum
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Detection Logic
|
|
251
|
+
|
|
252
|
+
```mermaid
|
|
253
|
+
flowchart TD
|
|
254
|
+
A[Detect Ollama] --> B{ollama binary in PATH?}
|
|
255
|
+
B -->|Yes| C{localhost:11434 responding?}
|
|
256
|
+
B -->|No| D[Not detected]
|
|
257
|
+
C -->|Yes| E[Fully detected + available]
|
|
258
|
+
C -->|No| F[Binary found, server not running]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## GPT-NeoX Engine
|
|
262
|
+
|
|
263
|
+
Compiles rules into prompts for GPT-NeoX models served via vLLM.
|
|
264
|
+
Separate from Ollama for deployment independence.
|
|
265
|
+
|
|
266
|
+
### Components
|
|
267
|
+
|
|
268
|
+
```text
|
|
269
|
+
lib/rosett_ai/engines/gpt_neox/
|
|
270
|
+
├── backend.rb # vLLM-compatible text renderer
|
|
271
|
+
├── detector.rb # Detects vLLM endpoint via env/config
|
|
272
|
+
└── executor.rb # Invokes vLLM API for quorum
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Detection Logic
|
|
276
|
+
|
|
277
|
+
```mermaid
|
|
278
|
+
flowchart TD
|
|
279
|
+
A[Detect GPT-NeoX] --> B{VLLM_ENDPOINT env var set?}
|
|
280
|
+
B -->|Yes| C{Endpoint responding?}
|
|
281
|
+
B -->|No| D{Config has vllm_endpoint?}
|
|
282
|
+
C -->|Yes| E[Fully detected]
|
|
283
|
+
C -->|No| F[Configured but unreachable]
|
|
284
|
+
D -->|Yes| C
|
|
285
|
+
D -->|No| G[Not detected]
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Goose Engine
|
|
289
|
+
|
|
290
|
+
Compiles rules into markdown for [Goose](https://block.github.io/goose/) by Block.
|
|
291
|
+
Uses the generic backend with a Goose-specific managed marker. Supports
|
|
292
|
+
quorum participation via CLI subprocess executor.
|
|
293
|
+
|
|
294
|
+
### Components
|
|
295
|
+
|
|
296
|
+
```text
|
|
297
|
+
lib/rosett_ai/engines/goose/
|
|
298
|
+
├── backend.rb # Goose-compatible markdown renderer
|
|
299
|
+
├── detector.rb # Detects goose binary + ~/.config/goose/
|
|
300
|
+
└── executor.rb # CLI subprocess executor (Open3.capture3)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Output Marker
|
|
304
|
+
|
|
305
|
+
```markdown
|
|
306
|
+
<!-- rosett-ai-goose-managed -->
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Detection Logic
|
|
310
|
+
|
|
311
|
+
```mermaid
|
|
312
|
+
flowchart TD
|
|
313
|
+
A[Detect Goose] --> B{goose binary in PATH?}
|
|
314
|
+
B -->|Yes| C{~/.config/goose/ exists?}
|
|
315
|
+
B -->|No| D[Not detected]
|
|
316
|
+
C -->|Yes| E[Fully detected + available]
|
|
317
|
+
C -->|No| F[Binary found, no config]
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Executor
|
|
321
|
+
|
|
322
|
+
CLI subprocess executor using `Open3.capture3` with `GOOSE_MODE=auto`.
|
|
323
|
+
Prompts passed via tempfile. Returns structured JSON for quorum aggregation.
|
|
324
|
+
|
|
325
|
+
## Aider Engine
|
|
326
|
+
|
|
327
|
+
Compiles rules into markdown for [Aider](https://aider.chat/), the AI pair
|
|
328
|
+
programming tool. Uses the generic backend with an Aider-specific managed marker.
|
|
329
|
+
Supports quorum participation via CLI subprocess executor.
|
|
330
|
+
|
|
331
|
+
### Components
|
|
332
|
+
|
|
333
|
+
```text
|
|
334
|
+
lib/rosett_ai/engines/aider/
|
|
335
|
+
├── backend.rb # Aider-compatible markdown renderer
|
|
336
|
+
├── detector.rb # Detects aider binary
|
|
337
|
+
└── executor.rb # CLI subprocess executor (Open3.capture3)
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Output Marker
|
|
341
|
+
|
|
342
|
+
```markdown
|
|
343
|
+
<!-- rosett-ai-aider-managed -->
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Executor
|
|
347
|
+
|
|
348
|
+
CLI subprocess executor using `Open3.capture3` with
|
|
349
|
+
`--message-file <tempfile> --no-auto-commits --no-git --yes`.
|
|
350
|
+
Returns structured JSON for quorum aggregation.
|
|
351
|
+
|
|
352
|
+
## Cursor Engine
|
|
353
|
+
|
|
354
|
+
Compiles rules into a `.cursorrules` file for [Cursor](https://cursor.com/) by
|
|
355
|
+
Anysphere. Compilation-only engine (no executor).
|
|
356
|
+
|
|
357
|
+
### Components
|
|
358
|
+
|
|
359
|
+
```text
|
|
360
|
+
lib/rosett_ai/engines/cursor/
|
|
361
|
+
├── backend.rb # Cursor-compatible markdown renderer
|
|
362
|
+
└── detector.rb # Detects cursor binary + ~/.cursor/
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Output Marker
|
|
366
|
+
|
|
367
|
+
```markdown
|
|
368
|
+
<!-- rosett-ai-cursor-managed -->
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Detection Logic
|
|
372
|
+
|
|
373
|
+
```mermaid
|
|
374
|
+
flowchart TD
|
|
375
|
+
A[Detect Cursor] --> B{cursor binary in PATH?}
|
|
376
|
+
B -->|Yes| C{~/.cursor/ exists?}
|
|
377
|
+
B -->|No| D[Not detected]
|
|
378
|
+
C -->|Yes| E[Fully detected + available]
|
|
379
|
+
C -->|No| F[Binary found, no config]
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
## Copilot Engine
|
|
383
|
+
|
|
384
|
+
Compiles rules into `.github/copilot-instructions.md` for
|
|
385
|
+
[GitHub Copilot](https://github.com/features/copilot).
|
|
386
|
+
Compilation-only engine (no executor).
|
|
387
|
+
|
|
388
|
+
### Components
|
|
389
|
+
|
|
390
|
+
```text
|
|
391
|
+
lib/rosett_ai/engines/copilot/
|
|
392
|
+
├── backend.rb # Copilot-compatible markdown renderer
|
|
393
|
+
└── detector.rb # Detects .github/ config directory
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Output Marker
|
|
397
|
+
|
|
398
|
+
```markdown
|
|
399
|
+
<!-- rosett-ai-copilot-managed -->
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Detection Logic
|
|
403
|
+
|
|
404
|
+
```mermaid
|
|
405
|
+
flowchart TD
|
|
406
|
+
A[Detect Copilot] --> B{.github/ directory exists?}
|
|
407
|
+
B -->|Yes| C[Detected — advisory only]
|
|
408
|
+
B -->|No| D[Not detected]
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## Windsurf Engine
|
|
412
|
+
|
|
413
|
+
Compiles rules into a `.windsurfrules` file for
|
|
414
|
+
[Windsurf](https://codeium.com/windsurf) by Codeium.
|
|
415
|
+
Compilation-only engine (no executor).
|
|
416
|
+
|
|
417
|
+
### Components
|
|
418
|
+
|
|
419
|
+
```text
|
|
420
|
+
lib/rosett_ai/engines/windsurf/
|
|
421
|
+
├── backend.rb # Windsurf-compatible markdown renderer
|
|
422
|
+
└── detector.rb # Detects windsurf binary
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Output Marker
|
|
426
|
+
|
|
427
|
+
```markdown
|
|
428
|
+
<!-- rosett-ai-windsurf-managed -->
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Detection Logic
|
|
432
|
+
|
|
433
|
+
```mermaid
|
|
434
|
+
flowchart TD
|
|
435
|
+
A[Detect Windsurf] --> B{windsurf binary in PATH?}
|
|
436
|
+
B -->|Yes| C[Detected + available]
|
|
437
|
+
B -->|No| D[Not detected]
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## Capability Manifests
|
|
441
|
+
|
|
442
|
+
Each engine declares capabilities via `conf/engines/<name>/manifest.yml`:
|
|
443
|
+
|
|
444
|
+
```yaml
|
|
445
|
+
name: agents_md
|
|
446
|
+
display_name: "AGENTS.md"
|
|
447
|
+
version: "1.0.0"
|
|
448
|
+
|
|
449
|
+
detection:
|
|
450
|
+
always_available: true
|
|
451
|
+
|
|
452
|
+
capabilities:
|
|
453
|
+
compile_rules: true
|
|
454
|
+
compile_config: false
|
|
455
|
+
sensitive_filtering: false
|
|
456
|
+
rule_ids: false
|
|
457
|
+
priority_annotations: false
|
|
458
|
+
metadata_comments: false
|
|
459
|
+
|
|
460
|
+
execution:
|
|
461
|
+
api_gem: null
|
|
462
|
+
cli_binary: null
|
|
463
|
+
structured_output: false
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Capability Gap Warnings
|
|
467
|
+
|
|
468
|
+
```mermaid
|
|
469
|
+
flowchart TD
|
|
470
|
+
A[Compile request] --> B{Load manifest}
|
|
471
|
+
B --> C{Behaviour has sensitive: true?}
|
|
472
|
+
C -->|Yes| D{Engine supports sensitive_filtering?}
|
|
473
|
+
C -->|No| E[Proceed normally]
|
|
474
|
+
D -->|Yes| F[Apply redaction + compile]
|
|
475
|
+
D -->|No| G{--strict mode?}
|
|
476
|
+
G -->|Yes| H[ERROR: capability gap]
|
|
477
|
+
G -->|No| I["WARN: included without redaction"]
|
|
478
|
+
I --> J[Compile anyway]
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
## Executor Resolution
|
|
482
|
+
|
|
483
|
+
All engines with an executor implement a uniform `analyze(prompt)` method that
|
|
484
|
+
returns structured JSON with `findings`, `overall_status`, and `summary` keys.
|
|
485
|
+
The `ExecutorResolver` selects the correct constructor kwargs based on the
|
|
486
|
+
engine manifest's `execution` section:
|
|
487
|
+
|
|
488
|
+
```mermaid
|
|
489
|
+
flowchart TD
|
|
490
|
+
A[RuleAdopter.resolve_executor] --> B[ExecutorResolver.new]
|
|
491
|
+
B --> C{Read manifest execution}
|
|
492
|
+
C -->|api_gem set| D["Pass api_key:, base_url:<br/>(SDK-based: Claude)"]
|
|
493
|
+
C -->|api_type: http| E["Pass endpoint:, model:<br/>(HTTP API: Ollama, GPT-NeoX)"]
|
|
494
|
+
C -->|api_type: cli| F2["Pass binary:<br/>(CLI subprocess: Goose, Aider)"]
|
|
495
|
+
D --> F[Executor.new with kwargs]
|
|
496
|
+
E --> F
|
|
497
|
+
F2 --> F
|
|
498
|
+
F --> G[executor.analyze prompt]
|
|
499
|
+
G --> H["JSON {findings, overall_status, summary}"]
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
## Quorum Module
|
|
503
|
+
|
|
504
|
+
The quorum module dispatches adopt analysis to multiple engines in parallel
|
|
505
|
+
and aggregates their findings. Requires `--api --quorum` flags.
|
|
506
|
+
|
|
507
|
+
```mermaid
|
|
508
|
+
flowchart LR
|
|
509
|
+
subgraph Dispatch["Dispatcher"]
|
|
510
|
+
D1["Thread per engine"]
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
subgraph Collect["Collector"]
|
|
514
|
+
C1["Normalize responses"]
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
subgraph Compare["Comparator"]
|
|
518
|
+
CP1["Cross-engine: promoted"]
|
|
519
|
+
CP2["Single-engine: annotated"]
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
PROMPT["Adopt prompt"] --> Dispatch
|
|
523
|
+
Dispatch --> |Claude| Collect
|
|
524
|
+
Dispatch --> |Goose| Collect
|
|
525
|
+
Dispatch --> |Aider| Collect
|
|
526
|
+
Dispatch --> |Ollama| Collect
|
|
527
|
+
Dispatch --> |GPT-NeoX| Collect
|
|
528
|
+
Collect --> Compare
|
|
529
|
+
Compare --> RESULT["Aggregated findings"]
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### Components
|
|
533
|
+
|
|
534
|
+
```text
|
|
535
|
+
lib/rosett_ai/quorum/
|
|
536
|
+
├── collector.rb # Normalize per-engine responses
|
|
537
|
+
├── comparator.rb # Aggregate cross-engine findings
|
|
538
|
+
├── dispatcher.rb # Thread-based parallel dispatch
|
|
539
|
+
└── strategies/
|
|
540
|
+
└── adopt.rb # Adopt-specific orchestration
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Usage
|
|
544
|
+
|
|
545
|
+
```bash
|
|
546
|
+
# Single engine (default)
|
|
547
|
+
bin/raictl adopt --api
|
|
548
|
+
|
|
549
|
+
# Multi-engine quorum analysis
|
|
550
|
+
bin/raictl adopt --api --quorum
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
## Adding a New Engine
|
|
554
|
+
|
|
555
|
+
1. Create directory: `lib/rosett_ai/engines/<name>/`
|
|
556
|
+
2. Implement `backend.rb` (required)
|
|
557
|
+
3. Optionally add `detector.rb`, `executor.rb`, `manifest.yml`
|
|
558
|
+
4. Register in `lib/rosett_ai/engines/registry.rb`
|
|
559
|
+
5. Add target profile in `conf/targets/<name>.yml` (if different output dir)
|
|
560
|
+
6. Add specs in `spec/rosett_ai/engines/<name>/`
|
|
561
|
+
7. Use shared examples: `it_behaves_like 'a compiler backend'`
|
|
562
|
+
|
|
563
|
+
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide.
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
*Generated: 2026-03-02 | rosett-ai v1.0.0*
|