rosett-ai 1.3.3 → 1.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +413 -22
- data/README.md +56 -42
- data/bin/raictl +13 -0
- data/conf/adopt_redactions.yml +2 -0
- data/conf/compliance/cra_rules.yml +2 -0
- data/conf/compliance/license_rules.yml +2 -0
- data/conf/mcp/server_defaults.yml +2 -0
- data/conf/mcp/trust.yml +1 -0
- data/conf/packaging/core.yml +2 -0
- data/conf/packaging/gtk4.yml +2 -0
- data/conf/packaging/qt6.yml +2 -0
- data/conf/policy/default_deny_list.yml +2 -0
- data/conf/review/cli-command-audit.yml +2 -0
- data/conf/review/design-docs.yml +2 -0
- data/conf/review/design-questionnaire.yml +2 -0
- data/conf/review/questionnaire.yml +2 -0
- data/conf/review/rosett-ai-core.yml +2 -0
- data/conf/schemas/ai_config_schema.json +14 -2
- data/conf/schemas/autoqueue.schema.json +153 -0
- data/conf/schemas/behaviour_schema.json +31 -7
- data/conf/schemas/compliance_rule_schema.json +17 -4
- data/conf/schemas/content_pack_manifest_schema.json +23 -4
- data/conf/schemas/design_schema.json +177 -42
- data/conf/schemas/engine_manifest_schema.json +22 -5
- data/conf/schemas/lockfile_schema.json +26 -4
- data/conf/schemas/mcp_server_schema.json +50 -9
- data/conf/schemas/packaging_schema.json +23 -5
- data/conf/schemas/policy_schema.json +35 -9
- data/conf/schemas/provenance_schema.json +33 -5
- data/conf/schemas/rai_config_schema.json +6 -2
- data/conf/schemas/rai_project_schema.json +8 -2
- data/conf/schemas/scope_hierarchy_schema.json +22 -5
- data/conf/schemas/target_schema.json +33 -6
- data/conf/schemas/tooling_schema.json +53 -12
- data/conf/schemas/workflow_schema.json +39 -9
- data/conf/targets/agents_md.yml +1 -0
- data/conf/targets/claude.yml +2 -0
- data/conf/tooling/tools.yml +2 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +5 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +40 -0
- data/lib/rosett_ai/ai_config/context_window.rb +3 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +1 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +1 -0
- data/lib/rosett_ai/ai_config/model_router.rb +1 -0
- data/lib/rosett_ai/ai_config/validator.rb +2 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +1 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +2 -0
- data/lib/rosett_ai/authorship/review_validator.rb +1 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +1 -0
- data/lib/rosett_ai/backup/compressor.rb +3 -0
- data/lib/rosett_ai/backup/destination.rb +1 -0
- data/lib/rosett_ai/behaviour/manager.rb +1 -0
- data/lib/rosett_ai/compiler/backend.rb +3 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +1 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +1 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +1 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +1 -7
- data/lib/rosett_ai/compiler/locale_compiler.rb +2 -0
- data/lib/rosett_ai/compiler/target_profile.rb +11 -0
- data/lib/rosett_ai/completion/generator.rb +2 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +1 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +1 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +2 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +4 -0
- data/lib/rosett_ai/comply/runner.rb +2 -0
- data/lib/rosett_ai/composition/composer.rb +1 -0
- data/lib/rosett_ai/composition/lockfile.rb +1 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +1 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +9 -0
- data/lib/rosett_ai/config/secret_resolver.rb +4 -0
- data/lib/rosett_ai/configuration.rb +4 -0
- data/lib/rosett_ai/content/content_client.rb +15 -0
- data/lib/rosett_ai/content/pack_installer.rb +1 -0
- data/lib/rosett_ai/content/pack_manifest.rb +21 -0
- data/lib/rosett_ai/content_packs/manager.rb +1 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +2 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +1 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +5 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +4 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +1 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +1 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +2 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +1 -0
- data/lib/rosett_ai/dbus/service.rb +3 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +14 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +6 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +3 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +1 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +2 -0
- data/lib/rosett_ai/doctor/check.rb +1 -1
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +1 -0
- data/lib/rosett_ai/doctor.rb +1 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +9 -0
- data/lib/rosett_ai/documentation/translator.rb +8 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +71 -1
- data/lib/rosett_ai/engines/detector.rb +5 -0
- data/lib/rosett_ai/engines/registry.rb +7 -0
- data/lib/rosett_ai/exit_codes.rb +6 -0
- data/lib/rosett_ai/formatting.rb +1 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +6 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +1 -0
- data/lib/rosett_ai/git_hooks/installer.rb +4 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +2 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +6 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +1 -0
- data/lib/rosett_ai/init/config_file_writer.rb +4 -0
- data/lib/rosett_ai/init/directory_builder.rb +15 -0
- data/lib/rosett_ai/init/file_copier.rb +51 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +1 -0
- data/lib/rosett_ai/init/project_initializer.rb +1 -0
- data/lib/rosett_ai/licensing/license_key.rb +4 -0
- data/lib/rosett_ai/licensing/license_store.rb +11 -0
- data/lib/rosett_ai/licensing/tier.rb +9 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +1 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +1 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +1 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +27 -4
- data/lib/rosett_ai/mcp/enforcement/validator.rb +24 -3
- data/lib/rosett_ai/mcp/governance.rb +9 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +22 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +4 -2
- data/lib/rosett_ai/mcp/keyfile.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +4 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +1 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +3 -0
- data/lib/rosett_ai/mcp/plugins.rb +1 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +3 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +2 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +3 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +2 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +1 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +1 -0
- data/lib/rosett_ai/mcp/server.rb +7 -1
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +3 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +7 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +33 -8
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +3 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +5 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +4 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +5 -0
- data/lib/rosett_ai/migration/detector.rb +1 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +2 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +3 -1
- data/lib/rosett_ai/package_manager/apt.rb +5 -0
- data/lib/rosett_ai/package_manager/base.rb +1 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +1 -0
- data/lib/rosett_ai/packaging/variant_config.rb +12 -0
- data/lib/rosett_ai/plugins/contract.rb +1 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +2 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +2 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +2 -0
- data/lib/rosett_ai/plugins/registry.rb +10 -0
- data/lib/rosett_ai/policy/auditor.rb +1 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +1 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +2 -0
- data/lib/rosett_ai/policy/validator.rb +1 -0
- data/lib/rosett_ai/profiler.rb +7 -0
- data/lib/rosett_ai/project/drift_detector.rb +1 -0
- data/lib/rosett_ai/project/manager.rb +1 -0
- data/lib/rosett_ai/project/template_applier.rb +1 -0
- data/lib/rosett_ai/provenance/entry.rb +2 -0
- data/lib/rosett_ai/provenance/source.rb +1 -0
- data/lib/rosett_ai/provenance/store.rb +3 -0
- data/lib/rosett_ai/provenance/validator.rb +1 -0
- data/lib/rosett_ai/quorum/collector.rb +1 -0
- data/lib/rosett_ai/quorum/comparator.rb +2 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +1 -0
- data/lib/rosett_ai/rai_config.rb +9 -0
- data/lib/rosett_ai/retrofit/engine.rb +2 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +8 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +10 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +9 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +3 -0
- data/lib/rosett_ai/secrets_resolver.rb +1 -0
- data/lib/rosett_ai/session_hooks/installer.rb +130 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +4 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +7 -0
- data/lib/rosett_ai/structured_logger.rb +1 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +1 -0
- data/lib/rosett_ai/telemetry.rb +1 -0
- data/lib/rosett_ai/thor/cli.rb +9 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +2 -0
- data/lib/rosett_ai/thor/tasks/backfill_user_yml.rb +207 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +6 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +12 -0
- data/lib/rosett_ai/thor/tasks/build.rb +106 -21
- data/lib/rosett_ai/thor/tasks/compile.rb +76 -32
- data/lib/rosett_ai/thor/tasks/completion.rb +9 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +2 -0
- data/lib/rosett_ai/thor/tasks/config.rb +21 -5
- data/lib/rosett_ai/thor/tasks/content.rb +8 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +13 -0
- data/lib/rosett_ai/thor/tasks/design.rb +2 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +4 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +2 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +7 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +8 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +8 -0
- data/lib/rosett_ai/thor/tasks/init.rb +1 -0
- data/lib/rosett_ai/thor/tasks/license.rb +8 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +40 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +2 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +15 -0
- data/lib/rosett_ai/thor/tasks/project.rb +8 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +8 -0
- data/lib/rosett_ai/thor/tasks/release.rb +8 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +4 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +1 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +14 -0
- data/lib/rosett_ai/tooling/version_checker.rb +1 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +18 -0
- data/lib/rosett_ai/ui/base.rb +3 -0
- data/lib/rosett_ai/ui/gtk4.rb +19 -0
- data/lib/rosett_ai/ui/kde.rb +1 -0
- data/lib/rosett_ai/ui/qt6.rb +1 -0
- data/lib/rosett_ai/ui/registry.rb +15 -0
- data/lib/rosett_ai/ui/tui.rb +22 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +1 -0
- data/lib/rosett_ai/validators/design_validator.rb +2 -0
- data/lib/rosett_ai/validators/schema_validator.rb +4 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +1 -0
- data/lib/rosett_ai/version.rb +2 -1
- data/lib/rosett_ai/version_consistency_checker.rb +6 -0
- data/lib/rosett_ai/workflow/engine.rb +1 -0
- data/lib/rosett_ai/workflow/manager.rb +1 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +2 -0
- data/lib/rosett_ai/workflow/step_runner.rb +1 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +1 -0
- data/lib/rosett_ai/yaml_loader.rb +2 -0
- data/lib/rosett_ai.rb +2 -0
- data/lib/scripts/generated/docker_hub_tags.rb +2 -0
- data/locales/ar.yml +2 -0
- data/locales/en.yml +5 -0
- data/locales/fr.yml +2 -0
- metadata +9 -189
- data/.ai-provenance.yml +0 -119
- data/.debride_whitelist +0 -186
- data/.fasterer.yml +0 -29
- data/.mdl_style.rb +0 -10
- data/.mdlrc +0 -3
- data/.mutant.yml +0 -49
- data/.namespace-allowlist +0 -42
- data/.reek.yml +0 -1040
- data/.rosett-ai/config.yml +0 -3
- data/.rspec +0 -5
- data/.rubocop.yml +0 -380
- data/.ruby-version +0 -1
- data/.yamllint +0 -51
- data/.yardopts +0 -12
- data/AI-DISCLOSURE.md +0 -48
- data/CLAUDE.md +0 -141
- data/CONTRIBUTING.md +0 -734
- data/INSTALL.md +0 -154
- data/LICENSE.md +0 -675
- data/QUICKSTART.md +0 -73
- data/Rakefile +0 -200
- data/SECURITY.md +0 -114
- data/cliff.toml +0 -52
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/design/aaif_alignment.yml +0 -181
- data/conf/design/ab_testing.yml +0 -172
- data/conf/design/accessibility.yml +0 -84
- data/conf/design/ai_authorship.yml +0 -210
- data/conf/design/ai_provenance.yml +0 -224
- data/conf/design/ai_tool_configuration.yml +0 -207
- data/conf/design/architecture.yml +0 -139
- data/conf/design/autocompletion.yml +0 -115
- data/conf/design/backward_compatibility.yml +0 -112
- data/conf/design/behaviour_composition.yml +0 -246
- data/conf/design/build_rake_extraction.yml +0 -57
- data/conf/design/ci_pipeline.yml +0 -100
- data/conf/design/claude_code_configuration.yml +0 -157
- data/conf/design/compiler.yml +0 -128
- data/conf/design/comply.yml +0 -153
- data/conf/design/content_packs.yml +0 -84
- data/conf/design/desktop_integration.yml +0 -289
- data/conf/design/distribution.yml +0 -216
- data/conf/design/doctor.yml +0 -184
- data/conf/design/documentation.yml +0 -152
- data/conf/design/engine_architecture.yml +0 -257
- data/conf/design/error_handling.yml +0 -103
- data/conf/design/feature_flags.yml +0 -142
- data/conf/design/git_hooks.yml +0 -165
- data/conf/design/gui_plugins.yml +0 -475
- data/conf/design/i18n.yml +0 -84
- data/conf/design/integration_testing.yml +0 -56
- data/conf/design/licensing_system.yml +0 -88
- data/conf/design/lifecycle_management.yml +0 -208
- data/conf/design/mcp_integration.yml +0 -207
- data/conf/design/mcp_settings.yml +0 -126
- data/conf/design/migration.yml +0 -56
- data/conf/design/monitoring_observability.yml +0 -194
- data/conf/design/namespace_cleanup.yml +0 -145
- data/conf/design/plugin_test_segregation.yml +0 -145
- data/conf/design/policy_management.yml +0 -229
- data/conf/design/project_management.yml +0 -183
- data/conf/design/rai_mcp_asset_discovery.yml +0 -164
- data/conf/design/rai_mcp_server.yml +0 -605
- data/conf/design/release_management.yml +0 -117
- data/conf/design/retrofit.yml +0 -199
- data/conf/design/retrospective_analyzer.yml +0 -79
- data/conf/design/scope_hierarchy.yml +0 -352
- data/conf/design/security.yml +0 -115
- data/conf/design/session_retrospective.yml +0 -85
- data/conf/design/smart_ui_feedback.yml +0 -89
- data/conf/design/structured_logging.yml +0 -148
- data/conf/design/styles.yml +0 -123
- data/conf/design/test_peer_review.yml +0 -89
- data/conf/design/testing.yml +0 -136
- data/conf/design/threat_model.yml +0 -108
- data/conf/design/ui_framework.yml +0 -111
- data/conf/design/usage_optimization.yml +0 -122
- data/conf/design/version_management.yml +0 -60
- data/conf/design/workflow.yml +0 -227
- data/doc/AAIF_POSITIONING.md +0 -58
- data/doc/ADOPT.md +0 -224
- data/doc/AI_PROVENANCE.md +0 -139
- data/doc/ARCHITECTURE.md +0 -920
- data/doc/BEHAVIOUR.md +0 -409
- data/doc/BUILD.md +0 -138
- data/doc/CI_CD_RECIPES.md +0 -171
- data/doc/CLAUDE_SESSIONS_MOVED.md +0 -16
- data/doc/COMMAND_ANALYSIS.md +0 -229
- data/doc/CONFIGURATION.md +0 -281
- data/doc/DESIGN_AUDIT.md +0 -235
- data/doc/DESIGN_PEER_REVIEW.md +0 -771
- data/doc/DESKTOP.md +0 -447
- data/doc/ENGINES.md +0 -567
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +0 -417
- data/doc/FEATURE_AUDIT.md +0 -218
- data/doc/IMPLEMENTATION_PLAN.md +0 -669
- data/doc/INCIDENT_REPORT_2026-02-02.md +0 -251
- data/doc/MIGRATION_GUIDE.md +0 -88
- data/doc/PACKAGING.md +0 -232
- data/doc/PROJECT_DASHBOARD.md +0 -153
- data/doc/PULP_DEPLOYMENT.md +0 -164
- data/doc/QUALITY_FIX_SUMMARY.md +0 -110
- data/doc/QUICK_START.md +0 -162
- data/doc/REEK_CONFIGURATION.md +0 -166
- data/doc/REFERENCE.md +0 -253
- data/doc/REFERENCES.md +0 -324
- data/doc/SECURITY_REVIEW_CHECKLIST.md +0 -72
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +0 -359
- data/doc/SETUP.md +0 -202
- data/doc/TEST_PEER_REVIEW.md +0 -152
- data/doc/THREAT_MODEL.md +0 -230
- data/doc/USAGE.md +0 -545
- data/doc/USER_MANUAL.md +0 -585
- data/doc/ai_test_review_checklist.md +0 -110
- data/doc/changes/2026-02-18-packaging-fpm.md +0 -155
- data/doc/changes/2026-02-19-testing-infrastructure.md +0 -221
- data/doc/changes/2026-02-20-security-implementation.md +0 -281
- data/doc/changes/2026-02-20-styles-implementation.md +0 -220
- data/doc/changes/2026-02-21-architecture-completion.md +0 -95
- data/doc/changes/2026-02-21-architecture-ui-layer.md +0 -253
- data/doc/changes/2026-02-21-cc-config-implementation.md +0 -108
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +0 -214
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +0 -241
- data/doc/changes/2026-02-21-config-design-show-commands.md +0 -61
- data/doc/changes/2026-02-21-design-implementation-overview.md +0 -455
- data/doc/changes/2026-02-21-lifecycle-management.md +0 -196
- data/doc/changes/2026-02-21-path-resolver.md +0 -128
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +0 -45
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +0 -120
- data/doc/changes/2026-03-20-security-hardening-phase2.md +0 -163
- data/doc/context/SESSION-HANDOFF.md +0 -69
- data/doc/context/ai-engine-usage-trends-2026.md +0 -80
- data/doc/context/plan-pluggable-engines.md +0 -590
- data/doc/decisions/001-flog-deferred.md +0 -32
- data/doc/decisions/002-path-resolution-strategy.md +0 -158
- data/doc/decisions/003-ui-adapter-selection.md +0 -193
- data/doc/decisions/004-design-document-validation.md +0 -179
- data/doc/decisions/005-package-splitting-strategy.md +0 -200
- data/doc/decisions/006-multi-engine-architecture.md +0 -147
- data/doc/decisions/007-engine-agnostic-pivot.md +0 -219
- data/doc/decisions/008-ci-bundler-strategy.md +0 -129
- data/doc/decisions/009-core-only-v1-release.md +0 -60
- data/doc/decisions/010-engine-debian-packaging.md +0 -66
- data/doc/decisions/011-context-aware-cli.md +0 -71
- data/doc/dependency_decisions.yml +0 -247
- data/doc/issues/001-wrapper-missing-environment-variables.md +0 -197
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +0 -217
- data/doc/issues/003-smoke-test-false-positive.md +0 -127
- data/doc/issues/004-market-research-design-updates.md +0 -109
- data/doc/issues/005-compile-scope-coexistence.md +0 -161
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +0 -505
- data/doc/operations/packaging.md +0 -133
- data/doc/operations/rosett-ai-release.md +0 -65
- data/doc/reference/error-catalog.md +0 -107
- data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
- data/doc/reference/src/Pictures/cover.jpg +0 -0
- data/doc/reference/src/Pictures/head1.jpg +0 -0
- data/doc/reference/src/Pictures/head2.jpg +0 -0
- data/doc/reference/src/Pictures/head3.jpg +0 -0
- data/doc/reference/src/Pictures/head4.jpg +0 -0
- data/doc/reference/src/Pictures/head5.jpg +0 -0
- data/doc/reference/src/Pictures/head6.jpg +0 -0
- data/doc/reference/src/Pictures/head7.jpg +0 -0
- data/doc/reference/src/Pictures/head8.jpg +0 -0
- data/doc/reference/src/StyleInd.ist +0 -4
- data/doc/reference/src/bibliography.bib +0 -79
- data/doc/reference/src/main.tex +0 -1288
- data/doc/reference/src/structure.tex +0 -303
- data/doc/rosett-ai-bookmarks.html +0 -301
- data/kitchen.yml +0 -46
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/locales/.gitkeep +0 -0
- data/packaging/build-engine-deb.sh +0 -81
- data/packaging/scripts/postinst +0 -17
- data/packaging/scripts/postrm +0 -19
- data/packaging/scripts/prerm +0 -10
- data/packaging/wrapper.sh.template +0 -38
- data/rosett-ai.gemspec +0 -63
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +0 -123
- data/settings.json +0 -29
data/doc/DESKTOP.md
DELETED
|
@@ -1,447 +0,0 @@
|
|
|
1
|
-
# Desktop Integration
|
|
2
|
-
|
|
3
|
-
raictl provides Linux desktop integration through a D-Bus service and
|
|
4
|
-
GTK4/Adwaita GUI application. The architecture separates the IPC service
|
|
5
|
-
(always running) from the GUI (launched on demand).
|
|
6
|
-
|
|
7
|
-
## Architecture Overview
|
|
8
|
-
|
|
9
|
-
```mermaid
|
|
10
|
-
graph TB
|
|
11
|
-
subgraph User["User Interaction"]
|
|
12
|
-
TERM["Terminal<br/>bin/raictl compile"]
|
|
13
|
-
GTK4["GTK4 App<br/>bin/raictl desktop gtk4"]
|
|
14
|
-
KDE["KDE KCM<br/>(future)"]
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
subgraph DBUS["D-Bus Session Bus"]
|
|
18
|
-
BUS["be.neatnerds.rosettai"]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
subgraph Service["D-Bus Service (bin/raictl dbus start)"]
|
|
22
|
-
MGR["ManagerInterface"]
|
|
23
|
-
FOCUS["FocusMonitorInterface"]
|
|
24
|
-
SNI["StatusNotifierInterface"]
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
subgraph Core["rosett-ai Core"]
|
|
28
|
-
COMP["Compiler"]
|
|
29
|
-
CONFIG["Configuration"]
|
|
30
|
-
ENGINES["Engine Registry"]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
subgraph System["System"]
|
|
34
|
-
COMPOSITOR["Compositor<br/>(GNOME, KDE, i3, Hyprland, X11)"]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
TERM --> Core
|
|
38
|
-
GTK4 -->|D-Bus IPC| BUS
|
|
39
|
-
KDE -->|D-Bus IPC| BUS
|
|
40
|
-
BUS --> Service
|
|
41
|
-
Service --> Core
|
|
42
|
-
FOCUS --> COMPOSITOR
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## D-Bus Service
|
|
46
|
-
|
|
47
|
-
### Starting the Service
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
# Start in foreground
|
|
51
|
-
bin/raictl dbus start
|
|
52
|
-
|
|
53
|
-
# The service registers on the session bus as:
|
|
54
|
-
# Bus name: be.neatnerds.rosettai
|
|
55
|
-
# Object path: /be/neatnerds/rosett-ai
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Interfaces
|
|
59
|
-
|
|
60
|
-
```mermaid
|
|
61
|
-
classDiagram
|
|
62
|
-
class Service {
|
|
63
|
-
+run()
|
|
64
|
-
-setup_manager_interface()
|
|
65
|
-
-setup_focus_monitor()
|
|
66
|
-
-export_status_notifier()
|
|
67
|
-
-export_interfaces()
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
class ManagerInterface {
|
|
71
|
-
<<D-Bus Interface>>
|
|
72
|
-
+Compile(engine: s) s
|
|
73
|
-
+SwitchContext(context_name: s)
|
|
74
|
-
+GetStatus() a_sv_
|
|
75
|
-
+Shutdown()
|
|
76
|
-
+SetConfig(key: s, value: s) s
|
|
77
|
-
signal ContextChanged(context_name: s)
|
|
78
|
-
property Version: s [read]
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
class FocusMonitorInterface {
|
|
82
|
-
<<D-Bus Interface>>
|
|
83
|
-
+GetCurrentFocus() (ss)
|
|
84
|
-
signal FocusChanged(app_id: s, title: s)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
class StatusNotifierInterface {
|
|
88
|
-
<<D-Bus Interface: org.kde.StatusNotifierItem>>
|
|
89
|
-
+Activate(x: i, y: i)
|
|
90
|
-
+ContextMenu(x: i, y: i)
|
|
91
|
-
signal NewStatus(status: s)
|
|
92
|
-
signal NewTitle()
|
|
93
|
-
property Id: s [read]
|
|
94
|
-
property Category: s [read]
|
|
95
|
-
property Status: s [read]
|
|
96
|
-
property Title: s [read]
|
|
97
|
-
property IconName: s [read]
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
Service --> ManagerInterface
|
|
101
|
-
Service --> FocusMonitorInterface
|
|
102
|
-
Service --> StatusNotifierInterface
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### D-Bus Method Reference
|
|
106
|
-
|
|
107
|
-
| Interface | Method | Arguments | Returns | Description |
|
|
108
|
-
|-----------|--------|-----------|---------|-------------|
|
|
109
|
-
| Manager | `Compile` | `engine: s` | `s` (result) | Run compilation for specified engine |
|
|
110
|
-
| Manager | `SwitchContext` | `context_name: s` | -- | Switch AI context |
|
|
111
|
-
| Manager | `GetStatus` | -- | `a{sv}` (dict) | Service status dictionary |
|
|
112
|
-
| Manager | `Shutdown` | -- | -- | Gracefully stop the D-Bus service |
|
|
113
|
-
| Manager | `SetConfig` | `key: s, value: s` | `s` (result) | Update rai config value |
|
|
114
|
-
| FocusMonitor | `GetCurrentFocus` | -- | `(ss)` (tuple) | Current (app_id, window_title) |
|
|
115
|
-
| StatusNotifier | `Activate` | `x: i, y: i` | -- | Primary activation (click) |
|
|
116
|
-
| StatusNotifier | `ContextMenu` | `x: i, y: i` | -- | Context menu activation |
|
|
117
|
-
|
|
118
|
-
### D-Bus Signals
|
|
119
|
-
|
|
120
|
-
| Interface | Signal | Arguments | Description |
|
|
121
|
-
|-----------|--------|-----------|-------------|
|
|
122
|
-
| Manager | `ContextChanged` | `context_name: s` | Emitted after context switch |
|
|
123
|
-
| FocusMonitor | `FocusChanged` | `app_id: s, title: s` | Emitted on active window change |
|
|
124
|
-
| StatusNotifier | `NewStatus` | `status: s` | Emitted when tray status changes |
|
|
125
|
-
| StatusNotifier | `NewTitle` | -- | Emitted when tooltip title changes |
|
|
126
|
-
|
|
127
|
-
### Stopping the Service
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
# Stop a running D-Bus service
|
|
131
|
-
bin/raictl dbus stop
|
|
132
|
-
|
|
133
|
-
# The stop command connects to the session bus and calls Shutdown
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## Focus Monitoring
|
|
137
|
-
|
|
138
|
-
### Compositor Detection
|
|
139
|
-
|
|
140
|
-
```mermaid
|
|
141
|
-
flowchart TD
|
|
142
|
-
A[CompositorDetector.detect] --> B{XDG_CURRENT_DESKTOP?}
|
|
143
|
-
B -->|GNOME| C[return :gnome]
|
|
144
|
-
B -->|KDE| D[return :kde]
|
|
145
|
-
B -->|Not set| E{WAYLAND_DISPLAY?}
|
|
146
|
-
E -->|Yes| F{HYPRLAND_INSTANCE_SIGNATURE?}
|
|
147
|
-
F -->|Yes| G[return :hyprland]
|
|
148
|
-
F -->|No| H{SWAYSOCK?}
|
|
149
|
-
H -->|Yes| I[return :sway]
|
|
150
|
-
H -->|No| J{I3SOCK?}
|
|
151
|
-
J -->|Yes| K[return :i3]
|
|
152
|
-
J -->|No| L[return :unknown]
|
|
153
|
-
E -->|No| M{DISPLAY?}
|
|
154
|
-
M -->|Yes| N[return :x11]
|
|
155
|
-
M -->|No| O[return :unknown]
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Focus Adapter Selection
|
|
159
|
-
|
|
160
|
-
```mermaid
|
|
161
|
-
flowchart LR
|
|
162
|
-
DET[CompositorDetector] --> |:gnome| GA[GnomeAdapter<br/>D-Bus org.gnome.Shell]
|
|
163
|
-
DET --> |:kde| KA[KwinAdapter<br/>D-Bus org.kde.KWin]
|
|
164
|
-
DET --> |:i3| IA[I3Adapter<br/>i3-msg -t get_tree]
|
|
165
|
-
DET --> |:hyprland| HA[HyprlandAdapter<br/>hyprctl activewindow]
|
|
166
|
-
DET --> |:x11| XA[X11Adapter<br/>xdotool getactivewindow]
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### Focus Adapter Hierarchy
|
|
170
|
-
|
|
171
|
-
```mermaid
|
|
172
|
-
classDiagram
|
|
173
|
-
class Base {
|
|
174
|
-
<<abstract>>
|
|
175
|
-
+current_focus() Array
|
|
176
|
-
+poll_interval() Integer
|
|
177
|
-
#parse_focus(raw) Array
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
class GnomeAdapter {
|
|
181
|
-
D-Bus: org.gnome.Shell
|
|
182
|
-
+current_focus() [app_id, title]
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
class KwinAdapter {
|
|
186
|
-
D-Bus: org.kde.KWin
|
|
187
|
-
+current_focus() [app_id, title]
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
class I3Adapter {
|
|
191
|
-
CLI: i3-msg -t get_tree
|
|
192
|
-
+current_focus() [app_id, title]
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
class HyprlandAdapter {
|
|
196
|
-
CLI: hyprctl activewindow -j
|
|
197
|
-
+current_focus() [app_id, title]
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
class X11Adapter {
|
|
201
|
-
CLI: xdotool getactivewindow
|
|
202
|
-
+current_focus() [app_id, title]
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
Base <|-- GnomeAdapter
|
|
206
|
-
Base <|-- KwinAdapter
|
|
207
|
-
Base <|-- I3Adapter
|
|
208
|
-
Base <|-- HyprlandAdapter
|
|
209
|
-
Base <|-- X11Adapter
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
## GTK4 Application
|
|
213
|
-
|
|
214
|
-
### Safety Architecture
|
|
215
|
-
|
|
216
|
-
The GTK4 app is designed to **never crash** on user interaction. Every event
|
|
217
|
-
handler is wrapped in a safety layer.
|
|
218
|
-
|
|
219
|
-
```mermaid
|
|
220
|
-
flowchart TB
|
|
221
|
-
subgraph Principle1["Principle 1: Wrap All Handlers"]
|
|
222
|
-
P1["Every signal_connect callback<br/>passes through safe_action()"]
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
subgraph Principle2["Principle 2: Safe D-Bus Client"]
|
|
226
|
-
P2["DbusClient never raises<br/>Returns SAFE_STATUS, SAFE_FOCUS<br/>on any error"]
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
subgraph Principle3["Principle 3: Graceful Degradation"]
|
|
230
|
-
P3["defined?(Adw::PreferencesDialog)<br/>falls back to PreferencesWindow<br/>falls back to nil"]
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
subgraph Principle4["Principle 4: Error Dialogs"]
|
|
234
|
-
P4["Errors shown as Adw::MessageDialog<br/>App continues running"]
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
Principle1 --> Principle2
|
|
238
|
-
Principle2 --> Principle3
|
|
239
|
-
Principle3 --> Principle4
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
### Application Structure
|
|
243
|
-
|
|
244
|
-
```mermaid
|
|
245
|
-
classDiagram
|
|
246
|
-
class Gtk4App {
|
|
247
|
-
-application Adw::Application
|
|
248
|
-
-window Adw::ApplicationWindow
|
|
249
|
-
-dbus_client DbusClient
|
|
250
|
-
-toast_overlay Adw::ToastOverlay
|
|
251
|
-
+run(argv) Integer
|
|
252
|
-
-safe_action(name)
|
|
253
|
-
-on_activate()
|
|
254
|
-
-show_preferences()
|
|
255
|
-
-show_about()
|
|
256
|
-
-on_compile_clicked()
|
|
257
|
-
-show_toast(message)
|
|
258
|
-
-show_error_dialog(title, message)
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
class Gtk4Preferences {
|
|
262
|
-
-parent Adw::Window
|
|
263
|
-
-dbus_client DbusClient
|
|
264
|
-
-dialog Adw::PreferencesDialog
|
|
265
|
-
+build() PreferencesDialog
|
|
266
|
-
+present()
|
|
267
|
-
-safe_callback(name)
|
|
268
|
-
-create_preferences_dialog()
|
|
269
|
-
-add_general_page()
|
|
270
|
-
-add_context_page()
|
|
271
|
-
-add_advanced_page()
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
class DbusClient {
|
|
275
|
-
-bus DBus::SessionBus
|
|
276
|
-
-connected Boolean
|
|
277
|
-
+connect() Boolean
|
|
278
|
-
+service_available?() Boolean
|
|
279
|
-
+status() Hash
|
|
280
|
-
+compile() String
|
|
281
|
-
+current_focus() Array
|
|
282
|
-
+set_config(key, value) Boolean
|
|
283
|
-
+on_focus_changed(block)
|
|
284
|
-
SAFE_STATUS Hash
|
|
285
|
-
SAFE_FOCUS Array
|
|
286
|
-
SAFE_COMPILE_RESULT String
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
class GuiLogger {
|
|
290
|
-
-enabled Boolean
|
|
291
|
-
-log_file String
|
|
292
|
-
-level Symbol
|
|
293
|
-
-mutex Mutex
|
|
294
|
-
+action(name, &block)
|
|
295
|
-
+action_start(name)
|
|
296
|
-
+action_end(name)
|
|
297
|
-
+callback(name)
|
|
298
|
-
+widget_event(type, event)
|
|
299
|
-
+dbus_call(operation)
|
|
300
|
-
+error(message, exception)
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
Gtk4App --> DbusClient
|
|
304
|
-
Gtk4App --> Gtk4Preferences
|
|
305
|
-
Gtk4App --> GuiLogger
|
|
306
|
-
Gtk4Preferences --> DbusClient
|
|
307
|
-
Gtk4Preferences --> GuiLogger
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### safe_action() Flow
|
|
311
|
-
|
|
312
|
-
```mermaid
|
|
313
|
-
sequenceDiagram
|
|
314
|
-
participant User
|
|
315
|
-
participant GTK as Gtk4App
|
|
316
|
-
participant Logger as GuiLogger
|
|
317
|
-
participant Logic as Business Logic
|
|
318
|
-
participant Dialog as Error Dialog
|
|
319
|
-
|
|
320
|
-
User->>GTK: Click button
|
|
321
|
-
GTK->>GTK: safe_action(:on_compile_clicked)
|
|
322
|
-
GTK->>Logger: action_start(:on_compile_clicked)
|
|
323
|
-
|
|
324
|
-
alt Success
|
|
325
|
-
GTK->>Logic: on_compile_clicked()
|
|
326
|
-
Logic-->>GTK: result
|
|
327
|
-
GTK->>Logger: action_end(status: :success)
|
|
328
|
-
GTK->>User: show_toast(result)
|
|
329
|
-
else Error
|
|
330
|
-
Logic-->>GTK: raise StandardError
|
|
331
|
-
GTK->>Logger: action_end(status: :error)
|
|
332
|
-
GTK->>Dialog: show_error_dialog(title, message)
|
|
333
|
-
Dialog-->>User: Error shown, app continues
|
|
334
|
-
end
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
### Version Compatibility
|
|
338
|
-
|
|
339
|
-
The system GTK4/libadwaita version affects available widgets:
|
|
340
|
-
|
|
341
|
-
```mermaid
|
|
342
|
-
flowchart TD
|
|
343
|
-
A[Create Preferences] --> B{defined? Adw::PreferencesDialog}
|
|
344
|
-
B -->|Yes libadwaita >= 1.4| C[Use PreferencesDialog]
|
|
345
|
-
B -->|No| D{defined? Adw::PreferencesWindow}
|
|
346
|
-
D -->|Yes libadwaita >= 1.0| E[Use PreferencesWindow]
|
|
347
|
-
D -->|No| F[Return nil, log error]
|
|
348
|
-
|
|
349
|
-
C --> G["present(parent_window)"]
|
|
350
|
-
E --> H["transient_for = parent"]
|
|
351
|
-
H --> I["present()"]
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
| Widget | Minimum libadwaita | Fallback |
|
|
355
|
-
|--------|-------------------|----------|
|
|
356
|
-
| `PreferencesDialog` | 1.4 | `PreferencesWindow` |
|
|
357
|
-
| `SwitchRow` | 1.4 | Skip widget |
|
|
358
|
-
| `ComboRow` | 1.0 | Always available |
|
|
359
|
-
| `ActionRow` | 1.0 | Always available |
|
|
360
|
-
| `Toast` | 1.0 | Always available |
|
|
361
|
-
| `AboutWindow` | 1.2 | Always available |
|
|
362
|
-
|
|
363
|
-
## GUI Logging
|
|
364
|
-
|
|
365
|
-
### Environment Variables
|
|
366
|
-
|
|
367
|
-
| Variable | Values | Default | Description |
|
|
368
|
-
|----------|--------|---------|-------------|
|
|
369
|
-
| `RAI_GUI_LOG` | `1` | unset | Enable logging |
|
|
370
|
-
| `RAI_GUI_LOG_FILE` | path | none | Also write to file |
|
|
371
|
-
| `RAI_GUI_LOG_LEVEL` | `debug`, `info`, `warn`, `error` | `info` | Minimum level |
|
|
372
|
-
|
|
373
|
-
### Usage
|
|
374
|
-
|
|
375
|
-
```bash
|
|
376
|
-
# Log to stderr only
|
|
377
|
-
RAI_GUI_LOG=1 bin/raictl desktop gtk4
|
|
378
|
-
|
|
379
|
-
# Log to file with debug level
|
|
380
|
-
RAI_GUI_LOG=1 \
|
|
381
|
-
RAI_GUI_LOG_LEVEL=debug \
|
|
382
|
-
RAI_GUI_LOG_FILE=/tmp/rosett-ai-gui.log \
|
|
383
|
-
bin/raictl desktop gtk4
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
### Log Format (JSON Lines)
|
|
387
|
-
|
|
388
|
-
```json
|
|
389
|
-
{"timestamp":"2026-02-28T06:21:05.991Z","level":"info","event":"action_start","pid":12345,"action":"on_activate"}
|
|
390
|
-
{"timestamp":"2026-02-28T06:21:06.590Z","level":"info","event":"action_end","pid":12345,"action":"on_activate","status":"success","duration_ms":599.12}
|
|
391
|
-
{"timestamp":"2026-02-28T06:21:08.100Z","level":"error","event":"error","pid":12345,"message":"D-Bus service not available","error_class":"DBus::Error","component":"DbusClient"}
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
### Logger Architecture
|
|
395
|
-
|
|
396
|
-
```mermaid
|
|
397
|
-
flowchart TB
|
|
398
|
-
subgraph Env["Environment"]
|
|
399
|
-
E1["RAI_GUI_LOG=1"]
|
|
400
|
-
E2["RAI_GUI_LOG_FILE=/tmp/log"]
|
|
401
|
-
E3["RAI_GUI_LOG_LEVEL=debug"]
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
subgraph Logger["GuiLogger (Singleton)"]
|
|
405
|
-
CHECK{enabled?}
|
|
406
|
-
LEVEL{level >= threshold?}
|
|
407
|
-
ENTRY["Build JSON entry:<br/>timestamp, level, event,<br/>pid, action_stack"]
|
|
408
|
-
MUTEX["Mutex.synchronize"]
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
subgraph Output["Output"]
|
|
412
|
-
STDERR["stderr (warn)"]
|
|
413
|
-
FILE["File handle (sync: true)"]
|
|
414
|
-
end
|
|
415
|
-
|
|
416
|
-
subgraph Safety["Safety"]
|
|
417
|
-
RESCUE["rescue StandardError → nil<br/>Never let logging crash app"]
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
Env --> CHECK
|
|
421
|
-
CHECK -->|Yes| LEVEL
|
|
422
|
-
CHECK -->|No| SKIP[Return immediately]
|
|
423
|
-
LEVEL -->|Yes| ENTRY
|
|
424
|
-
LEVEL -->|No| SKIP
|
|
425
|
-
ENTRY --> MUTEX
|
|
426
|
-
MUTEX --> STDERR
|
|
427
|
-
MUTEX --> FILE
|
|
428
|
-
MUTEX --> RESCUE
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
## Pending Work
|
|
432
|
-
|
|
433
|
-
### Immediate
|
|
434
|
-
|
|
435
|
-
1. Integration tests for GUI resilience
|
|
436
|
-
2. Consider upgrading `gir1.2-adw-1` for `PreferencesDialog` support
|
|
437
|
-
|
|
438
|
-
### Future (Desktop Phase 3)
|
|
439
|
-
|
|
440
|
-
- KDE KCM (KDE Control Module) via Qt6
|
|
441
|
-
- Desktop notifications via `org.freedesktop.Notifications`
|
|
442
|
-
- Auto-compile on focus change
|
|
443
|
-
- GlobalShortcuts portal registration
|
|
444
|
-
|
|
445
|
-
---
|
|
446
|
-
|
|
447
|
-
*Generated: 2026-03-02 | rosett-ai v1.0.0*
|