源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
Dependency audit / audit (push) Canceled after 0s
CI / plan (push) Canceled after 0s
Gitoxide helper admission / macos-latest (push) Canceled after 0s
Gitoxide helper admission / ubuntu-latest (push) Canceled after 0s
Gitoxide helper admission / windows-latest (push) Canceled after 0s
Runtime Host peer admission / quality (push) Canceled after 0s
Windows recovery / windows_recovery (push) Canceled after 0s
CI / heavy (push) Canceled after 0s
CI / test (push) Canceled after 0s
Dependency audit / audit (push) Canceled after 0s
CI / plan (push) Canceled after 0s
Gitoxide helper admission / macos-latest (push) Canceled after 0s
Gitoxide helper admission / ubuntu-latest (push) Canceled after 0s
Gitoxide helper admission / windows-latest (push) Canceled after 0s
Runtime Host peer admission / quality (push) Canceled after 0s
Windows recovery / windows_recovery (push) Canceled after 0s
CI / heavy (push) Canceled after 0s
CI / test (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import assert from 'node:assert/strict';
|
||||
import { spawnSync } from 'node:child_process';
|
||||
import {
|
||||
chmod,
|
||||
mkdir,
|
||||
mkdtemp,
|
||||
readFile,
|
||||
realpath,
|
||||
rm,
|
||||
symlink,
|
||||
writeFile,
|
||||
} from 'node:fs/promises';
|
||||
import { tmpdir } from 'node:os';
|
||||
import { join } from 'node:path';
|
||||
import { test } from 'node:test';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
import { requireComputerUseLabRoot } from './lab-root.mjs';
|
||||
|
||||
test('Computer Use CLI advertises only the supported evidence commands', () => {
|
||||
const result = spawnSync(
|
||||
process.execPath,
|
||||
[fileURLToPath(new URL('../computer-use.mjs', import.meta.url)), '--help'],
|
||||
{ encoding: 'utf8' },
|
||||
);
|
||||
|
||||
assert.equal(result.status, 0, result.stderr);
|
||||
assert.equal(
|
||||
result.stdout,
|
||||
`Usage: node scripts/computer-use.mjs <command> [options]\n\nCommands:\n prepare\n real-ax\n real-model\n restart-soak\n provider-matrix\n`,
|
||||
);
|
||||
});
|
||||
|
||||
test('rejects missing and invalid Computer Use Lab roots', async () => {
|
||||
const root = await mkdtemp(join(tmpdir(), 'maka-cu-lab-root-invalid-'));
|
||||
try {
|
||||
assert.throws(
|
||||
() => requireComputerUseLabRoot({}),
|
||||
new Error(
|
||||
'MAKA_CU_AX_MODEL_LAB_ROOT is required: point it at a local checkout of the Codex CUA Lab fixture',
|
||||
),
|
||||
);
|
||||
assert.throws(
|
||||
() => requireComputerUseLabRoot({ MAKA_CU_AX_MODEL_LAB_ROOT: ' ' }),
|
||||
/MAKA_CU_AX_MODEL_LAB_ROOT is required/,
|
||||
);
|
||||
assert.throws(
|
||||
() => requireComputerUseLabRoot({ MAKA_CU_AX_MODEL_LAB_ROOT: 'relative/lab' }),
|
||||
/MAKA_CU_AX_MODEL_LAB_ROOT must be an absolute path/,
|
||||
);
|
||||
assert.throws(
|
||||
() => requireComputerUseLabRoot({ MAKA_CU_AX_MODEL_LAB_ROOT: join(root, 'missing') }),
|
||||
/MAKA_CU_AX_MODEL_LAB_ROOT must point to an existing directory/,
|
||||
);
|
||||
assert.throws(
|
||||
() => requireComputerUseLabRoot({ MAKA_CU_AX_MODEL_LAB_ROOT: root }),
|
||||
/MAKA_CU_AX_MODEL_LAB_ROOT must contain an executable test-app\/launch\.sh/,
|
||||
);
|
||||
const nonExecutableRoot = join(root, 'non-executable');
|
||||
const launcherPath = join(nonExecutableRoot, 'test-app', 'launch.sh');
|
||||
await mkdir(join(nonExecutableRoot, 'test-app'), { recursive: true });
|
||||
await writeFile(launcherPath, '#!/usr/bin/env bash\n');
|
||||
await chmod(launcherPath, 0o644);
|
||||
assert.throws(
|
||||
() => requireComputerUseLabRoot({ MAKA_CU_AX_MODEL_LAB_ROOT: nonExecutableRoot }),
|
||||
/MAKA_CU_AX_MODEL_LAB_ROOT must contain an executable test-app\/launch\.sh/,
|
||||
);
|
||||
} finally {
|
||||
await rm(root, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
test('canonicalizes a valid Computer Use Lab root', async () => {
|
||||
const root = await mkdtemp(join(tmpdir(), 'maka-cu-lab-root-valid-'));
|
||||
try {
|
||||
const fixtureRoot = join(root, 'fixture');
|
||||
const linkedRoot = join(root, 'fixture-link');
|
||||
const launcherPath = join(fixtureRoot, 'test-app', 'launch.sh');
|
||||
await mkdir(join(fixtureRoot, 'test-app'), { recursive: true });
|
||||
await writeFile(launcherPath, '#!/usr/bin/env bash\n');
|
||||
await chmod(launcherPath, 0o755);
|
||||
await symlink(fixtureRoot, linkedRoot);
|
||||
|
||||
assert.equal(
|
||||
requireComputerUseLabRoot({ MAKA_CU_AX_MODEL_LAB_ROOT: linkedRoot }),
|
||||
await realpath(fixtureRoot),
|
||||
);
|
||||
} finally {
|
||||
await rm(root, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
test('Lab-backed entry points require the configured root', async () => {
|
||||
const entryPoints = [
|
||||
'process-restart-harness.mjs',
|
||||
'process-restart-launcher.mjs',
|
||||
'real-ax-harness.mjs',
|
||||
'real-ax-launcher.mjs',
|
||||
];
|
||||
|
||||
for (const entryPoint of entryPoints) {
|
||||
const source = await readFile(new URL(entryPoint, import.meta.url), 'utf8');
|
||||
assert.match(
|
||||
source,
|
||||
/const labRoot = requireComputerUseLabRoot\(\);/,
|
||||
`${entryPoint} must require the configured Lab root`,
|
||||
);
|
||||
assert.doesNotMatch(
|
||||
source,
|
||||
/codex-computer-use-lab/i,
|
||||
`${entryPoint} must not embed a contributor-specific Lab checkout`,
|
||||
);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user