feat(vscode): statut git détaillé, sessions archivées, lien IDE web, fetch/pull (0.2.0)

Reflète la refonte IDE en supervision légère, sans dupliquer l'éditeur :
- statut git fin dans l'arbre (staged/unstaged/conflits + dernier commit) ;
- commande « Open Worktree IDE » → deep-link /workspace/:repoId/:wt ;
- commandes fetch / pull (ff-only|rebase) sur les worktrees ;
- event WS session_archived + réglage showArchivedSessions (badge + filtre).
README/CHANGELOG + tests (config/rest-client/ws-client).
This commit is contained in:
2026-06-27 16:04:28 +02:00
parent 8a8fac75e6
commit d4e3ab47cd
13 changed files with 198 additions and 10 deletions
+16 -3
View File
@@ -9,10 +9,12 @@ import type {
CreateSessionRequest,
CreateWorktreeRequest,
CreateWorktreeResponse,
FetchWorktreeRequest,
GroupSessionResponse,
GroupsListResponse,
MeResponse,
PromoteWorktreeRequest,
PullWorktreeRequest,
PushWorktreeRequest,
RepoBranchesResponse,
ReposListResponse,
@@ -93,6 +95,14 @@ export class RestClient {
return this.request<WorktreeResponse>('POST', `/api/v1/repos/${encodeURIComponent(repoId)}/worktrees/push`, body);
}
fetchWorktree(repoId: string, body: FetchWorktreeRequest): Promise<WorktreeResponse> {
return this.request<WorktreeResponse>('POST', `/api/v1/repos/${encodeURIComponent(repoId)}/worktrees/fetch`, body);
}
pullWorktree(repoId: string, body: PullWorktreeRequest): Promise<WorktreeResponse> {
return this.request<WorktreeResponse>('POST', `/api/v1/repos/${encodeURIComponent(repoId)}/worktrees/pull`, body);
}
promoteWorktree(repoId: string, body: PromoteWorktreeRequest): Promise<WorktreeResponse> {
return this.request<WorktreeResponse>('POST', `/api/v1/repos/${encodeURIComponent(repoId)}/worktrees/promote`, body);
}
@@ -106,9 +116,12 @@ export class RestClient {
return this.request<SessionResponse>('POST', '/api/v1/sessions', body);
}
listSessions(includeHidden = false): Promise<SessionsListResponse> {
const q = includeHidden ? '?includeHidden=true' : '';
return this.request<SessionsListResponse>('GET', `/api/v1/sessions${q}`);
listSessions(opts: { includeHidden?: boolean; includeArchived?: boolean } = {}): Promise<SessionsListResponse> {
const params = new URLSearchParams();
if (opts.includeHidden) params.set('includeHidden', 'true');
if (opts.includeArchived) params.set('includeArchived', 'true');
const q = params.toString();
return this.request<SessionsListResponse>('GET', `/api/v1/sessions${q ? `?${q}` : ''}`);
}
resumeSession(id: string): Promise<SessionResponse> {