Restrict auto-apply to trusted review comments so spoofed issue comments cannot write optimized SKILL.md content into pull request branches. Reject activation symlinks that escape the source root and add regression coverage for both security checks.
107 lines
4.2 KiB
JavaScript
107 lines
4.2 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const { spawnSync } = require("child_process");
|
|
const path = require("path");
|
|
|
|
const NETWORK_TEST_ENV = "ENABLE_NETWORK_TESTS";
|
|
const ENABLED_VALUES = new Set(["1", "true", "yes", "on"]);
|
|
const TOOL_SCRIPTS = path.join("tools", "scripts");
|
|
const TOOL_TESTS = path.join(TOOL_SCRIPTS, "tests");
|
|
const LOCAL_TEST_COMMANDS = [
|
|
[path.join(TOOL_TESTS, "activate_skills_shell.test.js")],
|
|
[path.join(TOOL_TESTS, "activate_skills_batch_security.test.js")],
|
|
[path.join(TOOL_TESTS, "automation_workflows.test.js")],
|
|
[path.join(TOOL_TESTS, "apply_skill_optimization_security.test.js")],
|
|
[path.join(TOOL_TESTS, "build_catalog_bundles.test.js")],
|
|
[path.join(TOOL_TESTS, "claude_plugin_marketplace.test.js")],
|
|
[path.join(TOOL_TESTS, "installer_antigravity_guidance.test.js")],
|
|
[path.join(TOOL_TESTS, "jetski_gemini_loader.test.cjs")],
|
|
[path.join(TOOL_TESTS, "npm_package_contents.test.js")],
|
|
[path.join(TOOL_TESTS, "setup_web_sync.test.js")],
|
|
[path.join(TOOL_TESTS, "skill_filter.test.js")],
|
|
[path.join(TOOL_TESTS, "validate_skills_headings.test.js")],
|
|
[path.join(TOOL_TESTS, "workflow_contracts.test.js")],
|
|
[path.join(TOOL_TESTS, "docs_security_content.test.js")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_bundle_activation_security.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_audit_skills.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_audit_consistency.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_cleanup_synthetic_skill_sections.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_fix_missing_skill_metadata.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_fix_missing_skill_sections.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_fix_truncated_descriptions.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_generate_index_categories.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_repair_description_usage_summaries.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_sync_microsoft_skills_security.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_sync_repo_metadata.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_sync_contributors.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_validation_warning_budget.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_maintainer_audit.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_validate_skills_headings.py")],
|
|
];
|
|
const NETWORK_TEST_COMMANDS = [
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "inspect_microsoft_repo.py")],
|
|
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_comprehensive_coverage.py")],
|
|
];
|
|
|
|
function isNetworkTestsEnabled() {
|
|
const value = process.env[NETWORK_TEST_ENV];
|
|
if (!value) {
|
|
return false;
|
|
}
|
|
return ENABLED_VALUES.has(String(value).trim().toLowerCase());
|
|
}
|
|
|
|
function runNodeCommand(args) {
|
|
const result = spawnSync(process.execPath, args, { stdio: "inherit" });
|
|
|
|
if (result.error) {
|
|
throw result.error;
|
|
}
|
|
|
|
if (result.signal) {
|
|
process.kill(process.pid, result.signal);
|
|
}
|
|
|
|
if (typeof result.status !== "number") {
|
|
process.exit(1);
|
|
}
|
|
|
|
if (result.status !== 0) {
|
|
process.exit(result.status);
|
|
}
|
|
}
|
|
|
|
function runCommandSet(commands) {
|
|
for (const commandArgs of commands) {
|
|
runNodeCommand(commandArgs);
|
|
}
|
|
}
|
|
|
|
function main() {
|
|
const mode = process.argv[2];
|
|
|
|
if (mode === "--local") {
|
|
runCommandSet(LOCAL_TEST_COMMANDS);
|
|
return;
|
|
}
|
|
|
|
if (mode === "--network") {
|
|
runCommandSet(NETWORK_TEST_COMMANDS);
|
|
return;
|
|
}
|
|
|
|
runCommandSet(LOCAL_TEST_COMMANDS);
|
|
|
|
if (!isNetworkTestsEnabled()) {
|
|
console.log(
|
|
`[tests] Skipping network integration tests. Set ${NETWORK_TEST_ENV}=1 to enable.`,
|
|
);
|
|
return;
|
|
}
|
|
|
|
console.log(`[tests] ${NETWORK_TEST_ENV} enabled; running network integration tests.`);
|
|
runCommandSet(NETWORK_TEST_COMMANDS);
|
|
}
|
|
|
|
main();
|