@@ -122,15 +122,16 @@ function validateVersions() {
122122}
123123
124124function validateMappings ( ) {
125- const pluginsExist = fs . existsSync ( PLUGINS_DIR ) ;
125+ const pluginDirs = listPluginDirs ( ) ;
126+ const pluginsPopulated = pluginDirs . length > 0 ;
126127
127128 // Use discovery module instead of parsing hardcoded arrays from source
128129 const discoveredPlugins = normalizeList ( discovery . discoverPlugins ( ROOT_DIR ) ) ;
129130 const commandMappings = discovery . getCommandMappings ( ROOT_DIR ) ;
130131 const skillMappings = discovery . getCodexSkillMappings ( ROOT_DIR ) ;
131132
132- // Only require plugins when plugins/ directory exists
133- if ( pluginsExist ) {
133+ // Only require plugins when plugins/ directory has actual plugin subdirectories
134+ if ( pluginsPopulated ) {
134135 if ( discoveredPlugins . length === 0 ) {
135136 errors . push ( 'discovery found no plugins' ) ;
136137 }
@@ -144,24 +145,24 @@ function validateMappings() {
144145 }
145146 }
146147
147- const pluginDirs = normalizeList ( listPluginDirs ( ) ) ;
148+ const normalizedPluginDirs = normalizeList ( pluginDirs ) ;
148149 const marketplace = readJson ( path . join ( ROOT_DIR , '.claude-plugin' , 'marketplace.json' ) , 'marketplace.json' ) ;
149150 const marketplacePlugins = normalizeList ( ( marketplace ?. plugins || [ ] ) . map ( p => p . name ) ) ;
150151
151152 // Compare discovered plugins vs filesystem only when plugins/ exists
152- if ( pluginsExist ) {
153- compareLists ( 'Discovered plugins vs plugins/' , pluginDirs , discoveredPlugins ) ;
153+ if ( pluginsPopulated ) {
154+ compareLists ( 'Discovered plugins vs plugins/' , normalizedPluginDirs , discoveredPlugins ) ;
154155
155156 if ( marketplacePlugins . length > 0 ) {
156- compareLists ( 'Marketplace plugins vs plugins/' , pluginDirs , marketplacePlugins ) ;
157+ compareLists ( 'Marketplace plugins vs plugins/' , normalizedPluginDirs , marketplacePlugins ) ;
157158 }
158159 if ( marketplacePlugins . length > 0 ) {
159160 compareLists ( 'Marketplace plugins vs discovered plugins' , marketplacePlugins , discoveredPlugins ) ;
160161 }
161162 }
162163
163164 // Validate command mappings - source files exist (only when plugins/ exists)
164- if ( pluginsExist ) {
165+ if ( pluginsPopulated ) {
165166 const seenTargets = new Set ( ) ;
166167 for ( const [ target , plugin , source ] of commandMappings ) {
167168 if ( seenTargets . has ( target ) ) {
@@ -206,7 +207,7 @@ function validateMappings() {
206207}
207208
208209function validateAgentCounts ( ) {
209- if ( ! fs . existsSync ( PLUGINS_DIR ) ) return ;
210+ if ( listPluginDirs ( ) . length === 0 ) return ;
210211 const fileBasedCount = listPluginsWithAgents ( )
211212 . map ( plugin => {
212213 const agentsDir = path . join ( PLUGINS_DIR , plugin , 'agents' ) ;
0 commit comments