Fix skill check for skipped Claude template

This commit is contained in:
Ghita Filali 2026-05-31 03:03:23 +02:00
parent 26bd9fc1fc
commit fe86a35aab
2 changed files with 37 additions and 4 deletions

View File

@ -10,12 +10,14 @@
import { validateSkill } from '../test/helpers/skill-parser';
import { discoverTemplates, discoverSkillFiles } from './discover-skills';
import { ALL_HOST_CONFIGS, getExternalHosts, getHostConfig } from '../hosts/index';
import * as fs from 'fs';
import * as path from 'path';
import { execSync } from 'child_process';
const ROOT = path.resolve(import.meta.dir, '..');
const ROOT_REALPATH = fs.realpathSync(ROOT);
const PRIMARY_HOST_CONFIG = getHostConfig('claude');
function isRepoRootSymlink(candidateDir: string): boolean {
try {
@ -25,6 +27,19 @@ function isRepoRootSymlink(candidateDir: string): boolean {
}
}
function skillDirForTemplateOutput(output: string): string | null {
const normalized = output.replace(/\\/g, '/');
const parts = normalized.split('/');
if (parts.length !== 2 || parts[1] !== 'SKILL.md') return null;
return parts[0];
}
function isSkippedForPrimaryHost(output: string): boolean {
const skillDir = skillDirForTemplateOutput(output);
if (!skillDir) return false;
return PRIMARY_HOST_CONFIG.generation.skipSkills?.includes(skillDir) ?? false;
}
// Find all SKILL.md files (dynamic discovery — no hardcoded list)
const SKILL_FILES = discoverSkillFiles(ROOT);
@ -73,6 +88,10 @@ for (const { tmpl, output } of TEMPLATES) {
continue;
}
if (!fs.existsSync(outPath)) {
if (isSkippedForPrimaryHost(output)) {
console.log(` ⏭️ ${output.padEnd(30)} — intentionally skipped for ${PRIMARY_HOST_CONFIG.displayName}`);
continue;
}
hasErrors = true;
console.log(` \u274c ${output.padEnd(30)} — generated file missing! Run: bun run gen:skill-docs`);
continue;
@ -90,8 +109,6 @@ for (const file of SKILL_FILES) {
// ─── External Host Skills (config-driven) ───────────────────
import { getExternalHosts } from '../hosts/index';
for (const hostConfig of getExternalHosts()) {
const hostDir = path.join(ROOT, hostConfig.hostSubdir, 'skills');
if (fs.existsSync(hostDir)) {
@ -130,8 +147,6 @@ for (const hostConfig of getExternalHosts()) {
// ─── Freshness (config-driven) ──────────────────────────────
import { ALL_HOST_CONFIGS } from '../hosts/index';
for (const hostConfig of ALL_HOST_CONFIGS) {
const hostFlag = hostConfig.name === 'claude' ? '' : ` --host ${hostConfig.name}`;
console.log(`\n Freshness (${hostConfig.displayName}):`);

18
test/skill-check.test.ts Normal file
View File

@ -0,0 +1,18 @@
import { describe, expect, test } from 'bun:test';
import { spawnSync } from 'child_process';
import * as path from 'path';
const ROOT = path.resolve(import.meta.dir, '..');
describe('skill:check', () => {
test('accepts template outputs intentionally skipped for the primary host', () => {
const result = spawnSync('bun', ['run', 'scripts/skill-check.ts'], {
cwd: ROOT,
encoding: 'utf8',
});
expect(result.status).toBe(0);
expect(result.stdout).toContain('claude/SKILL.md');
expect(result.stdout).toContain('intentionally skipped for Claude Code');
});
});