mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 14:16:28 +03:00
Brings the leak guard from #718 onto the branch and makes its guarantee hold
for the Rust engine instead of the Node scripts it was written against.
Conflicts and how each was resolved:
- tests/live-poll-stream.test.mjs, tests/live-server.test.mjs,
tests/live-target-context.test.mjs (modify/delete): kept deleted. They drove
skill/scripts/live-server.mjs, which does not exist here; the verb behavior
they covered is the oracle's job now. Their entries came out of
test-suites.mjs along with the rest of main's live list, which is Node-script
coverage this branch already retired.
- scripts/test-suites.mjs: took main's two new entries that still apply,
process-group.test.mjs into core and live-server-leak.test.mjs into live, plus
the infra trigger patterns for the three new scripts/lib modules. Dropped
main's pin.test.mjs (no such file here).
- package.json: kept test:cleanup, dropped test:cli-e2e (no cli-e2e suite here).
- scripts/run-tests.mjs: rewritten to hold both sides rather than picking one.
From #718: the createGroupShutdown state machine, the per-suite run-id marker
env, the post-suite leak check, and --cleanup. From 47f18713: the per-command
wall-clock cap with its per-suite wallClockMs override and
IMPECCABLE_TEST_WALL_CLOCK_MS, plus the killed-by-signal report. The two agree
on the detached process group, so they compose: the cap SIGKILLs that group
when a command wedges, the shutdown handler ends it on a signal, and both now
sweep for leaked servers before exiting. #718's handler replaces the old raw
signal forwarding, which sent one signal and never escalated.
- tests/live-e2e/session.mjs: kept both sides. The binary-driven boot
(runEngineSync, requireEngineBin, engineEnv) stands, with armLiveServerReaper
at module scope and trackServerChild around the fixture dev server.
Ported to the rest of the branch:
- tests/oracle/lib.mjs arms the reaper and tracks the daemon child. Its daemon
steps spawn live-server detached, so a SIGKILLed oracle run used to strand
one; buildInvocation already inherits process.env, so the marker reaches it.
- tests/live-server-leak.test.mjs now boots the engine binary through
tests/lib/engine-bin.mjs and skips cleanly without one.
No crate change was needed. The daemon spawn does env_clear().envs(env) against
Io::stdio()'s env, which is std::env::vars(), so the detached Rust process
carries the parent environment and the markers reach it. Verified against a
real --background daemon: found by run id and by repo marker, not found by an
adjacent checkout's marker. CLAUDE.md now says so, since narrowing that env
would make the guard silently blind.
Verified with a fresh cargo build --release -p impeccable:
- IMPECCABLE_BIN=... bun run test green end to end: core 90, oracle 1 (zero
unreviewed differences), detector 1, live 159 (157 pass, 2 skipped),
framework 186, plugin-e2e 4. Zero servers left.
- SIGKILL repro against impeccable live-server --background: 1 daemon up, 0
after with the reaper, 1 surviving with parent pid 1 under
IMPECCABLE_NO_TEST_REAPER=1. bun run test:cleanup then kills exactly that one.
- The leak test fails under IMPECCABLE_NO_TEST_REAPER=1 and passes with it.
- IMPECCABLE_E2E_ONLY=vite8-react-plain bun run test:live-e2e 4/4.
- bun run build green.
AI assistance: prepared by Claude Code under pbakaus's direction.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vau2X53xGTjjTCXWMVBoNY
94 lines
3.4 KiB
JSON
94 lines
3.4 KiB
JSON
{
|
|
"name": "impeccable",
|
|
"version": "3.6.1",
|
|
"author": "Paul Bakaus",
|
|
"description": "Design skills, commands, and anti-pattern detection for AI coding agents",
|
|
"keywords": [
|
|
"design",
|
|
"frontend",
|
|
"ux",
|
|
"skills",
|
|
"ai",
|
|
"anti-patterns",
|
|
"lint",
|
|
"accessibility",
|
|
"css",
|
|
"html",
|
|
"detection",
|
|
"ci-cd"
|
|
],
|
|
"license": "Apache-2.0",
|
|
"homepage": "https://impeccable.style",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/pbakaus/impeccable.git"
|
|
},
|
|
"engines": {
|
|
"node": ">=22.18.0"
|
|
},
|
|
"type": "module",
|
|
"bin": {
|
|
"impeccable": "cli/bin/cli.js"
|
|
},
|
|
"files": [
|
|
"cli/bin/",
|
|
"LICENSE"
|
|
],
|
|
"scripts": {
|
|
"build:skills": "bun run scripts/build.js --skip-root-sync",
|
|
"build:skills:release": "bun run scripts/build.js",
|
|
"build": "bun run build:skills && mkdir -p build/_data && rm -rf build/_data/dist && cp -R dist build/_data/dist",
|
|
"build:release": "bun run build:skills:release && mkdir -p build/_data && rm -rf build/_data/dist && cp -R dist build/_data/dist",
|
|
"build:extension": "node scripts/build-extension.js",
|
|
"fetch:engine": "node scripts/fetch-engine.mjs",
|
|
"clean": "rm -rf dist build",
|
|
"rebuild": "bun run clean && bun run build",
|
|
"rebuild:release": "bun run clean && bun run build:release",
|
|
"test": "node scripts/run-tests.mjs default",
|
|
"test:core": "node scripts/run-tests.mjs core",
|
|
"test:oracle": "node scripts/run-tests.mjs oracle",
|
|
"test:detector": "node scripts/run-tests.mjs detector",
|
|
"test:framework": "node scripts/run-tests.mjs framework",
|
|
"test:live": "node scripts/run-tests.mjs live",
|
|
"test:cleanup": "node scripts/run-tests.mjs --cleanup",
|
|
"test:cli-remote-e2e": "node scripts/run-tests.mjs cli-remote-e2e",
|
|
"test:plugin-e2e": "node scripts/run-tests.mjs plugin-e2e",
|
|
"test:live-e2e": "node scripts/run-tests.mjs live-e2e",
|
|
"test:live-e2e-accept-cleanup": "node scripts/run-tests.mjs live-e2e-accept-cleanup",
|
|
"test:new-work-e2e": "node scripts/run-tests.mjs new-work-e2e",
|
|
"test:live-e2e-agent": "node scripts/run-tests.mjs live-e2e-agent",
|
|
"test:skill-behavior": "node scripts/run-tests.mjs skill-behavior",
|
|
"test:live-svelte-adapter-deepseek": "node scripts/run-tests.mjs live-svelte-adapter-deepseek",
|
|
"smoke:hooks": "node scripts/smoke-provider-hooks.mjs",
|
|
"audit": "bun audit --audit-level=moderate",
|
|
"prepack": "cp README.md README.repo.md && cp README.npm.md README.md",
|
|
"postpack": "cp README.repo.md README.md && rm README.repo.md",
|
|
"release:skill": "node scripts/release.mjs skill",
|
|
"release:cli": "node scripts/release.mjs cli",
|
|
"release:ext": "node scripts/release.mjs extension",
|
|
"release:engine": "node scripts/release.mjs engine",
|
|
"check:engine-release": "node scripts/check-engine-release.mjs"
|
|
},
|
|
"optionalDependencies": {
|
|
"@impeccable/cli-darwin-arm64": "0.1.0",
|
|
"@impeccable/cli-darwin-x64": "0.1.0",
|
|
"@impeccable/cli-linux-x64": "0.1.0",
|
|
"@impeccable/cli-linux-arm64": "0.1.0",
|
|
"@impeccable/cli-windows-x64": "0.1.0"
|
|
},
|
|
"devDependencies": {
|
|
"@ai-sdk/anthropic": "^4.0.7",
|
|
"@ai-sdk/google": "^4.0.8",
|
|
"@ai-sdk/openai": "^4.0.7",
|
|
"@anthropic-ai/claude-agent-sdk": "^0.3.165",
|
|
"@anthropic-ai/sdk": "^0.122.0",
|
|
"@babel/parser": "^8.0.4",
|
|
"ai": "^7.0.14",
|
|
"archiver": "^8.0.0",
|
|
"playwright": "^1.59.1",
|
|
"puppeteer": "^25.1.0",
|
|
"svelte": "^5",
|
|
"zod": "^4.3.6"
|
|
}
|
|
}
|