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,19 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Rosett-AI - Post-removal script
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
INSTALL_DIR="/opt/rosett-ai"
|
|
6
|
+
CONFIG_DIR="/etc/rosett-ai"
|
|
7
|
+
|
|
8
|
+
case "$1" in
|
|
9
|
+
purge)
|
|
10
|
+
# Remove configuration and installation directories entirely
|
|
11
|
+
[ -d "${CONFIG_DIR}" ] && rm -rf "${CONFIG_DIR}"
|
|
12
|
+
[ -d "${INSTALL_DIR}" ] && rm -rf "${INSTALL_DIR}"
|
|
13
|
+
;;
|
|
14
|
+
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
|
15
|
+
# Keep configuration files on plain remove/upgrade
|
|
16
|
+
;;
|
|
17
|
+
esac
|
|
18
|
+
|
|
19
|
+
exit 0
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Rosett-AI - Runtime wrapper
|
|
3
|
+
# Invoked as /opt/rosett-ai/bin/raictl, symlinked from /usr/local/bin/raictl
|
|
4
|
+
#
|
|
5
|
+
# @@RUBY_ABI@@ and @@RUBY_ARCH@@ are substituted at build time by
|
|
6
|
+
# install_wrapper! in lib/rosett_ai/thor/tasks/build.rb
|
|
7
|
+
set -e
|
|
8
|
+
|
|
9
|
+
INSTALL_DIR="/opt/rosett-ai"
|
|
10
|
+
EMBEDDED_DIR="${INSTALL_DIR}/embedded"
|
|
11
|
+
EMBEDDED_BIN="${EMBEDDED_DIR}/bin"
|
|
12
|
+
EMBEDDED_LIB="${EMBEDDED_DIR}/lib"
|
|
13
|
+
APP_DIR="${INSTALL_DIR}/app"
|
|
14
|
+
|
|
15
|
+
# Ensure the embedded Ruby can find libruby.so
|
|
16
|
+
export LD_LIBRARY_PATH="${EMBEDDED_LIB}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
|
17
|
+
|
|
18
|
+
# Ensure the embedded Ruby can find its standard library
|
|
19
|
+
export RUBYLIB="${EMBEDDED_LIB}/ruby/@@RUBY_ABI@@:${EMBEDDED_LIB}/ruby/@@RUBY_ABI@@/@@RUBY_ARCH@@${RUBYLIB:+:$RUBYLIB}"
|
|
20
|
+
|
|
21
|
+
export PATH="${EMBEDDED_BIN}:${PATH}"
|
|
22
|
+
export GEM_HOME="${EMBEDDED_LIB}/ruby/gems/@@RUBY_ABI@@"
|
|
23
|
+
export GEM_PATH="${GEM_HOME}"
|
|
24
|
+
export BUNDLE_GEMFILE="${APP_DIR}/Gemfile"
|
|
25
|
+
export BUNDLE_PATH="${APP_DIR}/vendor/bundle"
|
|
26
|
+
export BUNDLE_DEPLOYMENT="true"
|
|
27
|
+
|
|
28
|
+
# Ensure UTF-8 locale (raictl requires it)
|
|
29
|
+
: "${LANG:=en_US.UTF-8}"
|
|
30
|
+
: "${LC_ALL:=$LANG}"
|
|
31
|
+
export LANG LC_ALL
|
|
32
|
+
|
|
33
|
+
# Preserve the user's working directory before cd-ing into the app tree.
|
|
34
|
+
# ProjectContext reads RAI_ORIGINAL_PWD to resolve the correct project.
|
|
35
|
+
export RAI_ORIGINAL_PWD="${PWD}"
|
|
36
|
+
|
|
37
|
+
cd "${APP_DIR}"
|
|
38
|
+
exec "${EMBEDDED_BIN}/ruby" -I"${APP_DIR}/lib" "${APP_DIR}/bin/raictl" "$@"
|
data/rosett-ai.gemspec
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
4
|
+
# Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
|
|
5
|
+
|
|
6
|
+
require_relative 'lib/rosett_ai/version'
|
|
7
|
+
|
|
8
|
+
Gem::Specification.new do |spec|
|
|
9
|
+
spec.name = 'rosett-ai'
|
|
10
|
+
spec.version = RosettAi::VERSION
|
|
11
|
+
spec.authors = ['Hugo Antonio Sepulveda Manriquez']
|
|
12
|
+
spec.email = ['query@neatnerds.be']
|
|
13
|
+
|
|
14
|
+
spec.summary = 'Rosett-AI — author AI assistant rules once, compile to many'
|
|
15
|
+
spec.description = 'Configuration management tool for AI-assisted development workflows. ' \
|
|
16
|
+
'Author rules once, compile to Claude Code, Cursor, AGENTS.md, and more.'
|
|
17
|
+
spec.homepage = 'https://gitlab.neatnerds.be/foss/rosett-ai/rosett-ai'
|
|
18
|
+
spec.license = 'GPL-3.0-only'
|
|
19
|
+
spec.required_ruby_version = '>= 3.3.0'
|
|
20
|
+
|
|
21
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
22
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
|
23
|
+
|
|
24
|
+
spec.files = Dir.chdir(__dir__) do
|
|
25
|
+
files = if File.directory?('.git')
|
|
26
|
+
`git ls-files -z`.split("\x0")
|
|
27
|
+
else
|
|
28
|
+
Dir.glob('**/*', File::FNM_DOTMATCH).select { |f| File.file?(f) }
|
|
29
|
+
end
|
|
30
|
+
files.reject do |f|
|
|
31
|
+
(File.expand_path(f) == __FILE__) ||
|
|
32
|
+
f.start_with?('bin/', 'test/', 'spec/', 'features/', '.git', '.gitlab-ci', 'appveyor', 'Gemfile') ||
|
|
33
|
+
(f.start_with?('conf/behaviour/') && f != 'conf/behaviour/.gitkeep') ||
|
|
34
|
+
f.start_with?('doc/claude-sessions/', 'doc/context/memory/') ||
|
|
35
|
+
f.start_with?('.claude/', '.overcommit.yml', 'Dockerfile', 'TODO.md', 'SESSION_NOTES.md') ||
|
|
36
|
+
f.end_with?('.jsonl', '.mv2')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
spec.bindir = 'bin'
|
|
40
|
+
spec.executables = ['rai']
|
|
41
|
+
spec.require_paths = ['lib']
|
|
42
|
+
|
|
43
|
+
# Runtime dependencies
|
|
44
|
+
spec.add_dependency 'ed25519', '~> 1.4'
|
|
45
|
+
spec.add_dependency 'faraday', '~> 2.14'
|
|
46
|
+
spec.add_dependency 'gettext', '~> 3.5'
|
|
47
|
+
spec.add_dependency 'i18n', '~> 1.14'
|
|
48
|
+
spec.add_dependency 'json', '~> 2.19'
|
|
49
|
+
spec.add_dependency 'json_schemer', '~> 2.5'
|
|
50
|
+
spec.add_dependency 'jwt', '~> 2.10'
|
|
51
|
+
spec.add_dependency 'jwt-eddsa', '~> 0.9'
|
|
52
|
+
spec.add_dependency 'paint', '~> 2.3'
|
|
53
|
+
spec.add_dependency 'rainbow', '~> 3.1'
|
|
54
|
+
spec.add_dependency 'rubyzip', '~> 2.4'
|
|
55
|
+
spec.add_dependency 'terminal-table', '~> 4.0'
|
|
56
|
+
spec.add_dependency 'thor', '~> 1.5'
|
|
57
|
+
spec.add_dependency 'tty-prompt', '~> 0.23'
|
|
58
|
+
spec.add_dependency 'tty-spinner', '~> 0.9'
|
|
59
|
+
spec.add_dependency 'zeitwerk', '~> 2.7'
|
|
60
|
+
|
|
61
|
+
# Optional MCP server support (loaded on demand via require 'mcp')
|
|
62
|
+
spec.add_dependency 'mcp', '~> 0.9.2'
|
|
63
|
+
end
|
data/rules/.gitkeep
ADDED
|
File without changes
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
3
|
+
# Copyright (C) 2026 Hugo Antonio Sepulveda Manriquez / NeatNerds
|
|
4
|
+
#
|
|
5
|
+
# Upload .deb packages to Pulp 3 repository.
|
|
6
|
+
#
|
|
7
|
+
# Required environment variables:
|
|
8
|
+
# PULP_API_URL — Pulp 3 API base URL
|
|
9
|
+
# PULP_API_TOKEN — Bearer authentication token
|
|
10
|
+
# PULP_CHANNEL — Channel name (stable, unstable)
|
|
11
|
+
# PULP_DISTRIBUTION — Debian distribution (bookworm)
|
|
12
|
+
#
|
|
13
|
+
# Expected directory layout:
|
|
14
|
+
# release/*.deb — for stable (tag) builds
|
|
15
|
+
# pkg/*.deb — for unstable (main) builds
|
|
16
|
+
#
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
# --- Validation ---
|
|
20
|
+
|
|
21
|
+
: "${PULP_API_URL:?PULP_API_URL is required}"
|
|
22
|
+
: "${PULP_API_TOKEN:?PULP_API_TOKEN is required}" # gitleaks:allow
|
|
23
|
+
: "${PULP_CHANNEL:?PULP_CHANNEL is required (stable or unstable)}"
|
|
24
|
+
: "${PULP_DISTRIBUTION:=${PULP_DISTRIBUTION:-bookworm}}"
|
|
25
|
+
|
|
26
|
+
readonly API="${PULP_API_URL}/pulp/api/v3"
|
|
27
|
+
readonly AUTH_HEADER="Authorization: Bearer ${PULP_API_TOKEN}"
|
|
28
|
+
|
|
29
|
+
# --- Locate packages ---
|
|
30
|
+
|
|
31
|
+
if [ "${PULP_CHANNEL}" = "stable" ] && [ -d release ]; then
|
|
32
|
+
DEB_DIR="release"
|
|
33
|
+
elif [ -d pkg ]; then
|
|
34
|
+
DEB_DIR="pkg"
|
|
35
|
+
else
|
|
36
|
+
echo "ERROR: No package directory found (release/ or pkg/)" >&2
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
DEB_FILES=("${DEB_DIR}"/*.deb)
|
|
41
|
+
if [ ${#DEB_FILES[@]} -eq 0 ]; then
|
|
42
|
+
echo "ERROR: No .deb files found in ${DEB_DIR}/" >&2
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
echo "Found ${#DEB_FILES[@]} package(s) in ${DEB_DIR}/"
|
|
47
|
+
|
|
48
|
+
# --- GPG sign packages ---
|
|
49
|
+
|
|
50
|
+
for deb in "${DEB_FILES[@]}"; do
|
|
51
|
+
echo "Signing ${deb}..."
|
|
52
|
+
dpkg-sig --sign builder "${deb}"
|
|
53
|
+
dpkg-sig --verify "${deb}"
|
|
54
|
+
done
|
|
55
|
+
|
|
56
|
+
# --- Upload to Pulp ---
|
|
57
|
+
|
|
58
|
+
REPO_NAME="nncc-${PULP_CHANNEL}"
|
|
59
|
+
|
|
60
|
+
# Look up the repository href
|
|
61
|
+
REPO_HREF=$(curl -s -H "${AUTH_HEADER}" \
|
|
62
|
+
"${API}/repositories/deb/apt/?name=${REPO_NAME}" \
|
|
63
|
+
| jq -r '.results[0].pulp_href // empty')
|
|
64
|
+
|
|
65
|
+
if [ -z "${REPO_HREF}" ]; then
|
|
66
|
+
echo "ERROR: Repository '${REPO_NAME}' not found in Pulp" >&2
|
|
67
|
+
echo "Create it first: pulp deb repository create --name ${REPO_NAME}" >&2
|
|
68
|
+
exit 1
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
echo "Repository: ${REPO_NAME} (${REPO_HREF})"
|
|
72
|
+
|
|
73
|
+
for deb in "${DEB_FILES[@]}"; do
|
|
74
|
+
echo "Uploading $(basename "${deb}")..."
|
|
75
|
+
|
|
76
|
+
# Create artifact
|
|
77
|
+
ARTIFACT_HREF=$(curl -s -H "${AUTH_HEADER}" \
|
|
78
|
+
-F "file=@${deb}" \
|
|
79
|
+
"${API}/artifacts/" \
|
|
80
|
+
| jq -r '.pulp_href')
|
|
81
|
+
|
|
82
|
+
if [ -z "${ARTIFACT_HREF}" ] || [ "${ARTIFACT_HREF}" = "null" ]; then
|
|
83
|
+
echo "ERROR: Failed to upload artifact for ${deb}" >&2
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Create content unit from artifact
|
|
88
|
+
TASK_HREF=$(curl -s -H "${AUTH_HEADER}" \
|
|
89
|
+
-H "Content-Type: application/json" \
|
|
90
|
+
-d "{\"artifact\": \"${ARTIFACT_HREF}\", \"relative_path\": \"$(basename "${deb}")\"}" \
|
|
91
|
+
"${API}/content/deb/packages/" \
|
|
92
|
+
| jq -r '.task // empty')
|
|
93
|
+
|
|
94
|
+
if [ -n "${TASK_HREF}" ]; then
|
|
95
|
+
echo " Waiting for content creation task..."
|
|
96
|
+
# Poll task until complete (max 60s)
|
|
97
|
+
for i in $(seq 1 12); do
|
|
98
|
+
STATE=$(curl -s -H "${AUTH_HEADER}" "${API}${TASK_HREF}" | jq -r '.state')
|
|
99
|
+
if [ "${STATE}" = "completed" ]; then
|
|
100
|
+
break
|
|
101
|
+
elif [ "${STATE}" = "failed" ]; then
|
|
102
|
+
echo "ERROR: Content creation failed" >&2
|
|
103
|
+
curl -s -H "${AUTH_HEADER}" "${API}${TASK_HREF}" | jq '.error'
|
|
104
|
+
exit 1
|
|
105
|
+
fi
|
|
106
|
+
sleep 5
|
|
107
|
+
done
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
echo " Uploaded: $(basename "${deb}")"
|
|
111
|
+
done
|
|
112
|
+
|
|
113
|
+
# --- Publish ---
|
|
114
|
+
|
|
115
|
+
echo "Publishing repository..."
|
|
116
|
+
PUBLICATION_HREF=$(curl -s -H "${AUTH_HEADER}" \
|
|
117
|
+
-H "Content-Type: application/json" \
|
|
118
|
+
-d "{\"repository\": \"${REPO_HREF}\"}" \
|
|
119
|
+
"${API}/publications/deb/apt/" \
|
|
120
|
+
| jq -r '.task // .pulp_href // empty')
|
|
121
|
+
|
|
122
|
+
echo "Publication triggered: ${PUBLICATION_HREF}"
|
|
123
|
+
echo "Done. Packages available at: https://repo.neatnerds.be/${PULP_CHANNEL}"
|
data/settings.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(rbenv versions:*)",
|
|
5
|
+
"Bash(rbenv install:*)",
|
|
6
|
+
"Bash(bundle:*)",
|
|
7
|
+
"Bash(gem:*)",
|
|
8
|
+
"Bash(bin/raictl:*)",
|
|
9
|
+
"Bash(yamllint:*)",
|
|
10
|
+
"WebSearch",
|
|
11
|
+
"WebFetch(domain:rubygems.org)",
|
|
12
|
+
"Bash(overcommit --run:*)"
|
|
13
|
+
],
|
|
14
|
+
"deny": [
|
|
15
|
+
"Read(~/.ssh/**)",
|
|
16
|
+
"Read(~/.gnupg/**)",
|
|
17
|
+
"Read(~/.credentials.json)",
|
|
18
|
+
"Read(~/.claude/.credentials.json)",
|
|
19
|
+
"Read(~/**/.env)",
|
|
20
|
+
"Read(~/**/.env.*)",
|
|
21
|
+
"Read(~/**/secrets/**)",
|
|
22
|
+
"Read(~/.keepass.*/**)",
|
|
23
|
+
"Read(~/**/credentials.json)",
|
|
24
|
+
"Read(~/**/*.pem)",
|
|
25
|
+
"Read(~/**/*.key)"
|
|
26
|
+
],
|
|
27
|
+
"additionalDirectories": []
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
[Desktop Entry]
|
|
2
|
+
Type=Application
|
|
3
|
+
Name=NeatNerds Code Companion
|
|
4
|
+
GenericName=AI Configuration Tool
|
|
5
|
+
Comment=Manage AI-assisted development configuration
|
|
6
|
+
Exec=nncc desktop gtk4
|
|
7
|
+
Icon=be.neatnerds.rosettai
|
|
8
|
+
Terminal=false
|
|
9
|
+
Categories=Development;Utility;
|
|
10
|
+
Keywords=AI;Claude;Configuration;Development;
|
|
11
|
+
StartupNotify=true
|
|
12
|
+
DBusActivatable=true
|
|
13
|
+
|
|
14
|
+
# GNOME-specific
|
|
15
|
+
X-GNOME-UsesNotifications=true
|
|
16
|
+
|
|
17
|
+
# Translation hints
|
|
18
|
+
X-Ubuntu-Gettext-Domain=nncc
|
|
19
|
+
|
|
20
|
+
# Actions
|
|
21
|
+
Actions=compile;status;
|
|
22
|
+
|
|
23
|
+
[Desktop Action compile]
|
|
24
|
+
Name=Compile Rules
|
|
25
|
+
Exec=nncc compile
|
|
26
|
+
|
|
27
|
+
[Desktop Action status]
|
|
28
|
+
Name=Show Status
|
|
29
|
+
Exec=nncc dbus status
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
|
2
|
+
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
|
3
|
+
<node name="/be/neatnerds/nncc">
|
|
4
|
+
<interface name="be.neatnerds.rosettai.Manager">
|
|
5
|
+
<method name="Compile">
|
|
6
|
+
<arg name="engine" type="s" direction="in">
|
|
7
|
+
<doc:doc><doc:summary>Engine name (claude, generic, agents_md)</doc:summary></doc:doc>
|
|
8
|
+
</arg>
|
|
9
|
+
<arg name="result" type="s" direction="out">
|
|
10
|
+
<doc:doc><doc:summary>Compilation result message</doc:summary></doc:doc>
|
|
11
|
+
</arg>
|
|
12
|
+
</method>
|
|
13
|
+
|
|
14
|
+
<method name="SwitchContext">
|
|
15
|
+
<arg name="context_name" type="s" direction="in">
|
|
16
|
+
<doc:doc><doc:summary>Context name to switch to</doc:summary></doc:doc>
|
|
17
|
+
</arg>
|
|
18
|
+
</method>
|
|
19
|
+
|
|
20
|
+
<method name="GetStatus">
|
|
21
|
+
<arg name="status" type="a{sv}" direction="out">
|
|
22
|
+
<doc:doc><doc:summary>Status dictionary with version, running, current_context, pid, dbus_name</doc:summary></doc:doc>
|
|
23
|
+
</arg>
|
|
24
|
+
</method>
|
|
25
|
+
|
|
26
|
+
<method name="Shutdown">
|
|
27
|
+
<doc:doc><doc:summary>Initiate graceful service shutdown</doc:summary></doc:doc>
|
|
28
|
+
</method>
|
|
29
|
+
|
|
30
|
+
<method name="SetConfig">
|
|
31
|
+
<arg name="key" type="s" direction="in">
|
|
32
|
+
<doc:doc><doc:summary>Configuration key (e.g. default_engine)</doc:summary></doc:doc>
|
|
33
|
+
</arg>
|
|
34
|
+
<arg name="value" type="s" direction="in">
|
|
35
|
+
<doc:doc><doc:summary>New value for the configuration key</doc:summary></doc:doc>
|
|
36
|
+
</arg>
|
|
37
|
+
<arg name="result" type="s" direction="out">
|
|
38
|
+
<doc:doc><doc:summary>Result message (OK or Error)</doc:summary></doc:doc>
|
|
39
|
+
</arg>
|
|
40
|
+
</method>
|
|
41
|
+
|
|
42
|
+
<method name="ListEngines">
|
|
43
|
+
<arg name="engines" type="a(ss)" direction="out">
|
|
44
|
+
<doc:doc><doc:summary>Array of (name, display_name) tuples for available engines</doc:summary></doc:doc>
|
|
45
|
+
</arg>
|
|
46
|
+
</method>
|
|
47
|
+
|
|
48
|
+
<property name="Version" type="s" access="read">
|
|
49
|
+
<doc:doc><doc:summary>Service version string</doc:summary></doc:doc>
|
|
50
|
+
</property>
|
|
51
|
+
|
|
52
|
+
<signal name="ContextChanged">
|
|
53
|
+
<arg name="context_name" type="s">
|
|
54
|
+
<doc:doc><doc:summary>New context name after switch</doc:summary></doc:doc>
|
|
55
|
+
</arg>
|
|
56
|
+
</signal>
|
|
57
|
+
</interface>
|
|
58
|
+
|
|
59
|
+
<interface name="be.neatnerds.rosettai.FocusMonitor">
|
|
60
|
+
<method name="GetCurrentFocus">
|
|
61
|
+
<arg name="app_id" type="s" direction="out">
|
|
62
|
+
<doc:doc><doc:summary>Current focused application identifier</doc:summary></doc:doc>
|
|
63
|
+
</arg>
|
|
64
|
+
<arg name="title" type="s" direction="out">
|
|
65
|
+
<doc:doc><doc:summary>Current focused window title</doc:summary></doc:doc>
|
|
66
|
+
</arg>
|
|
67
|
+
</method>
|
|
68
|
+
|
|
69
|
+
<signal name="FocusChanged">
|
|
70
|
+
<arg name="app_id" type="s">
|
|
71
|
+
<doc:doc><doc:summary>Application identifier of newly focused window</doc:summary></doc:doc>
|
|
72
|
+
</arg>
|
|
73
|
+
<arg name="title" type="s">
|
|
74
|
+
<doc:doc><doc:summary>Title of newly focused window</doc:summary></doc:doc>
|
|
75
|
+
</arg>
|
|
76
|
+
</signal>
|
|
77
|
+
</interface>
|
|
78
|
+
|
|
79
|
+
<interface name="org.kde.StatusNotifierItem">
|
|
80
|
+
<method name="Activate">
|
|
81
|
+
<arg name="x" type="i" direction="in"/>
|
|
82
|
+
<arg name="y" type="i" direction="in"/>
|
|
83
|
+
</method>
|
|
84
|
+
|
|
85
|
+
<method name="ContextMenu">
|
|
86
|
+
<arg name="x" type="i" direction="in"/>
|
|
87
|
+
<arg name="y" type="i" direction="in"/>
|
|
88
|
+
</method>
|
|
89
|
+
|
|
90
|
+
<property name="Id" type="s" access="read"/>
|
|
91
|
+
<property name="Category" type="s" access="read"/>
|
|
92
|
+
<property name="Status" type="s" access="read"/>
|
|
93
|
+
<property name="Title" type="s" access="read"/>
|
|
94
|
+
<property name="IconName" type="s" access="read"/>
|
|
95
|
+
<property name="ToolTip" type="(sa(iiay)ss)" access="read"/>
|
|
96
|
+
|
|
97
|
+
<signal name="NewStatus">
|
|
98
|
+
<arg name="status" type="s"/>
|
|
99
|
+
</signal>
|
|
100
|
+
|
|
101
|
+
<signal name="NewTitle"/>
|
|
102
|
+
</interface>
|
|
103
|
+
</node>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: criticalthinking
|
|
3
|
+
description: >-
|
|
4
|
+
AI critical thinking rules — challenge assumptions, verify claims,
|
|
5
|
+
enforce methodology discipline, and search for contradictory evidence.
|
|
6
|
+
This is a starter template. Customise it for your workflow.
|
|
7
|
+
version: 1.1.0
|
|
8
|
+
author: rosett-ai
|
|
9
|
+
created_at: '2026-01-25'
|
|
10
|
+
modified_at: '2026-04-14'
|
|
11
|
+
modified_by: rosett-ai
|
|
12
|
+
sensitive: false
|
|
13
|
+
used_in: []
|
|
14
|
+
rules:
|
|
15
|
+
- id: rule_001
|
|
16
|
+
description: |
|
|
17
|
+
Use critical thinking at all times. Avoid pleasing the user —
|
|
18
|
+
instead, challenge ideas and assumptions with factual reasoning.
|
|
19
|
+
priority: 50
|
|
20
|
+
enabled: true
|
|
21
|
+
- id: rule_002
|
|
22
|
+
description: |
|
|
23
|
+
When challenging the user, always back up claims with factual
|
|
24
|
+
references: links to documentation, source material, articles,
|
|
25
|
+
mathematical proofs, or other verifiable information.
|
|
26
|
+
priority: 50
|
|
27
|
+
enabled: true
|
|
28
|
+
- id: rule_003
|
|
29
|
+
description: |
|
|
30
|
+
When a plan or brief specifies a methodology (TDD, design-first,
|
|
31
|
+
documentation-first), do not silently deviate from that methodology
|
|
32
|
+
for speed or convenience. If tempted to skip a mandated step
|
|
33
|
+
(e.g., writing implementation before tests when TDD is specified),
|
|
34
|
+
stop and flag the deviation to the user before proceeding.
|
|
35
|
+
Silently optimising for throughput at the expense of stated
|
|
36
|
+
methodology is a critical thinking failure, not an efficiency gain.
|
|
37
|
+
priority: 70
|
|
38
|
+
enabled: true
|
|
39
|
+
- id: rule_004
|
|
40
|
+
description: |
|
|
41
|
+
When asked to continue beyond the planned scope of a session or
|
|
42
|
+
sprint (e.g., "do the next phase too", "keep going"), evaluate
|
|
43
|
+
whether this removes quality gates that the plan designed in
|
|
44
|
+
(inter-session reviews, human checkpoints, course corrections).
|
|
45
|
+
If it does, flag it explicitly before proceeding. Do not silently
|
|
46
|
+
comply with scope expansion that eliminates oversight mechanisms.
|
|
47
|
+
priority: 65
|
|
48
|
+
enabled: true
|
|
49
|
+
- id: rule_005
|
|
50
|
+
description: |
|
|
51
|
+
When claiming compatibility with, or making assertions about, an
|
|
52
|
+
external tool, API, file format, or protocol, verify the claim
|
|
53
|
+
against the actual artifact — not infer it from documentation,
|
|
54
|
+
naming conventions, or prior assumptions. Read the real config
|
|
55
|
+
file. Call the real API. Parse the real output. An unverified
|
|
56
|
+
compatibility claim is worse than no claim because it creates
|
|
57
|
+
false confidence.
|
|
58
|
+
priority: 60
|
|
59
|
+
enabled: true
|
|
60
|
+
- id: rule_006
|
|
61
|
+
description: |
|
|
62
|
+
When presenting completion status ("done", "all targets met",
|
|
63
|
+
"complete"), actively search for evidence that contradicts the
|
|
64
|
+
claim before presenting it. Check: are there untested code paths?
|
|
65
|
+
Do the numbers actually add up? Was it verified on a real system
|
|
66
|
+
or only in mocked tests? The review process, not the user, should
|
|
67
|
+
catch these gaps.
|
|
68
|
+
priority: 65
|
|
69
|
+
enabled: true
|