feat(skills): audit scan results and block unroutable skills
This commit is contained in:
@@ -11,6 +11,7 @@ import { execSync } from 'child_process';
|
||||
import { platform } from 'os';
|
||||
import type { Skill, SkillManifest, SkillRequirements, SkillTier } from './types.js';
|
||||
import { scanSkillDirectory } from './scanner.js';
|
||||
import { auditLogger } from '../audit/index.js';
|
||||
|
||||
function isStringArray(value: unknown): value is string[] {
|
||||
return Array.isArray(value) && value.every((item) => typeof item === 'string');
|
||||
@@ -200,6 +201,15 @@ export function loadSkill(directory: string, tier: SkillTier): Skill | null {
|
||||
const instructions = readFileSync(instructionsPath, 'utf-8');
|
||||
|
||||
const scan = scanSkillDirectory(absDir);
|
||||
auditLogger?.skillsScan({
|
||||
skill_name: basename(absDir),
|
||||
tier,
|
||||
phase: 'load',
|
||||
ok: scan.ok,
|
||||
error_count: scan.issues.filter(i => i.severity === 'error').length,
|
||||
warn_count: scan.issues.filter(i => i.severity === 'warn').length,
|
||||
issue_codes: Array.from(new Set(scan.issues.map(i => i.code))),
|
||||
});
|
||||
const scanReasons = scan.issues.map((i) => `${i.code}: ${i.message}${i.path ? ` (${basename(i.path)})` : ''}`);
|
||||
|
||||
const inferManifest = (): SkillManifest => {
|
||||
|
||||
Reference in New Issue
Block a user