@vibe-agent-toolkit/agent-schema 0.1.38 → 0.1.39-rc.2

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/index.d.ts CHANGED
@@ -6,6 +6,9 @@
6
6
  export { toJsonSchema, type JsonSchemaOptions } from './schema-utils.js';
7
7
  export * from './result-types.js';
8
8
  export * from './output-envelopes.js';
9
+ export * from './validation-codes.js';
10
+ export * from './validation-issue.js';
11
+ export * from './validation-framework.js';
9
12
  export { AgentMetadataSchema, BuildMetadataSchema, type AgentMetadata, type BuildMetadata, } from './metadata.js';
10
13
  export { LLMConfigSchema, type LLMConfig, } from './llm.js';
11
14
  export { AgentInterfaceSchema, SchemaRefSchema, type Agent, type AgentInterface, type SchemaRef, } from './interface.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,KAAK,SAAS,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,KAAK,IAAI,EACT,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAG1C,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,KAAK,SAAS,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,KAAK,IAAI,EACT,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -8,6 +8,11 @@ export { toJsonSchema } from './schema-utils.js';
8
8
  // Result types
9
9
  export * from './result-types.js';
10
10
  export * from './output-envelopes.js';
11
+ // Canonical validation code registry
12
+ export * from './validation-codes.js';
13
+ // Unified validation issue + framework
14
+ export * from './validation-issue.js';
15
+ export * from './validation-framework.js';
11
16
  // Core schemas
12
17
  export { AgentMetadataSchema, BuildMetadataSchema, } from './metadata.js';
13
18
  export { LLMConfigSchema, } from './llm.js';
@@ -17,4 +22,8 @@ export { ResourceRegistrySchema, ResourceSchema, } from './resource-registry.js'
17
22
  export { AgentManifestSchema, AgentSpecSchema, CompositionConfigSchema, CredentialsConfigSchema, MemoryConfigSchema, PromptConfigSchema, PromptsConfigSchema, RAGConfigSchema, TestConfigSchema, } from './agent-manifest.js';
18
23
  export { PackagingOptionsSchema, SKILL_NAME_REGEX, SKILL_NAME_REGEX_MESSAGE, VatAgentMetadataSchema, VatPackageMetadataSchema, VatPureFunctionMetadataSchema, VatSkillMetadataSchema, } from './package-metadata.js';
19
24
  export { AllowEntrySchema, SeverityLevelSchema, ValidationConfigSchema, } from './validation-config.js';
25
+ // `ValidationConfig` is the single canonical config type: the Zod-inferred type
26
+ // from validation-config.ts. validation-framework.ts re-exports the same type
27
+ // (and derives SeverityConfig/AllowConfig from it), so there is no collision —
28
+ // `export *` from validation-framework.js surfaces the identical symbol.
20
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAwB;AACxB,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AAEzE,eAAe;AACf,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AAEtC,eAAe;AACf,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,GAEhB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,eAAe,GAIhB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qBAAqB,EACrB,UAAU,GAGX,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,sBAAsB,EACtB,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GAUjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,GAMvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GAIvB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAwB;AACxB,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AAEzE,eAAe;AACf,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AAEtC,qCAAqC;AACrC,cAAc,uBAAuB,CAAC;AAEtC,uCAAuC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAE1C,eAAe;AACf,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,GAEhB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,eAAe,GAIhB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qBAAqB,EACrB,UAAU,GAGX,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,sBAAsB,EACtB,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GAUjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,GAMvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GAIvB,MAAM,wBAAwB,CAAC;AAChC,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,yEAAyE"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Canonical code registry.
3
+ *
4
+ * Single source of truth for every overridable validation code VAT emits.
5
+ * Describes default severity, human description, fix hint, and a stable
6
+ * reference anchor into docs/validation-codes.md.
7
+ *
8
+ * Renderers (CLI help, skill docs, runtime output) all pull from this
9
+ * registry — no duplication.
10
+ */
11
+ import { z } from 'zod';
12
+ export type IssueSeverity = 'error' | 'warning' | 'info' | 'ignore';
13
+ /** Non-ignore severities actually emitted to consumers. */
14
+ export type EmittedSeverity = Exclude<IssueSeverity, 'ignore'>;
15
+ export interface CodeRegistryEntry {
16
+ defaultSeverity: EmittedSeverity;
17
+ description: string;
18
+ fix: string;
19
+ /** Stable anchor into docs/validation-codes.md (e.g. '#link_outside_project'). */
20
+ reference: string;
21
+ }
22
+ export declare const CODE_REGISTRY: {
23
+ readonly LINK_OUTSIDE_PROJECT: CodeRegistryEntry;
24
+ readonly LINK_TARGETS_DIRECTORY: CodeRegistryEntry;
25
+ readonly LINK_TO_NAVIGATION_FILE: CodeRegistryEntry;
26
+ readonly LINK_TO_GITIGNORED_FILE: CodeRegistryEntry;
27
+ readonly LINK_MISSING_TARGET: CodeRegistryEntry;
28
+ readonly LINK_TO_SKILL_DEFINITION: CodeRegistryEntry;
29
+ readonly LINK_DROPPED_BY_DEPTH: CodeRegistryEntry;
30
+ readonly PACKAGED_UNREFERENCED_FILE: CodeRegistryEntry;
31
+ readonly PACKAGED_BROKEN_LINK: CodeRegistryEntry;
32
+ readonly DUPLICATE_RESOURCE_ID: CodeRegistryEntry;
33
+ readonly SKILL_LENGTH_EXCEEDS_RECOMMENDED: CodeRegistryEntry;
34
+ readonly SKILL_TOTAL_SIZE_LARGE: CodeRegistryEntry;
35
+ readonly SKILL_TOO_MANY_FILES: CodeRegistryEntry;
36
+ readonly REFERENCE_TOO_DEEP: CodeRegistryEntry;
37
+ readonly DESCRIPTION_TOO_VAGUE: CodeRegistryEntry;
38
+ readonly NO_PROGRESSIVE_DISCLOSURE: CodeRegistryEntry;
39
+ readonly SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT: CodeRegistryEntry;
40
+ readonly SKILL_DESCRIPTION_FILLER_OPENER: CodeRegistryEntry;
41
+ readonly SKILL_DESCRIPTION_WRONG_PERSON: CodeRegistryEntry;
42
+ readonly SKILL_CLAUDE_PLUGIN_NAME_MISMATCH: CodeRegistryEntry;
43
+ readonly SKILL_NAME_MISMATCHES_DIR: CodeRegistryEntry;
44
+ readonly RESERVED_WORD_IN_NAME: CodeRegistryEntry;
45
+ readonly SKILL_TIME_SENSITIVE_CONTENT: CodeRegistryEntry;
46
+ readonly SKILL_FRONTMATTER_EXTRA_FIELDS: CodeRegistryEntry;
47
+ readonly SKILL_CROSS_SKILL_AUTH_UNDECLARED: CodeRegistryEntry;
48
+ readonly SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE: CodeRegistryEntry;
49
+ readonly PLUGIN_MISSING_DESCRIPTION: CodeRegistryEntry;
50
+ readonly PLUGIN_MISSING_AUTHOR: CodeRegistryEntry;
51
+ readonly PLUGIN_MISSING_LICENSE: CodeRegistryEntry;
52
+ readonly PLUGIN_NAME_NOT_KEBAB_CASE: CodeRegistryEntry;
53
+ readonly SKILL_NAME_NOT_KEBAB_CASE: CodeRegistryEntry;
54
+ readonly SKILL_REFERENCES_BUT_NO_LINKS: CodeRegistryEntry;
55
+ readonly SKILL_BODY_NOT_IMPERATIVE: CodeRegistryEntry;
56
+ readonly CAPABILITY_LOCAL_SHELL: CodeRegistryEntry;
57
+ readonly CAPABILITY_EXTERNAL_CLI: CodeRegistryEntry;
58
+ readonly CAPABILITY_BROWSER_AUTH: CodeRegistryEntry;
59
+ readonly COMPAT_TARGET_INCOMPATIBLE: CodeRegistryEntry;
60
+ readonly COMPAT_TARGET_NEEDS_REVIEW: CodeRegistryEntry;
61
+ readonly COMPAT_TARGET_UNDECLARED: CodeRegistryEntry;
62
+ readonly ALLOW_EXPIRED: CodeRegistryEntry;
63
+ readonly ALLOW_UNUSED: CodeRegistryEntry;
64
+ readonly COMPONENT_DECLARED_BUT_MISSING: CodeRegistryEntry;
65
+ readonly COMPONENT_PRESENT_BUT_UNDECLARED: CodeRegistryEntry;
66
+ readonly REFERENCE_TARGET_MISSING: CodeRegistryEntry;
67
+ readonly MARKETPLACE_PLUGIN_SOURCE_MISSING: CodeRegistryEntry;
68
+ readonly LINK_BROKEN_FILE: CodeRegistryEntry;
69
+ readonly LINK_BROKEN_ANCHOR: CodeRegistryEntry;
70
+ readonly LINK_UNKNOWN: CodeRegistryEntry;
71
+ readonly LINK_TO_GITIGNORED: CodeRegistryEntry;
72
+ readonly MALFORMED_HTML: CodeRegistryEntry;
73
+ readonly FRONTMATTER_MISSING: CodeRegistryEntry;
74
+ readonly FRONTMATTER_INVALID_YAML: CodeRegistryEntry;
75
+ readonly FRONTMATTER_SCHEMA_ERROR: CodeRegistryEntry;
76
+ readonly FRONTMATTER_LINK_BROKEN: CodeRegistryEntry;
77
+ readonly FRONTMATTER_ANCHOR_MISSING: CodeRegistryEntry;
78
+ readonly FRONTMATTER_LINK_TO_GITIGNORED: CodeRegistryEntry;
79
+ readonly FRONTMATTER_UNKNOWN_LINK: CodeRegistryEntry;
80
+ readonly EXTERNAL_URL_DEAD: CodeRegistryEntry;
81
+ readonly EXTERNAL_URL_TIMEOUT: CodeRegistryEntry;
82
+ readonly EXTERNAL_URL_ERROR: CodeRegistryEntry;
83
+ };
84
+ export type IssueCode = keyof typeof CODE_REGISTRY;
85
+ export declare const IssueCodeSchema: z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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")[]]>;
86
+ /** Codes outside the overridable framework — structural reports. */
87
+ export type InfoCode = 'FILE_STRUCTURE_REPORT' | 'RESOURCE_INVENTORY' | 'METADATA_SUMMARY' | 'SKILL_IMPLICIT_REFERENCE' | 'SKILL_UNREFERENCED_FILE';
88
+ /** Codes outside the overridable framework — structural prerequisites / errors that are not subject to severity overrides. */
89
+ 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' | 'FILENAME_COLLISION' | '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';
90
+ //# sourceMappingURL=validation-codes.d.ts.map
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+W4B,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,aAAa,CAAC;AAEnD,eAAO,MAAM,eAAe,45GAE3B,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,GACpB,oBAAoB,GACpB,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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Canonical code registry.
3
+ *
4
+ * Single source of truth for every overridable validation code VAT emits.
5
+ * Describes default severity, human description, fix hint, and a stable
6
+ * reference anchor into docs/validation-codes.md.
7
+ *
8
+ * Renderers (CLI help, skill docs, runtime output) all pull from this
9
+ * registry — no duplication.
10
+ */
11
+ import { z } from 'zod';
12
+ const entry = (defaultSeverity, description, fix, anchor) => ({ defaultSeverity, description, fix, reference: `#${anchor}` });
13
+ export const CODE_REGISTRY = {
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
+ 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
+ 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
+ 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.', 'link_to_gitignored_file'),
18
+ 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
+ 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'),
20
+ 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'),
21
+ 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. Allow via validation.allow if the file is consumed programmatically.', 'packaged_unreferenced_file'),
22
+ PACKAGED_BROKEN_LINK: entry('error', 'Link in the packaged output resolves to a file that is not present in the output (likely a link-rewriter bug).', 'Report the issue — this indicates a VAT bug. As a temporary workaround, set severity.PACKAGED_BROKEN_LINK to ignore while the underlying bug is fixed.', 'packaged_broken_link'),
23
+ 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'),
24
+ 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'),
25
+ 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'),
26
+ SKILL_TOO_MANY_FILES: entry('warning', 'Packaged file count exceeds the recommended limit.', 'Consolidate or restructure references, or allow if the file count is justified.', 'skill_too_many_files'),
27
+ REFERENCE_TOO_DEEP: entry('warning', 'Bundled link graph exceeds the recommended depth; deeply nested references hurt discoverability.', 'Flatten the reference structure or allow if depth is intentional.', 'reference_too_deep'),
28
+ DESCRIPTION_TOO_VAGUE: entry('warning', 'SKILL.md description is too short to reliably trigger the skill.', 'Expand the description with concrete triggers and use cases.', 'description_too_vague'),
29
+ NO_PROGRESSIVE_DISCLOSURE: entry('warning', 'Long SKILL.md with no linked references; progressive disclosure recommended.', 'Move background detail into linked resources and reference them from SKILL.md.', 'no_progressive_disclosure'),
30
+ SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT: entry('warning', 'SKILL.md description exceeds the 250-character Claude Code /skills display limit.', 'Shorten the description below 250 chars (target ≤200 for a safety margin, or ≤130 if shipping a large skill collection).', 'skill_description_over_claude_code_limit'),
31
+ SKILL_DESCRIPTION_FILLER_OPENER: entry('warning', 'SKILL.md description opens with meta-filler (e.g., "This skill...", "A skill that...", "Use when you want to...").', 'Lead with a verb phrase ("Extracts text from PDFs...") or "Use when <concrete trigger>".', 'skill_description_filler_opener'),
32
+ SKILL_DESCRIPTION_WRONG_PERSON: entry('warning', 'SKILL.md description uses first-person or conversational second-person voice.', 'Rewrite in third person. "I can extract PDFs" → "Extracts text from PDFs". "You can use this to..." → the action itself.', 'skill_description_wrong_person'),
33
+ SKILL_CLAUDE_PLUGIN_NAME_MISMATCH: entry('warning', 'plugin.json name does not match the co-located root SKILL.md frontmatter name.', 'Align the names: update plugin.json `name` to match SKILL.md `name` (the skill is authoritative), or intentionally namespace the plugin (configure `validation.severity` or `validation.allow` with a reason).', 'skill_claude_plugin_name_mismatch'),
34
+ SKILL_NAME_MISMATCHES_DIR: entry('warning', 'Frontmatter name field does not match the skill parent directory name.', 'Align them: rename the directory to match name, or update name to match the directory.', 'skill_name_mismatches_dir'),
35
+ RESERVED_WORD_IN_NAME: entry('warning', 'Frontmatter `name` contains a reserved word (`anthropic` or `claude`); Claude Code rejects non-certified skills using these words.', 'Rename the skill to avoid `anthropic` or `claude` in the name.', 'reserved_word_in_name'),
36
+ SKILL_TIME_SENSITIVE_CONTENT: entry('info', 'SKILL.md body contains time-sensitive prose (e.g., "as of November 2025") that may become stale.', 'Remove the time qualifier, or move deprecated guidance into a clearly labeled "## Old patterns" section with a <details> block.', 'skill_time_sensitive_content'),
37
+ 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'),
38
+ 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'),
39
+ 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'),
40
+ 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'),
41
+ 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'),
42
+ 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'),
43
+ 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'),
44
+ 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'),
45
+ 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. Allow via validation.allow if the assets are consumed programmatically.', 'skill_references_but_no_links'),
46
+ 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'),
47
+ 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'),
48
+ 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'),
49
+ CAPABILITY_BROWSER_AUTH: entry('info', 'Skill appears to require an interactive browser login flow.', 'Informational. If a service-principal flow would work, prefer it. Otherwise declare a browser-capable target.', 'capability_browser_auth'),
50
+ COMPAT_TARGET_INCOMPATIBLE: entry('warning', "Skill's declared target runtime definitively lacks a required capability.", 'Narrow the declared target to runtimes that support the capability, or allow with a reason.', 'compat_target_incompatible'),
51
+ COMPAT_TARGET_NEEDS_REVIEW: entry('warning', "Declared target's capability profile covers the axis but a specific resource is uncertain.", 'Document the prerequisite or allow with a reason.', 'compat_target_needs_review'),
52
+ COMPAT_TARGET_UNDECLARED: entry('info', 'Skill has capability observations but no target is declared.', 'Declare targets in vibe-agent-toolkit.config.yaml, plugin.json, or marketplace.json defaults.', 'compat_target_undeclared'),
53
+ ALLOW_EXPIRED: entry('warning', "A validation.allow entry's expires date is in the past; the allowance still applies but should be re-reviewed.", 'Re-review the allow entry: extend expires, remove the entry, or fix the underlying issue. Upgrade severity to error for zero-tolerance expiry.', 'allow_expired'),
54
+ ALLOW_UNUSED: entry('warning', 'A validation.allow entry did not match any emitted issue; the allow entry is dead weight.', 'Remove the entry or fix the pattern. Upgrade severity to error to block on unused allow entries.', 'allow_unused'),
55
+ COMPONENT_DECLARED_BUT_MISSING: entry('warning', 'A component path declared in the plugin manifest does not exist on disk.', 'Add the missing file, remove the manifest declaration, or correct the path. Use validation.allow if the artifact is generated by an install-time build step.', 'component_declared_but_missing'),
56
+ 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'),
57
+ 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'),
58
+ 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'),
59
+ // Resources path — link / frontmatter / external-URL codes
60
+ // Promotions of existing resources-package validator behavior (formerly free-form
61
+ // lowercase `type` strings). Severities are locked by the design spec and reflect
62
+ // existing behavior. LINK_TO_GITIGNORED here is intentionally distinct from the
63
+ // skills-packaging code LINK_TO_GITIGNORED_FILE — both coexist.
64
+ LINK_BROKEN_FILE: entry('error', 'Local file link points to a non-existent file.', 'Fix the path or create the target.', 'link_broken_file'),
65
+ LINK_BROKEN_ANCHOR: entry('error', 'Anchor link points to a non-existent heading/id.', 'Fix the fragment or the target heading.', 'link_broken_anchor'),
66
+ LINK_UNKNOWN: entry('warning', 'Link type could not be classified.', 'Use a recognized link form.', 'link_unknown'),
67
+ LINK_TO_GITIGNORED: entry('error', 'A tracked file links to a gitignored file.', 'Link a tracked target or un-ignore it.', 'link_to_gitignored'),
68
+ 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'),
69
+ FRONTMATTER_MISSING: entry('error', 'Schema requires frontmatter but the file has none.', 'Add the required frontmatter.', 'frontmatter_missing'),
70
+ FRONTMATTER_INVALID_YAML: entry('error', 'Frontmatter YAML failed to parse.', 'Fix the YAML syntax.', 'frontmatter_invalid_yaml'),
71
+ FRONTMATTER_SCHEMA_ERROR: entry('error', 'Frontmatter failed JSON Schema validation.', 'Make the frontmatter conform to the schema.', 'frontmatter_schema_error'),
72
+ FRONTMATTER_LINK_BROKEN: entry('error', 'A frontmatter URI reference points to a non-existent file.', 'Fix the reference path.', 'frontmatter_link_broken'),
73
+ FRONTMATTER_ANCHOR_MISSING: entry('error', 'A frontmatter URI reference points to a missing anchor.', 'Fix the fragment.', 'frontmatter_anchor_missing'),
74
+ FRONTMATTER_LINK_TO_GITIGNORED: entry('error', 'A frontmatter URI reference targets a gitignored file.', 'Reference a tracked target.', 'frontmatter_link_to_gitignored'),
75
+ FRONTMATTER_UNKNOWN_LINK: entry('warning', 'A frontmatter URI reference could not be classified.', 'Use a recognized reference form.', 'frontmatter_unknown_link'),
76
+ EXTERNAL_URL_DEAD: entry('warning', 'External URL returned an error status (4xx/5xx).', 'Fix or remove the link; or set severity: ignore.', 'external_url_dead'),
77
+ EXTERNAL_URL_TIMEOUT: entry('warning', 'External URL request timed out.', 'Retry; raise timeout; or set severity: ignore.', 'external_url_timeout'),
78
+ EXTERNAL_URL_ERROR: entry('warning', 'External URL validation failed (DNS/network).', 'Check the host; or set severity: ignore.', 'external_url_error'),
79
+ };
80
+ export const IssueCodeSchema = z.enum(Object.keys(CODE_REGISTRY));
81
+ //# sourceMappingURL=validation-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-codes.js","sourceRoot":"","sources":["../src/validation-codes.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- export declare const SeverityLevelSchema: z.ZodEnum<["error", "warning", "ignore"]>;
2
+ export declare const SeverityLevelSchema: z.ZodEnum<["error", "warning", "info", "ignore"]>;
3
3
  export type SeverityLevel = z.infer<typeof SeverityLevelSchema>;
4
4
  export declare const AllowEntrySchema: z.ZodObject<{
5
5
  paths: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
@@ -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.ZodString, z.ZodEnum<["error", "warning", "ignore"]>>>;
20
- allow: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
19
+ severity: z.ZodOptional<z.ZodRecord<z.ZodEnum<["LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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")[]]>, 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_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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")[]]>, 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,19 +31,19 @@ export declare const ValidationConfigSchema: z.ZodObject<{
31
31
  expires?: string | undefined;
32
32
  }>, "many">>>;
33
33
  }, "strict", z.ZodTypeAny, {
34
- severity?: Record<string, "error" | "warning" | "ignore"> | undefined;
35
- allow?: Record<string, {
34
+ severity?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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", "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_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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", {
36
36
  paths: string[];
37
37
  reason: string;
38
38
  expires?: string | undefined;
39
- }[]> | undefined;
39
+ }[]>> | undefined;
40
40
  }, {
41
- severity?: Record<string, "error" | "warning" | "ignore"> | undefined;
42
- allow?: Record<string, {
41
+ severity?: Partial<Record<"LINK_OUTSIDE_PROJECT" | "LINK_TARGETS_DIRECTORY" | "LINK_TO_NAVIGATION_FILE" | "LINK_TO_GITIGNORED_FILE" | "LINK_MISSING_TARGET" | "LINK_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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", "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_TO_SKILL_DEFINITION" | "LINK_DROPPED_BY_DEPTH" | "PACKAGED_UNREFERENCED_FILE" | "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" | "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" | "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", {
43
43
  reason: string;
44
44
  paths?: string[] | undefined;
45
45
  expires?: string | undefined;
46
- }[]> | undefined;
46
+ }[]>> | undefined;
47
47
  }>;
48
48
  export type ValidationConfig = z.infer<typeof ValidationConfigSchema>;
49
49
  //# sourceMappingURL=validation-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation-config.d.ts","sourceRoot":"","sources":["../src/validation-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB,2CAAyC,CAAC;AAC1E,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAIlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGxB,CAAC;AACZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
1
+ {"version":3,"file":"validation-config.d.ts","sourceRoot":"","sources":["../src/validation-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB,mDAAiD,CAAC;AAClF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAIlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGxB,CAAC;AACZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -1,12 +1,13 @@
1
1
  import { z } from 'zod';
2
- export const SeverityLevelSchema = z.enum(['error', 'warning', 'ignore']);
2
+ import { IssueCodeSchema } from './validation-codes.js';
3
+ export const SeverityLevelSchema = z.enum(['error', 'warning', 'info', 'ignore']);
3
4
  export const AllowEntrySchema = z.object({
4
5
  paths: z.array(z.string().min(1)).min(1).default(['**/*']),
5
6
  reason: z.string().min(1),
6
7
  expires: z.string().optional(),
7
8
  }).strict();
8
9
  export const ValidationConfigSchema = z.object({
9
- severity: z.record(z.string(), SeverityLevelSchema).optional(),
10
- allow: z.record(z.string(), z.array(AllowEntrySchema)).optional(),
10
+ severity: z.record(IssueCodeSchema, SeverityLevelSchema).optional(),
11
+ allow: z.record(IssueCodeSchema, z.array(AllowEntrySchema)).optional(),
11
12
  }).strict();
12
13
  //# sourceMappingURL=validation-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation-config.js","sourceRoot":"","sources":["../src/validation-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,QAAQ,EAAE;IAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE;CAClE,CAAC,CAAC,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"validation-config.js","sourceRoot":"","sources":["../src/validation-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAGlF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC,QAAQ,EAAE;IACnE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE;CACvE,CAAC,CAAC,MAAM,EAAE,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Unified validation framework.
3
+ *
4
+ * Three composable stages that turn raw validator issues into the final
5
+ * emitted set:
6
+ * - `applyAllowFilter` — suppress issues matched by `validation.allow`
7
+ * entries, tracking expired/unused allowances.
8
+ * - `resolveSeverity` — resolve each registry code's severity against
9
+ * `validation.severity` overrides (falling back to the registry default).
10
+ * - `runValidationFramework` — orchestrates the two above, drops `ignore`d
11
+ * issues, and synthesizes ALLOW_EXPIRED / ALLOW_UNUSED meta-issues.
12
+ *
13
+ * Non-registry codes (InfoCode / NonOverridableCode) deliberately bypass
14
+ * severity resolution and pass through unchanged.
15
+ */
16
+ import { type IssueCode, type IssueSeverity } from './validation-codes.js';
17
+ import type { ValidationConfig } from './validation-config.js';
18
+ import type { ValidationIssue } from './validation-issue.js';
19
+ export type { ValidationConfig } from './validation-config.js';
20
+ export type SeverityConfig = Pick<ValidationConfig, 'severity'>;
21
+ export type AllowConfig = Pick<ValidationConfig, 'allow'>;
22
+ export declare function resolveSeverity(code: IssueCode, config: SeverityConfig): IssueSeverity;
23
+ export interface AllowRecord {
24
+ code: IssueCode;
25
+ location: string;
26
+ reason: string;
27
+ expires?: string | undefined;
28
+ }
29
+ export interface UnusedRecord {
30
+ code: IssueCode;
31
+ paths: string[];
32
+ reason: string;
33
+ expires?: string | undefined;
34
+ }
35
+ export interface ExpiredRecord {
36
+ code: IssueCode;
37
+ reason: string;
38
+ expires: string;
39
+ /** Locations (matched issue paths) this entry is currently suppressing, if any. */
40
+ matchedLocations: string[];
41
+ }
42
+ export interface AllowFilterResult {
43
+ emitted: ValidationIssue[];
44
+ allowed: AllowRecord[];
45
+ expired: ExpiredRecord[];
46
+ unused: UnusedRecord[];
47
+ }
48
+ export declare function applyAllowFilter(issues: readonly ValidationIssue[], config: AllowConfig, now?: Date): AllowFilterResult;
49
+ export interface FrameworkResult {
50
+ /** Issues the consumer should surface (severity resolved; ignores dropped). */
51
+ emitted: ValidationIssue[];
52
+ /** Issues suppressed by an allow entry (for verbose display). */
53
+ allowed: Array<{
54
+ code: IssueCode;
55
+ location: string;
56
+ reason: string;
57
+ expires?: string | undefined;
58
+ }>;
59
+ /** True when any emitted issue has resolved severity 'error'. */
60
+ hasErrors: boolean;
61
+ }
62
+ export declare function runValidationFramework(rawIssues: readonly ValidationIssue[], config: ValidationConfig, now?: Date): FrameworkResult;
63
+ //# sourceMappingURL=validation-framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-framework.d.ts","sourceRoot":"","sources":["../src/validation-framework.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAc,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAM1D,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,aAAa,CAMtF;AAMD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAoED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,MAAM,EAAE,WAAW,EACnB,GAAG,GAAE,IAAiB,GACrB,iBAAiB,CA8BnB;AAMD,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,iEAAiE;IACjE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACpG,iEAAiE;IACjE,SAAS,EAAE,OAAO,CAAC;CACpB;AAoDD,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,eAAe,EAAE,EACrC,MAAM,EAAE,gBAAgB,EACxB,GAAG,GAAE,IAAiB,GACrB,eAAe,CAyBjB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Unified validation framework.
3
+ *
4
+ * Three composable stages that turn raw validator issues into the final
5
+ * emitted set:
6
+ * - `applyAllowFilter` — suppress issues matched by `validation.allow`
7
+ * entries, tracking expired/unused allowances.
8
+ * - `resolveSeverity` — resolve each registry code's severity against
9
+ * `validation.severity` overrides (falling back to the registry default).
10
+ * - `runValidationFramework` — orchestrates the two above, drops `ignore`d
11
+ * issues, and synthesizes ALLOW_EXPIRED / ALLOW_UNUSED meta-issues.
12
+ *
13
+ * Non-registry codes (InfoCode / NonOverridableCode) deliberately bypass
14
+ * severity resolution and pass through unchanged.
15
+ */
16
+ import picomatch from 'picomatch';
17
+ import { CODE_REGISTRY } from './validation-codes.js';
18
+ // ---------------------------------------------------------------------------
19
+ // Severity resolution
20
+ // ---------------------------------------------------------------------------
21
+ export function resolveSeverity(code, config) {
22
+ const override = config.severity?.[code];
23
+ if (override === 'error' || override === 'warning' || override === 'info' || override === 'ignore') {
24
+ return override;
25
+ }
26
+ return CODE_REGISTRY[code].defaultSeverity;
27
+ }
28
+ function isExpired(expires, now) {
29
+ if (!expires)
30
+ return false;
31
+ const parsed = Date.parse(expires);
32
+ return Number.isFinite(parsed) && parsed < now.getTime();
33
+ }
34
+ function buildMatchers(allowByCode) {
35
+ const matchers = new Map();
36
+ for (const [code, entries] of Object.entries(allowByCode)) {
37
+ if (!entries)
38
+ continue;
39
+ // `dot: true` — adopter paths often contain dotfile segments (.claude/,
40
+ // .worktrees/, .config/). Without it `picomatch('**/*')` silently fails
41
+ // to match any path traversing a dotfile dir, so allow entries are
42
+ // never applied. The path was given to us by the validator; we are not
43
+ // doing glob discovery on the filesystem.
44
+ matchers.set(code, entries.map(e => ({ entry: e, match: picomatch(e.paths, { dot: true }), used: false })));
45
+ }
46
+ return matchers;
47
+ }
48
+ function collectExpiredAndUnused(matchers, allowed, now) {
49
+ const expired = [];
50
+ const unused = [];
51
+ for (const [code, list] of matchers) {
52
+ for (const m of list) {
53
+ if (isExpired(m.entry.expires, now)) {
54
+ const matchedLocations = allowed
55
+ .filter(a => a.code === code && a.reason === m.entry.reason)
56
+ .map(a => a.location);
57
+ expired.push({
58
+ code,
59
+ reason: m.entry.reason,
60
+ expires: m.entry.expires,
61
+ matchedLocations,
62
+ });
63
+ }
64
+ if (!m.used) {
65
+ const unusedRecord = {
66
+ code,
67
+ paths: m.entry.paths,
68
+ reason: m.entry.reason,
69
+ };
70
+ if (m.entry.expires !== undefined) {
71
+ unusedRecord.expires = m.entry.expires;
72
+ }
73
+ unused.push(unusedRecord);
74
+ }
75
+ }
76
+ }
77
+ return { expired, unused };
78
+ }
79
+ export function applyAllowFilter(issues, config, now = new Date()) {
80
+ const emitted = [];
81
+ const allowed = [];
82
+ const matchers = buildMatchers(config.allow ?? {});
83
+ for (const issue of issues) {
84
+ const code = issue.code;
85
+ const byCode = matchers.get(code);
86
+ const location = issue.location ?? '';
87
+ const hit = byCode?.find(m => m.match(location));
88
+ if (hit) {
89
+ hit.used = true;
90
+ const record = {
91
+ code,
92
+ location,
93
+ reason: hit.entry.reason,
94
+ };
95
+ if (hit.entry.expires !== undefined) {
96
+ record.expires = hit.entry.expires;
97
+ }
98
+ allowed.push(record);
99
+ }
100
+ else {
101
+ emitted.push(issue);
102
+ }
103
+ }
104
+ const { expired, unused } = collectExpiredAndUnused(matchers, allowed, now);
105
+ return { emitted, allowed, expired, unused };
106
+ }
107
+ function finalize(issue, config) {
108
+ const code = issue.code;
109
+ const entry = CODE_REGISTRY[code];
110
+ if (!entry) {
111
+ // Not a registry code — return as-is (non-overridable / info codes bypass framework).
112
+ return issue;
113
+ }
114
+ const resolved = resolveSeverity(code, config);
115
+ if (resolved === 'ignore')
116
+ return null;
117
+ return { ...issue, severity: resolved, reference: entry.reference };
118
+ }
119
+ function metaIssue(code, message, location) {
120
+ const entry = CODE_REGISTRY[code];
121
+ return {
122
+ severity: entry.defaultSeverity,
123
+ code,
124
+ message,
125
+ location,
126
+ fix: entry.fix,
127
+ reference: entry.reference,
128
+ };
129
+ }
130
+ function emitExpiredMeta(expired, config, emitted) {
131
+ for (const e of expired) {
132
+ const msg = `Allow entry for ${e.code} expired on ${e.expires} (reason: ${e.reason}).`;
133
+ const raw = metaIssue('ALLOW_EXPIRED', msg, `validation.allow.${e.code}`);
134
+ const final = finalize(raw, config);
135
+ if (final)
136
+ emitted.push(final);
137
+ }
138
+ }
139
+ function emitUnusedMeta(unused, config, emitted) {
140
+ for (const u of unused) {
141
+ const msg = `Allow entry for ${u.code} matched no issues (paths: ${u.paths.join(', ')}).`;
142
+ const raw = metaIssue('ALLOW_UNUSED', msg, `validation.allow.${u.code}`);
143
+ const final = finalize(raw, config);
144
+ if (final)
145
+ emitted.push(final);
146
+ }
147
+ }
148
+ export function runValidationFramework(rawIssues, config, now = new Date()) {
149
+ // 1. Allow filter against raw issues (before severity resolution — allow is
150
+ // indifferent to severity).
151
+ const filtered = applyAllowFilter(rawIssues, config, now);
152
+ // 2. Resolve severities and drop ignored issues.
153
+ const emitted = [];
154
+ for (const i of filtered.emitted) {
155
+ const final = finalize(i, config);
156
+ if (final)
157
+ emitted.push(final);
158
+ }
159
+ // 3. Emit ALLOW_EXPIRED for each expired entry (severity from config).
160
+ emitExpiredMeta(filtered.expired, config, emitted);
161
+ // 4. Emit ALLOW_UNUSED for entries that matched nothing.
162
+ emitUnusedMeta(filtered.unused, config, emitted);
163
+ const allowed = filtered.allowed;
164
+ return {
165
+ emitted,
166
+ allowed,
167
+ hasErrors: emitted.some(i => i.severity === 'error'),
168
+ };
169
+ }
170
+ //# sourceMappingURL=validation-framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-framework.js","sourceRoot":"","sources":["../src/validation-framework.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Unified validation issue type.
3
+ *
4
+ * `ValidationIssue` is the single shape every VAT validator emits. Its `code`
5
+ * spans the FULL code space: registry codes (overridable via config), plus
6
+ * `InfoCode` and `NonOverridableCode` (structural reports / prerequisites that
7
+ * bypass the severity-override framework).
8
+ */
9
+ import { z } from 'zod';
10
+ import { type InfoCode, type IssueCode, type IssueSeverity, type NonOverridableCode } from './validation-codes.js';
11
+ /** Full code space: registry codes (overridable) + info codes + structural/non-overridable codes. */
12
+ export type ValidationIssueCode = IssueCode | InfoCode | NonOverridableCode;
13
+ export declare const ValidationIssueSchema: z.ZodObject<{
14
+ code: z.ZodString;
15
+ severity: z.ZodEnum<["error", "warning", "info", "ignore"]>;
16
+ message: z.ZodString;
17
+ location: z.ZodOptional<z.ZodString>;
18
+ line: z.ZodOptional<z.ZodNumber>;
19
+ link: z.ZodOptional<z.ZodString>;
20
+ fix: z.ZodOptional<z.ZodString>;
21
+ reference: z.ZodOptional<z.ZodString>;
22
+ suggestion: z.ZodOptional<z.ZodString>;
23
+ }, "strict", z.ZodTypeAny, {
24
+ code: string;
25
+ message: string;
26
+ severity: "error" | "warning" | "info" | "ignore";
27
+ location?: string | undefined;
28
+ line?: number | undefined;
29
+ link?: string | undefined;
30
+ fix?: string | undefined;
31
+ reference?: string | undefined;
32
+ suggestion?: string | undefined;
33
+ }, {
34
+ code: string;
35
+ message: string;
36
+ severity: "error" | "warning" | "info" | "ignore";
37
+ location?: string | undefined;
38
+ line?: number | undefined;
39
+ link?: string | undefined;
40
+ fix?: string | undefined;
41
+ reference?: string | undefined;
42
+ suggestion?: string | undefined;
43
+ }>;
44
+ export interface ValidationIssue {
45
+ code: ValidationIssueCode;
46
+ severity: IssueSeverity;
47
+ message: string;
48
+ location?: string;
49
+ line?: number;
50
+ link?: string;
51
+ fix?: string;
52
+ reference?: string;
53
+ suggestion?: string;
54
+ }
55
+ /** Build an issue from the registry, filling severity/fix/reference from the code entry. */
56
+ export declare function createRegistryIssue(code: IssueCode, message: string, extras?: Partial<Pick<ValidationIssue, 'location' | 'line' | 'link' | 'suggestion'>>): ValidationIssue;
57
+ //# sourceMappingURL=validation-issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-issue.d.ts","sourceRoot":"","sources":["../src/validation-issue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,qGAAqG;AACrG,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAE5E,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAC;AAKZ,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC,CAAM,GACvF,eAAe,CAGjB"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Unified validation issue type.
3
+ *
4
+ * `ValidationIssue` is the single shape every VAT validator emits. Its `code`
5
+ * spans the FULL code space: registry codes (overridable via config), plus
6
+ * `InfoCode` and `NonOverridableCode` (structural reports / prerequisites that
7
+ * bypass the severity-override framework).
8
+ */
9
+ import { z } from 'zod';
10
+ import { CODE_REGISTRY, } from './validation-codes.js';
11
+ export const ValidationIssueSchema = z.object({
12
+ code: z.string(), // full code space; narrowed in the TS type below
13
+ severity: z.enum(['error', 'warning', 'info', 'ignore']),
14
+ message: z.string(),
15
+ location: z.string().optional(),
16
+ line: z.number().int().positive().optional(),
17
+ link: z.string().optional(),
18
+ fix: z.string().optional(),
19
+ reference: z.string().optional(),
20
+ suggestion: z.string().optional(),
21
+ }).strict();
22
+ /** Build an issue from the registry, filling severity/fix/reference from the code entry. */
23
+ export function createRegistryIssue(code, message, extras = {}) {
24
+ const e = CODE_REGISTRY[code];
25
+ return { code, severity: e.defaultSeverity, message, fix: e.fix, reference: e.reference, ...extras };
26
+ }
27
+ //# sourceMappingURL=validation-issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-issue.js","sourceRoot":"","sources":["../src/validation-issue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,aAAa,GAKd,MAAM,uBAAuB,CAAC;AAK/B,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAmC,iDAAiD;IACpG,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC,MAAM,EAAE,CAAC;AAiBZ,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CACjC,IAAe,EACf,OAAe,EACf,SAAsF,EAAE;IAExF,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,eAAe,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC;AACvG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibe-agent-toolkit/agent-schema",
3
- "version": "0.1.38",
3
+ "version": "0.1.39-rc.2",
4
4
  "description": "JSON Schema definitions and TypeScript types for VAT agent manifest format",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -33,11 +33,13 @@
33
33
  "validation"
34
34
  ],
35
35
  "dependencies": {
36
+ "picomatch": "^4.0.3",
36
37
  "zod": "^3.23.8",
37
38
  "zod-to-json-schema": "^3.23.5"
38
39
  },
39
40
  "devDependencies": {
40
- "@vibe-agent-toolkit/utils": "0.1.38",
41
+ "@types/picomatch": "^4.0.2",
42
+ "@vibe-agent-toolkit/utils": "0.1.39-rc.2",
41
43
  "tsx": "^4.21.0",
42
44
  "typescript": "^5.9.3",
43
45
  "vitest": "^3.2.4"
@@ -0,0 +1,185 @@
1
+ {
2
+ "$ref": "#/definitions/validation-config",
3
+ "definitions": {
4
+ "validation-config": {
5
+ "type": "object",
6
+ "properties": {
7
+ "severity": {
8
+ "type": "object",
9
+ "additionalProperties": {
10
+ "type": "string",
11
+ "enum": [
12
+ "error",
13
+ "warning",
14
+ "info",
15
+ "ignore"
16
+ ]
17
+ },
18
+ "propertyNames": {
19
+ "enum": [
20
+ "LINK_OUTSIDE_PROJECT",
21
+ "LINK_TARGETS_DIRECTORY",
22
+ "LINK_TO_NAVIGATION_FILE",
23
+ "LINK_TO_GITIGNORED_FILE",
24
+ "LINK_MISSING_TARGET",
25
+ "LINK_TO_SKILL_DEFINITION",
26
+ "LINK_DROPPED_BY_DEPTH",
27
+ "PACKAGED_UNREFERENCED_FILE",
28
+ "PACKAGED_BROKEN_LINK",
29
+ "DUPLICATE_RESOURCE_ID",
30
+ "SKILL_LENGTH_EXCEEDS_RECOMMENDED",
31
+ "SKILL_TOTAL_SIZE_LARGE",
32
+ "SKILL_TOO_MANY_FILES",
33
+ "REFERENCE_TOO_DEEP",
34
+ "DESCRIPTION_TOO_VAGUE",
35
+ "NO_PROGRESSIVE_DISCLOSURE",
36
+ "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT",
37
+ "SKILL_DESCRIPTION_FILLER_OPENER",
38
+ "SKILL_DESCRIPTION_WRONG_PERSON",
39
+ "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH",
40
+ "SKILL_NAME_MISMATCHES_DIR",
41
+ "RESERVED_WORD_IN_NAME",
42
+ "SKILL_TIME_SENSITIVE_CONTENT",
43
+ "SKILL_FRONTMATTER_EXTRA_FIELDS",
44
+ "SKILL_CROSS_SKILL_AUTH_UNDECLARED",
45
+ "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE",
46
+ "PLUGIN_MISSING_DESCRIPTION",
47
+ "PLUGIN_MISSING_AUTHOR",
48
+ "PLUGIN_MISSING_LICENSE",
49
+ "PLUGIN_NAME_NOT_KEBAB_CASE",
50
+ "SKILL_NAME_NOT_KEBAB_CASE",
51
+ "SKILL_REFERENCES_BUT_NO_LINKS",
52
+ "SKILL_BODY_NOT_IMPERATIVE",
53
+ "CAPABILITY_LOCAL_SHELL",
54
+ "CAPABILITY_EXTERNAL_CLI",
55
+ "CAPABILITY_BROWSER_AUTH",
56
+ "COMPAT_TARGET_INCOMPATIBLE",
57
+ "COMPAT_TARGET_NEEDS_REVIEW",
58
+ "COMPAT_TARGET_UNDECLARED",
59
+ "ALLOW_EXPIRED",
60
+ "ALLOW_UNUSED",
61
+ "COMPONENT_DECLARED_BUT_MISSING",
62
+ "COMPONENT_PRESENT_BUT_UNDECLARED",
63
+ "REFERENCE_TARGET_MISSING",
64
+ "MARKETPLACE_PLUGIN_SOURCE_MISSING",
65
+ "LINK_BROKEN_FILE",
66
+ "LINK_BROKEN_ANCHOR",
67
+ "LINK_UNKNOWN",
68
+ "LINK_TO_GITIGNORED",
69
+ "MALFORMED_HTML",
70
+ "FRONTMATTER_MISSING",
71
+ "FRONTMATTER_INVALID_YAML",
72
+ "FRONTMATTER_SCHEMA_ERROR",
73
+ "FRONTMATTER_LINK_BROKEN",
74
+ "FRONTMATTER_ANCHOR_MISSING",
75
+ "FRONTMATTER_LINK_TO_GITIGNORED",
76
+ "FRONTMATTER_UNKNOWN_LINK",
77
+ "EXTERNAL_URL_DEAD",
78
+ "EXTERNAL_URL_TIMEOUT",
79
+ "EXTERNAL_URL_ERROR"
80
+ ]
81
+ }
82
+ },
83
+ "allow": {
84
+ "type": "object",
85
+ "additionalProperties": {
86
+ "type": "array",
87
+ "items": {
88
+ "type": "object",
89
+ "properties": {
90
+ "paths": {
91
+ "type": "array",
92
+ "items": {
93
+ "type": "string",
94
+ "minLength": 1
95
+ },
96
+ "minItems": 1,
97
+ "default": [
98
+ "**/*"
99
+ ]
100
+ },
101
+ "reason": {
102
+ "type": "string",
103
+ "minLength": 1
104
+ },
105
+ "expires": {
106
+ "type": "string"
107
+ }
108
+ },
109
+ "required": [
110
+ "reason"
111
+ ],
112
+ "additionalProperties": false
113
+ }
114
+ },
115
+ "propertyNames": {
116
+ "enum": [
117
+ "LINK_OUTSIDE_PROJECT",
118
+ "LINK_TARGETS_DIRECTORY",
119
+ "LINK_TO_NAVIGATION_FILE",
120
+ "LINK_TO_GITIGNORED_FILE",
121
+ "LINK_MISSING_TARGET",
122
+ "LINK_TO_SKILL_DEFINITION",
123
+ "LINK_DROPPED_BY_DEPTH",
124
+ "PACKAGED_UNREFERENCED_FILE",
125
+ "PACKAGED_BROKEN_LINK",
126
+ "DUPLICATE_RESOURCE_ID",
127
+ "SKILL_LENGTH_EXCEEDS_RECOMMENDED",
128
+ "SKILL_TOTAL_SIZE_LARGE",
129
+ "SKILL_TOO_MANY_FILES",
130
+ "REFERENCE_TOO_DEEP",
131
+ "DESCRIPTION_TOO_VAGUE",
132
+ "NO_PROGRESSIVE_DISCLOSURE",
133
+ "SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT",
134
+ "SKILL_DESCRIPTION_FILLER_OPENER",
135
+ "SKILL_DESCRIPTION_WRONG_PERSON",
136
+ "SKILL_CLAUDE_PLUGIN_NAME_MISMATCH",
137
+ "SKILL_NAME_MISMATCHES_DIR",
138
+ "RESERVED_WORD_IN_NAME",
139
+ "SKILL_TIME_SENSITIVE_CONTENT",
140
+ "SKILL_FRONTMATTER_EXTRA_FIELDS",
141
+ "SKILL_CROSS_SKILL_AUTH_UNDECLARED",
142
+ "SKILL_DESCRIPTION_STYLE_MIXED_IN_PACKAGE",
143
+ "PLUGIN_MISSING_DESCRIPTION",
144
+ "PLUGIN_MISSING_AUTHOR",
145
+ "PLUGIN_MISSING_LICENSE",
146
+ "PLUGIN_NAME_NOT_KEBAB_CASE",
147
+ "SKILL_NAME_NOT_KEBAB_CASE",
148
+ "SKILL_REFERENCES_BUT_NO_LINKS",
149
+ "SKILL_BODY_NOT_IMPERATIVE",
150
+ "CAPABILITY_LOCAL_SHELL",
151
+ "CAPABILITY_EXTERNAL_CLI",
152
+ "CAPABILITY_BROWSER_AUTH",
153
+ "COMPAT_TARGET_INCOMPATIBLE",
154
+ "COMPAT_TARGET_NEEDS_REVIEW",
155
+ "COMPAT_TARGET_UNDECLARED",
156
+ "ALLOW_EXPIRED",
157
+ "ALLOW_UNUSED",
158
+ "COMPONENT_DECLARED_BUT_MISSING",
159
+ "COMPONENT_PRESENT_BUT_UNDECLARED",
160
+ "REFERENCE_TARGET_MISSING",
161
+ "MARKETPLACE_PLUGIN_SOURCE_MISSING",
162
+ "LINK_BROKEN_FILE",
163
+ "LINK_BROKEN_ANCHOR",
164
+ "LINK_UNKNOWN",
165
+ "LINK_TO_GITIGNORED",
166
+ "MALFORMED_HTML",
167
+ "FRONTMATTER_MISSING",
168
+ "FRONTMATTER_INVALID_YAML",
169
+ "FRONTMATTER_SCHEMA_ERROR",
170
+ "FRONTMATTER_LINK_BROKEN",
171
+ "FRONTMATTER_ANCHOR_MISSING",
172
+ "FRONTMATTER_LINK_TO_GITIGNORED",
173
+ "FRONTMATTER_UNKNOWN_LINK",
174
+ "EXTERNAL_URL_DEAD",
175
+ "EXTERNAL_URL_TIMEOUT",
176
+ "EXTERNAL_URL_ERROR"
177
+ ]
178
+ }
179
+ }
180
+ },
181
+ "additionalProperties": false
182
+ }
183
+ },
184
+ "$schema": "http://json-schema.org/draft-07/schema#"
185
+ }