Ajoute la notion de groupe — collection nommée de repos (membership légère persistée, many-to-many) — pour piloter plusieurs repos en simultané : - DB : migration #5 (tables groups + group_repos, FK ON DELETE CASCADE). - GroupManager (synchrone, EventEmitter) + routes REST /api/v1/groups ; ne persiste que la membership, worktrees/sessions filtrés par repoId côté client. - Protocole : GroupSummary, DTOs, topic WS « groups », events group_update/removed (additifs, PROTOCOL_VERSION inchangé). - Web : store groups, GroupsListView, GroupView (réutilise RepoSection), grille multi-terminaux (TerminalGrid/TerminalCell), action « feature cross-repo » (orchestration client, tolérante aux échecs partiels), routes + i18n EN/FR. - Tests : group-manager.test.ts + extension protocol.test.ts ; acceptance-p5.mjs.
167 lines
4.7 KiB
TypeScript
167 lines
4.7 KiB
TypeScript
export default {
|
|
common: {
|
|
appName: 'Arboretum',
|
|
loading: 'Loading…',
|
|
cancel: 'Cancel',
|
|
logout: 'Log out',
|
|
language: 'Language',
|
|
},
|
|
login: {
|
|
title: 'Sign in with your access token',
|
|
tokenLabel: 'Access token',
|
|
tokenPlaceholder: 'arb_…',
|
|
submit: 'Sign in',
|
|
submitting: 'Signing in…',
|
|
invalidToken: 'Invalid token',
|
|
rateLimited: 'Too many attempts — please wait before retrying',
|
|
genericError: 'Sign-in failed ({status})',
|
|
},
|
|
sessions: {
|
|
title: 'Sessions',
|
|
refresh: 'Refresh',
|
|
empty: 'No sessions yet — start one below.',
|
|
newSession: 'New session',
|
|
cwdLabel: 'Working directory',
|
|
cwdPlaceholder: '/absolute/path/to/project',
|
|
commandLabel: 'Command',
|
|
creating: 'Creating…',
|
|
open: 'Open',
|
|
observe: 'Observe',
|
|
view: 'View',
|
|
resume: 'Resume',
|
|
fork: 'Fork',
|
|
kill: 'Kill',
|
|
confirmKill: 'Confirm kill',
|
|
live: 'live',
|
|
resumable: 'resumable',
|
|
sourceDiscovered: 'discovered',
|
|
clients: 'no client | 1 client | {n} clients',
|
|
exitCode: 'exit code {code}',
|
|
statusLabel: {
|
|
starting: 'starting',
|
|
running: 'running',
|
|
exited: 'exited',
|
|
},
|
|
registryStatus: {
|
|
busy: 'busy',
|
|
idle: 'idle',
|
|
waiting: 'waiting',
|
|
},
|
|
dialog: {
|
|
waiting: 'Waiting for your input',
|
|
deny: 'Deny (Esc)',
|
|
kind: {
|
|
trust: 'Trust',
|
|
permission: 'Permission',
|
|
question: 'Question',
|
|
plan: 'Plan',
|
|
},
|
|
},
|
|
},
|
|
dashboard: {
|
|
title: 'Worktrees',
|
|
allSessions: 'All sessions',
|
|
groups: 'Groups',
|
|
},
|
|
groups: {
|
|
title: 'Groups',
|
|
new: 'New group',
|
|
create: 'Create',
|
|
creating: 'Creating…',
|
|
nameLabel: 'Group name',
|
|
namePlaceholder: 'e.g. Payments stack',
|
|
colorLabel: 'Color',
|
|
reposLabel: 'Repositories',
|
|
empty: 'No group yet — create one above.',
|
|
noRepos: 'No repository selected.',
|
|
noReposInGroup: 'No repository in this group yet — add some below.',
|
|
noReposRegistered: 'No repository registered yet — add some from the dashboard first.',
|
|
open: 'Open',
|
|
edit: 'Edit repositories',
|
|
editDone: 'Done',
|
|
remove: 'Delete',
|
|
confirmDelete: 'Confirm delete',
|
|
repoCount: 'no repo | 1 repo | {n} repos',
|
|
dashboard: 'Dashboard',
|
|
missingRepo: 'Repository unavailable',
|
|
removeFromGroup: 'Remove from group',
|
|
sessionsActive: 'no active session | 1 active session | {n} active sessions',
|
|
viewList: 'Repos',
|
|
viewGrid: 'Terminals',
|
|
gridEmpty: 'No active session in this group.',
|
|
gridCapped: 'Showing {shown} of {total} sessions — close some terminals to see the rest.',
|
|
newFeature: 'New cross-repo feature',
|
|
},
|
|
crossRepo: {
|
|
title: 'New cross-repo feature',
|
|
intro: 'Create the same worktree across the selected repos, in one action.',
|
|
branchLabel: 'Branch name',
|
|
branchPlaceholder: 'feature/…',
|
|
newBranch: 'create branch',
|
|
baseRefLabel: 'Base ref (optional)',
|
|
startLabel: 'Start session',
|
|
startNone: 'no session',
|
|
reposLabel: 'Apply to',
|
|
create: 'Create across {n} repos',
|
|
creating: 'Creating…',
|
|
retryFailed: 'Retry failed',
|
|
close: 'Close',
|
|
pending: 'pending…',
|
|
ok: 'created',
|
|
error: 'failed',
|
|
},
|
|
repos: {
|
|
add: 'Add repo',
|
|
adding: 'Adding…',
|
|
remove: 'Remove',
|
|
pathLabel: 'Repository path',
|
|
pathPlaceholder: '/absolute/path/to/repo',
|
|
empty: 'No repository registered yet — add one above.',
|
|
invalid: 'unavailable',
|
|
},
|
|
worktrees: {
|
|
new: 'New worktree',
|
|
create: 'Create',
|
|
creating: 'Creating…',
|
|
branch: 'Branch',
|
|
newBranch: 'create branch',
|
|
start: 'Start',
|
|
startNone: 'no session',
|
|
delete: 'Delete',
|
|
confirmDelete: 'Confirm delete',
|
|
forceDelete: 'Force delete',
|
|
prune: 'Prune',
|
|
main: 'main',
|
|
detached: 'detached',
|
|
locked: 'locked',
|
|
prunable: 'prunable',
|
|
clean: 'clean',
|
|
dirty: '{n} changed',
|
|
noSession: 'no session',
|
|
},
|
|
terminal: {
|
|
observer: 'observer (read-only)',
|
|
sessionEnded: 'Session ended',
|
|
back: 'Sessions',
|
|
notAttachable: 'This session runs outside Arboretum — fork it to interact, or resume it once it has stopped.',
|
|
},
|
|
push: {
|
|
enable: 'Enable notifications',
|
|
disable: 'Notifications on',
|
|
denied: 'Notification permission denied — enable it in your browser settings.',
|
|
unsupported: 'Push needs HTTPS (e.g. Tailscale Serve); on iOS, install the app to your home screen first.',
|
|
},
|
|
fs: {
|
|
browse: 'Browse…',
|
|
up: 'Up',
|
|
useFolder: 'Use this folder',
|
|
showHidden: 'Show hidden',
|
|
loading: 'Loading…',
|
|
empty: 'No subfolders',
|
|
repoBadge: 'repo',
|
|
},
|
|
ws: {
|
|
reconnecting: 'Connection lost — reconnecting…',
|
|
},
|
|
};
|