@synap-core/cli 1.8.0 → 1.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 (332) hide show
  1. package/dist/commands/agent-chat.d.ts +47 -0
  2. package/dist/commands/agent-chat.js +250 -0
  3. package/dist/commands/agent-chat.js.map +1 -0
  4. package/dist/commands/agent-run.js +3 -4
  5. package/dist/commands/agent-run.js.map +1 -1
  6. package/dist/commands/agents.js +85 -46
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/automation.js +2 -1
  9. package/dist/commands/automation.js.map +1 -1
  10. package/dist/commands/bridge-setup.d.ts +66 -0
  11. package/dist/commands/bridge-setup.js +1112 -0
  12. package/dist/commands/bridge-setup.js.map +1 -0
  13. package/dist/commands/cap-connections.d.ts +28 -0
  14. package/dist/commands/cap-connections.js +224 -0
  15. package/dist/commands/cap-connections.js.map +1 -0
  16. package/dist/commands/capability.d.ts +89 -0
  17. package/dist/commands/capability.js +1523 -0
  18. package/dist/commands/capability.js.map +1 -0
  19. package/dist/commands/centrality.d.ts +20 -0
  20. package/dist/commands/centrality.js +94 -0
  21. package/dist/commands/centrality.js.map +1 -0
  22. package/dist/commands/connect.d.ts +2 -0
  23. package/dist/commands/connect.js +16 -35
  24. package/dist/commands/connect.js.map +1 -1
  25. package/dist/commands/context.js +4 -6
  26. package/dist/commands/context.js.map +1 -1
  27. package/dist/commands/data-extra.d.ts +1 -0
  28. package/dist/commands/data-extra.js +34 -10
  29. package/dist/commands/data-extra.js.map +1 -1
  30. package/dist/commands/data.d.ts +4 -4
  31. package/dist/commands/data.js +241 -184
  32. package/dist/commands/data.js.map +1 -1
  33. package/dist/commands/diagnose.d.ts +20 -0
  34. package/dist/commands/diagnose.js +143 -0
  35. package/dist/commands/diagnose.js.map +1 -0
  36. package/dist/commands/digest.d.ts +17 -0
  37. package/dist/commands/digest.js +121 -0
  38. package/dist/commands/digest.js.map +1 -0
  39. package/dist/commands/discover.d.ts +2 -0
  40. package/dist/commands/discover.js +25 -8
  41. package/dist/commands/discover.js.map +1 -1
  42. package/dist/commands/events.js +2 -1
  43. package/dist/commands/events.js.map +1 -1
  44. package/dist/commands/explain.d.ts +1 -1
  45. package/dist/commands/explain.js +18 -15
  46. package/dist/commands/explain.js.map +1 -1
  47. package/dist/commands/facet.d.ts +29 -0
  48. package/dist/commands/facet.js +113 -0
  49. package/dist/commands/facet.js.map +1 -0
  50. package/dist/commands/graph.js +2 -1
  51. package/dist/commands/graph.js.map +1 -1
  52. package/dist/commands/import.d.ts +38 -0
  53. package/dist/commands/import.js +440 -0
  54. package/dist/commands/import.js.map +1 -0
  55. package/dist/commands/init.js +35 -16
  56. package/dist/commands/init.js.map +1 -1
  57. package/dist/commands/keys.js +3 -4
  58. package/dist/commands/keys.js.map +1 -1
  59. package/dist/commands/knowledge.d.ts +2 -0
  60. package/dist/commands/knowledge.js +61 -9
  61. package/dist/commands/knowledge.js.map +1 -1
  62. package/dist/commands/launch.d.ts +50 -0
  63. package/dist/commands/launch.js +790 -0
  64. package/dist/commands/launch.js.map +1 -0
  65. package/dist/commands/lens.d.ts +45 -0
  66. package/dist/commands/lens.js +386 -0
  67. package/dist/commands/lens.js.map +1 -0
  68. package/dist/commands/market.d.ts +209 -0
  69. package/dist/commands/market.js +1368 -0
  70. package/dist/commands/market.js.map +1 -0
  71. package/dist/commands/mcp.d.ts +42 -0
  72. package/dist/commands/mcp.js +184 -0
  73. package/dist/commands/mcp.js.map +1 -0
  74. package/dist/commands/observe.js +14 -11
  75. package/dist/commands/observe.js.map +1 -1
  76. package/dist/commands/open.d.ts +21 -4
  77. package/dist/commands/open.js +45 -4
  78. package/dist/commands/open.js.map +1 -1
  79. package/dist/commands/pod.d.ts +100 -0
  80. package/dist/commands/pod.js +359 -0
  81. package/dist/commands/pod.js.map +1 -0
  82. package/dist/commands/pods.d.ts +1 -0
  83. package/dist/commands/pods.js +77 -15
  84. package/dist/commands/pods.js.map +1 -1
  85. package/dist/commands/proposals-actions.js +40 -3
  86. package/dist/commands/proposals-actions.js.map +1 -1
  87. package/dist/commands/purge.d.ts +23 -0
  88. package/dist/commands/purge.js +148 -0
  89. package/dist/commands/purge.js.map +1 -0
  90. package/dist/commands/raycast.d.ts +15 -0
  91. package/dist/commands/raycast.js +153 -0
  92. package/dist/commands/raycast.js.map +1 -0
  93. package/dist/commands/sessions.js +45 -21
  94. package/dist/commands/sessions.js.map +1 -1
  95. package/dist/commands/skill-manage.d.ts +21 -0
  96. package/dist/commands/skill-manage.js +195 -0
  97. package/dist/commands/skill-manage.js.map +1 -0
  98. package/dist/commands/skills-commands.js +2 -1
  99. package/dist/commands/skills-commands.js.map +1 -1
  100. package/dist/commands/skills.js +4 -3
  101. package/dist/commands/skills.js.map +1 -1
  102. package/dist/commands/status.d.ts +3 -1
  103. package/dist/commands/status.js +166 -14
  104. package/dist/commands/status.js.map +1 -1
  105. package/dist/commands/statusline.d.ts +24 -0
  106. package/dist/commands/statusline.js +450 -0
  107. package/dist/commands/statusline.js.map +1 -0
  108. package/dist/commands/subscribe.js +2 -2
  109. package/dist/commands/subscribe.js.map +1 -1
  110. package/dist/commands/tools.d.ts +30 -0
  111. package/dist/commands/tools.js +315 -0
  112. package/dist/commands/tools.js.map +1 -0
  113. package/dist/commands/versions.d.ts +27 -0
  114. package/dist/commands/versions.js +277 -0
  115. package/dist/commands/versions.js.map +1 -0
  116. package/dist/commands/view.js +3 -2
  117. package/dist/commands/view.js.map +1 -1
  118. package/dist/commands/whoami.d.ts +21 -0
  119. package/dist/commands/whoami.js +129 -0
  120. package/dist/commands/whoami.js.map +1 -0
  121. package/dist/index.js +776 -60
  122. package/dist/index.js.map +1 -1
  123. package/dist/lib/approval-poll.d.ts +42 -0
  124. package/dist/lib/approval-poll.js +52 -0
  125. package/dist/lib/approval-poll.js.map +1 -0
  126. package/dist/lib/auth.d.ts +29 -6
  127. package/dist/lib/auth.js +105 -94
  128. package/dist/lib/auth.js.map +1 -1
  129. package/dist/lib/bundle-version.d.ts +11 -0
  130. package/dist/lib/bundle-version.js +33 -0
  131. package/dist/lib/bundle-version.js.map +1 -0
  132. package/dist/lib/capture-lane.d.ts +30 -12
  133. package/dist/lib/capture-lane.js +71 -14
  134. package/dist/lib/capture-lane.js.map +1 -1
  135. package/dist/lib/cp-packages.d.ts +121 -0
  136. package/dist/lib/cp-packages.js +218 -0
  137. package/dist/lib/cp-packages.js.map +1 -0
  138. package/dist/lib/describe-lens.d.ts +46 -0
  139. package/dist/lib/describe-lens.js +33 -0
  140. package/dist/lib/describe-lens.js.map +1 -0
  141. package/dist/lib/hub-client.d.ts +78 -1
  142. package/dist/lib/hub-client.js +474 -22
  143. package/dist/lib/hub-client.js.map +1 -1
  144. package/dist/lib/installed.d.ts +51 -0
  145. package/dist/lib/installed.js +70 -0
  146. package/dist/lib/installed.js.map +1 -0
  147. package/dist/lib/next-steps.d.ts +61 -0
  148. package/dist/lib/next-steps.js +146 -0
  149. package/dist/lib/next-steps.js.map +1 -0
  150. package/dist/lib/pod.d.ts +91 -19
  151. package/dist/lib/pod.js +222 -56
  152. package/dist/lib/pod.js.map +1 -1
  153. package/dist/lib/project-ref.d.ts +95 -0
  154. package/dist/lib/project-ref.js +144 -0
  155. package/dist/lib/project-ref.js.map +1 -0
  156. package/dist/lib/project.d.ts +35 -0
  157. package/dist/lib/project.js +39 -0
  158. package/dist/lib/project.js.map +1 -0
  159. package/dist/lib/session-lens.d.ts +33 -0
  160. package/dist/lib/session-lens.js +76 -0
  161. package/dist/lib/session-lens.js.map +1 -0
  162. package/dist/lib/skill-import.d.ts +40 -0
  163. package/dist/lib/skill-import.js +203 -0
  164. package/dist/lib/skill-import.js.map +1 -0
  165. package/dist/lib/skills-installer.d.ts +17 -6
  166. package/dist/lib/skills-installer.js +133 -19
  167. package/dist/lib/skills-installer.js.map +1 -1
  168. package/dist/lib/suite.d.ts +28 -0
  169. package/dist/lib/suite.js +29 -0
  170. package/dist/lib/suite.js.map +1 -0
  171. package/dist/lib/superwhisper-import.d.ts +40 -0
  172. package/dist/lib/superwhisper-import.js +389 -0
  173. package/dist/lib/superwhisper-import.js.map +1 -0
  174. package/dist/lib/targets.d.ts +49 -1
  175. package/dist/lib/targets.js +420 -288
  176. package/dist/lib/targets.js.map +1 -1
  177. package/dist/lib/unwrapList.d.ts +1 -0
  178. package/dist/lib/unwrapList.js +20 -0
  179. package/dist/lib/unwrapList.js.map +1 -0
  180. package/dist/utils/logger.d.ts +2 -0
  181. package/dist/utils/logger.js +10 -2
  182. package/dist/utils/logger.js.map +1 -1
  183. package/package.json +9 -4
  184. package/skills/agent-os/SKILL.md +212 -0
  185. package/skills/manifest.json +5 -0
  186. package/skills/onboard/SKILL.md +186 -0
  187. package/skills/synap/SKILL.md +1182 -37
  188. package/skills/synap/_order.txt +37 -0
  189. package/skills/synap/_skill.yaml +24 -0
  190. package/skills/synap/authentication.md +10 -0
  191. package/skills/synap/automations.md +264 -0
  192. package/skills/synap/capabilities.md +107 -0
  193. package/skills/synap/capture.md +10 -0
  194. package/skills/synap/cli-operations.md +107 -0
  195. package/skills/synap/common-mistakes.md +12 -0
  196. package/skills/synap/creative-loop.md +43 -0
  197. package/skills/synap/crm.md +117 -0
  198. package/skills/synap/diagnostics.md +35 -0
  199. package/skills/synap/digesting-a-channel.md +38 -0
  200. package/skills/synap/document-embeds.md +123 -0
  201. package/skills/synap/escalation-ladder.md +71 -0
  202. package/skills/synap/focus-sessions.md +47 -0
  203. package/skills/synap/governance-rules.md +64 -0
  204. package/skills/synap/governance.md +6 -6
  205. package/skills/synap/graph-gardening.md +21 -0
  206. package/skills/synap/inline-patterns.md +38 -0
  207. package/skills/synap/lenses.md +38 -0
  208. package/skills/synap/linking-principle.md +39 -0
  209. package/skills/synap/linking.md +1 -0
  210. package/skills/synap/mental-model.md +45 -0
  211. package/skills/synap/more.md +7 -0
  212. package/skills/synap/multi-entity-capture.md +10 -0
  213. package/skills/synap/next-action.md +37 -0
  214. package/skills/synap/north-star.md +17 -0
  215. package/skills/synap/operating-mode-rules.md +45 -0
  216. package/skills/synap/operating-mode.md +9 -0
  217. package/skills/synap/quick-reference.md +67 -0
  218. package/skills/synap/reading.md +43 -0
  219. package/skills/synap/recap.md +21 -0
  220. package/skills/synap/reflexes.md +46 -0
  221. package/skills/synap/response-style.md +21 -0
  222. package/skills/synap/scope.md +13 -0
  223. package/skills/synap/showing.md +17 -0
  224. package/skills/synap/user-model.md +25 -0
  225. package/skills/synap/viewframe-cells.md +290 -0
  226. package/skills/synap/work-flow.md +113 -0
  227. package/skills/synap/worked-examples.md +53 -0
  228. package/skills/synap/workspace-design.md +45 -0
  229. package/skills/synap/workspace-edges.md +49 -0
  230. package/skills/synap/writes.md +156 -0
  231. package/skills/synap-schema/SKILL.md +97 -6
  232. package/skills/synap-schema/_order.txt +13 -0
  233. package/skills/synap-schema/_skill.yaml +22 -0
  234. package/skills/synap-schema/before-you-touch.md +14 -0
  235. package/skills/synap-schema/common-mistakes.md +9 -0
  236. package/skills/synap-schema/creating-profiles.md +17 -0
  237. package/skills/synap-schema/discover-profiles.md +24 -0
  238. package/skills/synap-schema/entity-scope.md +8 -0
  239. package/skills/synap-schema/extend-vs-create.md +31 -0
  240. package/skills/synap-schema/more.md +6 -0
  241. package/skills/synap-schema/overlay-properties.md +22 -0
  242. package/skills/synap-schema/profiles.md +3 -0
  243. package/skills/synap-schema/property-defs.md +29 -0
  244. package/skills/synap-schema/read-before-write.md +50 -0
  245. package/skills/synap-schema/relations.md +18 -0
  246. package/skills/synap-schema/worked-example.md +30 -0
  247. package/skills/synap-ui/SKILL.md +26 -2
  248. package/skills/synap-ui/_order.txt +13 -0
  249. package/skills/synap-ui/_skill.yaml +23 -0
  250. package/skills/synap-ui/ai-companion.md +27 -0
  251. package/skills/synap-ui/arranging-bento.md +8 -0
  252. package/skills/synap-ui/before-you-build.md +20 -0
  253. package/skills/synap-ui/bento-layouts.md +35 -0
  254. package/skills/synap-ui/common-mistakes.md +10 -0
  255. package/skills/synap-ui/creating-views.md +26 -0
  256. package/skills/synap-ui/four-builds.md +24 -0
  257. package/skills/synap-ui/more.md +7 -0
  258. package/skills/synap-ui/proposing-vs-extending.md +11 -0
  259. package/skills/synap-ui/view-list.md +24 -0
  260. package/skills/synap-ui/views.md +3 -0
  261. package/skills/synap-ui/worked-example.md +18 -0
  262. package/skills/synap-ui/workspaces.md +47 -0
  263. package/templates/automations/bookmark-enrichment.automation.json +44 -0
  264. package/templates/automations/mail-feed.automation.json +86 -0
  265. package/templates/automations/url-bookmark-capture.automation.json +70 -0
  266. package/templates/skills/README.md +21 -0
  267. package/templates/skills/authoring-automations/SKILL.md +95 -0
  268. package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
  269. package/templates/skills/authoring-capabilities/SKILL.md +93 -0
  270. package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
  271. package/templates/skills/authoring-playbooks/SKILL.md +102 -0
  272. package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
  273. package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
  274. package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
  275. package/templates/skills/coordinating-agents/SKILL.md +32 -0
  276. package/templates/skills/coordinating-branches/SKILL.md +27 -0
  277. package/templates/skills/mapping-the-server/SKILL.md +54 -0
  278. package/templates/skills/reading-client-progress/SKILL.md +65 -0
  279. package/templates/skills/routing-to-channels/SKILL.md +54 -0
  280. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  281. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  282. package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  283. package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  284. package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  285. package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  286. package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  287. package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  288. package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  289. package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  290. package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  291. package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  292. package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  293. package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  294. package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  295. package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  296. package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  297. package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  298. package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  299. package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  300. package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  301. package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  302. package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  303. package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  304. package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  305. package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  306. package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  307. package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  308. package/dist/commands/connectors.d.ts +0 -31
  309. package/dist/commands/connectors.js +0 -276
  310. package/dist/commands/connectors.js.map +0 -1
  311. package/dist/commands/finish.d.ts +0 -25
  312. package/dist/commands/finish.js +0 -274
  313. package/dist/commands/finish.js.map +0 -1
  314. package/dist/commands/openclaw.d.ts +0 -40
  315. package/dist/commands/openclaw.js +0 -1148
  316. package/dist/commands/openclaw.js.map +0 -1
  317. package/dist/commands/security-audit.d.ts +0 -12
  318. package/dist/commands/security-audit.js +0 -100
  319. package/dist/commands/security-audit.js.map +0 -1
  320. package/dist/lib/hardening.d.ts +0 -18
  321. package/dist/lib/hardening.js +0 -214
  322. package/dist/lib/hardening.js.map +0 -1
  323. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
  324. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
  325. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
  326. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
  327. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  328. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
  329. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  330. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
  331. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
  332. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
@@ -0,0 +1,100 @@
1
+ /**
2
+ * `synap pod` — the unified pod-configuration view.
3
+ * ===================================================
4
+ *
5
+ * `market installed` shows what packages are installed; `synap pod` answers
6
+ * the bigger question — "what does my WHOLE pod look like right now?" — one
7
+ * scannable graph over workspaces (with provenance), pod-wide vs per-workspace
8
+ * capabilities/automations/playbooks, and the give/need feed links between
9
+ * workspaces. It is the read surface for `GET /api/hub/pod/config`
10
+ * (`hub-protocol/rest/pod.ts` on the backend side).
11
+ *
12
+ * `synap pod adopt <workspaceId> --template <slug>` links an orphan/ad-hoc
13
+ * workspace to a matching template so it becomes version-tracked, via
14
+ * `POST /api/hub/pod/adopt`.
15
+ *
16
+ * READ-first, ONE write door (`adopt`). Reuses rather than re-derives:
17
+ * - the composition-tree engine (`buildCompositionTrees`/`printCompositionTree`
18
+ * + `buildMarketCatalog`/`computeUpdates`) from `market.ts`, for the
19
+ * marketplace-provenance workspaces' package → template deps → workspaces
20
+ * overlay.
21
+ * - the honest-outcome verdict helpers (`classifyApplyResult`/
22
+ * `printApplyVerdict`) from `market.ts`, for `pod adopt`'s outcome.
23
+ */
24
+ export type WorkspaceProvenance = {
25
+ kind: "marketplace";
26
+ packageSlug: string;
27
+ packageVersion: string | null;
28
+ } | {
29
+ kind: "composed";
30
+ composedFrom: unknown[];
31
+ } | {
32
+ kind: "ad-hoc";
33
+ createdBy: string | null;
34
+ templateMatch?: {
35
+ slug: string;
36
+ name: string;
37
+ };
38
+ };
39
+ export interface PodConfigWorkspace {
40
+ id: string;
41
+ name: string;
42
+ subtype: string | null;
43
+ entityCount: number;
44
+ provenance: WorkspaceProvenance;
45
+ }
46
+ export type CapabilityProvenance = {
47
+ kind: "marketplace";
48
+ templateKey: string;
49
+ } | {
50
+ kind: "manual";
51
+ };
52
+ export interface PodConfigCapability {
53
+ id: string;
54
+ name: string;
55
+ workspaceId: string | null;
56
+ provenance: CapabilityProvenance;
57
+ }
58
+ export type AutomationProvenance = {
59
+ kind: "ai" | "manual" | "template";
60
+ };
61
+ export interface PodConfigAutomation {
62
+ id: string;
63
+ name: string;
64
+ workspaceId: string | null;
65
+ provenance: AutomationProvenance;
66
+ }
67
+ export type PlaybookProvenance = {
68
+ kind: "manual";
69
+ };
70
+ export interface PodConfigPlaybook {
71
+ id: string;
72
+ name: string;
73
+ workspaceId: string | null;
74
+ provenance: PlaybookProvenance;
75
+ }
76
+ export interface PodConfigFeedsLink {
77
+ from: string;
78
+ to: string;
79
+ domain: string | null;
80
+ profileSlug: string | null;
81
+ }
82
+ export interface PodConfig {
83
+ workspaces: PodConfigWorkspace[];
84
+ capabilities: PodConfigCapability[];
85
+ automations: PodConfigAutomation[];
86
+ playbooks: PodConfigPlaybook[];
87
+ feedsLinks: PodConfigFeedsLink[];
88
+ }
89
+ export declare function pod(opts: {
90
+ json?: boolean;
91
+ orphans?: boolean;
92
+ podUrl?: string;
93
+ apiKey?: string;
94
+ }): Promise<void>;
95
+ export declare function podAdopt(workspaceNameOrId: string, opts: {
96
+ template?: string;
97
+ json?: boolean;
98
+ podUrl?: string;
99
+ apiKey?: string;
100
+ }): Promise<void>;
@@ -0,0 +1,359 @@
1
+ /**
2
+ * `synap pod` — the unified pod-configuration view.
3
+ * ===================================================
4
+ *
5
+ * `market installed` shows what packages are installed; `synap pod` answers
6
+ * the bigger question — "what does my WHOLE pod look like right now?" — one
7
+ * scannable graph over workspaces (with provenance), pod-wide vs per-workspace
8
+ * capabilities/automations/playbooks, and the give/need feed links between
9
+ * workspaces. It is the read surface for `GET /api/hub/pod/config`
10
+ * (`hub-protocol/rest/pod.ts` on the backend side).
11
+ *
12
+ * `synap pod adopt <workspaceId> --template <slug>` links an orphan/ad-hoc
13
+ * workspace to a matching template so it becomes version-tracked, via
14
+ * `POST /api/hub/pod/adopt`.
15
+ *
16
+ * READ-first, ONE write door (`adopt`). Reuses rather than re-derives:
17
+ * - the composition-tree engine (`buildCompositionTrees`/`printCompositionTree`
18
+ * + `buildMarketCatalog`/`computeUpdates`) from `market.ts`, for the
19
+ * marketplace-provenance workspaces' package → template deps → workspaces
20
+ * overlay.
21
+ * - the honest-outcome verdict helpers (`classifyApplyResult`/
22
+ * `printApplyVerdict`) from `market.ts`, for `pod adopt`'s outcome.
23
+ */
24
+ import chalk from "chalk";
25
+ import { log } from "../utils/logger.js";
26
+ import { resolveHubConfig, hubGet, hubPost, renderHubError, HubError, } from "../lib/hub-client.js";
27
+ import { writeGovernance } from "../lib/capture-lane.js";
28
+ import { fetchInstalledTemplates } from "../lib/installed.js";
29
+ import { buildMarketCatalog, computeUpdates, buildCompositionTrees, printCompositionTree, } from "./market.js";
30
+ /** Coerce whatever shape a field arrives in into an array — tolerates minor DTO drift. */
31
+ function arr(v) {
32
+ return Array.isArray(v) ? v : [];
33
+ }
34
+ /** Defensive parse of the raw `/pod/config` JSON into `PodConfig` — never throws on a shifted field name, just degrades that section to empty. */
35
+ function parsePodConfig(raw) {
36
+ const r = (raw ?? {});
37
+ return {
38
+ workspaces: arr(r.workspaces),
39
+ capabilities: arr(r.capabilities),
40
+ automations: arr(r.automations),
41
+ playbooks: arr(r.playbooks),
42
+ feedsLinks: arr(r.feedsLinks),
43
+ };
44
+ }
45
+ /**
46
+ * `GET /pod/config`. Returns `null` (never throws) on a 404 — the endpoint
47
+ * not being deployed yet on this pod build is an expected, non-fatal state
48
+ * during parallel backend/CLI development; callers render an honest "not
49
+ * live on this pod yet" message instead of a stack trace.
50
+ */
51
+ async function fetchPodConfig(cfg) {
52
+ try {
53
+ const raw = await hubGet("/pod/config", {}, cfg);
54
+ return parsePodConfig(raw);
55
+ }
56
+ catch (e) {
57
+ if (e instanceof HubError && e.status === 404)
58
+ return null;
59
+ throw e;
60
+ }
61
+ }
62
+ /** An orphan is an ad-hoc workspace the backend matched to a known template. */
63
+ function isOrphan(ws) {
64
+ return ws.provenance.kind === "ad-hoc" && !!ws.provenance.templateMatch;
65
+ }
66
+ // ── Rendering helpers ────────────────────────────────────────────────────────
67
+ /** Tag for the small provenance shapes shared by capabilities/automations/playbooks. */
68
+ function provenanceTag(p) {
69
+ if (p.kind === "marketplace" && p.templateKey)
70
+ return chalk.green(`marketplace: ${p.templateKey}`);
71
+ switch (p.kind) {
72
+ case "marketplace":
73
+ return chalk.green("marketplace");
74
+ case "ai":
75
+ return chalk.magenta("ai");
76
+ case "template":
77
+ return chalk.cyan("template");
78
+ case "manual":
79
+ default:
80
+ return chalk.dim(p.kind);
81
+ }
82
+ }
83
+ /** One workspace row — `nameW` right-pads the name so provenance tags line up in a column. */
84
+ function workspaceLine(ws, nameW = 0) {
85
+ const name = chalk.bold(ws.name.padEnd(nameW));
86
+ const count = chalk.dim(`(${ws.entityCount} entities)`.padEnd(16));
87
+ const p = ws.provenance;
88
+ switch (p.kind) {
89
+ case "marketplace":
90
+ return `${name} ${count} ${chalk.green(`marketplace: ${p.packageSlug}${p.packageVersion ? "@" + p.packageVersion : ""}`)}`;
91
+ case "composed": {
92
+ const from = p.composedFrom.length ? p.composedFrom.map(String).join(", ") : "?";
93
+ return `${name} ${count} ${chalk.cyan(`composed from ${from}`)}`;
94
+ }
95
+ case "ad-hoc":
96
+ if (p.templateMatch) {
97
+ return (`${name} ${count} ` +
98
+ chalk.yellow(`⚠ orphan — matches template ${p.templateMatch.slug}`) +
99
+ "\n" +
100
+ " ".repeat(nameW + count.length + 4) +
101
+ chalk.dim(`run: synap pod adopt ${ws.id} --template ${p.templateMatch.slug}`));
102
+ }
103
+ return `${name} ${count} ${chalk.dim("ad-hoc")}`;
104
+ }
105
+ }
106
+ /** Group `{workspaceId|null}`-carrying rows into pod-wide vs per-workspace. */
107
+ function splitPodWide(rows) {
108
+ const podWide = [];
109
+ const perWorkspace = new Map();
110
+ for (const r of rows) {
111
+ if (r.workspaceId) {
112
+ (perWorkspace.get(r.workspaceId) ?? perWorkspace.set(r.workspaceId, []).get(r.workspaceId)).push(r);
113
+ }
114
+ else {
115
+ podWide.push(r);
116
+ }
117
+ }
118
+ return { podWide, perWorkspace };
119
+ }
120
+ function printGroupedSection(title, rows, nameById) {
121
+ log.heading(` ${title}`);
122
+ log.blank();
123
+ if (rows.length === 0) {
124
+ console.log(" " + chalk.dim("(none)"));
125
+ log.blank();
126
+ return;
127
+ }
128
+ const nameW = Math.max(4, ...rows.map((r) => r.name.length)) + 2;
129
+ const { podWide, perWorkspace } = splitPodWide(rows);
130
+ if (podWide.length > 0) {
131
+ console.log(" " + chalk.dim("Pod-wide"));
132
+ for (const r of podWide) {
133
+ console.log(" " + r.name.padEnd(nameW) + provenanceTag(r.provenance));
134
+ }
135
+ log.blank();
136
+ }
137
+ for (const [wsId, wsRows] of perWorkspace) {
138
+ console.log(" " + chalk.bold(nameById.get(wsId) ?? wsId));
139
+ for (const r of wsRows) {
140
+ console.log(" " + r.name.padEnd(nameW) + provenanceTag(r.provenance));
141
+ }
142
+ log.blank();
143
+ }
144
+ }
145
+ /** Render `feedsLinks` as `Foundation → provides → CRM` edges. */
146
+ function printFeedsLinks(links, nameById) {
147
+ log.heading(" Give / need links");
148
+ log.blank();
149
+ if (links.length === 0) {
150
+ console.log(" " + chalk.dim("(none)"));
151
+ log.blank();
152
+ return;
153
+ }
154
+ for (const l of links) {
155
+ const from = nameById.get(l.from) ?? l.from;
156
+ const to = nameById.get(l.to) ?? l.to;
157
+ const detail = l.domain ? ` (${l.domain})` : l.profileSlug ? ` (${l.profileSlug})` : "";
158
+ console.log(" " + chalk.bold(from) + chalk.dim(" → provides → ") + chalk.bold(to) + chalk.dim(detail));
159
+ }
160
+ log.blank();
161
+ }
162
+ // ── `synap pod` ──────────────────────────────────────────────────────────────
163
+ export async function pod(opts) {
164
+ let cfg;
165
+ try {
166
+ cfg = await resolveHubConfig(opts);
167
+ }
168
+ catch (e) {
169
+ renderHubError(e);
170
+ process.exit(1);
171
+ }
172
+ const config = await fetchPodConfig(cfg);
173
+ if (!config) {
174
+ if (opts.json) {
175
+ console.log(JSON.stringify({ error: "not-deployed", message: "GET /api/hub/pod/config returned 404" }, null, 2));
176
+ return;
177
+ }
178
+ log.warn("The unified pod-config endpoint isn't live on this pod yet (404).");
179
+ log.hint("The backend half of this feature hasn't been deployed — this command is wired and will work once it is.");
180
+ return;
181
+ }
182
+ const nameById = new Map(config.workspaces.map((w) => [w.id, w.name]));
183
+ const adHocWorkspaces = config.workspaces.filter((w) => w.provenance.kind === "ad-hoc");
184
+ if (opts.orphans) {
185
+ if (opts.json) {
186
+ console.log(JSON.stringify({ workspaces: adHocWorkspaces }, null, 2));
187
+ return;
188
+ }
189
+ if (adHocWorkspaces.length === 0) {
190
+ log.success("No orphan or ad-hoc workspaces — everything is either marketplace-linked or composed.");
191
+ return;
192
+ }
193
+ log.heading(" Orphan / ad-hoc workspaces");
194
+ log.blank();
195
+ const nameW = Math.max(4, ...adHocWorkspaces.map((w) => w.name.length)) + 2;
196
+ for (const ws of adHocWorkspaces) {
197
+ console.log(" " + workspaceLine(ws, nameW));
198
+ }
199
+ log.blank();
200
+ return;
201
+ }
202
+ if (opts.json) {
203
+ console.log(JSON.stringify(config, null, 2));
204
+ return;
205
+ }
206
+ // ── Workspaces ─────────────────────────────────────────────────────────
207
+ log.heading(" Workspaces");
208
+ log.blank();
209
+ if (config.workspaces.length === 0) {
210
+ console.log(" " + chalk.dim("(none)"));
211
+ log.blank();
212
+ }
213
+ const marketplaceWorkspaces = config.workspaces.filter((w) => w.provenance.kind === "marketplace");
214
+ const otherWorkspaces = config.workspaces.filter((w) => w.provenance.kind !== "marketplace");
215
+ // Composition-tree overlay for marketplace workspaces — reuses market.ts's
216
+ // `--tree` engine (buildMarketCatalog + computeUpdates + buildCompositionTrees)
217
+ // rather than re-deriving a second package→workspace walk.
218
+ if (marketplaceWorkspaces.length > 0) {
219
+ const nameW = Math.max(4, ...marketplaceWorkspaces.map((w) => w.name.length)) + 2;
220
+ const printFlat = () => {
221
+ marketplaceWorkspaces.forEach((ws) => console.log(" " + workspaceLine(ws, nameW)));
222
+ log.blank();
223
+ };
224
+ try {
225
+ const [installedTemplates, cat] = await Promise.all([fetchInstalledTemplates(), buildMarketCatalog()]);
226
+ if (installedTemplates.length > 0) {
227
+ const checks = computeUpdates(installedTemplates, cat);
228
+ const workspaceCountBySlug = new Map();
229
+ for (const t of installedTemplates) {
230
+ workspaceCountBySlug.set(t.slug, (workspaceCountBySlug.get(t.slug) ?? 0) + 1);
231
+ }
232
+ const seen = new Set();
233
+ const rows = checks.filter((c) => (seen.has(c.slug) ? false : (seen.add(c.slug), true)));
234
+ const { packages } = await buildCompositionTrees(rows, cat, installedTemplates, workspaceCountBySlug);
235
+ if (packages.length > 0)
236
+ packages.forEach(printCompositionTree);
237
+ else
238
+ printFlat();
239
+ }
240
+ else {
241
+ printFlat();
242
+ }
243
+ }
244
+ catch {
245
+ // Composition-tree overlay is best-effort — fall back to the flat list.
246
+ printFlat();
247
+ }
248
+ }
249
+ if (otherWorkspaces.length > 0) {
250
+ console.log(" " + chalk.dim("Composed / ad-hoc"));
251
+ const nameW = Math.max(4, ...otherWorkspaces.map((w) => w.name.length)) + 2;
252
+ for (const ws of otherWorkspaces) {
253
+ console.log(" " + workspaceLine(ws, nameW));
254
+ }
255
+ log.blank();
256
+ }
257
+ // ── Capabilities / Automations / Playbooks ────────────────────────────
258
+ printGroupedSection("Capabilities", config.capabilities, nameById);
259
+ printGroupedSection("Automations", config.automations, nameById);
260
+ printGroupedSection("Playbooks", config.playbooks, nameById);
261
+ // ── Give / need links ──────────────────────────────────────────────────
262
+ printFeedsLinks(config.feedsLinks, nameById);
263
+ const orphanCount = adHocWorkspaces.filter(isOrphan).length;
264
+ const adHocCount = adHocWorkspaces.length - orphanCount;
265
+ if (orphanCount > 0 || adHocCount > 0) {
266
+ log.dim(`${orphanCount} orphan, ${adHocCount} ad-hoc workspace${orphanCount + adHocCount === 1 ? "" : "s"} — run 'synap pod --orphans' to focus on them.`);
267
+ }
268
+ }
269
+ // ── `synap pod adopt <nameOrId> --template <slug>` ───────────────────────────
270
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
271
+ /**
272
+ * Resolve a user-supplied `<workspace>` arg to a workspace id.
273
+ *
274
+ * `adopt` is FOR orphans, so the source must include unstamped/ad-hoc
275
+ * workspaces — `fetchInstalledTemplates` (template-installed only) is the
276
+ * wrong list here. `GET /orient` already returns every workspace on the pod
277
+ * (incl. orphans) and is deployed today, so it's the resolution source; the
278
+ * newer `/pod/config` read (this file's `fetchPodConfig`) would also work
279
+ * once live but isn't guaranteed deployed yet.
280
+ *
281
+ * A UUID is passed straight through unchanged (fast path — no network call).
282
+ * Anything else is matched case-insensitively by exact name against `/orient`.
283
+ */
284
+ async function resolveWorkspaceRef(nameOrId, cfg) {
285
+ if (UUID_RE.test(nameOrId))
286
+ return nameOrId;
287
+ const res = (await hubGet("/orient", { detail: "full" }, cfg));
288
+ const workspaces = res.workspaces ?? [];
289
+ const needle = nameOrId.trim().toLowerCase();
290
+ const matches = workspaces.filter((w) => (w.name ?? "").trim().toLowerCase() === needle);
291
+ if (matches.length === 0) {
292
+ log.error(`No workspace named "${nameOrId}" on this pod. Run 'synap pod' to see them.`);
293
+ process.exit(1);
294
+ }
295
+ if (matches.length > 1) {
296
+ const candidates = matches.map((w) => `${w.id} (${w.name})`).join(", ");
297
+ log.error(`Multiple workspaces named "${nameOrId}" — use the id: ${candidates}`);
298
+ process.exit(1);
299
+ }
300
+ const match = matches[0];
301
+ log.dim(`Resolved "${nameOrId}" → ${match.id}`);
302
+ return match.id;
303
+ }
304
+ export async function podAdopt(workspaceNameOrId, opts) {
305
+ if (!opts.template) {
306
+ log.error("Missing --template <slug>.");
307
+ log.hint("List template matches: synap pod --orphans");
308
+ process.exit(1);
309
+ }
310
+ let cfg;
311
+ try {
312
+ cfg = await resolveHubConfig(opts);
313
+ }
314
+ catch (e) {
315
+ renderHubError(e);
316
+ process.exit(1);
317
+ }
318
+ const workspaceId = await resolveWorkspaceRef(workspaceNameOrId, cfg);
319
+ try {
320
+ const res = (await hubPost("/pod/adopt", { workspaceId, templateSlug: opts.template }, cfg));
321
+ if (writeGovernance(res) === "proposed") {
322
+ const proposalId = res.proposalId ? String(res.proposalId) : undefined;
323
+ if (opts.json) {
324
+ console.log(JSON.stringify({ outcome: "proposed", proposalId }, null, 2));
325
+ return;
326
+ }
327
+ log.info(`Adopting into ${opts.template} — proposed (under review, not live yet).`);
328
+ if (proposalId)
329
+ log.hint(`Approve: synap proposals approve ${proposalId.slice(0, 8)}`);
330
+ return;
331
+ }
332
+ const result = res;
333
+ if (opts.json) {
334
+ console.log(JSON.stringify(result, null, 2));
335
+ return;
336
+ }
337
+ const wsName = result.workspace?.name ?? workspaceId;
338
+ if (result.outcome === "already-linked") {
339
+ log.info(`${wsName} is already linked to ${opts.template}.`);
340
+ return;
341
+ }
342
+ log.success(`Linked ${wsName} to ${opts.template} — now version-tracked.`);
343
+ if (result.workspace?.packageVersion) {
344
+ log.dim(`Stamped version ${result.workspace.packageVersion}.`);
345
+ }
346
+ log.hint(`Check for drift going forward: synap market update ${opts.template}`);
347
+ }
348
+ catch (e) {
349
+ if (e instanceof HubError && e.status === 404) {
350
+ log.warn("The pod-adopt endpoint isn't live on this pod yet (404).");
351
+ log.hint("The backend half of this feature hasn't been deployed — this command is wired and will work once it is.");
352
+ return;
353
+ }
354
+ log.error(`Adopting ${workspaceId} into ${opts.template} failed`);
355
+ renderHubError(e);
356
+ process.exit(1);
357
+ }
358
+ }
359
+ //# sourceMappingURL=pod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pod.js","sourceRoot":"","sources":["../../src/commands/pod.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export declare function podsAdd(name?: string, podUrlArg?: string): Promise<void
12
12
  export type { SurfaceName };
13
13
  export declare function podsUse(name: string, opts?: {
14
14
  surface?: SurfaceName;
15
+ json?: boolean;
15
16
  }): Promise<void>;
16
17
  export declare function podsSwitch(name?: string): Promise<void>;
17
18
  export declare function podsRemove(name: string): Promise<void>;
@@ -13,9 +13,10 @@ import fs from "node:fs";
13
13
  import path from "node:path";
14
14
  import os from "node:os";
15
15
  import { log } from "../utils/logger.js";
16
- import { checkPodHealth, setupAgent, addPodProfile, setActivePod, setSurfacePod, removePodProfile, listPodProfiles, } from "../lib/pod.js";
17
- import { TARGETS, writeMcpServerEntry, writeClaudeCodeEnv, } from "../lib/targets.js";
16
+ import { checkPodHealth, addPodProfile, setActivePod, setSurfacePod, removePodProfile, listPodProfiles, podNotFoundMessage, SURFACE_NAMES, } from "../lib/pod.js";
17
+ import { TARGETS, writeMcpServerEntry, writeClaudeCodeEnv, provisionAgentKey, configureAgentContext, } from "../lib/targets.js";
18
18
  import { runBrowserAuth } from "../lib/browser-auth.js";
19
+ import { renderNextSteps, FLOW } from "../lib/next-steps.js";
19
20
  // ─── list ─────────────────────────────────────────────────────────────────────
20
21
  export async function podsList() {
21
22
  const profiles = listPodProfiles();
@@ -126,9 +127,14 @@ export async function podsAdd(name, podUrlArg) {
126
127
  return;
127
128
  const genSpinner = ora("Creating agent credentials...").start();
128
129
  try {
129
- const result = await setupAgent(podUrl, token, "cli");
130
+ // Agents are pod-wide singletons now — no per-agent workspaceId comes back
131
+ // from setup (the old setupAgent() never passed one either, so this was
132
+ // already always null/"" in practice). Provision via the shared wrapper.
133
+ // No enrollAgentIfNeeded here: a PROVISIONING_TOKEN isn't a Hub Protocol
134
+ // API key, so it can't authorize /workspaces/enroll-agent (hub-protocol.write
135
+ // scope) — same as before this consolidation.
136
+ const result = await provisionAgentKey(podUrl, token, "cli");
130
137
  apiKey = result.hubApiKey;
131
- workspaceId = result.workspaceId;
132
138
  agentUserId = result.agentUserId;
133
139
  genSpinner.succeed("Credentials created");
134
140
  }
@@ -147,6 +153,14 @@ export async function podsAdd(name, podUrlArg) {
147
153
  label: label || undefined,
148
154
  savedAt: new Date().toISOString(),
149
155
  });
156
+ if (agentUserId) {
157
+ try {
158
+ await configureAgentContext(podUrl, apiKey, "cli", agentUserId);
159
+ }
160
+ catch (err) {
161
+ log.warn(`Agent context wizard failed: ${err instanceof Error ? err.message : String(err)}`);
162
+ }
163
+ }
150
164
  log.blank();
151
165
  log.success(`Pod '${profileName}' saved.`);
152
166
  log.dim(`Run: synap pods use ${profileName} — to make it active`);
@@ -159,17 +173,40 @@ const SURFACE_LABELS = {
159
173
  opencode: "opencode",
160
174
  goose: "Goose",
161
175
  };
176
+ /**
177
+ * The surfaces `applySurfaceConfig` can actually write. SURFACE_NAMES is much
178
+ * wider (it is the SSOT for every connect/agent identity), and `pods use
179
+ * --surface <one of the others>` used to print success and do nothing.
180
+ *
181
+ * Typing applySurfaceConfig to this narrow union makes its switch exhaustive, so
182
+ * adding a surface here without a writer is a COMPILE error, not a silent no-op.
183
+ */
184
+ const SUPPORTED_USE_SURFACES = ["claude-desktop", "cursor", "claude-code", "raycast"];
185
+ function isSupportedUseSurface(s) {
186
+ return SUPPORTED_USE_SURFACES.includes(s);
187
+ }
188
+ /**
189
+ * Raycast's support dir — its presence is our "is Raycast installed" gate.
190
+ * Mirrors `raycastSupportDir()` in lib/targets.ts, which is private to that file.
191
+ */
192
+ function raycastSupportDir() {
193
+ return path.join(os.homedir(), "Library", "Application Support", "com.raycast.macos");
194
+ }
162
195
  export async function podsUse(name, opts = {}) {
163
196
  const profiles = listPodProfiles();
164
197
  const profile = profiles.find((p) => p.name === name);
165
198
  if (!profile) {
166
- log.error(`Pod profile '${name}' not found.`);
167
- if (profiles.length > 0)
168
- log.dim("Available: " + profiles.map((p) => p.name).join(", "));
199
+ log.error(podNotFoundMessage(name));
169
200
  return;
170
201
  }
171
202
  const podConfig = profile.config;
172
203
  if (opts.surface) {
204
+ if (!isSupportedUseSurface(opts.surface)) {
205
+ log.error(`'${opts.surface}' is not a surface \`pods use\` can configure.`);
206
+ log.dim(`Supported: ${SUPPORTED_USE_SURFACES.join(", ")}`);
207
+ log.dim(`Other surfaces (${SURFACE_NAMES.filter((s) => !isSupportedUseSurface(s)).join(", ")}) are configured via: synap connect --target=<surface>`);
208
+ return;
209
+ }
173
210
  // Per-surface switch — only update that surface's config
174
211
  try {
175
212
  setSurfacePod(opts.surface, name);
@@ -210,15 +247,34 @@ export async function podsUse(name, opts = {}) {
210
247
  // Claude Code
211
248
  const claudeSettings = path.join(os.homedir(), ".claude", "settings.json");
212
249
  if (fs.existsSync(claudeSettings)) {
213
- await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, workspaceId: podConfig.workspaceId, agentUserId: podConfig.agentUserId });
250
+ // Pod-wide: a workspace is a lens, not a container — don't weld the profile's
251
+ // workspace into the MCP URL (matches the Desktop/Cursor entries above and
252
+ // the `synap connect` default). Pins are set only via `synap connect --pin-*`.
253
+ await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, agentUserId: podConfig.agentUserId });
214
254
  updated.push("Claude Code");
215
255
  }
216
- // Raycast reads ~/.synap/config.json directly — activePod update is sufficient.
217
- updated.push("Raycast");
256
+ // Raycast reads ~/.synap/config.json directly — the activePod update above is
257
+ // sufficient. Still gate on Raycast being installed: claiming we updated it on
258
+ // a machine that has never run Raycast is a lie (same existsSync gate as above).
259
+ if (fs.existsSync(raycastSupportDir())) {
260
+ updated.push("Raycast");
261
+ }
262
+ const steps = FLOW.afterPodUse(name);
263
+ if (opts.json) {
264
+ console.log(JSON.stringify({ pod: name, podUrl: podConfig.podUrl, surfaces: updated, nextSteps: steps }, null, 2));
265
+ return;
266
+ }
267
+ if (updated.length === 0) {
268
+ log.warn("Active pod switched, but no agent surface is configured on this machine.");
269
+ log.dim("Connect one with: synap connect --target=<surface>");
270
+ renderNextSteps(steps);
271
+ return;
272
+ }
218
273
  log.success(`Updated: ${updated.join(", ")}`);
219
274
  log.dim("Restart any open agents to apply the new pod.");
220
275
  log.blank();
221
276
  log.dim("Tip: synap pods use <name> --surface <surface> — switch only one surface");
277
+ renderNextSteps(steps);
222
278
  }
223
279
  /** Apply a pod config to a single surface's external config file. */
224
280
  async function applySurfaceConfig(surface, podConfig) {
@@ -255,7 +311,9 @@ async function applySurfaceConfig(surface, podConfig) {
255
311
  case "claude-code": {
256
312
  const p = path.join(os.homedir(), ".claude", "settings.json");
257
313
  if (fs.existsSync(p)) {
258
- await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, workspaceId: podConfig.workspaceId, agentUserId: podConfig.agentUserId });
314
+ // Pod-wide: don't weld the profile's workspace into the MCP URL (see note
315
+ // in `podsUse` above and the `synap connect` default).
316
+ await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, agentUserId: podConfig.agentUserId });
259
317
  log.success("Claude Code env updated (~/.claude/settings.json).");
260
318
  }
261
319
  else {
@@ -267,6 +325,12 @@ async function applySurfaceConfig(surface, podConfig) {
267
325
  // Raycast reads ~/.synap/config.json directly — surfaces entry is enough.
268
326
  log.success("Raycast surface preference saved.");
269
327
  break;
328
+ default: {
329
+ // Exhaustiveness guard: widening SUPPORTED_USE_SURFACES without adding a
330
+ // writer above fails to compile here, instead of silently doing nothing.
331
+ const _exhaustive = surface;
332
+ return _exhaustive;
333
+ }
270
334
  }
271
335
  }
272
336
  // ─── switch (interactive) ─────────────────────────────────────────────────────
@@ -306,9 +370,7 @@ export async function podsRemove(name) {
306
370
  const profiles = listPodProfiles();
307
371
  const profile = profiles.find((p) => p.name === name);
308
372
  if (!profile) {
309
- log.error(`Pod profile '${name}' not found.`);
310
- if (profiles.length > 0)
311
- log.dim("Available: " + profiles.map((p) => p.name).join(", "));
373
+ log.error(podNotFoundMessage(name));
312
374
  return;
313
375
  }
314
376
  if (profile.active) {
@@ -368,7 +430,7 @@ export async function podsReconnect(name) {
368
430
  }
369
431
  const profile = profiles.find((p) => p.name === targetName);
370
432
  if (!profile) {
371
- log.error(`Pod profile '${targetName}' not found.`);
433
+ log.error(podNotFoundMessage(targetName));
372
434
  return;
373
435
  }
374
436
  const podUrl = profile.config.podUrl;