+
+
🗄
+
+
Step 3 of 4
+
Select Source Repository
+
+ Double-click (or click) a repository to select it and proceed to configuration.
+
+
+
+
+
+
+
+ Filter:
+
+ ✕
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
{{ repo.fullName }}
+
{{ repo.provider }}
+
{{ formatDate(repo.updatedAt) }}
+
+
+
+
+ Loading…
+
+
+
+
+
+ Loading repositories…
+
+
+
+ No repositories found.
+
+
+
+
+
+ {{ store.filtered.length }} item(s)
+
+
+
+
+
diff --git a/frontend/src/pages/WelcomePage.vue b/frontend/src/pages/WelcomePage.vue
new file mode 100644
index 0000000..dea5482
--- /dev/null
+++ b/frontend/src/pages/WelcomePage.vue
@@ -0,0 +1,163 @@
+
+
+
+
⎇
+
+
Step 1 of 4
+
Welcome to git-extract Setup
+
+ This wizard will guide you through extracting a subdirectory from any Git repository
+ while preserving its full commit history.
+
+
+
+
+
+
+
+
What does git-extract do?
+
+ git-extract splits a subdirectory out of a Git repository into a
+ brand-new repository — keeping the complete commit history for every file
+ in that path. No manual rebasing, no lost commits, no need to install anything locally.
+
+
+
+
+
+
+
1
+
+
Welcome
+
You are here. Read this overview, then click Next > .
+
+
+
+
2
+
+
Sign In
+
Connect your GitHub or GitLab account.
+
+
+
+
3
+
+
Select Repository
+
Pick the repository that contains the path you want to extract.
+
+
+
+
4
+
+
Configure & Extract
+
+ Choose the source folder, target repository and branch, then click
+ Extract & Push . A GitHub Actions job rewrites history and
+ pushes the result automatically.
+
+
+
+
+
+
+ To continue, click Next > below.
+
+
+
+
+
+
+
+
diff --git a/frontend/src/router/routes.js b/frontend/src/router/routes.js
index 91043bb..b47c975 100644
--- a/frontend/src/router/routes.js
+++ b/frontend/src/router/routes.js
@@ -1,14 +1,20 @@
const routes = [
{
path: '/',
- component: () => import('layouts/MainLayout.vue'),
+ component: () => import('layouts/WizardLayout.vue'),
children: [
- { path: '', redirect: '/repos' },
- { path: '/login', component: () => import('pages/LoginPage.vue') },
+ { path: '', redirect: '/welcome' },
+ { path: '/welcome', component: () => import('pages/WelcomePage.vue') },
+ { path: '/login', component: () => import('pages/LoginPage.vue') },
{ path: '/auth/github', component: () => import('pages/AuthCallback.vue') },
{ path: '/auth/gitlab', component: () => import('pages/AuthCallback.vue') },
{ path: '/repos', component: () => import('pages/ReposPage.vue'), meta: { requiresAuth: true } },
- { path: '/extract', component: () => import('pages/ExtractPage.vue'), meta: { requiresAuth: true } },
+ // /extract → always land on the first extract sub-step
+ { path: '/extract', redirect: '/extract/paths' },
+ { path: '/extract/paths', component: () => import('pages/ExtractPathsPage.vue'), meta: { requiresAuth: true } },
+ { path: '/extract/options', component: () => import('pages/ExtractOptionsPage.vue'), meta: { requiresAuth: true } },
+ { path: '/extract/progress', component: () => import('pages/ExtractProgressPage.vue'), meta: { requiresAuth: true } },
+ { path: '/extract/finish', component: () => import('pages/ExtractFinishPage.vue'), meta: { requiresAuth: true } },
],
},
{ path: '/:catchAll(.*)*', component: () => import('pages/ErrorNotFound.vue') },
diff --git a/frontend/src/stores/repos.js b/frontend/src/stores/repos.js
index 67309b4..5a0107a 100644
--- a/frontend/src/stores/repos.js
+++ b/frontend/src/stores/repos.js
@@ -12,9 +12,18 @@ export const useReposStore = defineStore('repos', () => {
const search = ref('')
const selectedSource = ref(null)
const selectedTarget = ref(null)
- const sourceTree = ref([])
- const sourcePath = ref('')
- const targetPath = ref('src')
+ const sourceTree = ref([])
+ const sourcePath = ref('')
+ const sourceBranch = ref('')
+ const sourceBranches = ref([])
+ const targetPath = ref('src')
+ const targetBranch = ref('')
+ const targetBranches = ref([])
+ const generateProjectFile = ref(false)
+ const extractRunId = ref('')
+ const extractRunUrl = ref('')
+ const extractStatus = ref(null) // null | 'running' | 'done' | 'error'
+ const extractResult = ref(null)
const filtered = computed(() =>
search.value
@@ -91,7 +100,16 @@ export const useReposStore = defineStore('repos', () => {
selectedTarget,
sourceTree,
sourcePath,
+ sourceBranch,
+ sourceBranches,
targetPath,
+ targetBranch,
+ targetBranches,
+ generateProjectFile,
+ extractRunId,
+ extractRunUrl,
+ extractStatus,
+ extractResult,
filtered,
loadRepos,
loadMore,