renma 0.15.2 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -1
- package/README.md +134 -34
- package/dist/agent-skills.d.ts +77 -0
- package/dist/agent-skills.d.ts.map +1 -0
- package/dist/agent-skills.js +468 -0
- package/dist/agent-skills.js.map +1 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +38 -5
- package/dist/catalog.js.map +1 -1
- package/dist/cli-help.d.ts +7 -7
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +13 -2
- package/dist/cli-help.js.map +1 -1
- package/dist/commands/scaffold.d.ts.map +1 -1
- package/dist/commands/scaffold.js +45 -14
- package/dist/commands/scaffold.js.map +1 -1
- package/dist/commands/suggest-metadata.d.ts +3 -1
- package/dist/commands/suggest-metadata.d.ts.map +1 -1
- package/dist/commands/suggest-metadata.js +179 -6
- package/dist/commands/suggest-metadata.js.map +1 -1
- package/dist/diagnostic-ids.d.ts +29 -0
- package/dist/diagnostic-ids.d.ts.map +1 -1
- package/dist/diagnostic-ids.js +28 -0
- package/dist/diagnostic-ids.js.map +1 -1
- package/dist/discovery.d.ts +22 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +124 -21
- package/dist/discovery.js.map +1 -1
- package/dist/metadata.d.ts +3 -1
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +166 -29
- package/dist/metadata.js.map +1 -1
- package/dist/model.d.ts +1 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +16 -1
- package/dist/report.js.map +1 -1
- package/dist/rules.d.ts.map +1 -1
- package/dist/rules.js +33 -22
- package/dist/rules.js.map +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +3 -1
- package/dist/scanner.js.map +1 -1
- package/dist/security-diagnostics.d.ts.map +1 -1
- package/dist/security-diagnostics.js +98 -35
- package/dist/security-diagnostics.js.map +1 -1
- package/dist/security-policy-inventory.js +11 -4
- package/dist/security-policy-inventory.js.map +1 -1
- package/dist/security-policy.d.ts +27 -1
- package/dist/security-policy.d.ts.map +1 -1
- package/dist/security-policy.js +247 -34
- package/dist/security-policy.js.map +1 -1
- package/dist/skill-migration.d.ts +30 -0
- package/dist/skill-migration.d.ts.map +1 -0
- package/dist/skill-migration.js +566 -0
- package/dist/skill-migration.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/yaml-frontmatter.d.ts +26 -0
- package/dist/yaml-frontmatter.d.ts.map +1 -0
- package/dist/yaml-frontmatter.js +114 -0
- package/dist/yaml-frontmatter.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { AGENT_SKILL_DIAGNOSTIC_IDS as IDS, } from "./diagnostic-ids.js";
|
|
3
|
+
import { classifyRepositorySkillEntrypointPath } from "./discovery.js";
|
|
4
|
+
import { parseAgentSkillFrontmatter, } from "./yaml-frontmatter.js";
|
|
5
|
+
export const AGENT_SKILLS_SPECIFICATION = "https://agentskills.io/specification";
|
|
6
|
+
export const AGENT_SKILLS_VALIDATION_PROFILE = "agentskills.io/specification@2026-07-11";
|
|
7
|
+
export const AGENT_SKILLS_TOP_LEVEL_FIELDS = [
|
|
8
|
+
"name",
|
|
9
|
+
"description",
|
|
10
|
+
"license",
|
|
11
|
+
"compatibility",
|
|
12
|
+
"metadata",
|
|
13
|
+
"allowed-tools",
|
|
14
|
+
];
|
|
15
|
+
export const LEGACY_RENMA_SKILL_FIELDS = [
|
|
16
|
+
"id",
|
|
17
|
+
"title",
|
|
18
|
+
"version",
|
|
19
|
+
"owner",
|
|
20
|
+
"status",
|
|
21
|
+
"purpose",
|
|
22
|
+
"last_reviewed_at",
|
|
23
|
+
"review_cycle",
|
|
24
|
+
"expires_at",
|
|
25
|
+
"tags",
|
|
26
|
+
"when_to_use",
|
|
27
|
+
"when_not_to_use",
|
|
28
|
+
"requires_context",
|
|
29
|
+
"optional_context",
|
|
30
|
+
"requires_lens",
|
|
31
|
+
"optional_lens",
|
|
32
|
+
"conflicts",
|
|
33
|
+
"superseded_by",
|
|
34
|
+
"allowed_data",
|
|
35
|
+
"network_allowed",
|
|
36
|
+
"external_upload_allowed",
|
|
37
|
+
"secrets_allowed",
|
|
38
|
+
"requires_human_approval",
|
|
39
|
+
"forbidden_inputs",
|
|
40
|
+
"approved_network_destinations",
|
|
41
|
+
"approved_upload_destinations",
|
|
42
|
+
"security_profile",
|
|
43
|
+
];
|
|
44
|
+
const ALLOWED_TOP_LEVEL_FIELDS = new Set(AGENT_SKILLS_TOP_LEVEL_FIELDS);
|
|
45
|
+
const LEGACY_FIELDS = new Set(LEGACY_RENMA_SKILL_FIELDS);
|
|
46
|
+
const MAX_NAME_LENGTH = 64;
|
|
47
|
+
const MAX_DESCRIPTION_LENGTH = 1024;
|
|
48
|
+
const MAX_COMPATIBILITY_LENGTH = 500;
|
|
49
|
+
/** Validate every discovered Skill using one locally versioned Agent Skills profile. */
|
|
50
|
+
export function validateAgentSkills(documents) {
|
|
51
|
+
const results = documents
|
|
52
|
+
.filter((document) => document.artifact.kind === "skill")
|
|
53
|
+
.map(validateAgentSkill)
|
|
54
|
+
.sort((left, right) => left.path.localeCompare(right.path));
|
|
55
|
+
return {
|
|
56
|
+
specification: AGENT_SKILLS_SPECIFICATION,
|
|
57
|
+
profile: AGENT_SKILLS_VALIDATION_PROFILE,
|
|
58
|
+
totalSkillCount: results.length,
|
|
59
|
+
validSkillCount: results.filter((result) => result.valid).length,
|
|
60
|
+
invalidSkillCount: results.filter((result) => !result.valid).length,
|
|
61
|
+
canonicalSkillCount: results.filter((result) => result.format === "agent-skills").length,
|
|
62
|
+
legacySkillCount: results.filter((result) => result.format === "renma-legacy").length,
|
|
63
|
+
hybridSkillCount: results.filter((result) => result.format === "hybrid")
|
|
64
|
+
.length,
|
|
65
|
+
warningCount: results.reduce((count, result) => count + result.warningCount, 0),
|
|
66
|
+
results,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Validate one discovered Skill without changing any operational metadata reader. */
|
|
70
|
+
export function validateAgentSkill(document) {
|
|
71
|
+
const frontmatter = parseAgentSkillFrontmatter(document.artifact.content);
|
|
72
|
+
return validateAgentSkillFrontmatter(document, frontmatter);
|
|
73
|
+
}
|
|
74
|
+
/** Parse and validate a Skill once for canonical operational consumers. */
|
|
75
|
+
export function inspectAgentSkill(document) {
|
|
76
|
+
const frontmatter = parseAgentSkillFrontmatter(document.artifact.content);
|
|
77
|
+
return {
|
|
78
|
+
frontmatter,
|
|
79
|
+
validation: validateAgentSkillFrontmatter(document, frontmatter),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Resolve the YAML description value used by Skill quality rules. */
|
|
83
|
+
export function resolvedAgentSkillDescription(document) {
|
|
84
|
+
if (document.artifact.kind !== "skill")
|
|
85
|
+
return undefined;
|
|
86
|
+
return nonEmptyString(parseAgentSkillFrontmatter(document.artifact.content).values.description);
|
|
87
|
+
}
|
|
88
|
+
function validateAgentSkillFrontmatter(document, frontmatter) {
|
|
89
|
+
const issues = [];
|
|
90
|
+
const name = nonEmptyString(frontmatter.values.name);
|
|
91
|
+
const description = nonEmptyString(frontmatter.values.description);
|
|
92
|
+
const legacyFields = uniqueSorted(frontmatter.fields
|
|
93
|
+
.map((field) => field.key)
|
|
94
|
+
.filter((field) => LEGACY_FIELDS.has(field)));
|
|
95
|
+
const canonicalRenmaFields = uniqueSorted(frontmatter.metadataFields
|
|
96
|
+
.map((field) => field.key)
|
|
97
|
+
.filter((field) => field.startsWith("renma.")));
|
|
98
|
+
const hasAgentSkillsIdentity = Boolean(name && description);
|
|
99
|
+
const format = classifyAgentSkillFormat(hasAgentSkillsIdentity, legacyFields.length > 0);
|
|
100
|
+
if (path.posix.basename(document.artifact.path) !== "SKILL.md") {
|
|
101
|
+
issues.push(createIssue(document, IDS.AS_NONCANONICAL_FILENAME, "error", "specification", "Agent Skills requires the skill entrypoint filename to be exactly SKILL.md.", 1));
|
|
102
|
+
}
|
|
103
|
+
if (!frontmatter.present) {
|
|
104
|
+
issues.push(createIssue(document, IDS.AS_MISSING_FRONTMATTER, "error", "specification", "SKILL.md must start with YAML frontmatter delimited by ---.", 1));
|
|
105
|
+
}
|
|
106
|
+
else if (!frontmatter.closed) {
|
|
107
|
+
issues.push(createIssue(document, IDS.AS_UNCLOSED_FRONTMATTER, "error", "specification", "SKILL.md frontmatter must be closed with --- before the Markdown body.", 1));
|
|
108
|
+
}
|
|
109
|
+
for (const error of frontmatter.errors) {
|
|
110
|
+
issues.push({
|
|
111
|
+
...createIssue(document, IDS.AS_INVALID_YAML, "error", "specification", `Invalid Agent Skills YAML frontmatter: ${error.message}`, error.line),
|
|
112
|
+
details: { yamlCode: error.code },
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (frontmatter.present &&
|
|
116
|
+
frontmatter.closed &&
|
|
117
|
+
frontmatter.errors.length === 0 &&
|
|
118
|
+
!frontmatter.mapping) {
|
|
119
|
+
issues.push(createIssue(document, IDS.AS_FRONTMATTER_NOT_MAPPING, "error", "specification", "Agent Skills frontmatter must parse to a YAML mapping.", 2));
|
|
120
|
+
}
|
|
121
|
+
for (const duplicate of frontmatter.duplicateFields) {
|
|
122
|
+
issues.push(fieldIssue(document, duplicate, IDS.AS_DUPLICATE_FIELD, `Agent Skills frontmatter field "${duplicate.key}" is declared more than once.`));
|
|
123
|
+
}
|
|
124
|
+
for (const duplicate of frontmatter.duplicateMetadataKeys) {
|
|
125
|
+
issues.push(fieldIssue(document, duplicate, IDS.AS_DUPLICATE_METADATA_KEY, `Agent Skills metadata key "${duplicate.key}" is declared more than once.`, `metadata.${duplicate.key}`));
|
|
126
|
+
}
|
|
127
|
+
for (const unexpected of frontmatter.fields.filter((field) => !ALLOWED_TOP_LEVEL_FIELDS.has(field.key))) {
|
|
128
|
+
const legacyField = LEGACY_FIELDS.has(unexpected.key);
|
|
129
|
+
issues.push(fieldIssue(document, unexpected, IDS.AS_UNEXPECTED_TOP_LEVEL_FIELD, legacyField
|
|
130
|
+
? `Pre-0.16 top-level Skill field "${unexpected.key}" is not operationally supported in Renma 0.16.0. Migrate the Skill to Agent Skills metadata.renma.* before catalog, ownership, graph, or security consumers trust this metadata.`
|
|
131
|
+
: `Unexpected top-level Agent Skills field "${unexpected.key}". Renma extensions belong under metadata using renma.* string keys.`));
|
|
132
|
+
}
|
|
133
|
+
validateName(document, frontmatter, issues);
|
|
134
|
+
validateDescription(document, frontmatter, issues);
|
|
135
|
+
validateOptionalFields(document, frontmatter, issues);
|
|
136
|
+
validateMetadata(document, frontmatter, issues);
|
|
137
|
+
issues.push(...authoringIssues(document, frontmatter, description));
|
|
138
|
+
issues.sort((left, right) => {
|
|
139
|
+
const lineOrder = left.startLine - right.startLine;
|
|
140
|
+
return lineOrder || left.code.localeCompare(right.code);
|
|
141
|
+
});
|
|
142
|
+
const errorCount = issues.filter((issue) => issue.severity === "error").length;
|
|
143
|
+
const warningCount = issues.length - errorCount;
|
|
144
|
+
const entrypointPath = classifyRepositorySkillEntrypointPath(document.artifact.path);
|
|
145
|
+
const migrationRecommended = legacyFields.length > 0 ||
|
|
146
|
+
(entrypointPath !== undefined && entrypointPath.kind !== "canonical");
|
|
147
|
+
return {
|
|
148
|
+
path: document.artifact.path,
|
|
149
|
+
format,
|
|
150
|
+
valid: errorCount === 0,
|
|
151
|
+
...(name ? { name } : {}),
|
|
152
|
+
...(description ? { description } : {}),
|
|
153
|
+
migrationRecommended,
|
|
154
|
+
...(migrationRecommended
|
|
155
|
+
? {
|
|
156
|
+
migrationDirection: "legacy-to-agent-skills",
|
|
157
|
+
migrationCommand: migrationCommand(document.artifact.path),
|
|
158
|
+
}
|
|
159
|
+
: {}),
|
|
160
|
+
legacyFields,
|
|
161
|
+
canonicalRenmaFields,
|
|
162
|
+
errorCount,
|
|
163
|
+
warningCount,
|
|
164
|
+
issues,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function migrationCommand(skillPath) {
|
|
168
|
+
return {
|
|
169
|
+
command: "renma",
|
|
170
|
+
args: ["suggest-metadata", skillPath],
|
|
171
|
+
display: `renma suggest-metadata ${posixShellArgument(skillPath)}`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function posixShellArgument(value) {
|
|
175
|
+
if (/^[A-Za-z0-9_@%+=:,./-]+$/.test(value))
|
|
176
|
+
return value;
|
|
177
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
178
|
+
}
|
|
179
|
+
/** Normalize and validate an Agent Skills YAML name field. */
|
|
180
|
+
export function normalizeAgentSkillNameField(value) {
|
|
181
|
+
return normalizeAndValidateAgentSkillName(value, true);
|
|
182
|
+
}
|
|
183
|
+
/** Normalize and validate a Skill directory name without changing filesystem identity. */
|
|
184
|
+
export function normalizeAgentSkillDirectoryName(value) {
|
|
185
|
+
return normalizeAndValidateAgentSkillName(value, false);
|
|
186
|
+
}
|
|
187
|
+
/** Backward-compatible name for validating an Agent Skills YAML name field. */
|
|
188
|
+
export function validateAgentSkillName(value) {
|
|
189
|
+
return normalizeAgentSkillNameField(value);
|
|
190
|
+
}
|
|
191
|
+
function normalizeAndValidateAgentSkillName(value, trim) {
|
|
192
|
+
if (typeof value !== "string") {
|
|
193
|
+
return {
|
|
194
|
+
normalized: undefined,
|
|
195
|
+
problems: ["must be a non-empty string"],
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
const normalized = (trim ? value.trim() : value).normalize("NFKC");
|
|
199
|
+
const problems = [];
|
|
200
|
+
const length = characterLength(normalized);
|
|
201
|
+
if (length < 1 || length > MAX_NAME_LENGTH)
|
|
202
|
+
problems.push(`must contain 1-${MAX_NAME_LENGTH} Unicode code points`);
|
|
203
|
+
if (normalized !== normalized.toLowerCase())
|
|
204
|
+
problems.push("must equal its lowercase form after NFKC normalization");
|
|
205
|
+
if (!/^[\p{L}\p{N}-]+$/u.test(normalized))
|
|
206
|
+
problems.push("must contain only Unicode letters, Unicode digits, and hyphens");
|
|
207
|
+
if (normalized.startsWith("-") || normalized.endsWith("-"))
|
|
208
|
+
problems.push("must not start or end with a hyphen");
|
|
209
|
+
if (normalized.includes("--"))
|
|
210
|
+
problems.push("must not contain consecutive hyphens");
|
|
211
|
+
return { normalized, problems };
|
|
212
|
+
}
|
|
213
|
+
export function legacyRenmaMetadataKey(field) {
|
|
214
|
+
return LEGACY_FIELDS.has(field)
|
|
215
|
+
? `renma.${field.replaceAll("_", "-")}`
|
|
216
|
+
: undefined;
|
|
217
|
+
}
|
|
218
|
+
function validateName(document, frontmatter, issues) {
|
|
219
|
+
const rawName = frontmatter.values.name;
|
|
220
|
+
const field = firstField(frontmatter, "name");
|
|
221
|
+
if (rawName === undefined ||
|
|
222
|
+
(typeof rawName === "string" && !rawName.trim())) {
|
|
223
|
+
issues.push(createIssue(document, IDS.AS_MISSING_NAME, "error", "specification", "Agent Skills requires a non-empty string name.", field?.startLine ?? 1, "name"));
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (typeof rawName !== "string") {
|
|
227
|
+
issues.push(createIssue(document, IDS.AS_INVALID_NAME, "error", "specification", "Agent Skills name must be a non-empty string.", field?.startLine ?? 1, "name"));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const nameValidation = normalizeAgentSkillNameField(rawName);
|
|
231
|
+
if (nameValidation.problems.length > 0) {
|
|
232
|
+
issues.push(createIssue(document, IDS.AS_INVALID_NAME, "error", "specification", `Invalid Agent Skills name "${rawName}": ${nameValidation.problems.join("; ")}.`, field?.startLine ?? 1, "name"));
|
|
233
|
+
}
|
|
234
|
+
const parent = path.posix.basename(path.posix.dirname(document.artifact.path));
|
|
235
|
+
const parentValidation = normalizeAgentSkillDirectoryName(parent);
|
|
236
|
+
if (nameValidation.normalized !== undefined &&
|
|
237
|
+
parentValidation.normalized !== nameValidation.normalized) {
|
|
238
|
+
issues.push({
|
|
239
|
+
...createIssue(document, IDS.AS_NAME_DIRECTORY_MISMATCH, "error", "specification", `Agent Skills name "${rawName}" must match parent directory "${parent}".`, field?.startLine ?? 1, "name"),
|
|
240
|
+
details: { name: rawName, parentDirectory: parent },
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function validateDescription(document, frontmatter, issues) {
|
|
245
|
+
const raw = frontmatter.values.description;
|
|
246
|
+
const field = firstField(frontmatter, "description");
|
|
247
|
+
if (raw === undefined || (typeof raw === "string" && !raw.trim())) {
|
|
248
|
+
issues.push(createIssue(document, IDS.AS_MISSING_DESCRIPTION, "error", "specification", "Agent Skills requires a non-empty description describing what the skill does and when to use it.", field?.startLine ?? 1, "description"));
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (typeof raw !== "string") {
|
|
252
|
+
issues.push(createIssue(document, IDS.AS_INVALID_DESCRIPTION, "error", "specification", "Agent Skills description must be a non-empty string.", field?.startLine ?? 1, "description"));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (characterLength(raw) > MAX_DESCRIPTION_LENGTH) {
|
|
256
|
+
issues.push(createIssue(document, IDS.AS_DESCRIPTION_TOO_LONG, "error", "specification", `Agent Skills description exceeds ${MAX_DESCRIPTION_LENGTH} characters.`, field?.startLine ?? 1, "description"));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function validateOptionalFields(document, frontmatter, issues) {
|
|
260
|
+
validateOptionalString(document, frontmatter, issues, "license");
|
|
261
|
+
validateOptionalString(document, frontmatter, issues, "allowed-tools");
|
|
262
|
+
const compatibility = frontmatter.values.compatibility;
|
|
263
|
+
if (compatibility === undefined)
|
|
264
|
+
return;
|
|
265
|
+
const field = firstField(frontmatter, "compatibility");
|
|
266
|
+
if (typeof compatibility !== "string" || !compatibility.trim()) {
|
|
267
|
+
issues.push(createIssue(document, IDS.AS_INVALID_COMPATIBILITY, "error", "specification", "Agent Skills compatibility must be a non-empty string when provided.", field?.startLine ?? 1, "compatibility"));
|
|
268
|
+
}
|
|
269
|
+
else if (characterLength(compatibility) > MAX_COMPATIBILITY_LENGTH) {
|
|
270
|
+
issues.push(createIssue(document, IDS.AS_COMPATIBILITY_TOO_LONG, "error", "specification", `Agent Skills compatibility exceeds ${MAX_COMPATIBILITY_LENGTH} characters.`, field?.startLine ?? 1, "compatibility"));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function validateOptionalString(document, frontmatter, issues, fieldName) {
|
|
274
|
+
const value = frontmatter.values[fieldName];
|
|
275
|
+
if (value === undefined || typeof value === "string")
|
|
276
|
+
return;
|
|
277
|
+
const code = fieldName === "license"
|
|
278
|
+
? IDS.AS_INVALID_LICENSE
|
|
279
|
+
: IDS.AS_INVALID_ALLOWED_TOOLS;
|
|
280
|
+
issues.push(createIssue(document, code, "error", "specification", `Agent Skills ${fieldName} must be a string when provided.`, firstField(frontmatter, fieldName)?.startLine ?? 1, fieldName));
|
|
281
|
+
}
|
|
282
|
+
function validateMetadata(document, frontmatter, issues) {
|
|
283
|
+
const metadata = frontmatter.values.metadata;
|
|
284
|
+
if (metadata === undefined)
|
|
285
|
+
return;
|
|
286
|
+
if (!isRecord(metadata) ||
|
|
287
|
+
Object.entries(metadata).some(([key, value]) => typeof key !== "string" || typeof value !== "string")) {
|
|
288
|
+
issues.push(createIssue(document, IDS.AS_INVALID_METADATA, "error", "specification", "Agent Skills metadata must be a mapping from string keys to string values.", firstField(frontmatter, "metadata")?.startLine ?? 1, "metadata"));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function authoringIssues(document, frontmatter, description) {
|
|
292
|
+
if (!description)
|
|
293
|
+
return [];
|
|
294
|
+
const issues = [];
|
|
295
|
+
const bodyLines = collectBodyLines(document, frontmatter);
|
|
296
|
+
const descriptionLine = firstField(frontmatter, "description")?.startLine ?? 1;
|
|
297
|
+
if (!usageBoundaryPattern().test(description)) {
|
|
298
|
+
issues.push(createIssue(document, IDS.RN_DESCRIPTION_MISSING_USAGE_BOUNDARY, "warning", "renma-authoring", "Description should state when the agent should use this skill.", descriptionLine, "description"));
|
|
299
|
+
}
|
|
300
|
+
const bodySelectionBoundary = bodyLines.find((line) => explicitSelectionBoundaryPattern().test(line.text) ||
|
|
301
|
+
line.ancestry.some((heading) => selectionHeadingPattern().test(heading)));
|
|
302
|
+
if (bodySelectionBoundary &&
|
|
303
|
+
!descriptionSelectionBoundaryPattern().test(description)) {
|
|
304
|
+
issues.push(createIssue(document, IDS.RN_DESCRIPTION_OMITS_SELECTION_BOUNDARY, "warning", "renma-authoring", "The body declares a skill-selection exclusion that is absent from the Agent Skills description.", bodySelectionBoundary.line, "description"));
|
|
305
|
+
}
|
|
306
|
+
const constraints = bodyLines.filter((line) => executionConstraintPattern().test(line.text) &&
|
|
307
|
+
!explicitSelectionBoundaryPattern().test(line.text) &&
|
|
308
|
+
!line.ancestry.some((heading) => selectionHeadingPattern().test(heading)));
|
|
309
|
+
const buried = constraints.filter((line) => !line.ancestry.some((heading) => prominentConstraintHeading().test(heading)));
|
|
310
|
+
for (const constraint of buried) {
|
|
311
|
+
issues.push(createIssue(document, IDS.RN_EXECUTION_CONSTRAINT_NOT_PROMINENT, "warning", "renma-authoring", "Execution constraints should appear under a prominent Hard Constraints, Prohibited Actions, Safety Constraints, or equivalent heading.", constraint.line));
|
|
312
|
+
}
|
|
313
|
+
const sections = new Set(constraints.map((line) => line.ancestry.join(" > ")));
|
|
314
|
+
if (constraints.length > 1 && sections.size > 1 && buried.length > 0) {
|
|
315
|
+
issues.push(createIssue(document, IDS.RN_EXECUTION_CONSTRAINT_SCATTERED, "warning", "renma-authoring", "Execution constraints are scattered across sections; centralize them without changing their meaning.", constraints[0]?.line ?? 1));
|
|
316
|
+
}
|
|
317
|
+
for (const constraint of constraints) {
|
|
318
|
+
if (hasNearbyAlternative(constraint, bodyLines))
|
|
319
|
+
continue;
|
|
320
|
+
issues.push(createIssue(document, IDS.RN_EXECUTION_CONSTRAINT_MISSING_ALTERNATIVE, "warning", "renma-authoring", "Execution constraint has no nearby supported alternative or stop behavior. Request human clarification; do not invent one.", constraint.line));
|
|
321
|
+
}
|
|
322
|
+
return issues;
|
|
323
|
+
}
|
|
324
|
+
function collectBodyLines(document, frontmatter) {
|
|
325
|
+
const fenceLines = agentSkillFenceLines(document.lines, frontmatter.bodyStartLine);
|
|
326
|
+
const headings = document.headings
|
|
327
|
+
.filter((heading) => heading.line >= frontmatter.bodyStartLine &&
|
|
328
|
+
!fenceLines.has(heading.line))
|
|
329
|
+
.sort((left, right) => left.line - right.line);
|
|
330
|
+
const ancestry = [];
|
|
331
|
+
const result = [];
|
|
332
|
+
let headingIndex = 0;
|
|
333
|
+
for (let lineNumber = frontmatter.bodyStartLine; lineNumber <= document.lines.length; lineNumber += 1) {
|
|
334
|
+
while (headings[headingIndex]?.line === lineNumber) {
|
|
335
|
+
const heading = headings[headingIndex];
|
|
336
|
+
if (!heading)
|
|
337
|
+
break;
|
|
338
|
+
while (ancestry.at(-1) && ancestry.at(-1).depth >= heading.depth) {
|
|
339
|
+
ancestry.pop();
|
|
340
|
+
}
|
|
341
|
+
ancestry.push({ depth: heading.depth, text: heading.text });
|
|
342
|
+
headingIndex += 1;
|
|
343
|
+
}
|
|
344
|
+
const text = document.lines[lineNumber - 1]?.trim() ?? "";
|
|
345
|
+
if (!text || text.startsWith("#") || fenceLines.has(lineNumber))
|
|
346
|
+
continue;
|
|
347
|
+
result.push({
|
|
348
|
+
line: lineNumber,
|
|
349
|
+
text,
|
|
350
|
+
ancestry: ancestry.map((heading) => heading.text),
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
return result;
|
|
354
|
+
}
|
|
355
|
+
/** Return all Markdown line numbers occupied by backtick or tilde fences. */
|
|
356
|
+
export function agentSkillFenceLines(lines, bodyStartLine) {
|
|
357
|
+
const result = new Set();
|
|
358
|
+
let active;
|
|
359
|
+
for (let index = Math.max(bodyStartLine - 1, 0); index < lines.length; index += 1) {
|
|
360
|
+
const lineNumber = index + 1;
|
|
361
|
+
const line = lines[index] ?? "";
|
|
362
|
+
if (!active) {
|
|
363
|
+
const opening = /^(?: {0,3})(`{3,}|~{3,})/.exec(line);
|
|
364
|
+
if (!opening?.[1])
|
|
365
|
+
continue;
|
|
366
|
+
const marker = opening[1];
|
|
367
|
+
active = {
|
|
368
|
+
character: marker[0],
|
|
369
|
+
length: marker.length,
|
|
370
|
+
};
|
|
371
|
+
result.add(lineNumber);
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
result.add(lineNumber);
|
|
375
|
+
const escapedCharacter = active.character === "`" ? "`" : "~";
|
|
376
|
+
const closing = new RegExp(`^(?: {0,3})${escapedCharacter}{${active.length},}\\s*$`);
|
|
377
|
+
if (closing.test(line))
|
|
378
|
+
active = undefined;
|
|
379
|
+
}
|
|
380
|
+
return result;
|
|
381
|
+
}
|
|
382
|
+
function hasNearbyAlternative(constraint, lines) {
|
|
383
|
+
const sameLineAlternative = textAfterProhibition(constraint.text);
|
|
384
|
+
if (sameLineAlternative !== undefined &&
|
|
385
|
+
alternativeClausePattern().test(sameLineAlternative)) {
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
const index = lines.findIndex((line) => line.line === constraint.line);
|
|
389
|
+
return lines.slice(index + 1, index + 3).some((line) => {
|
|
390
|
+
if (line.ancestry.join(" > ") !== constraint.ancestry.join(" > ")) {
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
if (executionConstraintPattern().test(line.text))
|
|
394
|
+
return false;
|
|
395
|
+
return alternativeClausePattern().test(line.text);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
function textAfterProhibition(text) {
|
|
399
|
+
const prohibition = executionConstraintPattern().exec(text);
|
|
400
|
+
if (!prohibition)
|
|
401
|
+
return undefined;
|
|
402
|
+
const remainder = text.slice(prohibition.index + prohibition[0].length);
|
|
403
|
+
const delimiterIndex = remainder.search(/[.;\n]/);
|
|
404
|
+
return delimiterIndex < 0
|
|
405
|
+
? undefined
|
|
406
|
+
: remainder.slice(delimiterIndex + 1).trim();
|
|
407
|
+
}
|
|
408
|
+
function classifyAgentSkillFormat(hasAgentSkillsIdentity, hasLegacyFields) {
|
|
409
|
+
if (hasAgentSkillsIdentity && hasLegacyFields)
|
|
410
|
+
return "hybrid";
|
|
411
|
+
if (hasAgentSkillsIdentity)
|
|
412
|
+
return "agent-skills";
|
|
413
|
+
if (hasLegacyFields)
|
|
414
|
+
return "renma-legacy";
|
|
415
|
+
return "unknown";
|
|
416
|
+
}
|
|
417
|
+
function firstField(frontmatter, key) {
|
|
418
|
+
return frontmatter.fields.find((field) => field.key === key);
|
|
419
|
+
}
|
|
420
|
+
function fieldIssue(document, field, code, message, fieldName = field.key) {
|
|
421
|
+
return createIssue(document, code, "error", "specification", message, field.startLine, fieldName, field.endLine);
|
|
422
|
+
}
|
|
423
|
+
function createIssue(document, code, severity, category, message, startLine, field, endLine = startLine) {
|
|
424
|
+
return {
|
|
425
|
+
code,
|
|
426
|
+
severity,
|
|
427
|
+
category,
|
|
428
|
+
path: document.artifact.path,
|
|
429
|
+
startLine,
|
|
430
|
+
endLine,
|
|
431
|
+
message,
|
|
432
|
+
...(field ? { field } : {}),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
function nonEmptyString(value) {
|
|
436
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
437
|
+
}
|
|
438
|
+
function uniqueSorted(values) {
|
|
439
|
+
return [...new Set(values)].sort((left, right) => left.localeCompare(right));
|
|
440
|
+
}
|
|
441
|
+
function isRecord(value) {
|
|
442
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
443
|
+
}
|
|
444
|
+
function characterLength(value) {
|
|
445
|
+
return Array.from(value).length;
|
|
446
|
+
}
|
|
447
|
+
function usageBoundaryPattern() {
|
|
448
|
+
return /\b(?:use(?: this skill)? (?:when|for|to)|when (?:a|an|the|you|reviewing|working|handling))\b/i;
|
|
449
|
+
}
|
|
450
|
+
function explicitSelectionBoundaryPattern() {
|
|
451
|
+
return /\b(?:do not use (?:this|the) skill|do not select (?:this|the) skill|use another skill|when not to use (?:this|the) skill)\b/i;
|
|
452
|
+
}
|
|
453
|
+
function descriptionSelectionBoundaryPattern() {
|
|
454
|
+
return /\b(?:do not use|not for|when not to use|use another skill)\b/i;
|
|
455
|
+
}
|
|
456
|
+
function selectionHeadingPattern() {
|
|
457
|
+
return /^(?:do not use(?: this skill)?(?: for| when)?|when not to use(?: this skill)?|selection boundaries?)$/i;
|
|
458
|
+
}
|
|
459
|
+
function executionConstraintPattern() {
|
|
460
|
+
return /\b(?:do not|never|must not|may not|prohibited)\b/i;
|
|
461
|
+
}
|
|
462
|
+
function prominentConstraintHeading() {
|
|
463
|
+
return /^(?:hard |safety |execution )?constraints?$|^prohibited actions?$/i;
|
|
464
|
+
}
|
|
465
|
+
function alternativeClausePattern() {
|
|
466
|
+
return /(?:\binstead\b|\bthen\b|(?:^|[-*+]\s+)stop\b|(?:^|[-*+]\s+)ask\b|\brequest human (?:review|approval)\b|\bescalate\b|\bleave\b.+\bunchanged\b|(?:^|[-*+]\s+)skip\b|\buse\b.+\binstead\b)/i;
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=agent-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-skills.js","sourceRoot":"","sources":["../src/agent-skills.ts"],"names":[],"mappings":"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"}
|
package/dist/catalog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,OAAO,EAIR,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAY,cAAc,EAAE,MAAM,YAAY,CAAC;AAUvE,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,OAAO,EAIR,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAY,cAAc,EAAE,MAAM,YAAY,CAAC;AAUvE,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CA6EA"}
|
package/dist/catalog.js
CHANGED
|
@@ -14,7 +14,7 @@ export function buildCatalog(documents) {
|
|
|
14
14
|
.map((document) => {
|
|
15
15
|
const result = parseAssetMetadata(document);
|
|
16
16
|
const kind = catalogedKind(document, result.metadata);
|
|
17
|
-
diagnostics.push(...metadataBudgetDiagnostics(document));
|
|
17
|
+
diagnostics.push(...metadataBudgetDiagnostics(document, result.metadata, result.metadataFields, result.metadataListItems));
|
|
18
18
|
diagnostics.push(...result.diagnostics);
|
|
19
19
|
if (kind) {
|
|
20
20
|
diagnostics.push(...assetMetadataDiagnostics(document, result.metadata, kind));
|
|
@@ -26,8 +26,8 @@ export function buildCatalog(documents) {
|
|
|
26
26
|
sourcePath: document.artifact.path,
|
|
27
27
|
contentHash: contentHash(document.artifact.content),
|
|
28
28
|
metadata: result.metadata,
|
|
29
|
-
metadataFields:
|
|
30
|
-
metadataListItems:
|
|
29
|
+
metadataFields: result.metadataFields,
|
|
30
|
+
metadataListItems: result.metadataListItems,
|
|
31
31
|
};
|
|
32
32
|
if (kind === "skill") {
|
|
33
33
|
return {
|
|
@@ -92,7 +92,7 @@ function catalogedKind(document, metadata) {
|
|
|
92
92
|
}
|
|
93
93
|
return undefined;
|
|
94
94
|
}
|
|
95
|
-
function metadataBudgetDiagnostics(document) {
|
|
95
|
+
function metadataBudgetDiagnostics(document, metadata, metadataFields, metadataListItems) {
|
|
96
96
|
const frontmatter = frontmatterRange(document);
|
|
97
97
|
if (!frontmatter)
|
|
98
98
|
return [];
|
|
@@ -113,7 +113,7 @@ function metadataBudgetDiagnostics(document) {
|
|
|
113
113
|
},
|
|
114
114
|
});
|
|
115
115
|
}
|
|
116
|
-
for (const [key, items] of Object.entries(
|
|
116
|
+
for (const [key, items] of Object.entries(metadataListItems)) {
|
|
117
117
|
for (const item of items) {
|
|
118
118
|
const itemText = metadataListItemText(item.raw);
|
|
119
119
|
if (itemText.length <= METADATA_LIST_ITEM_MAX_CHARS)
|
|
@@ -131,8 +131,41 @@ function metadataBudgetDiagnostics(document) {
|
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
+
for (const [key, values] of operationalMetadataLists(metadata)) {
|
|
135
|
+
const field = metadataFields[key];
|
|
136
|
+
if (!field?.key.startsWith("renma."))
|
|
137
|
+
continue;
|
|
138
|
+
for (const value of values) {
|
|
139
|
+
if (value.length <= METADATA_LIST_ITEM_MAX_CHARS)
|
|
140
|
+
continue;
|
|
141
|
+
diagnostics.push({
|
|
142
|
+
severity: "warning",
|
|
143
|
+
path: document.artifact.path,
|
|
144
|
+
message: `Metadata list item is too long in ${key}. Item has ${value.length} characters; keep list items short and move routing prose into the markdown body or referenced context assets.`,
|
|
145
|
+
evidence: {
|
|
146
|
+
path: field.path,
|
|
147
|
+
startLine: field.startLine,
|
|
148
|
+
endLine: field.endLine,
|
|
149
|
+
snippet: field.raw,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
134
154
|
return diagnostics;
|
|
135
155
|
}
|
|
156
|
+
function operationalMetadataLists(metadata) {
|
|
157
|
+
return [
|
|
158
|
+
["tags", metadata.tags],
|
|
159
|
+
["when_to_use", metadata.whenToUse],
|
|
160
|
+
["when_not_to_use", metadata.whenNotToUse],
|
|
161
|
+
["requires_context", metadata.requiresContext],
|
|
162
|
+
["optional_context", metadata.optionalContext],
|
|
163
|
+
["requires_lens", metadata.requiresLens ?? []],
|
|
164
|
+
["optional_lens", metadata.optionalLens ?? []],
|
|
165
|
+
["conflicts", metadata.conflicts],
|
|
166
|
+
["superseded_by", metadata.supersededBy],
|
|
167
|
+
];
|
|
168
|
+
}
|
|
136
169
|
function frontmatterRange(document) {
|
|
137
170
|
if (document.lines[0]?.trim() !== "---")
|
|
138
171
|
return undefined;
|