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/QUICKSTART.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Quick Start
|
|
2
|
+
|
|
3
|
+
Get from zero to your first compiled rules in 5 minutes.
|
|
4
|
+
|
|
5
|
+
## 1. Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
sudo dpkg -i nncc_1.0.0-1_amd64.deb
|
|
9
|
+
sudo apt-get install -f # resolve dependencies
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 2. Initialize
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Set up global ~/.claude/ structure
|
|
16
|
+
rai init --global
|
|
17
|
+
|
|
18
|
+
# (Optional) Set up project-local structure
|
|
19
|
+
rai init --local
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 3. Create a behaviour rule
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
rai behaviour manage add my_first_rule
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Edit the created file at `conf/behaviour/my_first_rule.yml`:
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
name: my_first_rule
|
|
32
|
+
description: My first rai behaviour rule
|
|
33
|
+
version: 1.0.0
|
|
34
|
+
author: your_name
|
|
35
|
+
created_at: "2026-01-01"
|
|
36
|
+
modified_at: "2026-01-01"
|
|
37
|
+
modified_by: your_name
|
|
38
|
+
sensitive: false
|
|
39
|
+
used_in: []
|
|
40
|
+
rules:
|
|
41
|
+
- id: rule_001
|
|
42
|
+
description: Always explain your reasoning before making changes
|
|
43
|
+
priority: 50
|
|
44
|
+
enabled: true
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 4. Compile
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Preview what would change
|
|
51
|
+
rai compile --simulate --verbose
|
|
52
|
+
|
|
53
|
+
# Compile rules to ~/.claude/rules/
|
|
54
|
+
rai compile --verbose
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 5. Verify
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Check the generated files
|
|
61
|
+
ls ~/.claude/rules/
|
|
62
|
+
|
|
63
|
+
# Validate everything is consistent
|
|
64
|
+
rai validate
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Next Steps
|
|
68
|
+
|
|
69
|
+
- `rai compile --engine generic` to compile for non-Claude tools
|
|
70
|
+
- `rai design list` to explore design documents
|
|
71
|
+
- `rai adopt --verbose` to analyze your existing rules
|
|
72
|
+
- `man raictl` for the full manual
|
|
73
|
+
- See [INSTALL.md](INSTALL.md) for detailed installation options
|
data/README.md
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
# Rosett-AI
|
|
2
|
+
|
|
3
|
+
**Author rules once, compile to Claude Code, AGENTS.md, and more engines coming soon.**
|
|
4
|
+
|
|
5
|
+
raictl is an engine-agnostic configuration management tool for AI-assisted development workflows.
|
|
6
|
+
Define operational rules in generic YAML, then compile them to any supported AI tool's native format.
|
|
7
|
+
v1.2.0 ships with Claude Code and AGENTS.md engines.
|
|
8
|
+
Additional engines (Cursor, Copilot, Windsurf, Goose, Aider, Ollama, GPT-NeoX, Generic) are in development.
|
|
9
|
+
|
|
10
|
+
```mermaid
|
|
11
|
+
graph LR
|
|
12
|
+
subgraph Input["Human Intent (YAML)"]
|
|
13
|
+
B[conf/behaviour/*.yml]
|
|
14
|
+
D[conf/design/*.yml]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
subgraph rosett-ai["Rosett-AI Compiler"]
|
|
18
|
+
P[Compilation Pipeline]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
subgraph Engines["Engine Backends"]
|
|
22
|
+
C[Claude Code]:::available
|
|
23
|
+
A[AGENTS.md]:::available
|
|
24
|
+
CU[Cursor]:::planned
|
|
25
|
+
CP[Copilot]:::planned
|
|
26
|
+
WS[Windsurf]:::planned
|
|
27
|
+
GO[Goose]:::planned
|
|
28
|
+
AI[Aider]:::planned
|
|
29
|
+
O[Ollama]:::planned
|
|
30
|
+
G[GPT-NeoX]:::planned
|
|
31
|
+
X[Generic]:::planned
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
B --> P
|
|
35
|
+
D --> P
|
|
36
|
+
P --> C
|
|
37
|
+
P --> A
|
|
38
|
+
P --> CU
|
|
39
|
+
P --> CP
|
|
40
|
+
P --> WS
|
|
41
|
+
P --> GO
|
|
42
|
+
P --> AI
|
|
43
|
+
P --> O
|
|
44
|
+
P --> G
|
|
45
|
+
P --> X
|
|
46
|
+
|
|
47
|
+
classDef available stroke:#22c55e,stroke-width:2px
|
|
48
|
+
classDef planned stroke:#94a3b8,stroke-width:1px,stroke-dasharray:5 5,fill:#f8fafc,color:#64748b
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Field | Value |
|
|
52
|
+
|-------|-------|
|
|
53
|
+
| Version | <!-- rai:version -->1.2.0<!-- /rai:version --> |
|
|
54
|
+
| License | GPL-3.0-only |
|
|
55
|
+
| Ruby | 3.3.10 (rbenv) |
|
|
56
|
+
| Tests | <!-- rai:tests -->4672 RSpec specs<!-- /rai:tests --> |
|
|
57
|
+
| Author | Hugo Antonio Sepulveda Manriquez |
|
|
58
|
+
|
|
59
|
+
## Quick Start
|
|
60
|
+
|
|
61
|
+
### Install from RubyGems
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
gem install rosett-ai
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Or install from .deb (Debian/Ubuntu)
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
sudo dpkg -i rosett-ai_1.2.0-1_amd64.deb
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Initialize
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
raictl init --global
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Write your first behaviour rule
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
raictl behaviour manage add my_rules
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Compile to Claude Code
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
raictl compile --verbose
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Verify
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
ls ~/.claude/rules/
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Features
|
|
98
|
+
|
|
99
|
+
```mermaid
|
|
100
|
+
mindmap
|
|
101
|
+
root((raictl))
|
|
102
|
+
Engine Backends
|
|
103
|
+
Claude Code ✓
|
|
104
|
+
AGENTS.md ✓
|
|
105
|
+
Cursor ○
|
|
106
|
+
Copilot ○
|
|
107
|
+
Windsurf ○
|
|
108
|
+
Goose ○
|
|
109
|
+
Aider ○
|
|
110
|
+
Ollama ○
|
|
111
|
+
GPT-NeoX ○
|
|
112
|
+
Generic ○
|
|
113
|
+
Desktop Integration
|
|
114
|
+
D-Bus IPC Service
|
|
115
|
+
GTK4/Adwaita App
|
|
116
|
+
Focus Monitoring
|
|
117
|
+
5 Compositor Adapters
|
|
118
|
+
Configuration
|
|
119
|
+
Behaviour Rules
|
|
120
|
+
Design Documents
|
|
121
|
+
JSON Schema Validation
|
|
122
|
+
Configuration Hierarchy
|
|
123
|
+
Security
|
|
124
|
+
Ed25519 JWT Licensing
|
|
125
|
+
YAML DoS Prevention
|
|
126
|
+
Path Whitelisting
|
|
127
|
+
Custom RuboCop Cops
|
|
128
|
+
CLI
|
|
129
|
+
Compile / Validate / Adopt
|
|
130
|
+
Backup / Migrate / Doctor
|
|
131
|
+
Engine Detection
|
|
132
|
+
Accessibility
|
|
133
|
+
EN 301 549 Compliance
|
|
134
|
+
Accessible TUI
|
|
135
|
+
i18n (en, fr, ar)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Core Capabilities
|
|
139
|
+
|
|
140
|
+
- **Engine-Agnostic Compilation** -- Write rules in generic YAML, compile to any AI tool
|
|
141
|
+
- **<!-- rai:engines -->2<!-- /rai:engines --> Available Engine Backends** -- Claude Code, AGENTS.md (8 more planned: Cursor, Copilot, Windsurf, Goose, Aider, Ollama, GPT-NeoX, Generic)
|
|
142
|
+
- **D-Bus Desktop Service** -- `be.neatnerds.rosettai` session bus with Manager and FocusMonitor interfaces
|
|
143
|
+
- **GTK4/Adwaita Application** -- Crash-proof GUI with `safe_action()` wrapper pattern
|
|
144
|
+
- **Behaviour Management** -- Priority-sorted rules (1-100 scale) with sensitivity filtering
|
|
145
|
+
- **Adopt Analysis** -- Local structural checks with optional API-powered analysis
|
|
146
|
+
- **Content Packs** -- Premium content delivery via Ed25519-signed JWT licensing
|
|
147
|
+
- **Debian Packaging** -- `.deb` packages via fpm for core, gtk4, and qt6 variants
|
|
148
|
+
- **i18n** -- Internationalisation with gettext/Qt locale compilation
|
|
149
|
+
|
|
150
|
+
## Architecture Overview
|
|
151
|
+
|
|
152
|
+
```mermaid
|
|
153
|
+
graph TB
|
|
154
|
+
subgraph CLI["CLI Layer (Thor)"]
|
|
155
|
+
BIN[bin/raictl]
|
|
156
|
+
THOR[RosettAi::Thor::CLI]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
subgraph LIB["Library Layer"]
|
|
160
|
+
COMP[Compiler::Pipeline]
|
|
161
|
+
VALID[Validators]
|
|
162
|
+
CONFIG[Configuration]
|
|
163
|
+
PATH[PathResolver]
|
|
164
|
+
ADOPT[Adopter]
|
|
165
|
+
YAML[YamlLoader]
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
subgraph ENGINES["Engine Layer"]
|
|
169
|
+
CLAUDE[engines/claude/]:::available
|
|
170
|
+
AGENTS[engines/agents_md/]:::available
|
|
171
|
+
CURSOR[engines/cursor/]:::planned
|
|
172
|
+
COPILOT[engines/copilot/]:::planned
|
|
173
|
+
WINDSURF[engines/windsurf/]:::planned
|
|
174
|
+
GOOSE[engines/goose/]:::planned
|
|
175
|
+
AIDER[engines/aider/]:::planned
|
|
176
|
+
OLLAMA[engines/ollama/]:::planned
|
|
177
|
+
NEOX[engines/gpt_neox/]:::planned
|
|
178
|
+
GENERIC[engines/generic/]:::planned
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
subgraph DESKTOP["Desktop Layer"]
|
|
182
|
+
DBUS_SVC[D-Bus Service]
|
|
183
|
+
GTK4[GTK4 App]
|
|
184
|
+
FOCUS[Focus Monitor]
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
BIN --> THOR
|
|
188
|
+
THOR --> COMP
|
|
189
|
+
THOR --> VALID
|
|
190
|
+
THOR --> CONFIG
|
|
191
|
+
THOR --> ADOPT
|
|
192
|
+
COMP --> ENGINES
|
|
193
|
+
COMP --> YAML
|
|
194
|
+
VALID --> YAML
|
|
195
|
+
CONFIG --> PATH
|
|
196
|
+
DBUS_SVC --> COMP
|
|
197
|
+
GTK4 -->|D-Bus IPC| DBUS_SVC
|
|
198
|
+
FOCUS --> DBUS_SVC
|
|
199
|
+
|
|
200
|
+
classDef available stroke:#22c55e,stroke-width:2px
|
|
201
|
+
classDef planned stroke:#94a3b8,stroke-width:1px,stroke-dasharray:5 5,fill:#f8fafc,color:#64748b
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
> **Legend:** Solid border = Available | Dashed border = Planned
|
|
205
|
+
|
|
206
|
+
## CLI Commands
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# Compilation
|
|
210
|
+
raictl compile # Compile rules (default engine)
|
|
211
|
+
raictl compile --engine agents_md # Compile to AGENTS.md format
|
|
212
|
+
raictl compile --engine ollama # Compile for Ollama
|
|
213
|
+
raictl compile --strict # Treat warnings as errors
|
|
214
|
+
raictl compile --simulate --verbose # Dry run with diffs
|
|
215
|
+
|
|
216
|
+
# Engine management
|
|
217
|
+
raictl engines list # List all known engines
|
|
218
|
+
raictl engines detect # Detect installed engines
|
|
219
|
+
raictl engines status # Show default engine + detection
|
|
220
|
+
|
|
221
|
+
# Validation & analysis
|
|
222
|
+
raictl validate # Validate all config files
|
|
223
|
+
raictl adopt # Local-only structural checks
|
|
224
|
+
raictl adopt --api --verbose # Remote API analysis
|
|
225
|
+
|
|
226
|
+
# Configuration
|
|
227
|
+
raictl behaviour display # Show behaviour configuration
|
|
228
|
+
raictl config compile # Compile YAML scopes to JSON
|
|
229
|
+
raictl design list # List design documents
|
|
230
|
+
|
|
231
|
+
# Desktop
|
|
232
|
+
raictl dbus start # Start D-Bus service
|
|
233
|
+
raictl desktop gtk4 # Launch GTK4 application
|
|
234
|
+
|
|
235
|
+
# Backup
|
|
236
|
+
raictl backup --global --local # Back up all configurations
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
See [USAGE.md](doc/USAGE.md) for the full command reference.
|
|
240
|
+
|
|
241
|
+
## Documentation
|
|
242
|
+
|
|
243
|
+
| Document | Description |
|
|
244
|
+
|----------|-------------|
|
|
245
|
+
| [ARCHITECTURE.md](doc/ARCHITECTURE.md) | System architecture with Mermaid diagrams |
|
|
246
|
+
| [ENGINES.md](doc/ENGINES.md) | Engine backends and compilation targets |
|
|
247
|
+
| [DESKTOP.md](doc/DESKTOP.md) | D-Bus service and GTK4 desktop app |
|
|
248
|
+
| [SETUP.md](doc/SETUP.md) | Installation and setup guide |
|
|
249
|
+
| [USAGE.md](doc/USAGE.md) | CLI usage and examples |
|
|
250
|
+
| [CONFIGURATION.md](doc/CONFIGURATION.md) | Configuration reference |
|
|
251
|
+
| [BEHAVIOUR.md](doc/BEHAVIOUR.md) | Behaviour system documentation |
|
|
252
|
+
| [ADOPT.md](doc/ADOPT.md) | Adopt analysis documentation |
|
|
253
|
+
| [PACKAGING.md](doc/PACKAGING.md) | Debian packaging |
|
|
254
|
+
| [REFERENCES.md](doc/REFERENCES.md) | External references and bibliography |
|
|
255
|
+
| [IMPLEMENTATION_PLAN.md](doc/IMPLEMENTATION_PLAN.md) | Phased roadmap |
|
|
256
|
+
| [CONTRIBUTING.md](CONTRIBUTING.md) | Developer guide |
|
|
257
|
+
|
|
258
|
+
### Architecture Decision Records
|
|
259
|
+
|
|
260
|
+
| ADR | Status | Decision |
|
|
261
|
+
|-----|--------|----------|
|
|
262
|
+
| [001](doc/decisions/001-flog-deferred.md) | Accepted | Defer Flog (covered by RuboCop) |
|
|
263
|
+
| [002](doc/decisions/002-path-resolution-strategy.md) | Accepted | Centralised PathResolver |
|
|
264
|
+
| [003](doc/decisions/003-ui-adapter-selection.md) | Accepted | 5-level UI cascade |
|
|
265
|
+
| [004](doc/decisions/004-design-document-validation.md) | Accepted | Generic SchemaValidator |
|
|
266
|
+
| [005](doc/decisions/005-package-splitting-strategy.md) | Accepted | Plugin gems in mono-repo |
|
|
267
|
+
| [006](doc/decisions/006-multi-engine-architecture.md) | Superseded | Multi-engine (see ADR-007) |
|
|
268
|
+
| [007](doc/decisions/007-engine-agnostic-pivot.md) | Accepted | Engine-agnostic pivot |
|
|
269
|
+
|
|
270
|
+
## Project Structure
|
|
271
|
+
|
|
272
|
+
```text
|
|
273
|
+
rosett-ai/
|
|
274
|
+
├── bin/raictl # CLI executable
|
|
275
|
+
├── lib/rosett_ai/ # Ruby library (4800+ LOC)
|
|
276
|
+
│ ├── engines/ # Engine backends
|
|
277
|
+
│ │ ├── claude/ # Claude Code engine (7 components)
|
|
278
|
+
│ │ ├── cursor/ # Cursor (Anysphere) engine
|
|
279
|
+
│ │ ├── copilot/ # GitHub Copilot engine
|
|
280
|
+
│ │ ├── windsurf/ # Windsurf (Codeium) engine
|
|
281
|
+
│ │ ├── agents_md/ # AGENTS.md engine
|
|
282
|
+
│ │ ├── goose/ # Goose (Block) engine
|
|
283
|
+
│ │ ├── aider/ # Aider engine
|
|
284
|
+
│ │ ├── generic/ # Generic markdown engine
|
|
285
|
+
│ │ ├── ollama/ # Ollama engine
|
|
286
|
+
│ │ └── gpt_neox/ # GPT-NeoX engine
|
|
287
|
+
│ ├── compiler/ # Compilation pipeline
|
|
288
|
+
│ ├── desktop/ # GTK4 app + GUI logger
|
|
289
|
+
│ ├── dbus/ # D-Bus service + focus adapters
|
|
290
|
+
│ ├── validators/ # Schema-based validators
|
|
291
|
+
│ ├── licensing/ # Ed25519 JWT license keys
|
|
292
|
+
│ ├── content/ # Content pack system
|
|
293
|
+
│ ├── backup/ # Backup with compression
|
|
294
|
+
│ ├── thor/tasks/ # 16 CLI subcommands
|
|
295
|
+
│ └── ui/ # UI adapter registry
|
|
296
|
+
├── conf/ # Configuration
|
|
297
|
+
│ ├── behaviour/ # Behaviour YAML files
|
|
298
|
+
│ ├── design/ # Design documents (21 files)
|
|
299
|
+
│ ├── schemas/ # JSON Schemas (10 files)
|
|
300
|
+
│ ├── engines/ # Per-engine config
|
|
301
|
+
│ └── packaging/ # Package variant configs
|
|
302
|
+
├── spec/ # RSpec tests (119 files)
|
|
303
|
+
├── doc/ # Documentation
|
|
304
|
+
│ ├── decisions/ # ADRs (001-007)
|
|
305
|
+
│ └── changes/ # Implementation notes
|
|
306
|
+
├── locales/ # i18n (en, fr, ar)
|
|
307
|
+
├── packaging/ # Debian scripts
|
|
308
|
+
└── CLAUDE.md # Project instructions
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Development
|
|
312
|
+
|
|
313
|
+
### Building from source
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
git clone https://gitlab.com/neatnerds/foss/rosett-ai.git
|
|
317
|
+
cd rosett-ai
|
|
318
|
+
rbenv install 3.3.10
|
|
319
|
+
bundle install
|
|
320
|
+
overcommit --install
|
|
321
|
+
bin/raictl version
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Quality checks
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
bundle exec rspec # Run tests
|
|
328
|
+
bundle exec rubocop # Lint
|
|
329
|
+
bundle exec reek # Code smell detection
|
|
330
|
+
bundle exec bundler-audit check # Security audit
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for the full developer guide.
|
|
334
|
+
|
|
335
|
+
## Roadmap
|
|
336
|
+
|
|
337
|
+
```mermaid
|
|
338
|
+
gantt
|
|
339
|
+
title Rosett-AI Development Roadmap
|
|
340
|
+
dateFormat YYYY-MM-DD
|
|
341
|
+
axisFormat %b %d
|
|
342
|
+
|
|
343
|
+
section Engine Phases
|
|
344
|
+
Phase 0a - Rename :done, e0a, 2026-02-26, 1d
|
|
345
|
+
Phase 0b - Engine dirs :done, e0b, after e0a, 1d
|
|
346
|
+
Phase 0c - XDG + detection :done, e0c, after e0b, 1d
|
|
347
|
+
Engine 1 - AGENTS.md :done, e1, after e0c, 1d
|
|
348
|
+
Engine 2 - Ollama + GPT-NeoX :done, e2, after e1, 1d
|
|
349
|
+
Engine 3 - Goose + Aider :done, e3, after e2, 1d
|
|
350
|
+
Engine 4 - Cursor + Copilot :done, e4, after e3, 1d
|
|
351
|
+
|
|
352
|
+
section Desktop Phases
|
|
353
|
+
Desktop 1 - D-Bus service :done, d1, after e0c, 1d
|
|
354
|
+
Desktop 2 - GTK4 app :done, d2, after d1, 1d
|
|
355
|
+
GTK4 hardening :done, d2h, after d2, 1d
|
|
356
|
+
Desktop 3 - KDE KCM :d3, after d2h, 5d
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## License
|
|
360
|
+
|
|
361
|
+
GPL-3.0-only
|
|
362
|
+
|
|
363
|
+
## Contact
|
|
364
|
+
|
|
365
|
+
- Author: hugo@neatnerds.be
|
|
366
|
+
- Support: query@neatnerds.be
|
data/Rakefile
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
4
|
+
# Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
|
|
5
|
+
|
|
6
|
+
require 'bundler/gem_tasks'
|
|
7
|
+
require 'rspec/core/rake_task'
|
|
8
|
+
require 'rubocop/rake_task'
|
|
9
|
+
|
|
10
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
11
|
+
RuboCop::RakeTask.new
|
|
12
|
+
|
|
13
|
+
desc 'Run reek smell detector'
|
|
14
|
+
task :reek do
|
|
15
|
+
sh 'bundle', 'exec', 'reek', 'lib/rosett_ai.rb', 'lib/rosett_ai/'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
desc 'Check dependency licenses for GPL-3.0 compatibility'
|
|
19
|
+
task :licenses do
|
|
20
|
+
sh 'bundle', 'exec', 'license_finder'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
desc 'Detect potentially uncalled methods'
|
|
24
|
+
task :debride do
|
|
25
|
+
sh 'bundle', 'exec', 'debride', '-w', '.debride_whitelist', 'lib/'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
desc 'Audit dependencies for known vulnerabilities'
|
|
29
|
+
task :bundler_audit do
|
|
30
|
+
sh 'bundle', 'exec', 'bundler-audit', 'check', '--update'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
desc 'Detect structural code duplication'
|
|
34
|
+
task :flay do
|
|
35
|
+
sh 'bundle', 'exec', 'flay', '--mass', '16', 'lib/'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
desc 'Run all quality gates'
|
|
39
|
+
task quality: [:spec, :rubocop, :reek, :licenses, :debride, :bundler_audit, :fasterer, :flay]
|
|
40
|
+
|
|
41
|
+
task default: :quality
|
|
42
|
+
|
|
43
|
+
namespace :docs do
|
|
44
|
+
desc 'Update all documentation'
|
|
45
|
+
task :update do
|
|
46
|
+
require_relative 'lib/rosett_ai'
|
|
47
|
+
RosettAi::Thor::Tasks::Documentation.new.update
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
desc 'Check documentation status'
|
|
51
|
+
task :status do
|
|
52
|
+
require_relative 'lib/rosett_ai'
|
|
53
|
+
RosettAi::Thor::Tasks::Documentation.new.status
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
namespace :man do
|
|
58
|
+
desc 'Build man pages from ronn source'
|
|
59
|
+
task :build do
|
|
60
|
+
require 'ronn'
|
|
61
|
+
source = File.expand_path('doc/man/rai.1.ronn', __dir__)
|
|
62
|
+
output_dir = File.expand_path('man/man1', __dir__)
|
|
63
|
+
FileUtils.mkdir_p(output_dir)
|
|
64
|
+
|
|
65
|
+
doc = Ronn::Document.new(source)
|
|
66
|
+
File.write(File.join(output_dir, 'rai.1'), doc.to_roff)
|
|
67
|
+
puts 'Generated man/man1/rai.1'
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
begin
|
|
72
|
+
require 'yard'
|
|
73
|
+
YARD::Rake::YardocTask.new(:yard) do |t|
|
|
74
|
+
t.files = ['lib/**/*.rb']
|
|
75
|
+
t.options = ['--output-dir', 'doc/api', '--markup', 'markdown', '--no-private']
|
|
76
|
+
end
|
|
77
|
+
rescue LoadError
|
|
78
|
+
desc 'Generate YARD documentation (yard gem not installed)'
|
|
79
|
+
task(:yard) { warn 'yard gem is not installed. Run: gem install yard' }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
desc 'Generate CHANGELOG.md from conventional commits (requires git-cliff)'
|
|
83
|
+
task :changelog do
|
|
84
|
+
unless system('which git-cliff > /dev/null 2>&1')
|
|
85
|
+
warn 'git-cliff is not installed. See: https://git-cliff.org/docs/installation'
|
|
86
|
+
exit 1
|
|
87
|
+
end
|
|
88
|
+
system('git-cliff', '--config', 'cliff.toml', '--output', 'CHANGELOG.md') || exit(1)
|
|
89
|
+
puts 'Generated CHANGELOG.md'
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
desc 'Run fasterer performance suggestions'
|
|
93
|
+
task :fasterer do
|
|
94
|
+
require 'fasterer/cli'
|
|
95
|
+
Fasterer::CLI.execute
|
|
96
|
+
rescue LoadError
|
|
97
|
+
warn 'fasterer gem is not installed. Run: gem install fasterer'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
namespace :behaviour do
|
|
101
|
+
desc 'Validate all behaviour files'
|
|
102
|
+
task :validate do
|
|
103
|
+
require_relative 'lib/rosett_ai'
|
|
104
|
+
RosettAi::Thor::Tasks::Behaviour.new.validate
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
desc 'List all behaviour files'
|
|
108
|
+
task :list do
|
|
109
|
+
require_relative 'lib/rosett_ai'
|
|
110
|
+
RosettAi::Thor::Tasks::Behaviour.new.list
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
namespace :build do
|
|
115
|
+
desc 'Build core .deb package (variant: core, gtk4, qt6)'
|
|
116
|
+
task :package, [:variant] do |_t, args|
|
|
117
|
+
require_relative 'lib/rosett_ai'
|
|
118
|
+
# Trigger Zeitwerk autoload of Build (which defines BuildPackage)
|
|
119
|
+
RosettAi::Thor::Tasks::Build # rubocop:disable Lint/Void
|
|
120
|
+
opts = build_package_opts(args)
|
|
121
|
+
RosettAi::Thor::Tasks::BuildPackage.new([], opts).invoke(:create)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
desc 'Build engine plugin .deb package'
|
|
125
|
+
task :engine do
|
|
126
|
+
require_relative 'lib/rosett_ai'
|
|
127
|
+
RosettAi::Thor::Tasks::Build # rubocop:disable Lint/Void
|
|
128
|
+
RosettAi::Thor::Tasks::BuildEngine.new.invoke(:create)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Build option flags from Rake args and environment variables.
|
|
133
|
+
# Usage:
|
|
134
|
+
# rake build:package # defaults
|
|
135
|
+
# rake build:package[gtk4] # variant only
|
|
136
|
+
# rake build:package VERBOSE=1 CLEAN=1 # flags via env
|
|
137
|
+
# rake build:package[gtk4] VERBOSE=1 CLEAN=1 # both
|
|
138
|
+
def build_package_opts(args)
|
|
139
|
+
opts = {}
|
|
140
|
+
opts[:variant] = args[:variant] if args[:variant]
|
|
141
|
+
opts[:verbose] = true if ENV['VERBOSE']
|
|
142
|
+
opts[:clean] = true if ENV['CLEAN']
|
|
143
|
+
opts[:ruby_version] = ENV['RUBY_VERSION'] if ENV['RUBY_VERSION']
|
|
144
|
+
opts[:architecture] = ENV['ARCHITECTURE'] if ENV['ARCHITECTURE']
|
|
145
|
+
opts[:output_dir] = ENV['OUTPUT_DIR'] if ENV['OUTPUT_DIR']
|
|
146
|
+
opts[:build_iteration] = ENV['BUILD_ITERATION'].to_i if ENV['BUILD_ITERATION']
|
|
147
|
+
opts
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
namespace :release do
|
|
151
|
+
desc 'Prepare release (level: major, minor, patch)'
|
|
152
|
+
task :prepare, [:level] do |_t, args|
|
|
153
|
+
require_relative 'lib/rosett_ai'
|
|
154
|
+
RosettAi::Thor::Tasks::Release.new.invoke(:prepare, [args[:level] || 'patch'])
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
desc 'Create annotated git tag from current VERSION'
|
|
158
|
+
task :tag do
|
|
159
|
+
require_relative 'lib/rosett_ai'
|
|
160
|
+
RosettAi::Thor::Tasks::Release.new.invoke(:tag)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
desc 'Show release status (version, last tag, unreleased commits)'
|
|
164
|
+
task :status do
|
|
165
|
+
require_relative 'lib/rosett_ai'
|
|
166
|
+
RosettAi::Thor::Tasks::Release.new.invoke(:status)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
namespace :readme do
|
|
171
|
+
desc 'Update README version, test count, and engine count from live sources'
|
|
172
|
+
task :update do
|
|
173
|
+
require_relative 'lib/rosett_ai/version'
|
|
174
|
+
require 'json'
|
|
175
|
+
|
|
176
|
+
readme_path = File.expand_path('README.md', __dir__)
|
|
177
|
+
content = File.read(readme_path)
|
|
178
|
+
|
|
179
|
+
# Version from constant
|
|
180
|
+
version = RosettAi::VERSION
|
|
181
|
+
content.gsub!(%r{<!-- rai:version -->.*?<!-- /rai:version -->},
|
|
182
|
+
"<!-- rai:version -->#{version}<!-- /rai:version -->")
|
|
183
|
+
|
|
184
|
+
# Test count via rspec --dry-run (COVERAGE=false suppresses SimpleCov noise in stdout)
|
|
185
|
+
env = { 'COVERAGE' => 'false' }
|
|
186
|
+
json_output = IO.popen(env, ['bundle', 'exec', 'rspec', '--dry-run', '--format', 'json'],
|
|
187
|
+
err: File::NULL, &:read)
|
|
188
|
+
test_count = JSON.parse(json_output).dig('summary', 'example_count')
|
|
189
|
+
content.gsub!(%r{<!-- rai:tests -->.*?<!-- /rai:tests -->},
|
|
190
|
+
"<!-- rai:tests -->#{test_count} RSpec specs<!-- /rai:tests -->")
|
|
191
|
+
|
|
192
|
+
# Engine count from target profiles
|
|
193
|
+
engine_count = Dir[File.expand_path('conf/targets/*.yml', __dir__)].size
|
|
194
|
+
content.gsub!(%r{<!-- rai:engines -->\d+<!-- /rai:engines -->},
|
|
195
|
+
"<!-- rai:engines -->#{engine_count}<!-- /rai:engines -->")
|
|
196
|
+
|
|
197
|
+
File.write(readme_path, content)
|
|
198
|
+
puts "README.md updated: v#{version}, #{test_count} specs, #{engine_count} engines"
|
|
199
|
+
end
|
|
200
|
+
end
|