gdmcode 0.1.0__py3-none-any.whl

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 (131) hide show
  1. gdmcode-0.1.0.dist-info/METADATA +240 -0
  2. gdmcode-0.1.0.dist-info/RECORD +131 -0
  3. gdmcode-0.1.0.dist-info/WHEEL +4 -0
  4. gdmcode-0.1.0.dist-info/entry_points.txt +2 -0
  5. src/__init__.py +1 -0
  6. src/_internal/__init__.py +0 -0
  7. src/_internal/constants.py +244 -0
  8. src/_internal/domain_skills.py +339 -0
  9. src/agent/__init__.py +0 -0
  10. src/agent/commit_classifier.py +91 -0
  11. src/agent/context_budget.py +391 -0
  12. src/agent/daemon.py +681 -0
  13. src/agent/dag_validator.py +153 -0
  14. src/agent/debug_loop.py +473 -0
  15. src/agent/impact_analyzer.py +149 -0
  16. src/agent/impact_graph.py +117 -0
  17. src/agent/loop.py +1410 -0
  18. src/agent/orchestrator.py +141 -0
  19. src/agent/regression_guard.py +251 -0
  20. src/agent/review_gate.py +648 -0
  21. src/agent/risk_scorer.py +169 -0
  22. src/agent/self_healing.py +145 -0
  23. src/agent/smart_test_selector.py +89 -0
  24. src/agent/system_prompt.py +226 -0
  25. src/agent/task_tracker.py +320 -0
  26. src/agent/test_validator.py +210 -0
  27. src/agent/tool_orchestrator.py +402 -0
  28. src/agent/transcript.py +230 -0
  29. src/agent/verification_loop.py +133 -0
  30. src/agent/work_director.py +136 -0
  31. src/agent/worktree_manager.py +53 -0
  32. src/artifacts/__init__.py +16 -0
  33. src/artifacts/artifact_store.py +456 -0
  34. src/artifacts/verification_graph.py +75 -0
  35. src/auth.py +411 -0
  36. src/cli.py +1290 -0
  37. src/commands.py +1398 -0
  38. src/config.py +762 -0
  39. src/cost_tracker.py +348 -0
  40. src/db/__init__.py +4 -0
  41. src/db/migrations.py +337 -0
  42. src/enterprise/__init__.py +3 -0
  43. src/enterprise/audit_log.py +182 -0
  44. src/enterprise/identity.py +90 -0
  45. src/enterprise/rbac.py +100 -0
  46. src/enterprise/team_config.py +125 -0
  47. src/enterprise/usage_analytics.py +261 -0
  48. src/exceptions.py +207 -0
  49. src/git_workflow.py +651 -0
  50. src/integrations/__init__.py +6 -0
  51. src/integrations/github_actions.py +106 -0
  52. src/integrations/mcp_server.py +333 -0
  53. src/integrations/sentry_integration.py +100 -0
  54. src/integrations/sentry_server.py +82 -0
  55. src/integrations/webhook_security.py +19 -0
  56. src/main.py +27 -0
  57. src/memory/__init__.py +0 -0
  58. src/memory/code_index.py +376 -0
  59. src/memory/compressor.py +378 -0
  60. src/memory/context_memory.py +135 -0
  61. src/memory/continuous_memory.py +234 -0
  62. src/memory/conventions.py +495 -0
  63. src/memory/db.py +1119 -0
  64. src/memory/document_index.py +205 -0
  65. src/memory/file_cache.py +128 -0
  66. src/memory/project_scanner.py +178 -0
  67. src/memory/session_store.py +201 -0
  68. src/models/__init__.py +0 -0
  69. src/models/client.py +715 -0
  70. src/models/definitions.py +459 -0
  71. src/models/router.py +418 -0
  72. src/models/schemas.py +389 -0
  73. src/permissions.py +294 -0
  74. src/remote/__init__.py +5 -0
  75. src/remote/command_filter.py +33 -0
  76. src/remote/models.py +31 -0
  77. src/remote/permission_handler.py +79 -0
  78. src/remote/phone_ui.py +48 -0
  79. src/remote/protocol.py +59 -0
  80. src/remote/qr.py +65 -0
  81. src/remote/server.py +586 -0
  82. src/remote/token_manager.py +61 -0
  83. src/remote/tunnel.py +212 -0
  84. src/repl.py +475 -0
  85. src/runtime/__init__.py +1 -0
  86. src/runtime/branch_farm.py +372 -0
  87. src/runtime/replay.py +351 -0
  88. src/sandbox/__init__.py +2 -0
  89. src/sandbox/hermetic.py +214 -0
  90. src/sandbox/policy.py +44 -0
  91. src/sdk/__init__.py +3 -0
  92. src/sdk/plugin_base.py +39 -0
  93. src/sdk/plugin_host.py +100 -0
  94. src/sdk/plugin_loader.py +101 -0
  95. src/security.py +409 -0
  96. src/server/__init__.py +7 -0
  97. src/server/bridge.py +427 -0
  98. src/server/bridge_cli.py +103 -0
  99. src/server/bridge_client.py +170 -0
  100. src/server/protocol_version.py +103 -0
  101. src/session/__init__.py +10 -0
  102. src/session/event_fanout.py +46 -0
  103. src/session/input_broker.py +38 -0
  104. src/session/permission_bridge.py +100 -0
  105. src/tools/__init__.py +160 -0
  106. src/tools/_atomic.py +72 -0
  107. src/tools/agent_tools.py +423 -0
  108. src/tools/ask_user_tool.py +83 -0
  109. src/tools/bash_tool.py +384 -0
  110. src/tools/browser_tool.py +352 -0
  111. src/tools/browser_tools.py +179 -0
  112. src/tools/dep_tools.py +210 -0
  113. src/tools/document_reader.py +167 -0
  114. src/tools/document_tool.py +240 -0
  115. src/tools/document_writer.py +171 -0
  116. src/tools/impact_tools.py +240 -0
  117. src/tools/playwright_tool.py +172 -0
  118. src/tools/quality_tools.py +366 -0
  119. src/tools/read_tools.py +318 -0
  120. src/tools/result_cache.py +157 -0
  121. src/tools/search_tools.py +310 -0
  122. src/tools/shell_tools.py +311 -0
  123. src/tools/write_tools.py +337 -0
  124. src/voice/__init__.py +25 -0
  125. src/voice/audio_capture.py +92 -0
  126. src/voice/audio_playback.py +68 -0
  127. src/voice/errors.py +14 -0
  128. src/voice/models.py +35 -0
  129. src/voice/providers.py +143 -0
  130. src/voice/vad.py +55 -0
  131. src/voice/voice_loop.py +156 -0
@@ -0,0 +1,240 @@
1
+ Metadata-Version: 2.4
2
+ Name: gdmcode
3
+ Version: 0.1.0
4
+ Summary: gdm: AI coding agent for professional developers
5
+ Project-URL: Homepage, https://github.com/guidegdm/gdmcode
6
+ Project-URL: Repository, https://github.com/guidegdm/gdmcode
7
+ Project-URL: Bug Tracker, https://github.com/guidegdm/gdmcode/issues
8
+ Project-URL: Documentation, https://github.com/guidegdm/gdmcode#readme
9
+ Project-URL: Changelog, https://github.com/guidegdm/gdmcode/blob/main/CHANGELOG.md
10
+ License: MIT
11
+ Keywords: ai,coding-agent,developer-tools,llm
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Software Development :: Code Generators
20
+ Classifier: Topic :: Utilities
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: httpx>=0.27.0
23
+ Requires-Dist: keyring>=25.0.0
24
+ Requires-Dist: markdownify>=0.12.0
25
+ Requires-Dist: openai>=1.30.0
26
+ Requires-Dist: prompt-toolkit>=3.0.43
27
+ Requires-Dist: pydantic>=2.7.0
28
+ Requires-Dist: requests>=2.32.0
29
+ Requires-Dist: rich>=13.7.0
30
+ Requires-Dist: tiktoken>=0.7.0
31
+ Requires-Dist: tomli-w>=1.0.0
32
+ Requires-Dist: tree-sitter-javascript>=0.23.0
33
+ Requires-Dist: tree-sitter-python>=0.23.0
34
+ Requires-Dist: tree-sitter-typescript>=0.23.0
35
+ Requires-Dist: tree-sitter>=0.23.0
36
+ Requires-Dist: typer>=0.12.0
37
+ Requires-Dist: websockets>=12.0
38
+ Provides-Extra: all
39
+ Requires-Dist: faiss-cpu>=1.8.0; extra == 'all'
40
+ Requires-Dist: itsdangerous>=2.2.0; extra == 'all'
41
+ Requires-Dist: numpy>=1.26.0; extra == 'all'
42
+ Requires-Dist: openpyxl>=3.1.0; extra == 'all'
43
+ Requires-Dist: pdfplumber>=0.11.0; extra == 'all'
44
+ Requires-Dist: playwright>=1.44.0; extra == 'all'
45
+ Requires-Dist: python-docx>=1.1.0; extra == 'all'
46
+ Requires-Dist: qrcode>=7.4.0; extra == 'all'
47
+ Requires-Dist: sounddevice>=0.4.6; extra == 'all'
48
+ Requires-Dist: starlette>=0.37.0; extra == 'all'
49
+ Requires-Dist: uvicorn>=0.29.0; extra == 'all'
50
+ Requires-Dist: webrtcvad>=2.0.10; extra == 'all'
51
+ Requires-Dist: websockets>=12.0; extra == 'all'
52
+ Requires-Dist: xlrd>=2.0.1; extra == 'all'
53
+ Provides-Extra: browser
54
+ Requires-Dist: playwright>=1.44.0; extra == 'browser'
55
+ Requires-Dist: websockets>=12.0; extra == 'browser'
56
+ Provides-Extra: dev
57
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
58
+ Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
59
+ Requires-Dist: pytest-mock>=3.14.0; extra == 'dev'
60
+ Requires-Dist: pytest>=8.2.0; extra == 'dev'
61
+ Provides-Extra: docs
62
+ Requires-Dist: openpyxl>=3.1.0; extra == 'docs'
63
+ Requires-Dist: pdfplumber>=0.11.0; extra == 'docs'
64
+ Requires-Dist: python-docx>=1.1.0; extra == 'docs'
65
+ Requires-Dist: xlrd>=2.0.1; extra == 'docs'
66
+ Provides-Extra: evals
67
+ Requires-Dist: bandit[toml]>=1.7.0; extra == 'evals'
68
+ Requires-Dist: datasets>=2.20.0; extra == 'evals'
69
+ Requires-Dist: docker>=7.1.0; extra == 'evals'
70
+ Requires-Dist: jinja2>=3.1.0; extra == 'evals'
71
+ Requires-Dist: mypy>=1.10.0; extra == 'evals'
72
+ Requires-Dist: pandas>=2.2.0; extra == 'evals'
73
+ Requires-Dist: pyyaml>=6.0.0; extra == 'evals'
74
+ Requires-Dist: ruff>=0.4.0; extra == 'evals'
75
+ Requires-Dist: swebench>=3.0.0; extra == 'evals'
76
+ Provides-Extra: faiss
77
+ Requires-Dist: faiss-cpu>=1.8.0; extra == 'faiss'
78
+ Provides-Extra: mobile
79
+ Provides-Extra: plugin-dev
80
+ Requires-Dist: build>=1.2; extra == 'plugin-dev'
81
+ Requires-Dist: twine>=5.0; extra == 'plugin-dev'
82
+ Provides-Extra: remote
83
+ Requires-Dist: itsdangerous>=2.2.0; extra == 'remote'
84
+ Requires-Dist: qrcode>=7.4.0; extra == 'remote'
85
+ Requires-Dist: starlette>=0.37.0; extra == 'remote'
86
+ Requires-Dist: uvicorn>=0.29.0; extra == 'remote'
87
+ Requires-Dist: websockets>=12.0; extra == 'remote'
88
+ Provides-Extra: sentry
89
+ Requires-Dist: fastapi>=0.111; extra == 'sentry'
90
+ Requires-Dist: httpx>=0.27; extra == 'sentry'
91
+ Requires-Dist: uvicorn[standard]>=0.29; extra == 'sentry'
92
+ Provides-Extra: voice
93
+ Requires-Dist: numpy>=1.26.0; extra == 'voice'
94
+ Requires-Dist: sounddevice>=0.4.6; extra == 'voice'
95
+ Requires-Dist: webrtcvad>=2.0.10; extra == 'voice'
96
+ Description-Content-Type: text/markdown
97
+
98
+ # gdm — Open-Source AI Coding Agent
99
+
100
+ A terminal-native coding agent that reads your codebase, reasons over it, and edits files autonomously — with configurable autonomy, local model support, and a full audit trail.
101
+
102
+ ![Build status](https://img.shields.io/badge/build-passing-brightgreen) ![PyPI](https://img.shields.io/badge/pypi-gdm--code-blue) ![License: MIT](https://img.shields.io/badge/license-MIT-green)
103
+
104
+ ---
105
+
106
+ ## ⚡ Quick start (30 seconds)
107
+
108
+ ```bash
109
+ pipx install gdm-code
110
+ gdm version
111
+ gdm health
112
+ cd my-project && gdm "fix the login bug"
113
+ ```
114
+
115
+ See [docs/quick-start.md](docs/quick-start.md) for a step-by-step walkthrough.
116
+
117
+ ---
118
+
119
+ ## Why gdm?
120
+
121
+ - **Local-model support** — run fully air-gapped with Ollama or vLLM; no data leaves your machine.
122
+ - **Autonomy slider** — five levels from "ask everything" to "fully autonomous"; start low, build trust.
123
+ - **Open source and auditable** — MIT licensed, hash-chained audit log, team policy enforcement.
124
+
125
+ ---
126
+
127
+ ## Feature status
128
+
129
+ | Feature | Status | Task(s) |
130
+ |---|---|---|
131
+ | Multi-model routing (Grok / Gemini / Codex) | ✅ implemented | models-001/002/005 |
132
+ | Local model support — Ollama / vLLM | ✅ implemented | models-003 |
133
+ | Cost tracking and budget caps | ✅ implemented | runtime-005 |
134
+ | Session checkpoint / restore | ✅ implemented | core-002/003 |
135
+ | Audit log with hash chain | ✅ implemented | enterprise-002 |
136
+ | Team configuration and policy | ✅ implemented | enterprise-001 |
137
+ | Web search (debug / research) | ✅ implemented | tools-003 |
138
+ | Code index + whole-codebase mode | ✅ implemented | memory-001/005 |
139
+ | Git workflow automation | ✅ implemented | autonomous-003 |
140
+ | Verification loop | ✅ implemented | autonomous-002 |
141
+ | Self-healing debug loop | ✅ implemented | autonomous-004 |
142
+ | Multi-file orchestration | ✅ implemented | autonomous-001 |
143
+ | Impact analysis gate | ✅ implemented | autonomous-005 |
144
+ | Autonomy slider — 5 levels | ✅ implemented | ide-004 |
145
+ | VS Code extension | ✅ implemented | ide-001/002/003 |
146
+ | Voice interface (PTT + streaming) | ✅ implemented | voice-001/002/003 |
147
+ | Remote / LAN server + phone UI | ✅ implemented | remote-001/002/003 |
148
+ | Chrome extension + bridge | ✅ implemented | extensions-002 |
149
+ | MCP protocol server | ✅ implemented | integrations-003 |
150
+ | GitHub Actions CI integration | ✅ implemented | integrations-001 |
151
+ | Playwright browser automation | ✅ implemented | tools-002 |
152
+ | Sub-agent parallel execution | ✅ implemented | tools-005 |
153
+ | RBAC (role-based access control) | 📋 planned | enterprise-003 |
154
+ | Usage analytics dashboard | 📋 planned | enterprise-004 |
155
+ | Hermetic sandbox | ✅ implemented | moonshot-002 |
156
+ | Patch risk scoring | ✅ implemented | moonshot-006 |
157
+ | Impact graph smart test selection | ✅ implemented | moonshot-007 |
158
+ | CI eval pipeline | ✅ implemented | evals-002 |
159
+ | Continuous memory | ✅ implemented | memory-003 |
160
+ | Proxy/relay mode (geo-restricted regions) | ✅ implemented | proxy-001 |
161
+ | OIDC identity integration | 📋 planned | — |
162
+
163
+ ---
164
+
165
+ ## Installation
166
+
167
+ **Recommended (isolated environment):**
168
+ ```bash
169
+ pipx install gdm-code
170
+ ```
171
+
172
+ **pip:**
173
+ ```bash
174
+ pip install gdm-code
175
+ ```
176
+
177
+ **Development install:**
178
+ ```bash
179
+ git clone https://github.com/GedeonMatabaro/gdmcode
180
+ cd gdmcode
181
+ pip install -e ".[dev]"
182
+ gdm health
183
+ ```
184
+
185
+ **Note:** The PyPI package is `gdm-code`. The command is `gdm`.
186
+
187
+ ---
188
+
189
+ ## Configuration
190
+
191
+ gdm uses a 7-layer precedence system (highest wins):
192
+
193
+ ```
194
+ CLI flags > env vars (GDM_*) > team policy > team preferences
195
+ > project .gdm/config.toml > user ~/.config/gdm/config.toml > defaults
196
+ ```
197
+
198
+ Quick setup:
199
+ ```bash
200
+ gdm login grok # or: gemini | codex | all
201
+ ```
202
+
203
+ Secrets are stored in the OS keychain — never in TOML files.
204
+
205
+ Full configuration reference: [docs/configuration.md](docs/configuration.md)
206
+
207
+ ---
208
+
209
+ ## Enterprise
210
+
211
+ gdm includes audit and governance features suitable for team deployment:
212
+
213
+ - **Audit log** — every tool call is logged with a hash chain for tamper detection.
214
+ - **Team policy** — `.gdm/team.toml` enforces autonomy caps, network allowlists, and git permissions.
215
+ - **RBAC** — planned (enterprise-003).
216
+
217
+ See [docs/security-hardening.md](docs/security-hardening.md) for deployment guidance.
218
+
219
+ ---
220
+
221
+ ## Architecture
222
+
223
+ gdm runs a tool-calling agent loop: the model receives a task, selects tools from a registered
224
+ registry, executes them (subject to injection checks, RBAC, and network policy), and writes the
225
+ results back into context. Sessions are checkpointed to SQLite; memory is indexed for whole-codebase
226
+ reasoning.
227
+
228
+ Full architecture diagram: [docs/architecture.md](docs/architecture.md)
229
+
230
+ ---
231
+
232
+ ## Contributing
233
+
234
+ See [CONTRIBUTING.md](CONTRIBUTING.md). Issues and PRs welcome.
235
+
236
+ ---
237
+
238
+ ## License
239
+
240
+ MIT — Copyright GedeonMatabaro
@@ -0,0 +1,131 @@
1
+ src/__init__.py,sha256=QTYqXqSTHFRkM9TEgpDFcHvwLbvqHDqvqfQ9EiXkcAM,23
2
+ src/auth.py,sha256=uUxDCmRd8vUEWMFAT75bfCWS-rQuI-pQmOcocMaIG3w,15289
3
+ src/cli.py,sha256=4hTzYeOcZdek0pquabe75HukCQJAbrbCSpjyb07Dr-Q,50560
4
+ src/commands.py,sha256=uyuNheaX2701-BiAfvk0XN_MVTZgJKFs55uT7UlQV2g,63435
5
+ src/config.py,sha256=mu1CYErSpjhwzcT95Knbavj36E3DLxL06jpVn_T9eLA,31697
6
+ src/cost_tracker.py,sha256=ipGbFIVL2nh1ByQSMVP8ag1y-ZxfLac0AErxFDQOuug,12744
7
+ src/exceptions.py,sha256=fPmG4nKVWQW5MW75SuFmNmEUN_LwEougqHkGIYmdJ_Y,6491
8
+ src/git_workflow.py,sha256=msZCW4WHhgOxNcRBOhUwU9dqY90poQIZqg46-yW3ItY,24398
9
+ src/main.py,sha256=QgRDVzPZvL-lB31m2KE3oVUysND2QQPCb6rx7WOLh7k,594
10
+ src/permissions.py,sha256=QBrVqDaudBnZRY9u1K3IeQPsJcyi5Puc6fi8Xh31Q8I,11906
11
+ src/repl.py,sha256=huiMdqAlXDIslqnma3UwdRtoQP--pfEiJj2fy8WWhHw,19056
12
+ src/security.py,sha256=1bHQtkolCF1nPm1pybgNdsSZXlPcjy2dbyZiUSqDND0,16983
13
+ src/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ src/_internal/constants.py,sha256=cH6PwTaJ92v1bqjoj8s915VMIgKQsXdT-rNJ-aZAztY,7776
15
+ src/_internal/domain_skills.py,sha256=1iH9p-hozxVjDfCoZz3EoaC0GCFFd0LHxWrTvty-S94,15033
16
+ src/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ src/agent/commit_classifier.py,sha256=wDIylvh30LIl5Ye4s30laSj6usLJW_FMo7w54MG90HQ,3512
18
+ src/agent/context_budget.py,sha256=TRARZ8OcRvalwJyUWknzRmi6l18UHYtLSy8rcLBsmhM,13847
19
+ src/agent/daemon.py,sha256=1Y7aeoMQN_6J6YOLh_68TsWUTajoiR6mdnCBr1EfRzg,27143
20
+ src/agent/dag_validator.py,sha256=5JaxoxoLzzppi3FmYfwLYFcX4mDXFQWR59FgSRtxi8U,5358
21
+ src/agent/debug_loop.py,sha256=pKcFT9qKmuekEdXW1WG4428waghWUfarzagoxqD-tpA,19300
22
+ src/agent/impact_analyzer.py,sha256=GMB3FwXPCpOXbWY2wQTHVVLzCwGnWCGczAQkcMT2lUE,5334
23
+ src/agent/impact_graph.py,sha256=_39EYdTGrdwp3u0bgOj-YVgx_KsrHwVgGO-MteCwU-c,4402
24
+ src/agent/loop.py,sha256=Bp3bparGT8Y0s1FoH4zk38qW0oZomgMJLGjI6-oLoyw,62460
25
+ src/agent/orchestrator.py,sha256=a5fWYLXtUUjx_1Czy6EFE9mN9Fxw3wEJK_3PZE3kaTk,4981
26
+ src/agent/regression_guard.py,sha256=NfJ9FJ6cPoN2SV__7xT3HLKbpqakjrdCUH_iD_QwyY0,9117
27
+ src/agent/review_gate.py,sha256=gby4IF_I4zJNZYBXmnUzsbZQk3vjxkV_KPmPlrYSZj8,24713
28
+ src/agent/risk_scorer.py,sha256=_7qF4MG7t0__i794T0uFGj0uaW7IyvGiE6IkxUjXs-I,5376
29
+ src/agent/self_healing.py,sha256=kA_vTtb2tBsGWYMAoIcvtTwdzQH8dJKN4JCBWmkO1CQ,5298
30
+ src/agent/smart_test_selector.py,sha256=zW26Zwmbh4DuCw0POTEgO8XU1C-KgWnuc3FQSzxGFlI,3419
31
+ src/agent/system_prompt.py,sha256=D8Z6xtXLxcahxftIw0CXvA8cc4A9KcMTAZCjr1k8XPk,9089
32
+ src/agent/task_tracker.py,sha256=XnPh5AcDXPZH6EO3f02gqvm6ZCigIidzEDEav74ruuc,11502
33
+ src/agent/test_validator.py,sha256=V-XUDagYJsPJv9KgVDlAUKOPH5mNpGbTE9TOv6yVS9g,7653
34
+ src/agent/tool_orchestrator.py,sha256=dHwO_aZvcSuEI8oHcXUWVP9QVviLu3wnW5c6M8KddkY,15925
35
+ src/agent/transcript.py,sha256=XIeRqEaJiLUCkI8MLHhW7dHmOkHt9G7XGiuM4kWU4T4,9068
36
+ src/agent/verification_loop.py,sha256=cdB0Gbf2bb12wLcjUAubADaVd3ud9XZynzYE1rLyncY,4775
37
+ src/agent/work_director.py,sha256=k0UE-PhdVdS87F9ehcMXXj7mYF1D-NYYtnu-cDuFBSE,5237
38
+ src/agent/worktree_manager.py,sha256=-g5y8U81jN85csOHupFOVssktRwiv4wF7PSeQvIpRds,1769
39
+ src/artifacts/__init__.py,sha256=JZwJSlUWkyejuSIZ2LeSY3bd6jHOvxP-o1UU20XjnfY,335
40
+ src/artifacts/artifact_store.py,sha256=xwEyLNmGtgIhxB7ltYId7s0rGjx05yxflYQvwqQli6M,16637
41
+ src/artifacts/verification_graph.py,sha256=s-HURmT_CF9aEhx6IE5znuEcR6VeFUp5C-uxFCqmR9g,3404
42
+ src/db/__init__.py,sha256=J7ffJGDtr3GK-IVGeeUupoHXfiZa6eCx9CWH2E7WnTk,201
43
+ src/db/migrations.py,sha256=sfn2huJR6PgECnpzaD6hbq9CsZujfFRI_qbphDVJq0U,13523
44
+ src/enterprise/__init__.py,sha256=YNnw6AbWCSu6E3waPcd_9TI4wxoKkZW-2cZ4tdznflQ,177
45
+ src/enterprise/audit_log.py,sha256=CkqC4H7kdgOaVjr1GstT2fLBFioYyPhPgugZMNkF8NM,6735
46
+ src/enterprise/identity.py,sha256=XVDY38qnH2qGRt5I1CDUoTNVhzxH4e2Yqg4MDabdbrI,3203
47
+ src/enterprise/rbac.py,sha256=_KkZomwQmn4MUBiuSyKkU2D5tLKvd86mduItAcwi3XU,3471
48
+ src/enterprise/team_config.py,sha256=ZZZ8geTWNEIutGnJNHfFsqH034ZharlEgHZjGvocl6s,4605
49
+ src/enterprise/usage_analytics.py,sha256=RB5-tx4i_vlnR0adi-eBG2mvIe1Tv4dRQaDNKhzlQZs,9944
50
+ src/integrations/__init__.py,sha256=FzpdFjTJmn_kYVR6WN3YnnUzAw0yq1_3UOxebeiKBbM,224
51
+ src/integrations/github_actions.py,sha256=YMVmmNwzan6O_j7Qp1GIiTZlqzHnEbahRF6ZFG-Jggo,3793
52
+ src/integrations/mcp_server.py,sha256=877c6E2_nhQFWugTTrrQ5ONRdLEcLghEmA57ajkP18w,11665
53
+ src/integrations/sentry_integration.py,sha256=NRfwM6M7uX71c3QXpPNfCA_EyXNN0sIFsTXYW_ek-y8,3733
54
+ src/integrations/sentry_server.py,sha256=K0gn5JFZPcMGEX5IN44BMnZPF8kj-SAzeggl3nqF290,2623
55
+ src/integrations/webhook_security.py,sha256=UNal_dNPsitKbjvJy7eyjX3KrpURPR6iRpNhBmMeXRQ,744
56
+ src/memory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ src/memory/code_index.py,sha256=ykB_LEtuCf2uaqkcUFasi3Q0FNVtmVBM55rrU-Qh0Ow,14053
58
+ src/memory/compressor.py,sha256=TwZ1h2U91p93i6iNd5hhEiLPw3YbqAIpskcJBvSxnJ0,15790
59
+ src/memory/context_memory.py,sha256=yfll23vrteDugSDrx8m4_xk-ALGhROMKRGM4rJMcrKk,5059
60
+ src/memory/continuous_memory.py,sha256=8gb5VZ-8amdFMCvzk9G8sX7DFCxo9aoDjKqUkuTBaBw,9064
61
+ src/memory/conventions.py,sha256=RnQLgaZhoqkrqODJB6HPbcD4ETBYjmOFD2ZKaKPp5oc,20196
62
+ src/memory/db.py,sha256=RoOMEFTkFSKe8ms1wFL8-V3o_pD5UkduOQ51CLo2YvY,45588
63
+ src/memory/document_index.py,sha256=CkjvRTq2IoekUY1-rpPp5vM0_Py3ommzDIq0IevJdow,7798
64
+ src/memory/file_cache.py,sha256=Dfw7nidqTyrmG3PpJg4PxTciAxJ2ri5er8GPqnGv_dM,4547
65
+ src/memory/project_scanner.py,sha256=MHqYnCxPLeuWIrZPDGfjMoAlEcjH4VVSQOGGyM3bcoE,6309
66
+ src/memory/session_store.py,sha256=n75sYesKnXfWsJJyRqJjhL5gUriod9W0RCoFADSbNTU,7522
67
+ src/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
+ src/models/client.py,sha256=lfBQfnZE5_6QOfIb4T_knFJt_Z-twYuSBGEkfkxKviQ,27781
69
+ src/models/definitions.py,sha256=QspEisTp_hv6LxuzOIsV6Xv7pebBiU1qU1S5MRkdQZk,15050
70
+ src/models/router.py,sha256=w-DQMInV6Ly6ozN1a2edr9m8zzs5vL3ZTnjCtVHLbl0,15197
71
+ src/models/schemas.py,sha256=b4SV_pHq9uMO8TWq9CTplkMqTGzNb1WO8w1dv6ZLVJ0,12007
72
+ src/remote/__init__.py,sha256=Vxr55VU1Uf5vlaQO54sp_sSlCStwDNdiJdM_SAFWvzo,308
73
+ src/remote/command_filter.py,sha256=P2mmDQflP47zLLA3EuKKXHsiRZl__eLqwcGlmMLODSw,1161
74
+ src/remote/models.py,sha256=rRmD6zNI8_3HZurqjZ6WHBpjlTXQwJ85ZUjr1j3ETzg,576
75
+ src/remote/permission_handler.py,sha256=eV6gDxWK4XTS8DyUHsjCk2cuQveM8K44nOgsMaV_6q4,2717
76
+ src/remote/phone_ui.py,sha256=oVV28x1ZcZadXUtoMVTmhrHgzGFe0_DLu8Hoaj306s0,1396
77
+ src/remote/protocol.py,sha256=gJielwHsaAYq86u0a6bCwHxlwkDpSJptbJY2WAAn5Pg,1143
78
+ src/remote/qr.py,sha256=pM7-9CwhqjFigOhFbN3Ypr8lAEL1mqSABjESBp1uqPw,2050
79
+ src/remote/server.py,sha256=-jiZ4aqWroxH4lsYCG4VjxqW2GRl1XDk2Qe47ZY2fDs,20661
80
+ src/remote/token_manager.py,sha256=dKW0kDIbZ47YRQYB8NwQax3lMDoLuuL7LGF4V3cKJVE,1789
81
+ src/remote/tunnel.py,sha256=Wc3X4xSbQEY2I0_ZfVYI3thuuBlYn36iVyJAbkpW9Z0,7000
82
+ src/runtime/__init__.py,sha256=RWBGqreHJ0WSFM2axiks37GrqhP9Wm762VyNT6xLdms,79
83
+ src/runtime/branch_farm.py,sha256=qazVSPUh-cjfqLNPok7HKDqUZ9IRtqdYXIL_7l9E4Jg,13470
84
+ src/runtime/replay.py,sha256=81PNmOvER3xrPnxoeqKsNvVpZmc99ysfywo_dMFlMFs,13077
85
+ src/sandbox/__init__.py,sha256=wLZlh-D3ih3F53pYgC8av1epv70aqMPe-8LqHLLEeA8,179
86
+ src/sandbox/hermetic.py,sha256=bP2xMe8SAXoFLd0kbcBRpHtxxwMRTdciyqr5xjQVAVM,8432
87
+ src/sandbox/policy.py,sha256=Ate2rt-ELXIw9z2LEbE6CupibB5OE9ih3XpxfGEtF84,1467
88
+ src/sdk/__init__.py,sha256=zRUSuW2pLFOPybogVTWxRcPBnVBwZbdjgk39udCwiNo,146
89
+ src/sdk/plugin_base.py,sha256=5WqMK1xtr92i8hB7sjUUUJ8I80u8O0gBJn7IVRyOmUo,1029
90
+ src/sdk/plugin_host.py,sha256=RVfj1YtI9nBaqSXNavMXont1otCBkZkkeh1Nf6SmFGM,3428
91
+ src/sdk/plugin_loader.py,sha256=UDWZelnk6aBIMM_XxRc2HxCVzsYelDdejx36MsiuO18,3201
92
+ src/server/__init__.py,sha256=khJO5MAPPH8PXwRXLo7-HrG1G-bf9gvwebsV3rJDDP4,237
93
+ src/server/bridge.py,sha256=l8Y_p_RcCMycf37UIXx9dtG9YfcsUsVGfi3MURWB5e4,15934
94
+ src/server/bridge_cli.py,sha256=7zNirDRQSUg29JbtQpxB55wfB3LMiPm1xbpca3xKu-o,3136
95
+ src/server/bridge_client.py,sha256=F2G1g-LBcsFDMtsSETJtzZ12mdKxZ3KpYjKO41U0nI4,6393
96
+ src/server/protocol_version.py,sha256=f9_ancEV3SSt0x925Puz1aAoMVn5yIoSzRPbDZYV-74,3375
97
+ src/session/__init__.py,sha256=yFP5VBvDRp57VWCyjcYdu7LbxQ9RP68E-CgiYSuvoWw,372
98
+ src/session/event_fanout.py,sha256=lTYK7wnaJw-s3NpBnSXpy5Fqi4FbQWgE0UlTKOfXxZQ,1664
99
+ src/session/input_broker.py,sha256=O1dNcmIk6ipmgjU90gar-EG1AB8PoAYsM0CnczYkZAU,1335
100
+ src/session/permission_bridge.py,sha256=jl7WnnKqxHNrV6Dh4F5ky6LDRgCmtMpL0WHk6ka0tLo,3649
101
+ src/tools/__init__.py,sha256=vAS5X2HL7eogtIb0JwaVP3FutL9EAiLk1QcQiUDY1gw,5495
102
+ src/tools/_atomic.py,sha256=-JTyI9vGX79QrfLq6hXoGVn9PABLPXRzTsFa-wQK-Nw,2445
103
+ src/tools/agent_tools.py,sha256=OjO8LJQbe-SOD2pmTgdzQHsQQmEAL8pP9RKPLh9A7dw,16120
104
+ src/tools/ask_user_tool.py,sha256=dE1e8gQhunL-_bqlzy9bkY8lhbMxULjLSOws4JrDuhU,2939
105
+ src/tools/bash_tool.py,sha256=Y7fooiRuLiEz_6iVUJF9lGv12PpYPuumWacRu-jnQRo,14131
106
+ src/tools/browser_tool.py,sha256=7imtlUra7DbECeAQdaCVHK7_tSVTxR02llFGT3ap1b0,12879
107
+ src/tools/browser_tools.py,sha256=Kzd0OLg7SdBwmSHksVrImTv6QJLrr7fZkLn9tsyf_sw,7224
108
+ src/tools/dep_tools.py,sha256=FWXS15cspycGeAHlF8iwVUxxsHnOvHhmnKRGmHsEfq8,7783
109
+ src/tools/document_reader.py,sha256=Jyb20HXwRFGOLv8JWAVXujskch0fQSLfOXchH7LDk-Y,6308
110
+ src/tools/document_tool.py,sha256=DRWD03h2TJtPN_mtZhgCv_15GxhkI0CTypCoSh7DSXY,9243
111
+ src/tools/document_writer.py,sha256=XCr3eJ-27FBEwOr7cDlDAHAAEgT3ex7iMxrSmSvnm5g,7604
112
+ src/tools/impact_tools.py,sha256=DRbSkvUBdjox8l736DeyrX7OtfvnC4_Q5m_F1nBQK6U,9254
113
+ src/tools/playwright_tool.py,sha256=yie_fMZIAgNXcAGrDXpMaNiURCg9mIes4h2V0moI6Po,6274
114
+ src/tools/quality_tools.py,sha256=egD4qM2m5oQbCMX54GGjjzl7ZXAGT1t6qz_HYk9lVOA,12980
115
+ src/tools/read_tools.py,sha256=dKLOPn_oCwuxmA8rAx9fWBE2-AZCDMay67B9ai66CIM,12411
116
+ src/tools/result_cache.py,sha256=d7DBl7kkAq5FvJw8d1n9kyCcJZZXb1GnOFAr_ru-oFc,5130
117
+ src/tools/search_tools.py,sha256=iHnOakdnZDa6rVKNax0iDlptjoiodRVQBeaep87sTqk,10662
118
+ src/tools/shell_tools.py,sha256=_0mtZah07eYWkcJMrl4u5umue6uV9SjK2JSUmaxfJIA,11300
119
+ src/tools/write_tools.py,sha256=iIVrpzmmAgvh4JPFUw0BAeoPE5tnX3QV2ZrqVuhM3hI,12213
120
+ src/voice/__init__.py,sha256=UMyce3O2NoC0nsCzVvxbH8PtCWuZ0_zHXiFaqwD9ciU,764
121
+ src/voice/audio_capture.py,sha256=ZZnorwu9fe18dZ9ECDppSOfyq2HkFM8LKYEps0jIL_k,3206
122
+ src/voice/audio_playback.py,sha256=3QI2iYxDiR3LewQ4OyJgZ8y6hCL8LwBS4ivhjsRmh1U,2206
123
+ src/voice/errors.py,sha256=_zf03xIlh_SZy6-1v86SxOZmhYBCvr33DBvC7DWNmLk,290
124
+ src/voice/models.py,sha256=9UES4u6ZPabojuINmSZbENwI5aUDWbJPQ-ZRp5YGuF4,1113
125
+ src/voice/providers.py,sha256=3Rl-tpIG9JfM8Oj2i9LEsZw91J5xNKpFxpA8Aaxo_5k,4183
126
+ src/voice/vad.py,sha256=k7I4SRZVyW_AF-DZmDwcKwhiUDSa6QQotpvU5CyW1J8,1662
127
+ src/voice/voice_loop.py,sha256=V_uHh7nHSMrJCDArqf1V7flaHLkB3XIXQVKZ09BOFBc,5330
128
+ gdmcode-0.1.0.dist-info/METADATA,sha256=Nd-_KY3Lj8fVmA-crf2-aW3tx9JkkmRbZ1Z60q0DZwM,8862
129
+ gdmcode-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
130
+ gdmcode-0.1.0.dist-info/entry_points.txt,sha256=KZh6NHdsE2APMgg8FjO-HkfiXO2G9auMB3-8s53uoaU,38
131
+ gdmcode-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ gdm = src.main:main
src/__init__.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "0.1.0"
File without changes
@@ -0,0 +1,244 @@
1
+ """Internal constants — not user-facing, not exported, prefixed with _."""
2
+ from __future__ import annotations
3
+
4
+ __all__: list[str] = [] # nothing exported from this module intentionally
5
+
6
+ # ---------------------------------------------------------------------------
7
+ # Spinner verbs — shown while the agent is thinking/working
8
+ #
9
+ # _PRIORITY_VERBS: shown at least once per calendar day (weighted 15× heavier).
10
+ # Private to this module — NOT exposed in user-editable configs.
11
+ #
12
+ # _ALL_SPINNER_VERBS: the full randomised pool. Order is irrelevant — the REPL
13
+ # picks at random (with weighting). Do NOT put these in any
14
+ # user-facing file or config — they live here intentionally.
15
+ # ---------------------------------------------------------------------------
16
+
17
+ _PRIORITY_VERBS: tuple[str, ...] = ("Gedeoning", "Gdming")
18
+
19
+ _ALL_SPINNER_VERBS: tuple[str, ...] = (
20
+ # ── Thinking / ideation ──────────────────────────────────────────────
21
+ "Cogitating",
22
+ "Pondering",
23
+ "Contemplating",
24
+ "Deliberating",
25
+ "Musing",
26
+ "Ruminating",
27
+ "Mulling",
28
+ "Reflecting",
29
+ "Meditating",
30
+ "Noodling",
31
+ "Percolating",
32
+ "Simmering",
33
+ "Brainstorming",
34
+ "Strategizing",
35
+ "Theorising",
36
+ "Hypothesising",
37
+ "Reckoning",
38
+ "Calculating",
39
+ "Extrapolating",
40
+ "Interpolating",
41
+ "Connecting dots",
42
+ "Cross-referencing",
43
+ "Synthesising",
44
+ "Distilling",
45
+ "Crystallising",
46
+ "Ideating",
47
+ "Incubating",
48
+ "Marinating",
49
+ "Fermenting",
50
+ "Steeping",
51
+ # ── Brewing / cooking metaphors ──────────────────────────────────────
52
+ "Brewing",
53
+ "Cooking up",
54
+ "Baking",
55
+ "Mixing",
56
+ "Blending",
57
+ "Whipping up",
58
+ "Sautéing logic",
59
+ "Slow-cooking",
60
+ "Seasoning",
61
+ "Stirring the pot",
62
+ # ── Action / work ────────────────────────────────────────────────────
63
+ "Crafting",
64
+ "Forging",
65
+ "Assembling",
66
+ "Constructing",
67
+ "Engineering",
68
+ "Architecting",
69
+ "Sculpting",
70
+ "Weaving",
71
+ "Knitting",
72
+ "Stitching",
73
+ "Soldering",
74
+ "Wiring",
75
+ "Debugging",
76
+ "Tracing",
77
+ "Triangulating",
78
+ "Navigating",
79
+ "Charting a course",
80
+ "Plotting",
81
+ "Sketching",
82
+ "Drafting",
83
+ "Blueprinting",
84
+ "Prototyping",
85
+ "Iterating",
86
+ "Refining",
87
+ "Polishing",
88
+ "Sharpening",
89
+ "Honing",
90
+ "Fine-tuning",
91
+ "Calibrating",
92
+ "Optimising",
93
+ "Pruning",
94
+ "Compressing",
95
+ "Expanding",
96
+ "Unpacking",
97
+ "Unravelling",
98
+ "Untangling",
99
+ "Disentangling",
100
+ "Piecing together",
101
+ "Reverse engineering",
102
+ "Decomposing",
103
+ "Composing",
104
+ # ── Discovery / exploration ──────────────────────────────────────────
105
+ "Exploring",
106
+ "Excavating",
107
+ "Mining",
108
+ "Spelunking",
109
+ "Surfacing",
110
+ "Unearthing",
111
+ "Discovering",
112
+ "Mapping",
113
+ "Surveying",
114
+ "Scanning",
115
+ "Inspecting",
116
+ "Auditing",
117
+ "Scouting",
118
+ "Reconnoitring",
119
+ "Investigating",
120
+ "Analysing",
121
+ "Examining",
122
+ "Dissecting",
123
+ "Probing",
124
+ "Diving deep",
125
+ "Going further",
126
+ "Following the thread",
127
+ "Chasing the rabbit",
128
+ "Down the rabbit hole",
129
+ "Zooming in",
130
+ "Zooming out",
131
+ "Triangulating",
132
+ "Cross-checking",
133
+ "Fact-checking",
134
+ # ── Clever / witty ───────────────────────────────────────────────────
135
+ "Summoning neurons",
136
+ "Consulting the oracle",
137
+ "Reading the tea leaves",
138
+ "Staring into the void",
139
+ "Feeding the hamsters",
140
+ "Spinning up the flux capacitor",
141
+ "Aligning the planets",
142
+ "Charging the lasers",
143
+ "Overclocking imagination",
144
+ "Defragging thoughts",
145
+ "Garbage collecting",
146
+ "Reticulating splines",
147
+ "Sharpening the pencil",
148
+ "Warming up the engines",
149
+ "Lighting the fuse",
150
+ "Dropping into the matrix",
151
+ "Running the simulation",
152
+ "Consulting the rubber duck",
153
+ "Talking to myself",
154
+ "Arguing with myself",
155
+ "Winning the argument",
156
+ "Losing the argument productively",
157
+ "Having a eureka moment",
158
+ "Pretending to be confident",
159
+ "Manifesting solutions",
160
+ "Channelling 10x devs",
161
+ "Touching grass (digitally)",
162
+ "Checking Stack Overflow (in my mind)",
163
+ "Reinventing the wheel (briefly)",
164
+ "Actually reading the docs",
165
+ "Skimming the docs",
166
+ "Writing better docs than the docs",
167
+ "Not reading the docs but it works",
168
+ "Googling furiously",
169
+ "Asking the universe",
170
+ "Vibing",
171
+ "Grooving",
172
+ "In the zone",
173
+ "Locked in",
174
+ "Cooking rn",
175
+ "Built different",
176
+ "Sending it",
177
+ "No cap, solving this",
178
+ "Based problem-solving",
179
+ # ── Priority verbs — duplicated here so they appear in normal rotation too
180
+ # (the DB-weighted daily-guarantee logic is separate in db.py)
181
+ "Gedeoning",
182
+ "Gdming",
183
+ )
184
+
185
+ # ---------------------------------------------------------------------------
186
+ # Security
187
+ # ---------------------------------------------------------------------------
188
+ _UNTRUSTED_TAG_PREFIX = "[UNTRUSTED: "
189
+ _UNTRUSTED_TAG_SUFFIX = "]"
190
+ _USER_INSTRUCTIONS_TAG = "[USER INSTRUCTIONS]"
191
+
192
+ # Patterns that indicate prompt injection attempts in file content.
193
+ # Checked before injecting any file content into a prompt.
194
+ _INJECTION_PATTERNS: tuple[str, ...] = (
195
+ "ignore previous instructions",
196
+ "ignore all previous",
197
+ "disregard your",
198
+ "forget your instructions",
199
+ "you are now",
200
+ "act as if",
201
+ "new instructions:",
202
+ "system prompt:",
203
+ "assistant:",
204
+ "### instruction",
205
+ "<|system|>",
206
+ "<|user|>",
207
+ "<|assistant|>",
208
+ )
209
+
210
+ # ---------------------------------------------------------------------------
211
+ # Agent loop
212
+ # ---------------------------------------------------------------------------
213
+ _MAX_AGENT_TURNS: int = 50
214
+ _DEFAULT_COST_LIMIT_USD: float = 5.0
215
+ _COMPRESSION_TRIGGER_RATIO: float = 0.80 # compress at 80% of context window
216
+ _MAX_DEBUG_CYCLES: int = 5
217
+ _ENSEMBLE_PATCH_COST_CAP_USD: float = 0.30
218
+
219
+ # ---------------------------------------------------------------------------
220
+ # Database
221
+ # ---------------------------------------------------------------------------
222
+ _DB_FILENAME = "gdm.db"
223
+ _CONTEXT_MEMORY_DIR = ".context-memory"
224
+ _SCHEMA_VERSION: int = 11
225
+
226
+ # ---------------------------------------------------------------------------
227
+ # Permissions
228
+ # ---------------------------------------------------------------------------
229
+ # ---------------------------------------------------------------------------
230
+ # Canonical write-tool names — tools that modify files on disk.
231
+ # Both loop.py and tool_orchestrator.py must use this set; never hardcode locally.
232
+ # ---------------------------------------------------------------------------
233
+ _WRITE_TOOLS: frozenset[str] = frozenset({"write_file", "edit_file", "create_file", "apply_patch"})
234
+
235
+ # ---------------------------------------------------------------------------
236
+ # These tool names can NEVER be approved — not by user, not by session flag.
237
+ _ALWAYS_DENY_TOOLS: frozenset[str] = frozenset({
238
+ "reboot",
239
+ "shutdown",
240
+ "format_disk",
241
+ "drop_database",
242
+ "delete_all",
243
+ "wipe",
244
+ })