diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index d00abe41..82ad8451 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "webcmd", - "version": "0.7.7", + "version": "0.7.8", "description": "Turn websites, browser sessions, desktop apps, and local tools into deterministic CLI surfaces for humans and AI agents.", "author": { "name": "AgentRHQ", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 83cab5af..b14793c4 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "webcmd", - "version": "0.7.7", + "version": "0.7.8", "description": "Turn websites, browser sessions, desktop apps, and local tools into deterministic CLI surfaces for humans and AI agents.", "author": { "name": "AgentRHQ", diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 81a99ecd..ed1a258d 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.7.7" + ".": "0.7.8" } diff --git a/CHANGELOG.md b/CHANGELOG.md index f558430b..a73c96fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.7.8](https://github.com/agentrhq/webcmd/compare/webcmd-v0.7.7...webcmd-v0.7.8) (2026-08-27) + + +### Features + +* add readable session identifiers ([#443](https://github.com/agentrhq/webcmd/issues/443)) ([e3be378](https://github.com/agentrhq/webcmd/commit/e3be3788422071595c205f9f471d464527d3b876)) + ## [0.7.7](https://github.com/agentrhq/webcmd/compare/webcmd-v0.7.6...webcmd-v0.7.7) (2026-08-26) ### Improvements diff --git a/package-lock.json b/package-lock.json index 598b6180..be31f097 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@agentrhq/webcmd", - "version": "0.7.7", + "version": "0.7.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@agentrhq/webcmd", - "version": "0.7.7", + "version": "0.7.8", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index f2696c9b..1740d45e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@agentrhq/webcmd", - "version": "0.7.7", + "version": "0.7.8", "description": "Turn websites, browser sessions, desktop apps, and local tools into deterministic CLI surfaces for humans and AI agents.", "engines": { "node": ">=20.6.0" diff --git a/tests/e2e/browser-run.test.ts b/tests/e2e/browser-run.test.ts index 0e1fab98..a41107f0 100644 --- a/tests/e2e/browser-run.test.ts +++ b/tests/e2e/browser-run.test.ts @@ -95,7 +95,7 @@ describe('browser run local lifecycle', () => { tempDirs.push(cacheDir); const env = { WEBCMD_CACHE_DIR: cacheDir, WEBCMD_CONFIG_DIR: cacheDir }; - const created = await runCliWithStdin(['session', 'create', '-f', 'json'], '', env); + const created = await runCliWithStdin(['session', 'create', 'browser-run-e2e', '-f', 'json'], '', env); expect(created.code).toBe(0); const session = parseJsonOutput(created.stdout).id as string; diff --git a/tests/e2e/browser-tabs.test.ts b/tests/e2e/browser-tabs.test.ts index a91faee4..70e9fb8b 100644 --- a/tests/e2e/browser-tabs.test.ts +++ b/tests/e2e/browser-tabs.test.ts @@ -118,7 +118,7 @@ describe('browser public command surface e2e', () => { it('uses tabs, bind, run, and close through the built CLI', async () => { const daemon = await startFakeDaemon(); daemons.push(daemon); - const session = 'session_four-command-surface'; + const session = 'browser-tabs-k7'; const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'webcmd-browser-tabs-')); tempDirs.push(tempDir); const sourcePath = path.join(tempDir, 'program.js'); diff --git a/tests/e2e/cloak-runtime.test.ts b/tests/e2e/cloak-runtime.test.ts index f8e4140c..58a8911b 100644 --- a/tests/e2e/cloak-runtime.test.ts +++ b/tests/e2e/cloak-runtime.test.ts @@ -33,7 +33,7 @@ function browserRun(session: string, source: string, options: Parameters[1] = {}) { - const result = await runCli(['session', 'create', '-f', 'json'], isolatedOptions(options)); + const result = await runCli(['session', 'create', 'cloak-e2e', '-f', 'json'], isolatedOptions(options)); expect(result.code, `${result.stdout}\n${result.stderr}`).toBe(0); return JSON.parse(result.stdout).id as string; } diff --git a/tests/e2e/management.test.ts b/tests/e2e/management.test.ts index e19027cc..763626b0 100644 --- a/tests/e2e/management.test.ts +++ b/tests/e2e/management.test.ts @@ -135,29 +135,31 @@ describe('management commands E2E', () => { }); describe('session close E2E', () => { - const NEVER_EXISTED = 'session_00000000-0000-0000-0000-000000000000'; + const NEVER_EXISTED = 'never-existed-k7'; - it('accepts the root --session selector and the command it used to suggest', async () => { + it('accepts both Session selector forms before reporting a missing Session', async () => { // Old behaviour: this errored with SESSION_SELECTOR_POSITION and suggested // `webcmd --session session close`, which then failed on the missing // positional. Both spellings must now work. const viaFlag = await runManagementCli(['session', 'close', '--session', NEVER_EXISTED]); expect(viaFlag.stderr).not.toMatch(/SESSION_SELECTOR_POSITION|missing required argument/); - expect(viaFlag.code).toBe(0); + expect(viaFlag.code).not.toBe(0); + expect(viaFlag.stdout + viaFlag.stderr).toContain('SESSION_NOT_FOUND'); const viaRootSelector = await runManagementCli(['--session', NEVER_EXISTED, 'session', 'close']); expect(viaRootSelector.stderr).not.toMatch(/missing required argument/); - expect(viaRootSelector.code).toBe(0); + expect(viaRootSelector.code).not.toBe(0); + expect(viaRootSelector.stdout + viaRootSelector.stderr).toContain('SESSION_NOT_FOUND'); }); - it('is idempotent for an unknown Session ID', async () => { - const { stdout, code } = await runManagementCli(['session', 'close', NEVER_EXISTED, '-f', 'json']); - expect(code).toBe(0); - expect(parseJsonOutput(stdout)).toMatchObject({ ok: true, closed: false, alreadyClosed: true, session: NEVER_EXISTED }); + it('reports an unknown readable Session ID', async () => { + const { stdout, stderr, code } = await runManagementCli(['session', 'close', NEVER_EXISTED, '-f', 'json']); + expect(code).not.toBe(0); + expect(stdout + stderr).toContain('SESSION_NOT_FOUND'); }); it('closes a real Session twice without failing', async () => { - const created = await runManagementCli(['session', 'create', '-f', 'json']); + const created = await runManagementCli(['session', 'create', 'management-e2e', '-f', 'json']); expect(created.code).toBe(0); const sessionId = parseJsonOutput(created.stdout).id as string; for (const attempt of [1, 2]) {