@vibe-agent-toolkit/agent-schema 0.1.41-rc.7 → 0.1.41
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 +11 -2
- package/dist/validation-codes.d.ts.map +1 -1
- package/dist/validation-codes.js +114 -5
- 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 +94 -25
- package/dist/validation-framework.js.map +1 -1
- package/package.json +2 -2
- package/schemas/validation-config.json +18 -0
|
@@ -23,14 +23,22 @@ export declare const CODE_REGISTRY: {
|
|
|
23
23
|
readonly LINK_OUTSIDE_PROJECT: CodeRegistryEntry;
|
|
24
24
|
readonly LINK_TARGETS_DIRECTORY: CodeRegistryEntry;
|
|
25
25
|
readonly LINK_TO_NAVIGATION_FILE: CodeRegistryEntry;
|
|
26
|
+
readonly LINK_TO_AGENT_INSTRUCTION_FILE: CodeRegistryEntry;
|
|
26
27
|
readonly LINK_TO_GITIGNORED_FILE: CodeRegistryEntry;
|
|
27
28
|
readonly LINK_MISSING_TARGET: CodeRegistryEntry;
|
|
28
29
|
readonly LINK_DEFERRED_ARTIFACT: CodeRegistryEntry;
|
|
29
30
|
readonly LINK_TO_SKILL_DEFINITION: CodeRegistryEntry;
|
|
30
31
|
readonly LINK_DROPPED_BY_DEPTH: CodeRegistryEntry;
|
|
31
32
|
readonly PACKAGED_UNREFERENCED_FILE: CodeRegistryEntry;
|
|
33
|
+
readonly PACKAGED_AGENT_INSTRUCTION_FILE: CodeRegistryEntry;
|
|
34
|
+
readonly TREE_PROVENANCE_INDETERMINATE: CodeRegistryEntry;
|
|
35
|
+
readonly FILES_GLOB_DROPPED_NEVER_PACKAGED: CodeRegistryEntry;
|
|
36
|
+
readonly FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED: CodeRegistryEntry;
|
|
37
|
+
readonly FILES_GLOB_MATCHED_NOTHING: CodeRegistryEntry;
|
|
32
38
|
readonly PACKAGED_TEST_INPUT: CodeRegistryEntry;
|
|
33
39
|
readonly PACKAGED_BROKEN_LINK: CodeRegistryEntry;
|
|
40
|
+
readonly FILENAME_COLLISION: CodeRegistryEntry;
|
|
41
|
+
readonly PLUGIN_EXCLUDE_PATTERN_UNUSED: CodeRegistryEntry;
|
|
34
42
|
readonly DUPLICATE_RESOURCE_ID: CodeRegistryEntry;
|
|
35
43
|
readonly SKILL_LENGTH_EXCEEDS_RECOMMENDED: CodeRegistryEntry;
|
|
36
44
|
readonly SKILL_TOTAL_SIZE_LARGE: CodeRegistryEntry;
|
|
@@ -69,6 +77,7 @@ export declare const CODE_REGISTRY: {
|
|
|
69
77
|
readonly COMPONENT_PRESENT_BUT_UNDECLARED: CodeRegistryEntry;
|
|
70
78
|
readonly REFERENCE_TARGET_MISSING: CodeRegistryEntry;
|
|
71
79
|
readonly MARKETPLACE_PLUGIN_SOURCE_MISSING: CodeRegistryEntry;
|
|
80
|
+
readonly REGISTRY_SHAPE_DRIFT: CodeRegistryEntry;
|
|
72
81
|
readonly LINK_BROKEN_FILE: CodeRegistryEntry;
|
|
73
82
|
readonly LINK_BROKEN_ANCHOR: CodeRegistryEntry;
|
|
74
83
|
readonly LINK_UNKNOWN: CodeRegistryEntry;
|
|
@@ -92,9 +101,9 @@ export declare const CODE_REGISTRY: {
|
|
|
92
101
|
readonly LINK_AUTH_UNVERIFIED: CodeRegistryEntry;
|
|
93
102
|
};
|
|
94
103
|
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")[]]>;
|
|
104
|
+
export declare const IssueCodeSchema: z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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
105
|
/** Codes outside the overridable framework — structural reports. */
|
|
97
106
|
export type InfoCode = 'FILE_STRUCTURE_REPORT' | 'RESOURCE_INVENTORY' | 'METADATA_SUMMARY' | 'SKILL_IMPLICIT_REFERENCE' | 'SKILL_UNREFERENCED_FILE';
|
|
98
107
|
/** 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' | '
|
|
108
|
+
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
109
|
//# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+jB4B,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,aAAa,CAAC;AAEnD,eAAO,MAAM,eAAe,4gJAE3B,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
|
@@ -14,14 +14,122 @@ export const CODE_REGISTRY = {
|
|
|
14
14
|
LINK_OUTSIDE_PROJECT: entry('error', 'Markdown link points to a file outside the project root.', 'Move the target inside the project or remove the link. Use validation.allow if the reference is intentional and cross-project.', 'link_outside_project'),
|
|
15
15
|
LINK_TARGETS_DIRECTORY: entry('error', 'A typed single-file reference (e.g. a packaging `files:` source entry) resolves to a directory instead of a file.', 'Point the `files:` source (or other single-file reference) at a specific file, not a directory. Navigational prose links to a directory are valid and do not trigger this code.', 'link_targets_directory'),
|
|
16
16
|
LINK_TO_NAVIGATION_FILE: entry('warning', 'Markdown link targets a navigation file (README.md, index.md, etc.) which was excluded from the bundle.', 'Link to the specific content instead of the navigation file, or set severity.LINK_TO_NAVIGATION_FILE to ignore if this is intentional.', 'link_to_navigation_file'),
|
|
17
|
-
|
|
17
|
+
LINK_TO_AGENT_INSTRUCTION_FILE: entry('error',
|
|
18
|
+
// "excluded from the bundle" used to be asserted unconditionally, and it was
|
|
19
|
+
// FALSE in the one configuration the fix string recommended: with an explicit
|
|
20
|
+
// files: entry naming the file, the file shipped. The description now states
|
|
21
|
+
// the precondition that makes it true, and names the consequence the old
|
|
22
|
+
// wording left silent — the link is stripped, so the packaged prose points at
|
|
23
|
+
// nothing.
|
|
24
|
+
'Markdown link targets a repo-internal agent-instruction file (CLAUDE.md, AGENTS.md, GEMINI.md) that no explicit files: entry declares; it is not bundled and the link is stripped from the packaged content.',
|
|
25
|
+
// Three real remedies, then the declaration route. The absolute-URL route is
|
|
26
|
+
// listed because it is the cheapest correct fix for the dominant population —
|
|
27
|
+
// links that point UPWARD out of the skill dir at a file whose canonical home
|
|
28
|
+
// is a repository the reader can open.
|
|
29
|
+
//
|
|
30
|
+
// The declaration route is stated as EXPLICIT (non-glob) deliberately: it used
|
|
31
|
+
// to read "declare it under skills.config.<name>.files" and doing exactly that
|
|
32
|
+
// changed nothing, because the walker refused the link whatever the config
|
|
33
|
+
// said. The remedy told you to do the thing you had already done. It is now
|
|
34
|
+
// honoured, and the qualifier is load-bearing — a glob is a net, not a
|
|
35
|
+
// declaration, and never packages one of these files.
|
|
36
|
+
"Link the specific content the file describes; point the link at the file's canonical home as an absolute URL; or extract the shared part into a document intended for distribution. To ship the file deliberately, name it in an explicit (non-glob) skills.config.<name>.files entry — the file is then bundled and this link is rewritten to the declared dest.", 'link_to_agent_instruction_file'),
|
|
37
|
+
LINK_TO_GITIGNORED_FILE: entry('error', 'Markdown link targets a gitignored file; risks leaking ignored data into the bundle.', 'Link to a non-ignored file or adjust .gitignore. Allow the specific path via validation.allow if the risk has been reviewed. If the target is a build artifact, declare it under skills.config.<name>.files instead.', 'link_to_gitignored_file'),
|
|
18
38
|
LINK_MISSING_TARGET: entry('error', 'Markdown link target does not exist on disk and is not a declared build artifact.', 'Fix the link path, create the file, or declare it under skills.config.<name>.files as a build artifact.', 'link_missing_target'),
|
|
19
39
|
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
40
|
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
41
|
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
42
|
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'),
|
|
43
|
+
PACKAGED_AGENT_INSTRUCTION_FILE: entry('warning', 'A repo-internal agent-instruction file (CLAUDE.md, AGENTS.md, GEMINI.md) is present in the scanned tree — a built skill bundle, an installed plugin, or a plugin source directory.',
|
|
44
|
+
// Two lanes hand this detector different trees, and one remediation has to be
|
|
45
|
+
// true for both. In a DIST tree the file demonstrably shipped, so removing it
|
|
46
|
+
// is the fix. In a repo SOURCE tree the build already excludes it from the
|
|
47
|
+
// plugin tree-copy and from files: globs, so it does not ship unless an
|
|
48
|
+
// explicit files: entry names it — prescribing deletion there told adopters to
|
|
49
|
+
// delete a useful repo-internal doc to silence a warning about a file that no
|
|
50
|
+
// longer travels.
|
|
51
|
+
//
|
|
52
|
+
// The last clause is for the third lane: `vat audit <path>` resolves a subject
|
|
53
|
+
// by PATH, and a built bundle's path is not its source skill's declared path,
|
|
54
|
+
// so that lane cannot reach the `files:` block that may have sanctioned the
|
|
55
|
+
// file. `vat build` and `vat verify` CAN, and they honour it by not reporting
|
|
56
|
+
// at all — so a reader who sees this from audit alone must not conclude the
|
|
57
|
+
// declaration failed.
|
|
58
|
+
'In a distributed tree (a built bundle or an installed plugin) remove the file, or move it outside the directory that is packaged. In a repo source tree, confirm first whether it ships: the build excludes agent-instruction files from the plugin tree-copy and from files: globs, so only an explicit files: entry naming it puts it in the output. If it must ship, set severity.PACKAGED_AGENT_INSTRUCTION_FILE to ignore so the exception is recorded in config. If an explicit files: entry already names this dest, vat build and vat verify honour it and stay silent; vat audit reports it anyway because a path-addressed scan cannot see the config that declared it.', 'packaged_agent_instruction_file'),
|
|
59
|
+
// The companion PACKAGED_AGENT_INSTRUCTION_FILE needs in order to be allowed to
|
|
60
|
+
// stay silent. Its audit lane only reports files in a DISTRIBUTED tree, and the
|
|
61
|
+
// distributed/source question is answered from git — so anything that stops git
|
|
62
|
+
// answering (no binary on PATH, a corrupt or unreadable `.git`) used to collapse
|
|
63
|
+
// to "not ignored", i.e. source, i.e. silence, with `status: success` and no
|
|
64
|
+
// trace anywhere that the detector had been switched off.
|
|
65
|
+
//
|
|
66
|
+
// A missing answer is therefore reported as a missing answer. Deliberately NOT
|
|
67
|
+
// resolved by assuming `distributed`: that manufactures a substantive claim
|
|
68
|
+
// about the artifact ("this file shipped to consumers") that nothing observed,
|
|
69
|
+
// and its remediation — remove the file — is wrong advice for the ordinary
|
|
70
|
+
// source tree in a container with no git.
|
|
71
|
+
//
|
|
72
|
+
// `warning`, matching the code it stands in for, so a CI gate counting warnings
|
|
73
|
+
// cannot be quietly zeroed by breaking git. Emitted only when the tree actually
|
|
74
|
+
// holds agent-instruction files: with none there, nothing was left unclassified
|
|
75
|
+
// and healthy git would have said nothing either.
|
|
76
|
+
TREE_PROVENANCE_INDETERMINATE: entry('warning', 'Could not determine whether a scanned skill tree is repository source or a distributed artifact, because `git` could not be consulted; agent-instruction files present in the tree were left unclassified rather than silently accepted.', 'Make `git` runnable for this tree — install it, put it on PATH, or repair the repository whose `.git` directory could not be read — then re-run the audit. Set severity.TREE_PROVENANCE_INDETERMINATE to ignore if this environment deliberately has no git and the unclassified files are known to be repository source.', 'tree_provenance_indeterminate'),
|
|
77
|
+
FILES_GLOB_DROPPED_NEVER_PACKAGED: entry('warning', 'A `files:` glob matched a file that is never packaged into a skill bundle (an agent-instruction file such as CLAUDE.md, or a navigation file such as README.md); it was dropped and did not ship.', 'No action needed if the drop is intended — a glob is a net, not a declaration. To ship that specific file deliberately, add an explicit `files:` entry naming it (`source: <path>`); to stop matching it at all, narrow the glob.', 'files_glob_dropped_never_packaged'),
|
|
78
|
+
// The third of three verdicts a pre-build gate can reach about one glob entry
|
|
79
|
+
// (partial drop / nothing shippable / nothing matched). This one: the glob
|
|
80
|
+
// matched, and the never-package list refused EVERY match, so the entry ships
|
|
81
|
+
// nothing and `copyGlobEntry` raises its own distinct error.
|
|
82
|
+
//
|
|
83
|
+
// A separate code rather than a widened FILES_GLOB_MATCHED_NOTHING because the
|
|
84
|
+
// two have different causes and therefore different remedies: "produce the
|
|
85
|
+
// artifact first" is useless advice for a glob that netted only files VAT never
|
|
86
|
+
// packages, and "name the file explicitly" is useless for one whose directory
|
|
87
|
+
// is empty. One code would have to carry both, and a reader would have to work
|
|
88
|
+
// out which half applied to them.
|
|
89
|
+
//
|
|
90
|
+
// `warning`, not `error`: a pre-build tree can be a PARTIAL artifact just as it
|
|
91
|
+
// can be an absent one — a stale `dist/` holding only a README.md is the same
|
|
92
|
+
// phenomenon that makes the zero-match `info` — so blocking CI here can be
|
|
93
|
+
// wrong. Louder than `info` because, unlike an empty directory, a directory
|
|
94
|
+
// containing only never-packaged files is not the ordinary pre-build state.
|
|
95
|
+
FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED: entry('warning', 'A `files:` glob matched only files that are never packaged into a skill bundle (agent-instruction files such as CLAUDE.md, navigation files such as README.md), so the entry ships nothing and `vat skills build` fails on it.',
|
|
96
|
+
// Deliberately does NOT say "widen the glob": the never-package filter matches
|
|
97
|
+
// on basename and applies at any width, so a wider glob clears the error while
|
|
98
|
+
// still shipping none of these files — advice that looks like it worked.
|
|
99
|
+
'Name the file you intend to ship in an explicit (non-glob) `files:` entry (`source: <path>`), or point the glob at a directory that holds files which can be packaged. Widening the glob does not help — the never-package filter matches on basename at any width. Set severity.FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED to ignore if the entry is deliberately inert.', 'files_glob_matched_only_never_packaged'),
|
|
100
|
+
// Distinct from FILES_GLOB_DROPPED_NEVER_PACKAGED, which is about a glob that
|
|
101
|
+
// MATCHED and then had a match refused, and from
|
|
102
|
+
// FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED, where it matched and none survived.
|
|
103
|
+
// This one is about a glob that matched nothing at all — the other input
|
|
104
|
+
// `vat skills build` dies on.
|
|
105
|
+
//
|
|
106
|
+
// `info`, not `warning`: a pre-build gate runs before the artifact exists, so a
|
|
107
|
+
// glob over an unbuilt `dist/` matching nothing is the expected state and must
|
|
108
|
+
// not fail anyone's CI. But "expected state" and "the build will die on this"
|
|
109
|
+
// are both true at once, and the gate used to report NEITHER — reporting the
|
|
110
|
+
// drop that is harmless by design while staying silent about the zero-match
|
|
111
|
+
// that is fatal.
|
|
112
|
+
FILES_GLOB_MATCHED_NOTHING: entry('info', 'A `files:` glob currently matches no files; `vat skills build` fails on a glob that matches nothing, so the build will fail unless that artifact is produced first.', 'No action needed if the glob points at a build artifact your project produces before `vat skills build` runs — matching nothing beforehand is expected. Otherwise correct the pattern (a `files:` source resolves relative to the project root) or drop the entry. Set severity.FILES_GLOB_MATCHED_NOTHING to ignore to silence it everywhere.', 'files_glob_matched_nothing'),
|
|
23
113
|
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
|
-
PACKAGED_BROKEN_LINK: entry('error',
|
|
114
|
+
PACKAGED_BROKEN_LINK: entry('error',
|
|
115
|
+
// The CAUSE deliberately lives in `fix`, not here. This code has two
|
|
116
|
+
// populations — a link-rewriter bug, and a target the never-package filter
|
|
117
|
+
// dropped on purpose — and only the emitting lane knows which one it is
|
|
118
|
+
// holding, so only the per-issue `fix` can name it. When the cause was
|
|
119
|
+
// asserted in the description ("likely a link-rewriter bug"), the
|
|
120
|
+
// policy-drop branch shipped one issue whose message blamed VAT and whose
|
|
121
|
+
// `fix` said "Nothing to report — VAT dropped this file on purpose": the two
|
|
122
|
+
// halves of a single finding contradicting each other. The description now
|
|
123
|
+
// states only what every emission observed — the link does not resolve in
|
|
124
|
+
// the output — and each lane supplies its own remediation.
|
|
125
|
+
'Link in the packaged output resolves to a file that is not present in the output.', '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'),
|
|
126
|
+
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'),
|
|
127
|
+
PLUGIN_EXCLUDE_PATTERN_UNUSED: entry('warning', 'A plugin `exclude:` pattern matched no file in the plugin source tree; it excluded nothing from the built bundle.',
|
|
128
|
+
// Names only what the author can act on. A dead pattern has no "correct"
|
|
129
|
+
// resolution VAT can pick — the path may be a typo, or the junk it used to
|
|
130
|
+
// catch may simply be gone — so the fix is to check it against the source
|
|
131
|
+
// dir and then either correct it or delete the line.
|
|
132
|
+
"Check the pattern against the plugin source directory (patterns are relative to it, and a bare directory name covers its whole subtree), then correct the path — or drop the entry from the marketplace plugin entry's exclude: list if what it targeted no longer exists.", 'plugin_exclude_pattern_unused'),
|
|
25
133
|
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
134
|
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
135
|
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'),
|
|
@@ -39,14 +147,14 @@ export const CODE_REGISTRY = {
|
|
|
39
147
|
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
148
|
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
149
|
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
|
-
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'),
|
|
150
|
+
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. Allow via validation.allow with a reason when the dependency is genuinely runtime-optional.', 'skill_cross_skill_auth_undeclared'),
|
|
43
151
|
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'),
|
|
44
152
|
PLUGIN_MISSING_DESCRIPTION: entry('info', 'plugin.json is missing the recommended `description` field.', 'Add a "description" field to plugin.json so users see what the plugin does in the listing.', 'plugin_missing_description'),
|
|
45
153
|
PLUGIN_MISSING_AUTHOR: entry('info', 'plugin.json is missing the recommended `author` field.', 'Add an "author" object (e.g. { "name": "..." }) to plugin.json so downstream consumers can attribute the plugin.', 'plugin_missing_author'),
|
|
46
154
|
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
155
|
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
156
|
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.
|
|
157
|
+
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
158
|
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
159
|
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
160
|
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 +168,7 @@ export const CODE_REGISTRY = {
|
|
|
60
168
|
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
169
|
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
170
|
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'),
|
|
171
|
+
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
172
|
// Resources path — link / frontmatter / external-URL codes
|
|
64
173
|
// Promotions of existing resources-package validator behavior (formerly free-form
|
|
65
174
|
// lowercase `type` strings). Severities are locked by the design spec and reflect
|
|
@@ -68,7 +177,7 @@ export const CODE_REGISTRY = {
|
|
|
68
177
|
LINK_BROKEN_FILE: entry('error', 'Local file link points to a non-existent file.', 'Fix the path or create the target.', 'link_broken_file'),
|
|
69
178
|
LINK_BROKEN_ANCHOR: entry('error', 'Anchor link points to a non-existent heading/id.', 'Fix the fragment or the target heading.', 'link_broken_anchor'),
|
|
70
179
|
LINK_UNKNOWN: entry('warning', 'Link type could not be classified.', 'Use a recognized link form.', 'link_unknown'),
|
|
71
|
-
LINK_TO_GITIGNORED: entry('error', 'A tracked file links to a gitignored file.', 'Link a tracked target or un-ignore it.', 'link_to_gitignored'),
|
|
180
|
+
LINK_TO_GITIGNORED: entry('error', 'A tracked file links to a gitignored file.', 'Link a tracked target or un-ignore it. If the target is a build artifact, declare it under skills.config.<name>.files instead.', 'link_to_gitignored'),
|
|
72
181
|
LINK_UNRESOLVED_REFERENCE: entry('warning', 'A reference-style link ([text][label] or collapsed [label][]) has no matching [label]: url definition anywhere in the document.', 'Add the missing [label]: url definition, or rewrite as an inline link [text](url).', 'link_unresolved_reference'),
|
|
73
182
|
MALFORMED_HTML: entry('info', 'HTML resource has well-formedness issues reported by the parser.', 'Fix the malformed markup (unclosed tags, stray characters). Informational by default; raise severity via validation.severity to enforce.', 'malformed_html'),
|
|
74
183
|
FRONTMATTER_MISSING: entry('error', 'Schema requires frontmatter but the file has none.', 'Add the required frontmatter.', 'frontmatter_missing'),
|
|
@@ -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,
|
|
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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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_AGENT_INSTRUCTION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_DEFERRED_ARTIFACT" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "PACKAGED_AGENT_INSTRUCTION_FILE" | "TREE_PROVENANCE_INDETERMINATE" | "FILES_GLOB_DROPPED_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED" | "FILES_GLOB_MATCHED_NOTHING" | "PACKAGED_TEST_INPUT" | "PACKAGED_BROKEN_LINK" | "FILENAME_COLLISION" | "PLUGIN_EXCLUDE_PATTERN_UNUSED" | "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 = [];
|
|
@@ -110,8 +113,36 @@ export function applyAllowFilter(issues, config, now = new Date()) {
|
|
|
110
113
|
emitted.push(issue);
|
|
111
114
|
}
|
|
112
115
|
}
|
|
113
|
-
const { expired,
|
|
114
|
-
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;
|
|
115
146
|
}
|
|
116
147
|
function finalize(issue, config) {
|
|
117
148
|
const code = issue.code;
|
|
@@ -155,16 +186,38 @@ function emitExpiredMeta(expired, config, emitted) {
|
|
|
155
186
|
emitted.push(final);
|
|
156
187
|
}
|
|
157
188
|
}
|
|
158
|
-
|
|
159
|
-
|
|
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;
|
|
160
205
|
const msg = `Allow entry for ${u.code} matched no issues (paths: ${u.paths.join(', ')}).`;
|
|
161
|
-
const
|
|
162
|
-
const final = finalize(raw, config);
|
|
206
|
+
const final = finalize(metaIssue('ALLOW_UNUSED', msg, `validation.allow.${u.code}`), config);
|
|
163
207
|
if (final)
|
|
164
|
-
|
|
208
|
+
ledger.candidates.set(key, final);
|
|
165
209
|
}
|
|
166
210
|
}
|
|
167
|
-
|
|
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()) {
|
|
168
221
|
// 1. Allow filter against raw issues (before severity resolution — allow is
|
|
169
222
|
// indifferent to severity).
|
|
170
223
|
const filtered = applyAllowFilter(rawIssues, config, now);
|
|
@@ -176,9 +229,11 @@ export function runValidationFramework(rawIssues, config, now = new Date()) {
|
|
|
176
229
|
emitted.push(final);
|
|
177
230
|
}
|
|
178
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.
|
|
179
234
|
emitExpiredMeta(filtered.expired, config, emitted);
|
|
180
|
-
// 4.
|
|
181
|
-
|
|
235
|
+
// 4. Contribute this unit's allow-entry usage to the run.
|
|
236
|
+
recordAllowUsage(filtered.usage, config, ledger);
|
|
182
237
|
const allowed = filtered.allowed;
|
|
183
238
|
return {
|
|
184
239
|
emitted,
|
|
@@ -186,4 +241,18 @@ export function runValidationFramework(rawIssues, config, now = new Date()) {
|
|
|
186
241
|
hasErrors: emitted.some(i => i.severity === 'error'),
|
|
187
242
|
};
|
|
188
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
|
+
}
|
|
189
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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-agent-toolkit/agent-schema",
|
|
3
|
-
"version": "0.1.41
|
|
3
|
+
"version": "0.1.41",
|
|
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
|
|
42
|
+
"@vibe-agent-toolkit/utils": "0.1.41",
|
|
43
43
|
"tsx": "^4.21.0",
|
|
44
44
|
"typescript": "^5.9.3",
|
|
45
45
|
"vitest": "^3.2.4"
|
|
@@ -20,14 +20,22 @@
|
|
|
20
20
|
"LINK_OUTSIDE_PROJECT",
|
|
21
21
|
"LINK_TARGETS_DIRECTORY",
|
|
22
22
|
"LINK_TO_NAVIGATION_FILE",
|
|
23
|
+
"LINK_TO_AGENT_INSTRUCTION_FILE",
|
|
23
24
|
"LINK_TO_GITIGNORED_FILE",
|
|
24
25
|
"LINK_MISSING_TARGET",
|
|
25
26
|
"LINK_DEFERRED_ARTIFACT",
|
|
26
27
|
"LINK_TO_SKILL_DEFINITION",
|
|
27
28
|
"LINK_DROPPED_BY_DEPTH",
|
|
28
29
|
"PACKAGED_UNREFERENCED_FILE",
|
|
30
|
+
"PACKAGED_AGENT_INSTRUCTION_FILE",
|
|
31
|
+
"TREE_PROVENANCE_INDETERMINATE",
|
|
32
|
+
"FILES_GLOB_DROPPED_NEVER_PACKAGED",
|
|
33
|
+
"FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED",
|
|
34
|
+
"FILES_GLOB_MATCHED_NOTHING",
|
|
29
35
|
"PACKAGED_TEST_INPUT",
|
|
30
36
|
"PACKAGED_BROKEN_LINK",
|
|
37
|
+
"FILENAME_COLLISION",
|
|
38
|
+
"PLUGIN_EXCLUDE_PATTERN_UNUSED",
|
|
31
39
|
"DUPLICATE_RESOURCE_ID",
|
|
32
40
|
"SKILL_LENGTH_EXCEEDS_RECOMMENDED",
|
|
33
41
|
"SKILL_TOTAL_SIZE_LARGE",
|
|
@@ -66,6 +74,7 @@
|
|
|
66
74
|
"COMPONENT_PRESENT_BUT_UNDECLARED",
|
|
67
75
|
"REFERENCE_TARGET_MISSING",
|
|
68
76
|
"MARKETPLACE_PLUGIN_SOURCE_MISSING",
|
|
77
|
+
"REGISTRY_SHAPE_DRIFT",
|
|
69
78
|
"LINK_BROKEN_FILE",
|
|
70
79
|
"LINK_BROKEN_ANCHOR",
|
|
71
80
|
"LINK_UNKNOWN",
|
|
@@ -127,14 +136,22 @@
|
|
|
127
136
|
"LINK_OUTSIDE_PROJECT",
|
|
128
137
|
"LINK_TARGETS_DIRECTORY",
|
|
129
138
|
"LINK_TO_NAVIGATION_FILE",
|
|
139
|
+
"LINK_TO_AGENT_INSTRUCTION_FILE",
|
|
130
140
|
"LINK_TO_GITIGNORED_FILE",
|
|
131
141
|
"LINK_MISSING_TARGET",
|
|
132
142
|
"LINK_DEFERRED_ARTIFACT",
|
|
133
143
|
"LINK_TO_SKILL_DEFINITION",
|
|
134
144
|
"LINK_DROPPED_BY_DEPTH",
|
|
135
145
|
"PACKAGED_UNREFERENCED_FILE",
|
|
146
|
+
"PACKAGED_AGENT_INSTRUCTION_FILE",
|
|
147
|
+
"TREE_PROVENANCE_INDETERMINATE",
|
|
148
|
+
"FILES_GLOB_DROPPED_NEVER_PACKAGED",
|
|
149
|
+
"FILES_GLOB_MATCHED_ONLY_NEVER_PACKAGED",
|
|
150
|
+
"FILES_GLOB_MATCHED_NOTHING",
|
|
136
151
|
"PACKAGED_TEST_INPUT",
|
|
137
152
|
"PACKAGED_BROKEN_LINK",
|
|
153
|
+
"FILENAME_COLLISION",
|
|
154
|
+
"PLUGIN_EXCLUDE_PATTERN_UNUSED",
|
|
138
155
|
"DUPLICATE_RESOURCE_ID",
|
|
139
156
|
"SKILL_LENGTH_EXCEEDS_RECOMMENDED",
|
|
140
157
|
"SKILL_TOTAL_SIZE_LARGE",
|
|
@@ -173,6 +190,7 @@
|
|
|
173
190
|
"COMPONENT_PRESENT_BUT_UNDECLARED",
|
|
174
191
|
"REFERENCE_TARGET_MISSING",
|
|
175
192
|
"MARKETPLACE_PLUGIN_SOURCE_MISSING",
|
|
193
|
+
"REGISTRY_SHAPE_DRIFT",
|
|
176
194
|
"LINK_BROKEN_FILE",
|
|
177
195
|
"LINK_BROKEN_ANCHOR",
|
|
178
196
|
"LINK_UNKNOWN",
|