@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
@@ -9,11 +9,13 @@ description: >
9
9
  schema", defining custom relations, setting up a profile for a specific domain
10
10
  (real estate, music production, research, fitness, cooking). Also triggers on:
11
11
  "do I already have a profile for X?", "what fields does <profile> have?",
12
- extending an existing profile with workspace-specific overlay properties.
12
+ extending an existing profile with workspace-specific overlay properties,
13
+ widening a role so a hat fits another kind (any kind, not only person/company).
14
+ Prefer extend-first (system/synap-schema/extend-first) before define_kind.
13
15
  Do NOT use this skill for creating instances of existing types — the core
14
16
  `synap` skill handles that. This skill changes the SCHEMA, not the data.
15
17
  metadata:
16
- openclaw:
18
+ synap:
17
19
  requires:
18
20
  env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL]
19
21
  primaryEnv: SYNAP_HUB_API_KEY
@@ -117,7 +119,7 @@ Read the response:
117
119
 
118
120
  ### Commonly seeded profiles (verify before using)
119
121
 
120
- Standard pods typically include: `note`, `task`, `project`, `event`, `person`, `contact`, `company`, `bookmark`, `website`, `article`, `capture`, `file`, `anchor`, `decision`, `question`, `research`
122
+ Standard pods typically include: `note`, `task`, `event`, `person`, `contact`, `company`, `item`, `bookmark`, `website`, `article`, `capture`, `file`, `anchor`, `decision`, `question`, `research`. A **project is not a profile** — it is a row in `projects`. Roles (vendor, client, …) appear as `profileKind: role`.
121
123
 
122
124
  CRM workspaces additionally have: `deal`, `client` — but **only** when a CRM workspace was created.
123
125
  Custom workspace templates (devplane, content, etc.) add their own profiles entirely.
@@ -130,7 +132,7 @@ Before creating a new profile: **does one of these already fit?** A podcast epis
130
132
 
131
133
  There are three moves, not two. Before extending or creating, ask whether the thing is really a **role** the entity plays rather than a new kind of entity at all — that's a facet, and it's the move people skip.
132
134
 
133
- **Kind + Facets, the rule:** one entity = one kind (`profiles.profileKind = 'kind'`). Roles the entity plays — client, partner, investor, prospect — are role-profiles (`profileKind = 'role'`, `applicableKinds[]`) attached via `entity_facets`: additive, workspace-lensed, NOT entities. A facet cascades with its parent entity; only promote a role to a full kind if it accrues its own independent life.
135
+ **Kind + Facets, the rule:** one entity = one kind (`profiles.profileKind = 'kind'`). Roles are hats on **any** kind — not only person/company. A role-profile (`profileKind = 'role'`, `applicableKinds[]`) attaches via `entity_facets`: additive, workspace-lensed, NOT a second entity. `applicableKinds` NULL = any kind; a list **restricts**. “This item is an X” is a facet on `item` when X is a hat, not a new kind. Only promote a role to a full kind if it accrues its own independent life. Widen a role (`define_role` on the existing slug) when the hat fits a kind that is not yet in `applicableKinds`. See `extend-first.md`.
134
136
 
135
137
  **The litmus test:**
136
138
 
@@ -160,6 +162,38 @@ Prefer **inheritance** over new profiles when a system parent fits. `contact ext
160
162
 
161
163
  ---
162
164
 
165
+ ## Extend first — schema moves, in order
166
+
167
+ Before `define_kind` or a new workspace, walk this list **top to bottom**. Stop at the first move that fits. Load from `system/synap-schema/extend-first`. The conductor for a fuzzy user intent is `system/synap/from-intent`.
168
+
169
+ A **role (facet) is a hat on any entity kind**, not only person/company. `applicableKinds` is the allowlist (`NULL` = any kind). `kind_mismatch` means **widen the role**, not mint a sibling type.
170
+
171
+ | # | If the need is… | Do this | Do not |
172
+ | --- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
173
+ | 1 | An instance of a kind you already have | `create_entity` / capture on that slug; search first | A second kind with a similar name |
174
+ | 2 | A **hat** on an existing entity (“this item is an X”, “this company is a vendor”) | `attach_facet`. If the role exists but not on this kind → **widen `applicableKinds`** (same slug, extra kinds) then attach | A new kind or a second role slug (`seller` vs `vendor`) |
175
+ | 3 | 1–3 extra fields in **one** domain | Workspace **overlay** property on the existing kind | A forked kind in that workspace |
176
+ | 4 | A true **subtype** with its own fields and life | Child kind: `define_kind` with `parentProfileSlug` of the closest parent | A disconnected top-level kind |
177
+ | 5 | A **relationship-with-a-life** (buyer × seller × price × stage, independent of either party) | Own kind (the **deal precedent**). New slug if CRM `deal` is a _sales pipeline_ and this is not that. Overlay if it **is** the same kind in another workspace | Twin slug `deal`; JSON arrays of prices on the thing; Finding-per-scrape |
178
+ | 6 | A **stage** inside a domain | Status field + view | A workspace per stage |
179
+ | 7 | A **domain** (owns kinds + own team + automations + stable) | Four-test → `agent-os` / template | A workspace for a project, a hat, or a shopping list |
180
+ | 8 | None of the above | `define_kind` (pod-wide default) | Silent invent |
181
+
182
+ Same **kind** across workspaces: **one profile**, overlays for extra fields, optional `entityScope: pod` (pod-admin) so instances are not trapped. Never a second profile with the same name.
183
+
184
+ ### Widen a role
185
+
186
+ `synap_define_role` with an **existing** slug is slug-idempotent: extra `applicableKinds` are **merged** (widen only). Shrinking the allowlist is not this door.
187
+
188
+ ### Firewalls
189
+
190
+ - `list_profiles` before every define.
191
+ - Prefer attach / widen / overlay / parent over create.
192
+ - One structural proposal at a time.
193
+ - `proposed` is success.
194
+
195
+ ---
196
+
163
197
  ## Creating a new profile
164
198
 
165
199
  ```json
@@ -241,10 +275,22 @@ Overlays don't leak: workspace A can't see workspace B's overlay properties even
241
275
 
242
276
  Profiles have an `entityScope` that determines where entities of that type live:
243
277
 
244
- - `entityScope: "pod"` — entities are pod-wide, visible in every workspace the user can access. Good for people, companies, notes, articles — things that cross contexts.
245
- - `entityScope: "workspace"` — entities live in the workspace they were created in. Good for deals, files, workspace-specific artifacts.
278
+ - `entityScope: "pod"` — entities are **pod-wide** (home `workspace_id = NULL`). Visible under ACL + role-as-lens facets — **not** exclusive to one app. Good for people, companies, notes, articles, knowledge/lessons — identity and memory that cross contexts.
279
+ - `entityScope: "workspace"` — entities live in the workspace they were created in (process kinds). Good for deals, pipelines, workspace-specific artifacts.
280
+
281
+ **Default is `pod`** (schema column default + write door). Only declare `entityScope: "workspace"` when the kind is a genuine process document that must not float pod-wide.
282
+
283
+ ### Pin ≠ exclusive prison
246
284
 
247
- Defaults to `workspace` if not set on the profile. The user can toggle this per profile in ProfileEditor Settings. If you're creating a profile for something clearly pod-wide (a person, a podcast the user follows, a book in their library), set `entityScope: "pod"` explicitly.
285
+ Filing into a workspace sets a **home pin**, not exclusive ownership. Role facets make the same person visible in CRM (or Operations) without copying the row. Never treat workspace pin as a folder that traps identity.
286
+
287
+ ### Write pins (agents & capture)
288
+
289
+ - **Omit** `workspaceId` for pod-scope kinds — server placement lands them pod-wide.
290
+ - **Ambient / active workspace** is a **list lens** and optional process home, not a silent dump target.
291
+ - Process kinds + explicit pin / routed domain home use `resolveKindWritePin` (one rule for capture, import, thought).
292
+
293
+ If you're creating a profile for something clearly pod-wide (a person, a podcast, a book, a lesson), leave default pod or set `entityScope: "pod"` explicitly. Do **not** set workspace "to be safe" — that reintroduces folder-trap bugs.
248
294
 
249
295
  ---
250
296
 
@@ -265,7 +311,121 @@ POST /api/hub/relation-defs
265
311
  }
266
312
  ```
267
313
 
268
- Defining a relation def is rarely worth it — `related_to` + a property usually suffices. Only create one when the relationship is semantic enough that UI should treat it specially (e.g., show "mentored by Jane" on a person's profile card).
314
+ Defining a relation def is rarely worth it — `relates_to` + a property usually suffices. Only create one when the relationship is semantic enough that UI should treat it specially (e.g., show "mentored by Jane" on a person's profile card).
315
+
316
+ ---
317
+
318
+ ## The intent vocabulary — one SSOT, three mirrors
319
+
320
+ **What a capability DOES** — `send_message`, `generate_media`, `publish_post`,
321
+ `delegate_agent_task` — is the
322
+ ROUTING axis over the verb catalog. A verb's id is vendor-keyed (`gmail_send`,
323
+ `unipile_send_message`); its `intent` says what it MEANS, so an agent can ask for
324
+ "send a message" without already knowing the vendor.
325
+
326
+ An intent is **routing only, never authorization**. It resolves to a concrete verb id
327
+ BEFORE the governance gate, which then decides on the verb exactly as it did before.
328
+
329
+ ### THE SOURCE OF TRUTH IS A TABLE, NOT A UNION
330
+
331
+ The SSOT is the pod's **`capability_intents` table**. Slugs live in ROWS, not in a
332
+ TypeScript union:
333
+
334
+ ```sql
335
+ SELECT slug, effect, statement FROM capability_intents ORDER BY slug;
336
+ ```
337
+
338
+ | Column | Meaning |
339
+ | ----------- | --------------------------------------------------------- |
340
+ | `slug` | the seat. `^[a-z][a-z0-9_]{0,63}$` (a CHECK constraint) |
341
+ | `effect` | CLOSED axis a rule may key on: `read` \| `write` \| `act` |
342
+ | `statement` | the human sentence |
343
+ | `synonyms` | for FINDING a row, never for identity |
344
+
345
+ This is why every code-side copy is a **mirror** and not the source. A slug that fits
346
+ none of the existing rows leaves `intent` UNSET; the vocabulary is deliberately not
347
+ open for developers to mint (cf. W3C Web Intents, abandoned partly for that reason).
348
+
349
+ ### The three mirrors, and why each one must exist
350
+
351
+ There are exactly **three**. A fourth was deleted in 2026-10-01 (see below).
352
+
353
+ | # | Where | Kind | Why it cannot import the SSOT |
354
+ | --- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
355
+ | 1 | `synap-backend/packages/database/src/schema/tools.ts` — `ABSTRACT_VERBS` | runtime, the 0283 SEED union (13) | `@synap-core/types` **devDepends on** `@synap/database`. A reverse import is a build cycle — the same constraint that forces `GUIDELINE_SCOPE_ORDER` to be mirrored. |
356
+ | 2 | `synap-backend/packages/types/src/capability-intents/` — `ABSTRACT_INTENTS`, `REGISTERED_EXTRAS`, `CAPABILITY_INTENTS` | runtime, published leaf | Same cycle, other direction. It is a **leaf subpath** (`@synap-core/types/capability-intents`) rather than the `./` barrel because the barrel re-exports `@synap/database` types and a VALUE import from a barrel crashes Hermes (relay ships React Native). |
357
+ | 3 | `synap-control-plane-api/src/seeds/capability-intent-vocabulary.ts` — `ABSTRACT_VERBS`, `REGISTERED_EXTRAS`, `CAPABILITY_INTENTS` | runtime, the CP catalog seeder | The control plane is a **separate deploy target with its own `pnpm-lock.yaml`**. It resolves neither `@synap-core/types` nor the pod's packages (verified: `require.resolve('@synap-core/types')` → `MODULE_NOT_FOUND`). |
358
+
359
+ Consumed by: `@synap/api` (`intent-registry`, `create-from-definition`,
360
+ `schemas/playbook-definition.ts`), `synap-app/packages/workspace-templates`
361
+ (`validate.ts` — the `taskIntents` check), and the CP's `seed-capability-templates.ts`
362
+ (only the insert-only bootstrap of an empty CP — official capabilities are authored in
363
+ the catalog, `synap-app/packages/workspace-templates/capabilities/`, and published with
364
+ `synap catalog publish --official`).
365
+
366
+ ### Which field on which surface
367
+
368
+ Search for this chapter by the field you are holding, not by the word "intent":
369
+
370
+ | Field | Lives on | Means |
371
+ | ----------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------- |
372
+ | `intent` | a **skill** in a capability definition; a `ToolVerb` catalog entry | what ONE verb does |
373
+ | `provides` | a **capability template** | every intent the whole PACK serves — must equal the `intent` its skills declare |
374
+ | `taskIntents` | a **workspace template** | what the SPACE needs the pod to be able to do |
375
+ | `requiredIntents` | a **playbook** | what the PROCESS needs the pod to be able to do |
376
+
377
+ All four are validated against this ONE vocabulary, so a workspace and a playbook
378
+ cannot be spelled from two different lists.
379
+
380
+ ### THE FOURTH MIRROR WAS DELETED — do not re-add it
381
+
382
+ `AbstractVerb` in `@synap/playbooks/src/index.ts` was a TYPE-only mirror of all 13
383
+ slugs. It was **stale** (no `publish_post`) and **dead** — a whole-repo scan across
384
+ every repo, `src/`, `dist/`, and generated `.d.ts` found **zero importers**.
385
+
386
+ A mirror nothing imports and nothing checks is not a mirror: it is a comment that
387
+ looks like a contract. `packages/playbooks/src/required-intents.test.ts` now refuses
388
+ `AbstractVerb`, `ABSTRACT_INTENTS`, or `REGISTERED_EXTRAS` being re-declared there.
389
+
390
+ `ToolVerb.intent` is `string`, not a closed union, and must stay that way: a union in
391
+ a package that consumes nothing would go stale in the one direction that is invisible.
392
+
393
+ ### Adding a slug — the exact steps
394
+
395
+ 1. **Write the migration.** A new numbered `.sql` in `synap-backend/packages/database/migrations/`,
396
+ `INSERT INTO "capability_intents" ("slug", "effect", "statement") VALUES (...) ON CONFLICT ("slug") DO NOTHING;`
397
+ `effect` ∈ `read|write|act`. Never `drizzle-kit generate` — hand-write it, and mirror it into
398
+ `0000_baseline_schema.sql` if it adds a table or column.
399
+ 2. **Add it to mirror 1** — `ABSTRACT_VERBS` in `packages/database/src/schema/tools.ts`,
400
+ **only if it is a SEED slug**. A post-seed row does not belong there (that is what
401
+ `publish_post` / `REGISTERED_EXTRAS` is for).
402
+ Post-seed rows today: `publish_post` (0284, write) and `delegate_agent_task`
403
+ (0314, act — every verb of an external-agent binding, `tools.config.agentBinding`:
404
+ start / send / status / cancel).
405
+ 3. **Add it to mirror 2** — `ABSTRACT_INTENTS` or `REGISTERED_EXTRAS` in
406
+ `packages/types/src/capability-intents/index.ts`. Then **`cd packages/types && pnpm build`** —
407
+ consumers typecheck against the built `dist/`, so a skipped rebuild makes your gate lie.
408
+ 4. **Add it to mirror 3** — the same two lists in the control plane's
409
+ `capability-intent-vocabulary.ts`.
410
+ 5. **Update the arity floors** — `SEED_SLUG_ARITY` / `EXTRA_SLUG_ARITY` in
411
+ `packages/api/src/__tripwires__/intent-vocabulary-one-ssot.tripwire.test.ts`.
412
+ These are the ONE place you must edit by hand, and the build stops until you do.
413
+
414
+ A slug in the table but missing from a mirror is **not silent**: every guard re-derives
415
+ from the migration SQL, so it is a red build — never a divergence nobody notices.
416
+
417
+ ### What can still go wrong
418
+
419
+ - **A mirror can be added.** Nothing structurally prevents a fifth copy; the tripwire
420
+ only polices the names it knows. This is why step 5 exists as a hand-edit floor.
421
+ - **A guard proves SAMENESS, never CORRECTNESS.** If every mirror and the migration agree
422
+ on a slug that should not exist, all four guards stay green. The vocabulary's MEANING is
423
+ reviewed by a human, not derived.
424
+ - **A new migration file is not auto-scanned.** Each parity guard lists its migration
425
+ filenames. A slug added in `0295_…sql` is invisible to all of them until that list is
426
+ extended — so extending it is part of step 1, not a follow-up.
427
+ - **`@synap-core/types` is published.** Mirror 2 ships to npm; changing it without a
428
+ version bump leaves consumers on the old vocabulary.
269
429
 
270
430
  ---
271
431
 
@@ -308,9 +468,11 @@ Defining a relation def is rarely worth it — `related_to` + a property usually
308
468
  2. **Declaring properties inline on the profile object.** Properties are separate rows; use `POST /property-defs`.
309
469
  3. **Using `string` for what should be `entity_id`.** If the field refers to another entity (host of a podcast), use `entity_id` + `targetProfileSlug` — enables auto-sync and link UX.
310
470
  4. **Using `array` of strings for tags.** Tags are a built-in concept; reuse the `tags` property on `note`/`project` instead of creating a parallel field.
311
- 5. **Forgetting `entityScope`.** Defaults to `workspace`. If the thing is pod-wide (people, books, podcasts), set it explicitly.
471
+ 5. **Wrong `entityScope`.** Defaults to **`pod`**. Only set `entityScope: "workspace"` for process kinds (deals, pipelines). Do not pin people/knowledge to a workspace "to be safe."
312
472
  6. **Creating an overlay when a base property is wanted.** Overlays only appear in one workspace. If the user wants the field everywhere, don't set `overlay: true`.
313
- 7. **Creating a custom profile when extension would work.** `client extends contact` is cleaner than a parallel `client` profile.
473
+ 7. **Creating a custom profile when extension would work.** Child kind (`parentProfileSlug`) or a **facet on any kind** is cleaner than a twin slug.
474
+ 8. **Treating facets as person/company-only.** A hat can sit on `item`, `task`, `deal`, …. `kind_mismatch` → widen `applicableKinds`, don't mint `seller` next to `vendor`.
475
+ 9. **Twin `deal` slug for a price timeline.** CRM `deal` is a sales pipeline. A commercial snapshot with its own life is the deal _precedent_ (own kind) or overlays on the same kind — never a second profile named deal.
314
476
 
315
477
  ---
316
478
 
@@ -3,11 +3,13 @@ before-you-touch.md
3
3
  read-before-write.md
4
4
  discover-profiles.md
5
5
  extend-vs-create.md
6
+ extend-first.md
6
7
  creating-profiles.md
7
8
  property-defs.md
8
9
  overlay-properties.md
9
10
  entity-scope.md
10
11
  relations.md
12
+ intent-vocabulary-ssot.md
11
13
  worked-example.md
12
14
  common-mistakes.md
13
15
  more.md
@@ -8,11 +8,13 @@ description: >
8
8
  schema", defining custom relations, setting up a profile for a specific domain
9
9
  (real estate, music production, research, fitness, cooking). Also triggers on:
10
10
  "do I already have a profile for X?", "what fields does <profile> have?",
11
- extending an existing profile with workspace-specific overlay properties.
11
+ extending an existing profile with workspace-specific overlay properties,
12
+ widening a role so a hat fits another kind (any kind, not only person/company).
13
+ Prefer extend-first (system/synap-schema/extend-first) before define_kind.
12
14
  Do NOT use this skill for creating instances of existing types — the core
13
15
  `synap` skill handles that. This skill changes the SCHEMA, not the data.
14
16
  metadata:
15
- openclaw:
17
+ synap:
16
18
  requires:
17
19
  env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL]
18
20
  primaryEnv: SYNAP_HUB_API_KEY
@@ -4,6 +4,8 @@
4
4
  2. **Declaring properties inline on the profile object.** Properties are separate rows; use `POST /property-defs`.
5
5
  3. **Using `string` for what should be `entity_id`.** If the field refers to another entity (host of a podcast), use `entity_id` + `targetProfileSlug` — enables auto-sync and link UX.
6
6
  4. **Using `array` of strings for tags.** Tags are a built-in concept; reuse the `tags` property on `note`/`project` instead of creating a parallel field.
7
- 5. **Forgetting `entityScope`.** Defaults to `workspace`. If the thing is pod-wide (people, books, podcasts), set it explicitly.
7
+ 5. **Wrong `entityScope`.** Defaults to **`pod`**. Only set `entityScope: "workspace"` for process kinds (deals, pipelines). Do not pin people/knowledge to a workspace "to be safe."
8
8
  6. **Creating an overlay when a base property is wanted.** Overlays only appear in one workspace. If the user wants the field everywhere, don't set `overlay: true`.
9
- 7. **Creating a custom profile when extension would work.** `client extends contact` is cleaner than a parallel `client` profile.
9
+ 7. **Creating a custom profile when extension would work.** Child kind (`parentProfileSlug`) or a **facet on any kind** is cleaner than a twin slug.
10
+ 8. **Treating facets as person/company-only.** A hat can sit on `item`, `task`, `deal`, …. `kind_mismatch` → widen `applicableKinds`, don't mint `seller` next to `vendor`.
11
+ 9. **Twin `deal` slug for a price timeline.** CRM `deal` is a sales pipeline. A commercial snapshot with its own life is the deal _precedent_ (own kind) or overlays on the same kind — never a second profile named deal.
@@ -16,7 +16,7 @@ Read the response:
16
16
 
17
17
  ### Commonly seeded profiles (verify before using)
18
18
 
19
- Standard pods typically include: `note`, `task`, `project`, `event`, `person`, `contact`, `company`, `bookmark`, `website`, `article`, `capture`, `file`, `anchor`, `decision`, `question`, `research`
19
+ Standard pods typically include: `note`, `task`, `event`, `person`, `contact`, `company`, `item`, `bookmark`, `website`, `article`, `capture`, `file`, `anchor`, `decision`, `question`, `research`. A **project is not a profile** — it is a row in `projects`. Roles (vendor, client, …) appear as `profileKind: role`.
20
20
 
21
21
  CRM workspaces additionally have: `deal`, `client` — but **only** when a CRM workspace was created.
22
22
  Custom workspace templates (devplane, content, etc.) add their own profiles entirely.
@@ -2,7 +2,19 @@
2
2
 
3
3
  Profiles have an `entityScope` that determines where entities of that type live:
4
4
 
5
- - `entityScope: "pod"` — entities are pod-wide, visible in every workspace the user can access. Good for people, companies, notes, articles — things that cross contexts.
6
- - `entityScope: "workspace"` — entities live in the workspace they were created in. Good for deals, files, workspace-specific artifacts.
5
+ - `entityScope: "pod"` — entities are **pod-wide** (home `workspace_id = NULL`). Visible under ACL + role-as-lens facets — **not** exclusive to one app. Good for people, companies, notes, articles, knowledge/lessons — identity and memory that cross contexts.
6
+ - `entityScope: "workspace"` — entities live in the workspace they were created in (process kinds). Good for deals, pipelines, workspace-specific artifacts.
7
7
 
8
- Defaults to `workspace` if not set on the profile. The user can toggle this per profile in ProfileEditor Settings. If you're creating a profile for something clearly pod-wide (a person, a podcast the user follows, a book in their library), set `entityScope: "pod"` explicitly.
8
+ **Default is `pod`** (schema column default + write door). Only declare `entityScope: "workspace"` when the kind is a genuine process document that must not float pod-wide.
9
+
10
+ ### Pin ≠ exclusive prison
11
+
12
+ Filing into a workspace sets a **home pin**, not exclusive ownership. Role facets make the same person visible in CRM (or Operations) without copying the row. Never treat workspace pin as a folder that traps identity.
13
+
14
+ ### Write pins (agents & capture)
15
+
16
+ - **Omit** `workspaceId` for pod-scope kinds — server placement lands them pod-wide.
17
+ - **Ambient / active workspace** is a **list lens** and optional process home, not a silent dump target.
18
+ - Process kinds + explicit pin / routed domain home use `resolveKindWritePin` (one rule for capture, import, thought).
19
+
20
+ If you're creating a profile for something clearly pod-wide (a person, a podcast, a book, a lesson), leave default pod or set `entityScope: "pod"` explicitly. Do **not** set workspace "to be safe" — that reintroduces folder-trap bugs.
@@ -0,0 +1,29 @@
1
+ ## Extend first — schema moves, in order
2
+
3
+ Before `define_kind` or a new workspace, walk this list **top to bottom**. Stop at the first move that fits. Load from `system/synap-schema/extend-first`. The conductor for a fuzzy user intent is `system/synap/from-intent`.
4
+
5
+ A **role (facet) is a hat on any entity kind**, not only person/company. `applicableKinds` is the allowlist (`NULL` = any kind). `kind_mismatch` means **widen the role**, not mint a sibling type.
6
+
7
+ | # | If the need is… | Do this | Do not |
8
+ | --- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
9
+ | 1 | An instance of a kind you already have | `create_entity` / capture on that slug; search first | A second kind with a similar name |
10
+ | 2 | A **hat** on an existing entity (“this item is an X”, “this company is a vendor”) | `attach_facet`. If the role exists but not on this kind → **widen `applicableKinds`** (same slug, extra kinds) then attach | A new kind or a second role slug (`seller` vs `vendor`) |
11
+ | 3 | 1–3 extra fields in **one** domain | Workspace **overlay** property on the existing kind | A forked kind in that workspace |
12
+ | 4 | A true **subtype** with its own fields and life | Child kind: `define_kind` with `parentProfileSlug` of the closest parent | A disconnected top-level kind |
13
+ | 5 | A **relationship-with-a-life** (buyer × seller × price × stage, independent of either party) | Own kind (the **deal precedent**). New slug if CRM `deal` is a _sales pipeline_ and this is not that. Overlay if it **is** the same kind in another workspace | Twin slug `deal`; JSON arrays of prices on the thing; Finding-per-scrape |
14
+ | 6 | A **stage** inside a domain | Status field + view | A workspace per stage |
15
+ | 7 | A **domain** (owns kinds + own team + automations + stable) | Four-test → `agent-os` / template | A workspace for a project, a hat, or a shopping list |
16
+ | 8 | None of the above | `define_kind` (pod-wide default) | Silent invent |
17
+
18
+ Same **kind** across workspaces: **one profile**, overlays for extra fields, optional `entityScope: pod` (pod-admin) so instances are not trapped. Never a second profile with the same name.
19
+
20
+ ### Widen a role
21
+
22
+ `synap_define_role` with an **existing** slug is slug-idempotent: extra `applicableKinds` are **merged** (widen only). Shrinking the allowlist is not this door.
23
+
24
+ ### Firewalls
25
+
26
+ - `list_profiles` before every define.
27
+ - Prefer attach / widen / overlay / parent over create.
28
+ - One structural proposal at a time.
29
+ - `proposed` is success.
@@ -2,7 +2,7 @@
2
2
 
3
3
  There are three moves, not two. Before extending or creating, ask whether the thing is really a **role** the entity plays rather than a new kind of entity at all — that's a facet, and it's the move people skip.
4
4
 
5
- **Kind + Facets, the rule:** one entity = one kind (`profiles.profileKind = 'kind'`). Roles the entity plays — client, partner, investor, prospect — are role-profiles (`profileKind = 'role'`, `applicableKinds[]`) attached via `entity_facets`: additive, workspace-lensed, NOT entities. A facet cascades with its parent entity; only promote a role to a full kind if it accrues its own independent life.
5
+ **Kind + Facets, the rule:** one entity = one kind (`profiles.profileKind = 'kind'`). Roles are hats on **any** kind — not only person/company. A role-profile (`profileKind = 'role'`, `applicableKinds[]`) attaches via `entity_facets`: additive, workspace-lensed, NOT a second entity. `applicableKinds` NULL = any kind; a list **restricts**. “This item is an X” is a facet on `item` when X is a hat, not a new kind. Only promote a role to a full kind if it accrues its own independent life. Widen a role (`define_role` on the existing slug) when the hat fits a kind that is not yet in `applicableKinds`. See `extend-first.md`.
6
6
 
7
7
  **The litmus test:**
8
8
 
@@ -0,0 +1,111 @@
1
+ ## The intent vocabulary — one SSOT, three mirrors
2
+
3
+ **What a capability DOES** — `send_message`, `generate_media`, `publish_post`,
4
+ `delegate_agent_task` — is the
5
+ ROUTING axis over the verb catalog. A verb's id is vendor-keyed (`gmail_send`,
6
+ `unipile_send_message`); its `intent` says what it MEANS, so an agent can ask for
7
+ "send a message" without already knowing the vendor.
8
+
9
+ An intent is **routing only, never authorization**. It resolves to a concrete verb id
10
+ BEFORE the governance gate, which then decides on the verb exactly as it did before.
11
+
12
+ ### THE SOURCE OF TRUTH IS A TABLE, NOT A UNION
13
+
14
+ The SSOT is the pod's **`capability_intents` table**. Slugs live in ROWS, not in a
15
+ TypeScript union:
16
+
17
+ ```sql
18
+ SELECT slug, effect, statement FROM capability_intents ORDER BY slug;
19
+ ```
20
+
21
+ | Column | Meaning |
22
+ | ----------- | --------------------------------------------------------- |
23
+ | `slug` | the seat. `^[a-z][a-z0-9_]{0,63}$` (a CHECK constraint) |
24
+ | `effect` | CLOSED axis a rule may key on: `read` \| `write` \| `act` |
25
+ | `statement` | the human sentence |
26
+ | `synonyms` | for FINDING a row, never for identity |
27
+
28
+ This is why every code-side copy is a **mirror** and not the source. A slug that fits
29
+ none of the existing rows leaves `intent` UNSET; the vocabulary is deliberately not
30
+ open for developers to mint (cf. W3C Web Intents, abandoned partly for that reason).
31
+
32
+ ### The three mirrors, and why each one must exist
33
+
34
+ There are exactly **three**. A fourth was deleted in 2026-10-01 (see below).
35
+
36
+ | # | Where | Kind | Why it cannot import the SSOT |
37
+ | --- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
38
+ | 1 | `synap-backend/packages/database/src/schema/tools.ts` — `ABSTRACT_VERBS` | runtime, the 0283 SEED union (13) | `@synap-core/types` **devDepends on** `@synap/database`. A reverse import is a build cycle — the same constraint that forces `GUIDELINE_SCOPE_ORDER` to be mirrored. |
39
+ | 2 | `synap-backend/packages/types/src/capability-intents/` — `ABSTRACT_INTENTS`, `REGISTERED_EXTRAS`, `CAPABILITY_INTENTS` | runtime, published leaf | Same cycle, other direction. It is a **leaf subpath** (`@synap-core/types/capability-intents`) rather than the `./` barrel because the barrel re-exports `@synap/database` types and a VALUE import from a barrel crashes Hermes (relay ships React Native). |
40
+ | 3 | `synap-control-plane-api/src/seeds/capability-intent-vocabulary.ts` — `ABSTRACT_VERBS`, `REGISTERED_EXTRAS`, `CAPABILITY_INTENTS` | runtime, the CP catalog seeder | The control plane is a **separate deploy target with its own `pnpm-lock.yaml`**. It resolves neither `@synap-core/types` nor the pod's packages (verified: `require.resolve('@synap-core/types')` → `MODULE_NOT_FOUND`). |
41
+
42
+ Consumed by: `@synap/api` (`intent-registry`, `create-from-definition`,
43
+ `schemas/playbook-definition.ts`), `synap-app/packages/workspace-templates`
44
+ (`validate.ts` — the `taskIntents` check), and the CP's `seed-capability-templates.ts`
45
+ (only the insert-only bootstrap of an empty CP — official capabilities are authored in
46
+ the catalog, `synap-app/packages/workspace-templates/capabilities/`, and published with
47
+ `synap catalog publish --official`).
48
+
49
+ ### Which field on which surface
50
+
51
+ Search for this chapter by the field you are holding, not by the word "intent":
52
+
53
+ | Field | Lives on | Means |
54
+ | ----------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------- |
55
+ | `intent` | a **skill** in a capability definition; a `ToolVerb` catalog entry | what ONE verb does |
56
+ | `provides` | a **capability template** | every intent the whole PACK serves — must equal the `intent` its skills declare |
57
+ | `taskIntents` | a **workspace template** | what the SPACE needs the pod to be able to do |
58
+ | `requiredIntents` | a **playbook** | what the PROCESS needs the pod to be able to do |
59
+
60
+ All four are validated against this ONE vocabulary, so a workspace and a playbook
61
+ cannot be spelled from two different lists.
62
+
63
+ ### THE FOURTH MIRROR WAS DELETED — do not re-add it
64
+
65
+ `AbstractVerb` in `@synap/playbooks/src/index.ts` was a TYPE-only mirror of all 13
66
+ slugs. It was **stale** (no `publish_post`) and **dead** — a whole-repo scan across
67
+ every repo, `src/`, `dist/`, and generated `.d.ts` found **zero importers**.
68
+
69
+ A mirror nothing imports and nothing checks is not a mirror: it is a comment that
70
+ looks like a contract. `packages/playbooks/src/required-intents.test.ts` now refuses
71
+ `AbstractVerb`, `ABSTRACT_INTENTS`, or `REGISTERED_EXTRAS` being re-declared there.
72
+
73
+ `ToolVerb.intent` is `string`, not a closed union, and must stay that way: a union in
74
+ a package that consumes nothing would go stale in the one direction that is invisible.
75
+
76
+ ### Adding a slug — the exact steps
77
+
78
+ 1. **Write the migration.** A new numbered `.sql` in `synap-backend/packages/database/migrations/`,
79
+ `INSERT INTO "capability_intents" ("slug", "effect", "statement") VALUES (...) ON CONFLICT ("slug") DO NOTHING;`
80
+ `effect` ∈ `read|write|act`. Never `drizzle-kit generate` — hand-write it, and mirror it into
81
+ `0000_baseline_schema.sql` if it adds a table or column.
82
+ 2. **Add it to mirror 1** — `ABSTRACT_VERBS` in `packages/database/src/schema/tools.ts`,
83
+ **only if it is a SEED slug**. A post-seed row does not belong there (that is what
84
+ `publish_post` / `REGISTERED_EXTRAS` is for).
85
+ Post-seed rows today: `publish_post` (0284, write) and `delegate_agent_task`
86
+ (0314, act — every verb of an external-agent binding, `tools.config.agentBinding`:
87
+ start / send / status / cancel).
88
+ 3. **Add it to mirror 2** — `ABSTRACT_INTENTS` or `REGISTERED_EXTRAS` in
89
+ `packages/types/src/capability-intents/index.ts`. Then **`cd packages/types && pnpm build`** —
90
+ consumers typecheck against the built `dist/`, so a skipped rebuild makes your gate lie.
91
+ 4. **Add it to mirror 3** — the same two lists in the control plane's
92
+ `capability-intent-vocabulary.ts`.
93
+ 5. **Update the arity floors** — `SEED_SLUG_ARITY` / `EXTRA_SLUG_ARITY` in
94
+ `packages/api/src/__tripwires__/intent-vocabulary-one-ssot.tripwire.test.ts`.
95
+ These are the ONE place you must edit by hand, and the build stops until you do.
96
+
97
+ A slug in the table but missing from a mirror is **not silent**: every guard re-derives
98
+ from the migration SQL, so it is a red build — never a divergence nobody notices.
99
+
100
+ ### What can still go wrong
101
+
102
+ - **A mirror can be added.** Nothing structurally prevents a fifth copy; the tripwire
103
+ only polices the names it knows. This is why step 5 exists as a hand-edit floor.
104
+ - **A guard proves SAMENESS, never CORRECTNESS.** If every mirror and the migration agree
105
+ on a slug that should not exist, all four guards stay green. The vocabulary's MEANING is
106
+ reviewed by a human, not derived.
107
+ - **A new migration file is not auto-scanned.** Each parity guard lists its migration
108
+ filenames. A slug added in `0295_…sql` is invisible to all of them until that list is
109
+ extended — so extending it is part of step 1, not a follow-up.
110
+ - **`@synap-core/types` is published.** Mirror 2 ships to npm; changing it without a
111
+ version bump leaves consumers on the old vocabulary.
@@ -74,7 +74,7 @@ Set `includeTime: true` for datetime; false for date-only. Don't store durations
74
74
  }
75
75
  ```
76
76
 
77
- **Always set `targetProfileSlug`** (or `targetProfileSlugs: [...]` for multi-target). Without it, UI can't render a picker and auto-sync defaults to `related_to`.
77
+ **Always set `targetProfileSlug`** (or `targetProfileSlugs: [...]` for multi-target). Without it, UI can't render a picker. Setting it does not create an edge: auto-sync writes a relation only when the property def is mapped to a relation def (`relationDefId`); an unmapped `entity_id` property creates no relation and has no default type.
78
78
 
79
79
  For linking to users (workspace members), use:
80
80
 
@@ -15,4 +15,4 @@ POST /api/hub/relation-defs
15
15
  }
16
16
  ```
17
17
 
18
- Defining a relation def is rarely worth it — `related_to` + a property usually suffices. Only create one when the relationship is semantic enough that UI should treat it specially (e.g., show "mentored by Jane" on a person's profile card).
18
+ Defining a relation def is rarely worth it — `relates_to` + a property usually suffices. Only create one when the relationship is semantic enough that UI should treat it specially (e.g., show "mentored by Jane" on a person's profile card).
@@ -14,7 +14,7 @@ description: >
14
14
  to the user before committing — workspaces are lenses on data, not silos,
15
15
  and the user decides when a new lens is warranted.
16
16
  metadata:
17
- openclaw:
17
+ synap:
18
18
  requires:
19
19
  env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL]
20
20
  primaryEnv: SYNAP_HUB_API_KEY
@@ -77,6 +77,11 @@ Widget definitions are the source of truth for which cells are installed and how
77
77
  - `deps` pins npm packages for the esm.sh import map. Keys are npm package names; values are version strings. Max 30 entries. React 19 is always available — never put it in `deps`.
78
78
  - Always `GET /api/hub/widget-definitions` first — if a cell already covers the need, use it. New cell definitions are permanent; only create when genuinely novel.
79
79
  - For the full in-frame query/mutate/shell-actions API see the `synap` skill's **ViewFrame Cells** section (or load `synap-ui:SKILL` via `GET /api/hub/skills/system?sections=synap-ui:SKILL`).
80
+ - **"Make this my Posts dashboard"** = a cell bound to the kind's `dashboard` slot, not a new workspace:
81
+ 1. `create_cell` a frame that reads what the kind's own page reads, through the bridge's intent reads: `lifecycle.board`, `lifecycle.throughput`, `attention.needsYou`, `attention.count`, `sessions.list` (params and shapes: `synap` skill, ViewFrame Cells → "Intent reads"). Never pre-fetch rows into the source.
82
+ 2. `promote_cell_to_renderer({ profileSlug: "post", slot: "dashboard", cellKey })`. `dashboard` is the `entity-profile` content kind. It is governed, so `proposed` is success.
83
+ - On a kind with a lifecycle the cell fills the **Dashboard** tab and the Pipeline tab stays the board (its moves and card frame are the kind's). On a kind without one, the cell is the page.
84
+ - A saved view can take the same slot from the app (Keep → Become renderer of… → Whole profile dashboard). Any view type renders there.
80
85
 
81
86
  ---
82
87
 
@@ -150,15 +155,15 @@ POST /api/hub/views // a bento is just a view with type="bento"
150
155
  "config": {
151
156
  "blocks": [
152
157
  { "id": "b1", "kind": "view", "viewId": "<kanbanId>",
153
- "layout": { "x": 0, "y": 0, "w": 8, "h": 4 } },
154
- { "id": "b2", "kind": "entity", "entityId": "ent_current_project",
155
- "layout": { "x": 8, "y": 0, "w": 4, "h": 4 } },
156
- { "id": "b3", "kind": "widget", "widgetKind": "quick-access",
157
- "layout": { "x": 0, "y": 4, "w": 6, "h": 2 },
158
- "config": { "items": [ … ] } },
159
- { "id": "b4", "kind": "widget", "widgetKind": "stat-card",
160
- "layout": { "x": 6, "y": 4, "w": 6, "h": 2 },
161
- "config": { "metric": "entities_created_this_week" } }
158
+ "pos": { "x": 0, "y": 0, "w": 8, "h": 4 } },
159
+ { "id": "b2", "kind": "entity", "entityId": "<entityId>",
160
+ "pos": { "x": 8, "y": 0, "w": 4, "h": 4 } },
161
+ { "id": "b3", "kind": "widget", "widgetType": "quick-access",
162
+ "pos": { "x": 0, "y": 4, "w": 6, "h": 2 },
163
+ "config": {} },
164
+ { "id": "b4", "kind": "widget", "widgetType": "stat-card",
165
+ "pos": { "x": 6, "y": 4, "w": 6, "h": 2 },
166
+ "config": { "profileSlug": "note", "label": "Notes this week", "timePeriod": "week" } }
162
167
  ]
163
168
  }
164
169
  }
@@ -168,7 +173,7 @@ Block kinds:
168
173
 
169
174
  - `view` — embeds a saved view by `viewId`
170
175
  - `entity` — renders an entity card for a specific `entityId`
171
- - `widget` — renders a registered cell by `widgetKind` with `config`
176
+ - `widget` — renders a catalog cell by `widgetType` (a key from `synap_list_widgets`) with `config`; `pos` places every block
172
177
 
173
178
  Full widget catalog in **`widget-catalog.md`**. Layout patterns in **`bento-recipes.md`**.
174
179
 
@@ -268,6 +273,8 @@ POST /api/hub/views/{bentoViewId}/arrange
268
273
 
269
274
  `bento.arrange` is auto-approved by default. Safe to run without hesitation when the user rearranges or adds widgets.
270
275
 
276
+ Call `synap_list_widgets` first. Only place keys from that list. `stat-card` needs `profileSlug`. `view` / `view-table` need a saved `viewId`. `entity-count` is a legacy alias of `stat-card` — prefer `stat-card`.
277
+
271
278
  ---
272
279
 
273
280
  ## Common mistakes — UI generation
@@ -292,7 +299,7 @@ When you create views or entities for the user inside the AI Companion, **always
292
299
  "Created your tasks pipeline → [[view:abc123|Active Tasks]] · [[open:side|view:abc123]]"
293
300
 
294
301
  // After creating a workspace (home bento view ID "def456"):
295
- "Workspace ready — [[open:main|view:def456|Home Dashboard]]"
302
+ "Space ready — [[open:main|view:def456|Home Dashboard]]"
296
303
 
297
304
  // After creating an entity (e.g. a new project):
298
305
  "Project created → [[entity:proj_789|Q3 Launch]]"
@@ -13,7 +13,7 @@ description: >
13
13
  to the user before committing — workspaces are lenses on data, not silos,
14
14
  and the user decides when a new lens is warranted.
15
15
  metadata:
16
- openclaw:
16
+ synap:
17
17
  requires:
18
18
  env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL]
19
19
  primaryEnv: SYNAP_HUB_API_KEY
@@ -7,7 +7,7 @@ When you create views or entities for the user inside the AI Companion, **always
7
7
  "Created your tasks pipeline → [[view:abc123|Active Tasks]] · [[open:side|view:abc123]]"
8
8
 
9
9
  // After creating a workspace (home bento view ID "def456"):
10
- "Workspace ready — [[open:main|view:def456|Home Dashboard]]"
10
+ "Space ready — [[open:main|view:def456|Home Dashboard]]"
11
11
 
12
12
  // After creating an entity (e.g. a new project):
13
13
  "Project created → [[entity:proj_789|Q3 Launch]]"
@@ -6,3 +6,5 @@ POST /api/hub/views/{bentoViewId}/arrange
6
6
  ```
7
7
 
8
8
  `bento.arrange` is auto-approved by default. Safe to run without hesitation when the user rearranges or adds widgets.
9
+
10
+ Call `synap_list_widgets` first. Only place keys from that list. `stat-card` needs `profileSlug`. `view` / `view-table` need a saved `viewId`. `entity-count` is a legacy alias of `stat-card` — prefer `stat-card`.