@forge/manifest
13.2.0-next.513.2.0-next.4-experimental-28c9ab7
out/validators/modules-validators/rovo/validate-skill-file.js−
out/validators/modules-validators/rovo/validate-skill-file.jsDeleted−175
Index: package/out/validators/modules-validators/rovo/validate-skill-file.js
===================================================================
--- package/out/validators/modules-validators/rovo/validate-skill-file.js
+++ package/out/validators/modules-validators/rovo/validate-skill-file.js
@@ -1,175 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.validateSkillFile = void 0;
-const tslib_1 = require("tslib");
-const types_1 = require("../../../types");
-const text_1 = require("../../../text");
-const utils_1 = require("../../../utils");
-const fs_1 = require("fs");
-const path_1 = require("path");
-const yaml_1 = tslib_1.__importDefault(require("yaml"));
-const skill_file_rules_1 = require("./skill-file-rules");
-const referencedFileRegex = /(?:^|[^\w/.-])((?:scripts|references|assets)\/[A-Za-z0-9_./-]+)/g;
-const trailingPunctuationRegex = /[.,:;!?)]$/;
-const extractReferencedBodyFiles = (body) => {
- const referencedFiles = new Set();
- for (const match of body.matchAll(referencedFileRegex)) {
- if (match[1]) {
- referencedFiles.add(match[1].replace(trailingPunctuationRegex, ''));
- }
- }
- return [...referencedFiles];
-};
-const toValidationError = (skillKey, message, level, yamlContentByLine) => ({
- message,
- reference: text_1.References.Modules,
- level,
- ...(0, utils_1.findPosition)(skillKey, yamlContentByLine)
-});
-const collectRuleErrors = (context, validators, yamlContentByLine) => validators
- .filter((validator) => !validator.check(context))
- .map((validator) => {
- const { skill: { key } } = context;
- return toValidationError(key, validator.errorMessageGenerator(context), validator.errorType, yamlContentByLine);
-});
-const resolveSkillFilePath = (skill, manifestDir) => {
- const sourceDir = skill.source?.dir;
- if (typeof sourceDir !== 'string' || sourceDir.trim() === '' || sourceDir.startsWith('..')) {
- return undefined;
- }
- const skillDirectory = (0, path_1.resolve)(manifestDir ?? '', sourceDir);
- const skillFilePath = (0, path_1.resolve)(skillDirectory, 'SKILL.md');
- if (!(0, fs_1.existsSync)(skillDirectory) || !(0, fs_1.existsSync)(skillFilePath)) {
- return undefined;
- }
- return { skillDirectory, skillFilePath };
-};
-const validateSkillFile = (allModules, manifestDir, yamlContentByLine) => {
- const validationErrors = [];
- const rovoSkills = allModules[types_1.AllModuleTypes.RovoSkill];
- rovoSkills?.forEach((skill) => {
- const skillPath = resolveSkillFilePath(skill, manifestDir);
- if (!skillPath) {
- return;
- }
- const { skillDirectory, skillFilePath } = skillPath;
- const skillContent = (0, fs_1.readFileSync)(skillFilePath, 'utf8');
- const normalizedSkillContent = skillContent.replace(/^\uFEFF/, '');
- const lines = normalizedSkillContent.split(/\r?\n/);
- if (lines[0] !== '---') {
- const errorContext = {
- skill,
- skillDirectory,
- parentDirectoryName: (0, path_1.basename)(skillDirectory),
- frontmatter: {},
- body: '',
- bodyLines: [],
- referencedBodyFiles: [],
- dependencyTools: [],
- unknownFrontmatterFields: [],
- metadata: undefined,
- metadataEntries: [],
- allowedTools: undefined
- };
- validationErrors.push(...collectRuleErrors(errorContext, [
- (0, skill_file_rules_1.createAlwaysFailValidator)('error', () => text_1.errors.modules.rovo.skillFileMissingFrontmatterDelimiters(skill.key))
- ], yamlContentByLine));
- return;
- }
- const frontmatterEndIndex = lines.findIndex((line, index) => index > 0 && line === '---');
- if (frontmatterEndIndex === -1) {
- const errorContext = {
- skill,
- skillDirectory,
- parentDirectoryName: (0, path_1.basename)(skillDirectory),
- frontmatter: {},
- body: '',
- bodyLines: [],
- referencedBodyFiles: [],
- dependencyTools: [],
- unknownFrontmatterFields: [],
- metadata: undefined,
- metadataEntries: [],
- allowedTools: undefined
- };
- validationErrors.push(...collectRuleErrors(errorContext, [
- (0, skill_file_rules_1.createAlwaysFailValidator)('error', () => text_1.errors.modules.rovo.skillFileMissingFrontmatterDelimiters(skill.key))
- ], yamlContentByLine));
- return;
- }
- const frontmatterContent = lines.slice(1, frontmatterEndIndex).join('\n');
- const body = lines.slice(frontmatterEndIndex + 1).join('\n');
- const bodyLines = body.split(/\r?\n/);
- const referencedBodyFiles = extractReferencedBodyFiles(body);
- let parsed;
- try {
- parsed = yaml_1.default.parse(frontmatterContent);
- }
- catch {
- const errorContext = {
- skill,
- skillDirectory,
- parentDirectoryName: (0, path_1.basename)(skillDirectory),
- frontmatter: {},
- body,
- bodyLines,
- referencedBodyFiles,
- dependencyTools: [],
- unknownFrontmatterFields: [],
- metadata: undefined,
- metadataEntries: [],
- allowedTools: undefined
- };
- validationErrors.push(...collectRuleErrors(errorContext, [(0, skill_file_rules_1.createAlwaysFailValidator)('error', () => text_1.errors.modules.rovo.skillFileFrontmatterYamlInvalid(skill.key))], yamlContentByLine));
- return;
- }
- if (!(0, skill_file_rules_1.isRecord)(parsed)) {
- const errorContext = {
- skill,
- skillDirectory,
- parentDirectoryName: (0, path_1.basename)(skillDirectory),
- frontmatter: {},
- body,
- bodyLines,
- referencedBodyFiles,
- dependencyTools: [],
- unknownFrontmatterFields: [],
- metadata: undefined,
- metadataEntries: [],
- allowedTools: undefined
- };
- validationErrors.push(...collectRuleErrors(errorContext, [(0, skill_file_rules_1.createAlwaysFailValidator)('error', () => text_1.errors.modules.rovo.skillFileFrontmatterYamlInvalid(skill.key))], yamlContentByLine));
- return;
- }
- const declaredToolDependencies = skill.dependencies?.tools;
- const dependencyTools = Array.isArray(declaredToolDependencies)
- ? declaredToolDependencies.filter((tool) => typeof tool === 'string')
- : [];
- const context = {
- skill,
- skillDirectory,
- parentDirectoryName: (0, path_1.basename)(skillDirectory),
- frontmatter: parsed,
- body,
- bodyLines,
- referencedBodyFiles,
- dependencyTools,
- unknownFrontmatterFields: Object.keys(parsed).filter((field) => !skill_file_rules_1.allowedFrontmatterFields.has(field)),
- metadata: parsed.metadata,
- metadataEntries: (0, skill_file_rules_1.isRecord)(parsed.metadata) ? Object.entries(parsed.metadata) : [],
- allowedTools: parsed['allowed-tools']
- };
- const unknownFieldValidators = (0, skill_file_rules_1.buildUnknownFrontmatterFieldValidators)(context);
- const metadataValueValidators = (0, skill_file_rules_1.buildMetadataValueValidators)(context);
- const referencedFileValidators = (0, skill_file_rules_1.buildReferencedFileValidators)(context);
- const validators = [
- ...unknownFieldValidators,
- ...skill_file_rules_1.skillValidationRules,
- ...metadataValueValidators,
- ...referencedFileValidators
- ];
- validationErrors.push(...collectRuleErrors(context, validators, yamlContentByLine));
- });
- return validationErrors;
-};
-exports.validateSkillFile = validateSkillFile;