@vibe-agent-toolkit/agent-schema 0.1.41-rc.6 → 0.1.41-rc.8
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/dist/validation-codes.d.ts +4 -2
- package/dist/validation-codes.d.ts.map +1 -1
- package/dist/validation-codes.js +5 -3
- package/dist/validation-codes.js.map +1 -1
- package/dist/validation-config.d.ts +6 -6
- package/dist/validation-framework.d.ts +81 -6
- package/dist/validation-framework.d.ts.map +1 -1
- package/dist/validation-framework.js +116 -28
- package/dist/validation-framework.js.map +1 -1
- package/dist/validation-issue.d.ts +67 -2
- package/dist/validation-issue.d.ts.map +1 -1
- package/dist/validation-issue.js +85 -1
- package/dist/validation-issue.js.map +1 -1
- package/package.json +2 -2
- package/schemas/validation-config.json +4 -0
|
@@ -31,6 +31,7 @@ export declare const CODE_REGISTRY: {
|
|
|
31
31
|
readonly PACKAGED_UNREFERENCED_FILE: CodeRegistryEntry;
|
|
32
32
|
readonly PACKAGED_TEST_INPUT: CodeRegistryEntry;
|
|
33
33
|
readonly PACKAGED_BROKEN_LINK: CodeRegistryEntry;
|
|
34
|
+
readonly FILENAME_COLLISION: CodeRegistryEntry;
|
|
34
35
|
readonly DUPLICATE_RESOURCE_ID: CodeRegistryEntry;
|
|
35
36
|
readonly SKILL_LENGTH_EXCEEDS_RECOMMENDED: CodeRegistryEntry;
|
|
36
37
|
readonly SKILL_TOTAL_SIZE_LARGE: CodeRegistryEntry;
|
|
@@ -69,6 +70,7 @@ export declare const CODE_REGISTRY: {
|
|
|
69
70
|
readonly COMPONENT_PRESENT_BUT_UNDECLARED: CodeRegistryEntry;
|
|
70
71
|
readonly REFERENCE_TARGET_MISSING: CodeRegistryEntry;
|
|
71
72
|
readonly MARKETPLACE_PLUGIN_SOURCE_MISSING: CodeRegistryEntry;
|
|
73
|
+
readonly REGISTRY_SHAPE_DRIFT: CodeRegistryEntry;
|
|
72
74
|
readonly LINK_BROKEN_FILE: CodeRegistryEntry;
|
|
73
75
|
readonly LINK_BROKEN_ANCHOR: CodeRegistryEntry;
|
|
74
76
|
readonly LINK_UNKNOWN: CodeRegistryEntry;
|
|
@@ -92,9 +94,9 @@ export declare const CODE_REGISTRY: {
|
|
|
92
94
|
readonly LINK_AUTH_UNVERIFIED: CodeRegistryEntry;
|
|
93
95
|
};
|
|
94
96
|
export type IssueCode = keyof typeof CODE_REGISTRY;
|
|
95
|
-
export declare const IssueCodeSchema: z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", ...("LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED")[]]>;
|
|
97
|
+
export declare const IssueCodeSchema: z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", ...("LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED")[]]>;
|
|
96
98
|
/** Codes outside the overridable framework — structural reports. */
|
|
97
99
|
export type InfoCode = 'FILE_STRUCTURE_REPORT' | 'RESOURCE_INVENTORY' | 'METADATA_SUMMARY' | 'SKILL_IMPLICIT_REFERENCE' | 'SKILL_UNREFERENCED_FILE';
|
|
98
100
|
/** Codes outside the overridable framework — structural prerequisites / errors that are not subject to severity overrides. */
|
|
99
|
-
export type NonOverridableCode = 'SKILL_MISSING_FRONTMATTER' | 'SKILL_MISSING_NAME' | 'SKILL_MISSING_DESCRIPTION' | 'SKILL_NAME_INVALID' | 'SKILL_NAME_XML_TAGS' | 'SKILL_DESCRIPTION_XML_TAGS' | 'SKILL_DESCRIPTION_TOO_LONG' | 'SKILL_DESCRIPTION_EMPTY' | 'SKILL_MISCONFIGURED_LOCATION' | 'LINK_INTEGRITY_BROKEN' | 'PATH_STYLE_WINDOWS' | '
|
|
101
|
+
export type NonOverridableCode = 'SKILL_MISSING_FRONTMATTER' | 'SKILL_MISSING_NAME' | 'SKILL_MISSING_DESCRIPTION' | 'SKILL_NAME_INVALID' | 'SKILL_NAME_XML_TAGS' | 'SKILL_DESCRIPTION_XML_TAGS' | 'SKILL_DESCRIPTION_TOO_LONG' | 'SKILL_DESCRIPTION_EMPTY' | 'SKILL_MISCONFIGURED_LOCATION' | 'LINK_INTEGRITY_BROKEN' | 'PATH_STYLE_WINDOWS' | 'DUPLICATE_FILES_DEST' | 'PLUGIN_MISSING_MANIFEST' | 'PLUGIN_INVALID_JSON' | 'PLUGIN_INVALID_SCHEMA' | 'PLUGIN_MISSING_VERSION' | 'MARKETPLACE_MISSING_MANIFEST' | 'MARKETPLACE_INVALID_JSON' | 'MARKETPLACE_INVALID_SCHEMA' | 'MARKETPLACE_MISSING_LICENSE' | 'MARKETPLACE_MISSING_README' | 'MARKETPLACE_MISSING_CHANGELOG' | 'MARKETPLACE_MISSING_VERSION' | 'REGISTRY_MISSING_FILE' | 'REGISTRY_INVALID_JSON' | 'REGISTRY_INVALID_SCHEMA' | 'UNKNOWN_FORMAT' | 'SKILL_TOO_LONG' | 'REFERENCE_MISSING_TOC' | 'DESCRIPTION_FIRST_PERSON' | 'RESOURCE_UNREACHABLE';
|
|
100
102
|
//# sourceMappingURL=validation-codes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-codes.d.ts","sourceRoot":"","sources":["../src/validation-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpE,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"validation-codes.d.ts","sourceRoot":"","sources":["../src/validation-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpE,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAub4B,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,aAAa,CAAC;AAEnD,eAAO,MAAM,eAAe,shIAE3B,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,QAAQ,GAChB,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,GAClB,0BAA0B,GAC1B,yBAAyB,CAAC;AAE9B,8HAA8H;AAC9H,MAAM,MAAM,kBAAkB,GAC1B,2BAA2B,GAC3B,oBAAoB,GACpB,2BAA2B,GAC3B,oBAAoB,GACpB,qBAAqB,GACrB,4BAA4B,GAC5B,4BAA4B,GAC5B,yBAAyB,GACzB,8BAA8B,GAC9B,uBAAuB,GACvB,oBAAoB,GAMpB,sBAAsB,GACtB,yBAAyB,GACzB,qBAAqB,GACrB,uBAAuB,GACvB,wBAAwB,GACxB,8BAA8B,GAC9B,0BAA0B,GAC1B,4BAA4B,GAC5B,6BAA6B,GAC7B,4BAA4B,GAC5B,+BAA+B,GAC/B,6BAA6B,GAC7B,uBAAuB,GACvB,uBAAuB,GACvB,yBAAyB,GACzB,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,0BAA0B,GAC1B,sBAAsB,CAAC"}
|
package/dist/validation-codes.js
CHANGED
|
@@ -19,9 +19,10 @@ export const CODE_REGISTRY = {
|
|
|
19
19
|
LINK_DEFERRED_ARTIFACT: entry('info', 'Link targets a deferred build artifact declared in the skill files: config; it will exist after the build materializes it.', 'No action needed if the files: entry is correct. To silence, set validation.severity.LINK_DEFERRED_ARTIFACT: ignore.', 'link_deferred_artifact'),
|
|
20
20
|
LINK_TO_SKILL_DEFINITION: entry('error', "Markdown link targets another skill's SKILL.md; bundling it creates duplicate skill definitions.", 'Link to a specific resource inside the other skill, or reference the other skill by name.', 'link_to_skill_definition'),
|
|
21
21
|
LINK_DROPPED_BY_DEPTH: entry('warning', 'Walker stopped following links at the configured linkFollowDepth; this link was not bundled.', 'Raise linkFollowDepth, bundle the file via files config, declare the drop intentional with validation.allow, or exclude via excludeReferencesFromBundle.rules.', 'link_dropped_by_depth'),
|
|
22
|
-
PACKAGED_UNREFERENCED_FILE: entry('error', 'File in the packaged output is not referenced from any packaged markdown.', 'Add a markdown link or code-block mention in SKILL.md or a linked resource.
|
|
22
|
+
PACKAGED_UNREFERENCED_FILE: entry('error', 'File in the packaged output is not referenced from any packaged markdown.', 'Add a markdown link or code-block mention in SKILL.md or a linked resource. A file consumed programmatically belongs in skills.config.<name>.files as a source/dest pair — a declared dest is exempt, so do NOT restate it in validation.allow.', 'packaged_unreferenced_file'),
|
|
23
23
|
PACKAGED_TEST_INPUT: entry('warning', "A link or files: entry pointed into the skill's declared test input (its test.evals path) and was NOT packaged; test input — including the expected_output answer key — never ships to consumers.", 'No action needed — the build already excluded it. Remove the link or files: entry to silence this, or move the target out of the test.evals directory if it is genuinely a shipped resource.', 'packaged_test_input'),
|
|
24
24
|
PACKAGED_BROKEN_LINK: entry('error', 'Link in the packaged output resolves to a file that is not present in the output (likely a link-rewriter bug).', 'Report the issue — this indicates a VAT bug. As a temporary workaround, set severity.PACKAGED_BROKEN_LINK to ignore while the underlying bug is fixed.', 'packaged_broken_link'),
|
|
25
|
+
FILENAME_COLLISION: entry('error', 'Two source files package to the same destination path in the bundle; one would overwrite the other.', "Rename one of the files, or switch resourceNaming to a path-based strategy ('resource-id' or 'preserve-path') so the sources map to distinct destinations.", 'filename_collision'),
|
|
25
26
|
DUPLICATE_RESOURCE_ID: entry('error', 'Two files resolve to the same resource id after path normalization.', 'Rename one of the files so they produce distinct resource ids.', 'duplicate_resource_id'),
|
|
26
27
|
SKILL_LENGTH_EXCEEDS_RECOMMENDED: entry('warning', 'SKILL.md line count exceeds the recommended limit; longer files degrade skill triggering.', 'Split content into linked resources (progressive disclosure) or allow if the length is justified.', 'skill_length_exceeds_recommended'),
|
|
27
28
|
SKILL_TOTAL_SIZE_LARGE: entry('warning', 'Total packaged line count exceeds the recommended limit.', 'Reduce bundled content, move references out of the bundle, or allow if the size is justified.', 'skill_total_size_large'),
|
|
@@ -37,7 +38,7 @@ export const CODE_REGISTRY = {
|
|
|
37
38
|
RESERVED_WORD_IN_NAME: entry('warning', 'Frontmatter `name` contains a reserved word (`anthropic` or `claude`); Claude Code rejects non-certified skills using these words.', 'Rename the skill to avoid `anthropic` or `claude` in the name.', 'reserved_word_in_name'),
|
|
38
39
|
SKILL_TIME_SENSITIVE_CONTENT: entry('info', 'SKILL.md body contains time-sensitive prose (e.g., "as of November 2025") that may become stale.', 'Remove the time qualifier, or move deprecated guidance into a clearly labeled "## Old patterns" section with a <details> block.', 'skill_time_sensitive_content'),
|
|
39
40
|
NON_PORTABLE_ASSET_REFERENCE: entry('warning', 'A skill document (SKILL.md or a reachable bundled reference file) references a bundled script/asset via a non-portable anchor (CLAUDE_PLUGIN_ROOT). It is a Claude Code plugin-only variable that points at the plugin, not the skill, so the path breaks when the skill is mounted standalone (claude.ai upload, API container).', 'Reference bundled files by a path relative to the skill directory (e.g. `scripts/run.mjs`), never via CLAUDE_PLUGIN_ROOT, an absolute path, or an env-var anchor. See the vibe-agent-toolkit:vat-skill-authoring skill.', 'non_portable_asset_reference'),
|
|
40
|
-
NON_PORTABLE_COMMAND: entry('warning', 'A skill document (SKILL.md or a reachable bundled reference file) instructs an agent to run a shell command that hard-codes a GNU/Linux-only utility or flag (e.g. `timeout`, `grep -P`, `sed -i` with no suffix, `readlink -f`, `date -d`). These fail on macOS/BSD where the agent may execute them.', 'Use a portable equivalent: `grep -E` for PCRE, `sed -i.bak`/an explicit suffix, a temp file instead of bare `-i`, a portable resolve instead of `readlink -f`, and `date -v`/`-j -f` instead of `date -d`. Gate or avoid `timeout` (absent on macOS by default). See the vibe-agent-toolkit:vat-skill-review skill.', 'non_portable_command'),
|
|
41
|
+
NON_PORTABLE_COMMAND: entry('warning', 'A skill document (SKILL.md or a reachable bundled reference file) instructs an agent to run a shell command that hard-codes a GNU/Linux-only utility or flag (e.g. `timeout`, `grep -P`, `sed -i` with no suffix, `readlink -f`, `date -d`). These fail, or behave differently, on macOS/BSD where the agent may execute them.', 'Use a portable equivalent: `grep -E` for PCRE, `sed -i.bak`/an explicit suffix, a temp file instead of bare `-i`, a portable resolve instead of `readlink -f`, and `date -v`/`-j -f` instead of `date -d`. Gate or avoid `timeout` (absent on macOS by default). See the vibe-agent-toolkit:vat-skill-review skill.', 'non_portable_command'),
|
|
41
42
|
SKILL_FRONTMATTER_EXTRA_FIELDS: entry('warning', 'SKILL.md frontmatter contains a field outside the standard agentskills.io + Claude Code key set.', 'Move custom data under `metadata.<key>`, or remove the field. Per-project config belongs in vibe-agent-toolkit.config.yaml, not SKILL.md frontmatter.', 'skill_frontmatter_extra_fields'),
|
|
42
43
|
SKILL_CROSS_SKILL_AUTH_UNDECLARED: entry('warning', 'SKILL.md body declares a dependency on a sibling skill or ANTHROPIC_*_KEY environment variable that is not mentioned in the description.', 'Name the dependency in the description (e.g. "Requires ado skill for auth" or "Requires ANTHROPIC_ADMIN_API_KEY") so agents loading the skill discover it without reading the body.', 'skill_cross_skill_auth_undeclared'),
|
|
43
44
|
SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE: entry('warning', 'Sibling skills in the same package use mixed YAML scalar styles for their `description` frontmatter (e.g., folded `>-` alongside inline double-quoted).', 'Pick one YAML style and apply it to every skill in the package.', 'skill_description_style_mixed_in_package'),
|
|
@@ -46,7 +47,7 @@ export const CODE_REGISTRY = {
|
|
|
46
47
|
PLUGIN_MISSING_LICENSE: entry('info', 'plugin.json is missing the recommended `license` field.', 'Add a "license" SPDX identifier (e.g. "MIT") to plugin.json so redistribution terms are explicit.', 'plugin_missing_license'),
|
|
47
48
|
PLUGIN_NAME_NOT_KEBAB_CASE: entry('info', 'Plugin name does not match the kebab-case convention required by Claude Code (lowercase alphanumeric with single hyphens).', 'Rename the plugin to kebab-case (e.g. "my-plugin"). Schema parse already errors; this code surfaces the same finding with a more actionable message.', 'plugin_name_not_kebab_case'),
|
|
48
49
|
SKILL_NAME_NOT_KEBAB_CASE: entry('info', 'Skill frontmatter `name` does not match the kebab-case convention.', 'Rename the skill to kebab-case (e.g. "my-skill"). Schema parse already errors; this code surfaces the same finding with a more actionable message.', 'skill_name_not_kebab_case'),
|
|
49
|
-
SKILL_REFERENCES_BUT_NO_LINKS: entry('info', 'Skill directory contains scripts/, references/, or assets/ subdirectories but the SKILL.md body has zero markdown links into them.', 'Add explicit markdown links from SKILL.md (or a linked file) into the bundled subdirectories, or remove the unreferenced directory.
|
|
50
|
+
SKILL_REFERENCES_BUT_NO_LINKS: entry('info', 'Skill directory contains scripts/, references/, or assets/ subdirectories but the SKILL.md body has zero markdown links into them.', 'Add explicit markdown links from SKILL.md (or a linked file) into the bundled subdirectories, or remove the unreferenced directory. Assets consumed programmatically belong in skills.config.<name>.files as source/dest pairs — a declared dest is exempt, so do NOT restate them in validation.allow.', 'skill_references_but_no_links'),
|
|
50
51
|
SKILL_BODY_NOT_IMPERATIVE: entry('info', 'SKILL.md body contains second-person instructional openers (e.g. "You should…", "You need to…", "You can…").', 'Rewrite as imperative ("Configure the MCP server…" instead of "You should configure…"). Skill bodies read more cleanly as instructions to the agent rather than to a human reader. Allow via validation.allow if the heuristic misfires on quoted prompts or user dialog.', 'skill_body_not_imperative'),
|
|
51
52
|
CAPABILITY_LOCAL_SHELL: entry('info', 'Skill references a local-shell tool (Bash/Edit/Write/NotebookEdit) or invokes a shell.', 'Informational. Declare a plugin target that provides shell (claude-code, claude-cowork) so this observation resolves to an expected verdict.', 'capability_local_shell'),
|
|
52
53
|
CAPABILITY_EXTERNAL_CLI: entry('info', 'Skill invokes an external CLI binary not bundled with the skill.', 'Informational. Ensure the declared target guarantees the binary or document the prerequisite.', 'capability_external_cli'),
|
|
@@ -60,6 +61,7 @@ export const CODE_REGISTRY = {
|
|
|
60
61
|
COMPONENT_PRESENT_BUT_UNDECLARED: entry('info', 'A component is present under the canonical layout but the manifest declares an explicit list that omits it; the runtime may silently skip it at install.', 'Add the component to the appropriate manifest field, or remove the file if unintended. Skipped when the manifest omits the field entirely (auto-discovery is intentional).', 'component_present_but_undeclared'),
|
|
61
62
|
REFERENCE_TARGET_MISSING: entry('error', 'A cross-component reference resolved from the manifest points to a path that does not exist.', 'Add the referenced file or correct the path in the manifest.', 'reference_target_missing'),
|
|
62
63
|
MARKETPLACE_PLUGIN_SOURCE_MISSING: entry('error', 'A marketplace declares a plugin with a path-based source that does not exist.', 'Correct the source path or remove the entry from marketplace.plugins[].', 'marketplace_plugin_source_missing'),
|
|
64
|
+
REGISTRY_SHAPE_DRIFT: entry('info', "An installed-plugins registry written by Claude Code carries a field or scope value VAT's model does not recognize; the registry shape is newer than the model reading it. The value was preserved, not rejected.", "No action needed — VAT reads registries it does not own liberally, so the unknown value passed through untouched. Report the field so VAT's model can catch up, or set severity.REGISTRY_SHAPE_DRIFT to ignore.", 'registry_shape_drift'),
|
|
63
65
|
// Resources path — link / frontmatter / external-URL codes
|
|
64
66
|
// Promotions of existing resources-package validator behavior (formerly free-form
|
|
65
67
|
// lowercase `type` strings). Severities are locked by the design spec and reflect
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-codes.js","sourceRoot":"","sources":["../src/validation-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,MAAM,KAAK,GAAG,CACZ,eAAgC,EAChC,WAAmB,EACnB,GAAW,EACX,MAAc,EACK,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAEzF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB,EAAE,KAAK,CACzB,OAAO,EACP,0DAA0D,EAC1D,gIAAgI,EAChI,sBAAsB,CACvB;IACD,sBAAsB,EAAE,KAAK,CAC3B,OAAO,EACP,mHAAmH,EACnH,iLAAiL,EACjL,wBAAwB,CACzB;IACD,uBAAuB,EAAE,KAAK,CAC5B,SAAS,EACT,yGAAyG,EACzG,wIAAwI,EACxI,yBAAyB,CAC1B;IACD,uBAAuB,EAAE,KAAK,CAC5B,OAAO,EACP,sFAAsF,EACtF,8HAA8H,EAC9H,yBAAyB,CAC1B;IACD,mBAAmB,EAAE,KAAK,CACxB,OAAO,EACP,mFAAmF,EACnF,yGAAyG,EACzG,qBAAqB,CACtB;IACD,sBAAsB,EAAE,KAAK,CAC3B,MAAM,EACN,4HAA4H,EAC5H,sHAAsH,EACtH,wBAAwB,CACzB;IACD,wBAAwB,EAAE,KAAK,CAC7B,OAAO,EACP,kGAAkG,EAClG,2FAA2F,EAC3F,0BAA0B,CAC3B;IACD,qBAAqB,EAAE,KAAK,CAC1B,SAAS,EACT,8FAA8F,EAC9F,gKAAgK,EAChK,uBAAuB,CACxB;IACD,0BAA0B,EAAE,KAAK,CAC/B,OAAO,EACP,2EAA2E,EAC3E,
|
|
1
|
+
{"version":3,"file":"validation-codes.js","sourceRoot":"","sources":["../src/validation-codes.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,8 +16,8 @@ export declare const AllowEntrySchema: z.ZodObject<{
|
|
|
16
16
|
}>;
|
|
17
17
|
export type AllowEntry = z.infer<typeof AllowEntrySchema>;
|
|
18
18
|
export declare const ValidationConfigSchema: z.ZodObject<{
|
|
19
|
-
severity: z.ZodOptional<z.ZodRecord<z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", ...("LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED")[]]>, z.ZodEnum<["error", "warning", "info", "ignore"]>>>;
|
|
20
|
-
allow: z.ZodOptional<z.ZodRecord<z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", ...("LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED")[]]>, z.ZodArray<z.ZodObject<{
|
|
19
|
+
severity: z.ZodOptional<z.ZodRecord<z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", ...("LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED")[]]>, z.ZodEnum<["error", "warning", "info", "ignore"]>>>;
|
|
20
|
+
allow: z.ZodOptional<z.ZodRecord<z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", ...("LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED")[]]>, z.ZodArray<z.ZodObject<{
|
|
21
21
|
paths: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
22
22
|
reason: z.ZodString;
|
|
23
23
|
expires: z.ZodOptional<z.ZodString>;
|
|
@@ -31,15 +31,15 @@ export declare const ValidationConfigSchema: z.ZodObject<{
|
|
|
31
31
|
expires?: string | undefined;
|
|
32
32
|
}>, "many">>>;
|
|
33
33
|
}, "strict", z.ZodTypeAny, {
|
|
34
|
-
severity?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", "error" | "warning" | "info" | "ignore">> | undefined;
|
|
35
|
-
allow?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", {
|
|
34
|
+
severity?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", "error" | "warning" | "info" | "ignore">> | undefined;
|
|
35
|
+
allow?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", {
|
|
36
36
|
paths: string[];
|
|
37
37
|
reason: string;
|
|
38
38
|
expires?: string | undefined;
|
|
39
39
|
}[]>> | undefined;
|
|
40
40
|
}, {
|
|
41
|
-
severity?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", "error" | "warning" | "info" | "ignore">> | undefined;
|
|
42
|
-
allow?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", {
|
|
41
|
+
severity?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", "error" | "warning" | "info" | "ignore">> | undefined;
|
|
42
|
+
allow?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "DUPLICATE_RESOURCE_ID" | "SKILL_LENGTH_EXCEEDS_RECOMMENDED" | "SKILL_TOTAL_SIZE_LARGE" | "SKILL_TOO_MANY_FILES" | "REFERENCE_TOO_DEEP" | "DESCRIPTION_TOO_VAGUE" | "NO_PROGRESSIVE_DISCLOSURE" | "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT" | "SKILL_DESCRIPTION_FILLER_OPENER" | "SKILL_DESCRIPTION_WRONG_PERSON" | "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH" | "SKILL_NAME_MISMATCHES_DIR" | "RESERVED_WORD_IN_NAME" | "SKILL_TIME_SENSITIVE_CONTENT" | "NON_PORTABLE_ASSET_REFERENCE" | "NON_PORTABLE_COMMAND" | "SKILL_FRONTMATTER_EXTRA_FIELDS" | "SKILL_CROSS_SKILL_AUTH_UNDECLARED" | "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE" | "PLUGIN_MISSING_DESCRIPTION" | "PLUGIN_MISSING_AUTHOR" | "PLUGIN_MISSING_LICENSE" | "PLUGIN_NAME_NOT_KEBAB_CASE" | "SKILL_NAME_NOT_KEBAB_CASE" | "SKILL_REFERENCES_BUT_NO_LINKS" | "SKILL_BODY_NOT_IMPERATIVE" | "CAPABILITY_LOCAL_SHELL" | "CAPABILITY_EXTERNAL_CLI" | "CAPABILITY_BROWSER_AUTH" | "COMPAT_TARGET_INCOMPATIBLE" | "COMPAT_TARGET_NEEDS_REVIEW" | "COMPAT_TARGET_UNDECLARED" | "ALLOW_EXPIRED" | "ALLOW_UNUSED" | "COMPONENT_DECLARED_BUT_MISSING" | "COMPONENT_PRESENT_BUT_UNDECLARED" | "REFERENCE_TARGET_MISSING" | "MARKETPLACE_PLUGIN_SOURCE_MISSING" | "REGISTRY_SHAPE_DRIFT" | "LINK_BROKEN_FILE" | "LINK_BROKEN_ANCHOR" | "LINK_UNKNOWN" | "LINK_TO_GITIGNORED" | "LINK_UNRESOLVED_REFERENCE" | "MALFORMED_HTML" | "FRONTMATTER_MISSING" | "FRONTMATTER_INVALID_YAML" | "FRONTMATTER_SCHEMA_ERROR" | "FRONTMATTER_LINK_BROKEN" | "FRONTMATTER_ANCHOR_MISSING" | "FRONTMATTER_LINK_TO_GITIGNORED" | "FRONTMATTER_UNKNOWN_LINK" | "EXTERNAL_URL_DEAD" | "EXTERNAL_URL_TIMEOUT" | "EXTERNAL_URL_ERROR" | "LINK_AUTH_DEAD" | "LINK_AUTH_DEAD_OR_UNAUTHORIZED" | "LINK_AUTH_FORBIDDEN" | "LINK_AUTH_UNAUTHORIZED" | "LINK_AUTH_UNVERIFIED", {
|
|
43
43
|
reason: string;
|
|
44
44
|
paths?: string[] | undefined;
|
|
45
45
|
expires?: string | undefined;
|
|
@@ -4,11 +4,15 @@
|
|
|
4
4
|
* Three composable stages that turn raw validator issues into the final
|
|
5
5
|
* emitted set:
|
|
6
6
|
* - `applyAllowFilter` — suppress issues matched by `validation.allow`
|
|
7
|
-
* entries,
|
|
7
|
+
* entries, reporting per-entry usage and expired allowances.
|
|
8
8
|
* - `resolveSeverity` — resolve each registry code's severity against
|
|
9
9
|
* `validation.severity` overrides (falling back to the registry default).
|
|
10
10
|
* - `runValidationFramework` — orchestrates the two above, drops `ignore`d
|
|
11
|
-
* issues, and synthesizes ALLOW_EXPIRED
|
|
11
|
+
* issues, and synthesizes ALLOW_EXPIRED meta-issues.
|
|
12
|
+
*
|
|
13
|
+
* ALLOW_UNUSED is deliberately NOT in that list. `validation.allow` is declared
|
|
14
|
+
* once per PACKAGE while validation runs once per SKILL, so "this entry matched
|
|
15
|
+
* nothing" is only answerable across a whole run — see {@link AllowUsageLedger}.
|
|
12
16
|
*
|
|
13
17
|
* Non-registry codes (InfoCode / NonOverridableCode) deliberately bypass
|
|
14
18
|
* severity resolution and pass through unchanged.
|
|
@@ -26,11 +30,22 @@ export interface AllowRecord {
|
|
|
26
30
|
reason: string;
|
|
27
31
|
expires?: string | undefined;
|
|
28
32
|
}
|
|
29
|
-
|
|
33
|
+
/**
|
|
34
|
+
* One `validation.allow` entry's usage during ONE call of the filter.
|
|
35
|
+
*
|
|
36
|
+
* `used` is deliberately not named `unused`: a single call sees a single unit of
|
|
37
|
+
* work (one skill), and `used: false` therefore means "this unit did not match
|
|
38
|
+
* it", NOT "the entry is dead". Only {@link AllowUsageLedger} can answer the
|
|
39
|
+
* latter. The negative name invited exactly that misreading — it was read as a
|
|
40
|
+
* verdict and emitted as ALLOW_UNUSED once per non-matching skill.
|
|
41
|
+
*/
|
|
42
|
+
export interface AllowEntryUsage {
|
|
30
43
|
code: IssueCode;
|
|
31
44
|
paths: string[];
|
|
32
45
|
reason: string;
|
|
33
46
|
expires?: string | undefined;
|
|
47
|
+
/** True iff at least one issue in THIS call matched the entry. */
|
|
48
|
+
used: boolean;
|
|
34
49
|
}
|
|
35
50
|
export interface ExpiredRecord {
|
|
36
51
|
code: IssueCode;
|
|
@@ -43,11 +58,53 @@ export interface AllowFilterResult {
|
|
|
43
58
|
emitted: ValidationIssue[];
|
|
44
59
|
allowed: AllowRecord[];
|
|
45
60
|
expired: ExpiredRecord[];
|
|
46
|
-
|
|
61
|
+
/** Per-entry usage for THIS call — a contribution to a run, not a verdict. */
|
|
62
|
+
usage: AllowEntryUsage[];
|
|
47
63
|
}
|
|
48
64
|
export declare function applyAllowFilter(issues: readonly ValidationIssue[], config: AllowConfig, now?: Date): AllowFilterResult;
|
|
65
|
+
/**
|
|
66
|
+
* Run-level record of which `validation.allow` entries anything matched.
|
|
67
|
+
*
|
|
68
|
+
* The unit of DECLARATION for an allow entry is the package (`skills.defaults.
|
|
69
|
+
* validation.allow`); the unit of ANALYSIS is one skill. So an entry scoped to
|
|
70
|
+
* two files is not matched by any of the package's other skills — and reporting
|
|
71
|
+
* that per skill produced 78 ALLOW_UNUSED warnings from 3 legitimate entries on
|
|
72
|
+
* this repo's own tree. "Matched nothing" is a property of the RUN.
|
|
73
|
+
*
|
|
74
|
+
* The ledger makes that structural rather than remembered:
|
|
75
|
+
* - it is monotone — `runValidationFramework` can only ADD to `matched`, so no
|
|
76
|
+
* single call can conclude an entry is dead, in any call order;
|
|
77
|
+
* - it is the ONLY producer of ALLOW_UNUSED (see {@link allowUnusedIssues}),
|
|
78
|
+
* so there is no code path by which per-skill semantics can come back.
|
|
79
|
+
*
|
|
80
|
+
* A caller whose run really is one unit of work uses
|
|
81
|
+
* {@link runSingleUnitValidation}, whose name states that claim.
|
|
82
|
+
*/
|
|
83
|
+
export interface AllowUsageLedger {
|
|
84
|
+
/**
|
|
85
|
+
* Entry key → the finalized ALLOW_UNUSED issue to emit if the run never
|
|
86
|
+
* matches it. Populated on first sight of an unmatched entry.
|
|
87
|
+
*/
|
|
88
|
+
readonly candidates: Map<string, ValidationIssue>;
|
|
89
|
+
/** Keys matched by at least one unit of work anywhere in the run. */
|
|
90
|
+
readonly matched: Set<string>;
|
|
91
|
+
}
|
|
92
|
+
export declare function createAllowUsageLedger(): AllowUsageLedger;
|
|
93
|
+
/**
|
|
94
|
+
* ALLOW_UNUSED issues for entries NO unit of work in the run matched.
|
|
95
|
+
*
|
|
96
|
+
* Call once, after the last unit. Severity was already resolved (and `ignore`
|
|
97
|
+
* already applied) when each candidate was recorded, so this needs no config.
|
|
98
|
+
*/
|
|
99
|
+
export declare function allowUnusedIssues(ledger: AllowUsageLedger): ValidationIssue[];
|
|
49
100
|
export interface FrameworkResult {
|
|
50
|
-
/**
|
|
101
|
+
/**
|
|
102
|
+
* Issues the consumer should surface (severity resolved; ignores dropped).
|
|
103
|
+
*
|
|
104
|
+
* Excludes ALLOW_UNUSED, which is not knowable from one unit of work — drain
|
|
105
|
+
* the run's {@link AllowUsageLedger} with {@link allowUnusedIssues} once the
|
|
106
|
+
* last unit has been validated.
|
|
107
|
+
*/
|
|
51
108
|
emitted: ValidationIssue[];
|
|
52
109
|
/** Issues suppressed by an allow entry (for verbose display). */
|
|
53
110
|
allowed: Array<{
|
|
@@ -59,5 +116,23 @@ export interface FrameworkResult {
|
|
|
59
116
|
/** True when any emitted issue has resolved severity 'error'. */
|
|
60
117
|
hasErrors: boolean;
|
|
61
118
|
}
|
|
62
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Run the framework over ONE unit of work (typically one skill).
|
|
121
|
+
*
|
|
122
|
+
* `ledger` is required, not optional-with-a-default, so the compiler asks each
|
|
123
|
+
* caller the question the per-skill call site could not answer on its own:
|
|
124
|
+
* *whose run is this?* Drain it once with {@link allowUnusedIssues} after the
|
|
125
|
+
* last unit; a caller whose run is a single unit should use
|
|
126
|
+
* {@link runSingleUnitValidation} instead.
|
|
127
|
+
*/
|
|
128
|
+
export declare function runValidationFramework(rawIssues: readonly ValidationIssue[], config: ValidationConfig, ledger: AllowUsageLedger, now?: Date): FrameworkResult;
|
|
129
|
+
/**
|
|
130
|
+
* Run the framework where the RUN IS THIS ONE CALL — a whole-registry validate,
|
|
131
|
+
* or a command that validates exactly one skill.
|
|
132
|
+
*
|
|
133
|
+
* The name is the claim: using it inside a loop over skills asserts something
|
|
134
|
+
* false, and is the defect this module's ledger exists to prevent. Multi-unit
|
|
135
|
+
* callers create one {@link AllowUsageLedger} for the run instead.
|
|
136
|
+
*/
|
|
137
|
+
export declare function runSingleUnitValidation(rawIssues: readonly ValidationIssue[], config: ValidationConfig, now?: Date): FrameworkResult;
|
|
63
138
|
//# sourceMappingURL=validation-framework.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-framework.d.ts","sourceRoot":"","sources":["../src/validation-framework.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"validation-framework.d.ts","sourceRoot":"","sources":["../src/validation-framework.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,15 @@
|
|
|
4
4
|
* Three composable stages that turn raw validator issues into the final
|
|
5
5
|
* emitted set:
|
|
6
6
|
* - `applyAllowFilter` — suppress issues matched by `validation.allow`
|
|
7
|
-
* entries,
|
|
7
|
+
* entries, reporting per-entry usage and expired allowances.
|
|
8
8
|
* - `resolveSeverity` — resolve each registry code's severity against
|
|
9
9
|
* `validation.severity` overrides (falling back to the registry default).
|
|
10
10
|
* - `runValidationFramework` — orchestrates the two above, drops `ignore`d
|
|
11
|
-
* issues, and synthesizes ALLOW_EXPIRED
|
|
11
|
+
* issues, and synthesizes ALLOW_EXPIRED meta-issues.
|
|
12
|
+
*
|
|
13
|
+
* ALLOW_UNUSED is deliberately NOT in that list. `validation.allow` is declared
|
|
14
|
+
* once per PACKAGE while validation runs once per SKILL, so "this entry matched
|
|
15
|
+
* nothing" is only answerable across a whole run — see {@link AllowUsageLedger}.
|
|
12
16
|
*
|
|
13
17
|
* Non-registry codes (InfoCode / NonOverridableCode) deliberately bypass
|
|
14
18
|
* severity resolution and pass through unchanged.
|
|
@@ -45,9 +49,9 @@ function buildMatchers(allowByCode) {
|
|
|
45
49
|
}
|
|
46
50
|
return matchers;
|
|
47
51
|
}
|
|
48
|
-
function
|
|
52
|
+
function collectExpiredAndUsage(matchers, allowed, now) {
|
|
49
53
|
const expired = [];
|
|
50
|
-
const
|
|
54
|
+
const usage = [];
|
|
51
55
|
for (const [code, list] of matchers) {
|
|
52
56
|
for (const m of list) {
|
|
53
57
|
if (isExpired(m.entry.expires, now)) {
|
|
@@ -61,20 +65,19 @@ function collectExpiredAndUnused(matchers, allowed, now) {
|
|
|
61
65
|
matchedLocations,
|
|
62
66
|
});
|
|
63
67
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
unused.push(unusedRecord);
|
|
68
|
+
const record = {
|
|
69
|
+
code,
|
|
70
|
+
paths: m.entry.paths,
|
|
71
|
+
reason: m.entry.reason,
|
|
72
|
+
used: m.used,
|
|
73
|
+
};
|
|
74
|
+
if (m.entry.expires !== undefined) {
|
|
75
|
+
record.expires = m.entry.expires;
|
|
74
76
|
}
|
|
77
|
+
usage.push(record);
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
|
-
return { expired,
|
|
80
|
+
return { expired, usage };
|
|
78
81
|
}
|
|
79
82
|
export function applyAllowFilter(issues, config, now = new Date()) {
|
|
80
83
|
const emitted = [];
|
|
@@ -84,7 +87,16 @@ export function applyAllowFilter(issues, config, now = new Date()) {
|
|
|
84
87
|
const code = issue.code;
|
|
85
88
|
const byCode = matchers.get(code);
|
|
86
89
|
const location = issue.location ?? '';
|
|
87
|
-
|
|
90
|
+
// An allow entry names "a path this finding is about", and a link issue is
|
|
91
|
+
// about TWO: the file that holds the link (`location`) and the target it
|
|
92
|
+
// points at (`link`). Both are legitimate things to suppress, and they want
|
|
93
|
+
// different globs — `LINK_OUTSIDE_PROJECT: ../../docs/**` means "links into
|
|
94
|
+
// the monorepo docs tree are fine anywhere", which is not expressible by
|
|
95
|
+
// naming containing files. Matching either keeps both readings working.
|
|
96
|
+
// (Before the anchor split, `location` WAS the target for walker-derived
|
|
97
|
+
// link issues, so target-keyed allow entries are the ones already in the
|
|
98
|
+
// wild — dropping them would break every adopter config silently.)
|
|
99
|
+
const hit = byCode?.find(m => m.match(location) || (issue.link !== undefined && m.match(issue.link)));
|
|
88
100
|
if (hit) {
|
|
89
101
|
hit.used = true;
|
|
90
102
|
const record = {
|
|
@@ -101,8 +113,36 @@ export function applyAllowFilter(issues, config, now = new Date()) {
|
|
|
101
113
|
emitted.push(issue);
|
|
102
114
|
}
|
|
103
115
|
}
|
|
104
|
-
const { expired,
|
|
105
|
-
return { emitted, allowed, expired,
|
|
116
|
+
const { expired, usage } = collectExpiredAndUsage(matchers, allowed, now);
|
|
117
|
+
return { emitted, allowed, expired, usage };
|
|
118
|
+
}
|
|
119
|
+
export function createAllowUsageLedger() {
|
|
120
|
+
return { candidates: new Map(), matched: new Set() };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Identity of an allow entry across the calls of one run.
|
|
124
|
+
*
|
|
125
|
+
* Keyed on the declared content rather than on object identity, because a
|
|
126
|
+
* batching caller may re-parse or re-merge config per skill (and `vat audit`
|
|
127
|
+
* spans several governing configs in one run — entries that differ there are
|
|
128
|
+
* different entries, and must be judged separately).
|
|
129
|
+
*/
|
|
130
|
+
function allowEntryKey(usage) {
|
|
131
|
+
return JSON.stringify([usage.code, usage.paths, usage.reason, usage.expires ?? null]);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* ALLOW_UNUSED issues for entries NO unit of work in the run matched.
|
|
135
|
+
*
|
|
136
|
+
* Call once, after the last unit. Severity was already resolved (and `ignore`
|
|
137
|
+
* already applied) when each candidate was recorded, so this needs no config.
|
|
138
|
+
*/
|
|
139
|
+
export function allowUnusedIssues(ledger) {
|
|
140
|
+
const issues = [];
|
|
141
|
+
for (const [key, issue] of ledger.candidates) {
|
|
142
|
+
if (!ledger.matched.has(key))
|
|
143
|
+
issues.push(issue);
|
|
144
|
+
}
|
|
145
|
+
return issues;
|
|
106
146
|
}
|
|
107
147
|
function finalize(issue, config) {
|
|
108
148
|
const code = issue.code;
|
|
@@ -116,13 +156,23 @@ function finalize(issue, config) {
|
|
|
116
156
|
return null;
|
|
117
157
|
return { ...issue, severity: resolved, reference: entry.reference };
|
|
118
158
|
}
|
|
119
|
-
|
|
159
|
+
/**
|
|
160
|
+
* Build an ALLOW_* meta issue.
|
|
161
|
+
*
|
|
162
|
+
* `field` rather than `location`: `validation.allow.<CODE>` is a pointer INTO
|
|
163
|
+
* the project config, not a file path — and it points into a DIFFERENT file
|
|
164
|
+
* than the skill the allow entry was about. The framework is handed a config
|
|
165
|
+
* object, not the path it was loaded from, so it cannot honestly name the file;
|
|
166
|
+
* emitting the pointer alone is the truthful answer, and it no longer
|
|
167
|
+
* masquerades as something a consumer can resolve as a path.
|
|
168
|
+
*/
|
|
169
|
+
function metaIssue(code, message, field) {
|
|
120
170
|
const entry = CODE_REGISTRY[code];
|
|
121
171
|
return {
|
|
122
172
|
severity: entry.defaultSeverity,
|
|
123
173
|
code,
|
|
124
174
|
message,
|
|
125
|
-
|
|
175
|
+
field,
|
|
126
176
|
fix: entry.fix,
|
|
127
177
|
reference: entry.reference,
|
|
128
178
|
};
|
|
@@ -136,16 +186,38 @@ function emitExpiredMeta(expired, config, emitted) {
|
|
|
136
186
|
emitted.push(final);
|
|
137
187
|
}
|
|
138
188
|
}
|
|
139
|
-
|
|
140
|
-
|
|
189
|
+
/**
|
|
190
|
+
* Fold this call's per-entry usage into the run's ledger.
|
|
191
|
+
*
|
|
192
|
+
* Matched entries record usage; unmatched ones only park a CANDIDATE issue. The
|
|
193
|
+
* two operations are asymmetric on purpose: usage is a run-level union that any
|
|
194
|
+
* later call can still complete, so nothing here can decide an entry is dead.
|
|
195
|
+
*/
|
|
196
|
+
function recordAllowUsage(usage, config, ledger) {
|
|
197
|
+
for (const u of usage) {
|
|
198
|
+
const key = allowEntryKey(u);
|
|
199
|
+
if (u.used) {
|
|
200
|
+
ledger.matched.add(key);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (ledger.candidates.has(key))
|
|
204
|
+
continue;
|
|
141
205
|
const msg = `Allow entry for ${u.code} matched no issues (paths: ${u.paths.join(', ')}).`;
|
|
142
|
-
const
|
|
143
|
-
const final = finalize(raw, config);
|
|
206
|
+
const final = finalize(metaIssue('ALLOW_UNUSED', msg, `validation.allow.${u.code}`), config);
|
|
144
207
|
if (final)
|
|
145
|
-
|
|
208
|
+
ledger.candidates.set(key, final);
|
|
146
209
|
}
|
|
147
210
|
}
|
|
148
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Run the framework over ONE unit of work (typically one skill).
|
|
213
|
+
*
|
|
214
|
+
* `ledger` is required, not optional-with-a-default, so the compiler asks each
|
|
215
|
+
* caller the question the per-skill call site could not answer on its own:
|
|
216
|
+
* *whose run is this?* Drain it once with {@link allowUnusedIssues} after the
|
|
217
|
+
* last unit; a caller whose run is a single unit should use
|
|
218
|
+
* {@link runSingleUnitValidation} instead.
|
|
219
|
+
*/
|
|
220
|
+
export function runValidationFramework(rawIssues, config, ledger, now = new Date()) {
|
|
149
221
|
// 1. Allow filter against raw issues (before severity resolution — allow is
|
|
150
222
|
// indifferent to severity).
|
|
151
223
|
const filtered = applyAllowFilter(rawIssues, config, now);
|
|
@@ -157,9 +229,11 @@ export function runValidationFramework(rawIssues, config, now = new Date()) {
|
|
|
157
229
|
emitted.push(final);
|
|
158
230
|
}
|
|
159
231
|
// 3. Emit ALLOW_EXPIRED for each expired entry (severity from config).
|
|
232
|
+
// Expiry is a property of the entry's own `expires` date, so unlike
|
|
233
|
+
// unused-ness it IS answerable from one unit of work.
|
|
160
234
|
emitExpiredMeta(filtered.expired, config, emitted);
|
|
161
|
-
// 4.
|
|
162
|
-
|
|
235
|
+
// 4. Contribute this unit's allow-entry usage to the run.
|
|
236
|
+
recordAllowUsage(filtered.usage, config, ledger);
|
|
163
237
|
const allowed = filtered.allowed;
|
|
164
238
|
return {
|
|
165
239
|
emitted,
|
|
@@ -167,4 +241,18 @@ export function runValidationFramework(rawIssues, config, now = new Date()) {
|
|
|
167
241
|
hasErrors: emitted.some(i => i.severity === 'error'),
|
|
168
242
|
};
|
|
169
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Run the framework where the RUN IS THIS ONE CALL — a whole-registry validate,
|
|
246
|
+
* or a command that validates exactly one skill.
|
|
247
|
+
*
|
|
248
|
+
* The name is the claim: using it inside a loop over skills asserts something
|
|
249
|
+
* false, and is the defect this module's ledger exists to prevent. Multi-unit
|
|
250
|
+
* callers create one {@link AllowUsageLedger} for the run instead.
|
|
251
|
+
*/
|
|
252
|
+
export function runSingleUnitValidation(rawIssues, config, now = new Date()) {
|
|
253
|
+
const ledger = createAllowUsageLedger();
|
|
254
|
+
const result = runValidationFramework(rawIssues, config, ledger, now);
|
|
255
|
+
const emitted = [...result.emitted, ...allowUnusedIssues(ledger)];
|
|
256
|
+
return { ...result, emitted, hasErrors: emitted.some(i => i.severity === 'error') };
|
|
257
|
+
}
|
|
170
258
|
//# sourceMappingURL=validation-framework.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-framework.js","sourceRoot":"","sources":["../src/validation-framework.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"validation-framework.js","sourceRoot":"","sources":["../src/validation-framework.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,27 @@
|
|
|
5
5
|
* spans the FULL code space: registry codes (overridable via config), plus
|
|
6
6
|
* `InfoCode` and `NonOverridableCode` (structural reports / prerequisites that
|
|
7
7
|
* bypass the severity-override framework).
|
|
8
|
+
*
|
|
9
|
+
* ## The anchor contract — one meaning per field
|
|
10
|
+
*
|
|
11
|
+
* An issue points at up to four independent things, and each has its OWN field.
|
|
12
|
+
* None of them is ever packed into another with a separator:
|
|
13
|
+
*
|
|
14
|
+
* | field | means | example |
|
|
15
|
+
* |------------|--------------------------------------------------------------|---------|
|
|
16
|
+
* | `location` | **The file you would open to fix this**, as a project-relative POSIX path | `packages/cli/SKILL.md` |
|
|
17
|
+
* | `line` | 1-based line within `location` | `24` |
|
|
18
|
+
* | `field` | Dotted pointer INSIDE that document | `frontmatter.description` |
|
|
19
|
+
* | `link` | A link href / target the issue is about (never the file to open) | `./refs/missing.md` |
|
|
20
|
+
*
|
|
21
|
+
* `location` is **always relative** — enforced by the schema refinement below.
|
|
22
|
+
* Absolute paths leak the developer's home directory into CI logs and make the
|
|
23
|
+
* `validation.allow` globs (which match against `location`) unwritable. A
|
|
24
|
+
* consumer can therefore resolve every `location` against one known root and
|
|
25
|
+
* `grep`/glob them uniformly.
|
|
26
|
+
*
|
|
27
|
+
* Producers: use `issueLocation(absPath, projectRoot)` from
|
|
28
|
+
* `@vibe-agent-toolkit/utils` rather than hand-rolling the relativization.
|
|
8
29
|
*/
|
|
9
30
|
import { z } from 'zod';
|
|
10
31
|
import { type InfoCode, type IssueCode, type IssueSeverity, type NonOverridableCode } from './validation-codes.js';
|
|
@@ -14,8 +35,9 @@ export declare const ValidationIssueSchema: z.ZodObject<{
|
|
|
14
35
|
code: z.ZodString;
|
|
15
36
|
severity: z.ZodEnum<["error", "warning", "info", "ignore"]>;
|
|
16
37
|
message: z.ZodString;
|
|
17
|
-
location: z.ZodOptional<z.ZodString
|
|
38
|
+
location: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>;
|
|
18
39
|
line: z.ZodOptional<z.ZodNumber>;
|
|
40
|
+
field: z.ZodOptional<z.ZodString>;
|
|
19
41
|
link: z.ZodOptional<z.ZodString>;
|
|
20
42
|
fix: z.ZodOptional<z.ZodString>;
|
|
21
43
|
reference: z.ZodOptional<z.ZodString>;
|
|
@@ -26,6 +48,7 @@ export declare const ValidationIssueSchema: z.ZodObject<{
|
|
|
26
48
|
severity: "error" | "warning" | "info" | "ignore";
|
|
27
49
|
location?: string | undefined;
|
|
28
50
|
line?: number | undefined;
|
|
51
|
+
field?: string | undefined;
|
|
29
52
|
link?: string | undefined;
|
|
30
53
|
fix?: string | undefined;
|
|
31
54
|
reference?: string | undefined;
|
|
@@ -36,6 +59,7 @@ export declare const ValidationIssueSchema: z.ZodObject<{
|
|
|
36
59
|
severity: "error" | "warning" | "info" | "ignore";
|
|
37
60
|
location?: string | undefined;
|
|
38
61
|
line?: number | undefined;
|
|
62
|
+
field?: string | undefined;
|
|
39
63
|
link?: string | undefined;
|
|
40
64
|
fix?: string | undefined;
|
|
41
65
|
reference?: string | undefined;
|
|
@@ -45,13 +69,54 @@ export interface ValidationIssue {
|
|
|
45
69
|
code: ValidationIssueCode;
|
|
46
70
|
severity: IssueSeverity;
|
|
47
71
|
message: string;
|
|
72
|
+
/** Project-relative POSIX path of the file to open. Never absolute. */
|
|
48
73
|
location?: string;
|
|
74
|
+
/** 1-based line within {@link ValidationIssue.location}. */
|
|
49
75
|
line?: number;
|
|
76
|
+
/** Dotted pointer inside the document at {@link ValidationIssue.location}, e.g. `frontmatter.description`. */
|
|
77
|
+
field?: string;
|
|
78
|
+
/** A link href or target the issue concerns — not the file to open. */
|
|
50
79
|
link?: string;
|
|
51
80
|
fix?: string;
|
|
52
81
|
reference?: string;
|
|
53
82
|
suggestion?: string;
|
|
54
83
|
}
|
|
55
84
|
/** Build an issue from the registry, filling severity/fix/reference from the code entry. */
|
|
56
|
-
export declare function createRegistryIssue(code: IssueCode, message: string, extras?: Partial<Pick<ValidationIssue, 'location' | 'line' | 'link' | 'suggestion'>>): ValidationIssue;
|
|
85
|
+
export declare function createRegistryIssue(code: IssueCode, message: string, extras?: Partial<Pick<ValidationIssue, 'location' | 'line' | 'field' | 'link' | 'suggestion'>>): ValidationIssue;
|
|
86
|
+
/**
|
|
87
|
+
* Per-severity issue counts, published beside a status rather than folded into it.
|
|
88
|
+
*
|
|
89
|
+
* A status names the worst ACTIONABLE severity, which is a three-value answer to
|
|
90
|
+
* a four-value question — the distribution is not recoverable from it. Publishing
|
|
91
|
+
* the counts is what makes a two- or three-valued status honest: `success` then
|
|
92
|
+
* means "nothing you must act on", not "there was nothing to see".
|
|
93
|
+
*/
|
|
94
|
+
export interface SeverityCounts {
|
|
95
|
+
errors: number;
|
|
96
|
+
warnings: number;
|
|
97
|
+
info: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Count issues by resolved severity.
|
|
101
|
+
*
|
|
102
|
+
* `ignore` is excluded from every bucket: those findings were suppressed by the
|
|
103
|
+
* adopter's own `validation.allow` config, and counting them would resurrect
|
|
104
|
+
* something they deliberately silenced.
|
|
105
|
+
*/
|
|
106
|
+
export declare function countBySeverity(issues: readonly ValidationIssue[]): SeverityCounts;
|
|
107
|
+
/**
|
|
108
|
+
* The single answer to "issues → status": the worst ACTIONABLE severity.
|
|
109
|
+
*
|
|
110
|
+
* There were five implementations of this and three different answers for an
|
|
111
|
+
* info-only set — `warning` here, `success` in `vat audit`, and in
|
|
112
|
+
* `corpus/runner` a `statusFromCounts(errors, warnings)` whose signature could
|
|
113
|
+
* not see info at all. Two lanes could therefore report different statuses for
|
|
114
|
+
* the same artifact.
|
|
115
|
+
*
|
|
116
|
+
* Info-only resolves to `success` because an informational observation is not
|
|
117
|
+
* something the consumer must act on. That is only defensible when the counts
|
|
118
|
+
* ride alongside — pair every use of this with {@link countBySeverity}, or the
|
|
119
|
+
* status becomes the silence it used to be.
|
|
120
|
+
*/
|
|
121
|
+
export declare function calculateValidationStatus(issues: readonly ValidationIssue[]): 'success' | 'warning' | 'error';
|
|
57
122
|
//# sourceMappingURL=validation-issue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-issue.d.ts","sourceRoot":"","sources":["../src/validation-issue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"validation-issue.d.ts","sourceRoot":"","sources":["../src/validation-issue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,qGAAqG;AACrG,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAY5E,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBvB,CAAC;AAKZ,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8GAA8G;IAC9G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,CAAM,GACjG,eAAe,CAGjB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,cAAc,CAclF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,SAAS,GAAG,SAAS,GAAG,OAAO,CAMjC"}
|
package/dist/validation-issue.js
CHANGED
|
@@ -5,15 +5,54 @@
|
|
|
5
5
|
* spans the FULL code space: registry codes (overridable via config), plus
|
|
6
6
|
* `InfoCode` and `NonOverridableCode` (structural reports / prerequisites that
|
|
7
7
|
* bypass the severity-override framework).
|
|
8
|
+
*
|
|
9
|
+
* ## The anchor contract — one meaning per field
|
|
10
|
+
*
|
|
11
|
+
* An issue points at up to four independent things, and each has its OWN field.
|
|
12
|
+
* None of them is ever packed into another with a separator:
|
|
13
|
+
*
|
|
14
|
+
* | field | means | example |
|
|
15
|
+
* |------------|--------------------------------------------------------------|---------|
|
|
16
|
+
* | `location` | **The file you would open to fix this**, as a project-relative POSIX path | `packages/cli/SKILL.md` |
|
|
17
|
+
* | `line` | 1-based line within `location` | `24` |
|
|
18
|
+
* | `field` | Dotted pointer INSIDE that document | `frontmatter.description` |
|
|
19
|
+
* | `link` | A link href / target the issue is about (never the file to open) | `./refs/missing.md` |
|
|
20
|
+
*
|
|
21
|
+
* `location` is **always relative** — enforced by the schema refinement below.
|
|
22
|
+
* Absolute paths leak the developer's home directory into CI logs and make the
|
|
23
|
+
* `validation.allow` globs (which match against `location`) unwritable. A
|
|
24
|
+
* consumer can therefore resolve every `location` against one known root and
|
|
25
|
+
* `grep`/glob them uniformly.
|
|
26
|
+
*
|
|
27
|
+
* Producers: use `issueLocation(absPath, projectRoot)` from
|
|
28
|
+
* `@vibe-agent-toolkit/utils` rather than hand-rolling the relativization.
|
|
8
29
|
*/
|
|
30
|
+
import path from 'node:path';
|
|
9
31
|
import { z } from 'zod';
|
|
10
32
|
import { CODE_REGISTRY, } from './validation-codes.js';
|
|
33
|
+
/**
|
|
34
|
+
* Host-independent absolute-path test, mirroring `isAbsoluteAnyPlatform` in
|
|
35
|
+
* `@vibe-agent-toolkit/utils`. Inlined because `agent-schema` is the bottom of
|
|
36
|
+
* the dependency graph and carries no workspace runtime dependencies; a
|
|
37
|
+
* Windows-absolute `location` must be rejected even when validating on POSIX CI.
|
|
38
|
+
*/
|
|
39
|
+
function isAbsoluteAnyPlatform(p) {
|
|
40
|
+
return path.posix.isAbsolute(p) || path.win32.isAbsolute(p);
|
|
41
|
+
}
|
|
11
42
|
export const ValidationIssueSchema = z.object({
|
|
12
43
|
code: z.string(), // full code space; narrowed in the TS type below
|
|
13
44
|
severity: z.enum(['error', 'warning', 'info', 'ignore']),
|
|
14
45
|
message: z.string(),
|
|
15
|
-
location: z.string()
|
|
46
|
+
location: z.string()
|
|
47
|
+
.refine((v) => !isAbsoluteAnyPlatform(v), {
|
|
48
|
+
message: 'location must be a project-relative POSIX path, not an absolute path',
|
|
49
|
+
})
|
|
50
|
+
.refine((v) => !v.includes('\\'), {
|
|
51
|
+
message: 'location must use forward slashes, not backslashes',
|
|
52
|
+
})
|
|
53
|
+
.optional(),
|
|
16
54
|
line: z.number().int().positive().optional(),
|
|
55
|
+
field: z.string().optional(),
|
|
17
56
|
link: z.string().optional(),
|
|
18
57
|
fix: z.string().optional(),
|
|
19
58
|
reference: z.string().optional(),
|
|
@@ -24,4 +63,49 @@ export function createRegistryIssue(code, message, extras = {}) {
|
|
|
24
63
|
const e = CODE_REGISTRY[code];
|
|
25
64
|
return { code, severity: e.defaultSeverity, message, fix: e.fix, reference: e.reference, ...extras };
|
|
26
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Count issues by resolved severity.
|
|
68
|
+
*
|
|
69
|
+
* `ignore` is excluded from every bucket: those findings were suppressed by the
|
|
70
|
+
* adopter's own `validation.allow` config, and counting them would resurrect
|
|
71
|
+
* something they deliberately silenced.
|
|
72
|
+
*/
|
|
73
|
+
export function countBySeverity(issues) {
|
|
74
|
+
let errors = 0;
|
|
75
|
+
let warnings = 0;
|
|
76
|
+
let info = 0;
|
|
77
|
+
for (const issue of issues) {
|
|
78
|
+
if (issue.severity === 'error') {
|
|
79
|
+
errors += 1;
|
|
80
|
+
}
|
|
81
|
+
else if (issue.severity === 'warning') {
|
|
82
|
+
warnings += 1;
|
|
83
|
+
}
|
|
84
|
+
else if (issue.severity === 'info') {
|
|
85
|
+
info += 1;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { errors, warnings, info };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The single answer to "issues → status": the worst ACTIONABLE severity.
|
|
92
|
+
*
|
|
93
|
+
* There were five implementations of this and three different answers for an
|
|
94
|
+
* info-only set — `warning` here, `success` in `vat audit`, and in
|
|
95
|
+
* `corpus/runner` a `statusFromCounts(errors, warnings)` whose signature could
|
|
96
|
+
* not see info at all. Two lanes could therefore report different statuses for
|
|
97
|
+
* the same artifact.
|
|
98
|
+
*
|
|
99
|
+
* Info-only resolves to `success` because an informational observation is not
|
|
100
|
+
* something the consumer must act on. That is only defensible when the counts
|
|
101
|
+
* ride alongside — pair every use of this with {@link countBySeverity}, or the
|
|
102
|
+
* status becomes the silence it used to be.
|
|
103
|
+
*/
|
|
104
|
+
export function calculateValidationStatus(issues) {
|
|
105
|
+
const { errors, warnings } = countBySeverity(issues);
|
|
106
|
+
if (errors > 0) {
|
|
107
|
+
return 'error';
|
|
108
|
+
}
|
|
109
|
+
return warnings > 0 ? 'warning' : 'success';
|
|
110
|
+
}
|
|
27
111
|
//# sourceMappingURL=validation-issue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-issue.js","sourceRoot":"","sources":["../src/validation-issue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"validation-issue.js","sourceRoot":"","sources":["../src/validation-issue.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-agent-toolkit/agent-schema",
|
|
3
|
-
"version": "0.1.41-rc.
|
|
3
|
+
"version": "0.1.41-rc.8",
|
|
4
4
|
"description": "JSON Schema definitions and TypeScript types for VAT agent manifest format",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/picomatch": "^4.0.2",
|
|
42
|
-
"@vibe-agent-toolkit/utils": "0.1.41-rc.
|
|
42
|
+
"@vibe-agent-toolkit/utils": "0.1.41-rc.8",
|
|
43
43
|
"tsx": "^4.21.0",
|
|
44
44
|
"typescript": "^5.9.3",
|
|
45
45
|
"vitest": "^3.2.4"
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"PACKAGED_UNREFERENCED_FILE",
|
|
29
29
|
"PACKAGED_TEST_INPUT",
|
|
30
30
|
"PACKAGED_BROKEN_LINK",
|
|
31
|
+
"FILENAME_COLLISION",
|
|
31
32
|
"DUPLICATE_RESOURCE_ID",
|
|
32
33
|
"SKILL_LENGTH_EXCEEDS_RECOMMENDED",
|
|
33
34
|
"SKILL_TOTAL_SIZE_LARGE",
|
|
@@ -66,6 +67,7 @@
|
|
|
66
67
|
"COMPONENT_PRESENT_BUT_UNDECLARED",
|
|
67
68
|
"REFERENCE_TARGET_MISSING",
|
|
68
69
|
"MARKETPLACE_PLUGIN_SOURCE_MISSING",
|
|
70
|
+
"REGISTRY_SHAPE_DRIFT",
|
|
69
71
|
"LINK_BROKEN_FILE",
|
|
70
72
|
"LINK_BROKEN_ANCHOR",
|
|
71
73
|
"LINK_UNKNOWN",
|
|
@@ -135,6 +137,7 @@
|
|
|
135
137
|
"PACKAGED_UNREFERENCED_FILE",
|
|
136
138
|
"PACKAGED_TEST_INPUT",
|
|
137
139
|
"PACKAGED_BROKEN_LINK",
|
|
140
|
+
"FILENAME_COLLISION",
|
|
138
141
|
"DUPLICATE_RESOURCE_ID",
|
|
139
142
|
"SKILL_LENGTH_EXCEEDS_RECOMMENDED",
|
|
140
143
|
"SKILL_TOTAL_SIZE_LARGE",
|
|
@@ -173,6 +176,7 @@
|
|
|
173
176
|
"COMPONENT_PRESENT_BUT_UNDECLARED",
|
|
174
177
|
"REFERENCE_TARGET_MISSING",
|
|
175
178
|
"MARKETPLACE_PLUGIN_SOURCE_MISSING",
|
|
179
|
+
"REGISTRY_SHAPE_DRIFT",
|
|
176
180
|
"LINK_BROKEN_FILE",
|
|
177
181
|
"LINK_BROKEN_ANCHOR",
|
|
178
182
|
"LINK_UNKNOWN",
|