gdmcode 0.1.10__tar.gz → 0.1.11__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.
- {gdmcode-0.1.10 → gdmcode-0.1.11}/PKG-INFO +1 -1
- gdmcode-0.1.11/gdmcode/__init__.py +1 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/mcp_server.py +1 -1
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/permissions.py +38 -7
- {gdmcode-0.1.10 → gdmcode-0.1.11}/pyproject.toml +1 -1
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_permissions.py +22 -0
- gdmcode-0.1.10/gdmcode/__init__.py +0 -1
- {gdmcode-0.1.10 → gdmcode-0.1.11}/.gitignore +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/CONTRIBUTING.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/README.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/config.toml +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/agentic-runtime-audit.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/architecture.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/cli-reference.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/configuration.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/deployment.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/plugin-guide.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/quick-start.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/security-hardening.md +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/_internal/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/_internal/constants.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/_internal/domain_skills.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/commit_classifier.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/context_budget.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/daemon.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/dag_validator.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/debug_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/impact_analyzer.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/impact_graph.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/orchestrator.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/regression_guard.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/review_gate.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/risk_scorer.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/self_healing.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/smart_test_selector.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/system_prompt.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/task_tracker.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/test_validator.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/tool_orchestrator.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/transcript.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/verification_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/work_director.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/worktree_manager.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/artifacts/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/artifacts/artifact_store.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/artifacts/verification_graph.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/auth.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/cli.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/commands.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/config.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/cost_tracker.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/db/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/db/migrations.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/audit_log.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/identity.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/rbac.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/team_config.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/usage_analytics.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/exceptions.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/git_workflow.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/github_actions.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/sentry_integration.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/sentry_server.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/webhook_security.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/intent_router.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/main.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/code_index.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/compressor.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/context_memory.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/continuous_memory.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/conventions.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/db.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/document_index.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/file_cache.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/project_scanner.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/session_store.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/client.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/definitions.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/router.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/schemas.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/command_filter.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/models.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/permission_handler.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/phone_ui.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/protocol.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/qr.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/server.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/token_manager.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/tunnel.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/repl.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/runtime/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/runtime/branch_farm.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/runtime/replay.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sandbox/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sandbox/hermetic.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sandbox/policy.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/plugin_base.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/plugin_host.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/plugin_loader.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/security.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/bridge.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/bridge_cli.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/bridge_client.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/protocol_version.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/event_fanout.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/input_broker.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/permission_bridge.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/_atomic.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/agent_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/ask_user_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/bash_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/browser_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/browser_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/dep_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/document_reader.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/document_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/document_writer.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/impact_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/playwright_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/quality_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/read_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/result_cache.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/search_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/shell_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/write_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/audio_capture.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/audio_playback.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/errors.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/models.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/providers.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/vad.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/voice_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/proxy/Dockerfile +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/proxy/main.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/proxy/requirements.txt +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/remote/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/remote/test_remote_server.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_agent_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_agent_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_api_fallback.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_artifact_store.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_audit_log.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_auth.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_auto_quality.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_autonomy_levels.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_bash_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_batch_api.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_branch_farm.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_bridge.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_bridge_smoke.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_browser_tool_smoke.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_browser_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_btw_queue.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_budget_tracker.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_chrome_extension.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_ci_runner.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_cli_smoke.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_code_index.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_commands.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_compression.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_confidence.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_config.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_continuous_memory.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_convention_drift.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_cost_tracker.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_daemon.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_daemon_stability.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_daemon_watchdog.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_db.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_debate.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_debug_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_debug_loop_smoke.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_dep_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_doctor.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_index.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_reader.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_writer.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_domain_skills.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_eval_harness.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_event_log.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_failure_taxonomy.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_file_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_git_workflow.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_github_actions.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_health.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_hermetic_sandbox.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_identity_rbac.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_analysis.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_analyzer.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_graph.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_injection_gate.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_intent_router.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_leaderboard.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_local_models.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_loop_p3.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_mcp_server.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_memory.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_migrations.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_mock_provider.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_model_config.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_orchestrator.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_package.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_phase2_modules.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_phone_ui.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_playwright_tool.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_plugin_sdk.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_protocol_version.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_provenance.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_proxy_server.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_quality_integration.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_reasoning_toggle.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_redaction.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_regression_collector.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_regression_guard_integration.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_regression_runner.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_repl_smoke.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_replay.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_resilience.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_result_cache.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_review_gate_expanded.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_risk_scorer.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_rollback.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_router.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_router_compressor_conventions.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_router_escalation.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_sandbox.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_scoring.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_search_tools.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_self_healing.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_semantic_edit.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_sentry_integration.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_session_checkpoint.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_session_controller.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_session_restore.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_signal_handling.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_swebench_adapter.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_swebench_runner.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_system_prompt.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_team_config.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tool_cache.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tool_orchestrator.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tool_timeout.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tools_registry.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tunnel_qr.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_usage_analytics.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_verification_graph.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_verification_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_voice_loop.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_voice_providers.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_whole_codebase.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_work_director.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/voice/__init__.py +0 -0
- {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/voice/test_audio_foundation.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.11"
|
|
@@ -51,7 +51,7 @@ _INTERNAL_ERROR = -32603
|
|
|
51
51
|
class MCPServer:
|
|
52
52
|
"""Minimal MCP server with stdio transport."""
|
|
53
53
|
|
|
54
|
-
def __init__(self, name: str = "gdmcode", version: str = "0.1.
|
|
54
|
+
def __init__(self, name: str = "gdmcode", version: str = "0.1.11") -> None:
|
|
55
55
|
self._name = name
|
|
56
56
|
self._version = version
|
|
57
57
|
self._tools: dict[str, MCPTool] = {}
|
|
@@ -14,6 +14,7 @@ Decision hierarchy (first match wins):
|
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
16
|
import logging
|
|
17
|
+
import sys
|
|
17
18
|
from dataclasses import dataclass, field
|
|
18
19
|
from enum import StrEnum
|
|
19
20
|
from typing import TYPE_CHECKING
|
|
@@ -61,6 +62,40 @@ log = logging.getLogger(__name__)
|
|
|
61
62
|
_active_bridge: "PermissionBridge | None" = None
|
|
62
63
|
|
|
63
64
|
|
|
65
|
+
def _read_permission_choice() -> str:
|
|
66
|
+
"""Read a permission choice using plain stdin/stdout.
|
|
67
|
+
|
|
68
|
+
Rich/Prompt.ask can interact poorly with active terminal renderers on some
|
|
69
|
+
Windows shells. A simple flushed line prompt keeps the approval input
|
|
70
|
+
editable and visible.
|
|
71
|
+
"""
|
|
72
|
+
valid = {
|
|
73
|
+
"": "y",
|
|
74
|
+
"y": "y",
|
|
75
|
+
"yes": "y",
|
|
76
|
+
"n": "n",
|
|
77
|
+
"no": "n",
|
|
78
|
+
"s": "session",
|
|
79
|
+
"session": "session",
|
|
80
|
+
"a": "always",
|
|
81
|
+
"always": "always",
|
|
82
|
+
"v": "never",
|
|
83
|
+
"never": "never",
|
|
84
|
+
}
|
|
85
|
+
prompt = "Allow? type y/n/session/always/never and press Enter [y]: "
|
|
86
|
+
while True:
|
|
87
|
+
sys.stdout.write(prompt)
|
|
88
|
+
sys.stdout.flush()
|
|
89
|
+
line = sys.stdin.readline()
|
|
90
|
+
if line == "":
|
|
91
|
+
return "n"
|
|
92
|
+
choice = valid.get(line.strip().lower())
|
|
93
|
+
if choice is not None:
|
|
94
|
+
return choice
|
|
95
|
+
sys.stdout.write("Please enter y, n, session, always, or never.\n")
|
|
96
|
+
sys.stdout.flush()
|
|
97
|
+
|
|
98
|
+
|
|
64
99
|
def set_permission_bridge(bridge: "PermissionBridge") -> None:
|
|
65
100
|
"""Activate a PermissionBridge so _prompt_user() delegates to it."""
|
|
66
101
|
global _active_bridge
|
|
@@ -250,9 +285,9 @@ class PermissionContext:
|
|
|
250
285
|
self._session_allow = self._session_allow | {tool}
|
|
251
286
|
return Decision.ALLOW_SESSION
|
|
252
287
|
|
|
253
|
-
# Rich
|
|
288
|
+
# Rich output only; use plain stdin for the actual answer so terminal
|
|
289
|
+
# input remains editable even after prompt_toolkit/status rendering.
|
|
254
290
|
from rich.console import Console
|
|
255
|
-
from rich.prompt import Prompt
|
|
256
291
|
|
|
257
292
|
console = Console()
|
|
258
293
|
console.print(f"\n[bold yellow]⚠ Permission request[/bold yellow]")
|
|
@@ -261,11 +296,7 @@ class PermissionContext:
|
|
|
261
296
|
import json
|
|
262
297
|
console.print(f"Args: [dim]{json.dumps(args, indent=2)[:400]}[/dim]")
|
|
263
298
|
|
|
264
|
-
choice =
|
|
265
|
-
"Allow?",
|
|
266
|
-
choices=["y", "n", "always", "session", "never"],
|
|
267
|
-
default="y",
|
|
268
|
-
)
|
|
299
|
+
choice = _read_permission_choice()
|
|
269
300
|
|
|
270
301
|
decision_map = {
|
|
271
302
|
"y": Decision.ALLOW_SESSION,
|
|
@@ -104,3 +104,25 @@ def test_non_interactive_denies_unknown(mock_db):
|
|
|
104
104
|
with pytest.raises(ToolPermissionError) as exc_info:
|
|
105
105
|
ctx_ni.check("some_tool", {})
|
|
106
106
|
assert "non-interactive" in str(exc_info.value).lower()
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def test_plain_permission_prompt_accepts_yes(ctx, monkeypatch):
|
|
110
|
+
monkeypatch.setattr("sys.stdin.readline", lambda: "y\n")
|
|
111
|
+
|
|
112
|
+
assert ctx.check("bash", {"command": "ls -F"}) == Decision.ALLOW_SESSION
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_plain_permission_prompt_denies_no(ctx, monkeypatch):
|
|
116
|
+
monkeypatch.setattr("sys.stdin.readline", lambda: "n\n")
|
|
117
|
+
|
|
118
|
+
with pytest.raises(ToolPermissionError) as exc_info:
|
|
119
|
+
ctx.check("bash", {"command": "ls -F"})
|
|
120
|
+
|
|
121
|
+
assert "denied by user" in str(exc_info.value).lower()
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def test_plain_permission_prompt_reprompts_invalid_choice(ctx, monkeypatch):
|
|
125
|
+
choices = iter(["maybe\n", "always\n"])
|
|
126
|
+
monkeypatch.setattr("sys.stdin.readline", lambda: next(choices))
|
|
127
|
+
|
|
128
|
+
assert ctx.check("bash", {"command": "ls -F"}) == Decision.ALLOW_ALWAYS
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.10"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|