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,153 @@
|
|
|
1
|
+
# NNCC Project Dashboard
|
|
2
|
+
|
|
3
|
+
> **Rosett-AI** v1.0.0-dev | Updated: 2026-03-18
|
|
4
|
+
|
|
5
|
+
## Ecosystem Map
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
┌──────────────────────┐
|
|
9
|
+
│ rosett-ai (core) │
|
|
10
|
+
│ v1.0.0-dev │
|
|
11
|
+
│ 222 lib files │
|
|
12
|
+
│ 231 spec files │
|
|
13
|
+
│ 44 design docs │
|
|
14
|
+
│ 27 CLI subcommands │
|
|
15
|
+
│ 242 commits │
|
|
16
|
+
└───────────┬───────────┘
|
|
17
|
+
│
|
|
18
|
+
┌──────────────────────┼──────────────────────┐
|
|
19
|
+
│ │ │
|
|
20
|
+
┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
|
|
21
|
+
│ ci-components │ │ rosett-ai-dev-tools │ │ 11 engines │
|
|
22
|
+
│ v1.0.1 │ │ scaffold gen │ │ (see matrix) │
|
|
23
|
+
└──────────────────┘ └──────────────────┘ └──────────────────┘
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Engine Matrix
|
|
27
|
+
|
|
28
|
+
| Engine | Repo | Status |
|
|
29
|
+
|--------|------|--------|
|
|
30
|
+
| acme (example) | `rosett-ai-engine-acme` | Scaffold |
|
|
31
|
+
| agents-md | `rosett-ai-engine-agents-md` | Implemented |
|
|
32
|
+
| aider | `rosett-ai-engine-aider` | Implemented |
|
|
33
|
+
| claude | `rosett-ai-engine-claude` | Implemented |
|
|
34
|
+
| copilot | `rosett-ai-engine-copilot` | Implemented |
|
|
35
|
+
| cursor | `rosett-ai-engine-cursor` | Implemented |
|
|
36
|
+
| generic | `rosett-ai-engine-generic` | Implemented |
|
|
37
|
+
| goose | `rosett-ai-engine-goose` | Implemented |
|
|
38
|
+
| gpt-neox | `rosett-ai-engine-gpt-neox` | Implemented |
|
|
39
|
+
| ollama | `rosett-ai-engine-ollama` | Implemented |
|
|
40
|
+
| windsurf | `rosett-ai-engine-windsurf` | Implemented |
|
|
41
|
+
|
|
42
|
+
## Design Document Status
|
|
43
|
+
|
|
44
|
+
All 44/44 design documents have `status: implemented`.
|
|
45
|
+
|
|
46
|
+
| Category | Documents |
|
|
47
|
+
|----------|-----------|
|
|
48
|
+
| Architecture (P1-P2) | architecture, engine_architecture, compiler, ci_pipeline, security |
|
|
49
|
+
| Features (P2) | mcp_integration, mcp_settings, aaif_alignment, claude_code_configuration |
|
|
50
|
+
| Modules | behaviour_composition, ai_provenance, ai_tool_configuration, ai_authorship, policy_management |
|
|
51
|
+
| CLI Features | comply, doctor, workflow, project_management, retrofit, autocompletion, git_hooks |
|
|
52
|
+
| Quality | testing, test_peer_review, threat_model, documentation, styles |
|
|
53
|
+
| Platform | desktop_integration, gui_plugins, i18n, accessibility, ui_framework |
|
|
54
|
+
| Operations | distribution, release_management, version_management, lifecycle_management |
|
|
55
|
+
| Advanced | error_handling, structured_logging, monitoring_observability, usage_optimization |
|
|
56
|
+
| Business | content_packs, licensing_system, feature_flags, backward_compatibility, smart_ui_feedback |
|
|
57
|
+
|
|
58
|
+
## Quality Gate Matrix
|
|
59
|
+
|
|
60
|
+
| Tool | Target | Status |
|
|
61
|
+
|------|--------|--------|
|
|
62
|
+
| RuboCop + performance + thread_safety | 0 offenses | Enforced |
|
|
63
|
+
| Reek | Clean | Enforced |
|
|
64
|
+
| Fasterer | 0 offenses | Enforced |
|
|
65
|
+
| Flay (mass:16) | Clean | Enforced |
|
|
66
|
+
| Overcommit (all hooks) | Passing | Enforced |
|
|
67
|
+
| Gitleaks | Clean | Enforced |
|
|
68
|
+
| Mutant | 20+ subjects | Enforced |
|
|
69
|
+
| SimpleCov line | >= 88% | Monitoring |
|
|
70
|
+
| SimpleCov branch | >= 0% | Monitoring |
|
|
71
|
+
| Cobertura XML | Generated | Enforced |
|
|
72
|
+
| JUnit XML | Generated | Enforced |
|
|
73
|
+
| Debride | Clean | New |
|
|
74
|
+
| License Finder | GPL-3.0 compat | New |
|
|
75
|
+
| bundler-audit | No vulns | Enforced |
|
|
76
|
+
|
|
77
|
+
## CLI Subcommands (27)
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
adopt backup behaviour build compile
|
|
81
|
+
completion comply config content dbus
|
|
82
|
+
design desktop doctor documentation engines
|
|
83
|
+
hooks init license mcp plugins
|
|
84
|
+
project provenance release retrofit tooling
|
|
85
|
+
validate workflow
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Modules on main
|
|
89
|
+
|
|
90
|
+
| Module | Namespace | Error Class |
|
|
91
|
+
|--------|-----------|-------------|
|
|
92
|
+
| Behaviour Composition | `RosettAi::Composition::*` | `CompositionError` |
|
|
93
|
+
| AI Provenance | `RosettAi::Provenance::*` | `ProvenanceError` |
|
|
94
|
+
| AI Tool Configuration | `RosettAi::AiConfig::*` | `AiConfigError` |
|
|
95
|
+
| AI Authorship | `RosettAi::Authorship::*` | `AuthorshipError` |
|
|
96
|
+
| Policy Management | `RosettAi::Policy::*` | `PolicyError` |
|
|
97
|
+
|
|
98
|
+
## Timeline
|
|
99
|
+
|
|
100
|
+
| Date | Milestone |
|
|
101
|
+
|------|-----------|
|
|
102
|
+
| 2025-01-17 | Project inception (Claude Companion) |
|
|
103
|
+
| 2026-02-26 | Renamed to Rosett-AI; engine-agnostic pivot |
|
|
104
|
+
| 2026-03-12 | Ecosystem orchestration overhaul complete (Phases 1-6) |
|
|
105
|
+
| 2026-03-15 | Test peer review complete (142/142 specs); branch cleanup |
|
|
106
|
+
| 2026-03-17 | All 44 design docs flipped to implemented |
|
|
107
|
+
| 2026-03-18 | Quality completion pass |
|
|
108
|
+
| TBD | v1.0.0 tag (pending user decision) |
|
|
109
|
+
|
|
110
|
+
## Roadmap — Blocked Items
|
|
111
|
+
|
|
112
|
+
| Item | Blocker | Notes |
|
|
113
|
+
|------|---------|-------|
|
|
114
|
+
| Docker + Test Kitchen | Puppet `profile::containerization::docker` on Agnes | Separate plan in neatnerds-data |
|
|
115
|
+
| CI base image | GitLab Container Registry + Dockerfile | Depends on Docker setup |
|
|
116
|
+
| Renovate (self-hosted) | GitLab CI runner with Docker | Depends on Docker setup |
|
|
117
|
+
| DHI images | `dhi.io/ruby:3.3.x-bookworm` availability | Monitor |
|
|
118
|
+
|
|
119
|
+
## Housekeeping Debt
|
|
120
|
+
|
|
121
|
+
| Item | Status |
|
|
122
|
+
|------|--------|
|
|
123
|
+
| Stale local branches | Cleaned (Phase 1) |
|
|
124
|
+
| Stale remote branches | Cleaned (Phase 1) |
|
|
125
|
+
| Git stashes | Dropped (Phase 1) |
|
|
126
|
+
| Untracked files | Resolved (Phase 1) |
|
|
127
|
+
|
|
128
|
+
## Overall Completion
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
Core Implementation ████████████████████ 100% (all features on main)
|
|
132
|
+
Design Documents ████████████████████ 100% (44/44 implemented)
|
|
133
|
+
Engine Scaffolds ████████████████████ 100% (11/11 engines)
|
|
134
|
+
Quality Gates ████████████████████ 100% (all tools enforced)
|
|
135
|
+
Man Pages ████████████████████ 100% (all 27 subcommands documented)
|
|
136
|
+
CLI Help Text ████████████████████ 100% (long_desc on all methods)
|
|
137
|
+
i18n ████████████████████ 100% (en/fr/ar complete)
|
|
138
|
+
InSpec Integration ████████████████████ 100% (12 suites, 28+ controls)
|
|
139
|
+
Test Coverage ████████████████████ 100% (87.97% — gate: 87.37%)
|
|
140
|
+
Documentation ████████████████████ 100% (verified and updated)
|
|
141
|
+
v1.0.0 Tag ░░░░░░░░░░░░░░░░░░░░ 0% (pending user decision)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Updating This Document
|
|
147
|
+
|
|
148
|
+
1. Run quality gates and update the matrix
|
|
149
|
+
2. Check `git log --oneline | wc -l` for commit count
|
|
150
|
+
3. Check `find lib/rosett-ai -name '*.rb' | wc -l` for lib file count
|
|
151
|
+
4. Check `find spec -name '*_spec.rb' | wc -l` for spec count
|
|
152
|
+
5. Update completion percentages based on current state
|
|
153
|
+
6. Update the date stamp at the top
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Pulp 3 Deployment Guide
|
|
2
|
+
|
|
3
|
+
This document describes how to set up and operate the Pulp 3 package
|
|
4
|
+
repository for distributing rosett-ai `.deb` packages.
|
|
5
|
+
|
|
6
|
+
## Prerequisites
|
|
7
|
+
|
|
8
|
+
- Docker and Docker Compose (via Puppet `profile::containerization::docker`)
|
|
9
|
+
- PostgreSQL 14+ (managed by Pulp container stack)
|
|
10
|
+
- Redis (managed by Pulp container stack)
|
|
11
|
+
- Reverse proxy with TLS (nginx/Caddy serving `repo.neatnerds.be`)
|
|
12
|
+
- GPG key pair for package signing
|
|
13
|
+
|
|
14
|
+
## Architecture
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
GitLab CI Runner
|
|
18
|
+
│
|
|
19
|
+
├─ build:package:amd64 ──→ pkg/*.deb
|
|
20
|
+
├─ build:package:arm64 ──→ pkg/*.deb
|
|
21
|
+
├─ build:package:release ──→ release/*.deb + SHA256SUMS
|
|
22
|
+
│
|
|
23
|
+
└─ deploy:pulp:stable ──→ Pulp 3 API (repo.neatnerds.be)
|
|
24
|
+
deploy:pulp:unstable ──→ Pulp 3 API (repo.neatnerds.be)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Pulp Stack Setup
|
|
28
|
+
|
|
29
|
+
The Pulp 3 stack runs as a set of Docker containers managed by
|
|
30
|
+
`docker-compose.yml` in the infrastructure repository.
|
|
31
|
+
|
|
32
|
+
Required services:
|
|
33
|
+
|
|
34
|
+
- `pulp-api` — Pulp API server
|
|
35
|
+
- `pulp-content` — Content delivery server
|
|
36
|
+
- `pulp-worker` — Task worker(s)
|
|
37
|
+
- `postgres` — Database
|
|
38
|
+
- `redis` — Cache and task broker
|
|
39
|
+
|
|
40
|
+
Required plugins:
|
|
41
|
+
|
|
42
|
+
- `pulp_deb` — Debian package support
|
|
43
|
+
|
|
44
|
+
## Repository Structure
|
|
45
|
+
|
|
46
|
+
| Repository | Channel | Published When |
|
|
47
|
+
|-----------|---------|----------------|
|
|
48
|
+
| `rosett-ai-stable` | stable | Annotated tag `v*.*.*` |
|
|
49
|
+
| `rosett-ai-unstable` | unstable | Push to `main` branch |
|
|
50
|
+
|
|
51
|
+
## GPG Key Management
|
|
52
|
+
|
|
53
|
+
### Generate Signing Key
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
gpg --batch --gen-key <<EOF
|
|
57
|
+
Key-Type: RSA
|
|
58
|
+
Key-Length: 4096
|
|
59
|
+
Subkey-Type: RSA
|
|
60
|
+
Subkey-Length: 4096
|
|
61
|
+
Name-Real: NeatNerds Package Signing
|
|
62
|
+
Name-Email: packages@neatnerds.be
|
|
63
|
+
Expire-Date: 2y
|
|
64
|
+
%no-protection
|
|
65
|
+
EOF
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Export Keys
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Public key (distributed to users)
|
|
72
|
+
gpg --armor --export packages@neatnerds.be > gpg.key
|
|
73
|
+
|
|
74
|
+
# Private key (stored as CI/CD variable GPG_PRIVATE_KEY, masked + protected)
|
|
75
|
+
gpg --armor --export-secret-keys packages@neatnerds.be > gpg-private.key
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Rotate Keys
|
|
79
|
+
|
|
80
|
+
1. Generate new key pair
|
|
81
|
+
2. Update `GPG_PRIVATE_KEY` CI/CD variable
|
|
82
|
+
3. Publish new public key to `https://repo.neatnerds.be/gpg.key`
|
|
83
|
+
4. Re-sign all existing packages in the repository
|
|
84
|
+
5. Update `INSTALL.md` if the key fingerprint changed
|
|
85
|
+
|
|
86
|
+
## CI/CD Variables
|
|
87
|
+
|
|
88
|
+
Configure these in GitLab CI/CD settings (protected, masked):
|
|
89
|
+
|
|
90
|
+
| Variable | Type | Description |
|
|
91
|
+
|----------|------|-------------|
|
|
92
|
+
| `PULP_API_URL` | Variable | Pulp 3 API base URL |
|
|
93
|
+
| `PULP_API_TOKEN` | Variable | Bearer token for authentication |
|
|
94
|
+
| `GPG_PRIVATE_KEY` | File | GPG private key for signing |
|
|
95
|
+
|
|
96
|
+
## Initial Repository Creation
|
|
97
|
+
|
|
98
|
+
After Pulp is running, create the repositories:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Install pulp-cli
|
|
102
|
+
pip install pulp-cli[deb]
|
|
103
|
+
|
|
104
|
+
# Create repositories
|
|
105
|
+
pulp deb repository create --name rosett-ai-stable
|
|
106
|
+
pulp deb repository create --name rosett-ai-unstable
|
|
107
|
+
|
|
108
|
+
# Create distributions (serve content at URL paths)
|
|
109
|
+
pulp deb distribution create \
|
|
110
|
+
--name rosett-ai-stable \
|
|
111
|
+
--base-path stable \
|
|
112
|
+
--repository rosett-ai-stable
|
|
113
|
+
|
|
114
|
+
pulp deb distribution create \
|
|
115
|
+
--name rosett-ai-unstable \
|
|
116
|
+
--base-path unstable \
|
|
117
|
+
--repository rosett-ai-unstable
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Monitoring
|
|
121
|
+
|
|
122
|
+
### Health Checks
|
|
123
|
+
|
|
124
|
+
- Pulp API: `curl -s https://repo.neatnerds.be/pulp/api/v3/status/`
|
|
125
|
+
- Content server: `curl -s https://repo.neatnerds.be/stable/`
|
|
126
|
+
- Package count: `pulp deb repository show --name rosett-ai-stable | jq '.latest_version_href'`
|
|
127
|
+
|
|
128
|
+
### Log Locations
|
|
129
|
+
|
|
130
|
+
- Pulp API: Docker logs for `pulp-api` container
|
|
131
|
+
- Content server: Docker logs for `pulp-content` container
|
|
132
|
+
- Worker tasks: Docker logs for `pulp-worker` container
|
|
133
|
+
- CI publish: GitLab CI job logs for `deploy:pulp:*` jobs
|
|
134
|
+
|
|
135
|
+
## Troubleshooting
|
|
136
|
+
|
|
137
|
+
### "Repository not found in Pulp"
|
|
138
|
+
|
|
139
|
+
The `pulp_upload.sh` script expects repositories named `rosett-ai-stable`
|
|
140
|
+
and `rosett-ai-unstable`. Create them as described above.
|
|
141
|
+
|
|
142
|
+
### "Failed to upload artifact"
|
|
143
|
+
|
|
144
|
+
Check that `PULP_API_TOKEN` is valid and has write permissions.
|
|
145
|
+
Verify the Pulp API is reachable from the CI runner.
|
|
146
|
+
|
|
147
|
+
### "dpkg-sig: error signing"
|
|
148
|
+
|
|
149
|
+
The `GPG_PRIVATE_KEY` CI/CD variable must contain the full ASCII-armored
|
|
150
|
+
private key. Verify with:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
echo "$GPG_PRIVATE_KEY" | gpg --batch --import --dry-run
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Dependencies
|
|
157
|
+
|
|
158
|
+
This deployment depends on:
|
|
159
|
+
|
|
160
|
+
- Docker setup via Puppet (`profile::containerization::docker` on Agnes)
|
|
161
|
+
- TLS certificate for `repo.neatnerds.be`
|
|
162
|
+
- DNS record for `repo.neatnerds.be`
|
|
163
|
+
|
|
164
|
+
See the infrastructure repository for Puppet profiles and Hiera data.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Quality Check Failure - Fix Summary
|
|
2
|
+
|
|
3
|
+
## Issue
|
|
4
|
+
|
|
5
|
+
CI pipeline failed with Reek and RuboCop violations that should have been caught by pre-commit hooks.
|
|
6
|
+
|
|
7
|
+
## Root Cause
|
|
8
|
+
|
|
9
|
+
1. **Git hooks were not installed** - `overcommit --install` was never run
|
|
10
|
+
2. **Reek was configured to warn only** - Should have been set to fail
|
|
11
|
+
|
|
12
|
+
## Files Affected
|
|
13
|
+
|
|
14
|
+
- `lib/rosett_ai/thor/tasks/init.rb` - 270 lines (limit: 200), code smells
|
|
15
|
+
- Created: `lib/rosett_ai/init/file_copier.rb` - File copying helper
|
|
16
|
+
- Created: `lib/rosett_ai/init/directory_builder.rb` - Directory setup helper
|
|
17
|
+
- Updated: `.overcommit.yml` - Changed Reek from warn to fail
|
|
18
|
+
- Updated: `.reek.yml` - Added acceptable exclusions
|
|
19
|
+
- Updated: `doc/SETUP.md` - Emphasized hook installation
|
|
20
|
+
|
|
21
|
+
## What Was Done
|
|
22
|
+
|
|
23
|
+
### Code Refactoring
|
|
24
|
+
|
|
25
|
+
- **Reduced init.rb from 270 → 116 lines** (57% reduction)
|
|
26
|
+
- Extracted file operations to `RosettAi::Init::FileCopier` module
|
|
27
|
+
- Extracted directory operations to `RosettAi::Init::DirectoryBuilder` module
|
|
28
|
+
- Fixed all Reek warnings (TooManyStatements, FeatureEnvy, DataClump)
|
|
29
|
+
- Fixed all RuboCop offenses (ClassLength, guard clause)
|
|
30
|
+
|
|
31
|
+
### Configuration Updates
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
# .overcommit.yml
|
|
35
|
+
Reek:
|
|
36
|
+
on_warn: fail # Changed from 'warn'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
# .reek.yml - Added exclusions
|
|
41
|
+
FeatureEnvy:
|
|
42
|
+
exclude:
|
|
43
|
+
- RosettAi::Thor::Tasks::Init#build_summary_rows
|
|
44
|
+
LongParameterList:
|
|
45
|
+
exclude:
|
|
46
|
+
- RosettAi::Init::FileCopier#copy_glob_files
|
|
47
|
+
DataClump:
|
|
48
|
+
exclude:
|
|
49
|
+
- RosettAi::Init::FileCopier
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Hook Installation
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
bundle exec overcommit --install
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Verification
|
|
59
|
+
|
|
60
|
+
All checks passing:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
✓ bundle exec reek lib/rosett_ai/thor/tasks/init.rb lib/rosett_ai/init/
|
|
64
|
+
0 total warnings
|
|
65
|
+
|
|
66
|
+
✓ bundle exec rubocop lib/rosett_ai/thor/tasks/init.rb lib/rosett_ai/init/
|
|
67
|
+
3 files inspected, no offenses detected
|
|
68
|
+
|
|
69
|
+
✓ bundle exec rspec
|
|
70
|
+
187 examples, 0 failures
|
|
71
|
+
Line Coverage: 92.57%
|
|
72
|
+
|
|
73
|
+
✓ bundle exec overcommit --run
|
|
74
|
+
All pre-commit hooks passed
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Prevention
|
|
78
|
+
|
|
79
|
+
### For Developers
|
|
80
|
+
|
|
81
|
+
**ALWAYS run after cloning:**
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
bundle install
|
|
85
|
+
overcommit --install
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Before committing:**
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Hooks run automatically, but you can test manually
|
|
92
|
+
bundle exec overcommit --run
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### For CI/CD
|
|
96
|
+
|
|
97
|
+
Pipeline already catches these issues. No changes needed.
|
|
98
|
+
|
|
99
|
+
## Lessons Learned
|
|
100
|
+
|
|
101
|
+
1. Git hooks require explicit installation
|
|
102
|
+
2. Quality gates should fail, not warn
|
|
103
|
+
3. Document critical setup steps clearly
|
|
104
|
+
4. CI is last resort, not first line of defense
|
|
105
|
+
|
|
106
|
+
## References
|
|
107
|
+
|
|
108
|
+
- Full incident report: `doc/INCIDENT_REPORT_2026-02-02.md`
|
|
109
|
+
- Updated setup guide: `doc/SETUP.md`
|
|
110
|
+
- Overcommit docs: <https://github.com/sds/overcommit>
|
data/doc/QUICK_START.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Quick Start Guide
|
|
2
|
+
|
|
3
|
+
Get up and running with rosett-ai in five minutes.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Debian 12 (bookworm) or later, amd64 or arm64
|
|
8
|
+
- Ruby 3.3+ (installed via `.deb` package or rbenv)
|
|
9
|
+
|
|
10
|
+
## 1. Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# From APT repository (recommended)
|
|
14
|
+
curl -fsSL https://repo.neatnerds.be/gpg.key \
|
|
15
|
+
| sudo gpg --dearmor -o /etc/apt/keyrings/neatnerds.gpg
|
|
16
|
+
echo "deb [signed-by=/etc/apt/keyrings/neatnerds.gpg arch=amd64] https://repo.neatnerds.be/stable bookworm main" \
|
|
17
|
+
| sudo tee /etc/apt/sources.list.d/neatnerds.list
|
|
18
|
+
sudo apt-get update && sudo apt-get install rosett-ai
|
|
19
|
+
|
|
20
|
+
# Verify
|
|
21
|
+
raictl version
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
For `.deb` download and other installation methods, see [INSTALL.md](../INSTALL.md).
|
|
25
|
+
|
|
26
|
+
## 2. Initialise
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Set up global configuration (~/.claude/, ~/.config/rosett-ai/)
|
|
30
|
+
rai init --global
|
|
31
|
+
|
|
32
|
+
# Optionally initialise a project
|
|
33
|
+
cd /path/to/your/project
|
|
34
|
+
rai init --project
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This creates the directory structure, detects installed engines, and writes
|
|
38
|
+
a default configuration.
|
|
39
|
+
|
|
40
|
+
## 3. Write Your First Behaviour
|
|
41
|
+
|
|
42
|
+
Create a behaviour file at `conf/behaviour/code_style.yml`:
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
name: code_style
|
|
46
|
+
description: Consistent code style rules
|
|
47
|
+
version: 1.0.0
|
|
48
|
+
author: your_name
|
|
49
|
+
created_at: "2026-01-01"
|
|
50
|
+
modified_at: "2026-01-01"
|
|
51
|
+
modified_by: your_name
|
|
52
|
+
sensitive: false
|
|
53
|
+
used_in: []
|
|
54
|
+
rules:
|
|
55
|
+
- id: style_001
|
|
56
|
+
description: Use 2-space indentation in Ruby files
|
|
57
|
+
priority: 50
|
|
58
|
+
enabled: true
|
|
59
|
+
- id: style_002
|
|
60
|
+
description: Prefer single quotes for plain strings
|
|
61
|
+
priority: 50
|
|
62
|
+
enabled: true
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 4. Validate
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Check all configuration files
|
|
69
|
+
rai validate
|
|
70
|
+
|
|
71
|
+
# Check a specific behaviour
|
|
72
|
+
rai behaviour validate code_style
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Validation ensures YAML syntax and schema conformance.
|
|
76
|
+
|
|
77
|
+
## 5. Compile
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Compile to your default engine (auto-detected)
|
|
81
|
+
rai compile --verbose
|
|
82
|
+
|
|
83
|
+
# Preview changes without writing
|
|
84
|
+
rai compile --simulate --verbose
|
|
85
|
+
|
|
86
|
+
# Target a specific engine
|
|
87
|
+
rai compile --engine claude
|
|
88
|
+
rai compile --engine agents_md
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Compiled rules are written to the engine's target directory (e.g.,
|
|
92
|
+
`~/.claude/rules/` for the Claude engine).
|
|
93
|
+
|
|
94
|
+
## 6. Verify
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# List compiled rules
|
|
98
|
+
ls ~/.claude/rules/
|
|
99
|
+
|
|
100
|
+
# Show all available engines
|
|
101
|
+
rai engines list
|
|
102
|
+
|
|
103
|
+
# Check which engines are installed
|
|
104
|
+
rai engines detect
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Next Steps
|
|
108
|
+
|
|
109
|
+
| Task | Command |
|
|
110
|
+
|------|---------|
|
|
111
|
+
| Add more behaviours | `rai behaviour manage add NAME` |
|
|
112
|
+
| View all behaviours | `rai behaviour display` |
|
|
113
|
+
| Compile with lockfile | `rai compile --vendor` |
|
|
114
|
+
| Self-diagnostic | `rai doctor` |
|
|
115
|
+
| Manage design docs | `rai design list` |
|
|
116
|
+
| Check compliance | `rai comply` |
|
|
117
|
+
| View help | `raictl help` |
|
|
118
|
+
|
|
119
|
+
## Common Workflows
|
|
120
|
+
|
|
121
|
+
### Adding a New Behaviour
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
rai behaviour manage add security_rules
|
|
125
|
+
# Edit the generated YAML file
|
|
126
|
+
rai behaviour validate security_rules
|
|
127
|
+
rai compile --verbose
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Migrating Existing AI Tool Configuration
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# Import rules from an existing Claude Code setup
|
|
134
|
+
rai retrofit --engine claude --verbose
|
|
135
|
+
|
|
136
|
+
# Preview the import
|
|
137
|
+
rai retrofit --engine claude --simulate
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Working with Multiple Engines
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Compile for all detected engines
|
|
144
|
+
rai engines detect
|
|
145
|
+
rai compile --engine claude
|
|
146
|
+
rai compile --engine cursor
|
|
147
|
+
rai compile --engine agents_md
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Troubleshooting
|
|
151
|
+
|
|
152
|
+
Run the self-diagnostic to check for common issues:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
rai doctor
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This checks Ruby version, gem dependencies, file permissions, D-Bus
|
|
159
|
+
availability, engine detection, and cache health.
|
|
160
|
+
|
|
161
|
+
For more detailed help, see `raictl help` or the
|
|
162
|
+
[INSTALL.md](../INSTALL.md) troubleshooting section.
|