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.
- see_your_agents-0.1.0/.claude/skills/add-feature/SKILL.md +49 -0
- see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +76 -0
- see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +44 -0
- see_your_agents-0.1.0/.github/ISSUE_TEMPLATE/translation.yml +44 -0
- see_your_agents-0.1.0/.github/pull_request_template.md +20 -0
- see_your_agents-0.1.0/.github/workflows/ci.yml +51 -0
- see_your_agents-0.1.0/.github/workflows/release.yml +56 -0
- see_your_agents-0.1.0/.gitignore +23 -0
- see_your_agents-0.1.0/AGENTS.md +13 -0
- see_your_agents-0.1.0/CHANGELOG.md +49 -0
- see_your_agents-0.1.0/CLAUDE.md +27 -0
- see_your_agents-0.1.0/CODE_OF_CONDUCT.md +10 -0
- see_your_agents-0.1.0/CONTRIBUTING.md +207 -0
- see_your_agents-0.1.0/LICENSE +21 -0
- see_your_agents-0.1.0/PKG-INFO +113 -0
- see_your_agents-0.1.0/README.md +100 -0
- see_your_agents-0.1.0/SECURITY.md +47 -0
- see_your_agents-0.1.0/demo/build.py +83 -0
- see_your_agents-0.1.0/demo/demo-api.js +555 -0
- see_your_agents-0.1.0/docs/ARCHITECTURE.md +318 -0
- see_your_agents-0.1.0/docs/README.md +28 -0
- see_your_agents-0.1.0/docs/adding-a-feature.md +311 -0
- see_your_agents-0.1.0/docs/configuration.md +201 -0
- see_your_agents-0.1.0/docs/i18n.md +316 -0
- see_your_agents-0.1.0/docs/notes/claude-hooks-notes.md +106 -0
- see_your_agents-0.1.0/docs/notes/claude-sandbox-notes.md +229 -0
- see_your_agents-0.1.0/docs/notes/codex-cli-notes.md +129 -0
- see_your_agents-0.1.0/docs/providers.md +218 -0
- see_your_agents-0.1.0/docs/security.md +277 -0
- see_your_agents-0.1.0/docs/user-guide.md +387 -0
- see_your_agents-0.1.0/pyproject.toml +37 -0
- see_your_agents-0.1.0/scripts/shoot.mjs +71 -0
- see_your_agents-0.1.0/src/see_your_agents/__init__.py +14 -0
- see_your_agents-0.1.0/src/see_your_agents/app/__init__.py +1 -0
- see_your_agents-0.1.0/src/see_your_agents/app/cli.py +176 -0
- see_your_agents-0.1.0/src/see_your_agents/app/feature.py +144 -0
- see_your_agents-0.1.0/src/see_your_agents/app/mcp.py +236 -0
- see_your_agents-0.1.0/src/see_your_agents/app/pairing.py +162 -0
- see_your_agents-0.1.0/src/see_your_agents/app/replies.py +16 -0
- see_your_agents-0.1.0/src/see_your_agents/app/server.py +385 -0
- see_your_agents-0.1.0/src/see_your_agents/app/watchdog.py +306 -0
- see_your_agents-0.1.0/src/see_your_agents/core/__init__.py +1 -0
- see_your_agents-0.1.0/src/see_your_agents/core/done.py +66 -0
- see_your_agents-0.1.0/src/see_your_agents/core/env.py +37 -0
- see_your_agents-0.1.0/src/see_your_agents/core/index.py +249 -0
- see_your_agents-0.1.0/src/see_your_agents/core/jira.py +55 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/__init__.py +63 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/base.py +489 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/__init__.py +3 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/courier.py +193 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/launch.py +218 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/live.py +130 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/paths.py +15 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/provider.py +87 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/routes.py +497 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/thread.py +280 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/claude/transcript.py +475 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/__init__.py +3 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/daemon.py +320 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/launch.py +220 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/live.py +201 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/names.py +77 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/paths.py +10 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/provider.py +97 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/queue.py +179 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/rollout.py +361 -0
- see_your_agents-0.1.0/src/see_your_agents/core/providers/codex/thread.py +172 -0
- see_your_agents-0.1.0/src/see_your_agents/core/sessions.py +195 -0
- see_your_agents-0.1.0/src/see_your_agents/core/uploads.py +14 -0
- see_your_agents-0.1.0/src/see_your_agents/features/__init__.py +39 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/__init__.py +22 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/approvals.py +349 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/hook.py +272 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/de.json +47 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/en.json +47 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/es.json +47 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/fr.json +47 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/ru.json +47 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/i18n/zh-CN.json +47 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/install.py +222 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/store.py +131 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/web/approvals.css +46 -0
- see_your_agents-0.1.0/src/see_your_agents/features/approvals/web/approvals.js +215 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/__init__.py +15 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/awake.py +160 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/de.json +8 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/en.json +8 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/es.json +8 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/fr.json +8 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/ru.json +8 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/i18n/zh-CN.json +8 -0
- see_your_agents-0.1.0/src/see_your_agents/features/awake/web/awake.js +35 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/__init__.py +7 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/de.json +33 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/en.json +33 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/es.json +34 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/fr.json +34 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/ru.json +35 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/i18n/zh-CN.json +32 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/web/board.css +94 -0
- see_your_agents-0.1.0/src/see_your_agents/features/board/web/board.js +97 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/__init__.py +18 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/agent.py +331 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/builder.py +527 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/de.json +102 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/en.json +102 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/es.json +103 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/fr.json +103 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/ru.json +104 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/i18n/zh-CN.json +101 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/preview.py +154 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/repo.py +141 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/routes.py +138 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/store.py +123 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/supervisor.md +5 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/web/builder.css +48 -0
- see_your_agents-0.1.0/src/see_your_agents/features/builder/web/builder.js +189 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/__init__.py +32 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/bridge.py +196 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/delivery.py +223 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/de.json +117 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/en.json +117 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/es.json +117 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/fr.json +117 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/ru.json +117 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/i18n/zh-CN.json +117 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/thread.py +101 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/web/chat.css +251 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/web/chat.js +843 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/web/quote.css +11 -0
- see_your_agents-0.1.0/src/see_your_agents/features/chat/web/quote.js +76 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/__init__.py +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/api.py +110 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/feed.py +163 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/groups.py +205 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/handles.py +61 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/de.json +70 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/en.json +70 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/es.json +70 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/fr.json +70 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/ru.json +70 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/i18n/zh-CN.json +70 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/mcp_tools.py +76 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/post.py +218 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/store.py +136 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/supervisor.md +8 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/web/groups.css +85 -0
- see_your_agents-0.1.0/src/see_your_agents/features/groups/web/groups.js +356 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/__init__.py +7 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/de.json +30 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/en.json +30 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/es.json +30 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/fr.json +30 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/ru.json +30 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/i18n/zh-CN.json +30 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/web/keys.css +47 -0
- see_your_agents-0.1.0/src/see_your_agents/features/keys/web/keys.js +166 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/__init__.py +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/de.json +49 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/en.json +49 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/es.json +49 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/fr.json +49 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/ru.json +49 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/i18n/zh-CN.json +49 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/launch.py +215 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/web/launch.css +58 -0
- see_your_agents-0.1.0/src/see_your_agents/features/launch/web/launch.js +334 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/__init__.py +15 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/de.json +77 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/en.json +77 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/es.json +77 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/fr.json +77 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/ru.json +77 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/i18n/zh-CN.json +77 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/looks.py +143 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/web/looks.css +135 -0
- see_your_agents-0.1.0/src/see_your_agents/features/looks/web/looks.js +563 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/__init__.py +15 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/glab.py +190 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/de.json +52 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/en.json +52 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/es.json +52 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/fr.json +52 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/ru.json +52 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/i18n/zh-CN.json +52 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/watch.py +298 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/web/mr.css +32 -0
- see_your_agents-0.1.0/src/see_your_agents/features/mr/web/mr.js +127 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/__init__.py +7 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/de.json +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/en.json +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/es.json +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/fr.json +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/ru.json +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/i18n/zh-CN.json +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/web/office.css +49 -0
- see_your_agents-0.1.0/src/see_your_agents/features/office/web/office.js +96 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/__init__.py +17 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/fleet.py +249 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/de.json +6 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/en.json +6 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/es.json +6 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/fr.json +6 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/ru.json +6 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/i18n/zh-CN.json +6 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/launch.py +254 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/mcp_tools.py +244 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/prompts/fleet-supervisor.md +18 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/prompts/supervisor.md +23 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/web/supervisor.css +20 -0
- see_your_agents-0.1.0/src/see_your_agents/features/supervisor/web/supervisor.js +29 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/__init__.py +18 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/de.json +45 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/en.json +45 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/es.json +45 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/fr.json +45 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/ru.json +50 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/i18n/zh-CN.json +45 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/supervisor.md +16 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/todo.py +379 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/web/todo.css +61 -0
- see_your_agents-0.1.0/src/see_your_agents/features/todo/web/todo.js +250 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/__init__.py +14 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/de.json +82 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/en.json +82 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/es.json +82 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/fr.json +82 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/ru.json +82 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/i18n/zh-CN.json +82 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/toolbox.py +583 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/web/tools.css +121 -0
- see_your_agents-0.1.0/src/see_your_agents/features/tools/web/tools.js +314 -0
- see_your_agents-0.1.0/src/see_your_agents/i18n.py +192 -0
- see_your_agents-0.1.0/src/see_your_agents/web/app.js +701 -0
- see_your_agents-0.1.0/src/see_your_agents/web/base.css +286 -0
- see_your_agents-0.1.0/src/see_your_agents/web/figures.js +71 -0
- see_your_agents-0.1.0/src/see_your_agents/web/i18n/de.json +278 -0
- see_your_agents-0.1.0/src/see_your_agents/web/i18n/en.json +278 -0
- see_your_agents-0.1.0/src/see_your_agents/web/i18n/es.json +278 -0
- see_your_agents-0.1.0/src/see_your_agents/web/i18n/fr.json +278 -0
- see_your_agents-0.1.0/src/see_your_agents/web/i18n/ru.json +283 -0
- see_your_agents-0.1.0/src/see_your_agents/web/i18n/zh-CN.json +278 -0
- see_your_agents-0.1.0/src/see_your_agents/web/i18n.js +42 -0
- see_your_agents-0.1.0/src/see_your_agents/web/index.html +74 -0
- see_your_agents-0.1.0/tests/app/test_feature.py +209 -0
- see_your_agents-0.1.0/tests/app/test_i18n.py +286 -0
- see_your_agents-0.1.0/tests/app/test_layers.py +106 -0
- see_your_agents-0.1.0/tests/app/test_mcp.py +282 -0
- see_your_agents-0.1.0/tests/app/test_pairing.py +210 -0
- see_your_agents-0.1.0/tests/app/test_server.py +90 -0
- see_your_agents-0.1.0/tests/app/test_watchdog.py +280 -0
- see_your_agents-0.1.0/tests/codex_daemon.py +263 -0
- see_your_agents-0.1.0/tests/codex_rollouts.py +146 -0
- see_your_agents-0.1.0/tests/conftest.py +44 -0
- see_your_agents-0.1.0/tests/core/test_env.py +19 -0
- see_your_agents-0.1.0/tests/core/test_index.py +151 -0
- see_your_agents-0.1.0/tests/core/test_sessions.py +99 -0
- see_your_agents-0.1.0/tests/fakes.py +180 -0
- see_your_agents-0.1.0/tests/features/test_approvals.py +674 -0
- see_your_agents-0.1.0/tests/features/test_awake.py +128 -0
- see_your_agents-0.1.0/tests/features/test_builder.py +1032 -0
- see_your_agents-0.1.0/tests/features/test_chat.py +288 -0
- see_your_agents-0.1.0/tests/features/test_chat_delivery.py +572 -0
- see_your_agents-0.1.0/tests/features/test_chat_peer.py +260 -0
- see_your_agents-0.1.0/tests/features/test_groups.py +786 -0
- see_your_agents-0.1.0/tests/features/test_launch.py +333 -0
- see_your_agents-0.1.0/tests/features/test_looks.py +138 -0
- see_your_agents-0.1.0/tests/features/test_mr.py +442 -0
- see_your_agents-0.1.0/tests/features/test_supervisor.py +357 -0
- see_your_agents-0.1.0/tests/features/test_supervisor_fleet.py +159 -0
- see_your_agents-0.1.0/tests/features/test_todo.py +373 -0
- see_your_agents-0.1.0/tests/features/test_tools.py +280 -0
- see_your_agents-0.1.0/tests/fixtures/glab/approvals.json +12 -0
- see_your_agents-0.1.0/tests/fixtures/glab/discussions.json +120 -0
- see_your_agents-0.1.0/tests/fixtures/glab/mr-merged.json +25 -0
- see_your_agents-0.1.0/tests/fixtures/glab/mr-opened.json +25 -0
- see_your_agents-0.1.0/tests/fixtures/hello/__init__.py +24 -0
- see_your_agents-0.1.0/tests/fixtures/hello/hello.py +64 -0
- see_your_agents-0.1.0/tests/fixtures/hello/i18n/de.json +12 -0
- see_your_agents-0.1.0/tests/fixtures/hello/i18n/en.json +12 -0
- see_your_agents-0.1.0/tests/fixtures/hello/i18n/es.json +12 -0
- see_your_agents-0.1.0/tests/fixtures/hello/i18n/fr.json +12 -0
- see_your_agents-0.1.0/tests/fixtures/hello/i18n/ru.json +12 -0
- see_your_agents-0.1.0/tests/fixtures/hello/i18n/zh-CN.json +12 -0
- see_your_agents-0.1.0/tests/fixtures/hello/supervisor.md +2 -0
- see_your_agents-0.1.0/tests/fixtures/hello/web/hello.css +7 -0
- see_your_agents-0.1.0/tests/fixtures/hello/web/hello.js +46 -0
- see_your_agents-0.1.0/tests/gitrepo.py +38 -0
- see_your_agents-0.1.0/tests/providers/test_claude_courier.py +119 -0
- see_your_agents-0.1.0/tests/providers/test_claude_launch.py +202 -0
- see_your_agents-0.1.0/tests/providers/test_claude_live.py +69 -0
- see_your_agents-0.1.0/tests/providers/test_claude_provider.py +25 -0
- see_your_agents-0.1.0/tests/providers/test_claude_routes.py +181 -0
- see_your_agents-0.1.0/tests/providers/test_claude_transcript.py +441 -0
- see_your_agents-0.1.0/tests/providers/test_codex_daemon.py +289 -0
- see_your_agents-0.1.0/tests/providers/test_codex_launch.py +188 -0
- see_your_agents-0.1.0/tests/providers/test_codex_live.py +146 -0
- see_your_agents-0.1.0/tests/providers/test_codex_provider.py +105 -0
- see_your_agents-0.1.0/tests/providers/test_codex_queue.py +216 -0
- see_your_agents-0.1.0/tests/providers/test_codex_rollout.py +279 -0
- see_your_agents-0.1.0/tests/providers/test_codex_thread.py +135 -0
- see_your_agents-0.1.0/tests/providers/test_launch_rules.py +34 -0
- see_your_agents-0.1.0/tests/providers/test_registry.py +64 -0
- see_your_agents-0.1.0/uv.lock +134 -0
- see_your_agents-0.1.0/vscode-bridge/extension.js +111 -0
- 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.
|