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.
- package/.claude-flow/metrics/agent-metrics.json +1 -0
- package/.claude-flow/metrics/performance.json +87 -0
- package/.claude-flow/metrics/system-metrics.json +4370 -0
- package/.claude-flow/metrics/task-metrics.json +10 -0
- package/.claude-plugin/marketplace.json +18 -0
- package/.claude-plugin/plugin.json +17 -0
- package/.gitleaks.toml +69 -0
- package/.hive-mind/config/queens.json +59 -0
- package/.hive-mind/config/workers.json +72 -0
- package/.hive-mind/config.json +111 -0
- package/.hive-mind/hive.db +0 -0
- package/.hive-mind/hive.db-shm +0 -0
- package/.hive-mind/hive.db-wal +0 -0
- package/.leann/indexes/zyflow/documents.ids.txt +2078 -0
- package/.leann/indexes/zyflow/documents.index +0 -0
- package/.leann/indexes/zyflow/documents.leann.meta.json +25 -0
- package/.leann/indexes/zyflow/documents.leann.passages.idx +0 -0
- package/.leann/indexes/zyflow/documents.leann.passages.jsonl +2078 -0
- package/.mcp.json +41 -0
- package/.moai-backups/20260126_231508/.mcp.json +11 -0
- package/.moai-backups/20260126_231508/backup_metadata.json +34 -0
- package/.moai-backups/20260129_145438/.mcp.json +41 -0
- package/.moai-backups/20260129_145438/backup_metadata.json +53 -0
- package/.moai-backups/20260129_145504/.mcp.json +41 -0
- package/.moai-backups/20260129_145504/backup_metadata.json +20 -0
- package/.moai-backups/20260201_140004/.mcp.json +41 -0
- package/.moai-backups/20260201_140004/backup_metadata.json +51 -0
- package/.moai-backups/backup/.mcp.json +12 -0
- package/.moai-backups/settings-backup/settings.local.json +61 -0
- package/.pre-commit-config.yaml +74 -0
- package/.prettierignore +3 -0
- package/.prettierrc +7 -0
- package/.scannerwork/.sonar_lock +0 -0
- package/.scannerwork/report-task.txt +6 -0
- package/.serena/project.yml +105 -0
- package/.shadcn-admin-ref/.env.example +1 -0
- package/.shadcn-admin-ref/.prettierignore +18 -0
- package/.shadcn-admin-ref/.prettierrc +50 -0
- package/.shadcn-admin-ref/LICENSE +21 -0
- package/.shadcn-admin-ref/components.json +21 -0
- package/.shadcn-admin-ref/cz.yaml +7 -0
- package/.shadcn-admin-ref/eslint.config.js +59 -0
- package/.shadcn-admin-ref/index.html +80 -0
- package/.shadcn-admin-ref/knip.config.ts +8 -0
- package/.shadcn-admin-ref/netlify.toml +4 -0
- package/.shadcn-admin-ref/package.json +83 -0
- package/.shadcn-admin-ref/public/images/favicon.png +0 -0
- package/.shadcn-admin-ref/public/images/favicon.svg +4 -0
- package/.shadcn-admin-ref/public/images/favicon_light.png +0 -0
- package/.shadcn-admin-ref/public/images/favicon_light.svg +1 -0
- package/.shadcn-admin-ref/public/images/shadcn-admin.png +0 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-discord.tsx +28 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-docker.tsx +33 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-facebook.tsx +25 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-figma.tsx +27 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-github.tsx +25 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-gitlab.tsx +25 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-gmail.tsx +28 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-medium.tsx +30 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-notion.tsx +28 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-skype.tsx +26 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-slack.tsx +28 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-stripe.tsx +25 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-telegram.tsx +25 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-trello.tsx +27 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-whatsapp.tsx +26 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/icon-zoom.tsx +26 -0
- package/.shadcn-admin-ref/src/assets/brand-icons/index.ts +16 -0
- package/.shadcn-admin-ref/src/assets/clerk-full-logo.tsx +41 -0
- package/.shadcn-admin-ref/src/assets/clerk-logo.tsx +23 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-dir.tsx +110 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-layout-compact.tsx +131 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-layout-default.tsx +124 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-layout-full.tsx +100 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-floating.tsx +82 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-inset.tsx +58 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-sidebar-sidebar.tsx +53 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-theme-dark.tsx +79 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-theme-light.tsx +78 -0
- package/.shadcn-admin-ref/src/assets/custom/icon-theme-system.tsx +116 -0
- package/.shadcn-admin-ref/src/assets/logo.tsx +24 -0
- package/.shadcn-admin-ref/src/components/coming-soon.tsx +16 -0
- package/.shadcn-admin-ref/src/components/command-menu.tsx +91 -0
- package/.shadcn-admin-ref/src/components/config-drawer.tsx +354 -0
- package/.shadcn-admin-ref/src/components/confirm-dialog.tsx +67 -0
- package/.shadcn-admin-ref/src/components/data-table/bulk-actions.tsx +213 -0
- package/.shadcn-admin-ref/src/components/data-table/column-header.tsx +74 -0
- package/.shadcn-admin-ref/src/components/data-table/faceted-filter.tsx +146 -0
- package/.shadcn-admin-ref/src/components/data-table/index.ts +6 -0
- package/.shadcn-admin-ref/src/components/data-table/pagination.tsx +130 -0
- package/.shadcn-admin-ref/src/components/data-table/toolbar.tsx +85 -0
- package/.shadcn-admin-ref/src/components/data-table/view-options.tsx +56 -0
- package/.shadcn-admin-ref/src/components/date-picker.tsx +51 -0
- package/.shadcn-admin-ref/src/components/layout/app-sidebar.tsx +37 -0
- package/.shadcn-admin-ref/src/components/layout/app-title.tsx +64 -0
- package/.shadcn-admin-ref/src/components/layout/authenticated-layout.tsx +42 -0
- package/.shadcn-admin-ref/src/components/layout/data/sidebar-data.ts +205 -0
- package/.shadcn-admin-ref/src/components/layout/header.tsx +50 -0
- package/.shadcn-admin-ref/src/components/layout/main.tsx +27 -0
- package/.shadcn-admin-ref/src/components/layout/nav-group.tsx +185 -0
- package/.shadcn-admin-ref/src/components/layout/nav-user.tsx +124 -0
- package/.shadcn-admin-ref/src/components/layout/team-switcher.tsx +86 -0
- package/.shadcn-admin-ref/src/components/layout/top-nav.tsx +67 -0
- package/.shadcn-admin-ref/src/components/layout/types.ts +44 -0
- package/.shadcn-admin-ref/src/components/learn-more.tsx +44 -0
- package/.shadcn-admin-ref/src/components/long-text.tsx +84 -0
- package/.shadcn-admin-ref/src/components/navigation-progress.tsx +25 -0
- package/.shadcn-admin-ref/src/components/password-input.tsx +42 -0
- package/.shadcn-admin-ref/src/components/profile-dropdown.tsx +75 -0
- package/.shadcn-admin-ref/src/components/search.tsx +37 -0
- package/.shadcn-admin-ref/src/components/select-dropdown.tsx +62 -0
- package/.shadcn-admin-ref/src/components/sign-out-dialog.tsx +38 -0
- package/.shadcn-admin-ref/src/components/skip-to-main.tsx +10 -0
- package/.shadcn-admin-ref/src/components/theme-switch.tsx +58 -0
- package/.shadcn-admin-ref/src/components/ui/alert-dialog.tsx +154 -0
- package/.shadcn-admin-ref/src/components/ui/alert.tsx +65 -0
- package/.shadcn-admin-ref/src/components/ui/avatar.tsx +50 -0
- package/.shadcn-admin-ref/src/components/ui/badge.tsx +45 -0
- package/.shadcn-admin-ref/src/components/ui/button.tsx +58 -0
- package/.shadcn-admin-ref/src/components/ui/calendar.tsx +210 -0
- package/.shadcn-admin-ref/src/components/ui/card.tsx +91 -0
- package/.shadcn-admin-ref/src/components/ui/checkbox.tsx +29 -0
- package/.shadcn-admin-ref/src/components/ui/collapsible.tsx +31 -0
- package/.shadcn-admin-ref/src/components/ui/command.tsx +181 -0
- package/.shadcn-admin-ref/src/components/ui/dialog.tsx +142 -0
- package/.shadcn-admin-ref/src/components/ui/dropdown-menu.tsx +254 -0
- package/.shadcn-admin-ref/src/components/ui/form.tsx +164 -0
- package/.shadcn-admin-ref/src/components/ui/input-otp.tsx +74 -0
- package/.shadcn-admin-ref/src/components/ui/input.tsx +20 -0
- package/.shadcn-admin-ref/src/components/ui/label.tsx +23 -0
- package/.shadcn-admin-ref/src/components/ui/popover.tsx +45 -0
- package/.shadcn-admin-ref/src/components/ui/radio-group.tsx +42 -0
- package/.shadcn-admin-ref/src/components/ui/scroll-area.tsx +65 -0
- package/.shadcn-admin-ref/src/components/ui/select.tsx +182 -0
- package/.shadcn-admin-ref/src/components/ui/separator.tsx +25 -0
- package/.shadcn-admin-ref/src/components/ui/sheet.tsx +136 -0
- package/.shadcn-admin-ref/src/components/ui/sidebar.tsx +728 -0
- package/.shadcn-admin-ref/src/components/ui/skeleton.tsx +13 -0
- package/.shadcn-admin-ref/src/components/ui/sonner.tsx +21 -0
- package/.shadcn-admin-ref/src/components/ui/switch.tsx +28 -0
- package/.shadcn-admin-ref/src/components/ui/table.tsx +113 -0
- package/.shadcn-admin-ref/src/components/ui/tabs.tsx +63 -0
- package/.shadcn-admin-ref/src/components/ui/textarea.tsx +17 -0
- package/.shadcn-admin-ref/src/components/ui/tooltip.tsx +60 -0
- package/.shadcn-admin-ref/src/config/fonts.ts +19 -0
- package/.shadcn-admin-ref/src/context/direction-provider.tsx +61 -0
- package/.shadcn-admin-ref/src/context/font-provider.tsx +58 -0
- package/.shadcn-admin-ref/src/context/layout-provider.tsx +85 -0
- package/.shadcn-admin-ref/src/context/search-provider.tsx +46 -0
- package/.shadcn-admin-ref/src/context/theme-provider.tsx +110 -0
- package/.shadcn-admin-ref/src/features/apps/data/apps.tsx +110 -0
- package/.shadcn-admin-ref/src/features/apps/index.tsx +179 -0
- package/.shadcn-admin-ref/src/features/auth/auth-layout.tsx +19 -0
- package/.shadcn-admin-ref/src/features/auth/forgot-password/components/forgot-password-form.tsx +82 -0
- package/.shadcn-admin-ref/src/features/auth/forgot-password/index.tsx +44 -0
- package/.shadcn-admin-ref/src/features/auth/otp/components/otp-form.tsx +100 -0
- package/.shadcn-admin-ref/src/features/auth/otp/index.tsx +44 -0
- package/.shadcn-admin-ref/src/features/auth/sign-in/assets/dashboard-dark.png +0 -0
- package/.shadcn-admin-ref/src/features/auth/sign-in/assets/dashboard-light.png +0 -0
- package/.shadcn-admin-ref/src/features/auth/sign-in/components/user-auth-form.tsx +150 -0
- package/.shadcn-admin-ref/src/features/auth/sign-in/index.tsx +51 -0
- package/.shadcn-admin-ref/src/features/auth/sign-in/sign-in-2.tsx +69 -0
- package/.shadcn-admin-ref/src/features/auth/sign-up/components/sign-up-form.tsx +143 -0
- package/.shadcn-admin-ref/src/features/auth/sign-up/index.tsx +57 -0
- package/.shadcn-admin-ref/src/features/chats/components/new-chat.tsx +127 -0
- package/.shadcn-admin-ref/src/features/chats/data/chat-types.ts +4 -0
- package/.shadcn-admin-ref/src/features/chats/data/convo.json +309 -0
- package/.shadcn-admin-ref/src/features/chats/index.tsx +349 -0
- package/.shadcn-admin-ref/src/features/dashboard/components/analytics-chart.tsx +77 -0
- package/.shadcn-admin-ref/src/features/dashboard/components/analytics.tsx +189 -0
- package/.shadcn-admin-ref/src/features/dashboard/components/overview.tsx +82 -0
- package/.shadcn-admin-ref/src/features/dashboard/components/recent-sales.tsx +83 -0
- package/.shadcn-admin-ref/src/features/dashboard/index.tsx +220 -0
- package/.shadcn-admin-ref/src/features/errors/forbidden.tsx +25 -0
- package/.shadcn-admin-ref/src/features/errors/general-error.tsx +36 -0
- package/.shadcn-admin-ref/src/features/errors/maintenance-error.tsx +19 -0
- package/.shadcn-admin-ref/src/features/errors/not-found-error.tsx +25 -0
- package/.shadcn-admin-ref/src/features/errors/unauthorized-error.tsx +25 -0
- package/.shadcn-admin-ref/src/features/settings/account/account-form.tsx +173 -0
- package/.shadcn-admin-ref/src/features/settings/account/index.tsx +14 -0
- package/.shadcn-admin-ref/src/features/settings/appearance/appearance-form.tsx +162 -0
- package/.shadcn-admin-ref/src/features/settings/appearance/index.tsx +14 -0
- package/.shadcn-admin-ref/src/features/settings/components/content-section.tsx +22 -0
- package/.shadcn-admin-ref/src/features/settings/components/sidebar-nav.tsx +84 -0
- package/.shadcn-admin-ref/src/features/settings/display/display-form.tsx +121 -0
- package/.shadcn-admin-ref/src/features/settings/display/index.tsx +13 -0
- package/.shadcn-admin-ref/src/features/settings/index.tsx +74 -0
- package/.shadcn-admin-ref/src/features/settings/notifications/index.tsx +13 -0
- package/.shadcn-admin-ref/src/features/settings/notifications/notifications-form.tsx +220 -0
- package/.shadcn-admin-ref/src/features/settings/profile/index.tsx +13 -0
- package/.shadcn-admin-ref/src/features/settings/profile/profile-form.tsx +177 -0
- package/.shadcn-admin-ref/src/features/tasks/components/data-table-bulk-actions.tsx +193 -0
- package/.shadcn-admin-ref/src/features/tasks/components/data-table-row-actions.tsx +83 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-columns.tsx +123 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-dialogs.tsx +72 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-import-dialog.tsx +110 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-multi-delete-dialog.tsx +95 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-mutate-drawer.tsx +212 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-primary-buttons.tsx +21 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-provider.tsx +36 -0
- package/.shadcn-admin-ref/src/features/tasks/components/tasks-table.tsx +197 -0
- package/.shadcn-admin-ref/src/features/tasks/data/data.tsx +77 -0
- package/.shadcn-admin-ref/src/features/tasks/data/schema.ts +13 -0
- package/.shadcn-admin-ref/src/features/tasks/data/tasks.ts +29 -0
- package/.shadcn-admin-ref/src/features/tasks/index.tsx +41 -0
- package/.shadcn-admin-ref/src/features/users/components/data-table-bulk-actions.tsx +139 -0
- package/.shadcn-admin-ref/src/features/users/components/data-table-row-actions.tsx +63 -0
- package/.shadcn-admin-ref/src/features/users/components/users-action-dialog.tsx +326 -0
- package/.shadcn-admin-ref/src/features/users/components/users-columns.tsx +138 -0
- package/.shadcn-admin-ref/src/features/users/components/users-delete-dialog.tsx +81 -0
- package/.shadcn-admin-ref/src/features/users/components/users-dialogs.tsx +51 -0
- package/.shadcn-admin-ref/src/features/users/components/users-invite-dialog.tsx +150 -0
- package/.shadcn-admin-ref/src/features/users/components/users-multi-delete-dialog.tsx +95 -0
- package/.shadcn-admin-ref/src/features/users/components/users-primary-buttons.tsx +21 -0
- package/.shadcn-admin-ref/src/features/users/components/users-provider.tsx +36 -0
- package/.shadcn-admin-ref/src/features/users/components/users-table.tsx +194 -0
- package/.shadcn-admin-ref/src/features/users/data/data.ts +35 -0
- package/.shadcn-admin-ref/src/features/users/data/schema.ts +32 -0
- package/.shadcn-admin-ref/src/features/users/data/users.ts +33 -0
- package/.shadcn-admin-ref/src/features/users/index.tsx +47 -0
- package/.shadcn-admin-ref/src/hooks/use-dialog-state.tsx +18 -0
- package/.shadcn-admin-ref/src/hooks/use-mobile.tsx +19 -0
- package/.shadcn-admin-ref/src/hooks/use-table-url-state.ts +219 -0
- package/.shadcn-admin-ref/src/lib/cookies.ts +43 -0
- package/.shadcn-admin-ref/src/lib/handle-server-error.ts +24 -0
- package/.shadcn-admin-ref/src/lib/show-submitted-data.tsx +15 -0
- package/.shadcn-admin-ref/src/lib/utils.ts +60 -0
- package/.shadcn-admin-ref/src/main.tsx +107 -0
- package/.shadcn-admin-ref/src/routeTree.gen.ts +719 -0
- package/.shadcn-admin-ref/src/routes/(auth)/forgot-password.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(auth)/otp.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(auth)/sign-in-2.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(auth)/sign-in.tsx +12 -0
- package/.shadcn-admin-ref/src/routes/(auth)/sign-up.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(errors)/401.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(errors)/403.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(errors)/404.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(errors)/500.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/(errors)/503.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/__root.tsx +30 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/apps/index.tsx +17 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/chats/index.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/errors/$error.tsx +45 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/help-center/index.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/index.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/route.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/settings/account.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/settings/appearance.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/settings/display.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/settings/index.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/settings/notifications.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/settings/route.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/tasks/index.tsx +23 -0
- package/.shadcn-admin-ref/src/routes/_authenticated/users/index.tsx +32 -0
- package/.shadcn-admin-ref/src/routes/clerk/(auth)/route.tsx +60 -0
- package/.shadcn-admin-ref/src/routes/clerk/(auth)/sign-in.tsx +14 -0
- package/.shadcn-admin-ref/src/routes/clerk/(auth)/sign-up.tsx +9 -0
- package/.shadcn-admin-ref/src/routes/clerk/_authenticated/route.tsx +6 -0
- package/.shadcn-admin-ref/src/routes/clerk/_authenticated/user-management.tsx +184 -0
- package/.shadcn-admin-ref/src/routes/clerk/route.tsx +135 -0
- package/.shadcn-admin-ref/src/stores/auth-store.ts +53 -0
- package/.shadcn-admin-ref/src/styles/index.css +87 -0
- package/.shadcn-admin-ref/src/styles/theme.css +102 -0
- package/.shadcn-admin-ref/src/tanstack-table.d.ts +10 -0
- package/.shadcn-admin-ref/src/vite-env.d.ts +1 -0
- package/.swarm/memory.db +0 -0
- package/.swarm/memory.db-shm +0 -0
- package/.swarm/memory.db-wal +0 -0
- package/.zyflow/cli-settings.json +30 -0
- package/.zyflow/db.sqlite +0 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765491505852.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765491622627.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765491794652.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765491890392.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765494002879.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765494183887.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765494342052.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765494387244.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765494387245.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765494606176.json +10 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765495967542.json +16 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765495967629.json +16 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765497861143.json +16 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765497861870.json +20 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765498021377.json +18 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765498021660.json +18 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765503255525.json +13 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765503256018.json +13 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765504009102.json +16 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765504492051.json +18 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765504946437.json +16 -0
- package/.zyflow/logs/add-gitdiagram-integration/1633-1765504946640.json +16 -0
- package/.zyflow/logs/add-gitdiagram-integration/1634-1765505950215.json +16 -0
- package/.zyflow/logs/add-gitdiagram-integration/1634-1765505950948.json +18 -0
- package/.zyflow/logs/add-gitdiagram-integration/1635-1765505971712.json +18 -0
- package/.zyflow/logs/add-gitdiagram-integration/1635-1765505971976.json +18 -0
- package/.zyflow/logs/add-gitdiagram-integration/1636-1765505986208.json +18 -0
- package/.zyflow/logs/add-gitdiagram-integration/1636-1765505986620.json +16 -0
- package/.zyflow/logs/integrate-claude-flow/3580-1765996816612.json +10 -0
- package/.zyflow/logs/integrate-claude-flow/3580-1766014825819.json +10 -0
- package/.zyflow/logs/integrate-claude-flow/3580-1766015183794.json +12 -0
- package/.zyflow/logs/integrate-claude-flow/3580-1766015474608.json +12 -0
- package/.zyflow/logs/integrate-claude-flow/3581-1766016502824.json +63 -0
- package/.zyflow/logs/integrate-claude-flow/3581-1766016576008.json +60 -0
- package/.zyflow/logs/integrate-claude-flow/3582-1766022737754.json +110 -0
- package/.zyflow/logs/integrate-claude-flow/3582-1766022809327.json +135 -0
- package/.zyflow/sessions.json +242 -0
- package/.zyflow/settings.json +6 -0
- package/.zyflow/tasks.db +0 -0
- package/.zyflow/tasks.db-shm +0 -0
- package/.zyflow/tasks.db-wal +0 -0
- package/.zyflow/zyflow.sqlite +0 -0
- package/Dockerfile +82 -0
- package/LICENSE +21 -0
- package/README.md +506 -0
- package/claude-flow +34 -0
- package/components.json +21 -0
- package/config/ports.ts +28 -0
- package/docker-compose.yml +52 -0
- package/eslint.config.js +34 -0
- package/index.html +19 -0
- package/logs/mcp-error.log +55 -0
- package/logs/mcp-out.log +0 -0
- package/logs/pm2-error.log +0 -0
- package/logs/pm2-out.log +265 -0
- package/logs/py-error.log +22 -0
- package/logs/py-out.log +0 -0
- package/logs/server-error.log +11000 -0
- package/logs/server-out.log +8117 -0
- package/logs/vite-error.log +404 -0
- package/logs/vite-out.log +311 -0
- package/mcp-server/agent-tools.ts +375 -0
- package/mcp-server/cli-models.ts +193 -0
- package/mcp-server/context.ts +110 -0
- package/mcp-server/diagram-tools.ts +341 -0
- package/mcp-server/index.ts +2014 -0
- package/mcp-server/integration-tools.ts +909 -0
- package/mcp-server/moai-spec-tools.ts +416 -0
- package/mcp-server/parser.ts +422 -0
- package/mcp-server/post-task-runner.ts +253 -0
- package/mcp-server/post-task-types.ts +426 -0
- package/mcp-server/quarantine-manager.ts +479 -0
- package/mcp-server/report-generator.ts +386 -0
- package/mcp-server/task-tools.ts +619 -0
- package/mcp-server/trigger-config.ts +288 -0
- package/mcp-server/trigger-router.ts +305 -0
- package/mcp-server/triggers/event-listener.ts +331 -0
- package/mcp-server/triggers/git-hooks.ts +283 -0
- package/mcp-server/triggers/scheduler.ts +289 -0
- package/mcp-server/types.ts +55 -0
- package/memory/claude-flow@alpha-data.json +5 -0
- package/nginx/zyflow.conf +144 -0
- package/openspec/config.yaml +78 -0
- package/openspec-backup.tar.gz +0 -0
- package/package.json +154 -0
- package/packages/gitdiagram-core/.claude-flow/metrics/agent-metrics.json +1 -0
- package/packages/gitdiagram-core/.claude-flow/metrics/performance.json +87 -0
- package/packages/gitdiagram-core/.claude-flow/metrics/task-metrics.json +10 -0
- package/packages/gitdiagram-core/package.json +41 -0
- package/packages/gitdiagram-core/src/file-tree.ts +272 -0
- package/packages/gitdiagram-core/src/generator.ts +283 -0
- package/packages/gitdiagram-core/src/index.ts +78 -0
- package/packages/gitdiagram-core/src/llm-adapter.ts +235 -0
- package/packages/gitdiagram-core/src/mermaid-utils.ts +304 -0
- package/packages/gitdiagram-core/src/prompts.ts +281 -0
- package/packages/zyflow-parser/package.json +34 -0
- package/packages/zyflow-parser/src/index.ts +26 -0
- package/packages/zyflow-parser/src/moai-parser.ts +603 -0
- package/packages/zyflow-parser/src/moai-types.ts +110 -0
- package/packages/zyflow-remote-plugin/.claude-flow/metrics/agent-metrics.json +1 -0
- package/packages/zyflow-remote-plugin/.claude-flow/metrics/performance.json +87 -0
- package/packages/zyflow-remote-plugin/.claude-flow/metrics/task-metrics.json +10 -0
- package/packages/zyflow-remote-plugin/package.json +31 -0
- package/packages/zyflow-remote-plugin/src/index.ts +71 -0
- package/packages/zyflow-remote-plugin/src/remote-config.ts +232 -0
- package/packages/zyflow-remote-plugin/src/router.ts +535 -0
- package/packages/zyflow-remote-plugin/src/ssh-config-parser.ts +123 -0
- package/packages/zyflow-remote-plugin/src/ssh-manager.ts +598 -0
- package/packages/zyflow-remote-plugin/src/types.ts +149 -0
- package/plugin/manifest.json +26 -0
- package/plugin/package.json +13 -0
- package/public/favicon.svg +4 -0
- package/server/adk/agents/error-analyzer.ts +223 -0
- package/server/adk/agents/fix-generator.ts +187 -0
- package/server/adk/agents/pr-agent.ts +264 -0
- package/server/adk/agents/validator.ts +187 -0
- package/server/adk/config.ts +43 -0
- package/server/adk/index.ts +69 -0
- package/server/adk/integration.ts +297 -0
- package/server/adk/orchestrator.ts +405 -0
- package/server/adk/tools/build-tools.ts +290 -0
- package/server/adk/tools/file-tools.ts +351 -0
- package/server/adk/tools/git-tools.ts +280 -0
- package/server/adk/tools/github-tools.ts +249 -0
- package/server/agents/agent-monitor.ts +416 -0
- package/server/agents/alert-integration.ts +312 -0
- package/server/agents/error-analyzer.ts +472 -0
- package/server/agents/error-detector.ts +442 -0
- package/server/agents/fix-generator.ts +421 -0
- package/server/agents/fix-validator.ts +428 -0
- package/server/agents/merge-policy.ts +362 -0
- package/server/agents/pr-workflow.ts +476 -0
- package/server/agents/prompts/error-analysis.ts +393 -0
- package/server/ai/gemini-client.ts +499 -0
- package/server/ai/index.ts +317 -0
- package/server/ai/types.ts +137 -0
- package/server/app.ts +3693 -0
- package/server/archive-manager.ts +604 -0
- package/server/backlog/index.ts +7 -0
- package/server/backlog/migration.ts +331 -0
- package/server/backlog/parser.ts +323 -0
- package/server/backlog/sync.ts +325 -0
- package/server/change-log.ts +868 -0
- package/server/claude-flow/index.ts +12 -0
- package/server/claude-flow/prompt-builder.ts +407 -0
- package/server/claude-flow/types.ts +33 -0
- package/server/cli-adapter/index.ts +11 -0
- package/server/cli-adapter/process-manager.ts +612 -0
- package/server/cli-adapter/profile-manager.ts +286 -0
- package/server/cli-adapter/routes.ts +561 -0
- package/server/cli-adapter/types.ts +226 -0
- package/server/config.d.ts +18 -0
- package/server/config.js +79 -0
- package/server/config.ts +262 -0
- package/server/flow-sync.ts +543 -0
- package/server/git/change-workflow.ts +446 -0
- package/server/git/commands.ts +370 -0
- package/server/git/github.ts +247 -0
- package/server/git/index.ts +1202 -0
- package/server/git/status.ts +322 -0
- package/server/index.ts +136 -0
- package/server/integrations/crypto.ts +142 -0
- package/server/integrations/db/client.ts +169 -0
- package/server/integrations/db/schema.ts +167 -0
- package/server/integrations/env-parser.ts +365 -0
- package/server/integrations/index.ts +101 -0
- package/server/integrations/keychain.ts +239 -0
- package/server/integrations/local/file-utils.ts +383 -0
- package/server/integrations/local/index.ts +64 -0
- package/server/integrations/local/resolver.ts +439 -0
- package/server/integrations/local/types.ts +122 -0
- package/server/integrations/routes.ts +1100 -0
- package/server/integrations/service-patterns.ts +771 -0
- package/server/integrations/services/accounts.ts +356 -0
- package/server/integrations/services/env-import.ts +279 -0
- package/server/integrations/services/projects.ts +552 -0
- package/server/integrations/services/system-import.ts +1110 -0
- package/server/migrations/ears-generator.ts +491 -0
- package/server/migrations/gherkin-generator.ts +605 -0
- package/server/migrations/index.ts +73 -0
- package/server/migrations/migrate-spec-format.ts +492 -0
- package/server/migrations/openspec-parser.ts +542 -0
- package/server/migrations/tag-generator.ts +474 -0
- package/server/moai-specs.ts +487 -0
- package/server/moai-watcher.ts +145 -0
- package/server/parser-debug.ts +37 -0
- package/server/parser-utils.ts +316 -0
- package/server/parser.d.ts +17 -0
- package/server/parser.js +221 -0
- package/server/parser.ts +342 -0
- package/server/remote-watcher.ts +367 -0
- package/server/replay-engine.ts +915 -0
- package/server/routes/alerts.ts +1028 -0
- package/server/routes/changes.ts +812 -0
- package/server/routes/docs.ts +898 -0
- package/server/routes/flow.ts +2814 -0
- package/server/routes/global-chat.ts +162 -0
- package/server/routes/leann.ts +327 -0
- package/server/routes/projects.ts +1282 -0
- package/server/routes/search.ts +266 -0
- package/server/routes/specs.ts +482 -0
- package/server/routes/webhooks.ts +579 -0
- package/server/server/parser.js +265 -0
- package/server/services/githubActionsPoller.ts +797 -0
- package/server/services/slackNotifier.ts +476 -0
- package/server/src/types/index.js +1 -0
- package/server/sync-tasks.ts +741 -0
- package/server/tasks/cli/commands.ts +269 -0
- package/server/tasks/cli/index.ts +152 -0
- package/server/tasks/core/search.ts +81 -0
- package/server/tasks/core/task.ts +307 -0
- package/server/tasks/db/client.ts +1008 -0
- package/server/tasks/db/schema.ts +572 -0
- package/server/tasks/index.ts +24 -0
- package/server/tasks.db +0 -0
- package/server/types/archive.ts +136 -0
- package/server/types/change-log.ts +643 -0
- package/server/types/spec.ts +188 -0
- package/server/unified-spec-scanner.ts +753 -0
- package/server/utils/crypto.ts +179 -0
- package/server/utils/webhook-verify.ts +216 -0
- package/server/watcher.ts +132 -0
- package/server/websocket.ts +99 -0
- package/server-output.log +6 -0
- package/sonar-project.properties +18 -0
- package/src/App.tsx +386 -0
- package/src/api/client.ts +346 -0
- package/src/api/error-interceptor.ts +366 -0
- package/src/api/errors.ts +123 -0
- package/src/api/flow.ts +233 -0
- package/src/api/offline-queue.ts +351 -0
- package/src/api/retry-logic.ts +233 -0
- package/src/components/OfflineModeBanner.tsx +159 -0
- package/src/components/SSEStatusIndicator.tsx +194 -0
- package/src/components/agent/AgentChat.tsx +243 -0
- package/src/components/agent/AgentPage.tsx +182 -0
- package/src/components/agent/AgentSidebar.tsx +231 -0
- package/src/components/agent/index.ts +7 -0
- package/src/components/alerts/AlertCenter.tsx +239 -0
- package/src/components/alerts/AlertDashboard.tsx +211 -0
- package/src/components/alerts/AlertDetail.tsx +474 -0
- package/src/components/alerts/AlertList.tsx +113 -0
- package/src/components/alerts/AlertSettings.tsx +336 -0
- package/src/components/alerts/index.ts +5 -0
- package/src/components/chat/ChatPanel.tsx +642 -0
- package/src/components/chat/index.ts +1 -0
- package/src/components/cli/AddCustomCLIDialog.tsx +210 -0
- package/src/components/cli/CLISelector.tsx +187 -0
- package/src/components/cli/index.ts +8 -0
- package/src/components/dashboard/ArchivedChangeList.tsx +102 -0
- package/src/components/dashboard/ArchivedChangeViewer.tsx +184 -0
- package/src/components/dashboard/ArchivedChangesPage.tsx +31 -0
- package/src/components/dashboard/ChangeList.tsx +86 -0
- package/src/components/dashboard/ThemeToggle.tsx +33 -0
- package/src/components/diagram/DiagramViewer.tsx +256 -0
- package/src/components/diagram/MermaidRenderer.tsx +163 -0
- package/src/components/diagram/ProjectDiagramTab.tsx +161 -0
- package/src/components/diagram/index.ts +13 -0
- package/src/components/errors/ErrorBoundary.tsx +276 -0
- package/src/components/errors/ErrorFallback.tsx +198 -0
- package/src/components/errors/ErrorToast.tsx +221 -0
- package/src/components/flow/BacklogView.tsx +1142 -0
- package/src/components/flow/ChangeDetail.tsx +475 -0
- package/src/components/flow/ChangeItem.tsx +230 -0
- package/src/components/flow/ChangeList.tsx +92 -0
- package/src/components/flow/ExecutionHistoryDialog.tsx +224 -0
- package/src/components/flow/FlowContent.tsx +212 -0
- package/src/components/flow/FlowPage.tsx +9 -0
- package/src/components/flow/PipelineBar.tsx +214 -0
- package/src/components/flow/ProjectDashboard.tsx +222 -0
- package/src/components/flow/SpecDetail.tsx +138 -0
- package/src/components/flow/SpecDetailTabs.tsx +176 -0
- package/src/components/flow/SpecItem.tsx +93 -0
- package/src/components/flow/SpecProgressBar.tsx +47 -0
- package/src/components/flow/StageContent.tsx +620 -0
- package/src/components/flow/StandaloneTasks.tsx +960 -0
- package/src/components/flow/TaskExecutionDialog.tsx +1204 -0
- package/src/components/flow/index.ts +9 -0
- package/src/components/flow/task-execution/AgentSlider.tsx +37 -0
- package/src/components/flow/task-execution/ConsensusSettings.tsx +129 -0
- package/src/components/flow/task-execution/ExecutionOutput.tsx +398 -0
- package/src/components/flow/task-execution/ModelSelector.tsx +134 -0
- package/src/components/flow/task-execution/ProviderSelector.tsx +137 -0
- package/src/components/flow/task-execution/RecommendationBanner.tsx +71 -0
- package/src/components/flow/task-execution/StatusBadge.tsx +43 -0
- package/src/components/flow/task-execution/StrategySelector.tsx +48 -0
- package/src/components/flow/task-execution/SwarmSummary.tsx +55 -0
- package/src/components/flow/task-execution/index.ts +14 -0
- package/src/components/flow/task-execution/types.ts +56 -0
- package/src/components/git/ChangeWorkflowDialog.tsx +582 -0
- package/src/components/git/ConflictResolutionDialog.tsx +398 -0
- package/src/components/git/GitBranchSelector.tsx +212 -0
- package/src/components/git/GitCommitDialog.tsx +254 -0
- package/src/components/git/GitStatusBadge.tsx +148 -0
- package/src/components/git/GitSyncButton.tsx +128 -0
- package/src/components/git/RemoteStatusBanner.tsx +143 -0
- package/src/components/git/index.ts +9 -0
- package/src/components/integrations/EnvImportDialog.tsx +524 -0
- package/src/components/integrations/EnvironmentDialog.tsx +227 -0
- package/src/components/integrations/IntegrationBadges.tsx +91 -0
- package/src/components/integrations/IntegrationsSettings.tsx +55 -0
- package/src/components/integrations/ProjectIntegrations.tsx +481 -0
- package/src/components/integrations/ServiceAccountDialog.tsx +422 -0
- package/src/components/integrations/ServiceAccountList.tsx +305 -0
- package/src/components/integrations/SystemImportDialog.tsx +436 -0
- package/src/components/integrations/TestAccountDialog.tsx +162 -0
- package/src/components/integrations/index.ts +6 -0
- package/src/components/layout/AppSidebar.tsx +284 -0
- package/src/components/layout/FlowSidebar.tsx +435 -0
- package/src/components/layout/GlobalCommandPalette.tsx +410 -0
- package/src/components/layout/MenuBar.tsx +227 -0
- package/src/components/layout/StatusBar.tsx +226 -0
- package/src/components/monitoring/ErrorDashboard.tsx +274 -0
- package/src/components/monitoring/ErrorDetailPanel.tsx +200 -0
- package/src/components/monitoring/ErrorFilters.tsx +219 -0
- package/src/components/monitoring/ErrorHistoryList.tsx +141 -0
- package/src/components/monitoring/ErrorStats.tsx +249 -0
- package/src/components/remote/RemoteFileBrowser.tsx +249 -0
- package/src/components/remote/RemoteServerDialog.tsx +234 -0
- package/src/components/remote/RemoteServerList.tsx +366 -0
- package/src/components/remote/index.ts +7 -0
- package/src/components/settings/CLISettings.tsx +522 -0
- package/src/components/settings/CustomCLIDialog.tsx +548 -0
- package/src/components/settings/IntegrationsSettings.tsx +51 -0
- package/src/components/settings/ProjectSettings.tsx +441 -0
- package/src/components/settings/ProjectsSettings.tsx +541 -0
- package/src/components/settings/SearchSettings.tsx +272 -0
- package/src/components/settings/SettingsPage.tsx +68 -0
- package/src/components/settings/index.ts +5 -0
- package/src/components/swarm/ExecutionPanel.tsx +284 -0
- package/src/components/swarm/LogViewer.tsx +196 -0
- package/src/components/swarm/ProgressIndicator.tsx +111 -0
- package/src/components/swarm/index.ts +3 -0
- package/src/components/tasks/ArchiveTable.tsx +203 -0
- package/src/components/tasks/KanbanBoard.tsx +264 -0
- package/src/components/tasks/TaskCard.tsx +138 -0
- package/src/components/tasks/TaskColumn.tsx +81 -0
- package/src/components/tasks/TaskDialog.tsx +274 -0
- package/src/components/tasks/index.ts +5 -0
- package/src/components/tasks/types.ts +43 -0
- package/src/components/ui/alert-dialog.tsx +154 -0
- package/src/components/ui/alert.tsx +65 -0
- package/src/components/ui/badge.tsx +45 -0
- package/src/components/ui/button.tsx +58 -0
- package/src/components/ui/card.tsx +91 -0
- package/src/components/ui/checkbox.tsx +29 -0
- package/src/components/ui/collapsible.tsx +31 -0
- package/src/components/ui/command.tsx +184 -0
- package/src/components/ui/confirm-dialog.tsx +55 -0
- package/src/components/ui/dialog.tsx +142 -0
- package/src/components/ui/dropdown-menu.tsx +254 -0
- package/src/components/ui/input.tsx +20 -0
- package/src/components/ui/label.tsx +22 -0
- package/src/components/ui/markdown.tsx +100 -0
- package/src/components/ui/progress.tsx +27 -0
- package/src/components/ui/resizable-sidebar.tsx +156 -0
- package/src/components/ui/resizable.tsx +54 -0
- package/src/components/ui/right-resizable-sidebar.tsx +158 -0
- package/src/components/ui/scroll-area.tsx +64 -0
- package/src/components/ui/select.tsx +185 -0
- package/src/components/ui/separator.tsx +25 -0
- package/src/components/ui/sheet.tsx +136 -0
- package/src/components/ui/sidebar.tsx +726 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/slider.tsx +56 -0
- package/src/components/ui/switch.tsx +29 -0
- package/src/components/ui/table.tsx +113 -0
- package/src/components/ui/tabs.tsx +63 -0
- package/src/components/ui/textarea.tsx +17 -0
- package/src/components/ui/tooltip.tsx +60 -0
- package/src/config/api.ts +83 -0
- package/src/constants/error-codes.ts +255 -0
- package/src/constants/stages.ts +27 -0
- package/src/context/ErrorContext.tsx +185 -0
- package/src/context/theme-provider.tsx +63 -0
- package/src/hooks/use-mobile.tsx +19 -0
- package/src/hooks/useAI.ts +206 -0
- package/src/hooks/useAgentSession.ts +431 -0
- package/src/hooks/useAlerts.ts +935 -0
- package/src/hooks/useArchivedChanges.ts +39 -0
- package/src/hooks/useAsyncError.ts +45 -0
- package/src/hooks/useChangeGit.ts +727 -0
- package/src/hooks/useChanges.ts +20 -0
- package/src/hooks/useClaude.ts +130 -0
- package/src/hooks/useDocs.ts +182 -0
- package/src/hooks/useErrorDashboard.ts +243 -0
- package/src/hooks/useErrorHandler.ts +150 -0
- package/src/hooks/useExecutionHistory.ts +55 -0
- package/src/hooks/useFlowChanges.ts +850 -0
- package/src/hooks/useFlowItems.ts +205 -0
- package/src/hooks/useGit.ts +427 -0
- package/src/hooks/useHideCompletedSpecs.ts +15 -0
- package/src/hooks/useInstance.ts +40 -0
- package/src/hooks/useIntegrations.ts +737 -0
- package/src/hooks/useLeannStatus.ts +93 -0
- package/src/hooks/useNetworkStatus.ts +167 -0
- package/src/hooks/useProjects.ts +353 -0
- package/src/hooks/useRemoteServers.ts +383 -0
- package/src/hooks/useSSEConnection.ts +346 -0
- package/src/hooks/useSpecs.ts +39 -0
- package/src/hooks/useSwarm.ts +462 -0
- package/src/hooks/useTasks.ts +137 -0
- package/src/hooks/useURLSync.ts +122 -0
- package/src/hooks/useWebSocket.ts +262 -0
- package/src/lib/utils.ts +121 -0
- package/src/main.tsx +22 -0
- package/src/stores/errorStore.ts +301 -0
- package/src/stores/offlineStore.ts +266 -0
- package/src/stores/sseStore.ts +247 -0
- package/src/stores/useHideCompletedStore.ts +21 -0
- package/src/styles/index.css +87 -0
- package/src/styles/theme.css +102 -0
- package/src/types/ai.ts +191 -0
- package/src/types/errors.ts +253 -0
- package/src/types/flow.ts +382 -0
- package/src/types/index.ts +614 -0
- package/src/utils/error-logger.ts +399 -0
- package/src/utils/error-statistics.ts +305 -0
- package/src/utils/logger.ts +280 -0
- package/src/utils/task-routing.ts +795 -0
- package/src/vite-env.d.ts +1 -0
- package/test-results/.last-run.json +4 -0
- package/tmp/check-docker-final.ts +48 -0
- package/tmp/check-docker-tasks.ts +58 -0
- package/tmp/check-docker-tasks2.ts +48 -0
- package/tmp/check-docker-tasks3.ts +42 -0
- package/tmp/check-mobile-tasks.ts +57 -0
- package/tmp/check-zywiki-tasks.ts +49 -0
- package/tmp/sync-mobile.ts +11 -0
- package/tmp/sync-zywiki.ts +68 -0
- package/tmp/test-docker-parser.ts +15 -0
- package/tmp/test-mobile-parser.ts +28 -0
- package/tmp/test-parser.ts +27 -0
- package/tmp/test-unnumbered.ts +35 -0
- package/zyflow.db +0 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive Manager (SPEC-VISIBILITY-001 Phase 4)
|
|
3
|
+
*
|
|
4
|
+
* Manages archiving and restoring of SPEC documents.
|
|
5
|
+
*
|
|
6
|
+
* Archive structure:
|
|
7
|
+
* .moai/archive/
|
|
8
|
+
* └── {YYYY-MM}/
|
|
9
|
+
* └── {SPEC-ID}/
|
|
10
|
+
* ├── spec.md
|
|
11
|
+
* ├── plan.md
|
|
12
|
+
* ├── acceptance.md
|
|
13
|
+
* └── .archive-metadata.json
|
|
14
|
+
*
|
|
15
|
+
* Features:
|
|
16
|
+
* - Atomic filesystem operations (move, not copy+delete)
|
|
17
|
+
* - Database status synchronization
|
|
18
|
+
* - Metadata preservation
|
|
19
|
+
* - Rollback on failure
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { mkdir, readdir, readFile, writeFile, rename, rm, stat, access, constants } from 'fs/promises'
|
|
23
|
+
import { existsSync } from 'fs'
|
|
24
|
+
import { join, dirname } from 'path'
|
|
25
|
+
import { getSqlite } from './tasks/db/client.js'
|
|
26
|
+
import type {
|
|
27
|
+
ArchiveMetadata,
|
|
28
|
+
ArchiveResult,
|
|
29
|
+
ArchiveReason,
|
|
30
|
+
ArchivedSpecSummary,
|
|
31
|
+
} from './types/archive.js'
|
|
32
|
+
|
|
33
|
+
// =============================================
|
|
34
|
+
// Constants
|
|
35
|
+
// =============================================
|
|
36
|
+
|
|
37
|
+
const ARCHIVE_DIR = '.moai/archive'
|
|
38
|
+
const SPECS_DIR = '.moai/specs'
|
|
39
|
+
const METADATA_FILE = '.archive-metadata.json'
|
|
40
|
+
|
|
41
|
+
// =============================================
|
|
42
|
+
// Helper Functions
|
|
43
|
+
// =============================================
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Get the archive month directory name (YYYY-MM format)
|
|
47
|
+
*/
|
|
48
|
+
function getArchiveMonth(): string {
|
|
49
|
+
const now = new Date()
|
|
50
|
+
const year = now.getFullYear()
|
|
51
|
+
const month = String(now.getMonth() + 1).padStart(2, '0')
|
|
52
|
+
return `${year}-${month}`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Ensure a directory exists, creating it if necessary
|
|
57
|
+
*/
|
|
58
|
+
async function ensureDir(path: string): Promise<void> {
|
|
59
|
+
if (!existsSync(path)) {
|
|
60
|
+
await mkdir(path, { recursive: true })
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Check if a path exists and is accessible
|
|
66
|
+
*/
|
|
67
|
+
async function pathExists(path: string): Promise<boolean> {
|
|
68
|
+
try {
|
|
69
|
+
await access(path, constants.F_OK)
|
|
70
|
+
return true
|
|
71
|
+
} catch {
|
|
72
|
+
return false
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Safely move a directory using rename (atomic on same filesystem)
|
|
78
|
+
* Falls back to copy+delete if rename fails (cross-filesystem)
|
|
79
|
+
*/
|
|
80
|
+
async function moveDirectory(source: string, destination: string): Promise<void> {
|
|
81
|
+
// Ensure destination parent exists
|
|
82
|
+
await ensureDir(dirname(destination))
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
// Try atomic rename first (works on same filesystem)
|
|
86
|
+
await rename(source, destination)
|
|
87
|
+
} catch (error) {
|
|
88
|
+
// If rename fails (e.g., cross-filesystem), we could implement
|
|
89
|
+
// copy+delete, but for now we'll throw as .moai directories
|
|
90
|
+
// should always be on the same filesystem
|
|
91
|
+
throw new Error(
|
|
92
|
+
`Failed to move directory from ${source} to ${destination}: ${
|
|
93
|
+
error instanceof Error ? error.message : String(error)
|
|
94
|
+
}`
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// =============================================
|
|
100
|
+
// Atomic Operation Wrapper (TAG-022)
|
|
101
|
+
// =============================================
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Execute an operation with rollback support
|
|
105
|
+
*
|
|
106
|
+
* @param operation - The main operation to execute
|
|
107
|
+
* @param rollback - The rollback function to call on failure
|
|
108
|
+
* @returns The result of the operation
|
|
109
|
+
*/
|
|
110
|
+
async function withAtomicOperation<T>(
|
|
111
|
+
operation: () => Promise<T>,
|
|
112
|
+
rollback: () => Promise<void>
|
|
113
|
+
): Promise<T> {
|
|
114
|
+
try {
|
|
115
|
+
return await operation()
|
|
116
|
+
} catch (error) {
|
|
117
|
+
// Attempt rollback
|
|
118
|
+
try {
|
|
119
|
+
await rollback()
|
|
120
|
+
console.log('[Archive] Rollback successful')
|
|
121
|
+
} catch (rollbackError) {
|
|
122
|
+
console.error('[Archive] Rollback failed:', rollbackError)
|
|
123
|
+
}
|
|
124
|
+
throw error
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// =============================================
|
|
129
|
+
// Archive Operations
|
|
130
|
+
// =============================================
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Archive a SPEC document
|
|
134
|
+
*
|
|
135
|
+
* This operation:
|
|
136
|
+
* 1. Moves the SPEC directory to archive
|
|
137
|
+
* 2. Creates archive metadata file
|
|
138
|
+
* 3. Updates database status to 'archived'
|
|
139
|
+
*
|
|
140
|
+
* Rolls back all changes if any step fails.
|
|
141
|
+
*
|
|
142
|
+
* @param specId - The SPEC ID to archive (e.g., "SPEC-001")
|
|
143
|
+
* @param projectPath - Path to the project root
|
|
144
|
+
* @param reason - Reason for archiving
|
|
145
|
+
* @param archivedBy - Who is archiving (default: "system")
|
|
146
|
+
* @param notes - Optional notes about the archive
|
|
147
|
+
* @returns ArchiveResult indicating success or failure
|
|
148
|
+
*/
|
|
149
|
+
export async function archiveSpec(
|
|
150
|
+
specId: string,
|
|
151
|
+
projectPath: string,
|
|
152
|
+
reason: ArchiveReason = 'manual',
|
|
153
|
+
archivedBy: string = 'system',
|
|
154
|
+
notes?: string
|
|
155
|
+
): Promise<ArchiveResult> {
|
|
156
|
+
const sqlite = getSqlite()
|
|
157
|
+
const sourcePath = join(projectPath, SPECS_DIR, specId)
|
|
158
|
+
const archiveMonth = getArchiveMonth()
|
|
159
|
+
const archivePath = join(projectPath, ARCHIVE_DIR, archiveMonth, specId)
|
|
160
|
+
const relativeArchivePath = `${ARCHIVE_DIR}/${archiveMonth}/${specId}`
|
|
161
|
+
|
|
162
|
+
// Validate source exists
|
|
163
|
+
if (!existsSync(sourcePath)) {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
specId,
|
|
167
|
+
error: `SPEC directory not found: ${specId}`,
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Check if already archived
|
|
172
|
+
if (await pathExists(archivePath)) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
specId,
|
|
176
|
+
error: `SPEC is already archived at ${relativeArchivePath}`,
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Get current status from database for metadata
|
|
181
|
+
const existingChange = sqlite
|
|
182
|
+
.prepare(`SELECT status, title FROM changes WHERE id = ?`)
|
|
183
|
+
.get(specId) as { status: string; title: string } | undefined
|
|
184
|
+
|
|
185
|
+
const originalStatus = existingChange?.status || 'active'
|
|
186
|
+
const title = existingChange?.title || specId
|
|
187
|
+
|
|
188
|
+
// Prepare archive metadata
|
|
189
|
+
const metadata: ArchiveMetadata = {
|
|
190
|
+
archivedAt: new Date().toISOString(),
|
|
191
|
+
archivedBy,
|
|
192
|
+
reason,
|
|
193
|
+
originalStatus,
|
|
194
|
+
restorePath: `${SPECS_DIR}/${specId}`,
|
|
195
|
+
title,
|
|
196
|
+
notes,
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Track what operations were completed for rollback
|
|
200
|
+
let directoryMoved = false
|
|
201
|
+
let metadataWritten = false
|
|
202
|
+
let databaseUpdated = false
|
|
203
|
+
const previousDbStatus = originalStatus
|
|
204
|
+
|
|
205
|
+
const rollback = async () => {
|
|
206
|
+
// Rollback in reverse order
|
|
207
|
+
if (databaseUpdated) {
|
|
208
|
+
try {
|
|
209
|
+
sqlite
|
|
210
|
+
.prepare(`UPDATE changes SET status = ?, updated_at = ? WHERE id = ?`)
|
|
211
|
+
.run(previousDbStatus, Date.now(), specId)
|
|
212
|
+
console.log('[Archive] Rolled back database status')
|
|
213
|
+
} catch (err) {
|
|
214
|
+
console.error('[Archive] Failed to rollback database:', err)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (metadataWritten) {
|
|
219
|
+
try {
|
|
220
|
+
const metadataPath = join(archivePath, METADATA_FILE)
|
|
221
|
+
if (await pathExists(metadataPath)) {
|
|
222
|
+
await rm(metadataPath)
|
|
223
|
+
console.log('[Archive] Removed metadata file')
|
|
224
|
+
}
|
|
225
|
+
} catch (err) {
|
|
226
|
+
console.error('[Archive] Failed to remove metadata:', err)
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (directoryMoved) {
|
|
231
|
+
try {
|
|
232
|
+
// Move back to original location
|
|
233
|
+
await moveDirectory(archivePath, sourcePath)
|
|
234
|
+
// Clean up empty month directory if needed
|
|
235
|
+
const monthDir = dirname(archivePath)
|
|
236
|
+
const monthContents = await readdir(monthDir)
|
|
237
|
+
if (monthContents.length === 0) {
|
|
238
|
+
await rm(monthDir, { recursive: true })
|
|
239
|
+
}
|
|
240
|
+
console.log('[Archive] Moved directory back to original location')
|
|
241
|
+
} catch (err) {
|
|
242
|
+
console.error('[Archive] Failed to move directory back:', err)
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
try {
|
|
248
|
+
return await withAtomicOperation(
|
|
249
|
+
async () => {
|
|
250
|
+
// Step 1: Move directory to archive
|
|
251
|
+
await moveDirectory(sourcePath, archivePath)
|
|
252
|
+
directoryMoved = true
|
|
253
|
+
|
|
254
|
+
// Step 2: Write archive metadata
|
|
255
|
+
const metadataPath = join(archivePath, METADATA_FILE)
|
|
256
|
+
await writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8')
|
|
257
|
+
metadataWritten = true
|
|
258
|
+
|
|
259
|
+
// Step 3: Update database status
|
|
260
|
+
const now = Date.now()
|
|
261
|
+
sqlite
|
|
262
|
+
.prepare(
|
|
263
|
+
`UPDATE changes SET status = 'archived', updated_at = ? WHERE id = ?`
|
|
264
|
+
)
|
|
265
|
+
.run(now, specId)
|
|
266
|
+
databaseUpdated = true
|
|
267
|
+
|
|
268
|
+
// Also archive any tasks associated with this SPEC
|
|
269
|
+
sqlite
|
|
270
|
+
.prepare(
|
|
271
|
+
`UPDATE tasks SET status = 'archived', archived_at = ?, updated_at = ? WHERE change_id = ?`
|
|
272
|
+
)
|
|
273
|
+
.run(now, now, specId)
|
|
274
|
+
|
|
275
|
+
console.log(`[Archive] Successfully archived ${specId} to ${relativeArchivePath}`)
|
|
276
|
+
|
|
277
|
+
return {
|
|
278
|
+
success: true,
|
|
279
|
+
specId,
|
|
280
|
+
archivePath: relativeArchivePath,
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
rollback
|
|
284
|
+
)
|
|
285
|
+
} catch (error) {
|
|
286
|
+
return {
|
|
287
|
+
success: false,
|
|
288
|
+
specId,
|
|
289
|
+
error: error instanceof Error ? error.message : String(error),
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Restore an archived SPEC document
|
|
296
|
+
*
|
|
297
|
+
* This operation:
|
|
298
|
+
* 1. Reads archive metadata
|
|
299
|
+
* 2. Moves the SPEC directory back to .moai/specs
|
|
300
|
+
* 3. Restores database status from metadata
|
|
301
|
+
*
|
|
302
|
+
* Rolls back all changes if any step fails.
|
|
303
|
+
*
|
|
304
|
+
* @param specId - The SPEC ID to restore (e.g., "SPEC-001")
|
|
305
|
+
* @param projectPath - Path to the project root
|
|
306
|
+
* @returns ArchiveResult indicating success or failure
|
|
307
|
+
*/
|
|
308
|
+
export async function restoreSpec(
|
|
309
|
+
specId: string,
|
|
310
|
+
projectPath: string
|
|
311
|
+
): Promise<ArchiveResult> {
|
|
312
|
+
const sqlite = getSqlite()
|
|
313
|
+
const restorePath = join(projectPath, SPECS_DIR, specId)
|
|
314
|
+
const relativeRestorePath = `${SPECS_DIR}/${specId}`
|
|
315
|
+
|
|
316
|
+
// Find the archived SPEC
|
|
317
|
+
const archiveBase = join(projectPath, ARCHIVE_DIR)
|
|
318
|
+
|
|
319
|
+
if (!existsSync(archiveBase)) {
|
|
320
|
+
return {
|
|
321
|
+
success: false,
|
|
322
|
+
specId,
|
|
323
|
+
error: `Archive directory not found`,
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Search for the SPEC in archive month directories
|
|
328
|
+
let archivePath: string | null = null
|
|
329
|
+
let metadata: ArchiveMetadata | null = null
|
|
330
|
+
|
|
331
|
+
try {
|
|
332
|
+
const months = await readdir(archiveBase)
|
|
333
|
+
for (const month of months) {
|
|
334
|
+
const potentialPath = join(archiveBase, month, specId)
|
|
335
|
+
if (await pathExists(potentialPath)) {
|
|
336
|
+
archivePath = potentialPath
|
|
337
|
+
// Read metadata
|
|
338
|
+
const metadataPath = join(potentialPath, METADATA_FILE)
|
|
339
|
+
if (await pathExists(metadataPath)) {
|
|
340
|
+
const metadataContent = await readFile(metadataPath, 'utf-8')
|
|
341
|
+
metadata = JSON.parse(metadataContent) as ArchiveMetadata
|
|
342
|
+
}
|
|
343
|
+
break
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
} catch (error) {
|
|
347
|
+
return {
|
|
348
|
+
success: false,
|
|
349
|
+
specId,
|
|
350
|
+
error: `Failed to search archive: ${error instanceof Error ? error.message : String(error)}`,
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (!archivePath) {
|
|
355
|
+
return {
|
|
356
|
+
success: false,
|
|
357
|
+
specId,
|
|
358
|
+
error: `SPEC ${specId} not found in archive`,
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Check if restore destination already exists
|
|
363
|
+
if (existsSync(restorePath)) {
|
|
364
|
+
return {
|
|
365
|
+
success: false,
|
|
366
|
+
specId,
|
|
367
|
+
error: `Restore destination already exists: ${relativeRestorePath}`,
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Track operations for rollback
|
|
372
|
+
let directoryMoved = false
|
|
373
|
+
let metadataRemoved = false
|
|
374
|
+
let databaseUpdated = false
|
|
375
|
+
const previousDbStatus = 'archived'
|
|
376
|
+
const originalArchivePath = archivePath
|
|
377
|
+
|
|
378
|
+
const rollback = async () => {
|
|
379
|
+
// Rollback in reverse order
|
|
380
|
+
if (databaseUpdated) {
|
|
381
|
+
try {
|
|
382
|
+
sqlite
|
|
383
|
+
.prepare(`UPDATE changes SET status = ?, updated_at = ? WHERE id = ?`)
|
|
384
|
+
.run(previousDbStatus, Date.now(), specId)
|
|
385
|
+
console.log('[Archive] Rolled back database status')
|
|
386
|
+
} catch (err) {
|
|
387
|
+
console.error('[Archive] Failed to rollback database:', err)
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (directoryMoved) {
|
|
392
|
+
try {
|
|
393
|
+
// Move back to archive
|
|
394
|
+
await moveDirectory(restorePath, originalArchivePath)
|
|
395
|
+
console.log('[Archive] Moved directory back to archive')
|
|
396
|
+
} catch (err) {
|
|
397
|
+
console.error('[Archive] Failed to move directory back:', err)
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Note: We don't restore metadata file since we only remove it after successful restore
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
try {
|
|
405
|
+
return await withAtomicOperation(
|
|
406
|
+
async () => {
|
|
407
|
+
// Get status to restore from metadata or default to 'active'
|
|
408
|
+
const statusToRestore = metadata?.originalStatus || 'active'
|
|
409
|
+
|
|
410
|
+
// Step 1: Remove metadata file before moving (it's archive-specific)
|
|
411
|
+
const metadataPath = join(archivePath!, METADATA_FILE)
|
|
412
|
+
if (await pathExists(metadataPath)) {
|
|
413
|
+
await rm(metadataPath)
|
|
414
|
+
metadataRemoved = true
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// Step 2: Move directory back to specs
|
|
418
|
+
await moveDirectory(archivePath!, restorePath)
|
|
419
|
+
directoryMoved = true
|
|
420
|
+
|
|
421
|
+
// Clean up empty month directory
|
|
422
|
+
const monthDir = dirname(archivePath!)
|
|
423
|
+
try {
|
|
424
|
+
const monthContents = await readdir(monthDir)
|
|
425
|
+
if (monthContents.length === 0) {
|
|
426
|
+
await rm(monthDir, { recursive: true })
|
|
427
|
+
}
|
|
428
|
+
} catch {
|
|
429
|
+
// Ignore cleanup errors
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// Step 3: Update database status
|
|
433
|
+
const now = Date.now()
|
|
434
|
+
sqlite
|
|
435
|
+
.prepare(
|
|
436
|
+
`UPDATE changes SET status = ?, updated_at = ? WHERE id = ?`
|
|
437
|
+
)
|
|
438
|
+
.run(statusToRestore, now, specId)
|
|
439
|
+
databaseUpdated = true
|
|
440
|
+
|
|
441
|
+
// Also restore tasks associated with this SPEC
|
|
442
|
+
sqlite
|
|
443
|
+
.prepare(
|
|
444
|
+
`UPDATE tasks SET status = 'todo', archived_at = NULL, updated_at = ? WHERE change_id = ? AND status = 'archived'`
|
|
445
|
+
)
|
|
446
|
+
.run(now, specId)
|
|
447
|
+
|
|
448
|
+
console.log(`[Archive] Successfully restored ${specId} to ${relativeRestorePath}`)
|
|
449
|
+
|
|
450
|
+
return {
|
|
451
|
+
success: true,
|
|
452
|
+
specId,
|
|
453
|
+
restoredTo: relativeRestorePath,
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
rollback
|
|
457
|
+
)
|
|
458
|
+
} catch (error) {
|
|
459
|
+
return {
|
|
460
|
+
success: false,
|
|
461
|
+
specId,
|
|
462
|
+
error: error instanceof Error ? error.message : String(error),
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* List all archived SPECs
|
|
469
|
+
*
|
|
470
|
+
* @param projectPath - Path to the project root
|
|
471
|
+
* @returns Array of archived SPEC summaries
|
|
472
|
+
*/
|
|
473
|
+
export async function listArchivedSpecs(
|
|
474
|
+
projectPath: string
|
|
475
|
+
): Promise<ArchivedSpecSummary[]> {
|
|
476
|
+
const archiveBase = join(projectPath, ARCHIVE_DIR)
|
|
477
|
+
const archivedSpecs: ArchivedSpecSummary[] = []
|
|
478
|
+
|
|
479
|
+
if (!existsSync(archiveBase)) {
|
|
480
|
+
return archivedSpecs
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
try {
|
|
484
|
+
const months = await readdir(archiveBase)
|
|
485
|
+
|
|
486
|
+
for (const month of months) {
|
|
487
|
+
const monthPath = join(archiveBase, month)
|
|
488
|
+
const monthStat = await stat(monthPath)
|
|
489
|
+
|
|
490
|
+
if (!monthStat.isDirectory()) continue
|
|
491
|
+
|
|
492
|
+
const specs = await readdir(monthPath)
|
|
493
|
+
|
|
494
|
+
for (const specId of specs) {
|
|
495
|
+
if (!specId.startsWith('SPEC-')) continue
|
|
496
|
+
|
|
497
|
+
const specPath = join(monthPath, specId)
|
|
498
|
+
const specStat = await stat(specPath)
|
|
499
|
+
|
|
500
|
+
if (!specStat.isDirectory()) continue
|
|
501
|
+
|
|
502
|
+
// Read metadata
|
|
503
|
+
const metadataPath = join(specPath, METADATA_FILE)
|
|
504
|
+
let metadata: ArchiveMetadata | null = null
|
|
505
|
+
|
|
506
|
+
if (await pathExists(metadataPath)) {
|
|
507
|
+
try {
|
|
508
|
+
const content = await readFile(metadataPath, 'utf-8')
|
|
509
|
+
metadata = JSON.parse(content) as ArchiveMetadata
|
|
510
|
+
} catch {
|
|
511
|
+
// Use defaults if metadata can't be read
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
archivedSpecs.push({
|
|
516
|
+
specId,
|
|
517
|
+
title: metadata?.title || specId,
|
|
518
|
+
archivedAt: metadata?.archivedAt || specStat.mtime.toISOString(),
|
|
519
|
+
archivedBy: metadata?.archivedBy || 'unknown',
|
|
520
|
+
reason: metadata?.reason || 'manual',
|
|
521
|
+
originalStatus: metadata?.originalStatus || 'active',
|
|
522
|
+
archivePath: `${ARCHIVE_DIR}/${month}/${specId}`,
|
|
523
|
+
})
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// Sort by archived date, newest first
|
|
528
|
+
archivedSpecs.sort(
|
|
529
|
+
(a, b) => new Date(b.archivedAt).getTime() - new Date(a.archivedAt).getTime()
|
|
530
|
+
)
|
|
531
|
+
} catch (error) {
|
|
532
|
+
console.error('[Archive] Failed to list archived specs:', error)
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
return archivedSpecs
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Get archive metadata for a specific SPEC
|
|
540
|
+
*
|
|
541
|
+
* @param specId - The SPEC ID to get metadata for
|
|
542
|
+
* @param projectPath - Path to the project root
|
|
543
|
+
* @returns Archive metadata or null if not found
|
|
544
|
+
*/
|
|
545
|
+
export async function getArchiveMetadata(
|
|
546
|
+
specId: string,
|
|
547
|
+
projectPath: string
|
|
548
|
+
): Promise<ArchiveMetadata | null> {
|
|
549
|
+
const archiveBase = join(projectPath, ARCHIVE_DIR)
|
|
550
|
+
|
|
551
|
+
if (!existsSync(archiveBase)) {
|
|
552
|
+
return null
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
try {
|
|
556
|
+
const months = await readdir(archiveBase)
|
|
557
|
+
|
|
558
|
+
for (const month of months) {
|
|
559
|
+
const metadataPath = join(archiveBase, month, specId, METADATA_FILE)
|
|
560
|
+
|
|
561
|
+
if (await pathExists(metadataPath)) {
|
|
562
|
+
const content = await readFile(metadataPath, 'utf-8')
|
|
563
|
+
return JSON.parse(content) as ArchiveMetadata
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
} catch (error) {
|
|
567
|
+
console.error('[Archive] Failed to get archive metadata:', error)
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
return null
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Check if a SPEC is archived
|
|
575
|
+
*
|
|
576
|
+
* @param specId - The SPEC ID to check
|
|
577
|
+
* @param projectPath - Path to the project root
|
|
578
|
+
* @returns True if the SPEC is archived
|
|
579
|
+
*/
|
|
580
|
+
export async function isSpecArchived(
|
|
581
|
+
specId: string,
|
|
582
|
+
projectPath: string
|
|
583
|
+
): Promise<boolean> {
|
|
584
|
+
const archiveBase = join(projectPath, ARCHIVE_DIR)
|
|
585
|
+
|
|
586
|
+
if (!existsSync(archiveBase)) {
|
|
587
|
+
return false
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
try {
|
|
591
|
+
const months = await readdir(archiveBase)
|
|
592
|
+
|
|
593
|
+
for (const month of months) {
|
|
594
|
+
const specPath = join(archiveBase, month, specId)
|
|
595
|
+
if (await pathExists(specPath)) {
|
|
596
|
+
return true
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
} catch {
|
|
600
|
+
// Ignore errors
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
return false
|
|
604
|
+
}
|