feat(ext/setup): vault-presence probe helper

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
adlee-was-taken
2026-04-27 18:12:04 -04:00
parent 19bb5b5293
commit 8e72ed8714
2 changed files with 72 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
import { describe, expect, it, vi } from 'vitest';
import { probeVault } from '../probe';
import type { GitHost } from '../../service-worker/git-host';
function fakeHost(opts: {
relicarioFiles?: string[];
rootFiles?: string[];
commit?: { sha: string; author: string; date: string } | null;
} = {}): GitHost {
return {
listDir: vi.fn().mockImplementation(async (p: string) => {
if (p === '.relicario') return opts.relicarioFiles ?? [];
if (p === '') return opts.rootFiles ?? [];
return [];
}),
lastCommit: vi.fn().mockResolvedValue(opts.commit ?? null),
readFile: vi.fn(), writeFile: vi.fn(), writeFileCreateOnly: vi.fn(),
deleteFile: vi.fn(), putBlob: vi.fn(), getBlob: vi.fn(), deleteBlob: vi.fn(),
};
}
describe('probeVault', () => {
it('reports exists=false when repo is empty', async () => {
const host = fakeHost();
expect(await probeVault(host)).toEqual({ exists: false });
});
it('reports exists=true when manifest.enc is present', async () => {
const host = fakeHost({
rootFiles: ['manifest.enc', 'README.md'],
commit: { sha: 'abc1234', author: 'Alice', date: '2026-04-20T12:00:00Z' },
});
const result = await probeVault(host);
expect(result.exists).toBe(true);
expect(result.lastCommit?.author).toBe('Alice');
});
it('reports exists=true when only .relicario/salt is present (partial init)', async () => {
const host = fakeHost({ relicarioFiles: ['salt'] });
expect((await probeVault(host)).exists).toBe(true);
});
it('omits lastCommit field when API returns null', async () => {
const host = fakeHost({ rootFiles: ['manifest.enc'], commit: null });
const result = await probeVault(host);
expect(result.exists).toBe(true);
expect(result.lastCommit).toBeUndefined();
});
});

View File

@@ -0,0 +1,23 @@
import type { GitHost } from '../service-worker/git-host';
export interface VaultProbe {
exists: boolean;
lastCommit?: { sha: string; author: string; date: string };
}
/// Detect whether the configured remote already contains a relicario vault.
/// Considered present if any of: .relicario/salt, .relicario/params.json,
/// manifest.enc exists. Best-effort metadata fetch via lastCommit().
export async function probeVault(host: GitHost): Promise<VaultProbe> {
const [relicarioFiles, rootFiles] = await Promise.all([
host.listDir('.relicario'),
host.listDir(''),
]);
const exists =
relicarioFiles.includes('salt') ||
relicarioFiles.includes('params.json') ||
rootFiles.includes('manifest.enc');
if (!exists) return { exists: false };
const lastCommit = await host.lastCommit('manifest.enc');
return lastCommit ? { exists, lastCommit } : { exists };
}