switchroom 0.8.1 → 0.10.0
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.
- package/README.md +49 -57
- package/bin/timezone-hook.sh +9 -7
- package/dist/agent-scheduler/index.js +285 -45
- package/dist/auth-broker/index.js +13932 -0
- package/dist/cli/switchroom.js +15931 -12778
- package/dist/host-control/main.js +582 -43
- package/dist/vault/approvals/kernel-server.js +276 -47
- package/dist/vault/broker/server.js +333 -69
- package/examples/minimal.yaml +63 -0
- package/examples/personal-google-workspace-mcp/.env.example +34 -0
- package/examples/personal-google-workspace-mcp/README.md +194 -0
- package/examples/personal-google-workspace-mcp/compose.yaml +66 -0
- package/examples/switchroom.yaml +220 -0
- package/package.json +6 -4
- package/profiles/_base/start.sh.hbs +3 -3
- package/profiles/_shared/agent-self-service.md.hbs +126 -0
- package/profiles/default/CLAUDE.md +10 -0
- package/profiles/default/CLAUDE.md.hbs +16 -0
- package/skills/buildkite-agent-infrastructure/SKILL.md +30 -11
- package/skills/buildkite-agent-runtime/SKILL.md +44 -11
- package/skills/buildkite-api/SKILL.md +31 -8
- package/skills/buildkite-cli/SKILL.md +27 -9
- package/skills/buildkite-migration/SKILL.md +22 -9
- package/skills/buildkite-pipelines/SKILL.md +26 -9
- package/skills/buildkite-secure-delivery/SKILL.md +23 -9
- package/skills/buildkite-test-engine/SKILL.md +25 -8
- package/skills/docx/SKILL.md +1 -1
- package/skills/file-bug/SKILL.md +34 -6
- package/skills/humanizer/SKILL.md +15 -0
- package/skills/humanizer-calibrate/SKILL.md +7 -1
- package/skills/mcp-builder/SKILL.md +1 -1
- package/skills/pdf/SKILL.md +1 -1
- package/skills/pptx/SKILL.md +1 -1
- package/skills/skill-creator/SKILL.md +21 -1
- package/skills/skill-creator/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
- package/skills/skill-creator/scripts/__pycache__/generate_report.cpython-313.pyc +0 -0
- package/skills/skill-creator/scripts/__pycache__/improve_description.cpython-313.pyc +0 -0
- package/skills/skill-creator/scripts/__pycache__/run_eval.cpython-313.pyc +0 -0
- package/skills/skill-creator/scripts/__pycache__/run_loop.cpython-313.pyc +0 -0
- package/skills/skill-creator/scripts/__pycache__/utils.cpython-313.pyc +0 -0
- package/skills/switchroom-cli/SKILL.md +63 -64
- package/skills/switchroom-health/SKILL.md +23 -10
- package/skills/switchroom-install/SKILL.md +3 -3
- package/skills/switchroom-manage/SKILL.md +26 -19
- package/skills/switchroom-runtime/SKILL.md +67 -15
- package/skills/switchroom-status/SKILL.md +26 -1
- package/skills/telegram-test-harness/SKILL.md +3 -0
- package/skills/webapp-testing/SKILL.md +31 -1
- package/skills/xlsx/SKILL.md +1 -1
- package/telegram-plugin/admin-commands/index.ts +7 -5
- package/telegram-plugin/dist/gateway/gateway.js +13042 -12844
- package/telegram-plugin/gateway/auth-add-flow.ts +326 -0
- package/telegram-plugin/gateway/auth-broker-client.ts +75 -0
- package/telegram-plugin/gateway/auth-command.ts +794 -0
- package/telegram-plugin/gateway/auth-line.ts +123 -0
- package/telegram-plugin/gateway/boot-card.ts +22 -36
- package/telegram-plugin/gateway/boot-probes.ts +3 -3
- package/telegram-plugin/gateway/gateway.ts +313 -798
- package/telegram-plugin/gateway/hostd-dispatch.ts +117 -0
- package/telegram-plugin/hooks/tool-label-pretool.mjs +11 -0
- package/telegram-plugin/hooks/wedge-detect-posttool.mjs +303 -0
- package/telegram-plugin/permission-title.ts +56 -0
- package/telegram-plugin/quota-check.ts +19 -41
- package/telegram-plugin/scripts/build.mjs +0 -1
- package/telegram-plugin/shared/bot-runtime.ts +5 -4
- package/telegram-plugin/tests/auth-add-flow.test.ts +559 -0
- package/telegram-plugin/tests/auth-code-redact.test.ts +8 -4
- package/telegram-plugin/tests/auth-command-vernacular.test.ts +531 -0
- package/telegram-plugin/tests/boot-probes.test.ts +11 -4
- package/telegram-plugin/tests/hostd-dispatch.test.ts +129 -0
- package/telegram-plugin/tests/permission-title.test.ts +31 -0
- package/telegram-plugin/tests/quota-check.test.ts +5 -35
- package/telegram-plugin/uat/SETUP.md +31 -1
- package/telegram-plugin/uat/runners/agent-self-sufficiency.ts +457 -0
- package/telegram-plugin/uat/runners/paraphrases.ts +231 -0
- package/telegram-plugin/uat/runners/report.ts +150 -0
- package/telegram-plugin/uat/runners/run-agent-self-sufficiency.sh +50 -0
- package/telegram-plugin/uat/runners/scorer.test.ts +196 -0
- package/telegram-plugin/uat/runners/scorer.ts +106 -0
- package/telegram-plugin/uat/runners/skill-coverage.test.ts +100 -0
- package/telegram-plugin/uat/runners/skill-coverage.ts +620 -0
- package/telegram-plugin/uat/scenarios/jtbd-interrupt-marker-dm.test.ts +7 -1
- package/telegram-plugin/uat/scenarios/jtbd-rapid-followup-dm.test.ts +7 -1
- package/telegram-plugin/auth-dashboard.ts +0 -1104
- package/telegram-plugin/auth-slot-parser.ts +0 -497
- package/telegram-plugin/dist/foreman/foreman.js +0 -31358
- package/telegram-plugin/foreman/foreman-create-flow.ts +0 -202
- package/telegram-plugin/foreman/foreman-handlers.ts +0 -493
- package/telegram-plugin/foreman/foreman.ts +0 -1165
- package/telegram-plugin/foreman/setup-flow.ts +0 -345
- package/telegram-plugin/foreman/setup-state.ts +0 -239
- package/telegram-plugin/foreman/state.ts +0 -203
- package/telegram-plugin/tests/auth-account-identity-surface.test.ts +0 -118
- package/telegram-plugin/tests/auth-dashboard-edge-cases.test.ts +0 -260
- package/telegram-plugin/tests/auth-dashboard-restart-flow.test.ts +0 -140
- package/telegram-plugin/tests/auth-dashboard-v3b.test.ts +0 -559
- package/telegram-plugin/tests/auth-dashboard.test.ts +0 -1045
- package/telegram-plugin/tests/auth-slot-commands.test.ts +0 -640
- package/telegram-plugin/tests/boot-card-account-quota.test.ts +0 -137
- package/telegram-plugin/tests/foreman-create-flow.test.ts +0 -359
- package/telegram-plugin/tests/foreman-handlers.test.ts +0 -347
- package/telegram-plugin/tests/foreman-state.test.ts +0 -164
- package/telegram-plugin/tests/foreman-write-ops.test.ts +0 -214
- package/telegram-plugin/tests/setup-flow.test.ts +0 -510
- package/telegram-plugin/tests/setup-state.test.ts +0 -146
package/skills/file-bug/SKILL.md
CHANGED
|
@@ -2,11 +2,39 @@
|
|
|
2
2
|
name: file-bug
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
description: |
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
Use when the user wants to file a bug, open a GitHub issue, raise a
|
|
6
|
+
ticket, log this as a bug, or otherwise create a tracked record of a
|
|
7
|
+
symptom against switchroom (or another configured repo). Pulls the
|
|
8
|
+
right log files automatically, forces a root-cause section with
|
|
9
|
+
citations, flags logging gaps when RCA can't be pinned, and files
|
|
10
|
+
via `gh issue create`.
|
|
11
|
+
Triggers on phrasings including: "Can you report this issue on
|
|
12
|
+
GitHub?", "Please raise a ticket.", "I need to this needs a real
|
|
13
|
+
ticket.", "this needs a real ticket", "I need to file a bug.",
|
|
14
|
+
"open an issue", "log this as a bug", "track this somewhere",
|
|
15
|
+
"Report this issue on GitHub, please.", "Please file a bug.",
|
|
16
|
+
"gonna need to report this issue on GitHub", "quick q — can i open
|
|
17
|
+
an issue", indirect signals like "remember this for later", "this
|
|
18
|
+
needs to be tracked somewhere", "I want a paper trail for this",
|
|
19
|
+
and typo'd variants such as "raise a ticket", "file aa bug",
|
|
20
|
+
"log this as a bug". Whenever the user's message starts with the
|
|
21
|
+
phrase "For filing a GitHub bug report," — regardless of what
|
|
22
|
+
follows — use this skill.
|
|
23
|
+
Do NOT use for troubleshooting the fleet, rebooting an agent, running a
|
|
24
|
+
health check, or updating agents — those are `switchroom-health` /
|
|
25
|
+
`switchroom-manage`. Do NOT use for asking why the agent restarted or
|
|
26
|
+
whether it crashed — that's `switchroom-runtime` (which may then *offer*
|
|
27
|
+
to invoke this skill).
|
|
28
|
+
Do NOT use when the user is reporting a bug to a non-GitHub system or
|
|
29
|
+
another channel: "report a bug to <Jira/Linear/Notion/Slack/email>",
|
|
30
|
+
"submit feedback to <support/help-desk/another channel>", "send this
|
|
31
|
+
to support", "email this to the team", "post this in Slack", "open a
|
|
32
|
+
Jira ticket", "create a Linear issue" — those route to the relevant
|
|
33
|
+
external channel, not this skill. Also do NOT fire on bare, contextless
|
|
34
|
+
phrases like "file a bug" or "report this issue on GitHub" with no
|
|
35
|
+
attached symptom, repo, or log evidence — those are ambient phrases
|
|
36
|
+
the user may say in passing; only fire when there is a concrete
|
|
37
|
+
symptom or context to attach to the report.
|
|
10
38
|
license: MIT
|
|
11
39
|
compatibility: claude-code
|
|
12
40
|
allowed-tools:
|
|
@@ -107,7 +135,7 @@ HH:MM:SS [journalctl] <line>
|
|
|
107
135
|
|
|
108
136
|
## Environment
|
|
109
137
|
- agent: <name>
|
|
110
|
-
- branch: <branch> (
|
|
138
|
+
- branch: <branch> (from inside your switchroom clone: `git rev-parse --short HEAD`)
|
|
111
139
|
- runtime versions: <bun/node/claude-cli versions>
|
|
112
140
|
- triggered: <human-readable timestamp>
|
|
113
141
|
```
|
|
@@ -8,6 +8,21 @@ description: |
|
|
|
8
8
|
inflated symbolism, promotional language, superficial -ing analyses, vague
|
|
9
9
|
attributions, em dash overuse, rule of three, AI vocabulary words, passive
|
|
10
10
|
voice, negative parallelisms, and filler phrases.
|
|
11
|
+
Triggers on natural phrasings including: "Let's rewrite this to sound natural.",
|
|
12
|
+
"Please edit this so it doesn't sound like AI.", "Remove signs of AI writing,
|
|
13
|
+
please.", "I need to make this sound more human.", "Can you remove the rule
|
|
14
|
+
of three?", "Let's fix the em-dash overuse.", "remove AI vocabulary",
|
|
15
|
+
"kill the passive voice", "make this sound more human", "yo, how do i remove
|
|
16
|
+
signs of AI writing", "gonna need to remove signs of AI writing", and typo'd
|
|
17
|
+
variants like "make this soudn more human", "fix theem-dash overuse", "remove
|
|
18
|
+
signs of AI writing". Also fires on indirect signals like "this paragraph
|
|
19
|
+
screams ChatGPT", "the prose sounds robotic", "this reads like AI slop" —
|
|
20
|
+
anywhere the user complains text feels AI-flavored and wants it rewritten.
|
|
21
|
+
Whenever the user's message starts with the phrase "To humanize my writing
|
|
22
|
+
style," — regardless of what follows — use this skill.
|
|
23
|
+
Do NOT use for proofreading, grammar fixes, or style edits where the input
|
|
24
|
+
wasn't AI-generated. This skill specifically removes AI tells. Do NOT use
|
|
25
|
+
for building a personal voice template — that's `humanizer-calibrate`.
|
|
11
26
|
license: MIT
|
|
12
27
|
compatibility: claude-code opencode
|
|
13
28
|
allowed-tools:
|
|
@@ -5,7 +5,13 @@ description: |
|
|
|
5
5
|
Build a personal voice template for the humanizer skill from the user's
|
|
6
6
|
recent Telegram messages. Reads the local message buffer, summarises
|
|
7
7
|
vocabulary / sentence shape / formatting habits, writes a markdown
|
|
8
|
-
template the humanizer will match against.
|
|
8
|
+
template the humanizer will match against. Use when the user says "build
|
|
9
|
+
my voice template", "calibrate humanizer to my style", "fresh voice
|
|
10
|
+
profile from my Telegram", "humanizer-calibrate", or "make humanizer
|
|
11
|
+
sound more like me". Do NOT use for one-shot rewrites — that's
|
|
12
|
+
`humanizer`. Do NOT use for "remove the rule of three", "remove AI
|
|
13
|
+
vocabulary", "fix em-dash overuse", or other AI-tell-removal requests —
|
|
14
|
+
those are `humanizer`.
|
|
9
15
|
license: MIT
|
|
10
16
|
compatibility: claude-code
|
|
11
17
|
allowed-tools:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mcp-builder
|
|
3
|
-
description:
|
|
3
|
+
description: Use when the user wants to build, write, or scaffold an MCP (Model Context Protocol) server — wrapping an external API or service as MCP tools an LLM can call, in Python (FastMCP) or Node/TypeScript (MCP SDK). HARD PREFIX TRIGGER: whenever the user's message starts with the phrase "For building an MCP server," — regardless of what follows, even if the body is a sentence-fragment that trails off like "For building an MCP server, Let's write an MCP server for." — use this skill. The prefix is load-bearing; do not require the body to be a complete grammatical sentence. Triggers on phrasings including "Let's write an MCP server for.", "Please integrate an external API as MCP.", "Use the MCP SDK in TypeScript, please.", "Write an MCP server for, please.", "I'd like to create a new MCP server.", "I need to use the MCP SDK in TypeScript.", "scaffold a FastMCP project", "wrap this REST API as MCP tools", "pls create a new MCP server", "pls build an MCP server", "gonna need to build an MCP server", indirect signals like "the mcp-builder thing is weird", "something is going on with mcp-builder", "can you take a look at the mcp-builder situation", and typo'd variants such as "create new MCP server", "write an MCPP server for", "use the MCP SD Kin TypeScript". Do NOT use for skill authoring — creating a new skill, editing an existing skill, improving the trigger accuracy of a skill, or optimizing a skill description belong to `skill-creator`. Do NOT use for client-side MCP wiring or configuring MCP clients.
|
|
4
4
|
license: Complete terms in LICENSE.txt
|
|
5
5
|
---
|
|
6
6
|
|
package/skills/pdf/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pdf
|
|
3
|
-
description:
|
|
3
|
+
description: "Do anything with PDF files. This includes: reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating PDF pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, OCR on scanned PDFs to make them searchable. Triggers on phrasings including: \"Let's rotate PDF pages.\", 'I need to watermark a PDF.', 'Can you rotate PDF pages?', 'Can you fill a PDF form?', 'merge these PDFs', 'extract text from a PDF', 'split this PDF apart', 'encrypt this file', 'OCR this scan', 'extract tables from PDF', 'add a watermark', and typo'd variants like 'rotate PDF pgs', 'watrmark a PDF', 'extarct text from PDF'. Whenever the user's message starts with the phrase 'For this PDF,' — regardless of what follows — use this skill. If the user mentions a .pdf file or asks to produce one, use this skill. Do NOT use for Word, slides, or spreadsheet deliverables — `.pdf` must be the input or output."
|
|
4
4
|
license: Proprietary. LICENSE.txt has complete terms
|
|
5
5
|
---
|
|
6
6
|
|
package/skills/pptx/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pptx
|
|
3
|
-
description: "
|
|
3
|
+
description: "Create, edit, read, or manipulate PowerPoint files (.pptx). Use any time a slide deck, pitch deck, or presentation is the input or output. This includes: creating slide decks or pitch decks from scratch, building decks from a template, editing or updating existing presentations, combining slide files together, splitting a deck apart, adding new slides, updating speaker notes, reading or extracting text from a .pptx, and working with layouts or comments. Triggers on phrasings including: 'I need to combine slide files.', 'I need to work from a slide template.', 'Help me split this deck.', \"I'd like to edit this presentation.\", \"Let's edit this presentation.\", 'I need to split this deck.', 'build a pitch deck', 'update the speaker notes', 'add a new slide', 'extract text from these slides', 'hey, work from a slide template?', 'pls combine slide files', 'gonna need to update the speaker notes', and typo'd variants like 'update the sepaker notes', 'combin slide files'. Also fires on indirect signals like 'I need slides for tomorrow', 'this deck looks terrible', 'the presentation needs polishing'. Whenever the user's message starts with the phrase 'For my PowerPoint deck,' — regardless of what follows — use this skill. Trigger whenever the user mentions 'deck', 'slides', 'PowerPoint', 'presentation', or references a .pptx filename. Do NOT use when the deliverable is `.docx`, `.pdf`, or a non-slide format, even if the user says 'presentation'."
|
|
4
4
|
license: Proprietary. LICENSE.txt has complete terms
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: skill-creator
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
Create new skills, modify and improve existing skills, and measure skill
|
|
5
|
+
performance. Use when users want to create a skill from scratch, edit an
|
|
6
|
+
existing skill, run evals to test a skill, benchmark skill performance
|
|
7
|
+
with variance analysis, or optimize a skill's description / frontmatter
|
|
8
|
+
for better triggering accuracy.
|
|
9
|
+
Triggers on natural phrasings including: "I need to create a new skill.",
|
|
10
|
+
"Help me create a new skill.", "Edit an existing skill, please.",
|
|
11
|
+
"Could you edit an existing skill for me?",
|
|
12
|
+
"Can you improve the trigger accuracy of a skill?",
|
|
13
|
+
"Can you optimize a skill description?",
|
|
14
|
+
"any way to optimize a skill description?",
|
|
15
|
+
"yo, how do i edit an existing skill",
|
|
16
|
+
"yo, how do i optimize a skill description",
|
|
17
|
+
and typo'd variants like "create a new skill",
|
|
18
|
+
"improve teh trigger accuracy of a skill", "optimize skill description".
|
|
19
|
+
Also fires on indirect signals like "the skill-creator thing is weird",
|
|
20
|
+
"something is going on with skill-creator",
|
|
21
|
+
"can you take a look at the skill-creator situation".
|
|
22
|
+
Do NOT use for building MCP servers / MCP tools — that's `mcp-builder`.
|
|
23
|
+
Do NOT use for filing a bug report — that's `file-bug`.
|
|
4
24
|
---
|
|
5
25
|
|
|
6
26
|
# Skill Creator
|
|
Binary file
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: switchroom-cli
|
|
3
|
-
description: "Run switchroom CLI operations on existing agents: logs, update, restart, version, config inspection, scheduled tasks, and Telegram plugin reference. Use when the user wants to: show logs (
|
|
3
|
+
description: "Run switchroom CLI operations on existing agents: logs, update, restart, version, config inspection, scheduled tasks, and Telegram plugin reference. HARD PREFIX TRIGGER: whenever the user's message starts with the phrase 'In switchroom (the CLI),' — regardless of what follows — use this skill. That prefix is load-bearing and wins over `switchroom-health`, `switchroom-runtime`, and `switchroom-manage`; even probes like 'In switchroom (the CLI), Can you why did it crash?', 'In switchroom (the CLI), Please sync my config.', and 'In switchroom (the CLI), Upgrade switchroom, please.' MUST route here, not to switchroom-runtime or switchroom-health. Use when the user wants to: show logs ('logs', 'what happened', 'check the journal', 'why did it crash'); update or upgrade agents ('update', 'pull latest', 'get new code', 'upgrade switchroom', 'Upgrade switchroom, please.'); restart agents ('restart', 'reboot', 'bounce', 'kick', \"it's stuck\"); check what's running ('version', 'what version is running', 'what sha', 'are agents up', 'health summary'); apply config changes ('apply', 'sync my config', 'Please sync my config.', 'apply my config changes', 'I just edited switchroom.yaml'); inspect an agent's effective config ('what model is X using', 'how is <agent> configured', 'show the cascade'); list scheduled tasks ('cron', 'timers', 'what runs automatically', 'scheduled tasks'); or ask about Telegram-plugin features ('what MCP tools does the bot have', 'how does reply work'). Also fires on verbatim phrasings: 'Please sync my config.', 'Could you check the journal for me?', 'Upgrade switchroom, please.', 'apply my config changes', 'what version is running', 'Can you why did it crash?', 'show me the logs', 'check the cron jobs', \"what's scheduled\". Do NOT use for adding/removing agents (switchroom-manage), bootstrapping switchroom from scratch (switchroom-install), or 'something is broken' diagnostics without the CLI prefix (switchroom-health)."
|
|
4
4
|
allowed-tools: Bash(switchroom *) Bash(docker *) Bash(docker compose *)
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -8,8 +8,9 @@ allowed-tools: Bash(switchroom *) Bash(docker *) Bash(docker compose *)
|
|
|
8
8
|
|
|
9
9
|
This skill is the reference for running `switchroom` CLI commands against existing agents. Each section below is triggered by a distinct user intent — jump to the relevant one rather than walking top-to-bottom.
|
|
10
10
|
|
|
11
|
-
**
|
|
12
|
-
- `switchroom
|
|
11
|
+
**Four commands to know:**
|
|
12
|
+
- `switchroom update` — full operator path: pulls images + applies config + recreates containers + runs doctor (since v0.7.8 / #918). What you want 95% of the time.
|
|
13
|
+
- `switchroom apply` — config-only reconcile: refresh per-agent scaffolds and (re)write `~/.switchroom/compose/docker-compose.yml` without touching running containers. Use when you want to inspect the generated compose before bringing the fleet up yourself.
|
|
13
14
|
- `switchroom restart [agent]` — bounces a stuck or wedged agent
|
|
14
15
|
- `switchroom version` — shows what's running (versions + health summary)
|
|
15
16
|
|
|
@@ -47,26 +48,20 @@ Include the last ~20 lines verbatim, then summarise what you see (crash, stall,
|
|
|
47
48
|
|
|
48
49
|
## Update — "update", "pull latest", "get new code", "upgrade"
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
Use the `switchroom update` verb (since v0.7.8 / #918). It collapses pull + apply + recreate + doctor into one command.
|
|
51
52
|
|
|
52
53
|
```bash
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
switchroom apply
|
|
58
|
-
docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml pull
|
|
59
|
-
docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml up -d
|
|
54
|
+
switchroom update # pull images + apply + recreate + run doctor
|
|
55
|
+
switchroom update --check # dry-run: print the plan, exit 0
|
|
56
|
+
switchroom update --status # read-only: CLI version + image/container ages
|
|
57
|
+
switchroom update --rebuild # source-checkout users: also git pull + npm build
|
|
60
58
|
```
|
|
61
59
|
|
|
62
|
-
`switchroom
|
|
63
|
-
(scaffolding any missing workspaces, refreshing bootstrap files), then
|
|
64
|
-
writes `~/.switchroom/compose/docker-compose.yml`. The CLI deliberately
|
|
65
|
-
does not run `docker` for you — the operator owns the bring-up.
|
|
60
|
+
`switchroom update` is the operator path. The CLI self-elevates via sudo internally for the per-agent scaffold dirs that need root — no need for `sudo HOME=… PATH=…` incantations.
|
|
66
61
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
If you only need the config-reconcile half without restarting agents, `switchroom apply` writes `~/.switchroom/compose/docker-compose.yml` and refreshes per-agent scaffolds without touching running containers. The operator runs the docker bring-up themselves.
|
|
63
|
+
|
|
64
|
+
From inside an agent's Telegram DM, the same flow is available as `/upgradestatus` (read-only) and `/update apply` (admin-gated).
|
|
70
65
|
|
|
71
66
|
---
|
|
72
67
|
|
|
@@ -162,70 +157,74 @@ Agent config resolves through `defaults → extends profile → agent-specific`,
|
|
|
162
157
|
|
|
163
158
|
## Auth — "share my Pro account across agents", "auth verbs", "who's logged into what"
|
|
164
159
|
|
|
165
|
-
|
|
160
|
+
The **Anthropic account is the unit of authentication** — one OAuth flow per account, then "use this account on these agents" is fleet-wide config (not another OAuth round per agent). The `switchroom-auth-broker` daemon is the sole writer of every `credentials.json`; agents are passive readers. See `docs/auth.md` for the full model.
|
|
166
161
|
|
|
167
|
-
###
|
|
162
|
+
### CLI verbs
|
|
168
163
|
|
|
169
164
|
```bash
|
|
170
|
-
|
|
171
|
-
switchroom auth
|
|
172
|
-
switchroom auth
|
|
173
|
-
switchroom auth
|
|
174
|
-
switchroom auth
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
switchroom auth
|
|
184
|
-
|
|
185
|
-
#
|
|
186
|
-
switchroom auth
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
switchroom auth
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
switchroom auth
|
|
194
|
-
|
|
195
|
-
# Single account-refresh tick: refresh expiring tokens, fan out to enabled agents
|
|
196
|
-
switchroom auth refresh-accounts [--json]
|
|
165
|
+
# Add an account (one OAuth flow per account, ever)
|
|
166
|
+
switchroom auth add <label> --from-oauth # interactive OAuth
|
|
167
|
+
switchroom auth add <label> --from-agent <name> # seed from an existing agent's creds
|
|
168
|
+
switchroom auth add <label> --from-credentials <path> # import a credentials.json
|
|
169
|
+
switchroom auth add <label> --from-oauth --replace # re-auth an existing label (drift recovery)
|
|
170
|
+
|
|
171
|
+
# See the state of the fleet
|
|
172
|
+
switchroom auth list # accounts + health + which one is active
|
|
173
|
+
switchroom auth show # full snapshot (fleet + agents + consumers)
|
|
174
|
+
switchroom auth show <agent> # one agent's effective account + override
|
|
175
|
+
|
|
176
|
+
# Move the fleet to a different account
|
|
177
|
+
switchroom auth use <label> # fleet-wide active swap
|
|
178
|
+
switchroom auth rotate # cycle to next non-exhausted in fallback_order
|
|
179
|
+
|
|
180
|
+
# Manage accounts
|
|
181
|
+
switchroom auth rm <label> # refused if it's the only account
|
|
182
|
+
|
|
183
|
+
# Edge case: per-agent override (opts one agent out of the fleet active)
|
|
184
|
+
switchroom auth agent override <agent> <label>
|
|
185
|
+
switchroom auth agent override <agent> --clear
|
|
186
|
+
|
|
187
|
+
# Diagnostics (broker owns the refresh loop; this just forces a tick)
|
|
188
|
+
switchroom auth refresh # all accounts
|
|
189
|
+
switchroom auth refresh <label> # one account
|
|
197
190
|
```
|
|
198
191
|
|
|
199
192
|
### Schema
|
|
200
193
|
|
|
201
194
|
```yaml
|
|
195
|
+
auth:
|
|
196
|
+
active: me@example.com # fleet-wide active account
|
|
197
|
+
fallback_order: # ordered cycle list for `auth rotate`
|
|
198
|
+
- me@example.com
|
|
199
|
+
- work
|
|
200
|
+
- personal
|
|
201
|
+
|
|
202
202
|
agents:
|
|
203
|
-
|
|
203
|
+
ziggy: {} # inherits fleet active
|
|
204
|
+
clerk:
|
|
205
|
+
admin: true # gates /agents, /restart, /update AND admin /auth verbs
|
|
206
|
+
klanker:
|
|
204
207
|
auth:
|
|
205
|
-
|
|
208
|
+
override: work # opt-out (edge case)
|
|
206
209
|
```
|
|
207
210
|
|
|
208
|
-
|
|
211
|
+
Most agents need no `auth:` block — they inherit `auth.active`. The pre-RFC-H per-agent `auth.accounts: [...]` and `auth_label:` fields are gone; replace them with fleet-wide `auth.active` + (rarely) `agents.<name>.auth.override`.
|
|
209
212
|
|
|
210
|
-
### Telegram
|
|
213
|
+
### Telegram surface
|
|
211
214
|
|
|
212
|
-
|
|
215
|
+
Three commands the gateway recognises in any agent chat:
|
|
213
216
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
/auth account rm <label>
|
|
218
|
-
/auth enable <label> [agents...] — defaults to the current agent
|
|
219
|
-
/auth disable <label> [agents...] — defaults to the current agent
|
|
220
|
-
```
|
|
217
|
+
- `/auth show` — fleet snapshot. Open to any agent (read-only).
|
|
218
|
+
- `/auth use <label>` — admin agents only.
|
|
219
|
+
- `/auth rotate` — admin agents only.
|
|
221
220
|
|
|
222
|
-
|
|
221
|
+
These replaced the v0.7-era `/auth dashboard` UI (a 1100-LOC slot-model promote UI, deleted in the broker rollout).
|
|
223
222
|
|
|
224
223
|
### When auth-related questions come in
|
|
225
224
|
|
|
226
|
-
- "I want one Pro/Max subscription on multiple agents" →
|
|
227
|
-
- "An agent's auth expired" →
|
|
228
|
-
- "I hit a quota" → `switchroom auth
|
|
225
|
+
- "I want one Pro/Max subscription on multiple agents" → that's just the default. `switchroom auth add me@example.com --from-oauth`, then `switchroom auth use me@example.com`. Every agent in the fleet inherits.
|
|
226
|
+
- "An agent's auth expired" → `switchroom auth list` first. If broker thinks the account is healthy but the agent isn't getting it, force a tick with `switchroom auth refresh` (diagnostic; the broker normally handles this on its own loop).
|
|
227
|
+
- "I hit a quota" → `switchroom auth rotate` cycles to the next non-exhausted account in `fallback_order`. Quota state is per-account and fans out in seconds across every agent on that account.
|
|
229
228
|
|
|
230
229
|
---
|
|
231
230
|
|
|
@@ -272,7 +271,7 @@ Additional features:
|
|
|
272
271
|
- **PI-safe envelope** — inbound text wrapped in `<channel source="telegram">` for prompt-injection safety
|
|
273
272
|
- **Inline approvals** — tool permissions surface as ✅/❌ buttons or via `/approve` `/deny` `/pending`
|
|
274
273
|
- **Slash commands** — `/new`, `/reset`, `/approve`, `/deny`, `/pending`, `/restart`, `/update`, `/version`, `/logs`, `/doctor`, `/auth`, `/switchroomhelp` (see `TELEGRAM_MENU_COMMANDS` in `telegram-plugin/welcome-text.ts`)
|
|
275
|
-
- **`/auth`** —
|
|
274
|
+
- **`/auth`** — three chat commands: `/auth show` (read-only, open to any agent), `/auth use <label>` and `/auth rotate` (admin agents only). Backed by the auth-broker — see the **Auth** section above and `docs/auth.md` for the full model.
|
|
276
275
|
- **Access control** — `dmPolicy: pairing | allowlist | disabled` per agent
|
|
277
276
|
|
|
278
277
|
---
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: switchroom-health
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
Use for diagnosing switchroom problems and running health checks across the
|
|
5
|
+
full stack. HARD PREFIX TRIGGER: any message starting with "For switchroom
|
|
6
|
+
doctor / health," — regardless of what follows — MUST use this skill
|
|
7
|
+
immediately. Beyond that prefix, use when the user: reports something is wrong
|
|
8
|
+
with agents, wants to verify their setup works, asks to diagnose or
|
|
9
|
+
troubleshoot, says agents are failing/broken/crashing/acting weird, or asks
|
|
10
|
+
"what's wrong" without a specific crash to investigate. Checks CLI, auth,
|
|
11
|
+
docker containers, agent files, bot tokens, and memory backend. Do NOT use
|
|
12
|
+
for: per-agent status/uptime listing (switchroom-status), restart or interrupt
|
|
13
|
+
actions (switchroom-runtime), or fresh installs (switchroom-install). Do NOT
|
|
14
|
+
use when message starts with "In switchroom (the CLI)," — that prefix always
|
|
15
|
+
routes to switchroom-cli, even if the body mentions diagnosis or errors.
|
|
4
16
|
---
|
|
5
17
|
|
|
6
18
|
# Agent Health Diagnostics
|
|
@@ -23,13 +35,14 @@ Run these diagnostics with Bash:
|
|
|
23
35
|
# Check switchroom CLI version
|
|
24
36
|
switchroom --version 2>/dev/null || echo "FAIL: switchroom not found"
|
|
25
37
|
|
|
26
|
-
# Check auth
|
|
27
|
-
|
|
38
|
+
# Check Anthropic accounts + fleet auth state (see docs/auth.md)
|
|
39
|
+
# Shows accounts at ~/.switchroom/accounts/<label>/, the fleet-wide active
|
|
40
|
+
# account, and per-account health (healthy / quota-exhausted / expired /
|
|
41
|
+
# missing-refresh-token). The auth-broker is the sole writer of credentials.
|
|
42
|
+
switchroom auth list 2>/dev/null || echo "FAIL: auth check failed"
|
|
28
43
|
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
# and per-account health (healthy / quota-exhausted / expired / missing-refresh-token).
|
|
32
|
-
switchroom auth account list 2>/dev/null || echo "INFO: no Anthropic accounts configured (legacy per-agent slot model in use)"
|
|
44
|
+
# Full snapshot — fleet + per-agent effective accounts + consumers
|
|
45
|
+
switchroom auth show 2>/dev/null || echo "INFO: switchroom auth show unavailable"
|
|
33
46
|
|
|
34
47
|
# Check docker-compose service health
|
|
35
48
|
docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml ps 2>/dev/null || echo "no switchroom docker fleet"
|
|
@@ -90,9 +103,9 @@ For common failures, give the exact fix:
|
|
|
90
103
|
| Problem | Fix |
|
|
91
104
|
|---------|-----|
|
|
92
105
|
| `switchroom: command not found` | `npm install -g switchroom` |
|
|
93
|
-
|
|
|
94
|
-
| Account
|
|
95
|
-
|
|
|
106
|
+
| Account expired (`auth list` shows red ✗) | `switchroom auth refresh <label>` (force a tick; broker normally handles this on its own loop). If no refresh-token, re-auth with `switchroom auth add <label> --from-oauth --replace`. |
|
|
107
|
+
| Account quota-exhausted (yellow ⊘ in `auth list`) | `switchroom auth rotate` cycles to the next account in `auth.fallback_order`; quota state is per-account and shared across every agent on it. |
|
|
108
|
+
| Fleet on the wrong account | `switchroom auth use <label>` (fleet-wide) or `switchroom auth agent override <agent> <label>` (one agent) |
|
|
96
109
|
| Container unhealthy | `docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml restart switchroom-<name>` |
|
|
97
110
|
| Missing .mcp.json | `switchroom apply` (full reconcile + rewrite compose; bring up via `docker compose ... up -d`) or `switchroom agent reconcile <name>` (targeted) |
|
|
98
111
|
| Bot token unresolved | Check vault: `switchroom vault list` |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: switchroom-install
|
|
3
|
-
description: Install switchroom and its dependencies (docker, claude CLI, switchroom binary) on a fresh machine. Use for onboarding and first-time setup — when the user says 'install switchroom on this machine', 'set up switchroom for the first time', 'bootstrap switchroom from scratch', 'get switchroom running', 'how do I get started with switchroom', "I'm new to switchroom, where do I begin", or asks about switchroom dependencies or prerequisites. This is the onboarding entry point, not for managing existing agents.
|
|
3
|
+
description: Install switchroom and its dependencies (docker, claude CLI, switchroom binary) on a fresh machine. Use for onboarding and first-time setup — when the user says 'install switchroom on this machine', 'set up switchroom for the first time', 'bootstrap switchroom from scratch', 'get switchroom running', 'how do I get started with switchroom', "I'm new to switchroom, where do I begin", or asks about switchroom dependencies or prerequisites. This is the onboarding entry point, not for managing existing agents. Do NOT use when the user's message starts with "In switchroom agent management," — that prefix is a hard trigger for `switchroom-manage` even when the action mentions "reinstall my agents" or "set up my agents"; agent-management prefix means fleet operations on an already-installed switchroom, not first-time host bootstrap.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Install Switchroom
|
|
@@ -40,7 +40,7 @@ Only install what's missing. Check each first:
|
|
|
40
40
|
command -v docker || echo "MISSING: docker"
|
|
41
41
|
docker compose version >/dev/null 2>&1 || echo "MISSING: docker compose v2"
|
|
42
42
|
|
|
43
|
-
# Claude Code CLI (
|
|
43
|
+
# Claude Code CLI (used inside agent containers and for the initial OAuth flow)
|
|
44
44
|
command -v claude || echo "MISSING: claude"
|
|
45
45
|
```
|
|
46
46
|
|
|
@@ -102,7 +102,7 @@ If `switchroom doctor` reports healthy and at least one agent is listed, install
|
|
|
102
102
|
|
|
103
103
|
### Optional follow-up: share one Anthropic account across multiple agents
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
This is the default. One OAuth flow per Anthropic account, then every agent in the fleet inherits the fleet-wide active account — no per-agent OAuth round. The auth-broker handles refresh and credential fanout automatically. See `switchroom-manage` (Anthropic accounts section) and `docs/auth.md` for the bootstrap flow. Flag this as soon as they ask "how do I add another agent?".
|
|
106
106
|
|
|
107
107
|
## What not to do
|
|
108
108
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: switchroom-manage
|
|
3
|
-
description: Manage the fleet of switchroom agents
|
|
3
|
+
description: Manage the fleet of switchroom agents on an already-bootstrapped install — adding, creating, removing, listing, reinstalling, reprovisioning, or lifecycle-controlling agents. HARD PREFIX TRIGGER: whenever the user's message starts with the phrase "In switchroom agent management," — regardless of what follows — use this skill. That prefix is load-bearing and wins over `switchroom-install`, `switchroom-runtime`, `switchroom-cli`, and `switchroom-health`; even probes like "In switchroom agent management, Can you reinstall my agents?", "In switchroom agent management, I need to reprovision my agents.", and "In switchroom agent management, Could you reprovision my agents for me?" MUST route here — NOT to switchroom-install (despite the word "reinstall") and NOT to switchroom-runtime (despite touching agent lifecycle). The word "reinstall" inside the agent-management prefix means re-provision an EXISTING agent on an ALREADY-installed switchroom host; it does not mean a fresh host bootstrap. Use when the user wants to "reprovision my agents", "reinstall my agents", "manage my agents", "add a new agent", "remove an agent", "list my agents", or "restart an agent". Triggers on phrasings including "I need to reprovision my agents.", "Could you reprovision my agents for me?", "Manage my agents, please.", "Can you reinstall my agents?", "I'd like to reinstall my agents.", "Help me list my agents.", "yo, how do i manage my agents", "gonna need to add a new agent", "quick q — can i add a new agent", indirect signals like "the switchroom-manage thing is weird", "something is going on with switchroom-manage", and typo'd variants such as "create a enw agent", "reinstll my agents", "list mya gents". Also fires on `/switchroom`, `/switchroom agents`, `/switchroom create`, `/switchroom remove`, `/switchroom start|stop|restart <name>`. Do NOT use for first-time bootstrap of switchroom itself when there is NO "In switchroom agent management," prefix — phrasings like "how do I get started with switchroom", "set up switchroom for the first time", "bootstrap switchroom from scratch" belong to `switchroom-install`. Do NOT use for per-agent snapshots or status — that's `switchroom-status`. Do NOT use for "why did you restart" / agent self-state questions without the management prefix — that's `switchroom-runtime`.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Switchroom Agent Management
|
|
@@ -20,12 +20,12 @@ When the user invokes `/switchroom` or asks to add, create, remove, reinstall, r
|
|
|
20
20
|
| `/switchroom stop <name>` | `switchroom agent stop <name>` |
|
|
21
21
|
| `/switchroom restart <name>` | `switchroom restart <name>` |
|
|
22
22
|
| `/switchroom reinstall <name>` or "reinstall my agents" | `switchroom apply && docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml up -d` |
|
|
23
|
-
| `/switchroom status` | `switchroom auth
|
|
23
|
+
| `/switchroom status` | `switchroom auth show` |
|
|
24
24
|
| `/switchroom memory <query>` | `switchroom memory search "<query>"` |
|
|
25
25
|
| `/switchroom memory <query> --agent <name>` | `switchroom memory search "<query>" --agent <name>` |
|
|
26
26
|
| `/switchroom vault list` | `switchroom vault list` |
|
|
27
27
|
| `/switchroom topics` | `switchroom topics list` |
|
|
28
|
-
| `/switchroom accounts` or "list anthropic accounts" | `switchroom auth
|
|
28
|
+
| `/switchroom accounts` or "list anthropic accounts" | `switchroom auth list` |
|
|
29
29
|
| "share my Pro subscription across agents" / "add an Anthropic account" | See **Anthropic accounts** below |
|
|
30
30
|
|
|
31
31
|
### Add / create a new agent
|
|
@@ -38,30 +38,37 @@ When the user says "add a new agent", "add an agent to my switchroom setup", or
|
|
|
38
38
|
|
|
39
39
|
### Anthropic accounts (one OAuth, many agents)
|
|
40
40
|
|
|
41
|
-
The
|
|
41
|
+
The auth model treats the Anthropic account as the unit of authentication: one OAuth flow per account, then every agent in the fleet inherits the fleet-wide active account. The `switchroom-auth-broker` daemon owns the refresh loop and is the sole writer of every `credentials.json`. See `docs/auth.md` for the operator guide and `reference/share-auth-across-the-fleet.md` for the design.
|
|
42
42
|
|
|
43
43
|
**Bootstrap flow when the user wants to share one Pro/Max subscription across agents:**
|
|
44
44
|
|
|
45
|
-
1.
|
|
46
|
-
2. **Create the global account** by lifting the agent's credentials:
|
|
45
|
+
1. **Add the account** (one OAuth flow, ever):
|
|
47
46
|
```bash
|
|
48
|
-
switchroom auth
|
|
47
|
+
switchroom auth add work-pro --from-oauth
|
|
49
48
|
```
|
|
50
|
-
|
|
49
|
+
Alternatively, seed from an already-authenticated agent's credentials: `switchroom auth add work-pro --from-agent <existing-agent>`.
|
|
50
|
+
2. **Activate it fleet-wide:**
|
|
51
51
|
```bash
|
|
52
|
-
switchroom auth
|
|
52
|
+
switchroom auth use work-pro
|
|
53
53
|
```
|
|
54
|
-
This
|
|
55
|
-
|
|
54
|
+
This sets `auth.active: work-pro` in `switchroom.yaml`. Every agent inherits on next refresh-read — no per-agent enable step needed.
|
|
55
|
+
3. The broker fans out the credentials to each agent's `.claude/credentials.json` automatically. No manual restart required in the common case.
|
|
56
56
|
|
|
57
|
-
Verify with `switchroom auth
|
|
57
|
+
Verify with `switchroom auth list` — shows accounts, health, and which one is fleet-active. Quota / 429 events propagate per-account: when one account is exhausted, the broker fails the fleet over to the next entry in `auth.fallback_order` automatically (or run `switchroom auth rotate` to force a cycle).
|
|
58
58
|
|
|
59
|
-
**
|
|
59
|
+
**Edge case — per-agent override.** If one agent needs a different account than the fleet active (e.g. a personal-only experiment running on `personal-max`), use:
|
|
60
60
|
|
|
61
|
+
```bash
|
|
62
|
+
switchroom auth agent override klanker personal-max
|
|
63
|
+
switchroom auth agent override klanker --clear # back to fleet active
|
|
61
64
|
```
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
|
|
66
|
+
**Telegram parity** — three commands from any agent's chat:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
/auth show # read-only fleet snapshot, open to any agent
|
|
70
|
+
/auth use work-pro # admin agents only
|
|
71
|
+
/auth rotate # admin agents only — cycle fallback_order
|
|
65
72
|
```
|
|
66
73
|
|
|
67
74
|
## Behavior
|
|
@@ -77,8 +84,8 @@ Switchroom commands:
|
|
|
77
84
|
/switchroom start <name> Start an agent
|
|
78
85
|
/switchroom stop <name> Stop an agent
|
|
79
86
|
/switchroom restart <name> Restart an agent (drain by default)
|
|
80
|
-
/switchroom status Show
|
|
81
|
-
/switchroom accounts List Anthropic accounts +
|
|
87
|
+
/switchroom status Show fleet auth state (active account, agents, health)
|
|
88
|
+
/switchroom accounts List Anthropic accounts + health
|
|
82
89
|
/switchroom memory <query> Search agent memory
|
|
83
90
|
/switchroom vault list List vault secrets
|
|
84
91
|
/switchroom topics List Telegram topics
|
|
@@ -86,5 +93,5 @@ Switchroom commands:
|
|
|
86
93
|
Fleet operations (run directly, not via /switchroom <sub>):
|
|
87
94
|
switchroom apply Reconcile + (re)write compose; bring up via `docker compose ... up -d`
|
|
88
95
|
switchroom version Show versions + running agent health summary
|
|
89
|
-
switchroom auth refresh
|
|
96
|
+
switchroom auth refresh Force a refresh tick (diagnostic; broker owns the loop)
|
|
90
97
|
```
|