refactor: finish Aryx rebrand sweep

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
David Kaya
2026-03-26 00:17:14 +01:00
co-authored by Copilot
parent 1edd3aed55
commit 88030eb48d
11 changed files with 43 additions and 43 deletions
+3 -3
View File
@@ -20,15 +20,15 @@
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/davidkaya/eryx.git" "url": "git+https://github.com/davidkaya/aryx.git"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"bugs": { "bugs": {
"url": "https://github.com/davidkaya/eryx/issues" "url": "https://github.com/davidkaya/aryx/issues"
}, },
"homepage": "https://github.com/davidkaya/eryx#readme", "homepage": "https://github.com/davidkaya/aryx#readme",
"packageManager": "bun@1.3.6", "packageManager": "bun@1.3.6",
"devDependencies": { "devDependencies": {
"@lexical/headless": "0.42.0", "@lexical/headless": "0.42.0",
@@ -138,7 +138,7 @@ function isSidecarStoppedBeforeCompletionError(error: unknown): error is Error {
return error instanceof Error && error.message === SIDECAR_STOPPED_BEFORE_COMPLETION_MESSAGE; return error instanceof Error && error.message === SIDECAR_STOPPED_BEFORE_COMPLETION_MESSAGE;
} }
export class EryxAppService extends EventEmitter<AppServiceEvents> { export class AryxAppService extends EventEmitter<AppServiceEvents> {
private readonly workspaceRepository = new WorkspaceRepository(); private readonly workspaceRepository = new WorkspaceRepository();
private readonly sidecar = new SidecarClient(); private readonly sidecar = new SidecarClient();
private readonly secretStore = new SecretStore(); private readonly secretStore = new SecretStore();
+3 -3
View File
@@ -1,15 +1,15 @@
import { app, BrowserWindow } from 'electron'; import { app, BrowserWindow } from 'electron';
import { registerIpcHandlers } from '@main/ipc/registerIpcHandlers'; import { registerIpcHandlers } from '@main/ipc/registerIpcHandlers';
import { EryxAppService } from '@main/EryxAppService'; import { AryxAppService } from '@main/AryxAppService';
import { createMainWindow } from '@main/windows/createMainWindow'; import { createMainWindow } from '@main/windows/createMainWindow';
import { applyTitleBarTheme } from '@main/windows/titleBarTheme'; import { applyTitleBarTheme } from '@main/windows/titleBarTheme';
let mainWindow: BrowserWindow | undefined; let mainWindow: BrowserWindow | undefined;
let appService: EryxAppService | undefined; let appService: AryxAppService | undefined;
async function bootstrap(): Promise<void> { async function bootstrap(): Promise<void> {
appService = new EryxAppService(); appService = new AryxAppService();
mainWindow = createMainWindow(); mainWindow = createMainWindow();
registerIpcHandlers(mainWindow, appService); registerIpcHandlers(mainWindow, appService);
+2 -2
View File
@@ -24,10 +24,10 @@ import type {
import type { QuerySessionsInput } from '@shared/domain/sessionLibrary'; import type { QuerySessionsInput } from '@shared/domain/sessionLibrary';
import type { AppearanceTheme } from '@shared/domain/tooling'; import type { AppearanceTheme } from '@shared/domain/tooling';
import { EryxAppService } from '@main/EryxAppService'; import { AryxAppService } from '@main/AryxAppService';
import { applyTitleBarTheme } from '@main/windows/titleBarTheme'; import { applyTitleBarTheme } from '@main/windows/titleBarTheme';
export function registerIpcHandlers(window: BrowserWindow, service: EryxAppService): void { export function registerIpcHandlers(window: BrowserWindow, service: AryxAppService): void {
ipcMain.handle(ipcChannels.describeSidecarCapabilities, () => service.describeSidecarCapabilities()); ipcMain.handle(ipcChannels.describeSidecarCapabilities, () => service.describeSidecarCapabilities());
ipcMain.handle(ipcChannels.refreshSidecarCapabilities, () => service.refreshSidecarCapabilities()); ipcMain.handle(ipcChannels.refreshSidecarCapabilities, () => service.refreshSidecarCapabilities());
ipcMain.handle(ipcChannels.loadWorkspace, () => service.loadWorkspace()); ipcMain.handle(ipcChannels.loadWorkspace, () => service.loadWorkspace());
+2 -2
View File
@@ -6,10 +6,10 @@ describe('resolveWindowIconPath', () => {
test('uses the Windows ico asset from the platform-specific icon directory', () => { test('uses the Windows ico asset from the platform-specific icon directory', () => {
expect( expect(
resolveWindowIconPath({ resolveWindowIconPath({
appPath: 'C:\\workspace\\personal\\repositories\\eryx', appPath: 'C:\\workspace\\personal\\repositories\\aryx',
platform: 'win32', platform: 'win32',
}), }),
).toBe('C:\\workspace\\personal\\repositories\\eryx\\assets\\icons\\windows\\icon.ico'); ).toBe('C:\\workspace\\personal\\repositories\\aryx\\assets\\icons\\windows\\icon.ico');
}); });
test('uses the macOS icns asset on Darwin', () => { test('uses the macOS icns asset on Darwin', () => {
@@ -11,8 +11,8 @@ const TIMESTAMP = '2026-03-25T00:00:00.000Z';
mock.module('electron', () => ({ mock.module('electron', () => ({
app: { app: {
isPackaged: false, isPackaged: false,
getAppPath: () => 'C:\\workspace\\personal\\repositories\\eryx', getAppPath: () => 'C:\\workspace\\personal\\repositories\\aryx',
getPath: () => 'C:\\workspace\\personal\\repositories\\eryx\\tests\\fixtures', getPath: () => 'C:\\workspace\\personal\\repositories\\aryx\\tests\\fixtures',
}, },
dialog: { dialog: {
showOpenDialog: async () => ({ canceled: true, filePaths: [] }), showOpenDialog: async () => ({ canceled: true, filePaths: [] }),
@@ -30,7 +30,7 @@ mock.module('keytar', () => ({
}, },
})); }));
const { EryxAppService } = await import('@main/EryxAppService'); const { AryxAppService } = await import('@main/AryxAppService');
function createProject(overrides?: Partial<ProjectRecord>): ProjectRecord { function createProject(overrides?: Partial<ProjectRecord>): ProjectRecord {
return { return {
@@ -63,8 +63,8 @@ function createService(
options?: { options?: {
captureRunTurn?: (command: RunTurnCommand) => void; captureRunTurn?: (command: RunTurnCommand) => void;
}, },
): InstanceType<typeof EryxAppService> { ): InstanceType<typeof AryxAppService> {
const service = new EryxAppService(); const service = new AryxAppService();
const internals = service as unknown as Record<string, unknown>; const internals = service as unknown as Record<string, unknown>;
internals.loadWorkspace = async () => workspace; internals.loadWorkspace = async () => workspace;
internals.persistAndBroadcast = async (nextWorkspace: WorkspaceState) => nextWorkspace; internals.persistAndBroadcast = async (nextWorkspace: WorkspaceState) => nextWorkspace;
@@ -97,7 +97,7 @@ function createService(
return service; return service;
} }
describe('EryxAppService discovered tooling', () => { describe('AryxAppService discovered tooling', () => {
test('allows project-discovered MCP servers to be accepted and used in project sessions', async () => { test('allows project-discovered MCP servers to be accepted and used in project sessions', async () => {
const workspace = createWorkspaceSeed(); const workspace = createWorkspaceSeed();
const pattern = workspace.patterns.find((candidate) => candidate.mode === 'single'); const pattern = workspace.patterns.find((candidate) => candidate.mode === 'single');
@@ -5,8 +5,8 @@ import type { SidecarCapabilities } from '@shared/contracts/sidecar';
mock.module('electron', () => ({ mock.module('electron', () => ({
app: { app: {
isPackaged: false, isPackaged: false,
getAppPath: () => 'C:\\workspace\\personal\\repositories\\eryx', getAppPath: () => 'C:\\workspace\\personal\\repositories\\aryx',
getPath: () => 'C:\\workspace\\personal\\repositories\\eryx\\tests\\fixtures', getPath: () => 'C:\\workspace\\personal\\repositories\\aryx\\tests\\fixtures',
}, },
dialog: { dialog: {
showOpenDialog: async () => ({ canceled: true, filePaths: [] }), showOpenDialog: async () => ({ canceled: true, filePaths: [] }),
@@ -24,7 +24,7 @@ mock.module('keytar', () => ({
}, },
})); }));
const { EryxAppService } = await import('@main/EryxAppService'); const { AryxAppService } = await import('@main/AryxAppService');
const SIDECAR_STOPPED_BEFORE_COMPLETION_MESSAGE = const SIDECAR_STOPPED_BEFORE_COMPLETION_MESSAGE =
'The .NET sidecar was stopped before the command completed.'; 'The .NET sidecar was stopped before the command completed.';
@@ -49,7 +49,7 @@ const CAPABILITIES_FIXTURE: SidecarCapabilities = {
}; };
function setSidecar( function setSidecar(
service: InstanceType<typeof EryxAppService>, service: InstanceType<typeof AryxAppService>,
describeCapabilities: () => Promise<SidecarCapabilities>, describeCapabilities: () => Promise<SidecarCapabilities>,
): void { ): void {
( (
@@ -74,9 +74,9 @@ function createDeferred<T>() {
return { promise, resolve }; return { promise, resolve };
} }
describe('EryxAppService sidecar capabilities', () => { describe('AryxAppService sidecar capabilities', () => {
test('retries describe-capabilities after an intentional sidecar stop', async () => { test('retries describe-capabilities after an intentional sidecar stop', async () => {
const service = new EryxAppService(); const service = new AryxAppService();
let attempts = 0; let attempts = 0;
setSidecar(service, async () => { setSidecar(service, async () => {
@@ -93,7 +93,7 @@ describe('EryxAppService sidecar capabilities', () => {
}); });
test('coalesces concurrent capability requests while the cache is empty', async () => { test('coalesces concurrent capability requests while the cache is empty', async () => {
const service = new EryxAppService(); const service = new AryxAppService();
const deferred = createDeferred<SidecarCapabilities>(); const deferred = createDeferred<SidecarCapabilities>();
let calls = 0; let calls = 0;
+9 -9
View File
@@ -7,13 +7,13 @@ import type { SessionRecord } from '@shared/domain/session';
import { createWorkspaceSeed, type WorkspaceState } from '@shared/domain/workspace'; import { createWorkspaceSeed, type WorkspaceState } from '@shared/domain/workspace';
const TIMESTAMP = '2026-03-25T00:00:00.000Z'; const TIMESTAMP = '2026-03-25T00:00:00.000Z';
const SCRATCHPAD_PATH = 'C:\\workspace\\personal\\repositories\\eryx\\scratchpad'; const SCRATCHPAD_PATH = 'C:\\workspace\\personal\\repositories\\aryx\\scratchpad';
mock.module('electron', () => ({ mock.module('electron', () => ({
app: { app: {
isPackaged: false, isPackaged: false,
getAppPath: () => 'C:\\workspace\\personal\\repositories\\eryx', getAppPath: () => 'C:\\workspace\\personal\\repositories\\aryx',
getPath: () => 'C:\\workspace\\personal\\repositories\\eryx\\tests\\fixtures', getPath: () => 'C:\\workspace\\personal\\repositories\\aryx\\tests\\fixtures',
}, },
dialog: { dialog: {
showOpenDialog: async () => ({ canceled: true, filePaths: [] }), showOpenDialog: async () => ({ canceled: true, filePaths: [] }),
@@ -31,7 +31,7 @@ mock.module('keytar', () => ({
}, },
})); }));
const { EryxAppService } = await import('@main/EryxAppService'); const { AryxAppService } = await import('@main/AryxAppService');
function createWorkspaceFixture(): { function createWorkspaceFixture(): {
workspace: WorkspaceState; workspace: WorkspaceState;
@@ -70,7 +70,7 @@ function createWorkspaceFixture(): {
transport: 'local', transport: 'local',
command: 'node', command: 'node',
args: ['server.js', '--stdio'], args: ['server.js', '--stdio'],
cwd: 'C:\\workspace\\personal\\repositories\\eryx', cwd: 'C:\\workspace\\personal\\repositories\\aryx',
tools: ['git.status'], tools: ['git.status'],
timeoutMs: 1500, timeoutMs: 1500,
createdAt: TIMESTAMP, createdAt: TIMESTAMP,
@@ -101,8 +101,8 @@ function createService(
captureRunTurn?: (command: RunTurnCommand) => void; captureRunTurn?: (command: RunTurnCommand) => void;
knownApprovalToolNames?: string[]; knownApprovalToolNames?: string[];
}, },
): InstanceType<typeof EryxAppService> { ): InstanceType<typeof AryxAppService> {
const service = new EryxAppService(); const service = new AryxAppService();
const internals = service as unknown as Record<string, unknown>; const internals = service as unknown as Record<string, unknown>;
internals.loadWorkspace = async () => workspace; internals.loadWorkspace = async () => workspace;
internals.persistAndBroadcast = async (nextWorkspace: WorkspaceState) => nextWorkspace; internals.persistAndBroadcast = async (nextWorkspace: WorkspaceState) => nextWorkspace;
@@ -135,7 +135,7 @@ function createService(
return service; return service;
} }
describe('EryxAppService scratchpad tooling support', () => { describe('AryxAppService scratchpad tooling support', () => {
test('allows scratchpad sessions to save MCP and LSP selections', async () => { test('allows scratchpad sessions to save MCP and LSP selections', async () => {
const { workspace, pattern, session } = createWorkspaceFixture(); const { workspace, pattern, session } = createWorkspaceFixture();
const service = createService(workspace, pattern); const service = createService(workspace, pattern);
@@ -189,7 +189,7 @@ describe('EryxAppService scratchpad tooling support', () => {
transport: 'local', transport: 'local',
command: 'node', command: 'node',
args: ['server.js', '--stdio'], args: ['server.js', '--stdio'],
cwd: 'C:\\workspace\\personal\\repositories\\eryx', cwd: 'C:\\workspace\\personal\\repositories\\aryx',
tools: ['git.status'], tools: ['git.status'],
timeoutMs: 1500, timeoutMs: 1500,
}, },
+1 -1
View File
@@ -14,7 +14,7 @@ afterEach(async () => {
}); });
async function createTempDirectory(): Promise<string> { async function createTempDirectory(): Promise<string> {
const directory = await mkdtemp(join(tmpdir(), 'eryx-config-scanner-')); const directory = await mkdtemp(join(tmpdir(), 'aryx-config-scanner-'));
temporaryPaths.push(directory); temporaryPaths.push(directory);
return directory; return directory;
} }
+1 -1
View File
@@ -45,7 +45,7 @@ const spawnedProcesses: FakeChildProcess[] = [];
mock.module('electron', () => ({ mock.module('electron', () => ({
app: { app: {
isPackaged: false, isPackaged: false,
getAppPath: () => 'C:\\workspace\\personal\\repositories\\eryx', getAppPath: () => 'C:\\workspace\\personal\\repositories\\aryx',
}, },
})); }));
+8 -8
View File
@@ -7,8 +7,8 @@ describe('resolveSidecarProcess', () => {
expect( expect(
resolveSidecarProcess({ resolveSidecarProcess({
isPackaged: false, isPackaged: false,
appPath: 'C:\\workspace\\personal\\repositories\\eryx', appPath: 'C:\\workspace\\personal\\repositories\\aryx',
resourcesPath: 'C:\\workspace\\personal\\repositories\\eryx\\resources', resourcesPath: 'C:\\workspace\\personal\\repositories\\aryx\\resources',
platform: 'win32', platform: 'win32',
}), }),
).toEqual({ ).toEqual({
@@ -16,11 +16,11 @@ describe('resolveSidecarProcess', () => {
args: [ args: [
'run', 'run',
'--project', '--project',
'C:\\workspace\\personal\\repositories\\eryx\\sidecar\\src\\Aryx.AgentHost\\Aryx.AgentHost.csproj', 'C:\\workspace\\personal\\repositories\\aryx\\sidecar\\src\\Aryx.AgentHost\\Aryx.AgentHost.csproj',
'--', '--',
'--stdio', '--stdio',
], ],
cwd: 'C:\\workspace\\personal\\repositories\\eryx', cwd: 'C:\\workspace\\personal\\repositories\\aryx',
}); });
}); });
@@ -28,14 +28,14 @@ describe('resolveSidecarProcess', () => {
expect( expect(
resolveSidecarProcess({ resolveSidecarProcess({
isPackaged: true, isPackaged: true,
appPath: 'C:\\workspace\\personal\\repositories\\eryx\\release\\win-unpacked\\resources\\app', appPath: 'C:\\workspace\\personal\\repositories\\aryx\\release\\win-unpacked\\resources\\app',
resourcesPath: 'C:\\workspace\\personal\\repositories\\eryx\\release\\win-unpacked\\resources', resourcesPath: 'C:\\workspace\\personal\\repositories\\aryx\\release\\win-unpacked\\resources',
platform: 'win32', platform: 'win32',
}), }),
).toEqual({ ).toEqual({
command: 'C:\\workspace\\personal\\repositories\\eryx\\release\\win-unpacked\\resources\\sidecar\\Aryx.AgentHost.exe', command: 'C:\\workspace\\personal\\repositories\\aryx\\release\\win-unpacked\\resources\\sidecar\\Aryx.AgentHost.exe',
args: ['--stdio'], args: ['--stdio'],
cwd: 'C:\\workspace\\personal\\repositories\\eryx\\release\\win-unpacked\\resources\\sidecar', cwd: 'C:\\workspace\\personal\\repositories\\aryx\\release\\win-unpacked\\resources\\sidecar',
}); });
}); });