@vibe-agent-toolkit/agent-skills 0.1.33 → 0.1.34

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.
Files changed (90) hide show
  1. package/dist/index.d.ts +9 -6
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/inventory/detectors/declared-but-missing.d.ts +11 -0
  6. package/dist/inventory/detectors/declared-but-missing.d.ts.map +1 -0
  7. package/dist/inventory/detectors/declared-but-missing.js +37 -0
  8. package/dist/inventory/detectors/declared-but-missing.js.map +1 -0
  9. package/dist/inventory/detectors/index.d.ts +5 -0
  10. package/dist/inventory/detectors/index.d.ts.map +1 -0
  11. package/dist/inventory/detectors/index.js +5 -0
  12. package/dist/inventory/detectors/index.js.map +1 -0
  13. package/dist/inventory/detectors/marketplace-source-missing.d.ts +12 -0
  14. package/dist/inventory/detectors/marketplace-source-missing.d.ts.map +1 -0
  15. package/dist/inventory/detectors/marketplace-source-missing.js +20 -0
  16. package/dist/inventory/detectors/marketplace-source-missing.js.map +1 -0
  17. package/dist/inventory/detectors/present-but-undeclared.d.ts +13 -0
  18. package/dist/inventory/detectors/present-but-undeclared.d.ts.map +1 -0
  19. package/dist/inventory/detectors/present-but-undeclared.js +47 -0
  20. package/dist/inventory/detectors/present-but-undeclared.js.map +1 -0
  21. package/dist/inventory/detectors/reference-target-missing.d.ts +11 -0
  22. package/dist/inventory/detectors/reference-target-missing.d.ts.map +1 -0
  23. package/dist/inventory/detectors/reference-target-missing.js +19 -0
  24. package/dist/inventory/detectors/reference-target-missing.js.map +1 -0
  25. package/dist/inventory/index.d.ts +5 -0
  26. package/dist/inventory/index.d.ts.map +1 -0
  27. package/dist/inventory/index.js +4 -0
  28. package/dist/inventory/index.js.map +1 -0
  29. package/dist/inventory/serialize.d.ts +24 -0
  30. package/dist/inventory/serialize.d.ts.map +1 -0
  31. package/dist/inventory/serialize.js +52 -0
  32. package/dist/inventory/serialize.js.map +1 -0
  33. package/dist/inventory/types.d.ts +126 -0
  34. package/dist/inventory/types.d.ts.map +1 -0
  35. package/dist/inventory/types.js +16 -0
  36. package/dist/inventory/types.js.map +1 -0
  37. package/dist/schemas/index.d.ts +0 -1
  38. package/dist/schemas/index.d.ts.map +1 -1
  39. package/dist/schemas/index.js +0 -1
  40. package/dist/schemas/index.js.map +1 -1
  41. package/dist/validators/bundled-resource-link-detection.d.ts +20 -0
  42. package/dist/validators/bundled-resource-link-detection.d.ts.map +1 -0
  43. package/dist/validators/bundled-resource-link-detection.js +92 -0
  44. package/dist/validators/bundled-resource-link-detection.js.map +1 -0
  45. package/dist/validators/code-registry.d.ts +1 -1
  46. package/dist/validators/code-registry.d.ts.map +1 -1
  47. package/dist/validators/code-registry.js +12 -0
  48. package/dist/validators/code-registry.js.map +1 -1
  49. package/dist/validators/format-detection.d.ts +21 -1
  50. package/dist/validators/format-detection.d.ts.map +1 -1
  51. package/dist/validators/format-detection.js +85 -1
  52. package/dist/validators/format-detection.js.map +1 -1
  53. package/dist/validators/imperative-body-detection.d.ts +15 -0
  54. package/dist/validators/imperative-body-detection.d.ts.map +1 -0
  55. package/dist/validators/imperative-body-detection.js +49 -0
  56. package/dist/validators/imperative-body-detection.js.map +1 -0
  57. package/dist/validators/index.d.ts +6 -4
  58. package/dist/validators/index.d.ts.map +1 -1
  59. package/dist/validators/index.js +4 -2
  60. package/dist/validators/index.js.map +1 -1
  61. package/dist/validators/kebab-case-detection.d.ts +22 -0
  62. package/dist/validators/kebab-case-detection.d.ts.map +1 -0
  63. package/dist/validators/kebab-case-detection.js +43 -0
  64. package/dist/validators/kebab-case-detection.js.map +1 -0
  65. package/dist/validators/packaging-validator.d.ts +9 -0
  66. package/dist/validators/packaging-validator.d.ts.map +1 -1
  67. package/dist/validators/packaging-validator.js +4 -1
  68. package/dist/validators/packaging-validator.js.map +1 -1
  69. package/dist/validators/plugin-recommended-fields.d.ts +26 -0
  70. package/dist/validators/plugin-recommended-fields.d.ts.map +1 -0
  71. package/dist/validators/plugin-recommended-fields.js +66 -0
  72. package/dist/validators/plugin-recommended-fields.js.map +1 -0
  73. package/dist/validators/skill-validator.d.ts.map +1 -1
  74. package/dist/validators/skill-validator.js +20 -4
  75. package/dist/validators/skill-validator.js.map +1 -1
  76. package/dist/validators/types.d.ts +23 -0
  77. package/dist/validators/types.d.ts.map +1 -1
  78. package/dist/validators/unified-validator.d.ts +9 -4
  79. package/dist/validators/unified-validator.d.ts.map +1 -1
  80. package/dist/validators/unified-validator.js +19 -6
  81. package/dist/validators/unified-validator.js.map +1 -1
  82. package/package.json +5 -5
  83. package/dist/schemas/claude-plugin.d.ts +0 -98
  84. package/dist/schemas/claude-plugin.d.ts.map +0 -1
  85. package/dist/schemas/claude-plugin.js +0 -79
  86. package/dist/schemas/claude-plugin.js.map +0 -1
  87. package/dist/validators/plugin-validator.d.ts +0 -12
  88. package/dist/validators/plugin-validator.d.ts.map +0 -1
  89. package/dist/validators/plugin-validator.js +0 -99
  90. package/dist/validators/plugin-validator.js.map +0 -1
@@ -1,79 +0,0 @@
1
- import { z } from 'zod';
2
- import { zodToJsonSchema } from 'zod-to-json-schema';
3
- /**
4
- * Schema for .claude-plugin/plugin.json manifest
5
- * Based on official Claude Code documentation
6
- * @see https://code.claude.com/docs/en/plugins-reference
7
- */
8
- /**
9
- * Component path schemas per official Claude Code plugin spec.
10
- * @see https://code.claude.com/docs/en/plugins-reference#component-path-fields
11
- *
12
- * Path-only fields (commands, agents, skills, outputStyles): string | string[]
13
- * Config-capable fields (hooks, mcpServers, lspServers): string | string[] | object
14
- */
15
- const ComponentPathsSchema = z.union([
16
- z.string(),
17
- z.array(z.string()),
18
- ]);
19
- const ComponentPathsOrConfigSchema = z.union([
20
- z.string(),
21
- z.array(z.string()),
22
- z.record(z.unknown()),
23
- ]);
24
- export const ClaudePluginSchema = z
25
- .object({
26
- name: z
27
- .string()
28
- .min(1, 'Plugin name is required')
29
- .max(64, 'Plugin name must be 64 characters or less')
30
- .regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, // eslint-disable-line security/detect-unsafe-regex -- Simple pattern with bounded length, safe from ReDoS
31
- 'Plugin name must be lowercase alphanumeric with hyphens')
32
- .describe('Unique plugin identifier (required if manifest exists)'),
33
- version: z
34
- .string()
35
- .regex(/^\d+\.\d+\.\d+(-[\w.]+)?$/, // eslint-disable-line security/detect-unsafe-regex -- Simple semver pattern, bounded, safe from ReDoS
36
- 'Version must follow semver format (e.g., 1.0.0 or 1.0.0-rc.1)')
37
- .optional()
38
- .describe('Semantic version with optional pre-release suffix'),
39
- description: z
40
- .string()
41
- .min(1)
42
- .max(1024, 'Description must be 1024 characters or less')
43
- .optional()
44
- .describe('Human-readable description of plugin functionality (optional)'),
45
- author: z
46
- .object({
47
- name: z.string().optional(),
48
- email: z.string().email().optional(),
49
- url: z.string().url().optional(),
50
- })
51
- .optional()
52
- .describe('Plugin author information'),
53
- homepage: z.string().url().optional().describe('Plugin homepage URL'),
54
- repository: z.string().url().optional().describe('Source repository URL'),
55
- license: z.string().optional().describe('License identifier (e.g., MIT)'),
56
- keywords: z
57
- .array(z.string())
58
- .optional()
59
- .describe('Search keywords for plugin discovery'),
60
- // Component paths (all optional) — per official spec, string | string[] or string | string[] | object
61
- commands: ComponentPathsSchema.optional().describe('Command files or directories'),
62
- skills: ComponentPathsSchema.optional().describe('Skill directories'),
63
- agents: ComponentPathsSchema.optional().describe('Agent files or directories'),
64
- hooks: ComponentPathsOrConfigSchema.optional().describe('Hook config path(s) or inline config'),
65
- mcpServers: ComponentPathsOrConfigSchema.optional().describe('MCP server config path(s) or inline config'),
66
- outputStyles: ComponentPathsSchema.optional().describe('Output style files or directories'),
67
- lspServers: ComponentPathsOrConfigSchema.optional().describe('LSP server config path(s) or inline config'),
68
- })
69
- .passthrough() // Accept unknown fields — official spec evolves
70
- .describe('Claude Code plugin manifest structure');
71
- /**
72
- * JSON Schema representation of ClaudePluginSchema
73
- * For external tools and documentation
74
- */
75
- export const ClaudePluginJsonSchema = zodToJsonSchema(ClaudePluginSchema, {
76
- name: 'ClaudePluginManifest',
77
- $refStrategy: 'none',
78
- });
79
- //# sourceMappingURL=claude-plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-plugin.js","sourceRoot":"","sources":["../../src/schemas/claude-plugin.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { ValidationResult } from './types.js';
2
- /**
3
- * Validate a plugin directory structure against the ClaudePluginSchema.
4
- *
5
- * @see https://code.claude.com/docs/en/plugins-reference — Official plugin manifest spec
6
- * @param pluginPath - Absolute path to plugin directory
7
- * @returns Validation result with issues
8
- */
9
- export declare function validatePlugin(pluginPath: string, options?: {
10
- strict?: boolean;
11
- }): Promise<ValidationResult>;
12
- //# sourceMappingURL=plugin-validator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-validator.d.ts","sourceRoot":"","sources":["../../src/validators/plugin-validator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQpE;;;;;;GAMG;AACH,wBAAsB,cAAc,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA8F3B"}
@@ -1,99 +0,0 @@
1
- /* eslint-disable security/detect-non-literal-fs-filename -- File paths are validated before use */
2
- import { existsSync, readFileSync } from 'node:fs';
3
- import { safePath } from '@vibe-agent-toolkit/utils';
4
- import { ClaudePluginSchema } from '../schemas/claude-plugin.js';
5
- import { calculateValidationStatus, generateFixSuggestion, } from './validation-utils.js';
6
- const PLUGIN_TYPE = 'claude-plugin';
7
- /**
8
- * Validate a plugin directory structure against the ClaudePluginSchema.
9
- *
10
- * @see https://code.claude.com/docs/en/plugins-reference — Official plugin manifest spec
11
- * @param pluginPath - Absolute path to plugin directory
12
- * @returns Validation result with issues
13
- */
14
- export async function validatePlugin(pluginPath, options) {
15
- const issues = [];
16
- const pluginJsonPath = safePath.join(pluginPath, '.claude-plugin', 'plugin.json');
17
- // Check plugin.json exists
18
- if (!existsSync(pluginJsonPath)) {
19
- issues.push({
20
- severity: 'error',
21
- code: 'PLUGIN_MISSING_MANIFEST',
22
- message: 'Plugin manifest not found',
23
- location: `${pluginPath}/.claude-plugin/plugin.json`,
24
- fix: 'Create .claude-plugin/plugin.json with required fields (name, description, version)',
25
- });
26
- return {
27
- path: pluginPath,
28
- type: PLUGIN_TYPE,
29
- status: 'error',
30
- summary: 'Plugin manifest missing',
31
- issues,
32
- };
33
- }
34
- // Parse and validate plugin.json
35
- let pluginData;
36
- try {
37
- const content = readFileSync(pluginJsonPath, 'utf-8');
38
- pluginData = JSON.parse(content);
39
- }
40
- catch (error) {
41
- issues.push({
42
- severity: 'error',
43
- code: 'PLUGIN_INVALID_JSON',
44
- message: `Failed to parse plugin.json: ${error instanceof Error ? error.message : 'Unknown error'}`,
45
- location: pluginJsonPath,
46
- fix: 'Fix JSON syntax errors in plugin.json',
47
- });
48
- return {
49
- path: pluginPath,
50
- type: PLUGIN_TYPE,
51
- status: 'error',
52
- summary: 'Plugin manifest is invalid JSON',
53
- issues,
54
- };
55
- }
56
- // Validate against schema
57
- const result = ClaudePluginSchema.safeParse(pluginData);
58
- if (!result.success) {
59
- for (const zodIssue of result.error.issues) {
60
- issues.push({
61
- severity: 'error',
62
- code: 'PLUGIN_INVALID_SCHEMA',
63
- message: zodIssue.message,
64
- location: `${pluginJsonPath}:${zodIssue.path.join('.')}`,
65
- fix: generateFixSuggestion(zodIssue),
66
- });
67
- }
68
- }
69
- const status = calculateValidationStatus(issues);
70
- const validationResult = {
71
- path: pluginPath,
72
- type: PLUGIN_TYPE,
73
- status,
74
- summary: status === 'success' ? 'Valid plugin' : `Found ${issues.length} issue(s)`,
75
- issues,
76
- };
77
- if (result.success) {
78
- validationResult.metadata = {
79
- name: result.data.name,
80
- ...(result.data.version !== undefined && { version: result.data.version }),
81
- };
82
- // Warn when version is missing — Claude Code caches plugins by version,
83
- // and without it the cache directory becomes "unknown/", causing stale
84
- // skill resolution across upgrades.
85
- if (result.data.version === undefined) {
86
- issues.push({
87
- severity: options?.strict ? 'error' : 'warning',
88
- code: 'PLUGIN_MISSING_VERSION',
89
- message: 'plugin.json missing version field — Claude Code will cache as "unknown/", causing stale skill resolution across upgrades',
90
- location: pluginJsonPath,
91
- fix: 'Add a "version" field to plugin.json (semver format, e.g. "1.0.0")',
92
- });
93
- validationResult.status = calculateValidationStatus(issues);
94
- validationResult.summary = `Found ${issues.length} issue(s)`;
95
- }
96
- }
97
- return validationResult;
98
- }
99
- //# sourceMappingURL=plugin-validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-validator.js","sourceRoot":"","sources":["../../src/validators/plugin-validator.ts"],"names":[],"mappings":"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"}