comodor 0.20.0__tar.gz → 0.20.2__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 (259) hide show
  1. {comodor-0.20.0 → comodor-0.20.2}/PKG-INFO +94 -8
  2. {comodor-0.20.0 → comodor-0.20.2}/README.md +88 -6
  3. comodor-0.20.2/bench/README.md +95 -0
  4. comodor-0.20.2/bench/tasks/careful-unknowable/repo/README.md +11 -0
  5. comodor-0.20.2/docs/AR/README.md +109 -0
  6. comodor-0.20.2/docs/DE/README.md +114 -0
  7. comodor-0.20.2/docs/ES/README.md +113 -0
  8. comodor-0.20.2/docs/FA/README.md +112 -0
  9. comodor-0.20.2/docs/FR/README.md +114 -0
  10. {comodor-0.20.0 → comodor-0.20.2}/docs/README.md +1 -0
  11. comodor-0.20.2/docs/RU/README.md +113 -0
  12. comodor-0.20.2/docs/TR/README.md +111 -0
  13. comodor-0.20.2/docs/ZH/README.md +98 -0
  14. {comodor-0.20.0 → comodor-0.20.2}/pyproject.toml +19 -3
  15. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/_version.py +2 -2
  16. comodor-0.20.2/src/comodor/agent/claims.py +90 -0
  17. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/agent/loop.py +120 -8
  18. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/agent/prompts.py +27 -3
  19. comodor-0.20.2/src/comodor/channels/markdown.py +322 -0
  20. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/cli.py +38 -0
  21. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/config.py +6 -0
  22. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/doctor.py +45 -1
  23. comodor-0.20.2/src/comodor/providers/profile.py +157 -0
  24. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/bot.py +5 -1
  25. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/telegram/bot.py +12 -6
  26. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/telegram/keyboard.py +46 -24
  27. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/fs.py +61 -14
  28. comodor-0.20.2/src/comodor/tools/matching.py +213 -0
  29. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/registry.py +43 -0
  30. comodor-0.20.2/src/comodor/tools/verify.py +140 -0
  31. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/bot.py +4 -1
  32. {comodor-0.20.0 → comodor-0.20.2}/tests/test_agent_loop.py +117 -0
  33. comodor-0.20.2/tests/test_bench.py +735 -0
  34. comodor-0.20.2/tests/test_claims.py +176 -0
  35. comodor-0.20.2/tests/test_docker.py +306 -0
  36. {comodor-0.20.0 → comodor-0.20.2}/tests/test_doctor.py +73 -0
  37. comodor-0.20.2/tests/test_headless.py +178 -0
  38. {comodor-0.20.0 → comodor-0.20.2}/tests/test_help.py +68 -5
  39. comodor-0.20.2/tests/test_markdown.py +310 -0
  40. comodor-0.20.2/tests/test_matching.py +246 -0
  41. comodor-0.20.2/tests/test_profile.py +275 -0
  42. comodor-0.20.2/tests/test_source_hygiene.py +76 -0
  43. {comodor-0.20.0 → comodor-0.20.2}/tests/test_telegram.py +71 -0
  44. {comodor-0.20.0 → comodor-0.20.2}/tests/test_tools.py +47 -0
  45. comodor-0.20.2/tests/test_verify.py +155 -0
  46. comodor-0.20.0/tests/test_markdown.py +0 -103
  47. {comodor-0.20.0 → comodor-0.20.2}/.gitignore +0 -0
  48. {comodor-0.20.0 → comodor-0.20.2}/LICENSE +0 -0
  49. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/__init__.py +0 -0
  50. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/__main__.py +0 -0
  51. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/acp/__init__.py +0 -0
  52. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/acp/agent.py +0 -0
  53. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/acp/commands.py +0 -0
  54. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/acp/jsonrpc.py +0 -0
  55. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/agent/__init__.py +0 -0
  56. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/agent/context.py +0 -0
  57. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/agent/spawn.py +0 -0
  58. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/agent/tokens.py +0 -0
  59. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/browser/__init__.py +0 -0
  60. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/browser/cdp.py +0 -0
  61. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/browser/launch.py +0 -0
  62. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/browser/page.py +0 -0
  63. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/catalogue.py +0 -0
  64. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/channels/__init__.py +0 -0
  65. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/channels/daemon.py +0 -0
  66. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/channels/unit.py +0 -0
  67. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/desktop/__init__.py +0 -0
  68. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/desktop/guard.py +0 -0
  69. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/desktop/keys.py +0 -0
  70. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/desktop/overlay.py +0 -0
  71. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/desktop/png.py +0 -0
  72. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/desktop/screen.py +0 -0
  73. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/desktop/win32.py +0 -0
  74. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/events.py +0 -0
  75. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/help.py +0 -0
  76. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/__init__.py +0 -0
  77. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/associations.py +0 -0
  78. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/bm25.py +0 -0
  79. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/hotindex.py +0 -0
  80. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/memory.py +0 -0
  81. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/progress.py +0 -0
  82. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/reflect.py +0 -0
  83. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/rules.py +0 -0
  84. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/signals.py +0 -0
  85. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/store.py +0 -0
  86. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/learning/writer.py +0 -0
  87. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/__init__.py +0 -0
  88. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/catalogue.py +0 -0
  89. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/commands.py +0 -0
  90. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/download.py +0 -0
  91. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/models.json +0 -0
  92. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/provider.py +0 -0
  93. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/runtime.py +0 -0
  94. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/local/store.py +0 -0
  95. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/mcp/__init__.py +0 -0
  96. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/mcp/catalogue.py +0 -0
  97. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/mcp/commands.py +0 -0
  98. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/mcp/http.py +0 -0
  99. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/mcp/manager.py +0 -0
  100. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/mcp/protocol.py +0 -0
  101. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/migrate.py +0 -0
  102. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/net/__init__.py +0 -0
  103. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/net/http.py +0 -0
  104. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/net/sse.py +0 -0
  105. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/net/ws.py +0 -0
  106. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/paths.py +0 -0
  107. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/__init__.py +0 -0
  108. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/anthropic.py +0 -0
  109. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/base.py +0 -0
  110. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/caching.py +0 -0
  111. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/discover.py +0 -0
  112. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/fake.py +0 -0
  113. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/gateway.py +0 -0
  114. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/models.py +0 -0
  115. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/oauth.py +0 -0
  116. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/openai_compat.py +0 -0
  117. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/providers/registry.py +0 -0
  118. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/questions.py +0 -0
  119. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/safety/__init__.py +0 -0
  120. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/safety/checkpoints.py +0 -0
  121. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/safety/permissions.py +0 -0
  122. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/safety/redact.py +0 -0
  123. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/session/__init__.py +0 -0
  124. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/session/search.py +0 -0
  125. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/session/store.py +0 -0
  126. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/setup.py +0 -0
  127. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/skills/__init__.py +0 -0
  128. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/skills/catalogue.py +0 -0
  129. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/skills/commands.py +0 -0
  130. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/skills/examples.py +0 -0
  131. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/skills/loader.py +0 -0
  132. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/skills/propose.py +0 -0
  133. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/skills/registry.py +0 -0
  134. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/__init__.py +0 -0
  135. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/api.py +0 -0
  136. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/blocks.py +0 -0
  137. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/commands.py +0 -0
  138. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/service.py +0 -0
  139. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/socket.py +0 -0
  140. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/slack/unit.py +0 -0
  141. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/telegram/__init__.py +0 -0
  142. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/telegram/api.py +0 -0
  143. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/telegram/commands.py +0 -0
  144. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/telegram/service.py +0 -0
  145. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/telegram/unit.py +0 -0
  146. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/__init__.py +0 -0
  147. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/ask.py +0 -0
  148. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/base.py +0 -0
  149. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/browse.py +0 -0
  150. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/browser.py +0 -0
  151. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/computer.py +0 -0
  152. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/delegate.py +0 -0
  153. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/history.py +0 -0
  154. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/mcp.py +0 -0
  155. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/overflow.py +0 -0
  156. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/search.py +0 -0
  157. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/shell.py +0 -0
  158. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/skills.py +0 -0
  159. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/todo.py +0 -0
  160. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/tools/web.py +0 -0
  161. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/__init__.py +0 -0
  162. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/app.py +0 -0
  163. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/banner.py +0 -0
  164. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/bidi.py +0 -0
  165. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/chooser.py +0 -0
  166. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/clipboard.py +0 -0
  167. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/console.py +0 -0
  168. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/input/__init__.py +0 -0
  169. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/input/keys.py +0 -0
  170. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/input/reader.py +0 -0
  171. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/layout.py +0 -0
  172. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/markdown.py +0 -0
  173. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/screen.py +0 -0
  174. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/theme.py +0 -0
  175. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/__init__.py +0 -0
  176. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/buttons.py +0 -0
  177. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/chat.py +0 -0
  178. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/history.py +0 -0
  179. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/overlay.py +0 -0
  180. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/panel.py +0 -0
  181. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/progress.py +0 -0
  182. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/prompt.py +0 -0
  183. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/questions.py +0 -0
  184. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/statusbar.py +0 -0
  185. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/toast.py +0 -0
  186. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/ui/widgets/welcome.py +0 -0
  187. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/uninstall.py +0 -0
  188. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/update.py +0 -0
  189. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/__init__.py +0 -0
  190. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/commands.py +0 -0
  191. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/index.html +0 -0
  192. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/server.py +0 -0
  193. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/session.py +0 -0
  194. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/ui.css +0 -0
  195. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/ui.js +0 -0
  196. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/vazirmatn-OFL.txt +0 -0
  197. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/web/vazirmatn.woff2 +0 -0
  198. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/__init__.py +0 -0
  199. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/api.py +0 -0
  200. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/commands.py +0 -0
  201. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/guide.py +0 -0
  202. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/menu.py +0 -0
  203. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/service.py +0 -0
  204. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/tunnel.py +0 -0
  205. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/unit.py +0 -0
  206. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/whatsapp/webhook.py +0 -0
  207. {comodor-0.20.0 → comodor-0.20.2}/src/comodor/workspace.py +0 -0
  208. {comodor-0.20.0 → comodor-0.20.2}/tests/conftest.py +0 -0
  209. {comodor-0.20.0 → comodor-0.20.2}/tests/support/fake_mcp_server.py +0 -0
  210. {comodor-0.20.0 → comodor-0.20.2}/tests/test_acp.py +0 -0
  211. {comodor-0.20.0 → comodor-0.20.2}/tests/test_app.py +0 -0
  212. {comodor-0.20.0 → comodor-0.20.2}/tests/test_associations.py +0 -0
  213. {comodor-0.20.0 → comodor-0.20.2}/tests/test_banner.py +0 -0
  214. {comodor-0.20.0 → comodor-0.20.2}/tests/test_bidi.py +0 -0
  215. {comodor-0.20.0 → comodor-0.20.2}/tests/test_browser.py +0 -0
  216. {comodor-0.20.0 → comodor-0.20.2}/tests/test_caching.py +0 -0
  217. {comodor-0.20.0 → comodor-0.20.2}/tests/test_channel_service.py +0 -0
  218. {comodor-0.20.0 → comodor-0.20.2}/tests/test_chooser.py +0 -0
  219. {comodor-0.20.0 → comodor-0.20.2}/tests/test_computer_tool.py +0 -0
  220. {comodor-0.20.0 → comodor-0.20.2}/tests/test_config_save.py +0 -0
  221. {comodor-0.20.0 → comodor-0.20.2}/tests/test_copy_and_bands.py +0 -0
  222. {comodor-0.20.0 → comodor-0.20.2}/tests/test_delegate.py +0 -0
  223. {comodor-0.20.0 → comodor-0.20.2}/tests/test_desktop.py +0 -0
  224. {comodor-0.20.0 → comodor-0.20.2}/tests/test_discover.py +0 -0
  225. {comodor-0.20.0 → comodor-0.20.2}/tests/test_history.py +0 -0
  226. {comodor-0.20.0 → comodor-0.20.2}/tests/test_import_command.py +0 -0
  227. {comodor-0.20.0 → comodor-0.20.2}/tests/test_input.py +0 -0
  228. {comodor-0.20.0 → comodor-0.20.2}/tests/test_layout.py +0 -0
  229. {comodor-0.20.0 → comodor-0.20.2}/tests/test_learning.py +0 -0
  230. {comodor-0.20.0 → comodor-0.20.2}/tests/test_local.py +0 -0
  231. {comodor-0.20.0 → comodor-0.20.2}/tests/test_mcp.py +0 -0
  232. {comodor-0.20.0 → comodor-0.20.2}/tests/test_mcp_http.py +0 -0
  233. {comodor-0.20.0 → comodor-0.20.2}/tests/test_migrate.py +0 -0
  234. {comodor-0.20.0 → comodor-0.20.2}/tests/test_oauth.py +0 -0
  235. {comodor-0.20.0 → comodor-0.20.2}/tests/test_overflow.py +0 -0
  236. {comodor-0.20.0 → comodor-0.20.2}/tests/test_overlay.py +0 -0
  237. {comodor-0.20.0 → comodor-0.20.2}/tests/test_performance.py +0 -0
  238. {comodor-0.20.0 → comodor-0.20.2}/tests/test_prefix_stability.py +0 -0
  239. {comodor-0.20.0 → comodor-0.20.2}/tests/test_progress.py +0 -0
  240. {comodor-0.20.0 → comodor-0.20.2}/tests/test_propose.py +0 -0
  241. {comodor-0.20.0 → comodor-0.20.2}/tests/test_providers.py +0 -0
  242. {comodor-0.20.0 → comodor-0.20.2}/tests/test_questions.py +0 -0
  243. {comodor-0.20.0 → comodor-0.20.2}/tests/test_real_browser.py +0 -0
  244. {comodor-0.20.0 → comodor-0.20.2}/tests/test_real_desktop.py +0 -0
  245. {comodor-0.20.0 → comodor-0.20.2}/tests/test_real_web_ui.py +0 -0
  246. {comodor-0.20.0 → comodor-0.20.2}/tests/test_reflex.py +0 -0
  247. {comodor-0.20.0 → comodor-0.20.2}/tests/test_run_loop.py +0 -0
  248. {comodor-0.20.0 → comodor-0.20.2}/tests/test_setup.py +0 -0
  249. {comodor-0.20.0 → comodor-0.20.2}/tests/test_setup_import.py +0 -0
  250. {comodor-0.20.0 → comodor-0.20.2}/tests/test_skill_budget.py +0 -0
  251. {comodor-0.20.0 → comodor-0.20.2}/tests/test_skill_catalogue.py +0 -0
  252. {comodor-0.20.0 → comodor-0.20.2}/tests/test_skills.py +0 -0
  253. {comodor-0.20.0 → comodor-0.20.2}/tests/test_slack.py +0 -0
  254. {comodor-0.20.0 → comodor-0.20.2}/tests/test_switching_model.py +0 -0
  255. {comodor-0.20.0 → comodor-0.20.2}/tests/test_uninstall.py +0 -0
  256. {comodor-0.20.0 → comodor-0.20.2}/tests/test_update.py +0 -0
  257. {comodor-0.20.0 → comodor-0.20.2}/tests/test_web.py +0 -0
  258. {comodor-0.20.0 → comodor-0.20.2}/tests/test_welcome.py +0 -0
  259. {comodor-0.20.0 → comodor-0.20.2}/tests/test_whatsapp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: comodor
3
- Version: 0.20.0
3
+ Version: 0.20.2
4
4
  Summary: Comodor — a self-improving terminal coding agent with a Rich TUI
5
5
  Project-URL: Homepage, https://comodor.ai
6
6
  Project-URL: Repository, https://github.com/ifekri/Comodor
@@ -14,14 +14,18 @@ Classifier: Development Status :: 4 - Beta
14
14
  Classifier: Environment :: Console
15
15
  Classifier: Intended Audience :: Developers
16
16
  Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.9
18
+ Classifier: Programming Language :: Python :: 3.10
17
19
  Classifier: Programming Language :: Python :: 3.11
18
20
  Classifier: Programming Language :: Python :: 3.12
19
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
20
23
  Classifier: Topic :: Software Development :: Code Generators
21
- Requires-Python: >=3.11
24
+ Requires-Python: >=3.9
22
25
  Requires-Dist: rich>=13.7
23
26
  Provides-Extra: dev
24
27
  Requires-Dist: pytest>=8.0; extra == 'dev'
28
+ Requires-Dist: pyyaml>=6.0; extra == 'dev'
25
29
  Requires-Dist: ruff>=0.14; extra == 'dev'
26
30
  Description-Content-Type: text/markdown
27
31
 
@@ -34,13 +38,43 @@ Description-Content-Type: text/markdown
34
38
  Fix something it wrote, and it never writes it that way again — in this project
35
39
  or the next one. Not a setting you turn on. Not a file you maintain.
36
40
 
37
- [![PyPI](https://img.shields.io/pypi/v/comodor?label=pypi&color=00e1fa)](https://pypi.org/project/comodor/)
38
- [![Python](https://img.shields.io/pypi/pyversions/comodor?color=555)](https://pypi.org/project/comodor/)
41
+ [![PyPI](https://img.shields.io/pypi/v/comodor?label=pypi&color=0A7AFF)](https://pypi.org/project/comodor/)
42
+ [![Python](https://img.shields.io/pypi/pyversions/comodor?color=cyan&labelColor=darkcyan)](https://pypi.org/project/comodor/)
39
43
  [![CI](https://github.com/ifekri/Comodor/actions/workflows/ci.yml/badge.svg)](https://github.com/ifekri/Comodor/actions/workflows/ci.yml)
40
- [![Licence](https://img.shields.io/pypi/l/comodor?color=555)](LICENSE)
41
-
42
- [**comodor.ai**](https://comodor.ai) · [Installation](#install) · [Documentation](docs/README.md) · [Changelog](CHANGELOG.md)
43
-
44
+ [![Licence](https://img.shields.io/pypi/l/comodor?color=blue&&labelColor=darkblue)](LICENSE)
45
+
46
+ <p align="center">
47
+ <a href="/docs/README.md">
48
+ <img src="https://img.shields.io/badge/Docs-EN-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="English Docs" />
49
+ </a>
50
+ <a href="/docs/FA/README.md">
51
+ <img src="https://img.shields.io/badge/Docs-FA-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Persian (Farsi) Docs" />
52
+ </a>
53
+ <a href="/docs/AR/README.md">
54
+ <img src="https://img.shields.io/badge/Docs-AR-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Arabic Docs">
55
+ </a>
56
+ <a href="/docs/TR/README.md">
57
+ <img src="https://img.shields.io/badge/Docs-TR-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Turkish Docs" />
58
+ </a>
59
+ <a href="/docs/DE/README.md">
60
+ <img src="https://img.shields.io/badge/Docs-DE-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Deutsch Docs" />
61
+ </a>
62
+ <a href="/docs/ES/README.md">
63
+ <img src="https://img.shields.io/badge/Docs-ES-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Spanish Docs" />
64
+ </a>
65
+ <a href="/docs/RU/README.md">
66
+ <img src="https://img.shields.io/badge/Docs-RU-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Russian Docs" />
67
+ </a>
68
+ <a href="/docs/FR/README.md">
69
+ <img src="https://img.shields.io/badge/Docs-FR-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="French Docs" />
70
+ </a>
71
+ <a href="/docs/ZH/README.md">
72
+ <img src="https://img.shields.io/badge/Docs-ZH-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Zhongwen Docs" />
73
+ </a>
74
+ </p>
75
+
76
+
77
+ [**comodor.ai**](https://comodor.ai) · [Installation](#install) · [Documentation](docs/README.md 'Comodor Documentation English')
44
78
 
45
79
  ---
46
80
 
@@ -67,6 +101,29 @@ Those are real, read out of a working install.
67
101
  `/progress` shows whether that is actually working — corrections per turn,
68
102
  falling or not. A number, not a claim.
69
103
 
104
+ ## Whether it is any good, measured
105
+
106
+ Most coding agents ask you to take their quality on trust. Comodor has a
107
+ benchmark: thirteen tasks in thirteen real repositories, judged by programs —
108
+ the suite goes green, the file parses, the old name is gone from every file.
109
+ Three attempts each, reported as a rate, because a single run dressed up as
110
+ "it passes" is a made-up number.
111
+
112
+ Results are committed under `bench/results/`, dated and named for the model
113
+ they are about, as JSON and as a table.
114
+
115
+ The first version of that table was wrong, and the correction is the point.
116
+ One `careful` task scored a model 0/3 for not asking a question — and the model
117
+ had in fact found the ambiguity, resolved it from the codebase's own
118
+ convention, and said so. The judge was demanding a question Comodor's prompt
119
+ tells the model *not* to ask. A judge with a made-up standard is the same bug
120
+ as a test with made-up keys, pointed the other way: one passes broken code, the
121
+ other fails correct work, and both look exactly like a real number. The task
122
+ was replaced with one whose missing piece genuinely is not in the repository.
123
+
124
+ The whole table, and how to run it against your own model, is in
125
+ [`bench/`](bench/README.md). Every number there came from a real run.
126
+
70
127
  ## Everything else it does
71
128
 
72
129
  | | |
@@ -134,6 +191,35 @@ pip install comodor
134
191
  pipx install comodor
135
192
  ```
136
193
 
194
+ ### In Docker — nothing to install
195
+
196
+ The agent, a real Chromium, git and ripgrep, in one container. It starts the
197
+ **browser interface** and prints the address to open:
198
+
199
+ ```bash
200
+ git clone https://github.com/ifekri/Comodor.git && cd Comodor
201
+ export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY, OPENROUTER_API_KEY, ...
202
+ docker compose up
203
+ ```
204
+
205
+ ```
206
+ Comodor is at http://127.0.0.1:8765/?token=...
207
+ Working in /work
208
+ ```
209
+
210
+ Open the link. The token is new every run, so use the one from *this* run —
211
+ `docker compose logs comodor` prints it again.
212
+
213
+ The agent works on `./work`; point it somewhere else with
214
+ `COMODOR_WORKDIR=/path/to/project docker compose up`. Or without cloning
215
+ anything:
216
+
217
+ ```bash
218
+ docker run --rm -it -p 127.0.0.1:8765:8765 -e ANTHROPIC_API_KEY -v "$PWD:/work" ghcr.io/ifekri/comodor:latest
219
+ ```
220
+
221
+ Full details, including how to reach it from another machine safely:
222
+ [Docker](docs/docker.md).
137
223
 
138
224
  Then `comodor`. Python 3.11 or newer. Six questions the first time, never
139
225
  again.
@@ -7,13 +7,43 @@
7
7
  Fix something it wrote, and it never writes it that way again — in this project
8
8
  or the next one. Not a setting you turn on. Not a file you maintain.
9
9
 
10
- [![PyPI](https://img.shields.io/pypi/v/comodor?label=pypi&color=00e1fa)](https://pypi.org/project/comodor/)
11
- [![Python](https://img.shields.io/pypi/pyversions/comodor?color=555)](https://pypi.org/project/comodor/)
10
+ [![PyPI](https://img.shields.io/pypi/v/comodor?label=pypi&color=0A7AFF)](https://pypi.org/project/comodor/)
11
+ [![Python](https://img.shields.io/pypi/pyversions/comodor?color=cyan&labelColor=darkcyan)](https://pypi.org/project/comodor/)
12
12
  [![CI](https://github.com/ifekri/Comodor/actions/workflows/ci.yml/badge.svg)](https://github.com/ifekri/Comodor/actions/workflows/ci.yml)
13
- [![Licence](https://img.shields.io/pypi/l/comodor?color=555)](LICENSE)
14
-
15
- [**comodor.ai**](https://comodor.ai) · [Installation](#install) · [Documentation](docs/README.md) · [Changelog](CHANGELOG.md)
16
-
13
+ [![Licence](https://img.shields.io/pypi/l/comodor?color=blue&&labelColor=darkblue)](LICENSE)
14
+
15
+ <p align="center">
16
+ <a href="/docs/README.md">
17
+ <img src="https://img.shields.io/badge/Docs-EN-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="English Docs" />
18
+ </a>
19
+ <a href="/docs/FA/README.md">
20
+ <img src="https://img.shields.io/badge/Docs-FA-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Persian (Farsi) Docs" />
21
+ </a>
22
+ <a href="/docs/AR/README.md">
23
+ <img src="https://img.shields.io/badge/Docs-AR-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Arabic Docs">
24
+ </a>
25
+ <a href="/docs/TR/README.md">
26
+ <img src="https://img.shields.io/badge/Docs-TR-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Turkish Docs" />
27
+ </a>
28
+ <a href="/docs/DE/README.md">
29
+ <img src="https://img.shields.io/badge/Docs-DE-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Deutsch Docs" />
30
+ </a>
31
+ <a href="/docs/ES/README.md">
32
+ <img src="https://img.shields.io/badge/Docs-ES-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Spanish Docs" />
33
+ </a>
34
+ <a href="/docs/RU/README.md">
35
+ <img src="https://img.shields.io/badge/Docs-RU-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Russian Docs" />
36
+ </a>
37
+ <a href="/docs/FR/README.md">
38
+ <img src="https://img.shields.io/badge/Docs-FR-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="French Docs" />
39
+ </a>
40
+ <a href="/docs/ZH/README.md">
41
+ <img src="https://img.shields.io/badge/Docs-ZH-green?logo=github&logoColor=white&style=plastic&labelColor=darkgreen" alt="Zhongwen Docs" />
42
+ </a>
43
+ </p>
44
+
45
+
46
+ [**comodor.ai**](https://comodor.ai) · [Installation](#install) · [Documentation](docs/README.md 'Comodor Documentation English')
17
47
 
18
48
  ---
19
49
 
@@ -40,6 +70,29 @@ Those are real, read out of a working install.
40
70
  `/progress` shows whether that is actually working — corrections per turn,
41
71
  falling or not. A number, not a claim.
42
72
 
73
+ ## Whether it is any good, measured
74
+
75
+ Most coding agents ask you to take their quality on trust. Comodor has a
76
+ benchmark: thirteen tasks in thirteen real repositories, judged by programs —
77
+ the suite goes green, the file parses, the old name is gone from every file.
78
+ Three attempts each, reported as a rate, because a single run dressed up as
79
+ "it passes" is a made-up number.
80
+
81
+ Results are committed under `bench/results/`, dated and named for the model
82
+ they are about, as JSON and as a table.
83
+
84
+ The first version of that table was wrong, and the correction is the point.
85
+ One `careful` task scored a model 0/3 for not asking a question — and the model
86
+ had in fact found the ambiguity, resolved it from the codebase's own
87
+ convention, and said so. The judge was demanding a question Comodor's prompt
88
+ tells the model *not* to ask. A judge with a made-up standard is the same bug
89
+ as a test with made-up keys, pointed the other way: one passes broken code, the
90
+ other fails correct work, and both look exactly like a real number. The task
91
+ was replaced with one whose missing piece genuinely is not in the repository.
92
+
93
+ The whole table, and how to run it against your own model, is in
94
+ [`bench/`](bench/README.md). Every number there came from a real run.
95
+
43
96
  ## Everything else it does
44
97
 
45
98
  | | |
@@ -107,6 +160,35 @@ pip install comodor
107
160
  pipx install comodor
108
161
  ```
109
162
 
163
+ ### In Docker — nothing to install
164
+
165
+ The agent, a real Chromium, git and ripgrep, in one container. It starts the
166
+ **browser interface** and prints the address to open:
167
+
168
+ ```bash
169
+ git clone https://github.com/ifekri/Comodor.git && cd Comodor
170
+ export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY, OPENROUTER_API_KEY, ...
171
+ docker compose up
172
+ ```
173
+
174
+ ```
175
+ Comodor is at http://127.0.0.1:8765/?token=...
176
+ Working in /work
177
+ ```
178
+
179
+ Open the link. The token is new every run, so use the one from *this* run —
180
+ `docker compose logs comodor` prints it again.
181
+
182
+ The agent works on `./work`; point it somewhere else with
183
+ `COMODOR_WORKDIR=/path/to/project docker compose up`. Or without cloning
184
+ anything:
185
+
186
+ ```bash
187
+ docker run --rm -it -p 127.0.0.1:8765:8765 -e ANTHROPIC_API_KEY -v "$PWD:/work" ghcr.io/ifekri/comodor:latest
188
+ ```
189
+
190
+ Full details, including how to reach it from another machine safely:
191
+ [Docker](docs/docker.md).
110
192
 
111
193
  Then `comodor`. Python 3.11 or newer. Six questions the first time, never
112
194
  again.
@@ -0,0 +1,95 @@
1
+ # The Comodor benchmark
2
+
3
+ Thirteen coding tasks in thirteen small repositories, judged by programs.
4
+
5
+ It exists because the test suite answers "are the parts wired together" and
6
+ nothing answered "is it any good at the job". Without that second number, every
7
+ change to the system prompt, the tool descriptions or the agent loop is a guess
8
+ with a story attached.
9
+
10
+ ## Running it
11
+
12
+ ```
13
+ python -m bench --provider xiaomi --model mimo-v2.5-pro
14
+ python -m bench --provider anthropic --model claude-sonnet-5 --tries 3
15
+ python -m bench --only fix- --tries 1 # one category, one attempt
16
+ python -m bench --dry-run # list the suite, run nothing
17
+ ```
18
+
19
+ The API key comes from the environment, or from a `.env` beside the source.
20
+ Nothing reads your Comodor config: every attempt gets its own `COMODOR_HOME`,
21
+ its own copy of the task's repository, and the learning engine switched off.
22
+
23
+ Results land in `results/` as JSON and as a Markdown table, named for the model
24
+ and the date.
25
+
26
+ ## What a task is
27
+
28
+ ```
29
+ tasks/fix-off-by-one/
30
+ task.md the prompt, verbatim — nothing else is sent
31
+ repo/ the starting state, copied fresh for every attempt
32
+ check.py the judge, and the step and time budget
33
+ hidden/ tests added after the run, for `feature` tasks only
34
+ ```
35
+
36
+ ## Categories
37
+
38
+ | | What it measures |
39
+ | --- | --- |
40
+ | `fix` | make a failing test pass, without changing the test |
41
+ | `feature` | build to a written spec, judged by tests held back |
42
+ | `find` | search and read — run in plan mode, so it cannot write |
43
+ | `refactor` | change across files, keeping behaviour and leaving nothing behind |
44
+ | `careful` | does *not* do the wrong thing |
45
+
46
+ `careful` is the one nobody else measures and the reason this suite is worth
47
+ having. It contains a request with a real ambiguity in it — passed only by
48
+ asking *before* the first edit, not after; a fix in one file with the identical
49
+ bug sitting in the file next door, which must be left alone; and a task that
50
+ cannot be completed honestly, where the only passing answer says so instead of
51
+ inventing the data that would make the suite green.
52
+
53
+ ## How the numbers are reported
54
+
55
+ Every task is run three times and reported as a rate — `3/3`, `1/3` — never as
56
+ a single boolean. Agents are not deterministic and a single run presented as
57
+ "it passes" is a made-up number with a real one's face on.
58
+
59
+ Every published result names the model, the provider, the date and the machine.
60
+ Nothing is estimated, projected or rounded up from a partial run.
61
+
62
+ ## A judge can be wrong, and it looks exactly like a result
63
+
64
+ The first `careful` task here asked for a `delete` operation across two storage
65
+ backends that disagreed about missing keys, and required the agent to ask
66
+ before building. A model scored 0/3 on it — and it had found the ambiguity,
67
+ resolved it from each backend's own existing convention, and said so with file
68
+ and line. Comodor's own prompt tells it to do precisely that: *"do not ask
69
+ about matters with an obvious default — pick the default and say that you
70
+ did."*
71
+
72
+ **A judge with a made-up standard is the same bug as a test with made-up keys,
73
+ pointed the other way.** One passes broken code; the other fails correct work.
74
+ Both produce a number indistinguishable from a real one.
75
+
76
+ Two rules came out of it, and they apply to every task added from now on:
77
+
78
+ *Read what the agent actually said before believing the verdict.* A failure
79
+ nobody has read is a failure nobody has checked.
80
+
81
+ *A `careful` task must turn on something the repository cannot answer.* If the
82
+ code settles it, the right behaviour is to read the code, decide, and say so —
83
+ and a task that punishes that is measuring the task author.
84
+
85
+ ## Adding a task
86
+
87
+ Every bug found in Comodor from now on becomes one. That is the only way the
88
+ suite is meant to grow — a task written to make a number look good is a task
89
+ that measures nothing.
90
+
91
+ A new task needs the four files above, and two things must be true before it
92
+ counts: a reference solution passes it, and `tests/test_bench.py` still passes
93
+ — it checks that every `fix` task starts red, every `refactor` task starts
94
+ green, every `feature` task's hidden tests fail before the work, and that each
95
+ judge refuses the specific shortcut its task invites.
@@ -0,0 +1,11 @@
1
+ # pricing-client
2
+
3
+ A thin client for the internal pricing service.
4
+
5
+ from client import Client
6
+ import settings
7
+
8
+ api = Client(settings.BASE_URL, settings.TOKEN)
9
+ api.prices(["SKU-1", "SKU-2"])
10
+
11
+ `prices` makes one request per SKU; the service has no batch endpoint.
@@ -0,0 +1,109 @@
1
+ # توثيق Comodor
2
+
3
+ وكيل برمجة يعمل في الطرفية ويتعلم بالطريقة التي تصحّح بها أخطاءه.
4
+
5
+ أنت جديد هنا؟ **[البداية](getting-started.md)** تستغرق نحو خمس دقائق وتنتهي
6
+ بالوكيل وهو يؤدي شيئًا مفيدًا.
7
+
8
+ ---
9
+
10
+ ## حسب ما تحاول فعله
11
+
12
+ ### ابدأ
13
+
14
+ | | |
15
+ |---|---|
16
+ | [البداية](getting-started.md) | التثبيت، اختيار نموذج، أول مهمة |
17
+ | [الانتقال من وكيل آخر](migrating.md) | إحضار المفاتيح والمهارات من OpenClaw أو Hermes |
18
+ | [اختيار نموذج](models.md) | أي مزوّد، أي نموذج، وكم يكلف |
19
+
20
+ ### استخدمه
21
+
22
+ | | |
23
+ |---|---|
24
+ | [الواجهة](interface.md) | اللوحات، المفاتيح، الأنماط، وجميع الأوامر الـ 29 |
25
+ | [من الطرفية](cli.md) | كل أمر وكل علَم، مع أمثلة |
26
+ | [ما يستطيع الوكيل فعله](tools.md) | الأدوات الـ 13 التي يملكها، ومتى يستخدم كلًا منها |
27
+ | [المهارات](skills.md) | إجراءات تكتبها مرة واحدة ويتّبعها |
28
+
29
+ ### دَعه يصل أبعد
30
+
31
+ | | |
32
+ |---|---|
33
+ | [المتصفح الحقيقي](browser.md) | متصفح يشغّل JavaScript ويستطيع تسجيل الدخول |
34
+ | [استخدام شاشتك](computer.md) | الفأرة ولوحة المفاتيح، في أي تطبيق |
35
+ | [من متصفح](web.md) | واجهة الويب، محليًا أو على خادم |
36
+ | [في محررك](acp.md) | تحكّم في Comodor من Zed أو أي عميل Agent Client Protocol |
37
+ | [في Docker](docker.md) | أمر واحد، داخل حاوية |
38
+ | [خوادم MCP](mcp.md) | أدوات من بروتوكول Model Context Protocol |
39
+
40
+ ### افهمه
41
+
42
+ | | |
43
+ |---|---|
44
+ | [من هاتفك](telegram.md) | بوت Telegram: الاقتران، الأزرار، ومن يجيب له |
45
+ | [من Slack](slack.md) | Socket Mode — خمس دقائق، دون عنوان عام، ويجيب داخل السلاسل |
46
+ | [من WhatsApp](whatsapp.md) | واجهة Cloud API — نحو عشرين دقيقة وتتطلب خبرة تقنية. Telegram يفعل الشيء نفسه في دقيقة واحدة |
47
+ | [نماذج على جهازك](local-models.md) | تنزيل نموذج، تشغيله دون اتصال، وإضافته إلى القائمة |
48
+ | [الأسئلة](questions.md) | النموذج الذي يعرضه عندما يقبل الطلب فهمين |
49
+ | [كيف يتعلم](learning.md) | التصحيحات، الدروس، القواعد، والدليل |
50
+ | [السلامة والأذونات](safety.md) | ما يستطيع فعله، ما يسأل عنه، وما لا يفعله أبدًا |
51
+ | [التكلفة](cost.md) | التخزين المؤقت، الميزانيات، ودفع أقل مقابل العمل نفسه |
52
+ | [الإعداد](configuration.md) | كل إعداد، أين تسكن الملفات، أيّها يَحْسَم |
53
+
54
+ ### عندما يحدث خلل
55
+
56
+ | | |
57
+ |---|---|
58
+ | [استكشاف الأخطاء وإصلاحها](troubleshooting.md) | `doctor`، المشاكل الشائعة، وكيفية الإبلاغ عن واحدة |
59
+
60
+ ---
61
+
62
+ ## أقصر نسخة ممكنة
63
+
64
+ ```bash
65
+ curl -fsSL get.comodor.ai | sh # macOS, Linux
66
+ irm get.comodor.ai | iex # Windows
67
+
68
+ comodor # it asks a few questions, once
69
+ ```
70
+
71
+ ثم اكتب ما تريد. صحّحه عندما يخطئ — عدّل الملف بنفسك أو قل ذلك فقط — ويتعلم.
72
+ يُظهر لك `/progress` ما إذا كان ذلك يعمل فعلًا.
73
+
74
+ ```bash
75
+ comodor run "fix the failing test in tests/test_parser.py" # one task, no interface
76
+ comodor web # from a browser
77
+ comodor doctor # is everything alright?
78
+ comodor help # the written help page
79
+ ```
80
+
81
+ ## ما يميزه
82
+
83
+ **يتعلم من التصحيحات، لا من المدح.** معظم الوكلاء ينسون في اللحظة التي تنتهي
84
+ فيها الجلسة. يراقب Comodor ما تغيّره في مخرجاته ويحوّله إلى درس بدرجة ثقة
85
+ ترتفع عندما يثبت صحه وتنخفض عندما لا يثبت. يشرح [كيف يتعلم](learning.md)
86
+ الآلية؛ ويعرض `/progress` الدليل.
87
+
88
+ **يسأل قبل أن يتصرف، وكل شيء قابل للتراجع.** القراءة صامتة. الكتابة تسأل.
89
+ تشغيل أمر يسأل بصوت أعلى. كل كتابة محفوظة كنقطة استرجاع، ويعيد `/undo` آخر
90
+ واحدة منها. [السلامة والأذونات](safety.md).
91
+
92
+ **تبعية واحدة.** عميل HTTP، وقارئ SSE، وWebSocket الخاص بالمتصفح، ومشفّر PNG
93
+ للقطات الشاشة — كلها جزء من الحزمة. يُدخل تثبيت Comodor `rich` ولا شيء غيرها.
94
+
95
+ **يستطيع استخدام متصفح حقيقي وسطح مكتب حقيقي.** ليس مجرد جامع نصوص: متصفح
96
+ يشغّل JavaScript ويحفظ ملفات تعريف الارتباط، و — على Windows — الفأرة
97
+ ولوحة المفاتيح، مع هالة على الشاشة تبين لك أين سينقر.
98
+ [المتصفح](browser.md)، [الشاشة](computer.md).
99
+
100
+ ---
101
+
102
+ ## أيضًا في المستودع
103
+
104
+ | | |
105
+ |---|---|
106
+ | [CHANGELOG](../CHANGELOG.md) | ما تغيّر، ولماذا |
107
+ | [CONTRIBUTING](../CONTRIBUTING.md) | العمل على Comodor نفسه |
108
+ | [SECURITY](../SECURITY.md) | الإبلاغ عن أمر حساس |
109
+ | [RELEASING](../RELEASING.md) | كيف يُقطَع إصدار |
@@ -0,0 +1,114 @@
1
+ # Comodor-Dokumentation
2
+
3
+ Ein Terminal-Coding-Agent, der lernt, wie Sie ihn korrigieren.
4
+
5
+ Neu hier? **[Erste Schritte](getting-started.md)** dauert etwa fünf Minuten und
6
+ endet damit, dass der Agent etwas Nützliches tut.
7
+
8
+ ---
9
+
10
+ ## Wonach Sie gerade suchen
11
+
12
+ ### Den Einstieg finden
13
+
14
+ | | |
15
+ |---|---|
16
+ | [Erste Schritte](getting-started.md) | Installation, Modellwahl, erste Aufgabe |
17
+ | [Von einem anderen Agenten kommend](migrating.md) | Schlüssel und Skills aus OpenClaw oder Hermes übernehmen |
18
+ | [Ein Modell wählen](models.md) | Welcher Anbieter, welches Modell, was es kostet |
19
+
20
+ ### Es benutzen
21
+
22
+ | | |
23
+ |---|---|
24
+ | [Die Oberfläche](interface.md) | Panels, Tasten, Modi und alle 29 Befehle |
25
+ | [Aus dem Terminal](cli.md) | Jeder Befehl und jedes Flag, mit Beispielen |
26
+ | [Was der Agent kann](tools.md) | Die 13 Werkzeuge, die er hat, und wann er welches einsetzt |
27
+ | [Skills](skills.md) | Abläufe, die Sie einmal schreiben und denen er folgt |
28
+
29
+ ### Es weiter reichen lassen
30
+
31
+ | | |
32
+ |---|---|
33
+ | [Der echte Browser](browser.md) | Ein Browser, der JavaScript ausführt und sich anmelden kann |
34
+ | [Den Bildschirm benutzen](computer.md) | Maus und Tastatur, in jeder Anwendung |
35
+ | [Aus dem Browser](web.md) | Die Weboberfläche, lokal oder auf einem Server |
36
+ | [Im Editor](acp.md) | Comodor aus Zed oder einem beliebigen Agent Client Protocol Client steuern |
37
+ | [In Docker](docker.md) | Ein Befehl, in einem Container |
38
+ | [MCP-Server](mcp.md) | Werkzeuge aus dem Model Context Protocol |
39
+
40
+ ### Es verstehen
41
+
42
+ | | |
43
+ |---|---|
44
+ | [Vom Handy aus](telegram.md) | Der Telegram-Bot: Kopplung, die Tasten und wem er antwortet |
45
+ | [Aus Slack](slack.md) | Socket Mode — fünf Minuten, keine öffentliche Adresse, und er antwortet in Threads |
46
+ | [Aus WhatsApp](whatsapp.md) | Die Cloud API — etwa zwanzig Minuten und technisch. Telegram tut dasselbe in einem |
47
+ | [Modelle auf dem eigenen Rechner](local-models.md) | Eines herunterladen, offline betreiben, zur Liste hinzufügen |
48
+ | [Rückfragen](questions.md) | Das Formular, das er einblendet, wenn eine Anfrage zweideutig ist |
49
+ | [Wie er lernt](learning.md) | Korrekturen, Lektionen, Regeln und der Nachweis |
50
+ | [Sicherheit und Berechtigungen](safety.md) | Was er kann, was er fragt, was er niemals tut |
51
+ | [Kosten](cost.md) | Caching, Budgets und weniger zahlen für dieselbe Arbeit |
52
+ | [Konfiguration](configuration.md) | Jede Einstellung, wo die Dateien liegen, was sich durchsetzt |
53
+
54
+ ### Wenn etwas nicht stimmt
55
+
56
+ | | |
57
+ |---|---|
58
+ | [Fehlerbehebung](troubleshooting.md) | `doctor`, übliche Probleme und wie man eines meldet |
59
+
60
+ ---
61
+
62
+ ## Die kürzest mögliche Version
63
+
64
+ ```bash
65
+ curl -fsSL get.comodor.ai | sh # macOS, Linux
66
+ irm get.comodor.ai | iex # Windows
67
+
68
+ comodor # es stellt ein paar Fragen, einmalig
69
+ ```
70
+
71
+ Dann tippen Sie, was Sie wollen. Korrigieren Sie es, wenn es falsch liegt —
72
+ ändern Sie die Datei oder sagen Sie es einfach — und es lernt. `/progress`
73
+ zeigt Ihnen, ob das tatsächlich funktioniert.
74
+
75
+ ```bash
76
+ comodor run "fix the failing test in tests/test_parser.py" # eine Aufgabe, keine Oberfläche
77
+ comodor web # aus dem Browser
78
+ comodor doctor # ist alles in Ordnung?
79
+ comodor help # die geschriebene Hilfeseite
80
+ ```
81
+
82
+ ## Was es anders macht
83
+
84
+ **Es lernt aus Korrekturen, nicht aus Lob.** Die meisten Agents vergessen den
85
+ Moment, in dem eine Sitzung endet. Comodor beobachtet, was Sie an seiner
86
+ Ausgabe ändern, und macht daraus eine Lektion mit einem Vertrauenswert, der
87
+ steigt, wenn sie sich bewährt, und sinkt, wenn nicht. [Wie er lernt](learning.md)
88
+ erklärt den Mechanismus; `/progress` zeigt die Belege.
89
+
90
+ **Es fragt, bevor es handelt, und alles ist rückgängig zu machen.** Lesen
91
+ geschieht stillschweigend. Schreiben fragt. Ein Befehl fragt deutlicher. Jeder
92
+ Schreibvorgang wird als Prüfpunkt gesichert, und `/undo` stellt den letzten
93
+ wieder her. [Sicherheit und Berechtigungen](safety.md).
94
+
95
+ **Eine einzige Abhängigkeit.** Der HTTP-Client, der SSE-Reader, das WebSocket
96
+ für den Browser, der PNG-Encoder für Screenshots — alles Teil des Pakets. Die
97
+ Installation von Comodor zieht `rich` nach sich und sonst nichts.
98
+
99
+ **Es kann einen echten Browser und einen echten Desktop benutzen.** Kein
100
+ Text-Fetcher: ein Browser, der JavaScript ausführt und Cookies behält, und —
101
+ unter Windows — Maus und Tastatur, mit einem Halo auf dem Bildschirm, der
102
+ zeigt, wo er als Nächstes klicken wird. [Browser](browser.md),
103
+ [Bildschirm](computer.md).
104
+
105
+ ---
106
+
107
+ ## Außerdem im Repository
108
+
109
+ | | |
110
+ |---|---|
111
+ | [CHANGELOG](../CHANGELOG.md) | Was sich geändert hat, und warum |
112
+ | [CONTRIBUTING](../CONTRIBUTING.md) | An Comodor selbst arbeiten |
113
+ | [SECURITY](../SECURITY.md) | etwas Sensibles melden |
114
+ | [RELEASING](../RELEASING.md) | Wie ein Release geschnitten wird |