- Rename all user-facing and technical identifiers from OpenPets/Pet to FamiliarOS/Familiar. - Rename packages from @open-pets/* to @familiaros/*; rename install-pet/pet-format packages. - Rename plugin IDs and directories from openpets.* to familiaros.*. - Rename IPC namespace from openpets:* to familiaros:* and state filenames from openpets-* to familiaros-* with legacy migration. - Rename source files (pet-window, built-in-pet, default-pet-controller, etc.) to familiar equivalents. - Update locales (en, es-419, ja, ko, pt-BR, zh-Hans, zh-Hant) and tray/pet context menu strings. - Add Familiar naming feature: preference, settings input, tray menu display. - Update assets and packaging config; all desktop tests pass.
60 lines
3 KiB
TypeScript
60 lines
3 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { tmpdir } from "node:os";
|
|
|
|
import { mapAsarPathToUnpacked } from "@familiaros/claude";
|
|
import { doctorOpenCodeGlobalSetup, parseOpenCodeConfig, prepareOpenCodeGlobalRemove, prepareOpenCodeGlobalSetup, writePreparedOpenCodeGlobalRemove, writePreparedOpenCodeGlobalSetup } from "@familiaros/opencode";
|
|
|
|
const root = mkdtempSync(join(tmpdir(), "familiaros-desktop-opencode-"));
|
|
|
|
try {
|
|
const globalDir = join(root, "opencode-global");
|
|
const bundledCli = mapAsarPathToUnpacked(join(root, "FamiliarOS.app", "Contents", "Resources", "app.asar", "node_modules", "@familiaros", "cli", "dist", "index.js"));
|
|
|
|
assert.equal(doctorOpenCodeGlobalSetup(globalDir).status, "not_installed");
|
|
|
|
const install = prepareOpenCodeGlobalSetup({
|
|
configDir: globalDir,
|
|
petId: "fixer",
|
|
cliVersion: "1.2.3",
|
|
pluginVersion: "4.5.6",
|
|
commandMode: "bundled",
|
|
cliEntryPath: bundledCli,
|
|
});
|
|
|
|
assert.equal(install.configPath, join(globalDir, "opencode.jsonc"));
|
|
assert.equal(install.instructionPath, join(globalDir, "familiaros.md"));
|
|
assert.match(install.configWrite.content, /app\.asar\.unpacked/);
|
|
assert.doesNotMatch(install.configWrite.content, /app\.asar(?!\.unpacked)/);
|
|
assert.match(install.configWrite.content, /@familiaros\/opencode@4\.5\.6/);
|
|
|
|
const preview = parseOpenCodeConfig(install.configWrite.content);
|
|
assert.equal(preview.ok, true, "desktop OpenCode preview must parse as JSONC without JSON.parse.");
|
|
const previewConfig = preview.value as { readonly mcp?: { readonly familiaros?: { readonly command?: readonly string[] } }; readonly plugin?: readonly unknown[] };
|
|
assert.deepEqual(previewConfig.mcp?.familiaros?.command, ["node", bundledCli, "mcp", "--familiar", "fixer"]);
|
|
assert.deepEqual(previewConfig.plugin, [["@familiaros/opencode@4.5.6", { familiar: "fixer" }]]);
|
|
|
|
writePreparedOpenCodeGlobalSetup(install);
|
|
assert.equal(doctorOpenCodeGlobalSetup(globalDir).status, "installed");
|
|
assert.match(readFileSync(join(globalDir, "familiaros.md"), "utf8"), /FAMILIAROS:START/);
|
|
|
|
const remove = prepareOpenCodeGlobalRemove(globalDir);
|
|
assert.equal(remove.configWrites.length, 1);
|
|
writePreparedOpenCodeGlobalRemove(remove);
|
|
assert.equal(doctorOpenCodeGlobalSetup(globalDir).status, "not_installed");
|
|
|
|
const commentedGlobalDir = join(root, "commented-global");
|
|
mkdirSync(commentedGlobalDir);
|
|
writeFileSync(join(commentedGlobalDir, "opencode.jsonc"), `{
|
|
// user comment must not block desktop preview planning
|
|
"theme": "dark"
|
|
}\n`, "utf8");
|
|
const commented = prepareOpenCodeGlobalSetup({ configDir: commentedGlobalDir, petId: "fixer", cliVersion: "1.2.3", pluginVersion: "4.5.6" });
|
|
assert.equal(parseOpenCodeConfig(commented.configWrite.content).ok, true);
|
|
assert.match(commented.configWrite.content, /user comment/);
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true });
|
|
}
|
|
|
|
console.error("OpenCode desktop setup validation passed.");
|