rosett-ai 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.ai-provenance.yml +119 -0
- data/.debride_whitelist +186 -0
- data/.fasterer.yml +29 -0
- data/.mdl_style.rb +10 -0
- data/.mdlrc +3 -0
- data/.mutant.yml +49 -0
- data/.namespace-allowlist +42 -0
- data/.reek.yml +1040 -0
- data/.rosett-ai/config.yml +3 -0
- data/.rspec +5 -0
- data/.rubocop.yml +380 -0
- data/.ruby-version +1 -0
- data/.yamllint +51 -0
- data/.yardopts +12 -0
- data/AI-DISCLOSURE.md +48 -0
- data/CHANGELOG.md +519 -0
- data/CLAUDE.md +141 -0
- data/CONTRIBUTING.md +734 -0
- data/INSTALL.md +154 -0
- data/LICENSE +674 -0
- data/LICENSE.md +675 -0
- data/QUICKSTART.md +73 -0
- data/README.md +366 -0
- data/Rakefile +200 -0
- data/SECURITY.md +114 -0
- data/bin/rai +1 -0
- data/cliff.toml +52 -0
- data/conf/adopt_redactions.yml +8 -0
- data/conf/behaviour/.gitkeep +0 -0
- data/conf/compliance/cra_rules.yml +25 -0
- data/conf/compliance/license_rules.yml +20 -0
- data/conf/design/aaif_alignment.yml +181 -0
- data/conf/design/ab_testing.yml +172 -0
- data/conf/design/accessibility.yml +84 -0
- data/conf/design/ai_authorship.yml +210 -0
- data/conf/design/ai_provenance.yml +224 -0
- data/conf/design/ai_tool_configuration.yml +207 -0
- data/conf/design/architecture.yml +139 -0
- data/conf/design/autocompletion.yml +115 -0
- data/conf/design/backward_compatibility.yml +112 -0
- data/conf/design/behaviour_composition.yml +246 -0
- data/conf/design/build_rake_extraction.yml +57 -0
- data/conf/design/ci_pipeline.yml +100 -0
- data/conf/design/claude_code_configuration.yml +157 -0
- data/conf/design/compiler.yml +128 -0
- data/conf/design/comply.yml +153 -0
- data/conf/design/content_packs.yml +84 -0
- data/conf/design/desktop_integration.yml +289 -0
- data/conf/design/distribution.yml +216 -0
- data/conf/design/doctor.yml +184 -0
- data/conf/design/documentation.yml +152 -0
- data/conf/design/engine_architecture.yml +257 -0
- data/conf/design/error_handling.yml +103 -0
- data/conf/design/feature_flags.yml +142 -0
- data/conf/design/git_hooks.yml +165 -0
- data/conf/design/gui_plugins.yml +475 -0
- data/conf/design/i18n.yml +84 -0
- data/conf/design/integration_testing.yml +56 -0
- data/conf/design/licensing_system.yml +88 -0
- data/conf/design/lifecycle_management.yml +208 -0
- data/conf/design/mcp_integration.yml +207 -0
- data/conf/design/mcp_settings.yml +126 -0
- data/conf/design/migration.yml +56 -0
- data/conf/design/monitoring_observability.yml +194 -0
- data/conf/design/namespace_cleanup.yml +145 -0
- data/conf/design/plugin_test_segregation.yml +145 -0
- data/conf/design/policy_management.yml +229 -0
- data/conf/design/project_management.yml +183 -0
- data/conf/design/rai_mcp_asset_discovery.yml +164 -0
- data/conf/design/rai_mcp_server.yml +605 -0
- data/conf/design/release_management.yml +117 -0
- data/conf/design/retrofit.yml +199 -0
- data/conf/design/retrospective_analyzer.yml +79 -0
- data/conf/design/scope_hierarchy.yml +352 -0
- data/conf/design/security.yml +115 -0
- data/conf/design/session_retrospective.yml +85 -0
- data/conf/design/smart_ui_feedback.yml +89 -0
- data/conf/design/structured_logging.yml +148 -0
- data/conf/design/styles.yml +123 -0
- data/conf/design/test_peer_review.yml +89 -0
- data/conf/design/testing.yml +136 -0
- data/conf/design/threat_model.yml +108 -0
- data/conf/design/ui_framework.yml +111 -0
- data/conf/design/usage_optimization.yml +122 -0
- data/conf/design/version_management.yml +60 -0
- data/conf/design/workflow.yml +227 -0
- data/conf/mcp/server_defaults.yml +42 -0
- data/conf/mcp/trust.yml +21 -0
- data/conf/packaging/core.yml +12 -0
- data/conf/packaging/gtk4.yml +11 -0
- data/conf/packaging/qt6.yml +11 -0
- data/conf/policy/default_deny_list.yml +197 -0
- data/conf/review/cli-command-audit.yml +857 -0
- data/conf/review/design-docs.yml +1064 -0
- data/conf/review/design-questionnaire.yml +153 -0
- data/conf/review/questionnaire.yml +146 -0
- data/conf/review/rosett-ai-core.yml +2919 -0
- data/conf/schemas/ai_config_schema.json +73 -0
- data/conf/schemas/behaviour_schema.json +132 -0
- data/conf/schemas/compliance_rule_schema.json +63 -0
- data/conf/schemas/content_pack_manifest_schema.json +51 -0
- data/conf/schemas/design_schema.json +210 -0
- data/conf/schemas/engine_manifest_schema.json +144 -0
- data/conf/schemas/lockfile_schema.json +74 -0
- data/conf/schemas/mcp_server_schema.json +48 -0
- data/conf/schemas/packaging_schema.json +70 -0
- data/conf/schemas/policy_schema.json +85 -0
- data/conf/schemas/provenance_schema.json +84 -0
- data/conf/schemas/rai_config_schema.json +56 -0
- data/conf/schemas/rai_project_schema.json +20 -0
- data/conf/schemas/scope_hierarchy_schema.json +49 -0
- data/conf/schemas/target_schema.json +67 -0
- data/conf/schemas/tooling_schema.json +65 -0
- data/conf/schemas/workflow_schema.json +112 -0
- data/conf/targets/agents_md.yml +17 -0
- data/conf/targets/claude.yml +12 -0
- data/conf/tooling/tools.yml +58 -0
- data/dist/rosett-ai-mcp.service +48 -0
- data/dist/rosett-ai-mcp.yml.default +45 -0
- data/doc/AAIF_POSITIONING.md +58 -0
- data/doc/ADOPT.md +224 -0
- data/doc/AI_PROVENANCE.md +139 -0
- data/doc/ARCHITECTURE.md +920 -0
- data/doc/BEHAVIOUR.md +409 -0
- data/doc/BUILD.md +138 -0
- data/doc/CI_CD_RECIPES.md +171 -0
- data/doc/CLAUDE_SESSIONS_MOVED.md +16 -0
- data/doc/COMMAND_ANALYSIS.md +229 -0
- data/doc/CONFIGURATION.md +281 -0
- data/doc/DESIGN_AUDIT.md +235 -0
- data/doc/DESIGN_PEER_REVIEW.md +771 -0
- data/doc/DESKTOP.md +447 -0
- data/doc/ENGINES.md +567 -0
- data/doc/ENGINE_DEVELOPMENT_GUIDE.md +417 -0
- data/doc/FEATURE_AUDIT.md +218 -0
- data/doc/IMPLEMENTATION_PLAN.md +669 -0
- data/doc/INCIDENT_REPORT_2026-02-02.md +251 -0
- data/doc/MIGRATION_GUIDE.md +88 -0
- data/doc/PACKAGING.md +232 -0
- data/doc/PROJECT_DASHBOARD.md +153 -0
- data/doc/PULP_DEPLOYMENT.md +164 -0
- data/doc/QUALITY_FIX_SUMMARY.md +110 -0
- data/doc/QUICK_START.md +162 -0
- data/doc/REEK_CONFIGURATION.md +166 -0
- data/doc/REFERENCE.md +253 -0
- data/doc/REFERENCES.md +324 -0
- data/doc/SECURITY_REVIEW_CHECKLIST.md +72 -0
- data/doc/SESSION_2026-02-28_GTK4_HARDENING.md +359 -0
- data/doc/SETUP.md +202 -0
- data/doc/TEST_PEER_REVIEW.md +152 -0
- data/doc/THREAT_MODEL.md +230 -0
- data/doc/USAGE.md +545 -0
- data/doc/USER_MANUAL.md +585 -0
- data/doc/ai_test_review_checklist.md +110 -0
- data/doc/changes/2026-02-18-packaging-fpm.md +155 -0
- data/doc/changes/2026-02-19-testing-infrastructure.md +221 -0
- data/doc/changes/2026-02-20-security-implementation.md +281 -0
- data/doc/changes/2026-02-20-styles-implementation.md +220 -0
- data/doc/changes/2026-02-21-architecture-completion.md +95 -0
- data/doc/changes/2026-02-21-architecture-ui-layer.md +253 -0
- data/doc/changes/2026-02-21-cc-config-implementation.md +108 -0
- data/doc/changes/2026-02-21-ci-pipeline-implementation.md +214 -0
- data/doc/changes/2026-02-21-compiler-multi-target-pipeline.md +241 -0
- data/doc/changes/2026-02-21-config-design-show-commands.md +61 -0
- data/doc/changes/2026-02-21-design-implementation-overview.md +455 -0
- data/doc/changes/2026-02-21-lifecycle-management.md +196 -0
- data/doc/changes/2026-02-21-path-resolver.md +128 -0
- data/doc/changes/2026-02-24-ci-tmpdir-mutant-fetch.md +45 -0
- data/doc/changes/2026-03-01-ci-bundler-strategy.md +120 -0
- data/doc/changes/2026-03-20-security-hardening-phase2.md +163 -0
- data/doc/context/SESSION-HANDOFF.md +69 -0
- data/doc/context/ai-engine-usage-trends-2026.md +80 -0
- data/doc/context/plan-pluggable-engines.md +590 -0
- data/doc/decisions/001-flog-deferred.md +32 -0
- data/doc/decisions/002-path-resolution-strategy.md +158 -0
- data/doc/decisions/003-ui-adapter-selection.md +193 -0
- data/doc/decisions/004-design-document-validation.md +179 -0
- data/doc/decisions/005-package-splitting-strategy.md +200 -0
- data/doc/decisions/006-multi-engine-architecture.md +147 -0
- data/doc/decisions/007-engine-agnostic-pivot.md +219 -0
- data/doc/decisions/008-ci-bundler-strategy.md +129 -0
- data/doc/decisions/009-core-only-v1-release.md +60 -0
- data/doc/decisions/010-engine-debian-packaging.md +66 -0
- data/doc/decisions/011-context-aware-cli.md +71 -0
- data/doc/dependency_decisions.yml +247 -0
- data/doc/issues/001-wrapper-missing-environment-variables.md +197 -0
- data/doc/issues/002-embedded-ruby-wrong-prefix.md +217 -0
- data/doc/issues/003-smoke-test-false-positive.md +127 -0
- data/doc/issues/004-market-research-design-updates.md +109 -0
- data/doc/issues/005-compile-scope-coexistence.md +161 -0
- data/doc/locales/.gitkeep +0 -0
- data/doc/man/rai.1.ronn +505 -0
- data/doc/operations/packaging.md +133 -0
- data/doc/operations/rosett-ai-release.md +65 -0
- data/doc/reference/error-catalog.md +107 -0
- data/doc/reference/rosett-ai-technical-reference.pdf +0 -0
- data/doc/reference/src/Pictures/cover.jpg +0 -0
- data/doc/reference/src/Pictures/head1.jpg +0 -0
- data/doc/reference/src/Pictures/head2.jpg +0 -0
- data/doc/reference/src/Pictures/head3.jpg +0 -0
- data/doc/reference/src/Pictures/head4.jpg +0 -0
- data/doc/reference/src/Pictures/head5.jpg +0 -0
- data/doc/reference/src/Pictures/head6.jpg +0 -0
- data/doc/reference/src/Pictures/head7.jpg +0 -0
- data/doc/reference/src/Pictures/head8.jpg +0 -0
- data/doc/reference/src/StyleInd.ist +4 -0
- data/doc/reference/src/bibliography.bib +79 -0
- data/doc/reference/src/main.tex +1288 -0
- data/doc/reference/src/structure.tex +303 -0
- data/doc/rosett-ai-bookmarks.html +301 -0
- data/kitchen.yml +46 -0
- data/lib/rosett_ai/adopter/executor_resolver.rb +77 -0
- data/lib/rosett_ai/adopter/local_analysis_collector.rb +154 -0
- data/lib/rosett_ai/adopter/rule_adopter.rb +254 -0
- data/lib/rosett_ai/ai_config/config_compiler.rb +111 -0
- data/lib/rosett_ai/ai_config/context_window.rb +55 -0
- data/lib/rosett_ai/ai_config/cost_controls.rb +44 -0
- data/lib/rosett_ai/ai_config/fallback_chain.rb +64 -0
- data/lib/rosett_ai/ai_config/model_router.rb +121 -0
- data/lib/rosett_ai/ai_config/validator.rb +45 -0
- data/lib/rosett_ai/authorship/attribution_compiler.rb +99 -0
- data/lib/rosett_ai/authorship/disclosure_policy.rb +81 -0
- data/lib/rosett_ai/authorship/review_validator.rb +39 -0
- data/lib/rosett_ai/authorship/trailer_generator.rb +88 -0
- data/lib/rosett_ai/backup/compressor.rb +180 -0
- data/lib/rosett_ai/backup/destination.rb +91 -0
- data/lib/rosett_ai/behaviour/manager.rb +156 -0
- data/lib/rosett_ai/compiler/backend.rb +86 -0
- data/lib/rosett_ai/compiler/backends/agents_md_backend.rb +80 -0
- data/lib/rosett_ai/compiler/backends/claude_backend.rb +88 -0
- data/lib/rosett_ai/compiler/backends/generic_backend.rb +15 -0
- data/lib/rosett_ai/compiler/behaviour_compiler.rb +40 -0
- data/lib/rosett_ai/compiler/capability_checker.rb +104 -0
- data/lib/rosett_ai/compiler/compilation_pipeline.rb +361 -0
- data/lib/rosett_ai/compiler/compiled_output.rb +39 -0
- data/lib/rosett_ai/compiler/locale_compiler.rb +250 -0
- data/lib/rosett_ai/compiler/target_profile.rb +112 -0
- data/lib/rosett_ai/completion/generator.rb +101 -0
- data/lib/rosett_ai/completion/shells/bash_generator.rb +126 -0
- data/lib/rosett_ai/completion/shells/fish_generator.rb +78 -0
- data/lib/rosett_ai/completion/shells/zsh_generator.rb +126 -0
- data/lib/rosett_ai/comply/checkers/cra_checker.rb +102 -0
- data/lib/rosett_ai/comply/checkers/license_checker.rb +85 -0
- data/lib/rosett_ai/comply/checkers/spdx_header_checker.rb +98 -0
- data/lib/rosett_ai/comply/reporter.rb +113 -0
- data/lib/rosett_ai/comply/runner.rb +50 -0
- data/lib/rosett_ai/composition/circular_dependency_detector.rb +56 -0
- data/lib/rosett_ai/composition/composer.rb +158 -0
- data/lib/rosett_ai/composition/composition_result.rb +64 -0
- data/lib/rosett_ai/composition/conflict_detector.rb +53 -0
- data/lib/rosett_ai/composition/lockfile.rb +103 -0
- data/lib/rosett_ai/composition/merge_strategy.rb +131 -0
- data/lib/rosett_ai/composition/priority_sorter.rb +29 -0
- data/lib/rosett_ai/composition/scope_resolver.rb +55 -0
- data/lib/rosett_ai/config/compile_result.rb +37 -0
- data/lib/rosett_ai/config/compiler.rb +13 -0
- data/lib/rosett_ai/config/domain_transformer.rb +13 -0
- data/lib/rosett_ai/config/key_map.rb +13 -0
- data/lib/rosett_ai/config/masking_secret_resolver.rb +40 -0
- data/lib/rosett_ai/config/scope_router.rb +13 -0
- data/lib/rosett_ai/config/secret_resolver.rb +125 -0
- data/lib/rosett_ai/configuration.rb +119 -0
- data/lib/rosett_ai/content/content_client.rb +60 -0
- data/lib/rosett_ai/content/pack_installer.rb +117 -0
- data/lib/rosett_ai/content/pack_manifest.rb +50 -0
- data/lib/rosett_ai/content/pack_registry.rb +68 -0
- data/lib/rosett_ai/content_packs/manager.rb +50 -0
- data/lib/rosett_ai/dbus/compositor_detector.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/base.rb +59 -0
- data/lib/rosett_ai/dbus/focus_adapters/gnome_adapter.rb +172 -0
- data/lib/rosett_ai/dbus/focus_adapters/hyprland_adapter.rb +77 -0
- data/lib/rosett_ai/dbus/focus_adapters/i3_adapter.rb +65 -0
- data/lib/rosett_ai/dbus/focus_adapters/kwin_adapter.rb +103 -0
- data/lib/rosett_ai/dbus/focus_adapters/x11_adapter.rb +105 -0
- data/lib/rosett_ai/dbus/focus_monitor_interface.rb +103 -0
- data/lib/rosett_ai/dbus/manager_interface.rb +213 -0
- data/lib/rosett_ai/dbus/plugin_manager_interface.rb +169 -0
- data/lib/rosett_ai/dbus/rate_limiter.rb +89 -0
- data/lib/rosett_ai/dbus/service.rb +121 -0
- data/lib/rosett_ai/dbus/status_notifier_interface.rb +79 -0
- data/lib/rosett_ai/deprecation.rb +79 -0
- data/lib/rosett_ai/desktop/dbus_client.rb +259 -0
- data/lib/rosett_ai/desktop/gtk4_app.rb +371 -0
- data/lib/rosett_ai/desktop/gtk4_preferences.rb +331 -0
- data/lib/rosett_ai/desktop/gui_logger.rb +236 -0
- data/lib/rosett_ai/doctor/check.rb +92 -0
- data/lib/rosett_ai/doctor/checks/cache_health_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/dbus_availability_check.rb +39 -0
- data/lib/rosett_ai/doctor/checks/engine_detection_check.rb +46 -0
- data/lib/rosett_ai/doctor/checks/file_permission_check.rb +44 -0
- data/lib/rosett_ai/doctor/checks/gem_dependency_check.rb +55 -0
- data/lib/rosett_ai/doctor/checks/ruby_version_check.rb +50 -0
- data/lib/rosett_ai/doctor/checks/stale_config_nncc_check.rb +57 -0
- data/lib/rosett_ai/doctor/checks/stale_home_nncc_check.rb +59 -0
- data/lib/rosett_ai/doctor.rb +81 -0
- data/lib/rosett_ai/documentation/reference_compiler.rb +122 -0
- data/lib/rosett_ai/documentation/translator.rb +62 -0
- data/lib/rosett_ai/engines/base_config_compiler.rb +203 -0
- data/lib/rosett_ai/engines/detector.rb +63 -0
- data/lib/rosett_ai/engines/registry.rb +50 -0
- data/lib/rosett_ai/error_handler.rb +139 -0
- data/lib/rosett_ai/exit_codes.rb +76 -0
- data/lib/rosett_ai/feature_flags.rb +102 -0
- data/lib/rosett_ai/formatting.rb +33 -0
- data/lib/rosett_ai/gem_consistency_checker.rb +199 -0
- data/lib/rosett_ai/git_hooks/chain_detector.rb +86 -0
- data/lib/rosett_ai/git_hooks/installer.rb +175 -0
- data/lib/rosett_ai/git_hooks/script_generator.rb +125 -0
- data/lib/rosett_ai/gitlab/validators/supplementary_gitlab_ci_yaml_validator.rb +79 -0
- data/lib/rosett_ai/i18n/locale_resolver.rb +46 -0
- data/lib/rosett_ai/i18n/utf8_checker.rb +32 -0
- data/lib/rosett_ai/init/config_file_writer.rb +24 -0
- data/lib/rosett_ai/init/directory_builder.rb +38 -0
- data/lib/rosett_ai/init/file_copier.rb +95 -0
- data/lib/rosett_ai/init/global_initializer.rb +28 -0
- data/lib/rosett_ai/init/local_initializer.rb +27 -0
- data/lib/rosett_ai/init/mcp_registrar.rb +109 -0
- data/lib/rosett_ai/init/project_initializer.rb +38 -0
- data/lib/rosett_ai/licensing/license_key.rb +139 -0
- data/lib/rosett_ai/licensing/license_store.rb +64 -0
- data/lib/rosett_ai/licensing/license_validator.rb +60 -0
- data/lib/rosett_ai/licensing/tier.rb +42 -0
- data/lib/rosett_ai/mcp/admin/auditor.rb +88 -0
- data/lib/rosett_ai/mcp/admin/health_checker.rb +81 -0
- data/lib/rosett_ai/mcp/admin/registry.rb +100 -0
- data/lib/rosett_ai/mcp/admin/schema_validator.rb +63 -0
- data/lib/rosett_ai/mcp/enforcement/.gitkeep +0 -0
- data/lib/rosett_ai/mcp/enforcement/hook_generator.rb +197 -0
- data/lib/rosett_ai/mcp/enforcement/validator.rb +215 -0
- data/lib/rosett_ai/mcp/governance.rb +160 -0
- data/lib/rosett_ai/mcp/http_security_config.rb +158 -0
- data/lib/rosett_ai/mcp/instructions.rb +266 -0
- data/lib/rosett_ai/mcp/key_hasher.rb +66 -0
- data/lib/rosett_ai/mcp/keyfile.rb +221 -0
- data/lib/rosett_ai/mcp/middleware/authentication.rb +146 -0
- data/lib/rosett_ai/mcp/middleware/content_type.rb +56 -0
- data/lib/rosett_ai/mcp/middleware/cors.rb +83 -0
- data/lib/rosett_ai/mcp/middleware/origin_validation.rb +73 -0
- data/lib/rosett_ai/mcp/middleware/rate_limit.rb +106 -0
- data/lib/rosett_ai/mcp/middleware/request_size.rb +51 -0
- data/lib/rosett_ai/mcp/plugins.rb +143 -0
- data/lib/rosett_ai/mcp/prompts/compilation_prompt.rb +40 -0
- data/lib/rosett_ai/mcp/prompts/compliance_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/diagnostics_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/prompts/validation_prompt.rb +41 -0
- data/lib/rosett_ai/mcp/resources/behaviour_resource.rb +127 -0
- data/lib/rosett_ai/mcp/resources/config_resource.rb +72 -0
- data/lib/rosett_ai/mcp/resources/design_resource.rb +58 -0
- data/lib/rosett_ai/mcp/resources/hooks_resource.rb +74 -0
- data/lib/rosett_ai/mcp/resources/provenance_resource.rb +51 -0
- data/lib/rosett_ai/mcp/resources/rules_resource.rb +60 -0
- data/lib/rosett_ai/mcp/resources/schema_resource.rb +72 -0
- data/lib/rosett_ai/mcp/response_helper.rb +46 -0
- data/lib/rosett_ai/mcp/security_logger.rb +60 -0
- data/lib/rosett_ai/mcp/server.rb +212 -0
- data/lib/rosett_ai/mcp/settings/server_installer.rb +112 -0
- data/lib/rosett_ai/mcp/settings/trust_manager.rb +142 -0
- data/lib/rosett_ai/mcp/tools/adopt_tool.rb +70 -0
- data/lib/rosett_ai/mcp/tools/backup_tool.rb +64 -0
- data/lib/rosett_ai/mcp/tools/behaviour_display_tool.rb +72 -0
- data/lib/rosett_ai/mcp/tools/behaviour_list_tool.rb +56 -0
- data/lib/rosett_ai/mcp/tools/behaviour_manage_tool.rb +114 -0
- data/lib/rosett_ai/mcp/tools/behaviour_show_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/compile_status_tool.rb +122 -0
- data/lib/rosett_ai/mcp/tools/compile_tool.rb +191 -0
- data/lib/rosett_ai/mcp/tools/comply_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/config_compile_tool.rb +71 -0
- data/lib/rosett_ai/mcp/tools/config_status_tool.rb +79 -0
- data/lib/rosett_ai/mcp/tools/content_tool.rb +78 -0
- data/lib/rosett_ai/mcp/tools/context_query_tool.rb +156 -0
- data/lib/rosett_ai/mcp/tools/design_list_tool.rb +57 -0
- data/lib/rosett_ai/mcp/tools/design_show_tool.rb +69 -0
- data/lib/rosett_ai/mcp/tools/doctor_tool.rb +62 -0
- data/lib/rosett_ai/mcp/tools/documentation_status_tool.rb +45 -0
- data/lib/rosett_ai/mcp/tools/engines_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/hook_install_tool.rb +190 -0
- data/lib/rosett_ai/mcp/tools/hook_preview_tool.rb +173 -0
- data/lib/rosett_ai/mcp/tools/hooks_status_tool.rb +84 -0
- data/lib/rosett_ai/mcp/tools/init_tool.rb +87 -0
- data/lib/rosett_ai/mcp/tools/license_status_tool.rb +44 -0
- data/lib/rosett_ai/mcp/tools/project_tool.rb +117 -0
- data/lib/rosett_ai/mcp/tools/provenance_tool.rb +97 -0
- data/lib/rosett_ai/mcp/tools/provenance_write_tool.rb +40 -0
- data/lib/rosett_ai/mcp/tools/retrofit_tool.rb +81 -0
- data/lib/rosett_ai/mcp/tools/rule_search_tool.rb +163 -0
- data/lib/rosett_ai/mcp/tools/schema_get_tool.rb +94 -0
- data/lib/rosett_ai/mcp/tools/tooling_tool.rb +86 -0
- data/lib/rosett_ai/mcp/tools/validate_tool.rb +105 -0
- data/lib/rosett_ai/mcp/tools/workflow_execute_tool.rb +74 -0
- data/lib/rosett_ai/mcp/tools/workflow_tool.rb +78 -0
- data/lib/rosett_ai/migration/detector.rb +117 -0
- data/lib/rosett_ai/migration/nncc_config_migrator.rb +94 -0
- data/lib/rosett_ai/migration/nncc_project_migrator.rb +90 -0
- data/lib/rosett_ai/migration/xdg_migrator.rb +123 -0
- data/lib/rosett_ai/package_manager/apt.rb +108 -0
- data/lib/rosett_ai/package_manager/base.rb +68 -0
- data/lib/rosett_ai/package_manager/gem_backend.rb +90 -0
- data/lib/rosett_ai/packaging/variant_config.rb +92 -0
- data/lib/rosett_ai/path_resolver.rb +115 -0
- data/lib/rosett_ai/plugins/contract.rb +43 -0
- data/lib/rosett_ai/plugins/engine_contract.rb +60 -0
- data/lib/rosett_ai/plugins/gui_contract.rb +74 -0
- data/lib/rosett_ai/plugins/mcp_contract.rb +48 -0
- data/lib/rosett_ai/plugins/registry.rb +150 -0
- data/lib/rosett_ai/policy/auditor.rb +41 -0
- data/lib/rosett_ai/policy/deny_list.rb +71 -0
- data/lib/rosett_ai/policy/opt_out_scanner.rb +37 -0
- data/lib/rosett_ai/policy/policy_compiler.rb +84 -0
- data/lib/rosett_ai/policy/protected_files.rb +47 -0
- data/lib/rosett_ai/policy/tier_hierarchy.rb +48 -0
- data/lib/rosett_ai/policy/validator.rb +35 -0
- data/lib/rosett_ai/profiler.rb +79 -0
- data/lib/rosett_ai/project/drift_detector.rb +126 -0
- data/lib/rosett_ai/project/manager.rb +115 -0
- data/lib/rosett_ai/project/sync_manager.rb +138 -0
- data/lib/rosett_ai/project/template_applier.rb +105 -0
- data/lib/rosett_ai/project_context.rb +82 -0
- data/lib/rosett_ai/provenance/entry.rb +63 -0
- data/lib/rosett_ai/provenance/file_source.rb +32 -0
- data/lib/rosett_ai/provenance/source.rb +62 -0
- data/lib/rosett_ai/provenance/store.rb +153 -0
- data/lib/rosett_ai/provenance/tracker.rb +62 -0
- data/lib/rosett_ai/provenance/trailer_generator.rb +43 -0
- data/lib/rosett_ai/provenance/validator.rb +45 -0
- data/lib/rosett_ai/quorum/collector.rb +59 -0
- data/lib/rosett_ai/quorum/comparator.rb +81 -0
- data/lib/rosett_ai/quorum/dispatcher.rb +57 -0
- data/lib/rosett_ai/quorum/strategies/adopt.rb +56 -0
- data/lib/rosett_ai/rai_config.rb +107 -0
- data/lib/rosett_ai/retrofit/base_parser.rb +66 -0
- data/lib/rosett_ai/retrofit/engine.rb +171 -0
- data/lib/rosett_ai/retrofit/parsers/agents_md_parser.rb +50 -0
- data/lib/rosett_ai/retrofit/parsers/claude_parser.rb +69 -0
- data/lib/rosett_ai/retrofit/parsers/cursor_parser.rb +82 -0
- data/lib/rosett_ai/retrofit/round_trip_validator.rb +65 -0
- data/lib/rosett_ai/retrofit/scanner.rb +47 -0
- data/lib/rosett_ai/retrofit/secret_detector.rb +87 -0
- data/lib/rosett_ai/secrets_resolver.rb +71 -0
- data/lib/rosett_ai/smart_feedback/suggester.rb +83 -0
- data/lib/rosett_ai/smart_feedback/thor_middleware.rb +84 -0
- data/lib/rosett_ai/structured_logger.rb +110 -0
- data/lib/rosett_ai/telemetry/json_lines_writer.rb +50 -0
- data/lib/rosett_ai/telemetry/log_rotator.rb +67 -0
- data/lib/rosett_ai/telemetry/provider.rb +26 -0
- data/lib/rosett_ai/telemetry/reporter.rb +144 -0
- data/lib/rosett_ai/telemetry.rb +47 -0
- data/lib/rosett_ai/text_sanitizer.rb +62 -0
- data/lib/rosett_ai/thor/cli.rb +269 -0
- data/lib/rosett_ai/thor/tasks/adopt.rb +250 -0
- data/lib/rosett_ai/thor/tasks/backup.rb +420 -0
- data/lib/rosett_ai/thor/tasks/behaviour.rb +474 -0
- data/lib/rosett_ai/thor/tasks/build.rb +1162 -0
- data/lib/rosett_ai/thor/tasks/compile.rb +415 -0
- data/lib/rosett_ai/thor/tasks/completion.rb +123 -0
- data/lib/rosett_ai/thor/tasks/comply.rb +82 -0
- data/lib/rosett_ai/thor/tasks/config.rb +265 -0
- data/lib/rosett_ai/thor/tasks/content.rb +193 -0
- data/lib/rosett_ai/thor/tasks/dbus.rb +321 -0
- data/lib/rosett_ai/thor/tasks/design.rb +258 -0
- data/lib/rosett_ai/thor/tasks/desktop.rb +129 -0
- data/lib/rosett_ai/thor/tasks/doctor.rb +127 -0
- data/lib/rosett_ai/thor/tasks/documentation.rb +321 -0
- data/lib/rosett_ai/thor/tasks/engines.rb +167 -0
- data/lib/rosett_ai/thor/tasks/hooks.rb +219 -0
- data/lib/rosett_ai/thor/tasks/init.rb +259 -0
- data/lib/rosett_ai/thor/tasks/license.rb +120 -0
- data/lib/rosett_ai/thor/tasks/mcp.rb +535 -0
- data/lib/rosett_ai/thor/tasks/migrate.rb +121 -0
- data/lib/rosett_ai/thor/tasks/plugins.rb +157 -0
- data/lib/rosett_ai/thor/tasks/project.rb +260 -0
- data/lib/rosett_ai/thor/tasks/provenance.rb +195 -0
- data/lib/rosett_ai/thor/tasks/release.rb +314 -0
- data/lib/rosett_ai/thor/tasks/retrofit.rb +90 -0
- data/lib/rosett_ai/thor/tasks/tooling.rb +308 -0
- data/lib/rosett_ai/thor/tasks/validate.rb +108 -0
- data/lib/rosett_ai/thor/tasks/workflow.rb +196 -0
- data/lib/rosett_ai/tooling/ci_yaml_validator.rb +37 -0
- data/lib/rosett_ai/tooling/version_checker.rb +35 -0
- data/lib/rosett_ai/ui/accessible_tui.rb +61 -0
- data/lib/rosett_ai/ui/base.rb +46 -0
- data/lib/rosett_ai/ui/gtk4.rb +98 -0
- data/lib/rosett_ai/ui/kde.rb +40 -0
- data/lib/rosett_ai/ui/qt6.rb +40 -0
- data/lib/rosett_ai/ui/registry.rb +60 -0
- data/lib/rosett_ai/ui/tty_helper.rb +74 -0
- data/lib/rosett_ai/ui/tui.rb +59 -0
- data/lib/rosett_ai/validators/behaviour_validator.rb +20 -0
- data/lib/rosett_ai/validators/design_validator.rb +17 -0
- data/lib/rosett_ai/validators/schema_validator.rb +84 -0
- data/lib/rosett_ai/validators/tooling_validator.rb +17 -0
- data/lib/rosett_ai/version.rb +8 -0
- data/lib/rosett_ai/version_consistency_checker.rb +129 -0
- data/lib/rosett_ai/workflow/audit_log.rb +86 -0
- data/lib/rosett_ai/workflow/engine.rb +142 -0
- data/lib/rosett_ai/workflow/manager.rb +82 -0
- data/lib/rosett_ai/workflow/schema_validator.rb +71 -0
- data/lib/rosett_ai/workflow/step_runner.rb +61 -0
- data/lib/rosett_ai/workflow/steps/prompt_step.rb +62 -0
- data/lib/rosett_ai/workflow/steps/rai_step.rb +74 -0
- data/lib/rosett_ai/workflow/steps/shell_step.rb +53 -0
- data/lib/rosett_ai/yaml_loader.rb +78 -0
- data/lib/rosett_ai.rb +221 -0
- data/lib/rubocop/cop/rosett_ai/shell_interpolation.rb +54 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_const_get.rb +60 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_send.rb +50 -0
- data/lib/rubocop/cop/rosett_ai/unsafe_yaml_load.rb +40 -0
- data/lib/rubocop/rosett_ai.rb +9 -0
- data/lib/scripts/generated/docker_hub_tags.rb +126 -0
- data/locales/.gitkeep +0 -0
- data/locales/ar.yml +579 -0
- data/locales/en.yml +571 -0
- data/locales/fr.yml +567 -0
- data/packaging/build-engine-deb.sh +81 -0
- data/packaging/scripts/postinst +17 -0
- data/packaging/scripts/postrm +19 -0
- data/packaging/scripts/prerm +10 -0
- data/packaging/wrapper.sh.template +38 -0
- data/rosett-ai.gemspec +63 -0
- data/rules/.gitkeep +0 -0
- data/scripts/publish/pulp_upload.sh +123 -0
- data/settings.json +29 -0
- data/share/applications/be.neatnerds.rosettai.desktop +29 -0
- data/share/dbus-1/interfaces/be.neatnerds.rosettai.xml +103 -0
- data/share/dbus-1/services/be.neatnerds.rosettai.service +3 -0
- data/share/templates/behaviour/criticalthinking.yml +69 -0
- metadata +810 -0
data/doc/man/rai.1.ronn
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
nncc(1) -- NeatNerds Code Companion
|
|
2
|
+
======================================
|
|
3
|
+
|
|
4
|
+
## NAME
|
|
5
|
+
|
|
6
|
+
`nncc` - configuration management tool for AI-assisted development workflows
|
|
7
|
+
|
|
8
|
+
## SYNOPSIS
|
|
9
|
+
|
|
10
|
+
`nncc` [--accessible] [--locale <locale>] [--ui <adapter>] <command> [<args>]
|
|
11
|
+
|
|
12
|
+
## DESCRIPTION
|
|
13
|
+
|
|
14
|
+
**nncc** is a configuration management tool for AI-assisted development workflows.
|
|
15
|
+
It compiles YAML behaviour definitions into rule files for multiple AI engines, manages
|
|
16
|
+
design documents, validates configurations, and builds Debian packages.
|
|
17
|
+
|
|
18
|
+
raictl follows a security-first design with YAML safe loading, array-form shell
|
|
19
|
+
commands, and whitelisted file paths. All configurations are versioned and
|
|
20
|
+
validated against JSON Schema.
|
|
21
|
+
|
|
22
|
+
## COMMANDS
|
|
23
|
+
|
|
24
|
+
### Core Commands
|
|
25
|
+
|
|
26
|
+
* `version`:
|
|
27
|
+
Display the current nncc version and build information.
|
|
28
|
+
|
|
29
|
+
* `tree`:
|
|
30
|
+
Print a tree of all available commands with descriptions.
|
|
31
|
+
|
|
32
|
+
* `compile` [--verbose] [--simulate] [--vendor] [--engine <name>] [--strict] [--locales]:
|
|
33
|
+
Compile YAML behaviour configurations into markdown rule files. Use
|
|
34
|
+
`--simulate` for a dry run with diffs. Use `--vendor` to write a lockfile.
|
|
35
|
+
Use `--engine` to select the target engine (default: from config). Use
|
|
36
|
+
`--strict` to treat warnings as errors. Use `--locales` to compile locale
|
|
37
|
+
files to gettext and Qt formats. Available engines: `claude`
|
|
38
|
+
(default), `generic`, `agents_md`, `ollama`, `gpt_neox`, `goose`,
|
|
39
|
+
`aider`, `cursor`, `copilot`, `windsurf`.
|
|
40
|
+
|
|
41
|
+
* `validate`:
|
|
42
|
+
Validate all configuration files (behaviour, design, tooling) against
|
|
43
|
+
their respective JSON schemas. Reports per-category pass/fail counts
|
|
44
|
+
in a summary table.
|
|
45
|
+
|
|
46
|
+
* `init` --global|--local|--project [--no-compile]:
|
|
47
|
+
Initialize nncc directory structure. Use `--global` for ~/.claude/,
|
|
48
|
+
`--local` for project-level .claude/ structure, and `--project` to create
|
|
49
|
+
an `.nncc/` project structure with `config.yml` and conf subdirectories.
|
|
50
|
+
Engine detection runs automatically during init. Use `--no-compile` to
|
|
51
|
+
skip the rule compilation step.
|
|
52
|
+
|
|
53
|
+
### Configuration Management
|
|
54
|
+
|
|
55
|
+
* `behaviour` display [--format table|json|yaml]:
|
|
56
|
+
Show current behaviour configuration as a table, JSON, or YAML.
|
|
57
|
+
|
|
58
|
+
* `behaviour` list:
|
|
59
|
+
List all behaviour files found in `conf/behaviour/`.
|
|
60
|
+
|
|
61
|
+
* `behaviour` show <name>:
|
|
62
|
+
Show details of a specific behaviour file including rules and metadata.
|
|
63
|
+
|
|
64
|
+
* `behaviour` validate [<name>]:
|
|
65
|
+
Validate behaviour file(s) against the behaviour schema. Validates all
|
|
66
|
+
files if no name is given, or a single file if <name> is specified.
|
|
67
|
+
|
|
68
|
+
* `behaviour` manage add <name> [--description <text>] [--author <name>]:
|
|
69
|
+
Create a new behaviour configuration file with a template structure.
|
|
70
|
+
|
|
71
|
+
* `behaviour` manage modify <name>:
|
|
72
|
+
Modify an existing behaviour file interactively.
|
|
73
|
+
|
|
74
|
+
* `behaviour` manage delete <name> [--force]:
|
|
75
|
+
Delete a behaviour file. Warns if the behaviour is referenced elsewhere.
|
|
76
|
+
Use `--force` to skip the confirmation prompt.
|
|
77
|
+
|
|
78
|
+
* `design` list:
|
|
79
|
+
List all design documents with name, version, status, domain, and priority.
|
|
80
|
+
|
|
81
|
+
* `design` show <name> [--full]:
|
|
82
|
+
Show a design document summary. Use `--full` to display intent,
|
|
83
|
+
constraints, acceptance criteria, examples, and anti-patterns.
|
|
84
|
+
|
|
85
|
+
* `design` validate [<name>]:
|
|
86
|
+
Validate design document(s) against the design schema.
|
|
87
|
+
|
|
88
|
+
* `config` show [--raw] [--engine <name>]:
|
|
89
|
+
Display compiled configuration for a scope with secrets masked.
|
|
90
|
+
Use `--raw` to show unmasked values.
|
|
91
|
+
|
|
92
|
+
* `config` compile [--verbose] [--simulate] [--scope <name>] [--engine <name>]:
|
|
93
|
+
Compile engine configuration YAML to native settings files (e.g.,
|
|
94
|
+
`settings.json` for Claude Code). Use `--scope` to compile a single scope
|
|
95
|
+
(managed, user, project, local). Use `--engine` to override the default
|
|
96
|
+
engine.
|
|
97
|
+
|
|
98
|
+
### Operations
|
|
99
|
+
|
|
100
|
+
* `adopt` [--verbose] [--elaborate] [--api] [--quorum]:
|
|
101
|
+
Analyze compiled rule files for issues. Defaults to local-only structural
|
|
102
|
+
checks. Use `--api` to enable remote API analysis via the configured engine.
|
|
103
|
+
Use `--quorum` for multi-engine consensus analysis. Use `--elaborate` for
|
|
104
|
+
detailed findings.
|
|
105
|
+
|
|
106
|
+
* `engines` list:
|
|
107
|
+
List all known engines from the built-in manifest and plugin registry.
|
|
108
|
+
|
|
109
|
+
* `engines` detect:
|
|
110
|
+
Probe the system for installed engines (checks binaries, gems, configs).
|
|
111
|
+
|
|
112
|
+
* `engines` status:
|
|
113
|
+
Show the default engine and detection results for all engines.
|
|
114
|
+
|
|
115
|
+
* `engines` plugins:
|
|
116
|
+
Show registered plugin engines from the gem path.
|
|
117
|
+
|
|
118
|
+
* `backup` --global|--local [--compression <type>] [--compression-ratio <n>] [--destination <uri>]:
|
|
119
|
+
Back up nncc directory structure and assets. At least one of `--global`
|
|
120
|
+
or `--local` must be specified. Compression types: `zip` (default),
|
|
121
|
+
`tar.gz`, `tar.zst`. The `--destination` flag accepts `file://` URIs.
|
|
122
|
+
|
|
123
|
+
* `build` package [--verbose] [--clean] [--architecture <arch>] [--variant <name>] [--ruby-version <ver>] [--output-dir <dir>]:
|
|
124
|
+
Build a Debian `.deb` package using fpm and ruby-build. Available
|
|
125
|
+
variants: `core` (default), `gtk4`, `qt6`. The `--clean` flag removes
|
|
126
|
+
the staging directory before building. Internal command: only available
|
|
127
|
+
inside the rosett-ai repository.
|
|
128
|
+
|
|
129
|
+
* `build` engine [--verbose] [--path <dir>] [--output-dir <dir>] [--nncc-min-version <ver>]:
|
|
130
|
+
Build a `.deb` package for an rosett-ai engine plugin. Run from an engine
|
|
131
|
+
directory or specify `--path`. Sets minimum nncc version dependency
|
|
132
|
+
with `--nncc-min-version`.
|
|
133
|
+
|
|
134
|
+
* `tooling` validate-ci-yaml [--verbose]:
|
|
135
|
+
Validate GitLab CI YAML files for syntax errors. Checks `.gitlab-ci.yml`
|
|
136
|
+
and all included CI files.
|
|
137
|
+
|
|
138
|
+
* `tooling` validate [<name>]:
|
|
139
|
+
Validate tooling configuration files against the tooling schema.
|
|
140
|
+
|
|
141
|
+
* `tooling` check-versions [--verbose] [--gems]:
|
|
142
|
+
Check Ruby and gem version consistency across the codebase. Use `--gems`
|
|
143
|
+
to include gem version analysis.
|
|
144
|
+
|
|
145
|
+
* `dbus` status:
|
|
146
|
+
Show whether the `be.neatnerds.rosettai` D-Bus session service is running.
|
|
147
|
+
|
|
148
|
+
* `dbus` start [--daemonize]:
|
|
149
|
+
Start the D-Bus service with focus monitoring. Runs in the foreground
|
|
150
|
+
by default. Use `--daemonize` (`-d`) to run in the background.
|
|
151
|
+
Requires the `nncc-gtk4` package.
|
|
152
|
+
|
|
153
|
+
* `dbus` stop:
|
|
154
|
+
Send a shutdown signal to the running D-Bus service.
|
|
155
|
+
|
|
156
|
+
* `dbus` detect:
|
|
157
|
+
Detect the running compositor and show the selected focus adapter.
|
|
158
|
+
|
|
159
|
+
* `desktop` gtk4:
|
|
160
|
+
Launch the GTK4/Adwaita desktop application. Connects to the D-Bus
|
|
161
|
+
service for compile, status, and preference management. Requires the
|
|
162
|
+
`nncc-gtk4` package.
|
|
163
|
+
|
|
164
|
+
* `desktop` status:
|
|
165
|
+
Show desktop integration status (GTK4 availability, D-Bus service state).
|
|
166
|
+
|
|
167
|
+
* `documentation` update [--locale <locale>] [--all-locales] [--dry-run] [--skip-reference]:
|
|
168
|
+
Scan for documentation changes and apply updates. Detects undocumented
|
|
169
|
+
public methods, new behaviour files, and dependency changes. Use
|
|
170
|
+
`--skip-reference` to skip LaTeX reference compilation.
|
|
171
|
+
|
|
172
|
+
* `documentation` status:
|
|
173
|
+
Show documentation file count, modification dates, and configured locales.
|
|
174
|
+
|
|
175
|
+
* `documentation` translate [<file>] --to <locale> [--from <locale>]:
|
|
176
|
+
Translate documentation files to a target locale.
|
|
177
|
+
|
|
178
|
+
### Compliance & Quality
|
|
179
|
+
|
|
180
|
+
* `comply` [--cra] [--license] [--headers] [--format table|json]:
|
|
181
|
+
Run compliance checks against project policies. Use `--cra` for
|
|
182
|
+
EU Cyber Resilience Act checks. Use `--license` for license
|
|
183
|
+
compatibility checks. Use `--headers` for SPDX header validation.
|
|
184
|
+
|
|
185
|
+
* `doctor` [--check <name>] [--format table|json]:
|
|
186
|
+
Run diagnostic checks on the nncc installation. Checks Ruby version,
|
|
187
|
+
gem dependencies, file permissions, D-Bus availability, engine
|
|
188
|
+
detection, and cache health. Use `--check` to run a single check.
|
|
189
|
+
|
|
190
|
+
### Workflow & Project Management
|
|
191
|
+
|
|
192
|
+
* `workflow` list:
|
|
193
|
+
List available workflow definition files.
|
|
194
|
+
|
|
195
|
+
* `workflow` validate <name>:
|
|
196
|
+
Validate a workflow definition against the workflow schema.
|
|
197
|
+
|
|
198
|
+
* `workflow` simulate <name>:
|
|
199
|
+
Dry-run a workflow showing all steps without executing them.
|
|
200
|
+
|
|
201
|
+
* `workflow` execute <name> [--resume] [--format table|json]:
|
|
202
|
+
Execute a named workflow. Use `--resume` to continue from the last
|
|
203
|
+
successful step after a failure.
|
|
204
|
+
|
|
205
|
+
* `project` status [--format table|json]:
|
|
206
|
+
Show project status including health checks, engine, and configuration.
|
|
207
|
+
|
|
208
|
+
* `project` info:
|
|
209
|
+
Show project metadata (name, engine, template, behaviour/design counts).
|
|
210
|
+
|
|
211
|
+
* `project` apply-template <name> [--force] [--list]:
|
|
212
|
+
Apply a project template. Use `--list` to show available templates
|
|
213
|
+
without applying. Use `--force` to overwrite existing files.
|
|
214
|
+
|
|
215
|
+
* `project` drift [--type forward|template] [--format table|json]:
|
|
216
|
+
Detect configuration drift from the upstream template or from the
|
|
217
|
+
expected forward state.
|
|
218
|
+
|
|
219
|
+
* `project` sync [--force] [--simulate]:
|
|
220
|
+
Synchronize local configuration with upstream template updates.
|
|
221
|
+
Use `--simulate` for a dry run.
|
|
222
|
+
|
|
223
|
+
### Integration
|
|
224
|
+
|
|
225
|
+
* `mcp` serve:
|
|
226
|
+
Start nncc as an MCP (Model Context Protocol) server on stdio transport.
|
|
227
|
+
|
|
228
|
+
* `mcp` list [--format table|json]:
|
|
229
|
+
List configured MCP servers.
|
|
230
|
+
|
|
231
|
+
* `mcp` validate [--format table|json]:
|
|
232
|
+
Validate MCP server configurations against the schema.
|
|
233
|
+
|
|
234
|
+
* `mcp` status [--format table|json]:
|
|
235
|
+
Show MCP server health status.
|
|
236
|
+
|
|
237
|
+
* `mcp` audit [--format table|json]:
|
|
238
|
+
Generate an MCP compliance audit report.
|
|
239
|
+
|
|
240
|
+
* `mcp` add <name> [--transport stdio|http|streamable-http]:
|
|
241
|
+
Install an MCP server from a trusted source.
|
|
242
|
+
|
|
243
|
+
* `mcp` remove <name> [--force]:
|
|
244
|
+
Remove a configured MCP server.
|
|
245
|
+
|
|
246
|
+
* `mcp` trust-sources [--format table|json]:
|
|
247
|
+
List configured trust sources for MCP server installation.
|
|
248
|
+
|
|
249
|
+
* `mcp` trust-add <domain> [--description <text>]:
|
|
250
|
+
Add a trusted domain for MCP server installation.
|
|
251
|
+
|
|
252
|
+
* `mcp` trust-remove <domain>:
|
|
253
|
+
Remove a trusted domain.
|
|
254
|
+
|
|
255
|
+
* `mcp` tools:
|
|
256
|
+
List available MCP tools from all configured servers.
|
|
257
|
+
|
|
258
|
+
* `hooks` install [--verbose]:
|
|
259
|
+
Install configured git hooks from `.nncc/config.yml`. Hooks are
|
|
260
|
+
defined in the project configuration and installed via the detected
|
|
261
|
+
hook manager (overcommit, husky, lefthook).
|
|
262
|
+
|
|
263
|
+
* `hooks` uninstall:
|
|
264
|
+
Remove nncc hooks and restore previous hooks.
|
|
265
|
+
|
|
266
|
+
* `hooks` list [--format table|json]:
|
|
267
|
+
Show installed nncc hooks.
|
|
268
|
+
|
|
269
|
+
* `hooks` status [--format table|json]:
|
|
270
|
+
Show hook installation status and detect drift from configuration.
|
|
271
|
+
|
|
272
|
+
* `plugins` list <type>:
|
|
273
|
+
List installed plugins of a given type. Valid types: `engine`, `gui`,
|
|
274
|
+
`mcp`.
|
|
275
|
+
|
|
276
|
+
* `plugins` install <type> <name>:
|
|
277
|
+
Install a plugin package (e.g., `plugins install engine ollama`).
|
|
278
|
+
|
|
279
|
+
* `plugins` remove <type> <name>:
|
|
280
|
+
Remove a plugin package.
|
|
281
|
+
|
|
282
|
+
* `retrofit` convert [--engine <name>...] [--force] [--simulate]:
|
|
283
|
+
Import native AI tool configurations into nncc YAML format. Reads
|
|
284
|
+
existing Claude Code, Cursor, or other tool configs and generates
|
|
285
|
+
equivalent nncc behaviour files. Use `--simulate` for a dry run.
|
|
286
|
+
Native files are never modified. This is the default subcommand.
|
|
287
|
+
|
|
288
|
+
* `retrofit` engines:
|
|
289
|
+
List available retrofit engine adapters.
|
|
290
|
+
|
|
291
|
+
* `completion` bash|zsh|fish:
|
|
292
|
+
Generate a shell completion script for the specified shell.
|
|
293
|
+
Output is written to stdout for piping.
|
|
294
|
+
|
|
295
|
+
* `completion` install [--shell <name>]:
|
|
296
|
+
Install the completion script to the standard system directory.
|
|
297
|
+
Auto-detects the current shell from `$SHELL` if `--shell` is not given.
|
|
298
|
+
|
|
299
|
+
### AI Provenance
|
|
300
|
+
|
|
301
|
+
* `provenance` init:
|
|
302
|
+
Create `.ai-provenance.yml` in the current project root.
|
|
303
|
+
|
|
304
|
+
* `provenance` validate:
|
|
305
|
+
Validate all provenance entries and hash chain integrity.
|
|
306
|
+
|
|
307
|
+
* `provenance` show <commit> [--file <path>]:
|
|
308
|
+
Show provenance for a specific commit or all entries referencing a file.
|
|
309
|
+
|
|
310
|
+
* `provenance` log [--role <role>]:
|
|
311
|
+
Show all provenance entries in reverse chronological order. Filter by
|
|
312
|
+
AI role with `--role` (e.g., `AI-Co-Author`, `AI-Generated-By`).
|
|
313
|
+
|
|
314
|
+
### Release Management
|
|
315
|
+
|
|
316
|
+
* `release` prepare <level> [--skip-verify]:
|
|
317
|
+
Prepare a release. Bumps version (major, minor, or patch), runs the
|
|
318
|
+
verification suite, generates CHANGELOG entries via git-cliff, and
|
|
319
|
+
creates a release commit. The `--skip-verify` flag skips the quality
|
|
320
|
+
gate suite (NOT recommended).
|
|
321
|
+
|
|
322
|
+
* `release` tag:
|
|
323
|
+
Create an annotated git tag from the current VERSION constant.
|
|
324
|
+
|
|
325
|
+
* `release` status:
|
|
326
|
+
Show current version, last tag, and number of unreleased commits.
|
|
327
|
+
|
|
328
|
+
### Licensing
|
|
329
|
+
|
|
330
|
+
* `license` activate <key>:
|
|
331
|
+
Activate a license key for premium content pack access. The key is
|
|
332
|
+
verified using Ed25519 signature validation. Licenses control content
|
|
333
|
+
access only, never software functionality (GPL-3.0).
|
|
334
|
+
|
|
335
|
+
* `license` status:
|
|
336
|
+
Show current license status including tier and validity.
|
|
337
|
+
|
|
338
|
+
* `license` deactivate:
|
|
339
|
+
Remove the license key and revert to Community tier.
|
|
340
|
+
|
|
341
|
+
* `content` list [--available]:
|
|
342
|
+
Show installed content packs. Use `--available` to also show packs
|
|
343
|
+
available for download.
|
|
344
|
+
|
|
345
|
+
* `content` install <name>:
|
|
346
|
+
Download, verify signature, and install a content pack.
|
|
347
|
+
|
|
348
|
+
* `content` update:
|
|
349
|
+
Re-download all installed content packs (requires subscriber tier).
|
|
350
|
+
|
|
351
|
+
## GLOBAL OPTIONS
|
|
352
|
+
|
|
353
|
+
* `--accessible`:
|
|
354
|
+
Enable accessible output mode (screen-reader friendly tables, ARIA
|
|
355
|
+
live regions, EN 301 549 compliant).
|
|
356
|
+
|
|
357
|
+
* `--locale`=<locale>:
|
|
358
|
+
Display output in specified locale (e.g., `en`, `fr`, `ar`).
|
|
359
|
+
Arabic locale uses right-to-left rendering.
|
|
360
|
+
|
|
361
|
+
* `--ui`=<adapter>:
|
|
362
|
+
UI adapter to use. One of: `tui` (default), `gtk4`, `qt6`, `kde`.
|
|
363
|
+
|
|
364
|
+
## FILES
|
|
365
|
+
|
|
366
|
+
* `~/.config/nncc/config.yml`:
|
|
367
|
+
raictl runtime configuration (default engine, cache settings, detection).
|
|
368
|
+
|
|
369
|
+
* `~/.claude/`:
|
|
370
|
+
Global Claude Code configuration directory.
|
|
371
|
+
|
|
372
|
+
* `~/.claude/conf/behaviour/*.yml`:
|
|
373
|
+
Behaviour configuration files defining Claude operational rules.
|
|
374
|
+
|
|
375
|
+
* `~/.claude/conf/design/*.yml`:
|
|
376
|
+
Design documents specifying implementation standards.
|
|
377
|
+
|
|
378
|
+
* `~/.claude/conf/schemas/*.json`:
|
|
379
|
+
JSON Schema files for configuration validation.
|
|
380
|
+
|
|
381
|
+
* `~/.claude/rules/`:
|
|
382
|
+
Compiled rule files (generated by `nncc compile`).
|
|
383
|
+
|
|
384
|
+
* `~/.claude/settings.json`:
|
|
385
|
+
Global Claude Code settings.
|
|
386
|
+
|
|
387
|
+
* `.nncc/config.yml`:
|
|
388
|
+
Per-project configuration (project name, default engine, hooks).
|
|
389
|
+
|
|
390
|
+
* `.nncc/conf/behaviour/*.yml`:
|
|
391
|
+
Project-specific behaviour overrides.
|
|
392
|
+
|
|
393
|
+
* `.ai-provenance.yml`:
|
|
394
|
+
AI provenance tracking file (created by `nncc provenance init`).
|
|
395
|
+
|
|
396
|
+
* `/etc/nncc/settings.json`:
|
|
397
|
+
System-wide default settings (installed by .deb package).
|
|
398
|
+
|
|
399
|
+
## EXIT STATUS
|
|
400
|
+
|
|
401
|
+
* `0`:
|
|
402
|
+
Success.
|
|
403
|
+
|
|
404
|
+
* `1`:
|
|
405
|
+
General error (validation failure, missing file, invalid argument).
|
|
406
|
+
|
|
407
|
+
* `2`:
|
|
408
|
+
Validation error (schema mismatch, invalid YAML).
|
|
409
|
+
|
|
410
|
+
* `3`:
|
|
411
|
+
Configuration error (missing scope, bad engine name).
|
|
412
|
+
|
|
413
|
+
* `4`:
|
|
414
|
+
Permission error (read-only directory, denied path).
|
|
415
|
+
|
|
416
|
+
* `5`:
|
|
417
|
+
Dependency error (missing gem, unavailable engine).
|
|
418
|
+
|
|
419
|
+
## ENVIRONMENT
|
|
420
|
+
|
|
421
|
+
* `XDG_CONFIG_HOME`:
|
|
422
|
+
Base directory for nncc configuration (default: `~/.config`).
|
|
423
|
+
raictl stores its own config at `$XDG_CONFIG_HOME/nncc/config.yml`.
|
|
424
|
+
|
|
425
|
+
* `LANG`, `LC_ALL`:
|
|
426
|
+
Used for locale resolution when `--locale` is not specified.
|
|
427
|
+
|
|
428
|
+
* `NO_COLOR`:
|
|
429
|
+
When set, disables colour output (see https://no-color.org/).
|
|
430
|
+
|
|
431
|
+
* `RAI_TELEMETRY`:
|
|
432
|
+
Set to `1` to enable structured JSON Lines telemetry to stderr.
|
|
433
|
+
|
|
434
|
+
* `RAI_PROFILE`:
|
|
435
|
+
Set to `1` to print per-phase timing breakdown to stderr.
|
|
436
|
+
|
|
437
|
+
* `RAI_ENGINE_PATH`:
|
|
438
|
+
Colon-separated list of additional directories to search for engine
|
|
439
|
+
plugin gems.
|
|
440
|
+
|
|
441
|
+
* `RAI_LOG_LEVEL`:
|
|
442
|
+
Log verbosity. One of: `DEBUG`, `INFO`, `WARN`, `ERROR`.
|
|
443
|
+
|
|
444
|
+
* `RAI_LICENSE_KEY`:
|
|
445
|
+
License key for premium content pack access (alternative to
|
|
446
|
+
`license activate`).
|
|
447
|
+
|
|
448
|
+
* `RAI_ORIGINAL_PWD`:
|
|
449
|
+
Preserves the user's working directory when invoked via the `.deb`
|
|
450
|
+
wrapper script. Set automatically; do not override.
|
|
451
|
+
|
|
452
|
+
* `DBUS_SESSION_BUS_ADDRESS`:
|
|
453
|
+
D-Bus session bus address. Required for `dbus` and `desktop` commands.
|
|
454
|
+
|
|
455
|
+
## EXAMPLES
|
|
456
|
+
|
|
457
|
+
Compile rules for the default engine:
|
|
458
|
+
|
|
459
|
+
$ nncc compile --verbose
|
|
460
|
+
|
|
461
|
+
Dry-run compilation for Cursor engine:
|
|
462
|
+
|
|
463
|
+
$ nncc compile --engine cursor --simulate --verbose
|
|
464
|
+
|
|
465
|
+
Validate all configuration files:
|
|
466
|
+
|
|
467
|
+
$ nncc validate
|
|
468
|
+
|
|
469
|
+
Initialize a new project:
|
|
470
|
+
|
|
471
|
+
$ cd my-project && nncc init --project
|
|
472
|
+
|
|
473
|
+
Run diagnostic checks:
|
|
474
|
+
|
|
475
|
+
$ nncc doctor
|
|
476
|
+
|
|
477
|
+
Check compliance:
|
|
478
|
+
|
|
479
|
+
$ nncc comply --cra --license --headers
|
|
480
|
+
|
|
481
|
+
Generate bash completion:
|
|
482
|
+
|
|
483
|
+
$ nncc completion bash > /usr/share/bash-completion/completions/nncc
|
|
484
|
+
|
|
485
|
+
Import existing Claude Code config:
|
|
486
|
+
|
|
487
|
+
$ nncc retrofit --engine claude --simulate
|
|
488
|
+
|
|
489
|
+
Start MCP server:
|
|
490
|
+
|
|
491
|
+
$ nncc mcp serve
|
|
492
|
+
|
|
493
|
+
## SEE ALSO
|
|
494
|
+
|
|
495
|
+
claude(1), git-cliff(1), rubocop(1), ronn-ng(1)
|
|
496
|
+
|
|
497
|
+
Project repository: <https://gitlab.neatnerds.be/neatnerds/nncc>
|
|
498
|
+
|
|
499
|
+
## AUTHORS
|
|
500
|
+
|
|
501
|
+
Hugo Antonio Sepulveda Manriquez <hugo@neatnerds.be>
|
|
502
|
+
|
|
503
|
+
## LICENSE
|
|
504
|
+
|
|
505
|
+
GPL-3.0-only. See the LICENSE file in the project repository.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Packaging Operations
|
|
2
|
+
|
|
3
|
+
How to build, verify, and install the Rosett-AI `.deb` package.
|
|
4
|
+
|
|
5
|
+
## Building the .deb
|
|
6
|
+
|
|
7
|
+
Prerequisites: `fakeroot`, `dpkg-deb`, `rsync`, `ruby-build`, `fpm`.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Standard build (reuses cached Ruby if already compiled)
|
|
11
|
+
bundle exec raictl build package --verbose
|
|
12
|
+
|
|
13
|
+
# Clean build (recompiles Ruby from source)
|
|
14
|
+
bundle exec raictl build package --clean --verbose
|
|
15
|
+
|
|
16
|
+
# Build a specific variant
|
|
17
|
+
bundle exec raictl build package --variant gtk4 --verbose
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Output lands in `pkg/rosett-ai_<version>-<iteration>_<arch>.deb`.
|
|
21
|
+
|
|
22
|
+
## Hermetic Path Guarantee
|
|
23
|
+
|
|
24
|
+
The build system ensures **no workstation-specific paths** leak into the package:
|
|
25
|
+
|
|
26
|
+
1. **`embedded_env`** uses a hardcoded `HERMETIC_SYSTEM_PATH`
|
|
27
|
+
(`/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`)
|
|
28
|
+
instead of inheriting the builder's `$PATH`.
|
|
29
|
+
|
|
30
|
+
2. **`APP_EXCLUDES`** strips developer-only directories (`.claude`,
|
|
31
|
+
`doc/claude-sessions`, `.git`, `spec`, `coverage`, etc.) from the
|
|
32
|
+
application source during rsync.
|
|
33
|
+
|
|
34
|
+
3. **`clean_build_artifacts!`** removes native gem build debris
|
|
35
|
+
(`gem_make.out`, `mkmf.log`, `Makefile` in `ext/` directories) that
|
|
36
|
+
embed the build host's staging path. These files are not needed at
|
|
37
|
+
runtime.
|
|
38
|
+
|
|
39
|
+
4. **BUNDLE_DEPLOYMENT=true** with a relative `vendor/bundle` path
|
|
40
|
+
ensures the `.bundle/config` inside the package is portable.
|
|
41
|
+
|
|
42
|
+
## Verifying Hermetic Paths
|
|
43
|
+
|
|
44
|
+
After building, extract the package and check for leaked paths:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Extract without installing
|
|
48
|
+
mkdir /tmp/deb-check
|
|
49
|
+
dpkg-deb --fsys-tarfile pkg/rosett-ai_*.deb | tar xf - -C /tmp/deb-check
|
|
50
|
+
|
|
51
|
+
# Check for /home/ paths in text files (excluding binary .so and .ri)
|
|
52
|
+
grep -rl '/home/' /tmp/deb-check/opt/rosett-ai/app/ \
|
|
53
|
+
| grep -v '\.so$' | grep -v '\.ri$'
|
|
54
|
+
|
|
55
|
+
# Expected: only documentation files with example paths (SETUP.md, etc.)
|
|
56
|
+
# Unexpected: gem_make.out, mkmf.log, Makefile, .bundle/config
|
|
57
|
+
|
|
58
|
+
# Verify the wrapper script
|
|
59
|
+
grep '/home/' /tmp/deb-check/opt/rosett-ai/bin/raictl
|
|
60
|
+
# Expected: no output
|
|
61
|
+
|
|
62
|
+
# Verify .bundle/config uses relative paths
|
|
63
|
+
cat /tmp/deb-check/opt/rosett-ai/app/.bundle/config
|
|
64
|
+
# Expected: BUNDLE_PATH: "vendor/bundle" (relative, not absolute)
|
|
65
|
+
|
|
66
|
+
# Verify no .claude or session dirs shipped
|
|
67
|
+
ls /tmp/deb-check/opt/rosett-ai/app/.claude/ 2>&1
|
|
68
|
+
ls /tmp/deb-check/opt/rosett-ai/app/doc/claude-sessions/ 2>&1
|
|
69
|
+
# Expected: "No such file or directory" for both
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Installing on a Clean System
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
sudo dpkg -i pkg/rosett-ai_1.2.0-1_amd64.deb
|
|
76
|
+
|
|
77
|
+
# Verify installation
|
|
78
|
+
raictl version # Should print 1.2.0
|
|
79
|
+
raictl compile --verbose # Should compile without errors
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The package installs to:
|
|
83
|
+
|
|
84
|
+
| Path | Contents |
|
|
85
|
+
|------|----------|
|
|
86
|
+
| `/opt/rosett-ai/embedded/` | Self-contained Ruby 3.3.10 runtime |
|
|
87
|
+
| `/opt/rosett-ai/app/` | Application source and vendored gems |
|
|
88
|
+
| `/opt/rosett-ai/bin/raictl` | Runtime wrapper script |
|
|
89
|
+
| `/opt/rosett-ai/etc/` | Default settings and BUILD_INFO |
|
|
90
|
+
| `/etc/rosett-ai/settings.json` | User-editable conffile |
|
|
91
|
+
| `/usr/local/bin/raictl` | Symlink (created by postinst) |
|
|
92
|
+
| `/usr/local/bin/rai` | Symlink (created by postinst) |
|
|
93
|
+
| `/usr/share/man/man1/rai.1.gz` | Man page |
|
|
94
|
+
|
|
95
|
+
## Troubleshooting
|
|
96
|
+
|
|
97
|
+
### `raictl: command not found`
|
|
98
|
+
|
|
99
|
+
The postinst script creates symlinks at `/usr/local/bin/`. If these are
|
|
100
|
+
missing, recreate manually:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
sudo ln -sf /opt/rosett-ai/bin/raictl /usr/local/bin/raictl
|
|
104
|
+
sudo ln -sf /opt/rosett-ai/bin/raictl /usr/local/bin/rai
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### `cannot load such file -- bundler/setup`
|
|
108
|
+
|
|
109
|
+
The embedded Ruby cannot find its gems. Check:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Verify BUNDLE_PATH in the wrapper
|
|
113
|
+
grep BUNDLE_PATH /opt/rosett-ai/bin/raictl
|
|
114
|
+
# Should be: /opt/rosett-ai/app/vendor/bundle
|
|
115
|
+
|
|
116
|
+
# Verify gems are installed
|
|
117
|
+
ls /opt/rosett-ai/app/vendor/bundle/ruby/*/gems/ | head -5
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### `libruby.so.3.3: cannot open shared object file`
|
|
121
|
+
|
|
122
|
+
The embedded `LD_LIBRARY_PATH` isn't being set. Verify the wrapper
|
|
123
|
+
script sets it to `/opt/rosett-ai/embedded/lib`.
|
|
124
|
+
|
|
125
|
+
### Workstation paths in package (build regression)
|
|
126
|
+
|
|
127
|
+
If `grep -r '/home/' /opt/rosett-ai/` finds paths outside documentation,
|
|
128
|
+
the hermetic build guarantee has regressed. Check:
|
|
129
|
+
|
|
130
|
+
1. `embedded_env` in `lib/rosett_ai/thor/tasks/build.rb` — must use
|
|
131
|
+
`HERMETIC_SYSTEM_PATH`, not `ENV.fetch('PATH')`
|
|
132
|
+
2. `clean_build_artifacts!` stage — must run after `install_gems!`
|
|
133
|
+
3. `APP_EXCLUDES` — must include `.claude` and `doc/claude-sessions`
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Rosett-AI Release Procedure
|
|
2
|
+
|
|
3
|
+
## Prerequisites
|
|
4
|
+
|
|
5
|
+
- All tests pass: `bundle exec rspec`
|
|
6
|
+
- RuboCop clean: `bundle exec rubocop`
|
|
7
|
+
- No security vulnerabilities: `bundle exec bundler-audit check`
|
|
8
|
+
- Branch is up to date with main
|
|
9
|
+
|
|
10
|
+
## Steps
|
|
11
|
+
|
|
12
|
+
### 1. Version bump
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Option A: Use raictl release
|
|
16
|
+
bin/raictl release prepare minor # or patch, major
|
|
17
|
+
|
|
18
|
+
# Option B: Manual
|
|
19
|
+
# Edit lib/rosett_ai/version.rb
|
|
20
|
+
# Update CHANGELOG.md
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. Verify
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
bin/raictl version # Confirm new version
|
|
27
|
+
bin/raictl release status # Check commit count since last tag
|
|
28
|
+
bundle exec rspec # Full test suite
|
|
29
|
+
bin/raictl compile --verbose # Claude engine compiles
|
|
30
|
+
bin/raictl compile --engine agents_md --verbose # AGENTS.md engine compiles
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 3. Commit and push
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
git add lib/rosett_ai/version.rb CHANGELOG.md
|
|
37
|
+
git commit -m "chore(release): bump version to X.Y.Z"
|
|
38
|
+
git push -u origin <branch>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 4. Create merge request
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
glab mr create --title "chore(release): vX.Y.Z" --description "Release X.Y.Z"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 5. After merge: tag
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git checkout main && git pull
|
|
51
|
+
bin/raictl release tag # Creates annotated tag vX.Y.Z
|
|
52
|
+
git push --tags
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 6. Build .deb package (optional)
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
bin/raictl build package --clean --verbose
|
|
59
|
+
# Output: pkg/rosett-ai_X.Y.Z_amd64.deb
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 7. Post-release
|
|
63
|
+
|
|
64
|
+
- Update OpenProject work packages to "Closed"
|
|
65
|
+
- Verify installed package: `raictl version`
|