Stabilize skill-creator CI and package format (#17001)

This commit is contained in:
N. Taylor Mullen
2026-01-18 19:51:05 -08:00
committed by GitHub
parent 20580d754d
commit 9d9e3d1555
2 changed files with 28 additions and 6 deletions

View File

@@ -66,14 +66,15 @@ describe('skill-creator scripts e2e', () => {
// 4. Fix SKILL.md (remove TODOs) // 4. Fix SKILL.md (remove TODOs)
let content = fs.readFileSync(path.join(skillDir, 'SKILL.md'), 'utf8'); let content = fs.readFileSync(path.join(skillDir, 'SKILL.md'), 'utf8');
content = content.replace(/TODO: .+/g, 'Fixed'); // More aggressive global replace for all TODO patterns
content = content.replace(/\[TODO: .+/g, 'Fixed'); content = content.replace(/TODO:[^\n]*/g, 'Fixed');
content = content.replace(/\[TODO:[^\]]*\]/g, 'Fixed');
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content); fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content);
// Also remove TODOs from example scripts // Also remove TODOs from example scripts
const exampleScriptPath = path.join(skillDir, 'scripts/example_script.cjs'); const exampleScriptPath = path.join(skillDir, 'scripts/example_script.cjs');
let scriptContent = fs.readFileSync(exampleScriptPath, 'utf8'); let scriptContent = fs.readFileSync(exampleScriptPath, 'utf8');
scriptContent = scriptContent.replace(/TODO: .+/g, 'Fixed'); scriptContent = scriptContent.replace(/TODO:[^\n]*/g, 'Fixed');
fs.writeFileSync(exampleScriptPath, scriptContent); fs.writeFileSync(exampleScriptPath, scriptContent);
// 4. Validate again (should pass now) // 4. Validate again (should pass now)
@@ -90,7 +91,13 @@ describe('skill-creator scripts e2e', () => {
expect(fs.existsSync(skillFile)).toBe(true); expect(fs.existsSync(skillFile)).toBe(true);
// 6. Verify zip content (should NOT have nested directory) // 6. Verify zip content (should NOT have nested directory)
const zipList = execSync(`unzip -l "${skillFile}"`, { encoding: 'utf8' }); // Use unzip -l if available, otherwise fallback to tar -tf (common on Windows)
let zipList: string;
try {
zipList = execSync(`unzip -l "${skillFile}"`, { encoding: 'utf8' });
} catch {
zipList = execSync(`tar -tf "${skillFile}"`, { encoding: 'utf8' });
}
expect(zipList).toContain('SKILL.md'); expect(zipList).toContain('SKILL.md');
expect(zipList).not.toContain(`${skillName}/SKILL.md`); expect(zipList).not.toContain(`${skillName}/SKILL.md`);
}); });

View File

@@ -64,17 +64,32 @@ async function main() {
// -r: recursive // -r: recursive
// -x: exclude patterns // -x: exclude patterns
// Run the zip command from within the directory to avoid parent folder nesting // Run the zip command from within the directory to avoid parent folder nesting
const zipProcess = spawnSync('zip', ['-r', outputFilename, '.'], { let zipProcess = spawnSync('zip', ['-r', outputFilename, '.'], {
cwd: skillPath, cwd: skillPath,
stdio: 'inherit', stdio: 'inherit',
}); });
if (zipProcess.error || zipProcess.status !== 0) {
// Fallback to tar --format=zip if zip is not available (common on Windows)
console.log('zip command not found, falling back to tar...');
zipProcess = spawnSync(
'tar',
['-a', '-c', '--format=zip', '-f', outputFilename, '.'],
{
cwd: skillPath,
stdio: 'inherit',
},
);
}
if (zipProcess.error) { if (zipProcess.error) {
throw zipProcess.error; throw zipProcess.error;
} }
if (zipProcess.status !== 0) { if (zipProcess.status !== 0) {
throw new Error(`zip command failed with exit code ${zipProcess.status}`); throw new Error(
`Packaging command failed with exit code ${zipProcess.status}`,
);
} }
console.log(`✅ Successfully packaged skill to: ${outputFilename}`); console.log(`✅ Successfully packaged skill to: ${outputFilename}`);