@synap-core/cli 1.7.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/dist/commands/agent-chat.d.ts +47 -0
  2. package/dist/commands/agent-chat.js +250 -0
  3. package/dist/commands/agent-chat.js.map +1 -0
  4. package/dist/commands/agent-run.d.ts +47 -0
  5. package/dist/commands/agent-run.js +301 -0
  6. package/dist/commands/agent-run.js.map +1 -0
  7. package/dist/commands/agents.js +85 -46
  8. package/dist/commands/agents.js.map +1 -1
  9. package/dist/commands/artifact.d.ts +26 -0
  10. package/dist/commands/artifact.js +76 -0
  11. package/dist/commands/artifact.js.map +1 -0
  12. package/dist/commands/automation.d.ts +47 -0
  13. package/dist/commands/automation.js +601 -0
  14. package/dist/commands/automation.js.map +1 -0
  15. package/dist/commands/bridge-setup.d.ts +66 -0
  16. package/dist/commands/bridge-setup.js +1112 -0
  17. package/dist/commands/bridge-setup.js.map +1 -0
  18. package/dist/commands/cap-connections.d.ts +28 -0
  19. package/dist/commands/cap-connections.js +224 -0
  20. package/dist/commands/cap-connections.js.map +1 -0
  21. package/dist/commands/capability.d.ts +89 -0
  22. package/dist/commands/capability.js +1523 -0
  23. package/dist/commands/capability.js.map +1 -0
  24. package/dist/commands/cell.d.ts +55 -0
  25. package/dist/commands/cell.js +277 -0
  26. package/dist/commands/cell.js.map +1 -0
  27. package/dist/commands/centrality.d.ts +20 -0
  28. package/dist/commands/centrality.js +94 -0
  29. package/dist/commands/centrality.js.map +1 -0
  30. package/dist/commands/connect.d.ts +2 -0
  31. package/dist/commands/connect.js +25 -10
  32. package/dist/commands/connect.js.map +1 -1
  33. package/dist/commands/connections.js +0 -16
  34. package/dist/commands/connections.js.map +1 -1
  35. package/dist/commands/context.d.ts +22 -0
  36. package/dist/commands/context.js +149 -0
  37. package/dist/commands/context.js.map +1 -0
  38. package/dist/commands/data-extra.d.ts +14 -0
  39. package/dist/commands/data-extra.js +185 -0
  40. package/dist/commands/data-extra.js.map +1 -0
  41. package/dist/commands/data.d.ts +14 -10
  42. package/dist/commands/data.js +353 -192
  43. package/dist/commands/data.js.map +1 -1
  44. package/dist/commands/diagnose.d.ts +20 -0
  45. package/dist/commands/diagnose.js +143 -0
  46. package/dist/commands/diagnose.js.map +1 -0
  47. package/dist/commands/digest.d.ts +17 -0
  48. package/dist/commands/digest.js +121 -0
  49. package/dist/commands/digest.js.map +1 -0
  50. package/dist/commands/discover.d.ts +2 -0
  51. package/dist/commands/discover.js +25 -8
  52. package/dist/commands/discover.js.map +1 -1
  53. package/dist/commands/doc.d.ts +39 -0
  54. package/dist/commands/doc.js +130 -0
  55. package/dist/commands/doc.js.map +1 -0
  56. package/dist/commands/events.d.ts +26 -0
  57. package/dist/commands/events.js +69 -0
  58. package/dist/commands/events.js.map +1 -0
  59. package/dist/commands/explain.d.ts +21 -0
  60. package/dist/commands/explain.js +251 -0
  61. package/dist/commands/explain.js.map +1 -0
  62. package/dist/commands/facet.d.ts +29 -0
  63. package/dist/commands/facet.js +113 -0
  64. package/dist/commands/facet.js.map +1 -0
  65. package/dist/commands/graph.d.ts +18 -0
  66. package/dist/commands/graph.js +74 -0
  67. package/dist/commands/graph.js.map +1 -0
  68. package/dist/commands/home.d.ts +12 -0
  69. package/dist/commands/home.js +54 -0
  70. package/dist/commands/home.js.map +1 -0
  71. package/dist/commands/import.d.ts +38 -0
  72. package/dist/commands/import.js +440 -0
  73. package/dist/commands/import.js.map +1 -0
  74. package/dist/commands/init.d.ts +0 -2
  75. package/dist/commands/init.js +97 -118
  76. package/dist/commands/init.js.map +1 -1
  77. package/dist/commands/keys.d.ts +9 -0
  78. package/dist/commands/keys.js +78 -0
  79. package/dist/commands/keys.js.map +1 -0
  80. package/dist/commands/knowledge.d.ts +34 -18
  81. package/dist/commands/knowledge.js +355 -57
  82. package/dist/commands/knowledge.js.map +1 -1
  83. package/dist/commands/launch.d.ts +50 -0
  84. package/dist/commands/launch.js +790 -0
  85. package/dist/commands/launch.js.map +1 -0
  86. package/dist/commands/lens.d.ts +45 -0
  87. package/dist/commands/lens.js +386 -0
  88. package/dist/commands/lens.js.map +1 -0
  89. package/dist/commands/market.d.ts +209 -0
  90. package/dist/commands/market.js +1368 -0
  91. package/dist/commands/market.js.map +1 -0
  92. package/dist/commands/mcp.d.ts +42 -0
  93. package/dist/commands/mcp.js +184 -0
  94. package/dist/commands/mcp.js.map +1 -0
  95. package/dist/commands/observe.d.ts +9 -0
  96. package/dist/commands/observe.js +93 -0
  97. package/dist/commands/observe.js.map +1 -0
  98. package/dist/commands/open.d.ts +32 -0
  99. package/dist/commands/open.js +85 -0
  100. package/dist/commands/open.js.map +1 -0
  101. package/dist/commands/pod.d.ts +100 -0
  102. package/dist/commands/pod.js +359 -0
  103. package/dist/commands/pod.js.map +1 -0
  104. package/dist/commands/pods.d.ts +6 -0
  105. package/dist/commands/pods.js +160 -50
  106. package/dist/commands/pods.js.map +1 -1
  107. package/dist/commands/proposals-actions.d.ts +7 -0
  108. package/dist/commands/proposals-actions.js +77 -0
  109. package/dist/commands/proposals-actions.js.map +1 -0
  110. package/dist/commands/providers.d.ts +38 -0
  111. package/dist/commands/providers.js +170 -0
  112. package/dist/commands/providers.js.map +1 -0
  113. package/dist/commands/purge.d.ts +23 -0
  114. package/dist/commands/purge.js +148 -0
  115. package/dist/commands/purge.js.map +1 -0
  116. package/dist/commands/raycast.d.ts +15 -0
  117. package/dist/commands/raycast.js +153 -0
  118. package/dist/commands/raycast.js.map +1 -0
  119. package/dist/commands/sessions.d.ts +31 -0
  120. package/dist/commands/sessions.js +248 -0
  121. package/dist/commands/sessions.js.map +1 -0
  122. package/dist/commands/skill-manage.d.ts +21 -0
  123. package/dist/commands/skill-manage.js +195 -0
  124. package/dist/commands/skill-manage.js.map +1 -0
  125. package/dist/commands/skills-commands.d.ts +26 -0
  126. package/dist/commands/skills-commands.js +187 -0
  127. package/dist/commands/skills-commands.js.map +1 -0
  128. package/dist/commands/skills.d.ts +26 -0
  129. package/dist/commands/skills.js +196 -0
  130. package/dist/commands/skills.js.map +1 -0
  131. package/dist/commands/status.d.ts +3 -1
  132. package/dist/commands/status.js +231 -41
  133. package/dist/commands/status.js.map +1 -1
  134. package/dist/commands/statusline.d.ts +24 -0
  135. package/dist/commands/statusline.js +450 -0
  136. package/dist/commands/statusline.js.map +1 -0
  137. package/dist/commands/subscribe.d.ts +19 -0
  138. package/dist/commands/subscribe.js +91 -0
  139. package/dist/commands/subscribe.js.map +1 -0
  140. package/dist/commands/tools.d.ts +30 -0
  141. package/dist/commands/tools.js +315 -0
  142. package/dist/commands/tools.js.map +1 -0
  143. package/dist/commands/versions.d.ts +27 -0
  144. package/dist/commands/versions.js +277 -0
  145. package/dist/commands/versions.js.map +1 -0
  146. package/dist/commands/view.d.ts +57 -0
  147. package/dist/commands/view.js +195 -0
  148. package/dist/commands/view.js.map +1 -0
  149. package/dist/commands/whoami.d.ts +21 -0
  150. package/dist/commands/whoami.js +129 -0
  151. package/dist/commands/whoami.js.map +1 -0
  152. package/dist/index.d.ts +3 -4
  153. package/dist/index.js +1524 -202
  154. package/dist/index.js.map +1 -1
  155. package/dist/lib/agent-templates.d.ts +25 -0
  156. package/dist/lib/agent-templates.js +148 -0
  157. package/dist/lib/agent-templates.js.map +1 -0
  158. package/dist/lib/agents-config.d.ts +4 -1
  159. package/dist/lib/agents-config.js +19 -2
  160. package/dist/lib/agents-config.js.map +1 -1
  161. package/dist/lib/approval-poll.d.ts +42 -0
  162. package/dist/lib/approval-poll.js +52 -0
  163. package/dist/lib/approval-poll.js.map +1 -0
  164. package/dist/lib/auth.d.ts +29 -6
  165. package/dist/lib/auth.js +105 -94
  166. package/dist/lib/auth.js.map +1 -1
  167. package/dist/lib/bundle-version.d.ts +11 -0
  168. package/dist/lib/bundle-version.js +33 -0
  169. package/dist/lib/bundle-version.js.map +1 -0
  170. package/dist/lib/capture-lane.d.ts +67 -0
  171. package/dist/lib/capture-lane.js +136 -0
  172. package/dist/lib/capture-lane.js.map +1 -0
  173. package/dist/lib/cp-packages.d.ts +121 -0
  174. package/dist/lib/cp-packages.js +218 -0
  175. package/dist/lib/cp-packages.js.map +1 -0
  176. package/dist/lib/describe-lens.d.ts +46 -0
  177. package/dist/lib/describe-lens.js +33 -0
  178. package/dist/lib/describe-lens.js.map +1 -0
  179. package/dist/lib/hub-client.d.ts +84 -1
  180. package/dist/lib/hub-client.js +502 -22
  181. package/dist/lib/hub-client.js.map +1 -1
  182. package/dist/lib/installed.d.ts +51 -0
  183. package/dist/lib/installed.js +70 -0
  184. package/dist/lib/installed.js.map +1 -0
  185. package/dist/lib/next-steps.d.ts +61 -0
  186. package/dist/lib/next-steps.js +146 -0
  187. package/dist/lib/next-steps.js.map +1 -0
  188. package/dist/lib/pod.d.ts +104 -19
  189. package/dist/lib/pod.js +245 -57
  190. package/dist/lib/pod.js.map +1 -1
  191. package/dist/lib/project-ref.d.ts +95 -0
  192. package/dist/lib/project-ref.js +144 -0
  193. package/dist/lib/project-ref.js.map +1 -0
  194. package/dist/lib/project.d.ts +35 -0
  195. package/dist/lib/project.js +39 -0
  196. package/dist/lib/project.js.map +1 -0
  197. package/dist/lib/session-lens.d.ts +33 -0
  198. package/dist/lib/session-lens.js +76 -0
  199. package/dist/lib/session-lens.js.map +1 -0
  200. package/dist/lib/skill-import.d.ts +40 -0
  201. package/dist/lib/skill-import.js +203 -0
  202. package/dist/lib/skill-import.js.map +1 -0
  203. package/dist/lib/skills-installer.d.ts +16 -5
  204. package/dist/lib/skills-installer.js +132 -18
  205. package/dist/lib/skills-installer.js.map +1 -1
  206. package/dist/lib/suite.d.ts +28 -0
  207. package/dist/lib/suite.js +29 -0
  208. package/dist/lib/suite.js.map +1 -0
  209. package/dist/lib/superwhisper-import.d.ts +40 -0
  210. package/dist/lib/superwhisper-import.js +389 -0
  211. package/dist/lib/superwhisper-import.js.map +1 -0
  212. package/dist/lib/targets.d.ts +66 -2
  213. package/dist/lib/targets.js +914 -132
  214. package/dist/lib/targets.js.map +1 -1
  215. package/dist/lib/unwrapList.d.ts +1 -0
  216. package/dist/lib/unwrapList.js +20 -0
  217. package/dist/lib/unwrapList.js.map +1 -0
  218. package/dist/utils/logger.d.ts +2 -0
  219. package/dist/utils/logger.js +10 -2
  220. package/dist/utils/logger.js.map +1 -1
  221. package/package.json +10 -4
  222. package/skills/agent-os/SKILL.md +212 -0
  223. package/skills/manifest.json +5 -0
  224. package/skills/onboard/SKILL.md +186 -0
  225. package/skills/synap/SKILL.md +1524 -104
  226. package/skills/synap/_order.txt +37 -0
  227. package/skills/synap/_skill.yaml +24 -0
  228. package/skills/synap/authentication.md +10 -0
  229. package/skills/synap/automations.md +264 -0
  230. package/skills/synap/capabilities.md +107 -0
  231. package/skills/synap/capture.md +10 -0
  232. package/skills/synap/cli-operations.md +107 -0
  233. package/skills/synap/common-mistakes.md +12 -0
  234. package/skills/synap/creative-loop.md +43 -0
  235. package/skills/synap/crm.md +117 -0
  236. package/skills/synap/diagnostics.md +35 -0
  237. package/skills/synap/digesting-a-channel.md +38 -0
  238. package/skills/synap/document-embeds.md +123 -0
  239. package/skills/synap/escalation-ladder.md +71 -0
  240. package/skills/synap/focus-sessions.md +47 -0
  241. package/skills/synap/governance-rules.md +64 -0
  242. package/skills/synap/governance.md +6 -6
  243. package/skills/synap/graph-gardening.md +21 -0
  244. package/skills/synap/inline-patterns.md +38 -0
  245. package/skills/synap/lenses.md +38 -0
  246. package/skills/synap/linking-principle.md +39 -0
  247. package/skills/synap/linking.md +1 -0
  248. package/skills/synap/mental-model.md +45 -0
  249. package/skills/synap/more.md +7 -0
  250. package/skills/synap/multi-entity-capture.md +10 -0
  251. package/skills/synap/next-action.md +37 -0
  252. package/skills/synap/north-star.md +17 -0
  253. package/skills/synap/operating-mode-rules.md +45 -0
  254. package/skills/synap/operating-mode.md +9 -0
  255. package/skills/synap/quick-reference.md +67 -0
  256. package/skills/synap/reading.md +43 -0
  257. package/skills/synap/recap.md +21 -0
  258. package/skills/synap/reflexes.md +46 -0
  259. package/skills/synap/response-style.md +21 -0
  260. package/skills/synap/scope.md +13 -0
  261. package/skills/synap/showing.md +17 -0
  262. package/skills/synap/user-model.md +25 -0
  263. package/skills/synap/viewframe-cells.md +290 -0
  264. package/skills/synap/work-flow.md +113 -0
  265. package/skills/synap/worked-examples.md +53 -0
  266. package/skills/synap/workspace-design.md +45 -0
  267. package/skills/synap/workspace-edges.md +49 -0
  268. package/skills/synap/writes.md +156 -0
  269. package/skills/synap-schema/SKILL.md +97 -6
  270. package/skills/synap-schema/_order.txt +13 -0
  271. package/skills/synap-schema/_skill.yaml +22 -0
  272. package/skills/synap-schema/before-you-touch.md +14 -0
  273. package/skills/synap-schema/common-mistakes.md +9 -0
  274. package/skills/synap-schema/creating-profiles.md +17 -0
  275. package/skills/synap-schema/discover-profiles.md +24 -0
  276. package/skills/synap-schema/entity-scope.md +8 -0
  277. package/skills/synap-schema/extend-vs-create.md +31 -0
  278. package/skills/synap-schema/more.md +6 -0
  279. package/skills/synap-schema/overlay-properties.md +22 -0
  280. package/skills/synap-schema/profiles.md +3 -0
  281. package/skills/synap-schema/property-defs.md +29 -0
  282. package/skills/synap-schema/read-before-write.md +50 -0
  283. package/skills/synap-schema/relations.md +18 -0
  284. package/skills/synap-schema/worked-example.md +30 -0
  285. package/skills/synap-ui/SKILL.md +38 -11
  286. package/skills/synap-ui/_order.txt +13 -0
  287. package/skills/synap-ui/_skill.yaml +23 -0
  288. package/skills/synap-ui/ai-companion.md +27 -0
  289. package/skills/synap-ui/arranging-bento.md +8 -0
  290. package/skills/synap-ui/before-you-build.md +20 -0
  291. package/skills/synap-ui/bento-layouts.md +35 -0
  292. package/skills/synap-ui/common-mistakes.md +10 -0
  293. package/skills/synap-ui/creating-views.md +26 -0
  294. package/skills/synap-ui/four-builds.md +24 -0
  295. package/skills/synap-ui/more.md +7 -0
  296. package/skills/synap-ui/proposing-vs-extending.md +11 -0
  297. package/skills/synap-ui/view-list.md +24 -0
  298. package/skills/synap-ui/views.md +3 -0
  299. package/skills/synap-ui/worked-example.md +18 -0
  300. package/skills/synap-ui/workspaces.md +47 -0
  301. package/templates/automations/bookmark-enrichment.automation.json +44 -0
  302. package/templates/automations/mail-feed.automation.json +86 -0
  303. package/templates/automations/url-bookmark-capture.automation.json +70 -0
  304. package/templates/skills/README.md +21 -0
  305. package/templates/skills/authoring-automations/SKILL.md +95 -0
  306. package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
  307. package/templates/skills/authoring-capabilities/SKILL.md +93 -0
  308. package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
  309. package/templates/skills/authoring-playbooks/SKILL.md +102 -0
  310. package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
  311. package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
  312. package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
  313. package/templates/skills/coordinating-agents/SKILL.md +32 -0
  314. package/templates/skills/coordinating-branches/SKILL.md +27 -0
  315. package/templates/skills/mapping-the-server/SKILL.md +54 -0
  316. package/templates/skills/reading-client-progress/SKILL.md +65 -0
  317. package/templates/skills/routing-to-channels/SKILL.md +54 -0
  318. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  319. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  320. package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  321. package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  322. package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  323. package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  324. package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  325. package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  326. package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  327. package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  328. package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  329. package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  330. package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  331. package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  332. package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  333. package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  334. package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  335. package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  336. package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  337. package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  338. package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  339. package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  340. package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  341. package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  342. package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  343. package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  344. package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  345. package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  346. package/dist/commands/finish.d.ts +0 -25
  347. package/dist/commands/finish.js +0 -274
  348. package/dist/commands/finish.js.map +0 -1
  349. package/dist/commands/openclaw.d.ts +0 -40
  350. package/dist/commands/openclaw.js +0 -1148
  351. package/dist/commands/openclaw.js.map +0 -1
  352. package/dist/commands/security-audit.d.ts +0 -12
  353. package/dist/commands/security-audit.js +0 -100
  354. package/dist/commands/security-audit.js.map +0 -1
  355. package/dist/lib/hardening.d.ts +0 -18
  356. package/dist/lib/hardening.js +0 -214
  357. package/dist/lib/hardening.js.map +0 -1
  358. package/dist/lib/templates.d.ts +0 -11
  359. package/dist/lib/templates.js +0 -13
  360. package/dist/lib/templates.js.map +0 -1
  361. package/dist/templates/agent-os.json +0 -3090
  362. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
  363. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
  364. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
  365. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
  366. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  367. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
  368. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  369. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
  370. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
  371. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Project-ref resolution — the ONE door (P4-lite W3).
3
+ *
4
+ * A project ref can name a project on ANY pod the user can see, resolved via
5
+ * the Control Plane directory (`GET /projects/resolve?ref=`). Every command
6
+ * that accepts a project ref parses + resolves it HERE — no second ref parser
7
+ * anywhere.
8
+ *
9
+ * Ref forms (ratified):
10
+ * - uuid → local: today's behavior, pinned against the active pod
11
+ * - `<pod-subdomain>/<slug>` → canonical cross-pod form (e.g. perso/synap)
12
+ * - bare `<slug>` → resolved when unique across visible pods; 300-ambiguous otherwise
13
+ *
14
+ * The directory is an ACCELERATOR, not a dependency: CP unreachable, not
15
+ * logged in, or 404 all degrade to a graceful message — the uuid path never
16
+ * touches the CP and keeps working.
17
+ */
18
+ import { getStoredToken, getCpUrl } from "./auth.js";
19
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
20
+ /** Pod subdomains and project slugs: alphanum with internal `-`/`_`/`.`. */
21
+ const PART_RE = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
22
+ export function parseProjectRef(raw) {
23
+ const ref = raw.trim();
24
+ if (!ref)
25
+ return { kind: "invalid", reason: "empty project ref" };
26
+ if (UUID_RE.test(ref))
27
+ return { kind: "uuid", id: ref.toLowerCase() };
28
+ const parts = ref.split("/");
29
+ if (parts.length === 2) {
30
+ const [pod, slug] = parts;
31
+ if (!PART_RE.test(pod) || !PART_RE.test(slug)) {
32
+ return {
33
+ kind: "invalid",
34
+ reason: `"${ref}" is not a valid <pod>/<slug> ref (letters, digits, - _ . only)`,
35
+ };
36
+ }
37
+ return { kind: "fq", pod: pod.toLowerCase(), slug: slug.toLowerCase() };
38
+ }
39
+ if (parts.length > 2) {
40
+ return { kind: "invalid", reason: `"${ref}" has too many '/' — use <pod-subdomain>/<slug>` };
41
+ }
42
+ if (!PART_RE.test(ref)) {
43
+ return {
44
+ kind: "invalid",
45
+ reason: `"${ref}" is not a project uuid, slug, or <pod>/<slug> ref`,
46
+ };
47
+ }
48
+ return { kind: "slug", slug: ref.toLowerCase() };
49
+ }
50
+ /**
51
+ * Resolve a project ref. uuid short-circuits to `local` (today's behavior);
52
+ * everything else goes through the CP directory with the CLI's CP credentials.
53
+ */
54
+ export async function resolveProjectRef(raw, deps = {}) {
55
+ const parsed = parseProjectRef(raw);
56
+ if (parsed.kind === "invalid")
57
+ return { kind: "invalid", reason: parsed.reason };
58
+ if (parsed.kind === "uuid")
59
+ return { kind: "local", projectId: parsed.id };
60
+ const creds = (deps.getToken ?? getStoredToken)();
61
+ if (!creds?.token)
62
+ return { kind: "not-logged-in" };
63
+ const cpUrl = deps.cpUrl ?? getCpUrl();
64
+ const fetchImpl = deps.fetchImpl ?? fetch;
65
+ const ref = parsed.kind === "fq" ? `${parsed.pod}/${parsed.slug}` : parsed.slug;
66
+ let res;
67
+ try {
68
+ res = await fetchImpl(`${cpUrl}/projects/resolve?ref=${encodeURIComponent(ref)}`, {
69
+ headers: { Authorization: `Bearer ${creds.token}` },
70
+ signal: AbortSignal.timeout(10_000),
71
+ });
72
+ }
73
+ catch (err) {
74
+ const detail = err instanceof Error ? err.message : String(err);
75
+ return {
76
+ kind: "cp-error",
77
+ message: `could not reach the project directory at ${cpUrl} (${detail})`,
78
+ };
79
+ }
80
+ if (res.status === 300) {
81
+ const body = (await res.json().catch(() => null));
82
+ return { kind: "ambiguous", candidates: body?.candidates ?? [] };
83
+ }
84
+ if (res.status === 404) {
85
+ // The CP distinguishes "exists but archived/completed" from truly absent.
86
+ const body = (await res.json().catch(() => null));
87
+ if (body?.status)
88
+ return { kind: "not-active", ref, status: body.status };
89
+ return { kind: "not-found", ref };
90
+ }
91
+ if (res.status === 401 || res.status === 403)
92
+ return { kind: "not-logged-in" };
93
+ if (!res.ok) {
94
+ return { kind: "cp-error", message: `the project directory returned HTTP ${res.status}` };
95
+ }
96
+ const body = (await res.json().catch(() => null));
97
+ if (!body?.projectId || !body?.podUrl) {
98
+ return { kind: "cp-error", message: "the project directory returned an incomplete resolution" };
99
+ }
100
+ return {
101
+ kind: "resolved",
102
+ project: body,
103
+ refPod: parsed.kind === "fq" ? parsed.pod : undefined,
104
+ };
105
+ }
106
+ // ─── Helpers shared by callers ────────────────────────────────────────────────
107
+ /** True when two pod URLs name the same origin (scheme+host+port). */
108
+ export function samePodOrigin(a, b) {
109
+ if (!a || !b)
110
+ return false;
111
+ try {
112
+ return new URL(a).origin === new URL(b).origin;
113
+ }
114
+ catch {
115
+ return a === b;
116
+ }
117
+ }
118
+ /**
119
+ * Session-lens guard: the per-Claude-session lens has NO pod field, so a
120
+ * `--session` pin can only target a project on the ACTIVE pod. Returns the
121
+ * refusal message for a cross-pod ref, or null when the pin is allowed.
122
+ */
123
+ export function sessionScopeRefusal(project, activePodUrl) {
124
+ if (samePodOrigin(activePodUrl, project.podUrl))
125
+ return null;
126
+ return (`--session scopes only this Claude session, and the session lens has no pod field — ` +
127
+ `it cannot bind a project on another pod (${project.podUrl}). ` +
128
+ `Re-run without --session to switch the active pod, or pick a project on the active pod.`);
129
+ }
130
+ /** `pod/slug` label for a candidate row, degrading to whatever fields exist. */
131
+ export function candidateLabel(c) {
132
+ // The CP emits podUrl (never a subdomain field); derive the label from it.
133
+ let pod;
134
+ if (c.podUrl) {
135
+ try {
136
+ pod = new URL(c.podUrl).hostname;
137
+ }
138
+ catch {
139
+ pod = c.podUrl;
140
+ }
141
+ }
142
+ return `${pod ?? "?"}/${c.slug ?? c.projectId ?? "?"}`;
143
+ }
144
+ //# sourceMappingURL=project-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-ref.js","sourceRoot":"","sources":["../../src/lib/project-ref.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Project doors shared by `synap launch` and `synap market install`.
3
+ *
4
+ * The project is the cross-cutting lens both commands link installs to: launch
5
+ * stands up a NEW company under a project, market install ADDS a package into an
6
+ * existing (or the active) project. Both need the same two primitives — list the
7
+ * pod's projects, and create one — so they live here instead of being duplicated.
8
+ * The INTERACTIVE picking differs per command (launch weaves it into its guided
9
+ * flow; market offers a standalone "Add to which project?" with a pod-wide
10
+ * escape), so that stays in each command; only the data doors are shared.
11
+ */
12
+ import { type HubConfig } from "./hub-client.js";
13
+ export interface ProjectRef {
14
+ id: string;
15
+ name: string;
16
+ }
17
+ /**
18
+ * The pod's existing projects (`GET /projects`), normalized to `{id, name}`.
19
+ * Best-effort: an unreachable/erroring pod yields `[]` rather than throwing, so
20
+ * callers degrade to create-new / pod-wide instead of failing.
21
+ */
22
+ export declare function fetchProjects(cfg: HubConfig): Promise<ProjectRef[]>;
23
+ /**
24
+ * Create a project (`POST /projects`). Governance may answer with a proposal
25
+ * instead of creating directly — the caller distinguishes `id` (live) from
26
+ * `proposalId` (queued for review) and messages accordingly.
27
+ */
28
+ export declare function createProject(cfg: HubConfig, input: {
29
+ name: string;
30
+ description?: string;
31
+ }): Promise<{
32
+ id?: string;
33
+ proposalId?: string;
34
+ status?: string;
35
+ }>;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Project doors shared by `synap launch` and `synap market install`.
3
+ *
4
+ * The project is the cross-cutting lens both commands link installs to: launch
5
+ * stands up a NEW company under a project, market install ADDS a package into an
6
+ * existing (or the active) project. Both need the same two primitives — list the
7
+ * pod's projects, and create one — so they live here instead of being duplicated.
8
+ * The INTERACTIVE picking differs per command (launch weaves it into its guided
9
+ * flow; market offers a standalone "Add to which project?" with a pod-wide
10
+ * escape), so that stays in each command; only the data doors are shared.
11
+ */
12
+ import { hubGet, hubPost } from "./hub-client.js";
13
+ import { unwrapList } from "./unwrapList.js";
14
+ /**
15
+ * The pod's existing projects (`GET /projects`), normalized to `{id, name}`.
16
+ * Best-effort: an unreachable/erroring pod yields `[]` rather than throwing, so
17
+ * callers degrade to create-new / pod-wide instead of failing.
18
+ */
19
+ export async function fetchProjects(cfg) {
20
+ try {
21
+ const res = (await hubGet("/projects", {}, cfg));
22
+ const list = unwrapList(res, ["projects"]);
23
+ return list
24
+ .filter((p) => p.id)
25
+ .map((p) => ({ id: String(p.id), name: String(p.name ?? p.id) }));
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ /**
32
+ * Create a project (`POST /projects`). Governance may answer with a proposal
33
+ * instead of creating directly — the caller distinguishes `id` (live) from
34
+ * `proposalId` (queued for review) and messages accordingly.
35
+ */
36
+ export async function createProject(cfg, input) {
37
+ return (await hubPost("/projects", { name: input.name, description: input.description || undefined, status: "active" }, cfg));
38
+ }
39
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAO7C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAc;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAY,CAAC;QAC5D,MAAM,IAAI,GAAG,UAAU,CAA0B,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QACpE,OAAO,IAAI;aACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAc,EACd,KAA6C;IAE7C,OAAO,CAAC,MAAM,OAAO,CACnB,WAAW,EACX,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EACnF,GAAG,CACJ,CAA0D,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Per-Claude-session lens registry.
3
+ *
4
+ * Claude Code assigns each session (each tab / instance) a stable
5
+ * `CLAUDE_CODE_SESSION_ID` — present BOTH in the bash env of the agent's
6
+ * commands AND in the JSON the statusline receives on stdin. That shared id
7
+ * lets us bind a per-session "lens" (which workspace / project / focus session
8
+ * this session is working through) without any backend change: the pod stays
9
+ * agnostic, the CLI layers session-scoped state on top.
10
+ *
11
+ * This is what makes concurrent Claude Code sessions independent — tab A on
12
+ * workspace Builder + session X, tab B on workspace Marketing + session Y —
13
+ * instead of all sharing one global `~/.synap/config.json` workspace.
14
+ *
15
+ * Registry: ~/.synap/lenses/<session_id>.json
16
+ * Resolution precedence (highest first): explicit flag > session lens >
17
+ * env SYNAP_WORKSPACE_ID > global config activeWorkspaceId.
18
+ */
19
+ export interface SessionLens {
20
+ workspaceId?: string;
21
+ projectId?: string;
22
+ focusSessionId?: string;
23
+ updatedAt?: number;
24
+ }
25
+ /** The current Claude Code session id, if we're running inside one. */
26
+ export declare function getClaudeSessionId(): string | undefined;
27
+ export declare function readLens(sessionId: string): SessionLens | null;
28
+ /** Merge-write the lens for a session (creates the registry dir on demand). */
29
+ export declare function writeLens(sessionId: string, patch: Partial<SessionLens>): SessionLens;
30
+ /** Clear one field (or the whole lens) for a session. */
31
+ export declare function clearLensField(sessionId: string, field?: keyof SessionLens): void;
32
+ /** The active session's lens, or null if not in a Claude session / none set. */
33
+ export declare function resolveActiveLens(): SessionLens | null;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Per-Claude-session lens registry.
3
+ *
4
+ * Claude Code assigns each session (each tab / instance) a stable
5
+ * `CLAUDE_CODE_SESSION_ID` — present BOTH in the bash env of the agent's
6
+ * commands AND in the JSON the statusline receives on stdin. That shared id
7
+ * lets us bind a per-session "lens" (which workspace / project / focus session
8
+ * this session is working through) without any backend change: the pod stays
9
+ * agnostic, the CLI layers session-scoped state on top.
10
+ *
11
+ * This is what makes concurrent Claude Code sessions independent — tab A on
12
+ * workspace Builder + session X, tab B on workspace Marketing + session Y —
13
+ * instead of all sharing one global `~/.synap/config.json` workspace.
14
+ *
15
+ * Registry: ~/.synap/lenses/<session_id>.json
16
+ * Resolution precedence (highest first): explicit flag > session lens >
17
+ * env SYNAP_WORKSPACE_ID > global config activeWorkspaceId.
18
+ */
19
+ import fs from "node:fs";
20
+ import os from "node:os";
21
+ import path from "node:path";
22
+ const LENS_DIR = path.join(os.homedir(), ".synap", "lenses");
23
+ /** The current Claude Code session id, if we're running inside one. */
24
+ export function getClaudeSessionId() {
25
+ // Set in the bash env of the agent's commands. The statusline gets the same
26
+ // id from stdin and forwards it via SYNAP_LENS_SESSION when it spawns the
27
+ // detached refresh (which has no Claude env of its own).
28
+ return process.env.SYNAP_LENS_SESSION || process.env.CLAUDE_CODE_SESSION_ID || undefined;
29
+ }
30
+ function lensPath(sessionId) {
31
+ // session ids are UUIDs — safe as filenames, but sanitize defensively.
32
+ const safe = sessionId.replace(/[^a-zA-Z0-9_-]/g, "_");
33
+ return path.join(LENS_DIR, `${safe}.json`);
34
+ }
35
+ export function readLens(sessionId) {
36
+ try {
37
+ return JSON.parse(fs.readFileSync(lensPath(sessionId), "utf-8"));
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ /** Merge-write the lens for a session (creates the registry dir on demand). */
44
+ export function writeLens(sessionId, patch) {
45
+ const prev = readLens(sessionId) ?? {};
46
+ const next = { ...prev, ...patch, updatedAt: Date.now() };
47
+ try {
48
+ fs.mkdirSync(LENS_DIR, { recursive: true, mode: 0o700 });
49
+ fs.writeFileSync(lensPath(sessionId), JSON.stringify(next, null, 2), { mode: 0o600 });
50
+ }
51
+ catch {
52
+ /* best-effort */
53
+ }
54
+ return next;
55
+ }
56
+ /** Clear one field (or the whole lens) for a session. */
57
+ export function clearLensField(sessionId, field) {
58
+ const prev = readLens(sessionId);
59
+ if (!prev)
60
+ return;
61
+ if (!field) {
62
+ try {
63
+ fs.unlinkSync(lensPath(sessionId));
64
+ }
65
+ catch { }
66
+ return;
67
+ }
68
+ delete prev[field];
69
+ writeLens(sessionId, prev);
70
+ }
71
+ /** The active session's lens, or null if not in a Claude session / none set. */
72
+ export function resolveActiveLens() {
73
+ const id = getClaudeSessionId();
74
+ return id ? readLens(id) : null;
75
+ }
76
+ //# sourceMappingURL=session-lens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lens.js","sourceRoot":"","sources":["../../src/lib/session-lens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAS7D,uEAAuE;AACvE,MAAM,UAAU,kBAAkB;IAChC,4EAA4E;IAC5E,0EAA0E;IAC1E,yDAAyD;IACzD,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,SAAS,CAAC;AAC3F,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB;IACjC,uEAAuE;IACvE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAiB;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAgB,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,KAA2B;IACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACvE,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,KAAyB;IACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACpD,OAAO;IACT,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Skill import — read standard SKILL.md skill directories and push them to the pod.
3
+ *
4
+ * Follows the Agent Skills open standard (agentskills.io): a skill is a DIRECTORY
5
+ * with a `SKILL.md` at its root (YAML frontmatter + markdown body) and optional
6
+ * nested files/subdirs for reference docs, examples, templates, and code. Every
7
+ * non-SKILL.md file becomes a linked document (the agent reads them on demand via
8
+ * get_document). This is the same format Claude Code, Codex, Gemini CLI, Copilot
9
+ * and others use.
10
+ *
11
+ * The pod stores them via POST /agent-skills/import: the SKILL.md body becomes
12
+ * the instruction skill, every other file becomes a linked document.
13
+ */
14
+ import { type HubConfig } from "./hub-client.js";
15
+ export interface ParsedSkill {
16
+ slug: string;
17
+ name: string;
18
+ description: string;
19
+ body: string;
20
+ /** auto_load=true → always-loaded core DNA; false → on-demand (catalog + load_skill). */
21
+ autoLoad: boolean;
22
+ documents: Array<{
23
+ title: string;
24
+ content: string;
25
+ type: string;
26
+ language?: string;
27
+ }>;
28
+ }
29
+ /** Parse a single SKILL.md skill directory into an import payload. */
30
+ export declare function parseSkillDir(dir: string): ParsedSkill | null;
31
+ /** Find every skill directory (one containing SKILL.md) under a root, one level deep. */
32
+ export declare function discoverSkillDirs(root: string): string[];
33
+ export interface ImportResult {
34
+ slug: string;
35
+ status: "imported" | "exists" | "error";
36
+ docs: number;
37
+ error?: string;
38
+ }
39
+ /** Import a parsed skill into the pod via POST /agent-skills/import. */
40
+ export declare function importSkill(parsed: ParsedSkill, userId: string, cfg: HubConfig): Promise<ImportResult>;
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Skill import — read standard SKILL.md skill directories and push them to the pod.
3
+ *
4
+ * Follows the Agent Skills open standard (agentskills.io): a skill is a DIRECTORY
5
+ * with a `SKILL.md` at its root (YAML frontmatter + markdown body) and optional
6
+ * nested files/subdirs for reference docs, examples, templates, and code. Every
7
+ * non-SKILL.md file becomes a linked document (the agent reads them on demand via
8
+ * get_document). This is the same format Claude Code, Codex, Gemini CLI, Copilot
9
+ * and others use.
10
+ *
11
+ * The pod stores them via POST /agent-skills/import: the SKILL.md body becomes
12
+ * the instruction skill, every other file becomes a linked document.
13
+ */
14
+ import fs from "node:fs";
15
+ import path from "node:path";
16
+ import { hubPost } from "./hub-client.js";
17
+ /**
18
+ * Minimal YAML frontmatter parser for SKILL.md. The frontmatter is intentionally
19
+ * simple (name, description, a flat `metadata:` block) so we avoid a YAML dep.
20
+ */
21
+ function parseFrontmatter(raw) {
22
+ if (!raw.startsWith("---"))
23
+ return { fm: {}, body: raw };
24
+ const end = raw.indexOf("\n---", 3);
25
+ if (end === -1)
26
+ return { fm: {}, body: raw };
27
+ const fmBlock = raw.slice(3, end).trim();
28
+ const body = raw.slice(end + 4).replace(/^\s*\n/, "");
29
+ const fm = {};
30
+ for (const line of fmBlock.split("\n")) {
31
+ const m = line.match(/^\s*([a-zA-Z0-9_-]+):\s*(.*)$/);
32
+ if (m && m[2] !== "")
33
+ fm[m[1].trim()] = m[2].trim().replace(/^["']|["']$/g, "");
34
+ }
35
+ return { fm, body };
36
+ }
37
+ /**
38
+ * Recursively walk a directory, collecting every file (except SKILL.md) as a
39
+ * document. Preserves the relative path from `root` as the document title so the
40
+ * agent can reference files exactly as they appear in the skill (e.g.
41
+ * "reference/02-scoring-framework.md", "examples/q2-description-rewrites.md",
42
+ * "templates/abstract-review-builder.py").
43
+ *
44
+ * Binary files are skipped. Files over 512KB are skipped (anti-bloat guard).
45
+ */
46
+ function collectAllDocuments(root, skillMdPath) {
47
+ const docs = [];
48
+ const MAX_BYTES = 512 * 1024;
49
+ function walk(dir, prefix) {
50
+ let entries;
51
+ try {
52
+ entries = fs.readdirSync(dir, { withFileTypes: true });
53
+ }
54
+ catch {
55
+ return;
56
+ }
57
+ for (const entry of entries) {
58
+ const full = path.join(dir, entry.name);
59
+ const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
60
+ if (entry.isDirectory() || entry.isSymbolicLink()) {
61
+ // Follow symlink dirs; skip node_modules + .git
62
+ try {
63
+ const stat = entry.isSymbolicLink() ? fs.statSync(full) : null;
64
+ const isDir = entry.isDirectory() || (stat?.isDirectory() ?? false);
65
+ if (isDir && !["node_modules", ".git"].includes(entry.name)) {
66
+ walk(full, relPath);
67
+ }
68
+ }
69
+ catch { /* broken symlink — skip */ }
70
+ continue;
71
+ }
72
+ if (!entry.isFile())
73
+ continue;
74
+ if (full === skillMdPath)
75
+ continue; // body, not a document
76
+ if (entry.name.startsWith("."))
77
+ continue; // hidden files
78
+ try {
79
+ const stat = fs.statSync(full);
80
+ if (stat.size > MAX_BYTES)
81
+ continue;
82
+ }
83
+ catch {
84
+ continue;
85
+ }
86
+ // Map extension → document type
87
+ const ext = path.extname(entry.name).toLowerCase();
88
+ let type = "markdown";
89
+ let language;
90
+ if (ext === ".md") {
91
+ type = "markdown";
92
+ }
93
+ else if (ext === ".py") {
94
+ type = "code";
95
+ language = "python";
96
+ }
97
+ else if (ext === ".js" || ext === ".ts") {
98
+ type = "code";
99
+ language = ext === ".ts" ? "typescript" : "javascript";
100
+ }
101
+ else if (ext === ".json") {
102
+ type = "code";
103
+ language = "json";
104
+ }
105
+ else if (ext === ".txt") {
106
+ type = "text";
107
+ }
108
+ else {
109
+ continue;
110
+ } // skip binary/unrecognized
111
+ let content;
112
+ try {
113
+ content = fs.readFileSync(full, "utf-8");
114
+ }
115
+ catch {
116
+ continue;
117
+ } // binary file detected at read time — skip
118
+ docs.push({ title: relPath, content, type, language });
119
+ }
120
+ }
121
+ walk(root, "");
122
+ return docs;
123
+ }
124
+ /** Parse a single SKILL.md skill directory into an import payload. */
125
+ export function parseSkillDir(dir) {
126
+ const skillMd = path.join(dir, "SKILL.md");
127
+ if (!fs.existsSync(skillMd))
128
+ return null;
129
+ const raw = fs.readFileSync(skillMd, "utf-8");
130
+ const { fm, body } = parseFrontmatter(raw);
131
+ return {
132
+ slug: fm.name || path.basename(dir),
133
+ name: fm.name || path.basename(dir),
134
+ description: fm.description || "",
135
+ body: body.trim(),
136
+ autoLoad: fm.auto_load === "true",
137
+ documents: collectAllDocuments(dir, skillMd),
138
+ };
139
+ }
140
+ /** Find every skill directory (one containing SKILL.md) under a root, one level deep. */
141
+ export function discoverSkillDirs(root) {
142
+ if (!fs.existsSync(root))
143
+ return [];
144
+ if (fs.existsSync(path.join(root, "SKILL.md")))
145
+ return [root];
146
+ const out = [];
147
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
148
+ const full = path.join(root, entry.name);
149
+ const isDir = entry.isDirectory() ||
150
+ (entry.isSymbolicLink() && fs.statSync(full).isDirectory());
151
+ if (isDir && fs.existsSync(path.join(full, "SKILL.md")))
152
+ out.push(full);
153
+ }
154
+ return out;
155
+ }
156
+ /** Import a parsed skill into the pod via POST /agent-skills/import. */
157
+ export async function importSkill(parsed, userId, cfg) {
158
+ try {
159
+ const res = (await hubPost("/agent-skills/import", {
160
+ userId,
161
+ skill: {
162
+ slug: parsed.slug,
163
+ name: parsed.name,
164
+ description: parsed.description,
165
+ body: parsed.body,
166
+ autoLoad: parsed.autoLoad,
167
+ },
168
+ documents: parsed.documents,
169
+ }, cfg));
170
+ if (res.error && /already exists/i.test(res.error)) {
171
+ return { slug: parsed.slug, status: "exists", docs: 0 };
172
+ }
173
+ if (res.skill) {
174
+ return {
175
+ slug: parsed.slug,
176
+ status: "imported",
177
+ docs: res.documents?.length ?? 0,
178
+ };
179
+ }
180
+ return {
181
+ slug: parsed.slug,
182
+ status: "error",
183
+ docs: 0,
184
+ error: res.error ?? "unknown",
185
+ };
186
+ }
187
+ catch (err) {
188
+ // Idempotent re-seed: the hub returns HTTP 409 ("already exists") when the
189
+ // skill slug is present. hubPost throws on non-2xx, so the 409 lands here —
190
+ // treat it as a no-op success, not an error.
191
+ const msg = err instanceof Error ? err.message : String(err);
192
+ if (/already exists/i.test(msg) || /\b409\b/.test(msg)) {
193
+ return { slug: parsed.slug, status: "exists", docs: 0 };
194
+ }
195
+ return {
196
+ slug: parsed.slug,
197
+ status: "error",
198
+ docs: 0,
199
+ error: msg,
200
+ };
201
+ }
202
+ }
203
+ //# sourceMappingURL=skill-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-import.js","sourceRoot":"","sources":["../../src/lib/skill-import.ts"],"names":[],"mappings":"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"}
@@ -2,17 +2,28 @@
2
2
  * Skill installer — copies the synap skill tree into a target's skills directory.
3
3
  *
4
4
  * Source resolution order:
5
- * 1. $SYNAP_SKILLS_DIR (explicit override)
6
- * 2. adjacent ../synap-backend/skills/ (monorepo dev mode)
7
- * 3. bundled skills/ inside this package (production / published npm)
8
- * 4. fetch from a published tarball (fallback — not yet implemented)
5
+ * 1. $SYNAP_SKILLS_DIR (explicit override) or an adjacent ../synap-backend/skills/
6
+ * checkout (monorepo dev mode) — both are local disk, dev escape hatches.
7
+ * 2. the connected pod — GET /api/hub/skills/system (pod-first: production
8
+ * users get whatever skill packages their pod actually serves, not a
9
+ * snapshot baked into this CLI's npm release).
10
+ * 3. bundled skills/ inside this package (production / published npm,
11
+ * offline, or pod unreachable).
9
12
  *
10
13
  * If none resolve, prints a manual install command and returns false.
11
14
  */
15
+ /** Last-resort constant — only used when no manifest.json can be found on
16
+ * disk (dev or bundled) AND the pod is unreachable/unconfigured. */
12
17
  export declare const SKILL_NAMES: readonly ["synap", "synap-schema", "synap-ui"];
13
18
  export type SkillName = (typeof SKILL_NAMES)[number];
19
+ /**
20
+ * Baseline skills are safe to install into every agent context. Workflow
21
+ * packages are intentionally loaded only when the target/user asks for them;
22
+ * installing them by default turns progressive teaching back into prompt bulk.
23
+ */
24
+ export declare function getDeliverableSkills(): string[];
14
25
  export interface InstallOpts {
15
26
  destDir: string;
16
- skills: readonly string[];
27
+ skills?: readonly string[];
17
28
  }
18
29
  export declare function installSkills(opts: InstallOpts): Promise<boolean>;