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
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
# Session Documentation: GTK4 Application Hardening & GUI Logging
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-28
|
|
4
|
+
**Branch:** `engine/1-agents-md` (to be merged or rebased)
|
|
5
|
+
**Status:** In Progress - Paused for breakfast
|
|
6
|
+
|
|
7
|
+
## Executive Summary
|
|
8
|
+
|
|
9
|
+
This session focused on making the GTK4 desktop application crash-proof and adding
|
|
10
|
+
comprehensive debugging capabilities through structured GUI action logging.
|
|
11
|
+
|
|
12
|
+
## Work Completed
|
|
13
|
+
|
|
14
|
+
### 1. GTK4 Application Hardening
|
|
15
|
+
|
|
16
|
+
The GTK4 application was completely rewritten with defensive programming principles
|
|
17
|
+
to ensure it **never crashes** on user interaction.
|
|
18
|
+
|
|
19
|
+
#### Files Modified
|
|
20
|
+
|
|
21
|
+
| File | Purpose |
|
|
22
|
+
|------|---------|
|
|
23
|
+
| `lib/rosett_ai/desktop/dbus_client.rb` | D-Bus client with safe defaults |
|
|
24
|
+
| `lib/rosett_ai/desktop/gtk4_app.rb` | Main GTK4 app with safe_action wrapper |
|
|
25
|
+
| `lib/rosett_ai/desktop/gtk4_preferences.rb` | Preferences dialog with graceful degradation |
|
|
26
|
+
| `lib/rosett_ai/desktop/gui_logger.rb` | **NEW** - Structured JSON logging for debugging |
|
|
27
|
+
|
|
28
|
+
### 2. Safety Architecture
|
|
29
|
+
|
|
30
|
+
```mermaid
|
|
31
|
+
flowchart TB
|
|
32
|
+
subgraph UserAction["User Action"]
|
|
33
|
+
click["Button Click / Menu Selection"]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
subgraph SafetyLayer["Safety Layer"]
|
|
37
|
+
safe_action["safe_action()"]
|
|
38
|
+
safe_callback["safe_callback()"]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
subgraph Logging["Logging Layer"]
|
|
42
|
+
gui_logger["GuiLogger.action()"]
|
|
43
|
+
json_output["JSON Lines Output"]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
subgraph ErrorHandling["Error Handling"]
|
|
47
|
+
rescue["rescue StandardError"]
|
|
48
|
+
dialog["show_error_dialog()"]
|
|
49
|
+
toast["show_toast()"]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
subgraph BusinessLogic["Business Logic"]
|
|
53
|
+
dbus["DbusClient"]
|
|
54
|
+
safe_defaults["Safe Defaults"]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
click --> safe_action
|
|
58
|
+
safe_action --> gui_logger
|
|
59
|
+
gui_logger --> rescue
|
|
60
|
+
rescue -->|success| BusinessLogic
|
|
61
|
+
rescue -->|error| dialog
|
|
62
|
+
dialog --> toast
|
|
63
|
+
|
|
64
|
+
dbus -->|always returns| safe_defaults
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. Design Principles Applied
|
|
68
|
+
|
|
69
|
+
```mermaid
|
|
70
|
+
mindmap
|
|
71
|
+
root((GTK4 Safety))
|
|
72
|
+
Never Crash
|
|
73
|
+
Wrap all handlers
|
|
74
|
+
Catch StandardError
|
|
75
|
+
Show error dialog
|
|
76
|
+
Safe Defaults
|
|
77
|
+
D-Bus returns defaults
|
|
78
|
+
Never raise to GUI
|
|
79
|
+
Graceful degradation
|
|
80
|
+
Logging
|
|
81
|
+
JSON Lines format
|
|
82
|
+
Action tracking
|
|
83
|
+
Full backtraces
|
|
84
|
+
Version Compatibility
|
|
85
|
+
Check defined?
|
|
86
|
+
Fallback widgets
|
|
87
|
+
PreferencesWindow fallback
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Decision Log
|
|
91
|
+
|
|
92
|
+
### Decision 1: Error Handling Strategy
|
|
93
|
+
|
|
94
|
+
**Context:** Application crashed when clicking Preferences menu.
|
|
95
|
+
|
|
96
|
+
**Options Considered:**
|
|
97
|
+
|
|
98
|
+
1. Fix specific crash only
|
|
99
|
+
2. Add targeted try/catch blocks
|
|
100
|
+
3. Comprehensive safety wrapper architecture
|
|
101
|
+
|
|
102
|
+
**Decision:** Option 3 - Wrap ALL event handlers with `safe_action()` pattern.
|
|
103
|
+
|
|
104
|
+
**Rationale:** User explicitly stated: *"It is imperative that the application is
|
|
105
|
+
robust and does not crash under any circumstances of usage."*
|
|
106
|
+
|
|
107
|
+
```mermaid
|
|
108
|
+
flowchart LR
|
|
109
|
+
A[User Action] --> B{safe_action wrapper}
|
|
110
|
+
B -->|Success| C[Complete normally]
|
|
111
|
+
B -->|Error| D[Log error]
|
|
112
|
+
D --> E[Show error dialog]
|
|
113
|
+
E --> F[Continue running]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Decision 2: D-Bus Client Safety
|
|
117
|
+
|
|
118
|
+
**Context:** D-Bus operations can fail (service unavailable, method not found).
|
|
119
|
+
|
|
120
|
+
**Decision:** D-Bus client NEVER raises exceptions. All methods return safe defaults.
|
|
121
|
+
|
|
122
|
+
```ruby
|
|
123
|
+
# Safe defaults defined as constants
|
|
124
|
+
SAFE_STATUS = { 'error' => 'Service not available', 'version' => 'unknown' }.freeze
|
|
125
|
+
SAFE_FOCUS = ['', ''].freeze
|
|
126
|
+
SAFE_COMPILE_RESULT = 'Error: D-Bus service not available'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Decision 3: GUI Logging System
|
|
130
|
+
|
|
131
|
+
**Context:** Need to debug GUI issues without attaching debugger.
|
|
132
|
+
|
|
133
|
+
**Decision:** Implement structured JSON Lines logging controlled by environment
|
|
134
|
+
variables.
|
|
135
|
+
|
|
136
|
+
```mermaid
|
|
137
|
+
flowchart TB
|
|
138
|
+
subgraph Environment["Environment Variables"]
|
|
139
|
+
RAI_GUI_LOG["RAI_GUI_LOG=1"]
|
|
140
|
+
RAI_GUI_LOG_FILE["RAI_GUI_LOG_FILE=/path"]
|
|
141
|
+
RAI_GUI_LOG_LEVEL["RAI_GUI_LOG_LEVEL=debug"]
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
subgraph Logger["GuiLogger"]
|
|
145
|
+
action["action()"]
|
|
146
|
+
callback["callback()"]
|
|
147
|
+
dbus_call["dbus_call()"]
|
|
148
|
+
error["error()"]
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
subgraph Output["Output"]
|
|
152
|
+
stderr["stderr"]
|
|
153
|
+
file["Log File"]
|
|
154
|
+
json["JSON Lines Format"]
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
Environment --> Logger
|
|
158
|
+
Logger --> json
|
|
159
|
+
json --> stderr
|
|
160
|
+
json --> file
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Usage:**
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
RAI_GUI_LOG=1 RAI_GUI_LOG_FILE=/tmp/rosett-ai-gui.log bin/raictl desktop gtk4
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Log Format:**
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{"timestamp":"2026-02-28T06:21:05.991Z","level":"info","event":"action_start"}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Decision 4: libadwaita Version Compatibility
|
|
176
|
+
|
|
177
|
+
**Context:** System has two libadwaita versions:
|
|
178
|
+
|
|
179
|
+
- Linuxbrew: 1.8.4 (newer)
|
|
180
|
+
- Debian: 1.2.2-1 (GIR typelib source)
|
|
181
|
+
|
|
182
|
+
**Decision:** Use `defined?` checks and graceful fallbacks.
|
|
183
|
+
|
|
184
|
+
```mermaid
|
|
185
|
+
flowchart TD
|
|
186
|
+
A[Create Preferences Dialog] --> B{defined? PreferencesDialog}
|
|
187
|
+
B -->|Yes| C[Use PreferencesDialog]
|
|
188
|
+
B -->|No| D{defined? PreferencesWindow}
|
|
189
|
+
D -->|Yes| E[Use PreferencesWindow]
|
|
190
|
+
D -->|No| F[Return nil, log error]
|
|
191
|
+
|
|
192
|
+
C --> G[present with parent arg]
|
|
193
|
+
E --> H[set transient_for]
|
|
194
|
+
H --> I[present without args]
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Library Version Status
|
|
198
|
+
|
|
199
|
+
### Ruby Gems (Latest)
|
|
200
|
+
|
|
201
|
+
| Gem | Installed | Latest | Status |
|
|
202
|
+
|-----|-----------|--------|--------|
|
|
203
|
+
| adwaita | 4.3.5 | 4.3.5 | Current |
|
|
204
|
+
| gtk4 | 4.3.5 | 4.3.5 | Current |
|
|
205
|
+
| glib2 | 4.3.5 | 4.3.5 | Current |
|
|
206
|
+
| ruby-dbus | 0.25.0 | 0.25.0 | Current |
|
|
207
|
+
|
|
208
|
+
### System Libraries
|
|
209
|
+
|
|
210
|
+
| Library | Version | Source | Notes |
|
|
211
|
+
|---------|---------|--------|-------|
|
|
212
|
+
| libadwaita | 1.8.4 | Linuxbrew | Used by pkg-config |
|
|
213
|
+
| libadwaita | 1.2.2-1 | Debian | Provides GIR typelib |
|
|
214
|
+
| GIR typelib | 1.2.2 | Debian | Limits available classes |
|
|
215
|
+
|
|
216
|
+
**Impact:** `PreferencesDialog` (added in libadwaita 1.4) is not available to Ruby
|
|
217
|
+
bindings. Code gracefully falls back to `PreferencesWindow`.
|
|
218
|
+
|
|
219
|
+
## Architecture Overview
|
|
220
|
+
|
|
221
|
+
```mermaid
|
|
222
|
+
graph TB
|
|
223
|
+
subgraph Desktop["Desktop Layer"]
|
|
224
|
+
GTK4["Gtk4App"]
|
|
225
|
+
Prefs["Gtk4Preferences"]
|
|
226
|
+
Logger["GuiLogger"]
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
subgraph IPC["IPC Layer"]
|
|
230
|
+
DBus["DbusClient"]
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
subgraph Service["D-Bus Service"]
|
|
234
|
+
Manager["Manager Interface"]
|
|
235
|
+
Focus["FocusMonitor Interface"]
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
GTK4 --> Logger
|
|
239
|
+
GTK4 --> DBus
|
|
240
|
+
GTK4 --> Prefs
|
|
241
|
+
Prefs --> Logger
|
|
242
|
+
Prefs --> DBus
|
|
243
|
+
DBus --> Manager
|
|
244
|
+
DBus --> Focus
|
|
245
|
+
|
|
246
|
+
Logger -->|JSON Lines| File["Log File"]
|
|
247
|
+
Logger -->|JSON Lines| Stderr["stderr"]
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Testing Results
|
|
251
|
+
|
|
252
|
+
### Manual Testing Performed
|
|
253
|
+
|
|
254
|
+
| Test | Result | Notes |
|
|
255
|
+
|------|--------|-------|
|
|
256
|
+
| App launch | Pass | Starts without crash |
|
|
257
|
+
| Hamburger - Preferences | Pass | Opens dialog (uses fallback PreferencesWindow) |
|
|
258
|
+
| Hamburger - About | Pass | Opens about window |
|
|
259
|
+
| Compile Rules action | Pass | Shows toast with error (D-Bus service not running) |
|
|
260
|
+
| Ctrl+Q quit | Pass | Clean shutdown |
|
|
261
|
+
| Error logging | Pass | JSON Lines captured in log file |
|
|
262
|
+
|
|
263
|
+
### Log Analysis
|
|
264
|
+
|
|
265
|
+
Sample log showing successful action tracking:
|
|
266
|
+
|
|
267
|
+
```text
|
|
268
|
+
action_start: on_activate (599ms)
|
|
269
|
+
action_start: show_preferences (17ms)
|
|
270
|
+
action_start: show_about (39ms)
|
|
271
|
+
action_start: on_compile_clicked (9ms)
|
|
272
|
+
info: Application shutdown
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Pending Work
|
|
276
|
+
|
|
277
|
+
### Immediate (Next Session)
|
|
278
|
+
|
|
279
|
+
1. **Commit Changes** - All hardened files need to be committed
|
|
280
|
+
2. **Integration Tests** - Add automated tests for GUI resilience
|
|
281
|
+
3. **GIR Version** - Consider upgrading gir1.2-adw-1 for PreferencesDialog
|
|
282
|
+
|
|
283
|
+
### Future Considerations
|
|
284
|
+
|
|
285
|
+
```mermaid
|
|
286
|
+
gantt
|
|
287
|
+
title Remaining GTK4 Work
|
|
288
|
+
dateFormat YYYY-MM-DD
|
|
289
|
+
section Hardening
|
|
290
|
+
Commit current changes :done, 2026-02-28, 1d
|
|
291
|
+
Add integration tests :active, 2026-02-28, 2d
|
|
292
|
+
section Compatibility
|
|
293
|
+
Investigate GIR upgrade :2026-03-01, 1d
|
|
294
|
+
Test on other systems :2026-03-01, 2d
|
|
295
|
+
section Features
|
|
296
|
+
Implement D-Bus methods :2026-03-02, 3d
|
|
297
|
+
Add preference persistence :2026-03-03, 2d
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## How to Resume
|
|
301
|
+
|
|
302
|
+
### On This Workstation
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
cd /home/hugo/git/Neatnerds/Anthropic/rosett-ai
|
|
306
|
+
git status # Check uncommitted changes
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### On Another Workstation
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
git clone <repo-url>
|
|
313
|
+
cd rosett-ai
|
|
314
|
+
git checkout <branch-name>
|
|
315
|
+
bundle install
|
|
316
|
+
# Read this document for context
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Running the GTK4 App
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
# Without logging
|
|
323
|
+
bundle exec bin/raictl desktop gtk4
|
|
324
|
+
|
|
325
|
+
# With debug logging
|
|
326
|
+
RAI_GUI_LOG=1 RAI_GUI_LOG_LEVEL=debug \
|
|
327
|
+
RAI_GUI_LOG_FILE=/tmp/rosett-ai-gui.log bundle exec bin/raictl desktop gtk4
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## File Change Summary
|
|
331
|
+
|
|
332
|
+
```text
|
|
333
|
+
lib/rosett_ai/desktop/
|
|
334
|
+
├── dbus_client.rb # Modified: Safe defaults, never raises
|
|
335
|
+
├── gtk4_app.rb # Modified: safe_action wrapper, GuiLogger
|
|
336
|
+
├── gtk4_preferences.rb # Modified: safe_callback, version checks
|
|
337
|
+
└── gui_logger.rb # NEW: Structured JSON logging
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## Conversation Context
|
|
341
|
+
|
|
342
|
+
This session continued from a previous context where:
|
|
343
|
+
|
|
344
|
+
- Engine Phase 1 (AGENTS.md) was completed
|
|
345
|
+
- Engine Phase 2 (Ollama/GPT-NeoX) was completed
|
|
346
|
+
- Desktop Phase 1 (D-Bus service) was completed
|
|
347
|
+
- Desktop Phase 2 (GTK4 app) had crash issues
|
|
348
|
+
|
|
349
|
+
The user's key requirement:
|
|
350
|
+
|
|
351
|
+
> "It is imperative that the application is robust and does not crash under any
|
|
352
|
+
> circumstances of usage. I am fully aware this is asking much but let's invest
|
|
353
|
+
> the time and effort to make this reliable, security-aware and safe above speed
|
|
354
|
+
> and snappiness."
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
*Document generated: 2026-02-28*
|
|
359
|
+
*Session paused for breakfast*
|
data/doc/SETUP.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Rosett-AI - Setup Guide
|
|
2
|
+
|
|
3
|
+
## Prerequisites
|
|
4
|
+
|
|
5
|
+
### Ruby 3.3.10 via rbenv
|
|
6
|
+
|
|
7
|
+
This project requires Ruby 3.3.10. We use rbenv for Ruby version management.
|
|
8
|
+
|
|
9
|
+
#### Installing rbenv
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# On Debian/Ubuntu
|
|
13
|
+
sudo apt-get update
|
|
14
|
+
sudo apt-get install -y git curl autoconf bison build-essential \
|
|
15
|
+
libssl-dev libyaml-dev libreadline6-dev zlib1g-dev \
|
|
16
|
+
libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev
|
|
17
|
+
|
|
18
|
+
# Install rbenv
|
|
19
|
+
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
|
|
20
|
+
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
|
|
21
|
+
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
|
|
22
|
+
source ~/.bashrc
|
|
23
|
+
|
|
24
|
+
# Install ruby-build plugin
|
|
25
|
+
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### Installing Ruby 3.3.10
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Install Ruby 3.3.10
|
|
32
|
+
rbenv install 3.3.10
|
|
33
|
+
|
|
34
|
+
# Verify installation
|
|
35
|
+
rbenv versions
|
|
36
|
+
|
|
37
|
+
# The .ruby-version file will automatically select 3.3.10 in this directory
|
|
38
|
+
cd ~/.claude
|
|
39
|
+
ruby --version # Should show ruby 3.3.10
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Installation
|
|
43
|
+
|
|
44
|
+
### 1. Clone/Initialize Repository
|
|
45
|
+
|
|
46
|
+
If you haven't already initialized the repository:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
cd ~/.claude
|
|
50
|
+
git init
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. Install Dependencies
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
bundle install
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
This installs all Bundler groups including `:desktop` (GTK4). If you do not
|
|
60
|
+
need desktop features or lack the GTK4 system libraries, exclude the group:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
bundle config set --local without 'desktop'
|
|
64
|
+
bundle install
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
For desktop development, install system dependencies first:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
sudo apt-get install -y libgirepository1.0-dev libgtk-4-dev
|
|
71
|
+
bundle install
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3. Install Git Hooks (CRITICAL)
|
|
75
|
+
|
|
76
|
+
**Important:** This step is mandatory. Without git hooks, code quality checks will not run before commits.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Install overcommit hooks
|
|
80
|
+
overcommit --install
|
|
81
|
+
|
|
82
|
+
# Verify hooks are installed correctly
|
|
83
|
+
ls -la .git/hooks/pre-commit && echo "✓ Pre-commit hook installed" || echo "✗ Hook installation failed"
|
|
84
|
+
|
|
85
|
+
# Test the hooks work
|
|
86
|
+
bundle exec overcommit --run
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 4. Verify Installation
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# Check CLI works
|
|
93
|
+
bin/raictl version
|
|
94
|
+
|
|
95
|
+
# Run tests
|
|
96
|
+
bundle exec rspec
|
|
97
|
+
|
|
98
|
+
# Run mutation testing
|
|
99
|
+
bundle exec mutant run
|
|
100
|
+
|
|
101
|
+
# Run linter
|
|
102
|
+
bundle exec rubocop
|
|
103
|
+
|
|
104
|
+
# Check for CVEs
|
|
105
|
+
bundle exec bundler-audit check
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Configuration
|
|
109
|
+
|
|
110
|
+
### Global Settings
|
|
111
|
+
|
|
112
|
+
Edit `settings.json` to configure global Claude Code permissions:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"permissions": {
|
|
117
|
+
"allow": ["Bash(bundle:*)"],
|
|
118
|
+
"deny": ["Read(/home/user/.ssh/**)"]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Local Overrides
|
|
124
|
+
|
|
125
|
+
Create `settings.local.json` for machine-specific settings (gitignored):
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"permissions": {
|
|
130
|
+
"additionalDirectories": ["/custom/path"]
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Troubleshooting
|
|
136
|
+
|
|
137
|
+
### Ruby version mismatch
|
|
138
|
+
|
|
139
|
+
If you see "Your Ruby version is X, but your Gemfile specified 3.3.10":
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
rbenv install 3.3.10
|
|
143
|
+
rbenv local 3.3.10
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Bundler issues
|
|
147
|
+
|
|
148
|
+
If gems fail to install:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
gem install bundler
|
|
152
|
+
bundle config set --local path 'vendor/bundle'
|
|
153
|
+
bundle install
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Permission errors
|
|
157
|
+
|
|
158
|
+
Ensure the bin/raictl is executable:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
chmod +x bin/raictl
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Updating Dependencies
|
|
165
|
+
|
|
166
|
+
`Gemfile.lock` is tracked in git and CI uses frozen mode (see ADR-008).
|
|
167
|
+
Always commit lockfile changes explicitly.
|
|
168
|
+
|
|
169
|
+
To update a specific gem:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
bundle update <gem-name>
|
|
173
|
+
bundle exec rspec # verify tests pass
|
|
174
|
+
bundle exec rubocop # verify no new offenses
|
|
175
|
+
bundle exec bundler-audit check # verify no CVEs
|
|
176
|
+
git add Gemfile.lock
|
|
177
|
+
git commit -m "chore(deps): update <gem-name> to X.Y.Z"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
To update all dependencies:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
bundle update
|
|
184
|
+
bundle exec rspec && bundle exec rubocop
|
|
185
|
+
bundle exec bundler-audit check
|
|
186
|
+
git add Gemfile.lock
|
|
187
|
+
git commit -m "chore(deps): update all dependencies"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Uninstalling
|
|
191
|
+
|
|
192
|
+
To remove the project while preserving Claude Code data:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Remove only the rosett-ai-related files
|
|
196
|
+
rm -rf bin/ lib/ spec/ doc/ conf/
|
|
197
|
+
rm -f Gemfile Gemfile.lock rosett-ai.gemspec Rakefile
|
|
198
|
+
rm -f .ruby-version .rubocop.yml .reek.yml .rspec
|
|
199
|
+
rm -f .overcommit.yml .gitleaks.toml
|
|
200
|
+
rm -rf .gitlab-ci-files/ .gitlab-ci.yml
|
|
201
|
+
rm -rf .git/
|
|
202
|
+
```
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Test Peer Review Process
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The test peer review process provides structured, human-verified quality
|
|
6
|
+
assurance for all test suites across the rosett-ai ecosystem. It uses a
|
|
7
|
+
questionnaire-based approach where each spec file is examined through 10
|
|
8
|
+
standardized questions that expose gaps, redundancy, incorrect assumptions,
|
|
9
|
+
and missing edge cases.
|
|
10
|
+
|
|
11
|
+
## Why This Exists
|
|
12
|
+
|
|
13
|
+
When AI generates both code and tests, the test suite can be perfectly
|
|
14
|
+
consistent yet meaningless — tests that mirror the implementation rather than
|
|
15
|
+
validate behaviour. The peer review process creates an independent human
|
|
16
|
+
verification layer that cannot be short-circuited by AI.
|
|
17
|
+
|
|
18
|
+
## Scope
|
|
19
|
+
|
|
20
|
+
| Repository | Spec Files | Examples |
|
|
21
|
+
|-----------|-----------|----------|
|
|
22
|
+
| rosett-ai (core) | 141 | ~1,637 |
|
|
23
|
+
| rosett-ai-engine-claude | 8 | ~104 |
|
|
24
|
+
| rosett-ai-engine-aider | 4 | ~42 |
|
|
25
|
+
| rosett-ai-engine-goose | 4 | ~42 |
|
|
26
|
+
| rosett-ai-engine-gpt-neox | 4 | ~40 |
|
|
27
|
+
| rosett-ai-engine-ollama | 4 | ~39 |
|
|
28
|
+
| rosett-ai-engine-agents-md | 3 | ~25 |
|
|
29
|
+
| rosett-ai-engine-copilot | 3 | ~25 |
|
|
30
|
+
| rosett-ai-engine-cursor | 3 | ~25 |
|
|
31
|
+
| rosett-ai-engine-windsurf | 3 | ~25 |
|
|
32
|
+
| rosett-ai-engine-acme | 3 | ~21 |
|
|
33
|
+
| rosett-ai-engine-generic | 2 | ~17 |
|
|
34
|
+
| **Total** | **174** | **~1,882** |
|
|
35
|
+
|
|
36
|
+
## Questionnaire (Q1–Q10)
|
|
37
|
+
|
|
38
|
+
Each spec file is evaluated against these questions:
|
|
39
|
+
|
|
40
|
+
| # | Question | Severity | What to look for |
|
|
41
|
+
|---|----------|----------|-----------------|
|
|
42
|
+
| Q1 | Intent Clarity | major | Can you explain what the file tests in one sentence? |
|
|
43
|
+
| Q2 | Assertion Quality | critical | Concrete values, not computed from implementation? |
|
|
44
|
+
| Q3 | Edge Case Coverage | major | Empty, nil, boundary, error paths tested? |
|
|
45
|
+
| Q4 | Mock Appropriateness | critical | Mocks only at boundaries, never the unit under test? |
|
|
46
|
+
| Q5 | Implementation Independence | critical | Would tests pass with a rewritten implementation? |
|
|
47
|
+
| Q6 | Mutation Resilience | major | Would mutating the code cause test failures? |
|
|
48
|
+
| Q7 | Naming Quality | minor | Behaviour specs, not implementation descriptions? |
|
|
49
|
+
| Q8 | Fixture Quality | major | Minimal, representative, no sensitive data? |
|
|
50
|
+
| Q9 | Completeness | major | All public methods covered, happy + unhappy paths? |
|
|
51
|
+
| Q10 | Documentation | minor | New developer would understand why each test exists? |
|
|
52
|
+
|
|
53
|
+
## Verdicts
|
|
54
|
+
|
|
55
|
+
**Per question:** pass, concern, fail
|
|
56
|
+
|
|
57
|
+
**Per file:**
|
|
58
|
+
|
|
59
|
+
- `approved` — All questions pass or concern only
|
|
60
|
+
- `approved_with_notes` — Minor concerns, acceptable as-is
|
|
61
|
+
- `needs_fix` — Findings require code changes before sign-off
|
|
62
|
+
- `rejected` — Fundamental issues, test needs rewriting
|
|
63
|
+
|
|
64
|
+
## Finding Severities
|
|
65
|
+
|
|
66
|
+
- **critical** — Blocks sign-off, must be resolved
|
|
67
|
+
- **major** — Should be resolved, can be deferred with justification
|
|
68
|
+
- **minor** — Noted for improvement, does not block
|
|
69
|
+
|
|
70
|
+
## Workflow
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
Phase 1: AI prepares review summary (intent, metrics, observations)
|
|
74
|
+
Phase 2: Human reads spec file + AI summary, answers Q1-Q10
|
|
75
|
+
Phase 3: AI records answers and findings in registry YAML
|
|
76
|
+
Phase 4: If findings exist → AI proposes fixes → human approves
|
|
77
|
+
Phase 5: Human signs off (or requests further changes)
|
|
78
|
+
Phase 6: Progress report updated
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Review Batches (Priority Order)
|
|
82
|
+
|
|
83
|
+
1. **Core foundation** — path_resolver, version, config (~10 files)
|
|
84
|
+
2. **Core compiler** — compiler, composition (~15 files)
|
|
85
|
+
3. **Core security** — policy, secrets, validation (~12 files)
|
|
86
|
+
4. **Core CLI tasks** — thor/tasks/* (~26 files)
|
|
87
|
+
5. **Core modules** — authorship, provenance, etc. (~30 files)
|
|
88
|
+
6. **Core UI/desktop** — gtk4, qt6, tui (~8 files)
|
|
89
|
+
7. **Core utilities** — gemspec, version, i18n (~5 files)
|
|
90
|
+
8. **Engine: claude** — highest complexity (~8 files)
|
|
91
|
+
9. **Remaining engines** — 10 engines (~25 files)
|
|
92
|
+
|
|
93
|
+
## Files
|
|
94
|
+
|
|
95
|
+
| File | Purpose |
|
|
96
|
+
|------|---------|
|
|
97
|
+
| `conf/design/test_peer_review.yml` | Design document (intent, constraints, decisions) |
|
|
98
|
+
| `conf/review/questionnaire.yml` | Questionnaire template (Q1-Q10 definitions) |
|
|
99
|
+
| `conf/review/rosett-ai-core.yml` | Review registry for core repository |
|
|
100
|
+
| `conf/review/rosett-ai-engine-*.yml` | Review registries for engine repositories |
|
|
101
|
+
|
|
102
|
+
## Controlled Stub Allowlists
|
|
103
|
+
|
|
104
|
+
### Problem
|
|
105
|
+
|
|
106
|
+
Thor's `invoke` instantiates command classes internally, so test code cannot
|
|
107
|
+
obtain the instance before the call. This forces the use of RSpec's
|
|
108
|
+
`allow_any_instance_of` — a known code smell that stubs methods on ALL
|
|
109
|
+
instances of a class, bypassing normal instance-level mocking.
|
|
110
|
+
|
|
111
|
+
See: [RSpec any_instance documentation](https://rspec.info/features/3-13/rspec-mocks/working-with-legacy-code/any-instance/)
|
|
112
|
+
|
|
113
|
+
### Solution
|
|
114
|
+
|
|
115
|
+
Build-related spec files define a `stubbable_methods` allowlist: a method
|
|
116
|
+
returning a frozen array of the ONLY methods permitted for
|
|
117
|
+
`allow_any_instance_of` stubbing. Three helper methods enforce the boundary:
|
|
118
|
+
|
|
119
|
+
- `stub_all_stages` — stubs all build pipeline stages (the common case)
|
|
120
|
+
- `stub_stages(*methods)` — stubs a subset (raises if not in allowlist)
|
|
121
|
+
- `stub_stage(method, return: val)` — stubs one method with return value or
|
|
122
|
+
block implementation (raises if not in allowlist)
|
|
123
|
+
|
|
124
|
+
A dedicated spec example verifies that every method in the allowlist still
|
|
125
|
+
exists on the class under test. If the implementation renames or removes a
|
|
126
|
+
method, this example fails immediately with a clear message.
|
|
127
|
+
|
|
128
|
+
### Maintenance requirement
|
|
129
|
+
|
|
130
|
+
When a new build stage or shell-boundary method is added to `BuildPackage`
|
|
131
|
+
or `BuildEngine`, developers must:
|
|
132
|
+
|
|
133
|
+
1. Add the method name to `stubbable_methods` in the corresponding spec file
|
|
134
|
+
2. Use `stub_stages` or `stub_stage` to stub it (never raw
|
|
135
|
+
`allow_any_instance_of`)
|
|
136
|
+
3. Verify the allowlist guard example still passes
|
|
137
|
+
|
|
138
|
+
This is intentional friction — it forces conscious review of every method
|
|
139
|
+
that bypasses real execution in tests. A raw `allow_any_instance_of` call
|
|
140
|
+
outside the helpers will be caught in code review.
|
|
141
|
+
|
|
142
|
+
### Affected files
|
|
143
|
+
|
|
144
|
+
| Spec file | Allowlist method |
|
|
145
|
+
|-----------|-----------------|
|
|
146
|
+
| `spec/rosett_ai/thor/tasks/build_package_spec.rb` | `stubbable_methods` (12 methods) |
|
|
147
|
+
| `spec/rosett_ai/thor/tasks/build_engine_spec.rb` | (to be added in future review) |
|
|
148
|
+
|
|
149
|
+
## Design Reference
|
|
150
|
+
|
|
151
|
+
See `conf/design/test_peer_review.yml` for the full design document including
|
|
152
|
+
decisions TPR-1 through TPR-7.
|