diff --git a/openspec/roadmap.md b/openspec/roadmap.md index 1d1de1d..1443578 100644 --- a/openspec/roadmap.md +++ b/openspec/roadmap.md @@ -4,13 +4,15 @@ ### 0.1 -* 3-4 sample skills useful in a vault * Versioning and changelog ### 0.2 -* AGENTS.md initialization * Windows support +* 3-4 sample skills useful in a vault + +### 0.3 +* AGENTS.md initialization ### 1.0 diff --git a/src/ProcessManager.ts b/src/ProcessManager.ts index 47699a7..0c8be09 100644 --- a/src/ProcessManager.ts +++ b/src/ProcessManager.ts @@ -39,9 +39,8 @@ export class ProcessManager { } getUrl(): string { - const baseUrl = `http://${this.settings.hostname}:${this.settings.port}`; const encodedPath = btoa(this.projectDirectory); - return `${baseUrl}/${encodedPath}`; + return `http://${this.settings.hostname}:${this.settings.port}/${encodedPath}`; } async start(): Promise { @@ -57,7 +56,6 @@ export class ProcessManager { return this.setError("Project directory (vault) not configured"); } - // Check if server is already running on this port if (await this.checkServerHealth()) { console.log("[OpenCode] Server already running on port", this.settings.port); this.setState("running"); @@ -125,19 +123,16 @@ export class ProcessManager { } }); - // Wait for server to be ready const ready = await this.waitForServerOrExit(this.settings.startupTimeout); if (ready) { this.setState("running"); return true; } - // If already in error state from spawn error event, don't overwrite if (this.state === "error") { return false; } - // Determine appropriate error message based on what happened this.stop(); if (this.earlyExitCode !== null) { return this.setError(`Process exited unexpectedly (exit code ${this.earlyExitCode})`); diff --git a/src/main.ts b/src/main.ts index 1fcbc1b..c56d8ae 100644 --- a/src/main.ts +++ b/src/main.ts @@ -94,20 +94,17 @@ export default class OpenCodePlugin extends Plugin { this.processManager.updateProjectDirectory(this.getProjectDirectory()); - // Restart server if it's currently running if (this.getProcessState() === "running") { this.stopServer(); await this.startServer(); } } - // Get existing view leaf if any private getExistingLeaf(): WorkspaceLeaf | null { const leaves = this.app.workspace.getLeavesOfType(OPENCODE_VIEW_TYPE); return leaves.length > 0 ? leaves[0] : null; } - // Activate or create the view async activateView(): Promise { const existingLeaf = this.getExistingLeaf(); @@ -133,7 +130,6 @@ export default class OpenCodePlugin extends Plugin { } } - // Toggle view visibility async toggleView(): Promise { const existingLeaf = this.getExistingLeaf(); diff --git a/tests/ProcessManager.test.ts b/tests/ProcessManager.test.ts index 0b012cc..a8eedf6 100644 --- a/tests/ProcessManager.test.ts +++ b/tests/ProcessManager.test.ts @@ -21,6 +21,7 @@ function createTestSettings(port: number): OpenCodeSettings { opencodePath: "opencode", projectDirectory: "", startupTimeout: TEST_TIMEOUT_MS, + defaultViewLocation: "sidebar", }; } @@ -55,17 +56,16 @@ afterEach(async () => { describe("ProcessManager", () => { describe("happy path", () => { - test("starts server and transitions to running state", async () => { - const port = getNextPort(); - const settings = createTestSettings(port); - const stateHistory: ProcessState[] = []; + test("starts server and transitions to running state", async () => { + const port = getNextPort(); + const settings = createTestSettings(port); + const stateHistory: ProcessState[] = []; - currentManager = new ProcessManager( - settings, - PROJECT_DIR, - PROJECT_DIR, - (state) => stateHistory.push(state) - ); + currentManager = new ProcessManager( + settings, + PROJECT_DIR, + (state) => stateHistory.push(state) + ); expect(currentManager.getState()).toBe("stopped"); @@ -77,16 +77,15 @@ describe("ProcessManager", () => { expect(stateHistory).toContain("running"); }); - test("reports correct server URL with encoded project directory", async () => { - const port = getNextPort(); - const settings = createTestSettings(port); + test("reports correct server URL with encoded project directory", async () => { + const port = getNextPort(); + const settings = createTestSettings(port); - currentManager = new ProcessManager( - settings, - PROJECT_DIR, - PROJECT_DIR, - () => {} - ); + currentManager = new ProcessManager( + settings, + PROJECT_DIR, + () => {} + ); const url = currentManager.getUrl(); const expectedBase = `http://127.0.0.1:${port}`; @@ -95,17 +94,16 @@ describe("ProcessManager", () => { expect(url).toBe(`${expectedBase}/${expectedPath}`); }); - test("stops server gracefully and transitions to stopped state", async () => { - const port = getNextPort(); - const settings = createTestSettings(port); - const stateHistory: ProcessState[] = []; + test("stops server gracefully and transitions to stopped state", async () => { + const port = getNextPort(); + const settings = createTestSettings(port); + const stateHistory: ProcessState[] = []; - currentManager = new ProcessManager( - settings, - PROJECT_DIR, - PROJECT_DIR, - (state) => stateHistory.push(state) - ); + currentManager = new ProcessManager( + settings, + PROJECT_DIR, + (state) => stateHistory.push(state) + ); await currentManager.start(); expect(currentManager.getState()).toBe("running"); @@ -116,17 +114,16 @@ describe("ProcessManager", () => { expect(stateHistory).toContain("stopped"); }); - test("state callbacks fire in correct order: starting -> running", async () => { - const port = getNextPort(); - const settings = createTestSettings(port); - const stateHistory: ProcessState[] = []; + test("state callbacks fire in correct order: starting -> running", async () => { + const port = getNextPort(); + const settings = createTestSettings(port); + const stateHistory: ProcessState[] = []; - currentManager = new ProcessManager( - settings, - PROJECT_DIR, - PROJECT_DIR, - (state) => stateHistory.push(state) - ); + currentManager = new ProcessManager( + settings, + PROJECT_DIR, + (state) => stateHistory.push(state) + ); await currentManager.start(); @@ -138,16 +135,15 @@ describe("ProcessManager", () => { expect(runningIndex).toBeGreaterThan(startingIndex); }); - test("can restart after stop", async () => { - const port = getNextPort(); - const settings = createTestSettings(port); + test("can restart after stop", async () => { + const port = getNextPort(); + const settings = createTestSettings(port); - currentManager = new ProcessManager( - settings, - PROJECT_DIR, - PROJECT_DIR, - () => {} - ); + currentManager = new ProcessManager( + settings, + PROJECT_DIR, + () => {} + ); // First start const firstStart = await currentManager.start(); @@ -167,16 +163,15 @@ describe("ProcessManager", () => { expect(currentManager.getState()).toBe("running"); }); - test("returns true immediately if already running", async () => { - const port = getNextPort(); - const settings = createTestSettings(port); + test("returns true immediately if already running", async () => { + const port = getNextPort(); + const settings = createTestSettings(port); - currentManager = new ProcessManager( - settings, - PROJECT_DIR, - PROJECT_DIR, - () => {} - ); + currentManager = new ProcessManager( + settings, + PROJECT_DIR, + () => {} + ); // First start await currentManager.start(); @@ -198,16 +193,15 @@ describe("ProcessManager", () => { expect(stateHistory).toEqual([]); }); - test("health check endpoint is accessible when running", async () => { - const port = getNextPort(); - const settings = createTestSettings(port); + test("health check endpoint is accessible when running", async () => { + const port = getNextPort(); + const settings = createTestSettings(port); - currentManager = new ProcessManager( - settings, - PROJECT_DIR, - PROJECT_DIR, - () => {} - ); + currentManager = new ProcessManager( + settings, + PROJECT_DIR, + () => {} + ); await currentManager.start();