gdmcode 0.1.7__tar.gz → 0.1.8__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.7 → gdmcode-0.1.8}/PKG-INFO +1 -1
- gdmcode-0.1.8/gdmcode/__init__.py +1 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/cli.py +4 -3
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/integrations/mcp_server.py +1 -1
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/repl.py +33 -5
- {gdmcode-0.1.7 → gdmcode-0.1.8}/pyproject.toml +1 -1
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_cli_smoke.py +19 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_repl_smoke.py +22 -0
- gdmcode-0.1.7/gdmcode/__init__.py +0 -1
- {gdmcode-0.1.7 → gdmcode-0.1.8}/.gitignore +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/CONTRIBUTING.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/README.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/config.toml +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/agentic-runtime-audit.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/architecture.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/cli-reference.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/configuration.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/deployment.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/plugin-guide.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/quick-start.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/docs/security-hardening.md +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/_internal/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/_internal/constants.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/_internal/domain_skills.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/commit_classifier.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/context_budget.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/daemon.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/dag_validator.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/debug_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/impact_analyzer.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/impact_graph.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/orchestrator.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/regression_guard.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/review_gate.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/risk_scorer.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/self_healing.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/smart_test_selector.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/system_prompt.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/task_tracker.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/test_validator.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/tool_orchestrator.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/transcript.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/verification_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/work_director.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/agent/worktree_manager.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/artifacts/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/artifacts/artifact_store.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/artifacts/verification_graph.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/auth.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/commands.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/config.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/cost_tracker.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/db/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/db/migrations.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/enterprise/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/enterprise/audit_log.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/enterprise/identity.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/enterprise/rbac.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/enterprise/team_config.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/enterprise/usage_analytics.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/exceptions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/git_workflow.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/integrations/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/integrations/github_actions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/integrations/sentry_integration.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/integrations/sentry_server.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/integrations/webhook_security.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/main.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/code_index.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/compressor.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/context_memory.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/continuous_memory.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/conventions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/db.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/document_index.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/file_cache.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/project_scanner.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/memory/session_store.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/models/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/models/client.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/models/definitions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/models/router.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/models/schemas.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/permissions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/command_filter.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/models.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/permission_handler.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/phone_ui.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/protocol.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/qr.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/server.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/token_manager.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/remote/tunnel.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/runtime/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/runtime/branch_farm.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/runtime/replay.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/sandbox/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/sandbox/hermetic.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/sandbox/policy.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/sdk/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/sdk/plugin_base.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/sdk/plugin_host.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/sdk/plugin_loader.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/security.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/server/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/server/bridge.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/server/bridge_cli.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/server/bridge_client.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/server/protocol_version.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/session/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/session/event_fanout.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/session/input_broker.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/session/permission_bridge.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/_atomic.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/agent_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/ask_user_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/bash_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/browser_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/browser_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/dep_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/document_reader.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/document_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/document_writer.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/impact_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/playwright_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/quality_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/read_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/result_cache.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/search_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/shell_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/tools/write_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/audio_capture.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/audio_playback.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/errors.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/models.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/providers.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/vad.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/gdmcode/voice/voice_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/proxy/Dockerfile +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/proxy/main.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/proxy/requirements.txt +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/remote/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/remote/test_remote_server.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_agent_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_agent_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_api_fallback.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_artifact_store.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_audit_log.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_auth.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_auto_quality.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_autonomy_levels.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_bash_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_batch_api.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_branch_farm.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_bridge.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_bridge_smoke.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_browser_tool_smoke.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_browser_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_btw_queue.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_budget_tracker.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_chrome_extension.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_ci_runner.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_code_index.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_commands.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_compression.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_confidence.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_config.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_continuous_memory.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_convention_drift.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_cost_tracker.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_daemon.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_daemon_stability.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_daemon_watchdog.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_db.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_debate.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_debug_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_debug_loop_smoke.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_dep_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_doctor.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_document_index.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_document_reader.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_document_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_document_writer.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_domain_skills.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_eval_harness.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_event_log.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_failure_taxonomy.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_file_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_git_workflow.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_github_actions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_health.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_hermetic_sandbox.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_identity_rbac.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_impact_analysis.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_impact_analyzer.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_impact_graph.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_impact_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_injection_gate.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_leaderboard.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_local_models.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_loop_p3.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_mcp_server.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_memory.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_migrations.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_mock_provider.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_model_config.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_orchestrator.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_package.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_permissions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_phase2_modules.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_phone_ui.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_playwright_tool.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_plugin_sdk.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_protocol_version.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_provenance.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_proxy_server.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_quality_integration.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_reasoning_toggle.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_redaction.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_regression_collector.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_regression_guard_integration.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_regression_runner.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_replay.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_resilience.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_result_cache.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_review_gate_expanded.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_risk_scorer.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_rollback.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_router.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_router_compressor_conventions.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_router_escalation.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_sandbox.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_scoring.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_search_tools.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_self_healing.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_semantic_edit.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_sentry_integration.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_session_checkpoint.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_session_controller.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_session_restore.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_signal_handling.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_swebench_adapter.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_swebench_runner.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_system_prompt.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_team_config.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_tool_cache.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_tool_orchestrator.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_tool_timeout.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_tools_registry.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_tunnel_qr.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_usage_analytics.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_verification_graph.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_verification_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_voice_loop.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_voice_providers.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_whole_codebase.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/test_work_director.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/voice/__init__.py +0 -0
- {gdmcode-0.1.7 → gdmcode-0.1.8}/tests/voice/test_audio_foundation.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.8"
|
|
@@ -1365,10 +1365,11 @@ def _run_connection_probe_once(cfg: object, prompt: str, *, model_override: str
|
|
|
1365
1365
|
response = client.complete_text(
|
|
1366
1366
|
prompt,
|
|
1367
1367
|
model=model_def.id,
|
|
1368
|
-
max_tokens=
|
|
1368
|
+
max_tokens=512,
|
|
1369
1369
|
system=(
|
|
1370
|
-
"You are gdm code's
|
|
1371
|
-
"
|
|
1370
|
+
"You are gdm code's lightweight chat and connection check. Reply briefly. "
|
|
1371
|
+
"If asked who you are, say you are gdm, an AI coding-agent CLI. "
|
|
1372
|
+
"Confirm the LLM route is working. Do not inspect files or call tools."
|
|
1372
1373
|
),
|
|
1373
1374
|
).strip()
|
|
1374
1375
|
status.stop()
|
|
@@ -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.8") -> None:
|
|
55
55
|
self._name = name
|
|
56
56
|
self._version = version
|
|
57
57
|
self._tools: dict[str, MCPTool] = {}
|
|
@@ -163,13 +163,21 @@ def _format_llm_error(error: object) -> str:
|
|
|
163
163
|
|
|
164
164
|
|
|
165
165
|
def _is_connection_probe(text: str) -> bool:
|
|
166
|
-
"""Return True for
|
|
166
|
+
"""Return True for lightweight chat/status prompts that should not enter tool mode."""
|
|
167
167
|
import re
|
|
168
168
|
|
|
169
169
|
normalized = re.sub(r"[^a-z0-9\s']", " ", text.lower()).strip()
|
|
170
170
|
normalized = re.sub(r"\s+", " ", normalized)
|
|
171
171
|
if not normalized:
|
|
172
172
|
return False
|
|
173
|
+
work_terms = {
|
|
174
|
+
"fix", "edit", "change", "create", "write", "delete", "read", "open", "search",
|
|
175
|
+
"find", "run", "test", "build", "install", "commit", "review", "debug", "explain",
|
|
176
|
+
"refactor", "implement", "update", "file", "folder", "repo", "code",
|
|
177
|
+
}
|
|
178
|
+
words = normalized.split()
|
|
179
|
+
if any(word in work_terms for word in words):
|
|
180
|
+
return False
|
|
173
181
|
direct = {
|
|
174
182
|
"hey",
|
|
175
183
|
"hi",
|
|
@@ -182,10 +190,29 @@ def _is_connection_probe(text: str) -> bool:
|
|
|
182
190
|
"hi there",
|
|
183
191
|
"are you there",
|
|
184
192
|
"you there",
|
|
193
|
+
"who are you",
|
|
194
|
+
"what are you",
|
|
195
|
+
"what can you do",
|
|
196
|
+
"are you working",
|
|
197
|
+
"are you connected",
|
|
198
|
+
"is the llm connected",
|
|
199
|
+
"are tools working",
|
|
200
|
+
"do tools work",
|
|
201
|
+
"status",
|
|
185
202
|
}
|
|
186
203
|
if normalized in direct:
|
|
187
204
|
return True
|
|
188
|
-
|
|
205
|
+
prefixes = (
|
|
206
|
+
"who are you",
|
|
207
|
+
"what are you",
|
|
208
|
+
"what can you do",
|
|
209
|
+
"are you there",
|
|
210
|
+
"are you connected",
|
|
211
|
+
"are tools working",
|
|
212
|
+
"do tools work",
|
|
213
|
+
)
|
|
214
|
+
if len(words) <= 8 and normalized.startswith(prefixes):
|
|
215
|
+
return True
|
|
189
216
|
return len(words) <= 4 and words[0] in {"hey", "hi", "hello"} and all(
|
|
190
217
|
word in {"hey", "hi", "hello", "there", "gdm", "agent", "please"} for word in words
|
|
191
218
|
)
|
|
@@ -447,10 +474,11 @@ def start_repl(cfg: "GdmConfig", db: "GdmDatabase", *, yes: bool = False, model_
|
|
|
447
474
|
response = client.complete_text(
|
|
448
475
|
text,
|
|
449
476
|
model=model_def.id,
|
|
450
|
-
max_tokens=
|
|
477
|
+
max_tokens=512,
|
|
451
478
|
system=(
|
|
452
|
-
"You are gdm code's
|
|
453
|
-
"
|
|
479
|
+
"You are gdm code's lightweight chat and connection check. Reply briefly. "
|
|
480
|
+
"If asked who you are, say you are gdm, an AI coding-agent CLI. "
|
|
481
|
+
"Confirm the LLM route is working. Do not inspect files or call tools."
|
|
454
482
|
),
|
|
455
483
|
).strip()
|
|
456
484
|
status.stop()
|
|
@@ -113,3 +113,22 @@ class TestCliSmoke:
|
|
|
113
113
|
probe.assert_called_once()
|
|
114
114
|
assert probe.call_args.args[1] == "hey"
|
|
115
115
|
assert probe.call_args.kwargs == {"model_override": None}
|
|
116
|
+
|
|
117
|
+
def test_one_shot_identity_uses_connection_probe(self, tmp_path, monkeypatch) -> None:
|
|
118
|
+
import gdmcode.cli as cli
|
|
119
|
+
|
|
120
|
+
monkeypatch.setattr(
|
|
121
|
+
cli,
|
|
122
|
+
"load_config",
|
|
123
|
+
lambda require_credentials=False: SimpleNamespace(provider="gemini", api_key="key", project_root=tmp_path),
|
|
124
|
+
)
|
|
125
|
+
monkeypatch.setattr(cli, "_print_header", lambda _cfg: None)
|
|
126
|
+
monkeypatch.setattr(cli, "_has_model_connection", lambda _cfg: True)
|
|
127
|
+
probe = MagicMock()
|
|
128
|
+
monkeypatch.setattr(cli, "_run_connection_probe_once", probe)
|
|
129
|
+
|
|
130
|
+
result = runner.invoke(app, ["code", "--prompt", "who are you?"])
|
|
131
|
+
|
|
132
|
+
assert result.exit_code == 0
|
|
133
|
+
probe.assert_called_once()
|
|
134
|
+
assert probe.call_args.args[1] == "who are you?"
|
|
@@ -44,7 +44,11 @@ class TestReplHelpers:
|
|
|
44
44
|
|
|
45
45
|
assert _is_connection_probe("hey")
|
|
46
46
|
assert _is_connection_probe("hello there")
|
|
47
|
+
assert _is_connection_probe("who are you?")
|
|
48
|
+
assert _is_connection_probe("what can you do?")
|
|
49
|
+
assert _is_connection_probe("are tools working?")
|
|
47
50
|
assert not _is_connection_probe("fix the failing tests")
|
|
51
|
+
assert not _is_connection_probe("explain this file")
|
|
48
52
|
|
|
49
53
|
|
|
50
54
|
class TestReplStartRepl:
|
|
@@ -182,6 +186,24 @@ class TestReplStartRepl:
|
|
|
182
186
|
assert "LLM connected" in output
|
|
183
187
|
run_agent.assert_not_called()
|
|
184
188
|
|
|
189
|
+
def test_identity_prompt_with_credentials_uses_no_tool_probe(self, tmp_path, capsys) -> None:
|
|
190
|
+
from gdmcode.repl import start_repl
|
|
191
|
+
|
|
192
|
+
cfg, db = self._make_mocks(tmp_path)
|
|
193
|
+
cfg.api_key = "test-key"
|
|
194
|
+
|
|
195
|
+
with patch("gdmcode.repl._build_input_fn") as mock_build:
|
|
196
|
+
mock_build.return_value = MagicMock(side_effect=["who are you?", EOFError])
|
|
197
|
+
with patch("gdmcode.models.client.GdmClient.complete_text", return_value="I am gdm, your coding-agent CLI."):
|
|
198
|
+
with patch("gdmcode.repl._run_agent_turn") as run_agent:
|
|
199
|
+
with patch("gdmcode.cost_tracker.CostTracker"):
|
|
200
|
+
with patch("gdmcode.repl._ensure_session", return_value="session-123"):
|
|
201
|
+
start_repl(cfg, db)
|
|
202
|
+
|
|
203
|
+
output = capsys.readouterr().out
|
|
204
|
+
assert "coding-agent CLI" in output
|
|
205
|
+
run_agent.assert_not_called()
|
|
206
|
+
|
|
185
207
|
|
|
186
208
|
class TestReplErrorFormatting:
|
|
187
209
|
def test_format_llm_error_rate_limit(self) -> None:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.7"
|
|
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
|