Vue racine consolidée : repos → worktrees avec état git ET état de session corrélé. Complète le MVP (P2 découverte/reprise + P3-A worktrees + P3-B états fins). - web/lib/ws-client: abonnement multi-topics (sessions + worktrees), subscribeWorktrees. - web/stores/worktrees: repos + worktrees, CRUD, temps réel (repo_update/worktree_*). - web/views/DashboardView (route racine /), components RepoSection + WorktreeCard ; SessionStateBadge réutilisé pour l'état des sessions corrélées. - router: / = dashboard, /sessions = liste à plat (sessions hors worktree), nav croisée. - i18n EN/FR (dashboard/repos/worktrees). - fix: @xterm/headless est CommonJS → chargé via createRequire (l'import nommé ESM échouait sous Node natif, masqué par esbuild en test) ; détecté par l'acceptation. - scripts/acceptance-p3.mjs: repo git tmp → enregistrement, worktree + hook, broadcast WS worktree_update, corrélation session bash, suppression (409 sans force, 200 avec). Vérifs : typecheck, 159 tests, build (vue-tsc), acceptations P1/P2/P3 ALL GREEN. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
22 lines
1.0 KiB
TypeScript
22 lines
1.0 KiB
TypeScript
import { createRouter, createWebHistory } from 'vue-router';
|
|
import { useAuthStore } from '../stores/auth';
|
|
|
|
export const router = createRouter({
|
|
history: createWebHistory(),
|
|
routes: [
|
|
{ path: '/login', name: 'login', component: () => import('../views/LoginView.vue') },
|
|
{ path: '/', name: 'dashboard', component: () => import('../views/DashboardView.vue') },
|
|
{ path: '/sessions', name: 'sessions', component: () => import('../views/SessionsListView.vue') },
|
|
{ path: '/sessions/:id', name: 'session', component: () => import('../views/SessionView.vue') },
|
|
{ path: '/:pathMatch(.*)*', redirect: '/' },
|
|
],
|
|
});
|
|
|
|
// Garde globale : tout sauf /login exige une session valide (GET /api/v1/auth/me, 401 → /login)
|
|
router.beforeEach(async (to) => {
|
|
const auth = useAuthStore();
|
|
if (auth.authenticated === null) await auth.check();
|
|
if (to.name === 'login') return auth.authenticated ? { name: 'dashboard' } : true;
|
|
return auth.authenticated ? true : { name: 'login', query: { redirect: to.fullPath } };
|
|
});
|