@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,212 @@
1
+ # Author & publish — the ONE write door
2
+
3
+ Every kind (workspace, capability, cell, view, …) publishes through the SAME door:
4
+ `POST /api/packages` → `publishPackageCore`. `synap market <verb>` is the CLI front
5
+ end (human, or an AI driving the CLI on the user's behalf — always say what you ran).
6
+
7
+ **Two distinct AI paths — don't conflate them:**
8
+
9
+ - **Publish to the MARKET (the shared catalog)** = human / CLI / browser only.
10
+ Publishing a template to the CP catalog needs the user's CP session; an agent
11
+ in the pod holds no CP credential (founder-gated trust boundary). So an agent
12
+ _authors + drives the CLI_, or the user publishes from the browser wizard.
13
+ - **Author + PROPOSE an install** = agents CAN do this natively. The IS tool
14
+ **`propose_workspace_template`** authors a full workspace definition and routes it
15
+ through the pod's governed `/packages/apply` → a **reviewable proposal** carrying
16
+ the whole definition (the user sees a live preview and approves). This is NOT a
17
+ market publish — it installs the AI-authored template into the user's pod, governed.
18
+ Use it when the user wants a whole workspace set up as a reviewable proposal.
19
+
20
+ **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.
21
+
22
+ ## The loop
23
+
24
+ ```bash
25
+ synap market scaffold my-thing # writes my-thing.template.yaml (refuses to overwrite)
26
+ # ...edit the file...
27
+ synap market validate my-thing.template.yaml
28
+ synap market publish my-thing.template.yaml # PRIVATE by default
29
+ synap market publish my-thing.template.yaml --public # opt in to sharing
30
+ ```
31
+
32
+ ### `scaffold <slug>`
33
+
34
+ Writes a minimal valid `<slug>.template.yaml` — `meta` (slug/name/description/
35
+ icon/color), `workspace` (name/description), and one starter profile. Refuses
36
+ to clobber an existing file — create-then-configure, never silently overwrite
37
+ an author's work.
38
+
39
+ ### `validate <file>`
40
+
41
+ Runs the ONE shared validator (`validateTemplate` from
42
+ `@synap-core/workspace-templates`) locally — fast feedback before any network
43
+ call. Fix every reported error before publishing; the CP re-runs the same
44
+ class of check server-side and will reject an invalid definition (400).
45
+
46
+ ### `publish [file]`
47
+
48
+ ```bash
49
+ synap market publish [file] [--public|--private] [--from-workspace <id>] [--json]
50
+ ```
51
+
52
+ - Validates first — a failing template is never published.
53
+ - Default is **private**; pass `--public` to share. `--private` is accepted
54
+ explicitly if a script wants to state intent.
55
+ - `--from-workspace <id>` serializes a LIVE, already-built workspace into a
56
+ template via the pod's own `POST /workspaces/:id/to-template` door, then
57
+ publishes that — the fastest way to turn something you already built into a
58
+ reusable package. It runs through the SAME validator as a hand-authored file.
59
+ - Writes go to `POST /api/packages` (upsert by `(slug, authorId)`; version is
60
+ a content hash, so republishing identical content is a safe no-op — you'll
61
+ see `outcome: "no-op"` vs `"created"`/`"updated"`).
62
+ - Slugs `foundation`, `crm`, `operations`, `content-os`, `enterprise-os`,
63
+ `research-base` are reserved bedrock templates — publishing under one of
64
+ those 403s; pick a different slug.
65
+
66
+ ### Standalone non-workspace kinds (`--kind`)
67
+
68
+ A lone **cell** (a renderer — the code that draws an entity/widget) or **view** can
69
+ be authored + published on its own, same door:
70
+
71
+ ```bash
72
+ synap market scaffold --kind cell my-card # → my-card.cell.json {category, slug, displayName, definition}
73
+ # edit the cell's code/definition
74
+ synap market publish my-card.cell.json # category:"cell", same publish client
75
+ ```
76
+
77
+ `--kind view` works the same, and so does **`--kind skill`** — a skill ships as its
78
+ own package now:
79
+
80
+ ```bash
81
+ synap market scaffold --kind skill my-method # → my-method.skill.json
82
+ # definition.skill = { slug, name, kind: "instruction"|"code", body | code, … }
83
+ synap market publish my-method.skill.json
84
+ ```
85
+
86
+ Author a skill a template needs as its OWN package, never nested inside a
87
+ capability (the nested form still exists for a capability's own verbs, but it is
88
+ not how a space gets a skill). The `slug` is the skill's `load_skill` ref and
89
+ **cannot start with `system/`** — that namespace is reserved for seeded skills.
90
+
91
+ The door is category-gated: only `category:"workspace"` runs the WorkspaceYaml
92
+ validator + lossless normalization; every other kind is stored pod-native as-is (a
93
+ capability/cell/skill is NOT a WorkspaceYaml). A `category:"skill"` publish must
94
+ carry a non-empty `definition.skill` with documentation or code — the pod refuses a
95
+ bodiless skill at install, so the CP refuses it at publish.
96
+
97
+ ### Compose — ship a whole stack in one install
98
+
99
+ A template declares `dependencies[]` (`{kind, relation: compose|require}`) so
100
+ installing it installs its whole stack in one governed pass. The resolver
101
+ materializes **workspace / capability / cell / skill** dependencies today;
102
+ **view and workflow are accepted and composable but not yet installed
103
+ standalone** (pending appliers) — so a space can ship its cells + capabilities +
104
+ skills + a base workspace as ONE install. Compose, don't inline.
105
+
106
+ Author these BOTTOM-UP: publish the skill/cell/capability first, then the template
107
+ that requires it. `dependencies[]` is the INSTALL; the template's own `skills:`
108
+ block is the LINK to the space (and its mode). A link with no matching dependency
109
+ installs cleanly and links nothing — silently, because a missing dependency is
110
+ non-fatal by design (`required-absent` in the resolver's report, which you should
111
+ read rather than assume).
112
+
113
+ ### `unpublish <slug>`
114
+
115
+ Flips a published package back to private (owner-only). ⚠️ Known gap: the CP's
116
+ PATCH validator doesn't yet accept `isPublic` on every deploy — if it 400s,
117
+ that's a server-side TODO, not something to work around; report it honestly.
118
+
119
+ ## Server-side validation scope (important honesty note)
120
+
121
+ `POST /api/packages` validates **self-contained** templates (no `dependencies`
122
+ declared) with the full referential-integrity check (dangling profile refs in
123
+ views/entityLinks, missing view scope, entityLink predicates). A template that
124
+ **declares `dependencies`** (compose/require another template) passes through
125
+ this HTTP door **without** that validation — composition-aware server-side
126
+ validation is not yet wired for ad-hoc publishes (official templates are
127
+ validated corpus-wide from their YAML by the official publish
128
+ (`synap market publish --official`) before it posts). Don't claim a composed publish was fully validated; say what actually ran.
129
+
130
+ **Official templates — ONE catalog, ONE writer.** Every official template, of
131
+ every kind, lives in ONE catalog package: `synap-app/packages/workspace-templates/`
132
+ (npm `@synap-core/workspace-templates`; a rename to `packages/catalog` /
133
+ `@synap-core/catalog` is planned, not done). By kind: workspaces in `src/*.yaml`,
134
+ then `capabilities/`, `skills/`, `packs/`, `automations/`. Each file is one manifest
135
+ `{apiVersion: synap/v1, kind, meta, spec, dependencies}`. Its `README.md` is the
136
+ how-to. It has ONE writer: `synap catalog publish --official [--kind k] [slug...]`.
137
+ That is the founder's command: its `synap login` session must own the
138
+ `synap-official` vendor. It refuses a non-official account before the preview,
139
+ validates the whole corpus, previews the diff against the live catalog, and asks
140
+ before writing; `--dry-run` previews only. `synap market publish --official` is
141
+ its alias for `--kind workspace`. Both go through the ONE lib
142
+ `scripts/catalog-lib.mjs` → `POST /api/packages` (`publishPackageCore`).
143
+ `synap catalog validate|diff` are the read-only verbs. `scripts/publish-official.mjs`
144
+ is only the CI wrapper (`publish-official-templates.yml`): a read-only preview on
145
+ PRs, and on main a live publish of the kinds in `SYNAP_CATALOG_LIVE_KINDS` (default
146
+ `workspace`). The CP never reseeds on deploy, neither templates nor capabilities.
147
+ `seed-templates.ts` and `seed-capability-templates.ts` are insert-only, by-hand
148
+ bootstraps for an empty CP. A catalog change reaches pods only when that publish
149
+ runs. A CP-door change ships CP-deploy first, then publish.
150
+ `definition.sourcePackage` (the `mergeCatalog` winner signal) is official-only:
151
+ the CP rejects it (403) from any other publisher, so never put it in an ad-hoc
152
+ package. Official capability keys are reserved: an ad-hoc publish of a capability
153
+ whose slug or `capability.key` matches an official one gets 409
154
+ `OFFICIAL_CAPABILITY_KEY_RESERVED`. Pick your own key. Never pass the official
155
+ `vendorId` to `market_publish` or publish an official slug ad-hoc — official
156
+ content is authored in the catalog and published by the human with
157
+ `synap catalog publish --official`.
158
+
159
+ ## Writing a process (a playbook that follows a kind's lifecycle)
160
+
161
+ The status belongs to the **kind or role**, never to a playbook. Its profile declares the lifecycle ONCE, in its
162
+ template:
163
+
164
+ ```yaml
165
+ lifecycle:
166
+ property: post-status
167
+ options:
168
+ - { key: Idea, category: open }
169
+ - { key: Published, category: done }
170
+ - { key: Archived, category: lost, humanOnly: true }
171
+ ```
172
+
173
+ Every option has one category (`open · active · paused · done · lost`); rules read the category, names stay free.
174
+ `humanOnly` marks an option no agent sets; an agent's move into `done` or `lost` proposes. Every move goes through
175
+ the one status door (`moveStatus`; an agent sends `update_entity` with `expectedStatus`).
176
+
177
+ A playbook that works that lifecycle is a **process**: it FOLLOWS it. Its stages name options of it, its workers
178
+ start on it, and a person decides at the moments that commit the business. It never keeps a second status field.
179
+ The reference is Content OS "Produce Content" (`synap-app/packages/workspace-templates/src/content-os.yaml`).
180
+
181
+ **Official vs pod-local.** An official template or capability lives ONLY in the catalog
182
+ (`synap-app/packages/workspace-templates/`, by kind) and is published with
183
+ `synap catalog publish --official` (CI on main). A playbook, kind or automation an agent creates on a pod
184
+ (`synap_create_playbook`, `synap_define_kind`, …) is **pod-local**: it never reaches the catalog. To make it
185
+ official, write it into the catalog file and publish.
186
+
187
+ | Field | Where | Rule |
188
+ | ------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
189
+ | `subjectProfile.profileSlug` | playbook | The kind or role the process works. |
190
+ | `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. |
191
+ | `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. |
192
+ | `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. |
193
+ | `stages[].onFail` | stage | `{toStage: <key>}` — where a rejected gate sends the run (rework loop). |
194
+ | `stages[].criteria` | stage | 2–5 binary statements; `check.kind` evidence (cheapest) · capability · judge · human. |
195
+ | `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. |
196
+ | `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. |
197
+ | `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. |
198
+ | `goalTemplate` | playbook | Placeholders are `{paramName}`. Never `@{arg:…}` (read-only legacy). |
199
+ | `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. |
200
+
201
+ Human moments use an `ask` on an owed slot: `confirm` / `choose` (one `recommended`) / `form` / `act` / `provide`
202
+ (connection, file or secret through the vault). Never ask for a secret in a form.
203
+
204
+ Validation: `synap catalog validate` (process contract, goal grammar, lifecycle coverage ratchet — the count of
205
+ lifecycle kinds with no process may only go down).
206
+
207
+ ## What you're producing
208
+
209
+ A `PackageDefinition`: `_meta` (slug/name/description/icon/color/tags),
210
+ `workspaceName`, `description`, `profiles`, `views`, `entityLinks`, optional
211
+ `dependencies`. The scaffolded YAML and `--from-workspace` both produce this
212
+ shape — never hand-write JSON against the raw DB row shape.
@@ -0,0 +1,59 @@
1
+ # Discover & fetch
2
+
3
+ Three doors reach the same catalog. Pick the one that matches where you're
4
+ running.
5
+
6
+ ## CLI — `synap market`
7
+
8
+ ```bash
9
+ synap market # browse/list (the default action)
10
+ synap market --search "crm" # filter by name/description/slug
11
+ synap market --type capability # filter by type: workspace|capability|skill|workflow|view|cell
12
+ synap market --search "crm" --type workspace --json
13
+ ```
14
+
15
+ `market` with no subcommand lists; `--list` is accepted explicitly too. It
16
+ merges: your OWN packages (public + private, via `GET /api/packages/mine`)
17
+ with the PUBLIC catalog (`GET /api/packages`) — logged out, you only see the
18
+ public/bundled set.
19
+
20
+ Companion commands:
21
+
22
+ ```bash
23
+ synap market installed # what's already installed on THIS pod (pure read)
24
+ synap market installed --tree # composition graph: package → templates → workspaces
25
+ synap market update # check installed packages for drift against the catalog
26
+ ```
27
+
28
+ ## Pod verb — `market.search` (MCP / agent / automation)
29
+
30
+ The pod-native verb, run via MCP `run_capability` or
31
+ `POST /api/hub/capabilities/execute` with `{ verbId: "market.search", parameters }`:
32
+
33
+ ```json
34
+ { "query": "crm", "kind": "template", "limit": 20 }
35
+ ```
36
+
37
+ - `kind` ∈ `capability | automation | template | cell` (omit to search all).
38
+ - Reads the pod-local `cp_catalog_cache` — fast, no live CP round-trip.
39
+ - Returns `{ entries: [{ slug, kind, name, description, version, tier, installed }], count }`.
40
+ - `installed` is `true`/`false` for capability/cell (cheap natural-key check);
41
+ `undefined` for automation/template — that's an HONEST unknown, not a bug,
42
+ never read it as "not installed."
43
+ - Empty result → say so plainly ("nothing matched") — never fabricate a
44
+ package that doesn't exist. Offer to capture the gap as a note for later.
45
+
46
+ This is the verb an agent should reach for first — it's read-only (auto-runs,
47
+ no approval needed) and mirrors exactly what `synap market --search` shows a
48
+ human.
49
+
50
+ ## Fetching one package's full definition
51
+
52
+ - **CLI (authoring path):** `synap market publish --from-workspace <id>` reads
53
+ a LIVE workspace via the pod's own `to-template` serializer — see
54
+ `author-and-publish.md`.
55
+ - **CP directly:** `GET /api/packages/:slug` returns the full row **with**
56
+ `definition` — the install payload. Auth is required to see a private
57
+ package (author-only). No auth → public only, and a private slug 404s.
58
+ - **From an install:** you don't normally need the definition yourself —
59
+ `market.install` (see `install.md`) resolves and applies it for you.
@@ -0,0 +1,63 @@
1
+ # Governance & the one-catalog principle
2
+
3
+ ## Writes are governed — "proposed" is success
4
+
5
+ Every mutating marketplace action an AGENT takes (`market.install` above all)
6
+ can come back `{ status: "proposed", proposalId, reviewUrl }` instead of
7
+ `{ status: "installed" }`. That is the write queued for the pod owner's
8
+ review — like opening a PR, not a failure and not an error to retry. Always:
9
+
10
+ - Surface `reviewUrl` to the user.
11
+ - Don't retry the same install hoping for "installed" — it won't change the
12
+ outcome and may create a duplicate proposal.
13
+ - Remember an unreviewed proposal isn't live yet: `market.search`'s
14
+ `installed` flag and any downstream read won't reflect it until approved.
15
+
16
+ An OPERATOR-driven install (the pod owner themself, via CLI with their own
17
+ credentials, no agent identity) executes directly — no proposal. The
18
+ distinction is WHO is acting, not which door they used.
19
+
20
+ ## One catalog — never fork it
21
+
22
+ - The catalog is `synapPackages` in the Control Plane, reached through
23
+ `GET/POST/PATCH /api/packages*`. `cp_catalog_cache` on the pod is a
24
+ **read-through cache** of it (populated by sync), not a second source of
25
+ truth — never write to it directly, and never treat a cache miss as "the
26
+ package doesn't exist" without falling back to a live CP fetch (which
27
+ `market.install` already does for automation/template kinds).
28
+ - Discovery happens on the CP (`market.search`, `synap market`); apply
29
+ happens on the pod (`market.install`, workspace creation). Don't invent a
30
+ parallel "known templates" list anywhere else in a workflow you're
31
+ building — always search the real catalog.
32
+ - Publishing to anywhere other than `POST /api/packages` (e.g. hand-writing a
33
+ file and calling it "published," or registering a template only in a local
34
+ config) is NOT publishing — it produces something invisible to
35
+ `market.search` and every other consumer.
36
+
37
+ ## Visibility model
38
+
39
+ - **Public** (`isPublic: true`) — visible to everyone via `GET /api/packages`.
40
+ - **Private** (`isPublic: false`, the default) — visible only to its
41
+ `authorId` (and, for non-workspace categories, active members of an
42
+ `podId`-owned team). A private **workspace template** is stricter:
43
+ owner-only, full stop, even for pod teammates.
44
+ - A private package a caller can't see **404s, never 403s** — this is
45
+ deliberate (don't leak existence). If you get a 404 fetching a package by
46
+ slug, don't assume it never existed — it may just be private to someone
47
+ else.
48
+
49
+ ## Tier gating
50
+
51
+ A public package can declare `requiredTier`. `GET /api/packages/available`
52
+ tells an authed caller which tiered slugs their subscription actually
53
+ unlocks; a slug missing from that list but present in the browse catalog is
54
+ locked for them — `market.install` pre-checks this and fails before touching
55
+ governance, so surface the tier requirement rather than treating it as a
56
+ generic install error.
57
+
58
+ The **server pre-check is the authoritative floor** (`assertPackageTierAccess`,
59
+ wired at every install site). The browser UI is **display-only**: it threads
60
+ `requiredTier` through to a "requires <tier>" badge but does NOT hard-block, and
61
+ its lock/upgrade CTA only engages once a host wires a billing destination — so
62
+ don't add a UI-side gate expecting it to enforce anything, and don't rebuild the
63
+ badge thread (it exists). Full current-state: repo `TEMPLATE-DEV-GUIDE.md`.
@@ -0,0 +1,133 @@
1
+ # Install
2
+
3
+ ## CLI — `synap market install <slug>`
4
+
5
+ ```bash
6
+ synap market install crm # install as a new workspace
7
+ synap market install crm --dry-run # preview: would-create / reuse / conflicts, writes nothing
8
+ synap market install crm --onto <workspaceId> # reconcile ONTO an existing workspace (additive)
9
+ synap market install crm --project <id> # link the installed workspace(s) to an EXISTING project (id only)
10
+ ```
11
+
12
+ Installs are **workspace-first**: a `workspace`/`template` package spins up
13
+ (or reconciles onto) a workspace directly. Other package types (capability,
14
+ automation, cell) route you to the right surface (`synap capability add`,
15
+ etc.) rather than being force-fit into a workspace install.
16
+
17
+ **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.
18
+
19
+ ## Pod verb — `market.install` (MCP / agent / automation)
20
+
21
+ ```json
22
+ { "slug": "crm", "kind": "template", "version": "optional", "params": {} }
23
+ ```
24
+
25
+ `kind` ∈ `capability | automation | template | cell` — required, unlike
26
+ `market.search`.
27
+
28
+ **This verb ALWAYS mutates**, so it goes through the full permission gate —
29
+ never treat a non-"installed" response as failure:
30
+
31
+ - **Operator call** (no agent identity — e.g. you're driving the CLI as the
32
+ pod owner): executes directly → `{ status: "installed", result }`.
33
+ - **Agent call** (any MCP/automation/agent-key caller): ALWAYS proposes,
34
+ regardless of any standing grant on `market.install` itself — a grant on
35
+ the verb governs _invoking_ it, not the provisioning it performs. Response:
36
+ `{ status: "proposed", proposalId, reviewUrl }`.
37
+
38
+ **`"proposed"` is success, not an error.** Surface `reviewUrl` to the user so
39
+ they can approve it — don't retry, don't report it as a failure. See
40
+ `governance-and-catalog.md`.
41
+
42
+ ## Project packs — a suite of workspaces, linked to a project
43
+
44
+ A **project** is a cross-cutting lens over workspaces, not a package kind. A
45
+ "project pack" is a **suite**: an ordinary `workspace`-category package tagged
46
+ `suite`, whose `dependencies[]` **`require`** each constituent workspace package
47
+ (never `compose` — re-applying must not duplicate workspaces). Installing a
48
+ suite installs every constituent workspace (idempotent: reused if present).
49
+
50
+ **Author one from a live project** — never hand-write the suite:
51
+
52
+ ```bash
53
+ synap market publish --from-project <projectId> # publishes the constituents first, then the thin suite
54
+ ```
55
+
56
+ (Agent door: `export_project_pack` returns `{ definition, constituents }` —
57
+ publish the constituents before the suite so every `require` resolves.)
58
+
59
+ **Install onto a project.** The install never needs to know why the project
60
+ exists — it installs the workspaces and LINKS them (a `project --uses-->
61
+ workspace` edge per workspace, plus seeded entities filed into the project):
62
+
63
+ ```bash
64
+ synap market install <suite-slug> --project <projectId> # EXISTING project id only; errors if not found
65
+ ```
66
+
67
+ The CLI has no flag that creates a project. Create the project first:
68
+
69
+ - **A human**: in the app, or by passing `projectName` on the Hub door
70
+ `POST /api/hub/packages/apply` (mints or reuses by exact name).
71
+ - **An agent**: `create_project` requires `evidenceEntityIds` — at least 5
72
+ existing entities that belong to it — or it is REJECTED (not proposed).
73
+ Without that evidence, ask the human to create the project, then install with
74
+ its id.
75
+ - **An agent calling `market.install` with `projectName`**: the install becomes
76
+ a proposal that carries the name, and when a human approves it the project is
77
+ minted. The approval is the consent — say so when you propose it.
78
+
79
+ Two packs on one project = install each with the same `--project <id>`. Each
80
+ lands its own workspaces; both link to the project. Only ONE `compose`
81
+ dependency is allowed per package, at every level.
82
+
83
+ **The brief comes with the workspaces.** A workspace package's `onboarding` is
84
+ the space's BRIEF — steady state (`purpose`, `framing`, `expertise`, `anchors`,
85
+ `fetch`) plus its onboarding mode (`goal`, `collect`, `openingQuestions`,
86
+ `doneWhen`) — stored on that workspace's `settings.onboarding`; the package's
87
+ top-level `rules[]` install as the space's rules. A template update reaches an
88
+ installed space without overwriting what its owner edited (conflicts are
89
+ reported), and `synap_update_space_brief` proposes a change. The `onboard` skill runs the
90
+ interview when a lens is empty; for a project spanning several workspaces it
91
+ sets up one workspace's slice at a time, each entity filed into the project.
92
+ There is no project-level recipe — the recipe always lives on a workspace. A
93
+ journey completes by itself once the lens holds real data.
94
+
95
+ ## Idempotency by kind
96
+
97
+ - **capability** — natural key is `(name, workspaceId)`; installing twice
98
+ converges, doesn't duplicate.
99
+ - **template/workspace** — keyed by `packageSlug`/`proposalId` (both set to
100
+ the catalog slug); re-installing the same template for the same user
101
+ converges to the existing workspace rather than creating a second one.
102
+ - **automation** — pre-checked by `(name, workspace)` before creating.
103
+ - **cell** — keyed by `(typeKey, workspaceId)`.
104
+
105
+ ## Template updates — where a space stands, and whose step it is
106
+
107
+ Read it with MCP `synap_template_health` (or `synap templates` in a terminal).
108
+ Each space's row says what is left to do; act on these fields, not on
109
+ `drifted` alone (`drifted: true` means "there is a step", not "apply now"):
110
+
111
+ | Field | Means | Your move |
112
+ |---|---|---|
113
+ | `state: "active"`, `drifted: true` | a newer version is out | the update path below |
114
+ | `state: "awaiting-approval"` + `awaitingApproval: [ids]` | the last update filed proposals | point the person to them; **do not re-apply** |
115
+ | `state: "partial"` / `"layer-2-not-run"` / `"failed"` | the last update did not finish | `synap templates update <slug>` finishes it |
116
+ | `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`) |
117
+ | `updateProposal: {id}` | an update of this space is already proposed | point the person to that proposal; **never file another** |
118
+ | `applyWarning` | the pod's one sentence for what is left | relay it as is |
119
+
120
+ The update path is `synap templates update <slug>` (the person's door). Run
121
+ with an agent key it becomes a proposal the person approves. **Agreeing to data
122
+ changes is never an agent's**: the door answers `409
123
+ DATA_CHANGES_NEED_CONSENT` with `needsPerson: true` for any agent, whatever it
124
+ lists in `acceptDataChanges`. The version stamp (`settings.template.version`) is
125
+ written only when an update converged, so a space never reads "up to date" over
126
+ an update that did not land.
127
+
128
+ ## Locked / tier-gated packages
129
+
130
+ A package can declare a `requiredTier`. Installing one your account's plan
131
+ doesn't cover fails a pre-check (`assertPackageTierAccess`) BEFORE any
132
+ proposal or provisioning — tell the user which tier is required rather than
133
+ retrying.
@@ -0,0 +1,119 @@
1
+ # Marketplace & templates on Synap
2
+
3
+ Synap is **configuration-first**: a feature is _stored, user-editable config_
4
+ published to one catalog and installed through shared substrate — not hardcoded in
5
+ the pod backend. The marketplace is that **package layer**, and the catalog
6
+ (`synap_packages`) is **kind-agnostic** — one door serves every kind:
7
+
8
+ | Kind | Configures | Standalone install (via `applyMarketInstall`) |
9
+ | ------------------------- | ---------------------------------------------------------------- | -------------------------------------------------- |
10
+ | **workspace** | a whole domain (profiles + views + bento + its caps/automations) | ✅ `createWorkspaceFromDefinitionIdempotent` |
11
+ | **capability** | a credentialed tool pack (+ embedded skills/playbooks) | ✅ `createCapabilityFromDefinition` |
12
+ | **cell** | a renderer — the code that draws an entity/widget | ✅ `installCellFromDefinition` (needs a cache row) |
13
+ | **view** | a saved view/layout | ✅ `viewsRouter.create` (needs a `workspaceId`) |
14
+ | **skill** | agent know-how | ✅ `skillsRouter.create` (pod-wide if no ws) |
15
+ | **workflow / automation** | a WHEN→ACTION flow | ✅ `automationsRouter.create` into acting ws |
16
+
17
+ **All six kinds install standalone today** through the ONE apply core
18
+ `applyMarketInstall` (`services/capabilities/marketplace-install.ts`) — the same
19
+ governed door `market.install` and the `capability.install` proposal executor share,
20
+ each reusing the kind's _governed_ router caller (zero duplicated insert logic). The
21
+ remaining gaps are NOT install: (1) **private-package sync is unauthenticated**, so a
22
+ private package can't reach a pod yet (see `governance-and-catalog.md` / RC4); (2)
23
+ standalone **view / skill / automation stamp no source-link**, so they don't self-heal
24
+ via reconcile the way workspace/capability do. (Subscription-`tier` gating is a
25
+ separate axis — see `governance-and-catalog.md`.)
26
+
27
+ **Words** (template, pack, workspace/work/track/rule template) are defined once
28
+ in the `synap` skill's `concepts` topic. In short: a template's kind is DERIVED
29
+ from its content (a playbook with `scope: "project"` is a track template, the
30
+ default `scope: "session"` a work template), never declared.
31
+
32
+ **A pack is not a seventh kind.** Today it ships as a **suite**: a `workspace`
33
+ package tagged `suite` that `require`s its constituent workspaces, built from a
34
+ live project with `synap market publish --from-project <id>`, and installed
35
+ with `--project <id>` to link every workspace to that project. See
36
+ `install.md` → "Project packs". The model it is moving to: a pack lists the
37
+ workspace templates it depends on and installs the missing ones, and never
38
+ creates a workspace of its own.
39
+
40
+ It lives in the Control Plane (CP) catalog and is discoverable and installable from
41
+ any door: the `synap` CLI, MCP (`market_search` / `run_capability`), or the Hub REST
42
+ API. **Everything that is config, not code, can be a template** — workspaces, entity
43
+ profiles/views, renderers (cells), capabilities, skills, automations.
44
+
45
+ ## The authoring order — bottom-up, ALWAYS
46
+
47
+ Everything installable is a **standalone package**, and packages form a graph: a
48
+ bigger one **declares `dependencies[]`** on smaller ones, and the pod installs the
49
+ missing ones in the same governed pass. So author from the SMALLEST piece up:
50
+
51
+ 1. **Basic objects** — entity types (profiles), **skills**, capabilities, cells,
52
+ views, workflow/automations. Each is publishable on its OWN and is useful before
53
+ any container exists. A skill package is one skill: its documentation or code.
54
+ 2. **Containers** — a **space** (a `workspace` template) that declares
55
+ `dependencies[]` on the basic objects it needs, and activates its skills with a
56
+ `skills:` block.
57
+ 3. **Compositions** — a **project / suite** ("truck") that `require`s the spaces.
58
+
59
+ Publish the small pieces FIRST, then the space, then install. Nothing in the chain
60
+ waits on a container.
61
+
62
+ **The two verbs are different, and confusing them is the classic mistake:**
63
+
64
+ - `dependencies[]` = what gets **INSTALLED** — the pod materialises the package if
65
+ it is not already there (idempotent; a second pass reports `found`).
66
+ - `skills:` inside a template = what gets **LINKED** to that space, and in which
67
+ mode (`always` / `on-demand`). It names a skill some `dependencies[]` entry —
68
+ usually its own — already installed. Declaring the link without the dependency
69
+ installs cleanly and links NOTHING.
70
+
71
+ **Never inline what is already a package.** Copying a skill's text into a template,
72
+ or re-declaring a profile set that ships as a dependency, forks the thing and stops
73
+ it converging. Depend on it; let the install bring it. And **never** seed a skill
74
+ into the backend (`skills/synap/…`) to make a template resolve — that directory is
75
+ not the marketplace. Publish it as a package.
76
+
77
+ ## The two reflexes
78
+
79
+ 1. **DISCOVER before you invent.** Before scaffolding a new template or
80
+ capability, search the catalog — `synap market --search "<query>"` or the
81
+ `market.search` verb. Someone may have already published what you need.
82
+ Reinventing a workspace that already exists as a template is wasted work
83
+ AND fragments the catalog.
84
+ 2. **One catalog, never a second one.** Every package — public or private —
85
+ lives in the CP's `synapPackages` table, reached through
86
+ `GET/POST /api/packages`. There is no side channel: don't write a
87
+ template to a random file and call it "published," and don't stand up a
88
+ local list of "known templates" — search the real catalog every time.
89
+
90
+ ## The four things this skill teaches
91
+
92
+ | Task | Doc |
93
+ | --------------------------------------------------------- | --------------------------- |
94
+ | Search/browse/fetch a package (any kind) | `discover-and-fetch.md` |
95
+ | Install a package into a pod | `install.md` |
96
+ | Author a new template and publish it (the ONE write door) | `author-and-publish.md` |
97
+ | Governance rules + the one-catalog principle | `governance-and-catalog.md` |
98
+
99
+ ## Package kinds
100
+
101
+ - **workspace / template** — a full workspace definition (profiles, views,
102
+ entity links) you can spin up as a new workspace, or reconcile onto an
103
+ existing one.
104
+ - **capability** — a tool + skill bundle (an integration or verb pack).
105
+ - **automation** — a trigger + action definition.
106
+ - **cell** — a custom UI renderer.
107
+
108
+ The CLI's browse filter (`market --type`) uses
109
+ `workspace|capability|skill|workflow|view|cell`; the pod-native install verb
110
+ (`market.install`) and its catalog use the narrower
111
+ `capability|automation|template|cell` (`template` there means a workspace template). Match
112
+ whichever surface you're calling.
113
+
114
+ ## Visibility
115
+
116
+ Every package is **public** or **private** (owner-only). Default on publish is
117
+ **private** — you opt in to sharing with `--public`. A private package 404s
118
+ (not 403) to anyone who isn't its author or an active member of its owning pod
119
+ — see `governance-and-catalog.md`.