@vibesdotdev/storage 0.0.1

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 (423) hide show
  1. package/README.md +75 -0
  2. package/SPEC.md +60 -0
  3. package/dist/adapters/index.d.ts +14 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +15 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/bridge/index.d.ts +3 -0
  8. package/dist/bridge/index.d.ts.map +1 -0
  9. package/dist/bridge/index.js +2 -0
  10. package/dist/bridge/index.js.map +1 -0
  11. package/dist/bridge/storage-kind-bridge.d.ts +27 -0
  12. package/dist/bridge/storage-kind-bridge.d.ts.map +1 -0
  13. package/dist/bridge/storage-kind-bridge.js +110 -0
  14. package/dist/bridge/storage-kind-bridge.js.map +1 -0
  15. package/dist/bridge/types.d.ts +45 -0
  16. package/dist/bridge/types.d.ts.map +1 -0
  17. package/dist/bridge/types.js +8 -0
  18. package/dist/bridge/types.js.map +1 -0
  19. package/dist/cli/commands/list/storage.list.cli-command.descriptor.d.ts +4 -0
  20. package/dist/cli/commands/list/storage.list.cli-command.descriptor.d.ts.map +1 -0
  21. package/dist/cli/commands/list/storage.list.cli-command.descriptor.js +18 -0
  22. package/dist/cli/commands/list/storage.list.cli-command.descriptor.js.map +1 -0
  23. package/dist/cli/commands/list/storage.list.cli-command.impl.d.ts +11 -0
  24. package/dist/cli/commands/list/storage.list.cli-command.impl.d.ts.map +1 -0
  25. package/dist/cli/commands/list/storage.list.cli-command.impl.js +48 -0
  26. package/dist/cli/commands/list/storage.list.cli-command.impl.js.map +1 -0
  27. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.d.ts +4 -0
  28. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.d.ts.map +1 -0
  29. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.js +26 -0
  30. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.js.map +1 -0
  31. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.d.ts +13 -0
  32. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.d.ts.map +1 -0
  33. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.js +136 -0
  34. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.js.map +1 -0
  35. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.d.ts +4 -0
  36. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.d.ts.map +1 -0
  37. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.js +26 -0
  38. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.js.map +1 -0
  39. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.d.ts +13 -0
  40. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.d.ts.map +1 -0
  41. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.js +165 -0
  42. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.js.map +1 -0
  43. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.d.ts +4 -0
  44. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.d.ts.map +1 -0
  45. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.js +20 -0
  46. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.js.map +1 -0
  47. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.d.ts +12 -0
  48. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.d.ts.map +1 -0
  49. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.js +95 -0
  50. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.js.map +1 -0
  51. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.d.ts +4 -0
  52. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.d.ts.map +1 -0
  53. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.js +15 -0
  54. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.js.map +1 -0
  55. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.d.ts +13 -0
  56. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.d.ts.map +1 -0
  57. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.js +150 -0
  58. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.js.map +1 -0
  59. package/dist/cli/context.consumer.d.ts +26 -0
  60. package/dist/cli/context.consumer.d.ts.map +1 -0
  61. package/dist/cli/context.consumer.js +164 -0
  62. package/dist/cli/context.consumer.js.map +1 -0
  63. package/dist/cli/storage.cli-group.descriptor.d.ts +4 -0
  64. package/dist/cli/storage.cli-group.descriptor.d.ts.map +1 -0
  65. package/dist/cli/storage.cli-group.descriptor.js +11 -0
  66. package/dist/cli/storage.cli-group.descriptor.js.map +1 -0
  67. package/dist/cli/storage.sync.cli-group.descriptor.d.ts +4 -0
  68. package/dist/cli/storage.sync.cli-group.descriptor.d.ts.map +1 -0
  69. package/dist/cli/storage.sync.cli-group.descriptor.js +12 -0
  70. package/dist/cli/storage.sync.cli-group.descriptor.js.map +1 -0
  71. package/dist/cli/types.d.ts +26 -0
  72. package/dist/cli/types.d.ts.map +1 -0
  73. package/dist/cli/types.js +11 -0
  74. package/dist/cli/types.js.map +1 -0
  75. package/dist/client/index.d.ts +10 -0
  76. package/dist/client/index.d.ts.map +1 -0
  77. package/dist/client/index.js +10 -0
  78. package/dist/client/index.js.map +1 -0
  79. package/dist/client/list-browsable-adapters.d.ts +31 -0
  80. package/dist/client/list-browsable-adapters.d.ts.map +1 -0
  81. package/dist/client/list-browsable-adapters.js +40 -0
  82. package/dist/client/list-browsable-adapters.js.map +1 -0
  83. package/dist/daemon/commands/sync.d.ts +23 -0
  84. package/dist/daemon/commands/sync.d.ts.map +1 -0
  85. package/dist/daemon/commands/sync.js +169 -0
  86. package/dist/daemon/commands/sync.js.map +1 -0
  87. package/dist/docs/adapters.docs.descriptor.d.ts +4 -0
  88. package/dist/docs/adapters.docs.descriptor.d.ts.map +1 -0
  89. package/dist/docs/adapters.docs.descriptor.js +223 -0
  90. package/dist/docs/adapters.docs.descriptor.js.map +1 -0
  91. package/dist/docs/manifests.docs.descriptor.d.ts +4 -0
  92. package/dist/docs/manifests.docs.descriptor.d.ts.map +1 -0
  93. package/dist/docs/manifests.docs.descriptor.js +316 -0
  94. package/dist/docs/manifests.docs.descriptor.js.map +1 -0
  95. package/dist/docs/records.docs.descriptor.d.ts +4 -0
  96. package/dist/docs/records.docs.descriptor.d.ts.map +1 -0
  97. package/dist/docs/records.docs.descriptor.js +269 -0
  98. package/dist/docs/records.docs.descriptor.js.map +1 -0
  99. package/dist/docs/sync.docs.descriptor.d.ts +4 -0
  100. package/dist/docs/sync.docs.descriptor.d.ts.map +1 -0
  101. package/dist/docs/sync.docs.descriptor.js +279 -0
  102. package/dist/docs/sync.docs.descriptor.js.map +1 -0
  103. package/dist/index.d.ts +27 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +29 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/interfaces/adapter.d.ts +382 -0
  108. package/dist/interfaces/adapter.d.ts.map +1 -0
  109. package/dist/interfaces/adapter.js +11 -0
  110. package/dist/interfaces/adapter.js.map +1 -0
  111. package/dist/interfaces/document-store.d.ts +62 -0
  112. package/dist/interfaces/document-store.d.ts.map +1 -0
  113. package/dist/interfaces/document-store.js +8 -0
  114. package/dist/interfaces/document-store.js.map +1 -0
  115. package/dist/interfaces/index.d.ts +17 -0
  116. package/dist/interfaces/index.d.ts.map +1 -0
  117. package/dist/interfaces/index.js +24 -0
  118. package/dist/interfaces/index.js.map +1 -0
  119. package/dist/interfaces/key-value.d.ts +95 -0
  120. package/dist/interfaces/key-value.d.ts.map +1 -0
  121. package/dist/interfaces/key-value.js +8 -0
  122. package/dist/interfaces/key-value.js.map +1 -0
  123. package/dist/interfaces/query-builder.d.ts +31 -0
  124. package/dist/interfaces/query-builder.d.ts.map +1 -0
  125. package/dist/interfaces/query-builder.js +11 -0
  126. package/dist/interfaces/query-builder.js.map +1 -0
  127. package/dist/interfaces/record/index.d.ts +7 -0
  128. package/dist/interfaces/record/index.d.ts.map +1 -0
  129. package/dist/interfaces/record/index.js +7 -0
  130. package/dist/interfaces/record/index.js.map +1 -0
  131. package/dist/interfaces/record/interface.d.ts +593 -0
  132. package/dist/interfaces/record/interface.d.ts.map +1 -0
  133. package/dist/interfaces/record/interface.js +49 -0
  134. package/dist/interfaces/record/interface.js.map +1 -0
  135. package/dist/interfaces/repository.d.ts +262 -0
  136. package/dist/interfaces/repository.d.ts.map +1 -0
  137. package/dist/interfaces/repository.js +8 -0
  138. package/dist/interfaces/repository.js.map +1 -0
  139. package/dist/interfaces/schema/index.d.ts +8 -0
  140. package/dist/interfaces/schema/index.d.ts.map +1 -0
  141. package/dist/interfaces/schema/index.js +10 -0
  142. package/dist/interfaces/schema/index.js.map +1 -0
  143. package/dist/interfaces/schema/schema-interface.d.ts +516 -0
  144. package/dist/interfaces/schema/schema-interface.d.ts.map +1 -0
  145. package/dist/interfaces/schema/schema-interface.js +31 -0
  146. package/dist/interfaces/schema/schema-interface.js.map +1 -0
  147. package/dist/interfaces/schema/table-interface.d.ts +250 -0
  148. package/dist/interfaces/schema/table-interface.d.ts.map +1 -0
  149. package/dist/interfaces/schema/table-interface.js +31 -0
  150. package/dist/interfaces/schema/table-interface.js.map +1 -0
  151. package/dist/interfaces/storage-consumer-fs.d.ts +40 -0
  152. package/dist/interfaces/storage-consumer-fs.d.ts.map +1 -0
  153. package/dist/interfaces/storage-consumer-fs.js +42 -0
  154. package/dist/interfaces/storage-consumer-fs.js.map +1 -0
  155. package/dist/manifest/base.d.ts +187 -0
  156. package/dist/manifest/base.d.ts.map +1 -0
  157. package/dist/manifest/base.js +516 -0
  158. package/dist/manifest/base.js.map +1 -0
  159. package/dist/manifest/cloud-sync.consumer.d.ts +7 -0
  160. package/dist/manifest/cloud-sync.consumer.d.ts.map +1 -0
  161. package/dist/manifest/cloud-sync.consumer.js +82 -0
  162. package/dist/manifest/cloud-sync.consumer.js.map +1 -0
  163. package/dist/manifest/index.d.ts +7 -0
  164. package/dist/manifest/index.d.ts.map +1 -0
  165. package/dist/manifest/index.js +7 -0
  166. package/dist/manifest/index.js.map +1 -0
  167. package/dist/manifest/source-policy.d.ts +8 -0
  168. package/dist/manifest/source-policy.d.ts.map +1 -0
  169. package/dist/manifest/source-policy.js +62 -0
  170. package/dist/manifest/source-policy.js.map +1 -0
  171. package/dist/paths.d.ts +6 -0
  172. package/dist/paths.d.ts.map +1 -0
  173. package/dist/paths.js +152 -0
  174. package/dist/paths.js.map +1 -0
  175. package/dist/policy/context.d.ts +9 -0
  176. package/dist/policy/context.d.ts.map +1 -0
  177. package/dist/policy/context.js +29 -0
  178. package/dist/policy/context.js.map +1 -0
  179. package/dist/policy/index.d.ts +4 -0
  180. package/dist/policy/index.d.ts.map +1 -0
  181. package/dist/policy/index.js +4 -0
  182. package/dist/policy/index.js.map +1 -0
  183. package/dist/policy/overrides.d.ts +40 -0
  184. package/dist/policy/overrides.d.ts.map +1 -0
  185. package/dist/policy/overrides.js +37 -0
  186. package/dist/policy/overrides.js.map +1 -0
  187. package/dist/policy/persistence.d.ts +38 -0
  188. package/dist/policy/persistence.d.ts.map +1 -0
  189. package/dist/policy/persistence.js +65 -0
  190. package/dist/policy/persistence.js.map +1 -0
  191. package/dist/policy/types.d.ts +21 -0
  192. package/dist/policy/types.d.ts.map +1 -0
  193. package/dist/policy/types.js +7 -0
  194. package/dist/policy/types.js.map +1 -0
  195. package/dist/record/base.d.ts +186 -0
  196. package/dist/record/base.d.ts.map +1 -0
  197. package/dist/record/base.js +1437 -0
  198. package/dist/record/base.js.map +1 -0
  199. package/dist/record/events.d.ts +71 -0
  200. package/dist/record/events.d.ts.map +1 -0
  201. package/dist/record/events.js +52 -0
  202. package/dist/record/events.js.map +1 -0
  203. package/dist/record/extensions.d.ts +51 -0
  204. package/dist/record/extensions.d.ts.map +1 -0
  205. package/dist/record/extensions.js +222 -0
  206. package/dist/record/extensions.js.map +1 -0
  207. package/dist/record/index.d.ts +7 -0
  208. package/dist/record/index.d.ts.map +1 -0
  209. package/dist/record/index.js +7 -0
  210. package/dist/record/index.js.map +1 -0
  211. package/dist/resolver/storage-backed-resolver.d.ts +23 -0
  212. package/dist/resolver/storage-backed-resolver.d.ts.map +1 -0
  213. package/dist/resolver/storage-backed-resolver.js +187 -0
  214. package/dist/resolver/storage-backed-resolver.js.map +1 -0
  215. package/dist/schemas/adapter-descriptor.d.ts +108 -0
  216. package/dist/schemas/adapter-descriptor.d.ts.map +1 -0
  217. package/dist/schemas/adapter-descriptor.js +101 -0
  218. package/dist/schemas/adapter-descriptor.js.map +1 -0
  219. package/dist/schemas/index.d.ts +14 -0
  220. package/dist/schemas/index.d.ts.map +1 -0
  221. package/dist/schemas/index.js +12 -0
  222. package/dist/schemas/index.js.map +1 -0
  223. package/dist/schemas/manifest-descriptor.d.ts +110 -0
  224. package/dist/schemas/manifest-descriptor.d.ts.map +1 -0
  225. package/dist/schemas/manifest-descriptor.js +114 -0
  226. package/dist/schemas/manifest-descriptor.js.map +1 -0
  227. package/dist/schemas/record/descriptor.d.ts +570 -0
  228. package/dist/schemas/record/descriptor.d.ts.map +1 -0
  229. package/dist/schemas/record/descriptor.js +389 -0
  230. package/dist/schemas/record/descriptor.js.map +1 -0
  231. package/dist/schemas/record/index.d.ts +8 -0
  232. package/dist/schemas/record/index.d.ts.map +1 -0
  233. package/dist/schemas/record/index.js +7 -0
  234. package/dist/schemas/record/index.js.map +1 -0
  235. package/dist/schemas/record/relation.d.ts +36 -0
  236. package/dist/schemas/record/relation.d.ts.map +1 -0
  237. package/dist/schemas/record/relation.js +37 -0
  238. package/dist/schemas/record/relation.js.map +1 -0
  239. package/dist/schemas/schema/descriptor.d.ts +231 -0
  240. package/dist/schemas/schema/descriptor.d.ts.map +1 -0
  241. package/dist/schemas/schema/descriptor.js +205 -0
  242. package/dist/schemas/schema/descriptor.js.map +1 -0
  243. package/dist/schemas/schema/index.d.ts +7 -0
  244. package/dist/schemas/schema/index.d.ts.map +1 -0
  245. package/dist/schemas/schema/index.js +7 -0
  246. package/dist/schemas/schema/index.js.map +1 -0
  247. package/dist/schemas/sync-bridge-descriptor.d.ts +124 -0
  248. package/dist/schemas/sync-bridge-descriptor.d.ts.map +1 -0
  249. package/dist/schemas/sync-bridge-descriptor.js +67 -0
  250. package/dist/schemas/sync-bridge-descriptor.js.map +1 -0
  251. package/dist/server/manifest-route.d.ts +92 -0
  252. package/dist/server/manifest-route.d.ts.map +1 -0
  253. package/dist/server/manifest-route.js +226 -0
  254. package/dist/server/manifest-route.js.map +1 -0
  255. package/dist/storage-policy.context.descriptor.d.ts +16 -0
  256. package/dist/storage-policy.context.descriptor.d.ts.map +1 -0
  257. package/dist/storage-policy.context.descriptor.js +16 -0
  258. package/dist/storage-policy.context.descriptor.js.map +1 -0
  259. package/dist/storage-policy.context.server.d.ts +14 -0
  260. package/dist/storage-policy.context.server.d.ts.map +1 -0
  261. package/dist/storage-policy.context.server.js +27 -0
  262. package/dist/storage-policy.context.server.js.map +1 -0
  263. package/dist/storage.plugin.d.ts +38 -0
  264. package/dist/storage.plugin.d.ts.map +1 -0
  265. package/dist/storage.plugin.js +204 -0
  266. package/dist/storage.plugin.js.map +1 -0
  267. package/dist/sync/cloud-pull.d.ts +15 -0
  268. package/dist/sync/cloud-pull.d.ts.map +1 -0
  269. package/dist/sync/cloud-pull.js +130 -0
  270. package/dist/sync/cloud-pull.js.map +1 -0
  271. package/dist/sync/cloud-record-crud-config.d.ts +19 -0
  272. package/dist/sync/cloud-record-crud-config.d.ts.map +1 -0
  273. package/dist/sync/cloud-record-crud-config.js +22 -0
  274. package/dist/sync/cloud-record-crud-config.js.map +1 -0
  275. package/dist/sync/record-sync-bridge.d.ts +5 -0
  276. package/dist/sync/record-sync-bridge.d.ts.map +1 -0
  277. package/dist/sync/record-sync-bridge.js +121 -0
  278. package/dist/sync/record-sync-bridge.js.map +1 -0
  279. package/dist/sync/resolve-sync-target.d.ts +23 -0
  280. package/dist/sync/resolve-sync-target.d.ts.map +1 -0
  281. package/dist/sync/resolve-sync-target.js +45 -0
  282. package/dist/sync/resolve-sync-target.js.map +1 -0
  283. package/dist/sync/schemas/cloud-pull.d.ts +25 -0
  284. package/dist/sync/schemas/cloud-pull.d.ts.map +1 -0
  285. package/dist/sync/schemas/cloud-pull.js +7 -0
  286. package/dist/sync/schemas/cloud-pull.js.map +1 -0
  287. package/dist/sync/schemas/index.d.ts +9 -0
  288. package/dist/sync/schemas/index.d.ts.map +1 -0
  289. package/dist/sync/schemas/index.js +9 -0
  290. package/dist/sync/schemas/index.js.map +1 -0
  291. package/dist/sync/schemas/sync-helpers.d.ts +17 -0
  292. package/dist/sync/schemas/sync-helpers.d.ts.map +1 -0
  293. package/dist/sync/schemas/sync-helpers.js +7 -0
  294. package/dist/sync/schemas/sync-helpers.js.map +1 -0
  295. package/dist/sync/schemas/sync-state.d.ts +65 -0
  296. package/dist/sync/schemas/sync-state.d.ts.map +1 -0
  297. package/dist/sync/schemas/sync-state.js +32 -0
  298. package/dist/sync/schemas/sync-state.js.map +1 -0
  299. package/dist/sync/sync-bridge.d.ts +80 -0
  300. package/dist/sync/sync-bridge.d.ts.map +1 -0
  301. package/dist/sync/sync-bridge.js +617 -0
  302. package/dist/sync/sync-bridge.js.map +1 -0
  303. package/dist/sync/sync-manifest.d.ts +20 -0
  304. package/dist/sync/sync-manifest.d.ts.map +1 -0
  305. package/dist/sync/sync-manifest.js +140 -0
  306. package/dist/sync/sync-manifest.js.map +1 -0
  307. package/dist/sync/sync-state.consumer.d.ts +23 -0
  308. package/dist/sync/sync-state.consumer.d.ts.map +1 -0
  309. package/dist/sync/sync-state.consumer.js +111 -0
  310. package/dist/sync/sync-state.consumer.js.map +1 -0
  311. package/dist/transform/index.d.ts +75 -0
  312. package/dist/transform/index.d.ts.map +1 -0
  313. package/dist/transform/index.js +81 -0
  314. package/dist/transform/index.js.map +1 -0
  315. package/dist/transform/transform-descriptor.d.ts +51 -0
  316. package/dist/transform/transform-descriptor.d.ts.map +1 -0
  317. package/dist/transform/transform-descriptor.js +30 -0
  318. package/dist/transform/transform-descriptor.js.map +1 -0
  319. package/dist/tui/storage-explorer.descriptor.d.ts +14 -0
  320. package/dist/tui/storage-explorer.descriptor.d.ts.map +1 -0
  321. package/dist/tui/storage-explorer.descriptor.js +29 -0
  322. package/dist/tui/storage-explorer.descriptor.js.map +1 -0
  323. package/dist/tui/storage-explorer.impl.consumer.d.ts +11 -0
  324. package/dist/tui/storage-explorer.impl.consumer.d.ts.map +1 -0
  325. package/dist/tui/storage-explorer.impl.consumer.js +13 -0
  326. package/dist/tui/storage-explorer.impl.consumer.js.map +1 -0
  327. package/dist/tui/storage-open.descriptor.d.ts +14 -0
  328. package/dist/tui/storage-open.descriptor.d.ts.map +1 -0
  329. package/dist/tui/storage-open.descriptor.js +28 -0
  330. package/dist/tui/storage-open.descriptor.js.map +1 -0
  331. package/dist/tui/storage-open.impl.consumer.d.ts +11 -0
  332. package/dist/tui/storage-open.impl.consumer.d.ts.map +1 -0
  333. package/dist/tui/storage-open.impl.consumer.js +13 -0
  334. package/dist/tui/storage-open.impl.consumer.js.map +1 -0
  335. package/dist/utils/error-context.d.ts +2 -0
  336. package/dist/utils/error-context.d.ts.map +1 -0
  337. package/dist/utils/error-context.js +17 -0
  338. package/dist/utils/error-context.js.map +1 -0
  339. package/package.json +241 -0
  340. package/src/adapters/index.ts +13 -0
  341. package/src/bridge/index.ts +2 -0
  342. package/src/bridge/storage-kind-bridge.ts +131 -0
  343. package/src/bridge/types.ts +46 -0
  344. package/src/cli/commands/list/storage.list.cli-command.descriptor.ts +20 -0
  345. package/src/cli/commands/list/storage.list.cli-command.impl.ts +72 -0
  346. package/src/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.ts +28 -0
  347. package/src/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.ts +171 -0
  348. package/src/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.ts +28 -0
  349. package/src/cli/commands/sync/push/storage.sync.push.cli-command.impl.ts +213 -0
  350. package/src/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.ts +22 -0
  351. package/src/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.ts +129 -0
  352. package/src/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.ts +17 -0
  353. package/src/cli/commands/sync/status/storage.sync.status.cli-command.impl.ts +192 -0
  354. package/src/cli/context.consumer.ts +195 -0
  355. package/src/cli/storage.cli-group.descriptor.ts +13 -0
  356. package/src/cli/storage.sync.cli-group.descriptor.ts +14 -0
  357. package/src/cli/types.ts +25 -0
  358. package/src/client/index.ts +10 -0
  359. package/src/client/list-browsable-adapters.ts +42 -0
  360. package/src/daemon/commands/sync.ts +225 -0
  361. package/src/docs/adapters.docs.descriptor.ts +225 -0
  362. package/src/docs/manifests.docs.descriptor.ts +318 -0
  363. package/src/docs/records.docs.descriptor.ts +271 -0
  364. package/src/docs/sync.docs.descriptor.ts +281 -0
  365. package/src/index.ts +109 -0
  366. package/src/interfaces/adapter.ts +451 -0
  367. package/src/interfaces/document-store.ts +74 -0
  368. package/src/interfaces/index.ts +117 -0
  369. package/src/interfaces/key-value.ts +112 -0
  370. package/src/interfaces/query-builder.ts +31 -0
  371. package/src/interfaces/record/index.ts +58 -0
  372. package/src/interfaces/record/interface.ts +723 -0
  373. package/src/interfaces/repository.ts +300 -0
  374. package/src/interfaces/schema/index.ts +37 -0
  375. package/src/interfaces/schema/schema-interface.ts +586 -0
  376. package/src/interfaces/schema/table-interface.ts +314 -0
  377. package/src/interfaces/storage-consumer-fs.ts +66 -0
  378. package/src/manifest/base.ts +594 -0
  379. package/src/manifest/cloud-sync.consumer.ts +120 -0
  380. package/src/manifest/index.ts +7 -0
  381. package/src/manifest/source-policy.ts +74 -0
  382. package/src/paths.ts +171 -0
  383. package/src/policy/context.ts +30 -0
  384. package/src/policy/index.ts +20 -0
  385. package/src/policy/overrides.ts +46 -0
  386. package/src/policy/persistence.ts +117 -0
  387. package/src/policy/types.ts +28 -0
  388. package/src/record/base.ts +1872 -0
  389. package/src/record/events.ts +56 -0
  390. package/src/record/extensions.ts +308 -0
  391. package/src/record/index.ts +7 -0
  392. package/src/resolver/storage-backed-resolver.ts +255 -0
  393. package/src/schemas/adapter-descriptor.ts +128 -0
  394. package/src/schemas/index.ts +104 -0
  395. package/src/schemas/manifest-descriptor.ts +143 -0
  396. package/src/schemas/record/descriptor.ts +621 -0
  397. package/src/schemas/record/index.ts +60 -0
  398. package/src/schemas/record/relation.ts +49 -0
  399. package/src/schemas/schema/descriptor.ts +278 -0
  400. package/src/schemas/schema/index.ts +14 -0
  401. package/src/schemas/sync-bridge-descriptor.ts +143 -0
  402. package/src/server/manifest-route.ts +319 -0
  403. package/src/storage-policy.context.descriptor.ts +17 -0
  404. package/src/storage-policy.context.server.ts +34 -0
  405. package/src/storage.plugin.ts +264 -0
  406. package/src/sync/cloud-pull.ts +202 -0
  407. package/src/sync/cloud-record-crud-config.ts +41 -0
  408. package/src/sync/record-sync-bridge.ts +183 -0
  409. package/src/sync/resolve-sync-target.ts +57 -0
  410. package/src/sync/schemas/cloud-pull.ts +26 -0
  411. package/src/sync/schemas/index.ts +18 -0
  412. package/src/sync/schemas/sync-helpers.ts +18 -0
  413. package/src/sync/schemas/sync-state.ts +41 -0
  414. package/src/sync/sync-bridge.ts +763 -0
  415. package/src/sync/sync-manifest.ts +212 -0
  416. package/src/sync/sync-state.consumer.ts +144 -0
  417. package/src/transform/index.ts +130 -0
  418. package/src/transform/transform-descriptor.ts +53 -0
  419. package/src/tui/storage-explorer.descriptor.ts +32 -0
  420. package/src/tui/storage-explorer.impl.consumer.ts +14 -0
  421. package/src/tui/storage-open.descriptor.ts +31 -0
  422. package/src/tui/storage-open.impl.consumer.ts +14 -0
  423. package/src/utils/error-context.ts +19 -0
@@ -0,0 +1,28 @@
1
+ import type { CLICommandAssetDescriptor } from '@vibesdotdev/runtime/schemas/asset';
2
+
3
+ const descriptor: CLICommandAssetDescriptor = {
4
+ kind: 'cli/command',
5
+ id: 'storage.sync.pull',
6
+ name: 'pull',
7
+ description: 'Pull cloud storage manifests to local',
8
+ group: 'storage.sync',
9
+ arguments: [
10
+ {
11
+ name: 'manifest-id',
12
+ description: 'Manifest ID to pull (omit for all)',
13
+ required: false,
14
+ variadic: false
15
+ }
16
+ ],
17
+ options: [
18
+ { flags: '--force', description: 'Force overwrite local even if local has changes' },
19
+ { flags: '--dry-run', description: 'Show what would be synced without making changes' },
20
+ { flags: '--json', description: 'Output results as JSON' }
21
+ ],
22
+ aliases: [],
23
+ surfaces: ['cli'],
24
+ hardware: ['consumer'],
25
+ enabled: true
26
+ };
27
+
28
+ export default descriptor;
@@ -0,0 +1,171 @@
1
+ /**
2
+ * vibes storage sync pull [manifest-id]
3
+ *
4
+ * Pulls cloud data to local for storage manifests AND sync-bridges.
5
+ * Uses pullFromCloud() for storage manifests and SyncBridge.execute() for bridges.
6
+ *
7
+ * The manifest-id argument matches both manifest IDs and bridge IDs.
8
+ */
9
+
10
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
11
+ import type { StorageCliUIContext as UIContext } from '../../../types';
12
+ import { pullFromCloud } from '../../../../sync/cloud-pull';
13
+ import type { CloudPullOptions } from '../../../../sync/schemas/cloud-pull';
14
+ import type { SyncBridgeDescriptor } from '../../../../schemas/sync-bridge-descriptor';
15
+ import type { StorageRecordDescriptor } from '../../../../schemas/record';
16
+ import { SyncBridge } from '../../../../sync/sync-bridge';
17
+ import { resolveSyncTarget } from '../../../../sync/resolve-sync-target';
18
+ import {
19
+ createRecordSyncBridgeDescriptor,
20
+ isSyncableStorageRecord
21
+ } from '../../../../sync/record-sync-bridge';
22
+
23
+ export default {
24
+ async execute(args: Record<string, unknown>, opts: Record<string, unknown>): Promise<void> {
25
+ const runtime = getVibesRuntime();
26
+ const ui = (await runtime.context('cli/ui')) as UIContext;
27
+ const targetId = args['manifest-id'] as string | undefined;
28
+ const force = opts.force as boolean | undefined;
29
+ const dryRun = opts.dryRun as boolean | undefined;
30
+
31
+ try {
32
+ // ── Sync Bridges ──
33
+ const allBridges = runtime
34
+ .query('storage/sync-bridge')
35
+ .descriptors() as SyncBridgeDescriptor[];
36
+ const allRecords = runtime.query('storage/record').descriptors() as StorageRecordDescriptor[];
37
+ const eligibleRecords = allRecords.filter(isSyncableStorageRecord);
38
+ const recordTargets = targetId
39
+ ? eligibleRecords.filter((descriptor) => descriptor.id === targetId)
40
+ : eligibleRecords;
41
+ const syntheticRecordBridges = recordTargets.map(createRecordSyncBridgeDescriptor);
42
+
43
+ const isBridgeOnly =
44
+ targetId &&
45
+ (allBridges.some((bridge) => bridge.id === targetId) ||
46
+ eligibleRecords.some((descriptor) => descriptor.id === targetId));
47
+
48
+ // ── Storage Manifests ──
49
+ if (!isBridgeOnly) {
50
+ const pullOpts: CloudPullOptions = {
51
+ force: force ?? false,
52
+ dryRun: dryRun ?? false
53
+ };
54
+
55
+ if (targetId) {
56
+ pullOpts.manifestIds = [targetId];
57
+ }
58
+
59
+ const result = await pullFromCloud(pullOpts);
60
+
61
+ if (dryRun && result.details.length > 0) {
62
+ ui.info('[dry-run] No manifest changes were written.');
63
+ }
64
+
65
+ for (const detail of result.details) {
66
+ switch (detail.action) {
67
+ case 'pulled':
68
+ ui.success(`Pulled: ${detail.manifestId}`);
69
+ break;
70
+ case 'skipped':
71
+ ui.info(`Skipped: ${detail.manifestId} — ${detail.message ?? 'already in-sync'}`);
72
+ break;
73
+ case 'conflict':
74
+ ui.warn(`Conflict: ${detail.manifestId} — ${detail.message}`);
75
+ break;
76
+ case 'error':
77
+ ui.error(`Error: ${detail.manifestId} — ${detail.message}`);
78
+ break;
79
+ }
80
+ }
81
+
82
+ if (!targetId && result.details.length > 0) {
83
+ ui.info(
84
+ `Manifests: ${result.pulled} pulled, ${result.skipped} skipped, ${result.conflicts} conflicts, ${result.errors} errors`
85
+ );
86
+ }
87
+ }
88
+
89
+ // ── Sync Bridges ──
90
+ const bridgeTargets = targetId ? allBridges.filter((b) => b.id === targetId) : allBridges;
91
+ const syncTargets = [...syntheticRecordBridges, ...bridgeTargets];
92
+
93
+ if (syncTargets.length > 0) {
94
+ const { syncTarget, apiToken } = await resolveSyncTarget();
95
+
96
+ if (!syncTarget || syncTarget === 'unknown') {
97
+ ui.error('No sync target configured. Set VIBES_API_URL or select an environment.');
98
+ } else {
99
+ for (const bridgeDesc of syncTargets) {
100
+ try {
101
+ const bridge = new SyncBridge(bridgeDesc);
102
+ const bridgeResult = await bridge.execute(
103
+ syncTarget,
104
+ {
105
+ dryRun: dryRun ?? false,
106
+ force: force ?? false,
107
+ direction: 'pull'
108
+ },
109
+ apiToken
110
+ );
111
+
112
+ for (const detail of bridgeResult.details) {
113
+ const label = `${bridgeDesc.id}:${detail.entityId}`;
114
+
115
+ if (!dryRun) {
116
+ switch (detail.action) {
117
+ case 'pulled':
118
+ ui.success(`Pulled: ${label}`);
119
+ break;
120
+ case 'skipped':
121
+ ui.info(`Skipped: ${label} — ${detail.message ?? 'in sync'}`);
122
+ break;
123
+ case 'conflict':
124
+ ui.warn(`Conflict: ${label} — ${detail.message}`);
125
+ break;
126
+ case 'error':
127
+ ui.error(`Error: ${label} — ${detail.message}`);
128
+ break;
129
+ }
130
+ } else {
131
+ ui.info(`[dry-run] ${label}: ${detail.action} — ${detail.message ?? ''}`);
132
+ }
133
+ }
134
+
135
+ const { pushed, pulled, skipped, conflicts, errors } = bridgeResult;
136
+ ui.info(
137
+ `Sync ${bridgeDesc.id}: ${pulled} pulled, ${pushed} pushed, ${skipped} skipped, ${conflicts} conflicts, ${errors} errors`
138
+ );
139
+ } catch (e) {
140
+ const msg = (e as Error).message;
141
+ ui.error(`Sync ${bridgeDesc.id} failed: ${msg}`);
142
+ }
143
+ }
144
+ }
145
+ }
146
+
147
+ // Check if nothing was found at all
148
+ if (targetId) {
149
+ const manifests = runtime.query('storage/manifest').descriptors() as Array<{
150
+ id: string;
151
+ allowedAdapters?: string[];
152
+ enabled?: boolean;
153
+ }>;
154
+ const manifestMatch = manifests.some(
155
+ (d) =>
156
+ d.id === targetId &&
157
+ d.enabled !== false &&
158
+ d.allowedAdapters?.includes('storage.cloud-api')
159
+ );
160
+ const bridgeMatch = allBridges.some((b) => b.id === targetId);
161
+ const recordMatch = eligibleRecords.some((descriptor) => descriptor.id === targetId);
162
+ if (!manifestMatch && !bridgeMatch && !recordMatch) {
163
+ ui.warn(`'${targetId}' not found as a manifest, record, or sync-bridge.`);
164
+ }
165
+ }
166
+ } catch (e) {
167
+ ui.error(`Pull failed: ${e}`);
168
+ process.exit(1);
169
+ }
170
+ }
171
+ };
@@ -0,0 +1,28 @@
1
+ import type { CLICommandAssetDescriptor } from '@vibesdotdev/runtime/schemas/asset';
2
+
3
+ const descriptor: CLICommandAssetDescriptor = {
4
+ kind: 'cli/command',
5
+ id: 'storage.sync.push',
6
+ name: 'push',
7
+ description: 'Push local storage manifests to cloud',
8
+ group: 'storage.sync',
9
+ arguments: [
10
+ {
11
+ name: 'manifest-id',
12
+ description: 'Manifest ID to push (omit for all)',
13
+ required: false,
14
+ variadic: false
15
+ }
16
+ ],
17
+ options: [
18
+ { flags: '--force', description: 'Force re-push even if already in-sync' },
19
+ { flags: '--dry-run', description: 'Show what would be synced without making changes' },
20
+ { flags: '--json', description: 'Output results as JSON' }
21
+ ],
22
+ aliases: [],
23
+ surfaces: ['cli'],
24
+ hardware: ['consumer'],
25
+ enabled: true
26
+ };
27
+
28
+ export default descriptor;
@@ -0,0 +1,213 @@
1
+ /**
2
+ * vibes storage sync push [manifest-id]
3
+ *
4
+ * Pushes local data to the cloud API for storage manifests AND sync-bridges.
5
+ * Uses syncManifest() for storage manifests and SyncBridge.execute() for bridges.
6
+ *
7
+ * The manifest-id argument matches both manifest IDs and bridge IDs.
8
+ */
9
+
10
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
11
+ import type { StorageCliUIContext as UIContext } from '../../../types';
12
+ import { syncManifest } from '../../../../sync/sync-manifest';
13
+ import {
14
+ loadSyncState,
15
+ saveSyncState,
16
+ computeHash,
17
+ getManifestSyncState,
18
+ markSynced,
19
+ markConflict,
20
+ markError,
21
+ markLocalAhead,
22
+ markRemoteAhead
23
+ } from '../../../../sync/sync-state.consumer';
24
+ import type { SyncHelpers } from '../../../../sync/schemas/sync-helpers';
25
+ import type { SyncBridgeDescriptor } from '../../../../schemas/sync-bridge-descriptor';
26
+ import type { StorageRecordDescriptor } from '../../../../schemas/record';
27
+ import { SyncBridge } from '../../../../sync/sync-bridge';
28
+ import { resolveSyncTarget } from '../../../../sync/resolve-sync-target';
29
+ import {
30
+ createRecordSyncBridgeDescriptor,
31
+ isSyncableStorageRecord
32
+ } from '../../../../sync/record-sync-bridge';
33
+
34
+ interface ManifestDescriptor {
35
+ id: string;
36
+ allowedAdapters?: string[];
37
+ enabled?: boolean;
38
+ }
39
+
40
+ export default {
41
+ async execute(args: Record<string, unknown>, opts: Record<string, unknown>): Promise<void> {
42
+ const runtime = getVibesRuntime();
43
+ const ui = (await runtime.context('cli/ui')) as UIContext;
44
+ const targetId = args['manifest-id'] as string | undefined;
45
+ const force = opts.force as boolean | undefined;
46
+ const dryRun = opts.dryRun as boolean | undefined;
47
+
48
+ try {
49
+ // ── Storage Manifests ──
50
+ const descriptors = runtime.query('storage/manifest').descriptors() as ManifestDescriptor[];
51
+
52
+ const eligible = descriptors.filter(
53
+ (d) => d.enabled !== false && d.allowedAdapters?.includes('storage.cloud-api')
54
+ );
55
+
56
+ const manifestTargets = targetId ? eligible.filter((d) => d.id === targetId) : eligible;
57
+
58
+ const recordDescriptors = runtime
59
+ .query('storage/record')
60
+ .descriptors() as StorageRecordDescriptor[];
61
+ const eligibleRecords = recordDescriptors.filter(isSyncableStorageRecord);
62
+ const recordTargets = targetId
63
+ ? eligibleRecords.filter((descriptor) => descriptor.id === targetId)
64
+ : eligibleRecords;
65
+
66
+ // ── Sync Bridges ──
67
+ const allBridges = runtime
68
+ .query('storage/sync-bridge')
69
+ .descriptors() as SyncBridgeDescriptor[];
70
+
71
+ const bridgeTargets = targetId ? allBridges.filter((b) => b.id === targetId) : allBridges;
72
+
73
+ if (
74
+ manifestTargets.length === 0 &&
75
+ bridgeTargets.length === 0 &&
76
+ recordTargets.length === 0
77
+ ) {
78
+ ui.warn(
79
+ targetId
80
+ ? `'${targetId}' not found as a manifest, record, or sync-bridge.`
81
+ : 'No manifests, records, or sync-bridges have cloud sync enabled.'
82
+ );
83
+ return;
84
+ }
85
+
86
+ const syncState = await loadSyncState();
87
+ const helpers: SyncHelpers = {
88
+ computeHash,
89
+ getManifestSyncState,
90
+ markSynced,
91
+ markConflict,
92
+ markError,
93
+ markLocalAhead,
94
+ markRemoteAhead,
95
+ dryRun: dryRun ?? false
96
+ };
97
+
98
+ const results: Array<{ manifestId: string; action: string; message?: string }> = [];
99
+
100
+ // Push storage manifests
101
+ for (const descriptor of manifestTargets) {
102
+ try {
103
+ const result = await syncManifest(descriptor.id, syncState, helpers);
104
+ results.push(result);
105
+
106
+ if (!dryRun) {
107
+ switch (result.action) {
108
+ case 'pushed':
109
+ ui.success(`Pushed: ${descriptor.id}`);
110
+ break;
111
+ case 'pulled':
112
+ ui.info(`Pulled (remote was newer): ${descriptor.id}`);
113
+ break;
114
+ case 'conflict':
115
+ ui.warn(`Conflict: ${descriptor.id} — ${result.message}`);
116
+ break;
117
+ case 'skipped':
118
+ ui.info(`Skipped: ${descriptor.id} — ${result.message}`);
119
+ break;
120
+ case 'error':
121
+ ui.error(`Error: ${descriptor.id} — ${result.message}`);
122
+ break;
123
+ }
124
+ } else {
125
+ ui.info(`[dry-run] ${descriptor.id}: ${result.action} — ${result.message ?? ''}`);
126
+ }
127
+ } catch (e) {
128
+ const msg = (e as Error).message;
129
+ ui.error(`Failed to sync ${descriptor.id}: ${msg}`);
130
+ results.push({ manifestId: descriptor.id, action: 'error', message: msg });
131
+ }
132
+ }
133
+
134
+ // Push sync bridges and syncable records
135
+ const syntheticRecordBridges = recordTargets.map(createRecordSyncBridgeDescriptor);
136
+ const syncTargets = [...syntheticRecordBridges, ...bridgeTargets];
137
+ if (syncTargets.length > 0) {
138
+ const { syncTarget, apiToken } = await resolveSyncTarget();
139
+
140
+ if (!syncTarget || syncTarget === 'unknown') {
141
+ ui.error('No sync target configured. Set VIBES_API_URL or select an environment.');
142
+ } else {
143
+ for (const bridgeDesc of syncTargets) {
144
+ try {
145
+ const bridge = new SyncBridge(bridgeDesc);
146
+ const bridgeResult = await bridge.execute(
147
+ syncTarget,
148
+ {
149
+ dryRun: dryRun ?? false,
150
+ force: force ?? false,
151
+ direction: 'push'
152
+ },
153
+ apiToken
154
+ );
155
+
156
+ // Report per-entity results
157
+ for (const detail of bridgeResult.details) {
158
+ const label = `${bridgeDesc.id}:${detail.entityId}`;
159
+ results.push({
160
+ manifestId: label,
161
+ action: detail.action,
162
+ message: detail.message
163
+ });
164
+
165
+ if (!dryRun) {
166
+ switch (detail.action) {
167
+ case 'pushed':
168
+ ui.success(`Pushed: ${label}`);
169
+ break;
170
+ case 'skipped':
171
+ ui.info(`Skipped: ${label} — ${detail.message ?? 'in sync'}`);
172
+ break;
173
+ case 'conflict':
174
+ ui.warn(`Conflict: ${label} — ${detail.message}`);
175
+ break;
176
+ case 'error':
177
+ ui.error(`Error: ${label} — ${detail.message}`);
178
+ break;
179
+ }
180
+ } else {
181
+ ui.info(`[dry-run] ${label}: ${detail.action} — ${detail.message ?? ''}`);
182
+ }
183
+ }
184
+
185
+ // Summary line
186
+ const { pushed, skipped, conflicts, errors } = bridgeResult;
187
+ ui.info(
188
+ `Sync ${bridgeDesc.id}: ${pushed} pushed, ${skipped} skipped, ${conflicts} conflicts, ${errors} errors`
189
+ );
190
+ } catch (e) {
191
+ const msg = (e as Error).message;
192
+ ui.error(`Sync ${bridgeDesc.id} failed: ${msg}`);
193
+ results.push({ manifestId: bridgeDesc.id, action: 'error', message: msg });
194
+ }
195
+ }
196
+ }
197
+ }
198
+
199
+ if (!dryRun) {
200
+ const persistedState = await loadSyncState();
201
+ syncState.manifests = { ...persistedState.manifests, ...syncState.manifests };
202
+ await saveSyncState(syncState);
203
+ }
204
+
205
+ if (opts.json) {
206
+ ui.render(results, { format: 'json' });
207
+ }
208
+ } catch (e) {
209
+ ui.error(`Push failed: ${e}`);
210
+ process.exit(1);
211
+ }
212
+ }
213
+ };
@@ -0,0 +1,22 @@
1
+ import type { CLICommandAssetDescriptor } from '@vibesdotdev/runtime/schemas/asset';
2
+
3
+ const descriptor: CLICommandAssetDescriptor = {
4
+ kind: 'cli/command',
5
+ id: 'storage.sync.resolve',
6
+ name: 'resolve',
7
+ description: 'Resolve a storage manifest sync conflict',
8
+ group: 'storage.sync',
9
+ arguments: [
10
+ { name: 'manifest-id', description: 'Manifest ID to resolve', required: true, variadic: false }
11
+ ],
12
+ options: [
13
+ { flags: '--keep <which>', description: 'Keep local or remote version (default: local)' },
14
+ { flags: '--json', description: 'Output result as JSON' }
15
+ ],
16
+ aliases: [],
17
+ surfaces: ['cli'],
18
+ hardware: ['consumer'],
19
+ enabled: true
20
+ };
21
+
22
+ export default descriptor;
@@ -0,0 +1,129 @@
1
+ /**
2
+ * vibes storage sync resolve <manifest-id>
3
+ *
4
+ * Resolves a sync conflict by keeping either local or remote version.
5
+ * When --keep=local, re-pushes local data and marks as in-sync.
6
+ * When --keep=remote, re-pulls remote data and marks as in-sync.
7
+ */
8
+
9
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
10
+ import type { StorageCliUIContext as UIContext } from '../../../types';
11
+ import {
12
+ loadSyncState,
13
+ saveSyncState,
14
+ getManifestSyncState,
15
+ markSynced
16
+ } from '../../../../sync/sync-state.consumer';
17
+ import { syncManifest } from '../../../../sync/sync-manifest';
18
+ import { pullFromCloud } from '../../../../sync/cloud-pull';
19
+ import type { SyncHelpers } from '../../../../sync/schemas/sync-helpers';
20
+ import {
21
+ computeHash,
22
+ markConflict,
23
+ markError,
24
+ markLocalAhead,
25
+ markRemoteAhead
26
+ } from '../../../../sync/sync-state.consumer';
27
+
28
+ interface ManifestDescriptor {
29
+ id: string;
30
+ allowedAdapters?: string[];
31
+ enabled?: boolean;
32
+ }
33
+
34
+ export default {
35
+ async execute(args: Record<string, unknown>, opts: Record<string, unknown>): Promise<void> {
36
+ const runtime = getVibesRuntime();
37
+ const ui = (await runtime.context('cli/ui')) as UIContext;
38
+ const manifestId = args['manifest-id'] as string;
39
+ const keep = (opts.keep as string | undefined) ?? 'local';
40
+
41
+ if (keep !== 'local' && keep !== 'remote') {
42
+ ui.error(`Invalid --keep value: '${keep}'. Must be 'local' or 'remote'.`);
43
+ process.exit(1);
44
+ }
45
+
46
+ try {
47
+ const syncState = await loadSyncState();
48
+ const manifestState = getManifestSyncState(syncState, manifestId);
49
+
50
+ if (manifestState.syncStatus !== 'conflict') {
51
+ ui.warn(
52
+ `Manifest '${manifestId}' is not in conflict (status: ${manifestState.syncStatus}).`
53
+ );
54
+ return;
55
+ }
56
+
57
+ // Verify the manifest exists and is cloud-eligible
58
+ const descriptors = runtime.query('storage/manifest').descriptors() as ManifestDescriptor[];
59
+ const descriptor = descriptors.find(
60
+ (d) =>
61
+ d.id === manifestId &&
62
+ d.enabled !== false &&
63
+ d.allowedAdapters?.includes('storage.cloud-api')
64
+ );
65
+
66
+ if (!descriptor) {
67
+ ui.error(`Manifest '${manifestId}' not found or not cloud-sync eligible.`);
68
+ return;
69
+ }
70
+
71
+ let result: { action: string; message?: string };
72
+
73
+ if (keep === 'local') {
74
+ // Re-push local version (force sync with push preference)
75
+ const helpers: SyncHelpers = {
76
+ computeHash,
77
+ getManifestSyncState,
78
+ markSynced,
79
+ markConflict,
80
+ markError,
81
+ markLocalAhead,
82
+ markRemoteAhead,
83
+ dryRun: false
84
+ };
85
+
86
+ result = await syncManifest(manifestId, syncState, helpers);
87
+
88
+ if (result.action === 'pushed' || result.action === 'skipped') {
89
+ // Force mark as synced if the sync itself skipped but we resolved
90
+ const hash = manifestState.localHash ?? '';
91
+ markSynced(syncState, manifestId, hash, 'push');
92
+ result = { action: 'resolved', message: 'Kept local version, pushed to cloud' };
93
+ }
94
+ } else {
95
+ // Pull remote version (force overwrite local)
96
+ const pullResult = await pullFromCloud({
97
+ manifestIds: [manifestId],
98
+ force: true,
99
+ dryRun: false
100
+ });
101
+
102
+ const detail = pullResult.details.find((d) => d.manifestId === manifestId);
103
+ if (detail?.action === 'pulled') {
104
+ result = { action: 'resolved', message: 'Kept remote version, overwrote local' };
105
+ } else {
106
+ result = {
107
+ action: detail?.action ?? 'error',
108
+ message: detail?.message ?? 'Failed to pull remote version'
109
+ };
110
+ }
111
+ }
112
+
113
+ await saveSyncState(syncState);
114
+
115
+ if (result.action === 'resolved') {
116
+ ui.success(`Resolved: ${manifestId} — ${result.message}`);
117
+ } else {
118
+ ui.error(`Resolution failed: ${manifestId} — ${result.message}`);
119
+ }
120
+
121
+ if (opts.json) {
122
+ ui.render({ manifestId, keep, ...result }, { format: 'json' });
123
+ }
124
+ } catch (e) {
125
+ ui.error(`Resolve failed: ${e}`);
126
+ process.exit(1);
127
+ }
128
+ }
129
+ };
@@ -0,0 +1,17 @@
1
+ import type { CLICommandAssetDescriptor } from '@vibesdotdev/runtime/schemas/asset';
2
+
3
+ const descriptor: CLICommandAssetDescriptor = {
4
+ kind: 'cli/command',
5
+ id: 'storage.sync.status',
6
+ name: 'status',
7
+ description: 'Show synchronization status for all storage manifests',
8
+ group: 'storage.sync',
9
+ arguments: [],
10
+ options: [{ flags: '--json', description: 'Output as JSON' }],
11
+ aliases: [],
12
+ surfaces: ['cli'],
13
+ hardware: ['consumer'],
14
+ enabled: true
15
+ };
16
+
17
+ export default descriptor;