@codemarc/blt 1.4.1 → 1.4.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.
@@ -0,0 +1,10 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export interface CleanupGeneratedOptions {
3
+ instance?: string;
4
+ all?: boolean;
5
+ }
6
+ /**
7
+ * Cleanup generated SQL files and combined schema files
8
+ */
9
+ export declare function cleanupGenerated(options: CleanupGeneratedOptions, _logger: Logger): Promise<void>;
10
+ //# sourceMappingURL=generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../../../src/commands/cleanup/generated.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
@@ -0,0 +1,37 @@
1
+ import fs from "node:fs";
2
+ import { join } from "node:path";
3
+ import { getPaths } from "../../lib/constants";
4
+ import { getAvailableInstances } from "../../lib/instance-discovery";
5
+ /**
6
+ * Cleanup generated SQL files and combined schema files
7
+ */
8
+ export async function cleanupGenerated(options, _logger) {
9
+ const paths = getPaths();
10
+ // Clean up generated SQL files in dist
11
+ console.log("Cleaning generated SQL files and combined schema files");
12
+ fs.rmSync(join(paths.DIST, "public.sql"), { recursive: true, force: true });
13
+ fs.rmSync(join(paths.DIST, "data.sql"), { recursive: true, force: true });
14
+ // Determine which instances to clean
15
+ let instancesToClean;
16
+ if (options.all) {
17
+ instancesToClean = getAvailableInstances();
18
+ console.log(`Cleaning all instances: ${instancesToClean.join(", ")}`);
19
+ }
20
+ else if (options.instance) {
21
+ instancesToClean = [options.instance];
22
+ }
23
+ else {
24
+ // Default: clean default and joanne for backward compatibility
25
+ instancesToClean = ["default", "joanne"];
26
+ }
27
+ // Remove generated SQL directories for each instance
28
+ for (const instance of instancesToClean) {
29
+ const sqlDir = join(paths.INSTANCES_BASE, instance, "sql");
30
+ if (fs.existsSync(sqlDir)) {
31
+ fs.rmSync(sqlDir, { recursive: true, force: true });
32
+ console.log(`Removed generated SQL files: ${sqlDir}`);
33
+ }
34
+ }
35
+ console.log("Cleanup complete");
36
+ }
37
+ //# sourceMappingURL=generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated.js","sourceRoot":"","sources":["../../../src/commands/cleanup/generated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQrE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAAgC,EAChC,OAAe;IAEf,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,qCAAqC;IACrC,IAAI,gBAA0B,CAAC;IAE/B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,gBAAgB,GAAG,qBAAqB,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,2BAA2B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC7B,gBAAgB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACP,+DAA+D;QAC/D,gBAAgB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export interface CleanupTagsOptions {
3
+ minCount?: number;
4
+ dryRun?: boolean;
5
+ }
6
+ interface TagStats {
7
+ totalTags: number;
8
+ validTags: number;
9
+ removedTags: number;
10
+ filesModified: number;
11
+ itemsModified: number;
12
+ }
13
+ /**
14
+ * Cleanup tags in YAML files for an instance
15
+ * Removes tags that appear less than minCount times across all items
16
+ */
17
+ export declare function cleanupTags(instance: string, options: CleanupTagsOptions, _logger: Logger): Promise<TagStats>;
18
+ export {};
19
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/commands/cleanup/tags.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,QAAQ;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACtB;AASD;;;GAGG;AACH,wBAAsB,WAAW,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAsKnB"}
@@ -0,0 +1,149 @@
1
+ import fs from "node:fs";
2
+ import { join } from "node:path";
3
+ import yaml from "js-yaml";
4
+ import { getPaths } from "../../lib/constants";
5
+ import { getAvailableInstances } from "../../lib/instance-discovery";
6
+ /**
7
+ * Cleanup tags in YAML files for an instance
8
+ * Removes tags that appear less than minCount times across all items
9
+ */
10
+ export async function cleanupTags(instance, options, _logger) {
11
+ const paths = getPaths();
12
+ const minTagCount = options.minCount ?? 4;
13
+ const dryRun = options.dryRun ?? false;
14
+ // Validate instance exists
15
+ const availableInstances = getAvailableInstances();
16
+ if (!availableInstances.includes(instance)) {
17
+ throw new Error(`Instance "${instance}" not found. Available instances: ${availableInstances.join(", ")}`);
18
+ }
19
+ const yamlDir = join(paths.INSTANCES_BASE, instance, "yaml");
20
+ if (!fs.existsSync(yamlDir)) {
21
+ throw new Error(`YAML directory not found: ${yamlDir}`);
22
+ }
23
+ // Track all tags and their usage
24
+ const tagCounts = new Map();
25
+ const fileTagData = [];
26
+ // Read and parse all YAML files
27
+ const files = fs
28
+ .readdirSync(yamlDir)
29
+ .filter((f) => f.endsWith(".yml"))
30
+ .map((f) => join(yamlDir, f));
31
+ console.log(`Found ${files.length} YAML files to process in ${instance}\n`);
32
+ // First pass: collect all tags and count them
33
+ for (const filePath of files) {
34
+ const content = fs.readFileSync(filePath, "utf8");
35
+ let doc;
36
+ try {
37
+ doc = yaml.load(content);
38
+ }
39
+ catch (e) {
40
+ const error = e;
41
+ console.error(`Error parsing ${filePath}: ${error.message}`);
42
+ continue;
43
+ }
44
+ if (!doc || !doc.rows)
45
+ continue;
46
+ const rows = doc.rows;
47
+ for (const row of rows) {
48
+ if (!row || !row.row)
49
+ continue;
50
+ const item = row.row;
51
+ const tags = item?.props?.tags;
52
+ if (Array.isArray(tags)) {
53
+ // Count each tag
54
+ for (const tag of tags) {
55
+ tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);
56
+ }
57
+ }
58
+ }
59
+ fileTagData.push({
60
+ filePath,
61
+ fileName: filePath.split("/").pop() || filePath,
62
+ doc,
63
+ originalContent: content,
64
+ });
65
+ }
66
+ // Filter tags that meet the minimum count requirement
67
+ const validTags = new Set();
68
+ for (const [tag, count] of tagCounts.entries()) {
69
+ if (count >= minTagCount) {
70
+ validTags.add(tag);
71
+ }
72
+ }
73
+ console.log("Tag Usage Summary:");
74
+ console.log("==================\n");
75
+ // Sort tags by count (descending)
76
+ const sortedTags = Array.from(tagCounts.entries()).sort((a, b) => b[1] - a[1]);
77
+ for (const [tag, count] of sortedTags) {
78
+ const status = validTags.has(tag) ? "✓ KEEP" : "✗ REMOVE";
79
+ console.log(`${status.padEnd(10)} ${tag.padEnd(30)} (${count} items)`);
80
+ }
81
+ console.log(`\nTotal tags: ${tagCounts.size}`);
82
+ console.log(`Tags to keep (≥${minTagCount} items): ${validTags.size}`);
83
+ console.log(`Tags to remove: ${tagCounts.size - validTags.size}\n`);
84
+ if (dryRun) {
85
+ console.log("Dry run mode - no files will be modified\n");
86
+ }
87
+ // Second pass: update files with filtered tags
88
+ let totalFilesModified = 0;
89
+ let totalItemsModified = 0;
90
+ for (const { filePath, fileName, doc } of fileTagData) {
91
+ let modified = false;
92
+ let itemsModified = 0;
93
+ const rows = doc.rows;
94
+ // Process each item and filter its tags
95
+ for (const row of rows) {
96
+ if (!row || !row.row)
97
+ continue;
98
+ const item = row.row;
99
+ if (!item.props || !item.props.tags)
100
+ continue;
101
+ const originalTags = item.props.tags;
102
+ const filteredTags = originalTags.filter((tag) => validTags.has(tag));
103
+ if (filteredTags.length !== originalTags.length) {
104
+ itemsModified++;
105
+ if (!dryRun) {
106
+ if (filteredTags.length > 0) {
107
+ item.props.tags = filteredTags;
108
+ }
109
+ else {
110
+ delete item.props.tags;
111
+ }
112
+ }
113
+ modified = true;
114
+ }
115
+ }
116
+ if (modified) {
117
+ if (!dryRun) {
118
+ // Write back with YAML formatting that preserves structure
119
+ const newContent = yaml.dump(doc, {
120
+ indent: 3,
121
+ lineWidth: -1,
122
+ quotingType: '"',
123
+ forceQuotes: false,
124
+ noRefs: true,
125
+ sortKeys: false,
126
+ flowLevel: -1,
127
+ styles: {
128
+ "!!null": "canonical",
129
+ },
130
+ });
131
+ fs.writeFileSync(filePath, newContent, "utf8");
132
+ }
133
+ totalFilesModified++;
134
+ totalItemsModified += itemsModified;
135
+ console.log(`${dryRun ? "[DRY RUN] Would modify" : "Modified"} ${fileName}: ${itemsModified} items updated`);
136
+ }
137
+ }
138
+ console.log("\n=== Summary ===");
139
+ console.log(`Files ${dryRun ? "that would be " : ""}modified: ${totalFilesModified}`);
140
+ console.log(`Items with tags ${dryRun ? "that would be " : ""}removed: ${totalItemsModified}`);
141
+ return {
142
+ totalTags: tagCounts.size,
143
+ validTags: validTags.size,
144
+ removedTags: tagCounts.size - validTags.size,
145
+ filesModified: totalFilesModified,
146
+ itemsModified: totalItemsModified,
147
+ };
148
+ }
149
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/commands/cleanup/tags.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { Program } from "@caporal/core";
2
2
  /**
3
- * Register env commands with the CLI program
3
+ * Register cleanup commands with the CLI program
4
4
  */
5
5
  export default function cleanupCommand(program: Program): void;
6
6
  //# sourceMappingURL=cleanup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAO,EAAE,OAAO,QAkBtD"}
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAO,EAAE,OAAO,QA2DtD"}
@@ -1,23 +1,56 @@
1
- import fs from "node:fs";
1
+ import { cleanupGenerated } from "./cleanup/generated";
2
+ import { cleanupTags } from "./cleanup/tags";
2
3
  /**
3
- * Register env commands with the CLI program
4
+ * Register cleanup commands with the CLI program
4
5
  */
5
6
  export default function cleanupCommand(program) {
7
+ const cleanupHelpText = `
8
+ cleanup utilities
9
+
10
+ Usage:
11
+ blt cleanup <operation>
12
+
13
+ Available operations:
14
+ generated Cleanup generated SQL files and instance SQL directories
15
+ tags Cleanup infrequently used tags in YAML files
16
+
17
+ Run 'blt cleanup <operation> --help' for more information on a specific command.
18
+ `;
6
19
  program
7
- .command("cleanup", "Cleanup generated files")
20
+ .command("cleanup", "cleanup utilities")
21
+ .help(cleanupHelpText)
22
+ .action(() => {
23
+ console.log(cleanupHelpText);
24
+ });
25
+ // Cleanup generated files
26
+ program
27
+ .command("cleanup generated", "Cleanup generated SQL files and instance SQL directories")
28
+ .hide()
29
+ .option("-i, --instance <instance>", "Instance to clean (can be used multiple times)")
30
+ .option("-a, --all", "Clean all instances", { default: false })
31
+ .action(async ({ options, logger }) => {
32
+ await cleanupGenerated({
33
+ instance: options.instance,
34
+ all: options.all,
35
+ }, logger);
36
+ });
37
+ // Cleanup tags
38
+ program
39
+ .command("cleanup tags", "Cleanup infrequently used tags in YAML files")
40
+ .hide()
41
+ .argument("<instance>", "Instance name (e.g., 'default', 'joanne')")
42
+ .option("-m, --min-count <count>", "Minimum tag count to keep (default: 4)", {
43
+ default: 4,
44
+ validator: program.NUMBER,
45
+ })
46
+ .option("-d, --dry-run", "Show what would be changed without modifying files", {
47
+ default: false,
48
+ })
8
49
  .action(async ({ args, options, logger }) => {
9
- console.log(`Cleaning generated SQL files and combined schema files`);
10
- fs.rmSync("dist/public.sql", { recursive: true, force: true });
11
- fs.rmSync("dist/data.sql", { recursive: true, force: true });
12
- console.log(`Removed generated instance files`);
13
- fs.rmSync("schema/instances/default/sql/", {
14
- recursive: true,
15
- force: true,
16
- });
17
- fs.rmSync("schema/instances/joanne/sql/", {
18
- recursive: true,
19
- force: true,
20
- });
50
+ await cleanupTags(args.instance, {
51
+ minCount: options.minCount,
52
+ dryRun: options.dryRun,
53
+ }, logger);
21
54
  });
22
55
  }
23
56
  //# sourceMappingURL=cleanup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAgB;IACtD,OAAO;SACL,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,+BAA+B,EAAE;YAC1C,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACX,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,8BAA8B,EAAE;YACzC,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACX,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAgB;IACtD,MAAM,eAAe,GAAG;;;;;;;;;;;CAWxB,CAAC;IAED,OAAO;SACL,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACvC,IAAI,CAAC,eAAe,CAAC;SACrB,MAAM,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEJ,0BAA0B;IAC1B,OAAO;SACL,OAAO,CAAC,mBAAmB,EAAE,0DAA0D,CAAC;SACxF,IAAI,EAAE;SACN,MAAM,CAAC,2BAA2B,EAAE,gDAAgD,CAAC;SACrF,MAAM,CAAC,WAAW,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACrC,MAAM,gBAAgB,CACrB;YACC,QAAQ,EAAE,OAAO,CAAC,QAA8B;YAChD,GAAG,EAAE,OAAO,CAAC,GAAc;SAC3B,EACD,MAAM,CACN,CAAC;IACH,CAAC,CAAC,CAAC;IAEJ,eAAe;IACf,OAAO;SACL,OAAO,CAAC,cAAc,EAAE,8CAA8C,CAAC;SACvE,IAAI,EAAE;SACN,QAAQ,CAAC,YAAY,EAAE,2CAA2C,CAAC;SACnE,MAAM,CAAC,yBAAyB,EAAE,wCAAwC,EAAE;QAC5E,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,OAAO,CAAC,MAAM;KACzB,CAAC;SACD,MAAM,CAAC,eAAe,EAAE,oDAAoD,EAAE;QAC9E,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3C,MAAM,WAAW,CAChB,IAAI,CAAC,QAAkB,EACvB;YACC,QAAQ,EAAE,OAAO,CAAC,QAAkB;YACpC,MAAM,EAAE,OAAO,CAAC,MAAiB;SACjC,EACD,MAAM,CACN,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemarc/blt",
3
- "version": "1.4.1",
3
+ "version": "1.4.2",
4
4
  "description": "blt cli",
5
5
  "type": "module",
6
6
  "main": "dist/blt",