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.
Files changed (269) hide show
  1. {gdmcode-0.1.10 → gdmcode-0.1.11}/PKG-INFO +1 -1
  2. gdmcode-0.1.11/gdmcode/__init__.py +1 -0
  3. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/mcp_server.py +1 -1
  4. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/permissions.py +38 -7
  5. {gdmcode-0.1.10 → gdmcode-0.1.11}/pyproject.toml +1 -1
  6. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_permissions.py +22 -0
  7. gdmcode-0.1.10/gdmcode/__init__.py +0 -1
  8. {gdmcode-0.1.10 → gdmcode-0.1.11}/.gitignore +0 -0
  9. {gdmcode-0.1.10 → gdmcode-0.1.11}/CONTRIBUTING.md +0 -0
  10. {gdmcode-0.1.10 → gdmcode-0.1.11}/README.md +0 -0
  11. {gdmcode-0.1.10 → gdmcode-0.1.11}/config.toml +0 -0
  12. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/agentic-runtime-audit.md +0 -0
  13. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/architecture.md +0 -0
  14. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/cli-reference.md +0 -0
  15. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/configuration.md +0 -0
  16. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/deployment.md +0 -0
  17. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/plugin-guide.md +0 -0
  18. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/quick-start.md +0 -0
  19. {gdmcode-0.1.10 → gdmcode-0.1.11}/docs/security-hardening.md +0 -0
  20. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/_internal/__init__.py +0 -0
  21. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/_internal/constants.py +0 -0
  22. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/_internal/domain_skills.py +0 -0
  23. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/__init__.py +0 -0
  24. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/commit_classifier.py +0 -0
  25. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/context_budget.py +0 -0
  26. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/daemon.py +0 -0
  27. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/dag_validator.py +0 -0
  28. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/debug_loop.py +0 -0
  29. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/impact_analyzer.py +0 -0
  30. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/impact_graph.py +0 -0
  31. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/loop.py +0 -0
  32. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/orchestrator.py +0 -0
  33. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/regression_guard.py +0 -0
  34. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/review_gate.py +0 -0
  35. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/risk_scorer.py +0 -0
  36. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/self_healing.py +0 -0
  37. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/smart_test_selector.py +0 -0
  38. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/system_prompt.py +0 -0
  39. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/task_tracker.py +0 -0
  40. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/test_validator.py +0 -0
  41. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/tool_orchestrator.py +0 -0
  42. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/transcript.py +0 -0
  43. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/verification_loop.py +0 -0
  44. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/work_director.py +0 -0
  45. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/agent/worktree_manager.py +0 -0
  46. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/artifacts/__init__.py +0 -0
  47. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/artifacts/artifact_store.py +0 -0
  48. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/artifacts/verification_graph.py +0 -0
  49. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/auth.py +0 -0
  50. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/cli.py +0 -0
  51. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/commands.py +0 -0
  52. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/config.py +0 -0
  53. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/cost_tracker.py +0 -0
  54. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/db/__init__.py +0 -0
  55. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/db/migrations.py +0 -0
  56. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/__init__.py +0 -0
  57. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/audit_log.py +0 -0
  58. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/identity.py +0 -0
  59. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/rbac.py +0 -0
  60. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/team_config.py +0 -0
  61. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/enterprise/usage_analytics.py +0 -0
  62. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/exceptions.py +0 -0
  63. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/git_workflow.py +0 -0
  64. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/__init__.py +0 -0
  65. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/github_actions.py +0 -0
  66. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/sentry_integration.py +0 -0
  67. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/sentry_server.py +0 -0
  68. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/integrations/webhook_security.py +0 -0
  69. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/intent_router.py +0 -0
  70. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/main.py +0 -0
  71. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/__init__.py +0 -0
  72. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/code_index.py +0 -0
  73. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/compressor.py +0 -0
  74. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/context_memory.py +0 -0
  75. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/continuous_memory.py +0 -0
  76. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/conventions.py +0 -0
  77. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/db.py +0 -0
  78. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/document_index.py +0 -0
  79. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/file_cache.py +0 -0
  80. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/project_scanner.py +0 -0
  81. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/memory/session_store.py +0 -0
  82. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/__init__.py +0 -0
  83. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/client.py +0 -0
  84. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/definitions.py +0 -0
  85. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/router.py +0 -0
  86. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/models/schemas.py +0 -0
  87. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/__init__.py +0 -0
  88. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/command_filter.py +0 -0
  89. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/models.py +0 -0
  90. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/permission_handler.py +0 -0
  91. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/phone_ui.py +0 -0
  92. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/protocol.py +0 -0
  93. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/qr.py +0 -0
  94. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/server.py +0 -0
  95. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/token_manager.py +0 -0
  96. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/remote/tunnel.py +0 -0
  97. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/repl.py +0 -0
  98. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/runtime/__init__.py +0 -0
  99. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/runtime/branch_farm.py +0 -0
  100. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/runtime/replay.py +0 -0
  101. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sandbox/__init__.py +0 -0
  102. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sandbox/hermetic.py +0 -0
  103. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sandbox/policy.py +0 -0
  104. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/__init__.py +0 -0
  105. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/plugin_base.py +0 -0
  106. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/plugin_host.py +0 -0
  107. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/sdk/plugin_loader.py +0 -0
  108. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/security.py +0 -0
  109. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/__init__.py +0 -0
  110. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/bridge.py +0 -0
  111. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/bridge_cli.py +0 -0
  112. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/bridge_client.py +0 -0
  113. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/server/protocol_version.py +0 -0
  114. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/__init__.py +0 -0
  115. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/event_fanout.py +0 -0
  116. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/input_broker.py +0 -0
  117. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/session/permission_bridge.py +0 -0
  118. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/__init__.py +0 -0
  119. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/_atomic.py +0 -0
  120. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/agent_tools.py +0 -0
  121. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/ask_user_tool.py +0 -0
  122. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/bash_tool.py +0 -0
  123. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/browser_tool.py +0 -0
  124. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/browser_tools.py +0 -0
  125. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/dep_tools.py +0 -0
  126. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/document_reader.py +0 -0
  127. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/document_tool.py +0 -0
  128. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/document_writer.py +0 -0
  129. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/impact_tools.py +0 -0
  130. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/playwright_tool.py +0 -0
  131. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/quality_tools.py +0 -0
  132. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/read_tools.py +0 -0
  133. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/result_cache.py +0 -0
  134. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/search_tools.py +0 -0
  135. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/shell_tools.py +0 -0
  136. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/tools/write_tools.py +0 -0
  137. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/__init__.py +0 -0
  138. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/audio_capture.py +0 -0
  139. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/audio_playback.py +0 -0
  140. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/errors.py +0 -0
  141. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/models.py +0 -0
  142. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/providers.py +0 -0
  143. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/vad.py +0 -0
  144. {gdmcode-0.1.10 → gdmcode-0.1.11}/gdmcode/voice/voice_loop.py +0 -0
  145. {gdmcode-0.1.10 → gdmcode-0.1.11}/proxy/Dockerfile +0 -0
  146. {gdmcode-0.1.10 → gdmcode-0.1.11}/proxy/main.py +0 -0
  147. {gdmcode-0.1.10 → gdmcode-0.1.11}/proxy/requirements.txt +0 -0
  148. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/__init__.py +0 -0
  149. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/remote/__init__.py +0 -0
  150. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/remote/test_remote_server.py +0 -0
  151. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_agent_loop.py +0 -0
  152. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_agent_tools.py +0 -0
  153. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_api_fallback.py +0 -0
  154. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_artifact_store.py +0 -0
  155. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_audit_log.py +0 -0
  156. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_auth.py +0 -0
  157. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_auto_quality.py +0 -0
  158. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_autonomy_levels.py +0 -0
  159. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_bash_tool.py +0 -0
  160. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_batch_api.py +0 -0
  161. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_branch_farm.py +0 -0
  162. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_bridge.py +0 -0
  163. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_bridge_smoke.py +0 -0
  164. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_browser_tool_smoke.py +0 -0
  165. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_browser_tools.py +0 -0
  166. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_btw_queue.py +0 -0
  167. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_budget_tracker.py +0 -0
  168. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_chrome_extension.py +0 -0
  169. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_ci_runner.py +0 -0
  170. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_cli_smoke.py +0 -0
  171. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_code_index.py +0 -0
  172. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_commands.py +0 -0
  173. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_compression.py +0 -0
  174. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_confidence.py +0 -0
  175. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_config.py +0 -0
  176. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_continuous_memory.py +0 -0
  177. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_convention_drift.py +0 -0
  178. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_cost_tracker.py +0 -0
  179. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_daemon.py +0 -0
  180. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_daemon_stability.py +0 -0
  181. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_daemon_watchdog.py +0 -0
  182. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_db.py +0 -0
  183. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_debate.py +0 -0
  184. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_debug_loop.py +0 -0
  185. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_debug_loop_smoke.py +0 -0
  186. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_dep_tools.py +0 -0
  187. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_doctor.py +0 -0
  188. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_index.py +0 -0
  189. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_reader.py +0 -0
  190. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_tool.py +0 -0
  191. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_document_writer.py +0 -0
  192. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_domain_skills.py +0 -0
  193. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_eval_harness.py +0 -0
  194. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_event_log.py +0 -0
  195. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_failure_taxonomy.py +0 -0
  196. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_file_tools.py +0 -0
  197. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_git_workflow.py +0 -0
  198. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_github_actions.py +0 -0
  199. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_health.py +0 -0
  200. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_hermetic_sandbox.py +0 -0
  201. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_identity_rbac.py +0 -0
  202. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_analysis.py +0 -0
  203. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_analyzer.py +0 -0
  204. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_graph.py +0 -0
  205. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_impact_tools.py +0 -0
  206. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_injection_gate.py +0 -0
  207. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_intent_router.py +0 -0
  208. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_leaderboard.py +0 -0
  209. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_local_models.py +0 -0
  210. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_loop.py +0 -0
  211. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_loop_p3.py +0 -0
  212. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_mcp_server.py +0 -0
  213. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_memory.py +0 -0
  214. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_migrations.py +0 -0
  215. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_mock_provider.py +0 -0
  216. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_model_config.py +0 -0
  217. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_orchestrator.py +0 -0
  218. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_package.py +0 -0
  219. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_phase2_modules.py +0 -0
  220. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_phone_ui.py +0 -0
  221. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_playwright_tool.py +0 -0
  222. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_plugin_sdk.py +0 -0
  223. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_protocol_version.py +0 -0
  224. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_provenance.py +0 -0
  225. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_proxy_server.py +0 -0
  226. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_quality_integration.py +0 -0
  227. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_reasoning_toggle.py +0 -0
  228. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_redaction.py +0 -0
  229. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_regression_collector.py +0 -0
  230. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_regression_guard_integration.py +0 -0
  231. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_regression_runner.py +0 -0
  232. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_repl_smoke.py +0 -0
  233. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_replay.py +0 -0
  234. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_resilience.py +0 -0
  235. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_result_cache.py +0 -0
  236. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_review_gate_expanded.py +0 -0
  237. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_risk_scorer.py +0 -0
  238. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_rollback.py +0 -0
  239. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_router.py +0 -0
  240. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_router_compressor_conventions.py +0 -0
  241. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_router_escalation.py +0 -0
  242. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_sandbox.py +0 -0
  243. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_scoring.py +0 -0
  244. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_search_tools.py +0 -0
  245. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_self_healing.py +0 -0
  246. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_semantic_edit.py +0 -0
  247. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_sentry_integration.py +0 -0
  248. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_session_checkpoint.py +0 -0
  249. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_session_controller.py +0 -0
  250. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_session_restore.py +0 -0
  251. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_signal_handling.py +0 -0
  252. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_swebench_adapter.py +0 -0
  253. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_swebench_runner.py +0 -0
  254. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_system_prompt.py +0 -0
  255. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_team_config.py +0 -0
  256. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tool_cache.py +0 -0
  257. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tool_orchestrator.py +0 -0
  258. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tool_timeout.py +0 -0
  259. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tools_registry.py +0 -0
  260. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_tunnel_qr.py +0 -0
  261. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_usage_analytics.py +0 -0
  262. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_verification_graph.py +0 -0
  263. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_verification_loop.py +0 -0
  264. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_voice_loop.py +0 -0
  265. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_voice_providers.py +0 -0
  266. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_whole_codebase.py +0 -0
  267. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/test_work_director.py +0 -0
  268. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/voice/__init__.py +0 -0
  269. {gdmcode-0.1.10 → gdmcode-0.1.11}/tests/voice/test_audio_foundation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gdmcode
3
- Version: 0.1.10
3
+ Version: 0.1.11
4
4
  Summary: gdm: AI coding agent for professional developers
5
5
  Project-URL: Homepage, https://github.com/guidegdm/gdmcode
6
6
  Project-URL: Repository, https://github.com/guidegdm/gdmcode
@@ -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.10") -> None:
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 prompt imported lazily to avoid circular dep at module init
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 = Prompt.ask(
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,
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "gdmcode"
7
- version = "0.1.10"
7
+ version = "0.1.11"
8
8
  description = "gdm: AI coding agent for professional developers"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -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