mirror of
https://github.com/affaan-m/ECC.git
synced 2026-09-28 20:45:11 +02:00
57 lines
2.6 KiB
JavaScript
57 lines
2.6 KiB
JavaScript
#!/usr/bin/env node
|
|
'use strict';
|
|
|
|
const { loadContextRegistry, loadSkillTriggers } = require('../lib/context-pack-registry');
|
|
const { compileContextProfile } = require('../lib/context-profiles');
|
|
const { digestObject } = require('../lib/context-profile-support');
|
|
|
|
function validate(repoRoot) {
|
|
const registry = loadContextRegistry({ repoRoot });
|
|
const { triggers, manifest } = loadSkillTriggers({ repoRoot });
|
|
const known = new Set(registry.entries.map(entry => entry.id));
|
|
const unknown = Object.keys(triggers).filter(id => !known.has(id));
|
|
if (unknown.length) throw new Error(`Skill triggers reference unknown skills: ${unknown.slice(0, 3).join(', ')}`);
|
|
if (manifest && manifest.registryDigest && manifest.registryDigest !== registry.registryDigest) {
|
|
throw new Error('Skill triggers manifest is stale: regenerate with scripts/dev/generate-skill-triggers.js');
|
|
}
|
|
if (manifest && manifest.triggersDigest && digestObject(triggers) !== manifest.triggersDigest) {
|
|
throw new Error('Skill triggers digest mismatch: manifest was edited without updating triggersDigest');
|
|
}
|
|
for (const list of Object.values(triggers)) {
|
|
for (const phrase of list) {
|
|
if (phrase.length > 80) throw new Error(`Skill trigger exceeds 80 characters: ${phrase.slice(0, 40)}`);
|
|
}
|
|
}
|
|
const profiles = ['lean@1', 'full@1'];
|
|
for (const profileId of profiles) {
|
|
for (const target of registry.targets) {
|
|
compileContextProfile({ repoRoot, profileId, target });
|
|
}
|
|
}
|
|
return {
|
|
status: 'success', skillCount: registry.entries.length,
|
|
profileCount: profiles.length, targetCount: registry.targets.length,
|
|
projectionCount: profiles.length * registry.targets.length,
|
|
registryDigest: registry.registryDigest, nativeCertification: 'unobserved',
|
|
triggerCoverage: { skills: manifest ? manifest.coverage.skills : 0, withTriggers: Object.keys(triggers).length },
|
|
};
|
|
}
|
|
|
|
function main(args = process.argv.slice(2)) {
|
|
try {
|
|
for (const arg of args) {
|
|
if (arg !== '--json') throw new Error(`Unknown argument: ${arg}`);
|
|
}
|
|
const result = validate();
|
|
console.log(args.includes('--json') ? JSON.stringify(result, null, 2)
|
|
: `Context profiles valid: ${result.skillCount} skills, ${result.projectionCount} profile/target projections, triggers ${result.triggerCoverage.withTriggers}/${result.triggerCoverage.skills || result.skillCount}. Native certification: unobserved.`);
|
|
return 0;
|
|
} catch (error) {
|
|
console.error(`Context profile validation failed: ${error.message}`);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (require.main === module) process.exitCode = main();
|
|
module.exports = { main, validate };
|