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,753 @@
1
+ /**
2
+ * Unified SPEC Scanner (SPEC-VISIBILITY-001)
3
+ *
4
+ * Scans both MoAI (.moai/specs/) and OpenSpec (openspec/specs/) directories
5
+ * to provide a unified view of all SPEC documents in a project.
6
+ *
7
+ * Features:
8
+ * - Dual-format support (MoAI and OpenSpec)
9
+ * - Graceful handling of missing directories
10
+ * - Deduplication with MoAI priority
11
+ * - Caching with 60-second TTL
12
+ * - Migration candidate detection
13
+ */
14
+ import { readdir, readFile, stat } from 'fs/promises'
15
+ import { existsSync } from 'fs'
16
+ import { join } from 'path'
17
+ import matter from 'gray-matter'
18
+
19
+ import {
20
+ type UnifiedSpec,
21
+ type SpecFormat,
22
+ type ScanResult,
23
+ type CacheEntry,
24
+ type MigrationStatus,
25
+ SpecStatusSchema,
26
+ SpecPrioritySchema,
27
+ } from './types/spec.js'
28
+
29
+ // =============================================
30
+ // Status Normalization
31
+ // =============================================
32
+
33
+ /**
34
+ * Valid status values for SPEC documents
35
+ */
36
+ const VALID_STATUSES = [
37
+ 'planned',
38
+ 'active',
39
+ 'completed',
40
+ 'blocked',
41
+ 'archived',
42
+ 'draft',
43
+ ] as const
44
+
45
+ type SpecStatus = (typeof VALID_STATUSES)[number]
46
+
47
+ /**
48
+ * Normalize status from frontmatter to valid database status
49
+ * Handles case variations, aliases, and invalid values
50
+ *
51
+ * @param rawStatus - Raw status value from frontmatter
52
+ * @returns Normalized status value, defaults to 'planned'
53
+ */
54
+ export function normalizeStatus(rawStatus: unknown): SpecStatus {
55
+ if (typeof rawStatus !== 'string') {
56
+ return 'planned'
57
+ }
58
+
59
+ const normalized = rawStatus.toLowerCase().trim()
60
+
61
+ switch (normalized) {
62
+ case 'planned':
63
+ return 'planned'
64
+ case 'active':
65
+ return 'active'
66
+ case 'completed':
67
+ case 'complete':
68
+ return 'completed'
69
+ case 'blocked':
70
+ return 'blocked'
71
+ case 'archived':
72
+ return 'archived'
73
+ case 'draft':
74
+ return 'draft'
75
+ default:
76
+ return 'planned'
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Normalize priority from frontmatter
82
+ *
83
+ * @param rawPriority - Raw priority value from frontmatter
84
+ * @returns Normalized priority value, defaults to 'medium'
85
+ */
86
+ function normalizePriority(
87
+ rawPriority: unknown
88
+ ): 'high' | 'medium' | 'low' {
89
+ if (typeof rawPriority !== 'string') {
90
+ return 'medium'
91
+ }
92
+
93
+ const normalized = rawPriority.toLowerCase().trim()
94
+
95
+ switch (normalized) {
96
+ case 'high':
97
+ case 'critical':
98
+ case 'urgent':
99
+ return 'high'
100
+ case 'medium':
101
+ case 'normal':
102
+ return 'medium'
103
+ case 'low':
104
+ case 'minor':
105
+ return 'low'
106
+ default:
107
+ return 'medium'
108
+ }
109
+ }
110
+
111
+ // =============================================
112
+ // Caching Layer (TAG-010)
113
+ // =============================================
114
+
115
+ /** Cache TTL in milliseconds (60 seconds) */
116
+ const CACHE_TTL_MS = 60 * 1000
117
+
118
+ /** In-memory cache for scan results */
119
+ const scanCache = new Map<string, CacheEntry>()
120
+
121
+ /**
122
+ * Get cached result if valid
123
+ *
124
+ * @param cacheKey - Cache key (project path)
125
+ * @returns Cached ScanResult or null if expired/missing
126
+ */
127
+ function getCachedResult(cacheKey: string): ScanResult | null {
128
+ const entry = scanCache.get(cacheKey)
129
+ if (!entry) {
130
+ return null
131
+ }
132
+
133
+ if (Date.now() > entry.expiresAt) {
134
+ scanCache.delete(cacheKey)
135
+ return null
136
+ }
137
+
138
+ return entry.result
139
+ }
140
+
141
+ /**
142
+ * Store result in cache
143
+ *
144
+ * @param cacheKey - Cache key (project path)
145
+ * @param result - Scan result to cache
146
+ */
147
+ function setCachedResult(cacheKey: string, result: ScanResult): void {
148
+ scanCache.set(cacheKey, {
149
+ result,
150
+ expiresAt: Date.now() + CACHE_TTL_MS,
151
+ })
152
+ }
153
+
154
+ /**
155
+ * Clear cache for a specific project or all projects
156
+ *
157
+ * @param cacheKey - Optional specific cache key to clear
158
+ */
159
+ export function clearCache(cacheKey?: string): void {
160
+ if (cacheKey) {
161
+ scanCache.delete(cacheKey)
162
+ } else {
163
+ scanCache.clear()
164
+ }
165
+ }
166
+
167
+ // =============================================
168
+ // MoAI SPEC Scanner
169
+ // =============================================
170
+
171
+ /**
172
+ * Scan .moai/specs/ directory for SPEC documents
173
+ *
174
+ * @param projectPath - Path to the project root
175
+ * @returns Array of UnifiedSpec objects from MoAI format
176
+ */
177
+ export async function scanMoaiSpecs(
178
+ projectPath: string
179
+ ): Promise<{ specs: UnifiedSpec[]; errors: string[] }> {
180
+ const specs: UnifiedSpec[] = []
181
+ const errors: string[] = []
182
+ const specsDir = join(projectPath, '.moai', 'specs')
183
+
184
+ if (!existsSync(specsDir)) {
185
+ return { specs, errors }
186
+ }
187
+
188
+ try {
189
+ const entries = await readdir(specsDir)
190
+ const specDirs = entries.filter((e) => e.startsWith('SPEC-'))
191
+
192
+ for (const specId of specDirs) {
193
+ const specDir = join(specsDir, specId)
194
+
195
+ try {
196
+ const specStat = await stat(specDir)
197
+ if (!specStat.isDirectory()) continue
198
+
199
+ const specPath = join(specDir, 'spec.md')
200
+ const relativePath = `.moai/specs/${specId}/spec.md`
201
+
202
+ if (!existsSync(specPath)) {
203
+ continue
204
+ }
205
+
206
+ try {
207
+ const content = await readFile(specPath, 'utf-8')
208
+ const { data: frontmatter } = matter(content)
209
+
210
+ const spec: UnifiedSpec = {
211
+ spec_id: specId,
212
+ title: String(frontmatter.title || specId),
213
+ status: normalizeStatus(frontmatter.status),
214
+ priority: normalizePriority(frontmatter.priority),
215
+ format: 'moai' as SpecFormat,
216
+ sourcePath: relativePath,
217
+ created: frontmatter.created
218
+ ? String(frontmatter.created)
219
+ : undefined,
220
+ updated: frontmatter.updated
221
+ ? String(frontmatter.updated)
222
+ : undefined,
223
+ tags: Array.isArray(frontmatter.tags)
224
+ ? frontmatter.tags.map(String)
225
+ : undefined,
226
+ domain: frontmatter.domain
227
+ ? String(frontmatter.domain)
228
+ : undefined,
229
+ }
230
+
231
+ specs.push(spec)
232
+ } catch (err) {
233
+ errors.push(
234
+ `Failed to parse ${specId}/spec.md: ${
235
+ err instanceof Error ? err.message : String(err)
236
+ }`
237
+ )
238
+ }
239
+ } catch (err) {
240
+ errors.push(
241
+ `Failed to read ${specId}: ${
242
+ err instanceof Error ? err.message : String(err)
243
+ }`
244
+ )
245
+ }
246
+ }
247
+ } catch (err) {
248
+ errors.push(
249
+ `Failed to scan .moai/specs: ${
250
+ err instanceof Error ? err.message : String(err)
251
+ }`
252
+ )
253
+ }
254
+
255
+ return { specs, errors }
256
+ }
257
+
258
+ // =============================================
259
+ // OpenSpec Scanner
260
+ // =============================================
261
+
262
+ /**
263
+ * Scan openspec/specs/ or openspec/changes/ directory for SPEC documents
264
+ * Gracefully handles missing directories
265
+ *
266
+ * @param projectPath - Path to the project root
267
+ * @returns Array of UnifiedSpec objects from OpenSpec format
268
+ */
269
+ export async function scanOpenSpecs(
270
+ projectPath: string
271
+ ): Promise<{ specs: UnifiedSpec[]; errors: string[] }> {
272
+ const specs: UnifiedSpec[] = []
273
+ const errors: string[] = []
274
+
275
+ // Try both openspec/specs and openspec/changes directories
276
+ const specsDir = join(projectPath, 'openspec', 'specs')
277
+ const changesDir = join(projectPath, 'openspec', 'changes')
278
+
279
+ // Scan openspec/specs if exists
280
+ if (existsSync(specsDir)) {
281
+ const result = await scanOpenSpecDirectory(specsDir, projectPath, 'specs')
282
+ specs.push(...result.specs)
283
+ errors.push(...result.errors)
284
+ }
285
+
286
+ // Scan openspec/changes if exists
287
+ if (existsSync(changesDir)) {
288
+ const result = await scanOpenSpecDirectory(
289
+ changesDir,
290
+ projectPath,
291
+ 'changes'
292
+ )
293
+ specs.push(...result.specs)
294
+ errors.push(...result.errors)
295
+ }
296
+
297
+ return { specs, errors }
298
+ }
299
+
300
+ /**
301
+ * Scan a specific OpenSpec directory
302
+ *
303
+ * @param directory - Directory to scan
304
+ * @param projectPath - Project root path
305
+ * @param dirType - Type of directory ('specs' or 'changes')
306
+ * @returns Scan results
307
+ */
308
+ async function scanOpenSpecDirectory(
309
+ directory: string,
310
+ projectPath: string,
311
+ dirType: 'specs' | 'changes'
312
+ ): Promise<{ specs: UnifiedSpec[]; errors: string[] }> {
313
+ const specs: UnifiedSpec[] = []
314
+ const errors: string[] = []
315
+
316
+ try {
317
+ const entries = await readdir(directory, { withFileTypes: true })
318
+
319
+ for (const entry of entries) {
320
+ if (!entry.isDirectory() || entry.name === 'archive') continue
321
+
322
+ const changeId = entry.name
323
+ const changeDir = join(directory, changeId)
324
+
325
+ // Try to find proposal.md or spec.md
326
+ const proposalPath = join(changeDir, 'proposal.md')
327
+ const specPath = join(changeDir, 'spec.md')
328
+
329
+ let filePath = ''
330
+ if (existsSync(proposalPath)) {
331
+ filePath = proposalPath
332
+ } else if (existsSync(specPath)) {
333
+ filePath = specPath
334
+ } else {
335
+ continue
336
+ }
337
+
338
+ const fileName = existsSync(proposalPath) ? 'proposal.md' : 'spec.md'
339
+ const relativePath = `openspec/${dirType}/${changeId}/${fileName}`
340
+
341
+ try {
342
+ const content = await readFile(filePath, 'utf-8')
343
+ const { data: frontmatter, content: bodyContent } = matter(content)
344
+
345
+ // Extract title from frontmatter or first heading
346
+ let title = String(frontmatter.title || changeId)
347
+ if (!frontmatter.title) {
348
+ const titleMatch = bodyContent.match(/^#\s+(?:Change:\s+)?(.+)$/m)
349
+ if (titleMatch) {
350
+ title = titleMatch[1].trim()
351
+ }
352
+ }
353
+
354
+ const spec: UnifiedSpec = {
355
+ spec_id: changeId,
356
+ title,
357
+ status: normalizeStatus(frontmatter.status),
358
+ priority: normalizePriority(frontmatter.priority),
359
+ format: 'openspec' as SpecFormat,
360
+ sourcePath: relativePath,
361
+ created: frontmatter.created
362
+ ? String(frontmatter.created)
363
+ : undefined,
364
+ updated: frontmatter.updated
365
+ ? String(frontmatter.updated)
366
+ : undefined,
367
+ tags: Array.isArray(frontmatter.tags)
368
+ ? frontmatter.tags.map(String)
369
+ : undefined,
370
+ domain: frontmatter.domain ? String(frontmatter.domain) : undefined,
371
+ }
372
+
373
+ specs.push(spec)
374
+ } catch (err) {
375
+ errors.push(
376
+ `Failed to parse ${changeId}: ${
377
+ err instanceof Error ? err.message : String(err)
378
+ }`
379
+ )
380
+ }
381
+ }
382
+ } catch (err) {
383
+ errors.push(
384
+ `Failed to scan openspec/${dirType}: ${
385
+ err instanceof Error ? err.message : String(err)
386
+ }`
387
+ )
388
+ }
389
+
390
+ return { specs, errors }
391
+ }
392
+
393
+ // =============================================
394
+ // Merge and Deduplication
395
+ // =============================================
396
+
397
+ /**
398
+ * Merge spec lists with deduplication
399
+ * MoAI specs take priority over OpenSpec when IDs match
400
+ *
401
+ * @param moaiSpecs - Specs from MoAI format
402
+ * @param openSpecs - Specs from OpenSpec format
403
+ * @returns Merged and deduplicated spec list
404
+ */
405
+ export function mergeSpecLists(
406
+ moaiSpecs: UnifiedSpec[],
407
+ openSpecs: UnifiedSpec[]
408
+ ): UnifiedSpec[] {
409
+ const merged: Map<string, UnifiedSpec> = new Map()
410
+ const moaiIds = new Set(moaiSpecs.map((s) => s.spec_id))
411
+
412
+ // Add all MoAI specs first (priority)
413
+ for (const spec of moaiSpecs) {
414
+ merged.set(spec.spec_id, spec)
415
+ }
416
+
417
+ // Add OpenSpec specs, marking duplicates as migration candidates
418
+ for (const spec of openSpecs) {
419
+ if (merged.has(spec.spec_id)) {
420
+ // This spec exists in both formats - mark as migration candidate
421
+ const moaiSpec = merged.get(spec.spec_id)!
422
+ moaiSpec.migrationCandidate = true
423
+ } else {
424
+ merged.set(spec.spec_id, spec)
425
+ }
426
+ }
427
+
428
+ return Array.from(merged.values())
429
+ }
430
+
431
+ // =============================================
432
+ // Main Scanner Function
433
+ // =============================================
434
+
435
+ /**
436
+ * Scan all SPEC directories and return unified results
437
+ * Uses caching for performance
438
+ *
439
+ * @param projectPath - Path to the project root
440
+ * @param forceRefresh - Skip cache and force fresh scan
441
+ * @returns Unified scan results
442
+ */
443
+ export async function scanAllSpecs(
444
+ projectPath: string,
445
+ forceRefresh: boolean = false
446
+ ): Promise<ScanResult> {
447
+ const cacheKey = projectPath
448
+
449
+ // Check cache unless force refresh
450
+ if (!forceRefresh) {
451
+ const cached = getCachedResult(cacheKey)
452
+ if (cached) {
453
+ return cached
454
+ }
455
+ }
456
+
457
+ const allErrors: string[] = []
458
+
459
+ // Scan both directories in parallel
460
+ const [moaiResult, openResult] = await Promise.all([
461
+ scanMoaiSpecs(projectPath),
462
+ scanOpenSpecs(projectPath),
463
+ ])
464
+
465
+ allErrors.push(...moaiResult.errors, ...openResult.errors)
466
+
467
+ // Merge with deduplication
468
+ const specs = mergeSpecLists(moaiResult.specs, openResult.specs)
469
+
470
+ const result: ScanResult = {
471
+ specs,
472
+ errors: allErrors,
473
+ scannedAt: Date.now(),
474
+ }
475
+
476
+ // Store in cache
477
+ setCachedResult(cacheKey, result)
478
+
479
+ return result
480
+ }
481
+
482
+ // =============================================
483
+ // Remote SSH Support
484
+ // =============================================
485
+
486
+ /**
487
+ * Remote plugin interface for SSH operations
488
+ */
489
+ export interface RemotePlugin {
490
+ listDirectory: (server: unknown, path: string) => Promise<{ entries: Array<{ name: string; type: string }> }>
491
+ readRemoteFile: (server: unknown, path: string) => Promise<string>
492
+ }
493
+
494
+ /**
495
+ * Scan MoAI SPECs from a remote server via SSH
496
+ */
497
+ async function scanRemoteMoaiSpecs(
498
+ projectPath: string,
499
+ server: unknown,
500
+ plugin: RemotePlugin
501
+ ): Promise<{ specs: UnifiedSpec[]; errors: string[] }> {
502
+ const specs: UnifiedSpec[] = []
503
+ const errors: string[] = []
504
+ const specsDir = `${projectPath}/.moai/specs`
505
+
506
+ let listing: { entries: Array<{ name: string; type: string }> }
507
+ try {
508
+ listing = await plugin.listDirectory(server, specsDir)
509
+ } catch {
510
+ return { specs, errors }
511
+ }
512
+
513
+ const specDirs = listing.entries.filter(
514
+ (entry) =>
515
+ (entry.type === 'directory' || entry.type === 'd' || entry.type === 'Directory') &&
516
+ entry.name.match(/^SPEC-[A-Z]+-\d+$/)
517
+ )
518
+
519
+ for (const entry of specDirs) {
520
+ const specId = entry.name
521
+ const specPath = `${specsDir}/${specId}`
522
+ const relativePath = `.moai/specs/${specId}/spec.md`
523
+
524
+ try {
525
+ const content = await plugin.readRemoteFile(server, `${specPath}/spec.md`)
526
+ const { data: frontmatter } = matter(content)
527
+
528
+ const spec: UnifiedSpec = {
529
+ spec_id: specId,
530
+ title: String(frontmatter.title || specId),
531
+ status: normalizeStatus(frontmatter.status),
532
+ priority: normalizePriority(frontmatter.priority),
533
+ format: 'moai' as SpecFormat,
534
+ sourcePath: relativePath,
535
+ created: frontmatter.created ? String(frontmatter.created) : undefined,
536
+ updated: frontmatter.updated ? String(frontmatter.updated) : undefined,
537
+ tags: Array.isArray(frontmatter.tags) ? frontmatter.tags.map(String) : undefined,
538
+ domain: frontmatter.domain ? String(frontmatter.domain) : undefined,
539
+ }
540
+
541
+ specs.push(spec)
542
+ } catch (err) {
543
+ errors.push(`Failed to parse ${specId}/spec.md: ${err instanceof Error ? err.message : String(err)}`)
544
+ }
545
+ }
546
+
547
+ return { specs, errors }
548
+ }
549
+
550
+ /**
551
+ * Scan OpenSpec from a remote server via SSH
552
+ */
553
+ async function scanRemoteOpenSpecs(
554
+ projectPath: string,
555
+ server: unknown,
556
+ plugin: RemotePlugin
557
+ ): Promise<{ specs: UnifiedSpec[]; errors: string[] }> {
558
+ const specs: UnifiedSpec[] = []
559
+ const errors: string[] = []
560
+
561
+ const specsDir = `${projectPath}/openspec/specs`
562
+ const changesDir = `${projectPath}/openspec/changes`
563
+
564
+ // Scan openspec/specs if exists
565
+ try {
566
+ const listing = await plugin.listDirectory(server, specsDir)
567
+ const result = await scanRemoteOpenSpecDirectory(specsDir, projectPath, 'specs', listing, server, plugin)
568
+ specs.push(...result.specs)
569
+ errors.push(...result.errors)
570
+ } catch {
571
+ // Directory doesn't exist
572
+ }
573
+
574
+ // Scan openspec/changes if exists
575
+ try {
576
+ const listing = await plugin.listDirectory(server, changesDir)
577
+ const result = await scanRemoteOpenSpecDirectory(changesDir, projectPath, 'changes', listing, server, plugin)
578
+ specs.push(...result.specs)
579
+ errors.push(...result.errors)
580
+ } catch {
581
+ // Directory doesn't exist
582
+ }
583
+
584
+ return { specs, errors }
585
+ }
586
+
587
+ /**
588
+ * Scan a specific OpenSpec directory on remote server
589
+ */
590
+ async function scanRemoteOpenSpecDirectory(
591
+ directory: string,
592
+ projectPath: string,
593
+ dirType: 'specs' | 'changes',
594
+ listing: { entries: Array<{ name: string; type: string }> },
595
+ server: unknown,
596
+ plugin: RemotePlugin
597
+ ): Promise<{ specs: UnifiedSpec[]; errors: string[] }> {
598
+ const specs: UnifiedSpec[] = []
599
+ const errors: string[] = []
600
+
601
+ for (const entry of listing.entries) {
602
+ if (entry.type !== 'directory' && entry.type !== 'd' && entry.type !== 'Directory') continue
603
+ if (entry.name === 'archive') continue
604
+
605
+ const changeId = entry.name
606
+ const changeDir = `${directory}/${changeId}`
607
+
608
+ // Try to find proposal.md or spec.md
609
+ let filePath = ''
610
+ let fileName = ''
611
+
612
+ try {
613
+ await plugin.readRemoteFile(server, `${changeDir}/proposal.md`)
614
+ filePath = `${changeDir}/proposal.md`
615
+ fileName = 'proposal.md'
616
+ } catch {
617
+ try {
618
+ await plugin.readRemoteFile(server, `${changeDir}/spec.md`)
619
+ filePath = `${changeDir}/spec.md`
620
+ fileName = 'spec.md'
621
+ } catch {
622
+ continue
623
+ }
624
+ }
625
+
626
+ const relativePath = `openspec/${dirType}/${changeId}/${fileName}`
627
+
628
+ try {
629
+ const content = await plugin.readRemoteFile(server, filePath)
630
+ const { data: frontmatter, content: bodyContent } = matter(content)
631
+
632
+ let title = String(frontmatter.title || changeId)
633
+ if (!frontmatter.title) {
634
+ const titleMatch = bodyContent.match(/^#\s+(?:Change:\s+)?(.+)$/m)
635
+ if (titleMatch) {
636
+ title = titleMatch[1].trim()
637
+ }
638
+ }
639
+
640
+ const spec: UnifiedSpec = {
641
+ spec_id: changeId,
642
+ title,
643
+ status: normalizeStatus(frontmatter.status),
644
+ priority: normalizePriority(frontmatter.priority),
645
+ format: 'openspec' as SpecFormat,
646
+ sourcePath: relativePath,
647
+ created: frontmatter.created ? String(frontmatter.created) : undefined,
648
+ updated: frontmatter.updated ? String(frontmatter.updated) : undefined,
649
+ tags: Array.isArray(frontmatter.tags) ? frontmatter.tags.map(String) : undefined,
650
+ domain: frontmatter.domain ? String(frontmatter.domain) : undefined,
651
+ }
652
+
653
+ specs.push(spec)
654
+ } catch (err) {
655
+ errors.push(`Failed to parse ${changeId}: ${err instanceof Error ? err.message : String(err)}`)
656
+ }
657
+ }
658
+
659
+ return { specs, errors }
660
+ }
661
+
662
+ /**
663
+ * Scan all SPEC directories on a remote server via SSH
664
+ *
665
+ * @param projectPath - Path to the project root on remote server
666
+ * @param serverId - Remote server ID
667
+ * @returns Unified scan results
668
+ */
669
+ export async function scanAllSpecsRemote(
670
+ projectPath: string,
671
+ serverId: string
672
+ ): Promise<ScanResult> {
673
+ const allErrors: string[] = []
674
+
675
+ // Load remote plugin
676
+ let plugin: RemotePlugin & { getRemoteServerById: (id: string) => Promise<unknown> }
677
+ try {
678
+ plugin = await import('@zyflow/remote-plugin')
679
+ } catch {
680
+ return {
681
+ specs: [],
682
+ errors: ['Remote plugin not installed'],
683
+ scannedAt: Date.now(),
684
+ }
685
+ }
686
+
687
+ const server = await plugin.getRemoteServerById(serverId)
688
+ if (!server) {
689
+ return {
690
+ specs: [],
691
+ errors: [`Server not found: ${serverId}`],
692
+ scannedAt: Date.now(),
693
+ }
694
+ }
695
+
696
+ // Scan both directories in parallel
697
+ const [moaiResult, openResult] = await Promise.all([
698
+ scanRemoteMoaiSpecs(projectPath, server, plugin),
699
+ scanRemoteOpenSpecs(projectPath, server, plugin),
700
+ ])
701
+
702
+ allErrors.push(...moaiResult.errors, ...openResult.errors)
703
+
704
+ // Merge with deduplication
705
+ const specs = mergeSpecLists(moaiResult.specs, openResult.specs)
706
+
707
+ return {
708
+ specs,
709
+ errors: allErrors,
710
+ scannedAt: Date.now(),
711
+ }
712
+ }
713
+
714
+ // =============================================
715
+ // Migration Status Helper
716
+ // =============================================
717
+
718
+ /**
719
+ * Get migration status statistics
720
+ *
721
+ * @param projectPath - Path to the project root
722
+ * @param forceRefresh - Skip cache and force fresh scan
723
+ * @returns Migration status statistics
724
+ */
725
+ export async function getMigrationStatus(
726
+ projectPath: string,
727
+ forceRefresh: boolean = false
728
+ ): Promise<MigrationStatus> {
729
+ const result = await scanAllSpecs(projectPath, forceRefresh)
730
+
731
+ let moaiCount = 0
732
+ let openspecCount = 0
733
+ let migrationCandidates = 0
734
+
735
+ for (const spec of result.specs) {
736
+ if (spec.format === 'moai') {
737
+ moaiCount++
738
+ } else {
739
+ openspecCount++
740
+ }
741
+
742
+ if (spec.migrationCandidate) {
743
+ migrationCandidates++
744
+ }
745
+ }
746
+
747
+ return {
748
+ moaiCount,
749
+ openspecCount,
750
+ migrationCandidates,
751
+ totalSpecs: result.specs.length,
752
+ }
753
+ }