@vibe-agent-toolkit/claude-marketplace 0.1.34-rc.2 → 0.1.35

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 (49) hide show
  1. package/dist/index.d.ts +9 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +12 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/inventory/detectors/index.d.ts +2 -0
  6. package/dist/inventory/detectors/index.d.ts.map +1 -0
  7. package/dist/inventory/detectors/index.js +2 -0
  8. package/dist/inventory/detectors/index.js.map +1 -0
  9. package/dist/inventory/detectors/skill-claude-plugin-name-mismatch.d.ts +18 -0
  10. package/dist/inventory/detectors/skill-claude-plugin-name-mismatch.d.ts.map +1 -0
  11. package/dist/inventory/detectors/skill-claude-plugin-name-mismatch.js +37 -0
  12. package/dist/inventory/detectors/skill-claude-plugin-name-mismatch.js.map +1 -0
  13. package/dist/inventory/extract-install.d.ts +14 -0
  14. package/dist/inventory/extract-install.d.ts.map +1 -0
  15. package/dist/inventory/extract-install.js +111 -0
  16. package/dist/inventory/extract-install.js.map +1 -0
  17. package/dist/inventory/extract-marketplace.d.ts +11 -0
  18. package/dist/inventory/extract-marketplace.d.ts.map +1 -0
  19. package/dist/inventory/extract-marketplace.js +139 -0
  20. package/dist/inventory/extract-marketplace.js.map +1 -0
  21. package/dist/inventory/extract-plugin.d.ts +7 -0
  22. package/dist/inventory/extract-plugin.d.ts.map +1 -0
  23. package/dist/inventory/extract-plugin.js +306 -0
  24. package/dist/inventory/extract-plugin.js.map +1 -0
  25. package/dist/inventory/extract-skill.d.ts +10 -0
  26. package/dist/inventory/extract-skill.d.ts.map +1 -0
  27. package/dist/inventory/extract-skill.js +91 -0
  28. package/dist/inventory/extract-skill.js.map +1 -0
  29. package/dist/inventory/index.d.ts +7 -0
  30. package/dist/inventory/index.d.ts.map +1 -0
  31. package/dist/inventory/index.js +7 -0
  32. package/dist/inventory/index.js.map +1 -0
  33. package/dist/inventory/types.d.ts +65 -0
  34. package/dist/inventory/types.d.ts.map +1 -0
  35. package/dist/inventory/types.js +70 -0
  36. package/dist/inventory/types.js.map +1 -0
  37. package/dist/paths/claude-paths.d.ts +5 -0
  38. package/dist/paths/claude-paths.d.ts.map +1 -1
  39. package/dist/paths/claude-paths.js +20 -12
  40. package/dist/paths/claude-paths.js.map +1 -1
  41. package/dist/schemas/claude-plugin.d.ts +98 -0
  42. package/dist/schemas/claude-plugin.d.ts.map +1 -0
  43. package/dist/schemas/claude-plugin.js +79 -0
  44. package/dist/schemas/claude-plugin.js.map +1 -0
  45. package/dist/validators/plugin-validator.d.ts +12 -0
  46. package/dist/validators/plugin-validator.d.ts.map +1 -0
  47. package/dist/validators/plugin-validator.js +131 -0
  48. package/dist/validators/plugin-validator.js.map +1 -0
  49. package/package.json +6 -4
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export { readMarketplaceDefaultTargets, resolveEffectiveTargets, } from './marke
9
9
  export { computeVerdicts } from './verdict-engine.js';
10
10
  export type { Verdict, VerdictCode, VerdictInput } from './verdict-engine.js';
11
11
  export type { ClaudeProjectPaths, ClaudeUserPaths } from './paths/claude-paths.js';
12
- export { getClaudeProjectPaths, getClaudeUserPaths, } from './paths/claude-paths.js';
12
+ export { buildClaudeUserPaths, getClaudeProjectPaths, getClaudeUserPaths, } from './paths/claude-paths.js';
13
13
  export { getManagedSettingsCandidatePaths, WINDOWS_LEGACY_MANAGED_SETTINGS_PATH, } from './paths/managed-settings-path.js';
14
14
  export type { ClaudeAuthConfig, ClaudeModelConfig, HooksConfig, ManagedSettings, McpServerPolicy, PermissionsConfig, ProjectSettings, SandboxConfig, SandboxFilesystem, SandboxNetwork, UserSettings, } from './schemas/index.js';
15
15
  export { ClaudeAuthConfigSchema, ClaudeModelConfigSchema, HooksConfigSchema, ManagedSettingsSchema, MarketplaceSourceSchema, McpServerPolicySchema, PermissionsConfigSchema, ProjectSettingsSchema, SandboxConfigSchema, SandboxFilesystemSchema, SandboxNetworkSchema, UserSettingsSchema, } from './schemas/index.js';
@@ -23,4 +23,12 @@ export type { OrgApiClientOptions, PaginationParams, ReportPaginationParams, Mul
23
23
  export { createOrgApiClientFromEnv, OrgApiClient, buildMultipartFormData } from './org/org-api-client.js';
24
24
  export type { BashRuleType, EffectivePermissions, EffectiveSettings, ParsedBashRule, ProvenanceRule, ProvenanceValue, ReadSettingsOptions, RuleConflict, RuleConflictKind, SettingProvenance, SettingsAuditResult, SettingsLayer, SettingsLevel, SettingsPathEntry, SettingsPathsResult, SettingsValidateResult, } from './settings/index.js';
25
25
  export { analyzeRuleConflicts, auditSettings, checkSettingsCompatibility, getSettingsFileFields, getSettingsPaths, isSubsumedBy, matchesBashRule, matchesPathRule, matchesPermissionRule, mergeSettingsLayers, readEffectiveSettings, readSettingsLayers, resolveSettingsPaths, validateSettingsFile, } from './settings/index.js';
26
+ export { ClaudePluginJsonSchema, ClaudePluginSchema, type ClaudePlugin, } from './schemas/claude-plugin.js';
27
+ export { validatePlugin } from './validators/plugin-validator.js';
28
+ export { ClaudeInstallInventory, ClaudeMarketplaceInventory, ClaudePluginInventory, ClaudeSkillInventory, } from './inventory/index.js';
29
+ export { extractClaudeSkillInventory } from './inventory/index.js';
30
+ export { extractClaudePluginInventory } from './inventory/index.js';
31
+ export { extractClaudeMarketplaceInventory } from './inventory/index.js';
32
+ export { extractClaudeInstallInventory } from './inventory/index.js';
33
+ export { detectSkillClaudePluginNameMismatch } from './inventory/index.js';
26
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,GACP,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAG/E,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAG9E,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,kCAAkC,CAAC;AAG1C,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGtF,YAAY,EACV,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC7I,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAG1G,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,0BAA0B,EAC1B,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ export { analyzeCompatibility } from './compatibility-analyzer.js';
7
7
  export { readMarketplaceDefaultTargets, resolveEffectiveTargets, } from './marketplace-defaults.js';
8
8
  // Verdict engine
9
9
  export { computeVerdicts } from './verdict-engine.js';
10
- export { getClaudeProjectPaths, getClaudeUserPaths, } from './paths/claude-paths.js';
10
+ export { buildClaudeUserPaths, getClaudeProjectPaths, getClaudeUserPaths, } from './paths/claude-paths.js';
11
11
  export { getManagedSettingsCandidatePaths, WINDOWS_LEGACY_MANAGED_SETTINGS_PATH, } from './paths/managed-settings-path.js';
12
12
  export { ClaudeAuthConfigSchema, ClaudeModelConfigSchema, HooksConfigSchema, ManagedSettingsSchema, MarketplaceSourceSchema, McpServerPolicySchema, PermissionsConfigSchema, ProjectSettingsSchema, SandboxConfigSchema, SandboxFilesystemSchema, SandboxNetworkSchema, UserSettingsSchema, } from './schemas/index.js';
13
13
  export { installPlugin, readInstalledPlugins, readKnownMarketplaces, writeInstalledPlugins, writeKnownMarketplaces, } from './install/plugin-registry.js';
@@ -15,4 +15,15 @@ export { findPluginsByPackage, uninstallPlugin } from './install/plugin-uninstal
15
15
  export { listLocalPlugins } from './install/plugin-list.js';
16
16
  export { createOrgApiClientFromEnv, OrgApiClient, buildMultipartFormData } from './org/org-api-client.js';
17
17
  export { analyzeRuleConflicts, auditSettings, checkSettingsCompatibility, getSettingsFileFields, getSettingsPaths, isSubsumedBy, matchesBashRule, matchesPathRule, matchesPermissionRule, mergeSettingsLayers, readEffectiveSettings, readSettingsLayers, resolveSettingsPaths, validateSettingsFile, } from './settings/index.js';
18
+ // Claude plugin manifest schema (moved from agent-skills in Chunk 1)
19
+ export { ClaudePluginJsonSchema, ClaudePluginSchema, } from './schemas/claude-plugin.js';
20
+ // Plugin validator (moved from agent-skills in Chunk 1)
21
+ export { validatePlugin } from './validators/plugin-validator.js';
22
+ // Inventory layer (added in Chunk 2 — vendor-specific concrete classes)
23
+ export { ClaudeInstallInventory, ClaudeMarketplaceInventory, ClaudePluginInventory, ClaudeSkillInventory, } from './inventory/index.js';
24
+ export { extractClaudeSkillInventory } from './inventory/index.js';
25
+ export { extractClaudePluginInventory } from './inventory/index.js';
26
+ export { extractClaudeMarketplaceInventory } from './inventory/index.js';
27
+ export { extractClaudeInstallInventory } from './inventory/index.js';
28
+ export { detectSkillClaudePluginNameMismatch } from './inventory/index.js';
18
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;;;GAGG;AAWH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,2CAA2C;AAC3C,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKtD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,kCAAkC,CAAC;AAgB1C,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAY5B,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AAOtC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAQtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI5D,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAqB1G,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,0BAA0B,EAC1B,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,2CAA2C;AAC3C,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKtD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,kCAAkC,CAAC;AAgB1C,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAY5B,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AAOtC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAQtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI5D,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAqB1G,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,0BAA0B,EAC1B,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,qEAAqE;AACrE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GAEnB,MAAM,4BAA4B,CAAC;AAEpC,wDAAwD;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,wEAAwE;AACxE,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,mCAAmC,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { detectSkillClaudePluginNameMismatch } from './skill-claude-plugin-name-mismatch.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/inventory/detectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { detectSkillClaudePluginNameMismatch } from './skill-claude-plugin-name-mismatch.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/inventory/detectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Detector: SKILL_CLAUDE_PLUGIN_NAME_MISMATCH
3
+ *
4
+ * Pure function — no I/O. Consumes a ClaudePluginInventory and returns a
5
+ * warning when the root SKILL.md frontmatter `name` disagrees with the
6
+ * plugin.json `name`. Only fires for skill-claude-plugin shape (i.e., a plugin
7
+ * directory that has both a root SKILL.md and a .claude-plugin/plugin.json).
8
+ */
9
+ import type { ValidationIssue } from '@vibe-agent-toolkit/agent-skills';
10
+ import type { ClaudePluginInventory } from '../types.js';
11
+ /**
12
+ * Return a SKILL_CLAUDE_PLUGIN_NAME_MISMATCH warning when the plugin's
13
+ * co-located root SKILL.md `name` frontmatter disagrees with `plugin.json`
14
+ * `name`, or an empty array when the names agree, are absent, or the
15
+ * inventory is not a skill-claude-plugin shape.
16
+ */
17
+ export declare function detectSkillClaudePluginNameMismatch(inv: ClaudePluginInventory): ValidationIssue[];
18
+ //# sourceMappingURL=skill-claude-plugin-name-mismatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-claude-plugin-name-mismatch.d.ts","sourceRoot":"","sources":["../../../src/inventory/detectors/skill-claude-plugin-name-mismatch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,qBAAqB,GAAG,eAAe,EAAE,CAmBjG"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Detector: SKILL_CLAUDE_PLUGIN_NAME_MISMATCH
3
+ *
4
+ * Pure function — no I/O. Consumes a ClaudePluginInventory and returns a
5
+ * warning when the root SKILL.md frontmatter `name` disagrees with the
6
+ * plugin.json `name`. Only fires for skill-claude-plugin shape (i.e., a plugin
7
+ * directory that has both a root SKILL.md and a .claude-plugin/plugin.json).
8
+ */
9
+ import { safePath } from '@vibe-agent-toolkit/utils';
10
+ /**
11
+ * Return a SKILL_CLAUDE_PLUGIN_NAME_MISMATCH warning when the plugin's
12
+ * co-located root SKILL.md `name` frontmatter disagrees with `plugin.json`
13
+ * `name`, or an empty array when the names agree, are absent, or the
14
+ * inventory is not a skill-claude-plugin shape.
15
+ */
16
+ export function detectSkillClaudePluginNameMismatch(inv) {
17
+ if (inv.shape !== 'skill-claude-plugin')
18
+ return [];
19
+ if (inv.vendor !== 'claude-code')
20
+ return [];
21
+ const rootSkillPath = safePath.join(inv.path, 'SKILL.md');
22
+ const rootSkill = inv.discovered.skills.find(s => s.path === rootSkillPath);
23
+ if (rootSkill === undefined)
24
+ return [];
25
+ const skillName = rootSkill.manifest.name;
26
+ const pluginName = inv.manifest.name;
27
+ if (skillName === '' || pluginName === undefined || skillName === pluginName)
28
+ return [];
29
+ return [{
30
+ severity: 'warning',
31
+ code: 'SKILL_CLAUDE_PLUGIN_NAME_MISMATCH',
32
+ message: `plugin.json name "${pluginName}" does not match co-located SKILL.md frontmatter name "${skillName}"`,
33
+ location: safePath.join(inv.path, '.claude-plugin', 'plugin.json'),
34
+ fix: '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).',
35
+ }];
36
+ }
37
+ //# sourceMappingURL=skill-claude-plugin-name-mismatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-claude-plugin-name-mismatch.js","sourceRoot":"","sources":["../../../src/inventory/detectors/skill-claude-plugin-name-mismatch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAIrD;;;;;GAKG;AACH,MAAM,UAAU,mCAAmC,CAAC,GAA0B;IAC7E,IAAI,GAAG,CAAC,KAAK,KAAK,qBAAqB;QAAE,OAAO,EAAE,CAAC;IACnD,IAAI,GAAG,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,EAAE,CAAC;IAE5C,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAC5E,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrC,IAAI,SAAS,KAAK,EAAE,IAAI,UAAU,KAAK,SAAS,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IAExF,OAAO,CAAC;YACP,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,mCAAmC;YACzC,OAAO,EAAE,qBAAqB,UAAU,0DAA0D,SAAS,GAAG;YAC9G,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,CAAC;YAClE,GAAG,EAAE,gNAAgN;SACrN,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ClaudeUserPaths } from '../paths/claude-paths.js';
2
+ import { ClaudeInstallInventory } from './types.js';
3
+ /**
4
+ * Build an InstallInventory by walking a Claude install root (default: ~/.claude).
5
+ * Discovers marketplaces under plugins/marketplaces/<name>/ and cached plugins under
6
+ * plugins/cache/<marketplace>/<name>/<version>/. Never throws — all failures surface
7
+ * via parseErrors[].
8
+ *
9
+ * Pass a ClaudeUserPaths object directly for testing or when the caller has already
10
+ * resolved the install root; pass a string path to build paths automatically from
11
+ * that root; omit entirely to use the default user install (~/.claude).
12
+ */
13
+ export declare function extractClaudeInstallInventory(pathsOrRoot?: ClaudeUserPaths | string): Promise<ClaudeInstallInventory>;
14
+ //# sourceMappingURL=extract-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-install.d.ts","sourceRoot":"","sources":["../../src/inventory/extract-install.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIpD;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CAClD,WAAW,CAAC,EAAE,eAAe,GAAG,MAAM,GACpC,OAAO,CAAC,sBAAsB,CAAC,CAiBjC"}
@@ -0,0 +1,111 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { readdir } from 'node:fs/promises';
3
+ import { safePath } from '@vibe-agent-toolkit/utils';
4
+ import { buildClaudeUserPaths, getClaudeUserPaths } from '../paths/claude-paths.js';
5
+ import { extractClaudeMarketplaceInventory } from './extract-marketplace.js';
6
+ import { extractClaudePluginInventory } from './extract-plugin.js';
7
+ import { ClaudeInstallInventory } from './types.js';
8
+ /**
9
+ * Build an InstallInventory by walking a Claude install root (default: ~/.claude).
10
+ * Discovers marketplaces under plugins/marketplaces/<name>/ and cached plugins under
11
+ * plugins/cache/<marketplace>/<name>/<version>/. Never throws — all failures surface
12
+ * via parseErrors[].
13
+ *
14
+ * Pass a ClaudeUserPaths object directly for testing or when the caller has already
15
+ * resolved the install root; pass a string path to build paths automatically from
16
+ * that root; omit entirely to use the default user install (~/.claude).
17
+ */
18
+ export async function extractClaudeInstallInventory(pathsOrRoot) {
19
+ const paths = resolvePaths(pathsOrRoot);
20
+ const root = paths.claudeDir;
21
+ const parseErrors = [];
22
+ const marketplaces = [];
23
+ const plugins = [];
24
+ await collectMarketplaces(paths.marketplacesDir, marketplaces, parseErrors);
25
+ await collectCachedPlugins(paths.pluginsCacheDir, plugins, parseErrors);
26
+ return new ClaudeInstallInventory({
27
+ path: root,
28
+ installRoot: root,
29
+ marketplaces,
30
+ plugins,
31
+ parseErrors,
32
+ });
33
+ }
34
+ function resolvePaths(pathsOrRoot) {
35
+ if (pathsOrRoot === undefined)
36
+ return getClaudeUserPaths();
37
+ if (typeof pathsOrRoot === 'string')
38
+ return buildClaudeUserPaths(safePath.resolve(pathsOrRoot));
39
+ return pathsOrRoot;
40
+ }
41
+ async function collectMarketplaces(marketplacesDir, marketplaces, parseErrors) {
42
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- path from validated ClaudeUserPaths
43
+ if (!existsSync(marketplacesDir))
44
+ return;
45
+ try {
46
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- path from validated ClaudeUserPaths
47
+ const entries = await readdir(marketplacesDir, { withFileTypes: true });
48
+ for (const entry of entries) {
49
+ if (!entry.isDirectory())
50
+ continue;
51
+ const mpPath = safePath.join(marketplacesDir, entry.name);
52
+ marketplaces.push(await extractClaudeMarketplaceInventory(mpPath));
53
+ }
54
+ }
55
+ catch (e) {
56
+ parseErrors.push({ path: marketplacesDir, message: e.message });
57
+ }
58
+ }
59
+ async function collectCachedPlugins(cacheDir, plugins, parseErrors) {
60
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- path from validated ClaudeUserPaths
61
+ if (!existsSync(cacheDir))
62
+ return;
63
+ let marketplaceDirs;
64
+ try {
65
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- path from validated ClaudeUserPaths
66
+ marketplaceDirs = (await readdir(cacheDir, { withFileTypes: true }))
67
+ .filter(e => e.isDirectory())
68
+ .map(e => safePath.join(cacheDir, e.name));
69
+ }
70
+ catch (e) {
71
+ parseErrors.push({ path: cacheDir, message: e.message });
72
+ return;
73
+ }
74
+ for (const mpDir of marketplaceDirs) {
75
+ await collectPluginsInMarketplaceCache(mpDir, plugins, parseErrors);
76
+ }
77
+ }
78
+ async function collectPluginsInMarketplaceCache(mpDir, plugins, parseErrors) {
79
+ let pluginNameDirs;
80
+ try {
81
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- path constructed from cache directory walk
82
+ pluginNameDirs = (await readdir(mpDir, { withFileTypes: true }))
83
+ .filter(e => e.isDirectory())
84
+ .map(e => safePath.join(mpDir, e.name));
85
+ }
86
+ catch {
87
+ // best-effort: skip unreadable marketplace cache directories
88
+ return;
89
+ }
90
+ for (const nameDir of pluginNameDirs) {
91
+ let versionDirs;
92
+ try {
93
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- path constructed from cache directory walk
94
+ versionDirs = (await readdir(nameDir, { withFileTypes: true }))
95
+ .filter(e => e.isDirectory())
96
+ .map(e => safePath.join(nameDir, e.name));
97
+ }
98
+ catch {
99
+ continue;
100
+ }
101
+ for (const versionDir of versionDirs) {
102
+ try {
103
+ plugins.push(await extractClaudePluginInventory(versionDir));
104
+ }
105
+ catch (e) {
106
+ parseErrors.push({ path: versionDir, message: e.message });
107
+ }
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=extract-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-install.js","sourceRoot":"","sources":["../../src/inventory/extract-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ClaudeMarketplaceInventory } from './types.js';
2
+ /**
3
+ * Build a MarketplaceInventory for a directory containing a .claude-plugin/marketplace.json
4
+ * manifest. Never throws — all failures surface via parseErrors[].
5
+ *
6
+ * For path-source entries that exist on disk, the plugin extractor is called recursively so
7
+ * discovered.plugins is fully populated. Remote entries (git, npm, unknown) are declarations
8
+ * only — they are never fetched.
9
+ */
10
+ export declare function extractClaudeMarketplaceInventory(marketplacePath: string): Promise<ClaudeMarketplaceInventory>;
11
+ //# sourceMappingURL=extract-marketplace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-marketplace.d.ts","sourceRoot":"","sources":["../../src/inventory/extract-marketplace.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAMxD;;;;;;;GAOG;AACH,wBAAsB,iCAAiC,CACtD,eAAe,EAAE,MAAM,GACrB,OAAO,CAAC,0BAA0B,CAAC,CAkErC"}
@@ -0,0 +1,139 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { MarketplaceManifestSchema } from '@vibe-agent-toolkit/agent-skills';
4
+ import { safePath } from '@vibe-agent-toolkit/utils';
5
+ import { extractClaudePluginInventory } from './extract-plugin.js';
6
+ import { ClaudeMarketplaceInventory } from './types.js';
7
+ const MARKETPLACE_JSON = 'marketplace.json';
8
+ /**
9
+ * Build a MarketplaceInventory for a directory containing a .claude-plugin/marketplace.json
10
+ * manifest. Never throws — all failures surface via parseErrors[].
11
+ *
12
+ * For path-source entries that exist on disk, the plugin extractor is called recursively so
13
+ * discovered.plugins is fully populated. Remote entries (git, npm, unknown) are declarations
14
+ * only — they are never fetched.
15
+ */
16
+ export async function extractClaudeMarketplaceInventory(marketplacePath) {
17
+ const absolute = safePath.resolve(marketplacePath);
18
+ const parseErrors = [];
19
+ const manifestFilePath = safePath.join(absolute, '.claude-plugin', MARKETPLACE_JSON);
20
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- absolute is resolved from caller-supplied path
21
+ if (!existsSync(manifestFilePath)) {
22
+ parseErrors.push({ path: manifestFilePath, message: 'marketplace.json not found' });
23
+ return new ClaudeMarketplaceInventory({
24
+ path: absolute,
25
+ manifest: {},
26
+ declared: { plugins: [] },
27
+ discovered: { plugins: [] },
28
+ parseErrors,
29
+ });
30
+ }
31
+ let raw;
32
+ try {
33
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- absolute path resolved from marketplace root
34
+ raw = JSON.parse(await readFile(manifestFilePath, 'utf-8'));
35
+ }
36
+ catch (e) {
37
+ parseErrors.push({ path: manifestFilePath, message: e.message });
38
+ return new ClaudeMarketplaceInventory({
39
+ path: absolute,
40
+ manifest: {},
41
+ declared: { plugins: [] },
42
+ discovered: { plugins: [] },
43
+ parseErrors,
44
+ });
45
+ }
46
+ const result = MarketplaceManifestSchema.safeParse(raw);
47
+ const data = result.success ? result.data : raw;
48
+ if (!result.success) {
49
+ parseErrors.push({
50
+ path: manifestFilePath,
51
+ message: `marketplace.json schema validation failed: ${result.error.issues.map(i => i.message).join('; ')}`,
52
+ });
53
+ }
54
+ const manifest = {
55
+ ...(typeof data['name'] === 'string' && { name: data['name'] }),
56
+ ...(typeof data['description'] === 'string' && { description: data['description'] }),
57
+ };
58
+ const pluginsRaw = data['plugins'] ?? [];
59
+ const declared = [];
60
+ const discovered = [];
61
+ for (const entry of pluginsRaw) {
62
+ const ref = pluginEntryToRef(absolute, entry);
63
+ declared.push(ref);
64
+ if (ref.source === 'path' && ref.exists) {
65
+ discovered.push(await extractClaudePluginInventory(ref.resolvedPath));
66
+ }
67
+ }
68
+ return new ClaudeMarketplaceInventory({
69
+ path: absolute,
70
+ manifest,
71
+ declared: { plugins: declared },
72
+ discovered: { plugins: discovered },
73
+ parseErrors,
74
+ });
75
+ }
76
+ function strField(obj, key, fallback) {
77
+ const v = obj[key];
78
+ return typeof v === 'string' ? v : fallback;
79
+ }
80
+ function pluginEntryToRef(base, entry) {
81
+ if (typeof entry !== 'object' || entry === null) {
82
+ return { manifestPath: '', resolvedPath: '', exists: false, source: 'unknown' };
83
+ }
84
+ const e = entry;
85
+ const source = e['source'];
86
+ if (typeof source === 'string') {
87
+ const resolved = safePath.resolve(base, source);
88
+ return {
89
+ manifestPath: source,
90
+ resolvedPath: resolved,
91
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from marketplace-relative path entry
92
+ exists: existsSync(resolved),
93
+ source: 'path',
94
+ };
95
+ }
96
+ if (typeof source === 'object' && source !== null) {
97
+ const obj = source;
98
+ const kind = strField(obj, 'source', 'unknown');
99
+ switch (kind) {
100
+ case 'github':
101
+ return {
102
+ manifestPath: `github:${strField(obj, 'repo', '')}`,
103
+ resolvedPath: '',
104
+ exists: false,
105
+ source: 'git',
106
+ };
107
+ case 'url':
108
+ return {
109
+ manifestPath: strField(obj, 'url', ''),
110
+ resolvedPath: '',
111
+ exists: false,
112
+ source: 'git',
113
+ };
114
+ case 'npm':
115
+ return {
116
+ manifestPath: `npm:${strField(obj, 'package', '')}`,
117
+ resolvedPath: '',
118
+ exists: false,
119
+ source: 'npm',
120
+ };
121
+ case 'pip':
122
+ return {
123
+ manifestPath: `pip:${strField(obj, 'package', '')}`,
124
+ resolvedPath: '',
125
+ exists: false,
126
+ source: 'unknown',
127
+ };
128
+ default:
129
+ return {
130
+ manifestPath: `${kind}:${strField(obj, 'package', '')}`,
131
+ resolvedPath: '',
132
+ exists: false,
133
+ source: 'unknown',
134
+ };
135
+ }
136
+ }
137
+ return { manifestPath: '', resolvedPath: '', exists: false, source: 'unknown' };
138
+ }
139
+ //# sourceMappingURL=extract-marketplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-marketplace.js","sourceRoot":"","sources":["../../src/inventory/extract-marketplace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ClaudePluginInventory } from './types.js';
2
+ /**
3
+ * Build a PluginInventory for a directory containing a .claude-plugin/plugin.json manifest
4
+ * and/or a root SKILL.md. Never throws — all failures surface via parseErrors[].
5
+ */
6
+ export declare function extractClaudePluginInventory(pluginPath: string): Promise<ClaudePluginInventory>;
7
+ //# sourceMappingURL=extract-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-plugin.d.ts","sourceRoot":"","sources":["../../src/inventory/extract-plugin.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAQnD;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA2CrG"}