cli-jaw 2.17.39 → 2.17.40
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.
|
|
3
|
+
"version": "2.17.40",
|
|
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
|
+
|