ninja-mcp 1.0.3__tar.gz
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.
- ninja_mcp-1.0.3/.agent/ARCHITECT.md +281 -0
- ninja_mcp-1.0.3/.agent/CONFIG_ARCHITECTURE_DESIGN.md +775 -0
- ninja_mcp-1.0.3/.agent/CONFIG_MIGRATOR_IMPLEMENTATION.md +297 -0
- ninja_mcp-1.0.3/.agent/CONFIG_REFACTOR_ANALYSIS.md +434 -0
- ninja_mcp-1.0.3/.agent/CREDENTIALS_IMPLEMENTATION.md +369 -0
- ninja_mcp-1.0.3/.agent/DYNAMIC_MODEL_SELECTOR_IMPLEMENTATION.md +294 -0
- ninja_mcp-1.0.3/.agent/FILE_DETECTION_INVESTIGATION.md +384 -0
- ninja_mcp-1.0.3/.agent/MIGRATION_GUIDE.md +342 -0
- ninja_mcp-1.0.3/.agent/OH_MY_OPENCODE_ANALYSIS.md +577 -0
- ninja_mcp-1.0.3/.agent/REFACTORING_PROGRESS.md +317 -0
- ninja_mcp-1.0.3/.agent/ROADMAP.md +354 -0
- ninja_mcp-1.0.3/.agent/STATUS.md +416 -0
- ninja_mcp-1.0.3/.agent/TIMEOUT_BUGS_ANALYSIS.md +212 -0
- ninja_mcp-1.0.3/.agent/TIMEOUT_FIX_DEPLOYMENT.md +238 -0
- ninja_mcp-1.0.3/.claude/scheduled_tasks.lock +1 -0
- ninja_mcp-1.0.3/.claude/settings.local.json +17 -0
- ninja_mcp-1.0.3/.claude-plugin/marketplace.json +12 -0
- ninja_mcp-1.0.3/.claude-plugin/plugin.json +9 -0
- ninja_mcp-1.0.3/.dockerignore +27 -0
- ninja_mcp-1.0.3/.editorconfig +29 -0
- ninja_mcp-1.0.3/.github/FUNDING.yml +7 -0
- ninja_mcp-1.0.3/.github/ISSUE_TEMPLATE/bug_report.yaml +53 -0
- ninja_mcp-1.0.3/.github/ISSUE_TEMPLATE/config.yaml +12 -0
- ninja_mcp-1.0.3/.github/ISSUE_TEMPLATE/feature_request.yaml +33 -0
- ninja_mcp-1.0.3/.github/ISSUE_TEMPLATE/question.yaml +21 -0
- ninja_mcp-1.0.3/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- ninja_mcp-1.0.3/.github/RELEASE_PROCESS.md +311 -0
- ninja_mcp-1.0.3/.github/workflows/ci.yml +168 -0
- ninja_mcp-1.0.3/.github/workflows/release.yml +276 -0
- ninja_mcp-1.0.3/.github/workflows/update-homebrew.yml +46 -0
- ninja_mcp-1.0.3/.gitignore +169 -0
- ninja_mcp-1.0.3/.gitlab-ci.yml +268 -0
- ninja_mcp-1.0.3/.mcp.json +19 -0
- ninja_mcp-1.0.3/.mcp.json.backup +22 -0
- ninja_mcp-1.0.3/.plans/2026-05-08_universal-plugin-and-secrets.md +102 -0
- ninja_mcp-1.0.3/.plans/TODO.md +63 -0
- ninja_mcp-1.0.3/BUILD_TEST_RESULTS.md +263 -0
- ninja_mcp-1.0.3/CHANGELOG.md +35 -0
- ninja_mcp-1.0.3/CLAUDE.md +125 -0
- ninja_mcp-1.0.3/CODE_OF_CONDUCT.md +71 -0
- ninja_mcp-1.0.3/CONTRIBUTING.md +220 -0
- ninja_mcp-1.0.3/DAEMON_STABILITY_FIX.md +233 -0
- ninja_mcp-1.0.3/Dockerfile +29 -0
- ninja_mcp-1.0.3/FULL_SYSTEM_FIX_REPORT.md +401 -0
- ninja_mcp-1.0.3/GEMINI_FIX_REPORT.md +298 -0
- ninja_mcp-1.0.3/GITHUB_SETUP_GUIDE.md +269 -0
- ninja_mcp-1.0.3/INSTALL_GUIDE.md +428 -0
- ninja_mcp-1.0.3/INTERACTIVE_MODEL_SELECTOR.md +331 -0
- ninja_mcp-1.0.3/INVESTIGATION_2026-01-26.md +523 -0
- ninja_mcp-1.0.3/LICENSE +21 -0
- ninja_mcp-1.0.3/MIGRATION.md +394 -0
- ninja_mcp-1.0.3/MODERNIZATION_SUMMARY.md +355 -0
- ninja_mcp-1.0.3/Makefile +101 -0
- ninja_mcp-1.0.3/NINJA_MCP_ROADMAP.md +377 -0
- ninja_mcp-1.0.3/OPENCODE_SETUP.md +210 -0
- ninja_mcp-1.0.3/PHASE1_IMPLEMENTATION_PLAN.md +604 -0
- ninja_mcp-1.0.3/PKG-INFO +339 -0
- ninja_mcp-1.0.3/PYTHON_SETUP.md +300 -0
- ninja_mcp-1.0.3/QUICKSTART.md +313 -0
- ninja_mcp-1.0.3/QUICK_START.md +159 -0
- ninja_mcp-1.0.3/README.md +243 -0
- ninja_mcp-1.0.3/RELEASE_NOTES_v0.4.0.md +100 -0
- ninja_mcp-1.0.3/RESEARCH_FINDINGS.md +421 -0
- ninja_mcp-1.0.3/SECURITY.md +42 -0
- ninja_mcp-1.0.3/SESSION_SUMMARY.md +252 -0
- ninja_mcp-1.0.3/SYSTEMATIC_FIX_SUMMARY.md +260 -0
- ninja_mcp-1.0.3/TIMEOUT_FIX_2026-02-08.md +221 -0
- ninja_mcp-1.0.3/TOOL_VERIFICATION_REPORT.md +136 -0
- ninja_mcp-1.0.3/agents/ninja-architect.md +67 -0
- ninja_mcp-1.0.3/agents/ninja-reviewer.md +90 -0
- ninja_mcp-1.0.3/claude-integration/README.md +126 -0
- ninja_mcp-1.0.3/claude-integration/hooks/hooks.json +43 -0
- ninja_mcp-1.0.3/claude-integration/scripts/opencode-ensure.sh +50 -0
- ninja_mcp-1.0.3/claude-integration/scripts/opencode-health.sh +24 -0
- ninja_mcp-1.0.3/claude-integration/scripts/opencode-task.sh +71 -0
- ninja_mcp-1.0.3/commands/code.md +43 -0
- ninja_mcp-1.0.3/commands/explore.md +68 -0
- ninja_mcp-1.0.3/commands/ninja-code.md +18 -0
- ninja_mcp-1.0.3/commands/ninja-research.md +17 -0
- ninja_mcp-1.0.3/commands/ninja-review.md +20 -0
- ninja_mcp-1.0.3/commands/research.md +49 -0
- ninja_mcp-1.0.3/config/mcp-modules.json +252 -0
- ninja_mcp-1.0.3/configs/example_plan.json +118 -0
- ninja_mcp-1.0.3/data/builtin_prompts/architect-review.yml +114 -0
- ninja_mcp-1.0.3/data/builtin_prompts/architecture-design.yml +49 -0
- ninja_mcp-1.0.3/data/builtin_prompts/bug-debugging.yml +46 -0
- ninja_mcp-1.0.3/data/builtin_prompts/code-review.yml +40 -0
- ninja_mcp-1.0.3/data/builtin_prompts/feature-implementation.yml +55 -0
- ninja_mcp-1.0.3/docker/entrypoint.sh +15 -0
- ninja_mcp-1.0.3/docker/healthcheck.sh +19 -0
- ninja_mcp-1.0.3/docker-compose.yml +115 -0
- ninja_mcp-1.0.3/docs/AUTOMATIC_SAFETY.md +109 -0
- ninja_mcp-1.0.3/docs/CLAUDE_CODE_2026_INTEGRATION.md +536 -0
- ninja_mcp-1.0.3/docs/CLAUDE_CONFIG_LOCATIONS.md +222 -0
- ninja_mcp-1.0.3/docs/CLI_STRATEGIES.md +83 -0
- ninja_mcp-1.0.3/docs/CONFIGURATION.md +301 -0
- ninja_mcp-1.0.3/docs/EDITOR_INTEGRATIONS.md +666 -0
- ninja_mcp-1.0.3/docs/INSTALLATION_MODES.md +253 -0
- ninja_mcp-1.0.3/docs/INSTALLER_GUIDE.md +332 -0
- ninja_mcp-1.0.3/docs/INTEGRATION_TEST_RESULTS.md +175 -0
- ninja_mcp-1.0.3/docs/MCP_ARCHITECTURE.md +552 -0
- ninja_mcp-1.0.3/docs/MODEL_SELECTION.md +93 -0
- ninja_mcp-1.0.3/docs/OPENCODE_INTEGRATION.md +44 -0
- ninja_mcp-1.0.3/docs/OPENCODE_INTEGRATION_PLAN.md +1710 -0
- ninja_mcp-1.0.3/docs/PACKAGING.md +282 -0
- ninja_mcp-1.0.3/docs/POWER_CONFIGURATOR.md +163 -0
- ninja_mcp-1.0.3/docs/PROMPTS_API.md +512 -0
- ninja_mcp-1.0.3/docs/RATE_BALANCER.md +394 -0
- ninja_mcp-1.0.3/docs/README.md +22 -0
- ninja_mcp-1.0.3/docs/RESEARCHER.md +501 -0
- ninja_mcp-1.0.3/docs/RESEARCHER_SPEC.md +709 -0
- ninja_mcp-1.0.3/docs/RESOURCES_API.md +342 -0
- ninja_mcp-1.0.3/docs/SAFE_USAGE.md +332 -0
- ninja_mcp-1.0.3/docs/SEQUENTIAL_EXECUTION_ANALYSIS.md +429 -0
- ninja_mcp-1.0.3/docs/TESTING_GUIDE.md +664 -0
- ninja_mcp-1.0.3/docs/TUI_INSTALLER.md +73 -0
- ninja_mcp-1.0.3/docs/assets/tui-docker-installer.svg +99 -0
- ninja_mcp-1.0.3/docs/assets/tui-models.svg +225 -0
- ninja_mcp-1.0.3/docs/assets/tui-overview.svg +216 -0
- ninja_mcp-1.0.3/docs/coder/ARCHITECTURE.md +1491 -0
- ninja_mcp-1.0.3/docs/coder/CHANGELOG.md +9 -0
- ninja_mcp-1.0.3/docs/coder/MIGRATION_GUIDE.md +797 -0
- ninja_mcp-1.0.3/docs/coder/PERFORMANCE_BENCHMARKS.md +729 -0
- ninja_mcp-1.0.3/docs/coder/REFACTORING_SUMMARY.md +603 -0
- ninja_mcp-1.0.3/docs/container-quickstart.md +169 -0
- ninja_mcp-1.0.3/docs/researcher/CHANGELOG.md +1 -0
- ninja_mcp-1.0.3/docs/researcher/README.md +329 -0
- ninja_mcp-1.0.3/docs/secretary/CHANGELOG.md +7 -0
- ninja_mcp-1.0.3/docs/secretary/README.md +541 -0
- ninja_mcp-1.0.3/docs/superpowers/plans/2026-07-09-gitlab-release-jobs.md +61 -0
- ninja_mcp-1.0.3/examples/README.md +211 -0
- ninja_mcp-1.0.3/examples/claude-code-mcp.json +55 -0
- ninja_mcp-1.0.3/examples/dynamic_model_selector_demo.py +162 -0
- ninja_mcp-1.0.3/examples/hello_ninja.py +52 -0
- ninja_mcp-1.0.3/examples/mcp-config-local-dev.json +48 -0
- ninja_mcp-1.0.3/examples/mcp-config-template.json +45 -0
- ninja_mcp-1.0.3/examples/opencode_integration_example.py +353 -0
- ninja_mcp-1.0.3/examples/vscode-cline-mcp.json +55 -0
- ninja_mcp-1.0.3/examples/workflows/bug-debugger.yml +58 -0
- ninja_mcp-1.0.3/examples/workflows/code-reviewer.yml +60 -0
- ninja_mcp-1.0.3/examples/workflows/feature-developer.yml +70 -0
- ninja_mcp-1.0.3/examples/zed-settings.json +66 -0
- ninja_mcp-1.0.3/hello.py +1 -0
- ninja_mcp-1.0.3/hello.txt +1 -0
- ninja_mcp-1.0.3/install.sh +443 -0
- ninja_mcp-1.0.3/justfile +341 -0
- ninja_mcp-1.0.3/ninja-prompts/server.py +3 -0
- ninja_mcp-1.0.3/ninja_resources/server.py +81 -0
- ninja_mcp-1.0.3/ninja_resources/tools.py +17 -0
- ninja_mcp-1.0.3/notebooks/.gitignore +13 -0
- ninja_mcp-1.0.3/notebooks/01_model_comparison.ipynb +1231 -0
- ninja_mcp-1.0.3/notebooks/01_model_comparison.ipynb.bak +496 -0
- ninja_mcp-1.0.3/notebooks/02_cost_analysis.ipynb +420 -0
- ninja_mcp-1.0.3/notebooks/02_cost_analysis.ipynb.bak +431 -0
- ninja_mcp-1.0.3/notebooks/03_mcp_token_savings_analysis.ipynb +1825 -0
- ninja_mcp-1.0.3/notebooks/03_plugin_cost_savings.ipynb +1291 -0
- ninja_mcp-1.0.3/notebooks/MODEL_SELECTION.md +160 -0
- ninja_mcp-1.0.3/notebooks/QUICKSTART.md +227 -0
- ninja_mcp-1.0.3/notebooks/README.md +270 -0
- ninja_mcp-1.0.3/notebooks/livebench_data.py +340 -0
- ninja_mcp-1.0.3/notebooks/test_livebench_data.py +197 -0
- ninja_mcp-1.0.3/notebooks/test_minimal.ipynb +76 -0
- ninja_mcp-1.0.3/packaging/debian/ninja-mcp_0.2.0_all.deb +0 -0
- ninja_mcp-1.0.3/packaging/homebrew/ninja-mcp.rb +61 -0
- ninja_mcp-1.0.3/pyproject.toml +260 -0
- ninja_mcp-1.0.3/ruff.toml +71 -0
- ninja_mcp-1.0.3/scripts/clean_claude_env.sh +59 -0
- ninja_mcp-1.0.3/scripts/dev.sh +157 -0
- ninja_mcp-1.0.3/scripts/fix_config.sh +164 -0
- ninja_mcp-1.0.3/scripts/get_recommended_models.py +329 -0
- ninja_mcp-1.0.3/scripts/http_server.py +135 -0
- ninja_mcp-1.0.3/scripts/http_server_old.py +164 -0
- ninja_mcp-1.0.3/scripts/install.sh +162 -0
- ninja_mcp-1.0.3/scripts/install_gemini_mcp.sh.bak +0 -0
- ninja_mcp-1.0.3/scripts/install_interactive.sh.bak +1050 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/README.md +70 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/configure-opencode.sh +125 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_claude_code_mcp.sh +431 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_coding_cli.sh +91 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_copilot_cli_mcp.sh +227 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_daemon.sh +405 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_gemini_mcp.sh +380 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_gemini_mcp_claude_backup.sh +431 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_ide_integrations.sh +322 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_interactive.sh +1277 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_opencode_mcp.sh +448 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_vscode_mcp.sh +241 -0
- ninja_mcp-1.0.3/scripts/legacy_archive/install_zed_mcp.sh +357 -0
- ninja_mcp-1.0.3/scripts/ninja-cli-mcp.service +28 -0
- ninja_mcp-1.0.3/scripts/ninja-recover.sh +167 -0
- ninja_mcp-1.0.3/scripts/packaging/build-deb.sh +185 -0
- ninja_mcp-1.0.3/scripts/packaging/build-homebrew.sh +108 -0
- ninja_mcp-1.0.3/scripts/post-install.sh +30 -0
- ninja_mcp-1.0.3/scripts/restart_mcp.sh +141 -0
- ninja_mcp-1.0.3/scripts/run_daemon.sh +25 -0
- ninja_mcp-1.0.3/scripts/run_integration_tests.sh +155 -0
- ninja_mcp-1.0.3/scripts/run_notebooks.sh +90 -0
- ninja_mcp-1.0.3/scripts/run_server.sh +55 -0
- ninja_mcp-1.0.3/scripts/run_server_stdio.sh +19 -0
- ninja_mcp-1.0.3/scripts/run_stdio_proxy.sh +40 -0
- ninja_mcp-1.0.3/scripts/run_tests.sh +160 -0
- ninja_mcp-1.0.3/scripts/safe-ninja-task.sh +71 -0
- ninja_mcp-1.0.3/scripts/smoke_test.sh +272 -0
- ninja_mcp-1.0.3/scripts/socket_server.py +93 -0
- ninja_mcp-1.0.3/scripts/stdio_proxy.py +100 -0
- ninja_mcp-1.0.3/scripts/test_aider_integration.sh +175 -0
- ninja_mcp-1.0.3/scripts/test_copilot_mcp.sh +150 -0
- ninja_mcp-1.0.3/scripts/test_tui_installer.py +29 -0
- ninja_mcp-1.0.3/scripts/update_mcp_config.py +91 -0
- ninja_mcp-1.0.3/scripts/update_mcp_config.sh +797 -0
- ninja_mcp-1.0.3/skills/ninja-code/config.json +35 -0
- ninja_mcp-1.0.3/skills/ninja-code/skill.md +85 -0
- ninja_mcp-1.0.3/skills/ninja-research/config.json +34 -0
- ninja_mcp-1.0.3/skills/ninja-research/skill.md +93 -0
- ninja_mcp-1.0.3/specs/CLAUDE_HOOKS_CLI_SPEC.md +367 -0
- ninja_mcp-1.0.3/specs/SKILL_PACKAGING_SPEC.md +205 -0
- ninja_mcp-1.0.3/src/ninja_agent/__init__.py +3 -0
- ninja_mcp-1.0.3/src/ninja_agent/cli.py +394 -0
- ninja_mcp-1.0.3/src/ninja_agent/models.py +127 -0
- ninja_mcp-1.0.3/src/ninja_agent/server.py +324 -0
- ninja_mcp-1.0.3/src/ninja_agent/tools.py +499 -0
- ninja_mcp-1.0.3/src/ninja_coder/__init__.py +30 -0
- ninja_mcp-1.0.3/src/ninja_coder/benchmark/__init__.py +15 -0
- ninja_mcp-1.0.3/src/ninja_coder/benchmark/framework.py +328 -0
- ninja_mcp-1.0.3/src/ninja_coder/benchmark/tasks.py +110 -0
- ninja_mcp-1.0.3/src/ninja_coder/daemon.py +282 -0
- ninja_mcp-1.0.3/src/ninja_coder/driver.py +2655 -0
- ninja_mcp-1.0.3/src/ninja_coder/hooks_cli.py +265 -0
- ninja_mcp-1.0.3/src/ninja_coder/model_selector.py +363 -0
- ninja_mcp-1.0.3/src/ninja_coder/models.py +348 -0
- ninja_mcp-1.0.3/src/ninja_coder/multi_agent.py +310 -0
- ninja_mcp-1.0.3/src/ninja_coder/prompt_builder.py +741 -0
- ninja_mcp-1.0.3/src/ninja_coder/result_parser.py +290 -0
- ninja_mcp-1.0.3/src/ninja_coder/safety.py +507 -0
- ninja_mcp-1.0.3/src/ninja_coder/server.py +788 -0
- ninja_mcp-1.0.3/src/ninja_coder/sessions.py +278 -0
- ninja_mcp-1.0.3/src/ninja_coder/sessions.py.backup +278 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/__init__.py +28 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/aider_strategy.py +505 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/base.py +173 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/claude_strategy.py +336 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/gemini_strategy.py +373 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/junie_strategy.py +322 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/opencode_server_pool.py +564 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/opencode_strategy.py +777 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/registry.py +116 -0
- ninja_mcp-1.0.3/src/ninja_coder/strategies/test_opencode_sessions.py +313 -0
- ninja_mcp-1.0.3/src/ninja_coder/tools.py +949 -0
- ninja_mcp-1.0.3/src/ninja_coder/tools.py.backup +1156 -0
- ninja_mcp-1.0.3/src/ninja_coder/worktree.py +557 -0
- ninja_mcp-1.0.3/src/ninja_common/__init__.py +38 -0
- ninja_mcp-1.0.3/src/ninja_common/config_cli.py +944 -0
- ninja_mcp-1.0.3/src/ninja_common/config_manager.py +373 -0
- ninja_mcp-1.0.3/src/ninja_common/daemon.py +941 -0
- ninja_mcp-1.0.3/src/ninja_common/defaults.py +629 -0
- ninja_mcp-1.0.3/src/ninja_common/hooks_base.py +168 -0
- ninja_mcp-1.0.3/src/ninja_common/init_cli.py +277 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/__init__.py +1 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/_common.py +76 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/_json_target.py +214 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/antigravity.py +18 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/claude_code.py +160 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/codex.py +154 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/cursor.py +44 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/generic.py +45 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/kiro.py +18 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/roo_code.py +18 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/vscode_cline.py +18 -0
- ninja_mcp-1.0.3/src/ninja_common/init_targets/windsurf.py +18 -0
- ninja_mcp-1.0.3/src/ninja_common/logging_utils.py +279 -0
- ninja_mcp-1.0.3/src/ninja_common/metrics.py +469 -0
- ninja_mcp-1.0.3/src/ninja_common/ninja_cli.py +202 -0
- ninja_mcp-1.0.3/src/ninja_common/path_utils.py +258 -0
- ninja_mcp-1.0.3/src/ninja_common/rate_balancer.py +372 -0
- ninja_mcp-1.0.3/src/ninja_common/security.py +572 -0
- ninja_mcp-1.0.3/src/ninja_common/skill_cli.py +269 -0
- ninja_mcp-1.0.3/src/ninja_common/skill_packager.py +393 -0
- ninja_mcp-1.0.3/src/ninja_common/structured_logger.py +411 -0
- ninja_mcp-1.0.3/src/ninja_common/update_cli.py +64 -0
- ninja_mcp-1.0.3/src/ninja_common/version_tracker.py +177 -0
- ninja_mcp-1.0.3/src/ninja_config/__init__.py +62 -0
- ninja_mcp-1.0.3/src/ninja_config/auto_updater.py +511 -0
- ninja_mcp-1.0.3/src/ninja_config/config_loader.py +261 -0
- ninja_mcp-1.0.3/src/ninja_config/config_migrator.py +667 -0
- ninja_mcp-1.0.3/src/ninja_config/config_schema.py +738 -0
- ninja_mcp-1.0.3/src/ninja_config/config_shared.py +376 -0
- ninja_mcp-1.0.3/src/ninja_config/configurator.py +573 -0
- ninja_mcp-1.0.3/src/ninja_config/credentials.py +792 -0
- ninja_mcp-1.0.3/src/ninja_config/docker_installer.py +227 -0
- ninja_mcp-1.0.3/src/ninja_config/interactive_configurator.py +1820 -0
- ninja_mcp-1.0.3/src/ninja_config/interactive_configurator.py.backup +1825 -0
- ninja_mcp-1.0.3/src/ninja_config/litellm.py +137 -0
- ninja_mcp-1.0.3/src/ninja_config/menuconfig_tui.py +332 -0
- ninja_mcp-1.0.3/src/ninja_config/model_selector.py +1472 -0
- ninja_mcp-1.0.3/src/ninja_config/modern_tui.py +1286 -0
- ninja_mcp-1.0.3/src/ninja_config/opencode_integration.py +462 -0
- ninja_mcp-1.0.3/src/ninja_config/secrets_store.py +291 -0
- ninja_mcp-1.0.3/src/ninja_config/settings_registry.py +377 -0
- ninja_mcp-1.0.3/src/ninja_config/tui_installer.py +511 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/__init__.py +118 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/base.py +126 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/component_setup.py +483 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/main_menu.py +189 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/model_autocomplete.py +479 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/model_cache.py +131 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/model_selector.py +654 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/operator_config.py +439 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/settings.py +442 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/theme.py +115 -0
- ninja_mcp-1.0.3/src/ninja_config/ui/theme.tcss +311 -0
- ninja_mcp-1.0.3/src/ninja_researcher/__init__.py +38 -0
- ninja_mcp-1.0.3/src/ninja_researcher/models.py +149 -0
- ninja_mcp-1.0.3/src/ninja_researcher/search_providers.py +359 -0
- ninja_mcp-1.0.3/src/ninja_researcher/server.py +442 -0
- ninja_mcp-1.0.3/src/ninja_researcher/tools.py +606 -0
- ninja_mcp-1.0.3/src/ninja_secretary/__init__.py +44 -0
- ninja_mcp-1.0.3/src/ninja_secretary/hooks_cli.py +301 -0
- ninja_mcp-1.0.3/src/ninja_secretary/models.py +273 -0
- ninja_mcp-1.0.3/src/ninja_secretary/server.py +334 -0
- ninja_mcp-1.0.3/src/ninja_secretary/tests/test_git_models.py +414 -0
- ninja_mcp-1.0.3/src/ninja_secretary/tests/test_git_tools.py +585 -0
- ninja_mcp-1.0.3/src/ninja_secretary/tests/test_models_smart_commit.py +374 -0
- ninja_mcp-1.0.3/src/ninja_secretary/tests/test_smart_commit.py +393 -0
- ninja_mcp-1.0.3/src/ninja_secretary/tools.py +815 -0
- ninja_mcp-1.0.3/test.txt +1 -0
- ninja_mcp-1.0.3/test_api_v2.py +13 -0
- ninja_mcp-1.0.3/test_final_haiku.py +19 -0
- ninja_mcp-1.0.3/test_models_v2.py +14 -0
- ninja_mcp-1.0.3/test_ninja_refactored.py +2 -0
- ninja_mcp-1.0.3/test_output/EXECUTION_SUMMARY.txt +359 -0
- ninja_mcp-1.0.3/test_output/INDEX.md +391 -0
- ninja_mcp-1.0.3/test_output/QUICK_REFERENCE.md +267 -0
- ninja_mcp-1.0.3/test_output/START_HERE.md +315 -0
- ninja_mcp-1.0.3/test_output/SUMMARY.txt +236 -0
- ninja_mcp-1.0.3/test_output/TEST_REPORT.md +406 -0
- ninja_mcp-1.0.3/test_output/TEST_RESULTS.md +69 -0
- ninja_mcp-1.0.3/test_output/config_helper.py +32 -0
- ninja_mcp-1.0.3/test_output/full_test/README.md +145 -0
- ninja_mcp-1.0.3/test_output/full_test/test_parallel_collections.py +55 -0
- ninja_mcp-1.0.3/test_output/full_test/test_parallel_math.py +39 -0
- ninja_mcp-1.0.3/test_output/full_test/test_parallel_string.py +45 -0
- ninja_mcp-1.0.3/test_output/full_test/test_sequential_step1.py +28 -0
- ninja_mcp-1.0.3/test_output/full_test/test_sequential_step2.py +42 -0
- ninja_mcp-1.0.3/test_output/full_test/test_sequential_step3.py +54 -0
- ninja_mcp-1.0.3/test_output/full_test/test_simple_task.py +91 -0
- ninja_mcp-1.0.3/test_output/math_helper.py +13 -0
- ninja_mcp-1.0.3/test_output/string_utils.py +26 -0
- ninja_mcp-1.0.3/test_output/success_test.py +2 -0
- ninja_mcp-1.0.3/test_output/test_combined.py +1 -0
- ninja_mcp-1.0.3/test_output/test_integration.py +36 -0
- ninja_mcp-1.0.3/test_output/test_utils.py +6 -0
- ninja_mcp-1.0.3/test_output/test_utils_module.py +50 -0
- ninja_mcp-1.0.3/test_output/test_validators_module.py +29 -0
- ninja_mcp-1.0.3/test_output/tool_verification/FINAL_SUMMARY.txt +115 -0
- ninja_mcp-1.0.3/test_output/tool_verification/QUICK_SUMMARY.txt +100 -0
- ninja_mcp-1.0.3/test_output/tool_verification/README.md +169 -0
- ninja_mcp-1.0.3/test_output/tool_verification/VERIFICATION_REPORT.md +226 -0
- ninja_mcp-1.0.3/test_output/tool_verification/direct_test.py +128 -0
- ninja_mcp-1.0.3/test_output/tool_verification/test_all_tools.py +172 -0
- ninja_mcp-1.0.3/test_output/tool_verification/verify_tools.py +170 -0
- ninja_mcp-1.0.3/test_output/utils.py +24 -0
- ninja_mcp-1.0.3/test_output/validators.py +11 -0
- ninja_mcp-1.0.3/test_output/victory.py +73 -0
- ninja_mcp-1.0.3/test_refactor_v2.py +2 -0
- ninja_mcp-1.0.3/test_services_v2.py +15 -0
- ninja_mcp-1.0.3/tests/README.md +153 -0
- ninja_mcp-1.0.3/tests/__init__.py +1 -0
- ninja_mcp-1.0.3/tests/conftest.py +145 -0
- ninja_mcp-1.0.3/tests/integration/__init__.py +1 -0
- ninja_mcp-1.0.3/tests/integration/test_parallel_execution.py +515 -0
- ninja_mcp-1.0.3/tests/legacy/README.md +29 -0
- ninja_mcp-1.0.3/tests/legacy/conftest.py +16 -0
- ninja_mcp-1.0.3/tests/legacy/test_cli_adapter.py +225 -0
- ninja_mcp-1.0.3/tests/legacy/test_e2e.py +219 -0
- ninja_mcp-1.0.3/tests/legacy/test_integration_aider.py +145 -0
- ninja_mcp-1.0.3/tests/legacy/test_integration_claude.py +258 -0
- ninja_mcp-1.0.3/tests/legacy/test_integration_openrouter.py +182 -0
- ninja_mcp-1.0.3/tests/legacy/test_metrics.py +395 -0
- ninja_mcp-1.0.3/tests/legacy/test_models.py +227 -0
- ninja_mcp-1.0.3/tests/legacy/test_paths.py +172 -0
- ninja_mcp-1.0.3/tests/legacy/test_qwen_driver.py +338 -0
- ninja_mcp-1.0.3/tests/legacy/test_security.py +337 -0
- ninja_mcp-1.0.3/tests/legacy/test_tools.py +333 -0
- ninja_mcp-1.0.3/tests/researcher/__init__.py +1 -0
- ninja_mcp-1.0.3/tests/researcher/test_search_providers.py +121 -0
- ninja_mcp-1.0.3/tests/test_activity_timeout.py +638 -0
- ninja_mcp-1.0.3/tests/test_agent.py +136 -0
- ninja_mcp-1.0.3/tests/test_agent_cli.py +196 -0
- ninja_mcp-1.0.3/tests/test_auto_updater.py +135 -0
- ninja_mcp-1.0.3/tests/test_calculator.py +9 -0
- ninja_mcp-1.0.3/tests/test_calculator_tests.py +17 -0
- ninja_mcp-1.0.3/tests/test_coder/__init__.py +1 -0
- ninja_mcp-1.0.3/tests/test_coder/test_coder_smoke.py +374 -0
- ninja_mcp-1.0.3/tests/test_coder/test_daemon.py +438 -0
- ninja_mcp-1.0.3/tests/test_coder/test_daemon_integration.py +102 -0
- ninja_mcp-1.0.3/tests/test_coder/test_driver_unit.py +373 -0
- ninja_mcp-1.0.3/tests/test_coder/test_eval.py +588 -0
- ninja_mcp-1.0.3/tests/test_coder/test_opencode_e2e.py +323 -0
- ninja_mcp-1.0.3/tests/test_coder/test_opencode_strategy.py +204 -0
- ninja_mcp-1.0.3/tests/test_coder/test_parallel_complexity.py +115 -0
- ninja_mcp-1.0.3/tests/test_coder/test_sequential_execution.py +677 -0
- ninja_mcp-1.0.3/tests/test_coder/test_tools_unit.py +116 -0
- ninja_mcp-1.0.3/tests/test_common/__init__.py +1 -0
- ninja_mcp-1.0.3/tests/test_common/test_config_manager.py +254 -0
- ninja_mcp-1.0.3/tests/test_common/test_config_shared.py +440 -0
- ninja_mcp-1.0.3/tests/test_common/test_credentials.py +477 -0
- ninja_mcp-1.0.3/tests/test_common/test_daemon_module_config.py +70 -0
- ninja_mcp-1.0.3/tests/test_common/test_deduplicator.py +182 -0
- ninja_mcp-1.0.3/tests/test_common/test_defaults.py +126 -0
- ninja_mcp-1.0.3/tests/test_common/test_opencode_integration.py +584 -0
- ninja_mcp-1.0.3/tests/test_common/test_tui_installer.py +620 -0
- ninja_mcp-1.0.3/tests/test_config_manager_migration.py +372 -0
- ninja_mcp-1.0.3/tests/test_container_config.py +104 -0
- ninja_mcp-1.0.3/tests/test_corruption_fix.py +135 -0
- ninja_mcp-1.0.3/tests/test_docker_installer.py +204 -0
- ninja_mcp-1.0.3/tests/test_driver.py +849 -0
- ninja_mcp-1.0.3/tests/test_dynamic_model_selector.py +106 -0
- ninja_mcp-1.0.3/tests/test_final_haiku.py +71 -0
- ninja_mcp-1.0.3/tests/test_final_par2.py +107 -0
- ninja_mcp-1.0.3/tests/test_final_seq.py +102 -0
- ninja_mcp-1.0.3/tests/test_final_simple.py +176 -0
- ninja_mcp-1.0.3/tests/test_hello.py +12 -0
- ninja_mcp-1.0.3/tests/test_hello_functional.py +12 -0
- ninja_mcp-1.0.3/tests/test_hello_proper.py +12 -0
- ninja_mcp-1.0.3/tests/test_hello_script.py +12 -0
- ninja_mcp-1.0.3/tests/test_hello_simple.py +9 -0
- ninja_mcp-1.0.3/tests/test_hooks/test_coder_hooks.py +478 -0
- ninja_mcp-1.0.3/tests/test_hooks/test_hooks_base.py +338 -0
- ninja_mcp-1.0.3/tests/test_hooks/test_secretary_hooks.py +302 -0
- ninja_mcp-1.0.3/tests/test_hooks_cli.py +278 -0
- ninja_mcp-1.0.3/tests/test_init_cli.py +529 -0
- ninja_mcp-1.0.3/tests/test_integration.py +378 -0
- ninja_mcp-1.0.3/tests/test_junie_strategy.py +143 -0
- ninja_mcp-1.0.3/tests/test_litellm.py +76 -0
- ninja_mcp-1.0.3/tests/test_logging_integration.py +226 -0
- ninja_mcp-1.0.3/tests/test_mcp_timeout_integration.py +326 -0
- ninja_mcp-1.0.3/tests/test_mcp_works.py +118 -0
- ninja_mcp-1.0.3/tests/test_model_selector.py +264 -0
- ninja_mcp-1.0.3/tests/test_modern_tui_api_keys.py +18 -0
- ninja_mcp-1.0.3/tests/test_modern_tui_modules.py +60 -0
- ninja_mcp-1.0.3/tests/test_multi_agent.py +320 -0
- ninja_mcp-1.0.3/tests/test_ninja_fixed.py +122 -0
- ninja_mcp-1.0.3/tests/test_opencode_server_pool.py +252 -0
- ninja_mcp-1.0.3/tests/test_parallel_strings.py +5 -0
- ninja_mcp-1.0.3/tests/test_prompt_builder.py +905 -0
- ninja_mcp-1.0.3/tests/test_real_ninja_integration.py +384 -0
- ninja_mcp-1.0.3/tests/test_researcher/__init__.py +0 -0
- ninja_mcp-1.0.3/tests/test_researcher/test_eval.py +668 -0
- ninja_mcp-1.0.3/tests/test_researcher/test_researcher_integration.py +489 -0
- ninja_mcp-1.0.3/tests/test_researcher/test_search_providers.py +322 -0
- ninja_mcp-1.0.3/tests/test_researcher/test_tools.py +422 -0
- ninja_mcp-1.0.3/tests/test_researcher_fixes.py +165 -0
- ninja_mcp-1.0.3/tests/test_result_parser.py +873 -0
- ninja_mcp-1.0.3/tests/test_safety.py +309 -0
- ninja_mcp-1.0.3/tests/test_secretary/__init__.py +0 -0
- ninja_mcp-1.0.3/tests/test_secretary/test_secretary_integration.py.bak +601 -0
- ninja_mcp-1.0.3/tests/test_secretary/test_tools.py +482 -0
- ninja_mcp-1.0.3/tests/test_secretary_fixes.py +180 -0
- ninja_mcp-1.0.3/tests/test_secrets_panel.py +365 -0
- ninja_mcp-1.0.3/tests/test_secrets_store.py +279 -0
- ninja_mcp-1.0.3/tests/test_sequential_hanging_fix.py +321 -0
- ninja_mcp-1.0.3/tests/test_sessions.py +230 -0
- ninja_mcp-1.0.3/tests/test_skill/__init__.py +1 -0
- ninja_mcp-1.0.3/tests/test_skill/test_skill_cli.py +571 -0
- ninja_mcp-1.0.3/tests/test_skill/test_skill_packager.py +677 -0
- ninja_mcp-1.0.3/tests/test_smoke.py +143 -0
- ninja_mcp-1.0.3/tests/test_strategies.py +875 -0
- ninja_mcp-1.0.3/tests/test_structured_logger.py +534 -0
- ninja_mcp-1.0.3/tests/test_test_parallel_1.py +28 -0
- ninja_mcp-1.0.3/tests/test_timeout_defaults.py +128 -0
- ninja_mcp-1.0.3/tests/test_ui_integration.py +312 -0
- ninja_mcp-1.0.3/tests/test_ui_refactoring.py +119 -0
- ninja_mcp-1.0.3/tests/test_update_cli.py +31 -0
- ninja_mcp-1.0.3/tests/test_validator.py +173 -0
- ninja_mcp-1.0.3/tests/test_works.py +56 -0
- ninja_mcp-1.0.3/tests/test_worktree.py +573 -0
- ninja_mcp-1.0.3/training/losses/vea_qp_alignment.py +456 -0
- ninja_mcp-1.0.3/training/models/vea/qp_injection.py +248 -0
- ninja_mcp-1.0.3/training/tests/test_vea_qp_alignment.py +304 -0
- ninja_mcp-1.0.3/utils.py +2 -0
- ninja_mcp-1.0.3/uv.lock +4137 -0
- ninja_mcp-1.0.3/verify_migration.py +174 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# ARCHITECT.md - Architecture Style Guide
|
|
2
|
+
|
|
3
|
+
This document defines the architectural patterns, principles, and standards for autonomous development.
|
|
4
|
+
|
|
5
|
+
## Core Architecture: Hexagonal Architecture
|
|
6
|
+
|
|
7
|
+
All code must follow Hexagonal (Ports and Adapters) Architecture principles.
|
|
8
|
+
|
|
9
|
+
### Layers
|
|
10
|
+
|
|
11
|
+
1. **Domain Layer** (Innermost)
|
|
12
|
+
- Pure business logic
|
|
13
|
+
- No external dependencies
|
|
14
|
+
- No framework-specific code
|
|
15
|
+
- Domain models and entities
|
|
16
|
+
- Use cases / application services
|
|
17
|
+
|
|
18
|
+
2. **Application Layer**
|
|
19
|
+
- Orchestrates domain use cases
|
|
20
|
+
- Defines ports (interfaces)
|
|
21
|
+
- Implements application services
|
|
22
|
+
- No infrastructure dependencies
|
|
23
|
+
|
|
24
|
+
3. **Infrastructure Layer** (Outermost)
|
|
25
|
+
- Implements ports defined in Application layer
|
|
26
|
+
- External dependencies (databases, APIs, file system)
|
|
27
|
+
- Framework-specific code
|
|
28
|
+
- Adapters and drivers
|
|
29
|
+
|
|
30
|
+
### Directory Structure (Example)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
src/
|
|
34
|
+
├── my_module/
|
|
35
|
+
│ ├── domain/
|
|
36
|
+
│ │ ├── models/
|
|
37
|
+
│ │ ├── entities/
|
|
38
|
+
│ │ └── value_objects/
|
|
39
|
+
│ ├── application/
|
|
40
|
+
│ │ ├── ports/ # Interfaces
|
|
41
|
+
│ │ ├── services/ # Use cases
|
|
42
|
+
│ │ └── dtos/
|
|
43
|
+
│ └── infrastructure/
|
|
44
|
+
│ ├── adapters/ # Port implementations
|
|
45
|
+
│ ├── repositories/ # Data access
|
|
46
|
+
│ └── external/ # External API clients
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Dependency Injection (DI)
|
|
50
|
+
|
|
51
|
+
**MANDATORY:** All dependencies must be injected. Never instantiate dependencies directly.
|
|
52
|
+
|
|
53
|
+
### Principles
|
|
54
|
+
|
|
55
|
+
1. **Constructor Injection**
|
|
56
|
+
```python
|
|
57
|
+
# ✅ CORRECT
|
|
58
|
+
class UserService:
|
|
59
|
+
def __init__(self, user_repository: UserRepository):
|
|
60
|
+
self._user_repository = user_repository
|
|
61
|
+
|
|
62
|
+
# ❌ WRONG
|
|
63
|
+
class UserService:
|
|
64
|
+
def __init__(self):
|
|
65
|
+
self._user_repository = UserRepository()
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
2. **Interface-Based Dependencies**
|
|
69
|
+
```python
|
|
70
|
+
# ✅ CORRECT - Depend on abstractions
|
|
71
|
+
class UserService:
|
|
72
|
+
def __init__(self, user_repository: UserRepositoryInterface):
|
|
73
|
+
self._user_repository = user_repository
|
|
74
|
+
|
|
75
|
+
# ❌ WRONG - Depend on concretions
|
|
76
|
+
class UserService:
|
|
77
|
+
def __init__(self, user_repository: PostgresUserRepository):
|
|
78
|
+
self._user_repository = user_repository
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
3. **No Service Locator Pattern**
|
|
82
|
+
```python
|
|
83
|
+
# ❌ WRONG - Don't fetch dependencies
|
|
84
|
+
class UserService:
|
|
85
|
+
def __init__(self):
|
|
86
|
+
self._user_repository = ServiceLocator.get(UserRepository)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### DI Container Pattern
|
|
90
|
+
|
|
91
|
+
Use a simple DI container or factory pattern:
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
class Container:
|
|
95
|
+
@staticmethod
|
|
96
|
+
def create_user_service() -> UserService:
|
|
97
|
+
return UserService(
|
|
98
|
+
user_repository=Container.create_user_repository()
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
@staticmethod
|
|
102
|
+
def create_user_repository() -> UserRepositoryInterface:
|
|
103
|
+
return PostgresUserRepository(db_connection=Container.get_db_connection())
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Type Safety
|
|
107
|
+
|
|
108
|
+
**MANDATORY:** All code must be fully typed. No `Any` types, no `# type: ignore` comments.
|
|
109
|
+
|
|
110
|
+
### Principles
|
|
111
|
+
|
|
112
|
+
1. **Full Type Coverage**
|
|
113
|
+
```python
|
|
114
|
+
# ✅ CORRECT
|
|
115
|
+
def process_user(user_id: str, options: dict[str, int]) -> Result[User, Error]:
|
|
116
|
+
...
|
|
117
|
+
|
|
118
|
+
# ❌ WRONG
|
|
119
|
+
def process_user(user_id, options):
|
|
120
|
+
...
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
2. **Use Pydantic Models**
|
|
124
|
+
```python
|
|
125
|
+
# ✅ CORRECT
|
|
126
|
+
class UserCreateRequest(BaseModel):
|
|
127
|
+
name: str
|
|
128
|
+
email: EmailStr
|
|
129
|
+
age: Annotated[int, Field(ge=0, le=120)]
|
|
130
|
+
|
|
131
|
+
# ❌ WRONG
|
|
132
|
+
def create_user(name, email, age):
|
|
133
|
+
...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
3. **No Any Types**
|
|
137
|
+
```python
|
|
138
|
+
# ❌ WRONG
|
|
139
|
+
def process(data: Any) -> Any:
|
|
140
|
+
...
|
|
141
|
+
|
|
142
|
+
# ❌ WRONG
|
|
143
|
+
def process(data: dict) -> dict:
|
|
144
|
+
...
|
|
145
|
+
|
|
146
|
+
# ✅ CORRECT
|
|
147
|
+
def process(data: dict[str, int]) -> dict[str, str]:
|
|
148
|
+
...
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
4. **Strict Type Checking**
|
|
152
|
+
```python
|
|
153
|
+
# mypy.ini
|
|
154
|
+
[mypy]
|
|
155
|
+
strict = True
|
|
156
|
+
warn_return_any = True
|
|
157
|
+
warn_unused_configs = True
|
|
158
|
+
disallow_untyped_defs = True
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Banned Patterns
|
|
162
|
+
|
|
163
|
+
### 1. Direct Database Access in Domain Layer
|
|
164
|
+
```python
|
|
165
|
+
# ❌ WRONG - Domain layer with infrastructure
|
|
166
|
+
class User:
|
|
167
|
+
def save(self):
|
|
168
|
+
db.execute("INSERT INTO users ...")
|
|
169
|
+
|
|
170
|
+
# ✅ CORRECT - Infrastructure handles persistence
|
|
171
|
+
class UserRepositoryInterface:
|
|
172
|
+
def save(self, user: User) -> None:
|
|
173
|
+
...
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 2. Singleton Pattern
|
|
177
|
+
```python
|
|
178
|
+
# ❌ WRONG
|
|
179
|
+
class DatabaseConnection:
|
|
180
|
+
_instance = None
|
|
181
|
+
|
|
182
|
+
def __new__(cls):
|
|
183
|
+
if not cls._instance:
|
|
184
|
+
cls._instance = super().__new__(cls)
|
|
185
|
+
return cls._instance
|
|
186
|
+
|
|
187
|
+
# ✅ CORRECT - Inject dependencies
|
|
188
|
+
class UserService:
|
|
189
|
+
def __init__(self, db_connection: DatabaseConnection):
|
|
190
|
+
self._db = db_connection
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 3. Global State
|
|
194
|
+
```python
|
|
195
|
+
# ❌ WRONG
|
|
196
|
+
current_user = None
|
|
197
|
+
|
|
198
|
+
def set_user(user):
|
|
199
|
+
global current_user
|
|
200
|
+
current_user = user
|
|
201
|
+
|
|
202
|
+
# ✅ CORRECT - Pass as parameter
|
|
203
|
+
def process_with_user(user: User, data: Data):
|
|
204
|
+
...
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 4. God Classes
|
|
208
|
+
```python
|
|
209
|
+
# ❌ WRONG - Too many responsibilities
|
|
210
|
+
class System:
|
|
211
|
+
def handle_database(self): ...
|
|
212
|
+
def handle_api(self): ...
|
|
213
|
+
def handle_auth(self): ...
|
|
214
|
+
def handle_ui(self): ...
|
|
215
|
+
|
|
216
|
+
# ✅ CORRECT - Single responsibility
|
|
217
|
+
class DatabaseService: ...
|
|
218
|
+
class ApiService: ...
|
|
219
|
+
class AuthService: ...
|
|
220
|
+
class UIService: ...
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 5. Tight Coupling
|
|
224
|
+
```python
|
|
225
|
+
# ❌ WRONG - Concrete dependencies
|
|
226
|
+
class OrderService:
|
|
227
|
+
def __init__(self):
|
|
228
|
+
self._payment_gateway = StripePaymentGateway(api_key="...")
|
|
229
|
+
self._email_service = SendGridService(api_key="...")
|
|
230
|
+
self._db = PostgresDatabase(host="...")
|
|
231
|
+
|
|
232
|
+
# ✅ CORRECT - Interface-based DI
|
|
233
|
+
class OrderService:
|
|
234
|
+
def __init__(
|
|
235
|
+
self,
|
|
236
|
+
payment_gateway: PaymentGatewayInterface,
|
|
237
|
+
email_service: EmailServiceInterface,
|
|
238
|
+
database: DatabaseInterface,
|
|
239
|
+
):
|
|
240
|
+
self._payment_gateway = payment_gateway
|
|
241
|
+
self._email_service = email_service
|
|
242
|
+
self._database = database
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Code Quality Standards
|
|
246
|
+
|
|
247
|
+
### Linting
|
|
248
|
+
- Use `ruff` for linting
|
|
249
|
+
- No linting errors allowed
|
|
250
|
+
- Configuration in `ruff.toml`
|
|
251
|
+
|
|
252
|
+
### Type Checking
|
|
253
|
+
- Use `mypy` for type checking
|
|
254
|
+
- Strict mode enabled
|
|
255
|
+
- All errors must be resolved before commit
|
|
256
|
+
|
|
257
|
+
### Documentation
|
|
258
|
+
- All public functions must have docstrings
|
|
259
|
+
- Use Google-style docstrings
|
|
260
|
+
- Document complex algorithms
|
|
261
|
+
|
|
262
|
+
### Testing
|
|
263
|
+
- All changes must be covered by tests
|
|
264
|
+
- Test coverage > 80%
|
|
265
|
+
- Use pytest for testing
|
|
266
|
+
|
|
267
|
+
## Review Criteria
|
|
268
|
+
|
|
269
|
+
All code must pass these architectural gates:
|
|
270
|
+
|
|
271
|
+
1. **Isolation** - Domain logic independent of external concerns
|
|
272
|
+
2. **Dependency Injection** - All dependencies injected, not instantiated
|
|
273
|
+
3. **Type Safety** - Full type coverage, no `Any` or `ignore` comments
|
|
274
|
+
4. **Single Responsibility** - Each class/function has one clear purpose
|
|
275
|
+
5. **Interface Segregation** - Dependencies are interfaces, not concretions
|
|
276
|
+
6. **No Circular Dependencies** - Clean dependency graph
|
|
277
|
+
7. **Clear Layer Boundaries** - No layer violations
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
**Remember:** Adhere to these principles for maintainable, testable, and scalable code.
|