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/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,920 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## System Overview
|
|
4
|
+
|
|
5
|
+
raictl (Rosett-AI) is an engine-agnostic configuration management tool.
|
|
6
|
+
It separates **human intent** (generic YAML) from **engine translation** (tool-specific
|
|
7
|
+
compilation) from **tool-native output** (deployed files).
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
graph TB
|
|
11
|
+
subgraph Layer1["Layer 1: Human Intent"]
|
|
12
|
+
BEHAV["conf/behaviour/*.yml<br/>Operational rules"]
|
|
13
|
+
DESIGN["conf/design/*.yml<br/>Design documents"]
|
|
14
|
+
TOOL["conf/tooling/*.yml<br/>CI tooling"]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
subgraph Layer2["Layer 2: Engine Translation"]
|
|
18
|
+
PIPELINE["Compiler::CompilationPipeline"]
|
|
19
|
+
BACKEND["Engine Backend"]
|
|
20
|
+
MANIFEST["Engine Manifest"]
|
|
21
|
+
PROFILE["Target Profile"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
subgraph Layer3["Layer 3: Tool-Native Output"]
|
|
25
|
+
CLAUDE_OUT["~/.claude/rules/*.md"]
|
|
26
|
+
CURSOR_OUT[".cursorrules"]
|
|
27
|
+
COPILOT_OUT[".github/copilot-instructions.md"]
|
|
28
|
+
WINDSURF_OUT[".windsurfrules"]
|
|
29
|
+
AGENTS_OUT["./AGENTS.md"]
|
|
30
|
+
GOOSE_OUT[".goosehints"]
|
|
31
|
+
AIDER_OUT["CONVENTIONS.md"]
|
|
32
|
+
OLLAMA_OUT["Ollama modelfile"]
|
|
33
|
+
NEOX_OUT["vLLM prompt"]
|
|
34
|
+
GENERIC_OUT["*.md (generic)"]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
BEHAV --> PIPELINE
|
|
38
|
+
DESIGN --> PIPELINE
|
|
39
|
+
TOOL --> PIPELINE
|
|
40
|
+
PIPELINE --> BACKEND
|
|
41
|
+
MANIFEST --> BACKEND
|
|
42
|
+
PROFILE --> BACKEND
|
|
43
|
+
BACKEND --> CLAUDE_OUT
|
|
44
|
+
BACKEND --> CURSOR_OUT
|
|
45
|
+
BACKEND --> COPILOT_OUT
|
|
46
|
+
BACKEND --> WINDSURF_OUT
|
|
47
|
+
BACKEND --> AGENTS_OUT
|
|
48
|
+
BACKEND --> GOOSE_OUT
|
|
49
|
+
BACKEND --> AIDER_OUT
|
|
50
|
+
BACKEND --> OLLAMA_OUT
|
|
51
|
+
BACKEND --> NEOX_OUT
|
|
52
|
+
BACKEND --> GENERIC_OUT
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Class Hierarchy
|
|
56
|
+
|
|
57
|
+
### Core Module Tree
|
|
58
|
+
|
|
59
|
+
```mermaid
|
|
60
|
+
classDiagram
|
|
61
|
+
direction TB
|
|
62
|
+
|
|
63
|
+
class RosettAi {
|
|
64
|
+
+root() Pathname
|
|
65
|
+
+logger() Logger
|
|
66
|
+
+VERSION String
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
class Configuration {
|
|
70
|
+
+settings() Hash
|
|
71
|
+
+local_settings() Hash
|
|
72
|
+
+merged_settings() Hash
|
|
73
|
+
+behaviour_files() Array
|
|
74
|
+
+reload!()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
class PathResolver {
|
|
78
|
+
+claude_home() Pathname
|
|
79
|
+
+claude_rules_dir() Pathname
|
|
80
|
+
+rai_config_home() Pathname
|
|
81
|
+
+project_claude_md() Pathname
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
class RaiConfig {
|
|
85
|
+
+load() Hash
|
|
86
|
+
+default_engine String
|
|
87
|
+
+cache_enabled Boolean
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
class YamlLoader {
|
|
91
|
+
+load_file(path) Hash
|
|
92
|
+
-check_file_size!(path)
|
|
93
|
+
-check_depth!(data)
|
|
94
|
+
-check_key_count!(data)
|
|
95
|
+
MAX_FILE_SIZE = 1MB
|
|
96
|
+
MAX_NESTING = 10
|
|
97
|
+
MAX_KEYS = 1000
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
class TextSanitizer {
|
|
101
|
+
+sanitize(text) String
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
RosettAi --> Configuration
|
|
105
|
+
RosettAi --> PathResolver
|
|
106
|
+
RosettAi --> RaiConfig
|
|
107
|
+
RosettAi --> YamlLoader
|
|
108
|
+
RosettAi --> TextSanitizer
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Compiler Pipeline
|
|
112
|
+
|
|
113
|
+
```mermaid
|
|
114
|
+
classDiagram
|
|
115
|
+
direction TB
|
|
116
|
+
|
|
117
|
+
class CompilationPipeline {
|
|
118
|
+
+compile(behaviours, engine) Array~CompiledOutput~
|
|
119
|
+
+compile_all(engine) Array~CompiledOutput~
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
class BehaviourCompiler {
|
|
123
|
+
+compile(behaviour, backend) CompiledOutput
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
class CompiledOutput {
|
|
127
|
+
+filename String
|
|
128
|
+
+content String
|
|
129
|
+
+source String
|
|
130
|
+
+category String
|
|
131
|
+
+name String
|
|
132
|
+
+version String
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
class Backend {
|
|
136
|
+
<<abstract>>
|
|
137
|
+
+render(behaviour) String
|
|
138
|
+
+file_extension() String
|
|
139
|
+
+metadata_comment(source, category, version) String
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
class TargetProfile {
|
|
143
|
+
+name String
|
|
144
|
+
+output_dir Pathname
|
|
145
|
+
+file_extension String
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
class LocaleCompiler {
|
|
149
|
+
+compile(locale, format) String
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
CompilationPipeline --> BehaviourCompiler
|
|
153
|
+
CompilationPipeline --> TargetProfile
|
|
154
|
+
BehaviourCompiler --> Backend
|
|
155
|
+
BehaviourCompiler --> CompiledOutput
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Engine Backends
|
|
159
|
+
|
|
160
|
+
```mermaid
|
|
161
|
+
classDiagram
|
|
162
|
+
direction TB
|
|
163
|
+
|
|
164
|
+
class Backend {
|
|
165
|
+
<<abstract>>
|
|
166
|
+
+render(behaviour) String
|
|
167
|
+
+file_extension() String
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
class ClaudeBackend {
|
|
171
|
+
+render(behaviour) String
|
|
172
|
+
+file_extension() ".md"
|
|
173
|
+
-metadata_header(source, category, version) String
|
|
174
|
+
-priority_annotation(rule) String
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
class AgentsMdBackend {
|
|
178
|
+
+render(behaviour) String
|
|
179
|
+
+file_extension() ".md"
|
|
180
|
+
-bullet_list_rules(rules) String
|
|
181
|
+
-instructions_heading() String
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
class GenericBackend {
|
|
185
|
+
+render(behaviour) String
|
|
186
|
+
+file_extension() ".md"
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
class OllamaBackend {
|
|
190
|
+
+render(behaviour) String
|
|
191
|
+
+file_extension() ".txt"
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
class GptNeoxBackend {
|
|
195
|
+
+render(behaviour) String
|
|
196
|
+
+file_extension() ".txt"
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
class GooseBackend {
|
|
200
|
+
+render(behaviour) String
|
|
201
|
+
+file_extension() ".md"
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
class AiderBackend {
|
|
205
|
+
+render(behaviour) String
|
|
206
|
+
+file_extension() ".md"
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
class CursorBackend {
|
|
210
|
+
+render(behaviour) String
|
|
211
|
+
+file_extension() ".md"
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
class CopilotBackend {
|
|
215
|
+
+render(behaviour) String
|
|
216
|
+
+file_extension() ".md"
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
class WindsurfBackend {
|
|
220
|
+
+render(behaviour) String
|
|
221
|
+
+file_extension() ".md"
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
Backend <|-- ClaudeBackend
|
|
225
|
+
Backend <|-- AgentsMdBackend
|
|
226
|
+
Backend <|-- GenericBackend
|
|
227
|
+
Backend <|-- OllamaBackend
|
|
228
|
+
Backend <|-- GptNeoxBackend
|
|
229
|
+
Backend <|-- GooseBackend
|
|
230
|
+
Backend <|-- AiderBackend
|
|
231
|
+
Backend <|-- CursorBackend
|
|
232
|
+
Backend <|-- CopilotBackend
|
|
233
|
+
Backend <|-- WindsurfBackend
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Validator Hierarchy
|
|
237
|
+
|
|
238
|
+
```mermaid
|
|
239
|
+
classDiagram
|
|
240
|
+
direction TB
|
|
241
|
+
|
|
242
|
+
class SchemaValidator {
|
|
243
|
+
+valid?(path) Boolean
|
|
244
|
+
+validate(path) Array~String~
|
|
245
|
+
+errors Array~String~
|
|
246
|
+
-load_schema() Hash
|
|
247
|
+
-validate_schema(content)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
class BehaviourValidator {
|
|
251
|
+
schema = "behaviour_schema.json"
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
class DesignValidator {
|
|
255
|
+
schema = "design_schema.json"
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
class ToolingValidator {
|
|
259
|
+
schema = "tooling_schema.json"
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
SchemaValidator <|-- BehaviourValidator
|
|
263
|
+
SchemaValidator <|-- DesignValidator
|
|
264
|
+
SchemaValidator <|-- ToolingValidator
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### UI Adapter Registry
|
|
268
|
+
|
|
269
|
+
```mermaid
|
|
270
|
+
classDiagram
|
|
271
|
+
direction TB
|
|
272
|
+
|
|
273
|
+
class Registry {
|
|
274
|
+
+register(name, klass)$
|
|
275
|
+
+resolve(name) Base
|
|
276
|
+
+available() Array~String~
|
|
277
|
+
+registered?(name) Boolean
|
|
278
|
+
+reset!()
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
class Base {
|
|
282
|
+
<<abstract>>
|
|
283
|
+
+display_table(data)
|
|
284
|
+
+display_list(data)
|
|
285
|
+
+prompt_confirm(message) Boolean
|
|
286
|
+
+spinner(message)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
class Tui {
|
|
290
|
+
Rainbow + TTY integration
|
|
291
|
+
}
|
|
292
|
+
class AccessibleTui {
|
|
293
|
+
Screen reader compatible
|
|
294
|
+
}
|
|
295
|
+
class Gtk4 {
|
|
296
|
+
GTK4/Adwaita adapter
|
|
297
|
+
}
|
|
298
|
+
class Qt6 {
|
|
299
|
+
Qt6 adapter
|
|
300
|
+
}
|
|
301
|
+
class Kde {
|
|
302
|
+
KDE KCM adapter
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
Registry --> Base
|
|
306
|
+
Base <|-- Tui
|
|
307
|
+
Base <|-- AccessibleTui
|
|
308
|
+
Base <|-- Gtk4
|
|
309
|
+
Base <|-- Qt6
|
|
310
|
+
Base <|-- Kde
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Licensing System
|
|
314
|
+
|
|
315
|
+
```mermaid
|
|
316
|
+
classDiagram
|
|
317
|
+
direction TB
|
|
318
|
+
|
|
319
|
+
class LicenseKey {
|
|
320
|
+
+decode(key_string) Hash
|
|
321
|
+
+valid?() Boolean
|
|
322
|
+
+tier() String
|
|
323
|
+
+expired?() Boolean
|
|
324
|
+
+within_grace?() Boolean
|
|
325
|
+
PUBLIC_KEY Ed25519
|
|
326
|
+
GRACE_PERIOD = 14d
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
class LicenseValidator {
|
|
330
|
+
+validate(key) Result
|
|
331
|
+
+tier_for(key) Tier
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
class LicenseStore {
|
|
335
|
+
+save(key)
|
|
336
|
+
+load() LicenseKey
|
|
337
|
+
+remove()
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
class Tier {
|
|
341
|
+
+name String
|
|
342
|
+
+features Array
|
|
343
|
+
FREE = "free"
|
|
344
|
+
PRO = "pro"
|
|
345
|
+
ENTERPRISE = "enterprise"
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
LicenseValidator --> LicenseKey
|
|
349
|
+
LicenseValidator --> LicenseStore
|
|
350
|
+
LicenseValidator --> Tier
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Engine Architecture
|
|
354
|
+
|
|
355
|
+
### Engine Component Structure
|
|
356
|
+
|
|
357
|
+
Each engine is a separate gem (`rosett-ai-engine-<name>`) with optional components,
|
|
358
|
+
discovered at runtime by `RosettAi::Plugins::Registry.discover!`:
|
|
359
|
+
|
|
360
|
+
```mermaid
|
|
361
|
+
graph TB
|
|
362
|
+
subgraph Core["rosett-ai core"]
|
|
363
|
+
REG["RosettAi::Plugins::Registry<br/>discover! / register / resolve"]
|
|
364
|
+
BASE["Base classes:<br/>Compiler::Backend<br/>Engines::Detector<br/>Engines::BaseConfigCompiler"]
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
subgraph Gems["External Engine Gems (rosett-ai-engine-*)"]
|
|
368
|
+
GEM_CLAUDE["rosett-ai-engine-claude<br/>backend, detector, executor,<br/>config_compiler, key_map, scope_router"]
|
|
369
|
+
GEM_GENERIC["rosett-ai-engine-generic<br/>backend"]
|
|
370
|
+
GEM_AGENTS["rosett-ai-engine-agents-md<br/>backend, detector"]
|
|
371
|
+
GEM_OTHERS["rosett-ai-engine-{cursor,copilot,windsurf}<br/>backend, detector"]
|
|
372
|
+
GEM_EXEC["rosett-ai-engine-{goose,aider,ollama,gpt-neox}<br/>backend, detector, executor"]
|
|
373
|
+
GEM_ACME["rosett-ai-engine-acme (example)<br/>backend, detector"]
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
REG -->|Gem.find_files| Gems
|
|
377
|
+
BASE -.->|inherits| Gems
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Engine Detection Flow
|
|
381
|
+
|
|
382
|
+
```mermaid
|
|
383
|
+
flowchart TD
|
|
384
|
+
A[bin/raictl engines detect] --> B[Load all manifests]
|
|
385
|
+
B --> C{For each engine}
|
|
386
|
+
C --> D[Check cli_binary in PATH]
|
|
387
|
+
D --> E{Found?}
|
|
388
|
+
E -->|Yes| F[Check config_dir exists]
|
|
389
|
+
E -->|No| G[Mark not detected]
|
|
390
|
+
F --> H{Exists?}
|
|
391
|
+
H -->|Yes| I[Mark detected + available]
|
|
392
|
+
H -->|No| J[Mark partially detected]
|
|
393
|
+
G --> C
|
|
394
|
+
I --> C
|
|
395
|
+
J --> C
|
|
396
|
+
C -->|Done| K[Return detection results]
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Compilation Pipeline
|
|
400
|
+
|
|
401
|
+
```mermaid
|
|
402
|
+
sequenceDiagram
|
|
403
|
+
participant User
|
|
404
|
+
participant CLI as Thor::CLI
|
|
405
|
+
participant Pipeline as CompilationPipeline
|
|
406
|
+
participant Loader as YamlLoader
|
|
407
|
+
participant Backend as Engine::Backend
|
|
408
|
+
participant FS as Filesystem
|
|
409
|
+
|
|
410
|
+
User->>CLI: bin/raictl compile --engine agents_md
|
|
411
|
+
CLI->>Pipeline: compile_all(engine: "agents_md")
|
|
412
|
+
Pipeline->>Loader: load_file(conf/behaviour/*.yml)
|
|
413
|
+
Loader-->>Pipeline: behaviour_data[]
|
|
414
|
+
|
|
415
|
+
loop Each behaviour
|
|
416
|
+
Pipeline->>Backend: render(behaviour)
|
|
417
|
+
Backend-->>Pipeline: CompiledOutput
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
Pipeline->>FS: write(output_dir/filename)
|
|
421
|
+
FS-->>Pipeline: success
|
|
422
|
+
Pipeline-->>CLI: results[]
|
|
423
|
+
CLI-->>User: "Compiled 5 files to ./AGENTS.md"
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Desktop Architecture
|
|
427
|
+
|
|
428
|
+
### D-Bus Service Stack
|
|
429
|
+
|
|
430
|
+
```mermaid
|
|
431
|
+
graph TB
|
|
432
|
+
subgraph Apps["Desktop Applications"]
|
|
433
|
+
GTK4_APP["GTK4 App<br/>(RosettAi::Desktop::Gtk4App)"]
|
|
434
|
+
QT6_APP["Qt6 App<br/>(future)"]
|
|
435
|
+
THIRD["Third-party clients"]
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
subgraph IPC["D-Bus Session Bus"]
|
|
439
|
+
BUS["be.neatnerds.rosettai<br/>/be/neatnerds/rosett-ai"]
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
subgraph Service["D-Bus Service"]
|
|
443
|
+
MGR["ManagerInterface<br/>Compile, SwitchContext, GetStatus"]
|
|
444
|
+
FOCUS_IF["FocusMonitorInterface<br/>GetCurrentFocus, FocusChanged signal"]
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
subgraph Adapters["Focus Adapters"]
|
|
448
|
+
GNOME["GnomeAdapter"]
|
|
449
|
+
KWIN["KwinAdapter"]
|
|
450
|
+
I3["I3Adapter"]
|
|
451
|
+
HYPR["HyprlandAdapter"]
|
|
452
|
+
X11["X11Adapter"]
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
subgraph Detect["CompositorDetector"]
|
|
456
|
+
DET["detect() -> :gnome | :kde | :i3 | :hyprland | :x11"]
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
GTK4_APP -->|D-Bus calls| BUS
|
|
460
|
+
QT6_APP -->|D-Bus calls| BUS
|
|
461
|
+
THIRD -->|D-Bus calls| BUS
|
|
462
|
+
BUS --> MGR
|
|
463
|
+
BUS --> FOCUS_IF
|
|
464
|
+
FOCUS_IF --> GNOME
|
|
465
|
+
FOCUS_IF --> KWIN
|
|
466
|
+
FOCUS_IF --> I3
|
|
467
|
+
FOCUS_IF --> HYPR
|
|
468
|
+
FOCUS_IF --> X11
|
|
469
|
+
DET --> FOCUS_IF
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### GTK4 Safety Architecture
|
|
473
|
+
|
|
474
|
+
```mermaid
|
|
475
|
+
flowchart TB
|
|
476
|
+
subgraph UserAction["User Interaction"]
|
|
477
|
+
CLICK["Button Click"]
|
|
478
|
+
MENU["Menu Selection"]
|
|
479
|
+
PREF["Preference Change"]
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
subgraph Safety["Safety Wrappers"]
|
|
483
|
+
SA["safe_action(name)"]
|
|
484
|
+
SC["safe_callback(name)"]
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
subgraph Logging["GuiLogger"]
|
|
488
|
+
LOG["JSON Lines Output"]
|
|
489
|
+
FILE["Log File"]
|
|
490
|
+
STDERR["stderr"]
|
|
491
|
+
end
|
|
492
|
+
|
|
493
|
+
subgraph Error["Error Handling"]
|
|
494
|
+
RESCUE["rescue StandardError"]
|
|
495
|
+
DIALOG["show_error_dialog()"]
|
|
496
|
+
TOAST["show_toast()"]
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
subgraph Logic["Business Logic"]
|
|
500
|
+
DBUS["DbusClient<br/>(never raises)"]
|
|
501
|
+
DEFAULTS["Safe Defaults<br/>SAFE_STATUS, SAFE_FOCUS"]
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
CLICK --> SA
|
|
505
|
+
MENU --> SA
|
|
506
|
+
PREF --> SC
|
|
507
|
+
SA --> LOG
|
|
508
|
+
SC --> LOG
|
|
509
|
+
LOG --> FILE
|
|
510
|
+
LOG --> STDERR
|
|
511
|
+
SA --> RESCUE
|
|
512
|
+
SC --> RESCUE
|
|
513
|
+
RESCUE -->|success| Logic
|
|
514
|
+
RESCUE -->|error| DIALOG
|
|
515
|
+
DIALOG --> TOAST
|
|
516
|
+
DBUS --> DEFAULTS
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
## Configuration Flow
|
|
520
|
+
|
|
521
|
+
### Configuration Hierarchy
|
|
522
|
+
|
|
523
|
+
```mermaid
|
|
524
|
+
flowchart LR
|
|
525
|
+
subgraph Sources["Configuration Sources"]
|
|
526
|
+
direction TB
|
|
527
|
+
S1["settings.json<br/>(global)"]
|
|
528
|
+
S2["settings.local.json<br/>(local overrides)"]
|
|
529
|
+
S3["Group CLAUDE.md"]
|
|
530
|
+
S4["Project CLAUDE.md"]
|
|
531
|
+
end
|
|
532
|
+
|
|
533
|
+
subgraph Merge["Deep Merge"]
|
|
534
|
+
M["Later overrides earlier"]
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
subgraph Output["Effective Config"]
|
|
538
|
+
O["Merged settings"]
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
S1 --> M
|
|
542
|
+
S2 --> M
|
|
543
|
+
S3 --> M
|
|
544
|
+
S4 --> M
|
|
545
|
+
M --> O
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### Path Resolution
|
|
549
|
+
|
|
550
|
+
```mermaid
|
|
551
|
+
flowchart TB
|
|
552
|
+
subgraph PathResolver
|
|
553
|
+
direction TB
|
|
554
|
+
CLAUDE_DOMAIN["Claude Domain<br/>~/.claude/"]
|
|
555
|
+
RAI_DOMAIN["rosett-ai Domain (XDG)<br/>~/.config/rosett-ai/"]
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
subgraph Claude["Claude Paths"]
|
|
559
|
+
CR["~/.claude/rules/"]
|
|
560
|
+
CS["~/.claude/settings.json"]
|
|
561
|
+
CM["./CLAUDE.md"]
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
subgraph NNCC["rosett-ai Paths"]
|
|
565
|
+
NC["~/.config/rosett-ai/config.yml"]
|
|
566
|
+
NB["~/.config/rosett-ai/conf/behaviour/"]
|
|
567
|
+
ND["~/.config/rosett-ai/conf/design/"]
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
subgraph EngineNative["Engine-Native Paths"]
|
|
571
|
+
EN1["~/.claude/rules/ (Claude)"]
|
|
572
|
+
EN2["./AGENTS.md (AGENTS.md)"]
|
|
573
|
+
EN3["./.cursorrules (Cursor)"]
|
|
574
|
+
EN4["./.github/copilot-instructions.md"]
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
CLAUDE_DOMAIN --> Claude
|
|
578
|
+
RAI_DOMAIN --> NNCC
|
|
579
|
+
PathResolver --> EngineNative
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
## Dependency Graph
|
|
583
|
+
|
|
584
|
+
### Runtime Dependencies
|
|
585
|
+
|
|
586
|
+
```mermaid
|
|
587
|
+
graph LR
|
|
588
|
+
NNCC((rosett-ai))
|
|
589
|
+
NNCC --> ZEIT[zeitwerk ~> 2.6]
|
|
590
|
+
NNCC --> THOR[thor ~> 1.3]
|
|
591
|
+
NNCC --> RAIN[rainbow ~> 3.1]
|
|
592
|
+
NNCC --> JSCH[json_schemer ~> 0.2]
|
|
593
|
+
NNCC --> JWT[jwt ~> 2.8]
|
|
594
|
+
NNCC --> ED25[ed25519 ~> 1.3]
|
|
595
|
+
NNCC --> RDBUS[ruby-dbus ~> 0.24]
|
|
596
|
+
NNCC --> I18N[i18n ~> 1.14]
|
|
597
|
+
|
|
598
|
+
subgraph Optional
|
|
599
|
+
ANTH[anthropic ~> 1.16]
|
|
600
|
+
ADW[adwaita ~> 4.3]
|
|
601
|
+
FPM[fpm ~> 1.17]
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
NNCC -.->|engines group| ANTH
|
|
605
|
+
NNCC -.->|desktop group| ADW
|
|
606
|
+
NNCC -.->|build group| FPM
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
### Development Dependencies
|
|
610
|
+
|
|
611
|
+
```mermaid
|
|
612
|
+
graph LR
|
|
613
|
+
DEV((dev/test))
|
|
614
|
+
DEV --> RSPEC[rspec]
|
|
615
|
+
DEV --> RCOP[rubocop<br/>+ plugins]
|
|
616
|
+
DEV --> REEK[reek]
|
|
617
|
+
DEV --> MUTANT[mutant-rspec]
|
|
618
|
+
DEV --> SIMP[simplecov]
|
|
619
|
+
DEV --> FBOT[factory_bot]
|
|
620
|
+
DEV --> RANTLY[rantly]
|
|
621
|
+
DEV --> AUDIT[bundler-audit<br/>ruby_audit]
|
|
622
|
+
DEV --> FLAY[flay]
|
|
623
|
+
DEV --> YARD[yard]
|
|
624
|
+
DEV --> RONN[ronn-ng]
|
|
625
|
+
DEV --> WEBM[webmock]
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
## Git History
|
|
629
|
+
|
|
630
|
+
### Commit Timeline
|
|
631
|
+
|
|
632
|
+
```mermaid
|
|
633
|
+
gitgraph
|
|
634
|
+
commit id: "init" tag: "v0.1.0"
|
|
635
|
+
branch critical_thinking
|
|
636
|
+
commit id: "criticalthinking"
|
|
637
|
+
checkout main
|
|
638
|
+
merge critical_thinking
|
|
639
|
+
commit id: "adopt+backup"
|
|
640
|
+
branch packaging_fpm
|
|
641
|
+
commit id: "fpm packaging"
|
|
642
|
+
checkout main
|
|
643
|
+
merge packaging_fpm
|
|
644
|
+
commit id: "tooling"
|
|
645
|
+
commit id: "ci fixes"
|
|
646
|
+
branch design_implementation
|
|
647
|
+
commit id: "design docs P1-P5"
|
|
648
|
+
checkout main
|
|
649
|
+
merge design_implementation
|
|
650
|
+
commit id: "desktop+refs"
|
|
651
|
+
commit id: "ADR-007" tag: "v1.0.0"
|
|
652
|
+
branch engine/0a-rename
|
|
653
|
+
commit id: "rename to rosett-ai"
|
|
654
|
+
checkout main
|
|
655
|
+
branch engine/0b-dirs
|
|
656
|
+
commit id: "engine dirs"
|
|
657
|
+
checkout main
|
|
658
|
+
branch engine/0c-xdg
|
|
659
|
+
commit id: "XDG+detect"
|
|
660
|
+
checkout main
|
|
661
|
+
branch engine/1-agents-md
|
|
662
|
+
commit id: "AGENTS.md engine"
|
|
663
|
+
checkout main
|
|
664
|
+
merge engine/1-agents-md
|
|
665
|
+
commit id: "D-Bus service"
|
|
666
|
+
commit id: "GTK4 app"
|
|
667
|
+
commit id: "Ollama+GPT-NeoX"
|
|
668
|
+
commit id: "merge D2+E2"
|
|
669
|
+
commit id: "GTK4 hardening"
|
|
670
|
+
branch backfill/quorum-module
|
|
671
|
+
commit id: "executor normalize"
|
|
672
|
+
commit id: "capability checker"
|
|
673
|
+
commit id: "quorum module"
|
|
674
|
+
checkout main
|
|
675
|
+
merge backfill/quorum-module
|
|
676
|
+
branch backfill/dbus-desktop
|
|
677
|
+
commit id: "D-Bus stop+SNI+prefs"
|
|
678
|
+
checkout main
|
|
679
|
+
merge backfill/dbus-desktop
|
|
680
|
+
branch documentation
|
|
681
|
+
commit id: "docs update"
|
|
682
|
+
checkout main
|
|
683
|
+
merge documentation
|
|
684
|
+
branch engine/3-goose-aider
|
|
685
|
+
commit id: "Goose+Aider compile"
|
|
686
|
+
checkout main
|
|
687
|
+
merge engine/3-goose-aider
|
|
688
|
+
branch refactor/consistency-review
|
|
689
|
+
commit id: "consistency review"
|
|
690
|
+
checkout main
|
|
691
|
+
merge refactor/consistency-review
|
|
692
|
+
branch engine/4-cursor-copilot-windsurf
|
|
693
|
+
commit id: "Cursor+Copilot+Windsurf"
|
|
694
|
+
commit id: "Goose+Aider executors"
|
|
695
|
+
checkout main
|
|
696
|
+
merge engine/4-cursor-copilot-windsurf
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
### Key Milestones
|
|
700
|
+
|
|
701
|
+
```mermaid
|
|
702
|
+
timeline
|
|
703
|
+
title rosett-ai Project History
|
|
704
|
+
section Foundation
|
|
705
|
+
Feb 2026 : Initial CLI
|
|
706
|
+
: Behaviour management
|
|
707
|
+
: Adopt command
|
|
708
|
+
: Backup system
|
|
709
|
+
section Design
|
|
710
|
+
Feb 18 : FPM packaging
|
|
711
|
+
Feb 19 : Testing infrastructure
|
|
712
|
+
Feb 20 : Security + Styles
|
|
713
|
+
Feb 21 : Architecture P1-P5
|
|
714
|
+
: CI Pipeline
|
|
715
|
+
: Compiler pipeline
|
|
716
|
+
section v1.0.0 Pivot
|
|
717
|
+
Feb 26 : ADR-007 Engine-agnostic
|
|
718
|
+
: Rename to rosett-ai
|
|
719
|
+
: Engine directories
|
|
720
|
+
: XDG + detection
|
|
721
|
+
: AGENTS.md engine
|
|
722
|
+
section Desktop + Engines
|
|
723
|
+
Feb 27-28 : D-Bus service
|
|
724
|
+
: GTK4/Adwaita app
|
|
725
|
+
: Ollama engine
|
|
726
|
+
: GPT-NeoX engine
|
|
727
|
+
: GTK4 hardening
|
|
728
|
+
section Backfill + Engine 3
|
|
729
|
+
Feb 28 : Executor normalization
|
|
730
|
+
: Capability checker
|
|
731
|
+
: Quorum module
|
|
732
|
+
: D-Bus stop command
|
|
733
|
+
: StatusNotifierItem
|
|
734
|
+
: GTK4 preference callbacks
|
|
735
|
+
: Documentation (40 diagrams)
|
|
736
|
+
: Goose + Aider compilation
|
|
737
|
+
: Consistency review
|
|
738
|
+
section Engine 4
|
|
739
|
+
Mar 2 : Cursor engine
|
|
740
|
+
: Copilot engine
|
|
741
|
+
: Windsurf engine
|
|
742
|
+
: Goose CLI executor
|
|
743
|
+
: Aider CLI executor
|
|
744
|
+
: 10 engines total
|
|
745
|
+
section v1.0.0 Release
|
|
746
|
+
Mar 4 : Operations design domain
|
|
747
|
+
: Monitoring + optimization docs
|
|
748
|
+
: SimpleCov thresholds
|
|
749
|
+
: CI pipeline hardening
|
|
750
|
+
: Core-only gemspec split
|
|
751
|
+
: ADR-009 core release
|
|
752
|
+
Mar 5 : Security scan hardening
|
|
753
|
+
: AI provenance documentation
|
|
754
|
+
: Full quality gate verification
|
|
755
|
+
: v1.0.0 tagged
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
### Backfill Branches
|
|
759
|
+
|
|
760
|
+
Between Engine Phase 2 and Engine Phase 3, six gaps from earlier phases were
|
|
761
|
+
addressed across two backfill branches:
|
|
762
|
+
|
|
763
|
+
| Branch | Items | Merged |
|
|
764
|
+
|--------|-------|--------|
|
|
765
|
+
| `backfill/quorum-module` | ExecutorResolver, CapabilityChecker, Quorum module | Fast-forward into main |
|
|
766
|
+
| `backfill/dbus-desktop` | D-Bus stop, StatusNotifierItem, GTK4 preferences | Merge commit into main |
|
|
767
|
+
|
|
768
|
+
The intermediate branches `backfill/executor-normalize` and
|
|
769
|
+
`backfill/capability-checker` were subsets rolled into `backfill/quorum-module`.
|
|
770
|
+
|
|
771
|
+
```mermaid
|
|
772
|
+
flowchart LR
|
|
773
|
+
subgraph BF1["backfill/quorum-module"]
|
|
774
|
+
direction TB
|
|
775
|
+
E1["fix: normalize executor<br/>interface across engines"]
|
|
776
|
+
E2["feat: capability warnings<br/>during compilation"]
|
|
777
|
+
E3["feat: quorum multi-engine<br/>adopt analysis"]
|
|
778
|
+
E1 --> E2 --> E3
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
subgraph BF2["backfill/dbus-desktop"]
|
|
782
|
+
direction TB
|
|
783
|
+
D1["feat: D-Bus stop command"]
|
|
784
|
+
D2["feat: StatusNotifierItem"]
|
|
785
|
+
D3["feat: GTK4 preference callbacks"]
|
|
786
|
+
D1 --- D2 --- D3
|
|
787
|
+
end
|
|
788
|
+
|
|
789
|
+
MAIN1["main<br/>(GTK4 hardening)"] --> BF1
|
|
790
|
+
MAIN1 --> BF2
|
|
791
|
+
BF1 --> MAIN2["main<br/>(merged)"]
|
|
792
|
+
BF2 --> MAIN2
|
|
793
|
+
|
|
794
|
+
style BF1 fill:#e6ffe6,stroke:#333
|
|
795
|
+
style BF2 fill:#e6f3ff,stroke:#333
|
|
796
|
+
```
|
|
797
|
+
|
|
798
|
+
## Security Architecture
|
|
799
|
+
|
|
800
|
+
### Trust Boundaries
|
|
801
|
+
|
|
802
|
+
```mermaid
|
|
803
|
+
flowchart TB
|
|
804
|
+
subgraph Untrusted["Untrusted Input"]
|
|
805
|
+
YAML_IN["YAML files"]
|
|
806
|
+
USER_IN["CLI arguments"]
|
|
807
|
+
DBUS_IN["D-Bus messages"]
|
|
808
|
+
API_IN["API responses"]
|
|
809
|
+
end
|
|
810
|
+
|
|
811
|
+
subgraph Validation["Validation Layer"]
|
|
812
|
+
YL["YamlLoader<br/>Size + depth + key limits"]
|
|
813
|
+
SV["SchemaValidator<br/>JSON Schema checks"]
|
|
814
|
+
TS["TextSanitizer<br/>Content filtering"]
|
|
815
|
+
RC["RuboCop Cops<br/>ShellInterpolation<br/>UnsafeYamlLoad"]
|
|
816
|
+
end
|
|
817
|
+
|
|
818
|
+
subgraph Trusted["Trusted Core"]
|
|
819
|
+
COMP_T["Compiler"]
|
|
820
|
+
CONFIG_T["Configuration"]
|
|
821
|
+
LICENSE_T["License Validator"]
|
|
822
|
+
end
|
|
823
|
+
|
|
824
|
+
subgraph Output["Output Boundaries"]
|
|
825
|
+
FS_OUT["Filesystem<br/>(whitelisted dirs only)"]
|
|
826
|
+
DBUS_OUT["D-Bus signals"]
|
|
827
|
+
LOG_OUT["Logs<br/>(no secrets)"]
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
YAML_IN --> YL
|
|
831
|
+
USER_IN --> TS
|
|
832
|
+
DBUS_IN --> SV
|
|
833
|
+
API_IN --> TS
|
|
834
|
+
YL --> Trusted
|
|
835
|
+
SV --> Trusted
|
|
836
|
+
TS --> Trusted
|
|
837
|
+
Trusted --> FS_OUT
|
|
838
|
+
Trusted --> DBUS_OUT
|
|
839
|
+
Trusted --> LOG_OUT
|
|
840
|
+
```
|
|
841
|
+
|
|
842
|
+
### Security Rules
|
|
843
|
+
|
|
844
|
+
| Rule | Enforcement |
|
|
845
|
+
|------|-------------|
|
|
846
|
+
| YAML.safe_load only | Custom RuboCop cop `RosettAi/UnsafeYamlLoad` |
|
|
847
|
+
| Array-form system() | Custom RuboCop cop `RosettAi/ShellInterpolation` |
|
|
848
|
+
| File writes to whitelisted dirs | PathResolver + Configuration |
|
|
849
|
+
| Secrets never logged | MaskingSecretResolver |
|
|
850
|
+
| Secrets 0600 permissions | LicenseStore |
|
|
851
|
+
| Max YAML size 1MB | YamlLoader |
|
|
852
|
+
| Max YAML nesting 10 | YamlLoader |
|
|
853
|
+
| Max YAML keys 1000 | YamlLoader |
|
|
854
|
+
| Ed25519-signed JWT | LicenseKey |
|
|
855
|
+
|
|
856
|
+
## Test Architecture
|
|
857
|
+
|
|
858
|
+
```mermaid
|
|
859
|
+
pie title Test Distribution (119 spec files, 1574 examples)
|
|
860
|
+
"Thor CLI Tasks" : 18
|
|
861
|
+
"Engine Backends" : 17
|
|
862
|
+
"Compiler" : 6
|
|
863
|
+
"D-Bus + Desktop" : 8
|
|
864
|
+
"Validators" : 4
|
|
865
|
+
"Licensing" : 4
|
|
866
|
+
"Content" : 4
|
|
867
|
+
"Config" : 6
|
|
868
|
+
"UI" : 7
|
|
869
|
+
"Quorum" : 4
|
|
870
|
+
"Adopter" : 3
|
|
871
|
+
"Other (i18n, backup, etc.)" : 38
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
### Testing Strategy
|
|
875
|
+
|
|
876
|
+
```mermaid
|
|
877
|
+
flowchart LR
|
|
878
|
+
subgraph Unit["Unit Tests"]
|
|
879
|
+
RSPEC["RSpec<br/>1574 examples"]
|
|
880
|
+
end
|
|
881
|
+
|
|
882
|
+
subgraph Quality["Code Quality"]
|
|
883
|
+
RCOP2["RuboCop"]
|
|
884
|
+
REEK2["Reek"]
|
|
885
|
+
FLAY2["Flay"]
|
|
886
|
+
end
|
|
887
|
+
|
|
888
|
+
subgraph Mutation["Mutation Testing"]
|
|
889
|
+
MUT["Mutant<br/>97.83% coverage"]
|
|
890
|
+
end
|
|
891
|
+
|
|
892
|
+
subgraph Security2["Security"]
|
|
893
|
+
BA["bundler-audit"]
|
|
894
|
+
RA["ruby-audit"]
|
|
895
|
+
GL["gitleaks"]
|
|
896
|
+
end
|
|
897
|
+
|
|
898
|
+
subgraph Property["Property-Based"]
|
|
899
|
+
RANT["Rantly<br/>yaml_loader_property_spec"]
|
|
900
|
+
end
|
|
901
|
+
|
|
902
|
+
Unit --> Quality
|
|
903
|
+
Quality --> Mutation
|
|
904
|
+
Quality --> Security2
|
|
905
|
+
Unit --> Property
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
---
|
|
909
|
+
|
|
910
|
+
### Core-Only Packaging (ADR-009)
|
|
911
|
+
|
|
912
|
+
The v1.0.0 release ships as core-only. Desktop dependencies (`ruby-dbus`,
|
|
913
|
+
`i3ipc`) are moved to the `:desktop` Bundler group and excluded from the
|
|
914
|
+
gemspec. Zeitwerk conditionally ignores `rosett-ai/dbus` and `rosett-ai/desktop` when
|
|
915
|
+
`ruby-dbus` is unavailable. Desktop features are delivered via the separate
|
|
916
|
+
`rosett-ai-gtk4` package.
|
|
917
|
+
|
|
918
|
+
---
|
|
919
|
+
|
|
920
|
+
*Generated: 2026-03-05 | rosett-ai v1.0.0 | Branch: main*
|