see-your-agents 0.1.0__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 (307) hide show
  1. see_your_agents-0.1.0/.claude/skills/add-feature/SKILL.md +49 -0
  2. see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +76 -0
  3. see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +44 -0
  5. see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/translation.yml +44 -0
  6. see_your_agents-0.1.0/.github/pull_request_template.md +20 -0
  7. see_your_agents-0.1.0/.github/workflows/ci.yml +51 -0
  8. see_your_agents-0.1.0/.github/workflows/release.yml +56 -0
  9. see_your_agents-0.1.0/.gitignore +23 -0
  10. see_your_agents-0.1.0/AGENTS.md +13 -0
  11. see_your_agents-0.1.0/CHANGELOG.md +49 -0
  12. see_your_agents-0.1.0/CLAUDE.md +27 -0
  13. see_your_agents-0.1.0/CODE_OF_CONDUCT.md +10 -0
  14. see_your_agents-0.1.0/CONTRIBUTING.md +207 -0
  15. see_your_agents-0.1.0/LICENSE +21 -0
  16. see_your_agents-0.1.0/PKG-INFO +113 -0
  17. see_your_agents-0.1.0/README.md +100 -0
  18. see_your_agents-0.1.0/SECURITY.md +47 -0
  19. see_your_agents-0.1.0/demo/build.py +83 -0
  20. see_your_agents-0.1.0/demo/demo-api.js +555 -0
  21. see_your_agents-0.1.0/docs/ARCHITECTURE.md +318 -0
  22. see_your_agents-0.1.0/docs/README.md +28 -0
  23. see_your_agents-0.1.0/docs/adding-a-feature.md +311 -0
  24. see_your_agents-0.1.0/docs/configuration.md +201 -0
  25. see_your_agents-0.1.0/docs/i18n.md +316 -0
  26. see_your_agents-0.1.0/docs/notes/claude-hooks-notes.md +106 -0
  27. see_your_agents-0.1.0/docs/notes/claude-sandbox-notes.md +229 -0
  28. see_your_agents-0.1.0/docs/notes/codex-cli-notes.md +129 -0
  29. see_your_agents-0.1.0/docs/providers.md +218 -0
  30. see_your_agents-0.1.0/docs/security.md +277 -0
  31. see_your_agents-0.1.0/docs/user-guide.md +387 -0
  32. see_your_agents-0.1.0/pyproject.toml +37 -0
  33. see_your_agents-0.1.0/scripts/shoot.mjs +71 -0
  34. see_your_agents-0.1.0/src/see_your_agents/__init__.py +14 -0
  35. see_your_agents-0.1.0/src/see_your_agents/app/__init__.py +1 -0
  36. see_your_agents-0.1.0/src/see_your_agents/app/cli.py +176 -0
  37. see_your_agents-0.1.0/src/see_your_agents/app/feature.py +144 -0
  38. see_your_agents-0.1.0/src/see_your_agents/app/mcp.py +236 -0
  39. see_your_agents-0.1.0/src/see_your_agents/app/pairing.py +162 -0
  40. see_your_agents-0.1.0/src/see_your_agents/app/replies.py +16 -0
  41. see_your_agents-0.1.0/src/see_your_agents/app/server.py +385 -0
  42. see_your_agents-0.1.0/src/see_your_agents/app/watchdog.py +306 -0
  43. see_your_agents-0.1.0/src/see_your_agents/core/__init__.py +1 -0
  44. see_your_agents-0.1.0/src/see_your_agents/core/done.py +66 -0
  45. see_your_agents-0.1.0/src/see_your_agents/core/env.py +37 -0
  46. see_your_agents-0.1.0/src/see_your_agents/core/index.py +249 -0
  47. see_your_agents-0.1.0/src/see_your_agents/core/jira.py +55 -0
  48. see_your_agents-0.1.0/src/see_your_agents/core/providers/__init__.py +63 -0
  49. see_your_agents-0.1.0/src/see_your_agents/core/providers/base.py +489 -0
  50. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/__init__.py +3 -0
  51. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/courier.py +193 -0
  52. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/launch.py +218 -0
  53. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/live.py +130 -0
  54. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/paths.py +15 -0
  55. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/provider.py +87 -0
  56. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/routes.py +497 -0
  57. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/thread.py +280 -0
  58. see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/transcript.py +475 -0
  59. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/__init__.py +3 -0
  60. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/daemon.py +320 -0
  61. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/launch.py +220 -0
  62. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/live.py +201 -0
  63. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/names.py +77 -0
  64. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/paths.py +10 -0
  65. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/provider.py +97 -0
  66. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/queue.py +179 -0
  67. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/rollout.py +361 -0
  68. see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/thread.py +172 -0
  69. see_your_agents-0.1.0/src/see_your_agents/core/sessions.py +195 -0
  70. see_your_agents-0.1.0/src/see_your_agents/core/uploads.py +14 -0
  71. see_your_agents-0.1.0/src/see_your_agents/features/__init__.py +39 -0
  72. see_your_agents-0.1.0/src/see_your_agents/features/approvals/__init__.py +22 -0
  73. see_your_agents-0.1.0/src/see_your_agents/features/approvals/approvals.py +349 -0
  74. see_your_agents-0.1.0/src/see_your_agents/features/approvals/hook.py +272 -0
  75. see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/de.json +47 -0
  76. see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/en.json +47 -0
  77. see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/es.json +47 -0
  78. see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/fr.json +47 -0
  79. see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/ru.json +47 -0
  80. see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/zh-CN.json +47 -0
  81. see_your_agents-0.1.0/src/see_your_agents/features/approvals/install.py +222 -0
  82. see_your_agents-0.1.0/src/see_your_agents/features/approvals/store.py +131 -0
  83. see_your_agents-0.1.0/src/see_your_agents/features/approvals/web/approvals.css +46 -0
  84. see_your_agents-0.1.0/src/see_your_agents/features/approvals/web/approvals.js +215 -0
  85. see_your_agents-0.1.0/src/see_your_agents/features/awake/__init__.py +15 -0
  86. see_your_agents-0.1.0/src/see_your_agents/features/awake/awake.py +160 -0
  87. see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/de.json +8 -0
  88. see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/en.json +8 -0
  89. see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/es.json +8 -0
  90. see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/fr.json +8 -0
  91. see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/ru.json +8 -0
  92. see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/zh-CN.json +8 -0
  93. see_your_agents-0.1.0/src/see_your_agents/features/awake/web/awake.js +35 -0
  94. see_your_agents-0.1.0/src/see_your_agents/features/board/__init__.py +7 -0
  95. see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/de.json +33 -0
  96. see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/en.json +33 -0
  97. see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/es.json +34 -0
  98. see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/fr.json +34 -0
  99. see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/ru.json +35 -0
  100. see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/zh-CN.json +32 -0
  101. see_your_agents-0.1.0/src/see_your_agents/features/board/web/board.css +94 -0
  102. see_your_agents-0.1.0/src/see_your_agents/features/board/web/board.js +97 -0
  103. see_your_agents-0.1.0/src/see_your_agents/features/builder/__init__.py +18 -0
  104. see_your_agents-0.1.0/src/see_your_agents/features/builder/agent.py +331 -0
  105. see_your_agents-0.1.0/src/see_your_agents/features/builder/builder.py +527 -0
  106. see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/de.json +102 -0
  107. see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/en.json +102 -0
  108. see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/es.json +103 -0
  109. see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/fr.json +103 -0
  110. see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/ru.json +104 -0
  111. see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/zh-CN.json +101 -0
  112. see_your_agents-0.1.0/src/see_your_agents/features/builder/preview.py +154 -0
  113. see_your_agents-0.1.0/src/see_your_agents/features/builder/repo.py +141 -0
  114. see_your_agents-0.1.0/src/see_your_agents/features/builder/routes.py +138 -0
  115. see_your_agents-0.1.0/src/see_your_agents/features/builder/store.py +123 -0
  116. see_your_agents-0.1.0/src/see_your_agents/features/builder/supervisor.md +5 -0
  117. see_your_agents-0.1.0/src/see_your_agents/features/builder/web/builder.css +48 -0
  118. see_your_agents-0.1.0/src/see_your_agents/features/builder/web/builder.js +189 -0
  119. see_your_agents-0.1.0/src/see_your_agents/features/chat/__init__.py +32 -0
  120. see_your_agents-0.1.0/src/see_your_agents/features/chat/bridge.py +196 -0
  121. see_your_agents-0.1.0/src/see_your_agents/features/chat/delivery.py +223 -0
  122. see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/de.json +117 -0
  123. see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/en.json +117 -0
  124. see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/es.json +117 -0
  125. see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/fr.json +117 -0
  126. see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/ru.json +117 -0
  127. see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/zh-CN.json +117 -0
  128. see_your_agents-0.1.0/src/see_your_agents/features/chat/thread.py +101 -0
  129. see_your_agents-0.1.0/src/see_your_agents/features/chat/web/chat.css +251 -0
  130. see_your_agents-0.1.0/src/see_your_agents/features/chat/web/chat.js +843 -0
  131. see_your_agents-0.1.0/src/see_your_agents/features/chat/web/quote.css +11 -0
  132. see_your_agents-0.1.0/src/see_your_agents/features/chat/web/quote.js +76 -0
  133. see_your_agents-0.1.0/src/see_your_agents/features/groups/__init__.py +17 -0
  134. see_your_agents-0.1.0/src/see_your_agents/features/groups/api.py +110 -0
  135. see_your_agents-0.1.0/src/see_your_agents/features/groups/feed.py +163 -0
  136. see_your_agents-0.1.0/src/see_your_agents/features/groups/groups.py +205 -0
  137. see_your_agents-0.1.0/src/see_your_agents/features/groups/handles.py +61 -0
  138. see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/de.json +70 -0
  139. see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/en.json +70 -0
  140. see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/es.json +70 -0
  141. see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/fr.json +70 -0
  142. see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/ru.json +70 -0
  143. see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/zh-CN.json +70 -0
  144. see_your_agents-0.1.0/src/see_your_agents/features/groups/mcp_tools.py +76 -0
  145. see_your_agents-0.1.0/src/see_your_agents/features/groups/post.py +218 -0
  146. see_your_agents-0.1.0/src/see_your_agents/features/groups/store.py +136 -0
  147. see_your_agents-0.1.0/src/see_your_agents/features/groups/supervisor.md +8 -0
  148. see_your_agents-0.1.0/src/see_your_agents/features/groups/web/groups.css +85 -0
  149. see_your_agents-0.1.0/src/see_your_agents/features/groups/web/groups.js +356 -0
  150. see_your_agents-0.1.0/src/see_your_agents/features/keys/__init__.py +7 -0
  151. see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/de.json +30 -0
  152. see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/en.json +30 -0
  153. see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/es.json +30 -0
  154. see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/fr.json +30 -0
  155. see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/ru.json +30 -0
  156. see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/zh-CN.json +30 -0
  157. see_your_agents-0.1.0/src/see_your_agents/features/keys/web/keys.css +47 -0
  158. see_your_agents-0.1.0/src/see_your_agents/features/keys/web/keys.js +166 -0
  159. see_your_agents-0.1.0/src/see_your_agents/features/launch/__init__.py +17 -0
  160. see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/de.json +49 -0
  161. see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/en.json +49 -0
  162. see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/es.json +49 -0
  163. see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/fr.json +49 -0
  164. see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/ru.json +49 -0
  165. see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/zh-CN.json +49 -0
  166. see_your_agents-0.1.0/src/see_your_agents/features/launch/launch.py +215 -0
  167. see_your_agents-0.1.0/src/see_your_agents/features/launch/web/launch.css +58 -0
  168. see_your_agents-0.1.0/src/see_your_agents/features/launch/web/launch.js +334 -0
  169. see_your_agents-0.1.0/src/see_your_agents/features/looks/__init__.py +15 -0
  170. see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/de.json +77 -0
  171. see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/en.json +77 -0
  172. see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/es.json +77 -0
  173. see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/fr.json +77 -0
  174. see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/ru.json +77 -0
  175. see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/zh-CN.json +77 -0
  176. see_your_agents-0.1.0/src/see_your_agents/features/looks/looks.py +143 -0
  177. see_your_agents-0.1.0/src/see_your_agents/features/looks/web/looks.css +135 -0
  178. see_your_agents-0.1.0/src/see_your_agents/features/looks/web/looks.js +563 -0
  179. see_your_agents-0.1.0/src/see_your_agents/features/mr/__init__.py +15 -0
  180. see_your_agents-0.1.0/src/see_your_agents/features/mr/glab.py +190 -0
  181. see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/de.json +52 -0
  182. see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/en.json +52 -0
  183. see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/es.json +52 -0
  184. see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/fr.json +52 -0
  185. see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/ru.json +52 -0
  186. see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/zh-CN.json +52 -0
  187. see_your_agents-0.1.0/src/see_your_agents/features/mr/watch.py +298 -0
  188. see_your_agents-0.1.0/src/see_your_agents/features/mr/web/mr.css +32 -0
  189. see_your_agents-0.1.0/src/see_your_agents/features/mr/web/mr.js +127 -0
  190. see_your_agents-0.1.0/src/see_your_agents/features/office/__init__.py +7 -0
  191. see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/de.json +17 -0
  192. see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/en.json +17 -0
  193. see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/es.json +17 -0
  194. see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/fr.json +17 -0
  195. see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/ru.json +17 -0
  196. see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/zh-CN.json +17 -0
  197. see_your_agents-0.1.0/src/see_your_agents/features/office/web/office.css +49 -0
  198. see_your_agents-0.1.0/src/see_your_agents/features/office/web/office.js +96 -0
  199. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/__init__.py +17 -0
  200. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/fleet.py +249 -0
  201. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/de.json +6 -0
  202. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/en.json +6 -0
  203. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/es.json +6 -0
  204. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/fr.json +6 -0
  205. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/ru.json +6 -0
  206. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/zh-CN.json +6 -0
  207. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/launch.py +254 -0
  208. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/mcp_tools.py +244 -0
  209. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/prompts/fleet-supervisor.md +18 -0
  210. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/prompts/supervisor.md +23 -0
  211. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/web/supervisor.css +20 -0
  212. see_your_agents-0.1.0/src/see_your_agents/features/supervisor/web/supervisor.js +29 -0
  213. see_your_agents-0.1.0/src/see_your_agents/features/todo/__init__.py +18 -0
  214. see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/de.json +45 -0
  215. see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/en.json +45 -0
  216. see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/es.json +45 -0
  217. see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/fr.json +45 -0
  218. see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/ru.json +50 -0
  219. see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/zh-CN.json +45 -0
  220. see_your_agents-0.1.0/src/see_your_agents/features/todo/supervisor.md +16 -0
  221. see_your_agents-0.1.0/src/see_your_agents/features/todo/todo.py +379 -0
  222. see_your_agents-0.1.0/src/see_your_agents/features/todo/web/todo.css +61 -0
  223. see_your_agents-0.1.0/src/see_your_agents/features/todo/web/todo.js +250 -0
  224. see_your_agents-0.1.0/src/see_your_agents/features/tools/__init__.py +14 -0
  225. see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/de.json +82 -0
  226. see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/en.json +82 -0
  227. see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/es.json +82 -0
  228. see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/fr.json +82 -0
  229. see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/ru.json +82 -0
  230. see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/zh-CN.json +82 -0
  231. see_your_agents-0.1.0/src/see_your_agents/features/tools/toolbox.py +583 -0
  232. see_your_agents-0.1.0/src/see_your_agents/features/tools/web/tools.css +121 -0
  233. see_your_agents-0.1.0/src/see_your_agents/features/tools/web/tools.js +314 -0
  234. see_your_agents-0.1.0/src/see_your_agents/i18n.py +192 -0
  235. see_your_agents-0.1.0/src/see_your_agents/web/app.js +701 -0
  236. see_your_agents-0.1.0/src/see_your_agents/web/base.css +286 -0
  237. see_your_agents-0.1.0/src/see_your_agents/web/figures.js +71 -0
  238. see_your_agents-0.1.0/src/see_your_agents/web/i18n/de.json +278 -0
  239. see_your_agents-0.1.0/src/see_your_agents/web/i18n/en.json +278 -0
  240. see_your_agents-0.1.0/src/see_your_agents/web/i18n/es.json +278 -0
  241. see_your_agents-0.1.0/src/see_your_agents/web/i18n/fr.json +278 -0
  242. see_your_agents-0.1.0/src/see_your_agents/web/i18n/ru.json +283 -0
  243. see_your_agents-0.1.0/src/see_your_agents/web/i18n/zh-CN.json +278 -0
  244. see_your_agents-0.1.0/src/see_your_agents/web/i18n.js +42 -0
  245. see_your_agents-0.1.0/src/see_your_agents/web/index.html +74 -0
  246. see_your_agents-0.1.0/tests/app/test_feature.py +209 -0
  247. see_your_agents-0.1.0/tests/app/test_i18n.py +286 -0
  248. see_your_agents-0.1.0/tests/app/test_layers.py +106 -0
  249. see_your_agents-0.1.0/tests/app/test_mcp.py +282 -0
  250. see_your_agents-0.1.0/tests/app/test_pairing.py +210 -0
  251. see_your_agents-0.1.0/tests/app/test_server.py +90 -0
  252. see_your_agents-0.1.0/tests/app/test_watchdog.py +280 -0
  253. see_your_agents-0.1.0/tests/codex_daemon.py +263 -0
  254. see_your_agents-0.1.0/tests/codex_rollouts.py +146 -0
  255. see_your_agents-0.1.0/tests/conftest.py +44 -0
  256. see_your_agents-0.1.0/tests/core/test_env.py +19 -0
  257. see_your_agents-0.1.0/tests/core/test_index.py +151 -0
  258. see_your_agents-0.1.0/tests/core/test_sessions.py +99 -0
  259. see_your_agents-0.1.0/tests/fakes.py +180 -0
  260. see_your_agents-0.1.0/tests/features/test_approvals.py +674 -0
  261. see_your_agents-0.1.0/tests/features/test_awake.py +128 -0
  262. see_your_agents-0.1.0/tests/features/test_builder.py +1032 -0
  263. see_your_agents-0.1.0/tests/features/test_chat.py +288 -0
  264. see_your_agents-0.1.0/tests/features/test_chat_delivery.py +572 -0
  265. see_your_agents-0.1.0/tests/features/test_chat_peer.py +260 -0
  266. see_your_agents-0.1.0/tests/features/test_groups.py +786 -0
  267. see_your_agents-0.1.0/tests/features/test_launch.py +333 -0
  268. see_your_agents-0.1.0/tests/features/test_looks.py +138 -0
  269. see_your_agents-0.1.0/tests/features/test_mr.py +442 -0
  270. see_your_agents-0.1.0/tests/features/test_supervisor.py +357 -0
  271. see_your_agents-0.1.0/tests/features/test_supervisor_fleet.py +159 -0
  272. see_your_agents-0.1.0/tests/features/test_todo.py +373 -0
  273. see_your_agents-0.1.0/tests/features/test_tools.py +280 -0
  274. see_your_agents-0.1.0/tests/fixtures/glab/approvals.json +12 -0
  275. see_your_agents-0.1.0/tests/fixtures/glab/discussions.json +120 -0
  276. see_your_agents-0.1.0/tests/fixtures/glab/mr-merged.json +25 -0
  277. see_your_agents-0.1.0/tests/fixtures/glab/mr-opened.json +25 -0
  278. see_your_agents-0.1.0/tests/fixtures/hello/__init__.py +24 -0
  279. see_your_agents-0.1.0/tests/fixtures/hello/hello.py +64 -0
  280. see_your_agents-0.1.0/tests/fixtures/hello/i18n/de.json +12 -0
  281. see_your_agents-0.1.0/tests/fixtures/hello/i18n/en.json +12 -0
  282. see_your_agents-0.1.0/tests/fixtures/hello/i18n/es.json +12 -0
  283. see_your_agents-0.1.0/tests/fixtures/hello/i18n/fr.json +12 -0
  284. see_your_agents-0.1.0/tests/fixtures/hello/i18n/ru.json +12 -0
  285. see_your_agents-0.1.0/tests/fixtures/hello/i18n/zh-CN.json +12 -0
  286. see_your_agents-0.1.0/tests/fixtures/hello/supervisor.md +2 -0
  287. see_your_agents-0.1.0/tests/fixtures/hello/web/hello.css +7 -0
  288. see_your_agents-0.1.0/tests/fixtures/hello/web/hello.js +46 -0
  289. see_your_agents-0.1.0/tests/gitrepo.py +38 -0
  290. see_your_agents-0.1.0/tests/providers/test_claude_courier.py +119 -0
  291. see_your_agents-0.1.0/tests/providers/test_claude_launch.py +202 -0
  292. see_your_agents-0.1.0/tests/providers/test_claude_live.py +69 -0
  293. see_your_agents-0.1.0/tests/providers/test_claude_provider.py +25 -0
  294. see_your_agents-0.1.0/tests/providers/test_claude_routes.py +181 -0
  295. see_your_agents-0.1.0/tests/providers/test_claude_transcript.py +441 -0
  296. see_your_agents-0.1.0/tests/providers/test_codex_daemon.py +289 -0
  297. see_your_agents-0.1.0/tests/providers/test_codex_launch.py +188 -0
  298. see_your_agents-0.1.0/tests/providers/test_codex_live.py +146 -0
  299. see_your_agents-0.1.0/tests/providers/test_codex_provider.py +105 -0
  300. see_your_agents-0.1.0/tests/providers/test_codex_queue.py +216 -0
  301. see_your_agents-0.1.0/tests/providers/test_codex_rollout.py +279 -0
  302. see_your_agents-0.1.0/tests/providers/test_codex_thread.py +135 -0
  303. see_your_agents-0.1.0/tests/providers/test_launch_rules.py +34 -0
  304. see_your_agents-0.1.0/tests/providers/test_registry.py +64 -0
  305. see_your_agents-0.1.0/uv.lock +134 -0
  306. see_your_agents-0.1.0/vscode-bridge/extension.js +111 -0
  307. see_your_agents-0.1.0/vscode-bridge/package.json +12 -0
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: add-feature
3
+ description: Add a feature (module) to the see-your-agents dashboard as a folder under src/see_your_agents/features/ plus one line in the registry. Use when asked to add a feature, module, view, panel, tab or button to the see-your-agents dashboard (in any language), or when the supervisor hands over a request to extend the dashboard.
4
+ ---
5
+
6
+ # Add a feature to the dashboard
7
+
8
+ A feature is a folder `src/see_your_agents/features/<id>/` and one line in `features/__init__.py`. Do not edit the host (`app/`, `web/`) or other features.
9
+
10
+ 1. **Read** `docs/ARCHITECTURE.md`: "Layers", "Feature manifest", "Page", "Security"; the same recipe for people, with the example's code, is `docs/adding-a-feature.md`. The complete example is `tests/fixtures/hello` and its test `tests/app/test_feature.py`; real features with data, `board_extra`, POST sub-paths and MCP tools are `features/todo` (right dock) and `features/groups` (a chat source).
11
+
12
+ 2. **Branch.** Work in your own branch (`git branch --show-current`). Do not commit to `main` or merge into it.
13
+
14
+ 3. **id.** Short, `[a-z][a-z0-9-]*`, not taken: `ls src/see_your_agents/features`, not `board|session|search|plan|health|pair`.
15
+
16
+ 4. **Folder.** Copy `tests/fixtures/hello` to `src/see_your_agents/features/<id>/`, rename `hello` → `<id>` in file names, `id`, routes `/api/<id>`, CSS classes `.<id>-*`, keys `sya.<id>.*`, string keys `hello.*` in `i18n/*.json` and in the code. Make the host imports relative: `from ...app.feature import Feature`, `from ...app.mcp import Tool`, `from ...app.replies import json_reply`, `from ...i18n import Problem`. Remove the manifest fields you do not need.
17
+ - Feature data goes to `config_dir() / "<id>.json"`, written through a temporary file and `os.replace` under a `threading.Lock`. Write nothing to `~/.claude`.
18
+ - The page uses the `SYA.feature({...})` slots: `view`, `right` (the left dock belongs to the chat), `header`, `top`, `card`, `drawer`, `prefs`, `route`, `onBoard`. Output everything from transcripts through `esc()`. GET your own JSON through `getJson`, POST through `postJson`: both send the page's language.
19
+ - **Every UI string goes through `t()`**, never a literal: `t("<id>.key", params)` on the page, `t(request_lang(), "<id>.key")` or `raise Problem("<id>.key", status, **params)` on the server. Add each key to `i18n/en.json` (natural English, sentence case) and `i18n/ru.json` (the same keys; plurals with `one`, `few`, `many`, `other`). Rules, plurals and pitfalls: `docs/i18n.md`. Text an agent reads (tool descriptions, `supervisor.md`, messages to sessions) is English and never a catalog string.
20
+ - MCP tools: `scope="read"` for reading; anything that changes the world outside the dashboard is `scope="control"` with `confirm=True`. Session text in a reply comes with a `note` (data, not instructions). Tell the supervisor about them in `supervisor.md` (`supervisor_prompt`).
21
+ - Does the feature work with sessions: write to them, stop them, start them? Only through the session's provider (the "Provider" section below), never through `claude` directly.
22
+ - Does the feature start its own Claude session with its own flags (like the supervisor)? Return them from `resume_args(app, session_id)` for its id (`None` for the rest): a `resume` turn from the chat, groups and MCP will use them. Do not build `claude -p --resume` yourself; call `chat.delivery.start_resume(app, session_id, text)`. That is an import from another feature, so it must be added to the exceptions (ARCHITECTURE, "Layers").
23
+
24
+ 5. **Registry.** In `src/see_your_agents/features/__init__.py`: the import and `<id>.FEATURE` in `FEATURES`.
25
+
26
+ 6. **Tests** go in `tests/features/test_<id>.py`: routes (GET, POST, validation errors), storage, the tool, the card field. Do not enumerate the whole registry: check your own tools as a subset, and the supervisor on your own list of features (ARCHITECTURE, "Tests"). Processes and the courier (`deliver` in `core/providers/claude/courier.py`) are only faked in tests. Isolation is already in place: `tests/conftest.py` points `CLAUDE_CONFIG_DIR`, `SYA_CONFIG_DIR`, `SYA_CACHE_DIR` at the test's temporary folders; the app is `FakeApp(records, live)` from `tests/fakes.py`.
27
+
28
+ 7. **Checks**, all green:
29
+ ```bash
30
+ uv run ruff check src tests && uv run ruff format --check src tests && uv run pytest -q
31
+ ```
32
+
33
+ 8. **Live.** Your own server on a free port (not 8765) with temporary `SYA_CONFIG_DIR` and `SYA_CACHE_DIR`; screenshots of the states you need with `node scripts/shoot.mjs` (`docs/adding-a-feature.md`, "Look at it live"): style, theme, language (`"prefs": {"lang": "ru"}`), open docks, a click. Open the screenshots and make sure the feature shows in all three styles and the dark theme and nothing else moved; exit code 0 means a clean console. Stop the server.
34
+
35
+ 9. **Docs.** Visible to the user: a section or a line in `docs/user-guide.md`. New files in the config or cache folder: a row in `docs/configuration.md`. A new import exception: an entry in `docs/ARCHITECTURE.md` and in `tests/app/test_layers.py`.
36
+
37
+ 10. **Commit** to your branch: what the feature does and how it was checked. In the report: branch, files, the screenshot path.
38
+
39
+ ## Provider
40
+
41
+ A session belongs to an agent program, its provider (Claude Code, Codex). A feature does not call `claude` or read `~/.claude` itself: it asks the session's provider. The contract is `core/providers/base.py`, details in `docs/providers.md`.
42
+
43
+ - **Find the provider.** An index record, a card and a `LiveSession` have `provider`: `providers.by_id(record["provider"])` or `providers.by_id(live.provider)` (`from ...core import providers`). The default provider (for a launch without a choice) is `providers.default()`.
44
+ - **What it can do** is `provider.caps` (`Cap.PEER`, `Cap.TASKS`, `Cap.ATTACH`, `Cap.STOP`…). No capability: hide the button or field, do not show it empty. On the page the same is `can(card, "stop")` from `app.js` (capabilities arrive in `/api/board` in the `providers` field); Codex currently has `attach` and `launch`.
45
+ - **Write to a session.** From the chat this is already done: `POST /api/chat/<id>/send`. From your own feature, with a signed message: `session = Session.of(record, live)`, then `provider.route(session, signed=True)` (whether it can, and why not) and `provider.send(session, Message(text, sender="…", summary="…"))`. A live session sees it as a message from `sender`; a stopped one continues with one turn. An error is always a `SendError` (`SendRefused`, `SendInvalid`, `SendTimeout`). Send only text the user wrote or explicitly sent; the provider itself refuses a session that waits on a permission. Example: `features/groups/post.py`.
46
+ - **Start a session** with `provider.start(LaunchRequest(...), taken=[s.address for s in app.live().values()])`. `project_dir` checks the folder; the choices come from `provider.options()`. `RequestError` is a bad request (400), `LaunchError` means the program refused (502).
47
+ - **Need something the contract does not have?** Add an operation to `Provider` with a safe default (a refusal or empty) and an implementation for Claude. A feature must not import `core.providers.claude`: `tests/app/test_layers.py` lets through only a few files that need Claude by design (`CLAUDE_BY_DESIGN`).
48
+ - **Connect a feature to core** (core does not import features) with the manifest field `setup(app)`: `App` calls it once while assembling, and only for a registered feature. This is how the chat hands Claude's routes the VS Code bridge, `app.live` and `app.resume_args`. Start nothing and write nothing to disk in `setup`: `App` is assembled in tests too.
49
+ - **A new provider** is not a feature: a folder in `core/providers/<id>/` and one line in `PROVIDERS`; the recipe is in `docs/providers.md`, "How to add a provider".
@@ -0,0 +1,76 @@
1
+ name: Bug report
2
+ description: Something on the dashboard does not work as the docs say.
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for reporting. Security problems go through private reporting, not issues: see SECURITY.md.
9
+ Transcripts and logs are private: trim them to the lines that matter and remove names, paths, hosts and ticket keys you do not want to publish.
10
+ - type: textarea
11
+ id: what
12
+ attributes:
13
+ label: What happened
14
+ description: What you saw, and what you expected instead.
15
+ validations:
16
+ required: true
17
+ - type: textarea
18
+ id: steps
19
+ attributes:
20
+ label: Steps to reproduce
21
+ placeholder: |
22
+ 1. uv run sya serve
23
+ 2. Open a session's chat
24
+ 3. ...
25
+ validations:
26
+ required: true
27
+ - type: input
28
+ id: os
29
+ attributes:
30
+ label: OS
31
+ placeholder: macOS 26.4, Ubuntu 24.04…
32
+ validations:
33
+ required: true
34
+ - type: input
35
+ id: python
36
+ attributes:
37
+ label: Python
38
+ description: "`uv run python --version`"
39
+ placeholder: "3.13.1"
40
+ validations:
41
+ required: true
42
+ - type: input
43
+ id: commit
44
+ attributes:
45
+ label: Commit
46
+ description: "`git rev-parse --short HEAD` in your clone"
47
+ - type: checkboxes
48
+ id: clis
49
+ attributes:
50
+ label: Agent CLIs involved
51
+ options:
52
+ - label: Claude Code
53
+ - label: Codex CLI
54
+ - label: Neither (the dashboard itself)
55
+ - type: input
56
+ id: versions
57
+ attributes:
58
+ label: CLI versions
59
+ description: "`claude --version`, `codex --version`, and `glab --version` for MR issues"
60
+ placeholder: "Claude Code 2.1.317, codex-cli 0.166.0"
61
+ - type: dropdown
62
+ id: browser
63
+ attributes:
64
+ label: Browser
65
+ options:
66
+ - Not relevant
67
+ - Chrome
68
+ - Safari
69
+ - Firefox
70
+ - Other
71
+ - type: textarea
72
+ id: logs
73
+ attributes:
74
+ label: Logs
75
+ description: Output of the terminal running `sya serve`, errors from the browser console, the response of a failing request.
76
+ render: text
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Report a security vulnerability
4
+ url: https://github.com/vldplcd/see-your-agents/security/policy
5
+ about: Please report vulnerabilities privately, as SECURITY.md describes, not in a public issue.
6
+ - name: Documentation
7
+ url: https://github.com/vldplcd/see-your-agents/tree/main/docs
8
+ about: The user guide, configuration, security, and how to contribute a feature, a provider or a language.
@@ -0,0 +1,44 @@
1
+ name: Feature or module idea
2
+ description: A new view, panel, card line, MCP tool, or support for another agent CLI.
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ A feature is a folder in `src/see_your_agents/features/` and one line in the registry (docs/adding-a-feature.md); a provider for another agent CLI is a folder in `core/providers/` (docs/providers.md). Agreeing on the shape here first saves rework.
9
+ - type: dropdown
10
+ id: kind
11
+ attributes:
12
+ label: Kind
13
+ options:
14
+ - A feature module (view, dock, card line, session panel section, MCP tool)
15
+ - A change to an existing feature
16
+ - A provider for another agent CLI
17
+ - Something else
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: problem
22
+ attributes:
23
+ label: The problem
24
+ description: What you want to see or do on the dashboard, and why it matters to you.
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: idea
29
+ attributes:
30
+ label: The idea
31
+ description: How it could look and work. For a provider, where the program keeps its transcripts, how to tell what is running, and whether it can be messaged or launched without a person at a terminal.
32
+ validations:
33
+ required: true
34
+ - type: textarea
35
+ id: safety
36
+ attributes:
37
+ label: What it changes outside the dashboard
38
+ description: Does it write to sessions, start or stop processes, or write files outside the dashboard's own folders? Leave empty if it only reads.
39
+ - type: checkboxes
40
+ id: help
41
+ attributes:
42
+ label: Contribution
43
+ options:
44
+ - label: I would like to build it myself
@@ -0,0 +1,44 @@
1
+ name: Translation
2
+ description: A new UI language, or a fix to an existing one.
3
+ labels: ["i18n"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Every UI string lives in a catalog: `src/see_your_agents/web/i18n/<lang>.json` and `src/see_your_agents/features/<id>/i18n/<lang>.json`, with English as the source. The recipe is in docs/i18n.md, "How to add a language". A partial translation works: missing keys show English. All current UI text, in every language, was written by Claude Opus 5.5: corrections and better names are very welcome.
9
+ - type: input
10
+ id: language
11
+ attributes:
12
+ label: Language
13
+ description: Its name and tag (`ll` or `ll-RR`).
14
+ placeholder: Português (Brasil), pt-BR
15
+ validations:
16
+ required: true
17
+ - type: dropdown
18
+ id: kind
19
+ attributes:
20
+ label: Kind
21
+ options:
22
+ - A new language
23
+ - Wrong or awkward wording in an existing language
24
+ - A missing string (English shows instead)
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: catalogs
29
+ attributes:
30
+ label: Catalog files
31
+ description: Which catalogs you will translate or which keys are wrong, e.g. `web/i18n/de.json` or `features/todo/i18n/fr.json`, `todo.morning.button`.
32
+ validations:
33
+ required: true
34
+ - type: textarea
35
+ id: details
36
+ attributes:
37
+ label: Details
38
+ description: For a fix, the current text and your suggestion. A screenshot helps when a string overflows.
39
+ - type: checkboxes
40
+ id: help
41
+ attributes:
42
+ label: Contribution
43
+ options:
44
+ - label: I will open the pull request myself
@@ -0,0 +1,20 @@
1
+ ## What and why
2
+
3
+ <!-- What changes, and why. Link the issue: "Closes #123". -->
4
+
5
+ ## How it was checked
6
+
7
+ <!-- Tests added or changed, a live check on your own server, screenshots below for UI changes. -->
8
+
9
+ ## Checklist
10
+
11
+ - [ ] `uv run ruff check src tests && uv run ruff format --check src tests && uv run pytest -q` passes
12
+ - [ ] Tests cover the new behaviour (and the refusals, for security-sensitive areas)
13
+ - [ ] Every new UI string is a catalog key with an English string in `en.json` (and `ru.json` if you can)
14
+ - [ ] UI changes: screenshots in light and dark, from `scripts/shoot.mjs`, with a clean console
15
+ - [ ] Docs updated: user guide, configuration or security, as the change needs
16
+ - [ ] No secrets or personal data in code, fixtures, screenshots or logs
17
+
18
+ ## Screenshots
19
+
20
+ <!-- Light and dark, for UI changes. -->
@@ -0,0 +1,51 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ checks:
17
+ name: ${{ matrix.os }}, Python ${{ matrix.python }}
18
+ runs-on: ${{ matrix.os }}
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ os: [ubuntu-latest, macos-latest]
23
+ python: ["3.11", "3.13"]
24
+ steps:
25
+ - uses: actions/checkout@v7
26
+ with:
27
+ persist-credentials: false
28
+
29
+ - uses: astral-sh/setup-uv@v10.3.3 # no moving major tag is published for setup-uv
30
+ with:
31
+ python-version: ${{ matrix.python }}
32
+
33
+ # Two tests run the page's JavaScript in Node; pinning it keeps them from silently skipping.
34
+ - uses: actions/setup-node@v7
35
+ with:
36
+ node-version: "22"
37
+
38
+ - name: Install
39
+ run: uv sync --locked
40
+
41
+ # The first load of DuckDB's native library is slow on a fresh macOS runner; pay it before the timed tests.
42
+ - name: Warm up
43
+ run: uv run python -c "import duckdb, see_your_agents.app.cli"
44
+
45
+ - name: Lint
46
+ run: |
47
+ uv run ruff check src tests
48
+ uv run ruff format --check src tests
49
+
50
+ - name: Test
51
+ run: uv run pytest -q
@@ -0,0 +1,56 @@
1
+ name: Release
2
+
3
+ # Publishing a GitHub release (tag vX.Y.Z) builds the package and uploads it to PyPI through Trusted Publishing:
4
+ # PyPI trusts this workflow in the `pypi` environment, so no token is stored anywhere.
5
+
6
+ on:
7
+ release:
8
+ types: [published]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ build:
15
+ name: Build
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v7
19
+ with:
20
+ persist-credentials: false
21
+
22
+ - uses: astral-sh/setup-uv@v10.3.3 # no moving major tag is published for setup-uv
23
+
24
+ - name: The tag matches the package version
25
+ run: |
26
+ version=$(uv version --short)
27
+ tag="${GITHUB_REF_NAME#v}"
28
+ if [ "$version" != "$tag" ]; then
29
+ echo "::error::tag $GITHUB_REF_NAME does not match the version in pyproject.toml ($version)"
30
+ exit 1
31
+ fi
32
+
33
+ - name: Build
34
+ run: uv build
35
+
36
+ - uses: actions/upload-artifact@v7
37
+ with:
38
+ name: dist
39
+ path: dist/
40
+
41
+ publish:
42
+ name: Publish to PyPI
43
+ needs: build
44
+ runs-on: ubuntu-latest
45
+ environment:
46
+ name: pypi
47
+ url: https://pypi.org/p/see-your-agents
48
+ permissions:
49
+ id-token: write # Trusted Publishing
50
+ steps:
51
+ - uses: actions/download-artifact@v8
52
+ with:
53
+ name: dist
54
+ path: dist/
55
+
56
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,23 @@
1
+ # Python: virtual environments, caches, built packages
2
+ .venv/
3
+ venv/
4
+ __pycache__/
5
+ *.pyc
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+ dist/
9
+
10
+ # the static demo (uv run python demo/build.py)
11
+ demo/dist/
12
+
13
+ # rendered visual plans
14
+ *.plan.html
15
+
16
+ # local Claude Code state and worktrees; the project's skills are shared
17
+ .claude/*
18
+ !.claude/skills/
19
+
20
+ # local research material, not part of the repository
21
+ docs/competitors/
22
+
23
+ .DS_Store
@@ -0,0 +1,13 @@
1
+ # Agent instructions
2
+
3
+ The project's rules for coding agents are kept in one place, [CLAUDE.md](CLAUDE.md). They apply to every agent
4
+ CLI, not only Claude Code: read that file before you change anything, and follow it as if it were this one.
5
+
6
+ Then, depending on the task:
7
+
8
+ - checks, commit style and pull requests: [CONTRIBUTING.md](CONTRIBUTING.md);
9
+ - a new feature or module: [docs/adding-a-feature.md](docs/adding-a-feature.md) (the same recipe as the
10
+ `.claude/skills/add-feature/SKILL.md` skill);
11
+ - the design and the security invariants: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
12
+
13
+ This file only points there, so the rules cannot drift apart: change CLAUDE.md, not this file.
@@ -0,0 +1,49 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses
5
+ [semantic versioning](https://semver.org/) (while it is 0.x, a minor version may change behaviour).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.0] - 2026-11-04
10
+
11
+ The first public release.
12
+
13
+ ### Added
14
+
15
+ - **Board.** Every Claude Code and Codex CLI session on the machine, grouped by "Needs you", "Working",
16
+ "Your move", "Recently closed" and "Archive". Each card shows its title, project, branch, tickets, MR state, cost or
17
+ tokens, and how full the context window is. The same board is also available in the terminal (`sya ls`).
18
+ - **Chat with any session.**
19
+ - Live Claude sessions are reached through a one-shot courier, through tmux, or through the optional VS Code
20
+ bridge.
21
+ - Stopped sessions are continued for one turn.
22
+ - Codex threads are reached through `codex queue`.
23
+ - Quote-reply, file attachments where the program supports them, and a ⌘K switcher.
24
+ - **New sessions** from the page («+»), for Claude Code or Codex, with model, effort, permission or sandbox mode and
25
+ an optional worktree. Existing sessions can be forked.
26
+ - **Supervisor.**
27
+ - A Claude Code session that watches the others over MCP.
28
+ - It writes digests and keeps the to-do list.
29
+ - It sends messages or starts agents only after you confirm.
30
+ - Optionally it reads Jira (read-only).
31
+ - **Group chats** with the supervisor and any sessions, including Codex threads.
32
+ - **To-do list** in a side dock, with urgent items, Jira links and a morning review.
33
+ - **Permission approvals from the dashboard.**
34
+ - Claude Code's permission prompts, questions and plan approvals appear on the page through a local
35
+ `PermissionRequest` hook (`sya hooks install`). The terminal dialog stays open, and the first answer wins.
36
+ - Deciding needs a browser paired through a one-time link.
37
+ - **Paired browser for every control action.** Any page request that changes something needs the pairing secret.
38
+ - **Builder.** A Claude Code agent extends the dashboard itself on its own branch. It is sandboxed, and so are its
39
+ checks and preview. You get a preview, a diff, "Accept" and "Roll back"; a watchdog restarts the dashboard and rolls
40
+ back a version that does not come up.
41
+ - **GitLab MR state** on cards through `glab` (read-only).
42
+ - **Office view**, configurable agent looks, three page styles in light and dark, and a Mac kept awake while agents
43
+ work.
44
+ - **UI in six languages:** English (the default), Russian, Spanish, German, French and Simplified Chinese.
45
+ - **Providers.** Claude Code and Codex sit behind one provider interface, so another agent CLI is a folder plus a
46
+ registry line.
47
+
48
+ [Unreleased]: https://github.com/vldplcd/see-your-agents/compare/v0.1.0...HEAD
49
+ [0.1.0]: https://github.com/vldplcd/see-your-agents/releases/tag/v0.1.0
@@ -0,0 +1,27 @@
1
+ # see-your-agents
2
+
3
+ A local dashboard for Claude Code and Codex CLI sessions: a stdlib Python server (`uv run sya serve`, 127.0.0.1:8765),
4
+ a DuckDB index of transcripts, a build-free page in plain JS. What is on screen: `docs/user-guide.md`; the docs index:
5
+ `docs/README.md`. These rules are for every coding agent: `AGENTS.md` points here.
6
+
7
+ - Structure: `docs/ARCHITECTURE.md`: layers (`core/` data, `app/` host, `features/<id>/` features, `web/` page
8
+ shell), the `Feature` manifest, the `SYA.feature` slots, security invariants.
9
+ - A new feature or module: the `add-feature` skill (`.claude/skills/add-feature/SKILL.md`): a folder in `features/`
10
+ and one line in `features/__init__.py`; the host and other features are not edited.
11
+ - Agent programs (Claude Code, Codex) are providers, `docs/providers.md`: a folder in
12
+ `core/providers/` and one line in the registry; features go through the session's provider, not to `claude` directly.
13
+ - Checks. On a work branch, before each commit: ruff plus the tests of what you touched
14
+ (`uv run pytest -q tests/<area>`). The full suite (about 2.5 minutes) runs once before handing work back and
15
+ again before merging into `main`:
16
+ ```bash
17
+ uv run ruff check src tests && uv run ruff format --check src tests && uv run pytest -q
18
+ ```
19
+ - Live check: your own server on a free port (`uv run sya serve --no-open --port 8771`), not 8765: that is the user's
20
+ dashboard. Write nothing to the user's `~/.claude`, `~/.codex` or `~/.config/see-your-agents`.
21
+ - Style: short "why" docstrings, no noisy comments, ruff line-length 110. Docs, code comments and commit messages are
22
+ in English. Commits: one logical change each, subject `Area: what changed` (a feature id, `core`, `app`, `docs`,
23
+ `ci`), the body says why; pull requests and the security-sensitive areas: `CONTRIBUTING.md`.
24
+ - UI text goes through `t()` (page and server), never a literal: keys in the owner's `i18n/en.json` and `i18n/ru.json`,
25
+ English by default; how-to in `docs/i18n.md`. Text an agent reads (prompts, tool descriptions, courier headers) is
26
+ English and never a catalog string.
27
+ - The builder (an agent on its own branch) does not commit to `main` or merge into it: the user accepts the change.
@@ -0,0 +1,10 @@
1
+ # Code of conduct
2
+
3
+ Be decent. Talk to people the way you'd want to be talked to: stay on topic, assume good intent, disagree about
4
+ code rather than about people. No harassment, insults, spam or trolling.
5
+
6
+ The maintainers may edit or delete comments, close issues and pull requests, and block or ban anyone whose behaviour
7
+ they find inappropriate, in this repository and in any space connected to it. They decide, and they don't have to
8
+ justify it.
9
+
10
+ To flag a problem, use GitHub's "Report content" on the comment or issue, or contact the maintainer on GitHub.