cli-jaw 2.17.39 → 2.17.40-preview.20260908011306

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -850,7 +850,9 @@ entrypoint or cron. Full guide: [structure/remote-headless.md](structure/remote-
850
850
  npm run build # tsc → dist/
851
851
  npm run build:frontend # vite → public/dist/
852
852
  npm run dev # tsx server.ts (hot-reload)
853
- npm test # programmatic node:test driver (tests/run.mts, isolation:'process')
853
+ npm test # programmatic node:test driver (tests/run.mts, isolation:'process', per-file test home)
854
+ npm run test:shard -- 1/4 # deterministic quarter of root+unit (same split CI's test i/4 runs)
855
+ npm run test:integration:all # tests/integration + manager + bin (CI's integration job; needs a TEST_PORT server)
854
856
  npm run gate:all # named release/docs parity gates (incl. doc-drift, strict-baseline, redaction-sinks)
855
857
  npm run docs:check # AST commands/routes inventory vs structure docs
856
858
  bash structure/check-doc-drift.sh
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-jaw",
3
- "version": "2.17.39",
3
+ "version": "2.17.40-preview.20260908011306",
4
4
  "description": "Personal AI assistant powered by Pi, Antigravity, AI-E, Claude, Claude E, Codex, Codex App, Cursor, Grok, Kiro, OpenCode, and Copilot — Web, Terminal, Slack, Telegram, and Discord interfaces with 33 skills active by default from a 230-skill reference library",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -79,6 +79,8 @@
79
79
  "pretest:smoke": "npm run ensure:native",
80
80
  "test": "tsx --experimental-test-module-mocks tests/run.mts",
81
81
  "test:all": "tsx --experimental-test-module-mocks tests/run.mts --all",
82
+ "test:shard": "tsx --experimental-test-module-mocks tests/run.mts --scope root,unit --shard",
83
+ "test:integration:all": "tsx --experimental-test-module-mocks tests/run.mts --scope integration,manager,bin",
82
84
  "test:integration": "tsx --experimental-test-module-mocks --test tests/integration/*.test.ts",
83
85
  "test:coverage": "tsx --experimental-test-module-mocks --experimental-test-coverage tests/run.mts --all",
84
86
  "test:watch": "tsx --experimental-test-module-mocks tests/run.mts --watch",
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env bash
2
+ # The ci-aggregate decision for .github/workflows/test.yml, kept in a script so
3
+ # tests/unit/ci-aggregate-rules.test.ts can drive its truth table. Inputs are the
4
+ # producer job results and the change classifier's output, all through env.
5
+ #
6
+ # changes must be success and CODE_CHANGED exactly true|false
7
+ # code=true : every producer must be success (a skip is a dropped job, not a pass)
8
+ # code=false: every producer may be success or skipped (docs-only change)
9
+ # failure, cancelled, empty, or anything unrecognised always fails
10
+ set -uo pipefail
11
+
12
+ failed=0
13
+ require_code=""
14
+
15
+ case "${CHANGES_RESULT:-}" in
16
+ success) echo "PASS changes: success" ;;
17
+ *) echo "FAIL changes: ${CHANGES_RESULT:-<empty>}"; failed=1 ;;
18
+ esac
19
+
20
+ case "${CODE_CHANGED:-}" in
21
+ true|false) require_code="${CODE_CHANGED}"; echo "INFO changes.outputs.code=${CODE_CHANGED}" ;;
22
+ *) echo "FAIL changes.outputs.code was '${CODE_CHANGED:-}', expected true or false"; failed=1 ;;
23
+ esac
24
+
25
+ check() {
26
+ local job="$1" result="$2"
27
+ case "$result" in
28
+ success)
29
+ echo "PASS $job: success" ;;
30
+ skipped)
31
+ if [ "$require_code" = "false" ]; then
32
+ echo "PASS $job: skipped (docs-only change)"
33
+ else
34
+ echo "FAIL $job: skipped although change detection reported code changes"; failed=1
35
+ fi ;;
36
+ failure) echo "FAIL $job: failure"; failed=1 ;;
37
+ cancelled) echo "FAIL $job: cancelled"; failed=1 ;;
38
+ '') echo "FAIL $job: no result reported"; failed=1 ;;
39
+ *) echo "FAIL $job: unexpected result '$result'"; failed=1 ;;
40
+ esac
41
+ }
42
+
43
+ check test "${TEST_RESULT:-}"
44
+ check integration "${INTEGRATION_RESULT:-}"
45
+ check gates "${GATES_RESULT:-}"
46
+ check windows-unit "${WINDOWS_UNIT_RESULT:-}"
47
+
48
+ if [ "$failed" -ne 0 ]; then
49
+ echo "::error::ci-aggregate failed — see the per-job results above"
50
+ exit 1
51
+ fi
52
+ echo "ci-aggregate: all required jobs succeeded or were legitimately skipped"
53
+
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ // Validates scripts/ci/windows-unit-manifest.txt — the list of unit test files
3
+ // the windows-unit job runs on windows-latest. One repo-relative POSIX path per
4
+ // line; blank lines and full-line '#' comments are ignored; no globs, duplicates,
5
+ // traversal, or paths outside tests/unit/. Consumed by the Windows job (--print)
6
+ // and by tests/unit/windows-unit-manifest.test.ts, so a renamed test breaks on
7
+ // Linux before it silently vanishes from the Windows lane.
8
+ import { existsSync, readFileSync, statSync } from 'node:fs';
9
+ import { join, resolve } from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+ import process from 'node:process';
12
+
13
+ export const MANIFEST_PATH = 'scripts/ci/windows-unit-manifest.txt';
14
+ const ENTRY = /^tests\/unit\/[A-Za-z0-9_-]+\.test\.ts$/;
15
+
16
+ /** @returns {string[]} validated entries in manifest order; throws with the reason */
17
+ export function readManifest(manifestPath, { root } = {}) {
18
+ const repoRoot = root ?? resolve(fileURLToPath(import.meta.url), '..', '..', '..');
19
+ const abs = resolve(repoRoot, manifestPath);
20
+ if (!existsSync(abs)) throw new Error(`manifest missing: ${manifestPath}`);
21
+ const lines = readFileSync(abs, 'utf8').split(/\r?\n/);
22
+ const entries = [];
23
+ const seen = new Set();
24
+ lines.forEach((raw, i) => {
25
+ const line = raw.trim();
26
+ if (!line || line.startsWith('#')) return;
27
+ const where = `${manifestPath}:${i + 1}`;
28
+ if (!ENTRY.test(line)) throw new Error(`${where}: invalid entry '${line}' (expected tests/unit/<name>.test.ts)`);
29
+ if (seen.has(line)) throw new Error(`${where}: duplicate entry '${line}'`);
30
+ const file = join(repoRoot, line);
31
+ if (!existsSync(file) || !statSync(file).isFile()) throw new Error(`${where}: missing file '${line}'`);
32
+ seen.add(line);
33
+ entries.push(line);
34
+ });
35
+ if (entries.length === 0) throw new Error(`${manifestPath}: empty manifest`);
36
+ return entries;
37
+ }
38
+
39
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
40
+ const args = process.argv.slice(2);
41
+ const print = args.includes('--print');
42
+ const target = args.find(a => !a.startsWith('--')) ?? MANIFEST_PATH;
43
+ try {
44
+ const entries = readManifest(target);
45
+ if (print) process.stdout.write(entries.join('\n') + '\n');
46
+ else console.log(`windows-unit manifest ok: ${entries.length} files`);
47
+ } catch (error) {
48
+ console.error(`[windows-unit-manifest] ${error instanceof Error ? error.message : String(error)}`);
49
+ process.exit(1);
50
+ }
51
+ }
52
+
@@ -0,0 +1,19 @@
1
+ # Unit test files the windows-unit job runs on windows-latest (.github/workflows/test.yml).
2
+ # One repo-relative path per line, tests/unit/<name>.test.ts only; no globs.
3
+ # Validated by scripts/ci/windows-unit-manifest.mjs and tests/unit/windows-unit-manifest.test.ts.
4
+ tests/unit/windows-service-esm.test.ts
5
+ tests/unit/service-windows-branch.test.ts
6
+ tests/unit/windows-service-lifecycle-honesty.test.ts
7
+ tests/unit/windows-installer-shims.test.ts
8
+ tests/unit/windows-spawn-primitives.test.ts
9
+ tests/unit/manager-browser-open.test.ts
10
+ tests/unit/eaddrinuse-diagnostics-contract.test.ts
11
+ tests/unit/tui-env-flags.test.ts
12
+ tests/unit/windows-launch-spec.test.ts
13
+ tests/unit/service-lifecycle-cli.test.ts
14
+ tests/unit/claude-sdk-windows-launch.test.ts
15
+ tests/unit/claude-sdk-session.test.ts
16
+ tests/unit/claude-sdk-control.test.ts
17
+ tests/unit/claude-sdk-core-hardening.test.ts
18
+ tests/unit/claude-sdk-deferred-core.test.ts
19
+