Remove migrateStorageIfNeeded() which created symlinks from ~/.uncaged/workflow → ~/.uwf and ~/.uncaged/json-cas → ~/.ocas. This was temporary migration support. Users who still have old paths can run a one-time copy manually. Zero 'uncaged' references remain in active codebase.
This commit is contained in:
@@ -1,13 +1,7 @@
|
|||||||
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
||||||
import { lstat, mkdir, rm, writeFile } from "node:fs/promises";
|
|
||||||
import { homedir } from "node:os";
|
import { homedir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import {
|
import { getDefaultStorageRoot, getGlobalCasDir, resolveStorageRoot } from "../store.js";
|
||||||
getDefaultStorageRoot,
|
|
||||||
getGlobalCasDir,
|
|
||||||
migrateStorageIfNeeded,
|
|
||||||
resolveStorageRoot,
|
|
||||||
} from "../store.js";
|
|
||||||
|
|
||||||
describe("Storage root resolution", () => {
|
describe("Storage root resolution", () => {
|
||||||
const envKeys = ["UWF_STORAGE_ROOT", "WORKFLOW_STORAGE_ROOT", "OCAS_DIR"] as const;
|
const envKeys = ["UWF_STORAGE_ROOT", "WORKFLOW_STORAGE_ROOT", "OCAS_DIR"] as const;
|
||||||
@@ -55,48 +49,3 @@ describe("Storage root resolution", () => {
|
|||||||
expect(getGlobalCasDir()).toBe("/tmp/ocas-primary");
|
expect(getGlobalCasDir()).toBe("/tmp/ocas-primary");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("migrateStorageIfNeeded", () => {
|
|
||||||
let fakeHome: string;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
fakeHome = join(
|
|
||||||
homedir(),
|
|
||||||
`.uwf-migrate-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
||||||
);
|
|
||||||
await mkdir(fakeHome, { recursive: true });
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(async () => {
|
|
||||||
await rm(fakeHome, { recursive: true, force: true });
|
|
||||||
});
|
|
||||||
|
|
||||||
test("creates symlinks from legacy paths when new paths are missing", async () => {
|
|
||||||
const oldWorkflow = join(fakeHome, ".uncaged", "workflow");
|
|
||||||
const oldCas = join(fakeHome, ".uncaged", "json-cas");
|
|
||||||
await mkdir(oldWorkflow, { recursive: true });
|
|
||||||
await mkdir(oldCas, { recursive: true });
|
|
||||||
await writeFile(join(oldWorkflow, "config.yaml"), "defaultAgent: test\n", "utf8");
|
|
||||||
|
|
||||||
migrateStorageIfNeeded(fakeHome);
|
|
||||||
|
|
||||||
const newWorkflow = join(fakeHome, ".uwf");
|
|
||||||
const newCas = join(fakeHome, ".ocas");
|
|
||||||
const workflowStat = await lstat(newWorkflow);
|
|
||||||
const casStat = await lstat(newCas);
|
|
||||||
expect(workflowStat.isSymbolicLink()).toBe(true);
|
|
||||||
expect(casStat.isSymbolicLink()).toBe(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("skips migration when new paths already exist", async () => {
|
|
||||||
const oldWorkflow = join(fakeHome, ".uncaged", "workflow");
|
|
||||||
const newWorkflow = join(fakeHome, ".uwf");
|
|
||||||
await mkdir(oldWorkflow, { recursive: true });
|
|
||||||
await mkdir(newWorkflow, { recursive: true });
|
|
||||||
|
|
||||||
migrateStorageIfNeeded(fakeHome);
|
|
||||||
|
|
||||||
const stat = await lstat(newWorkflow);
|
|
||||||
expect(stat.isDirectory()).toBe(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -30,9 +30,7 @@ import {
|
|||||||
import { parseTimeInput } from "./commands/thread-time-parser.js";
|
import { parseTimeInput } from "./commands/thread-time-parser.js";
|
||||||
import { cmdWorkflowAdd, cmdWorkflowList, cmdWorkflowShow } from "./commands/workflow.js";
|
import { cmdWorkflowAdd, cmdWorkflowList, cmdWorkflowShow } from "./commands/workflow.js";
|
||||||
import { formatOutput, type OutputFormat } from "./format.js";
|
import { formatOutput, type OutputFormat } from "./format.js";
|
||||||
import { migrateStorageIfNeeded, resolveStorageRoot } from "./store.js";
|
import { resolveStorageRoot } from "./store.js";
|
||||||
|
|
||||||
migrateStorageIfNeeded();
|
|
||||||
|
|
||||||
function writeOutput(data: unknown): void {
|
function writeOutput(data: unknown): void {
|
||||||
const fmt = program.opts().format as OutputFormat;
|
const fmt = program.opts().format as OutputFormat;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import type { Dirent } from "node:fs";
|
import type { Dirent } from "node:fs";
|
||||||
import { existsSync, symlinkSync } from "node:fs";
|
import { existsSync } from "node:fs";
|
||||||
import { access, mkdir, readdir, readFile, rename } from "node:fs/promises";
|
import { access, mkdir, readdir, readFile, rename } from "node:fs/promises";
|
||||||
import { homedir } from "node:os";
|
import { homedir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
@@ -133,30 +133,6 @@ export function resolveStorageRoot(): string {
|
|||||||
return getDefaultStorageRoot();
|
return getDefaultStorageRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Symlink legacy storage paths to ~/.uwf and ~/.ocas when upgrading from older installs. */
|
|
||||||
export function migrateStorageIfNeeded(home: string = homedir()): void {
|
|
||||||
const oldPath = join(home, ".uncaged", "workflow");
|
|
||||||
const newPath = join(home, ".uwf");
|
|
||||||
|
|
||||||
if (!existsSync(newPath) && existsSync(oldPath)) {
|
|
||||||
symlinkSync(oldPath, newPath);
|
|
||||||
// biome-ignore lint/suspicious/noConsole: migration notice
|
|
||||||
console.log("⚠️ Storage linked: ~/.uwf → legacy workflow directory (symlink)");
|
|
||||||
// biome-ignore lint/suspicious/noConsole: migration notice
|
|
||||||
console.log(
|
|
||||||
" This symlink is temporary. Copy your data to ~/.uwf/ and remove the symlink in a future version.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const oldCas = join(home, ".uncaged", "json-cas");
|
|
||||||
const newCas = join(home, ".ocas");
|
|
||||||
if (!existsSync(newCas) && existsSync(oldCas)) {
|
|
||||||
symlinkSync(oldCas, newCas);
|
|
||||||
// biome-ignore lint/suspicious/noConsole: migration notice
|
|
||||||
console.log("⚠️ CAS storage linked: ~/.ocas → legacy CAS directory (symlink)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deprecated: Use `getGlobalCasDir()` instead.
|
* Deprecated: Use `getGlobalCasDir()` instead.
|
||||||
* Returns the old CAS directory for backward compatibility.
|
* Returns the old CAS directory for backward compatibility.
|
||||||
|
|||||||
Reference in New Issue
Block a user