feat: l'IDE devient la vue par défaut + deep-link worktree unifié
Route / redirige vers /ide ; le dashboard passe à /dashboard (nom inchangé). /workspace/:repoId/:wt rend désormais l'IDE (IdeShell) : au montage il décode la clé, active et déplie le worktree ciblé, ouvre ?file= le cas échéant. WorkspaceView et useWorkspaceLayout retirés. encode/decodeWtKey déplacés dans @arboretum/shared (source unique) avec décodeur TOLÉRANT (base64url OU chemin percent-encodé), corrigeant la divergence historique du deep-link VS Code. config.ts de l'extension aligné sur encodeWtKey. Tests wt-key (shared) + config (vscode) mis à jour. 431 tests.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
// Lecture des réglages `arboretum.*` : module pur (aucun import vscode) pour rester testable.
|
||||
// L'extension fournit un `ConfigSnapshot` lu depuis workspace.getConfiguration ; ce module
|
||||
// normalise/dérive les valeurs (notamment l'URL WebSocket à partir de l'URL HTTP).
|
||||
import { encodeWtKey } from '@arboretum/shared';
|
||||
|
||||
export interface ConfigSnapshot {
|
||||
url: string;
|
||||
@@ -23,9 +24,10 @@ export function wsUrlFromBase(baseUrl: string): string {
|
||||
|
||||
/**
|
||||
* Construit l'URL de la vue IDE web d'un worktree : deep-link vers la route `/workspace/:repoId/:wt`
|
||||
* (le routeur web est en history mode). `repoId` et le chemin du worktree sont encodés par segment.
|
||||
* (le routeur web est en history mode). Le chemin du worktree est encodé en base64url via la source
|
||||
* partagée `encodeWtKey` (exactement comme le front), pour un décodage cohérent des deux côtés.
|
||||
*/
|
||||
export function workspaceUrl(baseUrl: string, repoId: string, worktreePath: string): string {
|
||||
const base = normalizeBaseUrl(baseUrl);
|
||||
return `${base}/workspace/${encodeURIComponent(repoId)}/${encodeURIComponent(worktreePath)}`;
|
||||
return `${base}/workspace/${encodeURIComponent(repoId)}/${encodeWtKey(worktreePath)}`;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { encodeWtKey, decodeWtKey } from '@arboretum/shared';
|
||||
import { normalizeBaseUrl, workspaceUrl, wsUrlFromBase } from '../src/config.js';
|
||||
|
||||
describe('config', () => {
|
||||
@@ -13,10 +14,12 @@ describe('config', () => {
|
||||
expect(wsUrlFromBase('https://box.ts.net')).toBe('wss://box.ts.net/ws');
|
||||
});
|
||||
|
||||
it('construit l’URL de la vue IDE web (workspaceUrl, encodage par segment)', () => {
|
||||
expect(workspaceUrl('http://127.0.0.1:7317', 'repo id', '/home/user/wt')).toBe(
|
||||
'http://127.0.0.1:7317/workspace/repo%20id/%2Fhome%2Fuser%2Fwt',
|
||||
);
|
||||
expect(workspaceUrl('https://box.ts.net/', 'r', '/a/b')).toBe('https://box.ts.net/workspace/r/%2Fa%2Fb');
|
||||
it('construit l’URL de la vue IDE web (workspaceUrl : repoId par segment, worktree en base64url)', () => {
|
||||
const url = workspaceUrl('http://127.0.0.1:7317', 'repo id', '/home/user/wt');
|
||||
expect(url).toBe(`http://127.0.0.1:7317/workspace/repo%20id/${encodeWtKey('/home/user/wt')}`);
|
||||
// le segment worktree est décodable par la source partagée (cohérence avec le front).
|
||||
const seg = url.split('/').pop() as string;
|
||||
expect(decodeWtKey(seg)).toBe('/home/user/wt');
|
||||
expect(seg).not.toMatch(/[%+/=]/);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user