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,741 @@
1
+ /**
2
+ * Task Sync Module
3
+ *
4
+ * tasks.md 파일에서 DB로 동기화하는 로직
5
+ */
6
+
7
+ import { readFile } from 'fs/promises'
8
+ import { existsSync } from 'fs'
9
+ import { join } from 'path'
10
+ import { parseTasksFile } from './parser.js'
11
+ import { parsePlanFile, parseAcceptanceFile } from '@zyflow/parser'
12
+ import { getSqlite, getNextTaskId } from './tasks/db/client.js'
13
+ import { getActiveProject, getProjectById } from './config.js'
14
+
15
+ // NOTE: TAG-014 - OpenSpec CLI functions removed, use MoAI SPEC system instead
16
+
17
+ export interface SyncResult {
18
+ tasksCreated: number
19
+ tasksUpdated: number
20
+ tasksArchived: number
21
+ }
22
+
23
+ /**
24
+ * 특정 Change의 tasks.md를 DB에 동기화 (현재 활성 프로젝트)
25
+ */
26
+ export async function syncChangeTasksFromFile(changeId: string): Promise<SyncResult> {
27
+ const project = await getActiveProject()
28
+ if (!project) {
29
+ throw new Error('No active project')
30
+ }
31
+ return syncChangeTasksForProject(changeId, project.path, project.id)
32
+ }
33
+
34
+ /**
35
+ * 특정 프로젝트의 Change tasks.md를 DB에 동기화
36
+ */
37
+ export async function syncChangeTasksForProject(
38
+ changeId: string,
39
+ projectPath: string,
40
+ projectId?: string
41
+ ): Promise<SyncResult> {
42
+ const sqlite = getSqlite()
43
+ const now = Date.now()
44
+
45
+ let tasksCreated = 0
46
+ let tasksUpdated = 0
47
+ let tasksArchived = 0
48
+
49
+ const tasksPath = join(projectPath, 'openspec', 'changes', changeId, 'tasks.md')
50
+ const tasksContent = await readFile(tasksPath, 'utf-8')
51
+ const parsed = parseTasksFile(changeId, tasksContent)
52
+
53
+ interface ExtendedGroup {
54
+ title: string
55
+ tasks: Array<{
56
+ title: string
57
+ completed: boolean
58
+ lineNumber: number
59
+ displayId?: string
60
+ }>
61
+ majorOrder?: number
62
+ majorTitle?: string
63
+ subOrder?: number
64
+ groupTitle?: string
65
+ }
66
+
67
+ const parsedDisplayIds = new Set<string>()
68
+
69
+ // Track global group index for proper group_order (1-based)
70
+ // This ensures group_order represents the actual sequential order across all phases
71
+ let globalGroupIndex = 0
72
+
73
+ for (const group of parsed.groups as ExtendedGroup[]) {
74
+ globalGroupIndex++
75
+ const majorOrder = group.majorOrder ?? 1
76
+ const majorTitle = group.majorTitle ?? group.title
77
+ const subOrder = group.subOrder ?? 1
78
+ const groupTitle = group.groupTitle ?? group.title
79
+ // Use globalGroupIndex for correct group ordering across all phases
80
+ // Previously majorOrder was used here, which only represents the Phase number
81
+ const groupOrder = globalGroupIndex
82
+
83
+ for (let taskIdx = 0; taskIdx < group.tasks.length; taskIdx++) {
84
+ const task = group.tasks[taskIdx]
85
+ const taskOrder = taskIdx + 1
86
+ const displayId = task.displayId || null
87
+
88
+ if (displayId) {
89
+ parsedDisplayIds.add(displayId)
90
+ }
91
+
92
+ let existingTask: { id: number } | undefined
93
+
94
+ if (displayId) {
95
+ existingTask = sqlite
96
+ .prepare(`SELECT id FROM tasks WHERE change_id = ? AND display_id = ?`)
97
+ .get(changeId, displayId) as { id: number } | undefined
98
+ }
99
+
100
+ if (!existingTask) {
101
+ existingTask = sqlite
102
+ .prepare(`SELECT id FROM tasks WHERE change_id = ? AND title = ?`)
103
+ .get(changeId, task.title) as { id: number } | undefined
104
+ }
105
+
106
+ if (existingTask) {
107
+ const newStatus = task.completed ? 'done' : 'todo'
108
+ sqlite
109
+ .prepare(`
110
+ UPDATE tasks
111
+ SET title = ?,
112
+ status = ?,
113
+ group_title = ?,
114
+ group_order = ?,
115
+ task_order = ?,
116
+ major_title = ?,
117
+ sub_order = ?,
118
+ display_id = ?,
119
+ project_id = ?,
120
+ updated_at = ?
121
+ WHERE id = ?
122
+ `)
123
+ .run(
124
+ task.title,
125
+ newStatus,
126
+ groupTitle,
127
+ groupOrder,
128
+ taskOrder,
129
+ majorTitle,
130
+ subOrder,
131
+ displayId,
132
+ projectId,
133
+ now,
134
+ existingTask.id
135
+ )
136
+ tasksUpdated++
137
+ } else {
138
+ // TAG-014: Changed from 'task_openspec' to 'task_moai' sequence
139
+ sqlite
140
+ .prepare(`UPDATE sequences SET value = value + 1 WHERE name = 'task_moai'`)
141
+ .run()
142
+ const seqResult = sqlite
143
+ .prepare(`SELECT value FROM sequences WHERE name = 'task_moai'`)
144
+ .get() as { value: number }
145
+ const newId = seqResult.value
146
+
147
+ sqlite
148
+ .prepare(`
149
+ INSERT INTO tasks (
150
+ id, project_id, change_id, stage, title, status, priority, "order",
151
+ group_title, group_order, task_order, major_title, sub_order,
152
+ display_id, origin, created_at, updated_at
153
+ )
154
+ VALUES (?, ?, ?, 'task', ?, ?, 'medium', ?, ?, ?, ?, ?, ?, ?, 'moai', ?, ?)
155
+ `)
156
+ .run(
157
+ newId,
158
+ projectId,
159
+ changeId,
160
+ task.title,
161
+ task.completed ? 'done' : 'todo',
162
+ task.lineNumber,
163
+ groupTitle,
164
+ groupOrder,
165
+ taskOrder,
166
+ majorTitle,
167
+ subOrder,
168
+ displayId,
169
+ now,
170
+ now
171
+ )
172
+ tasksCreated++
173
+ }
174
+ }
175
+ }
176
+
177
+ // 파일에서 제거된 태스크는 archived로 변경
178
+ if (parsedDisplayIds.size > 0) {
179
+ const dbTasks = sqlite
180
+ .prepare(`
181
+ SELECT id, display_id FROM tasks
182
+ WHERE change_id = ? AND display_id IS NOT NULL AND status != 'archived'
183
+ `)
184
+ .all(changeId) as Array<{ id: number; display_id: string }>
185
+
186
+ for (const dbTask of dbTasks) {
187
+ if (!parsedDisplayIds.has(dbTask.display_id)) {
188
+ sqlite
189
+ .prepare(`
190
+ UPDATE tasks SET status = 'archived', archived_at = ?, updated_at = ? WHERE id = ?
191
+ `)
192
+ .run(now, now, dbTask.id)
193
+ tasksArchived++
194
+ }
195
+ }
196
+ }
197
+
198
+ // Calculate and update progress in changes table
199
+ const progressResult = sqlite.prepare(`
200
+ SELECT
201
+ count(*) as total,
202
+ sum(case when status = 'done' then 1 else 0 end) as completed
203
+ FROM tasks
204
+ WHERE change_id = ? AND status != 'archived'
205
+ `).get(changeId) as { total: number; completed: number }
206
+
207
+ const progress = progressResult.total > 0
208
+ ? Math.round((progressResult.completed / progressResult.total) * 100)
209
+ : 0
210
+
211
+ sqlite.prepare('UPDATE changes SET progress = ?, updated_at = ? WHERE id = ?')
212
+ .run(progress, now, changeId)
213
+
214
+ return { tasksCreated, tasksUpdated, tasksArchived }
215
+ }
216
+
217
+ /**
218
+ * 원격 프로젝트의 Change tasks.md를 DB에 동기화 (SSH를 통해 파일 읽기)
219
+ */
220
+ export async function syncRemoteChangeTasksForProject(
221
+ changeId: string,
222
+ projectPath: string,
223
+ server: unknown,
224
+ projectId: string
225
+ ): Promise<{ tasksCreated: number; tasksUpdated: number }> {
226
+ // Remote plugin 동적 로드
227
+ let readRemoteFile: (server: unknown, path: string) => Promise<string>
228
+ try {
229
+ const plugin = await import('@zyflow/remote-plugin')
230
+ readRemoteFile = plugin.readRemoteFile
231
+ } catch {
232
+ throw new Error('Remote plugin not installed')
233
+ }
234
+
235
+ const sqlite = getSqlite()
236
+ const now = Date.now()
237
+
238
+ let tasksCreated = 0
239
+ let tasksUpdated = 0
240
+
241
+ const tasksPath = `${projectPath}/openspec/changes/${changeId}/tasks.md`
242
+ const tasksContent = await readRemoteFile(server, tasksPath)
243
+ const parsed = parseTasksFile(changeId, tasksContent)
244
+
245
+ interface ExtendedGroup {
246
+ title: string
247
+ tasks: Array<{
248
+ title: string
249
+ completed: boolean
250
+ lineNumber: number
251
+ displayId?: string
252
+ }>
253
+ majorOrder?: number
254
+ majorTitle?: string
255
+ subOrder?: number
256
+ groupTitle?: string
257
+ }
258
+
259
+ const parsedDisplayIds = new Set<string>()
260
+
261
+ // Track global group index for proper group_order (1-based)
262
+ // This ensures group_order represents the actual sequential order across all phases
263
+ let globalGroupIndex = 0
264
+
265
+ for (const group of parsed.groups as ExtendedGroup[]) {
266
+ globalGroupIndex++
267
+ const majorOrder = group.majorOrder ?? 1
268
+ const majorTitle = group.majorTitle ?? group.title
269
+ const subOrder = group.subOrder ?? 1
270
+ const groupTitle = group.groupTitle ?? group.title
271
+ // Use globalGroupIndex for correct group ordering across all phases
272
+ // Previously majorOrder was used here, which only represents the Phase number
273
+ const groupOrder = globalGroupIndex
274
+
275
+ for (let taskIdx = 0; taskIdx < group.tasks.length; taskIdx++) {
276
+ const task = group.tasks[taskIdx]
277
+ const taskOrder = taskIdx + 1
278
+ const displayId = task.displayId || null
279
+
280
+ if (displayId) {
281
+ parsedDisplayIds.add(displayId)
282
+ }
283
+
284
+ let existingTask: { id: number } | undefined
285
+
286
+ if (displayId) {
287
+ existingTask = sqlite
288
+ .prepare(`SELECT id FROM tasks WHERE change_id = ? AND display_id = ?`)
289
+ .get(changeId, displayId) as { id: number } | undefined
290
+ }
291
+
292
+ if (!existingTask) {
293
+ existingTask = sqlite
294
+ .prepare(`SELECT id FROM tasks WHERE change_id = ? AND title = ?`)
295
+ .get(changeId, task.title) as { id: number } | undefined
296
+ }
297
+
298
+ if (existingTask) {
299
+ const newStatus = task.completed ? 'done' : 'todo'
300
+ sqlite
301
+ .prepare(`
302
+ UPDATE tasks
303
+ SET title = ?,
304
+ status = ?,
305
+ group_title = ?,
306
+ group_order = ?,
307
+ task_order = ?,
308
+ major_title = ?,
309
+ sub_order = ?,
310
+ display_id = ?,
311
+ project_id = ?,
312
+ updated_at = ?
313
+ WHERE id = ?
314
+ `)
315
+ .run(
316
+ task.title,
317
+ newStatus,
318
+ groupTitle,
319
+ groupOrder,
320
+ taskOrder,
321
+ majorTitle,
322
+ subOrder,
323
+ displayId,
324
+ projectId,
325
+ now,
326
+ existingTask.id
327
+ )
328
+ tasksUpdated++
329
+ } else {
330
+ // TAG-014: Changed from 'task_openspec' to 'task_moai' sequence
331
+ sqlite
332
+ .prepare(`UPDATE sequences SET value = value + 1 WHERE name = 'task_moai'`)
333
+ .run()
334
+ const seqResult = sqlite
335
+ .prepare(`SELECT value FROM sequences WHERE name = 'task_moai'`)
336
+ .get() as { value: number }
337
+ const newId = seqResult.value
338
+
339
+ sqlite
340
+ .prepare(`
341
+ INSERT INTO tasks (
342
+ id, project_id, change_id, stage, title, status, priority, "order",
343
+ group_title, group_order, task_order, major_title, sub_order,
344
+ display_id, origin, created_at, updated_at
345
+ )
346
+ VALUES (?, ?, ?, 'task', ?, ?, 'medium', ?, ?, ?, ?, ?, ?, ?, 'moai', ?, ?)
347
+ `)
348
+ .run(
349
+ newId,
350
+ projectId,
351
+ changeId,
352
+ task.title,
353
+ task.completed ? 'done' : 'todo',
354
+ task.lineNumber,
355
+ groupTitle,
356
+ groupOrder,
357
+ taskOrder,
358
+ majorTitle,
359
+ subOrder,
360
+ displayId,
361
+ now,
362
+ now
363
+ )
364
+ tasksCreated++
365
+ }
366
+ }
367
+ }
368
+
369
+ // Calculate and update progress in changes table
370
+ const progressResult = sqlite.prepare(`
371
+ SELECT
372
+ count(*) as total,
373
+ sum(case when status = 'done' then 1 else 0 end) as completed
374
+ FROM tasks
375
+ WHERE change_id = ? AND status != 'archived'
376
+ `).get(changeId) as { total: number; completed: number }
377
+
378
+ const progress = progressResult.total > 0
379
+ ? Math.round((progressResult.completed / progressResult.total) * 100)
380
+ : 0
381
+
382
+ sqlite.prepare('UPDATE changes SET progress = ?, updated_at = ? WHERE id = ?')
383
+ .run(progress, now, changeId)
384
+
385
+ return { tasksCreated, tasksUpdated }
386
+ }
387
+
388
+ /**
389
+ * OpenSpec 아티팩트 상태를 DB에 캐싱
390
+ * TAG-014: OpenSpec CLI removed - this function now returns false
391
+ * Use MoAI SPEC system for artifact status tracking
392
+ */
393
+ export async function updateArtifactStatusCache(
394
+ changeId: string,
395
+ projectPath: string,
396
+ projectId: string
397
+ ): Promise<boolean> {
398
+ // TAG-014: OpenSpec CLI is no longer available
399
+ // MoAI SPEC system handles artifact tracking instead
400
+ console.debug(`[TAG-014] Artifact status cache not available for ${changeId} (OpenSpec CLI removed)`)
401
+ return false
402
+ }
403
+
404
+ /**
405
+ * 캐싱된 아티팩트 상태 조회
406
+ * 캐시가 없거나 만료된 경우 null 반환
407
+ *
408
+ * @param maxAgeMs - 캐시 최대 유효 시간 (기본값: 5분)
409
+ */
410
+ export function getCachedArtifactStatus(
411
+ changeId: string,
412
+ projectId: string,
413
+ maxAgeMs: number = 5 * 60 * 1000
414
+ ): { artifacts: unknown[]; progress: unknown } | null {
415
+ const sqlite = getSqlite()
416
+
417
+ const row = sqlite.prepare(`
418
+ SELECT artifact_status, artifact_status_updated_at
419
+ FROM changes
420
+ WHERE id = ? AND project_id = ?
421
+ `).get(changeId, projectId) as {
422
+ artifact_status: string | null
423
+ artifact_status_updated_at: number | null
424
+ } | undefined
425
+
426
+ if (!row?.artifact_status || !row.artifact_status_updated_at) {
427
+ return null
428
+ }
429
+
430
+ // 캐시 만료 체크
431
+ const age = Date.now() - row.artifact_status_updated_at
432
+ if (age > maxAgeMs) {
433
+ return null
434
+ }
435
+
436
+ try {
437
+ return JSON.parse(row.artifact_status)
438
+ } catch {
439
+ return null
440
+ }
441
+ }
442
+
443
+ /**
444
+ * 모든 활성 Change의 아티팩트 상태 캐시 갱신
445
+ */
446
+ export async function refreshAllArtifactStatusCache(
447
+ projectPath: string,
448
+ projectId: string
449
+ ): Promise<{ updated: number; failed: number }> {
450
+ const sqlite = getSqlite()
451
+
452
+ const activeChanges = sqlite.prepare(`
453
+ SELECT id FROM changes
454
+ WHERE project_id = ? AND status = 'active'
455
+ `).all(projectId) as Array<{ id: string }>
456
+
457
+ let updated = 0
458
+ let failed = 0
459
+
460
+ for (const change of activeChanges) {
461
+ const success = await updateArtifactStatusCache(change.id, projectPath, projectId)
462
+ if (success) {
463
+ updated++
464
+ } else {
465
+ failed++
466
+ }
467
+ }
468
+
469
+ return { updated, failed }
470
+ }
471
+
472
+ // =============================================
473
+ // MoAI SPEC Sync Functions (TAG-004)
474
+ // =============================================
475
+
476
+ /**
477
+ * Result of syncing MoAI SPEC files (plan.md, acceptance.md)
478
+ */
479
+ export interface MoaiSyncResult {
480
+ created: number
481
+ updated: number
482
+ archived: number
483
+ errors: string[]
484
+ }
485
+
486
+ /**
487
+ * Sync TAG chain from plan.md to DB
488
+ * TAGs are stored as tasks with origin='moai'
489
+ */
490
+ export async function syncSpecTagsFromFile(
491
+ specId: string,
492
+ projectPath: string,
493
+ projectId: string
494
+ ): Promise<MoaiSyncResult> {
495
+ const result: MoaiSyncResult = { created: 0, updated: 0, archived: 0, errors: [] }
496
+
497
+ const planPath = join(projectPath, '.moai', 'specs', specId, 'plan.md')
498
+
499
+ // Check if plan.md exists
500
+ if (!existsSync(planPath)) {
501
+ return result
502
+ }
503
+
504
+ try {
505
+ const content = await readFile(planPath, 'utf-8')
506
+ const parsed = parsePlanFile(content)
507
+ const sqlite = getSqlite()
508
+ const now = Date.now()
509
+
510
+ // Get existing moai tasks for this spec (by tag_id)
511
+ const existingTasks = sqlite
512
+ .prepare(`
513
+ SELECT id, tag_id FROM tasks
514
+ WHERE change_id = ? AND project_id = ? AND origin = 'moai' AND tag_id IS NOT NULL
515
+ `)
516
+ .all(specId, projectId) as Array<{ id: number; tag_id: string }>
517
+
518
+ const existingByTagId = new Map(existingTasks.map((t) => [t.tag_id, t]))
519
+ const processedTagIds = new Set<string>()
520
+
521
+ // Upsert each TAG
522
+ for (let i = 0; i < parsed.tags.length; i++) {
523
+ const tag = parsed.tags[i]
524
+ processedTagIds.add(tag.id)
525
+
526
+ const existing = existingByTagId.get(tag.id)
527
+ const status = tag.completed ? 'done' : 'todo'
528
+ const dependencies = JSON.stringify(tag.dependencies)
529
+
530
+ if (existing) {
531
+ // Update existing task
532
+ sqlite
533
+ .prepare(`
534
+ UPDATE tasks
535
+ SET title = ?,
536
+ description = ?,
537
+ status = ?,
538
+ tag_scope = ?,
539
+ tag_dependencies = ?,
540
+ task_order = ?,
541
+ updated_at = ?
542
+ WHERE id = ?
543
+ `)
544
+ .run(
545
+ tag.title,
546
+ tag.purpose,
547
+ status,
548
+ tag.scope,
549
+ dependencies,
550
+ i + 1,
551
+ now,
552
+ existing.id
553
+ )
554
+ result.updated++
555
+ } else {
556
+ // Create new task
557
+ const newId = getNextTaskId('moai')
558
+ sqlite
559
+ .prepare(`
560
+ INSERT INTO tasks (
561
+ id, project_id, change_id, origin, title, description, status,
562
+ priority, stage, tag_id, tag_scope, tag_dependencies,
563
+ display_id, group_title, group_order, task_order,
564
+ created_at, updated_at
565
+ )
566
+ VALUES (?, ?, ?, 'moai', ?, ?, ?, 'medium', 'task', ?, ?, ?, ?, 'TAG Chain', 1, ?, ?, ?)
567
+ `)
568
+ .run(
569
+ newId,
570
+ projectId,
571
+ specId,
572
+ tag.title,
573
+ tag.purpose,
574
+ status,
575
+ tag.id,
576
+ tag.scope,
577
+ dependencies,
578
+ tag.id,
579
+ i + 1,
580
+ now,
581
+ now
582
+ )
583
+ result.created++
584
+ }
585
+ }
586
+
587
+ // Archive tasks no longer in plan.md
588
+ for (const existing of existingTasks) {
589
+ if (existing.tag_id && !processedTagIds.has(existing.tag_id)) {
590
+ // Check if not already archived
591
+ const currentStatus = sqlite
592
+ .prepare(`SELECT status FROM tasks WHERE id = ?`)
593
+ .get(existing.id) as { status: string } | undefined
594
+
595
+ if (currentStatus && currentStatus.status !== 'archived') {
596
+ sqlite
597
+ .prepare(`UPDATE tasks SET status = 'archived', archived_at = ?, updated_at = ? WHERE id = ?`)
598
+ .run(now, now, existing.id)
599
+ result.archived++
600
+ }
601
+ }
602
+ }
603
+
604
+ // Update progress in changes table
605
+ const completedCount = parsed.tags.filter((t) => t.completed).length
606
+ const progress = parsed.tags.length > 0
607
+ ? Math.round((completedCount / parsed.tags.length) * 100)
608
+ : 0
609
+
610
+ sqlite
611
+ .prepare(`UPDATE changes SET progress = ?, updated_at = ? WHERE id = ? AND project_id = ?`)
612
+ .run(progress, now, specId, projectId)
613
+ } catch (err) {
614
+ result.errors.push(`Failed to sync TAG chain: ${err instanceof Error ? err.message : String(err)}`)
615
+ }
616
+
617
+ return result
618
+ }
619
+
620
+ /**
621
+ * Sync acceptance criteria from acceptance.md to DB
622
+ * Acceptance criteria are stored as tasks with origin='moai'
623
+ */
624
+ export async function syncSpecAcceptanceFromFile(
625
+ specId: string,
626
+ projectPath: string,
627
+ projectId: string
628
+ ): Promise<MoaiSyncResult> {
629
+ const result: MoaiSyncResult = { created: 0, updated: 0, archived: 0, errors: [] }
630
+
631
+ const acceptancePath = join(projectPath, '.moai', 'specs', specId, 'acceptance.md')
632
+
633
+ // Check if acceptance.md exists
634
+ if (!existsSync(acceptancePath)) {
635
+ return result
636
+ }
637
+
638
+ try {
639
+ const content = await readFile(acceptancePath, 'utf-8')
640
+ const parsed = parseAcceptanceFile(content)
641
+ const sqlite = getSqlite()
642
+ const now = Date.now()
643
+
644
+ // Get existing acceptance tasks for this spec
645
+ const existingTasks = sqlite
646
+ .prepare(`
647
+ SELECT id, tag_id FROM tasks
648
+ WHERE change_id = ? AND project_id = ? AND origin = 'moai'
649
+ AND group_title = 'Acceptance Criteria' AND tag_id IS NOT NULL
650
+ `)
651
+ .all(specId, projectId) as Array<{ id: number; tag_id: string }>
652
+
653
+ const existingByTagId = new Map(existingTasks.map((t) => [t.tag_id, t]))
654
+ const processedIds = new Set<string>()
655
+
656
+ // Upsert each acceptance criteria
657
+ for (let i = 0; i < parsed.criteria.length; i++) {
658
+ const ac = parsed.criteria[i]
659
+ processedIds.add(ac.id)
660
+
661
+ const existing = existingByTagId.get(ac.id)
662
+ const status = ac.verified ? 'done' : 'todo'
663
+
664
+ // Format Gherkin text as description
665
+ const descriptionParts: string[] = []
666
+ if (ac.given) descriptionParts.push(`**Given** ${ac.given}`)
667
+ if (ac.when) descriptionParts.push(`**When** ${ac.when}`)
668
+ if (ac.then) descriptionParts.push(`**Then** ${ac.then}`)
669
+ const description = descriptionParts.join('\n')
670
+
671
+ // Format success metrics as acceptance_criteria
672
+ const acceptanceCriteria = ac.successMetrics
673
+ .map((m) => `- [${m.checked ? 'x' : ' '}] ${m.text}`)
674
+ .join('\n')
675
+
676
+ if (existing) {
677
+ // Update existing task
678
+ sqlite
679
+ .prepare(`
680
+ UPDATE tasks
681
+ SET title = ?,
682
+ description = ?,
683
+ status = ?,
684
+ acceptance_criteria = ?,
685
+ task_order = ?,
686
+ updated_at = ?
687
+ WHERE id = ?
688
+ `)
689
+ .run(ac.title, description, status, acceptanceCriteria, i + 1, now, existing.id)
690
+ result.updated++
691
+ } else {
692
+ // Create new task
693
+ const newId = getNextTaskId('moai')
694
+ sqlite
695
+ .prepare(`
696
+ INSERT INTO tasks (
697
+ id, project_id, change_id, origin, title, description, status,
698
+ priority, stage, tag_id, display_id, acceptance_criteria,
699
+ group_title, group_order, task_order, created_at, updated_at
700
+ )
701
+ VALUES (?, ?, ?, 'moai', ?, ?, ?, 'medium', 'task', ?, ?, ?, 'Acceptance Criteria', 2, ?, ?, ?)
702
+ `)
703
+ .run(
704
+ newId,
705
+ projectId,
706
+ specId,
707
+ ac.title,
708
+ description,
709
+ status,
710
+ ac.id,
711
+ ac.id,
712
+ acceptanceCriteria,
713
+ i + 1,
714
+ now,
715
+ now
716
+ )
717
+ result.created++
718
+ }
719
+ }
720
+
721
+ // Archive removed criteria
722
+ for (const existing of existingTasks) {
723
+ if (existing.tag_id && !processedIds.has(existing.tag_id)) {
724
+ const currentStatus = sqlite
725
+ .prepare(`SELECT status FROM tasks WHERE id = ?`)
726
+ .get(existing.id) as { status: string } | undefined
727
+
728
+ if (currentStatus && currentStatus.status !== 'archived') {
729
+ sqlite
730
+ .prepare(`UPDATE tasks SET status = 'archived', archived_at = ?, updated_at = ? WHERE id = ?`)
731
+ .run(now, now, existing.id)
732
+ result.archived++
733
+ }
734
+ }
735
+ }
736
+ } catch (err) {
737
+ result.errors.push(`Failed to sync acceptance criteria: ${err instanceof Error ? err.message : String(err)}`)
738
+ }
739
+
740
+ return result
741
+ }