Skip to content

Commit 1fd0deb

Browse files
committed
fixing overrides and listings
1 parent 9e3290c commit 1fd0deb

2 files changed

Lines changed: 113 additions & 18 deletions

File tree

commands/coldbox/ai/guidelines/list.cfc

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,25 @@ component extends="coldbox-cli.models.BaseAICommand" {
1818
boolean verbose = false,
1919
string directory = getCwd()
2020
){
21-
showColdBoxBanner( "AI Guidelines" )
21+
showColdBoxBanner( "Installed Guidelines" )
2222

2323
var info = ensureInstalled( arguments.directory )
2424

25-
print.line()
26-
printInfo( "Installed Guidelines" )
27-
print.line()
28-
2925
// Group guidelines by source
3026
var coreGuidelines = []
3127
var moduleGuidelines = []
3228
var customGuidelines = []
3329
var overrideGuidelines = []
3430

3531
info.guidelines.each( ( guideline ) => {
36-
if ( guideline.type == "override" ) {
32+
var gType = guideline.type ?: ""
33+
var gSource = guideline.source ?: ""
34+
35+
if ( gType == "override" ) {
3736
overrideGuidelines.append( guideline )
38-
} else if ( guideline.source == "coldbox-cli" ) {
37+
} else if ( gSource == "coldbox-cli" || gType == "core" ) {
3938
coreGuidelines.append( guideline )
40-
} else if ( guideline.source == "custom" || guideline.type == "custom" ) {
39+
} else if ( gSource == "custom" || gType == "custom" ) {
4140
customGuidelines.append( guideline )
4241
} else {
4342
moduleGuidelines.append( guideline )
@@ -46,7 +45,8 @@ component extends="coldbox-cli.models.BaseAICommand" {
4645

4746
// Display core guidelines
4847
if ( coreGuidelines.len() ) {
49-
printSuccess( "⭐ Core Guidelines (#coreGuidelines.len()#)" )
48+
print.blackLineOnLightGreen( "⭐ Core Guidelines (#coreGuidelines.len()#)" )
49+
.line()
5050
coreGuidelines.each( ( guideline ) => {
5151
print.indentedLine( " • #guideline.name# (v#guideline.installedVersion#)" )
5252
if ( verbose && structKeyExists( guideline, "syncedAt" ) ) {
@@ -58,7 +58,8 @@ component extends="coldbox-cli.models.BaseAICommand" {
5858

5959
// Display module guidelines
6060
if ( moduleGuidelines.len() ) {
61-
printInfo( "📦 Module Guidelines (#moduleGuidelines.len()#)" )
61+
print.blackLineOnLightGreen( "📦 Module Guidelines (#moduleGuidelines.len()#)" )
62+
.line()
6263
moduleGuidelines.each( ( guideline ) => {
6364
var label = " • #guideline.name# (from #guideline.source#)"
6465
if ( structKeyExists( guideline, "autoGenerated" ) && guideline.autoGenerated ) {
@@ -75,7 +76,8 @@ component extends="coldbox-cli.models.BaseAICommand" {
7576

7677
// Display custom guidelines
7778
if ( customGuidelines.len() ) {
78-
printWarn( "🔧 Custom Guidelines (#customGuidelines.len()#)" )
79+
print.blackLineOnGreen( "🔧 Custom Guidelines (#customGuidelines.len()#)" )
80+
.line()
7981
customGuidelines.each( ( guideline ) => {
8082
print.indentedLine( " • #guideline.name#" )
8183
if ( verbose && structKeyExists( guideline, "syncedAt" ) ) {
@@ -87,7 +89,8 @@ component extends="coldbox-cli.models.BaseAICommand" {
8789

8890
// Display override guidelines
8991
if ( overrideGuidelines.len() ) {
90-
printWarn( "🎯 Override Guidelines (#overrideGuidelines.len()#)" )
92+
print.blackLineOnGreen( "🎯 Override Guidelines (#overrideGuidelines.len()#)" )
93+
.line()
9194
overrideGuidelines.each( ( guideline ) => {
9295
var baseName = replaceNoCase( guideline.name, "-override", "" )
9396
print.indentedLine( " • #baseName# (overridden)" )

models/GuidelineManager.cfc

Lines changed: 98 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,17 @@ component singleton {
9292
}
9393

9494
/**
95-
* Refresh guidelines based on installed modules
95+
* Refresh guidelines - syncs manifest with file system and installed modules
96+
* - Updates module guidelines based on box.json dependencies
97+
* - Syncs custom guidelines from .ai/guidelines/custom/
98+
* - Syncs override guidelines from .ai/guidelines/overrides/
99+
* - Removes manifest entries for deleted files
100+
* - Removes guidelines for uninstalled modules
96101
*
97102
* @directory The project directory
98103
* @manifest The manifest struct to update
99104
*/
100-
function refresh( required string directory, required struct manifest ){
105+
function refresh( required string directory, required struct manifest ){
101106
var changes = {
102107
"added" : [],
103108
"updated" : [],
@@ -159,10 +164,19 @@ component singleton {
159164
}
160165

161166
// Remove guidelines for uninstalled modules
162-
var toRemove = [];
167+
var toRemove = []
163168
for ( var guideline in manifest.guidelines ) {
164-
if ( guideline.source != "coldbox-cli" && !structKeyExists( allDependencies, guideline.source ) ) {
165-
toRemove.append( guideline.name );
169+
var gType = guideline.type ?: ""
170+
var gSource = guideline.source ?: ""
171+
172+
// Don't remove core, custom, or override guidelines
173+
if ( gSource == "coldbox-cli" || gType == "core" || gSource == "user" || gType == "custom" || gType == "override" ) {
174+
continue;
175+
}
176+
177+
// Remove module guidelines if module no longer installed
178+
if ( !structKeyExists( allDependencies, gSource ) ) {
179+
toRemove.append( guideline.name )
166180
}
167181
}
168182

@@ -171,6 +185,84 @@ component singleton {
171185
changes.removed.append( name )
172186
} )
173187

188+
// Sync custom guidelines from filesystem
189+
var customDir = "#arguments.directory#/.ai/guidelines/custom"
190+
if ( directoryExists( customDir ) ) {
191+
var customFiles = directoryList( customDir, false, "name", "*.md" )
192+
customFiles.each( ( fileName ) => {
193+
var guidelineName = replaceNoCase( fileName, ".md", "" )
194+
195+
// Check if in manifest
196+
var existing = manifest.guidelines.filter( ( g ) => g.name == guidelineName )
197+
if ( !existing.len() ) {
198+
// Add to manifest
199+
updateManifestEntry(
200+
manifest,
201+
guidelineName,
202+
"custom",
203+
"user",
204+
variables.utility.getColdboxCliVersion(),
205+
false
206+
)
207+
changes.added.append( guidelineName )
208+
}
209+
} )
210+
}
211+
212+
// Sync override guidelines from filesystem
213+
var overridesDir = "#arguments.directory#/.ai/guidelines/overrides"
214+
if ( directoryExists( overridesDir ) ) {
215+
var overrideFiles = directoryList( overridesDir, false, "name", "*.md" )
216+
overrideFiles.each( ( fileName ) => {
217+
var baseName = replaceNoCase( fileName, ".md", "" )
218+
var manifestName = "#baseName#-override"
219+
220+
// Check if in manifest
221+
var existing = manifest.guidelines.filter( ( g ) => g.name == manifestName )
222+
if ( !existing.len() ) {
223+
// Add to manifest
224+
updateManifestEntry(
225+
manifest,
226+
manifestName,
227+
"override",
228+
"user",
229+
variables.utility.getColdboxCliVersion(),
230+
false
231+
)
232+
changes.added.append( manifestName )
233+
}
234+
} )
235+
}
236+
237+
// Remove manifest entries for files that no longer exist
238+
var orphanedGuidelines = []
239+
for ( var guideline in manifest.guidelines ) {
240+
var gType = guideline.type ?: ""
241+
var filePath = ""
242+
243+
// Determine expected file path
244+
if ( gType == "core" ) {
245+
filePath = "#arguments.directory#/.ai/guidelines/core/#guideline.name#.md"
246+
} else if ( gType == "module" ) {
247+
filePath = "#arguments.directory#/.ai/guidelines/modules/#guideline.name#.md"
248+
} else if ( gType == "custom" ) {
249+
filePath = "#arguments.directory#/.ai/guidelines/custom/#guideline.name#.md"
250+
} else if ( gType == "override" ) {
251+
var baseName = replaceNoCase( guideline.name, "-override", "" )
252+
filePath = "#arguments.directory#/.ai/guidelines/overrides/#baseName#.md"
253+
}
254+
255+
// Check if file exists
256+
if ( filePath.len() && !fileExists( filePath ) ) {
257+
orphanedGuidelines.append( guideline.name )
258+
}
259+
}
260+
261+
orphanedGuidelines.each( ( name ) => {
262+
manifest.guidelines = manifest.guidelines.filter( ( g ) => g.name != name )
263+
changes.removed.append( name )
264+
} )
265+
174266
return changes;
175267
}
176268

@@ -391,7 +483,7 @@ component singleton {
391483
// Read override template
392484
var templatesPath = variables.utility.getTemplatesPath() & "/ai/guidelines/"
393485
var templatePath = templatesPath & "guideline-override-template.md"
394-
486+
395487
if ( !fileExists( templatePath ) ) {
396488
throw(
397489
type = "GuidelineManager.TemplateNotFound",

0 commit comments

Comments
 (0)