mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-03 14:09:42 +02:00
`npm test` ran config/vitest.config.ts, which includes the browser, visual and
perf suites. On any machine without chromium, a free port and per-machine PNG
baselines that fails ~87 tests on a clean master, so the repo's most obvious
command could not be used as a pass/fail signal. The workaround had spread into
four docs as "never run bare `npm test`" warnings.
`npm test` now runs config/vitest.ci.config.ts — byte-for-byte what CI runs — so
local green means CI green. Verified: 264 files, 5248 tests, exit 0.
The suites it leaves out are not abandoned; each has a command:
test:browser 5 Playwright files (chromium + a live server; codex-predictive-echo
also needs a real codex binary)
test:mobile unchanged — the above plus per-machine PNG baselines
test:perf 2 wall-clock benchmarks; need an otherwise idle machine
test:all the old everything-behaviour, kept reachable
test:ci is untouched (CI still calls it). test:watch and test:coverage follow
test onto the gate's config.
The more important half is the hole this closes. The exclusion list lived as
literals in one config and pointed one way only: a file excluded from CI and
added to no runner would be tested by NOTHING, silently, with every command
still green — vitest counts "no files matched a filter" as success. That is the
same shape as the #279/#280 blind spot already documented in CLAUDE.md.
So the globs moved to config/test-suites.ts, one array per REASON a suite cannot
run in CI, and all three configs derive from it. test/test-suite-partition.test.ts
then checks the arithmetic against the files on disk: it fails if any test file
is reachable by no runner, or by two. Confirmed it fires by orphaning a file and
watching it name it. The partition is exact today:
gate 264 + browser 5 + perf 2 + mobile 9 = 280 = every *.test.ts in the repo
⚠️ One sharp edge, deliberate and documented: a file filter must match its
runner. `npm test -- test/mobile/keyboard.test.ts` now matches nothing and exits
GREEN having run zero tests, because the gate's config excludes that path.
CLAUDE.md recommended exactly that command in the on-screen-keyboard note; that
line now says `npm run test:mobile -- <file>`, and the Testing section calls out
the trap, since a green run of zero tests is worse than a red one.
Docs synced: CLAUDE.md, AGENTS.md, .github/CONTRIBUTING.md, README.md,
README.zh-CN.md, and two ci.yml comments that claimed only test/mobile/** was
excluded — it is three suites, and 5 Playwright files rather than 3.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
173 lines
5.0 KiB
JSON
173 lines
5.0 KiB
JSON
{
|
|
"name": "aicodeman",
|
|
"version": "1.19.5",
|
|
"description": "Mission control for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence",
|
|
"type": "module",
|
|
"main": "dist/index.js",
|
|
"types": "dist/index.d.ts",
|
|
"bin": {
|
|
"aicodeman": "./dist/index.js",
|
|
"codeman": "./dist/index.js"
|
|
},
|
|
"scripts": {
|
|
"postinstall": "node scripts/postinstall.js",
|
|
"build": "node scripts/build.mjs",
|
|
"build:gesture": "node scripts/build-gesture-bundle.mjs",
|
|
"start": "NODE_COMPILE_CACHE=${HOME}/.codeman/compile-cache node dist/index.js",
|
|
"dev": "tsx src/index.ts web",
|
|
"web": "node dist/index.js web",
|
|
"clean": "rm -rf dist",
|
|
"test": "vitest run --config config/vitest.ci.config.ts",
|
|
"test:watch": "vitest --config config/vitest.ci.config.ts",
|
|
"test:coverage": "vitest run --config config/vitest.ci.config.ts --coverage",
|
|
"test:ci": "vitest run --config config/vitest.ci.config.ts",
|
|
"test:browser": "vitest run --config config/vitest.browser.config.ts",
|
|
"test:perf": "vitest run --config config/vitest.perf.config.ts",
|
|
"test:all": "vitest run --config config/vitest.config.ts",
|
|
"pretest:mobile": "node scripts/prepare-test-vendor.mjs",
|
|
"test:mobile": "vitest run --config test/mobile/vitest.config.ts",
|
|
"check:frontend-syntax": "node scripts/check-frontend-syntax.mjs",
|
|
"fix:node-pty": "node scripts/fix-node-pty.mjs",
|
|
"typecheck": "tsc --noEmit",
|
|
"lint": "eslint --config config/eslint.config.js 'src/**/*.ts'",
|
|
"lint:fix": "eslint --config config/eslint.config.js 'src/**/*.ts' --fix",
|
|
"format": "prettier --write 'src/**/*.ts' 'src/web/public/**/*.{js,css,html,json}'",
|
|
"format:check": "prettier --check 'src/**/*.ts' 'src/web/public/**/*.{js,css,html,json}'",
|
|
"check:public-assets": "node scripts/check-public-assets.mjs",
|
|
"capture:subagents": "node scripts/capture-subagent-screenshots.mjs",
|
|
"changeset": "changeset",
|
|
"version-packages": "changeset version && npm install --package-lock-only && node scripts/check-lockfile-sync.mjs",
|
|
"check:lockfile": "node scripts/check-lockfile-sync.mjs",
|
|
"knip": "npx --yes knip@latest --config config/knip.json",
|
|
"release": "changeset publish"
|
|
},
|
|
"prettier": {
|
|
"singleQuote": true,
|
|
"semi": true,
|
|
"tabWidth": 2,
|
|
"printWidth": 120,
|
|
"trailingComma": "es5",
|
|
"endOfLine": "lf"
|
|
},
|
|
"workspaces": [
|
|
".",
|
|
"packages/*"
|
|
],
|
|
"keywords": [
|
|
"claude-code",
|
|
"claude-ai",
|
|
"claude",
|
|
"anthropic",
|
|
"opencode",
|
|
"codex",
|
|
"antigravity",
|
|
"pi",
|
|
"gemini-cli",
|
|
"ai-agents",
|
|
"agent",
|
|
"session-manager",
|
|
"self-hosted",
|
|
"developer-tools",
|
|
"tmux",
|
|
"terminal",
|
|
"xterm",
|
|
"docker",
|
|
"mosh",
|
|
"local-echo",
|
|
"web-dashboard",
|
|
"cli",
|
|
"llm",
|
|
"automation"
|
|
],
|
|
"author": "arkon",
|
|
"license": "MIT",
|
|
"dependencies": {
|
|
"@fastify/compress": "^8.3.1",
|
|
"@fastify/cookie": "^11.0.2",
|
|
"@fastify/multipart": "^10.0.0",
|
|
"@fastify/static": "^9.1.3",
|
|
"@fastify/websocket": "^11.2.0",
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
"@xterm/addon-serialize": "^0.14.0",
|
|
"@xterm/addon-unicode11": "^0.9.0",
|
|
"@xterm/addon-webgl": "^0.19.0",
|
|
"@xterm/xterm": "^6.0.0",
|
|
"chalk": "^5.3.0",
|
|
"chokidar": "^3.6.0",
|
|
"commander": "^12.1.0",
|
|
"fastify": "^5.8.5",
|
|
"heic-decode": "^2.1.0",
|
|
"jpeg-js": "^0.4.4",
|
|
"node-pty": "^1.1.0",
|
|
"qrcode": "^1.5.4",
|
|
"uuid": "^14.0.0",
|
|
"web-push": "^3.6.7",
|
|
"ws": "^8.21.0",
|
|
"zod": "^4.3.6"
|
|
},
|
|
"devDependencies": {
|
|
"@changesets/cli": "^2.29.8",
|
|
"@eslint/js": "^9.0.0",
|
|
"@remotion/cli": "4.0.473",
|
|
"@remotion/transitions": "4.0.473",
|
|
"@types/node": "^20.19.33",
|
|
"@types/pngjs": "^6.0.5",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19.2.14",
|
|
"@types/uuid": "^10.0.0",
|
|
"@types/web-push": "^3.6.4",
|
|
"@types/ws": "^8.18.1",
|
|
"@vitest/coverage-v8": "^4.1.8",
|
|
"agent-browser": "^0.6.0",
|
|
"esbuild": "^0.27.3",
|
|
"eslint": "^9.0.0",
|
|
"pixelmatch": "^6.0.0",
|
|
"playwright": "^1.58.0",
|
|
"pngjs": "^7.0.0",
|
|
"prettier": "^3.4.0",
|
|
"puppeteer": "^24.36.0",
|
|
"remotion": "4.0.473",
|
|
"tsx": "^4.15.0",
|
|
"typescript": "^5.9.3",
|
|
"typescript-eslint": "^8.0.0",
|
|
"vitest": "^4.1.8"
|
|
},
|
|
"optionalDependencies": {
|
|
"@remotion/compositor-linux-x64-gnu": "^4.0.432",
|
|
"@rspack/binding-linux-x64-gnu": "^1.7.7"
|
|
},
|
|
"overrides": {
|
|
"basic-ftp": "^5.3.1",
|
|
"fast-uri": "^3.1.2",
|
|
"flatted": "^3.4.2",
|
|
"anymatch": {
|
|
"picomatch": "^2.3.2"
|
|
},
|
|
"micromatch": {
|
|
"picomatch": "^2.3.2"
|
|
},
|
|
"readdirp": {
|
|
"picomatch": "^2.3.2"
|
|
}
|
|
},
|
|
"engines": {
|
|
"node": ">=22.0.0"
|
|
},
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/Ark0N/Codeman.git"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/Ark0N/Codeman/issues"
|
|
},
|
|
"homepage": "https://github.com/Ark0N/Codeman#readme",
|
|
"files": [
|
|
"dist",
|
|
"scripts/postinstall.js",
|
|
"scripts/fix-node-pty.mjs",
|
|
"skills",
|
|
"LICENSE",
|
|
"README.md"
|
|
]
|
|
}
|