@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
@@ -1,6 +1,9 @@
1
1
  operating-mode.md
2
2
  reflexes.md
3
+ concepts.md
4
+ work-model.md
3
5
  escalation-ladder.md
6
+ from-intent.md
4
7
  mental-model.md
5
8
  quick-reference.md
6
9
  lenses.md
@@ -12,6 +15,7 @@ linking-principle.md
12
15
  governance-rules.md
13
16
  capabilities.md
14
17
  writes.md
18
+ writing-titles.md
15
19
  document-embeds.md
16
20
  creative-loop.md
17
21
  graph-gardening.md
@@ -35,3 +39,6 @@ recap.md
35
39
  showing.md
36
40
  user-model.md
37
41
  north-star.md
42
+ processes.md
43
+ mcp-remote-servers.md
44
+ hand-off.md
@@ -12,7 +12,7 @@ description: >
12
12
  when the user asks about their own data. Do NOT use this skill for extending
13
13
  the schema (use synap-schema) or building dashboards and views (use synap-ui).
14
14
  metadata:
15
- openclaw:
15
+ synap:
16
16
  requires:
17
17
  env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL]
18
18
  optional_env:
@@ -39,6 +39,21 @@ Filters narrow the event to specific conditions:
39
39
  }
40
40
  ```
41
41
 
42
+ ### Status changes: the transitioned event
43
+
44
+ A status move (a kind's own lifecycle, or a role's) emits ONE event, `entity.transition.completed` (the verb "transitioned"), whatever moved it: a person, a board drag, an agent through `update_entity` + `expectedStatus`, a sync. Filter it on `lifecycleProfile` (the kind or ROLE whose lifecycle moved; `profileSlug` stays the entity's kind even for a role) and `to` / `from` / `property`:
45
+
46
+ ```json
47
+ {
48
+ "eventPattern": "entity.transition.completed",
49
+ "filters": { "lifecycleProfile": "lead", "to": "qualified" }
50
+ }
51
+ ```
52
+
53
+ Prefer it to `entity.update.completed` for any status. For a ROLE it is the only one: a role's status lives on its facet, so an update rule never sees it.
54
+
55
+ **A worker usually beats a hand-written rule.** "When a post enters Review, run the review" is an activator on the playbook (`on: enters_status`), and "once 5 leads wait in qualified" is `on: count` + `min`; both compile to a governed rule like the one above, fire once per thing per transition, and are throttled by `maxPendingApprovals`. Write the rule by hand only for work no method owns. Workers: `processes`.
56
+
42
57
  ### Cron Expressions
43
58
 
44
59
  Standard 5-field cron (minute hour day month weekday):
@@ -1,180 +1,83 @@
1
- # Capture pipeline — reference
1
+ # Capture — the one write door
2
2
 
3
- Use the capture pipeline when the user pastes a block of unstructured text (email, meeting transcript, LinkedIn bio, article, screenshot of a whiteboard) and you need to extract multiple entities with their relations.
3
+ `synap_capture` (CLI: `synap capture`) is THE door for writing what you learn into the pod. **Never classify your input first.** The payload is a _gradient_ — send as much structure as you already have, in ONE call. Precision comes from sending MORE structure in the SAME call, never from picking a different tool and never from a second "commit" step.
4
4
 
5
- Chaining manual `POST /entities` + `POST /relations` for this is wasteful — the pipeline extracts everything in one server-side LLM call and returns proposals you can review before committing.
6
-
7
- ## Two-step flow
8
-
9
- ### 1. Structure the text
10
-
11
- ```json
12
- POST /api/hub/capture/structure
13
- {
14
- "userId": "{userId}",
15
- "workspaceId": "{workspaceId}",
16
- "text": "Had lunch with Sarah Chen from Acme Corp today. \
17
- She's leading their Series B and asked me to send \
18
- our sales deck by Friday. Mentioned her VP Engineering \
19
- Tom Walker also wants a demo.",
20
- "context": { "source": "chat", "channelId": "ch_…" }, // optional
21
- "profileSlugs": ["person", "company", "task", "event"] // optional filter
22
- }
23
5
  ```
24
-
25
- Response:
26
-
27
- ```json
28
- {
29
- "proposals": [
30
- {
31
- "tempId": "t1",
32
- "profileSlug": "person",
33
- "title": "Sarah Chen",
34
- "properties": { "companyId": "t2" },
35
- "action": "create"
36
- },
37
- {
38
- "tempId": "t2",
39
- "profileSlug": "company",
40
- "title": "Acme Corp",
41
- "properties": {},
42
- "action": "create"
43
- },
44
- {
45
- "tempId": "t3",
46
- "profileSlug": "person",
47
- "title": "Tom Walker",
48
- "properties": { "role": "VP Engineering", "companyId": "t2" },
49
- "action": "create"
50
- },
51
- {
52
- "tempId": "t4",
53
- "profileSlug": "task",
54
- "title": "Send sales deck to Sarah",
55
- "properties": {
56
- "status": "todo",
57
- "dueDate": "2026-04-24",
58
- "assignee": null
59
- },
60
- "action": "create"
61
- },
62
- {
63
- "tempId": "t5",
64
- "profileSlug": "event",
65
- "title": "Lunch with Sarah",
66
- "properties": { "startDate": "2026-04-20", "attendees": ["t1"] },
67
- "action": "create"
68
- }
69
- ],
70
- "relations": [
71
- {
72
- "sourceTempId": "t4",
73
- "targetTempId": "t1",
74
- "relationType": "for_person"
75
- },
76
- {
77
- "sourceTempId": "t4",
78
- "targetTempId": "t5",
79
- "relationType": "from_meeting"
80
- }
81
- ],
82
- "followUp": "Should I also schedule a reminder to follow up with Tom?"
83
- }
6
+ text → free prose; the AI structures it into the right entities (raw text kept as provenance)
7
+ entities[] → you already know the kind + fields
8
+ entities[] + relations[] → a graph; refs link things that don't exist yet, reviewed as ONE proposal
84
9
  ```
85
10
 
86
- **`tempId` is only valid within this response.** It's used to link proposals together before they have real entity IDs.
11
+ **Titles and kinds:** each entity's title is linted — the receipt's `titleLint`
12
+ (per `ref`) names what to rewrite, and `validate: true` shows it before you
13
+ write. Status reports, decisions, open bugs and ideas are not `knowledge`; see
14
+ `writing-titles.md` for the routing rule.
87
15
 
88
- **`action` can be:**
16
+ There is no wrong door to pick, because there is one door. `text` alone is the old "capture"; `entities[]` is the old "rich create"; `entities[] + relations[]` is the composite graph. All three go through `synap_capture`.
89
17
 
90
- - `"create"` — new entity
91
- - `"update"` — existing entity found by title match; `existingEntityId` will be set
92
- - `"skip"` — duplicate already exists, nothing to do
18
+ ## One call → one receipt (no plan-and-commit)
93
19
 
94
- ### 2. Execute (commit) after user confirmation
20
+ You are an agent, so a capture is **one call**. The backend derives that from your identity (agent key ⇒ agent mode) — you never pass a mode. Policy decides the terminal automatically:
95
21
 
96
- Present the proposals to the user. Let them edit, remove, or add items. Then:
22
+ - every op is safe/whitelisted → **auto-applied**
23
+ - any op is destructive or non-whitelisted → the whole graph is **proposed** (atomic, all-or-nothing)
97
24
 
98
- ```json
99
- POST /api/hub/capture/execute
100
- {
101
- "userId": "{userId}",
102
- "workspaceId": "{workspaceId}",
103
- "entities": [ /* edited proposals array */ ],
104
- "relations": [ /* edited relations array */ ]
105
- }
106
- ```
107
-
108
- Response:
25
+ It always returns the same receipt:
109
26
 
110
27
  ```json
111
- {
112
- "created": [{ "tempId": "t1", "entityId": "ent_real_1" }, …],
113
- "updated": [{ "tempId": "t2", "entityId": "ent_existing" }, …],
114
- "skipped": [{ "tempId": "t5", "reason": "duplicate" }],
115
- "relations": { "created": 2, "failed": 0 },
116
- "status": "approved"
117
- }
28
+ { "status": "applied" | "proposed" | "rejected",
29
+ "scope": { "workspaceId": "…", "projectId": "…", "sessionId": "…" },
30
+ "writeReceipt": { … } }
118
31
  ```
119
32
 
120
- The executor goes through governance (see `governance.md`). Expect the same three `status` values.
121
-
122
- ## Placement — existing lenses only
123
-
124
- Capture **never invents a workspace** (or other meta-structure) to "find a home"
125
- for extracted entities. Route into **existing** workspaces/projects/profiles the
126
- user already has — orient + list_profiles first when placement is ambiguous.
127
- Structure emerges progressively: capture into what exists; suggest a new profile only when the user repeatedly tracks a thing that fits none, and a view only once that profile has 3+ entities — never impose schema upfront. Missing structure is an escalation-ladder L2→L3 conversation (discover, then
128
- propose), not a side effect of capture. See `reflexes.md` / `escalation-ladder.md`.
33
+ **`status: "proposed"` is SUCCESS**, not a failure — the write is queued for the user's review like a PR. Surface the `reviewUrl` and keep working. Never report "done" for a `proposed` result, and there is **no** separate step you must call after capture — the one call is the whole write.
129
34
 
130
- ## When to use the pipeline vs. manual CRUD
35
+ ## capture vs create_entity
131
36
 
132
- | Situation | Use |
133
- | ---------------------------------------------------------------- | --------------------------------------------------- |
134
- | User pastes a chunk of text with multiple people/companies/tasks | Pipeline |
135
- | User says "create a task to call Sarah at 3pm" | Manual create (1 entity) |
136
- | User forwards an email | Pipeline |
137
- | User asks "remind me to X" | Manual create |
138
- | OCR'd screenshot, meeting transcript, article body | Pipeline |
139
- | User edits an existing entity | Manual PATCH |
140
- | User wants to save a webpage they're on | Manual create (article) + optional capture for body |
37
+ - **`synap_create_entity`** — use ONLY when you already have exactly ONE fully-structured, typed entity (a known `profileSlug` + fields). Deterministic, direct.
38
+ - **`synap_capture`** — everything else: unstructured text, several entities, a graph, or **when in doubt**. It handles the whole gradient; you don't have to decide "loose fact vs structured object."
141
39
 
142
- Rule of thumb: **one intent, one call.** Multi-entity content, use the pipeline.
40
+ ## Worked examples
143
41
 
144
- **Degrade path (MCP `synap_capture`, the single-call door):** when the structuring pipeline fails or finds nothing to extract, it degrades to a single flat note carrying the raw text verbatim — it never drops the input. Use `synap_capture` only for genuinely unstructured input where you don't yet know the entities; if you already know the exact profileSlug and field values, call `synap_create_entity` instead (deterministic, direct write, no degrade path).
42
+ ```json
43
+ // 1 — raw text (the AI structures it)
44
+ { "text": "Met Ada Lovelace of Acme at the conference — she owns their data platform and wants a demo in March." }
45
+
46
+ // 2 — one structured entity with a long body
47
+ { "entities": [
48
+ { "profileSlug": "person", "title": "Ada Lovelace",
49
+ "properties": { "email": "ada@acme.com", "role": "Head of Data" },
50
+ "content": "## Notes\nOwns the data platform. Wants a March demo." }
51
+ ] }
52
+
53
+ // 3 — a small graph (refs link entities that don't exist yet)
54
+ { "entities": [
55
+ { "ref": "p1", "profileSlug": "person", "title": "Ada Lovelace", "properties": { "email": "ada@acme.com" } },
56
+ { "ref": "c1", "profileSlug": "company", "title": "Acme Corp", "properties": { "website": "https://acme.com" } }
57
+ ],
58
+ "relations": [ { "sourceRef": "p1", "targetRef": "c1", "type": "works_at" } ] }
59
+ ```
145
60
 
146
- ## Dedup within the pipeline
61
+ ## Dedup — strong signals only
147
62
 
148
- The pipeline does its own duplicate check per entity (by title + profileSlug within workspace). When it finds a match, `action` becomes `"update"` with `existingEntityId` set, so the real entity is updated in place, not duplicated.
63
+ The dedup signals are the exact property keys `email`, `phone`, `website`, `linkedinUrl`, `twitterHandle`, `githubUsername`. Sending a URL under any other key (e.g. a bare `url`) is **not** a dedup signal and will duplicate the entity.
149
64
 
150
- You can still prefix with a manual search if you want to show the user "I found 3 existing people that might match" before running capture. But the pipeline alone is usually good enough.
65
+ A same-title hit in a _different_ kind is **advisory** (`crossKindCandidates`), never an auto-merge. So "no exact match" does **not** mean "safe to create" when advisory candidates come back — review them first. To link to something that already exists, give it a `ref` plus `existingEntityId`.
151
66
 
152
- ## Presenting proposals to the user
67
+ ## Name-refs — never ask for a UUID
153
68
 
154
- A good UX turn:
69
+ Reference an existing project by **name**, not id — the server resolves `{ project: { name: "Synap" } }` against the caller's own projects. Exact match ⇒ it files there; no match ⇒ it proposes/creates, never silently mis-files. Never ask the user for a UUID.
155
70
 
156
- > I picked up **5 things** from that paste:
157
- >
158
- > - **Sarah Chen** — person at Acme Corp (new)
159
- > - **Acme Corp** — company (new)
160
- > - **Tom Walker** — person at Acme (new)
161
- > - **Task**: Send sales deck to Sarah, due Friday
162
- > - **Event**: Lunch with Sarah today
163
- >
164
- > Plus 2 connections: task → Sarah, task → lunch.
165
- >
166
- > Ship it?
71
+ ## Placement — existing lenses only
167
72
 
168
- Keep the user in control. Don't auto-execute without confirmation unless the user explicitly told you to.
73
+ Capture **never invents a workspace** (or other meta-structure) to "find a home". It routes into **existing** workspaces/projects/profiles — `synap orient` + `list_profiles` first when placement is ambiguous. Structure emerges progressively: capture into what exists; suggest a new profile only when the user repeatedly tracks a thing that fits none, and a view only once that profile has 3+ entities. Missing structure is an escalation-ladder L2→L3 conversation (discover, then propose), not a side effect of capture. `global: true` stores a pod-wide runbook (text lane only).
169
74
 
170
- ## Edge cases
75
+ ## Rejection is a correct outcome — don't retry
171
76
 
172
- - **Empty text → empty proposals.** Don't call execute with zero entities.
173
- - **Ambiguous references ("he", "they").** The pipeline will often return null properties. Prompt the user to clarify before executing.
174
- - **Dates.** Always absolute in responses (ISO 8601). If the input says "Friday," the pipeline resolves it against today.
175
- - **Custom profiles.** If you want the pipeline to consider custom profiles, pass `profileSlugs` in the request. Otherwise it defaults to system profiles only.
176
- - **Rate limits.** 20 captures/hour per user. If you hit the limit, fall back to manual CRUD.
77
+ `status: "rejected"` means the door protected the graph on purpose. Read the `reason` and act, don't loop:
177
78
 
178
- ## Followup question
79
+ - **`already-known`** — a lone entity carrying nothing but identity signals that already resolve to an existing one. Its id is returned; re-send with content / extra properties / relations to **enrich** it instead.
80
+ - **`no-durable-content`** — nothing storable was sent (empty / whitespace / punctuation-only). Don't call capture with zero substance.
81
+ - **`structuring-unavailable`** — text lane only: the AI structurer is down. Tell the user and retry later.
179
82
 
180
- The response includes a `followUp` field — a single sentence question the pipeline thinks is worth asking next. Surface it to the user verbatim. It's a cheap way to deepen capture without extra prompts.
83
+ (There is no "recall-loop" rejection.)
@@ -40,10 +40,11 @@ synap list entities --profile=task --workspace=<id> --json
40
40
  synap get entity <id> --json
41
41
  ```
42
42
 
43
- **Capturing a decision (the AI structures — it never `note`s):**
43
+ **Recording a decision as its own graph entity:**
44
44
 
45
45
  ```bash
46
- synap capture --type decision --claim "Use Typesense for entity search" --json
46
+ synap create entity --profile=decision --name="Use Typesense for entity search" \
47
+ --props='{"summary":"Use Typesense for entity search","decisionStatus":"accepted"}' --json
47
48
  # Retrieve later with the one read verb: synap ask "Typesense decision"
48
49
  ```
49
50
 
@@ -52,27 +53,32 @@ synap capture --type decision --claim "Use Typesense for entity search" --json
52
53
  **Structured knowledge (durable, typed, searchable — preferred for engineering learnings):**
53
54
 
54
55
  ```bash
55
- # Work lane (default): a domain gotcha/lesson/decision → knowledge entity in the ACTIVE workspace
56
- synap capture --type gotcha --claim "Hono static routes must come before /:id" \
57
- --why "First-match routing; dynamic routes eat static ones" \
58
- --tags "repo:synap-backend,layer:routing" --json
59
-
60
- synap capture --type lesson --claim "code-read ≠ runtime-true for library APIs" \
61
- --evidence "tldraw 2.4.6 binding API changed silently from props.start.boundShapeId"
62
-
63
- # A quick decision-note is a typed knowledge entry (ek_type=decision):
64
- synap capture --type decision --claim "Use Typesense for entity search" \
65
- --why "pgvector deferred to V1; Typesense ships now" --json
66
-
67
- # Global lane: a runbook/best-practice that holds across ALL projects → pod-wide knowledge_keys
68
- synap capture --global --type reference --claim "Always fix the canonical path, never a workaround" \
56
+ # Work lane: one explicit Knowledge form. Keep the Markdown body on the
57
+ # linked document; these properties remain compact/queryable metadata.
58
+ synap create entity --profile=knowledge --name="Hono static route ordering" \
59
+ --workspace=<id> \
60
+ --props='{"knowledgeForm":"caution","ek_claim":"Static routes must come before /:id","ek_tags":["repo:synap-backend","layer:routing"]}' \
61
+ --content=$'## Why\\n\\nStatic routes must come before `/:id`.' --json
62
+
63
+ synap create entity --profile=knowledge --name="Verify library APIs at runtime" \
64
+ --workspace=<id> \
65
+ --props='{"knowledgeForm":"fact","ek_claim":"Code-read is not runtime-true for library APIs"}' \
66
+ --content=$'Validate the installed version before depending on an API.' --json
67
+
68
+ # A Decision is its own lifecycle entity; link it to the supporting Knowledge.
69
+ synap create entity --profile=decision --name="Use Typesense for entity search" \
70
+ --props='{"summary":"pgvector deferred to V1; Typesense ships now","decisionStatus":"accepted"}' --json
71
+
72
+ # A Reference is source material, not a Knowledge form. Create/use a source
73
+ # entity or document and link it as evidence; global runbooks remain knowledge_keys.
74
+ synap capture --global "Always fix the canonical path, never a workaround" \
69
75
  --key "principle:root-cause" --json
70
76
 
71
77
  # Retrieve any of it later with the one read verb (it spans every lane):
72
- synap ask "hono routing gotcha" --json
78
+ synap ask "hono routing caution" --json
73
79
  ```
74
80
 
75
- `synap capture --type` writes a typed **`knowledge`** entity in the **active workspace** (the Work lane); `ek_type` (gotcha|lesson|decision|reference) discriminates the kind — **one store, type tags, not a residual dump**. It's workspace-scoped, so the active workspace supplies the domain — a Builder gotcha ≠ a marketing one (there is no `engineering_knowledge`). Add **`--global`** to write a pod-wide cross-cutting runbook to `knowledge_keys` instead. A formal **decision RECORD** (rationale, alternatives, superseded-by lifecycle) is a different artifact — use smart `synap capture "<free text>"` or `synap create entity --profile=decision`. Retrieve everything with `synap ask`.
81
+ `knowledge` has exactly one canonical `knowledgeForm`: `fact`, `caution` or `convention` (a legacy `insight` is read as `fact`). It is workspace-scoped, so the active workspace supplies the domain. `ek_claim` (the "Claim") is required — the full sentence; the title is its short handle, never the claim cut off. Readable long form belongs in the entity's linked Markdown document. Status reports, decisions, open problems (`issue`) and ideas are not knowledge — see `writing-titles.md`. A formal **Decision** has its own rationale/lifecycle entity, and a **Reference** is source material linked as evidence — neither is a Knowledge form. The legacy `synap capture --type gotcha|lesson|decision|reference` command is still accepted for compatibility, but new automation must use the canonical entity properties above. Retrieve everything with `synap ask`.
76
82
  Use `capture` for anything worth remembering across sessions and projects.
77
83
 
78
84
  **Open (the one display door):**
@@ -10,3 +10,4 @@
10
10
  8. **Forgetting that `GET /channels/personal` needs `hub-protocol.write`** scope — it's get-or-create, not a pure read.
11
11
  9. **Routing known-structure data through free-text capture.** If you already know the profileSlug + fields, create the entity directly — smart capture can degrade to a single flat note.
12
12
  10. **Paragraph session goals.** The goal is one line; put detail and deliverables in expectedOutputs.
13
+ 11. **Creating a `file`/`document`-kind entity to hold text you wrote.** A pitch deck, plan, or note body you authored is `content` on a real CONTENT-kind entity (`note`, `knowledge`, a domain kind) — Synap auto-materializes it into a document. `file` is only for real uploaded bytes you actually have; an agent with no filesystem almost never needs it.
@@ -0,0 +1,28 @@
1
+ ## Concepts — one word per idea
2
+
3
+ The ONE glossary; other skills point here. Word = what the user sees; internal = tools and tables.
4
+
5
+ | Word | Internal | Answers | Test · e.g. · not |
6
+ | ------------- | ----------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
7
+ | **Space** | workspace | which domain: kinds + tools? | owns kinds, never done · CRM · not a project or method; findable, not emphasised |
8
+ | **Project** | project | what am I committed to, with whom? | ends with the commitment; spans spaces · a launch · not a task, method, or the owner's company |
9
+ | **Track** | project_tracks | what lasting intent am I pursuing? | inside ONE project, lasts, never completes; direction, instructions, goal; turns workers on; work in it = sessions · grow the newsletter · no stages |
10
+ | **Step** | stage | where does this work stand? | = the subject's status: move the thing, the step follows · legacy: steps of a track started from a method |
11
+ | **Work** | focus_session | what am I doing this sitting? | one goal · no noun: "Start work" |
12
+ | **Template** | playbook | how do I reuse it? | kind DERIVED, never declared: scope session = work template (a method a session or worker follows), project = track template (legacy); also space and rule templates |
13
+ | **Pack** | suite | which templates come together? | a bundle; depends on space templates, never creates a space |
14
+ | **Rule** | automation | what runs by itself, when? | standing · "every Monday…" · not Approvals |
15
+ | **Approvals** | governance rules | which AI writes wait for me? | decides review vs auto, does no work |
16
+ | **Tools** | capability, skill, tool | what can it act with? | one word; the detail shows the kind |
17
+ | **To review** | proposal | what awaits my approval? | `proposed` is success |
18
+ | **Role** | role profile + facet | which hat does it wear? | one role per name, pod-wide; spaces add properties by overlay; its entities show in all · client · never a twin |
19
+ | **Thing** | entity | what is being worked on? | one kind, maybe roles · a post, a lead · never a twin for a hat |
20
+ | **Status** | lifecycle | where does it stand? | ONE list per kind or role, declared on its profile; category open·active·paused·done·lost · moved only through the door (`expectedStatus`) |
21
+ | **Pipeline** | pipeline view | what is in each status? | computed from a lifecycle, never created · not an object |
22
+ | **Worker** | playbook activator | what starts work by itself? | a method + trigger (enters status · schedule · count · manual) + size (per thing · per batch); a track or project turns it on |
23
+
24
+ Doors: `start_track`, `start_session`, `create_rule`, `attach_facet`, `update_entity` + `expectedStatus` (a status). How they fit (sizes, workers, tenses): `work-model`.
25
+
26
+ A lasting goal on a project: `list_tracks` → none? `start_track` (`name`, `direction`, a `kpi` only if the person names one; no method needed); work in it = `start_session` + `trackId`, as many sessions as it takes. Detail: `from-intent`.
27
+
28
+ Existing work can be filed into a track with `update_session` `trackId` (proposed; the session keeps its space). Track stages are legacy: only a track started from a track template has them (`start_stage_session`; never `advance_track` without the user).
@@ -0,0 +1,92 @@
1
+ ## Content OS — the editorial model
2
+
3
+ Some workspaces run an editorial engine: `pillar`, `post`, `platform`, `newsletter`, plus the reused `campaign` and `sponsor`. Content OS is a **derived lens**, not a silo — the journey it can reason about is a function of what else exists in the pod. Understand this before proposing posts, pillars, or a content plan.
4
+
5
+ **The editorial core:**
6
+
7
+ - **`pillar`** — a recurring theme the audience knows the operator for. Two to four, not twelve. `pillar-status` (Active, Developing, Paused, Retired), `pillar-goal`, `pillar-formats`, `posting-frequency`.
8
+ - **`post`** — the atomic unit. `post-status` is the post's ONE lifecycle: Idea → Briefed → Scripted → In Draft → Review → Scheduled → Published, or Archived (see below). Plus `post-format`, `post-platform`, `publish-date`, `post-hook`, `post-cta`; measured by `engagement-score` and `post-reach`.
9
+ - **`platform`** — a publishing account (social, newsletter publication, podcast). Carries its own cadence and audience metrics.
10
+ - **`newsletter`** — one issue of the owned channel. `newsletter-status`, `newsletter-pillar`.
11
+ - **`campaign`** and **`sponsor`** — reused from marketing / foundation, not owned here.
12
+
13
+ **The journey layer (optional, additive):**
14
+
15
+ - **`journey-stage`** — where a reader is. Each stage names the belief it installs, the doubt it dissolves, and the action that advances them. Unordered _tagging_.
16
+ - **`series`** — an ordered curriculum, prerequisite-bearing: chapter by chapter.
17
+ - **`offer`** — the thing being sold. Owned by the `foundation` workspace, pod-wide. **Frequently absent — see the degradation rule.**
18
+
19
+ A post joins these through `post-stage`, `post-series`, `post-offer`; a repurposed post points at its source with `derived-from`.
20
+
21
+ **Two axes, both optional, composable:** CURRICULUM (`series` — ordered, "which chapter is this?") and AUDIENCE STAGE (`journey-stage` — an unordered tag, "where is the reader?"). A post carries at most one of each. With neither, Content OS still works exactly as a post tracker — that is a valid end state, not an incomplete one.
22
+
23
+ ## The post lifecycle and who moves it
24
+
25
+ The lifecycle is declared on the `post` kind (work model: `load_skill system/synap/work-model`). Categories: Idea = open; Briefed, Scripted, In Draft, Review, Scheduled = active; Published = done; Archived = lost and **human-only**.
26
+
27
+ - **Nothing publishes itself.** Your move to Published is a proposal the person approves on the preview. Never set Archived.
28
+ - **Every move goes through the door:** `update_entity` with `post-status` = the new option AND `expectedStatus` = the status you read. A `conflict` means someone moved it; re-read. Never invent an option.
29
+ - **Workers, as the model maps them:** **Draft** (per post, when it enters Briefed) · **Review prep** (per post, when it enters Review; ends by proposing the publish date) · **Ideas** (per batch, weekly; creates posts at Idea). Today the catalog ships them as Produce Content (enters Briefed, a person approves the script and the draft), Repurpose (enters Published) and Plan Next Content (weekly, off until the operator turns it on).
30
+ - **Results go on each post**, not only in a summary. "What to make next" = read the pipeline (the Posts board): gaps per pillar, posts waiting per status.
31
+
32
+ ## The degradation rule — check before you assume
33
+
34
+ Read the world before you reason about it: `list_profiles` tells you the vocabulary actually provisioned, and the `## Pod Domains` block in your context tells you which domains exist.
35
+
36
+ - **No offer-bearing domain, no `offer` entities** → the journey is pure audience-building. **Do NOT invent commerce.** No CTA to a product that does not exist, no fabricated `offer`, no "book a call" the operator never mentioned. Reason on the curriculum and stage axes and stop there.
37
+ - **`foundation` exists** → bind pillars to its real `audience`, `pain-point` and `positioning` entities rather than inventing personas. A pillar aimed at a persona you made up is worse than a pillar with no audience named.
38
+ - **`journey-stage` / `series` / `offer` absent from `list_profiles`** → this pod runs the plain editorial model. Do not reference those slugs at all.
39
+
40
+ Absence is information, not a hole to fill.
41
+
42
+ ## Pillars before posts
43
+
44
+ A creator known for two to four themes compounds; one posting about everything stays noise. If the operator hands you a dozen post ideas but cannot name the themes underneath, surface THAT before filling the calendar. Every post you propose hangs off a pillar — `post-pillar` plus a `belongs_to_pillar` relation. An unpillared post is drift.
45
+
46
+ ## AI behavior — placing a post on the journey
47
+
48
+ When the operator describes a content idea, propose the post WITH its placement — never a bare title:
49
+
50
+ ```json
51
+ POST /api/hub/entities
52
+ { "userId": "{userId}", "workspaceId": "{wsId}",
53
+ "profileSlug": "post",
54
+ "title": "Why your pricing page loses the sale",
55
+ "properties": {
56
+ "post-status": "Idea",
57
+ "post-format": "Article",
58
+ "post-platform": "LinkedIn",
59
+ "post-pillar": "ent_pillar_positioning",
60
+ "post-stage": "ent_stage_evaluating"
61
+ }
62
+ }
63
+
64
+ POST /api/hub/relations
65
+ { "userId": "{userId}",
66
+ "sourceEntityId": "ent_post_pricing",
67
+ "targetEntityId": "ent_pillar_positioning",
68
+ "type": "belongs_to_pillar"
69
+ }
70
+ ```
71
+
72
+ Omit `post-stage` when no `journey-stage` exists, and omit `post-offer` when no `offer` exists. An empty commercial field is correct; a fabricated one is a defect. Use `derived-from` when the post is a repurpose of an existing one — one idea legitimately becomes a thread, a video, and a newsletter section.
73
+
74
+ ## Gap analysis — proposing the next piece
75
+
76
+ "What should I write next" is an audit, not a brainstorm:
77
+
78
+ 1. **Read the corpus** — one batched `list_entities` pass over `post` and `pillar`. Never one call per post; that is a cost failure.
79
+ 2. **Map it** — each post to its pillar × its stage (or its place in a series). Build the grid before judging it.
80
+ 3. **Find the holes** — a pillar with nothing at the earliest stage; a stage every pillar skips; a series that stops mid-curriculum; a pillar whose last post is months old.
81
+ 4. **Propose the hole, not a topic** — "Pillar X has nothing that removes the pricing objection" beats "here are ten content ideas". Name the pillar, the stage, the belief to install, and the format.
82
+ 5. **Ground it** — a proposed post cites the pillar it serves and, when `foundation` exists, the real `audience` or `pain-point` entity it answers. Otherwise it is a guess dressed as a plan.
83
+
84
+ Rank gaps by what the operator is actually known for, not what they wish they were known for.
85
+
86
+ ## Resolution discipline — resolve BEFORE you create
87
+
88
+ Standard resolve-before-create applies (search once, batched, before proposing anything). Domain-specific matching keys: **platforms** resolve on handle or URL, **offers** on name, **pillars** on theme. Never placeholder — no pillar named "General", no `platform` for an account the operator doesn't have, no `offer` invented so a post has something to sell. Every post you propose attaches to at least a pillar; a post with no pillar and no stage is a note, not content.
89
+
90
+ ## Kind vs facets, and governed writes
91
+
92
+ `sponsor` is a role-profile (`profileKind: role`) — per ENTITY MODEL, resolve the real company first, then `attach_facet`; a sponsoring company is never a second entity, and graph links attach to the parent, not the facet.
@@ -6,12 +6,12 @@ The loop has three moves that compound. Each takes a one-off act and, if it's wo
6
6
 
7
7
  | Do-once (author) | → Crystallize (curate) | Tool |
8
8
  | --------------------------------------- | ----------------------------------- | ----------------------------- |
9
- | Work a multi-step goal in a **session** | → a **playbook** (the process) | `promote_session_to_playbook` |
9
+ | Work a multi-step goal in a **session** | → a **work template** (the process) | `promote_session_to_playbook` |
10
10
  | Show a result in a **cell** | → a **renderer** for an entity type | `promote_cell_to_renderer` |
11
11
 
12
12
  ### 1. Open a session for real work
13
13
 
14
- When the task is a unit of work with a deliverable — research, a build, an investigation, a sprint — and there's no active session, **`start_session`** with a clear `goal` and `expectedOutputs`. The session is the spine that accrues results (see the focus-sessions skill). Don't open one for a one-shot lookup or a casual reply.
14
+ When the task is a unit of work with a deliverable — research, a build, an investigation, a sprint — and there's no active session, **`start_session`** with a clear `goal` and `expectedOutputs`. The start door hands back the pod's matching playbooks (`playbooks.candidates`) — read them before working ad-hoc, and start again with `templateId` when one fits. The session is the spine that accrues results (see the focus-sessions skill). Don't open one for a one-shot lookup or a casual reply.
15
15
 
16
16
  ### 2. Create a cell to REPORT — don't dump data into chat
17
17
 
@@ -22,22 +22,27 @@ When you have something to _show_ the user — a list of leads, a summary, a com
22
22
 
23
23
  ### 3. Promote a good cell to a renderer — recurring presentation
24
24
 
25
- When a cell is a _good, recurring way to present a whole entity type or step_ — e.g. every `bookmark`'s detail view, every `lead`'s list row — promote it with `promote_cell_to_renderer`:
25
+ Every kind already has a built-in card — the readable-first default nobody has to ask for (a brand-new user kind even gets one AUTOMATICALLY, built from its schema). Don't reach for this move by default; reach for it when the user explicitly asks for a different look and a cell has already proven it once.
26
26
 
27
- - Pick the `profileSlug` (the entity type), the `slot` (`list` | `detail` | `dashboard`), and the `cellKey` from `create_cell`.
28
- - This is **governed**: for you it returns `{ status: "proposed", proposalId }`. That is the point — you author the renderer, the user reviews and curates it before it becomes every entity's view. Surface the proposal plainly ("I've proposed this as the detail view for bookmarks — review it when you like"), don't treat it as a failure.
29
- - Use `scope: "pod"` only when the presentation should apply in every workspace; default to workspace scope.
27
+ When a cell is a _good, recurring way to present a whole entity type or step_ — e.g. every `bookmark`'s small card, every `lead`'s list row — promote it with `promote_cell_to_renderer`:
30
28
 
31
- ### 4. Promote a finished session to a playbook — recurring process
29
+ - Pick the `profileSlug` (the entity type), the `slot` (`list` | `card` | `detail` | `dashboard` — `card` is the small embeddable block; most "change how X looks" requests mean this one, not `detail`), and the `cellKey` from `create_cell`.
30
+ - This is **governed**: for you it returns `{ status: "proposed", proposalId }`. That is the point — you author the renderer, the user reviews and curates it before it becomes every entity's view. Surface the proposal plainly ("I've proposed this as the card for bookmarks — review it when you like"), don't treat it as a failure.
31
+ - Use `scope: "pod"` only when the presentation should apply in every workspace; default to workspace scope. Bind PER KIND — never as a blanket replacement for every kind's card.
32
+ - Once it lands, tell the user where to find or revert it: **"⋯ → Customize display"** on that kind's page.
32
33
 
33
- When the session is done **and the work was a repeatable process** (not a one-off), promote it with `promote_session_to_playbook({ sessionId })`. This captures the goal, tasks, expected outputs, and steps as a reusable session template — so next time the process starts pre-built instead of from scratch.
34
+ ### 4. Promote a finished session to a template — recurring process
35
+
36
+ When the session is done **and the work was a repeatable process** (not a one-off), promote it with `promote_session_to_playbook({ sessionId })`. This captures the goal, tasks, expected outputs, and phases as a reusable **work template** (one sitting) — so next time the process starts pre-built instead of from scratch. Words: `concepts`.
34
37
 
35
38
  - Do this at the _end_, once the promised outputs are produced and verified.
36
- - Judge repeatability honestly: a bespoke, never-again investigation is not a playbook. A "weekly competitor scan" or "new-client onboarding" is.
39
+ - Judge repeatability honestly: a bespoke, never-again investigation is not a template. "New-client onboarding" is a work template.
40
+ - If it should **run on its own** ("a weekly competitor scan"), that is a **Rule** that starts the work each cycle (`create_rule`), not a template alone.
41
+ - If the work is a **lasting goal** worked over weeks, start a **track** for it on the project (`start_track`) and run this work template in it (`trackId`) — a track needs no template of its own.
37
42
  - Governed like the others — `promoted` (applied) or `proposed` (awaiting review) are both normal.
38
43
 
39
44
  ### The symmetry
40
45
 
41
- Sessions and cells are the two things you _do_; playbooks and renderers are the two things you _keep_. The instinct to build: **first do it once concretely, watch it work, then offer to crystallize it** — and let the user decide what becomes standing config. Never crystallize speculatively before the one-off has proven itself.
46
+ Sessions and cells are the two things you _do_; templates and renderers are the two things you _keep_. The instinct to build: **first do it once concretely, watch it work, then offer to crystallize it** — and let the user decide what becomes standing config. Never crystallize speculatively before the one-off has proven itself.
42
47
 
43
48
  This is escalation ladder **L4**: crystallize only after proof. Blocked/missing structure climbs L2→L3 first (`escalation-ladder.md`); L4 is the success path, not a substitute for discovery.