@synap-core/cli 1.10.0 → 1.12.2

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 (461) hide show
  1. package/README.md +23 -198
  2. package/dist/build-info.json +6 -0
  3. package/dist/commands/agent-run.js +3 -2
  4. package/dist/commands/agent-run.js.map +1 -1
  5. package/dist/commands/agents.d.ts +33 -17
  6. package/dist/commands/agents.js +203 -237
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/app.d.ts +143 -0
  9. package/dist/commands/app.js +523 -0
  10. package/dist/commands/app.js.map +1 -0
  11. package/dist/commands/automate.d.ts +21 -0
  12. package/dist/commands/automate.js +42 -0
  13. package/dist/commands/automate.js.map +1 -0
  14. package/dist/commands/automation-schema.test.d.ts +16 -0
  15. package/dist/commands/automation-schema.test.js +77 -0
  16. package/dist/commands/automation-schema.test.js.map +1 -0
  17. package/dist/commands/automation.d.ts +12 -0
  18. package/dist/commands/automation.js +80 -35
  19. package/dist/commands/automation.js.map +1 -1
  20. package/dist/commands/bridge-setup.d.ts +14 -1
  21. package/dist/commands/bridge-setup.js +392 -128
  22. package/dist/commands/bridge-setup.js.map +1 -1
  23. package/dist/commands/cap-connections.d.ts +4 -4
  24. package/dist/commands/cap-connections.js +14 -14
  25. package/dist/commands/cap-connections.js.map +1 -1
  26. package/dist/commands/capability.d.ts +2 -0
  27. package/dist/commands/capability.js +297 -176
  28. package/dist/commands/capability.js.map +1 -1
  29. package/dist/commands/catalog.d.ts +275 -0
  30. package/dist/commands/catalog.js +481 -0
  31. package/dist/commands/catalog.js.map +1 -0
  32. package/dist/commands/cell.d.ts +155 -8
  33. package/dist/commands/cell.js +416 -40
  34. package/dist/commands/cell.js.map +1 -1
  35. package/dist/commands/centrality.js +3 -14
  36. package/dist/commands/centrality.js.map +1 -1
  37. package/dist/commands/connect.d.ts +38 -13
  38. package/dist/commands/connect.js +68 -167
  39. package/dist/commands/connect.js.map +1 -1
  40. package/dist/commands/connections.d.ts +3 -2
  41. package/dist/commands/connections.js +95 -25
  42. package/dist/commands/connections.js.map +1 -1
  43. package/dist/commands/context.js +9 -2
  44. package/dist/commands/context.js.map +1 -1
  45. package/dist/commands/data-extra.d.ts +34 -0
  46. package/dist/commands/data-extra.js +198 -25
  47. package/dist/commands/data-extra.js.map +1 -1
  48. package/dist/commands/data.d.ts +120 -2
  49. package/dist/commands/data.js +307 -24
  50. package/dist/commands/data.js.map +1 -1
  51. package/dist/commands/diagnose.d.ts +66 -4
  52. package/dist/commands/diagnose.js +329 -29
  53. package/dist/commands/diagnose.js.map +1 -1
  54. package/dist/commands/digest.js +2 -1
  55. package/dist/commands/digest.js.map +1 -1
  56. package/dist/commands/doc.d.ts +25 -4
  57. package/dist/commands/doc.js +100 -18
  58. package/dist/commands/doc.js.map +1 -1
  59. package/dist/commands/doctor.d.ts +130 -0
  60. package/dist/commands/doctor.js +814 -0
  61. package/dist/commands/doctor.js.map +1 -0
  62. package/dist/commands/events.js +3 -1
  63. package/dist/commands/events.js.map +1 -1
  64. package/dist/commands/explain.js +5 -5
  65. package/dist/commands/explain.js.map +1 -1
  66. package/dist/commands/graph.js +5 -3
  67. package/dist/commands/graph.js.map +1 -1
  68. package/dist/commands/import.d.ts +368 -13
  69. package/dist/commands/import.js +1096 -55
  70. package/dist/commands/import.js.map +1 -1
  71. package/dist/commands/init.d.ts +20 -9
  72. package/dist/commands/init.js +433 -973
  73. package/dist/commands/init.js.map +1 -1
  74. package/dist/commands/keys.d.ts +1 -0
  75. package/dist/commands/keys.js +15 -2
  76. package/dist/commands/keys.js.map +1 -1
  77. package/dist/commands/knowledge.d.ts +28 -6
  78. package/dist/commands/knowledge.js +358 -73
  79. package/dist/commands/knowledge.js.map +1 -1
  80. package/dist/commands/launch.js +2 -2
  81. package/dist/commands/launch.js.map +1 -1
  82. package/dist/commands/lens.d.ts +37 -1
  83. package/dist/commands/lens.js +193 -72
  84. package/dist/commands/lens.js.map +1 -1
  85. package/dist/commands/market-authoring.d.ts +72 -0
  86. package/dist/commands/market-authoring.js +566 -0
  87. package/dist/commands/market-authoring.js.map +1 -0
  88. package/dist/commands/market-official.d.ts +58 -0
  89. package/dist/commands/market-official.js +84 -0
  90. package/dist/commands/market-official.js.map +1 -0
  91. package/dist/commands/market.d.ts +419 -20
  92. package/dist/commands/market.js +2124 -193
  93. package/dist/commands/market.js.map +1 -1
  94. package/dist/commands/mcp.d.ts +70 -13
  95. package/dist/commands/mcp.js +308 -40
  96. package/dist/commands/mcp.js.map +1 -1
  97. package/dist/commands/open.d.ts +39 -9
  98. package/dist/commands/open.js +80 -25
  99. package/dist/commands/open.js.map +1 -1
  100. package/dist/commands/playbook.d.ts +42 -0
  101. package/dist/commands/playbook.js +162 -0
  102. package/dist/commands/playbook.js.map +1 -0
  103. package/dist/commands/pod.js +1 -1
  104. package/dist/commands/pod.js.map +1 -1
  105. package/dist/commands/pods.d.ts +19 -0
  106. package/dist/commands/pods.js +220 -85
  107. package/dist/commands/pods.js.map +1 -1
  108. package/dist/commands/proposals-actions.d.ts +62 -0
  109. package/dist/commands/proposals-actions.js +146 -8
  110. package/dist/commands/proposals-actions.js.map +1 -1
  111. package/dist/commands/proposals-await.d.ts +68 -0
  112. package/dist/commands/proposals-await.js +248 -0
  113. package/dist/commands/proposals-await.js.map +1 -0
  114. package/dist/commands/proton-setup.d.ts +73 -0
  115. package/dist/commands/proton-setup.js +577 -0
  116. package/dist/commands/proton-setup.js.map +1 -0
  117. package/dist/commands/providers.d.ts +23 -0
  118. package/dist/commands/providers.js +126 -1
  119. package/dist/commands/providers.js.map +1 -1
  120. package/dist/commands/raycast.js +6 -2
  121. package/dist/commands/raycast.js.map +1 -1
  122. package/dist/commands/rule.d.ts +150 -0
  123. package/dist/commands/rule.js +447 -0
  124. package/dist/commands/rule.js.map +1 -0
  125. package/dist/commands/session-wait.d.ts +111 -0
  126. package/dist/commands/session-wait.js +209 -0
  127. package/dist/commands/session-wait.js.map +1 -0
  128. package/dist/commands/sessions.d.ts +52 -0
  129. package/dist/commands/sessions.js +479 -58
  130. package/dist/commands/sessions.js.map +1 -1
  131. package/dist/commands/skill-manage.d.ts +21 -0
  132. package/dist/commands/skill-manage.js +136 -19
  133. package/dist/commands/skill-manage.js.map +1 -1
  134. package/dist/commands/skills.js +19 -1
  135. package/dist/commands/skills.js.map +1 -1
  136. package/dist/commands/status.d.ts +1 -4
  137. package/dist/commands/status.js +5 -34
  138. package/dist/commands/status.js.map +1 -1
  139. package/dist/commands/statusline.backoff.test.d.ts +13 -0
  140. package/dist/commands/statusline.backoff.test.js +100 -0
  141. package/dist/commands/statusline.backoff.test.js.map +1 -0
  142. package/dist/commands/statusline.js +16 -9
  143. package/dist/commands/statusline.js.map +1 -1
  144. package/dist/commands/sync-status.d.ts +12 -0
  145. package/dist/commands/sync-status.js +125 -0
  146. package/dist/commands/sync-status.js.map +1 -0
  147. package/dist/commands/templates-retire.d.ts +34 -0
  148. package/dist/commands/templates-retire.js +192 -0
  149. package/dist/commands/templates-retire.js.map +1 -0
  150. package/dist/commands/tools.js +6 -21
  151. package/dist/commands/tools.js.map +1 -1
  152. package/dist/commands/tracks.d.ts +51 -0
  153. package/dist/commands/tracks.js +291 -0
  154. package/dist/commands/tracks.js.map +1 -0
  155. package/dist/commands/update.d.ts +3 -11
  156. package/dist/commands/update.js +5 -134
  157. package/dist/commands/update.js.map +1 -1
  158. package/dist/commands/upload.d.ts +68 -0
  159. package/dist/commands/upload.js +257 -0
  160. package/dist/commands/upload.js.map +1 -0
  161. package/dist/commands/vendor.d.ts +28 -0
  162. package/dist/commands/vendor.js +110 -0
  163. package/dist/commands/vendor.js.map +1 -0
  164. package/dist/commands/versions.js +6 -0
  165. package/dist/commands/versions.js.map +1 -1
  166. package/dist/commands/view.js +10 -5
  167. package/dist/commands/view.js.map +1 -1
  168. package/dist/commands/whoami.d.ts +23 -3
  169. package/dist/commands/whoami.js +169 -23
  170. package/dist/commands/whoami.js.map +1 -1
  171. package/dist/commands/worker.d.ts +122 -0
  172. package/dist/commands/worker.js +435 -0
  173. package/dist/commands/worker.js.map +1 -0
  174. package/dist/commands/worker.test.d.ts +1 -0
  175. package/dist/commands/worker.test.js +116 -0
  176. package/dist/commands/worker.test.js.map +1 -0
  177. package/dist/commands/workspace-ops.d.ts +35 -0
  178. package/dist/commands/workspace-ops.js +153 -0
  179. package/dist/commands/workspace-ops.js.map +1 -0
  180. package/dist/index.d.ts +6 -6
  181. package/dist/index.js +1009 -171
  182. package/dist/index.js.map +1 -1
  183. package/dist/lib/agent-connections.d.ts +31 -0
  184. package/dist/lib/agent-connections.js +33 -0
  185. package/dist/lib/agent-connections.js.map +1 -0
  186. package/dist/lib/agent-detect.d.ts +27 -0
  187. package/dist/lib/agent-detect.js +71 -0
  188. package/dist/lib/agent-detect.js.map +1 -0
  189. package/dist/lib/agent-door.d.ts +138 -0
  190. package/dist/lib/agent-door.js +426 -0
  191. package/dist/lib/agent-door.js.map +1 -0
  192. package/dist/lib/agents-config.d.ts +2 -0
  193. package/dist/lib/agents-config.js +4 -9
  194. package/dist/lib/agents-config.js.map +1 -1
  195. package/dist/lib/approval-poll.d.ts +31 -2
  196. package/dist/lib/approval-poll.js +20 -7
  197. package/dist/lib/approval-poll.js.map +1 -1
  198. package/dist/lib/atomic-file.d.ts +48 -0
  199. package/dist/lib/atomic-file.js +129 -0
  200. package/dist/lib/atomic-file.js.map +1 -0
  201. package/dist/lib/auth.d.ts +14 -9
  202. package/dist/lib/auth.js +44 -61
  203. package/dist/lib/auth.js.map +1 -1
  204. package/dist/lib/batch-approval.d.ts +85 -0
  205. package/dist/lib/batch-approval.js +170 -0
  206. package/dist/lib/batch-approval.js.map +1 -0
  207. package/dist/lib/capture-lane.d.ts +6 -5
  208. package/dist/lib/capture-lane.js +11 -8
  209. package/dist/lib/capture-lane.js.map +1 -1
  210. package/dist/lib/capture-structure.d.ts +342 -0
  211. package/dist/lib/capture-structure.js +295 -0
  212. package/dist/lib/capture-structure.js.map +1 -0
  213. package/dist/lib/catalog-templates.d.ts +59 -0
  214. package/dist/lib/catalog-templates.js +126 -0
  215. package/dist/lib/catalog-templates.js.map +1 -0
  216. package/dist/lib/cli-build.d.ts +19 -0
  217. package/dist/lib/cli-build.js +37 -0
  218. package/dist/lib/cli-build.js.map +1 -0
  219. package/dist/lib/conversation-headers.d.ts +18 -0
  220. package/dist/lib/conversation-headers.js +32 -0
  221. package/dist/lib/conversation-headers.js.map +1 -0
  222. package/dist/lib/cp-packages.d.ts +216 -4
  223. package/dist/lib/cp-packages.js +414 -11
  224. package/dist/lib/cp-packages.js.map +1 -1
  225. package/dist/lib/credential-class.d.ts +117 -0
  226. package/dist/lib/credential-class.js +116 -0
  227. package/dist/lib/credential-class.js.map +1 -0
  228. package/dist/lib/describe-lens.d.ts +35 -0
  229. package/dist/lib/describe-lens.js +40 -0
  230. package/dist/lib/describe-lens.js.map +1 -1
  231. package/dist/lib/device-connect.d.ts +125 -0
  232. package/dist/lib/device-connect.js +256 -0
  233. package/dist/lib/device-connect.js.map +1 -0
  234. package/dist/lib/directory-lens.d.ts +99 -0
  235. package/dist/lib/directory-lens.js +187 -0
  236. package/dist/lib/directory-lens.js.map +1 -0
  237. package/dist/lib/exporter-coverage.d.ts +71 -0
  238. package/dist/lib/exporter-coverage.js +97 -0
  239. package/dist/lib/exporter-coverage.js.map +1 -0
  240. package/dist/lib/hub-client.d.ts +43 -9
  241. package/dist/lib/hub-client.js +429 -65
  242. package/dist/lib/hub-client.js.map +1 -1
  243. package/dist/lib/id.d.ts +23 -0
  244. package/dist/lib/id.js +35 -0
  245. package/dist/lib/id.js.map +1 -0
  246. package/dist/lib/init-connect.d.ts +41 -0
  247. package/dist/lib/init-connect.js +75 -0
  248. package/dist/lib/init-connect.js.map +1 -0
  249. package/dist/lib/init-exit.d.ts +24 -0
  250. package/dist/lib/init-exit.js +41 -0
  251. package/dist/lib/init-exit.js.map +1 -0
  252. package/dist/lib/init-flow.d.ts +25 -0
  253. package/dist/lib/init-flow.js +40 -0
  254. package/dist/lib/init-flow.js.map +1 -0
  255. package/dist/lib/init-handoff.d.ts +16 -0
  256. package/dist/lib/init-handoff.js +19 -0
  257. package/dist/lib/init-handoff.js.map +1 -0
  258. package/dist/lib/init-output.d.ts +18 -0
  259. package/dist/lib/init-output.js +43 -0
  260. package/dist/lib/init-output.js.map +1 -0
  261. package/dist/lib/init-pod.d.ts +45 -0
  262. package/dist/lib/init-pod.js +36 -0
  263. package/dist/lib/init-pod.js.map +1 -0
  264. package/dist/lib/installed.d.ts +210 -11
  265. package/dist/lib/installed.js +234 -36
  266. package/dist/lib/installed.js.map +1 -1
  267. package/dist/lib/key-approval.d.ts +57 -0
  268. package/dist/lib/key-approval.js +117 -0
  269. package/dist/lib/key-approval.js.map +1 -0
  270. package/dist/lib/key-diagnosis.d.ts +56 -0
  271. package/dist/lib/key-diagnosis.js +227 -0
  272. package/dist/lib/key-diagnosis.js.map +1 -0
  273. package/dist/lib/key-doctor.d.ts +136 -0
  274. package/dist/lib/key-doctor.js +286 -0
  275. package/dist/lib/key-doctor.js.map +1 -0
  276. package/dist/lib/key-locations.d.ts +120 -0
  277. package/dist/lib/key-locations.js +326 -0
  278. package/dist/lib/key-locations.js.map +1 -0
  279. package/dist/lib/key-source.d.ts +66 -0
  280. package/dist/lib/key-source.js +106 -0
  281. package/dist/lib/key-source.js.map +1 -0
  282. package/dist/lib/key-state.d.ts +70 -0
  283. package/dist/lib/key-state.js +115 -0
  284. package/dist/lib/key-state.js.map +1 -0
  285. package/dist/lib/kind-package.d.ts +181 -0
  286. package/dist/lib/kind-package.js +679 -0
  287. package/dist/lib/kind-package.js.map +1 -0
  288. package/dist/lib/knowledge-title.d.ts +24 -0
  289. package/dist/lib/knowledge-title.js +46 -0
  290. package/dist/lib/knowledge-title.js.map +1 -0
  291. package/dist/lib/knowledge-title.test.d.ts +1 -0
  292. package/dist/lib/knowledge-title.test.js +34 -0
  293. package/dist/lib/knowledge-title.test.js.map +1 -0
  294. package/dist/lib/machine-instance.d.ts +64 -0
  295. package/dist/lib/machine-instance.js +142 -0
  296. package/dist/lib/machine-instance.js.map +1 -0
  297. package/dist/lib/mcp-bridge.d.ts +42 -0
  298. package/dist/lib/mcp-bridge.js +147 -0
  299. package/dist/lib/mcp-bridge.js.map +1 -0
  300. package/dist/lib/mcp-bridge.test.d.ts +1 -0
  301. package/dist/lib/mcp-bridge.test.js +90 -0
  302. package/dist/lib/mcp-bridge.test.js.map +1 -0
  303. package/dist/lib/mcp-call.d.ts +30 -0
  304. package/dist/lib/mcp-call.js +107 -0
  305. package/dist/lib/mcp-call.js.map +1 -0
  306. package/dist/lib/mcp-snippets.d.ts +53 -0
  307. package/dist/lib/mcp-snippets.js +82 -0
  308. package/dist/lib/mcp-snippets.js.map +1 -0
  309. package/dist/lib/next-steps.d.ts +8 -0
  310. package/dist/lib/next-steps.js +31 -1
  311. package/dist/lib/next-steps.js.map +1 -1
  312. package/dist/lib/package-wire.d.ts +179 -0
  313. package/dist/lib/package-wire.js +68 -0
  314. package/dist/lib/package-wire.js.map +1 -0
  315. package/dist/lib/pair-link.d.ts +38 -0
  316. package/dist/lib/pair-link.js +68 -0
  317. package/dist/lib/pair-link.js.map +1 -0
  318. package/dist/lib/pod-wide.d.ts +40 -0
  319. package/dist/lib/pod-wide.js +46 -0
  320. package/dist/lib/pod-wide.js.map +1 -0
  321. package/dist/lib/pod.d.ts +119 -115
  322. package/dist/lib/pod.js +206 -412
  323. package/dist/lib/pod.js.map +1 -1
  324. package/dist/lib/project-ref.d.ts +9 -3
  325. package/dist/lib/project-ref.js +10 -4
  326. package/dist/lib/project-ref.js.map +1 -1
  327. package/dist/lib/review-credential.d.ts +119 -0
  328. package/dist/lib/review-credential.js +147 -0
  329. package/dist/lib/review-credential.js.map +1 -0
  330. package/dist/lib/safe-open.d.ts +49 -0
  331. package/dist/lib/safe-open.js +119 -0
  332. package/dist/lib/safe-open.js.map +1 -0
  333. package/dist/lib/session-lens.d.ts +40 -1
  334. package/dist/lib/session-lens.js +54 -4
  335. package/dist/lib/session-lens.js.map +1 -1
  336. package/dist/lib/superwhisper-import.d.ts +8 -0
  337. package/dist/lib/superwhisper-import.js +14 -7
  338. package/dist/lib/superwhisper-import.js.map +1 -1
  339. package/dist/lib/superwhisper-title.test.d.ts +1 -0
  340. package/dist/lib/superwhisper-title.test.js +18 -0
  341. package/dist/lib/superwhisper-title.test.js.map +1 -0
  342. package/dist/lib/targets.d.ts +134 -10
  343. package/dist/lib/targets.js +962 -258
  344. package/dist/lib/targets.js.map +1 -1
  345. package/dist/lib/template-file.d.ts +78 -0
  346. package/dist/lib/template-file.js +140 -0
  347. package/dist/lib/template-file.js.map +1 -0
  348. package/dist/lib/template-lifecycle.d.ts +217 -0
  349. package/dist/lib/template-lifecycle.js +433 -0
  350. package/dist/lib/template-lifecycle.js.map +1 -0
  351. package/dist/lib/template-steps.d.ts +88 -0
  352. package/dist/lib/template-steps.js +118 -0
  353. package/dist/lib/template-steps.js.map +1 -0
  354. package/dist/lib/time-ago.d.ts +2 -0
  355. package/dist/lib/time-ago.js +15 -0
  356. package/dist/lib/time-ago.js.map +1 -0
  357. package/dist/utils/logger.js +5 -2
  358. package/dist/utils/logger.js.map +1 -1
  359. package/package.json +25 -18
  360. package/skills/README.md +12 -10
  361. package/skills/agent-os/SKILL.md +220 -99
  362. package/skills/manifest.json +2 -2
  363. package/skills/onboard/SKILL.md +61 -25
  364. package/skills/synap/README.md +5 -8
  365. package/skills/synap/SKILL.md +1185 -301
  366. package/skills/synap/_order.txt +7 -0
  367. package/skills/synap/_skill.yaml +1 -1
  368. package/skills/synap/automations.md +15 -0
  369. package/skills/synap/capture.md +54 -151
  370. package/skills/synap/cli-operations.md +24 -18
  371. package/skills/synap/common-mistakes.md +1 -0
  372. package/skills/synap/concepts.md +28 -0
  373. package/skills/synap/content-os.md +92 -0
  374. package/skills/synap/creative-loop.md +15 -10
  375. package/skills/synap/crm.md +21 -52
  376. package/skills/synap/digesting-a-channel.md +25 -0
  377. package/skills/synap/document-embeds.md +141 -47
  378. package/skills/synap/escalation-ladder.md +20 -10
  379. package/skills/synap/focus-sessions.md +47 -21
  380. package/skills/synap/from-intent.md +142 -0
  381. package/skills/synap/governance-rules.md +4 -4
  382. package/skills/synap/governance.md +10 -7
  383. package/skills/synap/hand-off.md +33 -0
  384. package/skills/synap/inline-patterns.md +15 -7
  385. package/skills/synap/lenses.md +33 -15
  386. package/skills/synap/linking.md +41 -40
  387. package/skills/synap/mcp-remote-servers.md +64 -0
  388. package/skills/synap/mental-model.md +24 -22
  389. package/skills/synap/multi-entity-capture.md +6 -4
  390. package/skills/synap/operating-mode-rules.md +1 -1
  391. package/skills/synap/processes.md +118 -0
  392. package/skills/synap/quick-reference.md +5 -1
  393. package/skills/synap/reading.md +3 -1
  394. package/skills/synap/reflexes.md +12 -42
  395. package/skills/synap/viewframe-cells.md +38 -5
  396. package/skills/synap/work-flow.md +1 -1
  397. package/skills/synap/work-model.md +96 -0
  398. package/skills/synap/worked-examples.md +21 -1
  399. package/skills/synap/workspace-design.md +14 -10
  400. package/skills/synap/writes.md +165 -35
  401. package/skills/synap/writing-titles.md +63 -0
  402. package/skills/synap-app/SKILL.md +319 -0
  403. package/skills/synap-app/_order.txt +5 -0
  404. package/skills/synap-app/_skill.yaml +20 -0
  405. package/skills/synap-app/creating-the-base-app.md +64 -0
  406. package/skills/synap-app/governance.md +42 -0
  407. package/skills/synap-app/install-commands.md +55 -0
  408. package/skills/synap-app/overview.md +50 -0
  409. package/skills/synap-app/using-the-sdk.md +73 -0
  410. package/skills/synap-design/SKILL.md +474 -0
  411. package/skills/synap-design/_order.txt +4 -0
  412. package/skills/synap-design/_skill.yaml +21 -0
  413. package/skills/synap-design/loop.md +134 -0
  414. package/skills/synap-design/overview.md +44 -0
  415. package/skills/synap-design/principles.md +130 -0
  416. package/skills/synap-design/system.md +133 -0
  417. package/skills/synap-market/SKILL.md +625 -0
  418. package/skills/synap-market/_order.txt +5 -0
  419. package/skills/synap-market/_skill.yaml +24 -0
  420. package/skills/synap-market/author-and-publish.md +212 -0
  421. package/skills/synap-market/discover-and-fetch.md +59 -0
  422. package/skills/synap-market/governance-and-catalog.md +63 -0
  423. package/skills/synap-market/install.md +133 -0
  424. package/skills/synap-market/overview.md +119 -0
  425. package/skills/synap-schema/SKILL.md +172 -10
  426. package/skills/synap-schema/_order.txt +2 -0
  427. package/skills/synap-schema/_skill.yaml +4 -2
  428. package/skills/synap-schema/common-mistakes.md +4 -2
  429. package/skills/synap-schema/discover-profiles.md +1 -1
  430. package/skills/synap-schema/entity-scope.md +15 -3
  431. package/skills/synap-schema/extend-first.md +29 -0
  432. package/skills/synap-schema/extend-vs-create.md +1 -1
  433. package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
  434. package/skills/synap-schema/property-types.md +1 -1
  435. package/skills/synap-schema/relations.md +1 -1
  436. package/skills/synap-ui/SKILL.md +19 -12
  437. package/skills/synap-ui/_skill.yaml +1 -1
  438. package/skills/synap-ui/ai-companion.md +1 -1
  439. package/skills/synap-ui/arranging-bento.md +2 -0
  440. package/skills/synap-ui/bento-layouts.md +10 -10
  441. package/skills/synap-ui/bento-recipes.md +313 -543
  442. package/skills/synap-ui/four-builds.md +5 -0
  443. package/skills/synap-ui/view-types.md +2 -2
  444. package/skills/synap-ui/widget-catalog.md +22 -278
  445. package/templates/automations/bookmark-enrichment.automation.json +290 -13
  446. package/templates/automations/url-bookmark-capture.automation.json +73 -11
  447. package/templates/skills/authoring-playbooks/SKILL.md +6 -3
  448. package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
  449. package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
  450. package/dist/commands/infra.d.ts +0 -21
  451. package/dist/commands/infra.js +0 -262
  452. package/dist/commands/infra.js.map +0 -1
  453. package/dist/lib/browser-auth.d.ts +0 -35
  454. package/dist/lib/browser-auth.js +0 -170
  455. package/dist/lib/browser-auth.js.map +0 -1
  456. package/dist/lib/openclaw.d.ts +0 -32
  457. package/dist/lib/openclaw.js +0 -164
  458. package/dist/lib/openclaw.js.map +0 -1
  459. package/dist/lib/seed.d.ts +0 -13
  460. package/dist/lib/seed.js +0 -135
  461. package/dist/lib/seed.js.map +0 -1
@@ -0,0 +1,625 @@
1
+ ---
2
+ name: synap-market
3
+ description: >
4
+ Use this skill when the user (or an agent driving the CLI/MCP/HTTP) wants to
5
+ DISCOVER, INSTALL, or AUTHOR/PUBLISH marketplace & template data on Synap —
6
+ workspace templates, capabilities, automations, and cells. Triggers: "find a
7
+ template for X", "is there a marketplace package for Y", "install this
8
+ template/capability", "create a new template", "publish this as a
9
+ workspace/capability", "scaffold a template", "share my workspace as a
10
+ template", "make this private/public". NOT the `synap` skill (capture/recall
11
+ data INSIDE a workspace) nor `synap-schema` (extending the data model of an
12
+ existing workspace) nor `synap-ui` (building views/dashboards) — this skill is
13
+ about the PACKAGE layer: finding, installing, and publishing reusable
14
+ templates/capabilities/automations/cells to/from the Control Plane catalog.
15
+ metadata:
16
+ synap:
17
+ requires:
18
+ env: []
19
+ optional_env: [SYNAP_POD_URL, SYNAP_WORKSPACE_ID, SYNAP_HUB_API_KEY]
20
+ primaryEnv: null
21
+ homepage: https://synap.live
22
+ capabilities:
23
+ [market-search, market-install, template-author, template-publish]
24
+ os: [macos, linux, windows]
25
+ userInvocable: true
26
+ ---
27
+
28
+ # Marketplace & templates on Synap
29
+
30
+ Synap is **configuration-first**: a feature is _stored, user-editable config_
31
+ published to one catalog and installed through shared substrate — not hardcoded in
32
+ the pod backend. The marketplace is that **package layer**, and the catalog
33
+ (`synap_packages`) is **kind-agnostic** — one door serves every kind:
34
+
35
+ | Kind | Configures | Standalone install (via `applyMarketInstall`) |
36
+ | ------------------------- | ---------------------------------------------------------------- | -------------------------------------------------- |
37
+ | **workspace** | a whole domain (profiles + views + bento + its caps/automations) | ✅ `createWorkspaceFromDefinitionIdempotent` |
38
+ | **capability** | a credentialed tool pack (+ embedded skills/playbooks) | ✅ `createCapabilityFromDefinition` |
39
+ | **cell** | a renderer — the code that draws an entity/widget | ✅ `installCellFromDefinition` (needs a cache row) |
40
+ | **view** | a saved view/layout | ✅ `viewsRouter.create` (needs a `workspaceId`) |
41
+ | **skill** | agent know-how | ✅ `skillsRouter.create` (pod-wide if no ws) |
42
+ | **workflow / automation** | a WHEN→ACTION flow | ✅ `automationsRouter.create` into acting ws |
43
+
44
+ **All six kinds install standalone today** through the ONE apply core
45
+ `applyMarketInstall` (`services/capabilities/marketplace-install.ts`) — the same
46
+ governed door `market.install` and the `capability.install` proposal executor share,
47
+ each reusing the kind's _governed_ router caller (zero duplicated insert logic). The
48
+ remaining gaps are NOT install: (1) **private-package sync is unauthenticated**, so a
49
+ private package can't reach a pod yet (see `governance-and-catalog.md` / RC4); (2)
50
+ standalone **view / skill / automation stamp no source-link**, so they don't self-heal
51
+ via reconcile the way workspace/capability do. (Subscription-`tier` gating is a
52
+ separate axis — see `governance-and-catalog.md`.)
53
+
54
+ **Words** (template, pack, workspace/work/track/rule template) are defined once
55
+ in the `synap` skill's `concepts` topic. In short: a template's kind is DERIVED
56
+ from its content (a playbook with `scope: "project"` is a track template, the
57
+ default `scope: "session"` a work template), never declared.
58
+
59
+ **A pack is not a seventh kind.** Today it ships as a **suite**: a `workspace`
60
+ package tagged `suite` that `require`s its constituent workspaces, built from a
61
+ live project with `synap market publish --from-project <id>`, and installed
62
+ with `--project <id>` to link every workspace to that project. See
63
+ `install.md` → "Project packs". The model it is moving to: a pack lists the
64
+ workspace templates it depends on and installs the missing ones, and never
65
+ creates a workspace of its own.
66
+
67
+ It lives in the Control Plane (CP) catalog and is discoverable and installable from
68
+ any door: the `synap` CLI, MCP (`market_search` / `run_capability`), or the Hub REST
69
+ API. **Everything that is config, not code, can be a template** — workspaces, entity
70
+ profiles/views, renderers (cells), capabilities, skills, automations.
71
+
72
+ ## The authoring order — bottom-up, ALWAYS
73
+
74
+ Everything installable is a **standalone package**, and packages form a graph: a
75
+ bigger one **declares `dependencies[]`** on smaller ones, and the pod installs the
76
+ missing ones in the same governed pass. So author from the SMALLEST piece up:
77
+
78
+ 1. **Basic objects** — entity types (profiles), **skills**, capabilities, cells,
79
+ views, workflow/automations. Each is publishable on its OWN and is useful before
80
+ any container exists. A skill package is one skill: its documentation or code.
81
+ 2. **Containers** — a **space** (a `workspace` template) that declares
82
+ `dependencies[]` on the basic objects it needs, and activates its skills with a
83
+ `skills:` block.
84
+ 3. **Compositions** — a **project / suite** ("truck") that `require`s the spaces.
85
+
86
+ Publish the small pieces FIRST, then the space, then install. Nothing in the chain
87
+ waits on a container.
88
+
89
+ **The two verbs are different, and confusing them is the classic mistake:**
90
+
91
+ - `dependencies[]` = what gets **INSTALLED** — the pod materialises the package if
92
+ it is not already there (idempotent; a second pass reports `found`).
93
+ - `skills:` inside a template = what gets **LINKED** to that space, and in which
94
+ mode (`always` / `on-demand`). It names a skill some `dependencies[]` entry —
95
+ usually its own — already installed. Declaring the link without the dependency
96
+ installs cleanly and links NOTHING.
97
+
98
+ **Never inline what is already a package.** Copying a skill's text into a template,
99
+ or re-declaring a profile set that ships as a dependency, forks the thing and stops
100
+ it converging. Depend on it; let the install bring it. And **never** seed a skill
101
+ into the backend (`skills/synap/…`) to make a template resolve — that directory is
102
+ not the marketplace. Publish it as a package.
103
+
104
+ ## The two reflexes
105
+
106
+ 1. **DISCOVER before you invent.** Before scaffolding a new template or
107
+ capability, search the catalog — `synap market --search "<query>"` or the
108
+ `market.search` verb. Someone may have already published what you need.
109
+ Reinventing a workspace that already exists as a template is wasted work
110
+ AND fragments the catalog.
111
+ 2. **One catalog, never a second one.** Every package — public or private —
112
+ lives in the CP's `synapPackages` table, reached through
113
+ `GET/POST /api/packages`. There is no side channel: don't write a
114
+ template to a random file and call it "published," and don't stand up a
115
+ local list of "known templates" — search the real catalog every time.
116
+
117
+ ## The four things this skill teaches
118
+
119
+ | Task | Doc |
120
+ | --------------------------------------------------------- | --------------------------- |
121
+ | Search/browse/fetch a package (any kind) | `discover-and-fetch.md` |
122
+ | Install a package into a pod | `install.md` |
123
+ | Author a new template and publish it (the ONE write door) | `author-and-publish.md` |
124
+ | Governance rules + the one-catalog principle | `governance-and-catalog.md` |
125
+
126
+ ## Package kinds
127
+
128
+ - **workspace / template** — a full workspace definition (profiles, views,
129
+ entity links) you can spin up as a new workspace, or reconcile onto an
130
+ existing one.
131
+ - **capability** — a tool + skill bundle (an integration or verb pack).
132
+ - **automation** — a trigger + action definition.
133
+ - **cell** — a custom UI renderer.
134
+
135
+ The CLI's browse filter (`market --type`) uses
136
+ `workspace|capability|skill|workflow|view|cell`; the pod-native install verb
137
+ (`market.install`) and its catalog use the narrower
138
+ `capability|automation|template|cell` (`template` there means a workspace template). Match
139
+ whichever surface you're calling.
140
+
141
+ ## Visibility
142
+
143
+ Every package is **public** or **private** (owner-only). Default on publish is
144
+ **private** — you opt in to sharing with `--public`. A private package 404s
145
+ (not 403) to anyone who isn't its author or an active member of its owning pod
146
+ — see `governance-and-catalog.md`.
147
+
148
+ ---
149
+
150
+ # Discover & fetch
151
+
152
+ Three doors reach the same catalog. Pick the one that matches where you're
153
+ running.
154
+
155
+ ## CLI — `synap market`
156
+
157
+ ```bash
158
+ synap market # browse/list (the default action)
159
+ synap market --search "crm" # filter by name/description/slug
160
+ synap market --type capability # filter by type: workspace|capability|skill|workflow|view|cell
161
+ synap market --search "crm" --type workspace --json
162
+ ```
163
+
164
+ `market` with no subcommand lists; `--list` is accepted explicitly too. It
165
+ merges: your OWN packages (public + private, via `GET /api/packages/mine`)
166
+ with the PUBLIC catalog (`GET /api/packages`) — logged out, you only see the
167
+ public/bundled set.
168
+
169
+ Companion commands:
170
+
171
+ ```bash
172
+ synap market installed # what's already installed on THIS pod (pure read)
173
+ synap market installed --tree # composition graph: package → templates → workspaces
174
+ synap market update # check installed packages for drift against the catalog
175
+ ```
176
+
177
+ ## Pod verb — `market.search` (MCP / agent / automation)
178
+
179
+ The pod-native verb, run via MCP `run_capability` or
180
+ `POST /api/hub/capabilities/execute` with `{ verbId: "market.search", parameters }`:
181
+
182
+ ```json
183
+ { "query": "crm", "kind": "template", "limit": 20 }
184
+ ```
185
+
186
+ - `kind` ∈ `capability | automation | template | cell` (omit to search all).
187
+ - Reads the pod-local `cp_catalog_cache` — fast, no live CP round-trip.
188
+ - Returns `{ entries: [{ slug, kind, name, description, version, tier, installed }], count }`.
189
+ - `installed` is `true`/`false` for capability/cell (cheap natural-key check);
190
+ `undefined` for automation/template — that's an HONEST unknown, not a bug,
191
+ never read it as "not installed."
192
+ - Empty result → say so plainly ("nothing matched") — never fabricate a
193
+ package that doesn't exist. Offer to capture the gap as a note for later.
194
+
195
+ This is the verb an agent should reach for first — it's read-only (auto-runs,
196
+ no approval needed) and mirrors exactly what `synap market --search` shows a
197
+ human.
198
+
199
+ ## Fetching one package's full definition
200
+
201
+ - **CLI (authoring path):** `synap market publish --from-workspace <id>` reads
202
+ a LIVE workspace via the pod's own `to-template` serializer — see
203
+ `author-and-publish.md`.
204
+ - **CP directly:** `GET /api/packages/:slug` returns the full row **with**
205
+ `definition` — the install payload. Auth is required to see a private
206
+ package (author-only). No auth → public only, and a private slug 404s.
207
+ - **From an install:** you don't normally need the definition yourself —
208
+ `market.install` (see `install.md`) resolves and applies it for you.
209
+
210
+ ---
211
+
212
+ # Install
213
+
214
+ ## CLI — `synap market install <slug>`
215
+
216
+ ```bash
217
+ synap market install crm # install as a new workspace
218
+ synap market install crm --dry-run # preview: would-create / reuse / conflicts, writes nothing
219
+ synap market install crm --onto <workspaceId> # reconcile ONTO an existing workspace (additive)
220
+ synap market install crm --project <id> # link the installed workspace(s) to an EXISTING project (id only)
221
+ ```
222
+
223
+ Installs are **workspace-first**: a `workspace`/`template` package spins up
224
+ (or reconciles onto) a workspace directly. Other package types (capability,
225
+ automation, cell) route you to the right surface (`synap capability add`,
226
+ etc.) rather than being force-fit into a workspace install.
227
+
228
+ **One space per domain:** A space is a domain, installed once (Content, Brand, CRM…). A project is a filter across spaces. To make something “for project X”: file it into X inside the domain's space (`file_into_project`), and link X to the space (`project_use_workspace`). Never create a space named after a project, a brand or a client. Reinstalling reuses the live space. A template is installed **once per pod**, and a space name is held by **one** active space — whoever owns it, human or agent alike: a second copy is refused (`409` — `status: "exists"` + the space to use, or `WORKSPACE_IDENTITY_CONFLICT` naming the space that holds it). There are no named copies: `--as <name>` / `instanceName` answers `400`, and a package with no `_meta.slug` (and no `--onto` target) answers `400` instead of minting a second space.
229
+
230
+ ## Pod verb — `market.install` (MCP / agent / automation)
231
+
232
+ ```json
233
+ { "slug": "crm", "kind": "template", "version": "optional", "params": {} }
234
+ ```
235
+
236
+ `kind` ∈ `capability | automation | template | cell` — required, unlike
237
+ `market.search`.
238
+
239
+ **This verb ALWAYS mutates**, so it goes through the full permission gate —
240
+ never treat a non-"installed" response as failure:
241
+
242
+ - **Operator call** (no agent identity — e.g. you're driving the CLI as the
243
+ pod owner): executes directly → `{ status: "installed", result }`.
244
+ - **Agent call** (any MCP/automation/agent-key caller): ALWAYS proposes,
245
+ regardless of any standing grant on `market.install` itself — a grant on
246
+ the verb governs _invoking_ it, not the provisioning it performs. Response:
247
+ `{ status: "proposed", proposalId, reviewUrl }`.
248
+
249
+ **`"proposed"` is success, not an error.** Surface `reviewUrl` to the user so
250
+ they can approve it — don't retry, don't report it as a failure. See
251
+ `governance-and-catalog.md`.
252
+
253
+ ## Project packs — a suite of workspaces, linked to a project
254
+
255
+ A **project** is a cross-cutting lens over workspaces, not a package kind. A
256
+ "project pack" is a **suite**: an ordinary `workspace`-category package tagged
257
+ `suite`, whose `dependencies[]` **`require`** each constituent workspace package
258
+ (never `compose` — re-applying must not duplicate workspaces). Installing a
259
+ suite installs every constituent workspace (idempotent: reused if present).
260
+
261
+ **Author one from a live project** — never hand-write the suite:
262
+
263
+ ```bash
264
+ synap market publish --from-project <projectId> # publishes the constituents first, then the thin suite
265
+ ```
266
+
267
+ (Agent door: `export_project_pack` returns `{ definition, constituents }` —
268
+ publish the constituents before the suite so every `require` resolves.)
269
+
270
+ **Install onto a project.** The install never needs to know why the project
271
+ exists — it installs the workspaces and LINKS them (a `project --uses-->
272
+ workspace` edge per workspace, plus seeded entities filed into the project):
273
+
274
+ ```bash
275
+ synap market install <suite-slug> --project <projectId> # EXISTING project id only; errors if not found
276
+ ```
277
+
278
+ The CLI has no flag that creates a project. Create the project first:
279
+
280
+ - **A human**: in the app, or by passing `projectName` on the Hub door
281
+ `POST /api/hub/packages/apply` (mints or reuses by exact name).
282
+ - **An agent**: `create_project` requires `evidenceEntityIds` — at least 5
283
+ existing entities that belong to it — or it is REJECTED (not proposed).
284
+ Without that evidence, ask the human to create the project, then install with
285
+ its id.
286
+ - **An agent calling `market.install` with `projectName`**: the install becomes
287
+ a proposal that carries the name, and when a human approves it the project is
288
+ minted. The approval is the consent — say so when you propose it.
289
+
290
+ Two packs on one project = install each with the same `--project <id>`. Each
291
+ lands its own workspaces; both link to the project. Only ONE `compose`
292
+ dependency is allowed per package, at every level.
293
+
294
+ **The brief comes with the workspaces.** A workspace package's `onboarding` is
295
+ the space's BRIEF — steady state (`purpose`, `framing`, `expertise`, `anchors`,
296
+ `fetch`) plus its onboarding mode (`goal`, `collect`, `openingQuestions`,
297
+ `doneWhen`) — stored on that workspace's `settings.onboarding`; the package's
298
+ top-level `rules[]` install as the space's rules. A template update reaches an
299
+ installed space without overwriting what its owner edited (conflicts are
300
+ reported), and `synap_update_space_brief` proposes a change. The `onboard` skill runs the
301
+ interview when a lens is empty; for a project spanning several workspaces it
302
+ sets up one workspace's slice at a time, each entity filed into the project.
303
+ There is no project-level recipe — the recipe always lives on a workspace. A
304
+ journey completes by itself once the lens holds real data.
305
+
306
+ ## Idempotency by kind
307
+
308
+ - **capability** — natural key is `(name, workspaceId)`; installing twice
309
+ converges, doesn't duplicate.
310
+ - **template/workspace** — keyed by `packageSlug`/`proposalId` (both set to
311
+ the catalog slug); re-installing the same template for the same user
312
+ converges to the existing workspace rather than creating a second one.
313
+ - **automation** — pre-checked by `(name, workspace)` before creating.
314
+ - **cell** — keyed by `(typeKey, workspaceId)`.
315
+
316
+ ## Template updates — where a space stands, and whose step it is
317
+
318
+ Read it with MCP `synap_template_health` (or `synap templates` in a terminal).
319
+ Each space's row says what is left to do; act on these fields, not on
320
+ `drifted` alone (`drifted: true` means "there is a step", not "apply now"):
321
+
322
+ | Field | Means | Your move |
323
+ |---|---|---|
324
+ | `state: "active"`, `drifted: true` | a newer version is out | the update path below |
325
+ | `state: "awaiting-approval"` + `awaitingApproval: [ids]` | the last update filed proposals | point the person to them; **do not re-apply** |
326
+ | `state: "partial"` / `"layer-2-not-run"` / `"failed"` | the last update did not finish | `synap templates update <slug>` finishes it |
327
+ | `pendingDataChanges: {count, sentences, needsPodAdmin}` | the update changes existing data and waits for a **person** to agree | tell them the sentences; they run `synap templates update <slug>` themselves (a pod owner/admin when `needsPodAdmin`) |
328
+ | `updateProposal: {id}` | an update of this space is already proposed | point the person to that proposal; **never file another** |
329
+ | `applyWarning` | the pod's one sentence for what is left | relay it as is |
330
+
331
+ The update path is `synap templates update <slug>` (the person's door). Run
332
+ with an agent key it becomes a proposal the person approves. **Agreeing to data
333
+ changes is never an agent's**: the door answers `409
334
+ DATA_CHANGES_NEED_CONSENT` with `needsPerson: true` for any agent, whatever it
335
+ lists in `acceptDataChanges`. The version stamp (`settings.template.version`) is
336
+ written only when an update converged, so a space never reads "up to date" over
337
+ an update that did not land.
338
+
339
+ ## Locked / tier-gated packages
340
+
341
+ A package can declare a `requiredTier`. Installing one your account's plan
342
+ doesn't cover fails a pre-check (`assertPackageTierAccess`) BEFORE any
343
+ proposal or provisioning — tell the user which tier is required rather than
344
+ retrying.
345
+
346
+ ---
347
+
348
+ # Author & publish — the ONE write door
349
+
350
+ Every kind (workspace, capability, cell, view, …) publishes through the SAME door:
351
+ `POST /api/packages` → `publishPackageCore`. `synap market <verb>` is the CLI front
352
+ end (human, or an AI driving the CLI on the user's behalf — always say what you ran).
353
+
354
+ **Two distinct AI paths — don't conflate them:**
355
+
356
+ - **Publish to the MARKET (the shared catalog)** = human / CLI / browser only.
357
+ Publishing a template to the CP catalog needs the user's CP session; an agent
358
+ in the pod holds no CP credential (founder-gated trust boundary). So an agent
359
+ _authors + drives the CLI_, or the user publishes from the browser wizard.
360
+ - **Author + PROPOSE an install** = agents CAN do this natively. The IS tool
361
+ **`propose_workspace_template`** authors a full workspace definition and routes it
362
+ through the pod's governed `/packages/apply` → a **reviewable proposal** carrying
363
+ the whole definition (the user sees a live preview and approves). This is NOT a
364
+ market publish — it installs the AI-authored template into the user's pod, governed.
365
+ Use it when the user wants a whole workspace set up as a reviewable proposal.
366
+
367
+ **One space per domain:** A space is a domain, installed once (Content, Brand, CRM…). A project is a filter across spaces. To make something “for project X”: file it into X inside the domain's space (`file_into_project`), and link X to the space (`project_use_workspace`). Never create a space named after a project, a brand or a client.
368
+
369
+ ## The loop
370
+
371
+ ```bash
372
+ synap market scaffold my-thing # writes my-thing.template.yaml (refuses to overwrite)
373
+ # ...edit the file...
374
+ synap market validate my-thing.template.yaml
375
+ synap market publish my-thing.template.yaml # PRIVATE by default
376
+ synap market publish my-thing.template.yaml --public # opt in to sharing
377
+ ```
378
+
379
+ ### `scaffold <slug>`
380
+
381
+ Writes a minimal valid `<slug>.template.yaml` — `meta` (slug/name/description/
382
+ icon/color), `workspace` (name/description), and one starter profile. Refuses
383
+ to clobber an existing file — create-then-configure, never silently overwrite
384
+ an author's work.
385
+
386
+ ### `validate <file>`
387
+
388
+ Runs the ONE shared validator (`validateTemplate` from
389
+ `@synap-core/workspace-templates`) locally — fast feedback before any network
390
+ call. Fix every reported error before publishing; the CP re-runs the same
391
+ class of check server-side and will reject an invalid definition (400).
392
+
393
+ ### `publish [file]`
394
+
395
+ ```bash
396
+ synap market publish [file] [--public|--private] [--from-workspace <id>] [--json]
397
+ ```
398
+
399
+ - Validates first — a failing template is never published.
400
+ - Default is **private**; pass `--public` to share. `--private` is accepted
401
+ explicitly if a script wants to state intent.
402
+ - `--from-workspace <id>` serializes a LIVE, already-built workspace into a
403
+ template via the pod's own `POST /workspaces/:id/to-template` door, then
404
+ publishes that — the fastest way to turn something you already built into a
405
+ reusable package. It runs through the SAME validator as a hand-authored file.
406
+ - Writes go to `POST /api/packages` (upsert by `(slug, authorId)`; version is
407
+ a content hash, so republishing identical content is a safe no-op — you'll
408
+ see `outcome: "no-op"` vs `"created"`/`"updated"`).
409
+ - Slugs `foundation`, `crm`, `operations`, `content-os`, `enterprise-os`,
410
+ `research-base` are reserved bedrock templates — publishing under one of
411
+ those 403s; pick a different slug.
412
+
413
+ ### Standalone non-workspace kinds (`--kind`)
414
+
415
+ A lone **cell** (a renderer — the code that draws an entity/widget) or **view** can
416
+ be authored + published on its own, same door:
417
+
418
+ ```bash
419
+ synap market scaffold --kind cell my-card # → my-card.cell.json {category, slug, displayName, definition}
420
+ # edit the cell's code/definition
421
+ synap market publish my-card.cell.json # category:"cell", same publish client
422
+ ```
423
+
424
+ `--kind view` works the same, and so does **`--kind skill`** — a skill ships as its
425
+ own package now:
426
+
427
+ ```bash
428
+ synap market scaffold --kind skill my-method # → my-method.skill.json
429
+ # definition.skill = { slug, name, kind: "instruction"|"code", body | code, … }
430
+ synap market publish my-method.skill.json
431
+ ```
432
+
433
+ Author a skill a template needs as its OWN package, never nested inside a
434
+ capability (the nested form still exists for a capability's own verbs, but it is
435
+ not how a space gets a skill). The `slug` is the skill's `load_skill` ref and
436
+ **cannot start with `system/`** — that namespace is reserved for seeded skills.
437
+
438
+ The door is category-gated: only `category:"workspace"` runs the WorkspaceYaml
439
+ validator + lossless normalization; every other kind is stored pod-native as-is (a
440
+ capability/cell/skill is NOT a WorkspaceYaml). A `category:"skill"` publish must
441
+ carry a non-empty `definition.skill` with documentation or code — the pod refuses a
442
+ bodiless skill at install, so the CP refuses it at publish.
443
+
444
+ ### Compose — ship a whole stack in one install
445
+
446
+ A template declares `dependencies[]` (`{kind, relation: compose|require}`) so
447
+ installing it installs its whole stack in one governed pass. The resolver
448
+ materializes **workspace / capability / cell / skill** dependencies today;
449
+ **view and workflow are accepted and composable but not yet installed
450
+ standalone** (pending appliers) — so a space can ship its cells + capabilities +
451
+ skills + a base workspace as ONE install. Compose, don't inline.
452
+
453
+ Author these BOTTOM-UP: publish the skill/cell/capability first, then the template
454
+ that requires it. `dependencies[]` is the INSTALL; the template's own `skills:`
455
+ block is the LINK to the space (and its mode). A link with no matching dependency
456
+ installs cleanly and links nothing — silently, because a missing dependency is
457
+ non-fatal by design (`required-absent` in the resolver's report, which you should
458
+ read rather than assume).
459
+
460
+ ### `unpublish <slug>`
461
+
462
+ Flips a published package back to private (owner-only). ⚠️ Known gap: the CP's
463
+ PATCH validator doesn't yet accept `isPublic` on every deploy — if it 400s,
464
+ that's a server-side TODO, not something to work around; report it honestly.
465
+
466
+ ## Server-side validation scope (important honesty note)
467
+
468
+ `POST /api/packages` validates **self-contained** templates (no `dependencies`
469
+ declared) with the full referential-integrity check (dangling profile refs in
470
+ views/entityLinks, missing view scope, entityLink predicates). A template that
471
+ **declares `dependencies`** (compose/require another template) passes through
472
+ this HTTP door **without** that validation — composition-aware server-side
473
+ validation is not yet wired for ad-hoc publishes (official templates are
474
+ validated corpus-wide from their YAML by the official publish
475
+ (`synap market publish --official`) before it posts). Don't claim a composed publish was fully validated; say what actually ran.
476
+
477
+ **Official templates — ONE catalog, ONE writer.** Every official template, of
478
+ every kind, lives in ONE catalog package: `synap-app/packages/workspace-templates/`
479
+ (npm `@synap-core/workspace-templates`; a rename to `packages/catalog` /
480
+ `@synap-core/catalog` is planned, not done). By kind: workspaces in `src/*.yaml`,
481
+ then `capabilities/`, `skills/`, `packs/`, `automations/`. Each file is one manifest
482
+ `{apiVersion: synap/v1, kind, meta, spec, dependencies}`. Its `README.md` is the
483
+ how-to. It has ONE writer: `synap catalog publish --official [--kind k] [slug...]`.
484
+ That is the founder's command: its `synap login` session must own the
485
+ `synap-official` vendor. It refuses a non-official account before the preview,
486
+ validates the whole corpus, previews the diff against the live catalog, and asks
487
+ before writing; `--dry-run` previews only. `synap market publish --official` is
488
+ its alias for `--kind workspace`. Both go through the ONE lib
489
+ `scripts/catalog-lib.mjs` → `POST /api/packages` (`publishPackageCore`).
490
+ `synap catalog validate|diff` are the read-only verbs. `scripts/publish-official.mjs`
491
+ is only the CI wrapper (`publish-official-templates.yml`): a read-only preview on
492
+ PRs, and on main a live publish of the kinds in `SYNAP_CATALOG_LIVE_KINDS` (default
493
+ `workspace`). The CP never reseeds on deploy, neither templates nor capabilities.
494
+ `seed-templates.ts` and `seed-capability-templates.ts` are insert-only, by-hand
495
+ bootstraps for an empty CP. A catalog change reaches pods only when that publish
496
+ runs. A CP-door change ships CP-deploy first, then publish.
497
+ `definition.sourcePackage` (the `mergeCatalog` winner signal) is official-only:
498
+ the CP rejects it (403) from any other publisher, so never put it in an ad-hoc
499
+ package. Official capability keys are reserved: an ad-hoc publish of a capability
500
+ whose slug or `capability.key` matches an official one gets 409
501
+ `OFFICIAL_CAPABILITY_KEY_RESERVED`. Pick your own key. Never pass the official
502
+ `vendorId` to `market_publish` or publish an official slug ad-hoc — official
503
+ content is authored in the catalog and published by the human with
504
+ `synap catalog publish --official`.
505
+
506
+ ## Writing a process (a playbook that follows a kind's lifecycle)
507
+
508
+ The status belongs to the **kind or role**, never to a playbook. Its profile declares the lifecycle ONCE, in its
509
+ template:
510
+
511
+ ```yaml
512
+ lifecycle:
513
+ property: post-status
514
+ options:
515
+ - { key: Idea, category: open }
516
+ - { key: Published, category: done }
517
+ - { key: Archived, category: lost, humanOnly: true }
518
+ ```
519
+
520
+ Every option has one category (`open · active · paused · done · lost`); rules read the category, names stay free.
521
+ `humanOnly` marks an option no agent sets; an agent's move into `done` or `lost` proposes. Every move goes through
522
+ the one status door (`moveStatus`; an agent sends `update_entity` with `expectedStatus`).
523
+
524
+ A playbook that works that lifecycle is a **process**: it FOLLOWS it. Its stages name options of it, its workers
525
+ start on it, and a person decides at the moments that commit the business. It never keeps a second status field.
526
+ The reference is Content OS "Produce Content" (`synap-app/packages/workspace-templates/src/content-os.yaml`).
527
+
528
+ **Official vs pod-local.** An official template or capability lives ONLY in the catalog
529
+ (`synap-app/packages/workspace-templates/`, by kind) and is published with
530
+ `synap catalog publish --official` (CI on main). A playbook, kind or automation an agent creates on a pod
531
+ (`synap_create_playbook`, `synap_define_kind`, …) is **pod-local**: it never reaches the catalog. To make it
532
+ official, write it into the catalog file and publish.
533
+
534
+ | Field | Where | Rule |
535
+ | ------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
536
+ | `subjectProfile.profileSlug` | playbook | The kind or role the process works. |
537
+ | `subjectProfile.statusProperty` | playbook | Omit it: the pod follows the profile's declared lifecycle. If you name it, name that same property. A status worker on a role with no declared lifecycle is refused. |
538
+ | `stages[].subjectStatus` | stage | Entering the stage moves the subject to this option, through the door. Must be an **existing option** of the lifecycle — never invent one. |
539
+ | `stages[].gate` | stage | `{kind: human}` at every commitment: send to a client, sign, pay, publish, won/lost, anything irreversible. `{kind: check}` only where the stage's own criteria can be verified. A gated stage writes its status only when the gate passes. A check gate judges the stage being LEFT, so never use it to guard an irreversible status. |
540
+ | `stages[].onFail` | stage | `{toStage: <key>}` — where a rejected gate sends the run (rework loop). |
541
+ | `stages[].criteria` | stage | 2–5 binary statements; `check.kind` evidence (cheapest) · capability · judge · human. |
542
+ | `expectedOutputs[]` | stage or playbook | What the step must produce: `kind` + `label` + `relationToSubject` (an existing relation slug, or `none`). The UI shows what was produced from this. |
543
+ | `activators[]` (workers) | playbook | `on`: `created` · `enters_status` (+ `status`) · `count` (+ `status`, `min` ≥ 2) · `schedule` (+ `cron`, UTC) · `manual`. `size`: `per_thing` (default) · `per_moment` (count and schedule always are). `mode`: `propose` (default) · `run` only when cheap and safe. `maxPendingApprovals` (default 20) throttles. Compiled to a governed rule the owner can pause; it fires once per thing per transition. |
544
+ | `humanOnlyStatuses` | playbook | Legacy: the options no stage owns. Mark a person-only option `humanOnly` on the lifecycle instead; while `statusProperty` is set, `synap catalog validate` still checks that stages and this list cover every option. |
545
+ | `goalTemplate` | playbook | Placeholders are `{paramName}`. Never `@{arg:…}` (read-only legacy). |
546
+ | `params` | playbook | The subject is a `type: entity` param. A required param left unanswered becomes a question owed by the person, not an empty string. |
547
+
548
+ Human moments use an `ask` on an owed slot: `confirm` / `choose` (one `recommended`) / `form` / `act` / `provide`
549
+ (connection, file or secret through the vault). Never ask for a secret in a form.
550
+
551
+ Validation: `synap catalog validate` (process contract, goal grammar, lifecycle coverage ratchet — the count of
552
+ lifecycle kinds with no process may only go down).
553
+
554
+ ## What you're producing
555
+
556
+ A `PackageDefinition`: `_meta` (slug/name/description/icon/color/tags),
557
+ `workspaceName`, `description`, `profiles`, `views`, `entityLinks`, optional
558
+ `dependencies`. The scaffolded YAML and `--from-workspace` both produce this
559
+ shape — never hand-write JSON against the raw DB row shape.
560
+
561
+ ---
562
+
563
+ # Governance & the one-catalog principle
564
+
565
+ ## Writes are governed — "proposed" is success
566
+
567
+ Every mutating marketplace action an AGENT takes (`market.install` above all)
568
+ can come back `{ status: "proposed", proposalId, reviewUrl }` instead of
569
+ `{ status: "installed" }`. That is the write queued for the pod owner's
570
+ review — like opening a PR, not a failure and not an error to retry. Always:
571
+
572
+ - Surface `reviewUrl` to the user.
573
+ - Don't retry the same install hoping for "installed" — it won't change the
574
+ outcome and may create a duplicate proposal.
575
+ - Remember an unreviewed proposal isn't live yet: `market.search`'s
576
+ `installed` flag and any downstream read won't reflect it until approved.
577
+
578
+ An OPERATOR-driven install (the pod owner themself, via CLI with their own
579
+ credentials, no agent identity) executes directly — no proposal. The
580
+ distinction is WHO is acting, not which door they used.
581
+
582
+ ## One catalog — never fork it
583
+
584
+ - The catalog is `synapPackages` in the Control Plane, reached through
585
+ `GET/POST/PATCH /api/packages*`. `cp_catalog_cache` on the pod is a
586
+ **read-through cache** of it (populated by sync), not a second source of
587
+ truth — never write to it directly, and never treat a cache miss as "the
588
+ package doesn't exist" without falling back to a live CP fetch (which
589
+ `market.install` already does for automation/template kinds).
590
+ - Discovery happens on the CP (`market.search`, `synap market`); apply
591
+ happens on the pod (`market.install`, workspace creation). Don't invent a
592
+ parallel "known templates" list anywhere else in a workflow you're
593
+ building — always search the real catalog.
594
+ - Publishing to anywhere other than `POST /api/packages` (e.g. hand-writing a
595
+ file and calling it "published," or registering a template only in a local
596
+ config) is NOT publishing — it produces something invisible to
597
+ `market.search` and every other consumer.
598
+
599
+ ## Visibility model
600
+
601
+ - **Public** (`isPublic: true`) — visible to everyone via `GET /api/packages`.
602
+ - **Private** (`isPublic: false`, the default) — visible only to its
603
+ `authorId` (and, for non-workspace categories, active members of an
604
+ `podId`-owned team). A private **workspace template** is stricter:
605
+ owner-only, full stop, even for pod teammates.
606
+ - A private package a caller can't see **404s, never 403s** — this is
607
+ deliberate (don't leak existence). If you get a 404 fetching a package by
608
+ slug, don't assume it never existed — it may just be private to someone
609
+ else.
610
+
611
+ ## Tier gating
612
+
613
+ A public package can declare `requiredTier`. `GET /api/packages/available`
614
+ tells an authed caller which tiered slugs their subscription actually
615
+ unlocks; a slug missing from that list but present in the browse catalog is
616
+ locked for them — `market.install` pre-checks this and fails before touching
617
+ governance, so surface the tier requirement rather than treating it as a
618
+ generic install error.
619
+
620
+ The **server pre-check is the authoritative floor** (`assertPackageTierAccess`,
621
+ wired at every install site). The browser UI is **display-only**: it threads
622
+ `requiredTier` through to a "requires <tier>" badge but does NOT hard-block, and
623
+ its lock/upgrade CTA only engages once a host wires a billing destination — so
624
+ don't add a UI-side gate expecting it to enforce anything, and don't rebuild the
625
+ badge thread (it exists). Full current-state: repo `TEMPLATE-DEV-GUIDE.md`.
@@ -0,0 +1,5 @@
1
+ overview.md
2
+ discover-and-fetch.md
3
+ install.md
4
+ author-and-publish.md
5
+ governance-and-catalog.md
@@ -0,0 +1,24 @@
1
+ name: synap-market
2
+ description: >
3
+ Use this skill when the user (or an agent driving the CLI/MCP/HTTP) wants to
4
+ DISCOVER, INSTALL, or AUTHOR/PUBLISH marketplace & template data on Synap —
5
+ workspace templates, capabilities, automations, and cells. Triggers: "find a
6
+ template for X", "is there a marketplace package for Y", "install this
7
+ template/capability", "create a new template", "publish this as a
8
+ workspace/capability", "scaffold a template", "share my workspace as a
9
+ template", "make this private/public". NOT the `synap` skill (capture/recall
10
+ data INSIDE a workspace) nor `synap-schema` (extending the data model of an
11
+ existing workspace) nor `synap-ui` (building views/dashboards) — this skill is
12
+ about the PACKAGE layer: finding, installing, and publishing reusable
13
+ templates/capabilities/automations/cells to/from the Control Plane catalog.
14
+ metadata:
15
+ synap:
16
+ requires:
17
+ env: []
18
+ optional_env: [SYNAP_POD_URL, SYNAP_WORKSPACE_ID, SYNAP_HUB_API_KEY]
19
+ primaryEnv: null
20
+ homepage: https://synap.live
21
+ capabilities:
22
+ [market-search, market-install, template-author, template-publish]
23
+ os: [macos, linux, windows]
24
+ userInvocable: true