zyflow 0.6.4

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 (705) hide show
  1. package/.claude-flow/metrics/agent-metrics.json +1 -0
  2. package/.claude-flow/metrics/performance.json +87 -0
  3. package/.claude-flow/metrics/system-metrics.json +4370 -0
  4. package/.claude-flow/metrics/task-metrics.json +10 -0
  5. package/.claude-plugin/marketplace.json +18 -0
  6. package/.claude-plugin/plugin.json +17 -0
  7. package/.gitleaks.toml +69 -0
  8. package/.hive-mind/config/queens.json +59 -0
  9. package/.hive-mind/config/workers.json +72 -0
  10. package/.hive-mind/config.json +111 -0
  11. package/.hive-mind/hive.db +0 -0
  12. package/.hive-mind/hive.db-shm +0 -0
  13. package/.hive-mind/hive.db-wal +0 -0
  14. package/.leann/indexes/zyflow/documents.ids.txt +2078 -0
  15. package/.leann/indexes/zyflow/documents.index +0 -0
  16. package/.leann/indexes/zyflow/documents.leann.meta.json +25 -0
  17. package/.leann/indexes/zyflow/documents.leann.passages.idx +0 -0
  18. package/.leann/indexes/zyflow/documents.leann.passages.jsonl +2078 -0
  19. package/.mcp.json +41 -0
  20. package/.moai-backups/20260126_231508/.mcp.json +11 -0
  21. package/.moai-backups/20260126_231508/backup_metadata.json +34 -0
  22. package/.moai-backups/20260129_145438/.mcp.json +41 -0
  23. package/.moai-backups/20260129_145438/backup_metadata.json +53 -0
  24. package/.moai-backups/20260129_145504/.mcp.json +41 -0
  25. package/.moai-backups/20260129_145504/backup_metadata.json +20 -0
  26. package/.moai-backups/20260201_140004/.mcp.json +41 -0
  27. package/.moai-backups/20260201_140004/backup_metadata.json +51 -0
  28. package/.moai-backups/backup/.mcp.json +12 -0
  29. package/.moai-backups/settings-backup/settings.local.json +61 -0
  30. package/.pre-commit-config.yaml +74 -0
  31. package/.prettierignore +3 -0
  32. package/.prettierrc +7 -0
  33. package/.scannerwork/.sonar_lock +0 -0
  34. package/.scannerwork/report-task.txt +6 -0
  35. package/.serena/project.yml +105 -0
  36. package/.shadcn-admin-ref/.env.example +1 -0
  37. package/.shadcn-admin-ref/.prettierignore +18 -0
  38. package/.shadcn-admin-ref/.prettierrc +50 -0
  39. package/.shadcn-admin-ref/LICENSE +21 -0
  40. package/.shadcn-admin-ref/components.json +21 -0
  41. package/.shadcn-admin-ref/cz.yaml +7 -0
  42. package/.shadcn-admin-ref/eslint.config.js +59 -0
  43. package/.shadcn-admin-ref/index.html +80 -0
  44. package/.shadcn-admin-ref/knip.config.ts +8 -0
  45. package/.shadcn-admin-ref/netlify.toml +4 -0
  46. package/.shadcn-admin-ref/package.json +83 -0
  47. package/.shadcn-admin-ref/public/images/favicon.png +0 -0
  48. package/.shadcn-admin-ref/public/images/favicon.svg +4 -0
  49. package/.shadcn-admin-ref/public/images/favicon_light.png +0 -0
  50. package/.shadcn-admin-ref/public/images/favicon_light.svg +1 -0
  51. package/.shadcn-admin-ref/public/images/shadcn-admin.png +0 -0
  52. package/.shadcn-admin-ref/src/assets/brand-icons/icon-discord.tsx +28 -0
  53. package/.shadcn-admin-ref/src/assets/brand-icons/icon-docker.tsx +33 -0
  54. package/.shadcn-admin-ref/src/assets/brand-icons/icon-facebook.tsx +25 -0
  55. package/.shadcn-admin-ref/src/assets/brand-icons/icon-figma.tsx +27 -0
  56. package/.shadcn-admin-ref/src/assets/brand-icons/icon-github.tsx +25 -0
  57. package/.shadcn-admin-ref/src/assets/brand-icons/icon-gitlab.tsx +25 -0
  58. package/.shadcn-admin-ref/src/assets/brand-icons/icon-gmail.tsx +28 -0
  59. package/.shadcn-admin-ref/src/assets/brand-icons/icon-medium.tsx +30 -0
  60. package/.shadcn-admin-ref/src/assets/brand-icons/icon-notion.tsx +28 -0
  61. package/.shadcn-admin-ref/src/assets/brand-icons/icon-skype.tsx +26 -0
  62. package/.shadcn-admin-ref/src/assets/brand-icons/icon-slack.tsx +28 -0
  63. package/.shadcn-admin-ref/src/assets/brand-icons/icon-stripe.tsx +25 -0
  64. package/.shadcn-admin-ref/src/assets/brand-icons/icon-telegram.tsx +25 -0
  65. package/.shadcn-admin-ref/src/assets/brand-icons/icon-trello.tsx +27 -0
  66. package/.shadcn-admin-ref/src/assets/brand-icons/icon-whatsapp.tsx +26 -0
  67. package/.shadcn-admin-ref/src/assets/brand-icons/icon-zoom.tsx +26 -0
  68. package/.shadcn-admin-ref/src/assets/brand-icons/index.ts +16 -0
  69. package/.shadcn-admin-ref/src/assets/clerk-full-logo.tsx +41 -0
  70. package/.shadcn-admin-ref/src/assets/clerk-logo.tsx +23 -0
  71. package/.shadcn-admin-ref/src/assets/custom/icon-dir.tsx +110 -0
  72. package/.shadcn-admin-ref/src/assets/custom/icon-layout-compact.tsx +131 -0
  73. package/.shadcn-admin-ref/src/assets/custom/icon-layout-default.tsx +124 -0
  74. package/.shadcn-admin-ref/src/assets/custom/icon-layout-full.tsx +100 -0
  75. package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-floating.tsx +82 -0
  76. package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-inset.tsx +58 -0
  77. package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-sidebar.tsx +53 -0
  78. package/.shadcn-admin-ref/src/assets/custom/icon-theme-dark.tsx +79 -0
  79. package/.shadcn-admin-ref/src/assets/custom/icon-theme-light.tsx +78 -0
  80. package/.shadcn-admin-ref/src/assets/custom/icon-theme-system.tsx +116 -0
  81. package/.shadcn-admin-ref/src/assets/logo.tsx +24 -0
  82. package/.shadcn-admin-ref/src/components/coming-soon.tsx +16 -0
  83. package/.shadcn-admin-ref/src/components/command-menu.tsx +91 -0
  84. package/.shadcn-admin-ref/src/components/config-drawer.tsx +354 -0
  85. package/.shadcn-admin-ref/src/components/confirm-dialog.tsx +67 -0
  86. package/.shadcn-admin-ref/src/components/data-table/bulk-actions.tsx +213 -0
  87. package/.shadcn-admin-ref/src/components/data-table/column-header.tsx +74 -0
  88. package/.shadcn-admin-ref/src/components/data-table/faceted-filter.tsx +146 -0
  89. package/.shadcn-admin-ref/src/components/data-table/index.ts +6 -0
  90. package/.shadcn-admin-ref/src/components/data-table/pagination.tsx +130 -0
  91. package/.shadcn-admin-ref/src/components/data-table/toolbar.tsx +85 -0
  92. package/.shadcn-admin-ref/src/components/data-table/view-options.tsx +56 -0
  93. package/.shadcn-admin-ref/src/components/date-picker.tsx +51 -0
  94. package/.shadcn-admin-ref/src/components/layout/app-sidebar.tsx +37 -0
  95. package/.shadcn-admin-ref/src/components/layout/app-title.tsx +64 -0
  96. package/.shadcn-admin-ref/src/components/layout/authenticated-layout.tsx +42 -0
  97. package/.shadcn-admin-ref/src/components/layout/data/sidebar-data.ts +205 -0
  98. package/.shadcn-admin-ref/src/components/layout/header.tsx +50 -0
  99. package/.shadcn-admin-ref/src/components/layout/main.tsx +27 -0
  100. package/.shadcn-admin-ref/src/components/layout/nav-group.tsx +185 -0
  101. package/.shadcn-admin-ref/src/components/layout/nav-user.tsx +124 -0
  102. package/.shadcn-admin-ref/src/components/layout/team-switcher.tsx +86 -0
  103. package/.shadcn-admin-ref/src/components/layout/top-nav.tsx +67 -0
  104. package/.shadcn-admin-ref/src/components/layout/types.ts +44 -0
  105. package/.shadcn-admin-ref/src/components/learn-more.tsx +44 -0
  106. package/.shadcn-admin-ref/src/components/long-text.tsx +84 -0
  107. package/.shadcn-admin-ref/src/components/navigation-progress.tsx +25 -0
  108. package/.shadcn-admin-ref/src/components/password-input.tsx +42 -0
  109. package/.shadcn-admin-ref/src/components/profile-dropdown.tsx +75 -0
  110. package/.shadcn-admin-ref/src/components/search.tsx +37 -0
  111. package/.shadcn-admin-ref/src/components/select-dropdown.tsx +62 -0
  112. package/.shadcn-admin-ref/src/components/sign-out-dialog.tsx +38 -0
  113. package/.shadcn-admin-ref/src/components/skip-to-main.tsx +10 -0
  114. package/.shadcn-admin-ref/src/components/theme-switch.tsx +58 -0
  115. package/.shadcn-admin-ref/src/components/ui/alert-dialog.tsx +154 -0
  116. package/.shadcn-admin-ref/src/components/ui/alert.tsx +65 -0
  117. package/.shadcn-admin-ref/src/components/ui/avatar.tsx +50 -0
  118. package/.shadcn-admin-ref/src/components/ui/badge.tsx +45 -0
  119. package/.shadcn-admin-ref/src/components/ui/button.tsx +58 -0
  120. package/.shadcn-admin-ref/src/components/ui/calendar.tsx +210 -0
  121. package/.shadcn-admin-ref/src/components/ui/card.tsx +91 -0
  122. package/.shadcn-admin-ref/src/components/ui/checkbox.tsx +29 -0
  123. package/.shadcn-admin-ref/src/components/ui/collapsible.tsx +31 -0
  124. package/.shadcn-admin-ref/src/components/ui/command.tsx +181 -0
  125. package/.shadcn-admin-ref/src/components/ui/dialog.tsx +142 -0
  126. package/.shadcn-admin-ref/src/components/ui/dropdown-menu.tsx +254 -0
  127. package/.shadcn-admin-ref/src/components/ui/form.tsx +164 -0
  128. package/.shadcn-admin-ref/src/components/ui/input-otp.tsx +74 -0
  129. package/.shadcn-admin-ref/src/components/ui/input.tsx +20 -0
  130. package/.shadcn-admin-ref/src/components/ui/label.tsx +23 -0
  131. package/.shadcn-admin-ref/src/components/ui/popover.tsx +45 -0
  132. package/.shadcn-admin-ref/src/components/ui/radio-group.tsx +42 -0
  133. package/.shadcn-admin-ref/src/components/ui/scroll-area.tsx +65 -0
  134. package/.shadcn-admin-ref/src/components/ui/select.tsx +182 -0
  135. package/.shadcn-admin-ref/src/components/ui/separator.tsx +25 -0
  136. package/.shadcn-admin-ref/src/components/ui/sheet.tsx +136 -0
  137. package/.shadcn-admin-ref/src/components/ui/sidebar.tsx +728 -0
  138. package/.shadcn-admin-ref/src/components/ui/skeleton.tsx +13 -0
  139. package/.shadcn-admin-ref/src/components/ui/sonner.tsx +21 -0
  140. package/.shadcn-admin-ref/src/components/ui/switch.tsx +28 -0
  141. package/.shadcn-admin-ref/src/components/ui/table.tsx +113 -0
  142. package/.shadcn-admin-ref/src/components/ui/tabs.tsx +63 -0
  143. package/.shadcn-admin-ref/src/components/ui/textarea.tsx +17 -0
  144. package/.shadcn-admin-ref/src/components/ui/tooltip.tsx +60 -0
  145. package/.shadcn-admin-ref/src/config/fonts.ts +19 -0
  146. package/.shadcn-admin-ref/src/context/direction-provider.tsx +61 -0
  147. package/.shadcn-admin-ref/src/context/font-provider.tsx +58 -0
  148. package/.shadcn-admin-ref/src/context/layout-provider.tsx +85 -0
  149. package/.shadcn-admin-ref/src/context/search-provider.tsx +46 -0
  150. package/.shadcn-admin-ref/src/context/theme-provider.tsx +110 -0
  151. package/.shadcn-admin-ref/src/features/apps/data/apps.tsx +110 -0
  152. package/.shadcn-admin-ref/src/features/apps/index.tsx +179 -0
  153. package/.shadcn-admin-ref/src/features/auth/auth-layout.tsx +19 -0
  154. package/.shadcn-admin-ref/src/features/auth/forgot-password/components/forgot-password-form.tsx +82 -0
  155. package/.shadcn-admin-ref/src/features/auth/forgot-password/index.tsx +44 -0
  156. package/.shadcn-admin-ref/src/features/auth/otp/components/otp-form.tsx +100 -0
  157. package/.shadcn-admin-ref/src/features/auth/otp/index.tsx +44 -0
  158. package/.shadcn-admin-ref/src/features/auth/sign-in/assets/dashboard-dark.png +0 -0
  159. package/.shadcn-admin-ref/src/features/auth/sign-in/assets/dashboard-light.png +0 -0
  160. package/.shadcn-admin-ref/src/features/auth/sign-in/components/user-auth-form.tsx +150 -0
  161. package/.shadcn-admin-ref/src/features/auth/sign-in/index.tsx +51 -0
  162. package/.shadcn-admin-ref/src/features/auth/sign-in/sign-in-2.tsx +69 -0
  163. package/.shadcn-admin-ref/src/features/auth/sign-up/components/sign-up-form.tsx +143 -0
  164. package/.shadcn-admin-ref/src/features/auth/sign-up/index.tsx +57 -0
  165. package/.shadcn-admin-ref/src/features/chats/components/new-chat.tsx +127 -0
  166. package/.shadcn-admin-ref/src/features/chats/data/chat-types.ts +4 -0
  167. package/.shadcn-admin-ref/src/features/chats/data/convo.json +309 -0
  168. package/.shadcn-admin-ref/src/features/chats/index.tsx +349 -0
  169. package/.shadcn-admin-ref/src/features/dashboard/components/analytics-chart.tsx +77 -0
  170. package/.shadcn-admin-ref/src/features/dashboard/components/analytics.tsx +189 -0
  171. package/.shadcn-admin-ref/src/features/dashboard/components/overview.tsx +82 -0
  172. package/.shadcn-admin-ref/src/features/dashboard/components/recent-sales.tsx +83 -0
  173. package/.shadcn-admin-ref/src/features/dashboard/index.tsx +220 -0
  174. package/.shadcn-admin-ref/src/features/errors/forbidden.tsx +25 -0
  175. package/.shadcn-admin-ref/src/features/errors/general-error.tsx +36 -0
  176. package/.shadcn-admin-ref/src/features/errors/maintenance-error.tsx +19 -0
  177. package/.shadcn-admin-ref/src/features/errors/not-found-error.tsx +25 -0
  178. package/.shadcn-admin-ref/src/features/errors/unauthorized-error.tsx +25 -0
  179. package/.shadcn-admin-ref/src/features/settings/account/account-form.tsx +173 -0
  180. package/.shadcn-admin-ref/src/features/settings/account/index.tsx +14 -0
  181. package/.shadcn-admin-ref/src/features/settings/appearance/appearance-form.tsx +162 -0
  182. package/.shadcn-admin-ref/src/features/settings/appearance/index.tsx +14 -0
  183. package/.shadcn-admin-ref/src/features/settings/components/content-section.tsx +22 -0
  184. package/.shadcn-admin-ref/src/features/settings/components/sidebar-nav.tsx +84 -0
  185. package/.shadcn-admin-ref/src/features/settings/display/display-form.tsx +121 -0
  186. package/.shadcn-admin-ref/src/features/settings/display/index.tsx +13 -0
  187. package/.shadcn-admin-ref/src/features/settings/index.tsx +74 -0
  188. package/.shadcn-admin-ref/src/features/settings/notifications/index.tsx +13 -0
  189. package/.shadcn-admin-ref/src/features/settings/notifications/notifications-form.tsx +220 -0
  190. package/.shadcn-admin-ref/src/features/settings/profile/index.tsx +13 -0
  191. package/.shadcn-admin-ref/src/features/settings/profile/profile-form.tsx +177 -0
  192. package/.shadcn-admin-ref/src/features/tasks/components/data-table-bulk-actions.tsx +193 -0
  193. package/.shadcn-admin-ref/src/features/tasks/components/data-table-row-actions.tsx +83 -0
  194. package/.shadcn-admin-ref/src/features/tasks/components/tasks-columns.tsx +123 -0
  195. package/.shadcn-admin-ref/src/features/tasks/components/tasks-dialogs.tsx +72 -0
  196. package/.shadcn-admin-ref/src/features/tasks/components/tasks-import-dialog.tsx +110 -0
  197. package/.shadcn-admin-ref/src/features/tasks/components/tasks-multi-delete-dialog.tsx +95 -0
  198. package/.shadcn-admin-ref/src/features/tasks/components/tasks-mutate-drawer.tsx +212 -0
  199. package/.shadcn-admin-ref/src/features/tasks/components/tasks-primary-buttons.tsx +21 -0
  200. package/.shadcn-admin-ref/src/features/tasks/components/tasks-provider.tsx +36 -0
  201. package/.shadcn-admin-ref/src/features/tasks/components/tasks-table.tsx +197 -0
  202. package/.shadcn-admin-ref/src/features/tasks/data/data.tsx +77 -0
  203. package/.shadcn-admin-ref/src/features/tasks/data/schema.ts +13 -0
  204. package/.shadcn-admin-ref/src/features/tasks/data/tasks.ts +29 -0
  205. package/.shadcn-admin-ref/src/features/tasks/index.tsx +41 -0
  206. package/.shadcn-admin-ref/src/features/users/components/data-table-bulk-actions.tsx +139 -0
  207. package/.shadcn-admin-ref/src/features/users/components/data-table-row-actions.tsx +63 -0
  208. package/.shadcn-admin-ref/src/features/users/components/users-action-dialog.tsx +326 -0
  209. package/.shadcn-admin-ref/src/features/users/components/users-columns.tsx +138 -0
  210. package/.shadcn-admin-ref/src/features/users/components/users-delete-dialog.tsx +81 -0
  211. package/.shadcn-admin-ref/src/features/users/components/users-dialogs.tsx +51 -0
  212. package/.shadcn-admin-ref/src/features/users/components/users-invite-dialog.tsx +150 -0
  213. package/.shadcn-admin-ref/src/features/users/components/users-multi-delete-dialog.tsx +95 -0
  214. package/.shadcn-admin-ref/src/features/users/components/users-primary-buttons.tsx +21 -0
  215. package/.shadcn-admin-ref/src/features/users/components/users-provider.tsx +36 -0
  216. package/.shadcn-admin-ref/src/features/users/components/users-table.tsx +194 -0
  217. package/.shadcn-admin-ref/src/features/users/data/data.ts +35 -0
  218. package/.shadcn-admin-ref/src/features/users/data/schema.ts +32 -0
  219. package/.shadcn-admin-ref/src/features/users/data/users.ts +33 -0
  220. package/.shadcn-admin-ref/src/features/users/index.tsx +47 -0
  221. package/.shadcn-admin-ref/src/hooks/use-dialog-state.tsx +18 -0
  222. package/.shadcn-admin-ref/src/hooks/use-mobile.tsx +19 -0
  223. package/.shadcn-admin-ref/src/hooks/use-table-url-state.ts +219 -0
  224. package/.shadcn-admin-ref/src/lib/cookies.ts +43 -0
  225. package/.shadcn-admin-ref/src/lib/handle-server-error.ts +24 -0
  226. package/.shadcn-admin-ref/src/lib/show-submitted-data.tsx +15 -0
  227. package/.shadcn-admin-ref/src/lib/utils.ts +60 -0
  228. package/.shadcn-admin-ref/src/main.tsx +107 -0
  229. package/.shadcn-admin-ref/src/routeTree.gen.ts +719 -0
  230. package/.shadcn-admin-ref/src/routes/(auth)/forgot-password.tsx +6 -0
  231. package/.shadcn-admin-ref/src/routes/(auth)/otp.tsx +6 -0
  232. package/.shadcn-admin-ref/src/routes/(auth)/sign-in-2.tsx +6 -0
  233. package/.shadcn-admin-ref/src/routes/(auth)/sign-in.tsx +12 -0
  234. package/.shadcn-admin-ref/src/routes/(auth)/sign-up.tsx +6 -0
  235. package/.shadcn-admin-ref/src/routes/(errors)/401.tsx +6 -0
  236. package/.shadcn-admin-ref/src/routes/(errors)/403.tsx +6 -0
  237. package/.shadcn-admin-ref/src/routes/(errors)/404.tsx +6 -0
  238. package/.shadcn-admin-ref/src/routes/(errors)/500.tsx +6 -0
  239. package/.shadcn-admin-ref/src/routes/(errors)/503.tsx +6 -0
  240. package/.shadcn-admin-ref/src/routes/__root.tsx +30 -0
  241. package/.shadcn-admin-ref/src/routes/_authenticated/apps/index.tsx +17 -0
  242. package/.shadcn-admin-ref/src/routes/_authenticated/chats/index.tsx +6 -0
  243. package/.shadcn-admin-ref/src/routes/_authenticated/errors/$error.tsx +45 -0
  244. package/.shadcn-admin-ref/src/routes/_authenticated/help-center/index.tsx +6 -0
  245. package/.shadcn-admin-ref/src/routes/_authenticated/index.tsx +6 -0
  246. package/.shadcn-admin-ref/src/routes/_authenticated/route.tsx +6 -0
  247. package/.shadcn-admin-ref/src/routes/_authenticated/settings/account.tsx +6 -0
  248. package/.shadcn-admin-ref/src/routes/_authenticated/settings/appearance.tsx +6 -0
  249. package/.shadcn-admin-ref/src/routes/_authenticated/settings/display.tsx +6 -0
  250. package/.shadcn-admin-ref/src/routes/_authenticated/settings/index.tsx +6 -0
  251. package/.shadcn-admin-ref/src/routes/_authenticated/settings/notifications.tsx +6 -0
  252. package/.shadcn-admin-ref/src/routes/_authenticated/settings/route.tsx +6 -0
  253. package/.shadcn-admin-ref/src/routes/_authenticated/tasks/index.tsx +23 -0
  254. package/.shadcn-admin-ref/src/routes/_authenticated/users/index.tsx +32 -0
  255. package/.shadcn-admin-ref/src/routes/clerk/(auth)/route.tsx +60 -0
  256. package/.shadcn-admin-ref/src/routes/clerk/(auth)/sign-in.tsx +14 -0
  257. package/.shadcn-admin-ref/src/routes/clerk/(auth)/sign-up.tsx +9 -0
  258. package/.shadcn-admin-ref/src/routes/clerk/_authenticated/route.tsx +6 -0
  259. package/.shadcn-admin-ref/src/routes/clerk/_authenticated/user-management.tsx +184 -0
  260. package/.shadcn-admin-ref/src/routes/clerk/route.tsx +135 -0
  261. package/.shadcn-admin-ref/src/stores/auth-store.ts +53 -0
  262. package/.shadcn-admin-ref/src/styles/index.css +87 -0
  263. package/.shadcn-admin-ref/src/styles/theme.css +102 -0
  264. package/.shadcn-admin-ref/src/tanstack-table.d.ts +10 -0
  265. package/.shadcn-admin-ref/src/vite-env.d.ts +1 -0
  266. package/.swarm/memory.db +0 -0
  267. package/.swarm/memory.db-shm +0 -0
  268. package/.swarm/memory.db-wal +0 -0
  269. package/.zyflow/cli-settings.json +30 -0
  270. package/.zyflow/db.sqlite +0 -0
  271. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491505852.json +10 -0
  272. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491622627.json +10 -0
  273. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491794652.json +10 -0
  274. package/.zyflow/logs/add-gitdiagram-integration/1633-1765491890392.json +10 -0
  275. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494002879.json +10 -0
  276. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494183887.json +10 -0
  277. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494342052.json +10 -0
  278. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494387244.json +10 -0
  279. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494387245.json +10 -0
  280. package/.zyflow/logs/add-gitdiagram-integration/1633-1765494606176.json +10 -0
  281. package/.zyflow/logs/add-gitdiagram-integration/1633-1765495967542.json +16 -0
  282. package/.zyflow/logs/add-gitdiagram-integration/1633-1765495967629.json +16 -0
  283. package/.zyflow/logs/add-gitdiagram-integration/1633-1765497861143.json +16 -0
  284. package/.zyflow/logs/add-gitdiagram-integration/1633-1765497861870.json +20 -0
  285. package/.zyflow/logs/add-gitdiagram-integration/1633-1765498021377.json +18 -0
  286. package/.zyflow/logs/add-gitdiagram-integration/1633-1765498021660.json +18 -0
  287. package/.zyflow/logs/add-gitdiagram-integration/1633-1765503255525.json +13 -0
  288. package/.zyflow/logs/add-gitdiagram-integration/1633-1765503256018.json +13 -0
  289. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504009102.json +16 -0
  290. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504492051.json +18 -0
  291. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504946437.json +16 -0
  292. package/.zyflow/logs/add-gitdiagram-integration/1633-1765504946640.json +16 -0
  293. package/.zyflow/logs/add-gitdiagram-integration/1634-1765505950215.json +16 -0
  294. package/.zyflow/logs/add-gitdiagram-integration/1634-1765505950948.json +18 -0
  295. package/.zyflow/logs/add-gitdiagram-integration/1635-1765505971712.json +18 -0
  296. package/.zyflow/logs/add-gitdiagram-integration/1635-1765505971976.json +18 -0
  297. package/.zyflow/logs/add-gitdiagram-integration/1636-1765505986208.json +18 -0
  298. package/.zyflow/logs/add-gitdiagram-integration/1636-1765505986620.json +16 -0
  299. package/.zyflow/logs/integrate-claude-flow/3580-1765996816612.json +10 -0
  300. package/.zyflow/logs/integrate-claude-flow/3580-1766014825819.json +10 -0
  301. package/.zyflow/logs/integrate-claude-flow/3580-1766015183794.json +12 -0
  302. package/.zyflow/logs/integrate-claude-flow/3580-1766015474608.json +12 -0
  303. package/.zyflow/logs/integrate-claude-flow/3581-1766016502824.json +63 -0
  304. package/.zyflow/logs/integrate-claude-flow/3581-1766016576008.json +60 -0
  305. package/.zyflow/logs/integrate-claude-flow/3582-1766022737754.json +110 -0
  306. package/.zyflow/logs/integrate-claude-flow/3582-1766022809327.json +135 -0
  307. package/.zyflow/sessions.json +242 -0
  308. package/.zyflow/settings.json +6 -0
  309. package/.zyflow/tasks.db +0 -0
  310. package/.zyflow/tasks.db-shm +0 -0
  311. package/.zyflow/tasks.db-wal +0 -0
  312. package/.zyflow/zyflow.sqlite +0 -0
  313. package/Dockerfile +82 -0
  314. package/LICENSE +21 -0
  315. package/README.md +506 -0
  316. package/claude-flow +34 -0
  317. package/components.json +21 -0
  318. package/config/ports.ts +28 -0
  319. package/docker-compose.yml +52 -0
  320. package/eslint.config.js +34 -0
  321. package/index.html +19 -0
  322. package/logs/mcp-error.log +55 -0
  323. package/logs/mcp-out.log +0 -0
  324. package/logs/pm2-error.log +0 -0
  325. package/logs/pm2-out.log +265 -0
  326. package/logs/py-error.log +22 -0
  327. package/logs/py-out.log +0 -0
  328. package/logs/server-error.log +11000 -0
  329. package/logs/server-out.log +8117 -0
  330. package/logs/vite-error.log +404 -0
  331. package/logs/vite-out.log +311 -0
  332. package/mcp-server/agent-tools.ts +375 -0
  333. package/mcp-server/cli-models.ts +193 -0
  334. package/mcp-server/context.ts +110 -0
  335. package/mcp-server/diagram-tools.ts +341 -0
  336. package/mcp-server/index.ts +2014 -0
  337. package/mcp-server/integration-tools.ts +909 -0
  338. package/mcp-server/moai-spec-tools.ts +416 -0
  339. package/mcp-server/parser.ts +422 -0
  340. package/mcp-server/post-task-runner.ts +253 -0
  341. package/mcp-server/post-task-types.ts +426 -0
  342. package/mcp-server/quarantine-manager.ts +479 -0
  343. package/mcp-server/report-generator.ts +386 -0
  344. package/mcp-server/task-tools.ts +619 -0
  345. package/mcp-server/trigger-config.ts +288 -0
  346. package/mcp-server/trigger-router.ts +305 -0
  347. package/mcp-server/triggers/event-listener.ts +331 -0
  348. package/mcp-server/triggers/git-hooks.ts +283 -0
  349. package/mcp-server/triggers/scheduler.ts +289 -0
  350. package/mcp-server/types.ts +55 -0
  351. package/memory/claude-flow@alpha-data.json +5 -0
  352. package/nginx/zyflow.conf +144 -0
  353. package/openspec/config.yaml +78 -0
  354. package/openspec-backup.tar.gz +0 -0
  355. package/package.json +154 -0
  356. package/packages/gitdiagram-core/.claude-flow/metrics/agent-metrics.json +1 -0
  357. package/packages/gitdiagram-core/.claude-flow/metrics/performance.json +87 -0
  358. package/packages/gitdiagram-core/.claude-flow/metrics/task-metrics.json +10 -0
  359. package/packages/gitdiagram-core/package.json +41 -0
  360. package/packages/gitdiagram-core/src/file-tree.ts +272 -0
  361. package/packages/gitdiagram-core/src/generator.ts +283 -0
  362. package/packages/gitdiagram-core/src/index.ts +78 -0
  363. package/packages/gitdiagram-core/src/llm-adapter.ts +235 -0
  364. package/packages/gitdiagram-core/src/mermaid-utils.ts +304 -0
  365. package/packages/gitdiagram-core/src/prompts.ts +281 -0
  366. package/packages/zyflow-parser/package.json +34 -0
  367. package/packages/zyflow-parser/src/index.ts +26 -0
  368. package/packages/zyflow-parser/src/moai-parser.ts +603 -0
  369. package/packages/zyflow-parser/src/moai-types.ts +110 -0
  370. package/packages/zyflow-remote-plugin/.claude-flow/metrics/agent-metrics.json +1 -0
  371. package/packages/zyflow-remote-plugin/.claude-flow/metrics/performance.json +87 -0
  372. package/packages/zyflow-remote-plugin/.claude-flow/metrics/task-metrics.json +10 -0
  373. package/packages/zyflow-remote-plugin/package.json +31 -0
  374. package/packages/zyflow-remote-plugin/src/index.ts +71 -0
  375. package/packages/zyflow-remote-plugin/src/remote-config.ts +232 -0
  376. package/packages/zyflow-remote-plugin/src/router.ts +535 -0
  377. package/packages/zyflow-remote-plugin/src/ssh-config-parser.ts +123 -0
  378. package/packages/zyflow-remote-plugin/src/ssh-manager.ts +598 -0
  379. package/packages/zyflow-remote-plugin/src/types.ts +149 -0
  380. package/plugin/manifest.json +26 -0
  381. package/plugin/package.json +13 -0
  382. package/public/favicon.svg +4 -0
  383. package/server/adk/agents/error-analyzer.ts +223 -0
  384. package/server/adk/agents/fix-generator.ts +187 -0
  385. package/server/adk/agents/pr-agent.ts +264 -0
  386. package/server/adk/agents/validator.ts +187 -0
  387. package/server/adk/config.ts +43 -0
  388. package/server/adk/index.ts +69 -0
  389. package/server/adk/integration.ts +297 -0
  390. package/server/adk/orchestrator.ts +405 -0
  391. package/server/adk/tools/build-tools.ts +290 -0
  392. package/server/adk/tools/file-tools.ts +351 -0
  393. package/server/adk/tools/git-tools.ts +280 -0
  394. package/server/adk/tools/github-tools.ts +249 -0
  395. package/server/agents/agent-monitor.ts +416 -0
  396. package/server/agents/alert-integration.ts +312 -0
  397. package/server/agents/error-analyzer.ts +472 -0
  398. package/server/agents/error-detector.ts +442 -0
  399. package/server/agents/fix-generator.ts +421 -0
  400. package/server/agents/fix-validator.ts +428 -0
  401. package/server/agents/merge-policy.ts +362 -0
  402. package/server/agents/pr-workflow.ts +476 -0
  403. package/server/agents/prompts/error-analysis.ts +393 -0
  404. package/server/ai/gemini-client.ts +499 -0
  405. package/server/ai/index.ts +317 -0
  406. package/server/ai/types.ts +137 -0
  407. package/server/app.ts +3693 -0
  408. package/server/archive-manager.ts +604 -0
  409. package/server/backlog/index.ts +7 -0
  410. package/server/backlog/migration.ts +331 -0
  411. package/server/backlog/parser.ts +323 -0
  412. package/server/backlog/sync.ts +325 -0
  413. package/server/change-log.ts +868 -0
  414. package/server/claude-flow/index.ts +12 -0
  415. package/server/claude-flow/prompt-builder.ts +407 -0
  416. package/server/claude-flow/types.ts +33 -0
  417. package/server/cli-adapter/index.ts +11 -0
  418. package/server/cli-adapter/process-manager.ts +612 -0
  419. package/server/cli-adapter/profile-manager.ts +286 -0
  420. package/server/cli-adapter/routes.ts +561 -0
  421. package/server/cli-adapter/types.ts +226 -0
  422. package/server/config.d.ts +18 -0
  423. package/server/config.js +79 -0
  424. package/server/config.ts +262 -0
  425. package/server/flow-sync.ts +543 -0
  426. package/server/git/change-workflow.ts +446 -0
  427. package/server/git/commands.ts +370 -0
  428. package/server/git/github.ts +247 -0
  429. package/server/git/index.ts +1202 -0
  430. package/server/git/status.ts +322 -0
  431. package/server/index.ts +136 -0
  432. package/server/integrations/crypto.ts +142 -0
  433. package/server/integrations/db/client.ts +169 -0
  434. package/server/integrations/db/schema.ts +167 -0
  435. package/server/integrations/env-parser.ts +365 -0
  436. package/server/integrations/index.ts +101 -0
  437. package/server/integrations/keychain.ts +239 -0
  438. package/server/integrations/local/file-utils.ts +383 -0
  439. package/server/integrations/local/index.ts +64 -0
  440. package/server/integrations/local/resolver.ts +439 -0
  441. package/server/integrations/local/types.ts +122 -0
  442. package/server/integrations/routes.ts +1100 -0
  443. package/server/integrations/service-patterns.ts +771 -0
  444. package/server/integrations/services/accounts.ts +356 -0
  445. package/server/integrations/services/env-import.ts +279 -0
  446. package/server/integrations/services/projects.ts +552 -0
  447. package/server/integrations/services/system-import.ts +1110 -0
  448. package/server/migrations/ears-generator.ts +491 -0
  449. package/server/migrations/gherkin-generator.ts +605 -0
  450. package/server/migrations/index.ts +73 -0
  451. package/server/migrations/migrate-spec-format.ts +492 -0
  452. package/server/migrations/openspec-parser.ts +542 -0
  453. package/server/migrations/tag-generator.ts +474 -0
  454. package/server/moai-specs.ts +487 -0
  455. package/server/moai-watcher.ts +145 -0
  456. package/server/parser-debug.ts +37 -0
  457. package/server/parser-utils.ts +316 -0
  458. package/server/parser.d.ts +17 -0
  459. package/server/parser.js +221 -0
  460. package/server/parser.ts +342 -0
  461. package/server/remote-watcher.ts +367 -0
  462. package/server/replay-engine.ts +915 -0
  463. package/server/routes/alerts.ts +1028 -0
  464. package/server/routes/changes.ts +812 -0
  465. package/server/routes/docs.ts +898 -0
  466. package/server/routes/flow.ts +2814 -0
  467. package/server/routes/global-chat.ts +162 -0
  468. package/server/routes/leann.ts +327 -0
  469. package/server/routes/projects.ts +1282 -0
  470. package/server/routes/search.ts +266 -0
  471. package/server/routes/specs.ts +482 -0
  472. package/server/routes/webhooks.ts +579 -0
  473. package/server/server/parser.js +265 -0
  474. package/server/services/githubActionsPoller.ts +797 -0
  475. package/server/services/slackNotifier.ts +476 -0
  476. package/server/src/types/index.js +1 -0
  477. package/server/sync-tasks.ts +741 -0
  478. package/server/tasks/cli/commands.ts +269 -0
  479. package/server/tasks/cli/index.ts +152 -0
  480. package/server/tasks/core/search.ts +81 -0
  481. package/server/tasks/core/task.ts +307 -0
  482. package/server/tasks/db/client.ts +1008 -0
  483. package/server/tasks/db/schema.ts +572 -0
  484. package/server/tasks/index.ts +24 -0
  485. package/server/tasks.db +0 -0
  486. package/server/types/archive.ts +136 -0
  487. package/server/types/change-log.ts +643 -0
  488. package/server/types/spec.ts +188 -0
  489. package/server/unified-spec-scanner.ts +753 -0
  490. package/server/utils/crypto.ts +179 -0
  491. package/server/utils/webhook-verify.ts +216 -0
  492. package/server/watcher.ts +132 -0
  493. package/server/websocket.ts +99 -0
  494. package/server-output.log +6 -0
  495. package/sonar-project.properties +18 -0
  496. package/src/App.tsx +386 -0
  497. package/src/api/client.ts +346 -0
  498. package/src/api/error-interceptor.ts +366 -0
  499. package/src/api/errors.ts +123 -0
  500. package/src/api/flow.ts +233 -0
  501. package/src/api/offline-queue.ts +351 -0
  502. package/src/api/retry-logic.ts +233 -0
  503. package/src/components/OfflineModeBanner.tsx +159 -0
  504. package/src/components/SSEStatusIndicator.tsx +194 -0
  505. package/src/components/agent/AgentChat.tsx +243 -0
  506. package/src/components/agent/AgentPage.tsx +182 -0
  507. package/src/components/agent/AgentSidebar.tsx +231 -0
  508. package/src/components/agent/index.ts +7 -0
  509. package/src/components/alerts/AlertCenter.tsx +239 -0
  510. package/src/components/alerts/AlertDashboard.tsx +211 -0
  511. package/src/components/alerts/AlertDetail.tsx +474 -0
  512. package/src/components/alerts/AlertList.tsx +113 -0
  513. package/src/components/alerts/AlertSettings.tsx +336 -0
  514. package/src/components/alerts/index.ts +5 -0
  515. package/src/components/chat/ChatPanel.tsx +642 -0
  516. package/src/components/chat/index.ts +1 -0
  517. package/src/components/cli/AddCustomCLIDialog.tsx +210 -0
  518. package/src/components/cli/CLISelector.tsx +187 -0
  519. package/src/components/cli/index.ts +8 -0
  520. package/src/components/dashboard/ArchivedChangeList.tsx +102 -0
  521. package/src/components/dashboard/ArchivedChangeViewer.tsx +184 -0
  522. package/src/components/dashboard/ArchivedChangesPage.tsx +31 -0
  523. package/src/components/dashboard/ChangeList.tsx +86 -0
  524. package/src/components/dashboard/ThemeToggle.tsx +33 -0
  525. package/src/components/diagram/DiagramViewer.tsx +256 -0
  526. package/src/components/diagram/MermaidRenderer.tsx +163 -0
  527. package/src/components/diagram/ProjectDiagramTab.tsx +161 -0
  528. package/src/components/diagram/index.ts +13 -0
  529. package/src/components/errors/ErrorBoundary.tsx +276 -0
  530. package/src/components/errors/ErrorFallback.tsx +198 -0
  531. package/src/components/errors/ErrorToast.tsx +221 -0
  532. package/src/components/flow/BacklogView.tsx +1142 -0
  533. package/src/components/flow/ChangeDetail.tsx +475 -0
  534. package/src/components/flow/ChangeItem.tsx +230 -0
  535. package/src/components/flow/ChangeList.tsx +92 -0
  536. package/src/components/flow/ExecutionHistoryDialog.tsx +224 -0
  537. package/src/components/flow/FlowContent.tsx +212 -0
  538. package/src/components/flow/FlowPage.tsx +9 -0
  539. package/src/components/flow/PipelineBar.tsx +214 -0
  540. package/src/components/flow/ProjectDashboard.tsx +222 -0
  541. package/src/components/flow/SpecDetail.tsx +138 -0
  542. package/src/components/flow/SpecDetailTabs.tsx +176 -0
  543. package/src/components/flow/SpecItem.tsx +93 -0
  544. package/src/components/flow/SpecProgressBar.tsx +47 -0
  545. package/src/components/flow/StageContent.tsx +620 -0
  546. package/src/components/flow/StandaloneTasks.tsx +960 -0
  547. package/src/components/flow/TaskExecutionDialog.tsx +1204 -0
  548. package/src/components/flow/index.ts +9 -0
  549. package/src/components/flow/task-execution/AgentSlider.tsx +37 -0
  550. package/src/components/flow/task-execution/ConsensusSettings.tsx +129 -0
  551. package/src/components/flow/task-execution/ExecutionOutput.tsx +398 -0
  552. package/src/components/flow/task-execution/ModelSelector.tsx +134 -0
  553. package/src/components/flow/task-execution/ProviderSelector.tsx +137 -0
  554. package/src/components/flow/task-execution/RecommendationBanner.tsx +71 -0
  555. package/src/components/flow/task-execution/StatusBadge.tsx +43 -0
  556. package/src/components/flow/task-execution/StrategySelector.tsx +48 -0
  557. package/src/components/flow/task-execution/SwarmSummary.tsx +55 -0
  558. package/src/components/flow/task-execution/index.ts +14 -0
  559. package/src/components/flow/task-execution/types.ts +56 -0
  560. package/src/components/git/ChangeWorkflowDialog.tsx +582 -0
  561. package/src/components/git/ConflictResolutionDialog.tsx +398 -0
  562. package/src/components/git/GitBranchSelector.tsx +212 -0
  563. package/src/components/git/GitCommitDialog.tsx +254 -0
  564. package/src/components/git/GitStatusBadge.tsx +148 -0
  565. package/src/components/git/GitSyncButton.tsx +128 -0
  566. package/src/components/git/RemoteStatusBanner.tsx +143 -0
  567. package/src/components/git/index.ts +9 -0
  568. package/src/components/integrations/EnvImportDialog.tsx +524 -0
  569. package/src/components/integrations/EnvironmentDialog.tsx +227 -0
  570. package/src/components/integrations/IntegrationBadges.tsx +91 -0
  571. package/src/components/integrations/IntegrationsSettings.tsx +55 -0
  572. package/src/components/integrations/ProjectIntegrations.tsx +481 -0
  573. package/src/components/integrations/ServiceAccountDialog.tsx +422 -0
  574. package/src/components/integrations/ServiceAccountList.tsx +305 -0
  575. package/src/components/integrations/SystemImportDialog.tsx +436 -0
  576. package/src/components/integrations/TestAccountDialog.tsx +162 -0
  577. package/src/components/integrations/index.ts +6 -0
  578. package/src/components/layout/AppSidebar.tsx +284 -0
  579. package/src/components/layout/FlowSidebar.tsx +435 -0
  580. package/src/components/layout/GlobalCommandPalette.tsx +410 -0
  581. package/src/components/layout/MenuBar.tsx +227 -0
  582. package/src/components/layout/StatusBar.tsx +226 -0
  583. package/src/components/monitoring/ErrorDashboard.tsx +274 -0
  584. package/src/components/monitoring/ErrorDetailPanel.tsx +200 -0
  585. package/src/components/monitoring/ErrorFilters.tsx +219 -0
  586. package/src/components/monitoring/ErrorHistoryList.tsx +141 -0
  587. package/src/components/monitoring/ErrorStats.tsx +249 -0
  588. package/src/components/remote/RemoteFileBrowser.tsx +249 -0
  589. package/src/components/remote/RemoteServerDialog.tsx +234 -0
  590. package/src/components/remote/RemoteServerList.tsx +366 -0
  591. package/src/components/remote/index.ts +7 -0
  592. package/src/components/settings/CLISettings.tsx +522 -0
  593. package/src/components/settings/CustomCLIDialog.tsx +548 -0
  594. package/src/components/settings/IntegrationsSettings.tsx +51 -0
  595. package/src/components/settings/ProjectSettings.tsx +441 -0
  596. package/src/components/settings/ProjectsSettings.tsx +541 -0
  597. package/src/components/settings/SearchSettings.tsx +272 -0
  598. package/src/components/settings/SettingsPage.tsx +68 -0
  599. package/src/components/settings/index.ts +5 -0
  600. package/src/components/swarm/ExecutionPanel.tsx +284 -0
  601. package/src/components/swarm/LogViewer.tsx +196 -0
  602. package/src/components/swarm/ProgressIndicator.tsx +111 -0
  603. package/src/components/swarm/index.ts +3 -0
  604. package/src/components/tasks/ArchiveTable.tsx +203 -0
  605. package/src/components/tasks/KanbanBoard.tsx +264 -0
  606. package/src/components/tasks/TaskCard.tsx +138 -0
  607. package/src/components/tasks/TaskColumn.tsx +81 -0
  608. package/src/components/tasks/TaskDialog.tsx +274 -0
  609. package/src/components/tasks/index.ts +5 -0
  610. package/src/components/tasks/types.ts +43 -0
  611. package/src/components/ui/alert-dialog.tsx +154 -0
  612. package/src/components/ui/alert.tsx +65 -0
  613. package/src/components/ui/badge.tsx +45 -0
  614. package/src/components/ui/button.tsx +58 -0
  615. package/src/components/ui/card.tsx +91 -0
  616. package/src/components/ui/checkbox.tsx +29 -0
  617. package/src/components/ui/collapsible.tsx +31 -0
  618. package/src/components/ui/command.tsx +184 -0
  619. package/src/components/ui/confirm-dialog.tsx +55 -0
  620. package/src/components/ui/dialog.tsx +142 -0
  621. package/src/components/ui/dropdown-menu.tsx +254 -0
  622. package/src/components/ui/input.tsx +20 -0
  623. package/src/components/ui/label.tsx +22 -0
  624. package/src/components/ui/markdown.tsx +100 -0
  625. package/src/components/ui/progress.tsx +27 -0
  626. package/src/components/ui/resizable-sidebar.tsx +156 -0
  627. package/src/components/ui/resizable.tsx +54 -0
  628. package/src/components/ui/right-resizable-sidebar.tsx +158 -0
  629. package/src/components/ui/scroll-area.tsx +64 -0
  630. package/src/components/ui/select.tsx +185 -0
  631. package/src/components/ui/separator.tsx +25 -0
  632. package/src/components/ui/sheet.tsx +136 -0
  633. package/src/components/ui/sidebar.tsx +726 -0
  634. package/src/components/ui/skeleton.tsx +13 -0
  635. package/src/components/ui/slider.tsx +56 -0
  636. package/src/components/ui/switch.tsx +29 -0
  637. package/src/components/ui/table.tsx +113 -0
  638. package/src/components/ui/tabs.tsx +63 -0
  639. package/src/components/ui/textarea.tsx +17 -0
  640. package/src/components/ui/tooltip.tsx +60 -0
  641. package/src/config/api.ts +83 -0
  642. package/src/constants/error-codes.ts +255 -0
  643. package/src/constants/stages.ts +27 -0
  644. package/src/context/ErrorContext.tsx +185 -0
  645. package/src/context/theme-provider.tsx +63 -0
  646. package/src/hooks/use-mobile.tsx +19 -0
  647. package/src/hooks/useAI.ts +206 -0
  648. package/src/hooks/useAgentSession.ts +431 -0
  649. package/src/hooks/useAlerts.ts +935 -0
  650. package/src/hooks/useArchivedChanges.ts +39 -0
  651. package/src/hooks/useAsyncError.ts +45 -0
  652. package/src/hooks/useChangeGit.ts +727 -0
  653. package/src/hooks/useChanges.ts +20 -0
  654. package/src/hooks/useClaude.ts +130 -0
  655. package/src/hooks/useDocs.ts +182 -0
  656. package/src/hooks/useErrorDashboard.ts +243 -0
  657. package/src/hooks/useErrorHandler.ts +150 -0
  658. package/src/hooks/useExecutionHistory.ts +55 -0
  659. package/src/hooks/useFlowChanges.ts +850 -0
  660. package/src/hooks/useFlowItems.ts +205 -0
  661. package/src/hooks/useGit.ts +427 -0
  662. package/src/hooks/useHideCompletedSpecs.ts +15 -0
  663. package/src/hooks/useInstance.ts +40 -0
  664. package/src/hooks/useIntegrations.ts +737 -0
  665. package/src/hooks/useLeannStatus.ts +93 -0
  666. package/src/hooks/useNetworkStatus.ts +167 -0
  667. package/src/hooks/useProjects.ts +353 -0
  668. package/src/hooks/useRemoteServers.ts +383 -0
  669. package/src/hooks/useSSEConnection.ts +346 -0
  670. package/src/hooks/useSpecs.ts +39 -0
  671. package/src/hooks/useSwarm.ts +462 -0
  672. package/src/hooks/useTasks.ts +137 -0
  673. package/src/hooks/useURLSync.ts +122 -0
  674. package/src/hooks/useWebSocket.ts +262 -0
  675. package/src/lib/utils.ts +121 -0
  676. package/src/main.tsx +22 -0
  677. package/src/stores/errorStore.ts +301 -0
  678. package/src/stores/offlineStore.ts +266 -0
  679. package/src/stores/sseStore.ts +247 -0
  680. package/src/stores/useHideCompletedStore.ts +21 -0
  681. package/src/styles/index.css +87 -0
  682. package/src/styles/theme.css +102 -0
  683. package/src/types/ai.ts +191 -0
  684. package/src/types/errors.ts +253 -0
  685. package/src/types/flow.ts +382 -0
  686. package/src/types/index.ts +614 -0
  687. package/src/utils/error-logger.ts +399 -0
  688. package/src/utils/error-statistics.ts +305 -0
  689. package/src/utils/logger.ts +280 -0
  690. package/src/utils/task-routing.ts +795 -0
  691. package/src/vite-env.d.ts +1 -0
  692. package/test-results/.last-run.json +4 -0
  693. package/tmp/check-docker-final.ts +48 -0
  694. package/tmp/check-docker-tasks.ts +58 -0
  695. package/tmp/check-docker-tasks2.ts +48 -0
  696. package/tmp/check-docker-tasks3.ts +42 -0
  697. package/tmp/check-mobile-tasks.ts +57 -0
  698. package/tmp/check-zywiki-tasks.ts +49 -0
  699. package/tmp/sync-mobile.ts +11 -0
  700. package/tmp/sync-zywiki.ts +68 -0
  701. package/tmp/test-docker-parser.ts +15 -0
  702. package/tmp/test-mobile-parser.ts +28 -0
  703. package/tmp/test-parser.ts +27 -0
  704. package/tmp/test-unnumbered.ts +35 -0
  705. package/zyflow.db +0 -0
@@ -0,0 +1,850 @@
1
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
2
+ import type {
3
+ FlowChange,
4
+ FlowTask,
5
+ Stage,
6
+ ApiResponse,
7
+ FlowSyncResponse,
8
+ FlowChangeCountsResponse,
9
+ ProjectChangeCounts,
10
+ SelectedItem
11
+ } from '@/types'
12
+ import { API_ENDPOINTS } from '@/config/api'
13
+
14
+ const API_BASE = API_ENDPOINTS.base
15
+
16
+ // =============================================
17
+ // Flow Changes API
18
+ // =============================================
19
+
20
+ interface FlowChangesData {
21
+ changes: FlowChange[]
22
+ }
23
+
24
+ interface FlowChangeDetailData {
25
+ change: FlowChange
26
+ stages: Record<Stage, { total: number; completed: number; tasks: FlowTask[] }>
27
+ }
28
+
29
+ export function useFlowChanges(options?: { enabled?: boolean }) {
30
+ const { enabled = true } = options || {}
31
+
32
+ return useQuery({
33
+ queryKey: ['flow', 'changes'],
34
+ queryFn: async (): Promise<FlowChange[]> => {
35
+ const res = await fetch(`${API_BASE}/flow/changes`)
36
+ const json: ApiResponse<FlowChangesData> = await res.json()
37
+ if (!json.success) throw new Error(json.error)
38
+ return json.data?.changes ?? []
39
+ },
40
+ enabled,
41
+ staleTime: 30000, // 30초간 데이터 신선하게 유지
42
+ gcTime: 300000, // 5분 후 메모리에서 정리
43
+ })
44
+ }
45
+
46
+ export function useFlowChangeDetail(changeId: string | null, projectId?: string) {
47
+ return useQuery({
48
+ queryKey: ['flow', 'changes', changeId, projectId],
49
+ queryFn: async (): Promise<FlowChangeDetailData | null> => {
50
+ if (!changeId) return null
51
+ // projectId가 있으면 쿼리 파라미터로 전달
52
+ const url = projectId
53
+ ? `${API_BASE}/flow/changes/${changeId}?projectId=${encodeURIComponent(projectId)}`
54
+ : `${API_BASE}/flow/changes/${changeId}`
55
+ const res = await fetch(url)
56
+ // 404 응답 처리 - Change가 현재 프로젝트에 없는 경우
57
+ if (res.status === 404) {
58
+ return null
59
+ }
60
+ const json: ApiResponse<FlowChangeDetailData> = await res.json()
61
+ if (!json.success) throw new Error(json.error)
62
+ return json.data ?? null
63
+ },
64
+ enabled: !!changeId,
65
+ retry: false, // 404인 경우 재시도하지 않음
66
+ })
67
+ }
68
+
69
+ export function useSyncFlowChanges() {
70
+ const queryClient = useQueryClient()
71
+
72
+ return useMutation({
73
+ mutationFn: async (): Promise<FlowSyncResponse> => {
74
+ const res = await fetch(`${API_BASE}/flow/sync`, { method: 'POST' })
75
+ const json: ApiResponse<FlowSyncResponse> = await res.json()
76
+ if (!json.success) throw new Error(json.error)
77
+ return json.data!
78
+ },
79
+ onSuccess: () => {
80
+ queryClient.invalidateQueries({ queryKey: ['flow', 'changes'] })
81
+ queryClient.invalidateQueries({ queryKey: ['flow', 'changes', 'counts'] })
82
+ },
83
+ })
84
+ }
85
+
86
+ // 프로젝트별 활성 Change 수
87
+
88
+ export function useFlowChangeCounts(options?: {
89
+ status?: 'active' | 'completed' | 'all'
90
+ enabled?: boolean
91
+ }) {
92
+ const { status = 'active', enabled = true } = options || {}
93
+
94
+ return useQuery({
95
+ queryKey: ['flow', 'changes', 'counts', status],
96
+ queryFn: async (): Promise<Record<string, number>> => {
97
+ const params = new URLSearchParams()
98
+ params.set('status', status) // 항상 status 파라미터 전달
99
+
100
+ const res = await fetch(`${API_BASE}/flow/changes/counts?${params}`)
101
+ const json: ApiResponse<FlowChangeCountsResponse> = await res.json()
102
+ if (!json.success) throw new Error(json.error)
103
+ return json.data?.counts ?? {}
104
+ },
105
+ enabled,
106
+ staleTime: 30000, // 30초간 데이터 신선하게 유지
107
+ gcTime: 300000, // 5분 후 메모리에서 정리
108
+ })
109
+ }
110
+
111
+ // 프로젝트별 상세 Change 집계 (active/completed/total)
112
+ export function useFlowChangeCountsDetailed(options?: {
113
+ enabled?: boolean
114
+ }) {
115
+ const { enabled = true } = options || {}
116
+
117
+ return useQuery({
118
+ queryKey: ['flow', 'changes', 'counts', 'detailed'],
119
+ queryFn: async (): Promise<Record<string, ProjectChangeCounts>> => {
120
+ const res = await fetch(`${API_BASE}/flow/changes/counts`)
121
+ const json: ApiResponse<FlowChangeCountsResponse> = await res.json()
122
+ if (!json.success) throw new Error(json.error)
123
+ return json.data?.detailed ?? {}
124
+ },
125
+ enabled,
126
+ staleTime: 30000, // 30초간 데이터 신선하게 유지
127
+ gcTime: 300000, // 5분 후 메모리에서 정리
128
+ })
129
+ }
130
+
131
+ // =============================================
132
+ // Flow Tasks API
133
+ // =============================================
134
+
135
+ interface FlowTasksData {
136
+ tasks: FlowTask[]
137
+ }
138
+
139
+ interface FlowTaskFilters {
140
+ changeId?: string
141
+ stage?: Stage
142
+ status?: string
143
+ standalone?: boolean
144
+ includeArchived?: boolean
145
+ projectId?: string
146
+ }
147
+
148
+ export function useFlowTasks(filters: FlowTaskFilters = {}, options?: { enabled?: boolean }) {
149
+ const { enabled = true } = options || {}
150
+ const params = new URLSearchParams()
151
+ if (filters.changeId) params.set('changeId', filters.changeId)
152
+ if (filters.stage) params.set('stage', filters.stage)
153
+ if (filters.status) params.set('status', filters.status)
154
+ if (filters.standalone) params.set('standalone', 'true')
155
+ if (filters.includeArchived) params.set('includeArchived', 'true')
156
+ if (filters.projectId) params.set('projectId', filters.projectId)
157
+
158
+ return useQuery({
159
+ queryKey: ['flow', 'tasks', filters],
160
+ queryFn: async (): Promise<FlowTask[]> => {
161
+ const res = await fetch(`${API_BASE}/flow/tasks?${params}`)
162
+ const json: ApiResponse<FlowTasksData> = await res.json()
163
+ if (!json.success) throw new Error(json.error)
164
+ return json.data?.tasks ?? []
165
+ },
166
+ enabled,
167
+ staleTime: 30000, // 30초간 데이터 신선하게 유지
168
+ gcTime: 300000, // 5분 후 메모리에서 정리
169
+ })
170
+ }
171
+
172
+ interface CreateFlowTaskInput {
173
+ changeId?: string
174
+ stage?: Stage
175
+ title: string
176
+ description?: string
177
+ priority?: 'low' | 'medium' | 'high'
178
+ groupTitle?: string
179
+ groupOrder?: number
180
+ taskOrder?: number
181
+ }
182
+
183
+ export function useCreateFlowTask() {
184
+ const queryClient = useQueryClient()
185
+
186
+ return useMutation({
187
+ mutationFn: async (input: CreateFlowTaskInput): Promise<FlowTask> => {
188
+ const res = await fetch(`${API_BASE}/flow/tasks`, {
189
+ method: 'POST',
190
+ headers: { 'Content-Type': 'application/json' },
191
+ body: JSON.stringify(input),
192
+ })
193
+ const json: ApiResponse<{ task: FlowTask }> = await res.json()
194
+ if (!json.success) throw new Error(json.error)
195
+ return json.data!.task
196
+ },
197
+ onSuccess: () => {
198
+ queryClient.invalidateQueries({ queryKey: ['flow'] })
199
+ },
200
+ })
201
+ }
202
+
203
+ // =============================================
204
+ // Proposal & Spec Content API
205
+ // =============================================
206
+
207
+ interface ProposalData {
208
+ changeId: string
209
+ content: string | null
210
+ }
211
+
212
+ export function useProposalContent(changeId: string | null) {
213
+ return useQuery({
214
+ queryKey: ['flow', 'changes', changeId, 'proposal'],
215
+ queryFn: async (): Promise<string | null> => {
216
+ if (!changeId) return null
217
+ const res = await fetch(`${API_BASE}/flow/changes/${changeId}/proposal`)
218
+ // 404 응답 처리 - Change가 현재 프로젝트에 없는 경우
219
+ if (res.status === 404) {
220
+ return null
221
+ }
222
+ const json: ApiResponse<ProposalData> = await res.json()
223
+ if (!json.success) throw new Error(json.error)
224
+ return json.data?.content ?? null
225
+ },
226
+ enabled: !!changeId,
227
+ retry: false, // 404인 경우 재시도하지 않음
228
+ })
229
+ }
230
+
231
+ interface DesignData {
232
+ changeId: string
233
+ content: string | null
234
+ }
235
+
236
+ export function useDesignContent(changeId: string | null) {
237
+ return useQuery({
238
+ queryKey: ['flow', 'changes', changeId, 'design'],
239
+ queryFn: async (): Promise<string | null> => {
240
+ if (!changeId) return null
241
+ const res = await fetch(`${API_BASE}/flow/changes/${changeId}/design`)
242
+ // 404 응답 처리 - Change가 현재 프로젝트에 없는 경우
243
+ if (res.status === 404) {
244
+ return null
245
+ }
246
+ const json: ApiResponse<DesignData> = await res.json()
247
+ if (!json.success) throw new Error(json.error)
248
+ return json.data?.content ?? null
249
+ },
250
+ enabled: !!changeId,
251
+ retry: false, // 404인 경우 재시도하지 않음
252
+ })
253
+ }
254
+
255
+ interface SpecData {
256
+ changeId: string
257
+ content: string | null
258
+ specId: string | null
259
+ }
260
+
261
+ // Change의 첫 번째 spec.md 내용 가져오기 (Spec 탭용)
262
+ export function useChangeSpec(changeId: string | null) {
263
+ return useQuery({
264
+ queryKey: ['flow', 'changes', changeId, 'spec'],
265
+ queryFn: async (): Promise<string | null> => {
266
+ if (!changeId) return null
267
+ const res = await fetch(`${API_BASE}/flow/changes/${changeId}/spec`)
268
+ // 404 응답 처리 - Change가 현재 프로젝트에 없는 경우
269
+ if (res.status === 404) {
270
+ return null
271
+ }
272
+ const json: ApiResponse<SpecData> = await res.json()
273
+ if (!json.success) throw new Error(json.error)
274
+ return json.data?.content ?? null
275
+ },
276
+ enabled: !!changeId,
277
+ retry: false, // 404인 경우 재시도하지 않음
278
+ })
279
+ }
280
+
281
+ interface SpecDetailData {
282
+ specId: string
283
+ content: string | null
284
+ location: 'change' | 'archived' | null
285
+ }
286
+
287
+ // 특정 specId의 spec.md 내용 가져오기
288
+ export function useChangeSpecContent(changeId: string | null, specId: string | null) {
289
+ return useQuery({
290
+ queryKey: ['flow', 'changes', changeId, 'specs', specId],
291
+ queryFn: async (): Promise<SpecDetailData | null> => {
292
+ if (!changeId || !specId) return null
293
+ const res = await fetch(`${API_BASE}/flow/changes/${changeId}/specs/${specId}`)
294
+ // 404 응답 처리 - Change가 현재 프로젝트에 없는 경우
295
+ if (res.status === 404) {
296
+ return null
297
+ }
298
+ const json: ApiResponse<SpecDetailData> = await res.json()
299
+ if (!json.success) throw new Error(json.error)
300
+ return json.data ?? null
301
+ },
302
+ enabled: !!changeId && !!specId,
303
+ retry: false, // 404인 경우 재시도하지 않음
304
+ })
305
+ }
306
+
307
+ // =============================================
308
+ // 선택 상태 관리 훅
309
+ // =============================================
310
+
311
+ export function useSelectedItem() {
312
+ const queryClient = useQueryClient()
313
+
314
+ // 선택 상태 변경 시 관련 쿼리들 미리 가져오기
315
+ const selectItem = (item: SelectedItem | null) => {
316
+ if (!item) return
317
+
318
+ // 프로젝트 활성화
319
+ queryClient.invalidateQueries({
320
+ queryKey: ['projects'],
321
+ refetchType: 'active'
322
+ })
323
+
324
+ // 관련 데이터 refetch (캐시 무효화 후 다시 가져오기)
325
+ switch (item.type) {
326
+ case 'project':
327
+ queryClient.invalidateQueries({
328
+ queryKey: ['flow', 'changes'],
329
+ refetchType: 'active'
330
+ })
331
+ queryClient.invalidateQueries({
332
+ queryKey: ['flow', 'tasks', { standalone: true }],
333
+ refetchType: 'active'
334
+ })
335
+ break
336
+
337
+ case 'change':
338
+ queryClient.invalidateQueries({
339
+ queryKey: ['flow', 'changes', item.changeId],
340
+ refetchType: 'active'
341
+ })
342
+ queryClient.invalidateQueries({
343
+ queryKey: ['flow', 'tasks', { changeId: item.changeId }],
344
+ refetchType: 'active'
345
+ })
346
+ break
347
+
348
+ case 'spec':
349
+ queryClient.invalidateQueries({
350
+ queryKey: ['flow', 'changes', item.specId],
351
+ refetchType: 'active'
352
+ })
353
+ break
354
+
355
+ case 'standalone-tasks':
356
+ queryClient.invalidateQueries({
357
+ queryKey: ['flow', 'tasks', { standalone: true }],
358
+ refetchType: 'active'
359
+ })
360
+ break
361
+
362
+ case 'backlog':
363
+ queryClient.invalidateQueries({
364
+ queryKey: ['backlog'],
365
+ refetchType: 'active'
366
+ })
367
+ break
368
+
369
+ case 'project-settings':
370
+ // Project Settings 페이지는 별도 데이터 refetch 불필요
371
+ break
372
+
373
+ case 'agent':
374
+ // Agent 페이지는 관련 Change 데이터 refetch
375
+ if (item.changeId) {
376
+ queryClient.invalidateQueries({
377
+ queryKey: ['flow', 'changes', item.changeId],
378
+ refetchType: 'active'
379
+ })
380
+ }
381
+ break
382
+
383
+ case 'settings':
384
+ // Settings 페이지는 별도 데이터 refetch 불필요
385
+ break
386
+ }
387
+ }
388
+
389
+ return {
390
+ selectItem
391
+ }
392
+ }
393
+
394
+ // 선택된 항목에 따른 관련 데이터 훅
395
+ export function useSelectedData(selectedItem: SelectedItem | null) {
396
+ const projectId = selectedItem && 'projectId' in selectedItem ? selectedItem.projectId : undefined
397
+ const { data: changes } = useFlowChanges()
398
+ const { data: tasks } = useFlowTasks({
399
+ changeId: selectedItem?.type === 'change' ? selectedItem.changeId : undefined,
400
+ standalone: selectedItem?.type === 'standalone-tasks' ? true : undefined,
401
+ projectId
402
+ })
403
+ // Support both 'change' and 'spec' types
404
+ const detailId = selectedItem?.type === 'change'
405
+ ? (selectedItem.changeId ?? null)
406
+ : selectedItem?.type === 'spec'
407
+ ? (selectedItem.specId ?? null)
408
+ : null
409
+ const { data: changeDetail } = useFlowChangeDetail(detailId)
410
+
411
+ return {
412
+ changes,
413
+ tasks,
414
+ changeDetail
415
+ }
416
+ }
417
+
418
+ // =============================================
419
+ // Flow Tasks Update API
420
+ // =============================================
421
+
422
+ interface UpdateFlowTaskInput {
423
+ id: number
424
+ changeId?: string | null
425
+ stage?: Stage
426
+ title?: string
427
+ description?: string
428
+ status?: string
429
+ priority?: 'low' | 'medium' | 'high'
430
+ order?: number
431
+ groupTitle?: string
432
+ groupOrder?: number
433
+ taskOrder?: number
434
+ }
435
+
436
+ export function useUpdateFlowTask() {
437
+ const queryClient = useQueryClient()
438
+
439
+ return useMutation({
440
+ mutationFn: async ({ id, ...data }: UpdateFlowTaskInput): Promise<FlowTask> => {
441
+ const res = await fetch(`${API_BASE}/flow/tasks/${id}`, {
442
+ method: 'PATCH',
443
+ headers: { 'Content-Type': 'application/json' },
444
+ body: JSON.stringify(data),
445
+ })
446
+ const json: ApiResponse<{ task: FlowTask }> = await res.json()
447
+ if (!json.success) throw new Error(json.error)
448
+ return json.data!.task
449
+ },
450
+ onSuccess: () => {
451
+ queryClient.invalidateQueries({ queryKey: ['flow'] })
452
+ },
453
+ })
454
+ }
455
+
456
+ // =============================================
457
+ // Archive Change API
458
+ // =============================================
459
+
460
+ interface ArchiveChangeInput {
461
+ changeId: string
462
+ skipSpecs?: boolean
463
+ force?: boolean
464
+ autoFix?: boolean
465
+ projectId?: string
466
+ }
467
+
468
+ interface ArchiveChangeResult {
469
+ changeId: string
470
+ archived: boolean
471
+ filesMoved?: boolean
472
+ stdout: string
473
+ stderr: string
474
+ }
475
+
476
+ interface ArchiveValidationError {
477
+ success: false
478
+ error: string
479
+ validationErrors: string[]
480
+ canForce: boolean
481
+ hint: string
482
+ }
483
+
484
+ export function useArchiveChange() {
485
+ const queryClient = useQueryClient()
486
+
487
+ return useMutation({
488
+ mutationFn: async ({ changeId, skipSpecs, force, autoFix, projectId }: ArchiveChangeInput): Promise<ArchiveChangeResult> => {
489
+ // First attempt
490
+ let res = await fetch(`${API_BASE}/flow/changes/${changeId}/archive`, {
491
+ method: 'POST',
492
+ headers: { 'Content-Type': 'application/json' },
493
+ body: JSON.stringify({ skipSpecs, force, projectId }),
494
+ })
495
+
496
+ // Check for validation error (422)
497
+ if (res.status === 422 && autoFix) {
498
+ const errorJson = await res.json() as ArchiveValidationError
499
+
500
+ // Try to auto-fix validation errors
501
+ const fixRes = await fetch(`${API_BASE}/flow/changes/${changeId}/fix-validation`, {
502
+ method: 'POST',
503
+ headers: { 'Content-Type': 'application/json' },
504
+ body: JSON.stringify({ errors: errorJson.validationErrors, projectId }),
505
+ })
506
+
507
+ if (fixRes.ok) {
508
+ // Retry archive after fix
509
+ res = await fetch(`${API_BASE}/flow/changes/${changeId}/archive`, {
510
+ method: 'POST',
511
+ headers: { 'Content-Type': 'application/json' },
512
+ body: JSON.stringify({ skipSpecs, projectId }),
513
+ })
514
+ }
515
+ }
516
+
517
+ const json = await res.json()
518
+ if (!json.success) {
519
+ // If still failing and canForce, include that info in error
520
+ if (json.canForce) {
521
+ const error = new Error(json.error) as Error & { validationErrors?: string[]; canForce?: boolean }
522
+ error.validationErrors = json.validationErrors
523
+ error.canForce = json.canForce
524
+ throw error
525
+ }
526
+ throw new Error(json.error)
527
+ }
528
+ return json.data!
529
+ },
530
+ onSuccess: () => {
531
+ queryClient.invalidateQueries({ queryKey: ['flow', 'changes'] })
532
+ queryClient.invalidateQueries({ queryKey: ['flow', 'changes', 'counts'] })
533
+ queryClient.invalidateQueries({ queryKey: ['projects'] })
534
+ queryClient.invalidateQueries({ queryKey: ['projects-all-data'] })
535
+ },
536
+ })
537
+ }
538
+
539
+ // =============================================
540
+ // Backlog API
541
+ // =============================================
542
+
543
+ interface BacklogTaskFilters {
544
+ projectId?: string
545
+ includeArchived?: boolean
546
+ }
547
+
548
+ // Backlog 태스크 조회 (origin=backlog 필터 사용)
549
+ export function useBacklogTasks(filters: BacklogTaskFilters = {}, options?: { enabled?: boolean }) {
550
+ const { enabled = true } = options || {}
551
+ const params = new URLSearchParams()
552
+ params.set('origin', 'backlog')
553
+ if (filters.projectId) params.set('projectId', filters.projectId)
554
+ if (filters.includeArchived) params.set('includeArchived', 'true')
555
+
556
+ return useQuery({
557
+ queryKey: ['backlog', 'tasks', filters],
558
+ queryFn: async (): Promise<FlowTask[]> => {
559
+ const res = await fetch(`${API_BASE}/flow/tasks?${params}`)
560
+ const json: ApiResponse<{ tasks: FlowTask[] }> = await res.json()
561
+ if (!json.success) throw new Error(json.error)
562
+ return json.data?.tasks ?? []
563
+ },
564
+ enabled,
565
+ staleTime: 30000,
566
+ gcTime: 300000,
567
+ })
568
+ }
569
+
570
+ // Backlog 통계
571
+ interface BacklogStats {
572
+ total: number
573
+ byStatus: Record<string, number>
574
+ byPriority: Record<string, number>
575
+ byMilestone: Record<string, number>
576
+ }
577
+
578
+ export function useBacklogStats(options?: { enabled?: boolean }) {
579
+ const { enabled = true } = options || {}
580
+
581
+ return useQuery({
582
+ queryKey: ['backlog', 'stats'],
583
+ queryFn: async (): Promise<BacklogStats> => {
584
+ const res = await fetch(`${API_BASE}/flow/backlog/stats`)
585
+ const json: ApiResponse<BacklogStats> = await res.json()
586
+ if (!json.success) throw new Error(json.error)
587
+ return json.data!
588
+ },
589
+ enabled,
590
+ staleTime: 30000,
591
+ gcTime: 300000,
592
+ })
593
+ }
594
+
595
+ // Backlog 동기화
596
+ interface BacklogSyncResult {
597
+ synced: number
598
+ created: number
599
+ updated: number
600
+ deleted: number
601
+ }
602
+
603
+ export function useSyncBacklog() {
604
+ const queryClient = useQueryClient()
605
+
606
+ return useMutation({
607
+ mutationFn: async (): Promise<BacklogSyncResult> => {
608
+ const res = await fetch(`${API_BASE}/flow/backlog/sync`, { method: 'POST' })
609
+ const json: ApiResponse<BacklogSyncResult> = await res.json()
610
+ if (!json.success) throw new Error(json.error)
611
+ return json.data!
612
+ },
613
+ onSuccess: () => {
614
+ queryClient.invalidateQueries({ queryKey: ['backlog'] })
615
+ queryClient.invalidateQueries({ queryKey: ['flow', 'tasks'] })
616
+ },
617
+ })
618
+ }
619
+
620
+ // Backlog 태스크 생성
621
+ interface CreateBacklogTaskInput {
622
+ title: string
623
+ description?: string
624
+ status?: string
625
+ priority?: 'low' | 'medium' | 'high'
626
+ assignees?: string[]
627
+ labels?: string[]
628
+ blockedBy?: string[]
629
+ parent?: string
630
+ dueDate?: string
631
+ milestone?: string
632
+ plan?: string
633
+ acceptanceCriteria?: string
634
+ notes?: string
635
+ }
636
+
637
+ interface CreateBacklogTaskResult {
638
+ backlogFileId: string
639
+ filePath: string
640
+ synced: BacklogSyncResult
641
+ }
642
+
643
+ export function useCreateBacklogTask() {
644
+ const queryClient = useQueryClient()
645
+
646
+ return useMutation({
647
+ mutationFn: async (input: CreateBacklogTaskInput): Promise<CreateBacklogTaskResult> => {
648
+ const res = await fetch(`${API_BASE}/flow/backlog/tasks`, {
649
+ method: 'POST',
650
+ headers: { 'Content-Type': 'application/json' },
651
+ body: JSON.stringify(input),
652
+ })
653
+ const json: ApiResponse<CreateBacklogTaskResult> = await res.json()
654
+ if (!json.success) throw new Error(json.error)
655
+ return json.data!
656
+ },
657
+ onSuccess: () => {
658
+ queryClient.invalidateQueries({ queryKey: ['backlog'] })
659
+ queryClient.invalidateQueries({ queryKey: ['flow', 'tasks'] })
660
+ },
661
+ })
662
+ }
663
+
664
+ // Backlog 태스크 수정
665
+ interface UpdateBacklogTaskInput {
666
+ backlogFileId: string
667
+ title?: string
668
+ description?: string
669
+ status?: string
670
+ priority?: 'low' | 'medium' | 'high'
671
+ assignees?: string[]
672
+ labels?: string[]
673
+ blockedBy?: string[]
674
+ parent?: string
675
+ dueDate?: string
676
+ milestone?: string
677
+ plan?: string
678
+ acceptanceCriteria?: string
679
+ notes?: string
680
+ }
681
+
682
+ export function useUpdateBacklogTask() {
683
+ const queryClient = useQueryClient()
684
+
685
+ return useMutation({
686
+ mutationFn: async ({ backlogFileId, ...data }: UpdateBacklogTaskInput): Promise<CreateBacklogTaskResult> => {
687
+ const res = await fetch(`${API_BASE}/flow/backlog/tasks/${backlogFileId}`, {
688
+ method: 'PATCH',
689
+ headers: { 'Content-Type': 'application/json' },
690
+ body: JSON.stringify(data),
691
+ })
692
+ const json: ApiResponse<CreateBacklogTaskResult> = await res.json()
693
+ if (!json.success) throw new Error(json.error)
694
+ return json.data!
695
+ },
696
+ onSuccess: () => {
697
+ queryClient.invalidateQueries({ queryKey: ['backlog'] })
698
+ queryClient.invalidateQueries({ queryKey: ['flow', 'tasks'] })
699
+ },
700
+ })
701
+ }
702
+
703
+ // Backlog 태스크 삭제
704
+ interface DeleteBacklogTaskInput {
705
+ backlogFileId: string
706
+ archive?: boolean
707
+ }
708
+
709
+ export function useDeleteBacklogTask() {
710
+ const queryClient = useQueryClient()
711
+
712
+ return useMutation({
713
+ mutationFn: async ({ backlogFileId, archive = false }: DeleteBacklogTaskInput): Promise<void> => {
714
+ const params = archive ? '?archive=true' : ''
715
+ const res = await fetch(`${API_BASE}/flow/backlog/tasks/${backlogFileId}${params}`, {
716
+ method: 'DELETE',
717
+ })
718
+ const json: ApiResponse<unknown> = await res.json()
719
+ if (!json.success) throw new Error(json.error)
720
+ },
721
+ onSuccess: () => {
722
+ queryClient.invalidateQueries({ queryKey: ['backlog'] })
723
+ queryClient.invalidateQueries({ queryKey: ['flow', 'tasks'] })
724
+ },
725
+ })
726
+ }
727
+
728
+ // Backlog 태스크 상세
729
+ interface BacklogTaskDetail extends FlowTask {
730
+ subtasks?: Array<{
731
+ id: number
732
+ title: string
733
+ status: string
734
+ priority: string
735
+ }>
736
+ }
737
+
738
+ export function useBacklogTaskDetail(backlogFileId: string | null, options?: { enabled?: boolean }) {
739
+ const { enabled = true } = options || {}
740
+
741
+ return useQuery({
742
+ queryKey: ['backlog', 'tasks', backlogFileId],
743
+ queryFn: async (): Promise<BacklogTaskDetail | null> => {
744
+ if (!backlogFileId) return null
745
+ const res = await fetch(`${API_BASE}/flow/backlog/tasks/${backlogFileId}`)
746
+ if (res.status === 404) return null
747
+ const json: ApiResponse<{ task: BacklogTaskDetail }> = await res.json()
748
+ if (!json.success) throw new Error(json.error)
749
+ return json.data?.task ?? null
750
+ },
751
+ enabled: enabled && !!backlogFileId,
752
+ staleTime: 30000,
753
+ gcTime: 300000,
754
+ })
755
+ }
756
+
757
+ // =============================================
758
+ // Migration API Hooks
759
+ // =============================================
760
+
761
+ // 마이그레이션 미리보기 결과
762
+ interface MigrationPreview {
763
+ count: number
764
+ tasks: Array<{
765
+ id: number
766
+ title: string
767
+ description: string | null
768
+ status: string
769
+ priority: string
770
+ tags: string | null
771
+ assignee: string | null
772
+ createdAt: string
773
+ updatedAt: string
774
+ }>
775
+ }
776
+
777
+ // 마이그레이션 대상 Inbox 태스크 미리보기
778
+ export function useMigrationPreview(options?: { enabled?: boolean }) {
779
+ const { enabled = true } = options || {}
780
+
781
+ return useQuery({
782
+ queryKey: ['backlog', 'migration', 'preview'],
783
+ queryFn: async (): Promise<MigrationPreview> => {
784
+ const res = await fetch(`${API_BASE}/flow/backlog/migration/preview`)
785
+ const json: ApiResponse<MigrationPreview> = await res.json()
786
+ if (!json.success) throw new Error(json.error)
787
+ return json.data!
788
+ },
789
+ enabled,
790
+ staleTime: 30000,
791
+ gcTime: 300000,
792
+ })
793
+ }
794
+
795
+ // 마이그레이션 결과
796
+ interface MigrationResult {
797
+ success: boolean
798
+ migratedCount: number
799
+ skippedCount: number
800
+ errors: string[]
801
+ tasks: Array<{
802
+ id: number
803
+ title: string
804
+ backlogFileId: string
805
+ status: 'migrated' | 'skipped' | 'error'
806
+ reason?: string
807
+ }>
808
+ }
809
+
810
+ // Inbox 전체를 Backlog로 마이그레이션
811
+ export function useMigrateAllToBacklog() {
812
+ const queryClient = useQueryClient()
813
+
814
+ return useMutation({
815
+ mutationFn: async (): Promise<MigrationResult> => {
816
+ const res = await fetch(`${API_BASE}/flow/backlog/migration`, {
817
+ method: 'POST',
818
+ })
819
+ const json: ApiResponse<MigrationResult> = await res.json()
820
+ if (!json.success) throw new Error(json.error)
821
+ return json.data!
822
+ },
823
+ onSuccess: () => {
824
+ queryClient.invalidateQueries({ queryKey: ['backlog'] })
825
+ queryClient.invalidateQueries({ queryKey: ['flow', 'tasks'] })
826
+ },
827
+ })
828
+ }
829
+
830
+ // 선택된 Inbox 태스크들만 Backlog로 마이그레이션
831
+ export function useMigrateSelectedToBacklog() {
832
+ const queryClient = useQueryClient()
833
+
834
+ return useMutation({
835
+ mutationFn: async (taskIds: number[]): Promise<MigrationResult> => {
836
+ const res = await fetch(`${API_BASE}/flow/backlog/migration/selected`, {
837
+ method: 'POST',
838
+ headers: { 'Content-Type': 'application/json' },
839
+ body: JSON.stringify({ taskIds }),
840
+ })
841
+ const json: ApiResponse<MigrationResult> = await res.json()
842
+ if (!json.success) throw new Error(json.error)
843
+ return json.data!
844
+ },
845
+ onSuccess: () => {
846
+ queryClient.invalidateQueries({ queryKey: ['backlog'] })
847
+ queryClient.invalidateQueries({ queryKey: ['flow', 'tasks'] })
848
+ },
849
+ })
850
+ }