diff --git a/hub/deploy/build_legacy_project_manifest.mjs b/hub/deploy/build_legacy_project_manifest.mjs index 8e75e52..fd25fac 100644 --- a/hub/deploy/build_legacy_project_manifest.mjs +++ b/hub/deploy/build_legacy_project_manifest.mjs @@ -49,7 +49,10 @@ async function findProjectFiles(directory) { for (const entry of entries) { if (entry.name === ".trash") continue; const path = resolve(directory, entry.name); - if (entry.isSymbolicLink()) throw new Error(`legacy manifest rejects symbolic link: ${path}`); + if (entry.isSymbolicLink()) { + process.stderr.write(`[legacy-manifest] skip untracked symbolic link: ${path}\n`); + continue; + } if (entry.isDirectory()) found.push(...await findProjectFiles(path)); } return found; diff --git a/hub/package-lock.json b/hub/package-lock.json index a4fa16d..b837452 100644 --- a/hub/package-lock.json +++ b/hub/package-lock.json @@ -1,12 +1,12 @@ { "name": "@paradigm/hub", - "version": "0.0.21", + "version": "0.0.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@paradigm/hub", - "version": "0.0.21", + "version": "0.0.22", "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.3.202", "@fastify/cookie": "^11.0.2", diff --git a/hub/package.json b/hub/package.json index 5bc329c..d7ec14a 100644 --- a/hub/package.json +++ b/hub/package.json @@ -1,6 +1,6 @@ { "name": "@paradigm/hub", - "version": "0.0.21", + "version": "0.0.22", "private": true, "type": "module", "engines": { diff --git a/hub/test/unit/legacy-project-manifest.test.ts b/hub/test/unit/legacy-project-manifest.test.ts index f2b29b9..9529cb1 100644 --- a/hub/test/unit/legacy-project-manifest.test.ts +++ b/hub/test/unit/legacy-project-manifest.test.ts @@ -48,14 +48,16 @@ describe("legacy project manifest builder", () => { }]); }); - it("rejects symlinked entries instead of silently omitting them", async () => { + it("reports untracked symlinked entries instead of silently omitting them", async () => { const root = await mkdtemp(join(tmpdir(), "cph-legacy-manifest-link-")); temporaryRoots.push(root); await symlink("/tmp", join(root, "linked-project")); - await expect(execute(process.execPath, [ + const result = await execute(process.execPath, [ resolve("deploy/build_legacy_project_manifest.mjs"), root, - ])).rejects.toMatchObject({ stderr: expect.stringContaining("rejects symbolic link") }); + ]); + expect(result.stderr).toContain("skip untracked symbolic link"); + expect(JSON.parse(result.stdout)).toEqual([]); }); });