@forge/manifest
13.2.0-next.513.2.0-next.4-experimental-28c9ab7
out/validators/modules-validators/rovo/skill-file-rules.js−
out/validators/modules-validators/rovo/skill-file-rules.jsDeleted−175
Index: package/out/validators/modules-validators/rovo/skill-file-rules.js
===================================================================
--- package/out/validators/modules-validators/rovo/skill-file-rules.js
+++ package/out/validators/modules-validators/rovo/skill-file-rules.js
@@ -1,175 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createAlwaysFailValidator = exports.buildReferencedFileValidators = exports.buildMetadataValueValidators = exports.buildUnknownFrontmatterFieldValidators = exports.skillValidationRules = exports.isRecord = exports.allowedFrontmatterFields = void 0;
-const text_1 = require("../../../text");
-const fs_1 = require("fs");
-const path_1 = require("path");
-exports.allowedFrontmatterFields = new Set([
- 'name',
- 'description',
- 'compatibility',
- 'metadata',
- 'license',
- 'allowed-tools'
-]);
-const nameRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
-const normalizeTools = (tools) => [...new Set(tools.map((tool) => tool.trim()).filter(Boolean))].sort();
-const parseTools = (allowedTools) => allowedTools
- .split(' ')
- .map((tool) => tool.trim())
- .filter(Boolean);
-const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
-const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
-exports.isRecord = isRecord;
-exports.skillValidationRules = [
- {
- errorType: 'error',
- check: ({ frontmatter }) => frontmatter.name !== undefined,
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileNameRequired(key)
- },
- {
- errorType: 'error',
- check: ({ frontmatter }) => {
- const name = frontmatter.name;
- return name === undefined || (typeof name === 'string' && name.length >= 1 && name.length <= 64);
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileNameLength(key)
- },
- {
- errorType: 'error',
- check: ({ frontmatter }) => {
- const name = frontmatter.name;
- return name === undefined || typeof name !== 'string' || nameRegex.test(name);
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileNameFormat(key)
- },
- {
- errorType: 'error',
- check: ({ frontmatter, parentDirectoryName }) => {
- const name = frontmatter.name;
- return name === undefined || typeof name !== 'string' || name === parentDirectoryName;
- },
- errorMessageGenerator: ({ skill: { key }, parentDirectoryName }) => text_1.errors.modules.rovo.skillFileNameMustMatchDirectory(key, parentDirectoryName)
- },
- {
- errorType: 'error',
- check: ({ frontmatter }) => frontmatter.description !== undefined,
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileDescriptionRequired(key)
- },
- {
- errorType: 'error',
- check: ({ frontmatter }) => {
- const description = frontmatter.description;
- return (description === undefined ||
- (typeof description === 'string' && description.length >= 1 && description.length <= 1024));
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileDescriptionLength(key)
- },
- {
- errorType: 'warning',
- check: ({ frontmatter }) => {
- const description = frontmatter.description;
- return description === undefined || typeof description !== 'string' || description.length >= 50;
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileDescriptionTooShort(key)
- },
- {
- errorType: 'error',
- check: ({ frontmatter }) => {
- const compatibility = frontmatter.compatibility;
- return compatibility === undefined || typeof compatibility === 'string';
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileCompatibilityMustBeString(key)
- },
- {
- errorType: 'error',
- check: ({ frontmatter }) => {
- const compatibility = frontmatter.compatibility;
- return (compatibility === undefined ||
- typeof compatibility !== 'string' ||
- (compatibility.length >= 1 && compatibility.length <= 500));
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileCompatibilityLength(key)
- },
- {
- errorType: 'error',
- check: ({ metadata }) => metadata === undefined || (0, exports.isRecord)(metadata),
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileMetadataInvalid(key)
- },
- {
- errorType: 'error',
- check: ({ allowedTools }) => {
- return allowedTools === undefined || (typeof allowedTools === 'string' && /^\S+(?: \S+)*$/.test(allowedTools));
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileAllowedToolsInvalid(key)
- },
- {
- errorType: 'error',
- check: ({ allowedTools, dependencyTools }) => {
- if (allowedTools === undefined || typeof allowedTools !== 'string' || !/^\S+(?: \S+)*$/.test(allowedTools)) {
- return true;
- }
- const manifestTools = normalizeTools(dependencyTools);
- const frontmatterTools = normalizeTools(parseTools(allowedTools));
- const allowedToolsSet = new Set(frontmatterTools);
- return manifestTools.every((tool) => allowedToolsSet.has(tool));
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileAllowedToolsMismatch(key)
- },
- {
- errorType: 'error',
- check: ({ frontmatter }) => {
- const license = frontmatter.license;
- return license === undefined || typeof license === 'string';
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileLicenseMustBeString(key)
- },
- {
- errorType: 'warning',
- check: ({ body }) => body.trim().length > 0,
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileBodyEmpty(key)
- },
- {
- errorType: 'warning',
- check: ({ body, bodyLines }) => body.trim().length === 0 || bodyLines.length <= 500,
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileBodyTooLong(key)
- },
- {
- errorType: 'warning',
- check: ({ body, dependencyTools }) => {
- if (body.trim().length === 0) {
- return true;
- }
- const tools = normalizeTools(dependencyTools);
- return tools.every((tool) => new RegExp(`\\b${escapeRegExp(tool)}\\b`).test(body));
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileToolsNotMentioned(key)
- }
-];
-const buildUnknownFrontmatterFieldValidators = (context) => context.unknownFrontmatterFields.map((field) => ({
- check: () => false,
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileUnknownFrontmatterField(key, field),
- errorType: 'error'
-}));
-exports.buildUnknownFrontmatterFieldValidators = buildUnknownFrontmatterFieldValidators;
-const buildMetadataValueValidators = (context) => context.metadataEntries.map((entry) => ({
- check: () => typeof entry[1] === 'string',
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileMetadataInvalid(key),
- errorType: 'error'
-}));
-exports.buildMetadataValueValidators = buildMetadataValueValidators;
-const buildReferencedFileValidators = (context) => context.referencedBodyFiles.map((referencedBodyFile) => ({
- check: ({ skillDirectory }) => {
- const referencedFilePath = (0, path_1.resolve)(skillDirectory, referencedBodyFile);
- return (0, fs_1.existsSync)(referencedFilePath) && (0, fs_1.statSync)(referencedFilePath).isFile();
- },
- errorMessageGenerator: ({ skill: { key } }) => text_1.errors.modules.rovo.skillFileReferencedFileMissing(key, referencedBodyFile),
- errorType: 'warning'
-}));
-exports.buildReferencedFileValidators = buildReferencedFileValidators;
-const createAlwaysFailValidator = (errorType, errorMessageGenerator) => ({
- check: () => false,
- errorMessageGenerator: () => errorMessageGenerator(),
- errorType
-});
-exports.createAlwaysFailValidator = createAlwaysFailValidator;