diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9d34c8d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this project are documented in this file. + +## [0.2.0] + +Standalone-first re-aim: local stack report for Claude Code, Codex, and Cursor, including skills and subagents. + +- `--markdown` and `--json` output formats +- Truncation disclosure when a scan root hits its read ceiling +- Profile sync politely paused while devcat.dev is offline +- Skills and subagents are provably never sent off the machine + +## [0.1.x] + +Initial sync-focused release. diff --git a/README.md b/README.md index 94a7b1b..b281810 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ npx devcat-cli --json | jq '.clients[] | {label, total}' ```json { - "cli_version": "0.1.1", + "cli_version": "0.2.0", "total": 23, "project_scoped": 2, "user_scoped": 21, diff --git a/package-lock.json b/package-lock.json index e3bc104..6adfbb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "devcat-cli", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "devcat-cli", - "version": "0.1.1", + "version": "0.2.0", "license": "MIT", "dependencies": { "@napi-rs/keyring": "^1.2.0", diff --git a/package.json b/package.json index 4e4cb1a..8a1177d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "devcat-cli", - "version": "0.1.1", + "version": "0.2.0", "description": "See your whole AI-coding stack in one command. npx devcat-cli scans this machine for the MCP servers, plugins, skills, and subagents installed across Claude Code, Codex, and Cursor and prints them grouped — locally, with no account and no network call.", "license": "MIT", "author": "Andrew Noble (https://github.com/AnobleSCM)", @@ -8,7 +8,7 @@ "type": "git", "url": "git+https://github.com/AnobleSCM/devcat-cli.git" }, - "homepage": "https://devcat.dev", + "homepage": "https://github.com/AnobleSCM/devcat-cli", "bugs": "https://github.com/AnobleSCM/devcat-cli/issues", "type": "commonjs", "engines": { diff --git a/src/version.ts b/src/version.ts index 0cdbeda..209908e 100644 --- a/src/version.ts +++ b/src/version.ts @@ -4,4 +4,4 @@ * Sent as cli_version on POST /api/device/token per Phase 40 D-06. * Server validates against semver regex /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/. */ -export const CLI_VERSION = '0.1.1'; +export const CLI_VERSION = '0.2.0'; diff --git a/test/unit/api/client.test.ts b/test/unit/api/client.test.ts index 5e8d6b2..0c28a07 100644 --- a/test/unit/api/client.test.ts +++ b/test/unit/api/client.test.ts @@ -20,7 +20,7 @@ describe('authenticatedFetch', () => { }), ); await authenticatedFetch(`${API_BASE}/probe`); - expect(capturedUA).toMatch(/^devcat-cli\/0\.1\.1 \((darwin|linux|win32); node /); + expect(capturedUA).toMatch(/^devcat-cli\/0\.2\.0 \((darwin|linux|win32); node /); }); it('sets Authorization: Bearer when bearerToken passed', async () => { diff --git a/test/unit/auth/deviceFlow.test.ts b/test/unit/auth/deviceFlow.test.ts index b5e261c..90931e6 100644 --- a/test/unit/auth/deviceFlow.test.ts +++ b/test/unit/auth/deviceFlow.test.ts @@ -263,7 +263,7 @@ describe('pollForToken', () => { const body = capturedBody as { client_metadata?: { cli_version?: string; hostname?: string; platform?: string }; }; - expect(body.client_metadata?.cli_version).toBe('0.1.1'); + expect(body.client_metadata?.cli_version).toBe('0.2.0'); expect(['darwin', 'linux', 'win32']).toContain(body.client_metadata?.platform); expect(typeof body.client_metadata?.hostname).toBe('string'); }); diff --git a/test/unit/version.parity.test.ts b/test/unit/version.parity.test.ts new file mode 100644 index 0000000..243e258 --- /dev/null +++ b/test/unit/version.parity.test.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { CLI_VERSION } from '../../src/version.js'; + +describe('CLI_VERSION parity', () => { + it('matches the version field in package.json', () => { + const packageJsonPath = join(__dirname, '..', '..', 'package.json'); + const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')); + + expect(CLI_VERSION).toBe(packageJson.version); + }); +});