rosett-ai 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.ai-provenance.yml +119 -0
- data/.debride_whitelist +186 -0
- data/.fasterer.yml +29 -0
- data/.mdl_style.rb +10 -0
- data/.mdlrc +3 -0
- data/.mutant.yml +49 -0
- data/.namespace-allowlist +42 -0
- data/.reek.yml +1040 -0
- data/.rosett-ai/config.yml +3 -0
- data/.rspec +5 -0
- data/.rubocop.yml +380 -0
- data/.ruby-version +1 -0
- data/.yamllint +51 -0
- data/.yardopts +12 -0
- data/AI-DISCLOSURE.md +48 -0
- data/CHANGELOG.md +519 -0
- data/CLAUDE.md +141 -0
- data/CONTRIBUTING.md +734 -0
- data/INSTALL.md +154 -0
- data/LICENSE +674 -0
- data/LICENSE.md +675 -0
- data/QUICKSTART.md +73 -0
- data/README.md +366 -0
- data/Rakefile +200 -0
- data/SECURITY.md +114 -0
- data/bin/rai +1 -0
- data/cliff.toml +52 -0
- data/conf/adopt_redactions.yml +8 -0
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/compliance/cra_rules.yml +25 -0
- data/conf/compliance/license_rules.yml +20 -0
- data/conf/design/aaif_alignment.yml +181 -0
- data/conf/design/ab_testing.yml +172 -0
- data/conf/design/accessibility.yml +84 -0
- data/conf/design/ai_authorship.yml +210 -0
- data/conf/design/ai_provenance.yml +224 -0
- data/conf/design/ai_tool_configuration.yml +207 -0
- data/conf/design/architecture.yml +139 -0
- data/conf/design/autocompletion.yml +115 -0
- data/conf/design/backward_compatibility.yml +112 -0
- data/conf/design/behaviour_composition.yml +246 -0
- data/conf/design/build_rake_extraction.yml +57 -0
- data/conf/design/ci_pipeline.yml +100 -0
- data/conf/design/claude_code_configuration.yml +157 -0
- data/conf/design/compiler.yml +128 -0
- data/conf/design/comply.yml +153 -0
- data/conf/design/content_packs.yml +84 -0
- data/conf/design/desktop_integration.yml +289 -0
- data/conf/design/distribution.yml +216 -0
- data/conf/design/doctor.yml +184 -0
- data/conf/design/documentation.yml +152 -0
- data/conf/design/engine_architecture.yml +257 -0
- data/conf/design/error_handling.yml +103 -0
- data/conf/design/feature_flags.yml +142 -0
- data/conf/design/git_hooks.yml +165 -0
- data/conf/design/gui_plugins.yml +475 -0
- data/conf/design/i18n.yml +84 -0
- data/conf/design/integration_testing.yml +56 -0
- data/conf/design/licensing_system.yml +88 -0
- data/conf/design/lifecycle_management.yml +208 -0
- data/conf/design/mcp_integration.yml +207 -0
- data/conf/design/mcp_settings.yml +126 -0
- data/conf/design/migration.yml +56 -0
- data/conf/design/monitoring_observability.yml +194 -0
- data/conf/design/namespace_cleanup.yml +145 -0
- data/conf/design/plugin_test_segregation.yml +145 -0
- data/conf/design/policy_management.yml +229 -0
- data/conf/design/project_management.yml +183 -0
- data/conf/design/rai_mcp_asset_discovery.yml +164 -0
- data/conf/design/rai_mcp_server.yml +605 -0
- data/conf/design/release_management.yml +117 -0
- data/conf/design/retrofit.yml +199 -0
- data/conf/design/retrospective_analyzer.yml +79 -0
- data/conf/design/scope_hierarchy.yml +352 -0
- data/conf/design/security.yml +115 -0
- data/conf/design/session_retrospective.yml +85 -0
- data/conf/design/smart_ui_feedback.yml +89 -0
- data/conf/design/structured_logging.yml +148 -0
- data/conf/design/styles.yml +123 -0
- data/conf/design/test_peer_review.yml +89 -0
- data/conf/design/testing.yml +136 -0
- data/conf/design/threat_model.yml +108 -0
- data/conf/design/ui_framework.yml +111 -0
- data/conf/design/usage_optimization.yml +122 -0
- data/conf/design/version_management.yml +60 -0
- data/conf/design/workflow.yml +227 -0
- data/conf/mcp/server_defaults.yml +42 -0
- data/conf/mcp/trust.yml +21 -0
- data/conf/packaging/core.yml +12 -0
- data/conf/packaging/gtk4.yml +11 -0
- data/conf/packaging/qt6.yml +11 -0
- data/conf/policy/default_deny_list.yml +197 -0
- data/conf/review/cli-command-audit.yml +857 -0
- data/conf/review/design-docs.yml +1064 -0
- data/conf/review/design-questionnaire.yml +153 -0
- data/conf/review/questionnaire.yml +146 -0
- data/conf/review/rosett-ai-core.yml +2919 -0
- data/conf/schemas/ai_config_schema.json +73 -0
- data/conf/schemas/behaviour_schema.json +132 -0
- data/conf/schemas/compliance_rule_schema.json +63 -0
- data/conf/schemas/content_pack_manifest_schema.json +51 -0
- data/conf/schemas/design_schema.json +210 -0
- data/conf/schemas/engine_manifest_schema.json +144 -0
- data/conf/schemas/lockfile_schema.json +74 -0
- data/conf/schemas/mcp_server_schema.json +48 -0
- data/conf/schemas/packaging_schema.json +70 -0
- data/conf/schemas/policy_schema.json +85 -0
- data/conf/schemas/provenance_schema.json +84 -0
- data/conf/schemas/rai_config_schema.json +56 -0
- data/conf/schemas/rai_project_schema.json +20 -0
- data/conf/schemas/scope_hierarchy_schema.json +49 -0
- data/conf/schemas/target_schema.json +67 -0
- data/conf/schemas/tooling_schema.json +65 -0
- data/conf/schemas/workflow_schema.json +112 -0
- data/conf/targets/agents_md.yml +17 -0
- data/conf/targets/claude.yml +12 -0
- data/conf/tooling/tools.yml +58 -0
- data/dist/rosett-ai-mcp.service +48 -0
- data/dist/rosett-ai-mcp.yml.default +45 -0
- data/doc/AAIF_POSITIONING.md +58 -0
- data/doc/ADOPT.md +224 -0
- data/doc/AI_PROVENANCE.md +139 -0
- data/doc/ARCHITECTURE.md +920 -0
- data/doc/BEHAVIOUR.md +409 -0
- data/doc/BUILD.md +138 -0
- data/doc/CI_CD_RECIPES.md +171 -0
- data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
- data/doc/COMMAND_ANALYSIS.md +229 -0
- data/doc/CONFIGURATION.md +281 -0
- data/doc/DESIGN_AUDIT.md +235 -0
- data/doc/DESIGN_PEER_REVIEW.md +771 -0
- data/doc/DESKTOP.md +447 -0
- data/doc/ENGINES.md +567 -0
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
- data/doc/FEATURE_AUDIT.md +218 -0
- data/doc/IMPLEMENTATION_PLAN.md +669 -0
- data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
- data/doc/MIGRATION_GUIDE.md +88 -0
- data/doc/PACKAGING.md +232 -0
- data/doc/PROJECT_DASHBOARD.md +153 -0
- data/doc/PULP_DEPLOYMENT.md +164 -0
- data/doc/QUALITY_FIX_SUMMARY.md +110 -0
- data/doc/QUICK_START.md +162 -0
- data/doc/REEK_CONFIGURATION.md +166 -0
- data/doc/REFERENCE.md +253 -0
- data/doc/REFERENCES.md +324 -0
- data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
- data/doc/SETUP.md +202 -0
- data/doc/TEST_PEER_REVIEW.md +152 -0
- data/doc/THREAT_MODEL.md +230 -0
- data/doc/USAGE.md +545 -0
- data/doc/USER_MANUAL.md +585 -0
- data/doc/ai_test_review_checklist.md +110 -0
- data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
- data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
- data/doc/changes/2026-02-20-security-implementation.md +281 -0
- data/doc/changes/2026-02-20-styles-implementation.md +220 -0
- data/doc/changes/2026-02-21-architecture-completion.md +95 -0
- data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
- data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
- data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
- data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
- data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
- data/doc/changes/2026-02-21-path-resolver.md +128 -0
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
- data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
- data/doc/context/SESSION-HANDOFF.md +69 -0
- data/doc/context/ai-engine-usage-trends-2026.md +80 -0
- data/doc/context/plan-pluggable-engines.md +590 -0
- data/doc/decisions/001-flog-deferred.md +32 -0
- data/doc/decisions/002-path-resolution-strategy.md +158 -0
- data/doc/decisions/003-ui-adapter-selection.md +193 -0
- data/doc/decisions/004-design-document-validation.md +179 -0
- data/doc/decisions/005-package-splitting-strategy.md +200 -0
- data/doc/decisions/006-multi-engine-architecture.md +147 -0
- data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
- data/doc/decisions/008-ci-bundler-strategy.md +129 -0
- data/doc/decisions/009-core-only-v1-release.md +60 -0
- data/doc/decisions/010-engine-debian-packaging.md +66 -0
- data/doc/decisions/011-context-aware-cli.md +71 -0
- data/doc/dependency_decisions.yml +247 -0
- data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
- data/doc/issues/003-smoke-test-false-positive.md +127 -0
- data/doc/issues/004-market-research-design-updates.md +109 -0
- data/doc/issues/005-compile-scope-coexistence.md +161 -0
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +505 -0
- data/doc/operations/packaging.md +133 -0
- data/doc/operations/rosett-ai-release.md +65 -0
- data/doc/reference/error-catalog.md +107 -0
- data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
- data/doc/reference/src/Pictures/cover.jpg +0 -0
- data/doc/reference/src/Pictures/head1.jpg +0 -0
- data/doc/reference/src/Pictures/head2.jpg +0 -0
- data/doc/reference/src/Pictures/head3.jpg +0 -0
- data/doc/reference/src/Pictures/head4.jpg +0 -0
- data/doc/reference/src/Pictures/head5.jpg +0 -0
- data/doc/reference/src/Pictures/head6.jpg +0 -0
- data/doc/reference/src/Pictures/head7.jpg +0 -0
- data/doc/reference/src/Pictures/head8.jpg +0 -0
- data/doc/reference/src/StyleInd.ist +4 -0
- data/doc/reference/src/bibliography.bib +79 -0
- data/doc/reference/src/main.tex +1288 -0
- data/doc/reference/src/structure.tex +303 -0
- data/doc/rosett-ai-bookmarks.html +301 -0
- data/kitchen.yml +46 -0
- data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
- data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
- data/lib/rosett_ai/ai_config/context_window.rb +55 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
- data/lib/rosett_ai/ai_config/model_router.rb +121 -0
- data/lib/rosett_ai/ai_config/validator.rb +45 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
- data/lib/rosett_ai/authorship/review_validator.rb +39 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
- data/lib/rosett_ai/backup/compressor.rb +180 -0
- data/lib/rosett_ai/backup/destination.rb +91 -0
- data/lib/rosett_ai/behaviour/manager.rb +156 -0
- data/lib/rosett_ai/compiler/backend.rb +86 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
- data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
- data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
- data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
- data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
- data/lib/rosett_ai/compiler/target_profile.rb +112 -0
- data/lib/rosett_ai/completion/generator.rb +101 -0
- data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
- data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
- data/lib/rosett_ai/comply/reporter.rb +113 -0
- data/lib/rosett_ai/comply/runner.rb +50 -0
- data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
- data/lib/rosett_ai/composition/composer.rb +158 -0
- data/lib/rosett_ai/composition/composition_result.rb +64 -0
- data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
- data/lib/rosett_ai/composition/lockfile.rb +103 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
- data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
- data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
- data/lib/rosett_ai/config/compile_result.rb +37 -0
- data/lib/rosett_ai/config/compiler.rb +13 -0
- data/lib/rosett_ai/config/domain_transformer.rb +13 -0
- data/lib/rosett_ai/config/key_map.rb +13 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
- data/lib/rosett_ai/config/scope_router.rb +13 -0
- data/lib/rosett_ai/config/secret_resolver.rb +125 -0
- data/lib/rosett_ai/configuration.rb +119 -0
- data/lib/rosett_ai/content/content_client.rb +60 -0
- data/lib/rosett_ai/content/pack_installer.rb +117 -0
- data/lib/rosett_ai/content/pack_manifest.rb +50 -0
- data/lib/rosett_ai/content/pack_registry.rb +68 -0
- data/lib/rosett_ai/content_packs/manager.rb +50 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
- data/lib/rosett_ai/dbus/service.rb +121 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
- data/lib/rosett_ai/deprecation.rb +79 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
- data/lib/rosett_ai/doctor/check.rb +92 -0
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
- data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
- data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
- data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
- data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
- data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
- data/lib/rosett_ai/doctor.rb +81 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
- data/lib/rosett_ai/documentation/translator.rb +62 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
- data/lib/rosett_ai/engines/detector.rb +63 -0
- data/lib/rosett_ai/engines/registry.rb +50 -0
- data/lib/rosett_ai/error_handler.rb +139 -0
- data/lib/rosett_ai/exit_codes.rb +76 -0
- data/lib/rosett_ai/feature_flags.rb +102 -0
- data/lib/rosett_ai/formatting.rb +33 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
- data/lib/rosett_ai/git_hooks/installer.rb +175 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
- data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
- data/lib/rosett_ai/init/config_file_writer.rb +24 -0
- data/lib/rosett_ai/init/directory_builder.rb +38 -0
- data/lib/rosett_ai/init/file_copier.rb +95 -0
- data/lib/rosett_ai/init/global_initializer.rb +28 -0
- data/lib/rosett_ai/init/local_initializer.rb +27 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
- data/lib/rosett_ai/init/project_initializer.rb +38 -0
- data/lib/rosett_ai/licensing/license_key.rb +139 -0
- data/lib/rosett_ai/licensing/license_store.rb +64 -0
- data/lib/rosett_ai/licensing/license_validator.rb +60 -0
- data/lib/rosett_ai/licensing/tier.rb +42 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
- data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
- data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
- data/lib/rosett_ai/mcp/governance.rb +160 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
- data/lib/rosett_ai/mcp/instructions.rb +266 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
- data/lib/rosett_ai/mcp/keyfile.rb +221 -0
- data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
- data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
- data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
- data/lib/rosett_ai/mcp/plugins.rb +143 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
- data/lib/rosett_ai/mcp/response_helper.rb +46 -0
- data/lib/rosett_ai/mcp/security_logger.rb +60 -0
- data/lib/rosett_ai/mcp/server.rb +212 -0
- data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
- data/lib/rosett_ai/migration/detector.rb +117 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
- data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
- data/lib/rosett_ai/package_manager/apt.rb +108 -0
- data/lib/rosett_ai/package_manager/base.rb +68 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
- data/lib/rosett_ai/packaging/variant_config.rb +92 -0
- data/lib/rosett_ai/path_resolver.rb +115 -0
- data/lib/rosett_ai/plugins/contract.rb +43 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
- data/lib/rosett_ai/plugins/registry.rb +150 -0
- data/lib/rosett_ai/policy/auditor.rb +41 -0
- data/lib/rosett_ai/policy/deny_list.rb +71 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
- data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
- data/lib/rosett_ai/policy/protected_files.rb +47 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
- data/lib/rosett_ai/policy/validator.rb +35 -0
- data/lib/rosett_ai/profiler.rb +79 -0
- data/lib/rosett_ai/project/drift_detector.rb +126 -0
- data/lib/rosett_ai/project/manager.rb +115 -0
- data/lib/rosett_ai/project/sync_manager.rb +138 -0
- data/lib/rosett_ai/project/template_applier.rb +105 -0
- data/lib/rosett_ai/project_context.rb +82 -0
- data/lib/rosett_ai/provenance/entry.rb +63 -0
- data/lib/rosett_ai/provenance/file_source.rb +32 -0
- data/lib/rosett_ai/provenance/source.rb +62 -0
- data/lib/rosett_ai/provenance/store.rb +153 -0
- data/lib/rosett_ai/provenance/tracker.rb +62 -0
- data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
- data/lib/rosett_ai/provenance/validator.rb +45 -0
- data/lib/rosett_ai/quorum/collector.rb +59 -0
- data/lib/rosett_ai/quorum/comparator.rb +81 -0
- data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
- data/lib/rosett_ai/rai_config.rb +107 -0
- data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
- data/lib/rosett_ai/retrofit/engine.rb +171 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
- data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
- data/lib/rosett_ai/retrofit/scanner.rb +47 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
- data/lib/rosett_ai/secrets_resolver.rb +71 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
- data/lib/rosett_ai/structured_logger.rb +110 -0
- data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
- data/lib/rosett_ai/telemetry/provider.rb +26 -0
- data/lib/rosett_ai/telemetry/reporter.rb +144 -0
- data/lib/rosett_ai/telemetry.rb +47 -0
- data/lib/rosett_ai/text_sanitizer.rb +62 -0
- data/lib/rosett_ai/thor/cli.rb +269 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
- data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
- data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
- data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
- data/lib/rosett_ai/thor/tasks/config.rb +265 -0
- data/lib/rosett_ai/thor/tasks/content.rb +193 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
- data/lib/rosett_ai/thor/tasks/design.rb +258 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
- data/lib/rosett_ai/thor/tasks/init.rb +259 -0
- data/lib/rosett_ai/thor/tasks/license.rb +120 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
- data/lib/rosett_ai/thor/tasks/project.rb +260 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
- data/lib/rosett_ai/thor/tasks/release.rb +314 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
- data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
- data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
- data/lib/rosett_ai/tooling/version_checker.rb +35 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
- data/lib/rosett_ai/ui/base.rb +46 -0
- data/lib/rosett_ai/ui/gtk4.rb +98 -0
- data/lib/rosett_ai/ui/kde.rb +40 -0
- data/lib/rosett_ai/ui/qt6.rb +40 -0
- data/lib/rosett_ai/ui/registry.rb +60 -0
- data/lib/rosett_ai/ui/tty_helper.rb +74 -0
- data/lib/rosett_ai/ui/tui.rb +59 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
- data/lib/rosett_ai/validators/design_validator.rb +17 -0
- data/lib/rosett_ai/validators/schema_validator.rb +84 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
- data/lib/rosett_ai/version.rb +8 -0
- data/lib/rosett_ai/version_consistency_checker.rb +129 -0
- data/lib/rosett_ai/workflow/audit_log.rb +86 -0
- data/lib/rosett_ai/workflow/engine.rb +142 -0
- data/lib/rosett_ai/workflow/manager.rb +82 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
- data/lib/rosett_ai/workflow/step_runner.rb +61 -0
- data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
- data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
- data/lib/rosett_ai/yaml_loader.rb +78 -0
- data/lib/rosett_ai.rb +221 -0
- data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
- data/lib/rubocop/rosett_ai.rb +9 -0
- data/lib/scripts/generated/docker_hub_tags.rb +126 -0
- data/locales/.gitkeep +0 -0
- data/locales/ar.yml +579 -0
- data/locales/en.yml +571 -0
- data/locales/fr.yml +567 -0
- data/packaging/build-engine-deb.sh +81 -0
- data/packaging/scripts/postinst +17 -0
- data/packaging/scripts/postrm +19 -0
- data/packaging/scripts/prerm +10 -0
- data/packaging/wrapper.sh.template +38 -0
- data/rosett-ai.gemspec +63 -0
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +123 -0
- data/settings.json +29 -0
- data/share/applications/be.neatnerds.rosettai.desktop +29 -0
- data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
- data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
- data/share/templates/behaviour/criticalthinking.yml +69 -0
- metadata +810 -0
data/doc/BEHAVIOUR.md
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# Rosett-AI - Behaviour System
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The behaviour system allows you to define and manage operational rules for Claude Code. Behaviours are stored as YAML files in `conf/behaviour/` and can be validated, displayed, and managed through the CLI.
|
|
6
|
+
|
|
7
|
+
## Concepts
|
|
8
|
+
|
|
9
|
+
### What is a Behaviour
|
|
10
|
+
|
|
11
|
+
A behaviour is a collection of rules that guide Claude Code's operation. Each behaviour file defines:
|
|
12
|
+
|
|
13
|
+
- **Name**: Unique identifier for the behaviour
|
|
14
|
+
- **Description**: Human-readable explanation
|
|
15
|
+
- **Rules**: Specific operational guidelines
|
|
16
|
+
|
|
17
|
+
### Rule Priority
|
|
18
|
+
|
|
19
|
+
Rules have priorities from 1-100:
|
|
20
|
+
|
|
21
|
+
| Range | Description |
|
|
22
|
+
|-------|-------------|
|
|
23
|
+
| 90-100 | Critical - Always apply |
|
|
24
|
+
| 70-89 | High - Apply unless conflicting |
|
|
25
|
+
| 50-69 | Medium - Standard rules |
|
|
26
|
+
| 30-49 | Low - Apply when relevant |
|
|
27
|
+
| 1-29 | Minimal - Suggestions only |
|
|
28
|
+
|
|
29
|
+
## File Structure
|
|
30
|
+
|
|
31
|
+
### Location
|
|
32
|
+
|
|
33
|
+
Behaviour files can exist at two scope levels:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
# Global behaviours (applied to all projects)
|
|
37
|
+
<rosett-ai-install>/conf/behaviour/
|
|
38
|
+
|
|
39
|
+
# Project behaviours (extend or override global)
|
|
40
|
+
<project>/.rosett-ai/conf/behaviour/
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
When compiling from a project directory (one with `.rosett-ai/`), both scopes
|
|
44
|
+
are merged: global behaviours are included alongside project-specific
|
|
45
|
+
ones. If a project behaviour has the same filename as a global one,
|
|
46
|
+
the project version takes precedence.
|
|
47
|
+
|
|
48
|
+
See: `spec/rosett_ai/compiler/compilation_pipeline_spec.rb` — "multi-source
|
|
49
|
+
compilation" context for authoritative test cases.
|
|
50
|
+
|
|
51
|
+
### Naming Convention
|
|
52
|
+
|
|
53
|
+
- Use snake_case for file names
|
|
54
|
+
- Extension must be `.yml`
|
|
55
|
+
- Name should describe the behaviour's purpose
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
|
|
59
|
+
- `code_review.yml`
|
|
60
|
+
- `security_audit.yml`
|
|
61
|
+
- `documentation_standards.yml`
|
|
62
|
+
|
|
63
|
+
### Schema
|
|
64
|
+
|
|
65
|
+
Behaviour files are validated against a JSON Schema definition stored at:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
conf/schemas/behaviour_schema.json
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
This external schema file is loaded at runtime by `RosettAi::Validators::BehaviourValidator`.
|
|
72
|
+
It uses [JSON Schema Draft 2020-12](https://json-schema.org/draft/2020-12/schema) and is
|
|
73
|
+
processed by the [json_schemer](https://rubygems.org/gems/json_schemer) gem.
|
|
74
|
+
|
|
75
|
+
The schema includes metadata in its `$comment` field:
|
|
76
|
+
|
|
77
|
+
| Key | Description |
|
|
78
|
+
|-----|-------------|
|
|
79
|
+
| `date` | Date the schema was last updated |
|
|
80
|
+
| `version` | Schema version (semantic versioning) |
|
|
81
|
+
| `source` | Originating project (`rosett-ai`) |
|
|
82
|
+
| `compatible_claude_code_versions` | Compatible rai version range |
|
|
83
|
+
|
|
84
|
+
#### Behaviour Fields
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
# Required fields
|
|
88
|
+
name: string # Unique identifier (1-100 chars)
|
|
89
|
+
description: string # What this behaviour does (min 1 char)
|
|
90
|
+
rules: array # List of rules (min 1 item)
|
|
91
|
+
|
|
92
|
+
# Optional fields
|
|
93
|
+
version: string # Semantic version (e.g., "1.0.0")
|
|
94
|
+
author: string # Creator's name/email
|
|
95
|
+
created_at: date # Creation date (YYYY-MM-DD)
|
|
96
|
+
modified_at: date # Last modification date (YYYY-MM-DD)
|
|
97
|
+
modified_by: string # Last modifier
|
|
98
|
+
sensitive: boolean # Exclude from API analysis during adopt (default: false)
|
|
99
|
+
used_in: array # Projects using this behaviour
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
No additional properties are allowed beyond those listed above. See `conf/schemas/behaviour_schema.json` for the canonical schema definition.
|
|
103
|
+
|
|
104
|
+
#### Rule Fields
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
rules:
|
|
108
|
+
- id: string # Unique rule identifier (required)
|
|
109
|
+
description: string # What this rule does (required)
|
|
110
|
+
priority: integer # 1-100 (optional, default: 50)
|
|
111
|
+
enabled: boolean # Active or not (optional, default: true)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### Modifying the Schema
|
|
115
|
+
|
|
116
|
+
To change validation rules, edit `conf/schemas/behaviour_schema.json` directly.
|
|
117
|
+
After changes, update the `$comment.date` and `$comment.version` fields, then
|
|
118
|
+
run the test suite to verify nothing breaks:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
bundle exec rspec spec/rosett_ai/validators/behaviour_validator_spec.rb
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Creating Behaviours
|
|
125
|
+
|
|
126
|
+
### Using the CLI
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
bin/raictl behaviour manage add my_behaviour --description="Description here"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
This will:
|
|
133
|
+
|
|
134
|
+
1. Create a template file in a temporary directory
|
|
135
|
+
2. Open it in your `$EDITOR`
|
|
136
|
+
3. Validate on save
|
|
137
|
+
4. Copy to `conf/behaviour/` if valid
|
|
138
|
+
|
|
139
|
+
### Manual Creation
|
|
140
|
+
|
|
141
|
+
Create a YAML file directly:
|
|
142
|
+
|
|
143
|
+
```yaml
|
|
144
|
+
name: manual_behaviour
|
|
145
|
+
description: Manually created behaviour
|
|
146
|
+
version: 1.0.0
|
|
147
|
+
author: developer@neatnerds.be
|
|
148
|
+
created_at: "2025-01-17"
|
|
149
|
+
modified_at: "2025-01-17"
|
|
150
|
+
modified_by: developer@neatnerds.be
|
|
151
|
+
used_in: []
|
|
152
|
+
rules:
|
|
153
|
+
- id: rule_001
|
|
154
|
+
description: First rule description
|
|
155
|
+
priority: 50
|
|
156
|
+
enabled: true
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Then validate:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
bin/raictl behaviour validate manual_behaviour
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Example Behaviours
|
|
166
|
+
|
|
167
|
+
### Code Review
|
|
168
|
+
|
|
169
|
+
```yaml
|
|
170
|
+
name: code_review
|
|
171
|
+
description: Guidelines for reviewing code changes
|
|
172
|
+
version: 1.0.0
|
|
173
|
+
author: team@neatnerds.be
|
|
174
|
+
created_at: "2025-01-17"
|
|
175
|
+
modified_at: "2025-01-17"
|
|
176
|
+
modified_by: team@neatnerds.be
|
|
177
|
+
used_in:
|
|
178
|
+
- all_projects
|
|
179
|
+
rules:
|
|
180
|
+
- id: security_first
|
|
181
|
+
description: Check for security vulnerabilities before other concerns
|
|
182
|
+
priority: 95
|
|
183
|
+
enabled: true
|
|
184
|
+
- id: test_coverage
|
|
185
|
+
description: Ensure changes have appropriate test coverage
|
|
186
|
+
priority: 85
|
|
187
|
+
enabled: true
|
|
188
|
+
- id: code_style
|
|
189
|
+
description: Verify code follows project style guidelines
|
|
190
|
+
priority: 70
|
|
191
|
+
enabled: true
|
|
192
|
+
- id: documentation
|
|
193
|
+
description: Check that public APIs are documented
|
|
194
|
+
priority: 60
|
|
195
|
+
enabled: true
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Security Audit
|
|
199
|
+
|
|
200
|
+
```yaml
|
|
201
|
+
name: security_audit
|
|
202
|
+
description: Security-focused code analysis rules
|
|
203
|
+
version: 1.0.0
|
|
204
|
+
author: security@neatnerds.be
|
|
205
|
+
created_at: "2025-01-17"
|
|
206
|
+
modified_at: "2025-01-17"
|
|
207
|
+
modified_by: security@neatnerds.be
|
|
208
|
+
used_in:
|
|
209
|
+
- production_apps
|
|
210
|
+
rules:
|
|
211
|
+
- id: injection_check
|
|
212
|
+
description: Scan for SQL/command injection vulnerabilities
|
|
213
|
+
priority: 100
|
|
214
|
+
enabled: true
|
|
215
|
+
- id: auth_verification
|
|
216
|
+
description: Verify authentication mechanisms
|
|
217
|
+
priority: 95
|
|
218
|
+
enabled: true
|
|
219
|
+
- id: data_exposure
|
|
220
|
+
description: Check for sensitive data exposure risks
|
|
221
|
+
priority: 90
|
|
222
|
+
enabled: true
|
|
223
|
+
- id: dependency_audit
|
|
224
|
+
description: Review third-party dependencies for known CVEs
|
|
225
|
+
priority: 85
|
|
226
|
+
enabled: true
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Validation
|
|
230
|
+
|
|
231
|
+
### Automatic Validation
|
|
232
|
+
|
|
233
|
+
Files are validated when:
|
|
234
|
+
|
|
235
|
+
- Created via `behaviour manage add`
|
|
236
|
+
- Modified via `behaviour manage modify`
|
|
237
|
+
- CI/CD pipeline runs
|
|
238
|
+
|
|
239
|
+
### Manual Validation
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Validate all files
|
|
243
|
+
bin/raictl behaviour validate
|
|
244
|
+
|
|
245
|
+
# Validate specific file
|
|
246
|
+
bin/raictl behaviour validate code_review
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Validation Rules
|
|
250
|
+
|
|
251
|
+
1. Required fields must be present
|
|
252
|
+
2. `rules` array must have at least one item
|
|
253
|
+
3. Each rule must have `id` and `description`
|
|
254
|
+
4. `version` must follow semantic versioning
|
|
255
|
+
5. `priority` must be between 1 and 100
|
|
256
|
+
6. No additional properties allowed
|
|
257
|
+
|
|
258
|
+
## Integration
|
|
259
|
+
|
|
260
|
+
### In CLAUDE.md
|
|
261
|
+
|
|
262
|
+
Reference behaviours in your CLAUDE.md:
|
|
263
|
+
|
|
264
|
+
```markdown
|
|
265
|
+
## Active Behaviours
|
|
266
|
+
|
|
267
|
+
This project uses the following behaviours:
|
|
268
|
+
- code_review
|
|
269
|
+
- security_audit
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### In Rules
|
|
273
|
+
|
|
274
|
+
Behaviours can be referenced in rule files:
|
|
275
|
+
|
|
276
|
+
```yaml
|
|
277
|
+
# rules/project_rules.yml
|
|
278
|
+
includes:
|
|
279
|
+
- behaviour: code_review
|
|
280
|
+
- behaviour: security_audit
|
|
281
|
+
override:
|
|
282
|
+
- id: test_coverage
|
|
283
|
+
priority: 95 # Increase priority for this project
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Compiling Rules
|
|
287
|
+
|
|
288
|
+
The `compile` command renders behaviour YAML files into markdown rule files that Claude Code reads from `~/.claude/rules/`.
|
|
289
|
+
|
|
290
|
+
### Usage
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
# Compile all categories (auto-detects scope from working directory)
|
|
294
|
+
bin/raictl compile
|
|
295
|
+
|
|
296
|
+
# Dry run — show what would change
|
|
297
|
+
bin/raictl compile --simulate --verbose
|
|
298
|
+
|
|
299
|
+
# Compile with detailed output
|
|
300
|
+
bin/raictl compile --verbose
|
|
301
|
+
|
|
302
|
+
# Compile and write lockfile
|
|
303
|
+
bin/raictl compile --vendor
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Scope-Aware Compilation
|
|
307
|
+
|
|
308
|
+
When run from a project directory (containing `.rosett-ai/`), compile
|
|
309
|
+
automatically merges global and project-level behaviours:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
# From a project directory with .rosett-ai/conf/behaviour/api_rules.yml:
|
|
313
|
+
cd ~/projects/acme-api
|
|
314
|
+
rai compile --verbose
|
|
315
|
+
# Output includes BOTH global behaviours AND project-specific api_rules
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Project behaviours with the same filename as a global behaviour
|
|
319
|
+
override the global version. All other global behaviours are preserved.
|
|
320
|
+
|
|
321
|
+
See: `spec/rosett_ai/thor/tasks/compile_spec.rb` — "with scope detection"
|
|
322
|
+
and "with multi-source compilation" contexts.
|
|
323
|
+
|
|
324
|
+
### How It Works
|
|
325
|
+
|
|
326
|
+
1. Discovers compilable categories from all active source directories (global + project if applicable)
|
|
327
|
+
2. Collects YAML files from each source; project-level files override global files with the same name
|
|
328
|
+
3. Validates each YAML file against its schema
|
|
329
|
+
4. Renders enabled rules (sorted by priority descending) into markdown
|
|
330
|
+
5. Writes to `~/.claude/rules/<category>-<name>.md`
|
|
331
|
+
6. Removes orphaned rule files that no longer have a source in any active scope
|
|
332
|
+
|
|
333
|
+
### Idempotency
|
|
334
|
+
|
|
335
|
+
The compiler computes SHA256 checksums and only writes when content changes. Running `compile` twice produces no changes on the second run.
|
|
336
|
+
|
|
337
|
+
### Lockfile
|
|
338
|
+
|
|
339
|
+
With `--vendor`, a `conf/compile.lock.yml` is written capturing the compiled state (versions, checksums, timestamps) for reproducibility.
|
|
340
|
+
|
|
341
|
+
## Adopting Rules
|
|
342
|
+
|
|
343
|
+
The `adopt` command analyzes compiled rule files for inconsistencies, conflicts, harmful content, duplicates, and other issues using the Claude API.
|
|
344
|
+
|
|
345
|
+
### Usage
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# Full API analysis
|
|
349
|
+
bin/raictl adopt
|
|
350
|
+
|
|
351
|
+
# Local-only structural checks (no API)
|
|
352
|
+
bin/raictl adopt --local
|
|
353
|
+
|
|
354
|
+
# Verbose output with details
|
|
355
|
+
bin/raictl adopt --verbose
|
|
356
|
+
|
|
357
|
+
# Show detailed explanations
|
|
358
|
+
bin/raictl adopt --elaborate --verbose
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Data Privacy
|
|
362
|
+
|
|
363
|
+
Four layers of privacy protection are available:
|
|
364
|
+
|
|
365
|
+
1. **Opt-in per file** (default) — Add `sensitive: true` to a behaviour YAML to exclude it from API analysis
|
|
366
|
+
2. **Redaction** — Configure patterns in `conf/adopt_redactions.yml` to replace sensitive content before sending to the API
|
|
367
|
+
3. **Configurable endpoint** — Set `ANTHROPIC_API_BASE_URL` environment variable for Bedrock, Vertex, or proxy endpoints
|
|
368
|
+
4. **Local-only mode** — Use `--local` flag to skip API calls entirely
|
|
369
|
+
|
|
370
|
+
### Sensitive Files
|
|
371
|
+
|
|
372
|
+
Mark a behaviour file as sensitive to exclude it from API analysis:
|
|
373
|
+
|
|
374
|
+
```yaml
|
|
375
|
+
name: internal_security
|
|
376
|
+
description: Internal security policies
|
|
377
|
+
sensitive: true
|
|
378
|
+
rules:
|
|
379
|
+
- id: sec_001
|
|
380
|
+
description: ...
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Sensitive files are still checked locally for structural issues.
|
|
384
|
+
|
|
385
|
+
### Redaction
|
|
386
|
+
|
|
387
|
+
Configure `conf/adopt_redactions.yml` with regex patterns:
|
|
388
|
+
|
|
389
|
+
```yaml
|
|
390
|
+
---
|
|
391
|
+
patterns:
|
|
392
|
+
- pattern: '\b[A-Z0-9._%+-]+@company\.com\b'
|
|
393
|
+
replacement: '[EMAIL-REDACTED]'
|
|
394
|
+
- pattern: 'CompanyName'
|
|
395
|
+
replacement: '[COMPANY]'
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### Caching
|
|
399
|
+
|
|
400
|
+
Results are cached in `conf/adopt.cache.yml`, keyed on the SHA256 of all analyzed file contents. Running `adopt` twice with unchanged files returns the cached result without an API call.
|
|
401
|
+
|
|
402
|
+
## Best Practices
|
|
403
|
+
|
|
404
|
+
1. **Keep behaviours focused**: One behaviour per concern
|
|
405
|
+
2. **Use descriptive IDs**: `security_sql_injection` > `rule_1`
|
|
406
|
+
3. **Document thoroughly**: Descriptions should be actionable
|
|
407
|
+
4. **Version your changes**: Update version on modifications
|
|
408
|
+
5. **Track usage**: Maintain `used_in` for dependency tracking
|
|
409
|
+
6. **Review regularly**: Audit behaviours periodically
|
data/doc/BUILD.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Building rosett-ai Packages
|
|
2
|
+
|
|
3
|
+
This document describes how to build Debian packages for rosett-ai core and engine plugins.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Install the following tools before building:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Debian build tools
|
|
11
|
+
sudo apt-get install fakeroot dpkg-dev rsync
|
|
12
|
+
|
|
13
|
+
# Ruby build (for core package only)
|
|
14
|
+
# Ensure ruby-build is on PATH (typically via rbenv)
|
|
15
|
+
|
|
16
|
+
# Install all gem dependencies (includes fpm from :build group)
|
|
17
|
+
bundle install
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Building rosett-ai Core
|
|
21
|
+
|
|
22
|
+
The core package bundles a self-contained Ruby runtime, the rosett-ai application,
|
|
23
|
+
vendored gems, and maintainer scripts into a Debian package at `/opt/rosett-ai`.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
cd rosett-ai/
|
|
27
|
+
|
|
28
|
+
# Default build (core variant)
|
|
29
|
+
bin/raictl build package
|
|
30
|
+
|
|
31
|
+
# With options
|
|
32
|
+
bin/raictl build package --clean --verbose
|
|
33
|
+
bin/raictl build package --variant gtk4
|
|
34
|
+
bin/raictl build package --variant qt6
|
|
35
|
+
bin/raictl build package --architecture arm64
|
|
36
|
+
bin/raictl build package --ruby-version 3.3.10
|
|
37
|
+
bin/raictl build package --output-dir /tmp/pkg
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Variants
|
|
41
|
+
|
|
42
|
+
| Variant | Package Name | Description |
|
|
43
|
+
|---------|-------------|-------------|
|
|
44
|
+
| `core` | `rosett-ai` | CLI + TUI (default) |
|
|
45
|
+
| `gtk4` | `rosett-ai-gtk4` | GTK4/Adwaita desktop interface |
|
|
46
|
+
| `qt6` | `rosett-ai-qt6` | Qt6/KDE desktop interface |
|
|
47
|
+
|
|
48
|
+
## Building an Engine Plugin
|
|
49
|
+
|
|
50
|
+
Engine plugins are packaged as Debian packages that install their gem into the
|
|
51
|
+
raictl embedded Ruby's gem directory.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# From the engine directory
|
|
55
|
+
cd rosett-ai-engine-claude/
|
|
56
|
+
rai build engine --verbose
|
|
57
|
+
|
|
58
|
+
# From the rosett-ai repo with --path
|
|
59
|
+
cd rosett-ai/
|
|
60
|
+
bin/raictl build engine --path ../rosett-ai-engine-claude --verbose
|
|
61
|
+
|
|
62
|
+
# Custom output and dependency version
|
|
63
|
+
rai build engine --output-dir /tmp/pkg --rosett-ai-min-version 1.0.0
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Options
|
|
67
|
+
|
|
68
|
+
| Option | Default | Description |
|
|
69
|
+
|--------|---------|-------------|
|
|
70
|
+
| `--path` | Current directory | Engine repo directory |
|
|
71
|
+
| `--verbose` | `false` | Show detailed build output |
|
|
72
|
+
| `--output-dir` | `pkg/` | Output directory for `.deb` |
|
|
73
|
+
| `--rosett-ai-min-version` | Current rai version | Minimum rosett-ai dependency |
|
|
74
|
+
| `--build-iteration` | `1` | Package iteration number |
|
|
75
|
+
|
|
76
|
+
### How It Works
|
|
77
|
+
|
|
78
|
+
1. Detects the engine gemspec (`rosett-ai-engine-*.gemspec`) in the target directory
|
|
79
|
+
2. Extracts name and version from the gemspec (no hardcoded values)
|
|
80
|
+
3. Derives Ruby ABI from the current runtime (`RbConfig::CONFIG['ruby_version']`)
|
|
81
|
+
4. Runs `gem build` to produce a `.gem` file
|
|
82
|
+
5. Creates a staging tree at `tmp/staging/opt/rosett-ai/embedded/lib/ruby/gems/<ABI>/`
|
|
83
|
+
6. Installs the gem into the staging tree with `gem install --local`
|
|
84
|
+
7. Packages with fpm, setting `--depends "rosett-ai (>= <version>)"`
|
|
85
|
+
|
|
86
|
+
## Building All Packages
|
|
87
|
+
|
|
88
|
+
To build all packages (core + engines):
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
#!/usr/bin/env ruby
|
|
92
|
+
# build_all.rb — build core + all engines
|
|
93
|
+
|
|
94
|
+
system('bin/raictl', 'build', 'package', '--verbose') || abort('Core build failed')
|
|
95
|
+
|
|
96
|
+
Dir.glob('../rosett-ai-engine-*/').each do |engine_dir|
|
|
97
|
+
name = File.basename(engine_dir)
|
|
98
|
+
puts "\nBuilding #{name}..."
|
|
99
|
+
system('bin/raictl', 'build', 'engine', '--path', engine_dir, '--verbose') || warn("#{name} failed")
|
|
100
|
+
end
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Version Management
|
|
104
|
+
|
|
105
|
+
Versions are never hardcoded in build scripts:
|
|
106
|
+
|
|
107
|
+
- **Core**: reads `RosettAi::VERSION` from `lib/rosett_ai/version.rb`
|
|
108
|
+
- **Engines**: parsed from the engine's gemspec (`spec.version`)
|
|
109
|
+
- **Ruby ABI**: derived from `RbConfig::CONFIG['ruby_version']` at build time
|
|
110
|
+
- **Ruby version**: read from `.ruby-version` (core only)
|
|
111
|
+
|
|
112
|
+
## Package Layout
|
|
113
|
+
|
|
114
|
+
After installation, the rosett-ai package tree looks like:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
/opt/rosett-ai/
|
|
118
|
+
bin/raictl # Wrapper script
|
|
119
|
+
app/ # Application source
|
|
120
|
+
embedded/ # Self-contained Ruby runtime
|
|
121
|
+
bin/ruby
|
|
122
|
+
lib/ruby/gems/3.3.10/
|
|
123
|
+
gems/
|
|
124
|
+
rosett-ai-engine-claude-1.0.0/
|
|
125
|
+
rosett-ai-engine-cursor-1.0.0/
|
|
126
|
+
...
|
|
127
|
+
etc/ # Default configuration
|
|
128
|
+
/etc/rosett-ai/
|
|
129
|
+
settings.json # dpkg conffile (preserved on upgrade)
|
|
130
|
+
/usr/share/man/man1/
|
|
131
|
+
rai.1.gz # Man page
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## CI/CD Integration
|
|
135
|
+
|
|
136
|
+
Engine builds in CI use the shared component from `ci-components/templates/rosett-ai-engine.yml`.
|
|
137
|
+
The `bin/raictl build engine` command is the canonical build method for both local
|
|
138
|
+
development and CI pipelines.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# CI/CD Recipes
|
|
2
|
+
|
|
3
|
+
Patterns and recipes for rosett-ai continuous integration and deployment.
|
|
4
|
+
|
|
5
|
+
## Pipeline Architecture
|
|
6
|
+
|
|
7
|
+
The rosett-ai pipeline is split across multiple YAML files in
|
|
8
|
+
`.gitlab-ci-files/` for maintainability:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
.gitlab-ci.yml # Root includes
|
|
12
|
+
├── global/stages.yml # Stage ordering
|
|
13
|
+
├── global/defaults.yml # Default image, cache, retry
|
|
14
|
+
├── global/variables.yml # Shared CI variables
|
|
15
|
+
├── global/resource-limits.yml # CPU/memory limits
|
|
16
|
+
├── validate/*.yml # YAML, JSON, Ruby syntax, schemas
|
|
17
|
+
├── code_quality/*.yml # RuboCop, Reek, Fasterer, Flay
|
|
18
|
+
├── security_scan/*.yml # Bundler-audit, Trivy, Gitleaks
|
|
19
|
+
├── test/*.yml # RSpec, Mutant
|
|
20
|
+
├── build/package.yml # .deb packaging (amd64 + arm64)
|
|
21
|
+
├── release/publish.yml # GitLab release creation
|
|
22
|
+
└── deploy/pulp.yml # Pulp repository publishing
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Stages
|
|
26
|
+
|
|
27
|
+
| Stage | Purpose | Example Jobs |
|
|
28
|
+
|-------|---------|--------------|
|
|
29
|
+
| `validate` | Syntax and schema validation | yaml, json, ruby-syntax, schemas |
|
|
30
|
+
| `code_quality` | Static analysis | rubocop, reek, fasterer, flay |
|
|
31
|
+
| `security_scan` | Vulnerability detection | bundler-audit, trivy, gitleaks |
|
|
32
|
+
| `test` | Functional testing | rspec, mutant |
|
|
33
|
+
| `build` | Package creation | amd64, arm64, smoke test |
|
|
34
|
+
| `deploy` | Repository publishing | pulp stable, pulp unstable |
|
|
35
|
+
|
|
36
|
+
## Multi-Architecture Builds
|
|
37
|
+
|
|
38
|
+
The `.package_build_template` in `build/package.yml` supports parallel
|
|
39
|
+
architecture builds:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
build:package:amd64:
|
|
43
|
+
extends: .package_build_template
|
|
44
|
+
variables:
|
|
45
|
+
PACKAGE_ARCH: "amd64"
|
|
46
|
+
|
|
47
|
+
build:package:arm64:
|
|
48
|
+
extends: .package_build_template
|
|
49
|
+
variables:
|
|
50
|
+
PACKAGE_ARCH: "arm64"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Adding a New Architecture
|
|
54
|
+
|
|
55
|
+
1. Add a new job extending `.package_build_template`
|
|
56
|
+
2. Set `PACKAGE_ARCH` to the dpkg architecture name
|
|
57
|
+
3. Add it to `build:package:release` needs list
|
|
58
|
+
4. Ensure a CI runner with matching `tags` is available
|
|
59
|
+
|
|
60
|
+
## Release Automation
|
|
61
|
+
|
|
62
|
+
Releases are triggered by annotated tags matching `v*.*.*`:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Prepare release (bumps VERSION, generates CHANGELOG)
|
|
66
|
+
bin/raictl release prepare minor
|
|
67
|
+
|
|
68
|
+
# Create annotated tag
|
|
69
|
+
bin/raictl release tag
|
|
70
|
+
|
|
71
|
+
# Push tag to trigger CI
|
|
72
|
+
git push origin --tags
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The pipeline then:
|
|
76
|
+
|
|
77
|
+
1. Runs all quality gates (validate → test)
|
|
78
|
+
2. Builds `.deb` packages for both architectures
|
|
79
|
+
3. Collects artifacts with SHA256 checksums
|
|
80
|
+
4. Creates a GitLab release with CHANGELOG notes
|
|
81
|
+
5. Publishes to the Pulp stable repository
|
|
82
|
+
|
|
83
|
+
## Smoke Testing
|
|
84
|
+
|
|
85
|
+
The `build:package:smoke_test` job installs the built `.deb` in a clean
|
|
86
|
+
`debian:bookworm` container with no pre-installed Ruby:
|
|
87
|
+
|
|
88
|
+
```yaml
|
|
89
|
+
script:
|
|
90
|
+
- dpkg -i pkg/*.deb || apt-get install -fy
|
|
91
|
+
- rosett-ai version
|
|
92
|
+
- rai validate
|
|
93
|
+
- rai engines list
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This verifies the package is self-contained (embedded Ruby, all gems).
|
|
97
|
+
|
|
98
|
+
## Cache Strategy
|
|
99
|
+
|
|
100
|
+
| Cache Key | Contents | Policy |
|
|
101
|
+
|-----------|----------|--------|
|
|
102
|
+
| `Gemfile.lock` hash | `vendor/bundle/` | pull |
|
|
103
|
+
| `package-${REF}` | Compiled Ruby in staging | pull-push |
|
|
104
|
+
|
|
105
|
+
The compiled Ruby cache avoids the ~13 minute compilation on every build.
|
|
106
|
+
|
|
107
|
+
## Engine Gem CI
|
|
108
|
+
|
|
109
|
+
Engine gems use the shared CI component from `ci-components` (v1.0.1):
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
include:
|
|
113
|
+
- component: gitlab.neatnerds.be/neatnerds/NeatNerds-AI/ci-components/rosett-ai-engine@v1.0.1
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
This provides standard jobs for: RuboCop, Reek, RSpec, Mutant, and
|
|
117
|
+
SimpleCov with tiered coverage thresholds.
|
|
118
|
+
|
|
119
|
+
### Adding a New Engine
|
|
120
|
+
|
|
121
|
+
1. Scaffold with `rosett-ai-dev-tools`: `rosett-ai-dev-tools scaffold engine <name>`
|
|
122
|
+
2. The scaffold includes a `.gitlab-ci.yml` that references the shared component
|
|
123
|
+
3. Push to GitLab and the pipeline runs automatically
|
|
124
|
+
|
|
125
|
+
## Integration Testing (Future)
|
|
126
|
+
|
|
127
|
+
Integration tests require Docker (Phase 7):
|
|
128
|
+
|
|
129
|
+
```yaml
|
|
130
|
+
integration:test_kitchen:
|
|
131
|
+
stage: test
|
|
132
|
+
image: docker:24
|
|
133
|
+
services:
|
|
134
|
+
- docker:24-dind
|
|
135
|
+
script:
|
|
136
|
+
- kitchen test
|
|
137
|
+
rules:
|
|
138
|
+
- if: $CI_COMMIT_TAG
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
This will use Test Kitchen with a Debian container to verify:
|
|
142
|
+
|
|
143
|
+
- Package installation
|
|
144
|
+
- Engine detection
|
|
145
|
+
- Configuration compilation
|
|
146
|
+
- D-Bus service lifecycle
|
|
147
|
+
|
|
148
|
+
## Security Scanning
|
|
149
|
+
|
|
150
|
+
| Scanner | What It Checks |
|
|
151
|
+
|---------|----------------|
|
|
152
|
+
| Bundler-audit | Known CVEs in gem dependencies |
|
|
153
|
+
| Ruby-audit | Ruby stdlib vulnerabilities |
|
|
154
|
+
| Trivy | Container image vulnerabilities |
|
|
155
|
+
| Gitleaks | Leaked secrets in git history |
|
|
156
|
+
|
|
157
|
+
## Quality Gates
|
|
158
|
+
|
|
159
|
+
All quality gates must pass before merge:
|
|
160
|
+
|
|
161
|
+
| Gate | Threshold |
|
|
162
|
+
|------|-----------|
|
|
163
|
+
| RuboCop | 0 offenses |
|
|
164
|
+
| Reek | 0 warnings (with exclusions) |
|
|
165
|
+
| Fasterer | 0 offenses |
|
|
166
|
+
| Flay | mass threshold 16 |
|
|
167
|
+
| RSpec | 0 failures |
|
|
168
|
+
| SimpleCov | >= 87% line coverage |
|
|
169
|
+
| Mutant | All configured subjects |
|
|
170
|
+
| Bundler-audit | No known vulnerabilities |
|
|
171
|
+
| Gitleaks | No secrets detected |
|