switchroom 0.7.15 → 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.
Files changed (301) hide show
  1. package/README.md +51 -59
  2. package/bin/run-hook.sh +27 -11
  3. package/bin/timezone-hook.sh +9 -7
  4. package/dist/agent-scheduler/index.js +410 -133
  5. package/dist/auth-broker/index.js +13932 -0
  6. package/dist/cli/switchroom.js +26937 -5601
  7. package/dist/host-control/main.js +12702 -0
  8. package/dist/vault/approvals/kernel-server.js +467 -184
  9. package/dist/vault/broker/server.js +1430 -724
  10. package/examples/minimal.yaml +63 -0
  11. package/examples/personal-google-workspace-mcp/.env.example +34 -0
  12. package/examples/personal-google-workspace-mcp/README.md +194 -0
  13. package/examples/personal-google-workspace-mcp/compose.yaml +66 -0
  14. package/examples/switchroom.yaml +220 -0
  15. package/package.json +7 -4
  16. package/profiles/_base/settings.json.hbs +20 -5
  17. package/profiles/_base/start.sh.hbs +16 -3
  18. package/profiles/_shared/agent-self-service.md.hbs +126 -0
  19. package/profiles/_shared/telegram-style.md.hbs +20 -90
  20. package/profiles/_shared/vault-protocol.md.hbs +68 -0
  21. package/profiles/default/CLAUDE.md +50 -96
  22. package/profiles/default/CLAUDE.md.hbs +36 -6
  23. package/profiles/default/workspace/SOUL.md.hbs +12 -5
  24. package/skills/buildkite-agent-infrastructure/SKILL.md +30 -11
  25. package/skills/buildkite-agent-runtime/SKILL.md +44 -11
  26. package/skills/buildkite-api/SKILL.md +31 -8
  27. package/skills/buildkite-cli/SKILL.md +27 -9
  28. package/skills/buildkite-migration/SKILL.md +22 -9
  29. package/skills/buildkite-pipelines/SKILL.md +26 -9
  30. package/skills/buildkite-secure-delivery/SKILL.md +23 -9
  31. package/skills/buildkite-test-engine/SKILL.md +25 -8
  32. package/skills/docx/SKILL.md +1 -1
  33. package/skills/docx/scripts/office/validators/__pycache__/__init__.cpython-313.pyc +0 -0
  34. package/skills/docx/scripts/office/validators/__pycache__/base.cpython-313.pyc +0 -0
  35. package/skills/file-bug/SKILL.md +34 -6
  36. package/skills/humanizer/SKILL.md +15 -0
  37. package/skills/humanizer-calibrate/SKILL.md +7 -1
  38. package/skills/mcp-builder/SKILL.md +1 -1
  39. package/skills/pdf/SKILL.md +1 -1
  40. package/skills/pptx/SKILL.md +1 -1
  41. package/skills/skill-creator/SKILL.md +21 -1
  42. package/skills/skill-creator/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  43. package/skills/skill-creator/scripts/__pycache__/generate_report.cpython-313.pyc +0 -0
  44. package/skills/skill-creator/scripts/__pycache__/improve_description.cpython-313.pyc +0 -0
  45. package/skills/skill-creator/scripts/__pycache__/run_eval.cpython-313.pyc +0 -0
  46. package/skills/skill-creator/scripts/__pycache__/run_loop.cpython-313.pyc +0 -0
  47. package/skills/skill-creator/scripts/__pycache__/utils.cpython-313.pyc +0 -0
  48. package/skills/switchroom-cli/SKILL.md +63 -64
  49. package/skills/switchroom-health/SKILL.md +23 -10
  50. package/skills/switchroom-install/SKILL.md +3 -3
  51. package/skills/switchroom-manage/SKILL.md +26 -19
  52. package/skills/switchroom-runtime/SKILL.md +191 -0
  53. package/skills/switchroom-status/SKILL.md +27 -2
  54. package/skills/telegram-test-harness/SKILL.md +3 -0
  55. package/skills/token-helpers/SKILL.md +24 -1
  56. package/skills/webapp-testing/SKILL.md +31 -1
  57. package/skills/xlsx/SKILL.md +1 -1
  58. package/telegram-plugin/admin-commands/index.ts +7 -5
  59. package/telegram-plugin/analytics-posthog.ts +191 -0
  60. package/telegram-plugin/bridge/bridge.ts +69 -0
  61. package/telegram-plugin/bridge/ipc-client.ts +4 -1
  62. package/telegram-plugin/dist/bridge/bridge.js +194 -119
  63. package/telegram-plugin/dist/gateway/gateway.js +23611 -19671
  64. package/telegram-plugin/dist/server.js +245 -189
  65. package/telegram-plugin/first-paint.ts +3 -24
  66. package/telegram-plugin/gateway/auth-add-flow.ts +326 -0
  67. package/telegram-plugin/gateway/auth-broker-client.ts +75 -0
  68. package/telegram-plugin/gateway/auth-command.ts +794 -0
  69. package/telegram-plugin/gateway/auth-line.ts +123 -0
  70. package/telegram-plugin/gateway/boot-card.ts +169 -40
  71. package/telegram-plugin/gateway/boot-issue-cache.ts +308 -0
  72. package/telegram-plugin/gateway/boot-probes.ts +166 -123
  73. package/telegram-plugin/gateway/boot-reason.ts +41 -7
  74. package/telegram-plugin/gateway/boot-version.ts +66 -0
  75. package/telegram-plugin/gateway/gateway.ts +3499 -1885
  76. package/telegram-plugin/gateway/hostd-dispatch.ts +117 -0
  77. package/telegram-plugin/gateway/ipc-protocol.ts +18 -0
  78. package/telegram-plugin/gateway/pending-inbound-buffer.ts +106 -0
  79. package/telegram-plugin/gateway/quarantine.ts +69 -0
  80. package/telegram-plugin/gateway/quota-cache.ts +9 -4
  81. package/telegram-plugin/gateway/reaction-trigger.ts +401 -0
  82. package/telegram-plugin/gateway/recent-denials.test.ts +103 -0
  83. package/telegram-plugin/gateway/recent-denials.ts +77 -0
  84. package/telegram-plugin/gateway/startup-network-retry.ts +109 -31
  85. package/telegram-plugin/gateway/vault-grant-inbound-builders.ts +125 -0
  86. package/telegram-plugin/history.ts +91 -0
  87. package/telegram-plugin/hooks/hooks.json +10 -0
  88. package/telegram-plugin/hooks/sandbox-hint-posttool.mjs +130 -0
  89. package/telegram-plugin/hooks/subagent-tracker-posttool.mjs +19 -2
  90. package/telegram-plugin/hooks/subagent-tracker-pretool.mjs +22 -2
  91. package/telegram-plugin/hooks/tool-label-pretool.mjs +11 -0
  92. package/telegram-plugin/hooks/wedge-detect-posttool.mjs +303 -0
  93. package/telegram-plugin/inbound-classifier.ts +50 -0
  94. package/telegram-plugin/inline-keyboard-callbacks.ts +136 -0
  95. package/telegram-plugin/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  96. package/telegram-plugin/package.json +4 -2
  97. package/telegram-plugin/permission-rule.ts +51 -0
  98. package/telegram-plugin/permission-title.ts +56 -0
  99. package/telegram-plugin/quota-check.ts +19 -41
  100. package/telegram-plugin/registry/reaper.ts +223 -0
  101. package/telegram-plugin/retry-api-call.ts +80 -0
  102. package/telegram-plugin/runtime-metrics.ts +177 -0
  103. package/telegram-plugin/scripts/build.mjs +0 -1
  104. package/telegram-plugin/secret-detect/index.ts +24 -0
  105. package/telegram-plugin/secret-detect/vault-error.test.ts +64 -12
  106. package/telegram-plugin/secret-detect/vault-error.ts +78 -11
  107. package/telegram-plugin/secret-detect/vault-write.ts +14 -2
  108. package/telegram-plugin/server.js +41795 -0
  109. package/telegram-plugin/session-tail.ts +6 -1
  110. package/telegram-plugin/shared/bot-runtime.ts +5 -4
  111. package/telegram-plugin/silence-poke.ts +420 -0
  112. package/telegram-plugin/silent-end.ts +174 -0
  113. package/telegram-plugin/stream-controller.ts +13 -0
  114. package/telegram-plugin/stream-reply-handler.ts +7 -0
  115. package/telegram-plugin/subagent-watcher.ts +213 -4
  116. package/telegram-plugin/tests/auth-add-flow.test.ts +559 -0
  117. package/telegram-plugin/tests/auth-code-redact.test.ts +8 -4
  118. package/telegram-plugin/tests/auth-command-vernacular.test.ts +531 -0
  119. package/telegram-plugin/tests/boot-card-issue-dedup.test.ts +247 -0
  120. package/telegram-plugin/tests/boot-card-reason-to-render.test.ts +182 -0
  121. package/telegram-plugin/tests/boot-card-reason.test.ts +65 -2
  122. package/telegram-plugin/tests/boot-card-render.test.ts +146 -0
  123. package/telegram-plugin/tests/boot-card-silent-on-operator.test.ts +103 -0
  124. package/telegram-plugin/tests/boot-probes.test.ts +216 -10
  125. package/telegram-plugin/tests/boot-version-string.test.ts +0 -0
  126. package/telegram-plugin/tests/finalize-callback.test.ts +190 -0
  127. package/telegram-plugin/tests/gateway-message-validator.test.ts +26 -0
  128. package/telegram-plugin/tests/gateway-secret-detect.test.ts +12 -3
  129. package/telegram-plugin/tests/gateway-startup-network-retry.test.ts +104 -0
  130. package/telegram-plugin/tests/history-reaper.test.ts +378 -0
  131. package/telegram-plugin/tests/hostd-dispatch.test.ts +129 -0
  132. package/telegram-plugin/tests/inbound-classifier.test.ts +76 -0
  133. package/telegram-plugin/tests/inbound-message-types.test.ts +267 -0
  134. package/telegram-plugin/tests/issues-card.test.ts +49 -0
  135. package/telegram-plugin/tests/pending-inbound-buffer.test.ts +132 -0
  136. package/telegram-plugin/tests/permission-rule.test.ts +80 -1
  137. package/telegram-plugin/tests/permission-title.test.ts +31 -0
  138. package/telegram-plugin/tests/quota-check.test.ts +5 -35
  139. package/telegram-plugin/tests/races.test.ts +179 -0
  140. package/telegram-plugin/tests/reaction-trigger-flow.test.ts +353 -0
  141. package/telegram-plugin/tests/reaction-trigger.test.ts +397 -0
  142. package/telegram-plugin/tests/retry-api-call.test.ts +152 -1
  143. package/telegram-plugin/tests/runtime-metrics.test.ts +145 -0
  144. package/telegram-plugin/tests/sandbox-hint-posttool.test.ts +155 -0
  145. package/telegram-plugin/tests/secret-detect-delete-must-surface-failures.test.ts +133 -0
  146. package/telegram-plugin/tests/secret-detect-false-positives.test.ts +137 -0
  147. package/telegram-plugin/tests/silence-poke.test.ts +493 -0
  148. package/telegram-plugin/tests/silent-end.test.ts +206 -0
  149. package/telegram-plugin/tests/subagent-tracker-hooks.test.ts +107 -0
  150. package/telegram-plugin/tests/subagent-watcher-env-thresholds.test.ts +224 -0
  151. package/telegram-plugin/tests/subagent-watcher-stall-terminal.test.ts +316 -0
  152. package/telegram-plugin/tests/subagent-watcher.test.ts +263 -0
  153. package/telegram-plugin/tests/turn-signal-tracker.test.ts +81 -0
  154. package/telegram-plugin/tests/vault-approval-posture.test.ts +256 -0
  155. package/telegram-plugin/tests/vault-grant-auto-resume.test.ts +73 -0
  156. package/telegram-plugin/tests/vault-grant-inbound-builders.test.ts +226 -0
  157. package/telegram-plugin/tests/vault-grant-union.test.ts +130 -0
  158. package/telegram-plugin/tests/vault-key-regex-allows-slash.test.ts +140 -0
  159. package/telegram-plugin/tests/vault-posture-quarantine.test.ts +104 -0
  160. package/telegram-plugin/tests/vault-request-access-tool.test.ts +114 -0
  161. package/telegram-plugin/tests/vault-request-access-unlock-resume.test.ts +106 -0
  162. package/telegram-plugin/turn-signal-tracker.ts +100 -24
  163. package/telegram-plugin/uat/SETUP.md +210 -35
  164. package/telegram-plugin/uat/assertions.ts +264 -37
  165. package/telegram-plugin/uat/driver-info.ts +57 -0
  166. package/telegram-plugin/uat/driver.ts +590 -51
  167. package/telegram-plugin/uat/harness.ts +140 -94
  168. package/telegram-plugin/uat/load-env.test.ts +72 -0
  169. package/telegram-plugin/uat/load-env.ts +48 -0
  170. package/telegram-plugin/uat/login.ts +96 -53
  171. package/telegram-plugin/uat/runners/agent-self-sufficiency.ts +457 -0
  172. package/telegram-plugin/uat/runners/paraphrases.ts +231 -0
  173. package/telegram-plugin/uat/runners/report.ts +150 -0
  174. package/telegram-plugin/uat/runners/run-agent-self-sufficiency.sh +50 -0
  175. package/telegram-plugin/uat/runners/scorer.test.ts +196 -0
  176. package/telegram-plugin/uat/runners/scorer.ts +106 -0
  177. package/telegram-plugin/uat/runners/skill-coverage.test.ts +100 -0
  178. package/telegram-plugin/uat/runners/skill-coverage.ts +620 -0
  179. package/telegram-plugin/uat/scenarios/ask-user-button-tap-dm.test.ts +141 -0
  180. package/telegram-plugin/uat/scenarios/bg-sub-agent-dispatch-dm.test.ts +191 -0
  181. package/telegram-plugin/uat/scenarios/fuzz-extended-dm.test.ts +255 -0
  182. package/telegram-plugin/uat/scenarios/fuzz-human-style-dm.test.ts +275 -0
  183. package/telegram-plugin/uat/scenarios/fuzz-random-prompts-dm.test.ts +146 -0
  184. package/telegram-plugin/uat/scenarios/fuzz-status-ask-dm.test.ts +486 -0
  185. package/telegram-plugin/uat/scenarios/jtbd-interrupt-marker-dm.test.ts +67 -0
  186. package/telegram-plugin/uat/scenarios/jtbd-rapid-followup-dm.test.ts +100 -0
  187. package/telegram-plugin/uat/scenarios/jtbd-soft-commit-dm.test.ts +67 -0
  188. package/telegram-plugin/uat/scenarios/jtbd-status-query-dm.test.ts +49 -0
  189. package/telegram-plugin/uat/scenarios/location-inbound-dm.test.ts +65 -0
  190. package/telegram-plugin/uat/scenarios/midturn-silent-dm.test.ts +175 -0
  191. package/telegram-plugin/uat/scenarios/reactions-dm.test.ts +142 -0
  192. package/telegram-plugin/uat/scenarios/reactions-trigger-turn-dm.test.ts +96 -0
  193. package/telegram-plugin/uat/scenarios/secret-redaction-deletes-original-dm.test.ts +123 -0
  194. package/telegram-plugin/uat/scenarios/secret-redaction-no-false-positive-dm.test.ts +87 -0
  195. package/telegram-plugin/uat/scenarios/silence-poke-soft-dm.test.ts +155 -0
  196. package/telegram-plugin/uat/scenarios/silent-end-recovery-dm.test.ts +95 -0
  197. package/telegram-plugin/uat/scenarios/smoke-dm-reply.test.ts +57 -0
  198. package/telegram-plugin/uat/scenarios/subagent-watcher-no-rerun-dm.test.ts +135 -0
  199. package/telegram-plugin/uat/scenarios/vault-approval-posture-telegram-id-dm.test.ts +191 -0
  200. package/telegram-plugin/uat/scenarios/vault-audit-allow-dm.test.ts +108 -0
  201. package/telegram-plugin/uat/scenarios/vault-grant-auto-resume-dm.test.ts +121 -0
  202. package/telegram-plugin/uat/scenarios/vault-request-access-concurrent-dm.test.ts +161 -0
  203. package/telegram-plugin/uat/scenarios/vault-request-access-end-to-end-dm.test.ts +158 -0
  204. package/telegram-plugin/uat/scenarios/voice-inbound-dm.test.ts +65 -0
  205. package/telegram-plugin/vault-approval-posture.ts +42 -0
  206. package/telegram-plugin/welcome-text.ts +1 -0
  207. package/telegram-plugin/active-pins-sweep.ts +0 -204
  208. package/telegram-plugin/active-pins.ts +0 -146
  209. package/telegram-plugin/auth-dashboard.ts +0 -1104
  210. package/telegram-plugin/auth-slot-parser.ts +0 -497
  211. package/telegram-plugin/card-event-log.ts +0 -138
  212. package/telegram-plugin/dist/foreman/foreman.js +0 -31106
  213. package/telegram-plugin/docs/multi-agent-card-design.md +0 -847
  214. package/telegram-plugin/docs/pinned-progress-card-reliability.md +0 -144
  215. package/telegram-plugin/foreman/foreman-create-flow.ts +0 -202
  216. package/telegram-plugin/foreman/foreman-handlers.ts +0 -493
  217. package/telegram-plugin/foreman/foreman.ts +0 -1165
  218. package/telegram-plugin/foreman/setup-flow.ts +0 -345
  219. package/telegram-plugin/foreman/setup-state.ts +0 -239
  220. package/telegram-plugin/foreman/state.ts +0 -203
  221. package/telegram-plugin/pin-event-log.ts +0 -76
  222. package/telegram-plugin/progress-card-driver.ts +0 -2886
  223. package/telegram-plugin/progress-card-pin-manager.ts +0 -589
  224. package/telegram-plugin/progress-card-pin-watchdog.ts +0 -98
  225. package/telegram-plugin/progress-card.ts +0 -1409
  226. package/telegram-plugin/tests/HARNESS.md +0 -340
  227. package/telegram-plugin/tests/_progress-card-harness.ts +0 -109
  228. package/telegram-plugin/tests/active-pins-boot-reaper.test.ts +0 -211
  229. package/telegram-plugin/tests/active-pins-sweep.test.ts +0 -309
  230. package/telegram-plugin/tests/active-pins.test.ts +0 -187
  231. package/telegram-plugin/tests/auth-account-identity-surface.test.ts +0 -118
  232. package/telegram-plugin/tests/auth-dashboard-edge-cases.test.ts +0 -260
  233. package/telegram-plugin/tests/auth-dashboard-restart-flow.test.ts +0 -140
  234. package/telegram-plugin/tests/auth-dashboard-v3b.test.ts +0 -559
  235. package/telegram-plugin/tests/auth-dashboard.test.ts +0 -1045
  236. package/telegram-plugin/tests/auth-slot-commands.test.ts +0 -640
  237. package/telegram-plugin/tests/bg-agent-progress-card-757.test.ts +0 -201
  238. package/telegram-plugin/tests/boot-card-account-quota.test.ts +0 -137
  239. package/telegram-plugin/tests/card-event-log.test.ts +0 -145
  240. package/telegram-plugin/tests/first-paint.test.ts +0 -257
  241. package/telegram-plugin/tests/foreman-create-flow.test.ts +0 -359
  242. package/telegram-plugin/tests/foreman-handlers.test.ts +0 -347
  243. package/telegram-plugin/tests/foreman-state.test.ts +0 -164
  244. package/telegram-plugin/tests/foreman-write-ops.test.ts +0 -214
  245. package/telegram-plugin/tests/harness-ordering-invariants.test.ts +0 -243
  246. package/telegram-plugin/tests/pin-event-log.test.ts +0 -124
  247. package/telegram-plugin/tests/progress-card-api-failure-during-deferred.test.ts +0 -73
  248. package/telegram-plugin/tests/progress-card-close-paths-converge.test.ts +0 -272
  249. package/telegram-plugin/tests/progress-card-cross-turn.test.ts +0 -258
  250. package/telegram-plugin/tests/progress-card-delay-842.test.ts +0 -160
  251. package/telegram-plugin/tests/progress-card-dispose-preservepending.test.ts +0 -81
  252. package/telegram-plugin/tests/progress-card-draft-flag.test.ts +0 -80
  253. package/telegram-plugin/tests/progress-card-driver-eviction.test.ts +0 -215
  254. package/telegram-plugin/tests/progress-card-driver-fleet-shadow.test.ts +0 -123
  255. package/telegram-plugin/tests/progress-card-driver-force-complete-parent-done.test.ts +0 -76
  256. package/telegram-plugin/tests/progress-card-edit-timestamps-budget.test.ts +0 -62
  257. package/telegram-plugin/tests/progress-card-memory-bounds.test.ts +0 -84
  258. package/telegram-plugin/tests/progress-card-pin-failure-paths.test.ts +0 -139
  259. package/telegram-plugin/tests/progress-card-pin-manager.test.ts +0 -773
  260. package/telegram-plugin/tests/progress-card-pin-race-fast-turn.test.ts +0 -66
  261. package/telegram-plugin/tests/progress-card-pin-sidecar-partial-write.test.ts +0 -64
  262. package/telegram-plugin/tests/progress-card-pin-watchdog.test.ts +0 -190
  263. package/telegram-plugin/tests/progress-card-sigterm-pin-flush.test.ts +0 -146
  264. package/telegram-plugin/tests/real-gateway-f1-ladder-integrity.test.ts +0 -123
  265. package/telegram-plugin/tests/real-gateway-f2-instant-draft.test.ts +0 -82
  266. package/telegram-plugin/tests/real-gateway-f3-late-card.test.ts +0 -114
  267. package/telegram-plugin/tests/real-gateway-harness.ts +0 -699
  268. package/telegram-plugin/tests/real-gateway-i6-turn-flush-replay-dedup.test.ts +0 -313
  269. package/telegram-plugin/tests/real-gateway-ipc-lifecycle.test.ts +0 -299
  270. package/telegram-plugin/tests/real-gateway-spec.test.ts +0 -487
  271. package/telegram-plugin/tests/real-gateway.smoke.test.ts +0 -101
  272. package/telegram-plugin/tests/setup-flow.test.ts +0 -510
  273. package/telegram-plugin/tests/setup-state.test.ts +0 -146
  274. package/telegram-plugin/tests/sync-chat-running-subagents.test.ts +0 -116
  275. package/telegram-plugin/tests/turn-end-regressions.test.ts +0 -489
  276. package/telegram-plugin/tests/turn-flush-card-takeover.test.ts +0 -218
  277. package/telegram-plugin/tests/turn-flush-prose-recovery.test.ts +0 -78
  278. package/telegram-plugin/tests/two-zone-bg-carry-full-lifecycle.test.ts +0 -131
  279. package/telegram-plugin/tests/two-zone-bg-detection.test.ts +0 -120
  280. package/telegram-plugin/tests/two-zone-bg-done-when-all-terminal.test.ts +0 -116
  281. package/telegram-plugin/tests/two-zone-bg-early-turn-end.test.ts +0 -87
  282. package/telegram-plugin/tests/two-zone-bg-survives-next-turn.test.ts +0 -211
  283. package/telegram-plugin/tests/two-zone-card-cap.test.ts +0 -62
  284. package/telegram-plugin/tests/two-zone-card-fleet-row.test.ts +0 -101
  285. package/telegram-plugin/tests/two-zone-card-header-phases.test.ts +0 -78
  286. package/telegram-plugin/tests/two-zone-card-html-balance.test.ts +0 -110
  287. package/telegram-plugin/tests/two-zone-card-lifecycle.test.ts +0 -128
  288. package/telegram-plugin/tests/two-zone-card-sanitise.test.ts +0 -58
  289. package/telegram-plugin/tests/two-zone-card-snapshot.test.ts +0 -133
  290. package/telegram-plugin/tests/two-zone-concurrent-turns-isolation.test.ts +0 -155
  291. package/telegram-plugin/tests/two-zone-phasefor-precedence.test.ts +0 -117
  292. package/telegram-plugin/tests/two-zone-snapshot-extras.test.ts +0 -187
  293. package/telegram-plugin/tests/two-zone-stuck-edit-throttle.test.ts +0 -149
  294. package/telegram-plugin/tests/two-zone-stuck-header-escalation.test.ts +0 -101
  295. package/telegram-plugin/tests/two-zone-stuck-per-member.test.ts +0 -114
  296. package/telegram-plugin/tests/two-zone-stuck-recovery.test.ts +0 -105
  297. package/telegram-plugin/tests/waiting-ux-harness.ts +0 -381
  298. package/telegram-plugin/tests/waiting-ux.e2e.test.ts +0 -233
  299. package/telegram-plugin/turn-flush-prose-recovery.ts +0 -40
  300. package/telegram-plugin/two-zone-card.ts +0 -269
  301. package/telegram-plugin/uat/scenarios/smoke-clerk-reply.test.ts +0 -61
@@ -1,15 +1,32 @@
1
1
  ---
2
2
  name: buildkite-pipelines
3
3
  description: >
4
- This skill should be used when the user asks to "write a pipeline",
5
- "add caching", "make this build faster", "show test failures in the build page",
6
- "add annotations", "only run tests when code changes", "set up dynamic pipelines",
7
- "add retry", "parallel steps", "matrix build", "add plugins", or
8
- "work with artifacts in pipeline YAML".
9
- Also use when the user mentions .buildkite/ directory, pipeline.yml,
10
- buildkite-agent pipeline upload, step types (command, wait, block, trigger,
11
- group, input), if_changed, notify, concurrency, or asks about Buildkite CI
12
- configuration.
4
+ Use when the user is authoring or editing `.buildkite/pipeline.yml` — the
5
+ declarative CI/CD configuration for Buildkite. Covers step types, caching,
6
+ parallelism, annotations, retry, dynamic pipelines, matrix builds, plugins,
7
+ notifications, artifacts, and concurrency in pipeline YAML.
8
+ Triggers on natural phrasings including: "Help me write a pipeline.",
9
+ "Can you parallel steps?", "Let's add retry.", "I'd like to add caching.",
10
+ "Let's add annotations.", "Let's show test failures in the build page.",
11
+ "yo, how do i matrix build", "pls only run tests when code changes",
12
+ "yo, how do i only run tests when code changes", and typo'd variants like
13
+ "write a pipeline", "add annotations", "set up dnamic pipelines".
14
+ Also fires on indirect signals like "my pipeline.yml is a mess",
15
+ "the build is slow", "tests run in serial when they shouldn't".
16
+ Also fires on mentions of the `.buildkite/` directory, `pipeline.yml`,
17
+ step types (command, wait, block, trigger, group, input), `if_changed`,
18
+ `notify`, `concurrency`, plugin blocks, matrix steps, or general
19
+ Buildkite CI configuration.
20
+ Do NOT use when the user is invoking `buildkite-agent <subcommand>` inside
21
+ a running step — that's `buildkite-agent-runtime`. In particular, if the
22
+ user's message begins with "Inside a Buildkite step," that is the
23
+ hard-trigger prefix for `buildkite-agent-runtime`, NOT this skill — even
24
+ if the message also mentions annotations, artifacts, step attributes, or
25
+ pipeline upload. The distinguishing rule is: authoring `pipeline.yml` =
26
+ this skill; calling the `buildkite-agent` binary from inside a running
27
+ job = `buildkite-agent-runtime`. Do NOT use for terminal-driven `bk` CLI
28
+ operations — that's `buildkite-cli`. Do NOT use for direct REST/GraphQL
29
+ API calls — that's `buildkite-api`.
13
30
  ---
14
31
 
15
32
  # Buildkite Pipelines
@@ -1,15 +1,29 @@
1
1
  ---
2
2
  name: buildkite-secure-delivery
3
3
  description: >
4
- This skill should be used when the user asks to "publish to package registry",
5
- "push a Docker image", "set up OIDC authentication", "request an OIDC token",
6
- "authenticate without static credentials", "set up SLSA provenance",
7
- "generate attestation", "sign pipelines", "verify pipeline signatures",
8
- or "secure the supply chain".
9
- Also use when the user mentions OIDC, SLSA, provenance, attestation, cosign,
10
- JWKS, pipeline signing, pipeline verification, packages.buildkite.com,
11
- Package Registry, artifact signing, or asks about credential-free publishing,
12
- supply chain security, or secure delivery in Buildkite.
4
+ Set up secure delivery for Buildkite CI: configure OIDC authentication
5
+ (no static credentials), generate SLSA provenance / build attestations,
6
+ sign pipelines and verify pipeline signatures with JWKS, publish to a
7
+ package registry (packages.buildkite.com), push signed Docker images,
8
+ and harden the supply chain end-to-end. Use when the user says:
9
+ "Please secure the supply chain.", "I'd like to push a Docker image.",
10
+ "Can you sign pipelines?", "I need to verify pipeline signatures.",
11
+ "Could you sign pipelines for me?", "Set up SLSA provenance, please.",
12
+ "authenticate without static credentials", "generate attestation",
13
+ "publish to packages.buildkite.com", "gonna need to verify pipeline
14
+ signatures", "gonna need to sign pipelines", "pls authenticate without
15
+ static credentials", and typo'd variants like "set up LSA provenance",
16
+ "verify ppeline signatures". Whenever the user's message starts with
17
+ the phrase "For Buildkite OIDC/SLSA," — regardless of what follows —
18
+ use this skill. Anything mentioning OIDC, SLSA, provenance,
19
+ attestation, cosign, JWKS, pipeline signing, pipeline verification,
20
+ packages.buildkite.com, Package Registry, artifact signing,
21
+ credential-free publishing, or supply chain security fires this skill.
22
+ Do NOT use for in-step `buildkite-agent oidc request-token` — that's
23
+ `buildkite-agent-runtime`. Do NOT use for writing pipelines, uploading
24
+ pipelines dynamically, or adding caching/plugins — those are
25
+ `buildkite-pipelines`. Do NOT use for distributed locks — that's
26
+ `buildkite-agent-runtime`.
13
27
  ---
14
28
 
15
29
  # Buildkite Secure Delivery
@@ -1,14 +1,31 @@
1
1
  ---
2
2
  name: buildkite-test-engine
3
3
  description: >
4
- This skill should be used when the user asks to "split tests across machines",
5
- "set up test splitting", "parallelize test suite", "detect flaky tests",
6
- "quarantine flaky tests", "configure test collectors", "speed up tests",
7
- "set up bktec", "configure test engine", or "reduce flaky test failures".
8
- Also use when the user mentions bktec, Test Engine, test suites,
9
- BUILDKITE_TEST_ENGINE_* environment variables, BUILDKITE_ANALYTICS_TOKEN,
10
- test-collector plugin, test reliability scores, test timing data,
11
- or asks about Buildkite test splitting and flaky test management.
4
+ ALWAYS use this skill when the user's message begins with "Using
5
+ Buildkite Test Engine," that prefix is a hard trigger regardless of
6
+ what follows. Specifically fires on: "Using Buildkite Test Engine, Help
7
+ me detect flaky tests.", "Using Buildkite Test Engine, Can you
8
+ parallelize test suite?", "Using Buildkite Test Engine, Can you
9
+ configure test collectors?", "Using Buildkite Test Engine, Let's speed
10
+ up tests.", "Using Buildkite Test Engine, set up test splitting",
11
+ "Using Buildkite Test Engine, quarantine flaky tests".
12
+ Use when the user wants to split tests across parallel machines, set up
13
+ test splitting, parallelize a test suite, detect or quarantine flaky tests,
14
+ configure test collectors, speed up tests via Buildkite's Test Engine, set
15
+ up `bktec`, or reduce flaky test failures.
16
+ Triggers on natural phrasings including: "Help me detect flaky tests.",
17
+ "Can you parallelize test suite?", "I need to configure test collectors.",
18
+ "Can you configure test collectors?", "Let's speed up tests.",
19
+ "Can you speed up tests?", "yo, how do i speed up tests",
20
+ "gonna need to configure test collectors",
21
+ "quick q — can i configure test collectors", and typo'd variants like
22
+ "parallelize test suite", "set up tes tsplitting", "set up test splitting".
23
+ Also fires on `bktec`, Buildkite Test Engine, test suites,
24
+ `BUILDKITE_TEST_ENGINE_*` environment variables, `BUILDKITE_ANALYTICS_TOKEN`,
25
+ the `test-collector` plugin, test reliability scores, test timing data,
26
+ or any mention of Buildkite test splitting and flaky-test management.
27
+ Do NOT use for authoring general pipeline YAML (that's `buildkite-pipelines`)
28
+ or for `buildkite-agent` in-step subcommands (that's `buildkite-agent-runtime`).
12
29
  ---
13
30
 
14
31
  # Buildkite Test Engine
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: docx
3
- description: "Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation."
3
+ description: "Create, read, edit, or manipulate Word documents (.docx files). Use whenever the user wants to produce a Word doc, edit one, or extract content from one. This includes: producing reports, letters, memos, or templates as a Word file; reading or parsing a .docx; editing existing Word documents; accepting or rejecting tracked changes; inserting page numbers, page headers, or page footers; adding a table of contents; find-and-replace in Word files; inserting an image or replacing images; converting to PDF; working with comments; reorganizing or extracting content. Triggers on phrasings including: 'Help me accept tracked changes.', 'Please insert page numbers.', \"I'd like to read a .docx file.\", 'Can you produce a report as a Word file?', 'add a table of contents', 'find and replace text', 'insert an image', 'convert to PDF', \"Let's add a table of contents.\", 'hey, read a .docx file?', 'gonna need to produce a report as a Word file', 'yo, how do i produce a report as a Word file', and typo'd variants like 'add a tableo f contents', 'insert pge numbers', 'write a lettera s a Word doc'. Whenever the user's message starts with the phrase 'For my Word .docx document,' — regardless of what follows — use this skill. Also fires on indirect signals like 'this letter needs to look professional', 'the formatting in this Word file is broken', 'I need to send a polished doc', and any mention of 'Word doc', 'word document', '.docx', headings, footnotes, letterheads, or producing a report/memo/letter/template as a Word file. Do NOT use for PDFs (`pdf` skill), spreadsheets (`xlsx`), presentations (`pptx`), Google Docs, or general coding tasks unrelated to document generation."
4
4
  license: Proprietary. LICENSE.txt has complete terms
5
5
  ---
6
6
 
@@ -2,11 +2,39 @@
2
2
  name: file-bug
3
3
  version: 0.1.0
4
4
  description: |
5
- File a high-quality bug report against switchroom (or another configured
6
- repo). Pulls the right log files automatically, forces a root-cause
7
- section with citations, flags logging gaps when RCA can't be pinned, and
8
- files via `gh issue create`. Use when a user asks "file a bug",
9
- "open an issue", or describes a symptom that needs a real ticket.
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> (run `cd ~/code/switchroom && git rev-parse --short HEAD`)
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: Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
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
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pdf
3
- description: Use this skill whenever the user wants to 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 pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
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
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pptx
3
- description: "Use this skill any time a .pptx file is involved in any way as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill."
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: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
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
@@ -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 (\"logs\", \"what happened\", \"check the journal\", \"why did it crash\"); update agents (\"update\", \"pull latest\", \"get new code\", \"upgrade\"); restart agents (\"restart\", \"reboot\", \"bounce\", \"kick\", \"it's stuck\"); check what's running (\"version\", \"what sha\", \"are agents up\", \"health summary\"); apply config changes (\"apply\", \"sync my config\", \"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\"). Do NOT use for adding/removing agents (switchroom-manage), bootstrapping switchroom from scratch (switchroom-install), or \"something is broken\" diagnostics (switchroom-health).
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
- **Three commands to know:**
12
- - `switchroom apply` — reconcile every agent + (re)write `~/.switchroom/compose/docker-compose.yml`. Bring the fleet up afterwards with `docker compose -p switchroom -f ~/.switchroom/compose/docker-compose.yml up -d`. (Replaces the v0.6 `switchroom update` flow.)
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
- Pull the latest switchroom source, then re-apply config and bring the fleet back up via docker compose.
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
- cd ~/code/switchroom
54
- git pull
55
- bun install
56
- bun run build
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 apply` reconciles every agent declared in `switchroom.yaml`
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
- The v0.6 `switchroom update` verb is removed in v0.7+; calling it now
68
- prints this upgrade hint and exits 1. The shim is slated for full removal
69
- in v0.8.
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
- Two layers coexist. **Use the new account model when an operator wants one OAuth flow to drive multiple agents.** The legacy per-agent slot model still works for first-time agent auth.
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
- ### Per-agent (slot model) — first-time agent auth + the existing Telegram /auth flow
162
+ ### CLI verbs
168
163
 
169
164
  ```bash
170
- switchroom auth login <agent> # interactive OAuth, writes to <agent>/.claude/.credentials.json
171
- switchroom auth status # one row per agent
172
- switchroom auth list <agent> # show the agent's slot pool
173
- switchroom auth use <agent> <slot> # switch the agent's active slot
174
- switchroom auth refresh-tick # cron entrypoint for the legacy refresh loop
175
- ```
176
-
177
- ### Anthropic accounts (new model see `reference/share-auth-across-the-fleet.md`)
178
-
179
- The Anthropic account is the unit of authentication. One account many agents. Storage at `~/.switchroom/accounts/<label>/`. Per-agent `.credentials.json` becomes a passive mirror that the broker keeps in sync.
180
-
181
- ```bash
182
- # Lift an already-authenticated agent's credentials into a global account
183
- switchroom auth account add <label> --from-agent <agent>
184
-
185
- # Or import from a credentials.json file you already have
186
- switchroom auth account add <label> --from-credentials <path>
187
-
188
- switchroom auth account list # accounts + which agents use each + health
189
- switchroom auth account rm <label> # refused while any agent is enabled
190
-
191
- # Wire an account to one or more agents (writes agents.<name>.auth.accounts in switchroom.yaml + immediate fanout)
192
- switchroom auth enable <label> <agent...>
193
- switchroom auth disable <label> <agent...>
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
- foo:
203
+ ziggy: {} # inherits fleet active
204
+ clerk:
205
+ admin: true # gates /agents, /restart, /update AND admin /auth verbs
206
+ klanker:
204
207
  auth:
205
- accounts: [work-pro, personal-max] # ordered priority — first non-quota-exhausted wins
208
+ override: work # opt-out (edge case)
206
209
  ```
207
210
 
208
- When unset, the agent uses the legacy per-agent slot path. The two are not mutually exclusive during the transition.
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 parity
213
+ ### Telegram surface
211
214
 
212
- Every CLI verb above has a Telegram twin:
215
+ Three commands the gateway recognises in any agent chat:
213
216
 
214
- ```
215
- /auth account add <label> [--from-agent <name>]
216
- /auth account list
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
- `/auth login`, `/auth code`, `/auth list <agent>` etc. continue to work for the per-agent path.
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" → account model. Walk them through the bootstrap (`auth login` first agent `auth account add --from-agent` `auth enable` others).
227
- - "An agent's auth expired" → check `switchroom auth account list` first. If the account is healthy but the agent isn't getting it, the broker fanout may be stale — `switchroom auth refresh-accounts` forces a tick.
228
- - "I hit a quota" → `switchroom auth account list` shows quota-exhausted accounts; auto-fallback handles it if the agent has multiple accounts in priority order.
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`** — full auth surface inside Telegram: per-agent slot verbs (`login`/`reauth`/`code`/`add`/`use`/`list`/`rm`) AND account-shaped verbs (`account add`/`account list`/`account rm`/`enable`/`disable`). The account verbs implement the new "one Pro account, many agents" model — see the **Auth** section above.
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: Runs a health check and diagnostics on the switchroom setup. Use when the user says 'my agent keeps failing', 'my agents are broken', "what's wrong with my agents", 'agent keeps crashing', 'health check', 'diagnose', 'troubleshoot', "something's wrong", 'can you check my setup', or wants to verify everything is working correctly. Prefer this over logs when the user is reporting a generic failure and wants to know *what* is wrong, not *why* a specific crash happened.
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 status (per-agent legacy view)
27
- switchroom auth status 2>/dev/null || echo "FAIL: auth check failed"
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
- # Check Anthropic accounts (new model see reference/share-auth-across-the-fleet.md)
30
- # Shows accounts at ~/.switchroom/accounts/<label>/, which agents use each,
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
- | Per-agent auth expired (slot model) | `switchroom auth login <agent>` |
94
- | Account expired (new model `auth account list` shows red ✗) | `switchroom auth refresh-accounts` (one tick); if no refresh-token, the account needs re-adding |
95
- | Account quota-exhausted (yellow in `auth account list`) | Auto-fallback handles it if the agent has multiple accounts; otherwise wait for the reset window or `switchroom auth enable <other-account> <agent>` |
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` |