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,417 @@
|
|
|
1
|
+
# Engine Development Guide
|
|
2
|
+
|
|
3
|
+
This guide covers everything needed to create a third-party rosett-ai engine plugin.
|
|
4
|
+
Engines are separate Ruby gems that extend rosett-ai with compilation backends,
|
|
5
|
+
autodetection, API executors, and configuration compilers for specific AI tools.
|
|
6
|
+
|
|
7
|
+
## Architecture Overview
|
|
8
|
+
|
|
9
|
+
Engines are packaged as gems named `rosett-ai-engine-<name>` under the `RosettAiEngine::`
|
|
10
|
+
namespace. Each engine is self-contained — it has no dependencies on other engines
|
|
11
|
+
and only depends on `rosett-ai` core for base classes and the plugin registry.
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
rosett-ai-engine-myengine/
|
|
15
|
+
├── rosett-ai-engine-myengine.gemspec
|
|
16
|
+
├── lib/
|
|
17
|
+
│ └── rosett_ai_engine/
|
|
18
|
+
│ └── myengine/
|
|
19
|
+
│ ├── register.rb # Self-registration entry point (required)
|
|
20
|
+
│ ├── engine.rb # Engine module with component declarations
|
|
21
|
+
│ ├── backend.rb # Compilation backend (required)
|
|
22
|
+
│ ├── detector.rb # Autodetection (optional)
|
|
23
|
+
│ ├── executor.rb # API executor for adopt (optional)
|
|
24
|
+
│ └── config_compiler.rb # Settings compiler (optional)
|
|
25
|
+
├── conf/
|
|
26
|
+
│ └── manifest.yml # Capability manifest (required)
|
|
27
|
+
├── spec/
|
|
28
|
+
│ └── ... # RSpec tests
|
|
29
|
+
└── Gemfile
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Manifest File
|
|
33
|
+
|
|
34
|
+
Every engine must have a `conf/manifest.yml` in its gem root directory. This file
|
|
35
|
+
declares the engine's name, components, detection rules, and capabilities.
|
|
36
|
+
|
|
37
|
+
### Required Fields
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
name: myengine # lowercase, a-z, 0-9, underscore
|
|
41
|
+
display_name: "My Engine (Vendor)" # Human-readable name
|
|
42
|
+
version: "1.0.0" # Semantic version
|
|
43
|
+
|
|
44
|
+
components:
|
|
45
|
+
backend: true # Required: always true
|
|
46
|
+
|
|
47
|
+
capabilities:
|
|
48
|
+
compile: true # Required: always true
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Optional Fields
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
components:
|
|
55
|
+
backend: true
|
|
56
|
+
detector: true # Provides autodetection
|
|
57
|
+
executor: true # Provides API executor
|
|
58
|
+
config_compiler: true # Compiles settings files
|
|
59
|
+
scaffolder: true # Project scaffolding
|
|
60
|
+
|
|
61
|
+
detection:
|
|
62
|
+
cli_binary: myengine # Check: which <binary>
|
|
63
|
+
config_dir: "~/.myengine" # Check: Dir.exist?
|
|
64
|
+
env_var: MYENGINE_API_KEY # Check: ENV[var] set
|
|
65
|
+
|
|
66
|
+
execution:
|
|
67
|
+
api_gem: myengine-sdk # Ruby gem for API client
|
|
68
|
+
model: "myengine-v1" # Default model
|
|
69
|
+
api_type: sdk # cli | http | grpc | sdk | openai_compatible
|
|
70
|
+
default_endpoint: "https://api.myengine.com"
|
|
71
|
+
cli_binary: myengine
|
|
72
|
+
|
|
73
|
+
capabilities:
|
|
74
|
+
compile: true
|
|
75
|
+
config: false # settings.json compilation
|
|
76
|
+
adopt_api: true # Remote adopt analysis
|
|
77
|
+
settings_json: false # settings.json support
|
|
78
|
+
local_only: false # Local-only LLM
|
|
79
|
+
sensitive_filtering: true # Filter sensitive behaviours
|
|
80
|
+
rule_metadata: true # Preserve rule IDs/priority
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The manifest is validated against `conf/schemas/engine_manifest_schema.json`
|
|
84
|
+
during plugin registration.
|
|
85
|
+
|
|
86
|
+
## Registration
|
|
87
|
+
|
|
88
|
+
Engines self-register via a `register.rb` file that is discovered automatically
|
|
89
|
+
by rosett-ai's plugin registry.
|
|
90
|
+
|
|
91
|
+
### lib/rosett_ai_engine/myengine/register.rb
|
|
92
|
+
|
|
93
|
+
```ruby
|
|
94
|
+
# frozen_string_literal: true
|
|
95
|
+
|
|
96
|
+
require_relative 'engine'
|
|
97
|
+
|
|
98
|
+
RosettAi::Plugins::Registry.register(
|
|
99
|
+
:engine,
|
|
100
|
+
'myengine',
|
|
101
|
+
RosettAiEngine::Myengine::Engine
|
|
102
|
+
)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### lib/rosett_ai_engine/myengine/engine.rb
|
|
106
|
+
|
|
107
|
+
```ruby
|
|
108
|
+
# frozen_string_literal: true
|
|
109
|
+
|
|
110
|
+
module RosettAiEngine
|
|
111
|
+
module Myengine
|
|
112
|
+
module Engine
|
|
113
|
+
extend RosettAi::Plugins::EngineContract
|
|
114
|
+
|
|
115
|
+
def self.engine_name = 'myengine'
|
|
116
|
+
def self.display_name = 'My Engine (Vendor)'
|
|
117
|
+
def self.version = '1.0.0'
|
|
118
|
+
def self.manifest_path = Pathname.new(__dir__).join('../../conf/manifest.yml')
|
|
119
|
+
def self.backend_class = RosettAiEngine::Myengine::Backend
|
|
120
|
+
def self.detector_class = RosettAiEngine::Myengine::Detector # optional
|
|
121
|
+
def self.executor_class = RosettAiEngine::Myengine::Executor # optional
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Component Interfaces
|
|
128
|
+
|
|
129
|
+
### Backend (Required)
|
|
130
|
+
|
|
131
|
+
The backend compiles behaviour YAML into the engine's native format (markdown,
|
|
132
|
+
JSON, TOML, etc.).
|
|
133
|
+
|
|
134
|
+
```ruby
|
|
135
|
+
# frozen_string_literal: true
|
|
136
|
+
|
|
137
|
+
module RosettAiEngine
|
|
138
|
+
module Myengine
|
|
139
|
+
class Backend < RosettAi::Compiler::Backend
|
|
140
|
+
# Render compiled behaviour data into engine-native format.
|
|
141
|
+
#
|
|
142
|
+
# @param data [Hash] behaviour data with keys:
|
|
143
|
+
# - :name [String] behaviour name
|
|
144
|
+
# - :description [String] behaviour description
|
|
145
|
+
# - :version [String] behaviour version
|
|
146
|
+
# - :rules [Array<Hash>] sorted rules with :id, :description, :priority
|
|
147
|
+
# - :category [String] compilation category
|
|
148
|
+
# @return [String] compiled output
|
|
149
|
+
def render(data)
|
|
150
|
+
lines = []
|
|
151
|
+
lines << "# #{data[:name]}"
|
|
152
|
+
lines << ""
|
|
153
|
+
data[:rules].each do |rule|
|
|
154
|
+
lines << "- #{rule[:description]}"
|
|
155
|
+
end
|
|
156
|
+
lines.join("\n")
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Marker prefix for identifying managed files.
|
|
160
|
+
# Used in generated comments to detect orphaned output files.
|
|
161
|
+
#
|
|
162
|
+
# @return [String]
|
|
163
|
+
def generated_marker
|
|
164
|
+
'rosett-ai-myengine-managed'
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Detector (Optional)
|
|
172
|
+
|
|
173
|
+
The detector checks whether the AI tool is installed on the system.
|
|
174
|
+
The base class reads detection rules from the manifest; override
|
|
175
|
+
`custom_checks` for engine-specific probing.
|
|
176
|
+
|
|
177
|
+
```ruby
|
|
178
|
+
# frozen_string_literal: true
|
|
179
|
+
|
|
180
|
+
module RosettAiEngine
|
|
181
|
+
module Myengine
|
|
182
|
+
class Detector < RosettAi::Engines::Detector
|
|
183
|
+
protected
|
|
184
|
+
|
|
185
|
+
# Add custom detection checks beyond manifest-driven ones.
|
|
186
|
+
#
|
|
187
|
+
# @return [Array<Hash>] check results with :type, :name, :passed
|
|
188
|
+
def custom_checks
|
|
189
|
+
checks = []
|
|
190
|
+
# Example: check for engine-specific config file
|
|
191
|
+
config = File.expand_path('~/.myengine/config.json')
|
|
192
|
+
checks << { type: 'file', name: config, passed: File.exist?(config) }
|
|
193
|
+
checks
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Executor (Optional)
|
|
201
|
+
|
|
202
|
+
The executor calls the AI tool's API for `rai adopt --api` analysis.
|
|
203
|
+
|
|
204
|
+
```ruby
|
|
205
|
+
# frozen_string_literal: true
|
|
206
|
+
|
|
207
|
+
module RosettAiEngine
|
|
208
|
+
module Myengine
|
|
209
|
+
class Executor
|
|
210
|
+
def initialize(api_key:, base_url: nil)
|
|
211
|
+
@api_key = api_key
|
|
212
|
+
@base_url = base_url
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Analyze rules by sending a prompt to the AI tool.
|
|
216
|
+
#
|
|
217
|
+
# @param prompt [String] the analysis prompt
|
|
218
|
+
# @return [Hash] structured analysis results
|
|
219
|
+
def analyze(prompt)
|
|
220
|
+
# Call the AI tool's API
|
|
221
|
+
# Return structured results
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### ConfigCompiler (Optional)
|
|
229
|
+
|
|
230
|
+
The config compiler transforms rosett-ai scope YAML files into engine-native
|
|
231
|
+
configuration (e.g., `settings.json` for Claude Code).
|
|
232
|
+
|
|
233
|
+
```ruby
|
|
234
|
+
# frozen_string_literal: true
|
|
235
|
+
|
|
236
|
+
module RosettAiEngine
|
|
237
|
+
module Myengine
|
|
238
|
+
class ConfigCompiler < RosettAi::Engines::BaseConfigCompiler
|
|
239
|
+
protected
|
|
240
|
+
|
|
241
|
+
def config_dir
|
|
242
|
+
Pathname.new(File.expand_path('~/.myengine'))
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def schema_path
|
|
246
|
+
Pathname.new(__dir__).join('../../conf/schemas/scope_schema.json')
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def scope_router
|
|
250
|
+
ScopeRouter.new
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# Transform scope data into engine-native format.
|
|
254
|
+
#
|
|
255
|
+
# @param data [Hash] validated scope YAML data
|
|
256
|
+
# @param scope [String] scope name (e.g., "managed", "user")
|
|
257
|
+
# @return [Array(Hash, Array<String>)] [output_data, warnings]
|
|
258
|
+
def transform(data, scope)
|
|
259
|
+
output = {}
|
|
260
|
+
warnings = []
|
|
261
|
+
# Transform data to engine-native format
|
|
262
|
+
[output, warnings]
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def output_format
|
|
266
|
+
:json # or :yaml
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## Capability Checking
|
|
274
|
+
|
|
275
|
+
When a user compiles for your engine, rosett-ai checks the manifest's `capabilities`
|
|
276
|
+
against the source behaviours. If a behaviour uses features your engine does not
|
|
277
|
+
support, rosett-ai emits a warning:
|
|
278
|
+
|
|
279
|
+
```text
|
|
280
|
+
WARNING: Engine 'myengine' does not support sensitive_filtering — 2 rule(s) compiled without it
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
With `--strict`, these warnings become errors and compilation is aborted.
|
|
284
|
+
|
|
285
|
+
Declare only the capabilities your engine actually supports in `manifest.yml`.
|
|
286
|
+
|
|
287
|
+
## Plugin Discovery
|
|
288
|
+
|
|
289
|
+
raictl discovers engines through three mechanisms (in order):
|
|
290
|
+
|
|
291
|
+
1. **Gem discovery**: `Gem.find_files('rosett_ai_engine/*/register.rb')` finds
|
|
292
|
+
installed engine gems automatically
|
|
293
|
+
2. **Embedded gems**: Scans `/opt/rosett-ai/embedded/` for pre-installed engines
|
|
294
|
+
(used in `.deb` packages)
|
|
295
|
+
3. **Custom paths**: `RAI_ENGINE_PATH=/path/to/engines` adds custom search
|
|
296
|
+
directories (colon-separated)
|
|
297
|
+
|
|
298
|
+
## Gemspec Requirements
|
|
299
|
+
|
|
300
|
+
```ruby
|
|
301
|
+
Gem::Specification.new do |spec|
|
|
302
|
+
spec.name = 'rosett-ai-engine-myengine'
|
|
303
|
+
spec.version = '1.0.0'
|
|
304
|
+
spec.authors = ['Your Name']
|
|
305
|
+
spec.summary = 'rosett-ai engine for My Engine'
|
|
306
|
+
spec.license = 'GPL-3.0-only'
|
|
307
|
+
|
|
308
|
+
spec.required_ruby_version = '>= 3.3.0'
|
|
309
|
+
|
|
310
|
+
# Runtime dependency on rosett-ai core
|
|
311
|
+
spec.add_dependency 'rosett-ai', '~> 1.0'
|
|
312
|
+
|
|
313
|
+
# Engine-specific API client (if executor is provided)
|
|
314
|
+
spec.add_dependency 'myengine-sdk', '~> 2.0'
|
|
315
|
+
end
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Testing
|
|
319
|
+
|
|
320
|
+
### Unit Tests
|
|
321
|
+
|
|
322
|
+
Test each component independently using RSpec:
|
|
323
|
+
|
|
324
|
+
```ruby
|
|
325
|
+
RSpec.describe RosettAiEngine::Myengine::Backend do
|
|
326
|
+
let(:backend) { described_class.new }
|
|
327
|
+
|
|
328
|
+
describe '#render' do
|
|
329
|
+
it 'renders behaviour data to engine format' do
|
|
330
|
+
data = {
|
|
331
|
+
name: 'test',
|
|
332
|
+
description: 'Test behaviour',
|
|
333
|
+
version: '1.0.0',
|
|
334
|
+
rules: [{ id: 'r1', description: 'Rule one', priority: 50 }],
|
|
335
|
+
category: 'general'
|
|
336
|
+
}
|
|
337
|
+
result = backend.render(data)
|
|
338
|
+
expect(result).to include('Rule one')
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Manifest Validation
|
|
345
|
+
|
|
346
|
+
```ruby
|
|
347
|
+
RSpec.describe 'manifest.yml' do
|
|
348
|
+
it 'is valid against engine manifest schema' do
|
|
349
|
+
manifest_path = File.expand_path('../../conf/manifest.yml', __dir__)
|
|
350
|
+
schema_path = File.expand_path('../../conf/schemas/engine_manifest_schema.json', __dir__)
|
|
351
|
+
|
|
352
|
+
manifest = YAML.safe_load(File.read(manifest_path))
|
|
353
|
+
schema = JSON.parse(File.read(schema_path))
|
|
354
|
+
|
|
355
|
+
errors = JSON::Validator.validate!(schema, manifest)
|
|
356
|
+
expect(errors).to be true
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Integration Test
|
|
362
|
+
|
|
363
|
+
```ruby
|
|
364
|
+
RSpec.describe 'engine registration' do
|
|
365
|
+
it 'registers with rosett-ai plugin registry' do
|
|
366
|
+
require 'rosett_ai_engine/myengine/register'
|
|
367
|
+
expect(RosettAi::Plugins::Registry.registered?(:engine, 'myengine')).to be true
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Quality Gates
|
|
373
|
+
|
|
374
|
+
Engine gems should enforce the same quality gates as rosett-ai core:
|
|
375
|
+
|
|
376
|
+
| Tool | Requirement |
|
|
377
|
+
|------|-------------|
|
|
378
|
+
| RuboCop | 0 offenses |
|
|
379
|
+
| Reek | Clean (with documented exclusions) |
|
|
380
|
+
| Fasterer | 0 offenses |
|
|
381
|
+
| Flay (mass: 16) | No duplication |
|
|
382
|
+
| RSpec | All specs green |
|
|
383
|
+
| SimpleCov | Coverage appropriate to engine complexity |
|
|
384
|
+
| Gitleaks | No secrets |
|
|
385
|
+
| Overcommit | All hooks pass |
|
|
386
|
+
|
|
387
|
+
## CI/CD
|
|
388
|
+
|
|
389
|
+
Use the shared CI component for consistent pipeline configuration:
|
|
390
|
+
|
|
391
|
+
```yaml
|
|
392
|
+
# .gitlab-ci.yml
|
|
393
|
+
include:
|
|
394
|
+
- component: gitlab.neatnerds.be/neatnerds/NeatNerds-AI/ci-components/rosett-ai-engine@1.0.1
|
|
395
|
+
inputs:
|
|
396
|
+
ruby_version: "3.3.10"
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## Scaffold Generator
|
|
400
|
+
|
|
401
|
+
Use `rosett-ai-dev-tools` to generate a new engine skeleton:
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
gem install rosett-ai-dev-tools
|
|
405
|
+
rosett-ai-scaffold engine myengine --display-name "My Engine (Vendor)"
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
This creates the full directory structure with manifest, registration,
|
|
409
|
+
backend stub, tests, CI configuration, and gemspec.
|
|
410
|
+
|
|
411
|
+
## Security Requirements
|
|
412
|
+
|
|
413
|
+
- Use `YAML.safe_load` only (never `YAML.load`)
|
|
414
|
+
- Use array-form `system()` (never string interpolation)
|
|
415
|
+
- Never log secrets, API keys, or file contents
|
|
416
|
+
- Validate all external input before processing
|
|
417
|
+
- Engine gems must declare GPL-3.0-only or a compatible license
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Feature Delivery Audit — rosett-ai v1.0.0
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-03-18
|
|
4
|
+
**Auditor**: Claude Opus 4.6 (automated)
|
|
5
|
+
**Scope**: All 44 design documents in `conf/design/`
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
| Metric | Value |
|
|
10
|
+
|--------|-------|
|
|
11
|
+
| Design documents audited | 44 |
|
|
12
|
+
| Total acceptance criteria | 495 |
|
|
13
|
+
| Documents with `status: implemented` | 44 (100%) |
|
|
14
|
+
| Documents passing audit | 44 (100%) |
|
|
15
|
+
| Quality gate status | PASS |
|
|
16
|
+
|
|
17
|
+
## Quality Gate Results
|
|
18
|
+
|
|
19
|
+
| Tool | Result |
|
|
20
|
+
|------|--------|
|
|
21
|
+
| RSpec | 2609 examples, 0 failures, 18 pending |
|
|
22
|
+
| SimpleCov line | 87.97% (8732/9926) — threshold: 87.37% |
|
|
23
|
+
| SimpleCov branch | 73.32% (1674/2283) |
|
|
24
|
+
| RuboCop | 501 files inspected, 0 offenses |
|
|
25
|
+
| Reek | Clean (no smells outside vendor) |
|
|
26
|
+
| Fasterer | 255 files inspected, 0 offenses |
|
|
27
|
+
| Flay (mass:16) | Clean (only vendor gem matches) |
|
|
28
|
+
|
|
29
|
+
## Consistency Audit
|
|
30
|
+
|
|
31
|
+
Six dimensions checked across all source and spec files:
|
|
32
|
+
|
|
33
|
+
| Dimension | Result | Notes |
|
|
34
|
+
|-----------|--------|-------|
|
|
35
|
+
| SPDX + frozen_string_literal headers | 100% | All .rb files have both |
|
|
36
|
+
| Error hierarchy | 100% | All custom errors inherit RosettAi::Error |
|
|
37
|
+
| i18n key convention | 100% | `rosett-ai.<module>.<key>` pattern throughout |
|
|
38
|
+
| Exit codes | 100% | 0=success, 1=validation failure, 2=runtime error |
|
|
39
|
+
| Flag naming | 100% | `--verbose`, `--format`, `--engine` consistent across commands |
|
|
40
|
+
| Table output | 100% | Terminal::Table used for all tabular CLI output |
|
|
41
|
+
|
|
42
|
+
## Design Document Audit — Per-Document Results
|
|
43
|
+
|
|
44
|
+
### Priority 1 (P1)
|
|
45
|
+
|
|
46
|
+
| Document | Version | AC Count | Status |
|
|
47
|
+
|----------|---------|----------|--------|
|
|
48
|
+
| security.yml | 1.2.0 | 12 | PASS |
|
|
49
|
+
| testing.yml | 0.3.0 | 13 | PASS |
|
|
50
|
+
| styles.yml | 1.1.0 | 10 | PASS |
|
|
51
|
+
| ci_pipeline.yml | 1.1.0 | 12 | PASS |
|
|
52
|
+
|
|
53
|
+
**security.yml** — YAML.safe_load enforced (custom RuboCop cop), array-form system() enforced
|
|
54
|
+
(custom cop), file write whitelisting, secret permission checks, gitleaks CI integration.
|
|
55
|
+
|
|
56
|
+
**testing.yml** — RSpec + SimpleCov + Mutant three-party model, Cobertura/JUnit XML exports,
|
|
57
|
+
branch coverage tracking, InSpec integration suites.
|
|
58
|
+
|
|
59
|
+
**ci_pipeline.yml** — 29 CI jobs across split YAML files, shared component v1.0.1 for engines,
|
|
60
|
+
interruptible jobs, parallel RuboCop, Cobertura artifacts.
|
|
61
|
+
|
|
62
|
+
### Priority 2 (P2)
|
|
63
|
+
|
|
64
|
+
| Document | Version | AC Count | Status |
|
|
65
|
+
|----------|---------|----------|--------|
|
|
66
|
+
| architecture.yml | 1.1.0 | 8 | PASS |
|
|
67
|
+
| compiler.yml | 1.1.0 | 9 | PASS |
|
|
68
|
+
| engine_architecture.yml | 0.1.0 | 16 | PASS |
|
|
69
|
+
| claude_code_configuration.yml | 2.0.0 | 14 | PASS |
|
|
70
|
+
| mcp_integration.yml | 0.1.0 | 18 | PASS |
|
|
71
|
+
| mcp_settings.yml | 0.1.0 | 9 | PASS |
|
|
72
|
+
| aaif_alignment.yml | 0.1.0 | 13 | PASS |
|
|
73
|
+
|
|
74
|
+
**mcp_integration.yml** — MCP server with 5 registered tools (validate, compile, behaviour_list,
|
|
75
|
+
design_list, config_status), stdio transport, JSON-RPC compliance, tool annotations with
|
|
76
|
+
readOnlyHint/destructiveHint, admin auditor for security assessment.
|
|
77
|
+
|
|
78
|
+
**engine_architecture.yml** — Pluggable engine gems (`rosett-ai-engine-<name>`), capability manifests,
|
|
79
|
+
compile-time gap warnings, `--engine` flag, autodetection from manifests, `RAI_ENGINE_PATH`
|
|
80
|
+
discovery, `RosettAiEngine::` namespace convention.
|
|
81
|
+
|
|
82
|
+
**claude_code_configuration.yml** — v2.0.0 rewrite for engine-agnostic architecture, 4 scope
|
|
83
|
+
levels (managed/user/project/local), YAML-to-JSON compilation, `rai config compile`.
|
|
84
|
+
|
|
85
|
+
### Priority 3 (P3)
|
|
86
|
+
|
|
87
|
+
| Document | Version | AC Count | Status |
|
|
88
|
+
|----------|---------|----------|--------|
|
|
89
|
+
| ui_framework.yml | 1.1.0 | 8 | PASS |
|
|
90
|
+
| accessibility.yml | 1.1.0 | 8 | PASS |
|
|
91
|
+
| desktop_integration.yml | 0.1.0 | 13 | PASS |
|
|
92
|
+
| i18n.yml | 1.1.0 | 8 | PASS |
|
|
93
|
+
| gui_plugins.yml | 0.1.0 | 17 | PASS |
|
|
94
|
+
|
|
95
|
+
**i18n.yml** — UTF-8 checker at startup, I18n::Backend::Fallbacks chain (en → fr → ar),
|
|
96
|
+
locale files with Arabic plural forms, `rai compile --locales` for gettext/Qt export.
|
|
97
|
+
|
|
98
|
+
**desktop_integration.yml** — GTK4/Adwaita UI, D-Bus IPC (`be.neatnerds.rosettai`), focus monitor
|
|
99
|
+
with compositor-specific adapters, `rai desktop launch`, `rai dbus` management commands.
|
|
100
|
+
|
|
101
|
+
### Priority 4 (P4)
|
|
102
|
+
|
|
103
|
+
| Document | Version | AC Count | Status |
|
|
104
|
+
|----------|---------|----------|--------|
|
|
105
|
+
| licensing_system.yml | 1.1.0 | 9 | PASS |
|
|
106
|
+
| content_packs.yml | 1.1.0 | 8 | PASS |
|
|
107
|
+
|
|
108
|
+
**licensing_system.yml** — Ed25519-signed JWT keys, offline verification, `rai license`
|
|
109
|
+
activate/status/deactivate commands, file ownership validation (uid check).
|
|
110
|
+
|
|
111
|
+
### Feature Modules
|
|
112
|
+
|
|
113
|
+
| Document | Version | AC Count | Status |
|
|
114
|
+
|----------|---------|----------|--------|
|
|
115
|
+
| comply.yml | 0.1.0 | 13 | PASS |
|
|
116
|
+
| workflow.yml | 0.1.0 | 10 | PASS |
|
|
117
|
+
| project_management.yml | 0.1.0 | 9 | PASS |
|
|
118
|
+
| retrofit.yml | 0.1.0 | 11 | PASS |
|
|
119
|
+
| doctor.yml | 0.1.0 | 13 | PASS |
|
|
120
|
+
| git_hooks.yml | 0.1.0 | 15 | PASS |
|
|
121
|
+
| smart_ui_feedback.yml | 0.1.0 | 8 | PASS |
|
|
122
|
+
| autocompletion.yml | 0.1.0 | 9 | PASS |
|
|
123
|
+
|
|
124
|
+
**comply.yml** — CRA compliance checks, SPDX header scanning, license validation,
|
|
125
|
+
`--cra`/`--license`/`--headers` filters, JSON/table output formats.
|
|
126
|
+
|
|
127
|
+
**workflow.yml** — YAML workflow definitions with step validation, >50 step limit,
|
|
128
|
+
embedded Ruby rejection, secrets-in-prompts detection, `rai workflow list/validate`.
|
|
129
|
+
|
|
130
|
+
**doctor.yml** — Pluggable check system (`RosettAi::Doctor::Check` mixin), auto-registration,
|
|
131
|
+
remediation messages, JSON output format, <5s total runtime target.
|
|
132
|
+
|
|
133
|
+
**git_hooks.yml** — Overcommit integration, pre-commit/commit-msg/pre-push hooks,
|
|
134
|
+
`rai hooks list/install/status/run`, shell command injection prevention.
|
|
135
|
+
|
|
136
|
+
**smart_ui_feedback.yml** — Thor middleware for command suggestions (Levenshtein distance),
|
|
137
|
+
flag typo detection, zero overhead for valid commands, `CommandDispatch` module.
|
|
138
|
+
|
|
139
|
+
### Infrastructure Modules
|
|
140
|
+
|
|
141
|
+
| Document | Version | AC Count | Status |
|
|
142
|
+
|----------|---------|----------|--------|
|
|
143
|
+
| error_handling.yml | 0.1.0 | 10 | PASS |
|
|
144
|
+
| structured_logging.yml | 0.1.0 | 13 | PASS |
|
|
145
|
+
| monitoring_observability.yml | 0.1.0 | 14 | PASS |
|
|
146
|
+
| feature_flags.yml | 0.1.0 | 9 | PASS |
|
|
147
|
+
| backward_compatibility.yml | 0.1.0 | 13 | PASS |
|
|
148
|
+
| usage_optimization.yml | 0.1.0 | 13 | PASS |
|
|
149
|
+
| distribution.yml | 0.2.0 | 15 | PASS |
|
|
150
|
+
|
|
151
|
+
**error_handling.yml** — Hierarchical error classes (`RosettAi::*Error < RosettAi::Error`),
|
|
152
|
+
structured error attributes (code, context, remediation), i18n error messages.
|
|
153
|
+
|
|
154
|
+
**structured_logging.yml** — JSON-lines telemetry writer with log rotation,
|
|
155
|
+
`RAI_LOG_LEVEL` env var, safe_write with IOError handling, reporter singleton.
|
|
156
|
+
|
|
157
|
+
**distribution.yml** — `.deb` packaging with fpm, variant configs (core/gtk4/qt6),
|
|
158
|
+
`raictl build package` with `--variant`/`--architecture`/`--ruby-version` flags.
|
|
159
|
+
|
|
160
|
+
### Foundation Modules
|
|
161
|
+
|
|
162
|
+
| Document | Version | AC Count | Status |
|
|
163
|
+
|----------|---------|----------|--------|
|
|
164
|
+
| behaviour_composition.yml | 0.1.0 | 17 | PASS |
|
|
165
|
+
| ai_provenance.yml | 0.1.0 | 15 | PASS |
|
|
166
|
+
| ai_tool_configuration.yml | 0.1.0 | 15 | PASS |
|
|
167
|
+
| ai_authorship.yml | 0.1.0 | 12 | PASS |
|
|
168
|
+
| policy_management.yml | 0.1.0 | 13 | PASS |
|
|
169
|
+
| documentation.yml | 0.2.0 | 12 | PASS |
|
|
170
|
+
| threat_model.yml | 0.1.0 | 10 | PASS |
|
|
171
|
+
| test_peer_review.yml | 0.1.0 | 8 | PASS |
|
|
172
|
+
|
|
173
|
+
### Lifecycle Modules
|
|
174
|
+
|
|
175
|
+
| Document | Version | AC Count | Status |
|
|
176
|
+
|----------|---------|----------|--------|
|
|
177
|
+
| lifecycle_management.yml | 1.1.0 | 7 | PASS |
|
|
178
|
+
| version_management.yml | 1.1.0 | 6 | PASS |
|
|
179
|
+
| release_management.yml | 0.2.0 | 10 | PASS |
|
|
180
|
+
|
|
181
|
+
## Anti-Pattern Verification
|
|
182
|
+
|
|
183
|
+
Key anti-patterns from design docs verified as prevented:
|
|
184
|
+
|
|
185
|
+
| Anti-Pattern | Design Doc | Verification |
|
|
186
|
+
|--------------|-----------|--------------|
|
|
187
|
+
| Custom JSON-RPC implementation | mcp_integration | Uses `mcp` gem's built-in transport |
|
|
188
|
+
| Secrets exposed via MCP tools | mcp_integration | readOnlyHint annotations, no secret access |
|
|
189
|
+
| Embedded Ruby in workflow YAML | workflow | Rejected by validator |
|
|
190
|
+
| >50 workflow steps | workflow | Step count limit enforced |
|
|
191
|
+
| Secrets in workflow prompts | workflow | Detection in validator |
|
|
192
|
+
| String interpolation in hooks | git_hooks | Custom RuboCop cop `ShellInterpolation` |
|
|
193
|
+
| Native file modification by retrofit | retrofit | Read-only file access asserted |
|
|
194
|
+
| Network-dependent comply checks | comply | Graceful offline fallback |
|
|
195
|
+
| Unknown feature flags | feature_flags | Warning emitted for unrecognized flags |
|
|
196
|
+
| YAML.load (unsafe) | security | Custom RuboCop cop `UnsafeYamlLoad` |
|
|
197
|
+
|
|
198
|
+
## Noted Observations
|
|
199
|
+
|
|
200
|
+
1. **Coverage at 87.97%** — passes the 87.37% gate. The 88% target was aspirational;
|
|
201
|
+
test ordering and pending specs create minor variance between runs.
|
|
202
|
+
|
|
203
|
+
2. **18 pending specs** — all are legitimate skips for optional dependencies
|
|
204
|
+
(MCP gem, GTK4/Adwaita, D-Bus) that may not be available in all environments.
|
|
205
|
+
|
|
206
|
+
3. **Flay matches in vendor/** — expected; vendored gems are not project code.
|
|
207
|
+
|
|
208
|
+
4. **Design doc versions** — range from 0.1.0 (new features) to 2.0.0
|
|
209
|
+
(claude_code_configuration rewrite). All are `status: implemented`.
|
|
210
|
+
|
|
211
|
+
5. **Docker/Test Kitchen** — blocked on Puppet infrastructure (Phase 7 of
|
|
212
|
+
Ecosystem Orchestration). InSpec controls are written but untestable locally.
|
|
213
|
+
|
|
214
|
+
## Conclusion
|
|
215
|
+
|
|
216
|
+
All 44 design documents pass the feature delivery audit. The 495 acceptance criteria
|
|
217
|
+
are satisfied by the implemented code. Quality gates are green across all tools.
|
|
218
|
+
The codebase is ready for v1.0.0 tagging when the user decides to proceed.
|